拿到一款新TP,适配好驱动后,触摸屏幕发现触摸点位置和Android报点位置不一致,如上滑变成下滑或者左滑右滑等
1.加载TP驱动,且驱动能正确上报数据
2.使用命令打开触摸报点
settings put system show_touches 1
settings put system pointer_location 1
3.触摸屏幕
出现这种问题可能是由于TP IC里的配置,或者TP贴片方向和屏幕方向不一致等情况导致的,这种情况下,我们需要对TP做一个方向的适配
dts中的方向配置如下:
ctp {
compatible = "allwinner,goodix";
reg = <0x5d>;
device_type = "ctp";
ctp_screen_max_x = <0x4B0>;
ctp_screen_max_y = <0x780>;
ctp_revert_x_flag = <0x1>;
ctp_revert_y_flag = <0x1>;
ctp_exchange_x_y_flag = <0x0>;
};
其中
1.获取dts配置的参考方法
ret = of_property_read_u32(np, "ctp_screen_max_x", &data->screen_max_x);
ret = of_property_read_u32(np, "ctp_screen_max_y", &data->screen_max_y);
ret = of_property_read_u32(np, "ctp_revert_x_flag", &data->revert_x_flag);
ret = of_property_read_u32(np, "ctp_revert_y_flag", &data->revert_y_flag);
ret = of_property_read_u32(np, "ctp_exchange_x_y_flag", &data->exchange_x_y_flag);
其中,of_property_read_u32是内核标准函数,np是设备节点,data是存放dts数据的结构体
2.使用配置
(1)使用变量保存配置,congfig_info为刚才获取的dts配置信息
static int screen_max_x;
static int screen_max_y;
static int revert_x_flag;
static int revert_y_flag;
static int exchange_x_y_flag;
screen_max_x = config_info.screen_max_x;
screen_max_y = config_info.screen_max_y;
revert_x_flag = config_info.revert_x_flag;
revert_y_flag = config_info.revert_y_flag;
exchange_x_y_flag = config_info.exchange_x_y_flag;
if(exchange_x_y_flag == 1)
swap(screen_max_x, screen_max_y);
(2)使用配置
在上报xy报点的位置前,参考使用如下命令
if (exchange_x_y_flag == 1)
swap(x, y);
if (revert_x_flag == 1)
x = screen_max_x - x;
if (revert_y_flag == 1)
y = screen_max_y - y;
1、进行方向适配前,首先要明确xy分别对应哪条边,通常而言,x为屏幕0度角方向的边,通过该命令获取0度角方向。
旋转屏幕,同时输入如下命令,当获取到mCurrentOrientation=0时,则说明该方向对应的底边为x,另一边为y
dumpsys display | grep mCurrentOrientation
2、以800x1280的屏幕为例,先设置max_x和max_y都为1280;并将revert_x,revert_y和exchange_xy设置为0
3、观察屏幕触摸方向,对TP进行左右滑动,和上下滑动,看是否跟手滑动的方向一致
适配步骤:
(1)如左滑变成了上下滑,那说明需要交换xy,设置exchange_xy为1,继续观察
(2)如左滑变成了右滑,则说明可能需要revert_x,设置revert_x为1,继续观察
(3)如上滑变成了下滑,则说明可能需要revert_y,设置revert_y为1,继续观察
(4)部分情况下,23可能需要互换,即左滑变右滑需要设置revert_y,这种灵活变通即可
(5)通过1-4步骤后,可得到对应的xy配置,此时触摸滑动时,应该跟手滑动的方向一致,再来调试max_x和max_y
(6)尝试设置max_x=1280和max_y=800,观察,如果不行,则交换一下xy的值,此时一般来说,触摸基本就可以调试完成了
总结:先调试exchange_xy,再调试revert值,最后再来调试max值。