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

上传人:牧羊曲112 文档编号:4975446 上传时间:2023-05-27 格式:PPT 页数:58 大小:436KB
返回 下载 相关 举报
嵌入式Linux设备驱动程序开发.ppt_第1页
第1页 / 共58页
嵌入式Linux设备驱动程序开发.ppt_第2页
第2页 / 共58页
嵌入式Linux设备驱动程序开发.ppt_第3页
第3页 / 共58页
嵌入式Linux设备驱动程序开发.ppt_第4页
第4页 / 共58页
嵌入式Linux设备驱动程序开发.ppt_第5页
第5页 / 共58页
点击查看更多>>
资源描述

《嵌入式Linux设备驱动程序开发.ppt》由会员分享,可在线阅读,更多相关《嵌入式Linux设备驱动程序开发.ppt(58页珍藏版)》请在三一办公上搜索。

1、嵌入式Linux设备驱动程序开发,电子信息工程学院杨昕欣,本讲主要内容,交叉编译环境Makefile简介设备驱动相关概念设备驱动程序的开发流程I2C驱动程序实例,交叉编译环境,嵌入式系统的开发需要宿主机(Host pc),因为嵌入式系统一般没有大容量的存储设备。由于host pc的处理器与嵌入式微处理器通常不同,为了生成能够在嵌入式系统中运行的代码,需要进行交叉编译。交叉编译:在宿主机上编译可以在目标系统上运行的二进制文件。,交叉编译环境,一般包括:Gcc编译器,for c,c+Binutil,一些辅助工具,包括objdump(可反编译二进制文件)、as(汇编器)、ld(链接器)等Glibc,

2、提供系统调用和基本函数的c库C headerGdb调试器,交叉编译环境的建立,以root用户登陆linux系统将/usr/local目录备份,然后清空将中的ftp上传到/usr/local执行#tar xvfz#tar xvfz#rm-rf arm-elf-linux/lib#cp-R arm/gnu/release/arm-linux/lib arm-elf-linux/,嵌入式Linux一般调试方法,使用Gdbserver和gdb在目标系统上运行gdbserver在主机上运行gdb一般通过以太网建立连接,Makefile简介,Linux开发一般有大量源代码,为了避免大量重复的键入gcc进行

3、编译,定义了Makefile文件,用于自动编译#make 该操作会调用MakefileMakefile一般定义了:Gcc编译工具编译命令目标文件依赖关系,Makefile简介,例:test.o:test.c test.h gcc-c-g test.c-g 生成调试信息-c 只编译不链接成为可执行文件-o 确定输出文件名称-O 优化-w 禁止警告信息-Wall 打开所有类型警告信息,Makefile变量,makefile 变量预定义变量$*不包含扩展名的目标文件名$+所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。$第一个依赖文件的名称$?所有的依赖文件,以空格分开,这些

4、依赖文件的修改日期比目标的创建日期晚。$目标的完整名称。$所有的依赖文件,以空格分开,不包含重复的依赖文件。,简单Make指令说明,#Make clean 清除编译过程的中间文件#make dep 设置Makefile文件中各个目标所依赖的文件列表,使用Makefile方法,嵌入式Linux中Makefile更加复杂可在已有Makefile文件基础上更改,Linux系统中的设备文件,Linux将所有外部设备看成是一类特殊文件,称之为“设备文件”,如果说系统调用是Linux内核和应用程序之间的接口,那么设备驱动程序则可以看成是Linux内核与外部设备之间的接口。设备驱动程序向应用程序屏蔽了硬件在

5、实现上的细节,使得应用程序可以像操作普通文件一样来操作外部设备,设备驱动程序是内核重要部分,内核简略结构:,设备驱动的大致结构,设备驱动的作用,设备驱动是位于应用和物理设备之间的软件层,负责完成二者间的I/O操作;在LINUX系统里,对用户程序,设备驱动隐藏了设备的具体细节,为不同设备提供了一致的接口;设备驱动是嵌入式系统开发的重要内容之一,设备驱动完成的工作,对设备初始化和释放把数据从内核传送到硬件和从硬件读取数据读取应用程序传送给设备文件的数据和回送应用程序请求的数据检测和处理设备出现的错误,设备文件类型,通常有字符设备、块设备、网络设备三种字符设备 字符设备是能够像字节流一样被访问的设备

