当前位置:文档之家› Linux期末大作业(第4组)

Linux期末大作业(第4组)

嵌入式Linux大作业学院:软件学院专业班级:计算机软件111 班姓名-学号:刘可—8000611008王青叶—8000611039王飞林—8000611022李洪成—8000611001韩金辰—8000611003指导老师:李岚设计地点:图书馆406设计题目:驱动程序设计和QT程序设计目录1.驱动程序设计 (4)1.1驱动功能实现 (4)1.2按键中断驱动 (4)1.2.1驱动程序编写 (4)1.2.2驱动程序编译 (4)1.3 GPIO驱动程序 (5)1.3.1驱动程序编写 (5)1.3.2 驱动程序编译 (7)1.4数码管驱动 (7)1.5 测试程序 (7)1.6 驱动安装 (10)1.7 实验结果展示 (10)2. QT程序设计 (14)2.1 QT环境搭建 (14)2.2 QT/E环境(开发板)搭建 (15)2.3 QT应用程序实例 (23)2.3.1计算器 (23)2.3.2电话簿 (27)2.3.3 图片浏览器 (32)3.遇到主要问题与解决: (36)4. 实验总结: (42)组员分工安排一、成员介绍组长:刘可组员:王青叶、王飞林、李洪成、韩金辰二、分工安排刘可:GPIO驱动程序编写、测试程序编写王青叶:Qt环境搭建、计算器程序王飞林:简单图片浏览器程序李洪成:简单电话簿程序韩金辰:资料搜集和实验报告书写1.驱动程序设计1.1驱动功能实现按键按第一下,LED灯以1,2,3进行闪烁;按键按第二下,LED 灯以1,3,2进行闪烁;按键按第三下,LED灯全部熄灭;同时,数码管中记录按键按下的次数。

1.2按键中断驱动1.2.1驱动程序编写在该驱动程序中声明变量count,我们会用count值记录按键的点击次数;使用EXPORT_SYMBOL_GPL(count);以供其他驱动程序调用。

重要函数如下:irqreturn_t s3c2440_IRQ3_fun (int irq, void *dev_id, struct pt_regs *reg){disable_irq(S3C2440_IRQ5);printk("interrupt int05\n");mdelay(200);++flag_count;if(flag_count == 2){++count;flag_count = 0;//if(count > 2) count = 0;}printk("count = %d\n", count);enable_irq(S3C2440_IRQ5);}在中断服务程序中实现的是count值的累计。

1.2.2驱动程序编译make之后,将Module.symvers中的count路径修改为../11_int/s3c2440-int拷贝到10_led目录中。

1.3 GPIO驱动程序1.3.1驱动程序编写该驱动程序实现led灯的点亮和关闭。

实现三种状态的led灯:按1,2,3进行闪烁、按1,3,2进行闪烁以及led灯的熄灭。

重要函数如下:int s3c2440_gpio_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg){switch(count % 3){case 0:led_close();break;case 1:run_led();break;case 2:jump_led();break;default:break;}return 0;}该函数中led_close()实现led灯的关闭,run_led()实现led灯1、2、3跑马,jump_led()实现led灯1,3,2跑马。

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;}该函数通过put_user()函数将count的值放到用户空间的缓存中,在测试程序中我们会将count的值送入数码管进行显示。

count 的定义来自按键中断驱动,它记录的是按键按下的次数。

1.3.2 驱动程序编译编译之前要确定Module.symvers中是否指定了count的值,如果没有则将11_int中的Module.symvers拷贝过来。

1.4数码管驱动我们使用例程中的数码管驱动,无需做出更改。

1.5 测试程序在main()函数中创建两个线程,其中一个线程实现led灯闪烁,另一个线程实现数码管的显示。

res = pthread_create(&pthread_1, NULL, thrd_gpio, (void*)1);…….res = pthread_create(&pthread_2, NULL, thrd_led, (void*)2);void *thrd_gpio(void *arg){int fd=open(GPIO_DEVICE_FILENAME,O_RDWR | O_NONBLOCK);if (fd < 0) {printf("####GPIO device open fail####\n");return (-1);}while(1){ioctl(fd, 0, 0);read(fd, &count, 1);}close(fd);pthread_exit(NULL);}while(1)循环中的ioctl实现led灯状态的更新和保持,read获取驱动中的count计数值。

