资源预览内容
第1页 / 共58页
第2页 / 共58页
第3页 / 共58页
第4页 / 共58页
第5页 / 共58页
第6页 / 共58页
第7页 / 共58页
第8页 / 共58页
第9页 / 共58页
第10页 / 共58页
亲,该文档总共58页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
嵌入式Linux设备驱动程序开发电子信息工程学院杨昕欣本讲主要内容n交叉编译环境nMakefile简介n设备驱动相关概念n设备驱动程序的开发流程nI2C驱动程序实例交叉编译环境嵌入式系统的开发需要宿主机(Host pc), 因为嵌入式系统一般没有大容量的存储设 备。 由于host pc的处理器与嵌入式微处理器通常 不同,为了生成能够在嵌入式系统中运行 的代码,需要进行交叉编译。 交叉编译:在宿主机上编译可以在目标系统 上运行的二进制文件。交叉编译环境一般包括:Gcc编译器,for c,c+Binutil,一些辅助工具,包括objdump(可 反编译二进制文件)、as(汇编器)、ld( 链接器)等Glibc,提供系统调用和基本函数的c库C headerGdb调试器交叉编译环境的建立n以root用户登陆linux系统n将/usr/local目录备份,然后清空n将BSP0.3.6/Toolchain/中的armLinuxXToolChain01.tar.gzglibc2.1.3.tar.gzinst_glibc2.1.3ftp上传到/usr/localn执行# tar xvfz armLinuxXToolChain01.tar.gz# tar xvfz glibc2.1.3.tar.gz# rm -rf arm-elf-linux/lib# cp -R arm/gnu/release/arm-linux/lib arm-elf-linux/嵌入式Linux一般调试方法n使用Gdbserver和gdb在目标系统上运行gdbserver在主机上运行gdb一般通过以太网建立连接Makefile简介nLinux开发一般有大量源代码,为了避免 大量重复的键入gcc进行编译,定义了 Makefile文件,用于自动编译# make 该操作会调用MakefilenMakefile一般定义了:Gcc编译工具编译命令目标文件依赖关系Makefile简介例: test.o: test.c test.h gcc -c -g test.c -g 生成调试信息 -c 只编译不链接成为可执行文件 -o 确定输出文件名称 -O 优化 -w 禁止警告信息 -Wall 打开所有类型警告信息Makefile变量makefile 变量预定义变量 $*不包含扩展名的目标文件名$+ 所有的依赖文件,以空格分开, 并以出现的先后为序,可能包含重复的依 赖文件。 $ 第一个依赖文件的名称$?所有的依赖文件,以空格分开, 这些依赖文件的修改日期比目标的创建日 期晚。 $目标的完整名称。 $所有的依赖文件,以空格分开, 不包含重复的依赖文件。简单Make指令说明n# Make clean 清除编译过程的中间 文件n# make dep 设置Makefile文件中各 个目标所依赖的文件列表使用Makefile方法n嵌入式Linux中Makefile更加复杂n可在已有Makefile文件基础上更改Linux系统中的设备文件Linux将所有外部设备看成是一类特殊文 件,称之为“设备文件”,如果说系统 调用是Linux内核和应用程序之间的接 口,那么设备驱动程序则可以看成是 Linux内核与外部设备之间的接口。设 备驱动程序向应用程序屏蔽了硬件在实 现上的细节,使得应用程序可以像操作 普通文件一样来操作外部设备设备驱动程序是内核重要部分系统调用接口文件子系统I/o 设 备字符、块设备设备驱动程序进程间通信进 程 控 制进程调度内存管理硬件控制程序内核简略结构:设备驱动的大致结构设备驱动的作用设备驱动是位于应用和物理设备之间的软件 层,负责完成二者间的I/O操作;在LINUX系统里,对用户程序,设备驱动隐 藏了设备的具体细节,为不同设备提供了 一致的接口;设备驱动是嵌入式系统开发的重要内容之一设备驱动完成的工作n对设备初始化和释放n把数据从内核传送到硬件和从硬件读取数 据n读取应用程序传送给设备文件的数据和回 送应用程序请求的数据n检测和处理设备出现的错误设备文件类型通常有字符设备、块设备、网络设备三种字符设备字符设备是能够像字节流一样被访问的设备,例如 字符终端、串口、键盘、声卡、LCD、触摸屏、扫 描仪、打印机、并口、鼠标、游戏杆等。 块设备块设备是指支持面向块访问的设备,每块包含2的N 次幂字节数据,例如IDE设备(磁盘)、floppy disk 、CD-ROM、Ramdisk等。块设备接口必须支持挂装文件系统。 网络设备即能够和其他主机交换数据的设备接 口。主设备号与次设备号LINUX系统中,设备由一个主设备号和一个次设 备号来标识; 主设备号唯一标识了设备类型,即设备驱动 程序类型,它是块设备表或字符设备表中设 备表项的索引。 次设备号仅由设备驱动程序解释,一般用于 识别在若干可能的硬件设备中,I/O请求所涉 及到的那个设备。主设备号与次设备号主设备号(Major Number)相同的设备使用相 同的驱动程序,而次设备号(minor Number)用来区分该类型不同的设备实 例。内核设备驱动模块设备驱动程序以两种方式添加到内核:Build in直接把驱动程序编译到内核代码中Module以模块的方式加载驱动程序Linux设备节点的添加n设备在/dev路径下n可用如下命令添加dev节点,b 代表块设备 ,C表示字符设备mknod /dev/hda1 b 127 1 块设备,主设备号127,次设备号1设备驱动大致构成Linux的设备驱动程序大致可以分为如下 几个部分:驱动程序的注册与注销、 设备的打开与释放、设备的读写操作 、设备的控制操作、设备的中断和轮 询处理设备驱动构成n设备驱动构成:驱动程序的注册与注销 register_chrdev( )或者 register_blkdev( )unregister_chrdev( )或 unregister_blkdev( )设备的打开与释放 通过调用file_operations结构中的函数 open( )file_operations结构中的函数release( )设备驱动构成设备的读写操作 Read()Write()设备的控制操作ioctl( )设备的中断和轮询处理对于不支持中断的硬件设备,读写 时需要轮流查询设备状态,以便决 定是否继续进行数据传输。如果设 备支持中断,则可以按中断方式进 行操作模块化的字符设备驱动程序框架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_operations结构open: 用于打开文件设备release: 在关闭文件的调用read: 用于从设备中读取数据write: 向设备发送数据poll: 查询设备是否可读或可写ioctl: 提供执行设备特定命令的方法fasync: 用于设备的异步通知操作设备的注册与注销,devfs注册:result = devfs_register_chrdev(0, MOD_NAME, /申请主设备号if ( result 0 ) return -ENODEV;devfs_handle = devfs_register(NULL, MOD_NAME, ,result, 0, 该方法的优点:无需创建设备节点,由系统自动完成。设备的注册与注销, devfs注销:devfs_unregister_chrdev(MAJOR, MOD_NAME);devfs_unregister(devfs_handle);设备的注册与注销,方法二注册:result = register_chrdev(0, MOD_NAME, if ( result 0 )return -ENODEV; mknod /dev/ MOD_NAME, C, MAJOR, MINOR注销:unregister_chrdev(Major, 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);方法二:_ _copy_to_user()_ _copy_from_user()上述2种方法功能类似,区别在第一种方法会进行用 户地址空间指针的有效性检查。设备驱动模块的安装与卸载安装驱动模块insmod driver_name.o卸载驱动模块rmmod driver_name浏览系统中的模块lsmod驱动程序实例-I2CI2C 总线用两根线串接多个设备支持多设备之间的随机访问提供冲突检测机制,实现对设备的管理1992年1.0版规定的快速模式的数据率达到 400Kbps1998年2.0版规定的高速模式数据率达到 3.4MbpsMC9328MX1 的I2C模块特性1.符合I2C总线规范 2.支持3v/5v兼容模式 3.多重Master操作方式 4.通过软件编程,可支持64种不同的时钟 5.通过软件控制应答位的产生与否 6.基于中断的驱动方式,逐字节传输数据 7.支持起始位和终止位的产生和探测 8.能够产生重复起始位 9.支持呼叫地址识别 10.能够获知应答位 11.能够获知总线是否为“忙” 状态MC9328MX1 的I2C模块结构MC9328MX1 协议时序A.起始信号,当SCL为逻辑1时,SDA由1到0的转变表示 了起始位,表示一次数据传输的开始,并唤醒所有在 I2C总线上的设备B.数据源/目的地址,Master发出一个7位的地址,即 Slave设备的I2C总线地址,每个Slave有一个唯一地址 ,这个地址不是Master的地址C.数据传输方向位,表明是从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在结束位周期可以不发中止信号,而 重复发起始位信号。如果起始
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号