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

加入VIP,免费下载
 

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

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

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实验七 嵌入式系统驱动实验资料.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

实验七 嵌入式系统驱动实验资料.docx

1、实验七 嵌入式系统驱动实验资料实验七 ARM9嵌入式系统硬件驱动基础开发实验【实验目的】1.掌握嵌入式linux内核的配置编译及移植。2.掌握ARM linux驱动程序的开发流程。【实验内容】1.常用linux命令的使用2.嵌入式linux驱动程序开发步骤3.linux内核配置、编译以及移植【实验设备】1.ARM9开发板2.串口线、USB线3.PC机(软件:VMware Workstation6.5)【实验原理】嵌入式 Linux是以Linux为基础的嵌入式作业系统,它被广泛应用在移动电话、个人数字助理(PDA)、媒体播放器、消费性电子产品以及航空航天等领域中。Linux是开放源代码的操作系统

2、,同时具有体积小、执行速度快、较好的可裁剪性与移植性等特点。针对ARM CPU开发的具有MMU(Memory Management Unit)功能的嵌入式Linux操作系统是ARM平台上操作系统的最佳选择。通用的基于ARM系统的Linux开发步骤如下:1)开发目标硬件系统:如选择微处理器,Flash及其他外设等;2)建立交叉编译工具:一般的GCC工具都是针对X86体系的,为了能够生成目标板可执行的代码必须建立交叉编译工具;3)开发Bootloader:建立启动系统的主引导程序;4)移植Linux内核:如基于ARM的Linux2.4内核移植;5)开发一个根文件系统:如yaffs文件系统的制作;6

3、)开发相关硬件的驱动程序:如LCD、Keypad等;7)开发上层的应用程序:如QT GUI开发。 驱动程序的目的一般式驱动硬件正常工作,所以通常所说的驱动程序都是针对特定的硬件来编写的。驱动程序既可以工作在有操作系统的环境下,也可以工作在无操作系统的环境中。通常在做一些简单的硬件控制时,由于功能比较单一,不需要操作系统来管理,所以针对这种情况下的驱动程序相对来说也比较简单,但是作为一个嵌入式系统,他要实现的任务也相对比较多,比较复杂,所以需要有操作系统来对他进行管理。设备驱动程序是操作系统内核和及其硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备

4、文件,应用程序可以像操作普通文件一样对硬件设备进行操作。Linux下的设备驱动程序是内核的一部分,运行在内核模式。也就是说,设备驱动程序为内核提供了一个I/O接口,用户使用这个接口实现对设备的操作。我们在这个实验中主要是将驱动程序的C文件交叉编译后添加进内核,同时,在文件系统中添加驱动测试程序。最后将生成的系统映像文件烧进开发板中。对于驱动程序的使用,有静态编译和动态编译两种,静态编译指的是将驱动程序添加到内核中,动态编译是指将驱动程序编译成驱动模块。我们采用 第一种,即静态编译的方式添加驱动程序。驱动程序的开发步骤如下:1)首先,用户在自己的驱动程序源文件中定义file_operations

5、结构,并编写出设备需要的各种操作函数,对于设备不需要的操作函数用NULL初始化,这些操作函数将被注册到内核。当应用程序对相应的设备文件进行操作时,内核会找到相应的操作函数,并进行调用。如果操作函数使用NULL,操作系统就进行默认的处理。2)设备驱动程序编写完成后,就可将其添加到linux内核中,这需要修改linux的源码,然后重新配置编译linux内核。3)编写相应的驱动测试程序,下载到ARM板进行相应驱动的测试。【实验步骤】 1.打开桌面上的虚拟机软件VMware Workstation,用户名为root,密码为123456,即以超级用户的身份登录。打开终端,学习一下Linux常用命令:#

6、cd / 切换到根目录# cd dir 切换到当前目录下的dir目录下# cd . 切换到上一级目录# ls 显示当前目录下的文件列表# vi file 编辑文件file# tar xzvf file.tgz 将文件file解压# rm file 删除文件# rm fr dir 删除当前目录下叫dir的整个目录# cp source target 将文件source复制为target,可以指定文件路径# cat file 查看file的内容 # mv file /dir 将当前目录下的file文件移动到dir目录下还有一些命令会在后面的使用中具体讲解。 2. 在终端里进入 /opt/Frien

