




已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Linux设备驱动程序开发基础 主讲人 TonyShen 课程目标 Linux设备驱动程序开发简介Linux设备驱动程序结构Linux设备驱动程序加载方式实验 编写一个字符设备驱动程序 LED或蜂鸣器 分别用静态编译 模块动态加载方法实现加入内核 设备驱动程序 应用程序 驱动程序 设备 write read ioctl ioctl 设备驱动程序特点 核心代码 设备驱动程序是核心的一部分 像核心中其他的代码一样 出错将导致系统的严重损伤 一个编写不当的设备驱动程序甚至能够使系统崩溃导致文件系统的破坏和数据的丢失 标准接口 设备驱动程序必须为Linux核心或者其从属的子系统提供一个标准的接口 核心机制 设备驱动程序可以使用标准的核心服务比如内存分配 中断发送和等待对列等 动态可加载 多数的Linux设备驱动程序可以在核心模块发出加载请求时进行加载 同时在不使用设备时进行卸载 这样核心可以有效地利用系统的资源 可配置 Linux设备驱动属于核心的一部分 用户可以根据自己的需要进行配置来选择适合自己的驱动 用户态与内核态 Linux运转在两种模式下 一种是用户态 另一种是内核态 内核态有较高的权限 可以控制处理器内存的映射和分配方式 访问外设空间和处理器状态寄存器 控制中断等 用户态只能运行系统上的应用程序 驱动程序作为系统内核的一部分 工作在内核态 通过get userput usercopy from usercopy to user等函数实现应用程序和驱动程序之间传送数据 指针 Linux设备的分类 字符设备以字节为单位逐个进行I O操作字符设备中的缓存是可有可无不支持随机访问如串口设备块设备块设备的存取是通过buffer cache来进行可以进行随机访问例如IDE硬盘设备可以支持可安装文件系统网络设备通过BSD套接口访问 设备文件 Linux抽象了对硬件的处理 所有的硬件设备都可以作为普通文件一样来看待可以使用和操作文件相同的 标准的系统调用接口来完成打开 关闭 读写和I O控制操作对用户来说 设备文件与普通文件并无区别字符设备和块设备是通过文件节点访问的 在Linux的文件系统中 可以找到 或者使用mknod创建 设备对应的文件名 称这种文件为设备文件 设备文件 命令ls l dev可列出系统的设备文件 主设备号和次设备号 主设备号 标识该设备的种类 也标识了该设备所使用的驱动程序主设备号的范围只能是1 255Linux内核支持动态分配主设备号次设备号 标识使用同一设备驱动程序的不同硬件设备 同一个驱动程序可以管理多个设备 它们依靠次设备号来区别 次设备号只在驱动程序内部使用 系统内核直接把次设备号传递给驱动程序 由驱动程序去管理 设备文件系统 Linux内核自己管理设备文件 完成设备文件节点的创建 删除 devfs devicefilesystem 在linux2 4 2 6内核中 设备文件系统可在配置内核时定制 linux2 4内核配置层次Filesystems devfilesystemsupportlinux2 6内核配置层次Filesystems Pseudofilesystem devfilesystemsupport系统驱动程序通过CONFIG DEVFS FS宏定义判断系统是否有对设备文件系统的支持 配置设备文件系统 Linux设备驱动程序结构 Linux设备驱动程序的代码结构大致可以分为如下几个部分 驱动程序的注册与注销 设备的打开与释放 设备的读写操作 设备的控制操作 设备的中断和轮询处理 一个最简单字符驱动程序 由下面5个函数和1个结构体就可组成 staticintmy open structinode inode structfile filp 设备打开时的操作 staticintmy release structinode inode structfile filp 设备关闭时的操作 staticintmy write structfile file constchar buffer size tcount loff t ppos 设备写入时的操作 驱动程序结构 staticstructfile operationsmy fops 对文件操作结构体成员定义初始值 staticint initmy init void 初始化硬件 注册设备 创建设备节点 staticvoid exitmy exit void 删除设备节点 注销设备 头文件与系统定义 include include include include include include include include 9200 h ifndef KERNEL define KERNEL endif ifndefMODULE defineMODULE endif defineLEDAT91C PIO PB11staticAT91PS SYSAT91 SYS1 AT91PS SYS AT91C VA BASE SYS defineDEVICE NAME my led staticintLed Major 0 ifdefCONFIG DEVFS FSstaticdevfs handle tDevfs Led Dir Devfs Led Raw endif 打开和关闭操作 my open和my release函数会在设备打开和关闭时被调用 其工作很简单 仅仅执行两个宏 MOD INC USE COUNT MOD DEC USE COUNT 这两个宏负责记录 增加或者减少 设备模块被使用的情况 防止当有应用程序使用驱动程序时 此模块被意外地卸载 staticintmy open structinode inode structfile filp MOD INC USE COUNT return0 staticintmy release structinode inode structfile filpMOD DEC USE COUNTreturn0 写入操作 staticintmy write structfile file constchar buffer size tcount loff t ppos charled status 0 copy from user 文件操作结构体初始化 staticstructfile operationsmy fops open my open write my write release my release structfile operations structmodule owner loff t llseek structfile loff t int ssize t read structfile char size t loff t ssize t write structfile constchar size t loff t int readdir structfile void filldir t unsignedint poll structfile structpoll table struct int ioctl structinode structfile unsignedint unsignedlong int mmap structfile structvm area struct int open structinode structfile int flush structfile int release structinode structfile int fsync structfile structdentry intdatasync int fasync int structfile int int lock structfile int structfile lock ssize t readv structfile conststructiovec unsignedlong loff t ssize t writev structfile conststructiovec unsignedlong loff t ssize t sendpage structfile structpage int size t loff t int unsignedlong get unmapped area structfile unsignedlong unsignedlong unsignedlong unsignedlong 文件操作结构体 设备初始化 staticint initmy init void 硬件初始化AT91F PIOB Enable LED AT91F PIOB OutputEnable LED 字符设备注册Led Major register chrdev 0 DEVICE NAME endif 设备注销 staticvoid exitmy exit void 删除设备文件 ifdefCONFIG DEVFS FSdevfs unregister Devfs Led Raw devfs unregister Devfs Led Dir endif 注销设备unregister chrdev Led Major DEVICE NAME module init my init 向Linux系统记录设备初始化的函数名称module exit my exit 向Linux系统记录设备退出的函数名称 驱动程序编译 Makefile文件内容 OBJ io led oSOURCE io led cCC arm linux gccCOMP Wall O2 DMODULE D KERNEL I home armlinux linux 2 4 19 rmk7 include c OBJ SOURCE CC COMP SOURCE clean rm OBJ 运行make命令 编译通过后当前目录下就生成名为io led o的驱动程序 驱动程序加载 Linux内核有2种加载驱动程序的方法 Linux系统启动时 通过代码自身加载模块 这种方式称为静态编译入内核 驱动程序开发完毕后一般使用这种方式 Linux系统启动后 通过insmod等命令加载模块 这种方式称为动态加载 驱动程序开发调试过程中一般使用这种方式 模块动态加载 驱动程序模块插入内核查看是否载入 如果载入成功会显示你的设备名称my led从内核移除设备 insmodio led o cat proc devices rmmodio led 静态编译进内核 1 程序放入内核目录 linux 2 49 rmk7 drivers char 2 修改linux 2 49 rmk7 drivers char Makefile文件添加obj CONFIG 9200LED io led o3 修改linux 2 49 rmk7 drivers char Config in文件添加tristate Support9200LEDdevice CONFIG 9200LED4 配置内核 编译内核 在配置菜单的字符设
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- qt考试试题及答案
- pcb期末考试及答案
- 光学科技解锁AI时代新视界 智能眼镜光学科技服务行业白皮书
- 高级接警调度员培训课件
- 1.3一元二次方程的根与系数的关系 分层练习(含答案)数学苏科版九年级上册
- 高空坠落安全知识培训课件记录
- 高熵合金课件
- 电焊工证件培训知识讲解课件
- G9a-IN-3-生命科学试剂-MCE
- 5-AF594-tyramide-生命科学试剂-MCE
- 《离婚经济补偿制度研究》13000字【论文】
- 2025-2030中国电流传感器行业市场发展趋势与前景展望战略研究报告
- 桩基工程监理评估报告
- 2025年供水管道工职业技能竞赛参考试指导题库300题(含答案)
- 预包装食品配送服务投标方案(技术方案)
- 第二章第二节女性生殖系统生理课件
- 宁波市慈溪市人民法院招聘审判辅助人员笔试真题2024
- 2021-2022学年人教版数学九年级下册相似三角形性质与判定 同步练习卷
- 《高尔夫基础培训》课件
- 沪教版(五四学制)(2024)六年级下册单词表+默写单
- 与国企合作开发零星地块框架合同协议书范本模板
评论
0/150
提交评论