嵌入式Linux设备驱动程序开发.ppt

上传人:sh****n 文档编号:7456769 上传时间:2020-03-21 格式:PPT 页数:58 大小:802.50KB
返回 下载 相关 举报
嵌入式Linux设备驱动程序开发.ppt_第1页
第1页 / 共58页
嵌入式Linux设备驱动程序开发.ppt_第2页
第2页 / 共58页
嵌入式Linux设备驱动程序开发.ppt_第3页
第3页 / 共58页
点击查看更多>>
资源描述
嵌入式Linux设备驱动程序开发 电子信息工程学院杨昕欣 本讲主要内容 交叉编译环境Makefile简介设备驱动相关概念设备驱动程序的开发流程I2C驱动程序实例 交叉编译环境 嵌入式系统的开发需要宿主机 Hostpc 因为嵌入式系统一般没有大容量的存储设备 由于hostpc的处理器与嵌入式微处理器通常不同 为了生成能够在嵌入式系统中运行的代码 需要进行交叉编译 交叉编译 在宿主机上编译可以在目标系统上运行的二进制文件 交叉编译环境 一般包括 Gcc编译器 forc c Binutil 一些辅助工具 包括objdump 可反编译二进制文件 as 汇编器 ld 链接器 等Glibc 提供系统调用和基本函数的c库CheaderGdb调试器 交叉编译环境的建立 以root用户登陆linux系统将 usr local目录备份 然后清空将BSP0 3 6 Toolchain 中的armLinuxXToolChain01 tar gzglibc2 1 3 tar gzinst glibc2 1 3ftp上传到 usr local执行 tarxvfzarmLinuxXToolChain01 tar gz tarxvfzglibc2 1 3 tar gz rm rfarm elf linux lib cp Rarm gnu release arm linux libarm elf linux 嵌入式Linux一般调试方法 使用Gdbserver和gdb在目标系统上运行gdbserver在主机上运行gdb一般通过以太网建立连接 Makefile简介 Linux开发一般有大量源代码 为了避免大量重复的键入gcc进行编译 定义了Makefile文件 用于自动编译 make该操作会调用MakefileMakefile一般定义了 Gcc编译工具编译命令目标文件依赖关系 Makefile简介 例 test o test ctest hgcc c gtest c g生成调试信息 c只编译不链接成为可执行文件 o确定输出文件名称 O优化 w禁止警告信息 Wall打开所有类型警告信息 Makefile变量 makefile变量 预定义变量 不包含扩展名的目标文件名 所有的依赖文件 以空格分开 并以出现的先后为序 可能包含重复的依赖文件 第一个依赖文件的名称 所有的依赖文件 以空格分开 这些依赖文件的修改日期比目标的创建日期晚 目标的完整名称 所有的依赖文件 以空格分开 不包含重复的依赖文件 简单Make指令说明 Makeclean 清除编译过程的中间文件 makedep 设置Makefile文件中各个目标所依赖的文件列表 使用Makefile方法 嵌入式Linux中Makefile更加复杂可在已有Makefile文件基础上更改 Linux系统中的设备文件 Linux将所有外部设备看成是一类特殊文件 称之为 设备文件 如果说系统调用是Linux内核和应用程序之间的接口 那么设备驱动程序则可以看成是Linux内核与外部设备之间的接口 设备驱动程序向应用程序屏蔽了硬件在实现上的细节 使得应用程序可以像操作普通文件一样来操作外部设备 设备驱动程序是内核重要部分 内核简略结构 设备驱动的大致结构 设备驱动的作用 设备驱动是位于应用和物理设备之间的软件层 负责完成二者间的I O操作 在LINUX系统里 对用户程序 设备驱动隐藏了设备的具体细节 为不同设备提供了一致的接口 设备驱动是嵌入式系统开发的重要内容之一 设备驱动完成的工作 对设备初始化和释放把数据从内核传送到硬件和从硬件读取数据读取应用程序传送给设备文件的数据和回送应用程序请求的数据检测和处理设备出现的错误 设备文件类型 通常有字符设备 块设备 网络设备三种字符设备字符设备是能够像字节流一样被访问的设备 例如字符终端 串口 键盘 声卡 LCD 触摸屏 扫描仪 打印机 并口 鼠标 游戏杆等 块设备块设备是指支持面向块访问的设备 每块包含2的N次幂字节数据 例如IDE设备 磁盘 floppydisk CD ROM Ramdisk等 块设备接口必须支持挂装文件系统 网络设备 即能够和其他主机交换数据的设备接口 主设备号与次设备号 LINUX系统中 设备由一个主设备号和一个次设备号来标识 主设备号唯一标识了设备类型 即设备驱动程序类型 它是块设备表或字符设备表中设备表项的索引 次设备号仅由设备驱动程序解释 一般用于识别在若干可能的硬件设备中 I O请求所涉及到的那个设备 主设备号与次设备号 主设备号 MajorNumber 相同的设备使用相同的驱动程序 而次设备号 minorNumber 用来区分该类型不同的设备实例 内核设备驱动模块 设备驱动程序以两种方式添加到内核 Buildin直接把驱动程序编译到内核代码中Module以模块的方式加载驱动程序 Linux设备节点的添加 设备在 dev路径下可用如下命令添加dev节点 b代表块设备 C表示字符设备mknod dev hda1b1271块设备 主设备号127 次设备号1 设备驱动大致构成 Linux的设备驱动程序大致可以分为如下几个部分 驱动程序的注册与注销 设备的打开与释放 设备的读写操作 设备的控制操作 设备的中断和轮询处理 设备驱动构成 设备驱动构成 驱动程序的注册与注销register chrdev 或者register blkdev unregister chrdev 或unregister blkdev 设备的打开与释放通过调用file operations结构中的函数open file operations结构中的函数release 设备驱动构成 设备的读写操作Read Write 设备的控制操作ioctl 设备的中断和轮询处理对于不支持中断的硬件设备 读写时需要轮流查询设备状态 以便决定是否继续进行数据传输 如果设备支持中断 则可以按中断方式进行操作 模块化的字符设备驱动程序框架 intinit module void 硬件初始化 注册设备 注册中断 voidcleanup module void 释放中断资源 释放该设备 释放其他的系统资源 file operations结构 structfile operationsdriver fops open driver open release driver release read driver read write driver write poll driver poll ioctl driver ioctl fasync driver fasync file operations结构 open 用于打开文件设备release 在关闭文件的调用read 用于从设备中读取数据write 向设备发送数据poll 查询设备是否可读或可写ioctl 提供执行设备特定命令的方法fasync 用于设备的异步通知操作 设备的注册与注销 devfs 注册 result devfs register chrdev 0 MOD NAME 该方法的优点 无需创建设备节点 由系统自动完成 设备的注册与注销 devfs 注销 devfs unregister chrdev MAJOR MOD NAME devfs unregister devfs handle 设备的注册与注销 方法二 注册 result register chrdev 0 MOD NAME rm dev MOD NAME 中断的申请与释放 申请 request irq irq irq handler flag dev name dev id dev id用于共享中断信号线 释放 free irq irq dev id 用户空间与内核空间的数据拷贝 方法一 copy to user void to constvoid from unsignedlongcount copy from user void to constvoid from unsignedlongcount 方法二 copy to user copy from user 上述2种方法功能类似 区别在第一种方法会进行用户地址空间指针的有效性检查 设备驱动模块的安装与卸载 安装驱动模块insmoddriver name o卸载驱动模块rmmoddriver name浏览系统中的模块lsmod 驱动程序实例 I2C I2C总线用两根线串接多个设备支持多设备之间的随机访问提供冲突检测机制 实现对设备的管理1992年1 0版规定的快速模式的数据率达到400Kbps1998年2 0版规定的高速模式数据率达到3 4Mbps MC9328MX1的I2C模块特性 1 符合I2C总线规范2 支持3v 5v兼容模式3 多重Master操作方式4 通过软件编程 可支持64种不同的时钟5 通过软件控制应答位的产生与否6 基于中断的驱动方式 逐字节传输数据7 支持起始位和终止位的产生和探测8 能够产生重复起始位9 支持呼叫地址识别10 能够获知应答位11 能够获知总线是否为 忙 状态 MC9328MX1的I2C模块结构 MC9328MX1协议时序 起始信号 当SCL为逻辑1时 SDA由1到0的转变表示了起始位 表示一次数据传输的开始 并唤醒所有在I2C总线上的设备数据源 目的地址 Master发出一个7位的地址 即Slave设备的I2C总线地址 每个Slave有一个唯一地址 这个地址不是Master的地址数据传输方向位 表明是从Slave读数据还是向Slave写数据 MC9328MX1协议时序 D 应答位 被选址的Slave设备通过返回一个应答位向Master告知其已经接收到了数据 通过将SDA线在起始位之后第9个时钟周期从逻辑1变为逻辑0来实现的 此应答位不受控制寄存器I2CR中TXAK或者状态寄存器中I2CSR中RXAK的影响 E 数据 I2C按照数据传输方向逐字节的完成数据传输 在SCL时钟周期的中 SCL 0时可以改变数据 而SCL 1则必须保持数据不变 F 应答位 接收方接受到数据后将SDA线置0表示接收到数据的应答信号 在多字节传输中 如果不将SDA位置0 则表示所有数据已经传输完成 G 终止位 表明一次数据传输的结束或Master设备中止通信 SCL为逻辑1时 SDA从0到1的一次变化表示了中止位的发出 H 重复起始位 Master在结束位周期可以不发中止信号 而重复发起始位信号 如果起始位信号产生先于中止位信号的产生 称为重复起始位 这时Master设备可以不释放总线 而重新开始一次独立的数据传输过程 MC9328MX1I2C寄存器 MC9328MX1I2C寄存器 1 I2C地址寄存器IADR 如果MC9328是I2C总线上的Slave设备 则此寄存器中存放相应的地址 2 I2C分频寄存器IFDR 用来控制I2C总线的时钟频率 支持多达64种的频率 最快数据率为400Kbps3 I2C控制寄存器 控制I2C的中断 设置Maser Slave模式 接收 传输模式 传输应答使能等位等4 I2C状态寄存器I2CSR 表明当前I2C总线的状态 如有无中断产生 是否接收到了应答信号 总线是否忙等5 I2C数据I O寄存器I2DR 存放需要发送的数据或接收到的数据 在传输模式下 接收方发回的地址选中应答位信号 触发I2C模块发送本寄存器中的数据 在接收模式下 对该寄存器的读操作可以触发下一个数据传输过程 I2C模块初始化 1 设定频率2 如果工作在Slave模式 则将地址写入IADR寄存器中3 通过设置I2CR寄存器中的IEN位 使能I2C模块 4 修改I2CR中的模式位 选择Master或Slave模式 传输或者接收模式 设置中断使能位等 I2C总线操作流程 1 模块初始化2 产生起始位总线空闲 通过对I2DR寄存器的读 写来发出START信号3 数据传输中断方式 检测ICF位来确定当前字节是否被传输完 检测IIF位检测是否接收到一个字节轮询方式 禁用中断使能位 轮询IIF位 查看是否完成传输 I2C总线操作流程 4 产生停止位如果Master处于接收状态 接收来自Slave的数据 如果Master要结束本次传输 必须保证不在最后一个数据字节传输完后的第9个SCL时钟产生应答信号 在读取倒数第2个字节之前将I2CR寄存器的TXAK位置位来实现 在读取最后一个字节之前必须产生一个中止位信号 I2C总线操作流程 5 产生重复起始位如果Master要继续占用总线 可以发出一个重复起始位 开启一个新的数据传输6 Slave模式检测I2CSR寄存器的IAAS位判断是否被选中 在Slave数据传输周期中 IAAS 0 在定址周期通过SRW可以确定Slave是发送还是接受 并且要相应设置MTX位 在数据传输周期中 IAAS 0 SRW位无效 释放总线的方式 如果是Slave发送模式 则将Slave设置为接收模式 进行一次哑读操作 如果是Slave接受模式 则将Slave设置为发送模式 进行一次哑写操作 I2C总线操作流程 7 仲裁淘汰如果一个设备试图占用总线而失败 则该设备将被设为Slave模式 而且IAL被置位 Slave程序首先要检测IAL位以判断 本设备进入Slave状态是否是由于仲裁淘汰引起的 I2C总线驱动程序分析 1 I2C总线驱动程序实现I2C的时序2 I2C设备驱动程序调用I2C总线驱动提供的接口 实现对设备的操作 首先实现I2C总线驱动 对于每一个具体的I2C设备 需要单独实现其驱动 I2C总线驱动程序分析 1 关键结构体 i2c adapter提供I2C总线驱动接口的模版 对每一个具体的总线设备 要根据这个模版定义自己的相应结构体及接口 I2C总线驱动程序分析 2 关键结构体i2c algorithm定义访问总线的函数接口 I2C总线驱动程序分析 3 核心函数 i2c aa init void 4 关键函数 i2c aa xfer I2C总线驱动程序分析 5 其他关键函数 i2c aa ioctl 设置总线频率 读取总线状态I2c aa cleanup 释放中断 从设备列表数组中删除当前i2c设备 I2C设备驱动程序分析 1 关键结构体 i2c client I2C设备驱动程序分析 2 关键结构体 i2c driver I2C设备驱动程序分析 3 关键函数 i2c klcd init void I2C设备驱动程序分析 4 关键函数 i2c klcd attach adapter I2C设备驱动程序分析 接口函数映射 函数调用路径 I2c control i2c klcd client i2c client i2c adapter i2c algorithm i2c ioctlI2c transfer i2c klcd client adapter msg 1 i2c adapter i2c algorithm i2c xfer I2C设备驱动程序分析 本例驱动程序没有提供通用的文件操作接口 不是一般意义上的驱动 但体现了驱动程序中最重要的两个概念 设备信息结构体 底层访问接口结构体本例的驱动同时也体现了一种常见的驱动开发模式 总线驱动与具体挂载设备的驱动分别单独实现 类似的驱动包括串口驱动与串口设备驱动等
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!