input子系统二

参考资料:
正点原子Linux设备驱动
韦东山第二期
 
触摸屏分为电阻屏和电容屏。电阻屏结构简单,以前很流行;电容屏支持多点触摸,现在手机基本都是使用电容屏
注:LCD和touch screen不是一个东西,制作触摸屏时特地把它的尺寸做得跟LCD大小一模一样,并不是将触摸屏覆盖在LCD上
 
电阻屏:
0
电阻屏基于欧姆定律制作得,上下两层薄膜,这个薄膜就是两个电阻,通过检测触摸点得的y方向和x方向电压(屏的大小是固定的),就可以得到触摸点坐标
电阻屏的输入数据:
Linux驱动程序中,会上报触电的X/Y数据,注意:这不是LCD坐标值,需要经过APP再次处理才能转换为LCD坐标值
按下时:
EV_KEY   BTN_TOUCH     1        /* 按下 */
EV_ABS   ABS_PRESSURE  1        /* 压力值,可以上报,也可以不报,可以是其他压力值 */
EV_ABS   ABS_X         x_value  /* X坐标 */
EV_ABS   ABS_Y         y_value  /* Y坐标 */
EV_SYNC  0             0        /* 同步事件 */

松开时:
EV_KEY   BTN_TOUCH     0        /* 松开 */
EV_ABS   ABS_PRESSURE  0        /* 压力值,可以上报,也可以不报 */
EV_SYNC  0             0        /* 同步事件 */
 
电容屏:
电容屏中有一个控制芯片,它会周期产生驱动信号,接收电极接收到信号,并可测量电荷大小。当电容屏被按下,相当于引入了新的电容,从而影响接收电极接收到的电荷大小。主控芯片根据电荷大小即可计算出触点位置。可以通过芯片IC就可以得到坐标值。
0
type B触摸屏能分辨是哪一个触点,上报数据时会先上报触点ID,再上报它的数据
具体例子如下,使用场景分析来看看它上报的数据:
EV_ABS   ABS_MT_SLOT 0                  // 这表示“我要上报一个触点信息了”,用来分隔触点信息
EV_ABS   ABS_MT_TRACKING_ID 45          // 这个触点的ID是45
EV_ABS   ABS_MT_POSITION_X x[0]         // 触点X坐标
EV_ABS   ABS_MT_POSITION_Y y[0]         // 触点Y坐标
EV_ABS   ABS_MT_SLOT 1                  // 这表示“我要上报一个触点信息了”,用来分隔触点信息
EV_ABS   ABS_MT_TRACKING_ID 46          // 这个触点的ID是46
EV_ABS   ABS_MT_POSITION_X x[1]         // 触点X坐标
EV_ABS   ABS_MT_POSITION_Y y[1]         // 触点Y坐标
EV_SYNC  SYN_REPORT        0            // 全部数据上报完毕,同步事件
当ID为45的触点正在移动时:
EV_ABS   ABS_MT_SLOT 0   // 这表示“我要上报一个触点信息了”,之前上报过ID,就不用再上报ID了
EV_ABS   ABS_MT_POSITION_X x[0]   // 触点X坐标
EV_SYNC  SYN_REPORT         0     // 全部数据上报完毕
松开ID为45的触点时(在前面slot已经被设置为0,这里这需要再重新设置slot,slot就像一个全局变量一样:如果它没变化的话,就无需再次设置):
// 刚刚设置了ABS_MT_SLOT为0,它对应ID为45,这里设置ID为-1就表示ID为45的触点被松开了
EV_ABS   ABS_MT_TRACKING_ID -1   
EV_SYNC  SYN_REPORT         0    // 全部数据上报完毕
最后上,松开ID为46的触点:
EV_ABS   ABS_MT_TRACKING_ID -1  // ID为-1,表示slot 1被松开,即ID为46的触点被松开
EV_SYNC  SYN_REPORT             // 全部数据上报完毕

 

以百问网的举例说明:
一个手指点击触摸屏:
0
BIT_TOUCH表示触摸屏被按下,为了兼容老的触摸屏,还上报了ABS_X和ABS_Y的数据(这两个是老的电阻屏的参数),上报同步事件EV_SYNC。松开,将ABS_MT_TRACKING_ID设置为-1就可以了
 
两根手指点击触摸屏时,得到类似如下的数据:
0
兼容老程序,ABS_X和ABS_Y只上报了第一个触点的坐标。100为ABS_MT_SLOT 1。ABS_MT_SLOT 0和ABS_MT_TRACKING_ID -1,表示松开了ID为7的触点。ABS_MT_SLOT 1和ABS_MT_TRACKING_ID -1,表示松开了ID为8的触点
 
ABS_MT_TOUCH_MAJOR和ABS_MT_WIDTH_MAJOR的含义:
表示触摸点的大小和手指的大小,不是很重要
 
 
 
 
 
posted @ 2024-03-31 16:39  lethe1203  阅读(26)  评论(0编辑  收藏  举报