
linux 触摸屏.doc
12页linuxlinux 触摸屏触摸屏电容触摸屏2011-01-14 15:361.Kconfig 文件增加宏定义2.Makefile 文件增加编译处理3.添加程序源码Touch screen remote control design document2010 年 11 月 08 日 星期一 13:08Touch screen remote control design document1. 开发板环境a) Mini2440 开发板Arm9 处理器+64M SRAM + 64M Flash +3.5’ 触摸屏 LCDb) Linux 2.6.32 kernel,支持多点触摸触摸屏+Qtopia 2.2.20 图形用户界面系统c) AVR 单片机+加速度传感器+红外一体化接收头+红外发射二极管2. 主机开发环境a) Vmware 6.0 安装 Fedora 10 系统,按照友善之臂 mini2440 使用手册来建立开发环境最好在安装 fedora 10 的过程中将所有的可选项全部安装,以免后续开发过程中遇到不可预知的问题Fedora 10 默认不能以 root 用户登陆图形用户界面,需要以普通用户登陆之后在命令终端中 su 切换到 root 用户,然后修改文件/etc/pam.d/gdm。
将 auth required pam_succeed_if.so user != root quiet 这句注销b) 按照友善之臂用户手册建立交叉开发环境安装 arm-linux-gcc4.3.2,arm-qtopia, x86-qtopia, root-qtopia, linux-2.6.32-friendlyarm 到系统中安装的过程中有一个问题是,不能够同时编译 arm-qtopia 和 x86-qtopia,如果这样做,会发生不可预知的错误典型问题是 qt2 的 designer 打开后是透明的,无法操作c) 遥控器解码目前采用 FPGA 平台来完成的,所以主机具有 FPGA 开发环境(quartus 9.0)d) 红外发射与加速度传感器的手势操作室通过 AVR 单片机完成的,所以主机具有 AVR 单片机开发环境(Keil 4)3. 图形界面编码a) Arm-qtopia 文件夹中安装了 qt2,在 qt2 的 bin 目录下执行 designer 就可以进入 qt 的图形开发界面你可以图形化的创建自己的 UI,可以直接建立各个控件之间或者控件与主窗口之间的信号与槽的链接一般而言,做 QT 界面的嵌入式开发,都会涉及到几个基本的问题,那就是 类的继承、虚函数、构造函数的重载。
通过designer 设计的界面保存后会生成相应的源文件,这些文件用户编辑是无效的,因为重新生成后所有用户的更改都会消失 所以最有效的方式是用户通过继承主窗口类,然后在子类中通过虚函数来实现与父类函数的交互调用代码编写完毕后,需要设置当前的环境变量(调用友善已经提供的适用于 arm 平台的脚本就可以) ,编写工程文件 *.pro ,编写快捷方式 *.desktop最后编译生成 arm 平台的可执行文件,查看 Makefile 的 DESTDIR 和 TARGET 可以知道目标文件被生成在哪里 同时通过 file 命令查看文件类型将可执行文件拷贝到开发板的/opt/Qtopia/bin 目录下,将 *.desktop 拷贝到开发板的/opt/Qtopia/apps/Applications 就可以在开发板的Applications 目录下看到相应的文件快捷方式附录一阐明 .pro文件格式与 .desktop 文件格式b) X86-qtopia 是嵌入式界面的 PC 模拟平台,利用 qvfb 来模拟arm 平台上的 qtopia 系统开发过程就是普通的 qt 开发,利用 qt2的 designer 来做界面或者自己手写代码。
同样编写 pro 文件与 desktop 文件,设置环境变量(X86 平台的脚本) ,编译生成 x86 平台的可执行文件,拷贝至 Qtopia 安装目录下的 image/opt/Qtopia/bin 将 desktop 文件拷贝至 Qtopia 安装目录下的 image/opt/Qtopia/apps/Applications 目录下,然后回到 x86-qtopia 的根目录,执行脚本 run 就可以利用 qvfb 启动模拟器主要是为了方便开发软件而做了这样一个 pc 的模拟c) 遥控器的界面 V1.0 采用的是 qt designer 设计,可以给控件加载不同的背景效果来美化界面遥控器的基本功能实现,但是由于qt designer 的控件相对较少,对于嵌入式开发平台能够使用的控件就更加不足,所以 v1.0 界面比较死板,button 都是矩形,不能创建不规则形状的控件,采用图片做界面的背景会使得程序的响应非常之慢所以 V1.0 的界面就此搁置遥控器界面 V2.0 使用 QT 加皮肤的方法来使得界面更加美观参考资料为 IBM 文档库中的《使用 QT 制作 Skin》 附录二贴出原文以保存。
程序源文件中已经给出比较详细的注释,在此不分析源代码,主要就是修改上述链接中提供的方法来实现界面程序同时还打开串口与单片机通信,调用蜂鸣器实现按键发声所用代码为友善之臂提供的 example 中的相关代码有一定修改,有注释在本程序中,使用 CON3 与单片机通信设置波特率 115200 Bd,数据位8bits, 停止位 1bit,无校验,无流控制在图形界面编码中遇到几个典型的问题:一是嵌入式 C 开发中 volatile 关键字的使用时为了强制编译器每次使用到 volatile 变量时都从变量原始地址取值,防止编译器的自动优化这样一个关键字的使用是区别 C 程序员与嵌入式程序员的首要因素第二个典型问题是在 C++代码中调用 C库函数的头文件,一般会使用 extern C 关键字来告诉编译器正在使用 C 头文件第三个典型问题是函数的作用域问题以及 C 函数与C++函数重名的问题在 C++的类的成员函数中要使用 C 头文件定义的函数需要使用 :: 作用域符号,例如要使用 C 函数 close()关闭蜂鸣器,则应该使用 ::close() 的调用方式来告诉编译器当前 cpp文件中这个函数是定义在 extern C 包含的 C 头文件中的,而不是C++头文件中定义的 close。
程序编写调试完毕后,执行如下操作:i. 将可执行文件拷贝到开发板的/opt/Qtopia/binii. 将.desktop 拷贝到开发板的/opt/Qtopia/apps/Applicationsiii. 将 skin 文件夹拷贝到开发板的/opt/Qtopia/pics/remote/重启开发板就可以在 Applications 目录下看到自定义的快捷方式另外,根据 qtopia 系统的架构,可以自己创建一个目录来存放自己的 desktop 文件例如: 在/opt/Qtopia/目录下建立文件夹 SEU, 同时拷贝 Applications 目录下的隐藏文件 .directory 到 SEU 文件夹下,然后修改 .directory 文件,重启就可以看到 SEU 的分类目录4 红外信号编解码a) 暂无5 I2C 电容触摸屏驱动a) I2C 通信协议在这里使用 100K 的通信速率,其他不做介绍linux 系统下编写 I2C 驱动,主要有两种方式,一种是把 I2C 设备当作一个普通的字符设备来处理,另一种是利用 linux I2C 驱动体系结构来完成本文采用利用 linux I2C 体系结构来完成驱动。
主要工作就是向 linux I2C 体系结构注册触摸屏设备,然后在中断服务程序中向 input 子系统上报多点触摸的坐标以及手势参数等等关于 I2C 体系结构详见文章《实例解析 linux 内核 I2C 体系结构》 原文链接为http://www.embedu.org/Column/Column190.htm 和http://www.embedu.org/Column/Column213.htmb) 友善之臂更新的 linux-2.6.32 的内核中已经做好了 I2C 的适配器的硬件驱动和适配器的 algorithm在源文件 linux-2.6.32.2/drivers/i2c/busses/i2c-s3c2410.c 中完全实现所以要驱动此 I2C 电容触摸屏,只需要编写触摸屏的设备驱动即可参考内核自带的 I2C 触摸屏的驱动linux-2.6.32.2/drivers/input/touchscreen/migor_ts.c 来编写,只不过这个触摸屏是单点触摸屏我们要做多点触摸,所以必须使用 2.6.32 的内核中已经做好的支持多点触摸的 input 子系统参考链接为:《Linux 的 I2C 设备驱动 -- mini2440 上 i2c 接口触摸屏驱动》 I2C device name is “cypress_ts“, 7 bits address is 0x02, interruput is eint20 */static struct i2c_board_info i2c_ts_devices[] __initdata = {// I2C_BOARD_INFO(“cypress_ts“, 0x02),{.type = “cypress_ts“,.addr = 0x02,.irq = IRQ_EINT20, },{ }};在如下初始化函数中初始化 I2C 设备,注册 I2C 触摸屏static void __init mini2440_machine_init(void){………………/* i2c touch screen devices */s3c_i2c0_set_platdata(i2c_register_board_info(0, i2c_ts_devices, ARRAY_SIZE(i2c_ts_devices));/****************************/………………}c) Input 子系统简单介绍如下:参见文章《linux 内核 input 子系统解析》原文链接为:http://www.embedu.org/Column/Column289.htm 同时可以分析2.6.32 系统内核源文件。
上文只讲述了子系统的结构和工作原理,但是对于多点触摸 input 子系统没有过多解释,参考 linux 自带的document Multi-touch (MT) Protocol 可知,本系统的多点触摸的上报机制应该如下所示:1. ABS_MT_TRACKING_ID2. ABS_MT_POSITION_X3. ABS_MT_POSITION_Y4. SYN_MT_REPORT5. ABS_MT_TRACKING_ID6. ABS_MT_POSITION_X7. ABS_MT_POSITION_Y8. SYN_MT_REPORT9. SYN_REPORT参考文档《29 内核输入子系统多点上报机制实现》 附录四会给出修改好的 cypress_ts.c 源文件,即为 I2C 触摸屏的设备驱动除此之外,还需要修改 Kconfig 文件和 Makefile 文件以使得能够在 menuconfig 中选中我们的 I2C 触摸屏驱动并编译生成模块或者直接编译进内核具体操作为:修改 linux-2.6.32.2/drivers/input/touchscreen/Kconfi。












