第11章-嵌入式Linux设备驱动程序课件.ppt

  1. 1、本文档共57页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
11.4 Linux设备驱动程序开发 设备驱动程序开发流程(字符设备) 模块化的驱动程序设计方式(字符设备) 字符型设备驱动demo源程序分析 LED驱动程序开发实例 键盘驱动程序开发实例 11.4.1 设备驱动程序开发流程 定义主、次设备号,也可以动态获取。 通过file_operations结构定义设备所需的文件操作:所定义的文件操作对应的file_operations结构体函数指针,指向相应的设备操作函数(设备驱动程序的各个函数) 实现设备驱动初始化函数---申请中断(如果有)、注册设备和退出函数—释放中断(如果有)、卸载设备。如果驱动程序采用模块方式,则要实现模块的初始化和退出函数。 实现设备所需的文件操作:相应的设备操作函数(设备驱动程序的各个函数)实现 实现中断服务程序(如果有) 将驱动编译到内核。如果驱动程序采用模块方式,需先编译成模块,然后加载。 11.4.2 模块化的驱动程序设计方式 模块机制“module”可以根据需要在不重新编译内核的情况下,将编译好的模块动态的插入运行中的内核,或者从运行中内核中将内核已经存在的一个模块移走。这种机制可以动态加载设备驱动程序到内核,为驱动程序开发调试提供了很大的方便 在调试的过程中一般使用模块动态加载的方式,它的调试效率较高。当驱动调试完成后,在发行的过程就集成进内核。 但编译进内核是某些驱动运行的唯一方法。例如:console驱动,flash驱动和对至少一种文件系统的支持等等 11.4.2 模块化的驱动程序设计方式 用gcc编译成模块,要加上以下参数: -D__KERNEL__ -DMODULE –I$(KERNELDIR_INCLUDE) 在内核运行时,可以通过lsmod 察看内核中已经动态加载的模块。而模块加载到内核和从内核中卸载可以通过以下命令实现,它们的操作对象xxxx是经过编译但没有链接的.ko 文件(实际上就是.o文件,在2.4版本及之前不用.ko文件,直接就沿用为.o文件) insmod xxxx 将编译的模块直接插入内核 rmmod xxxx 将编译的模块从内核中卸载 11.4.2 模块化的驱动程序设计方式 以驱动程序源文件为demo.c为例 驱动程序的编译(生成模块) gcc –c -D__KERNEL__ -DMODULE -I /usr/src/linux-2.4/include demo.c -o demo.ko 加载驱动(模块): insmod demo.ko 卸载驱动(模块): rmmod demo.ko 对应的模块化驱动程序编程中,设备驱动程序源程序中必须至少提供两个宏: module_init(驱动程序初始化函数名): 初始化模块的宏,在模块加载时调用 module_exit(驱动程序退出函数名): 卸载模块的宏,在模块卸载时调用 11.4.2 模块化的驱动程序设计方式 例:一个简单的模块化设备驱动程序 /*------------ mdemo.c ------------*/ #define MODULE #include linux/module.h int init_module(void){ printk(\nhello,world!\n\n”); return 0; } void cleanup_module(void){ printk(\n Bye Bye\n\n); } module_init(init_module); module_exit(cleanup_module); 11.4.2 模块化的驱动程序设计方式 首先通过下面命令来编译源文件mdemo.c : gcc -c -D__KERNEL__ -DMODULE -o mdemo.ko mdemo.c 在得到了mdemo.ko模块文件后,用insmod 命令把它动态加载到内核: # insmod mdemo.ko # hello world! # rmmod mdemo.ko # Bye Bye 11.4.2 模块化的驱动程序设计方式 驱动程序与应用程序的区别 设备驱动程序在Linux内核中以模块形式出现,与应用程序的执行过程不同,模块通常只是预先向内核注册自己,当内核需要时才被调用执行。 11.4.2 模块化的驱动程序设计方式 驱动程序与应用程序的区别 应用程序一般有一个main函数,从头到尾执行一个任务;驱动程序却不同,它没有main函数,因为它实际上只是在内核中可供调用的函数。 应用程序可以和C函数库链接,因此可以包含标准的头文件,比如stdio.h、stdlib.h等;在驱动程序中是不能使用标准C 库的,因此

文档评论(0)

勤劳的小厮 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档