嵌入式Linux应用程序开发实验报告期末作业_第1页
嵌入式Linux应用程序开发实验报告期末作业_第2页
嵌入式Linux应用程序开发实验报告期末作业_第3页
嵌入式Linux应用程序开发实验报告期末作业_第4页
嵌入式Linux应用程序开发实验报告期末作业_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

1、软件学院大作业设计报告课程名称:题目:专业:班级:姓名学号:基于UP-CUP2440平台的驱动程序开发和 QT程序开发计算机软件计算机软件111班鲁飞 8000611038卢惠民 8000611021戚成林 8000611032慕一聪 8000611018刘备 8000611006李岚职称:副教授2014年6月11日嵌入式Linux应用程序开发任课教师:完成时间:22一、小组成员分工二、实验任务三、主要仪器设备及耗材四、实验步骤、驱动1. 基本知识:2. 实验原理:3. 具体实现:二、QT计算器1.QT程序设计2. 虚拟机下进行编译:3. 下载到开发板上运行:六、实验数据及处理结果101517

2、18七、思考讨论题或体会或对改进实验的建议1819八、参考资料:、小组成员分工分工:鲁飞:QT设计与设计报告 卢惠民:QT设计与设计报告 戚成琳:驱动与设计报告 慕一聪、刘备:设计报告二、实验任务1编写基于UP-CUP2440硬件平台的GPIO驱动程序必选功能:使中断按键按下后,开发板上的LED灯能作如下闪动:a)连续性闪动,跑马灯:如:1-2-3-1-2-3或3-2-1-3-2-1b)间隔性闪动:如:1-3-2-1-3-2或3-1-2-3-1-2进阶功能:改变中断按键的控制功能,使中断按键按下后,LED灯不断闪亮,再次按下后,LED灯灭。2.QT计算器三、主要仪器设备及耗材PC, Windo

3、ws Xp , H-JTAG,H-Flasher,DNW,开发实验箱。四、实验步骤、驱动思路:前后台思想:在中断模块中设置一个计数的变量,每一次中断计数器加一。然后在GP10驱动模块的ioctIO函数中分情况使跑马灯按要求闪动或熄灭。设备驱动程序可以使用模块的方式动态加载到内核中去。模块的必需组成部分:模块加载函数,insmod时调用。模块卸载函数,rmmod时调用模块许可证LICENSE说明数据结构file_operation中定义驱动程序会使用的函数。在获得了系统分配的设备号之后,必须要通过注册才能实现设备号和驱动程序之1. 基本知识:(3)(4) 间的关联。(5) 打开设备和释放设备,没

