首页 []嵌入式Linux设备驱动程序开发

[]嵌入式Linux设备驱动程序开发

举报
开通vip

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

[]嵌入式Linux设备驱动程序开发
嵌入式Linux设备驱动程序开发电子信息工程学院杨昕欣本讲主要 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 交叉编译环境设备驱动相关概念设备驱动程序的开发流程I2C驱动程序实例交叉编译环境嵌入式系统的开发需要宿主机(Hostpc),因为嵌入式系统一般没有大容量的存储设备。由于hostpc的处理器与嵌入式微处理器通常不同,为了生成能够在嵌入式系统中运行的代码,需要进行交叉编译。交叉编译:在宿主机上编译可以在目标系统上运行的二进制文件。交叉编译环境一般包括:Gcc编译器,forc,c++Binutil,一些辅助工具,包括objdump(可反编译二进制文件)、as(汇编器)、ld(链接器)等Glibc,提供系统调用和基本函数的c库CheaderGdb调试器交叉编译环境的建立Step1:解压缩并安装arm-linux交叉编译工具#cd/usr/local#rm–fr./*/*清空/usr/local/下的文件*/#tarzxvf/tmp/usr-local-gcc.tar.gz#tarzxvf/tmp/arm-xtoolchain-0.1d.tar.gz#tarzxvf/tmp/arm-kernel-headers-0.1d.tar.gz/*/tmp是源代码usr-local-gcc.tar.gz、arm-xtoolchain-0.1d.tar.gz…存放路径*/Step2:修改配置文件#vi/etc/ld.so.conf/*将/usr/local/lib加在ld.so.conf最顶。*/#ldconfig-vStep3:设置PATH变量,使得在任何路径下都可以使用arm-linux-gcc工具#echo“exportPATH=/usr/local/bin:/usr/local/arm/bin:$PATH“>>~/.bashrc/*切换到普通用户模式*/$echo“exportPATH=/usr/local/bin:/usr/local/arm/bin:$PATH“>>~/.bashrc$reboot/*设置生效*/Linux系统中的设备文件Linux将所有外部设备看成是一类特殊文件,称之为“设备文件”,如果说系统调用是Linux内核和应用程序之间的接口,那么设备驱动程序则可以看成是Linux内核与外部设备之间的接口。设备驱动程序向应用程序屏蔽了硬件在实现上的细节,使得应用程序可以像操作普通文件一样来操作外部设备设备驱动程序是内核重要部分系统调用接口文件子系统I/o设备字符、块设备设备驱动程序进程间通信进程控制进程调度内存管理硬件控制程序内核简略结构:设备驱动的大致结构设备驱动的作用设备驱动是位于应用和物理设备之间的软件层,负责完成二者间的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:提供执行设备特定命令的 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 fasync:用于设备的异步 通知 关于发布提成方案的通知关于xx通知关于成立公司筹建组的通知关于红头文件的使用公开通知关于计发全勤奖的通知 操作设备的注册与注销,devfs注册:result=devfs_register_chrdev(0,MOD_NAME,&keypad_fops);//申请主设备号if(result<0){return-ENODEV;}devfs_handle=devfs_register(NULL,MOD_NAME,,result,0,,&keypad_fops,NULL);该方法的优点:无需创建设备节点,由系统自动完成。设备的注册与注销,devfs注销:devfs_unregister_chrdev(MAJOR,MOD_NAME);devfs_unregister(devfs_handle);设备的注册与注销,方法二注册:result=register_chrdev(0,MOD_NAME,&keypad_fops);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,constvoid*from,unsignedlongcount);copy_from_user(void*to,constvoid*from,unsignedlongcount);方法二:__copy_to_user()__copy_from_user()上述2种方法功能类似,区别在第一种方法会进行用户地址空间指针的有效性检查。设备驱动模块的安装与卸载安装驱动模块insmoddriver_name.o卸载驱动模块rmmoddriver_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 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 时序起始信号,当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模块发送本寄存器中的数据。在接收模式下,对该寄存器的读操作可以触发下一个数据传输过程。I2CR控制寄存器IEN(bit7)I2C模块使能0禁用,1使能IIEN(bit6)I2C中断使能0禁中断,1使能中断MSTA(bit5)Master/Slave模式选择0Slave,1MasterMTX(bit4)发送/接收模式选择0接收,1发送TXAK(bit3)传输应答使能0发送应答,1不发送RSTA(bit2)重复开始位产生0不产生,1产生I2CSR状态寄存器ICF(bit7)数据传输状态位0当前数据正在传输,1数据已经传输完成IAAS(bit6)Slave模式中I2C模块是否已经被选址0没有被选中,1已经被选中IBB(bit5)I2C总线忙状态位0总线空闲,1总线忙IAL(bit4)仲裁被淘汰位SRW(bit2)Slave模式中的读或写状态位0slave模式接收数据中,1slave模式发送数据中IIF(bit1)I2C中断指示位0没有产生I2C中断,1产生了I2C中断RXAK(bit0)接收到应答信号指示位0次接收到一个应答信号,1没有接收到应答信号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总线驱动程序 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 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_xferI2C总线驱动程序分析5.其他关键函数:i2c_aa_ioctl:设置总线频率,读取总线状态I2c_aa_cleanup:释放中断,从设备列表数组中删除当前i2c设备I2C设备驱动程序分析1.关键结构体:i2c_clientI2C设备驱动程序分析2.关键结构体:i2c_driverI2C设备驱动程序分析3.关键函数:i2c_klcd_init(void)I2C设备驱动程序分析4.关键函数:i2c_klcd_attach_adapterI2C设备驱动程序分析接口函数映射:函数调用路径: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_xferI2C设备驱动程序分析本例驱动程序没有提供通用的文件操作接口,不是一般意义上的驱动;但体现了驱动程序中最重要的两个概念:设备信息结构体,底层访问接口结构体本例的驱动同时也体现了一种常见的驱动开发模式:总线驱动与具体挂载设备的驱动分别单独实现;类似的驱动包括串口驱动与串口设备驱动等。
本文档为【[]嵌入式Linux设备驱动程序开发】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
正方体
暂无简介~
格式:ppt
大小:755KB
软件:PowerPoint
页数:55
分类:
上传时间:2022-05-11
浏览量:0