嵌入式linux 系统下的触摸屏驱动系统设计
一个重要的函数,就是中断函数,在触摸屏被按下的时候产生中断,在中断函数中的重要工作就是启动定时器,以判断触摸后的动作是触摸笔被提起还是继续按下。其函数原型设计为staticirqreturn_t ads7873_irq(int irq, void *handle);(4)定时器函数设计的目的就是判断触摸屏是否被提起,被提起就立刻刷新设备的数据到应用层,仍然处于“按下”状态,则需要继续测量。其函数原型设计为:
static void ads7873_timer(unsigned longhandle);
3.3 驱动的编译和加载
驱动程序加入内核有两种方式动态和静态,动态就是只是把驱动编译为模块, 系统启动后执行insmod 后加载,静态是指直接编译进内核,系统启动后自动加载了。由于我们的驱动需要经过测试才能加入内核,因此采用动态的方式加载驱动。
在已经安装好开发平台的主机上执行make, 就可以得到目标文件ad7873.ko,这就是我们需要的驱动。在platform_data 数据结构中设置好驱动需要的数据,如中断、触摸屏大小、触摸压力上下限等数值,并编译好内核下载到开发板中运行。然后将ad7873.ko 复制到开发板,在终端下执行insmodad7873.ko,得到如下提示:
图4 驱动加载信息
显示驱动已经加载成功,中断号为126.
(注:“this sectence has been”,为调试驱动中断的测试语句)然后用应用广泛的tslib 触摸屏测试程序对驱动进行测试,测试结果显示,触摸屏工作正常。下图触摸屏上白色的字“桂林电子科技大学触摸屏”为在tslib 的测试程序下用触摸笔写的字,证明了触摸屏工作是正常的。
将此设计应用到家庭智能网关系统中,证明其工作稳定,响应很快。
图5 触摸屏正常响应图
4 驱动程序出现的问题及解决方法
在调试驱动的过程中,出现了很多问题,主要有以下两个:
4.1 加载时报错
在执行insmod ad7873.ko 时,报错为:
ad7873: no version for “struct_module”found: kernel tainted.
经过检查,发现是因为platform_data 里面定义的。model=“7873”被写成了。model=“7883”,造成了系统无法识别这个驱动,产生了错误,修改后执行insmod ad7873.ko 成功。
4.2 使用tslib 测试软 件测试的时候,屏幕无反应
原以为是中断程序出了问题,因此在中断里面设置打印信息,发现可以打印,于是确定了中断时正常响应了的。然后跟踪代码检查,发现定时器函数很可疑,于是在定时器函数设置打印信息,发现定时器函数没有正确执行,找到了问题的所在。于是顺藤摸瓜,终于发现原来是在这个函数中fn_get_pendown_state(void),也就是用来得到触摸屏状态的引脚设置不正确,导致定时器函数里面无法得到触摸屏的状态,所以无响应。修改了定时器的引脚定义使其指向正确的引脚便一切OK。
5 结论
本文从硬件到软件设计了整个触摸屏驱动系统。作为家庭无线智能控制器的一部分,触摸屏使整个系统使用更方便与高效。而未来随着对触摸技术的越来越高的要求,如多点触摸技术,需要驱动为上层应用提供更稳定的处理与更多的接口,以便上层应用可以更加高效的编写应用程序来应对复杂的机制。这就需要在内核驱动层改进驱动的结构与算法来应对。
- 低功耗嵌入式实现的方方面面(04-30)
- 功率与控制的结合使LED照明方案灵活、简便(10-20)
- S3C2440A嵌入式手持终端电源管理系统设计(01-11)
- 几种实用的低电压冗余电源方案设计(01-26)
- 基于先验预知的动态电源管理技术(03-28)
- 基于CAN通信的电源监控系统的设计(04-06)