ImageVerifierCode 换一换
格式:PPT , 页数:32 ,大小:154.50KB ,
资源ID:13337851      下载积分:10 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

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

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

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

注意事项

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

实验五-driverdemo设备驱动程序.ppt

1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,嵌入式系统设计实验五设备驱动程序,实验内容,5.1,内核驱动设计入门,-,模块方式驱动实验,2,实验步骤,实验指导书,P223-225,进入,/arm2410s/exp/drivers/demo,目录,使用,VI,查看源码,编译驱动模块及测试程序,cd,/arm2410s/exp/drivers/demo/,make,3,实验步骤,注:如果编译的时候出现问题,可能在,/,usr/src,下没有建立一个,linux,连接,可以使用下面的命令:,cd,/,usr/src,/,ln,sf,linux-2.

2、4.20-8,linux,ls,查看目录文件,可见有如下文件:,debug,linux,linux-2.4 linux-2.4.20-8,redhat,4,实验步骤,如果用,gcc,编译,需要通过下面的命令来建立设备节点,如果使用交叉编译的话,则不需要建立设备节点。,mknod,/dev/demo c 254 0,插入驱动模块,root demo#,Insmod,demo.o,执行命令进行测试:,root demo#./,test_demo,5,实验步骤,运行结果,6,设备驱动程序,设备驱动程序的作用,设备驱动程序的分类,设备驱动程序在操作系统中的位置,机制与策略,设备驱动程序的基本结构,设备

3、驱动程序如何被使用,一个简单设备驱动程序实例,7,设备驱动程序的作用,设备驱动程序将复杂的硬件抽象成一个结构良好的设备,并通过提供统一的程序接口为系统的其它部分提供使用设备的能力和方法。,设备驱动程序,(,应该只是,),为系统的其它部分提供各种使用设备的能力,使用设备的方法应该由应用程序决定。,8,Linux,下对外设的访问只能通过驱动程序,Linux,对于驱动程序有统一的接口,以文件的形式定义系统的驱动程序:,Open,、,Release,、,read,、,write,、,ioctl,驱动程序是内核的一部分,可以使用中断、,DMA,等操作,驱动程序需要在用户态和内核态之间传递数据,9,设备驱

4、动程序的分类,字符设备驱动程序,各种串行接口,并行接口等。,块设备驱动程序,磁盘设备等,网络设备驱动程序,网卡等。,杂项设备驱动程序,不属于上述三种设备之外的一些设备,如,SCSI,时钟等。,10,在操作系统中的位置,设备驱动程序是内核代码的一部分。,驱动程序的地址空间是内核的地址空间。,驱动程序的代码直接对设备硬件,(,实际是设备的各种寄存器,),进行控制,(,实际就是读写操作,),。,应用程序通过操作系统的系统调用执行相应的驱动程序函数。中断则直接执行相应的中断程序代码。,设备驱动程序的,file_operations,结构体的地址被注册到内核中的设备链表中。,块设备和字符设备以设备文件的

5、方式建立在文件系统中的,/dev,目录下,而且每个设备都有一个主设备号和一个次设备号。,11,块设备驱动程序,字符设备驱动程序,网络设备驱动程序,12,ls-l/dev,crw-r-1 root root 1,1 Jan 1 00:00 mem,crw-r-1 root root 1,2 Jan 1 00:00 kmem,crw-rw-rw-1 root root 1,3 Jan 1 00:00 null,crw-r-1 root root 1,4 Jan 1 00:00 port,crw-rw-rw-1 root root 1,5 Jan 1 00:00 zero,crw-rw-rw-1 r

6、oot root 1,7 Jan 1 00:00 full,crw-r-r-1 root root 1,8 Jan 1 00:00 random,crw-r-r-1 root root 1,9 Jan 1 00:00 urandom,crw-rw-rw-1 root root 5,0 Jan 1 00:00 tty,crw-1 root root 5,1 Jan 1 00:00 console,crw-rw-rw-1 root root 5,2 Jan 1 00:00 ptmx,drwxr-xr-x 1 root root 0 Jan 1 00:00 pty,drwxr-xr-x 2 root

