试验七嵌入式系统驱动试验资料_第1页
试验七嵌入式系统驱动试验资料_第2页
试验七嵌入式系统驱动试验资料_第3页
试验七嵌入式系统驱动试验资料_第4页
试验七嵌入式系统驱动试验资料_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

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

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

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

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

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

6、当前目录下的dir目录下# cd.切换到上一级目录# ls显示当前目录下的文件列表# vifile编辑文件file# tarxzvffile.tgz将文件file解压# rmfile删除文件# rmfrdir删除当前目录下叫dir的整个目录# cpsourcetarget将文件source复制为target,可以指定文件路径# catfile查看file的内容# mvfile/dir将当前目录下的file文件移动到dir目录下还有一些命令会在后面的使用中具体讲解。2 .在终端里进入/opt/FriendlyARM/Nan02410V2目录下,其中有一个kernel文件夹,这就是我们要操作的LI

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

8、le文件,即输入viMakefile。切换到编辑模式,在第199行里输入obj-$(CONFIG_SUPER2410_LEDS)+=super2410-leds.o。按Esc键,输入:wq保存退出。这一步操作时为了在编译内核时将super2410-leds.c编译成super2410-leds.o文件。四,11口:j1129让/“WEriertd卜AfjM/、自im)1;11V2/kernel/'inve:r</<har文件®嵋耨®查看<Y>外端3转到(&)帮助®obj-$,(jfsb(._SYXL1+=syncIink,o

9、obj-'HlW'lGbUrLC;+=n_hdlc.oobj-$':ClIC;_SPECIALIX+-specially.oubj-$'CXhFIGIMGEOLUNSERIAL.+=占miserial.口obj<1N-J<jV.:?_+=ser_a2232gtheric_seriaL(jobj-$(N-1(,s.X+=sxgtntric_seriaI.oobj-$(Clhb0:+=rio/rio.ogeneric_seriaI.obj-$ClhFI(jSilSCI+sh-sci.ogent?ric_seriiI.oobj-$(ClhFIGSFJ(IA

10、L167)+-riall67Mobj-S'<fNjJ<jMM.J4/+=gencric_seriaI.orie_5cc.oobj-5':(N-1<.lI'J_s(i+=generic_seriaI.ovnrsec.obj-$(OOF1GB%6000SGC)*=generic_xeriaI.ovrre_scc.oobjCCJbfI(jSERIr.V?12+-generic_s(?riaI.seriil_tx3912.o<jbj-$(OChFG_bhhCe410A_V3_BUTTtNS+-nano241Oa_v2-buIton&.oobjmM

11、lG_NANQE41i)A_V2_.TB"+=s3c2410adc»o(jbj-*UNlG_"i14】i)_Tl"H11HEh、;+=s3c24IO-ts.noduIeobj-$(aN-G_SLPEEUHn.LHh+=supe310-ledsubdir-lKlW'IGRIO)+=3subdir-$,(IN丈件(E)褊辑(E)宜看我)碧端转到恬叫11:eIsebun'EnablePS2KeyboardSupportFOCbf1GPC_KET1flbodJ.EnableSitar)(且rdReader0SupporL'CI1SFIG_

12、Tit172bool'EnableSrwrICardReaderISupport'CXFIG.ITai72_SCR1fiif”口NHGJOiPE阳MMAT=H-a*$GtN【G_"KRO*='/;ihertrs(aleGniTnr)doreA2232seriaI$upp<jItKXFERI城NrAL厂QhF【G_A2232sourcedrivers/serial/Cbiifig+indep.trisiaie'SupportSuper24Ui(XbEIG_SlPKR240_U-r6dep_trisiate'Supportlno241

13、7;AV2J)Buttons1(IN-'IG_ISftME410_W/rribSdep_trislate'Supportlno24lDAV2J)ADInput'ClN-'I(;_NME410A_W_ADCdep_tristaie'SupportS3(21i)TouchScrcenQ2,IG_E3c2410_TQJCHi(W:EN$QNnG_R<B_S3C24106.返回到/kernel目录下面,输入makemenuconfig,进行内核的配置。首先找到Characterdevices,回车进入,找至USupportSuper2410Leds(NEW

14、),键入空格选中此项。J11】7LU+=joysIick5.打开kernel/drivers/char目录下的Config.in文件,即输入viConfig.in。切换到编辑模式,在第89行里输入dep_tristateSupportSuper2410Leds'CONFIG_SUPER2410_LEDS,然后按Esc键,输入:wq保存退出。这样在运行menuconfig配置字符设备时就会出现SupportSuper2410Leds的字样,如果选中并编译通过,驱动程序就加到内核中了。ror把理#当h崂L,也pt/F出用出力RN/SanoJ4H1VE/kermdrTvcjdMr然后返回上一

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

16、编译好之后,我们查看kernel/drivers/char目录会看到super2410-leds.o文件,如果没有则我们的LED驱动程序没有加入到内核。另一种方法是在终端里kernel目录下输入catSystem.map|grepleds,如果有matrix4_leds_init、matrix4_leds_ioctl、matrix4_leds_fops(这几个是super2410-leds.c文件里的函数)等,则表明驱动已经正确地加入到了内核。Iinux-ubjcopy-Obinary-R.nole-R.CDrmentScoiipicsscd/vmJinuxzJinigcrmkefl:Leav

17、ingdireclury/opl/FriendNiiiq241OW/kerueI/arch/arn/buuiIhostkerneJflcaISyslemti&pgrepled$cOOlOOrMc00lel6ScOOcactOcOOcuf24cOOcb474c01cfc44cOldlOacc020d31cTTTtdinstrix4_kds_in11_initca1l_m)triK_leds_inilIcdstjtctled*Heregititei-lfdsmatrix4_kdn_io11kdstatcnulrix4_lcJi_fopsk111tI$9 .将zImage文件拷贝到/mnt/

18、hgfs/share文件夹里,则在windows下我们可以获得此文件。下面进行驱动测试程序的操作。10 .在虚拟机的/opt/FrindlyARM/Nan02410V2/examples找到leds文件夹,里面有两个文件,main.c是led的测试程序,Makefile是用来指明编译main.c文件时要用的编译器。在终端里进入此文件夹,输入make后在该文件下生成一个二进制程序led。将其重命名为ledtest,拷贝至U/opt/FriendlyARM/Nan02410V2/root_qtopia_tp/sbin下。这个root_qtopia_tp文件夹是我们板子所使用的文件系统。一一一一11

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

20、如下图:r?fxC0I1属性将ARM板上面的COM0和主机的串口用串口线连接,上电后会在超级终端里看到启动信息,当出现"PleasepressEntertoactivethisconsole”时键入回车进入操作系统,如下图此时可以通过超级终端控制我们的ARM板了。/etc/rC.d/init.d下面的leds。输14 .这时候可以看到LED2在闪烁,其控制程序是入./ledsstop后,则此程序被结束,LED不再闪烁。0tewt-超级终襦回叵区文件®编辑也)查看9呼叫©传送建)帮助QJ)口备因亚口a齿IerverversionBoa/0.9.13ll/Jan/20

21、31:15:58:04-000O1boa:serverbuiltFeb28211/Jan/2031:15:58:04*0000boa:startingserverpid=3ro0tFriendlyARM/-15linuxrcshanghaitan.mp3|rootFriendlyARM/#cd/etc/rc,d/init+d/rootFriendlyARMinit.dl#IshttpdledsnetdrootFriendlyARMinitidl#./led*stoprootFriendlyARMinit.dltt_一T三一.I2已隹接0:08:3£AHSIW1.152003-H-l1

22、5 .进入/sbin,查看文件列表会发现我们添加的驱动测试程序ledtest:7test-超缀终端nix文件)编辑更)查看过)呼叫©传送建)帮助QP口比容避口e甯rootFriendlyRRMroot0FriendlyARMadjtimexarmcomtestboafdiskfreeramdiskfsck.minixftpgettyhalthdparmhwclockifconfig已连搔0:10:2ABSItf1152008-»-1/etc!#cd/HIssbin/ifdownifupimagewriteinetdinitinsmodledled-playerledtest

