第七章linux设备驱动程序开发.pptVIP

  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设备驱动程序开发 7.1设备驱动概述 设备驱动可以理解为操作系统的一部分,对于一个特定的硬件设备来说,其对应的设备驱动程序是不同的。比如网卡、声卡、键盘、鼠标、显卡等。 对于操作系统来说,挂接的设备越多,所需要的设备驱动程序也越多。操作系统本身并没有对种类繁多的硬件设备提供持久不变的“设备驱动”,也就是说操作系统在没有设备驱动程序支持下是无法正常支配硬件行为的。 这个时候就需要独立开发一套适合自己产品的设备驱动。正是操作系统留下了扩展设备驱动的接口,才有了现在支持各种应用场合的硬件设备的蓬勃发展。 对于嵌入式开发,更没有通用的驱动程序可以便用。因此,驱动程序开发是整个嵌入式系统设计过程中必不可少的一部分。 7.1设备驱动概述 7.1.1设备驱动程序功能 设备驱动程序是Linux内核的重要组成部分。像操作系统的其他部分一样,驱动程序在一个高优先级的环境下工作,如果发生错误则可能会引发严重的问题。设备驱动程序控制了操作系统和硬件设备之间的交互,完成以下功能: 对设备初始化和释放; 对设备进行管理,包括实时参数设置,以及提供对设备的操作接口; 读取应用程序传送给设备文件的数据或者回送应用程序请求的数据; 检测和处理设备出现的错误。 7.1设备驱动概述 2.Linux 设备驱动程序接口 系统调用是操作系统内核与应用程序之间的接口,驱动程序则是操作系统内核与机器硬件的接口。设备驱动程序能够直接访问硬件的代码,必须为应用程序提供系统调用。以便应用程序能访问设备。 在LINUX 中,主要有三种设备即:字符设备.块设备和网络设备,与此相关主要有三类设备驱动程序,字符设备驱动程序,块设备驱动程序和网络设备驱动程序. 他们的系统调用是一致的,采用统一的接口(在数据结构file_operations 中)。应用程序使用设备就像使用读写普通的文件一样方便,使用相同的open( ),close(),read(),write()等,真正做到了与设备无关。 7.1.2 设备类型 Linux 中的设备可以分为三类: 字符设备 块设备 网络设备 一个运行的linux 系统,当前使用的设备可以通过文件/proc/devices 查看。 驱动程序中涉及的几个概念 模块的概念 Linux可以以模块的形式加载设备类型,通常来说一个模块对应实现一个设备驱动,因此是可以分类的。一般一个设备驱动对应一类设备的模块方式,这样便于多个设备的协调工作也利于应用程序的开发和扩展。 Linux 的驱动开发调试有两种方法: (1)直接编译到内核,再运行新的内核来测试; (2)编译为模块的形式,单独加载运行调试。 通常情况下设备驱动的模块动态加载更为普遍,开发人员不必在调试过程中频繁启动机器就能完成设备驱动的开发工作。 模块加载与卸载 模块方式调试: (1)编译的模块直接插入内核:用insmod 工具; (2)从内核中卸载模块:用rmmod 。 模块用insmod命令加载,用rmmod命令来卸载,这两个命令分别调用module_init()和module_exit ()函数,还可以用lsmod命令来查看所有已加载的模块的状态。 Linux中模块可以用C语言编写,用gcc命令编译成模块*.ko 编写Hello World 模块 #include linux/init.h #include linux/module.h #include linux/kernel.h MODULE_LICENSE(Dual BSD/GPL); static int __init hello_init(void) { printk(KERN_ALERT Hello,World !\n); return 0; } static void __exit hello_exit(void) { printk(KERN_ALERT Goodbye,world!\n); } module_init(hello_init); module_exit(hello_exit); 编写Hello World 模块 #include linux/init.h #include linux/module.h #include linux/kernel.h MODULE_LICENSE(Dual BSD/GPL); static int hello_init(void) { printk(KERN_ALERT Hello,World !\n); return 0; } static void hello_exit(void) { printk(KERN_ALERT Goodbye,world!\n);

文档评论(0)

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

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

1亿VIP精品文档

相关文档