实验七嵌入式系统驱动实验资料_第1页
实验七嵌入式系统驱动实验资料_第2页
实验七嵌入式系统驱动实验资料_第3页
实验七嵌入式系统驱动实验资料_第4页
实验七嵌入式系统驱动实验资料_第5页
免费预览已结束,剩余13页可下载查看

下载本文档

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

文档简介

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 Ma nageme nt Un it)功能的嵌入式 Li nux操作系统是 ARM平台上操作系统的最佳选择。通用的基于ARM系统的Linux开发步骤如下:1) 开发目标硬件系统:如选择微处理器,Flash及其他外设等;2) 建立交叉编译工具:一般的 GCC工具都是针对 X86体系的,为了能够生成目标板 可执行的代码必须建立交叉编译工具;3)4)5)6)7)开发Bootloader :建立启动系统的主引导程序;移植Linux内核:如基于 ARM的Linux2.4内核移植;开发一个根文件系统:如ya

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

4、,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。 LinUX下的设备驱动程序是内核的一部分,运行在内核模式。也就是说,设备驱动程序为内 核提供了一个I/O接口,用户使用这个接口实现对设备的操作。我们在这个实验中主要是将驱动程序的 C文件交叉编译后添加进内核,同时,在文件系统中添加驱动测试程序。最后 将生成的系统映像文件烧进开发板中。对于驱动程序的使用, 有静态编译和动态编译两种, 静态编译指的是将驱动程序添加到 内核中,动态编译是指将驱动程序编译成驱动模块。我们采用第一种,即静态编译的方式file_operations结构,并编写出设备需要NULL初始化,这些操作

5、函数将被注册到 内核会找到相应的操作函数,并进行调用。添加驱动程序。驱动程序的开发步骤如下:1) 首先,用户在自己的驱动程序源文件中定义 的各种操作函数,对于设备不需要的操作函数用 内核。当应用程序对相应的设备文件进行操作时,如果操作函数使用NULL,操作系统就进行默认的处理。ARM板进行相应驱动的测试。2) 设备驱动程序编写完成后,就可将其添加到linUX内核中,这需要修改linux的源码, 然后重新配置编译linux内核。3) 编写相应的驱动测试程序,下载到Workstation,用户名为root,密码为123456,即以LinUX常用命令:【实验步骤】切换到根目录切换到当前目录下的 di

6、r目录下 切换到上一级目录显示当前目录下的文件列表编辑文件file将文件file解压1. 打开桌面上的虚拟机软件VMware 超级用户的身份登录。打开终端,学习一下/dir# cd# cd# cdfile# ls# vi# tar xzvf file.tgz# rm file 删除文件# rm -r dir删除当前目录下叫 dir的整个目录# cp source target将文件source复制为target,可以指定文件路径# cat file 查看file的内容# mv file /dir 将当前目录下的file文件移动到dir目录下还有一些命令会在后面的使用中具体讲解。2. 在终端里进

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

8、per2410-leds.o 。按 Escsuper2410-leds.c 编译成GPIO_F7,即我们只对板子上的 LED2进行操作。修改之后按Esc回到命令模式,然后输入: wq保存退出。4. 打开kernel/drivers/char目录下的 Makefile文件,即输入 模式,在第 199 行里输入 obj-$(CONFIG_SUPER2410_LEDS) 键,输入:wq保存退出。这一步操作时为了在编译内核时将super2410-leds.o 文件。J昴蘇倆牖WBjH WB制朋關巫IM I jj业jJjjjggg墜壘乂和D 編帥&活理)终相)转到eg帮肋旦)obj- S'

9、; O rsh IJ.UM' += sync 1 ink.obj-S>+- n_hdl.oobj QN l(;_SPECI ;LI XI += spccialiK.oobj -$1 U74- G VM G_WJI LT I N_SER: AL i += amiseri;il.oohju2 Iij 2羽2 h += se r_a22ii2 .o gtner icse r ia Lqobj -'h' u I(iii_sX) += ss+o gf nt r if_se r ia I »oobjIG_RIO) += r io/r io .o gener ic_5

10、e r ia I .obj -$' tlJM-1(i;_Sil_SCI ) += sh-sc i .o gent? r ic_ser iii I .oobj-$(aT(> SERLU.IG7) += ieriallfiZ.oohj-HT+H丄_人林147 JAjO += gf nc r ic_ser ia I .q vrfpscc ,qobj-S'+= gener ic_ser ia I .o vrtp_scc.oobjI<sJJVWj()Ul)_bCl; += gene r ic_se r ia I .o vnr_scc .oobj- S' tJJM-1G