7、dlyARM/Nano2410V2 目录下,其中有一个kernel文件夹,这就是我们要操作的LINUX的内核。进入kernel/drivers/char ,即内核驱动的字符型设备驱动文件夹,然后ls查看里面的文件列表,其中有一个 super2410-leds.c文件,这是一个led驱动程序,但此程序需要修改才能适用于我们的ARM板。3. 输入 vi super2410-leds.c ,对此文件进行编辑。在vi编辑器里面默认的是命令模式,键入i就进入了编辑模式。程序里 led_table中定义了四个端口,我们将GPIO_E13改为GPIO_F7,即我们只对板子上的LED2进行操作。修改之后按Es

8、c回到命令模式,然后输入 :wq 保存退出。4. 打开kernel/drivers/char 目录下的Makefile文件,即输入 vi Makefile 。切换到编辑模式,在第199行里输入 obj-$(CONFIG_SUPER2410_LEDS) +=super2410-leds.o 。按Esc键,输入 :wq 保存退出。 这一步操作时为了在编译内核时将 super2410-leds.c 编译成 super2410-leds.o 文件。 5. 打开kernel/drivers/char 目录下的Config.in 文件,即输入vi Config.in。切换到编辑模式,在第89行里输入dep

9、_tristate Support Super2410 Leds CONFIG_SUPER2410_LEDS,然后按Esc键,输入 :wq 保存退出。这样在运行menuconfig配置字符设备时就会出现 Support Super2410 Leds 的字样,如果选中并编译通过,驱动程序就加到内核中了。 6. 返回到 /kernel 目录下面,输入 make menuconfig ,进行内核的配置。首先找到Character devices,回车进入,找到 Support Super2410 Leds (NEW),键入空格选中此项。然后返回上一级,进入General setup,在 Timer

10、and CPU usage LEDS上键入空格,取消选中。如果选中则两个LED分别用于Timer和CPU,我们的测试程序将看不到效果,故在此处将其取消。然后保存退出,这时可以进行LINUX内核的编译了。7. 在终端里输入 make dep,这一步仅仅在第一次编译时需要,为的是编译时内核知道文件之间的依赖关系; 输入 make clean ,该命令用于清除以前编译内核时生成的所有目标文件、模块文件和临时文件; 输入 make zImage ,即将内核编译成gzip压缩形式的image。编译通过后会在目录 kernel/arch/arm/boot 下生成 zImage内核文件。8. 编译好之后,我

11、们查看 kernel/drivers/char 目录会看到 super2410-leds.o文件,如果没有则我们的LED驱动程序没有加入到内核。另一种方法是在终端里kernel目录下输入 cat System.map | grep leds,如果有matrix4_leds_init、matrix4_leds_ioctl、matrix4_leds_fops(这几个是super2410-leds.c文件里的函数)等,则表明驱动已经正确地加入到了内核。 9. 将zImage 文件拷贝到 /mnt/hgfs/share 文件夹里,则在windows下我们可以获得此文件。下面进行驱动测试程序的操作。10

12、. 在虚拟机的 /opt/FrindlyARM/Nano2410V2/examples 找到leds文件夹,里面有两个文件,main.c是led的测试程序,Makefile是用来指明编译main.c文件时要用的编译器。在终端里进入此文件夹,输入 make 后在该文件下生成一个二进制程序led。将其重命名为ledtest,拷贝到 /opt/FriendlyARM/Nano2410V2/root_qtopia_tp/sbin下。这个root_qtopia_tp文件夹是我们板子所使用的文件系统。11. 将 root_qtopia_tp文件夹拷贝到 /opt/ FriendlyARM/Nano2410

13、V2/mkyaffs文件夹下,在终端里进入此文件夹,输入命令 ./mkyaffsimage root_qtopia_tp test.img。执行完后在mkyaffs文件夹下会生成test.img文件,这是我们要下载到ARM板子上的文件系统映像文件。12. 将前面的zImage和test.img文件下载到ARM板,然后重新启动,通过windows主机的超级终端进行驱动程序的测试。13.在windows主机下,打开 开始-程序-附件-通讯-超级终端,输入自定义的名称,选择COM口(默认COM1即可),端口设置如下图:将ARM板上面的COM0和主机的串口用串口线连接,上电后会在超级终端里看到启动信息

14、,当出现“Please press Enter to active this console” 时键入回车进入操作系统,如下图此时可以通过超级终端控制我们的ARM板了。14. 这时候可以看到LED2在闪烁,其控制程序是 /etc/rC.d/init.d 下面的leds。输入 ./leds stop 后,则此程序被结束,LED不再闪烁。15. 进入 /sbin,查看文件列表会发现我们添加的驱动测试程序ledtest:进入 /dev 会看到我们加入内核的驱动leds(驱动程序super2410-leds.c中定义的驱动名称为leds),如下图:这时候我们进行驱动程序的测试,输入ledtest 1

