浅谈嵌入式Linux系统设备驱动的开发与设计_第1页
浅谈嵌入式Linux系统设备驱动的开发与设计_第2页
浅谈嵌入式Linux系统设备驱动的开发与设计_第3页
浅谈嵌入式Linux系统设备驱动的开发与设计_第4页
浅谈嵌入式Linux系统设备驱动的开发与设计_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 浅谈嵌入式Linux系统设备驱动的开发与设计【 摘 要 】 主要阐述了嵌入式linux设备驱动程序的概念,归纳嵌入式linux设备驱动程序的共性,探讨嵌入式linux设备驱动程序具体开发流程以及驱动程序的关键代码,总结嵌入式 linux设备驱动程序开发的主导思想。【 关键词 】 嵌入式系统;linux;设备驱动程序;内核【 abstract 】 the paper presents the concept of embedded linux device driver program, summarized in the embedded linux device driver of gen

2、erality, embedded linux device driver specific development process as well as the driver of the key code, sum up the embedded linux device driver development of the dominant ideology.【 keywords 】 embedded system; linux; device driver; kernel0 引言嵌入式系统被广泛运用到消费、汽车、电子、微控制、无线通信、数码产品、网络设备、安全系统等领域。越来越多的公司、

3、研究单位、大专院校、以及个人开始进行嵌入式系统的研究,嵌入式系统设计将是未来相当长一段时间内研究的热点。1 linux设备驱动程序概述嵌入式linux以其可应用于多种硬件平台、内核高效稳定、源码开放、软件丰富、网络通信和文件管理机制完善等优良特性,成为嵌入式系统领域中的一个研究热点。嵌入式linux系统中,内核提供保护机制,用户空间的进程一般不能直接访问硬件。进行嵌入式系统的开发,很大的工作量是为各种设备编写驱动程序,除非系统不使用操作系统。linux设备驱动程序在linux内核源代码中占有很大比例,从2.0、2.2到2.4版本的内核,源代码的长度日益增加,其实主要是设备驱动程序在增加。设备驱

4、动程序在linux内核中占有极其重要的位置,它是内核用于完成对物理设备的控制操作的功能模块。除了cpu、内存以及其他很少的几个部分之外,所有的设备控制操作都必须由与被控设备相关的代码,也就是驱动程序来完成。内核必须包括与系统中的每个外部设备对应的驱动程序。否则设备就无法在linux下正常工作。这就是驱动程序开发成为linux内核开发的主要工作的原因。从内核源码的代码分布可以看出,设备驱动源码至少占据了一半的内核源码量,更能说明设备驱动程序对操作系统的意义和价值。2 嵌入式linux设备驱动程序开发2.1 设备驱动程序工作原理在linux操作系统下有3类主要的设备文件类型:块设备、字符设备和网络

5、设备。这种分类方法可以将控制不同输入/输出设备的驱动程序与其它操作系统软件分离开来。字符设备与块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件i/o一般紧接着发生。块设备则不然,它利用一块系统内存作缓冲区,若用户进程对设备的请求能满足用户的要求,就返回请求的数据;否则,就调用请求函数来进行实际的i/o操作。网络设备可以通过bsd套接口访问数据。所有嵌入式linux设备驱动程序都有一些共性,是编写所有类型的驱动程序都通用的,操作系统提供给驱动程序的支持也大致相同。这些特性包括:(1)读/写几乎所有设备都有输入和输出。每个驱动程序都要负责本设备的读/写操作,操作系统的其它部分不需要知道

6、对设备的具体读/写操作是怎样进行的,这些都由驱动程序屏蔽掉了。操作系统定义好一些读/写接口,由驱动程序完成具体的功能。在驱动程序初始化时,需要把具有这种接口的读/写函数注册到操作系统。(2)中断中断在现代计算机结构中有重要的地位,操作系统必须提供驱动程序响应中断的能力。一般是把一个中断处理程序注册到系统中,操作系统在硬件中断发生后,调用驱动程序的处理程序。linux支持中断的共享,即多个设备共享一个中断。(3)时钟在实现驱动程序时,很多地方会用到时钟,例如某些协议里的超时处理,没有中断机制的硬件的轮询等。操作系统应为驱动程序提供定时机制,一般是在预定的时间过了以后,回调注册的时钟函数。嵌入式l