11、_SEKI AL_TX 12 > += gener ic_5(?r ii)L . sor in I _tx39'12 .o 0历-| 0刑;】9"沁4口山=0=扯町1"+= nano24hut tons.oobjfHI £4(1)+= s3c24H3-3dc.oobj-爲川IMUZjaBM;s3c2410-ls.rmdule obj-$'出 fUdLL 卜【小 +=super2410- Leds.o即输入vi Config.in。切换到编辑SupportSup er2410 Leds'保存退出。这样在运行 menuconfig Sup

12、port Super2410 Leds的字样,如果选中并编译通过,驱动程序iuhtlir-S' CLNdGRICh += r io subdi iir-$' UIG I M += joys I ick5. 打开 kernel/drivers/char 目录下的 Config.in 文件, 模式,在第 89 行里输入 dep_tristate CONFIG_SUPER2410_LEDS ,然后按 Esc 键,输入:wq 配置字符设备时就会出现 就加到内核中了。roDtilorjUhQ韭/opt/ Friendly 兀RM/Na 卿2:斗ll'N也gfpe Htfr我更扁圈

13、型 r,V編辑哙賁看理终输1? 转到© 帮助凹e I轴E buu ' Eiiab Ip fi bud I 'le Srtfi r Lbud I “le Sns rIPS2 Keyboard Support CllJGPC_KETiGird Reader 0 Suppor I ' CLlSHC_l TS 1 72_SCR1)Uni Reader 1 Support ' QN K;_【Tg 1 72-窖 CRJif f "SanhiJlXPFRIirNrAL* = -a= S* 1: Itient i !i la le ' (jjnwdo

14、re A2232 se r la I zppnri f EXFEtd 隔NMdJ ' GlhHG_A22垃soilr ce dr iversZst r ia l/Chn t' ig + inSiipe r2411)lno241(IA|Shno2410Adfp_t r i S la If dfp_t r i s la IF |dfp_t r i s la If dep_t r i s la leCH S3C2410'biippor t 'Siippor t 'Suppor t 'Suppor LLed 5 'V2O N K:_SIPKR24

15、10_Lh:nSButtons a14' 11( I A_V2_HinT<hSInput ' aN-' 110A_2_.DC;丸GMIfl TouchScrfenI<LS3C24O_T<1JC1CEE£N SCCNIC;_AR6.返回到Character devices,回车进入,找到/kernel目录下面,输入 make menuconfig,进行内核的配置。首先找到Support Super2410 Leds ( NEW),键入空格选中此项。< >f Ex i L<Select>subiTiiu > Hjnc

16、 hide s» <1 ec lude s . ex i t K <?> for fc Ip.<、m)du le ciipjib kbe rmina Iconrpa I ib le IKRTs ) sc i ia I suppor 1Supp>< Help >hhno2410A W.OMino2410A 2.0 S3C2'410 TouchScreeii (卩H) hu I lojis Mi pILinui Kerne I v2,4, IS-rdsT-pKil Cionf igura t ionAl l ow keys na v ig

17、q le I he irpnu » <Eii le r> sc led s Hi讪 h虽hwd le I le r s a re ho ikey !i Pressing <¥> nedular ize5 fcalures. Pre盯 <E?c><E3c> LoLcjTcnd: * billi IL- in exc luded <曙 iwdu leenjot创 losi Ihosl/cipiy F nendb A RM, N ana2 410'2/ktimclf *1 i r 1 tia I le rnm na I

