ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:53.20KB ,
资源ID:6783680      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6783680.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(嵌入式Linux应用程序开发实验报告期末作业.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

嵌入式Linux应用程序开发实验报告期末作业.docx

1、嵌入式Linux应用程序开发实验报告期末作业软件学院大作业设计报告课程名称: 嵌入式Linux应用程丿予开发题目: 基于UP-CUP2440平台的驱动程序开发和 QT程序开发专业: 计算机软件班级: 计算机软件111班姓名学号:鲁 飞8000611038卢惠民 8000611021戚成林 8000611032慕一聪 8000611018刘备 8000611006任课教师: 李岚 职称: 副教授 完成时间: 2014年6月11日 一、小组成员分工 3二、实验任务 3三、主要仪器设备及耗材 3四、实验步骤 3一、驱动 31. 基本知识: 42. 实验原理: 43. 具体实现: 5二、QT计算器 9

2、1.QT程序设计 102.虚拟机下进行编译: 153. 下载到开发板上运行: 17六、实验数据及处理结果 18七、思考讨论题或体会或对改进实验的建议 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进阶功能:改变中断按键的控制功能,使中断按

3、键按下后, LED灯不断闪亮,再次按下后,LED灯灭。2.QT计算器三、主要仪器设备及耗材PC,Windows Xp,H-JTAG,H-Flasher,DNW,开发实验箱。四、实验步骤一、驱动思路:前后台思想:在中断模块中设置一个计数的变量,每一次中断计数器加一。然后在GPIO驱动模块的ioctl()函数中分情况使跑马灯按要求闪动或熄灭1.基本知识:(1)设备驱动程序可以使用模块的方式动态加载到内核中去。(2)模块的必需组成部分:模块加载函数,insmod时调用。模块卸载函数,rmmod时调用模块许可证LICENSE说明(3) 数据结构file_operation 中定义驱动程序会使用的函数。

4、(4)在获得了系统分配的设备号之后,必须要通过注册才能实现设备号和驱动程序之 间的关联。(5)打开设备和释放设备,没什么要特别注意的。(6)读写设备:把内核空间的数据复制到用户空间去,或者从用户空间复制到内核空 间。read()里面使用copy_to_user()就可以将内核空间的值传到用户空间去。这一点在本 实验的驱动程序的实现中起着至关重要的作用。(7) ioctl()则是对IO寄存器的控制,在本实验中就要用ioctl()来实现不同的跑马 灯亮灭。2.实验原理:UP-CUP244O幵熒平含茂置了 3个GPIO 制的LED.和1个可曲搂产生外酒碇件申師 的在:建.LED 别悭用 S3C241

5、U/SJC244O 的 GPLS,1卍(_乩 GPC7 (PXA270 的 LiPKXb GP1CH. GPIO?; 三牛 GPIO,披德接判 TNT3 中勘(PXA27O 的 GPJO97 RcgntorAdckwiKWDmc rip lionGPCCOM3x56000020FVWSi艸莎 理口鸠of port CQnOGPCDAT2x56000024R/WTne da reg ster for mrt CUndef,GROUPDx5a0000?8R/WPulkjp diMUM rHgilfif ifaf pod C00Reserved3i50OOM2tGPC715;1400 = Input

6、 01 = Output10 = LCDLPCREVB 11 = ReservedGPC613:1200 = Input 01 Output10 = LCD LPCREV 11 = Reserved11:1000 = Input 01 = Output10 = LCDLPCOE 11 = Reserved3具体实现:(1)中断驱动模块:该模块只需在老师给的实例的基础上加以修改就行。(1)模块初始化函数中,请求中断处理函数:ret = request_irq(S3C2440_IRQ5, s3c2440_IRQ3_fu n, SA_INTERRUPT, S3C2440_IRQ5, NULL);中断

7、处理函数为: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 in terrupt 5 !n ”);coun t+;if(co un t=7)coun t=1;(2)设备初始化:static int _init s3c2440_in ter

8、rupt_i nit(void)in t ret;int flags;localrq_save(flags);/ by sprifes3c2410_gpio_cfgpi n( S3C2410_GPF5, S3C2410_GPF5_EINT5); s3c2410_gpio_pullup(S3C2410_GPF5,1);/ endset_irq_type(S3C2440_IRQ5,/*IRQT_FALLING*/IRQT_LOW);localrq_restore(flags);ret = request_irq(S3C2440_IRQ5, s3c2440_IRQ3_fu n, SA_INTERRU

9、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_IRQ5,NULL);printk(DEVICE_NAME unloadedn);(4)modulenit ()注册设备(5)module_exit ()卸载设备( 6)还有 LICEN

10、SE 必须要设置:MODULE_LICENSE(GPL);本模块最需要注意的地方:因为 count 是要导出给其他模块用的,所以必须使用 EXPORT_SYMBOL_GPL(count);这就是我出错的地方之一。(2)GPIO 驱动:( 1)结构体 file_operation 的定义:struct file_operations gpio_fops = .owner = THIS_MODULE,.open = gpio_open,.ioctl = gpio_ioctl,.read = gpio_read,.release = gpio_release,;( 2) GPIO 的模块加载部分:必

11、须完成字符设备的注册。需要调用gpio_setup_cdev(),该函数用于字符设备的创建和注册函数。 首先要定义结构体变量:static struct cdev gpio_cdev;该函数的具体实现:static void gpio_setup_cdev(struct cdev *dev, int minor, struct file_operations *fops) int err, devno = MKDEV(major, minor); cdev_init(dev, fops);dev-owner = THIS_MODULE;dev-ops = fops;err = cdev_add

12、(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) 打开设备时,就要设置 GPIO 口的电平。 设置相应的 GPIO 口为输出模式。具体代码如下: int gpio_open(struct inode *inode, struct file *filp) s3c2410_gpio_pullup(S3C2410_GPC5, 0); s3c2410_gpio_pullup(S3

13、C2410_GPC6, 0); s3c2410_gpio_pullup(S3C2410_GPC7, 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 cnt, loff

14、_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(err = put_user(count, buf) 0) return err;return cnt;(5)接下来就是实现跑马灯控制的ioctl() 了, 如果count为1时,则实现按1,2,3顺序不断亮灭。 如果count为3时,则实现按1,3,2跳跃式不断亮灭。 如果count为

15、5时,则关闭所有led灯。具体代码实现如下:int gpio_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) switch(count)case 1: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);s3c2

16、410_gpio_pullup(S3C2410_GPC6, 0);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); break;case 3:s3c2410_gpio_pullup(S3C2410_GPC5, 0);s3c2410_gpio_pullup(S3C2410_GPC6, 1);s3c2410_gpio_pullu

17、p(S3C2410_GPC7, 1); mdelay(200);s3c2410_gpio_pullup(S3C2410_GPC5, 1);s3c2410_gpio_pullup(S3C2410_GPC6, 1);s3c2410_gpio_pullup(S3C2410_GPC7,0); mdelay(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(

18、S3C2410_GPC5, 1);s3c2410_gpio_pullup(S3C2410_GPC6, 1);s3c2410_gpio_pullup(S3C2410_GPC7, 1); break;default:break;(6)卸载模块( 7) LICENSE 设置(3)测试代码的实现: 打开 GPIO 设备若打开成功则在while(1)循环里调用read(),再调用ioctl(). 具体代码如下:#include #include #include #include #include #include int main(void) fd=open(/dev/gpio,O_RDWR | O_

19、NONBLOCK);if(fd-tech:/iRM/nfs *cd Trolltech/ up-tech: Znnt/nfs/Troil tech- *lsup- tccti: /imt/nfs/Trolltech Ned Qtfvt)9dded-fi 6 R-jri/tn-tach: /nt/nf5/TrQll tech/fltFubedded-* . k . fl-ar Rxpfjri QTDIR=宇PHD QttmbEWed-4.i.ti-flrB _ y ttmljeikkjti-4 . L 0750 IF KihHk)fd (.44) .-ir QtFmhftrkieii-4,4 f

