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

上传人:2127513****773577... 文档编号:253203481 上传时间:2024-12-01 格式:PPT 页数:58 大小:577.73KB
返回 下载 相关 举报
嵌入式Linux设备驱动程序开发ppt课件_第1页
第1页 / 共58页
嵌入式Linux设备驱动程序开发ppt课件_第2页
第2页 / 共58页
嵌入式Linux设备驱动程序开发ppt课件_第3页
第3页 / 共58页
点击查看更多>>
资源描述
第一讲 嵌入式系统概述,电信学院崔寅鸣,Mobile: 13602731383,E-mail: ymcui,嵌入式Linux设备驱动程序开发,电子信息工程学院杨昕欣,嵌入式Linux设备驱动程序开发电子信息工程学院杨昕欣,本讲主要内容,交叉编译环境,Makefile,简介,设备驱动相关概念,设备驱动程序的开发流程,I2C,驱动程序实例,本讲主要内容交叉编译环境,交叉编译环境,嵌入式系统的开发需要宿主机(Host pc),因为嵌入式系统一般没有大容量的存储设备。,由于host pc的处理器与嵌入式微处理器通常不同,为了生成能够在嵌入式系统中运行的代码,需要进行交叉编译。,交叉编译:在宿主机上编译可以在目标系统上运行的二进制文件。,交叉编译环境嵌入式系统的开发需要宿主机(Host pc),因,交叉编译环境,一般包括:,Gcc,编译器,,for c,c+,Binutil,,一些辅助工具,包括,objdump(,可反编译二进制文件)、,as(,汇编器)、,ld(,链接器)等,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/gnu/release/arm-linux/lib arm-elf-linux/,交叉编译环境的建立以root用户登陆linux系统,嵌入式Linux一般调试方法,使用,Gdbserver,和,gdb,在目标系统上运行,gdbserver,在主机上运行,gdb,一般通过以太网建立连接,嵌入式Linux一般调试方法使用Gdbserver和gdb,Makefile简介,Linux,开发一般有大量源代码,为了避免大量重复的键入,gcc,进行编译,定义了,Makefile,文件,用于自动编译,#,make,该操作会调用,Makefile,Makefile,一般定义了:,Gcc,编译工具,编译命令,目标文件,依赖关系,Makefile简介Linux开发一般有大量源代码,为了避免,Makefile简介,例,:,test.o: test.c test.h,gcc -c -g test.c,-g,生成调试信息,-,c,只编译不链接成为可执行文件,-,o,确定输出文件名称,-,O,优化,-,w,禁止警告信息,-,Wall,打开所有类型警告信息,Makefile简介例:,Makefile变量,makefile,变量,预定义变量,$*不包含扩展名的目标文件名,$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。,$ 第一个依赖文件的名称,$?所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。,$目标的完整名称。,$所有的依赖文件,以空格分开,不包含重复的依赖文件。,Makefile变量makefile 变量预定义变量,简单Make指令说明,# Make clean ,清除编译过程的中间文件,# make dep ,设置,Makefile,文件中各个目标所依赖的文件列表,简单Make指令说明# Make clean 清除编译,使用Makefile方法,嵌入式,Linux,中,Makefile,更加复杂,可在已有,Makefile,文件基础上更改,使用Makefile方法嵌入式Linux中Makefile更,Linux系统中的设备文件,Linux,将所有外部设备看成是一类特殊文件,称之为“设备文件”,如果说系统调用是,Linux,内核和应用程序之间的接口,那么设备驱动程序则可以看成是,Linux,内核与外部设备之间的接口。设备驱动程序向应用程序屏蔽了硬件在实现上的细节,使得应用程序可以像操作普通文件一样来操作外部设备,Linux系统中的设备文件Linux将所有外部设备看成是一类,设备驱动程序是内核重要部分,系统调用接口,文件子系统,I/o,设备,字符、块设备,设备驱动程序,进程间通信,进程控制,进程调度,内存管理,硬件控制程序,内核简略结构:,设备驱动程序是内核重要部分系统调用接口文件子系统I/o设备字,设备驱动的大致结构,设备驱动的大致结构,设备驱动的作用,设备驱动是位于应用和物理设备之间的软件层,负责完成二者间的,I/O,操作;,在,LINUX,系统里,对用户程序,设备驱动隐藏了设备的具体细节,为不同设备提供了一致的接口;,设备驱动是嵌入式系统开发的重要内容之一,设备驱动的作用设备驱动是位于应用和物理设备之间的软件层,负责,设备驱动完成的工作,对设备初始化和释放,把数据从内核传送到硬件和从硬件读取数据,读取应用程序传送给设备文件的数据和回送应用程序请求的数据,检测和处理设备出现的错误,设备驱动完成的工作对设备初始化和释放,设备文件类型,通常有字符设备、块设备、网络设备三种,字符设备,字符设备是能够像字节流一样被访问的设备,例如字符终端、串口、键盘、声卡、,LCD、,触摸屏、扫描仪、打印机、并口、鼠标、游戏杆等。,块设备,块设备是指支持面向块访问的设备,每块包含2的,N,次幂字节数据,例如,IDE,设备(磁盘)、,floppy disk 、CD-ROM、Ramdisk,等。,块设备接口必须支持挂装文件系统。,网络设备即能够和其他主机交换数据的设备接口。,设备文件类型通常有字符设备、块设备、网络设备三种,主设备号与次设备号,LINUX,系统中,设备由一个主设备号和一个次设备号来标识;,主设备号唯一标识了设备类型,即设备驱动程序类型,它是块设备表或字符设备表中设备表项的索引。,次设备号仅由设备驱动程序解释,一般用于识别在若干可能的硬件设备中,,I/O,请求所涉及到的那个设备。,主设备号与次设备号LINUX系统中,设备由一个主设备号和一个,主设备号与次设备号,主设备号(Major Number)相同的设备使用相同的驱动程序,而次设备号(minor Number)用来区分该类型不同的设备实例。,主设备号与次设备号主设备号(Major Number)相同的,内核设备驱动模块,设备驱动程序以两种方式添加到内核:,Build in,直接把驱动程序编译到内核代码中,Module,以模块的方式加载驱动程序,内核设备驱动模块设备驱动程序以两种方式添加到内核:,Linux设备节点的添加,设备在/,dev,路径下,可用如下命令添加,dev,节点,b,代表块设备,,C,表示字符设备,mknod /dev/hda1 b 127 1,块设备,主设备号127,次设备号1,Linux设备节点的添加设备在/dev路径下,设备驱动大致构成,Linux,的设备驱动程序大致可以分为如下几个部分:驱动程序的注册与注销、设备的打开与释放、设备的读写操作、设备的控制操作、设备的中断和轮询处理,设备驱动大致构成Linux的设备驱动程序大致可以分为如下几个,设备驱动构成,设备驱动构成:,驱动程序的注册与注销,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),释放中断资源;,释放该设备;,释放其他的系统资源;,模块化的字符设备驱动程序框架int init_module(,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结构struct file_o,file_operations,结构,open:,用于打开文件设备,release:,在关闭文件的调用,read:,用于从设备中读取数据,write:,向设备发送数据,poll:,查询设备是否可读或可写,ioctl:,提供执行设备特定命令的方法,fasync:,用于设备的异步通知操作,file_operations结构open: 用于打开文件设,设备的注册与注销,,devfs,注册:,result =,devfs_register_chrdev,(0, MOD_NAME, ,/,申请主设备号,if ( result 0 ) return -ENODEV;,devfs_handle =,devfs_register,(NULL, MOD_NAME, ,result, 0,该方法的优点:无需创建设备节点,由系统自动完成。,设备的注册与注销,devfs注册:,设备的注册与注销,devfs,注销:,devfs_unregister_chrdev,(MAJOR, MOD_NAME);,devfs_unregister,(devfs_handle);,设备的注册与注销, devfs注销:,设备的注册与注销,方法二,注册:,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,设备驱动模块的安装与卸载安装驱动模块,驱动程序实例,-I,2,C,I2C,总线,用两根线串接多个设备,支持多设备之间的随机访问,提供冲突检测机制,实现对设备的管理,1992,年,1.0,版规定的快速模式的数据率达到,400Kbps,1998,年,2.0,版规定的高速模式数据率达到,3.4Mbps,驱动程序实例-I2CI2C 总线,MC9328MX1 的I2C模块特性,1.,符合,I2C,总线规范,2.,支持,3v/5v,兼容模式,3.,多重,Master,操作方式,4.,通过软件编程,可支持,64,种不同的时钟,5.,通过软件控制应答位的产生与否,6.,基于中断的驱动方式,逐字节传输数据,7.,支持起始位和终止位的产生和探测,8.,能够产生重复起始位,9.,支持呼叫地址识别,10.,能够获知应答位,11.,能够获知总线是否为“忙” 状态,MC9328MX1 的I2C模块特性1.符合I2C总线规范,MC9328MX1 的I2C模块结构,MC9328MX1 的I2C模块结构,MC9328MX1 协议时序,起始信号,当,SCL,为逻辑,1,时,,SDA,由,1,到,0,的转变表示了起始位,表示一次数据传输的开始,并唤醒所有在,I2C,总线上的设备,数据源,/,目的地址,,Master,发出一个,7,位的地址,即,Slave,设备的,I2C,总线地址,每个,Slave,有一个唯一地址,这个地址不是,Master,的地址,数据传输方向位,表明是从,Slave,读数据还是向,Slave,写数据,MC9328MX1 协议时序起始信号,当SCL为逻辑1时,S,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,设备可以不释放总线,而重新开始一次独立的数据传输过程。,MC9328MX1 协议时序D.应答位,被选址的Slave设,MC9328MX1 I2C 寄存器,MC9328MX1 I2C 寄存器,MC9328MX1 I2C 寄存器,1.I2C,地址寄存器,IADR,如果,MC9328,是,I2C,总线上的,Slave,设备,则此寄存器中存放相应的地址。,2.I2C,分频寄存器,IFDR,,用来控制,I2C,总线的时钟频率,支持多达,64,种的频率,最快数据率为,400Kbps,3.I2C,控制寄存器,控制,I2C,的中断,设置,Maser/Slave,模式、接收,/,传输模式、传输应答使能等位等,4.I2C,状态寄存器,I2CSR,,表明当前,I2C,总线的状态,如有无中断产生,是否接收到了应答信号,总线是否忙等,5.I2C,数据,I/O,寄存器,I2DR,,存放需要发送的数据或接收到的数据。在传输模式下,接收方发回的地址选中应答位信号,触发,I2C,模块发送本寄存器中的数据。在接收模式下,对该寄存器的读操作可以触发下一个数据传输过程。,MC9328MX1 I2C 寄存器1.I2C地址寄存器IAD,I2C 模块初始化,1.设定频率,2.如果工作在Slave模式,则将地址写入IADR寄存器中,3.通过设置I2CR寄存器中的IEN位,使能I2C模块。,4.修改I2CR中的模式位,选择Master或Slave模式,传输或者接收模式,设置中断使能位等,I2C 模块初始化1.设定频率,I2C 总线操作流程,1.模块初始化,2.产生起始位,总线空闲,通过对I2DR寄存器的读/写来发出START信号,3.数据传输,中断方式,检测ICF位来确定当前字节是否被传输完,检测IIF位检测是否接收到一个字节,轮询方式,禁用中断使能位,轮询IIF位,查看是否完成传输,I2C 总线操作流程1.模块初始化,I2C 总线操作流程,4.产生停止位,如果Master处于接收状态,接收来自Slave的数据,如果Master要结束本次传输,必须保证不在最后一个数据字节传输完后的第9个SCL时钟产生应答信号;,在读取倒数第2个字节之前将I2CR寄存器的TXAK位置位来实现;,在读取最后一个字节之前必须产生一个中止位信号。,I2C 总线操作流程4.产生停止位,I2C 总线操作流程,5.,产生重复起始位,如果,Master,要继续占用总线,可以发出一个重复起始位,开启一个新的数据传输,6.Slave,模式,检测,I2CSR,寄存器的,IAAS,位判断是否被选中。,在,Slave,数据传输周期中,,IAAS=0,。,在定址周期通过,SRW,可以确定,Slave,是发送还是接受,并且要相应设置,MTX,位。,在数据传输周期中,,IAAS=0,,,SRW,位无效。,释放总线的方式:如果是,Slave,发送模式,则将,Slave,设置为接收模式,进行一次哑读操作。如果是,Slave,接受模式,则将,Slave,设置为发送模式,进行一次哑写操作。,I2C 总线操作流程5.产生重复起始位,I2C 总线操作流程,7.仲裁淘汰,如果一个设备试图占用总线而失败,则该设备将被设为Slave模式,而且IAL被置位。,Slave程序首先要检测IAL位以判断,本设备进入Slave状态是否是由于仲裁淘汰引起的。,I2C 总线操作流程7.仲裁淘汰,嵌入式Linux设备驱动程序开发ppt课件,I2C总线驱动程序分析,1.I2C总线驱动程序,实现I2C的时序,2.I2C设备驱动程序,调用I2C总线驱动提供的接口,实现对设备的操作;首先实现I2C总线驱动,对于每一个具体的I2C设备,需要单独实现其驱动。,I2C总线驱动程序分析1.I2C总线驱动程序,I2C总线驱动程序分析,1.,关键结构体,: i2c_adapter,提供,I2C,总线驱动接口的模版,对每一个具体的总线设备,要根据这个模版定义自己的相应结构体及接口,I2C总线驱动程序分析1.关键结构体: i2c_adapte,I2C总线驱动程序分析,2.,关键结构体,i2c_algorithm,定义访问总线的函数接口,I2C总线驱动程序分析2.关键结构体 i2c_algorit,I2C总线驱动程序分析,3.核心函数:i2c_aa_init(void),I2C总线驱动程序分析3.核心函数:i2c_aa_init(,4.,关键函数:,i2c_aa_xfer,4.关键函数:i2c_aa_xfer,I2C总线驱动程序分析,5.其他关键函数:,i2c_aa_ioctl:,设置总线频率,读取总线状态,I2c_aa_cleanup:,释放中断,从设备列表数组中删除当前i2c设备,I2C总线驱动程序分析5.其他关键函数:,I2C设备驱动程序分析,1.关键结构体:i2c_client,I2C设备驱动程序分析1.关键结构体:i2c_client,I2C设备驱动程序分析,2.,关键结构体:,i2c_driver,I2C设备驱动程序分析2.关键结构体:i2c_driver,I2C设备驱动程序分析,3.,关键函数,: i2c_klcd_init(void),I2C设备驱动程序分析3.关键函数: i2c_klcd_i,I2C设备驱动程序分析,4.关键函数:i2c_klcd_attach_adapter,I2C设备驱动程序分析4.关键函数:i2c_klcd_att,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设备驱动程序分析接口函数映射:,I2C设备驱动程序分析,本例驱动程序没有提供通用的文件操作接口,不是一般意义上的驱动;,但体现了驱动程序中最重要的两个概念:设备信息结构体,底层访问接口结构体,本例的驱动同时也体现了一种常见的驱动开发模式:总线驱动与具体挂载设备的驱动分别单独实现;类似的驱动包括串口驱动与串口设备驱动等。,I2C设备驱动程序分析本例驱动程序没有提供通用的文件操作接口,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > PPT模板库


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

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


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