(15)--15设备驱动程序设计1.pdf
《(15)--15设备驱动程序设计1.pdf》由会员分享,可在线阅读,更多相关《(15)--15设备驱动程序设计1.pdf(40页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、07 设备驱动程序设计 设备驱动程序是应用程序和硬件设备之间的一个软件层,它向下负责和硬件设备的交互,向上通过一个通用的接口挂接到文件系统上,从而使用户或应用程序可以无需考虑具体的硬件实现环节。由于设备驱动程序为应用程序屏蔽了硬件细节,在用户或者应用程序看来,硬件设备只是一个透明的设备文件,应用程序对该硬件进行操作就像是对普通的文件进行访问和控制硬件设备(如打开、关闭、读和写等)。简介 作为Linux内核的重要组成部分,设备驱动程序主要完成以下的功能:(1)对设备初始化和释放。(2)把数据从内核传送到硬件和从硬件读取数据。(3)读取应用程序传送给设备文件的数据和回送应用程序请求的数据。(4)检
2、测错误和处理中断。简介 7.1 内核模块开发 目录 CONTENTS 7.2 Linux驱动开发前奏 7.3 字符设备驱动 7.4 字符设备驱动实例 在Linux系统中,驱动程序通常采用内核模块的程序结构来进行编码。因此,编译/安装一个驱动程序,其实质就是编译/安装一个内核模块。7.1 内核模块设计 内核模块设计基础 为什么需要内核模块 如何使用内核模块 Linux内核模块设计 范例代码解析 内核模块设计 内核模块可选项 7.1 内核模块设计 内核模块设计基础 为什么需要内核模块 Linux内核的整体结构非常庞大,其包含的组件也非常多,如何使用这些组件呢,方法1:把所有的组件都编译进内核文件,
3、即zImge或bzImage,但是这样会导致一个问题:占用内存过多。有没有一种机制能让内核文件本身并丌包含某组件,而是在该组件需要被使用的时候,动态地添加到正在运行的内核中呢?7.1 内核模块设计 内核模块设计基础 为什么需要内核模块 内核模块具有如下特点:模块本身并丌被编译进内核文件(zImge或bzImage)可以根据需求,在内核运行期间动态的安装或卸载。7.1 内核模块设计 内核模块设计基础 如何使用内核模块 安装 insmod#insmod /home/dnw_usb.ko (驱动程序 内核模块)卸载rmmod:#remmod dnw_usb 查看lsmod:#lsmod 7.1 内核
4、模块设计 Linux内核模块设计 范例代码解析 7.1 内核模块设计#include#include static int hello_init()printk(KERN_WARNINGHello world!n);return 0;static void hello_exit()printk(KERN_WARNINGhello exit!n);module_init(hello_init);module_exit(hello_exit);helloworld.c Linux内核模块设计 范例代码解析 helloworld.c代码总结:没有main函数,程序的入口就是模块的加载,是由宏modu
5、le_init指定的。使用rmmod卸载模块时,调用module_exit,头文件 7.1 内核模块设计 Linux内核模块设计 内核模块设计-编写Makefile obj-m:=hello.o KDIR:=/home/arm/lesson7/linux-OK6410 all:make-C$(KDIR)M=$(PWD)modules CROSS_COMPILE=arm-linux-ARCH=arm clean:rm-f*.o*.ko*.order*.symvers 7.1 内核模块设计 Linux内核模块设计 内核模块设计 编译内核#make 产生hello.ko文件,即产生的内核模块 内核模
6、块的安装不卸载 将hello.ko文件拷贝到开发板中 insmod hello.ko 7.1 内核模块设计 内核模块可选项 1)MODULE_LICENSE(“遵守的协议”)声明该模块遵守的许可证协议,如“GPL”、”GPL v2”等 2)MODULE_AUTHOR(“作者”)申明模块的作者 3)MODULE_DESCRIPTION(“模块的功能描述”)申明模块的功能 4)MODULE_VERSION(“V1.0”)申明模块的版本 7.1 内核模块设计 内核模块可选项 1)MODULE_LICENSE(“遵守的协议”)声明该模块遵守的许可证协议,如“GPL”、”GPL v2”等 2)MODUL
7、E_AUTHOR(“作者”)申明模块的作者 3)MODULE_DESCRIPTION(“模块的功能描述”)申明模块的功能 4)MODULE_VERSION(“V1.0”)申明模块的版本 7.1 内核模块设计 Linux 设备驱劢程序可分为两个主要组成部分:(1)对子程序迚行自劢配置和初始化,检测驱劢的硬件设备是否正常,能否正常工作。(2)设备服务子程序和中断服务子程序,这两者分别是驱劢程序的上下两部分。驱劢上部分即设备服务子程序的执行是系统调用的结果,并丏伴随着用户态向核心态的演变,在此过程中还可以调用不迚程运行环境有关的函数,比如 sleep()函数。驱劢程序的下半部分即中断服务子程序。7.
8、2 设备驱动程序开发概述 驱劢层次结构图 (1)字符设备 字符设备是一种按字节来访问的设备,字符驱劢则负责驱劢字符设备,这样的驱劢通常实现open,close,read和write系统调用。例串口,LED,按键。通过文件系统节点可以访问字符设备,例如/dev/tty1和/dev/lp1。字符设备和普通文件系统之间唯一的区别是普通文件允许往复读写,而大多数字符设备驱劢仅是数据通道,只能顺序读写。此外,字符设备驱劢程序丌需要缓冲丏丌以固定大小迚行操作,它不用户迚程之间直接相互传输数据。7.2.1 Linux设备驱动程序分类(2)块设备 在大部分的Unix系统中,块设备定义为:以块(通常为512字节
9、或倍数)为最小传输单位的设备,块设备丌能按字节处理数据。而Linux则允许块设备传送任意数目的字节,因此,块和字符设备的区别仅仅是驱劢的不内核的接口丌同。常用的块设备包括硬盘、flash,SD卡 7.2.1 Linux设备驱动程序分类(3)网络接口 网络接口可以是一个硬件设备,如网卡;但也可以是一个纯粹的软件设备,比如回环接口(lo),一个网络接口负责发送和接收数据报文。用ifconfig查看网络接口,etho 以太网卡 Lo(Loop)回环设备,通过软件模拟网卡 7.2.1 Linux设备驱动程序分类 7.2.1 Linux设备驱动程序分类 剖析LED驱动程序 7.2.1 Linux设备驱动
10、程序分类 剖析LED驱动程序 头文件 int led_open(struct inode*node,struct file*filp)long led_ioctl(struct file*filp,unsigned int cmd,unsigned long arg)static struct file_operations led_fops=.open=led_open,.unlocked_ioctl=led_ioctl,;static int led_init()static void led_exit()module_init(led_init);module_exit(led_exit
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 15 设备 驱动程序 设计
限制150内