资源描述:
《基于arm9的linux2.6内核下cf卡的驱动设计与应用》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、http://www.paper.edu.cn基于ARM9的linux2.6内核下CF卡的驱动设计与应用曹理发,尹勇武汉理工大学信息工程学院,湖北武汉(430070)E-mail:xiaocao1114@163.com摘要:本文在分析LINUX内核下驱动程序结构的基础上,对CF卡的工作原理进行介绍,实现了IDE模式CF卡的驱动并成功应用在H.264视频处理系统中。同时,文中给出了硬件接口图及软件设计思想。关键词:ARM9,CF卡;LINUX操作系统;驱动设计1.引言Linux是开放源代码的操作系统,由于其高效稳定、执行速度快、实现了真正的多任务、多用户环境、强大的网络功能、较好的可裁
2、减性与移植性等特点,在嵌入式系统领域获得了飞速发展。针对ARM体系结构CPU开发的,具有MMU功能的嵌入式Linux操作系统无疑是ARM平台上操作系统的最佳选择。CF(CompactFlash)卡,是一种移动存储卡,在许多便携式电子产品,如PDA、数码相机、便携式多媒体播放器中广泛应用。CF卡模拟硬盘的工作原理,但内部没有机械机构,因此可靠性比硬盘好。CF卡的功耗也比硬盘小很多,大概为硬盘功耗的5%。随着闪存技术的发展,CF卡的最大容量已经突破了10Gbyte。虽然CF卡单位容量价格比比不上硬盘,但由于其功耗低、速度快、重量轻、兼容性好,很适合那些既要求大容量存储同时也对功耗很敏感的
3、嵌入式系统。在CF卡设备开发中,有些处理器本身集成了CF卡控制器,如Intel公司的pxa255、pxa270处[1]理器,Atmel公司的AT91RM9200处理器等。这类处理器与CF卡的接口比较容易实现。但是很多处理器并没有集成CF控制器,如三星公S3C44B0X、S3C2410等。这类处理器要实现CF卡接口功能,必须利用CPU未用端口和附加的电路来进行逻辑扩展。本文就是基于此展开研究的,成功开发了IDE模式的CF卡的驱动并应用于H.264视频处理系统中。2.LINUX设备驱动结构Linux支持三类硬件设备:字符设备、块设备和网络设备。字符设备是指无须缓存直接按字节读写的设备。块
4、设备以块为单位进行读写,能够进行随机访问。网络设备在Linux里有专门的处理,它没有被映射到文件系统的设备节点,对它的访问采用socket机制。字符设备与块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O一般紧接着发生;块设[2]备是利用一块系统内存作缓冲区来进行实际的I/O操作。在Linux中,几乎所有的内容都是文件,对设备驱动的访问也是以文件操作的方式实现。无论是字符设备还是块设备,用户对设备的操作都是通过虚拟文件系统(VFS)转化为设备驱动与硬件操作例程的交互。即使是访问网络设备的socket接口,也是通过VFS实现的。Linux通过VFS为用户提供了一个统一的
5、设备访问接口,使用户能够透明地访问设备驱动程序。所有的硬件设备都可以使用和操作系统调用接口来打开、关闭、读写和I/O控制,而驱动程序的主要任务就是实现这些系统调用函数。Linux系统中的所有硬件设备都使用一种特殊的设备文件来表示。每个设备文件都有两个设备号:一个是主设备号,它用来标识该设备的种类,也标识该设备使用的驱动程序;另一个是次设备号,用来标识使用同一设备驱动程序的不同-1-http://www.paper.edu.cn[3]硬件设备。实现一个嵌入式Linux设备驱动的大致流程如下:⑴定义主、次设备号;也可以动态获取。⑵实现驱动初始化和清除函数,如果驱动程序采用模块方式,则要实
6、现模块初始化和清除函数。⑶设计所要实现的文件操作,定义file_operations结构。⑷实现所需的文件操作调用,如read、write等。⑸实现中断服务函数,并用request_irq向内核注册。中断并不是每个设备驱动所需要。⑹将驱动编译到内核或编译成模块,用insmod命令加载。⑺生成设备节点文件。Linux为每个块设备驱动程序准备了一个注册结构devicestruct,系统中所有的devicestruct结构都记录在向量表blkdevs中,以主设备号为索引。该结构的定义如下:staticstruct{constcharname;structblockdeviceoperati
7、onsbdops;}blkdevs[MAXBLKDEV];另外,数组blksize[][]记录每个设备的大小(以千字节为单位),blksizesize[][]中记录设备所使用的块大小(以字节为单位),hardsectsize[][]记录设备的硬件扇区大小(512的2次幂),readahead[]记录在内核预读的扇区数,maxreadahead[][]记录设备允许预读的最大扇区数,maxsectors[][]记录单个请求的最大尺寸。块设备向系统注册设备时,必