LINUX下字符设备、块设备和网络接口
仇洁婷,陈儒军
(1)块设备
块设备以数据块的形式存放数据,如NAND Flash以页为单位存储数据,并采用mount方式挂载块设备。块设备还需通过建立Flash文件系统,如YAFFS、JFFS等,用于规范文件和目录在存储介质上的组织。这类型的设备已经在Linux内核中加载,不需要再做移植。
(2)网络设备
网络设备是面向数据包的接收和发送而设计的。它并不对应于文件系统(/dev目录下)的节点,而是由系统分配一个唯一的名字(如eth0)。
在Linux-2.6.21中,对本系统的DM9161网络芯片有很好的支持,但是本系统网络芯片DM9161的中断引脚MDINTR#与ARM的PB29相连。而在Linux-2.6.21内核中,网络驱动定义的中断引脚是PC4。MDINTR是用于反应网络的连接状态,当网络断开或连接时,都会产生一个中断响应。因此需要对该管脚定义其进行修改。
在/linux-2.6.21/arch/arm/mach-at91/board-dk.c文件中,修改dk_eth_data结构体对phy_irq_pin元素的定义。将
.phy_irq_pin = AT91_PIN_PC4,
改为.phy_irq_pin = AT91_PIN_PB29
最后由at91_add_device_eth(&dk_eth_data);将其加入网络驱动中。
(3)字符设备
字符设备指能够像字节流串行顺序依次进行访问的设备,对它的读写是以字节为单位。除了网络设备外,字符设备和块设备都是通过文件系统的系统调用接口open()、close()、write()、read()等函数既可以访问,应用程序可以通过打开设备文件(如UART0设备:/dev/ttyS0)来访问该设备。
编写Linux驱动程序,是为了尽可能发挥硬件的作用以提高性能,但其难点不是在于对硬件的具体操作,而是需要了解清楚现有驱动程序的框架,并在这个框架中找到修改的位置,加入与设计相关的硬件。
可将编写Linux字符设备驱动程序的流程总结如下:
Ø 查看原理图、数据手册,了解设备的操作方法;
Ø 在内核中找到相近的驱动程序,以它为模板进行开发,有时候需要从零开始;
Ø 实现驱动程序的初始化:比如想让内核注册这个驱动程序,这样应用程序传入文件名时,内核才能找到相应的驱动程序;
Ø 设计所要实现的操作:比如open、close、read、write、ioctl等函数;
Ø 实现中断服务(中断并不是每个设备驱动所必须的);
Ø 编译该驱动程序到内核中,或者用insmod命令加载;
Ø 测试驱动程序。
在本系统中,用到的字符设备驱动程序主要有:
(1)UART串口驱动程序
(2)SPI串口外围设备驱动程序
(3)RTC实时时钟驱动程序
(4)LM75温度传感器驱动程序
(5)USB驱动程序
(6)SSC高速同步串行驱动程序
Linux2.6内核对上述前5个驱动程序都有源代码,只需要根据硬件需求进行相应的修改。但是没有对AT91RM9200芯片的SSC接口驱动程序的支持,需要自行编写相应的驱动程序。
https://blog.sciencenet.cn/blog-39626-332581.html
上一篇:
Linux设备驱动移植概述下一篇:
UART串口驱动程序移植