7、inux系统驱动程序开发与普通linux没有太多区别。嵌入式设备由于硬件种类非常丰富,在缺省的内核发布版中不可能包括所有驱动程序。可以在硬件生产厂家或者intemet上寻找驱动程序,如果找不到,可以根据一个相近硬件的驱动程序来改写。实现一个嵌入式linux设备驱动的大致流程如下: (1)定义主、次设备号,也可以动态获取;(2)实现驱动初始化和清除函数,如果驱动程序采用模块方式,则要实现模块初始化和清除函数;(3)设计所要实现的文件操作,定义 file_operations结构;(4)实现所需的文件操作调用,如 read、write等;(5)实现中断服务函数,并用request irq向内核注册

8、;(6)将驱动编译到内核或编译成模块,用insmod命令加载;(7)生成设备节点文件。与普通文件相比,设备文件的操作要复杂得多,不可能简单地通过 read、write和 llseek等来实现。所有其它类型的操作都可以通过vfs的ioctl调用来执行,为此,只需要在驱动程序中实现 ioctl函数,并在其中添加相应的case即可。通过 cmd 区分操作,通过 arg传递参数和结果。2.2 设备驱动程序的开发流程2.2.1设备驱动接口struct file_operation iodriver_fops=read:1odriver_read,write:iodriver_write,;字符设备驱动接

9、口中关键的file_operations结构:的定义如下:struct file_operationsstruct module *owner;loft_t(*llseek)(struct file*,loff_t,int);ssize_t(*read)(struct file*,char*,size_t,loft_t);ssize_t(*write)(struct file*,const char*,size_t,1off_t*);int(readdir struct inode*,struct file*,void*,filldir_t);int(*select)(struct inode

10、*,struct file*,int,select table*);int(*ioct1)(struct inode*,struct file*,unsigned int,unsigned int);int(*mmap)(struct inode*,struct file*,struct vm_area_struct*);int( *open)(struct inode*,struct file*);void(*release)(struct inode*,struct file*);int(*fsync)(struct inode*,struct file*);2.2.2注册和注销模块2.2

11、.2.1设备注册模块static int_nit iodriver_init(void) int ret=0:ret=register_chrdv(major_num,“iodriver”,&iodrivif(ret) printk(kern_alert“iodriver register failure!”) else printk(kern_al ert“iodriver register success!”) return ret;2.2.2.2设备注销模块static int_exit iodriver_exit(void) int ret=0;ret=unregister_chrdv

12、(major_num,“iodriver”);if(ret) printk(kern_al ert“iodriver unregister failure!”); else printk(kern_al ert“iodriver unregister success!”); return ret;2.2.3基本入口点设备函数的具体实现2.2.3.1设备读取模块static ssize_t iodriver_read(struct file*file,char*buf,size_t len,loft_t*off) if(_ _copy_to_user(bur,&iodriver_var,size

13、of(int) retum _efault; retum sizeof(int);2.2.3.2设备写入模块static ssize_t iodriver_write(struct file*file,const char*buf,size_t len,loff_t*off) if(_ _copy_from_user(&iodriver_var,buf,sizeof(int) retum _efault;retum sizeof(int);2.2.4 module_init和 module_exit宏module_init(iodriver_init);module_exit(iodriver

14、_exit);3 设备驱动程序编译到内核的过程把驱动程序编译进内核的步骤如下:(1)把 iodriver.c复制到 linux-2.4.20-8/drivers/char下,并修改该目录下的 config.in文件,config.in是每个模块的配置脚本,在这个文件当中定义配置那些模块、怎样配置等,因此当添加了io的配置后,会在内核配置时出现这个模块的配置选项。(2)修改当前目录下的 makefile,在每个模块的makefile中包括该模块所包含的子模块,在 char devices中,要包括io设备,就要告诉makefile编译iodriver.c并包含编译出的iodriver.c文件,这

15、样最后内核做链接时,才会链接进这个模块。(3)重新配置内核,选中io模块执行命令 make menuconfig,进入内核配置菜单。(4) 重新编译内核,并更新嵌入式目标系统的内核。(5)创建设备文件,重新启动嵌入式目标系统的linux,进入目录/proc,查看devices文件,在devices文件列出了当前系统所有的字符设备和块设备,包括设备号和设备名称,在 character devices的最后移行的设备是:254 iodriver,这说明iodriver设备已经正确地加载到了内核。(6) 添加设备文件节点,执行如下命令,添加设备文件节点,在此创建的设备名称用于在应用程序中访问对应的设备。如果为字符设备,设备号类型用c表示,块设备则用b表示;主设备号就是/proc/devices中的 iodriver的设备号,由于该类设备只有一个,因此次设备号为0,如果还有该类型的其他设备,则一次为 1、2、3等。4 结束语设备驱动程序是操作系统内核和机器硬件之间的接口。内核利用驱动程序的接口完成对设备的初始化和释放,在系统内核和硬件之间传送数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论