嵌入式LINUX按键驱动程序开发.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
嵌入式LINUX按键驱动程序开发

嵌入式Linux按键驱动程序开发 摘要:文章主要阐述了Linux驱动程序的基本概念以及字符设备、块设备和网络设备的特点,通过键盘驱动实例论述了如何设计和编写模块化的驱动程序,并解释键盘驱动程序的关键代码,最后归纳了开发嵌入式Linux设备驱动程序的核心思想。 关键词:设备驱动;Linux;内核;模块;键盘 中图分类号:TP311.1 文献标识码:A 引言 嵌入式Linux以其可应用于多种硬件平台、内核高效稳定、源码开放、软件丰富、网络通信和文件管理机制完善等优良特性,成为嵌入式系统领域中的一个研究热点。在嵌入式Linux系统中,内核提供保护机制,用户空间的进程一般不能直接访问硬件,进行嵌入式系统的开发,很大的工作量是为各种设备编写驱动程序。键盘设备在嵌入式系统中应用的非常广泛,分析驱动程序的原理和编写相应的键盘驱动程序在嵌入式开发中显的尤其重要。 1 设备驱动程序概述 1.1 设备驱动程序的概念 Linux设备驱动程序是为特定的硬件提供给用户程序的一组标准化接口,它隐藏了设备工作的细节[1]。在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。 1.2 设备驱动程序的类型 Linux系统的设备分为字符设备(char device)、块设备(lock device) 和网络设备(network device) 三种。 字符设备是指存取时没有缓存的设备,因此在对字符设备发出读/写请求时,实际的硬件I/ O一般就紧接着发生了。字符设备是Linux设备中最简单的一种,应用程序可以用与存取文件相同的系统调换用来打开、读写及关闭它。典型的字符设备包括鼠标、键盘、串行口等。 块设备的读写都有缓存来支持,并且块设备必须能够随机存取(random access),是指那些在输入输出时数据处理以块为单位的设备,采用了缓冲技术,支持数据的随机读写,系统可以通过它们的设备做特殊文件访问,但是更常见的是通过文件系统访问。典型的块设备包括硬盘和光盘等。 网络设备在Linux里做了专门的处理,Linux的网络系统主要是基于BSD UNIX的socket 机制。在系统和驱动程序之间定义有专门的数据结构进行数据的传递,系统支持对发送数据和接收数据的缓存,提供流量控制机制和多协议的支持[2]。典型的网络设备是网卡。 2 模块化驱动程序设计及流程 2.1 模块化设计思想 模块是指整个系统中一些相对独立的程序单元每个程序单元完成和实现一个相对独立的软件功能Linux的内核是一个整体式内核,如果新添加一个硬件,就需要重新编译内核;如果去掉一个硬件,那么这个硬件已经编译进内核的驱动程序就是浪费。 Linux内核用模块来解决这个问题,模块是内核的一部分,而且都是设备驱动程序,但它们并没有被编译到内核中,而是被分别编译并链接成一组目标文件。 这些文件能被载入正在运行的内核,或从正在运行的内核中卸载,必要时内核能请求内核守护进程kerneld对模块进行加载或卸载[3]。根据需要动态载入模块可以保证内核达到最小,并且具有很大的灵活性。内核模块一部分保存在Kernel中,另一部分在Modules 包中。 2.2 几个关键的模块函数 (1)init_module() 函数init_module()在模块调入内核时被调用,它在内核中用insmod命令注册一定的功能函数(如图1中的功能1、功能2、功能3)。 在注册之后,如果有程序访问内核模块的某个功能,如功能1,内核将查表获得功能1 在module中的位置,然后调用功能1的函数,同样功能2和功能3也是这样调用的。 [insmod] [rmmod] 图1 Linux模块调用 结(2)cleanup_module() 函数cleanup_module()在模块从内核中卸载时被调用,用rmmod命令把以前注册的功能函数卸载[4]。cleanup_module()函数必须把init_module()函数在内核中注册的功能函数完全卸载,否则,在此模块下次调入时,将会因为有重名的函数而导致调入失败。其中init_module()函数在运行insmod命令后由系统调用,完成驱动模块的初始化工作。cleanup_module ()函数在运行rmmod命令后由系统调用,完成驱动模块卸载时的清除工作。在2.3版本以后的Linux 内核中,提供了一种新的方法来命名这两个函数。例如,可以定义my_init()函数来代替init_module()函数,定义my_cleanup()函数来代替cleanup_module()函数,然后在源代码文件末尾使用下面的语句: module_init(my_init); module_exit(my_cleanup); 注意

文档评论(0)

almm118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档