




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 李伟民 学号 Z0403405 UT 斯达康通讯有限公司 2 胡 炜 学号 Z0403420 杭州建达软件有限公司 1 Linux 下的驱动程序开发下的驱动程序开发 李伟民 1 胡炜 2 浙江大学计算机技术专业 摘要摘要 本文主要从学习 Linux 下驱动程序的基本概念入手 了解 Linux 下驱动 程序的结构和框架 通过自己的学习深入了解在 Linux 环境下开发驱动程序的 过程 通过学习 我们自己动手编写了一个 USB 的鼠标和键盘驱动程序 这对 我们来说是一个从无到有的过程 关键词关键词 Linux 驱动程序驱动程序 1引言引言 1 1Linux 设备驱动程序分类设备驱动程序分类 Linux 系统将设备分为三类 字符设备字符设备 Char Device 块设备块设备 Block Device 和网络设备网络设备 Network Device 三种 字符设备字符设备 Char Device 是指存取时没有缓存的设备 典型的字符设备包括鼠 标 键盘 串行口等 块设备块设备 Block Device 是指读写都有缓存来支持 并且块设备必须能够随机 存取 random access 字符设备则没有这个要求 块设备主要包括硬盘设备 CD ROM 等 网络设备网络设备 Network Device 在 Linux 里做专门处理 Linux 的网络系统主要是 基于 BSD Unix 的 socket 机制 在系统和驱动程序之间定义有专门的数据结构 sk buff 进行数据的传递 系统里支持对发送数据和接收数据的缓存 提供流 量控制机制 提供对多协议的支持 1 2Linux 下驱动程序的几个基本概念下驱动程序的几个基本概念 在学习 Linux 下的驱动程序的时候 经常会遇到以下一些概念 1 2 1轮询与中断轮询与中断 内核与外设间的数据传输一般可以采用轮询 polling 或中断 interrupt 方式 轮询方式轮询方式 轮询方式的驱动程序在启动设备后会连续读取设备状态直到设 1 李伟民 学号 Z0403405 UT 斯达康通讯有限公司 2 胡 炜 学号 Z0403420 杭州建达软件有限公司 2 备完成操作 处于用户空间的进程进入内核开始执行设备驱动程序 当设备执 行 I O 操作时 与其相应的任务周期性地轮询设备状态寄存器以决定操作何时 完成 请求 内核空间 用户空间 返 回 调 用 命 令 轮 讯 状 态 状 态 设备 设备驱动程序 中断方式中断方式 采用中断的驱动程序在启动设备后就挂起 直到设备完成操作 并发出一个中断请求 IRQ 当 IRQ 产生时 中断处理程序运行 ISR 运行 他 的一些代码可能会放到 Bottom half 中或者放到任务队列中 在这种情况下 用 户进程使用驱动程序代码初始化 I O 操作 然后阻塞自己直到设备完成操作 在收到 IRQ 后 运行与设备对应的中断处理程序 它会唤醒沉睡的进程重新执 行用户空间进程 进程继续 进程阻塞 调度程序 下半段程序 请求 内核空间 用户空间 轮 讯 状 态 设备 设备驱动程序 1 李伟民 学号 Z0403405 UT 斯达康通讯有限公司 2 胡 炜 学号 Z0403420 杭州建达软件有限公司 3 1 2 2主设备号和次设备号主设备号和次设备号 内核使用主 次设备号来唯一标识设备 主设备号主设备号 major number 用于标识设备对应的驱动程序 主设备号相同的设 备使用相同的驱动程序 例如在 linux 下 软驱的主设备号是 2 IDE 硬盘的主 驱动号是 3 并口的主设备号是 6 次设备号次设备号 minor number 是一个 8bit 数 用来区分具体设备的实例 instance 因此同一个机器上的两个软驱具有相同的主设备号 2 但是第一个软驱的次设 备号是 0 第二个软驱的次设备号是 1 设备号操作宏设备号操作宏 MAJOR 和 MINOR 分别用来获取主 次设备号 MKDEV 根据主 次设备号合成设备号 dev number 在 Linux 内核源码中 主 次设备号通过宏 MKDEV 合成为一个变量 作 为设备号 dev 保存 高位保存的是主设备号 major number 低位保存的是次设备 号 minor number 需要时只需要利用 MAJOR 和 MINOR 两个宏定义便能够 简单的将两个设备号区分出来 1 2 3设备文件设备文件 Linux 中各种设备的输入 输出就好像是对普通文件输入 输出一样 因此 只需要将设备映射到一种特殊的文件 采用 mknod 进行系统调用或者直接进行 devfs 中的设备结点注册 就可以可达到上述目的 系统启动的时候 内核给系统中的每个设备都创建了一个设备文件 一个 设备文件是 dev 目录下的一项 它用于表示设备的驱动程序 利用 Linux 命令 mknod 可以在 dev 目录下生成该设备对应的结点 mknod dev 其中 参数是这个特殊文件的名字 可以在 dev 目录下的特殊文 件列表中看到它 参数为 c 表示的是字符设备 b 表示的是块设备 参 数和为主设备号和次设备号 如果设备文件系统 devfs 已经在系统中正常应用了 就不需要手工创建设备 结点了 在用户的应用程序中 当需要访问该设备时 只需要采用通常的文件操作 函数即可对该设备进行访问 首先采用 fopen 函数打开设备 活得文件指针 1 李伟民 学号 Z0403405 UT 斯达康通讯有限公司 2 胡 炜 学号 Z0403420 杭州建达软件有限公司 4 然后利用该文件指针进行的 read write ioctl 等操作 上述这些过程都是用虚拟文件系统 VFS 进行统筹管理的 根据该文件 inode 中的信息 为该文件结点安装合适的 file operations 结构 从而达到将文件操 作与设备操作对应起来的效果 同样的 此时如果采用 Llinux 命令 cat 等也可以直接从设备获得信息 其原 理就是它会自动调用文件读操作函数 2驱动程序的框架驱动程序的框架 Linux 的设备驱动程序与外界的接口可以分为三部分 驱动程序与操作系统内核的接口 这是通过 file operations include linux fs h 数据结构来完成的 驱动程序与系统引导的接口 这部分利用驱动程序对设备进行初始化 驱动程序与设备的接口 这部分描述了驱动程序如何与设备进行交互 这与具体设备密切相关 根据功能划分 设备驱动程序的代码由以下几个部分 设备的打开与释放 设备的读写操作 设备的控制操作 设备的中断和轮讯处理 2 1驱动程序的注册与注销驱动程序的注册与注销 设备驱动程序可以在系统启动时初始化 也可以在需要使用时动态加载 字符设备的初始化由 chr dev init 完成 包括对内存 终端 打印机 鼠 标等字符设备的初始化 块设备的初始化由 blk dev init 完成 这包括对 IDE 硬盘 软盘 光驱等块设备的初始化 初始化字符设备或块设备是通过 devfs register chrdev 或 devfs register blkdev 向内核注册 注销字符设备或块设备是通过 devfs unregister chrdev 或 devfs unregister blkdev 从内核中注销 1 李伟民 学号 Z0403405 UT 斯达康通讯有限公司 2 胡 炜 学号 Z0403420 杭州建达软件有限公司 5 2 2设备的打开与释放设备的打开与释放 打开设备由 open 完成 例如打印机的打开是 lp open 硬盘的打开是 hd open 大部分的驱动程序完成以下一些工作 增加设备的使用计数 检查设备的相关错误 如设备尚未准备好或类似的硬件问题 如果是首次打开 则初始化设备 识别次设备号 如有必要则更新 f op 指针 如果需要 分配且设置要放在 filp private data 里的数据结构 释放设备与打开设备正好相反 由 release 完成 例如释放打印机是 lp release 而释放终端设备是 tty release 释放设备一般需要作以下几件事 情 释放在 filp private data 中 open 分配的内存 如果是最后一个释放 则关闭设备 递减设备的使用计数 2 3设备的读写操作设备的读写操作 字符设备使用各自的 read 和 write 来进行数据读写 例如对虚拟终端的读 写是通过 vcs read 和 vcs write 块设备使用 generic file read 和 generic file write 进行数据读写 这两个通用函数向请求表中添加读写请求 内核可以通过 ll rw block 优化请求顺序 由于是对内存缓冲区而不是对设备 进行操作的 数据传输 这是通过数据结构 request queue 中的 request fn 来 完成 2 4设备的控制操作设备的控制操作 除了读写操作 有时候还需要控制设备 这可以通过设备驱动程序中的 ioctl 来完成 例如 IDE 硬盘的控制可以用 hd ioctl 对于光驱的控制可以使 用 cdrom ioctl 与读写操作不同 ioctl 的用法与具体设备密切相 除了 ioctl 设备驱动 程序还可能有其他的控制函数 例如 llseek 等 1 李伟民 学号 Z0403405 UT 斯达康通讯有限公司 2 胡 炜 学号 Z0403420 杭州建达软件有限公司 6 2 5设备的轮讯与中断设备的轮讯与中断 对于不支持中断的设备 读写时需要轮讯设备状态 以决定是否需要继续 进行数据传输 例如 打印机驱动程序在缺省时轮讯打印机的状态 如果设备支持中断 则可以按照中断的方式进行 3 实际程序一个实际程序一个 USB 的鼠标和键盘的驱动程序的鼠标和键盘的驱动程序 程序运行环境是 Linux2 4 版本 主要包括 usb sysdep h 和 usb c 两个程序 3 1 usb sysdep h ifndef USB SYSDEP H define USB SYSDEP H struct usb device id int class int subclass int protocol unsigned long driver info define USB INTERFACE INFO cl sc pr class cl subclass sc protocol pr endif USB SYSDEP H 3 2 usb c ifndef KERNEL define KERNEL endif ifndef MODULE define MODULE endif include include 1 李伟民 学号 Z0403405 UT 斯达康通讯有限公司 2 胡 炜 学号 Z0403420 杭州建达软件有限公司 7 include include include include Note If you write a backward portable driver with both USB and something else support you need to separate the USB stuff in order not to rely on sysdep h in USB related files if 0 include sysdep h else include usb sysdep h endif need local data structure as it must be allocated for new mouse device plugged in the USB bus struct sample device unsigned char data 8 enough for keyboard and mouse protocols char name either kdb or mouse struct urb urb USB Request block to get USB data int maxp packet len char output 80 used for printk at irq time Handler for data sent in by the device The function is called by the USB kernel subsystem whenever a device spits out new data static void sample irq struct urb urb struct sample device sample urb context char pos sample output 1 李伟民 学号 Z0403405 UT 斯达康通讯有限公司 2 胡 炜 学号 Z0403420 杭州建达软件有限公司 8 int i if urb status USB ST NOERROR return pos sprintf pos usbsample data from 8s sample name for i 0 imaxp i pos sprintf pos 02x sample data i printk KERN INFO s n sample output Two callbacks are invoked when an USB device is detached or attached to the bus static void sample disconnect struct usb device udev void clientdata the clientdata is the sample device we passed originally struct sample device sample clientdata remove the URB remove the input device free memory usb unlink urb kfree sample printk KERN INFO sample USB s disconnected n sample name MOD DEC USE COUNT but only if you increment the count in sample probe below return static void sample probe struct usb device udev unsigned int ifnum const struct usb device id id The probe procedure is pretty standard Device matching has already been performed based on the id table structure defined later struct usb interface iface 1 李伟民 学号 Z0403405 UT 斯达康通讯有限公司 2 胡 炜 学号 Z0403420 杭州建达软件有限公司 9 struct usb interface descriptor interface struct usb endpoint descriptor endpoint struct sample device sample printk KERN INFO usbsample probe called for s device n char id driver info mouse or keyboard iface interface if interface bNumEndpoints 1 return NULL endpoint interface endpoint 0 if endpoint bEndpointAddress if endpoint bmAttributes usb set protocol udev interface bInterfaceNumber 0 usb set idle udev interface bInterfaceNumber 0 0 allocate and zero a new data structure for the new device sample kmalloc sizeof struct sample device GFP KERNEL if sample return NULL failure memset sample 0 sizeof sample sample name char id driver info fill the URB data structure using the FILL INT URB macro int pipe usb rcvintpipe udev endpoint bEndpointAddress int maxp usb maxpacket udev pipe usb pipeout pipe if maxp 8 maxp 8 sample maxp maxp remember for later FILL INT URB register the URB within the USB subsystem 1 李伟民 学号 Z0403405 UT 斯达康通讯有限公司 2 胡 炜 学号 Z0403420 杭州建达软件有限公司 10 if usb submit urb return NULL announce yourself printk KERN INFO usbsample probe successful for s maxp is i n sample name sample maxp MOD INC USE COUNT if you do you ll need to unplug the device or the devices before being able to unload the module and return the new structure return sample The id table lists all devices that can be handled by this driver The three numbers are class subclass protocol has more details about interface matches and vendor device matches This feature is not there in version 2 2 see below sample probe 22 for details Here we use a fake usb device id structure defined in usb sysdep h static struct usb device id sample id table USB INTERFACE INFO 3 1 1 driver info unsigned long keyboard USB INTERFACE INFO 3 1 2 driver info unsigned long mouse 0 no more matches 1 李伟民 学号 Z0403405 UT 斯达康通讯有限公司 2 胡 炜 学号 Z0403420 杭州建达软件有限公司 11 The callbacks are registered within the USB subsystem using the usb driver data structure ifdef LINUX 24 static struct usb driver sample usb driver name sample probe sample probe disconnect sample disconnect id table sample id table else 2 2 With version 2 2 there is no device id support the probe function is called for every device being plugged and it must select whether the device is going to be handled or not Here we extract the identification phase and rely on sample probe above for the interesting part of the game Note that a 2 4 driver can use this approach as well by not defining an id table We think the id table way is much cleaner so we chose to exploit it where available static void sample probe 22 struct usb device udev unsigned int ifnum struct usb device id id struct usb interface descriptor interface printk KERN INFO sample probe 22 called n if udev descriptor bNumConfigurations 1 return NULL interface udev config 0 interface ifnum altsetting for id sample id table id driver info id if interface bInterfaceClass id class continue if interface bInterfaceSubClass id subclass continue if interface bInterfaceProtocol id protocol continue break found 1 李伟民 学号 Z0403405 UT 斯达康通讯有限公司 2 胡 炜 学号 Z0403420 杭州建达软件有限公司 12 if id driver info return NULL not ours return sample probe udev ifnum id static struct usb driver sample usb driver name sample prob
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025别墅装修泥瓦工程劳务分包合同(含防水保温)
- 2025版三方融资租赁合同范本适用于能源产业
- 2025版净水器滤芯更换与水环境监测服务合同
- 2025厂长任期创新成果奖励劳动合同协议书
- 2025年度城市地下综合管廊通风与排烟系统施工合同
- 2025第4章WTO与国际贸易风险管理咨询合同
- 2025年度粮食收购居间代理服务合同范本下载
- 2025版土地流转与农村产权交易平台建设合同补充协议
- 2025版农业灌溉设备维护与节水服务合同范本
- 2025版车展专属VIP贵宾接待与专属活动合同
- 2025至2030中国电容膜片真空计行业发展趋势分析与未来投资战略咨询研究报告
- 社工儿童沟通技巧课件
- 物业追缴奖励方案(3篇)
- 2025年甘肃省高考物理试卷(含答案)
- 2025二年级语文下册期末统考测试卷汇-总
- 血管活性药物静脉输注护理
- 造林绿化落地上图技术规范(试行)
- 2025年浙江省杭州市西湖区九年级中考一模科学试卷
- 苯乙酮项目可行性研究报告
- T/CIE 166-2023企业级固态硬盘测试规范第2部分:性能测试
- 2025年智慧城市产业园区开发建设社会稳定风险评估与风险防范对策报告
评论
0/150
提交评论