一、电阻屏
1. 电阻屏原理
电阻屏基于欧姆定律,它有上下两层薄膜,薄膜就是电阻。
当上下两层接触时,上下两层薄膜接触,这时可以测量触点电压。
X坐标:当xp、xm两端加3.3v电压,yp和ym不加电压时,yp相当于探针,测量yp的电压。电压和距离就成正比了。Y坐标:同理Y轴坐标也可求出
2. 电阻屏数据
Linux驱动程序中,会上报触电的X、Y数据。这不是LCD的坐标值,需要APP再此处理才能转换成坐标值。
对应的input_event结构体中,"type、code、value"如下:
//按下时EV_KEYBTN_TOUCH1/* 按下 */EV_ABSABS_PRESSURE1/* 压力值,可以上报,可以不报,可以是其他压力值 */EV_ABSABS_Xx_value/* X坐标 */EV_ABSABS_Yy_value/* Y坐标 */EV_SYNC00/* 同步事件 *///松开时EV_KEYBTN_TOUCH0/* 松开 */EV_ABSABS_PRESSURE0/* 压力值,可以上报,可以不报 */EV_SYNC00/* 同步事件 */
二、电容屏
2.1 原理
电容屏中有一个控制芯片,它周期性的产生驱动信号,接收电极收到信号,并可以测量电荷大小。
当电容屏被按下时,相当于引入了新的电容,从而影响了接收电极接收到的电荷大小。
根据电荷大小,主控芯片可以可以计算出触电位置,这类芯片一般是I2C接口。通过读取I2C芯片寄存器获得数据。
2.2 电容屏数据
参考文档:Documentation/input/multi-touch-protocol.txt
电容屏可以支持多点触摸,驱动程序区分多点触摸有两种方法:
TypeA:该类型的触摸屏不能分辨是哪一个触点,它只是把所有触点的坐标一股脑地上报,由软件来分辨这些数据分别属于哪个触电。已经过时,Linux内核中没有TypeA地源码了TypeB:该类型地触摸屏能分辨哪一个触点,上报数据时会先上报触点ID,再上报它的数据。例子:
/* 当有2个触点时 */EV_ABSABS_MT_SLOT0/* 表示我要上报一个触点信息了,用来分隔触点信息 */EV_ABSABS_MT_TRACKING_ID45/* 这个触点的ID是45 */EV_ABSABS_MT_POSITION_Xx[0]/* 触点X坐标 */EV_ABSABS_MT_POSITION_Yy[0]/* 触点Y坐标 */EV_ABSABS_MT_SLOT1/* 表示一个触点信息结束了 */EV_ABSABS_MT_TRACKING_ID45/* 触点ID是46 */EV_ABSABS_MT_POSITION_Xx[1]/* 触点X坐标 */EV_ABSABS_MT_POSITION_Yy[1]/* 触点Y坐标 */EV_SYNCSYN_REPORT0/* 全部数据上报完毕 *//* 当IO为45的触点正在移动时 */EV_ABSABS_MT_SLOT0/* 表示要上报触点信息了,之前报过ID了就不上报ID了 */EV_ABSABS_MT_POSITION_Xx[0]/* 触点X坐标 */EV_SYNCSYN_REPORT0/* 全部数据上报完毕 *//* 松开ID为45的触点时 */EV_ABSABS_MT_TRACKING_ID-1/* 刚刚设置了ABS_MT_SLOT为0,ID变成-1,说明松开了 */EV_SYNCSYN_REPORT0/* 全部数据上报完毕 *//* 最后松开ID为46的触点 */EV_ABSABS_MT_SLOT1/* 表示要上报触点信息了,之前报过ID了就不上报ID了 */EV_ABSABS_MT_TRACKING_ID-1/* ID为-1,表示slot 1被松开,即ID为46的触点被松开 */EV_SYNCSYN_REPORT/* 全部数据上报完毕 */
2.3 实验数据分析
用一个手指点击触摸屏,得到类似如下的数据:root@npi:~# hexdump /dev/input/event20000000 d56e 6149 34d0 000c 0003 0039 0000 0000//type=ABS,code=ABS_MT_TRACKING_ID,value=00000010 d56e 6149 34d0 000c 0003 0035 01f7 0000//type=ABS,code=ABS_MT_POSITION_X,value=0x01f700000000020 d56e 6149 34d0 000c 0003 0036 00ce 0000//type=ABS,code=ABS_MT_POSITION_Y,value=0x00ce00000000030 d56e 6149 34d0 000c 0003 0030 0051 0000//type=ABS,code=ABS_MT_TOUCH_MAJOR,value=0x005100000000040 d56e 6149 34d0 000c 0003 0032 0051 0000//type=ABS,code=ABS_MT_WIDTH_MAJOR,value=0x005100000000050 d56e 6149 34d0 000c 0001 014a 0001 0000//type=KEY,code=BTN_TOUCH,value=0x000100000000060 d56e 6149 34d0 000c 0003 0000 01f7 0000//type=ABS,code=ABS_X,value=0x00ce00000000070 d56e 6149 34d0 000c 0003 0001 00ce 0000//type=ABS,code=ABS_Y,value=0x00ce00000000080 d56e 6149 34d0 000c 0000 0000 0000 0000//type=SYN,code=SYN_REPORT,value=0x000000000000090 d56e 6149 6373 000d 0003 0039 ffff ffff//type=ABS,code=ABS_MT_TRACKING_ID,value=0xffffffff00000a0 d56e 6149 6373 000d 0001 014a 0000 0000//type=KEY,code=BTN_TOUCH,value=0x0000000000000b0 d56e 6149 6373 000d 0000 0000 0000 0000//type=SYN,code=SYN_REPORT,value=0x00000000
在上面的数据中,为了兼容老程序,也上报了ABS_X、ABS_Y数据,电阻触摸屏就是使用这类数据。
基于电阻屏的程序,也可以用在电容屏上。
用两个手指点击触摸屏时,如下数据:
root@npi:~# hexdump /dev/input/event20000000 891e 614e 1348 0000 0003 0039 0001 0000//type=ABS,code=ABS_MT_TRACKING_ID,value=10000010 891e 614e 1348 0000 0003 0035 0187 0000//type=ABS,code=ABS_MT_POSITION_X,value=0x018700000000020 891e 614e 1348 0000 0003 0036 00b2 0000//type=ABS,code=ABS_MT_POSITION_Y,value=0x00b200000000030 891e 614e 1348 0000 0003 0030 0050 0000//type=ABS,code=ABS_MT_TOUCH_MAJOR,value=0x005000000000040 891e 614e 1348 0000 0003 0032 0050 0000//type=ABS,code=ABS_MT_WIDTH_MAJOR,value=0x005000000000050 891e 614e 1348 0000 0003 002f 0001 0000//type=ABS,code=ABS_MT_SLOT,value=0x000100000000060 891e 614e 1348 0000 0003 0039 0002 0000//type=ABS,code=ABS_MT_TRACKING_ID,value=0x000200000000070 891e 614e 1348 0000 0003 0035 024b 0000//type=ABS,code=ABS_MT_POSITION_X,value=0x024b00000000080 891e 614e 1348 0000 0003 0036 00a9 0000//type=ABS,code=ABS_MT_POSITION_Y,value=0x00a900000000090 891e 614e 1348 0000 0003 0030 005f 0000//type=ABS,code=ABS_MT_TOUCH_MAJOR,value=0x005f000000000a0 891e 614e 1348 0000 0003 0032 005f 0000//type=ABS,code=ABS_MT_WIDTH_MAJOR,value=0x005f000000000b0 891e 614e 1348 0000 0001 014a 0001 0000//type=KEY,code=BTN_TOUCH,value=0x0001000000000c0 891e 614e 1348 0000 0003 0000 0187 0000//type=ABS,code=ABS_X,value=0x0187000000000d0 891e 614e 1348 0000 0003 0001 00b2 0000//type=ABS,code=ABS_Y,value=0x00b2000000000e0 891e 614e 1348 0000 0000 0000 0000 0000//type=SYN,code=SYN_REPORT,value=0x0000000000000f0 891e 614e 0358 0006 0003 002f 0000 0000//type=ABS,code=ABS_MT_SLOT,value=0x000000000000100 891e 614e 0358 0006 0003 0039 ffff ffff//type=ABS,code=ABS_MT_TRACKING_ID,value=0xffffffff0000110 891e 614e 0358 0006 0003 002f 0001 0000//type=ABS,code=ABS_MT_SLOT,value=0x000100000000120 891e 614e 0358 0006 0003 0039 ffff ffff//type=ABS,code=ABS_MT_TRACKING_ID,value=0xffffffff0000130 891e 614e 0358 0006 0001 014a 0000 0000//type=KEY,code=BTN_TOUCH,value=0x000000000000140 891e 614e 0358 0006 0000 0000 0000 0000//type=SYN,code=SYN_REPORT,value=0x00000000
为了兼容老程序也上报了ABS_X、ABS_Y数据,但是只上报第1个触点的数据