已阅读5页,还剩66页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式系统设计大学教程 第七章设备驱动程序 主要内容 7 1概述7 2设备文件接口7 3中断处理7 4应用实例 7 1概述 Linux作为unix的一个变种 它继承了unix的设备管理方法 将所有的设备看作具体的文件 通过文件系统层对设备进行访问 所以在Linux uclinux的框架结构中 和设备相关的处理可以分为两个层次 文件系统层和设备驱动层 设备驱动层屏蔽具体设备的细节 文件系统层则向用户提供一组统一的 规范的用户接口 7 1概述 7 1 1设备驱动原理所有操作系统下设备驱动程序的共同目标是屏蔽具体物理设备的操作细节 实现设备无关性 在嵌入式操作系统中 设备驱动程序通常是内核的重要部分 运行在内核模式 即设备驱动程序为内核提供了一个I O接口 用户使用这个接口实现对设备的操作 图7 2显示了一个操作系统的输入输出子系统中各层次结构和功能 7 1 1设备驱动原理 图7 2I O系统层次结构和功能 7 1概述 7 1 2模块化编程由于历史原因及出于效率方面的考虑 Linux是一个宏内核 虽然这种宏内核给Linux带来了效率高的优点 但也给它带来了某种程度的麻烦 即一旦需要在内核的基础上增加一项功能时 就必须重新编译整个内核 这无疑给内核功能的扩充带来了不便 于是 Linux发展了可安装内核模块的机制 module 7 1 2模块化编程 从代码特征上来看 模块就是可完成一项独立功能的一组函数的集合 从使用特征上来看 它在需要时可以随时被安装 而在不需要时又可以随时被卸载 准确地说 模块就是一个已编译但未连接的可执行文件 利用这种机制 我们可以根据需要 在不重新编译内核的情况下 将编译好的模块动态地插入运行中的内核 或者将内核中已经存在的某个模块移走 7 1 2模块化编程 为了增强内核的灵活性和为了方便 设备驱动程度应被设计为可动态安装的内核模 于是 一个典型的Linux设备驱动程序应包含以下几部分代码 驱动程序模块的注册与注销函数 设备的打开 关闭 读 写及需要的其他操作函数 设备的中断服务程序 7 1概述 7 1 3设备类型Linux中的设备可以分为三类 字符设备 块设备和网络设备 1 字符设备字符设备是指数据处理以字节为单位按顺序进行的设备 它没有缓冲区 不支持随机读写 在对字符设备发出读 写请求时 实际的硬件I O一般就紧接着发生了 7 1 3设备类型 作为最简单的输入输出设备 操作系统将字符设备作为设备文件管理 其文件结点和目录管理方式与普通文件相同 字符设备的初始化在内核启动时进行 某个字符设备初始化时 其驱动程序会构造一个device struct结构 将其作为字符向量数组chrdevs的一个元素向Linux内核注册 7 1 3设备类型 2 块设备块设备是指那些在输入 输出时数据处理以块为单位的设备 它一般都采用了缓存技术 支持数据的随机读写 典型的块设备有硬盘 CD ROM等 对用户来说 块设备和字符设备的访问接口都是一样的 都是一组基于文件的系统调用 如read write等 它们在实现上细节的区别仅在内核和驱动程序的软件接口上 7 1 3设备类型 3 网络设备在Linux中 整个网络接口驱动程序的框架可分为四层 从上到下分别为协议接口层 网络设备接口层 提供实际功能的设备驱动功能层 以及网络设备和网络媒介层 7 1 3设备类型 图7 4网络驱动程序体系结构 7 1 3设备类型 1 网络设备接口所谓的网络设备接口 它既包括纯软件网络设备接口 如环路 loopback 也包括硬件网络设备接口 如以太网卡 在Linux中 网络设备接口是由数据结构device来表示的 它操作的数据对象 数据包是通过结构sk buff来封装的 7 1 3设备类型 2 网络驱动程序加载方法目前 Linux网络设备驱动程序的加载有两种方式 一种是系统启动时 由内核自动检测并静态加载 称之为 启动初始化方式 另一种是通过模块化机制在系统运行过程中根据需要由用户或系统进程动态加载 称之为 模块初始化方式 7 1概述 7 1 4设备号传统的设备管理中 除了设备类型外 Linux uclinux内核还需要一对被称作为主设备号 次设备号的参数 才能唯一地标识设备 主设备号 majornumber 标识设备对应的驱动程序 系统中不同的设备可以有相同的主设备号 主设备号相同的设备使用相同的驱动程序 内核利用主设备号将设备与相应的驱动程序对应 7 1 4设备号 次设备号 minornumber 用来区分具体设备的驱动程序实例 只能由设备驱动程序使用 内核的其他部分仅将它作为参数传递给驱动程序 向系统添加一个驱动程序相当于添加一个主设备号 字符型设备主设备号的添加和注销分别通过调用函数register chrdev 和unregister chrdev 实现 主要内容 7 1概述7 2设备文件接口7 3中断处理7 4应用实例 7 2设备文件接口 7 2 1用户访问接口1 open入口点打开设备准备I O操作 对字符设备文件进行打开操作 都会调用设备的open入口点 open子程序必须对将要进行的I O操作做好必要的准备工作 如清除缓冲区等 如果设备是独占的 即同一时刻只能有一个程序访问此设备 则open子程序必须设置一些标志以表示设备处于忙状态 7 2 1用户访问接口 2 open入口点close 函数的作用是关闭由open 函数打开的文件 其调用格式为 intclose inthandle 该函数关闭文件描述字handle相连的文件 7 2 1用户访问接口 3 read入口点从设备上读数据 对于有缓冲区的I O操作 一般是从缓冲区里读数据 read 函数的调用格式为 intread inthandle void buf intcount read 函数从handle 文件描述字 相连的文件中 读取count个字节放到buf所指的缓冲区中 返回值为实际所读字节数 返回 1表示出错 返回0表示文件结束 7 2 1用户访问接口 4 write入口点往设备上写数据 对于有缓冲区的I O操作 一般是把数据写入缓冲区里 write 函数的调用格式为 intwrite inthandle void buf intcount write 函数把count个字节从buf指向的缓冲区写入与handle相连的文件中 返回值为实际写入的字节数 7 2 1用户访问接口 5 ioctl入口点执行读 写之外的操作 函数原型为 intioctl intfd intcmd 参数cmd不经修改地传递给驱动程序 可选的arg参数无论是指针还是整数值 都以unsignedlong的形式传递给驱动程序 7 2设备文件接口 7 2 2一些重要数据结构1 file operations结构在Linux中 常用一个结构作为调用设备驱动程序中各个函数的跳转表 即把指向这组入口点的指针集中在一个结构中 这个结构就是定义于linux fs h文件中的file operations 7 2 2一些重要数据结构 2 文件结构在中定义的structfile是设备驱动程序的第二个最重要的数据结构 File结构代表一个 打开的文件 它与由structinode表示的 磁盘设备文件 有所不同 File结构由内核在打开时创建 而且在关闭前作为参数传递给操作在设备上的函数 在文件关闭后 内核释放这个数据结构 7 2 2一些重要数据结构 3 inode结构inode结构由内核在内部用来表示文件 因此 它和代表打开文件描述符的文件结构是不同的 可能有代表单个文件的多个打开描述符的许多文件结构 但是它们都指向一个单一的inode结构 7 2设备文件接口 7 2 3I O操作1 ioctl大部分驱动除了需要读写设备的能力 往往还需要通过设备驱动进行各种硬件控制的能力 用户空间必须常常能够请求设备进行超出简单的数据传输之外的操作 最常用的通过设备驱动程序完成控制动作的方法就是实现ioctl函数 7 2 3I O操作 2 阻塞型和非阻塞型I O操作对于read调用 可能没有数据可读 而又没有到达文件末尾 或者一个进程可能试图写操作 但是设备因为输出缓冲满了还没有准备好接收数据 调用进程往往不关心这种问题 程序员只希望调用read或write 并且使调用在必要的工作完成后返回 7 2 3I O操作 2 阻塞型和非阻塞型I O操作在这种情形下 驱动程序应当 缺省地 阻塞进程 使它进入睡眠直到请求可继续 即阻塞型I O操作 有时为实现正确的unix语义 要求一个操作不阻塞 即便它不能完全地进行下去 或者有时调用进程通知你 不管I O是否继续 它都不想阻塞 这就是非阻塞型I O操作 7 2 3I O操作 3 异步触发尽管大多数时候 阻塞型 非阻塞型I O操作以及select的结合可以有效地查询设备 但某些时候用这种技术管理就不够高效了 例如 一个在低优先级执行长计算循环的进程 需要尽可能快地处理输入数据 更好的方法是通过使能异步触发 无论何时数据可用 这个进程接受一个信号并不需要自己去查询 7 2 3I O操作 要打开异步触发机制 用户程序必须执行两个步骤 首先 指定一个进程作为文件的拥有者 属主 当一个进程使用fcntl系统调用发出F SETOWN命令时 这个拥有者进程的ID被保存在filp f owner中 第二步 为了确实打开异步触发机制 用户程序还必须通过另外一个fcntl命令F SETFL设置设备的FASYNC标志 主要内容 7 1概述7 2设备文件接口7 3中断处理7 4应用实例 7 3中断处理 在现代操作系统中 中断是发挥硬件尤其是CPU性能的一个重要方面 一般情况下操作系统向具体的硬件发出一个请求操作 该硬件就在自己的设备控制器控制下工作 在它完成所请求的任务时 利用中断来通知操作系统 操作系统根据它的状态调用相应的处理函数进行处理 这样就避免了在硬件工作时操作系统的无效等待 提高了系统的运行效率 7 3中断处理 7 3 1注册中断处理程序向内核注册中断处理程序主要实现两个功能 一是注册中断号 二是注册中断处理函数 在Linux中对应的中断处理注册函数为 intrequest irq unsignedintirq void handler int void structpt regs unsignedlongflags constchar device void dev id 7 3 1注册中断处理程序 返回值 request irq返回0表示成功 返回 INVAL表示失败 irq 15或handler NULL 返回 EBUSY表示中断已经被占用且不能共享 7 3 1注册中断处理程序 在一个设备驱动程序向内核注册了中断服务程序后 中断到来时的调度就由内核的中断处理子系统来完成了 中断处理子系统的一个主要任务是根据中断号找到正确的中断处理代码段 如图7 6所示 Linux中维护了一个irq action指针指向的中断函数处理向量表 该表由irqaction结构组成 7 3中断处理 7 3 2中断处理程序实现构建了中断处理的框架后 接下来的任务就是根据实际任务实现中断处理程序的具体功能 通常中断处理程序的主要任务是唤醒那些在设备上睡眠的进程 告诉它们进入运行态的条件已经具备 使之进行相应的处理 中断处理的一个主要特点是必须在中断时间内运行 这使得它的行为受到些限制 7 3 2中断处理程序实现 中断函数处理向量表示意图 7 3 2中断处理程序实现 一般在中断产生时 系统都要暂时关闭其它中断 如果该中断是快速中断 它可以在很短的时间内完成 这对其它的中断影响很小 但对于那些耗时很多的中断该怎么处理呢 在现代操作系统中处理这种情况主要是将一个中断处理分离成 上半部 和 下半部 两个阶段 主要内容 7 1概述7 2设备文件接口7 3中断处理7 4应用实例 7 4应用实例 7 4 1字符设备 按键驱动程序构建了中断处理的框架后 接下来的任务就是根据实际任务实现中断处理程序的具体功能 通常中断处理程序的主要任务是唤醒那些在设备上睡眠的进程 告诉它们进入运行态的条件已经具备 使之进行相应的处理 中断处理的一个主要特点是必须在中断时间内运行 这使得它的行为受到些限制 7 4 1字符设备 按键驱动程序 按键的硬件连接如图7 7所示 图7 7按键的硬件连接 7 4 1字符设备 按键驱动程序 1 设备初始化驱动程序在init keyboard 中实现向系统注册主次设备号 设备名 并初始化寄存器 代码如下 voidinit dev set void ICR 0 x00 低电平触发中断PDDIR 0 x80 设置PD7为输入PDSEL 0 x80 PD7作为I O与外部连接PDKBEN 0 x00 键盘中断使能 7 4 1字符设备 按键驱动程序 intinit keyboard void definekeyboard major50 手动分配主设备号为50 definekeyboard minor0 次设备号为0intrc 向系统注册字符设备rc register chrdev keyboard major keyboard keyboard fops if rc 0 register chrdev 的返回值小于零 注册失败printk Panic Couldnotregisterkeyboard Driver n elseinit dev set returnrc 7 4 1字符设备 按键驱动程序 2 注册中断和中断处理程序在open函数中向内核注册中断 代码如下 staticintkeyboard open structinode inode structfile file rc request irq IRQ MACHSPEC IRQ6 IRQ NUM keyboard interrupt IRQ FLG STD keyboard IRQ NULL if rc 返回值不为零 则注册失败 printk keyboard Driver Errorwhileinstallinginterrupthandler n return ENODEV MOD INC USE COUNT return0 7 4 1字符设备 按键驱动程序 中断处理程序如下 staticvoidkeyboard interrupt intirq void dev id structpt regs regs ISR 1 18 wake up interruptible wq 唤醒队列 ifdefDEBUGprintk I vewokenuptheprocess n endifreturn0 7 4 1字符设备 按键驱动程序 3 read的实现staticintkeyboard read structinode inode structfile file char buffer intsize char ch ifdefDEBUG 调用读函数时的调试信息printk I mreadingthedevice n endifinterruptible sleep on wq ifdefDEBUGprintk I mwakeup n endifreturn0 7 4应用实例 7 4 2网络设备 CS8900A芯片驱动程序1 CS8900A芯片特点CS8900A芯片是一个高度集成的以太网控制器芯片 它集成了ISA总线接口 曼彻斯特编码 解码器 片上RAM 10BASE T收发器 数据链路控制器MAC和芯上存储管理器等 是嵌入式平台实现10M以太网连接的很好的选择方案 7 4 2网络设备 CS8900A芯片驱动程序 1 EEPROM如果不使用CS8900A芯片的默认设置 EEPROM是必须要操作的 因为芯片的MAC地址都存在这里 另外还有一些用户设置 比如工作模式等 7 4 2网络设备 CS8900A芯片驱动程序 2 工作模式CS8900A有两种工作模式 MEMORY模式和I O模式 在MEMORY模式下编程操作较为简单 对任何寄存器都是直接操作 不过这需要硬件上多根地址线和网卡连接 I O模式下对任何寄存器操作均要通过I O端口0X300写入或读出 但这种模式在硬件上实现比较方便 而且是芯片的默认模式 所以在Linux中采用这种工作模式 它的传输效率是MEMORY模式的96 左右 7 4 2网络设备 CS8900A芯片驱动程序 一般情况下它的流程如下 测设备是否存在 检测中断号和I O地址 填充device结构大部分属性字段 调用ether setup dev 调用kmalloc申请需要的内存空间 7 4 2网络设备 CS8900A芯片驱动程序 2 初始化函数网络设备的探测是在初始化函数里完成的 该函数唯一的参数是一个指向设备的指针 其返回值是0或者一个负的错误代码 在采用 启动初始化方式 加载驱动程序时 该函数在中被注册进内核 在init进程启动时被net dev init 调用 7 4 2网络设备 CS8900A芯片驱动程序 3 设备打开函数与关闭函数打开和关闭一个网络接口是由ifconfig命令来完成的 当使用ifconfig为一个接口赋地址时 它完成两项工作 第一 它通过ioctl SIOCSIFADDR 即SocketI OControlSetInterFaceADDRess 来赋地址 第二 它通过ioctl SIOCSIFFLAGS 即SocketI OControlSetInterFaceFLAGS 对dev flag中的IFF UP置位来打开接口 7 4 2网络设备 CS8900A芯片驱动程序 一般情况下设备打开函数net open的基本流程如下 没有在初始化函数中注册中断号和I O地址 则在设备打开时要进行注册 将该设备挂到irq2dev map中 若使用基于中断的数据接收方式 以后就可以通过中断号和irq2dev map数组直接查找相应的设备了 初始化物理设备的寄存器 设置接口相应的dev的私有数据结构 dev priv 中的一些字段 设置dev中的tbusy interrupt和start等字段 7 4 2网络设备 CS8900A芯片驱动程序 4 数据包发送函数当系统需要发送数据时 它首先把数据打包成一个完整的sk buff结构体 然后调用hard start transmit 函数把它发送到网络设备接口上 7 4 2网络设备 CS8900A芯片驱动程序 5 中断处理函数目前几乎所有的网络设备接口都是以中断方式工作的 接口触发中断表明两种事件中的一种发生了 一个新包到达或一个包发送完成 中断例程可以通过检查硬件设备上的中断状态寄存器来判断是什么事件触发了中断 7 4 2网络设备 CS8900A芯片驱动程序 一般的中断服务程序的基本流程如下 确定发生中断的具体网络接口 打开标志位dev interrupt 表示本服务程序正在被使用 读取中断状态寄存器 根据寄存器判断中断发生的原因 有两种可能 一种是有新数据包到达 另一种是上次的数据传输已完成 若是因为有新数据包到达 则调用接收数据包的子函数net rx 如果中断是上次传输引起 则通知协议的上一层 修改接口的统计信息 关闭标志位tbusy 为下次传输做准备 关闭标志位interrupt 7 4 2网络设备 CS8900A芯片驱动程序 6 数据包接收函数在网络上有新数据包到达时 中断处理函数仅仅调用数据包接收子函数net rx 即可 一般情况下net rx 函数的操作流程如下 申请skb缓存区存储新的数据包 从硬件中读取新到达的数据 调用函数netif rx 将新的数据包向网络协议的上一层传送 修改接口的统计函数 7 4应用实例 7 4 3CAN总线驱动开发1 CAN总线介绍CAN ControllerAreaNetwork 总线最早是由德国BOSCH公司提出 实现汽车环境中的微控制器通讯 在车载各电子控制装置ECU之间交换信息 形成汽车电子控制网络 由于其具有成本低 实时性好 容错性高 设计灵活等特点 目前已被广泛地应用于各种工业领域 被公认为是最有前途的现成总线之一 7 4 3CAN总线驱动开发 本节所使用的CAN设备是Philips公司的SJA1000芯片 该芯片除支持PCA82C200模式 即默认的BasicCAN模式 外 还支持PeliCAN模式 并提供INTEL和Motorola两种寻址方式 PeliCAN模式的扩展功能包括 可读 写访问的错误计数器 可编程的错误报警限制 单次发送 只听模式 支持热插拔等等 7 4 3CAN总线驱动开发 2 CAN驱动开发流程及其实现 图7 9SJA1000与EP9315处理器的硬件连接 7 4 3CAN总线驱动开发 图7 10CAN总线驱动程序流程 7 4 3CAN总线驱动开发 1 模块的初始化模块的初始化函数module init负责注册模块所提供的任何设施 module init的使用是强制性的 这个宏会在模块的目标代码中增加一个特殊的段 用于说明内核初始化函数所在的位置 没有这个定义 初始化函数永远不会调用 7 4 3CAN总线驱动开发 2 服务于I O请求的子程序在这一部分中完成数据结构file operations的填充 实现该文件操作接口 本驱动中的file operations结构如下 Structfile operationsfops owner THIS MODULE read can read poll can poll llseek can llseek write can write ioctl can ioctl open can open 7 4 3CAN总线驱动开发 3 中断服务子程序在模块初始化时已经利用request irq 函数注册了设备中断 所以当中断请求IRQ产生时 将运行中断服务例程ISR 在中断服务程序中 首先要读取SJA1000的中断寄存器IR的值 识别中断源 比如当接收中断位RI为1 则说明是接收中断 进而调用接收函数来接收数据 当CPU读取这个只读存储器时 除了RI位外的所有位都将被复位 7 4 3CAN总线驱动开发 4 缓冲区操作SJA1000内部设有发送缓冲器TXB 13个字节 接收缓冲器RXB 13个字节 和RXFIFO 64个字节 其中TXB是CPU和位流处
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年会计初级职称历年仿真题解析及预测卷
- 2026年运输公司安全生产培训知识
- 2026年人工智能行业笔试题精
- 2026年中学物理教师招聘笔试冲刺题
- 2026年幼儿园消防教育知识
- 2026年乡村振兴战略知识竞赛试题库
- 2026年中国税务师协会税务师资格预测题
- 2026年武器装备许可证考试冲刺预测
- 2026年小学二年级上册语文期末压轴题型突破卷含答案
- 2026年海南省五指山市高三生物下册期末考试模拟考试卷及完整答案【有一套】
- 2025年城管协管员考试题及答案
- 知道智慧树网课《分析化学(兰州大学)》课后章节测试答案
- 《打印管理软件技术规范》
- 成都市青羊区教育局2025年“蓉漂人才荟”赴高校公开考核招聘240名教师笔试参考题库附答案解析
- 水下设备连接可靠性分析报告
- 风电场防洪防汛课件
- 铝合金门窗委托加工合同4篇
- 2025年医院感染防控知识竞赛试题及答案
- 武警班组战术课件
- 2026年中考英语复习:成都市2025年写作真题5篇满分范文
- 2024至2030年中国粪便菌群移植(FMT)行业市场预测与投资规划分析报告
评论
0/150
提交评论