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

下载本文档

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

文档简介

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)开发Bootloader :建立启动系统的主引导程序;4)移植Linux内核:如基于 ARM的Linux2.4内核移植;5) 开发一个根文件系统:如yaffs

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

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

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

6、登录。打开终端,学习一下Linux常用命令:# cd/切换到根目录# cd dir切换到当前目录下的 dir目录下# cd.切换到上一级目录# Is显示当前目录下的文件列表# vifile编辑文件file# tar xzvf file.tgz 将文件 file 解压# 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改为 GPIO_F7,即我们只对板子上

8、的LED2进行操作。修改之后按Esc回到命令模式,然后输入:wq保存退出。4. 打开kernel/drivers/char目录下的 Makefile文件,即输入 vi Makefile 。切换到编辑 模式,在第 199 行里输入 obj-$(CONFIG_SUPER2410_LEDS) +=super2410-leds.o。按 Esc 键,输入:wq保存退出。这一步操作时为了在编译内核时将super2410-leds.c编译成super2410-leds.o 文件。HMtffliMjIiDsbZnoiZEricrtdkAJUirfZhtoM蜩僭*材鋤的向垃d血文件世)编揖査昏Y) 终端转別()

9、 帝肋(H)bj-$( (IN* I (i_SYTttJ bK +- sync link ,oDbj-$(ClW-(;_NjrLC; *= n_hdlc.obj -$( OtTF I G_SPEC1 ALJ X. +- speciilix.oubj-$ CXhFIG IMA EOLTJN SERIAL. += amiseril.o obj -$ 1N- J j V .: ?_+= se r_a2232 gthe r ic_ser ia koobj-$( ( i N-1(. s.X += sx gtntr ic_ser ia I .o obj-$( Clhb 0: += r ic/r io .o

10、 gener ic_se r ia I . obj-$ ClhFI(j Sil SCI + sh-sc i .o gent? r ic_ser ii I .o obj -$( ClhF IG SFJI AL 167)+- seriall67.0obj - S f Nj J j MM-.J 4 / h仃+= gene r ic_se r ia I o rie_5cc .oobj -$: ( i N-1 . m J _s( i+= gene r jc_se r ia I .o vnr sec .obj-$( OOF 1 G B%E60CK SGC) += gener ic_xer ia I .o

11、vrre_scc .o obj-CCJbf I(j SERI r.V? 12+ gener ic_s(?r ia I . ser ii l_ tx3912 .ojb j - $ (OChF G_bhhCe410 A_ V3 _BUTTt NS * na no241 Oa _v2- bu I ton &. o objIG_NANQE4 WV2_.TX“: += s3c2410adc o Aj(WLS3Q4lO_iaXIaSENI += s3c24IO-ts .nodu lebj-$ OOFt G_s l.PEEU-11 n_Ll-1 fi +=supe r2410-led.osubtlir-l(

12、ClW- IG RIO) += r insubdir-$ (IN1 J11 M lrl += joys I ick即输入vi Config.in。切换到编辑 Support Super2410Leds保存退出。这样在运行 menuconfig5. 打开 kernel/drivers/char 目录下的 Config.in 文件, 模式,在第 89 行里输入 dep_tristate CONFIG_SUPER2410_LEDS,然后按 Esc 键,输入:wq 配置字符设备时就会出现Support Super2410 Leds的字样,如果选中并编译通过,驱动程序就加到内核中了。romIKg比/op

13、t/F肝陪1,讪辿 aiioL4 “小卫/血川由芒型“艸扁卩CX1SF1G PC KEYBm0 编辑團査看兰)终端(D 转到匹L)剂助(H) e Ibun 1 Eiiab le PS2 Keyboard Suppur l1bool EnabIe Smrt Gard Beider 0 Supporl hacI Enable Snarl Gt rd Reader 1 Suppor Iif 乌仃NHGJOiPEfUMNrAr = T -a aNlG_Z(KRO* = y】;lhen1 r i s (a le GniTTiT)dore A2232 ser ia I suppejr | ( KXIJER

14、J MLNIAI- QhFtG_A2232source dr ivers/set ia I/Config + in dep_t1 i s la le dep_tr islale drp_tr islale dep_tr istiteCH S3(410Support SuppQT t Suppor t Supporl(ibElG_SlP*R24 O_LF:OSButtons OOhF 11 OA_V2_BLTTOSAD Input U141 (;_NNIE410A_V2_AD(;Super2410 Leds1bhna24l(JA W.Ohfarw24lOA W.OTouchScrttn (IhH

15、)lIMfllinuxrc1rootBFriendlyARM /# cd /etc/rc,d/init +d/ HrootBFriendlyARM init + dltt Is1 httpd leds netdrootFriendlyARM init.dltt ./leds stopHrootFriendlyARM init.dltt _1 v L已连接 0:08:3 AHSIW115200 3-H-l15.进入/sbin,查看文件列表会发现我们添加的驱动测试程序ledtest:-超级终瑞口叵区文件空編辑电)查看迪 呼叫心 倍送0)帮助QP 用商鲁巫口 e ns* rootFr iendlyA

16、RM/etclH cd rootFriendlyARM/H Is sbin/ adjtinexifdownmad卩1日y armcomtestif upmakedevsB boaimagewritemkswap fdiskinetdmodboxH freeramdiskinitmodprobeI fsck.minixinsmodnameif ftpledpiuot_root gettylecbplayerpoweroff haltledtestreboot.hdparmloadkmaprmmodI hwclocklosetuprouteI ifconfiglsmodrunleuel Lroot

17、lricndlyARM/ttli 山.1IX.已连接 010: ABSItf115200.HVM .插打印rn fxD冷霽a dfi*ftpledpiuot_rootAlget tylecl-playerpoweroffhaltledtestreboothdparmloadkmdprmmodhwclocklosetuprouteifconfiglsmodrunleveltrootFriendlyARM/tt Is dev/memptmxbuttonsfb8consolefullmixerttycuaOh3600Ltsrawrandomttycualrootttycua2kmemnullttyd

18、spledsportsdalttyrootFriendlyARM/tt _二Il1V| 已连接 0:12:3t ANSIW115200 8-H-LJCRJDLL 1 CA首丨打印这时候我们进行驱动程序的测试,输入ledtest 1 1则点亮LED2 ,输入ledtest 1 0则熄灭LED2。rtest -趙级终瑞叵文件编辑萱看电)呼叫)槎送 帮助鲁 1-0 edfi*hwclocklosetuprouteifconfiglsmodrunlevelrootSFriendlyARM/1H Isdev/memptmxbuttonsfb0consolefullmixerttycua0h3600_ts

19、rawrandomttycualrootttycua2kmemnullttydspledsportsdalttyrootBFriendlyARM /1H ledtestUsage: ledsled_no011rootQFriendlyARM /tt ledtest 10rootFriendlyARM /Itt ledtest 11rootFriendlyARM/IttI l已连接 0:15:0c AHSIW115200 8-H-L丄ROLLI CA阪.m .孑首丨打印实现一个简单的linux字符设备驱动步骤1:编写驱动程序1. #in elude 2. #in elude 3. #in elu

20、de 4. #in elude 5. #in elude 6. #i nclude 7. #in elude 8. #in elude 9. #defi ne DEVICE_NAME cdev_zha ngwei10. int nu mber_of_devices = 1;11. struct edev mydev;12. dev_t dev = 0;13. char data128 = /0; / the data of my device14. struct class *myclass;15. static int mydev_open(struct inode *inode, stru

21、ct file *file)16. 17. pr_in fo(mydev driver ope n!/n ”);18. return 0;19. 20. static int mydev_release(struct inode *inode, struct file *file)21. 22. pr_i nfo(mydev driver released!/n);23. return 0;size_t count, loff_24. 25. ssize_t mydev_write(struct file *file, const char _user *buf, t *f_pos)26. 2

22、7.ssize_t ret = 0;28.pr_i nfo(mydev_write!/n);29.pr_in fo(writi ng %d bytes/n, coun t);30.if (count 127)31. return -ENOMEM;32. if (cou nt 0)33. return -EINVAL;34. if (copy_from_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

23、 = count;41. 42. return ret;43. len ,loff_t* off)44. static ssize_t mydev_read(struct file* filp, char * buf, sizej45. 46. if( copy_to_user(buf,data,le n)47. 48. return -EFAULT;49. 50.50. return len;51. 52. struct file_operati ons mydev_fops = 53. .ow ner = THIS_MODULE,54. .ope n = mydev_ope n,55. .

24、read = mydev_read,56. .write = mydev_write,57. .release = mydev_release59.58. ;59. static int _in it mydev_i nit(void)60. 61. int result, error;62. result = register_chrdev(O, DEVICE_NAME, & mydev_fops);63. pr_in fo(udev_cdev: get major nu mber: %d/n, result);64. dev = MKDEV(result, 0);65. myclass =

25、 class_create(THIS_MODULE, mydev_class);66. device_create(myclass, NULL, dev, NULL, DEVICE_NAME);67. return 0;68. 69. static void _exit mydev_exit(void)70. 71. cdev_del(&m ydev);72. un register_chrdev_regi on( dev, nu mber_of_devices);73. device_destroy(myclass, dev);74. class_destroy(myclass);75. pr_i nfo(Goodbye cdev!/n);76. 77. modulen it(mydev_i nit);78. module_exit(mydev_exit);79. MODULE_LICENSE(GPL);80. MODULE_DESCRIPTION(Simple cdev udev driver test);步骤2 :编译,

温馨提示

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

评论

0/150

提交评论