1.首先要区分lcd和触摸屏,lcd是一个屏幕,触摸屏是贴在lcd上的两层膜。
2.四线电阻触摸屏的原理:触摸屏就是上下两层膜,比如上层代表x轴(XM:负端,XP:正端),下层代表y轴(YM:负端,YP:正端)。当读取x轴坐标时,XP接3.3v,XM接地,从YM读取按下点的电压值作为模拟输入信号,再经过AD转换后就得到了x轴坐标。同理,当读取y轴坐标时,YP接3.3v,YM接地,从XM读取按下点的电压值作为模拟输入,再经过AD转换后就得到了y轴坐标。
触摸屏驱动程序采用中断方式对触摸笔的按下状态进行检测,如果检测到触摸笔按下将产生中断并触发一个事件通知一个工作线程开始采集数据。
ADC触摸屏驱动的工作流程如图 21所示。
图 21 ADC触摸屏工作流程
技术实现
ADC触摸屏驱动框架分析
ADC触摸屏驱动目录如图 31所示。
图 31 ADC触摸屏驱动所在目录
bspnuc970/driver_module/touch_drv/src/touch_drv.c文件主要提供SylixOS的ADC触摸屏驱动。主要关注函数如程序清单 31所示。
程序清单 31
INT __tsDrv (VOID) INT __tsDevCreate (PCHAR pcName) static void __tsThread (TS_DEV *ptsDev) static irqreturn_t __tsIsr (void *arg)
框架的流程图
整个框架的流程如图 33所示。
图 33 ADC触摸屏驱动框架
代码实现
BSP中驱动配置
根据NUC970相关芯片手册,配置寄存器地址并定义touch screen设备结构。如程序清单 32所示。
程序清单 32
/********************************************************************************************************* touch screen 设备结构 *********************************************************************************************************/ typedef struct { LW_DEV_HDR TS_devhdr; /* 设备头 */ touchscreen_event_notify TS_tData; /* 采集到的数据 */ BOOL TS_bIsReadRel; /* 是否读取的 release 操作 */ LW_HANDLE TS_hThread; /* 扫描线程 */ LW_SEL_WAKEUPLIST TS_selwulList; /* select() 等待链 */ LW_SPINLOCK_DEFINE (TS_slLock); /* 自旋锁 */ } TS_DEV;
__tsDrv
该函数注册一系列触摸屏设备驱动程序,包括:
1) 驱动程序中的建立函数__tsOpen;
2) 驱动程序中的关闭函数__tsClose;
3) 驱动程序中的读函数__tsRead;
具体实现如程序清单 33所示。
程序清单 33
INT __tsDrv (VOID) { …… /* * 安装触摸屏驱动,LW_NULL为待实现功能 */ touch_dev_num = iosDrvInstall(__tsOpen, LW_NULL, __tsOpen, __tsClose, __tsRead, LW_NULL, LW_NULL); …… }
__tsDevCreate