6、,例如字符终端、串口、键盘、声卡、LCD、触摸屏、扫描仪、打印机、并口、鼠标、游戏杆等。块设备 块设备是指支持面向块访问的设备,每块包含2的N次幂字节数据,例如IDE设备(磁盘)、floppy disk、CD-ROM、Ramdisk等。块设备接口必须支持挂装文件系统。网络设备即能够和其他主机交换数据的设备接口。,主设备号与次设备号,LINUX系统中,设备由一个主设备号和一个次设备号来标识;主设备号唯一标识了设备类型,即设备驱动程序类型,它是块设备表或字符设备表中设备表项的索引。次设备号仅由设备驱动程序解释,一般用于识别在若干可能的硬件设备中,I/O请求所涉及到的那个设备。,主设备号与次设备号,

7、主设备号(Major Number)相同的设备使用相同的驱动程序,而次设备号(minor Number)用来区分该类型不同的设备实例。,内核设备驱动模块,设备驱动程序以两种方式添加到内核:Build in直接把驱动程序编译到内核代码中Module以模块的方式加载驱动程序,Linux设备节点的添加,设备在/dev路径下可用如下命令添加dev节点,b 代表块设备,C表示字符设备mknod/dev/hda1 b 127 1块设备,主设备号127,次设备号1,设备驱动大致构成,Linux的设备驱动程序大致可以分为如下几个部分:驱动程序的注册与注销、设备的打开与释放、设备的读写操作、设备的控制操作、设备

8、的中断和轮询处理,设备驱动构成,设备驱动构成:驱动程序的注册与注销 register_chrdev()或者register_blkdev()unregister_chrdev()或unregister_blkdev()设备的打开与释放 通过调用file_operations结构中的函数open()file_operations结构中的函数release(),设备驱动构成,设备的读写操作 Read()Write()设备的控制操作ioctl()设备的中断和轮询处理对于不支持中断的硬件设备,读写时需要轮流查询设备状态,以便决定是否继续进行数据传输。如果设备支持中断,则可以按中断方式进行操作,模块化的

9、字符设备驱动程序框架,int init_module(void)硬件初始化;注册设备;注册中断;,void cleanup_module(void)释放中断资源;释放该设备;释放其他的系统资源;,file_operations结构,struct file_operations driver_fops=open:driver_open,release:driver_release,read:driver_read,write:driver_write,poll:driver_poll,ioctl:driver_ioctl,fasync:driver_fasync,;,file_operation

10、s结构,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);,设备的注册与注销,方法二

11、,注册: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,const void*from,unsigned long count);copy_from_user(void*to,const void*from,unsigned long count);方法二:_

12、 _copy_to_user()_ _copy_from_user()上述2种方法功能类似,区别在第一种方法会进行用户地址空间指针的有效性检查。,设备驱动模块的安装与卸载,安装驱动模块insmod driver_name.o卸载驱动模块rmmod driver_name浏览系统中的模块lsmod,驱动程序实例-I2C,I2C 总线用两根线串接多个设备支持多设备之间的随机访问提供冲突检测机制,实现对设备的管理1992年1.0版规定的快速模式的数据率达到400Kbps1998年2.0版规定的高速模式数据率达到3.4Mbps,MC9328MX1 的I2C模块特性,1.符合I2C总线规范2.支持3v/

13、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有一个唯一地址,这个地址不是Mas

14、ter的地址数据传输方向位,表明是从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,则表示所有

