(3)读取应用程序传送给设备文件的数据和回送应用程序请求的数据。 (4)检测和处理设备出现的错误。 每个设备驱动程序都有以下几个特性: (l)具有一整套的和硬件设备通讯的例程,并且提供给操作系统一套标准的 软件接口。 (2)有一个可以被操作系统动态调用和移除的自包含组件。 (3)可以控制和管理用户程序和物理设备之间的数据流。 2.3设备驱动程序的基本结构 对用户程序而言,设备驱动程序隐藏了设备的具体细节,对各种不同设备提供 了一致的接口。一般设备驱动程序可以分为三个主要组成部分〔川: (l)自动配置和初始化子程序:自动配置和初始化子程序常在相应的driver init()中实现,负责检测所要驱动的硬件设备是否存在和是否能正常工 作。如果该设备正常,则对这个设备及其相关的设备驱动程序需要的状 态进行初始化。这部分驱动程序仅在初始化的时候调用一次。 (2)服务于FO请求的子程序:它又称为驱动程序的上半部分,调用这部分 是由于系统调用的结果。这部分程序在执行的时候,系统仍认为是和进 行调用的进程属于同一个进程,只是由用户态变成了核心态,具有进 行此系统调用的用户程序的运行环境。因此可以在其中调用sleeP()等与 进程运行环境有关的函数。 (3)中断服务子程序:在Linux系统中,并不是直接从中断向量表中调用设 备驱动程序的中断服务子程序,而是由系统来接收硬件中断,再由系 统调用中断服务子程序。中断可以产生在任何一个进程运行的时候,因 此,在中断服务程序被调用的时候,不能依赖于任何进程的状态,也 就不能调用任何与进程运行环境有关的函数。因为设备驱动程序一般支 持同一类型的若干设备,所以一般在系统调用中断服务子程序的时候, 都带有一个或多个参数,以唯一标识请求服务的从设备。 2.4Linux设备驱动与整个软硬件系统的关系 除网络设备外,字符设备与块设备都被映射到Linux文件系统与文件和目录,通 过文件系统调用接口open()、 wr1te()、read()、elose()等函数即可访问字符设备和 块设备。所有的字符设备和块设备很直观的呈现给用户。而块设备则会先建立一个磁 盘 /Flash文件系统,一般是FAT、Ext3、YAFF、JFFS等。应用程序可以通过调用Linux 的系统调用接口编程,而出于代码的可移植行考虑,更多的是使用C库函数。C库函数 也是通过系统调用接口来实现的tg]。图2一1形象的表述了LinuX设备驱动与整个软硬件 系统之间的关系。 2.5驱动程序开发流程 嵌入式Linux系统驱动程序开发与普通Linux区别在于编译时需进行交叉编译。 嵌入式设备由于硬件种类丰富,在缺省的内核发布版中不一定包括所有驱动程序,可 以在硬件生产厂家或者工nternet上寻找驱动程序,如果找不到,可以根据一个相近 硬件的驱动程序来改写,这样可加快开发速度「’‘)〕。 (1)定义主、次设备号,也可以动态获取; (2)实现驱动初始化和清除函数。如果驱动程序采用模块方式,则要实现模块 初始化和清除函数; (3)设计所要实现的文件操作,定义file_叩erations结构; (4)实现所需的文件操作调用,如read、write等; (5)实现中断服务函数(中断不是每个设备驱动都需要),并用request_irq向 内核注册; (6)将驱动交叉编译到内核或交叉编译成模块,用insmod命令加载; (7)用mknode生成设备文件。 2.6硬件平台 S3C244OA是一款实用的ARMg开发板。它采用 Samsung53C2440为微处理器,并 采用专业稳定的CPU内核电源芯片和复位芯片来保证系统运行时的稳定性。S3C244OA 的PCB采用沉金工艺的四层板设计,专业等长布线,保证关键信号线的信号完整性, 配合相应的手册,可以迅速让人掌握嵌入式Linux和winCE开发的流程。 其各项配置和参数如下 S3C244OA处理器,主频40OMHz,可倍频至533MHz; 64M字节SDRAM,可扩展到256M; ZMNORFlash; 64M字节 NANDFlash; 12MHz系统外部时钟源;32.768KHz的RTC时钟源; 支持3.3V或5V电压供电: 采用进口高质量板对板接插件,确保长期运行可靠性。 两个三线串口,一个TTL串口; 一个IOOM网口,采用DM9000AE,带联接和传输指示灯; |