机电工程技术2007嵌入式Linux下块设备驱动程序的开发李胜朝,(第二陆军工程大学,湖南长沙710025)摘要:通过对块设备字符式驱动程序的开发,充分借助了嵌入式开发板S3C2410块设备Flash中除文件系统外的剩余空间,因而省去了扩充储存芯片和电路的设计。结合应用实例,对驱动开发的关键流程进行了详尽阐述,对调试与发布作了简略介本驱动程序在其它富含Flash块设备的系统中具有广泛的应用价值。关键词:嵌入式系统;闪存;驱动程序;块设备中图分类号:TP273文献标示码:文章编号:1009-9492(2007)06-0026-03序言随着嵌入式系虽然硬碟在容量上可以满足这方面的需求,并且其容积功Flash技术就是这些背景下迅速发展上去的二者在写之前都必须进行块或片擦除,只是后者可以单字节编程,拥有独立的数据总线和并且在电路设计时要抢占更多线路布局,并且芯片价钱昂不适宜用于嵌入式系统中的大容量储存设备;相对而根数据线,每次操作时,命令、地址和数Flash驱动程序开发为例介绍块设备驱动开发的要点。块设备驱动程序及应用实例介绍块设备是文件系统的物质基础,而文件系统就是对块设备上所储存的内容按某种格式加以组织的结果。
备的访问就有两种方法,一种是忽视对其内容的组织,目录组织在一块的文件集合,而每位文件则又是若干记录块的有序集合。这儿主要讨论第一种情况下块设备驱动程序的开发,也即开发一种把块设备当作块阵列并以的读写方式对块设备进行访问的驱动程序(类似于字符设备驱动程序,nix下称为种驱动程序的开发周期比第二种驱动程序愈加短,非常适用于在只把块设备用作数据储存设备而不须要文件系统的情况,其实,虽然对设备的访问,首先也必须在文件系统中找到代表着这个设备的文件节点,在这个过程存在着须要实时记录一些数据,这种数据是按操作周(按规程进行一次完整的操作)进行记录的linux 版本,每一周期储存的数据量又不是非常大(不超过5M但对硬件安装空间有着严格要求。这儿我们采用了恒颖公司的嵌入式系S3C2410F开发板作为记录实时记录检测数据的上位机,它可以通过尾纤设置从64MFlash-K9F1208U0MLinux压缩内核讲到第12FS根文件系统写用户程序代码预留一部份空间,这儿假定前三分部总共占空间32MFlash还剩余32M空间,我们要实现的就是开发一字符类型的驱动程序实现对块设备剩余32M空间的读写,而保持原有文件系统的完整性,因而避开了另加储存器而占用硬件空间或新设计电路的困局。
驱动程序功能设备驱动程序是操作系统内核级别的程序,可以对设备硬件进行直接访问,这也是开它是系统内核和硬件之间的插口。对用户而言,设备驱动程序隐藏了设备的具体细节,为不同设备提供了一致的接通常来说是把设备映射为一个特殊的设备文件,用户程序可以像对其它文件一样对此设备文件进行操作。动程序主要完成以下几项功能:设备初始化和释放,这功能在程序打开和关掉设备收稿日期:2007—01—15机电工程技术2007poll函数流程驱动程序时完成。通过系统内核环境实现设备与用户程序之间的信息交换,这主要通过相应的插口函数和内核函数完成。检查敏感设备出现的错误。通过自定义遍历poll实现对Flash中历史信息数量、每一信息的置和最后一条信息的中止页位置数据的遍历。依据用户须要,提供任务一次操作记录的信息的输9F1208U0M4096块32页528字节,最大写入单元为一页即528字节(最后16字节用以储存数据校准标示等信息)为了将每次采集的数据区别开,在储存时对每次采集的数据以特定的格式加以编码:标示头+一次采集数据量的大小,每页可以存数次采集信息,在默认情况下,每块第一页后16块标示,假如该块有错位则其值为非0xFF,否则为0xFF;另外将527字节用于设置该页数据类型标示,示各次信息的起始页信息,0xFF为各次信息的中止页信息526字节记录当前页信息在该次信息中的位置,525表示位置信息低字节,526表示高字节,因而在Flash中每页储存的数据结构如表页信息结构表528字节Flash数据格式0~511525~526527头标示+数据0xFF坏块标示xFF位置信息类型标示用户空间变量[0~511]头标示+数据[512~513]位置信息[514]类型标示设计思想Linux采用的是整体机制,可依照须要在毋须对的模块。
本驱动程序由芯片函数和插口函数组成,后者通过对Flash的控制、设置和状态寄存器的操作,实现对Flash身进行设置、读写和查错;前者通过芯片函数实现对内核Flash的交互,如图所示。为了调试便捷,开发设备驱动程序,将块设备当作块序列;以字节流的形file_opera-tionsopen、read、rite、ioctl和二个加载和卸载模块的系统函遍历函数poll的实现起始位置为第409632=65536525、526最大不超过0xFFFFlinux之家,当取最大值时,表示该次操作的计信息量有0xFFFF512/1024/102432M这在实际情况下是不可能发生的,525、526字节内容为0xFFFF时只有一种情况的最后一页。因而可以按照这一点来判别实历史信息数量、每一信息的起始页位置和最后一条信息的中止页位置数据的遍历,程序流程如图插口函数实现加卸载函数现的二个函数,两者都以函数名为参数,加载函数通用设备文件注册函数devfs_register完成本驱动程序在内核中注册一个设备文件名,该文件名供open函数调用;卸载函数调用devfs_unregister函数完成从内核中卸载早已注册的驱动程序模块open函数open函数可以没有任何实现代码,这儿通过调用poll机电工程技术研究与开发机电工程技术2007写程序流程函数实现对历史信息的遍历和相关参数的初始化。
ioctl函数该函数用在具体的读写操作之前linux 设备驱动程序,通过在驱动程序中申请的传递命令参数的全局变量,完成下一步操作命令参数的传送,自定义的命令常量如表在用户程序中调用方式见read函数,但是通过调用poll自定义命令常量表要读取某次操作的历史数据,主程序先在用户空间开辟一515字节大小的内在空间,以该空间的起始地址为read数参数,通过调用芯片函数连续地读取528字节,将须要返回的515字节形参给相应的用户地址空间,其流程与写相像,只是将判定句子写入成功换成对读取成功与否的判伪句子如下:ioctl(设备文件句柄,ITEread(设备文件句柄linux 设备驱动程序,用户空间起始地址,是从起始页开始,连续的读取页信息,直到结束,程序按照读取信息的标示头来解析数据并分类处理。命令常量LASTBPERSEALLERSEBLOCKITEPA10意义Flash中历史信息的数量后一条信息的页位置擦除所有历史数据擦除某一块信息对某页进行从最后的空白页写入数据假设至多储存10次完整操作信息,传递该参数后调用read可读取相应序号的历史信息