23、loadkmaplosetupIsmod/«madplamakedevsmkswapmodboxmodprobenameifpiuot_rootpoweroffrebootrmmodrouterunleuelrootFriendlyARM进入/dev会看到我们加入内核的驱动leds(驱动程序super2410-leds.c中定义的驱动名称为leds),如下图:这时候我们进行驱动程序的测试,输入ledtest11则点亮LED2,输入ledtest10则熄灭LED2。空七e耳七-超级终襦回叵区文件®编辑堡)查看9呼叫©传送建)帮助©)hwclockifcon

24、figrootFriendlyARMlosetupIsmodrouterunlevel1sdev/membuttonsconsolecua0cualcua2dspfb0fullh3600tsrawmixerptmxrandomrootkmemledsrootFriendlyARM/1HUsage:ledsled_no011nullportledtestsdalttyttyttyttyttyrootFriendlyARM/Hledtest10rootFriendlyARM/ttledtest11rootFriendlyARM/#,心2已连接0:15:0AHSIW1.152003-H-1实现一个简

25、单的linux字符设备驱动步骤1:编写驱动程序1. #include<linux/module.h>2. #include<linux/init.h>3. #include<linux/kernel.h>4. #include<linux/cdev.h>5. #include<linux/fs.h>6. #include<linux/kdev_t.h>7. #include<asm/uaccess.h>8. #include<linux/device.h>9. #defineDEVICE_NAME&

26、quot;cdev_zhangwei”10. intnumber_of_devices=1;11. structcdevmydev;12. dev_tdev=0;13. chardata128="/0"/thedataofmydevice14. structclass*myclass;15. staticintmydev_open(structinode*inode,structfile*file)16. 17. pr_info("mydevdriveropen!/n");18. return0;19. 20. staticintmydev_releas

27、e(structinode*inode,structfile*file)21. 22. pr_info("mydevdriverreleased!/n");23. return0;24. 25. ssize_tmydev_write(structfile*file,constchar_user*buf,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.

28、if(count>127)31. return-ENOMEM;32. if(count<0)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. ret=count;41. 42. returnret;43. 44. staticssize_tmydev_read(structfile*filp,char*buf,size_tlen,loff

29、_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. .write=mydev_write,58. .release=mydev_release59.60. ;61. staticint_initmydev_init(void)62. 63. intresult

30、,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_create(myclass,NULL,dev,NULL,DEVICE_NAME);69. return0;70. 71. staticvoid_exi

31、tmydev_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(mydev_exit);81. MODULE_LICENSE("GPL");82. MODULE_DESCRIPTION("Simplecdevudevdrivertest");步骤2:编译

温馨提示

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

评论

0/150

提交评论