ImageVerifierCode 换一换
格式:PPT , 页数:28 ,大小:742KB ,
资源ID:5880583      下载积分:10 金币
验证码下载
登录下载
邮箱/手机:
验证码: 获取验证码
温馨提示:
支付成功后,系统会自动生成账号(用户名为邮箱或者手机号,密码是验证码),方便下次登录下载和查询订单;
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/5880583.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  
声明  |  会员权益     获赠5币     写作写作

1、填表:    下载求助     留言反馈    退款申请
2、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
3、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
4、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
5、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【人****来】。
6、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
7、本文档遇到问题,请及时私信或留言给本站上传会员【人****来】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。

注意事项

本文(Linux设备驱动程序设计完全教程PPT.ppt)为本站上传会员【人****来】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4008-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

Linux设备驱动程序设计完全教程PPT.ppt

1、单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,2006 Embedded,Linux,设备驱动程序设计,Linux,设备驱动程序设计,郗闽军,牛建伟,1,实验目的,学习,Linux,下进行驱动程序设计的原理,掌握,Linux,设备驱动程序开发的基本过程和设计方法,2,实验内容,内核驱动设计入门模块方式驱动程序(,5.1,),内核驱动设计实验触摸屏驱动(,5.2,),写一个简单的应用程序,显示触摸位置的坐标(,x,y,),开发一个,LED,(数码管)驱动程序,并编写一个应用程序对所开发的驱动程序进行测试(,大作业,),实验实现的功能是上电复位后,数码管显

2、示数字,0-7,,然后每一个数字依次闪烁一次,小数点也要点亮,即:,0.1.2.3.4.5.6.7.,3,Linux,的设备驱动程序,硬件设备与应用程序之间的一个中间软件层,它使得某个特定硬件能够响应一个定义良好的内部编程接口,同时完全隐蔽了设备的工作细节,用户通过一组与具体设备无关的标准化的调用来完成相应的操作,驱动程序的任务就是把这些标准化的系统调用映射到具体设备对于实际硬件的特定操作上,驱动程序是内核的一部分,可以使用中断、,DMA,等操作,驱动程序在用户态和内核态之间传递数据,4,设备驱动程序的分类,字符设备,所有能够象字节流一样访问的设备都通过字符设备来实现,它们被映射为文件系统中的

3、节点,通常在,/dev/,目录下面,一般要包含,open read write close,等系统调用的实现,块设备,通常是指诸如磁盘、内存、,Flash,等可以容纳文件系统的存储设备。,块设备也是通过文件系统来访问,与字符设备的区别是:内核管理数据的方式不同,它允许象字符设备一样以字节流的方式来访问,也可一次传递任意多的字节。,网络接口设备,通常它指的是硬件设备,但有时也可能是一个软件设备,(,如回环接口,loopback),,它们由内核中网络子系统驱动,负责发送和接收数据包。,它们的数据传送往往不是面向流的,因此很难将它们映射到一个文件系统的节点上。,5,基本概念,主设备号和次设备号,主设

4、备号和次设备号能够唯一地标识一个设备,128,(,V2.0,以前,),256(V2.0,以后,),主设备号相同的设备使用相同的驱动程序,次设备号用于区分具体设备的实例,动态获取主设备号,Linux,下对设备号的分配请参考,Documentation/devices.txt,设备文件,Linux,使用设备文件来统一对设备的访问接口,将设备文件放在,/dev/,目录下,设备的命名一般为设备文件名,+,数字或者字母表示的子类,例如,/dev/hda1,/dev/hda2,等,Linux 2.4,以后引入了设备文件系统(,devfs,)的概念,所有的设备文件作为一个可以挂装的文件系统,这样就可以被文件

5、系统统一管理,从而设备文件就可以挂装到任何需要的地方。一般将主设备建立一个目录,再将具体的子设备文件建立在此目录下。例如,,/dev/mtdblock0,6,基本概念,驱动程序使用的,2,个重要结构,struct file,struct file_operations,7,基本概念,struct file,8,基本概念,struct file,数据结构,定义位于,include/fs.h,struct file,结构与驱动相关的成员,mode_t f_mode,标识文件的读写权限,loff_t f_pos,当前读写位置,unsigned int_f_flag,文件标志,主要进行阻塞,/,非阻塞

