Linux字符设备驱动程序设计.ppt

Linux字符设备驱动程序设计.ppt

ID:55597078

大小:267.00 KB

页数:45页

时间:2020-05-20

Linux字符设备驱动程序设计.ppt_第1页
Linux字符设备驱动程序设计.ppt_第2页
Linux字符设备驱动程序设计.ppt_第3页
Linux字符设备驱动程序设计.ppt_第4页
Linux字符设备驱动程序设计.ppt_第5页
资源描述:

《Linux字符设备驱动程序设计.ppt》由会员上传分享,免费在线阅读,更多相关内容在PPT专区-天天文库

1、Linux字符设备驱动程序设计刘淼threewater@up-tech.com2006.3.21linux的驱动程序Linux下对外设的访问只能通过驱动程序Linux对于驱动程序有统一的接口,以文件的形式定义系统的驱动程序:Open、Release、read、write、ioctl…驱动程序是内核的一部分,可以使用中断、DMA等操作驱动程序需要在用户态和内核态之间传递数据uClinux下可以在应用层直接访问外设,操作寄存器口,但是无法处理中断——不推荐使用对于复杂的应用可以考虑是用mmap内核功能的划分进程管理(进程之间的通讯与同步)内存

2、管理(malloc/free)文件系统设备控制网络功能(网络通讯协议等)Linux下设备和模块的分类按照上述系统内核的功能,Linux中把系统的设备定义成如下三类:字符设备块设备网络设备Linux下的设备Linux的设备以文件的形式存在于/dev目录下设备文件是特殊文件,使用ls/dev-l命令可以看到:crw-------1rootroot10,7Aug312002amigamouse1crw-------1rootroot10,134Aug312002apm_biosbrw-rw----1rootdisk29,0Aug312002az

3、tcd主设备号和次设备号主设备号标识设备对应的驱动程序一个驱动程序可以控制若干个设备,次设备号提供了一种区分它们的方法系统增加一个驱动程序就要赋予它一个主设备号。这一赋值过程在驱动程序的初始化过程中intregister_chrdev(unsignedintmajor,constchar*name,structfile_operations*fops);创建设备节点设备已经注册到内核表中,对于设备的访问通过设备文件(设备文件与设备驱动程序的主设备号匹配),内核会调用驱动程序中的正确函数给程序一个它们可以请求设备驱动程序的名字。这个名字必须

4、插入到/dev目录中,并与驱动程序的主设备号和次设备号相连使用mknod在文件系统上创建一个设备节点mknod/dev/mydevicec2540动态分配设备号在Documentation/device.txt文件中可以找到已经静态分配给大部分设备的列表由于许多数字已经分配了,为新设备选择一个唯一的号码是很困难的如果调用register_chrdev时的major为零,函数就会选择一个空闲号码并做为返回值返回动态分配的问题动态分配的主设备号不能保证总是一样的,无法事先创建设备节点可以从/proc/devices读取cat/proc/dev

5、ices利用脚本动态创建设备文件节点设备管理的问题如今,Linux支持很多不同种类的硬件。这意味着/dev中都有数百个特殊文件来表示所有这些设备。而且,这些特殊文件中大多数甚至不会映射到系统中存在的设备上使用devfs在Linux2.4的内核里引入了devfs来解决 linux下设备文件管理的问题在驱动程序中通过devfs_register()函数创建设备文件系统的节点系统启动的时候mount设备文件系统所有需要的设备节点都由内核自动管理。 /dev目录下只有挂载的设备Linux2.6内核与devfsLinux2.6内核引入了sysfs文

6、件系统为每个系统的硬件树进行分级处理Devfs在Linux2.6中被标记为舍弃的特性(在Linux2.6.15及以后的版本则取消了对它的支持),而使用udev。维护动态设备从sysfs获得的信息,可以提供对特定设备的固定设备名。对于热插拔的设备,这尤其重要udev是在用户空间的脚本文件,这很容易被编辑和修改为了保证旧应用程序的兼容性,在嵌入式系统中,是用devfs还是一个好方法。即使在Linux2.6.15内核以后,也可以通过ndevfs(nanodevfs)补丁提供对devfs特性的兼容。Linux内核硬件驱动标准模板#include<

7、linux/module.h>#include#includestaticint__initname_of_initialization_routine(void){/*codehere*/}staticvoid__exitname_of_cleanup_routine(void){/*codehere*/}module_init(name_of_initialization_routine);module_exit(name_of_cleanup_routine);module

8、_init(1)include/linux/init.h中#definemodule_init(x)__initcall(x);#define__initcall(fn)staticinit

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。