基于嵌入式技术的智能仪器触摸屏接口设计
屏的软件去抖, 再判断触摸屏是否被按下。然后通过read_xy 函数分别切换至X和Y 通道, 完成触点电压的AD转换, 并读取12 位坐标值。
static void ads7843_ ts_ interrup t ( int IRq, void 3 dev_ id,
struct p t_regs3 regs)
{
sp in_lock_irq (&tsdevlock) ;
if ( in_timehandle > 0)
{
sp in_unlock_irq (&tsdevlock) ;
return;
}
disable_irq ( IRQ_GPIO_ADS7843) ;
ads7843_ts_starttimer ;
sp in_unlock_irq (&tsdevlock) ;
}
应用程序调用read 函数时, 进入驱动的ads7843_ts_read 接口函数。在该接口函数中获取采样结果, 判断是否要对坐标进行校准, 将最终结果写入到缓冲区中, 并通过copy_to_user 函数将其从内核空间复制到用户空间, 以使应用程序能够使用。在ads7843_ts_read 函数中采用了非阻塞型操作, 使得在没有数据到达的时候立即返回, 然后用异步触发fasync 来通知数据的到来。ads7843 _ ts_poll 函数用于驱动程序的非阻塞操作, ads7843_ts_fasync 函数用于驱动异步触发。ads7843_ts_ioctl 函数中, 提供了可从用户态控制的参数, 如触摸屏是否在驱动中校准、屏幕的最大最小坐标值等。ads7843_ts_release( )函数用来关闭触摸屏设备。
2.2 触摸屏的校准
在仪器开发过程中,触摸屏作为输入设备与LCD配合使用。为了能使从触摸屏采样得到坐标与屏幕的显示坐标对应, 还需要做一个映射, 也就是要对触摸屏进行校准。如图4所示, 所用的触摸屏和液晶屏都是标准的矩形, 只要安装合理, 可以认为触摸屏的X 方向坐标只与显示屏X 方向相关, Y方向坐标只与显示屏的Y方向相关。假设显示屏的分辨率是W ×H, 显示区域的左上角对应的触摸屏采样坐标是( x1 , y1 ) ,右下角对应的坐标是( x2 , y2 ) , 那么触摸屏上任意一点采样坐标( x, y) 与显示屏坐标( xd , yd ) 的对应关系可以按照如下公式计算:
这样, 在测得( x1 , y1 ) 和( x2 , y2 ) 点触摸屏的采样值后, 利用上述公式编制校准函数, 在触摸屏工作的过程中, 计算出实际触摸点对应的显示坐标,完成触摸屏的校准。
图4 触摸屏的校准
3 触摸屏用户应用程序
创建的Linux设备文件系统触摸屏节点为/dev/ts.在应用程序中, 可以像打开文件一样用open函数打开设备文件, 然后用read 函数读取由驱动传递到用户空间的数据。仪器应用程序的开发采用MiniGU I进行, MiniGU I是由北京飞漫公司开发, 可应用于实时嵌入式系统中的轻量级图形用户界面支持系统。其函数接口与Windows SDK类似, 开发方便。
MiniGU I的输入抽象层( IAL: Input Abstract Layer)提供了对触摸屏、鼠标等输入设备的丰富支持, 并支持PXA255处理器平台。只要经过简单的设置就可以在应用程序中使用触摸屏。配置安装MiniGU I时, 使用22enable2px255bial项, 由于在安装MiniGU I时采用了内嵌资源的静态编译方式, 所以在编译之前, 需在MiniGU I的src / sysres/目录下建立mgetc2pxa1c 文件,并在其中用下面语句设置系统参数, 将触摸屏设为输入设备。
static char * SYSTEM_VALUES[ ] = { " fbcon" ," PX255B" , " /dev/ ts" , " none" };
MiniGU I对触摸屏输入的处理方式如图5 所示。
图5 MiniGU I中的触摸屏输入
MiniGU I通过触摸屏设备驱动程序接收原始的输入数据, 把它转换为MiniGU I抽象的触摸屏事件和数据。
相关的底层事件处理例程把这些触摸事件转换为上层的触摸消息, 放到相应的消息队列中。应用程序通过消息循环获取这些消息, 交由窗口过程处理。编制针对触摸屏的应用程序时, 需要做的只是在窗口接收到诸如MSG _LBUTTONDOWN 等触屏消息时, 调用相应的语句, 完成预期操作。
4 结论
嵌入式智能仪器触摸屏接口增强了仪器系统的人机交互功能, 方便了操作人员的使用; 接口电路和驱动程序的模块化方便了仪器的后续改进和新产品的开发, 并可根据需要移植应用到各种不同场合。设计的触摸屏接口已经成功应用在故障诊断巡检仪器中, 其工作稳定, 运行可靠, 具有很好的实用价值。
- 基于单片机的实用数字信号源与频率计设计(10-16)
- linux电源管理(06-23)
- linux操作系统交叉编译环境的建立方法(09-18)
- 基于Linux-2.6.16的高速模数转换器的应用(01-04)
- 基于Linux的动态电源管理设计(07-12)
- 基于uClinux的实时网络监控服务器开发与应用(10-16)