6、型操作时检查,struct file_operation*f_op,文件操作的结构指针,void*private_data,驱动程序一般将它指向已经分配的数据,struct dentry*f_dentry,文件对应的目录项结构,9,基本概念,设备驱动程序接口,(struct file_operations),标记化方法:,static struct file_operations demo_fops=,owner:THIS_MODULE,write:demo_write,read:demo_read,ioctl:demo_ioctl,open:demo_open,release:demo_re

7、lease,;,10,基本概念,设备驱动程序接口(,struct file_operations,),通常所说的设备驱动程序接口是指,struct file_operations,,它的定义位于,include/linux/fs.h,中。,在嵌入式系统的开发中,通常只要实现如下几个接口函数就能完成系统所需要的功能,init,加载驱动程序时,内核自动调用,read,从设备中读取数据,write,向字符设备中写数据,ioctl,控制设备,实现除读写操作以外的其他控制命令,open,打开设备并进行初始化,release,关闭设备并释放资源,exit,卸载驱动程序时,内核自动调用,11,基本概念,驱动

8、程序注册过程(动态分配主设备号),insmod module_name;,加载驱动程序,运行,init,函数,(register_chrdev(dev_Major,“module_name”,*fs),查看,/proc/devices,mknod /dev/module_name c/b,主设备号 次设备号,rmmod module_name ;,卸载驱动,运行,exit,函数(,unregister_chrdev(dev_Major,“module_name”,*fs),),用户程序调用,Open(“/dev/module_name”,mode);O_RDWR,Ioctl(),Write()

9、,Read(),Close(),12,开发驱动程序时须注意的事项,中断处理,中断是现代微处理器的一个重要功能,Linux,驱动程序中的中断处理函数,extern,int,request_irq(,unsigned,int,irq,void,(*handler)(,int,void,*,struct,pt_regs*),unsigned,long,flag,const,char,*dev_name,void,*dev_id);/,请求为中断号,irq,分配中断处理函数,extern,void,free_irq(,unsigned,int,void,*);/,释放中断,注意事项,不能向用户空间发送

10、或者接收数据,不能执行有睡眠操作的函数,不能调用调度函数,谨慎使用全局变量(可重入),自旋锁的使用,13,基本概念,字符设备的管理,驱动程序模块通过函数,int,register_chrdev(,unsigned,int,major,const,char,*name,struct,file_operations*fops),完成向内核的注册,其中,major,是主设备号,,name,是设备名,,fops,是针对该设备的驱动程序的接口。,在系统中为驱动程序模块建立一个设备节点,minjunRedHatAS$mknod/dev/demo c 254 0,其中,/dev/demo,标识设备名为,de

11、mo,,“,c”,说明是字符设备,,254,是指定的主设备号,,0,是次设备号,14,基本概念,驱动程序的编译,以,demo.c,为例,Makefile,的形式参考实验指导书,命令行的形式,minjunRedHatAS$armv4l-unknown-linux-gcc-Wall-c-O,-D_KERNEL_-I/home/minjun/embedded/kernel-2410s/include demo.c-o demo.o,加载驱动,minjunRedHatAS$insmod demo.o,卸载驱动,minjunRedHatAS$rmmod demo.o,15,基本概念,测试程序实例,/te

12、st.c,#include,#include,#include,int,main(),int,fd;,fd=open(/dev/demo,O_RDWR);,if,(fd MAX_BUF_LEN),count=MAX_BUF_LEN;,copy_to_user(buffer,drv_buf,count);,printk(user read data from drivern);,return,count;,static,int,demo_ioctl(,struct,inode*inode,struct,file*file,unsigned,int,cmd,unsigned,long,arg),p

13、rintk(ioctl runingn);,switch,(cmd),case,1:printk(runing command 1 n);,break,;,case,2:printk(runing command 2 n);,break,;,default,:,printk(error cmd numbern);,break,;,return,0;,static,int,demo_open(,struct,inode*inode,struct,file*file),MOD_INC_USE_COUNT;,sprintf(drv_buf,device open sucess!n);,printk(

14、device open sucess!n);,return,0;,18,驱动程序的实现驱动程序框架,static,int,demo_release(,struct,inode*inode,struct,file*filp),MOD_DEC_USE_COUNT;,printk(device releasen);,return,0;,static,struct,file_operations demo_fops=,owner:THIS_MODULE,write:demo_write,read:demo_read,ioctl:demo_ioctl,open:demo_open,release:dem

15、o_release,;,static,int,_init demo_init(,void,),SET_MODULE_OWNER(,result=register_chrdev(demo_MAJOR,demo,if,(result private_data,中的数据,release,与,open,正好相反,释放由,open,分配的,filp-private_data,中的数据,在最后一次关闭操作时关闭设备,使用计数减一,20,驱动程序的实现驱动程序框架,read,和,write,read,将数据从内核拷贝到应用程序空间,,write,则将数据从应用程序空间拷贝到内核。,由于用户空间和内核空间的内

16、存映射方式不同,所以在内核和用户空间传输数据的时候需要使用如下的函数,unsigned,long,copy_to_user(,void,*to,const,void,*from,unsigned,long,count);,unsigned,long,copy_from_user(,void,*to,const,void,*from,unsigned,long,count);,在阻塞型,IO,中,,read,和,write,调用可能会出现阻塞,read,调用当前无数据可读,而又没有数据马上可读,这时会睡眠并且等待,,write,调用也会出现这样的情况,等待队列机制,wait_queue_head

17、_t;(,定义在,中,),如果声明了等待队列并完成初始化,进程就可以睡眠,可以调用,sleep_on,的不同变体来完成睡眠,(,函数声明位于,中,),大多数情况下应使用“可中断”的函数,如,interruptible_sleep_on,。,睡眠进程被唤醒并不一定代表有数据,也有可能是被其他的信号唤醒,所以醒来后需要测试,condition.,21,8,段,LED,显示器外形原理图,一个数码管(,LED,)由一个,8,位的字节控制,当该位为“,1”,时点亮,为“,0”,时灭,a,c,b,d,e,f,h,g,22,LED,连接原理图,23,LED,显示驱动器,ZLG7290 I2C LED/,键盘

18、 驱动器,I2C,串行接口提供键盘中断信号方便与处理器接口,可驱动,8,位共阴数码管或,64,只独立,LED,和,64,个按键,可控扫描位数可控任一数码管闪烁,提供数据译码和循环移位段寻址等控制,8,个功能键可检测任一键的连击次数,无需外接元件即直接驱,LED,可扩展驱动电流和驱动电压,详细资料参加课程网站上的:,zlg7290.pdf,zlg7290_led.pdf,图,1 ZLG7290,引脚图,24,LED,显示驱动器功能框图,IIC,基地址是,0 x70,有,24,个,8,位寄存器(,0 x0,0 x17,),通过,IIC,总线访问,必须是字节操作,主要寄存器,SystemReg 0

19、x0,FlashOnOff 0 x0c,ScanNum 0 x0d,DpRam07 0 x10-0 x17,CmdBuf02 0 x7-0 x8,两种控制方式:,-,寄存器映象控制,-,命令解释控制,参考,zlg7290.pdf,25,LED,驱动程序的主要函数,static int led_write(struct file*filp,const char*buffer,size_t count,loff_t*ppos),static int led_ioctl(struct inode*inode,struct file*file,unsigned int cmd,unsigned lon

20、g arg),static int led_open(struct inode*inode,struct file*filp),static int led_release(struct inode*inode,struct file*filp),static int _init led_init(void),static void _exit led_exit(void),static struct file_operations led_fops=,owner:THIS_MODULE,open:led_open,release:led_release,write:led_write,ioc

21、tl:led_ioctl,;,可以使用,IIC_Write(char baseAddr,char offSet,char data),来设置寄存器的值(字节操作),该函数在,iic.h,文件中定义。,26,LED,测试应用程序框架,#include,#include,#include,#include,#include,int main(),int fd;,int ret;,if(fd=open(/dev/led,O_RDWR)0),printf(open led device failed!n);,exit(fd);,ioctl();,write();,close(fd);,return 0;,27,下一次实验内容,内核驱动设计入门模块方式驱动程序(,5.1,),在,PC linux,和开发平台上运行通过,内核驱动设计实验触摸屏驱动(,5.2,),写一个简单的应用程序,显示触摸位置的坐标(,x,y,),在开发平台上装载驱动程序,运行编写的测试应用程序,开发一个,LED,(数码管)驱动程序,并编写一个应用程序对所开发的驱动程序进行测试,(,如果做不完,可以在下下次实验接着做,),开发,led_driver.c,开发,led_test.c,28,

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服