版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、 实验目的:1、 学习如何编写驱动程序2、 学习对驱动程序的加载二、 实验原理:1、内核和驱动模块操作系统是通过各种驱动程序来驾驭硬件设备,它为用户屏蔽了各种各样的设备,驱动硬件是操作系统最基本的功能,并且提供统一的操作方式。正如我们查看屏幕上的文档时,不用去管到底使用nVIDIA芯片,还是ATI芯片的显示卡,只需知道输入命令后,需要的文字就显示在屏幕上。硬件驱动程序是操作系统最基本的组成部分,在Linux内核源程序中也占有较高的比例。Linux内核中采用可加载的模块化设计(LKMs,LoadableKernelModules),一般情况下编译的Linux内核是支持可插入式模块的,也就是将最基本的核心代码编译在内核中,其它的代码可以选择是在内核中,或者编译为内核的模块文件。如果需要某种功能,比如需要访问一个NTFS分区,就加载相应的NTFS模块。这种设计可以使内核文件不至于太大,但是又可以支持很多的功能,必要时动态地加载。这是一种跟微内核设计不太一样,但却是切实可行的内核设计方案。我们常见的驱动程序就是作为内核模块动态加载的,比如声卡驱动和网卡驱动等,而Linux最基础的驱动,如CPU、PCI总线、TCP/IP协议、APM(高级电源管理)、VFS等驱动程序则编译在内核文件中。有时也把内核模块就叫做驱动程序,只不过驱动的内容不一定是硬件罢了,比如ext3文件系统的驱动。理解这一点很重要。因此,加载驱动时就是加载内核模块。下面来看一下有关模块的命令,在加载驱动程序要用到它们:lsmod、modprob、insmod、rmmod、modinfo。如果后面为unused,则表示该模块当前没在使用。如果后面有autoclean,则该模块可以被rmmod-a命令自动清洗。rmmod-a命令会将目前有autoclean的模块卸载,如果这时候某个模块未被使用,则将该模块标记为autoclean。如果在行尾的[]括号内有模块名称,则括号内的模块就依赖于该模块。系统的模块文件保存在/lib/modules/2.4.XXX/kerne目录中,根据分类分别在fs、net等子目录中,他们的互相依存关系则保存在/lib/modules/2.4.XXX/modules.dep文件中。2、设备文件当我们加载了设备驱动模块后,应该怎样访问这些设备呢?Linux是一种类Unix系统,Unix的一个基本特点是“一切皆为文件”,它抽象了设备的处理,将所有的硬件设备都像普通文件一样看待,也就是说硬件可以跟普通文件一样来打开、关闭和读写。系统中的设备都用一个设备特殊文件代表,叫做设备文件,设备文件又分为Block(块)型设备文件、Character(字符)型设备文件和Socket(网络插件)型设备文件。Block设备文件常常指定哪些需要以块(如512字节)的方式写入的设备,比如IDE硬盘、SCSI硬盘、光驱等。而Character型设备文件常指定直接读写,没有缓冲区的设备,比如并口、虚拟控制台等。Socket(网络插件)型设备文件指定的是网络设备访问的BSDsocket接口。当将/dev/cdrom加载到/mnt/cdrom中时,只要访问/mnt/cdrom系统就会自动引入到/dev/cdrom对应的驱动程序中,访问实际的数据。有关设备文件的编号可以看内核文档/usr/src/linux-2.*/Documentation/devices.txt文件(在Kernel的源文件解包后的Documentation目录中),其中详细叙述了各种设备文件编号的意义三、实验内容:设备驱动程序在内核空间运行,而应用程序则在用户空间运行,Linux操作系统通过系统调用和硬件中断完成从用户空间到内核空间的控制转移。1、编写测试文件为方便起见,在windows下改写测试文件,使之能进行简单的四则运算,关键代码:voidhandle(){charbuf=0;{FD_ZERO(&readfds);FD_SET(fd_key,&readfds);select(fd_max+1,&readfds,NULL,NULL,NULL);if(FD_ISSET(fd_key,&readfds)){read(fd_key,&buf,sizeof(char));printf("Scancodeis0x%08x\n〃,buf);ass[index]=buf;if(index==2){as=ass[0];bs=ass[2];switch(ass[1]){case10:printf("Scancode is 0x%08x\n〃,as+bs);break;case11:printf("Scancode is 0x%08x\n",as-bs);break;case12:printf("Scancode is 0x%08x\n",as*bs);break;case13:printf("Scancode is 0x%08x\n",as/bs);break;}}index++;}}}将驱动代码以及改写的测试文件,都拷贝到Windows与Linux的共享目录,从Linux终端进入到共享目录,执行make-fmakefile编译命令,将驱动程序和测试文件都编译成执行文件,只把编译好的执行文件上传到目标板上。2、 利用串口通信文件传输设备的驱动程序通过串口预实验板进行连接,通过串口我们可以安全稳定的将驱动程序发送到实验板上进行运行从而观察实验结果。我们在pc机上是通过超级终端与实验板进行通信的,超级终端是一种比较稳定的通信方式,使用比较方便快捷,在这里,我们使用超级终端将驱动程序通过编译生成二进制代码文件通过串口发送到实验板。在与目标板连接后,可以通过串口下传一些文件倒目标板上。具体操作如下:a) 在与目标板正确连接后,进入【root@51board~】,按下CTRL+A键后,再按Z键,系统调出minicom的命令选项菜单;使用热键S激活文件传输命令。b) 系统弹出串口通信协议选项,利用方向键选中zmodem传输协议,按回车,进入文件选择菜单。C)文件选择菜单弹出后,利用空格选中需要上传的文件,一次可选择多个文件,选择好文件后按回车键开始上传文件。3、 驱动模块的加载将编译好的驱动模块下载到目标板上,进入目标系统后,利用mknod命令在/dev目录下建立该设备的节点,然后利用insmod命令装在驱动模块,最后在目标平台中运行驱动模块的测试程序driverTest,检查驱动模块的正确性。【root@51Board~】$mknod/dev/xsb_edr_8segc613【root@51Board~】$insmodXSB_EDR_8SEG.o四、 实验总结:本次嵌入式实验是进行基于Linux下ARM板键盘驱动的加载及应用程序的开发,要完成本次实验必须将以前学到的许多知识联系起来,会用到C语言、Linux下的驱动加载等等。在整个实验的操作和编写过程中要进行驱动程序的重新编写,向ARM板上加载程序,这中间遇到了很多问题,例如,在编写相关按键方面的程序的时候,要不断地进行尝试,编写加减乘除的时候也遇到了不少相关的难题,也需要一次一次的试。通过这次实验,我还是学到了不少的东西,例如对于一个Linux下的一个驱动程序的编写、
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 无人机操作入门教程
- 神经外科患者的呼吸道管理与护理
- 护理计划制定与实施
- 统编版五年级下册语文《祖父的园子》教案2课时(含反思)
- 2026年健康活力区与护理区联动销售策略方案
- 2026年基于多维动态模型的数据资产定价机制深度解析
- 2026年跨境电商海外仓9810模式出口退税预退税核算操作手册
- 电力生产问题的分配方案
- 安宁护理:生命教育在疗护中的应用
- 2026年新就业形态劳动者职业伤害防护与权益维护
- 加强锻炼预防疾病
- 9架空输电线路投运前监督检查汇报材料2
- 研究生高级管理会计理论与实务全册教学课件
- 屋面拆除施工方案
- 肿瘤的治疗与预防课件
- 2024年英语B级考试真题及答案
- 生物合成青蒿酸课件
- 海洋生态学课件二
- 北交所知识测评题100道含答案
- 第二章第一次世界大战
- SB/T 10130-2008绞肉机技术条件
评论
0/150
提交评论