4、什么要特别注意的。(6) 读写设备:把内核空间的数据复制到用户空间去,或者从用户空间复制到内核空 间。read()里面使用copy_to_user()就可以将内核空间的值传到用户空间去。这一点在本 实验的驱动程序的实现中起着至关重要的作用。(7) ioctl()则是对10寄存器的控制,在本实验中就要用ioctl()来实现不同的跑马 灯亮灭。2. 实验原理:UP-liP2轴】开发平3个【iPM】悴制的l.HD.和I个町白搖产乍外帑砸件中啊 的技犍 LEU 井别惶用 S3C24HySJC2440 (JPLS GPLb, GPC7 (PXA27O 的 <jPKXb GPIOI. GPIO?2)

5、三亍GPIO,按卷接判TMT3中断£卩心2和的GPIO97 >Titf10Q'fllIfU QRegilbrAdcfrwtR/用OaicrvtiQnA«t«t VilwaGPCCONQ«56000020FVWS'lgwM lhe pins of CKjrtCiQjiOgpcdatit50OOOO£-iR/Wfne dalfl reg ster fty nqrt CUhdert,GPCJPQ>i5a0G002BR/WPull-J p diMtrtr iifugaler feir pad CmoBEservod脚5000

6、00比GPC715:1400 = Input10 = LCD'LPCREVB01 = Output11 = ReservedGPC613:1200 = Input10 = LCD LPCREV01 = Output11 = Reserved11:1000 = Input10 = LCD_LPCOE01 = Output11 = Reserved3. 具体实现:(一) 中断驱动模块:该模块只需在老师给的实例的基础上加以修改就行。(1) 模块初始化函数中,请求中断处理函数:ret = request_irq(S3C2440_IRQ5, s3c2440_IRQ3_fu n, SA_INTER

7、RU PT, "S3C2440_IRQ5", NULL);中断处理函数为:s3c2440_IRQ3_fu n()在此中断处理函数中,用一个全局变量cou nt在每一次中断的时候加1,由于我们的开发板按一次会处理两次,所以计数到7的时候,必须使count恢复到1。具体实现如下:int coun t=0;irqreturn_t s3c2440_IRQ3_fu n (int irq, void *dev_id, struct pt_regs *reg)prin tk("e nter interrupt 5 !n ”);coun t+;if(co un t=7)coun

8、t=1;(2) 设备初始化:static int _init s3c2440_interrupt_in it(void)in t ret; int flags; local_irq_save(flags);/ by sprifes3c2410_g pio_cfgpin( S3C2410_G PF5, S3C2410_G PF 5_EINT5);s3c2410_g pio_pullu p(S3C2410_G PF5,1);/ endset_irq_ty pe(S3C2440_IRQ5,/*IRQT_FALLING*/IRQT_LOW); local_irq_restore(flags);ret

9、= request_irq(S3C2440_IRQ5, s3c2440_IRQ3_fu n, SA_INTERRU PT,"S3C2440_IRQ5", NULL); if (ret)printk("S3C2440_IRQ5 request_irq failure");return ret; printk(DEVICE_NAME " int05 initializedn"); return 0;3)设备退出: static void _exit s3c2440_interrupt_exit(void) free_irq(S3C2440

10、_IRQ5,NULL); printk(DEVICE_NAME " unloadedn");modulenit ()注册设备 module_exit ()卸载设备 还有 LICENSE 必须要设置:( 4)( 5)( 6)MODULE_LICENSE("GPL");本模块最需要注意的地方:因为 count 是要导出给其他模块用的,所以必须使用 EXPORT_SYMBOL_GPL(count);这就是我出错的地方之一。(二) GPIO 驱动:( 1)结构体 file_operation 的定义: struct file_operations gpio_fo

11、ps = .owner = THIS_MODULE,.open = gpio_open, .ioctl = gpio_ioctl, .read = gpio_read, .release = gpio_release,;( 2) GPIO 的模块加载部分:必须完成字符设备的注册。需要调用gpio_setup_cdev(),该函数用于字符设备的创建和注册函数。 首先要定义结构体变量:static struct cdev gpio_cdev;该函数的具体实现:static void gpio_setup_cdev(struct cdev *dev, int minor, struct file_o

12、perations *fops) int err, devno = MKDEV(major, minor); cdev_init(dev, fops);dev->owner = THIS_MODULE;dev->ops = fops;err = cdev_add(dev, devno, 1);if(err) printk(KERN_NOTICE "Error %d adding gpio %d", err, minor);( 3) int gpio_open(struct inode *inode, struct file *filp) 打开设备时,就要设置 G

13、PIO 口的电平。设置相应的 GPIO 口为输出模式。 具体代码如下:int gpio_open(struct inode *inode, struct file *filp)s3c2410_gpio_pullup(S3C2410_GPC5, 0);s3c2410_gpio_pullup(S3C2410_GPC6, 0);s3c2410_gpio_pullup(S3C2410_GPC7, 0);s3c2410_gpio_cfgpin(S3C2410_GPC5, S3C2410_GPC5_OUTP);s3c2410_gpio_cfgpin(S3C2410_GPC6, S3C2410_GPC6_O

14、UTP);s3c2410_gpio_cfgpin(S3C2410_GPC7, S3C2410_GPC7_OUTP);return 0;( 4) ssize_t s3c240_gpio_read(struct file *filp, char *buf, size_t cnt, loff_t *f_pos) 该函数要将count值传到用户空间去,在用户空间里调用ioctl()函数时就需要count值。 具体实现:ssize_t s3c240_gpio_read(struct file *filp, char *buf, size_t cnt, loff_t *f_pos) int err;if(

15、err = put_user(count, buf) < 0) return err;return cnt;则实现按 1,2,3 顺序不断亮灭。 则实现按 1,3,2 跳跃式不断亮灭。 则关闭所有 led 灯。(5)接下来就是实现跑马灯控制的ioctl() 了, 如果count为1时, 如果count为3时, 如果count为5时, 具体代码实现如下:int gpio_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) switch(count)case 1:s3c2410_

