嵌入式Linux设备驱动实验报告_第1页
嵌入式Linux设备驱动实验报告_第2页
嵌入式Linux设备驱动实验报告_第3页
嵌入式Linux设备驱动实验报告_第4页
嵌入式Linux设备驱动实验报告_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、嵌入式系统实验报告SouthChinaUniversityofTLinux设备驱动实验学院专业学生姓名实验台号指导教师提交日期一、实验目的1.了解Linux驱动程序的结构;2.掌握Linux驱动程序常用结构体和操作函数的使用方法;3.初步掌握Linux驱动程序的编写方法及过程;4.掌握Linux驱动程序的加载方法。二、实验内容1.实现helloworld驱动,观察驱动的加载和释放过程;2.根据参考代码,分析数码显示驱动的结构和原理,给出设备程序的主要组成部分框图;3.利用数码显示驱动模块,编写测试程序实现按键对数码显示的控制,包括点亮和关闭,显示不同数字等。三、实验原理3.1驱动程序介绍驱动程

2、序负责将应用程序如读、写等操作正确无误的传递给相关的硬件,并使硬件能够做出正确反应的代码。驱动程序像一个黑盒子,它隐藏了硬件的工作细节,应用程序只需要通过一组标准化的接口实现对硬件的操作。32LinuxLinux设备驱动程序在Linux的内核源代码中占有很大的比例,源代码的长度日益增加,主要是驱动程序的增加。虽然Linux内核的不断升级,但驱动程序的结构还是相对稳定。Linux系统的设备分为字符设备(chardevice),块设备(blockdevice)和网络设备(networkdevice)ODD字符设备是指在存取时没有缓存的设备,而块设备的读写都有缓存来支持,并且块设备必须能够随机存取(

3、randomaccess)。典型的字符设备包括鼠标,键盘,串行口等。块设备主要包括硬盘软盘设备,CD-ROM等。网络设备在Linux里做专门的处理。Linux的网络系统主要是基于BSDunix的socket机制。在系统和驱动程序之间定义有专门的数据结构(sk_buff)进行数据传递。系统有支持对发送数据和接收数据的缓存,提供流量控制机制,提供对多协议的支持。33驱动程序的结构驱动程序的结构如图3.1所示,应用程序经过系统调用,进入核心层,内核要控制硬件需要通过驱动程序实现,驱动程序相当于内核与硬件之间的“系统调用”3.3.1内核模块内核模块是Linux内核的重要组成要素,内核模块能在Linux

4、系统启动之后能够动态进行装载和卸载,因此不需对内核进行重新编译或重启系统就可将内核的一部分替换掉,Linux内核的所有设备驱动,文件系统,网络协议等可做成模块的形式来提供。在所有的模块中需记录编译的内核版本信息,并与当前执行的内核版本一致。即,模块具有版本依赖性,如果不一样就会出错,当然可以在模块程序中的includevlinux/module.h之前通过宏定义#define_NO_VERSION_表明不定义模块的版本信息。内核模块程序与一般应用程序之间主要不同之处是,模块程序没有main()函数,模块程序在装载时调用init_module(void)函数添加到内核中,在卸载时调用voidcl

5、eanup_module()函数从内核中卸载。另外一个应用程序从头到尾只执行一个任务,但一个模块可以把响应未来请求的事务登记到内核中,然后等待系统调用,内核模块程序结构如图3.2所示。insmodrmmod图3.2内核模块程序结构3.4主、从设备号应用程序通过设备文件系统(devfs)的名字(或节点)访问硬件设备,所有的设备节点在/dev目录下。利用mknod命令生成设备文件系统的节点,但只有超级用户才能生成设备文。Mknod命令必须要有设备名和设备类型,主设备号(MajorNumber),次设备号(MinorNumber)等3个参数。主设备号用于内核区分设备驱动,次设备号用于设备驱动区分设备

6、。一个设备驱动可能控制多个设备。新的设备驱动要有新的主设备号。在内核源代码的Documentation/devices.txt中定义了所有设备的主设备号。在创建设备的时候不要与常用的设备好冲突。3.5驱动程序基本框架如果采用模块方式编写设备驱动程序时,通常至少要实现设备初始化模块、设备打开模块、数据读写与控制模块、中断处理模块(有的驱动程序没有)、设备释放模块和、设备卸载模块等几个部分。3.6重要结构体打开的设备在内核内部由file结构标识,内核使用file_operation结构访问驱动程序函数。file_operation结构是一个定义在vlinux/fs.h中的函数指针数组。每个文件都与