20、l rm 011 tibedled-i . 4 . H am KQlEtilMMtd XA.U 时 kQlBnbfldilcd D I an QtEinbedded-t. fl-arn Ottinbdkd-i-.li-arM . _tv)-ech:/Hnt/nF/lrDlltedi/D Ltabedded-4.4.0-drn tteMpori LAHG*zh_CN kV-tedi:/Hit/nfs/TrdLtach/f|tEMbldad-t.e stm Bed bin wich:/*irt/nf/Trollt9ch/fltE*iwlded-4 t -flr/bin ls hoc rcc ts_

21、haruesi tE.print.raw uictiiidke is_calibrate ts_print is_teslup-tech:/pnt/hf /Trnl 1 trrli/Qtrubfrddrd-i 4 .e-or/bin It. /ts_calibrnic Cbuldnt load nodule pthrts th rd les loadedIs_cchli9 Sikcsjsuo Ltiih: Fwit/nfs/Troll icch/tEiibHklc:(i4,&. 0-arFbin H_H export 盹叩ort Mexgrt H export Hexport HexporI

22、Hoxport Htj-xhor t HexuortLil LIBftm PRTH=tPHD/lib TSLIB-I SDEVICE=/deu/ewnW TSI TR_PI JCTNUFR- (PWD/lib/ts 1SI IE CONSO. FDI VTCF-ntnp 1SL1B CUWFlLE-tPHD/eWix conf POINiTERCRL FlLE=*PWD/tc/ts-callb. conf QMS MOUSE PftOTO=tslib:/dcv/cventD TUB CftLlBFlLE=tPWD/etc/ts-caIib.ccnf 01 QUS FONT DIM CPHD/l

23、ih/F)tsI ?! |UW ireoi- fl-K LrrTMtrdQixi. Lfa 馨如 M Kik IbA| *4-Sift啊定 a ?电总最后执行批处理程序:六、实验数据及处理结果见实验步骤七、思考讨论题或体会或对改进实验的建议本次实验经过反复进行, 最终还是有收获的, 从一开始什么都不懂, 到最后掌握了设备 驱动程序的结构,以及实现过程中一些要注意的问题。我们搜索了大量资料,并且通过同学的帮助,了解了许多额外的但必须要用到的知识:【1.extern :引用其他文件里的变量必须使用。2.put_user(),get_user()copy_to_user()copy_from_use

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

25、m_user - Copy a block of data from user space. get_user - Get a simple variable from user space. put_user - Write a simple value into user space.3.系列函数的定义在 arch/arm/mach-s3c2410/gpio.c, 相关的宏定义在 include/asm-arm/arch-s3c2410/regs-gpio.h(1)void s3c2410_gpio_setpin(unsigned int pin, unsigned int to);设置相

26、应 GPIO 口的输出值,例如:pin=S3C2410_GPG2, to=0,则设置 S3C2410_GPG2 的输出值为 0; pin=S3C2410_GPG2, to=1,则设置 S3C2410_GPG2 的输出值为 1。(2)unsigned int s3c2410_gpio_getpin(unsigned int pin);获取相应 GPIO 口的值。3)void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function);设置相应 GPIO 口的工作模式,输入、输出、中断等。( 4) unsigned int s3c2410_gpio_ge

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1