16、gpio_pullup(S3C2410_GPC5, 0);s3c2410_gpio_pullup(S3C2410_GPC6, 1); s3c2410_gpio_pullup(S3C2410_GPC7, 1);mdelay(200);s3c2410_gpio_pullup(S3C2410_GPC5, 1);s3c2410_gpio_pullup(S3C2410_GPC6, 0);s3c2410_gpio_pullup(S3C2410_GPC7, 1);mdelay(200);s3c2410_gpio_pullup(S3C2410_GPC5, 1);s3c2410_gpio_pullup(S3C2

17、410_GPC6, 1);s3c2410_gpio_pullup(S3C2410_GPC7, 0);break;case 3:s3c2410_gpio_pullup(S3C2410_GPC5, 0);s3c2410_gpio_pullup(S3C2410_GPC6, 1);s3c2410_gpio_pullup(S3C2410_GPC7, 1);mdelay(200);s3c2410_gpio_pullup(S3C2410_GPC5, 1);s3c2410_gpio_pullup(S3C2410_GPC6, 1);s3c2410_gpio_pullup(S3C2410_GPC7,0);mdel

18、ay(200);s3c2410_gpio_pullup(S3C2410_GPC5, 1);s3c2410_gpio_pullup(S3C2410_GPC6, 0);s3c2410_gpio_pullup(S3C2410_GPC7, 1);break;case 5:s3c2410_gpio_pullup(S3C2410_GPC5, 1);s3c2410_gpio_pullup(S3C2410_GPC6, 1);s3c2410_gpio_pullup(S3C2410_GPC7, 1);break;default:break;卸载模块LICENSE 设置(三) 测试代码的实现: 打开 GPIO 设备

19、若打开成功则在while(1)循环里调用read(),再调用ioctl(). 具体代码如下:#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <unistd.h>#include <sys/ioctl.h>#include <sys/mman.h> int main(void)fd=open("/dev/gpio",0_RDWR | 0_N0NBL0CK); if(fd<0)perror("open /dev/

20、gpio error!n"); exit(1);printf("open /dev/gpio sucessfully!n");while(1)read(fd, &count, 1); ioctl(fd, 0, 0);return 0;(四)两个模块的 Makefile:只需分别修改一下Targe,生成的模块名,和可执行文件就行。 2.操作过程:先 make 中断模块,生成 int.ko insmod int.ko然后 make GP10,生成 gpio.koInsmod gpio.ko然后分配一个设备号241 生成结点:(1)(2)(3)(4)(5)mkn

21、od /dev/gpio c 241 0(6)再回到 int 目录下,也生成结点。可以 lsmod /dev/XX 看是否成功安装设备驱动 交叉编译 test.c运行驱动测试程序./test按键进行测试。mknod /dev/int c 240 0(7)(8)(9)QT 计算器QT 计算器的开发环境主要是 VMware 下的编译、 xp 下的超级终端、以及 win7 下的 qt-creator 的程序的编译和调试。1. QT程序设计由于qt-creator在win7下具有调试功能,编写程序相对比较容易主要用到的软件是 qt-creator:界面如下:Qt CTHIoI-WWWrrfllQt C

22、reator!»IMjhTtortalaFl丰 qt fhtdtor LI呂L Ir/ifdKeSuUdnq jnd Rbrining n EjumplaCrearing 5 匚*十 Appic-jQonCranq a Hiibria Alpine srtionlEhptDr« Qt C+ ExbinphssDid You Know;?Itau Zin ciAbh b-atnann th« aEJtpuC psA by hUn Altin nils 巾? nhiwrJfgtM on e陆 tucwns 对 r!> wlniKniA' hr-Tt- n

23、i 1 Huld i-iiuea 2n0Ei4t3 Appleton OttpiX '* -OKpuC计算器界面设计如下:为按钮添加槽函数:在calculor.h函数中自动生成相应的函数,如下:再在 calculor.cpp 函数中为每个函数实现相应的代码功能: 对于数字按键的处理类似,如下:主要调用 trans 函数:对于符号的函数处理类似,如下:主要调用 cal 函数进行计算:清零函数:回退函数:等号的处理函数:正负号的处理函数:优点:可以实现回退、正负号逻辑处理,保留两位小数精度、可以实现混合运算(连 加、或连乘灯) 在操作的过程中有一点需要注意,是按完数字键以后再按正负号。2.

