Linux-2.6 16c550 串口驱动移植
来源:互联网 发布:iphone4id锁破解软件 编辑:程序博客网 时间:2024/05/22 14:41
本文中将要说道的是Linux驱动移植中最为初级最为简单的一种,就是通用性很强的UART设备驱动的移植,当然这还不能完全满足博主我这可怜的智商。
我所移植的这个驱动不是别的就是可以使用已有驱动8250.c来驱动的16c550, 千万别笑话我,谁叫这是第一次呢。
其实说到底我也没干什么,就是配置了一些参数而已,剩下的就都交给platform和8250了。
下面就是重要的结构体的配置具体情况:
static struct plat_serial8250_port sc16550_data[] = {
.mapbase = sc16550_UART_BASE, //flags使用IOREMAP,8250驱动会自动映射mapbase
.irq = sc16550_UART_IRQ,
.uartclk = sc16550_UART_BAUD * 16,
.iotype = UPIO_MEM,
.flags = UPF_BOOT_AUTOCONF |
UPF_SKIP_TEST | UPF_IOREMAP,
.regshift = 0,
};
static struct platform_device sc16550_device = {
.name = "serial8250",
.id = PLAT8250_DEV_PLATFORM,
.dev = { .platform_data = sc16550_data, },
};
这个platform_device对象的私有数据指成员向一个plat_serial8250_port类型的数组。在这里该数组描述了一个串口接口的基本信息。当8250驱动检测到这个platform_device对象后,就分析该对象的私有数据成员指向的那个plat_serial8250_port类型的数组。然后根据该数组的每个成员描述的信息生成一个串口对象设备。
实现了这个platform_device结构体后,把这个对象注册即可。但这个对象的name必须是serial8250。否则8250驱动检测不到这个样的设备。
下面详细介绍plat_serial8250_port这个对象。我们看一段代码:
- {
- .membase = (void *) io_p2v(UART5_BASE),
- .mapbase = UART5_BASE,
- .irq = IRQ_UART_IIR5,
- .uartclk = MAIN_OSC_FREQ,
- .regshift = 2,
- .iotype = UPIO_MEM32,
- .flags = UPF_BOOT_AUTOCONF | UPF_BUGGY_UART | UPF_IOREMAP,
- },
该成员描述的该串口接口寄存器虚拟地址的基地址。在初始化该成员时,需要自己把该串口接口寄存器的物理地址映射到虚拟地址空间。并且该映射工作需要在内核的板级初始化阶段完成。
mapbase:
该成员描述的该串口接口寄存器物理地址的基地址。其实只要初始化了mapbase成员,上面的membase成员就可以不必初始化了。因为8250驱动如果检测到只初始化了mapbase成员而membase为NULL,flags使用IOREMAP,8250驱动会自动映射mapbase,即自动把该串口接口寄存器的物理地址空间映射到虚拟地址空间。
irq:
该成员描述的是该串口接口使用的中断号。
uartclk:
该成员描述了该串口接口使用的时钟频率。
regshift:
该成员表示:在访问该串口接口的某个寄存器时,需把该寄存器的号左移多少位然后加基地址(不管是物理或虚拟地址)才能得能到
这个寄存器的址址。
iotype:
该成员表示该串口接口寄存器的地址类型,可以取值以下的其中一个:
- UPIO_PORT 端口地址,8位
- UPIO_HUB6
- UPIO_MEM 8位的内存地址
- UPIO_MEM32 32位的内存地址
- UPIO_AU
- UPIO_TSI
- UPIO_DWAPB
- UPIO_RM9000
flags:
UPF_BOOT_AUTOCONF 表示自动探测串口类型,这个一般是需要的
UPF_SKIP_TEST 表示在探测串口类型时,是否测试地址的可访问性。这在调试阶段是需要的。
除了flags,上面的各个成员都必须严格设置正确才能保证串口接口被正确探测和初始化。
如果串口接口类型没有被探测出来,或者FIFO长度不对,这需要考虑寄存器的访问是否正确,这包括:基地址是否正确,regshift和iotype是否正确,时钟频率是否正确。
如果探测信息也没有,或者接口数量不对。那么请在mem menuconfig中,在
- Device Drivers --->
- Character devices --->
- Serial drivers --->
- (8) Maximum number of 8250/16550 serial ports
- (8) Number of 8250/16550 serial ports to register at runtime
- Linux-2.6 16c550 串口驱动移植
- Linux-2.6 16c550 串口驱动移植
- 在wince4.2下加载16C550串口驱动
- 在wince4.2下加载16C550串口驱动——转载(作者:gerryzhou)
- linux移植记录(一) - 串口驱动
- linux设备驱动之串口移植
- linux设备驱动之串口移植
- arm linux 移植usb转串口驱动
- arm linux 移植usb转串口驱动
- Linux内核移植 part3:串口驱动
- 串口驱动移植心得
- 串口驱动移植心得
- 16C2550串口芯片在at91sam9263板上的linux驱动移植
- 16C2550串口芯片在at91sam9263板上的linux驱动移植 .
- 高通串口驱动移植
- Linux 2.6 内核驱动移植
- Linux 2.6 内核驱动移植
- Linux-2.6.32.2内核在mini2440上的移植(十八)---将UART2更成普通串口驱动
- 开源GIS
- gdb调试memcached
- 第11章 GUI 05 布局管理器3
- 简单,优雅,也复杂
- 无锁队列的实现 小结
- Linux-2.6 16c550 串口驱动移植
- 黑马程序员之ADO.NET学习笔记: DataSet,DataTable,DataRow,DataColumn
- android java开发 第二天 之熟悉 程序开发流程
- 实现JavaScript中继承的三种方式
- 一些面试题的解答
- uva 10714 - Ants
- CToolTipCtrl
- LUA文件处理
- 黑马程序员——RandomAccessFile随机读写数据