7、 root 0 Jan 1 00:00 pts,drwxr-xr-x 1 root root 0 Jan 1 00:00 rd,drwxr-xr-x 1 root root 0 Jan 1 00:00 mtd,drwxr-xr-x 1 root root 0 Jan 1 00:00 mtdblock,crw-1 root root 4,64 Jan 1 00:15 ttyS0,crw-1 root root 4,65 Jan 1 00:00 ttyS1,crw-1 root root 4,66 Jan 1 00:00 ttyS2,crw-1 root root 4,67 Jan 1 00:00

8、 ttyS3,crw-1 root root 4,68 Jan 1 00:00 ttyS4,drwxr-xr-x 1 root root 0 Jan 1 00:00 misc,c:,字符设备,b:,块设备,主设备号,次设备号,13,机制与策略,机制,(mechanism),设备驱动程序所具备的能力,例如:串行设备驱动程序具有设置波特率的能力。,策略,(policy),这些能力如何被使用,例如:根据需要将串口波特率设置成,9.6kbps,。,设备驱动程序应该是“策略无关”的,即,policy free,。,14,设备驱动程序源代码的基本结构,/*,*,驱动程序简单,说明:,*驱动程序的作用:,这

9、是一个字符设备驱动程序的基本框架结构,*被驱动设备的简单描述:,将使用,AT91RM9200,的,PB,端口为例进行说明,*一些特殊的考虑等:,如,PB21,作为可以产生中断的输入引脚(本例未实现),*版本,创建日期,作者等:,1.0,版,,2006,年,1,月,6,日,*/,#,ifndef,_KERNEL_,#define _KERNEL_,#,endif,#,ifndef,MODULE,#define MODULE,#,endif,#include,#include,.,#include,表明这个模块将用于内核,也可以在编译时通过,D,选项指定,如,gcc,D_KERNEL_,。参见,M