15、数据已经传输完成。G.终止位,表明一次数据传输的结束或Master设备中止通信。SCL为逻辑1时,SDA从0到1的一次变化表示了中止位的发出。H.重复起始位,Master在结束位周期可以不发中止信号,而重复发起始位信号。如果起始位信号产生先于中止位信号的产生,称为重复起始位。这时Master设备可以不释放总线,而重新开始一次独立的数据传输过程。,MC9328MX1 I2C 寄存器,MC9328MX1 I2C 寄存器,1.I2C地址寄存器IADR,如果MC9328是I2C总线上的Slave设备,则此寄存器中存放相应的地址。2.I2C分频寄存器IFDR,用来控制I2C总线的时钟频率,支持多达64种

16、的频率,最快数据率为400Kbps3.I2C控制寄存器,控制I2C的中断,设置Maser/Slave模式、接收/传输模式、传输应答使能等位等4.I2C状态寄存器I2CSR,表明当前I2C总线的状态,如有无中断产生,是否接收到了应答信号,总线是否忙等5.I2C数据I/O寄存器I2DR,存放需要发送的数据或接收到的数据。在传输模式下,接收方发回的地址选中应答位信号,触发I2C模块发送本寄存器中的数据。在接收模式下,对该寄存器的读操作可以触发下一个数据传输过程。,I2C 模块初始化,1.设定频率2.如果工作在Slave模式,则将地址写入IADR寄存器中3.通过设置I2CR寄存器中的IEN位,使能I2

17、C模块。4.修改I2CR中的模式位,选择Master或Slave模式,传输或者接收模式,设置中断使能位等,I2C 总线操作流程,1.模块初始化2.产生起始位总线空闲,通过对I2DR寄存器的读/写来发出START信号3.数据传输中断方式,检测ICF位来确定当前字节是否被传输完,检测IIF位检测是否接收到一个字节轮询方式,禁用中断使能位,轮询IIF位,查看是否完成传输,I2C 总线操作流程,4.产生停止位如果Master处于接收状态,接收来自Slave的数据,如果Master要结束本次传输,必须保证不在最后一个数据字节传输完后的第9个SCL时钟产生应答信号;在读取倒数第2个字节之前将I2CR寄存器

18、的TXAK位置位来实现;在读取最后一个字节之前必须产生一个中止位信号。,I2C 总线操作流程,5.产生重复起始位如果Master要继续占用总线,可以发出一个重复起始位,开启一个新的数据传输6.Slave模式检测I2CSR寄存器的IAAS位判断是否被选中。在Slave数据传输周期中,IAAS=0。在定址周期通过SRW可以确定Slave是发送还是接受,并且要相应设置MTX位。在数据传输周期中,IAAS=0,SRW位无效。释放总线的方式:如果是Slave发送模式,则将Slave设置为接收模式,进行一次哑读操作。如果是Slave接受模式,则将Slave设置为发送模式,进行一次哑写操作。,I2C 总线操

19、作流程,7.仲裁淘汰如果一个设备试图占用总线而失败,则该设备将被设为Slave模式,而且IAL被置位。Slave程序首先要检测IAL位以判断,本设备进入Slave状态是否是由于仲裁淘汰引起的。,I2C总线驱动程序分析,1.I2C总线驱动程序实现I2C的时序2.I2C设备驱动程序调用I2C总线驱动提供的接口,实现对设备的操作;首先实现I2C总线驱动,对于每一个具体的I2C设备,需要单独实现其驱动。,I2C总线驱动程序分析,1.关键结构体:i2c_adapter提供I2C总线驱动接口的模版,对每一个具体的总线设备,要根据这个模版定义自己的相应结构体及接口,I2C总线驱动程序分析,2.关键结构体 i

20、2c_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

21、_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设备驱动程序分析,本例驱动程序没有提供通用的文件操作接口,不是一般意义上的驱动;但体现了驱动程序中最重要的两个概念:设备信息结构体,底层访问接口结构体本例的驱动同时也体现了一种常见的驱动开发模式:总线驱动与具体挂载设备的驱动分别单独实现;类似的驱动包括串口驱动与串口设备驱动等。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号