15、1则点亮LED2,输入ledtest 1 0则熄灭LED2。实现一个简单的linux字符设备驱动 步骤1: 编写驱动程序 1. #include 2. #include 3. #include 4. #include 5. #include 6. #include 7. #include 8. #include 9. #defineDEVICE_NAMEcdev_zhangwei 10. intnumber_of_devices=1;11. structcdevmydev;12. dev_tdev=0;13. chardata128=/0;/thedataofmydevice 14. stru

16、ctclass*myclass;15. staticintmydev_open(structinode*inode,structfile*file)16. 17. pr_info(mydevdriveropen!/n);18. return0;19. 20. staticintmydev_release(structinode*inode,structfile*file)21. 22. pr_info(mydevdriverreleased!/n);23. return0;24. 25. ssize_tmydev_write(structfile*file,constchar_user*buf

17、,size_tcount,loff_t*f_pos)26. 27. ssize_tret=0;28. pr_info(mydev_write!/n);29. pr_info(writing%dbytes/n,count);30. if(count127)31. return-ENOMEM;32. if(count0)33. return-EINVAL;34. if(copy_from_user(data,buf,count)35. ret=-EFAULT;36. 37. else38. data127=/0;39. pr_info(kernelreceived:%s/n,data);40. r

18、et=count;41. 42. returnret;43. 44. staticssize_tmydev_read(structfile*filp,char*buf,size_tlen,loff_t*off)45. 46. if(copy_to_user(buf,data,len)47. 48. return-EFAULT;49. 50. 51. returnlen;52. 53. structfile_operationsmydev_fops=54. .owner=THIS_MODULE,55. .open=mydev_open,56. .read=mydev_read,57. .writ

19、e=mydev_write,58. .release=mydev_release59. 60. ;61. staticint_initmydev_init(void)62. 63. intresult,error;64. result=register_chrdev(0,DEVICE_NAME,&mydev_fops);65. pr_info(udev_cdev:getmajornumber:%d/n,result);66. dev=MKDEV(result,0);67. myclass=class_create(THIS_MODULE,mydev_class);68. device_crea

20、te(myclass,NULL,dev,NULL,DEVICE_NAME);69. return0;70. 71. staticvoid_exitmydev_exit(void)72. 73. cdev_del(&mydev);74. unregister_chrdev_region(dev,number_of_devices);75. device_destroy(myclass,dev);76. class_destroy(myclass);77. pr_info(Goodbyecdev!/n);78. 79. module_init(mydev_init);80. module_exit

21、(mydev_exit);81. MODULE_LICENSE(GPL);82. MODULE_DESCRIPTION(Simplecdevudevdrivertest);步骤2: 编译,形成ko文件,然后利用insmod命令插入内核。 (最好利用makefile进行编译,网上有文章专门有介绍) 步骤3:创建设备节点: mknod /dev/your_name c 主设备号 次设备号 次设备号这里填0, 主设备号可以利用 cat /proc/devices 查看步骤4:编写用户程序(测试咱们的驱动是否可行), 如以下代码简单的用gcc命令编译就好了 1. #include 2. #includ

22、e 3. #include 4. #include 5. #include 6. intmain(void)7. 8. intfd,len;9. pid_tpid;10. charbuff=Thisisfromuserspacezhangweifightit!;11. charbuff_read100;12. fd=open(/dev/cdev_zhangwei,O_RDWR);13. if(fd0)19. 20. len=write(fd,buff,sizeof(buff);21. printf(sonWritereturns%d/n,len);22. 23. else/parent 24.

23、 25. /waitpid(pid); 26. printf(readreturns%d/n,read(fd,buff_read,len);27. printf(buff_read=%s/n,buff_read);28. 29. close(fd);30. return0;31. 到了这里,对字符设备驱动就有一个直观的印象了。【实验报告要求】 1.将实验中用到的驱动程序及测试程序打印出来附在实验报告中。 2.将实验中用到的Linux基本命令及其作用写在实验报告中。 3.回答实验思考题。【思考题】1.分析Linux内核与文件系统之间的关系。2.简述硬件驱动开发的基本流程。3.查看本实验中驱动程序的内容,分析其file_operations结构。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1