嵌入式课设报告_2.docx

上传人:lao****ou 文档编号:888159 上传时间:2024-07-15 格式:DOCX 页数:21 大小:123.80KB
下载 相关 举报
嵌入式课设报告_2.docx_第1页
第1页 / 共21页
嵌入式课设报告_2.docx_第2页
第2页 / 共21页
嵌入式课设报告_2.docx_第3页
第3页 / 共21页
嵌入式课设报告_2.docx_第4页
第4页 / 共21页
嵌入式课设报告_2.docx_第5页
第5页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《嵌入式课设报告_2.docx》由会员分享,可在线阅读,更多相关《嵌入式课设报告_2.docx(21页珍藏版)》请在第一文库网上搜索。

1、课程设计报告课程名称嵌入式信息系统题目嵌入式1inUX设备驱动程序设计指导教师周金和王勇设计起止日期2015-1-20至2015-1-28系别信息与通信工程系专业电子信息工程学生姓名班级/学号成绩目录一、驱动基本概念3二、重要的数据结构4三、驱动注册访问过程6四、编译运行DEMO驱动7六、DEMO驱动文件和应用文件的测试19七、1ED驱动与测试20八、课设总结2121参考文献:一、驱动基本概念1inUX的设备驱动程序是硬件设备与应用程序之间的一个中间软件层,它使得某个特定硬件能够响应一个定义良好的内部编程接口,同时完全隐蔽了设备的工作细节,用户通过一组与具体设备无关的标准化的调用来完成相应的操

2、作。驱动程序的任务就是把这些标准化的系统调用映射到具体设备对于实际硬件的特定操作上,驱动程序是内核的一部分,可以使用中断、DMA等操作,驱动程序在用户态和内核态之间传递数据。1inUX设备驱动程序可以分为三大类:字符设备、块设备和网络接口设备。字符设备所有能够象字节流一样访问的设备都通过字符设备来实现,它们被映射为文件系统中的节点,通常在dev目录下面,一般要包含OPenreadWriteC1oSe等系统调用的实现块设备通常是指诸如磁盘、内存、HaSh等可以容纳文件系统的存储设备。块设备也是通过文件系统来访问,与字符设备的区别是:内核管理数据的方式不同。它允许象字符设备一样以字节流的方式来访问

3、,也可一次传递任意多的字节。网络接口设备通常它指的是硬件设备,但有时也可能是一个软件设备(如回环接口Ioopback),它们由内核中网络子系统驱动,负责发送和接收数据包。它们的数据传送往往不是面向流的,因此很难将它们映射到一个文件系统的节点上。设备驱动应用主设备号和次设备号来区分不同的设备。主设备号和次设备号能够唯一地标识一个设备,主设备号范围0-256,设备号相同的设备使用相同的驱动程序,次设备号用于区分具体设备的实例,可以动态获取主设备号。1inUX下对设备号的分配请参考Documentation/devices.txto1inUX使用设备文件来统一对设备的访问接口,将设备文件放在dev目

4、录下。设备的命名一般为设备文件名+数字或者字母表示的子类,例如devhda1,devhda2等。1inux2.4引入了设备文件系统(devfs)的概念,所有的设备文件作为一个可以挂装的文件系统,这样就可以被文件系统统一管理,从而设备文件就可以挂装到任何需要的地方。一般将主设备建立一个目录,再将具体的子设备文件建立在此目录下。例如,ZdevZmtdb1ockOo1inUX2.6以后应用UdeV文件系统来动态管理设备文件,UdeV只为那些连接到1inUX操作系统的设备产生设备文件。并且UdeV能通过定义一个UdeV规则(ru1e)来产生匹配设备属性的设备文件,这些设备属性可以是内核设备名称、总线路

5、径、厂商名称、型号、序列号或者磁盘大小等等。动态自动管理设备信息:当有设备添加内核时,UdeV的守护进程侦听到来自内核的UeVent的事件,用来添加或者删除dev下的设备文件,所以UdeV可以只为己经连接的设备产生设备文件,而不会像2.4内核一样在dev下产生大量设备文件。另外可以使用这个功能,当有设备加入时运行外部的程序,比如鼠标加入时自动禁用触摸板之类。使用自定义命名和管理设备:使用UdeV规则文件,Udev在dev里为所有的设备定义了内核设备名称,比如dev/sda、/dev/hda、devfd等等。由于UdeV是在用户空间(USerSPaCe)运行,1inux用户可以接下来对这些信息进

6、行操作,比如可以通过自定义的规则文件,生成人性的设备标识,比如devmydiskdevnameusb等,还能对设置进行参数成员用户组权限之类的修改。二、重要的数据结构图1、驱动程序的重要数据结构:StnJCtfiIe和StrUCtfi1e.operationsstructfi1estructIisrheadf1ist;structdentry*f_dentry;structvfsmount*f_vfsmnt;structfi1e_operations*atomic_tf_count;unsignedintf_f1ags;mode_tf_mode;Ioff_tunsigned1ongf_pos;

7、f_readazf_ramax,f_raend,f_ra1en,f_rav;in;structfownstructfowner;unsignedintf_uid,f_gid;intf_error;unsigned1ongf_version;/neededforttydriver,andmaybeothersvoid*private_data;*prea11ocatedhe1perkiobuftospeedupO_DIRECTstructkiobuf*f_iobuf;1ongf_iobuf_1ock;);structfi1e数据结构定义位于inc1ude/fs.h。其中StrUCtf1Ie结构与