7、它自己的函数集相关联。这个结构中的每一个字段都必须指向驱动程序中实现特定操作的函数。结构如下,详细内容可查阅相关文档。structfile_operationsstructmodule*owner;loff_t(*llseek)(structfile*,loff_t,int);ssize_t(*read)(structfile*,char*,size_t,loff_t*);ssize_t(*write)(structfile*,constchar*,size_t,loff_t*);int(*readdir)(structfile*,void*,filldir_t);unsignedint(*p

8、oll)(structfile*,structpoll_table_struct*);int(*ioctl)(structinode*,structfile*,unsignedint,unsignedlong);int(*mmap)(structfile*,structvm_area_struct*);int(*open)(structinode*,structfile*);int(*flush)(structfile*);int(*release)(structinode*,structfile*);int(*fsync)(structfile*,structdentry*,intdatas

9、ync);int(*fasync)(int,structfile*,int);int(*lock)(structfile*,int,structfile_lock*);ssize_t(*readv)(structfile*,conststructiovec*,unsignedlong,loff_t*);ssize_t(*writev)(structfile*,conststructiovec*,unsignedlong,loff_t*);ssize_t(*sendpage)(structfile*,structpage*,int,size_t,loff_t*,int);unsignedlong

10、(*get_unmapped_area)(structfile*,unsignedlong,unsignedlong,unsignedlong,unsignedlong);四、实验步骤1启动RedHat虚拟机,连接主机和实验箱后进行网络设置2交叉编译hello.c,将生成的hello.o文件复制到linux系统与PC的共享目录下3在超级终端中将文件传送到实验箱4加载hello驱动程序:root51Board$insmodhello.o,观察结果5释放hello驱动程序:root51Board$rmmodhello,观察结果6因源码包中已包含makefile,故利用make命令交叉编译XSB_E

11、DR_8SEG.、cXSB_EDR_8SEG_test、(XSB_EDR_KEYPAD、cXSB_EDR_KEYPAD_test.C改)等4个文件,将生成的文件4个文件通过超级终端传送到实验箱7D提升XSB_EDR_8SEG_test,XSB_EDR_KEYPAD_test两个应用程序的权限8D查看/dev目录下是否存在节点xsb_edr_8seg,xsb_edr_keypad,如果不存在,手动DODO:mknodxsb_edr_8segc611、mknodxsb_edr_keypadc6219加载驱动模块XSB_EDR_8SEG.oinsmodXSB_EDR_8SEG.o动态加载lsmod查

12、看是否加载成功10D运行XSB_EDR_8SEG_test程序,观察结果11加载驱动模块XSB_EDR_KEYPAD.o12D运行XSB_EDR_KEYPAD_test程序,利用按键测试程序,观察结果是否正确五、程序说明再利用驱动对按键和数码管进主程序开启驱动后配置按键事件,然后handleXSB_EDR_KEYPAD_test序首先开启按键和数码管驱动,行操作,读取按键值并在数码管上显示出对应数字。进入数码管的循环显示,不停显示按键缓存变量的数值。当有按键事件发生时进入按键处理程序,利用命令获取当前按下的按键值。六、关键源代码注释#include#include#include#includ

13、e#include#include#include#includetypedefunsignedcharu8;#defineNUM_00 x3f#defineNUM_10 x06#defineNUM_20 x5b#defineNUM_30 x30#defineNUM_40 x19#defineNUM_50 x12#defineNUM_60 x2#defineNUM_70 x78#defineNUM_80 x0#defineNUM_90 x10intfd_key;按键驱动主设备号fd_setreadfds;voidhandle();charbuf=O;按键缓存charnumber=NUM_0,N

14、UM_1,NUM_2,NUM_3,NUM_4,NUM_5,NUM_6,NUM_7,NUM_&NUM_9;数码管段码表voidappear_same(intfd,intbuf)/数码管显示程序,显示同一个数字chari,j;for(i=1;i=6;i+)ioctl(fd,i,number+buf);/执行数码管命令,在i数码管显示数字bufsleep(1);intmain(void)intdac_value;longoflags;intfd;数码管主设备号fd_key=open(/dev/xsb_edr_kbd,O_RDWR);打开按键驱动,获取主设备号signal(SIGIO,&handle);fcntl(fd_key,F_SETOWN,getpid();oflags=fcntl(fd_key,F_GETFL);fcntl(fd_key,F_SETFL,oflags|FASYNC);fd=open(/dev/xsb_edr_8seg,O_RDWR);/打开数码管驱动,获取主设备号if(fd0)printf(#8segtestdeviceopenfail#%dn,fd);打开不正常,串口打印提示return(-1);while(1)appear_same(fd,buf);循环显示读取的按键数据close(fd);/关闭数码管驱动printf(C

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论