24、 虚拟机下进行编译:需要注意的是,一定要用 QtEmbeddec下进行编译,否则在开发板端将不能运行。 将可执行程序拷到 NFS 共享目录下:在 test_QT 下修改批处理程序:保存退出即可,在开发板端执行的时候就直接执行test.sh文件3. 下载到开发板上运行:首先需要对开发板进行初始化配置,即执行校准文件及其之后的一些配置, 具体见实验 九执行校准文件:«qLii +啊版 #軸5,tid 0 0 fi i I cl pt p H - V - 3 y 蛊PM圖吋蛇叭:/iinl/lift/rrolleleLybiii Med . lU: 9幽阳&§ op&am

25、p;n III lb Z04irig Pi l«: Ho such file or dirHstorvig: 1J l&gaL seekttirdf:/nil I AbFs/ rolleletrh Hcd .SHCtiLXtda,outhelloL lty»lk.cttVMftted Trollt«h/mt- (u h : /111 /iiFs/Troll 1 pcIi 枷:(& fl-rtrn/ijp-1 iich; /tJ/nfs/Trol I tech/'QtFuljedded- . 4ilexporl QTOTR=*PWD<U

26、tEmbedded-4.4.«-ar,-<Q tEubcfWed-i . 4.0-亦 tQFfHihHfk)词7 上.n dm <QtfHibfctded-( . 4 . fl-firn <4tEmbe<Med-&O-arn <Uttnb4added U urn QtfmbeHedl t.i .fl drn fOtFkibM(狂cl-&.£ .H-flrii <UtEmbedded-4-. H-arn ._LU Icch 1 /Hhl/nf 1rolHIt/(JtE*ibedded苗 MeMpur I LHNIj-zh_G

27、Huit-Iflth;/nidA J/Ti uHtocli/QLEntnnldd .4,6 atr *cd Lin iMi-UthLtecli/QtE"i>ded-i,t C-cr<hinHOCpcctsfwrueslts_j5rin1 ruv uicanakcts_cjlibrflte arintts_:c£lI tp tcf h /«(! J/hf's/Trrtl 1 trrN/Qtr*b«ldrf1 4.(. fl iw »/bi n fl . /ts_riil ibmtcHexport Mexuort +1eKL,o

28、rt Hexport Hexpart Hexuort He禅Orf NfrKr>t>rt N&KriortLO_L1M? P(UH斗冉f"ib ISLie_ISDLVICL /deu/evwilO TF rB_PLLICTND R- tPHfl/li h/ ts Ta iB-ciMsni faFvicf-nijip ISLIB cum ILt-tPWU/etc/ls .conF POlHlFBUflL FILE tPMU/ttc/li; calib.conf OHS HOUSE Pfioro hdib:/tJcv/cuentO TaTft CflL TKf IlF

29、-tPtfh/fitc/ts-calib.cDrf Ur_UHSl-aNlUlH-tkkU/lih/l ontsCoublnt lead wodiilf i>thrzHo r齐 Rodiiles lodd&tS_C«hl itf. SUCMESiJ3-mth'7ii:ir!WmF&/lroJ Uc<J:Jitbrg卅ded-百 t.6=«H-a/bni ll_urtcchi/itntZhfs 一 一 ij|)-terh/pnt/nfs/Trolltech #lsHJP 喩鬲 至w«incL j鼻最后执行批处理程序:六、实验数据及

30、处理结果见实验步骤七、思考讨论题或体会或对改进实验的建议本次实验经过反复进行, 最终还是有收获的, 从一开始什么都不懂, 到最后掌握了设备 驱动程序的结构,以及实现过程中一些要注意的问题。我们搜索了大量资料,并且通过同学的帮助,了解了许多额外的但必须要用到的知识: 【1. extern :引用其他文件里的变量必须使用。2. put_user(),get_user() copy_to_user() copy_from_user()在内核空间和用户空间交换数据时, get_user 和 put_user 是两个两用的函数。相对于 copy_to_user和copy_from_user将在另一篇文中

31、分析),这两个函数主要用于完成一些 简单类型变量 (char、int、long 等)的拷贝任务,对于一些复合类型的变量,比如数据结 构或者数组类型,get_user和put_user函数还是无法胜任 ,这两个函数内部将对指针指向的对象长度进行检查,在 arm 平台上只支持长度为 1, 2, 4, 8 的变量。copy_to_user - Copy a block of data into user space. copy_from_user - Copy a block of data from user space. get_user - Get a simple variable from user space. put_user - Write a simpl

温馨提示

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

评论

0/150

提交评论