8、驱动相关的成员:mode_t1mode标识文件的读写权限;1off_tf_pos当前读写位置;unsignedint_f_f1ag文件标志,主要进行阻塞/非阻塞型操作时检查;structfi1e_operation*f_op文件操作的结构指针;void*private_data驱动短序一般将它指向已经分配的数据;structdentry*f_dentry文件对应的目录项结构;设备驱动程序接口(structfi1e_operations),标记化方法:staticstructfi1e_operationsdemo-fbps=owner:TH1S.MODU1E,write:demo_write,r

9、ead:demo_read,ioct1:demo_ioct1,open:demo_open,re1ease:demo_re1ease,);通常所说的设备驱动程序接口是指StrUCtfne.operations,它的定义位于inc1ude1inuxfs.h。在嵌入式系统的开发中,通常只要实现如下几个接口函数就能完成系统所需要的功能: init加载驱动程序时,内核自动调用 read从设备中读取数据 write向字符设备中写数据 ioct1控制设备,实现除读写操作以外的其他控制命令 open打开设备并进行初始化 re1ease关闭设备并释放资源 exit卸载驱动程序时,内核自动调用open提供给驱动

10、程序初始化设备的能力,为后续的操作做准备此外一般会递增使用计数,防止文件关闭前模块被卸载通常情况下,OPen完成如下工作:递增使用计数检查特定设备错误如果设备是首次打开,则对其进行初始化识别次设备号,如有必要,则修改f_。P指针分配并填写fi1p-private_data中的数据re1ease与OPen正好相反释放由OPen分配的fi1p-private_data中的数据在最后一次关闭操作时关闭设番使用计数减一read和Writeread将数据从内核拷贝到应用程序空间,write则将数据从应用程序空间拷贝到内核。由于用户空间和内核空间的内存映射方式不同,所以在内核和用户空间传输数据的时候需要使

11、用如下的函数:unsigned1ongcopy_to_user(void*to,constvoid*from,unsigned1ongcount);unsigned1ongcopy_from_user(void*to,constvoid*from,unsigned1ongcount);在阻塞型IO中,read和Write调用可能会出现阻塞。read调用当前无数据可读,而又没有数据马上可读,这时会睡眠并且等待,write调用也会出现这样的情况。等待队列机制一wait_queue_head_t;(定义在V1inUXwait.h中)。如果声明了等待队列并完最初始冠,进程就可以睡眠,可以调用s1eep

12、n的不同变体来完成睡眠(函数声明位于1inuxSChed.h中)。大多数情况下应使用可中断的函数,如inteuptibIjS1eep_on。睡眠进程被唤醒并不一定代表有数据,也有可能是被其他的信号唤醒,所以醒来后需要测试Condition0三、驱动注册访问过程驱动程序注册过程(动态分配主设备号):_(1)insmodmodu1e_name;加载驱动程序,运行init函数(register_chrdev(dev_Major,ttmodu1e_name,*fs);(2)查看procdevices;(3) mknoddevmodu1e-namec/b主设备号次设备号;(4) rmmodmodu1e_

13、name;卸载驱动,运行exit函数(UnregiSter_chrdev(dev_Major,ttmodu1e_name,*fs)用户程序调用过程:(1) Open(t7devmodu1ename,mode);0_RDWR(2) Ioct1()Write()(4) Read()(5) C1ose()中断是现代微处理器的一个重要功能,1inux驱动程序中的中断处理函数:externintrequest_irq(unsignedintirq,void(*hand1er)(int,void*,structpt_regs*),unsigned1ongf1ag,constchar*dev_name,vo

14、id*devjd);请求为中断号irq分配中断处理函数externvoidfree_irq(unsignedint,VOid*);释放中断(注意:不能向用户空间发送或者接收数据;不能执行有睡眠操作的函数;不能调用调度函数;谨慎使用可重入的全局变量;自旋锁的使用)字符设备驱动程序模块通过函数intregister_chrdev(unsignedintmajor,constchar*name,structfi1e-operations*fops)完成向内核的注册,其中major是主设备号,name是设备名,fops是针对该设备的驱动程序的接口。在系统中为驱动程序模块建立一个设备节点:HOST#mk

15、noddevdemoC2240(其中devdemo标识设备名为demo,c”说明是字符设备,224是指定的主设备号,0是次设备号,因为开发板中使用UdeV管理设备文件,此步可以省略)四、编译运行DEMo驱动首先,我们从ftp:/59.64.74.111中的2014嵌入式课设文件夹中下载demo的驱动文件:demo.c和demo.h然后,在UbUntU主文件下建立driver文件夹,进入driver文件夹,后再建立一个drv文件夹,将刚才下载的demo.c和demo.h放入其中,然后,新建一个空白文档,重命名为MakefiIe。打开MakefiIe文档后,根据课设指导书,写入Makefi1e的内容。接着,找到自己UbUntU下的kerne1文件夹路径,复制路径,替换在MakefiIe文件中的KERNE1DIR等号后的路径目录,再继续在其中将CROSS_COMPI1E=arm-none-1inux-gnueabi-改为CROSS.COMP

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 应用文档 > 工作总结

copyright@ 2008-2022 001doc.com网站版权所有   

经营许可证编号:宁ICP备2022001085号

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



客服