19Linux驱动程序原理.ppt_第1页
19Linux驱动程序原理.ppt_第2页
19Linux驱动程序原理.ppt_第3页
19Linux驱动程序原理.ppt_第4页
19Linux驱动程序原理.ppt_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux驱动程序原理 陈虎tommychen74 参考数目 JohnathanCorbet等著 魏永明等译 Linux设备驱动程序 中国电力出版社 2006年 什么是驱动程序 设备驱动程序是操作系统内核和机器硬件之间的接口 为应用程序屏蔽了硬件的细节 在应用程序看来 硬件设备只是一个设备文件 应用程序可以像操作普通文件一样对硬件进行操作 设备驱动程序主要完成这些功能 探测设备和初始化设备 从设备接收数据并提交给内核 从内核接收数据送到设备 检测和处理设备错误 嵌入式设备往往具有大量独有的外设 开发人员需要把很多精力放在设备驱动方面 Linux中设备类型 字符型设备字符设备的读写以字节为单位 存取时没有缓存 对字符设备发出读写请求时 实际的硬件I O紧接着就发生了 一般来说 字符设备不支持随机访问 典型的字符设备包括鼠标 键盘及串行口等 块设备 块设备读写以块为单位 典型的块大小为512或1024字节 利用一块系统内存作为缓冲区 当用户进程对设备发出读写请求时 驱动程序先察看缓冲区中的内容 若缓冲区中的数据能满足用户的要求就返回相应的数据 否则就调用相应的请求函数来进行实际的I O操作 以提高效率 块设备主要包括硬盘 软盘 CD ROM等 网络设备Linux的网络系统主要基于BSDUnix的Socket机制 在系统和驱动程序之间定义有专门的数据结构进行数据的传递 系统里支持对发送数据和接收数据的缓存 提高流量控制机制 提供对多协议的支持 驱动程序的公共特征 读写几乎所有设备都有输入和输出 操作系统定义一些读写接口 由驱动程序完成具体的读写操作 在驱动程序初始化时 需要把具有这种接口的读写函数注册到操作系统中 中断驱动程序把一个中断处理程序注册到系统中去 操作系统在硬件中断发生后调用驱动程序中的中断处理程序 时钟在实现驱动程序时 很多地方会用到时钟 如某些协议里的超时处理等 操作系统应该为驱动程序提供定时机制 一般是在预定的时间过去以后回调注册的时钟函数 设备文件 每个设备对应一个文件 放在 dev目录下每个设备文件都对应有两个设备号 存放在inode节点中主设备号标示设备的种类 也标识了该设备所使用的驱动程序 次设备号标识了使用同一设备驱动程序的不同硬件设备 一些典型的设备 设备名类型主设备号从设备号说明 dev fd0块设备20软盘 dev hda块设备30第一个IDE硬盘 dev ttyp0字符设备30控制终端 dev ttys0字符设备464第一个串口创建一个设备节点mknod dev hda1b80 字符设备文件的数据结构 驱动程序的注册与注销 设备驱动程序可以在系统启动时初始化 也可以在需要时动态加载 字符设备初始化由chr dev init 完成块设备初始化由blk dev init 完成从内核中注销设备时 还需要通过字符设备unregister chrdev 块设备unregister blkdev 设备的打开和关闭 打开设备是由open 完成的 在大部分驱动程序中 open完成如下工作 增加设备的使用计数 检查设备相关错误 如果是首次打开 则初始化设备 识别次设备号 如有必要则更新f op指针 关闭操作由close 完成的 主要完成以下工作 递减设备的使用计数 如果是最后一个释放 则关闭设备 编写驱动程序的注意事项 驱动程序是在内核空间运行堆栈很小尽量使用静态变量不能使用标准的Linux库函数调用 只能使用Linux内核提供的函数接口必须具有正确版本的编译器和操作系统内核 AD转换器的驱动程序分析 基本数据结构staticstructfile operationss3c2410 fops owner THIS MODULE open s3c2410 adc open read s3c2410 adc read write s3c2410 adc write release s3c2410 adc release typedefstruct structsemaphorelock 互斥锁wait queue head twait 等待队列intchannel 当前通道号intprescale 比例因子 ADC DEV 驱动程序注册 include defineDEVICE NAME s3c2410 adc staticintadcMajor 0 int inits3c2410 adc init void intret ADCTSC 0 XP PST NOP MODE ret request irq IRQ ADC DONE adcdone int handler SA INTERRUPT DEVICE NAME NULL if ret returnret ret register chrdev 0 DEVICE NAME 重要注解 指定初始化的宏 init initdata exit exitdata模块的初始化函数和注销函数 includemodule init init function module exit cleanup function 在内核中打印printk constchar fmt 设备注册函数 intregister chdev unsignedintmajor constchar name structfile operations fops major 主设备号name 驱动程序名称 出现在 proc devices中 fops 文件操作表相关代码ret register chrdev 0 DEVICE NAME 驱动程序申请中断 intrequest irq unsignedintirq void handler int void structpt regs unsignedlongirq flags constchar devname void dev id irq 要申请的中断号 handler 中断处理函数指针 irq flags 中断管理掩码 devname 设备名称 dev id 设备相关的私用存储区 用于标示自身例子中的程序 ret request irq IRQ ADC DONE adcdone int handler SA INTERRUPT DEVICE NAME NULL 设备注销 void exits3c2410 adc exit void ifdefCONFIG DEVFS FS endifunregister chrdev adcMajor DEVICE NAME 释放中断free irq IRQ ADC DONE NULL module exit s3c2410 adc exit 设备注销函数 intunregister chrdev unsignedintmajor constchar name major 主设备号name 设备名称必须与注册时保持一致 打开设备 staticints3c2410 adc open structinode inode structfile filp 初始化信号量init MUTEX 关闭设备 staticints3c2410 adc release structinode inode structfile filp 递减模块使用计数MOD DEC USE COUNT DPRINTK adcclosed n return0 调试打印 ifdefDEBUG defineDPRINTK x printk FUNCTION d LINE printk x else defineDPRINTK x void 0 endif 写入操作 staticssize ts3c2410 adc write structfile file constchar buffer size tcount loff t ppos intdata if count sizeof data errorinputdatasize 每次只能写入一个字DPRINTK thesizeofinputdatamustbe d n sizeof data return0 从用户空间拷贝到内核空间copy from user 写入数据格式 defineADC WRITE GETCH data data 16 0 x7 defineADC WRITE GETPRE data data 0 xff 写入数据的格式 读出函数 staticssize ts3c2410 adc read structfile filp char buffer size tcount loff t ppos intret 0 上锁信号量if down interruptible 结果处理 仅返回低10位ret ADCDAT0 ret 休眠等待 interrupt sleep on wait queue head t queue queue 等待队列需要在中断处理程序中唤醒 staticvoidadcdone int handler intirq void dev id structpt regs reg wake up 启动AD转换 defineSTART ADC AIN ch prescale do ADCCON PRESCALE EN PRSCVL prescale ADC INPUT ch ADCCON ADC START while 0 defineADCCONbADC CTL oADCCON defineoADCCON0 x00 R W ADCcontrolregister defineADC CTL BASE0 x58000000 definebADC CTL Nb REG ADC CTL BASE Nb REG 直接访问特定存储器地址 definePRESCALE ENDIS 1 14 definePRESCALE EN PRESCALE ENDIS 1 definePRSCVL x x 6 defineADC INPUT x x 3 defineADC STA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论