一、 常见触摸屏种类 1.电容触摸 a. I2C(如:GT911) b. USB(I2C转USB) 2.电阻触摸 a. ADC b. USB接口(屏幕转接板上接一个MCU) 二、 查看设备 触摸屏驱动一般是采用input子系统驱动框架实现的,所以应用层接口要遵循input框架的接口。 在命令行下输入ls -l /dev/input,可以看到现在有的输入设备 三、 查看触摸原始数据 当触摸出现问题时,可以通过查看原始数据判断是驱动层还是应用层的问题,查看原始数据的方法有以下几种: 1. cat /dev/event2 直接cat触摸事件触摸屏幕会有乱码输出; 2.hexdump $ hexdump -d /dev/input/event0 0000000 15989 00000
18969 00004 00004
00004 00001 00009 # 其它事件 0000010 15989 00000
18969 00004 00001
00272 00001 00000 # BTN_MOUSE,按下 0000020 15989 00000
18969 00004 00003
00000 16333 00000 # ABS_X 0000030 15989 00000
18969 00004 00003
00001 09599 00000 # ABS_Y 0000040 15989 00000
18969 00004 00000
00000 00000 00000 # 同步事件 0000050 15989 00000
49415 00005 00004
00004 00001 00009 # 其它事件 0000060 15989 00000
49415 00005 00001
00272 00000 00000 # BTN_MOUSE,松开 0000070 15989 00000
49415 00005 00000
00000 00000 00000 # 同步事件 倒数第四、三、二行分别为 type、code
和 value,在 linux/input.h 都有定义,Linux 中输入设备的事件类型有: #define EV_SYN 0x00 // 同步事件 #define EV_KEY 0x01 // 按键事件 #define EV_REL 0x02 // 相对坐标 #define EV_ABS 0x03 // 绝对坐标 #define EV_MSC 0x04 // 其它事件 type 是事件类型,为 3 就是 EV_ABS=0x03,为 0 就是
EV_SYN=0x00(作为事件的分隔)。 code 的话根据事件类型而定,如果是
type 为 EV_ABS,code 为 0 就是 ABS_X,code 为 1 就是 ABS_Y。 然后 value 就是在 type 和 code 的前提下的值,比如 type 为 EV_ABS,code 为 0 就是 ABS_X,那么 value 就代表触摸点的 x 轴绝对值。 比如 type 为 EV_KEY,code 为 272 就是
BTN_MOUSE,code 为 330 就是 BTN_TOUCH,那么 value 为 1 表示按下,为 0 表示松开。比如
type 为 EV_ABS,code 为 24 就是 ABS_PRESSURE,value
为 1 表示按下,为 0 表示松开。 测试看出触摸屏触摸产生的坐标值范围为 X:016384,Y:09600,同时该触摸屏没有上传
ABS_PRESSURE 3. ts_print / ts_print_raw 二者的区别在于ts_print打印出来的是经过tslib处理后的数据,ts_print_raw打印的数据是tslib处理之前的数据。 4. evtest Evtest不仅可以打印原始数据,也可以看到事件类型。 四、 驱动层处理思路 1. 通过查看设备信息,在内核源码中找对应驱动 可以在内核源码中找对应的字符串; 2.定位触摸报点位置,可以在对应驱动中找字符串ABS; 上图为电阻屏触摸驱动 3.加打印信息,进一步处理; 五、 应用层处理 1.通过ts_test等工具查看tslib有没有拿到数据; 2.更换tslib版本; 六、 电容屏 理论上电容屏可以不经过触摸校准,只不过不经过触摸校准可能会出现触摸效果与实际相反,需要反转触摸; 但实测如果屏幕上报数据与实际分辨率不符,qt低版本可能处理不了,需要经过手动校正; |
|小黑屋|
飞凌嵌入式
( 冀ICP备12004394号-1 )
GMT+8, 2026-4-4 05:37
Powered by Discuz! X3.4
© 2001-2013 Comsenz Inc.