另一个线程如下void *thrd_led(void *arg){int i, j;int fd;fd=open("/dev/s3c2440_led0",O_RDWR);if (fd < 0) {printf("####Led device open fail####\n");return (-1);}LEDWORD=0xff00;printf("will enter TUBE LED ,please waiting .............. \n");LEDWORD=0xff00;ioctl(fd,0x12,LEDWORD);i = 0;while(1){if(count == 0){LEDWORD = (LEDCODE[0] << 8) | LEDCODE[0];ioctl(fd, 0x12, LEDWORD);jmdelay(100);}else{LEDWORD = (LEDCODE[count / 10] << 8) | LEDCODE[count % 10];ioctl(fd, 0x12, LEDWORD);jmdelay(100);}}close(fd);pthread_exit(NULL);}在该线程中做数码管的初始化,初始状态显示00。

while(1)中根据count的值使用ioctl更新数码管中显示的值。

1.6 驱动安装(1)首先安装11_int中的s3c2440-int.ko(2)安装08_led中driver目录下的数码管驱动(3)安装10_led目录中的gpio驱动:手动创建设备节点241(4)运行10_led目录下的led_test.c程序1.7 实验结果展示第一次按下按键(按下次数除3取余结果为1的情况均适合)第二次按下按键(按下次数除3取余结果为2的情况均适合)第三次按下按键(按下次数除3取余结果为0的情况均适合)2. QT程序设计2.1 QT环境搭建(1)在目录/opt/uptech/下,建立目录QT4,在其下再建立目录for_x11/ 将QT-X11 压缩包(/UP-CUP2440/SRC/gui/目录下)拷贝到新建立的目录下并解压.这样在实验目录的for_x11下产生解压后的qt-x11-opensource-src-4.4.0目录.所有QT-X11 环境源码都存放在此。

注意:目录/opt/uptech/QT4/for_x11/须先行生成.(2)进入qt-x11-opensource-src-4.4.0 目录执行configure 文件,配置QT-X11 环境(3)编译QT-X11 库由于QT 库环境的庞大体积,编译QT-X11 库环境时间比较长,具体时间因机器配置而异(大约1 个小时左右,我此次编译用了75分钟)(4)安装QT-X11 库此时便会在/usr/local/目录下产生Trolltech/Qt-x11-4.4.0 目录(5)进入目录examples/widgets/wiggly/(6)看到下面的窗口,则表示QT-X11 环境搭好了。

2.2 QT/E环境(开发板)搭建使用QTE 生成能在开发板上运行的GUI 程序.(1)在/opt/uptech/QT4/下建立目录for_arm(2)编译tslib1.4 触摸屏库,让我们的QT/Embedded 环境支持触摸屏输入设备a)将tslib1.4 压缩包(/UP-CUP2440/SRC/gui/目录下)解压至新建立的实验目录b) 配置编译tslib1.4 触摸屏库c) 使用build.sh 编译tslib 库在上一级目录中生成tslib1.4-install触摸屏所使用环境都存放在tslib1.4-install 的目录下,后面会用到。

(3)编译QT/Embedded 环境a) 将QT/Embedded 压缩包(/UP-CUP2440/SRC/gui/目录下)拷贝到新建立的目录下并解压b) 进入目录c)执行configured) 执行makee)执行make install此时便会在/usr/local/目录下产生Trolltech/ Qt-embedded-4.4.0 目录。

(4) 测试触摸屏及QT/E 程序a) 在NFS 共享目录/UP-CUP2440/下建立Trolltech 目录,建好后可使用如下方法查看b)C)d) ARM 端挂载NFS 共享目录启动UP-CUP2440 实验系统,连好网线、串口线。

通过串口终端挂载宿主机实验目录。

e) 设置ARM 端环境变量f)输入命令g)用手触摸屏幕,可在超级终端中看到如下输出h) 进入QT/Embedded 实验NFS 共享目录Trolltech 中,在此目录中设置ARM 端环境变量.I)更改ts.conf 配置文件(在NFS 共享目录的Qt-embedded-4.4.0/etc 目录下),或者在宿主机端/UP-CUP2440/Trolltech/Qt-embedded-4.4.0/etc 目录下更改。

相关主题