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

上传人:本田雅阁 文档编号:2155584 上传时间:2019-02-23 格式:PPT 页数:58 大小:802.51KB
返回 下载 相关 举报
嵌入式Linux设备驱动程序开发.ppt_第1页
第1页 / 共58页
嵌入式Linux设备驱动程序开发.ppt_第2页
第2页 / 共58页
嵌入式Linux设备驱动程序开发.ppt_第3页
第3页 / 共58页
亲,该文档总共58页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

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

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

2、器)等 Glibc,提供系统调用和基本函数的c库 C header Gdb调试器,交叉编译环境的建立,以root用户登陆linux系统 将/usr/local目录备份,然后清空 将BSP0.3.6/Toolchain/中的 armLinuxXToolChain01.tar.gz glibc2.1.3.tar.gz inst_glibc2.1.3 ftp上传到/usr/local 执行 # tar xvfz armLinuxXToolChain01.tar.gz # tar xvfz glibc2.1.3.tar.gz # rm -rf arm-elf-linux/lib # cp -R arm

3、/gnu/release/arm-linux/lib arm-elf-linux/,嵌入式Linux一般调试方法,使用Gdbserver和gdb 在目标系统上运行gdbserver 在主机上运行gdb 一般通过以太网建立连接,Makefile简介,Linux开发一般有大量源代码,为了避免大量重复的键入gcc进行编译,定义了Makefile文件,用于自动编译 # make 该操作会调用Makefile Makefile一般定义了: Gcc编译工具 编译命令 目标文件 依赖关系,Makefile简介,例: test.o: test.c test.h gcc -c -g test.c -g 生成调试

4、信息 -c 只编译不链接成为可执行文件 -o 确定输出文件名称 -O 优化 -w 禁止警告信息 -Wall 打开所有类型警告信息,Makefile变量,makefile 变量预定义变量 $* 不包含扩展名的目标文件名 $+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。 $ 第一个依赖文件的名称 $? 所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。 $ 目标的完整名称。 $ 所有的依赖文件,以空格分开,不包含重复的依赖文件。,简单Make指令说明,# Make clean 清除编译过程的中间文件 # make dep 设置Makefile文件中

5、各个目标所依赖的文件列表,使用Makefile方法,嵌入式Linux中Makefile更加复杂 可在已有Makefile文件基础上更改,Linux系统中的设备文件,Linux将所有外部设备看成是一类特殊文件,称之为“设备文件”,如果说系统调用是Linux内核和应用程序之间的接口,那么设备驱动程序则可以看成是Linux内核与外部设备之间的接口。设备驱动程序向应用程序屏蔽了硬件在实现上的细节,使得应用程序可以像操作普通文件一样来操作外部设备,设备驱动程序是内核重要部分,内核简略结构:,设备驱动的大致结构,设备驱动的作用,设备驱动是位于应用和物理设备之间的软件层,负责完成二者间的I/O操作; 在LI

6、NUX系统里,对用户程序,设备驱动隐藏了设备的具体细节,为不同设备提供了一致的接口; 设备驱动是嵌入式系统开发的重要内容之一,设备驱动完成的工作,对设备初始化和释放 把数据从内核传送到硬件和从硬件读取数据 读取应用程序传送给设备文件的数据和回送应用程序请求的数据 检测和处理设备出现的错误,设备文件类型,通常有字符设备、块设备、网络设备三种 字符设备 字符设备是能够像字节流一样被访问的设备,例如字符终端、串口、键盘、声卡、LCD、触摸屏、扫描仪、打印机、并口、鼠标、游戏杆等。 块设备 块设备是指支持面向块访问的设备,每块包含2的N次幂字节数据,例如IDE设备(磁盘)、floppy disk 、C

7、D-ROM、Ramdisk等。 块设备接口必须支持挂装文件系统。 网络设备即能够和其他主机交换数据的设备接口。,主设备号与次设备号,LINUX系统中,设备由一个主设备号和一个次设备号来标识; 主设备号唯一标识了设备类型,即设备驱动程序类型,它是块设备表或字符设备表中设备表项的索引。 次设备号仅由设备驱动程序解释,一般用于识别在若干可能的硬件设备中,I/O请求所涉及到的那个设备。,主设备号与次设备号,主设备号(Major Number)相同的设备使用相同的驱动程序,而次设备号(minor Number)用来区分该类型不同的设备实例。,内核设备驱动模块,设备驱动程序以两种方式添加到内核: Buil

8、d in 直接把驱动程序编译到内核代码中 Module 以模块的方式加载驱动程序,Linux设备节点的添加,设备在/dev路径下 可用如下命令添加dev节点,b 代表块设备,C表示字符设备 mknod /dev/hda1 b 127 1 块设备,主设备号127,次设备号1,设备驱动大致构成,Linux的设备驱动程序大致可以分为如下几个部分:驱动程序的注册与注销、设备的打开与释放、设备的读写操作、设备的控制操作、设备的中断和轮询处理,设备驱动构成,设备驱动构成: 驱动程序的注册与注销 register_chrdev( )或者register_blkdev( ) unregister_chrdev

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

10、id) 释放中断资源; 释放该设备; 释放其他的系统资源; ,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_operations结构,open: 用于打开文件设备 release: 在关闭文件的调用 read: 用于从设备中读取

11、数据 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

12、(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); 方法二: _ _

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

14、线规范 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总线地址,每个

15、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表示接收到数据的应答信号

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

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

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

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

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

21、版,对每一个具体的总线设备,要根据这个模版定义自己的相应结构体及接口,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设备驱动程序分析,

22、3.关键函数: i2c_klcd_init(void),I2C设备驱动程序分析,4.关键函数:i2c_klcd_attach_adapter,I2C设备驱动程序分析,接口函数映射: 函数调用路径: I2c_control(&i2c_klcd_client,) i2c_client i2c_adapter i2c_algorithm i2c_ioctl I2c_transfer(&i2c_klcd_client.adapter,&msg,1) i2c_adapter i2c_algorithm i2c_xfer,I2C设备驱动程序分析,本例驱动程序没有提供通用的文件操作接口,不是一般意义上的驱动; 但体现了驱动程序中最重要的两个概念:设备信息结构体,底层访问接口结构体 本例的驱动同时也体现了一种常见的驱动开发模式:总线驱动与具体挂载设备的驱动分别单独实现;类似的驱动包括串口驱动与串口设备驱动等。,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1