《嵌入式Linux应用程序开发实验报告期末作业》由会员分享,可在线阅读,更多相关《嵌入式Linux应用程序开发实验报告期末作业(21页珍藏版)》请在金锄头文库上搜索。
1、软件学院大作业设计报告课程名称:嵌入式Linux应用程序开发题目:基于UP-CUP2440平台的驱动程序开发和QT程序开发专业:计算机软件班级:计算机软件111班姓名学号鲁飞 8000611038卢惠民 8000611021戚成林 8000611032慕一聪 8000611018刘备 8000611006任课教师:李岚职称:副教授完成时间:2014年6月11日小组成员分工二、实验任务三、主要仪器设备及耗材四、实验步骤、驱动1. 基本知识:2. 实验原理:3. 具体实现:二、QT计算器1.QT程序设计102虚拟机下进行编译:153 下载到开发板上运行:17六、实验数据及处理结果18七、思考讨论题
2、或体会或对改进实验的建议18八、参考资料:19#、小组成员分工分工:鲁飞: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, Wind
3、ows Xp , H-JTAG,H-Flasher、DNW,开发实验箱。四、实验步骤=驱动思路:前后台思想:在中断模块中设置一个计数的变量,每一次中断计数器加一。然后在GP10驱动模块的ioctIO函数中分情况使跑马灯按要求闪动或熄灭。#1 基本知识:设备驱动程序可以使用模块的方式动态加载到内核中去。模块的必需组成部分:模块加载函数,insmod时调用。模块卸载函数,rmmod时调用模块许可证LICENSE说明(3) 数据结构file_operation中定义驱动程序会使用的函数。(4) 肚萍徨了么结令丽的谄名县步云,廡怖亜辐汗注聊才能記丽得名&和販刊親當步 间的矢联。(5) 打开设备和释放设
4、备,没什么要特别注意的。(6) 读写设备:把内核空间的数据复制到用户空间去,或者从用户空间复制到内核空间。read()里面使用copy_to_user()就可以将内核空间的值传到用户空间去。这一点在本 实验的驱动程序 的实现中起着至矢重要的作用。(7) ioctl()则是对10寄存器的控制,在本实验中就要用ioctl()来实现不同的跑马灯亮灭。2实验原理:UP- liP2轴】开发平3个【iPM】悴制的1HD和I个町白搖产乍外帑砸件中啊的技犍LEU井别惶用S3C24HySJC2440 (JPLS GPLb, GPC7 (PXA27O 的 Titf10CPC51KCPChKMXADbgLtirQ*
5、fll IfUQ03IKRegilbrAdcfrwtR/iOaicrvtiQ nAtt VilwaGPCCONQ56000020FVW $SlgwM lhe pins of CKjrtCiQjiOGPCDATit500000-iR/W fne dalfl reg ster fty nqrt CUhdert,GPCJPQi5a0G002BR/W F3ull-J p diMtrtr iifugaler feir pad CmoBEservod脚500000比GPC715:1400 = Input01 = Output10 = LCD1PCREVB 11 = ReservedGPC613:1200
6、= Input01 = Output10 = LCD LPCREV11 = Reserved11:1000 = Input01 = Output10 = LCDLPCOE11 = Reserved3 具体实现:()中断驱动模块:该模块只需在老师给的实例的基础上加以修改就行。(1) 模块初始化函数中,请求中断处理函数:ret = requestJrq(S3C2440_IRQ5, s3c2440_lRQ3_fu n, SA INTERRU PT, ,S3C2440_IRQ5n, NULL);中断处理函数为:s3c2440_IRQ3_fu n()在此中断处理函数中,用一个全局变量COU nt在每一次
7、中断的时候加1,由于我们的开发板按一次会处理两次,所以计数到7的时候,必须使count恢复到1。具体实现如下:int coun t=0;irqreturn_t s3c2440_lRQ3_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 t=1;(2) 设备初始化:static int _init s3c2440_interrupt_in it(void)in t ret; int flags; local_irq_save(fl
8、ags);/ by sprites3c2410_g pio_cfgpin( S3C2410_G PF5, S3C2410_G PF 5_EINT5);s3c2410_g pio_pullu p(S3C2410_G PF5,1);/ endsetjrqy pe(S3C2440RQ5/IRQT_FALLING*/IRQT_LOW);localrq_resto re (flags);ret = request_irq(S3C2440_IRQ5, s3c2440_IRQ3_fu n, SA INTERRU PT,#,S3C2440JRQ5n, NULL); if (ret)printk(”S3C244
9、0_JRQ5 requestjrq failure); return ret;)printk(DEVICE_NAME ” int05 initialized); return 0;3)设备退出:static void _exit s3c2440_interrupt_exit(void) (freeJrq(S3C2440JRQ5,NULL); printk(DEVICE_NAME ” unloaded”); modulenit ()注册设备module_exit()卸载设备还有LICENSE必须要设置:(4)(5)(6)MODULE_LICENSE(”GPL“);本模块最需要注意的地方:因为co
10、unt是要导出给其他模块用的,所以必须使用EXPORT_SYMBOL_GPL(count);这就是我出错的地方之一。(二)GPIO 驱动:(1) 结构体 file_operation 的定义:struct file_operations gpio_fops = ,owne7= THIS_MODULE,-.open = gpio_open, .ioctl = gpiojoctl, .read = gpio_read, .release = gpio_release, ; (2) GPIO的模块加载部分:必须完成字符设备的注册。需要调用gpio_setup_cdev(),该函数用于字符设备的创建和
11、注册函数。首先要定义结构体变量: static struct cdev gpio_cdev;该函数的具体实现:static void gpio_setup_cdev(struct cdev *dev, int minor, struct file_operations *fops) int err, devno = MKDEV(major, min or); cdevj nit(dev, fops); dev-owner = THISMODULE;#dev-ops = fops;err = cdev_add(dev, devno, 1);if(err) printk(KERN_NOTICE E
12、rror %d adding gpio %d, err, minor); _(3) int gpio_open(struct inode *inode, struct file *filp)打开设备时,就要设置 GPIO 口的电平。 设置相应的GPIO 口为输出模式。具体代码如下:int gpio_open(struct inode *inode, struct file *filp) _s3c2410_gpio_pullup(S3C2410_GPC5, 0);s3c2410_gpio_pullup(S3C2410_GPC6, 0);s3c2410gpiopullup(S3C2410GPC7,
13、 0);s3c2410_gpio_cfgpin(S3C2410_GPC5, S3C2410_GPC5_OUTP);s3c2410_gpio_cfgpin(S3C2410_GPC6, S3C2410_GPC6_OUTP);s3c2410_gpio_cfgpin(S3C2410_GPC7, S3C2410_GPC7_OUTP);return 0;(4) ssize_t s3c240_gpio_read(struct file *filp, char *buf, size_t ent, loff_t *f_pos)该函数要将 count值传到用户空间去,在用户空间里调用ioctl()函数时就需要co
14、unt值。具体实现:ssize_t s3c240_gpio_read(struct file *filp, char *buf, size_t cnt, loff_t *f_pos)(int err;if(err = put_user(count, buf) 0) return err;return ent;(5)接下来就是实现跑马灯控制的ioctl() T,则实现按1,2,3顺序不断亮灭。则实现如果count为1时, 按1,3,2跳跃式不断亮灭。则矢闭所有如果count为3时,led灯。如果count为5时,具体代码实现如下:int gpio_ioctl(struct inode *inode, struct file *file, unsigned int emd, unsigned long arg)switch(count)case 1:s3c2410_gpio_pullup(S3C2410_GPC5, 0);s3c2410_gpio_pullup(S3C2410_GPC6, 1);s3c2410_gpio_pullup(