Linux期末大作业(第4组)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
嵌入式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);