10、akefile,。,内核头文件,需要根据具体驱动程序和用到的内核模块确定。,表明这个驱动程序将以模块的方式编译和使用,也可以在编译时通过,D,选项指定,如,gcc,DMODULE,。参见,Makefile,。,15,/*,*,驱动程序中使用的各种函数的原型声明。标准的作法是将函数原型声明,*放在一个头文件中,然后在该文件开始处使用,#include,引用,并在该,*文件中定义。,*,*这里我们将函数的声明和定义放在一起。所以下面的代码既是函数的声明,,*也是函数的定义。,*,/,static,ssize_t,spioc_read(struct,file*,filp,char*buff,size

11、t,cnt,loof_t,*off),/*,这里是,read,函数的代码*,/,return ret;,static,ssize_t,spioc_write(struct,file*,filp,char*buff,size_t,cnt,loff_t,*off),/*,这里是,write,函数的代码*,/,return ret;,16,static int spioc_ioctl(struct inode*inode,struct file*filp,unsigned int cmd,unsigned long arg),/*,这里是,ioctl,函数的代码,它的一般格式为一个,switch,

12、分支语句,*,switch(cmd),*case CMD1:,*.,*break;,*.,*case CMDn:,*.,*break,*default:,*.,*break;,*,*,/,return ret;,ioctl(),函数用于控制驱动程序本身的一些特性和参数,如设定驱动,程序使用的缓冲区的大小,设定串行通讯的速率等。,17,static int spioc_open(struct inode*inode,struct file*filp),/*,这里是,open,函数的代码*,/,return ret;,static int spioc_close(struct inode*inod

13、e,struct file*filp),/*,这里是,close,函数的代码*,/,return ret;,上述,5,个函数,既,read(),write(),ioctl(),open(),close(),,是一个字符,设备驱动程序最基本的需要由驱动程序的作者完成的函数。,这,5,个函数将对应于相应的,5,个系统调用:,read(),-,spioc_read(),write(),-,spioc_write(),ioctl(),-,spioc_ioctl(),open(),-,spioc_open(),close(),-,spioc_close(),系统调用,驱动程序函数,18,static,s

14、truct,file_operations,spioc_fops,=,read:,spioc_read,write:,spioc_write,ioctl,:,spioc_ioctl,open:,spioc_open,release:,spioc_close,;,file_operations,是一个结构体类型,定义在,include/,linux/fs.h,中。,上述代码定义了一个,file_operations,类型的结构体,spioc_fops,,并将,其中的一些成员赋了初值。由于,spioc_fops,是一个静态变量,所以其他成员,的初值是“零”。,结构体,spioc_fops,将作为一

15、个参数在注册一个设备驱动程序时传递给内核。,内核使用,设备链表,维护各种注册的设备。不同类型的设备使用不同的链表。,19,struct file_operations,struct module*owner;,loff_t(*llseek)(struct file*,loff_t,int);,ssize_t(*read)(struct file*,char*,size_t,loff_t*);,ssize_t(*write)(struct file*,const char*,size_t,loff_t*);,int(*readdir)(struct file*,void*,filldir_t);

16、unsigned int(*poll)(struct file*,struct poll_table_struct*);,int(*ioctl)(struct inode*,struct file*,unsigned int,unsigned long);,int(*mmap)(struct file*,struct vm_area_struct*);,int(*open)(struct inode*,struct file*);,int(*flush)(struct file*);,int(*release)(struct inode*,struct file*);,int(*fsync)

17、struct file*,struct dentry*,int datasync);,int(*fasync)(int,struct file*,int);,int(*lock)(struct file*,int,struct file_lock*);,ssize_t(*readv)(struct file*,const struct iovec*,unsigned long,loff_t*);,ssize_t(*writev)(struct file*,const struct iovec*,unsigned long,loff_t*);,ssize_t(*sendpage)(struct

18、 file*,struct page*,int,size_t,loff_t*,int);,unsigned long(*get_unmapped_area)(struct file*,unsigned long,unsigned long,unsigned long,unsigned long);,;,struct file_operations,include/linux/fs.h,20,static int _init spioc_init(void),/*,设备初始化代码等*,/,if(register_chrdev(SPIOC_MAJOR,“spioc”,&spioc_fops),pr

19、intk(KERN_ERR“spioc.c:unable to register”,“the device with major%d.n”,SPIOC_MAJOR);,return EIO;,/*,其他初始化代码*,/,return ret;,static void _exit spioc_exit(void),/*,设备撤消代码*,/,if(unregister_chrdev(SPIOC_MAJOR,“spioc”),printk(KERN_ERR“spioc.c:unable to remove the”,“device with major%d.n”,SPIOC_MAJOR);,retu

20、rn;,/*,其它设备撤消代码*,/,return;,21,module_init(spioc_init);,module_exit(spioc_exit);,这两个函数,,module_init(),和,module_exit(),,用于告诉内核,当一个驱动程序加载和退出(或撤消)时,需要执行的操作。不同驱动程序在加载和退出时,除了基本的向内核注册设备驱动程序外,还有各自的针对具体设备的操作。,22,要点总结,:,宏:,_KERNEL_,MODULE,_VERSION_,_KERNEL_,:表明这将是用于内核的代码,否则很多内核过程将无法使用。,MODULE,:如果是以模块方式编译,需要定义

21、这个宏;如果是静态连接则不用。,_VERSION_,:定义这个宏则需要驱动程序的内核版本要和内核版本一致。,module_init()/module_exit():spioc_init()/spioc_exit(),每个驱动程序都要有这两个函数,它们分别用于设备驱动程序的加载和撤消。,static struct file_operations spioc_fops:,每个驱动程序都要有这样的结构体,可能不止一个。用,register_chrdev,(),注册驱动程序时这个结构体的起始地址被传送到内核的设备表中。,SPIOC_MAJOR:,每个设备驱动程序有一个主设备号,(major numbe

22、r),。不同设备驱动程序不能,使用相同的主设备号。一个设备驱动程序可以管理不同的,(,但一般是同一类的,),设备,通过次设备号,(minor number),区分。,spioc_ open()/close(),,,read()/write(),ioctl():,根据具体驱动程序定义和使用。一般,open()/close(),总是需要的,而且,open(),和,close(),一定要成对出现。,23,设备驱动程序的使用,驱动程序模块的动态链接和静态链接,创建设备文件,使用设备,24,设备驱动程序被静态编译到内核中的情况,:,module_init(),指示内核在启动过程中运行设备的初始化函数,如

23、spioc_init(),函数。驱动程序的加载随内核的启动一起完成。,静态编译的内核模块不能被动态卸载,只有到系统关闭时由内核执行相应的卸载函数,如,spioc_exit(),。,嵌入式操作系统一般使用静态内核模块以减少系统的尺寸和复杂性。,驱动程序模块的加载,设备驱动程序被动态加载到内核中的情况,:,首先,驱动程序需要被编译成目标文件,如,spioc.o,。,在操作系统运行之后,使用,insmod,命令将驱动程序模块动态加载到内核中,$insmod spioc.o,使用,insmod,命令动态加载的内核模块可以使用,rmmod,命令动态地从内核中卸载,$rmmod spioc,使用内核的动

24、态模块加载,/,卸载功能需要内核支持,kmod,功能。,25,module_init(),module_exit(),26,创建设备文件,Linux,操作系统将字符设备和块设备作为一种特殊的文件对待,这,就是设备文件。,使用,mknod,命令建立设备文件。,$mknod c 21 0/dev/spioc,c,:字符设备,b,:块设备,主设备号,次设备号,设备文件,crw-1 root root 21,0 Jan 1 00:15 spioc,/dev,27,使用设备驱动程序,应用程序,系统调用,设备驱动程序,设备(寄存器),使用一个设备一般需要执行如下一些操作:,打开设备文件。,对设备进行必要的

25、设置,如设置串口速率。,对设备进行读、写等操作,如通过串口收发数据。,结束对设备的使用之前,如果改变了设备的某些设置,则将其恢复到缺省状态,保证设备停用后没有任何不好的副作用。,关闭设备。,一个设备如何被使用属于“策略”,应该由应用程序决定,而不是设备驱动程序。设备驱动程序应该只实现“机制”。,28,int main(int argc,char*argv),.,pd=open(“/dev/spioc”,O_RDWT);,.,应用程序,crw-1 root root 21,0 Jan 1 00:15 spioc,/dev,open(const char*,int),系统调用,static str

26、uct,file_operations spioc_fops=,read:spioc_read,write:spioc_write,ioctl:spioc_ioctl,open:spioc_open,release:spioc_close,;,设备驱动程序,static int spioc_open(struct inode*inode,struct file*filp),/*,这里是,open,函数的代码*,/,return ret;,设备驱动程序,设备和驱动程序的使用,29,简单实例,demo,字符设备驱动程序,使用动态内核模块加载,实现初始化,(,加载,),和退出,(,卸载,),功能,实现设备读写等功能,实现,ioctl,功能,30,编译设备驱动程序,使用静态内核模块,在内核源代码目录的相应子目录下建立设备驱动程序目录。,在设备驱动程序目录下建立,Makefile,文件。,修改上一级目录的,Makefile,文件。,使用动态内核模块,内核模块需要使用内核的头文件,因此需要安装内核源代码。,编写,Makefile,。,31,参考资料,Linux,设备驱动程序,第二版,第一、二、三、四章,32,

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

关于我们      便捷服务       自信AI       AI导航        抽奖活动

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

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

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

关注我们 :微信公众号    抖音    微博    LOFTER 

客服