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

下载本文档

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

文档简介

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

2、1. QT程序设计 10 2. 虚拟机下进行编译: 15 3. 下载到开发板上运行: 17 六、实验数据及处理结果 18 七、思考讨论题或体会或对改进实验的建议 18 八、参考资料: 19 、小组成员分工 分工: 鲁飞:QT设计与设计报告 卢惠民:QT设计与设计报告 戚成琳:驱动与设计报告 慕一聪、刘备:设计报告 、实验任务 1编写基于UP-CUP2440硬件平台的GPIO驱动程序 必选功能:使中断按键按下后,开发板上的LED灯能作如下闪动: a) 连续性闪动,跑马灯:如:1-2-3-1-2-3或3-2-1-3-2-1 b) 间隔性闪动:如: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说明

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

5、 3个GPIO 制的LED.和1个可曲搂产生外酒碇件申師 的在:建.LED 别悭用 S3C241U/SJC244O 的 GPLS,1卍(_乩 GPC7 (PXA270 的 LiPKXb GP1CH. GPIO?; 三牛 GPIO,披德接判 TNT3 中勘(PXA27O 的 GPJO97 Rcgntor Adckwi KW Dmc rip lion GPCCOM 3x56000020 FVW Si艸莎 理口鸠of port C QnO GPCDAT 2x56000024 R/W Tne da reg ster for mrt C Undef, GROUP Dx5a0000?8 R/W Pulkj

6、p diMUM rHgilfif ifaf pod C 00 Reserved 3i50OOM2t GPC7 15;14 00 = Input01 = Output 10 = LCDLPCREVB 11 = Reserved GPC6 13:12 00 = Input01 Output 10 = LCD LPCREV11 = Reserved 11:10 00 = Input01 = Output 10 = LCDLPCOE11 = Reserved 3具体实现: (一) 中断驱动模块: 该模块只需在老师给的实例的基础上加以修改就行。 (1) 模块初始化函数中,请求中断处理函数: ret =

7、request_irq(S3C2440_IRQ5, s3c2440_IRQ3_fu n, SA_INTERRUPT, 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 in

8、 terrupt 5 !n ”); coun t+; if(co un t=7) coun t=1; (2) 设备初始化: static int _init s3c2440_in terrupt_i nit(void) in t ret; int flags; localrq_save(flags); / by sprife s3c2410_gpio_cfgpi n( S3C2410_GPF5, S3C2410_GPF5_EINT5); s3c2410_gpio_pullup(S3C2410_GPF5,1); / end set_irq_type(S3C2440_IRQ5,/*IRQT_FAL

9、LING*/IRQT_LOW); localrq_restore(flags); ret = request_irq(S3C2440_IRQ5, s3c2440_IRQ3_fu n, SA_INTERRUPT, S3C2440_IRQ5, NULL); if (ret) printk(S3C2440_IRQ5 request_irq failure); return ret; printk(DEVICE_NAME int05initializedn); return 0; (3) 设备退出: static void _exit s3c2440_interrupt_exit(void) free

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

11、wner = 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) 打开设备时,就要设置 GPIO 口的电平。 设置相应的

13、 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_OUTP); s3

14、c2410_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(err

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

16、(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(S3C2410

17、_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,

18、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(S3C2410_GPC5, 1); s3c2410_gpio_pullup(S3C2410_GPC6, 1); s3c2410_gpio_pullup(S3C2410_GPC7, 1); break; default: break; (6) 卸载模块 ( 7) LIC

19、ENSE 设置 (三) 测试代码的实现: 打开 GPIO 设备 若打开成功则在while(1)循环里调用read(),再调用ioctl(). 具体代码如下: #include #include #include #include #include #include int main(void) fd=open(/dev/gpio,O_RDWR | O_NONBLOCK); if(fd-tech:/iRM/nfs *cd Trolltech/ up-tech: Znnt/nfs/Troil tech- *ls up- tccti: /imt/nfs/Trolltech Ned Qtfvt)9dd

20、ed-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 075 0 IF KihHk)fd (.44) .-ir QtFmhftrkieii-4,4 fl rm 011 tibedled-i . 4 . H am KQlEtilMMtd XA.U 时 kQlBnbfldilcd D I an QtEinbedded-t. fl-arn Ottinbdkd-i-.li-arM ._ tv)-

21、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 hocrccts_haruesitE.print.raw uic tiiidkeis_calibrate ts_printis_tesl up-tech:/pnt/hf /Trnl 1 trrli/Qtrubfrddrd-i 4 .e-or/bin It. /ts_calibrnic Cbuldnt load nodule pthrts th rd les loaded Is_cchli9 Sikcsjs uo Ltiih: Fwit/nfs/Troll icch/tEiibHklc:(i4, 设置相应 GPIO 口的输出值,例如: pin=S3C2410_GPG2, to=0,则设置 S3C2410_GPG2 的输出值为 0; pin=S3C2410_GPG2, to=1,则设置 S3C2410_GPG2 的输出值为 1。 (2) unsigne

温馨提示

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

评论

0/150

提交评论