18、* Iuppor t ioT coiiso le on v i lua I< > tandard/gene r ic ( K25U/1(5550 and f hl inii landard itfiiil poF I flippor I trial dr i ve r s >曰 然后返回上一级,进入 General setup,在Timer and CPU usage LEDS 上键入空格,取消选 中。如果选中则两个 LED分别用于Timer和CPU,我们的测试程序将看不到效果,故在此 处将其取消。H X艾忡E 絹种E? 程昏巴 终潇B 转到fQ 帮肋旦、,c<Se I

19、cfl>Linux Kernel v2 »<*lK-rralt7pi;a I Gvnf igiir« I ionsubitthuti> .inc IhJp ?i <2 exchJides. ex i I H <?> for tt Ip.< > riDduc able< 上 : I >< Ic 1P >HI ' |lA''t)w key navi百ale lhe ittiiu . <Ejl tc i > selecLi High I igh n rd k i r rs

20、a re hoi key. Pre s li ing <V> <M nmdu lar izs fea lures.卩£汕 <E!ic><tsc> to Lc輕nd: t* bu 1 L' in excLuded <M inxJu Ic< > e r lie J skjppQr i for M SC b ina r ie !if ower MnagerwnL supporl t expe r inrn ta Ht J upporl (USECLE.PMr 1i&ab« OCM_KJLLERr ledi

21、ice TTV Io L tnidu a r a i t hiiT t i c 'Jiige< > I SC fF pt r sona lilyI 0 no t run pa r 5e_lag_cn(d I inef ) iii ar ch/a rm/kcrne 1/se tup c fan 11 ke rne I conurand sir inp : " roo L -1 f04 rrem=32M mSKOEKSlsSf * e r ne l-iiude a I ignrtriii I trap handler7. 在终端里输入make dep,这一步仅仅在第一

22、次编译时需要,为的是编译时内核知道文件之间的依赖关系;输入make clean,该命令用于清除以前编译内核时生成的所有目标文件、模块文件和临时文件;输入make zImage ,即将内核编译成 gzip压缩形式的image。编译通过后会在目录kernel/arch/arm/boot 下生成 zimage 内核文件。kernel/drivers/char 目录会看到 super2410-leds.o 文件,如果 cat8. 编译好之后,我们查看没有则我们的LED驱动程序没有加入到内核。另一种方法是在终端里kernel目录下输入System.map | grep leds,如果有 matrix4_

23、leds_init、matrix4_leds_ioctl、matrix4_leds_fops 几个是super2410-leds.c文件里的函数)等,则表明驱动已经正确地加入到了内核。arjir I iiiux-ohj copy binary -ft .noic -R .comitnt -S coirp cinux zJnnge iTuke 111 Leav ing d i rec lory /opl/Fr Lend lyARNfNiio2410/ke rue I/ei i ch/a rin<boo L' roQIhps t kerne J ft Ml SyEiemnsp 丨誉切

24、 lutbcOOlOOcH cOOlelGS c00caci4 cOOcaecO cOOca f24 cOOcb474 cOlcfc44 cOldlOiic c020dSlc|rootl? mi t r ix4_leds_in i i? _in i t ca I l_nB i r it4_leds_in i iT Kc I leds13 tcTTse I tEi lereg ite r_ leds rm t r ix4_kds_iflf 11 led%ta tenu I r ix4 IcJifops k leds ddocaIHgst kernf I(这9. 将zImage文件拷贝到/mnt/

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

26、。"一""11. 将 root_qtopia_tp 文件夹拷贝到 /opt/ FriendlyARM/Nano2410V2/mkyaffs 文件夹下,在终端里进入此文件夹,输入命令./mkyaffsimage root_qtopia_tp test.img。执行完后在mkyaffs文件夹下会生成test.img文件,这是我们要下载到 ARM板子上的文件系统映像文件。12. 将前面的zImage和test.img文件下载到 ARM板,然后重新启动,通过windows主机的超级终端进行驱动程序的测试。13. 在windows主机下,打开 开始-程序-附件-通讯-超级终

27、端,输入自定义的名称,选 择COM 口(默认COM1即可),端口设置如下图:coil s性停止位:数据流控制电):还隸认值1将ARM板上面的COMO和主机的串口用串口线连接,上电后会在超级终端里看到启动信 息,当出现“此时可以通过超级终端控制我们的14.这时候可以看到 LED2在闪烁,其控制程序是/etc/rC.d/init.d下面的leds。输入./leds stop后,则此程序被结束,LED不再闪烁。 确走 I 取消应用® e tP3+ -趙皱终端匚回区1文件貓辖血宜看00呼别传i去帮助gg&脅ules木丨Slot initializedUsing /lib/mincsd

28、_disk. oWarning: loading inmcsd_disk will taint the kerne oprietary LicenseSee http: /wvivi, tux . org/lkml/Hexport-tain ted f c lesrlease press Enter to actiuat' irver version Boa/0.94.13 ll/Jan/2031:15:58:04 *0000) ll/Jan/2031:15:58:04 -0000 JQ this console. IJ303: server built F oa: starting

29、serverootSFriendlyARH /H=1<HI> 0:02: Of 自动栓测115200 G-N-1'1 '1 '' 1沖Please p ress Enter to active this con sole”时键入回车进入操作系统,如下图ARM 板了。15.进入/sbin,查看文件列表会发现我们添加的驱动测试程序ledtest:它七就-超级異瑞口回冈:件®躺辑(1)查看迪呼凹电)檯送 帮助Qp cs蘊鲁童 erootSFriendlyPRH/etcltt cd IdrootSFriendlyRRM/* Is sbin/adj

30、timexifdownmadplayarmcomtestifupmakedevsboaimagewritemkswapf diskinetdmodboxfreeramdiskinitmodprobefsck.minixinsmodnameifftpledpivotrootgettvlecl-playerpoweroffhaltledtestreboothdparmloadkmaprmmodhwclocklosetuprouteifconfigIsmodrunlevelrootFriendlyARH/#<II1>11已连接 0:102 ABEItfL152003-U-l进入/dev会

31、看到我们加入内核的驱动leds(驱动程序super2410-leds.c中定义的驱动名称为leds),如下图:test -超级终瑞B回区1文件电鸚辑电)查看呼凹电)楼送帮助 cS海g童 B ftp gettv halt1 hdparmI hwclockled lecl-player ledtest loadkmap losetuppiuot_root poweroff reboot rmmod routeIdifconfigIsiiiodrunlevelrootFriendlyARH/# Is dey/memptmxbuttonsfb0consolefullmixerttycua0h360GL

32、tsrawrandomttycualrootttycua2knemnullt tvdspledsportsdalttyrootFriendlyARH/# _<II1>1p1已连接 0:l?:3c ABEItfL152003-U-lU''Hsi-i这时候我们进行驱动程序的测试,输入ledtest 1 1则点亮LED2 ,输入ledtest 1 0则熄灭LED2。hwclocklosetuprouteifconfigIsmodrunlevelrootSFriendlyARH/# Isdev/memptmxbuttonsfb0consolefullmixerttycua0

33、h360eLtsrawrandomttycualrootttyCLJ(32knemnullttydspledspor*tsdalttyrootSFriendlyARH/# ledtestUsage: ledsled_nc)0ilrootFriendlyARH/H ledtest 1 0rootSFriendlyARH/# ledtest 1 1rootFriendlyARH/#口回冈d_ VVL15200 3-U-1 _II已连接 0:15:0c ABEItf实现一个简单的linux字符设备驱动步骤1:编写驱动程序1. #in elude <li nu x/module.h>2.

34、#in elude <li nux/in it.h>3. #in elude <li nu x/ker nel.h>4. #in elude <li nu x/edev.h>5. #in elude <li nu x/fs.h>6. #i nclude <li nu x/kdev_t.h>7. #in elude <asm/uaccess.h>8. #in elude <li nu x/deviee.h>9. #defi ne DEVICE_NAME "cdev_zha ngwei" 10.

35、 int nu mber_of_devices = 1;11. struet edev mydev;12. dev_t dev = 0;13. ehar data128 = "/0" / the data of my deviee14. struet elass *myclass;15. statie int mydev_open(struet inode *inode, struet file *file)16. 17. pr_in fo("mydev driver open!/n");18. return 0;19. 20. statie int m

36、ydev_release(struet inode *inode, struet file *file)21. 22. pr_in fo("mydev driver released!/n");23. return 0;24. 25. ssize_t mydev_write(struct file *file, constehar _user *buf, size_t count, loff_26. t *f_pos)27.ssize_t ret = 0;28.p r_i nfo("mydev_write!/n");29.pr_in fo("w

37、riti ng %d bytes/n", coun t);30.if (eou nt > 127)31.return -ENOMEM;32.if (cou nt < 0)33.return -EINVAL;62. 34.if (copy_fro m_user(data, buf, coun t) 35.ret = -EFAULT;36.37.else 38.data127 = ”/0”;39.pr_in fo("ker nel received: %s/n", data);40.ret = count;41.42.return ret;43. char

38、 * buf, size_t len,loff_t* off)44. static ssize_t mydev_read(struct file* filp,45. 46.if( cop y_to_user(buf,data,le n) 47.48.return -EFAULT;49.50.51.return len;52. 53. struct file_ op erati ons mydev_fo ps = 54.ow ner = THIS_MODULE,55.open = mydev_ open,56.read = mydev_read,57.write = mydev_write,58

39、.release = mydev_release59.60.;61. static int _in it mydev_i nit(void)63.int result, error;64.result = register_chrdev(O, DEVICE_NAME, & mydev_fo ps);65.pr_in fo("udev_cdev: get major nu mber: %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.return 0;70. 71. static void _exit mydev_exit(void)72. 73.cdev_del(&m ydev);74.un register_chrdev_regi on( dev, nu mber_of_devices);75.device_destroy(myclass, dev);76.class_destr

温馨提示

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

评论

0/150

提交评论