触摸屏的坐标分布:
常规情况下 产品正常摆放视角下,TP左上角为原点位,如果不确定需要拿到工程结构图纸,按照图纸标注设定。
特殊情况下:
有些产品的显示屏因为显示驱动的影响,产品正常摆放时LCM的原点位不在左上角,这个需要和方案确认。
以上两种情况注意即可,无论如何,TP的原点位要和LCM的原点位重合。
在此项目中,工程图纸如下
LCM的原点位在左下角,因此需要将TP的原点位调整到左下角。同时XY需要互换,也就是XY Swap开启(默认会将长边作为X轴)。
TW3106 TW3118 需要添加如下两个参数
TP VA区长宽Len X/Len Y,LCM分辨率 ResX/ResY,这两个参数可以在工程结构图纸中获取,需要与方案确认。
LCM分辨率设置之后,就限制了该TP的最大触摸报点坐标(X_Resolution,Y_Resolution),
IC 将触摸产生的坐标数据上传到系统驱动中进行处理。
驱动文件中有几个关于调整触摸屏方向的宏定义,一般默认不开启。
此项目中在触摸时,系统层在LCM上绘制的坐标点,超出了最大坐标值。也就是触摸上报(1920,1200)这个位置的坐标时,在系统开启开发者模式中的触摸指针及显示后顶栏上的坐标,超出了(1920,1200),没有办法放坐标错误的视频,有相关项目经验的人应该知道。
驱动处理的坐标数据也不会超出设定的最大坐标,在/dev/input/event8 可以看到触摸屏输出的原始数据,与设备驱动层无关。
建议方案排查事件处理层
输入子系统常见事件类型为:按键事件(如键盘)、相对坐标事件(如鼠标)、绝对坐标事件(如触摸屏)。
上报数据到事件处理层
//上报按键事件键值,如键盘
inline void input_report_key(struct input_dev *dev, unsigned int code, int value);
//上报相对事件坐标值,如鼠标
inline void input_report_rel(struct input_dev *dev, unsigned int code, int value);
//上报绝对事件坐标值,如触摸屏
inline void input_report_abs(struct input_dev *dev, unsigned int code, int value);
形参:dev --input_dev结构体
code --事件数据值,若按键事件,则保证按键键值;若坐标信息,则表明为x,y
value --标志值,若按键,则表示按下还是松开;若坐标,则表示位具体的坐标值
这几个函数完成数据上报内部靠input_event函数实现。
触摸屏上报的是绝对事件坐标值,
设置上报的值的范围input_set_abs_params
-----input_set_abs_params函数用于设置上报的数值的取值范围。
void input_set_abs_params(struct input_dev *dev, unsigned int axis, int min, int max, int fuzz, int flat)
形参: dev --input_dev结构体
axis --上报的数值
min --最小值
max --最大值
fuzz --数据偏差值
flat --平滑位置
设置触摸屏x坐标范围:
input_set_abs_params(touch_dev,ABS_X,0,2880,0,0);//设置x坐标范围
设置触摸屏x坐标范围:
input_set_abs_params(touch_dev,ABS_PRESSURE,0,1,0,0);//设置压力值范围
最后检查到这里才发现是代码迁移过程中没有按照项目修正,导致显示层显示触摸指针坐标异常。