input子系统二
参考资料:
正点原子Linux设备驱动
韦东山第二期
触摸屏分为电阻屏和电容屏。电阻屏结构简单,以前很流行;电容屏支持多点触摸,现在手机基本都是使用电容屏
注:LCD和touch screen不是一个东西,制作触摸屏时特地把它的尺寸做得跟LCD大小一模一样,并不是将触摸屏覆盖在LCD上
电阻屏:
电阻屏基于欧姆定律制作得,上下两层薄膜,这个薄膜就是两个电阻,通过检测触摸点得的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就可以得到坐标值。
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 // 全部数据上报完毕
以百问网的举例说明:
一个手指点击触摸屏:
BIT_TOUCH表示触摸屏被按下,为了兼容老的触摸屏,还上报了ABS_X和ABS_Y的数据(这两个是老的电阻屏的参数),上报同步事件EV_SYNC。松开,将ABS_MT_TRACKING_ID设置为-1就可以了
两根手指点击触摸屏时,得到类似如下的数据:
兼容老程序,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的含义:
表示触摸点的大小和手指的大小,不是很重要