MTK |Android KK&L 平台TP调试

一. 简介

 本文描述了针对touchpanel驱动调试的流程步骤,以及具体的功能代码的讲解。

二. 硬件电路

对于一个TP,主要需要量测以下信号:
VIO28_PMU供电电压,需要在tpd_custom_xx.h里面定义
#define TPD_POWER_SOURCE_CUSTOM XX
CTP_EINT_CTP 中断信号,在开机过程中点击触摸屏,正常会有高低电平变化
CTP_GPIO_CTP_RSTB复位信号,有些TP不需要,在上电过程中有拉高拉低
CTP_SCL_1,CTP_SDA_1 I2C信号,通过抓LOG看i2C的读写是否成功,
必要时需要用示波器抓一下I2C的电平电压和波形,看是否正常
另外需要注意DCT里面的PIN配置

三. 添加TP的简单流程(以GT9XX为例)

3.1首先在Projecconfig.mk定义的TP宏控

CUSTOM_KERNEL_TOUCHPANEL = gt9xx ft5206 //TP型号
MTK_TOUCH_PHYSICAL_ROTATION_RELATIVE_TO_LCM=180
//如果屏幕倒装需要定义180,否则为0(这个宏控在mk文件里面还存在,
但是在72平台最新代码验证了一下不开启180度,TP也是能正常使用的)

3.2如果是第一次调试,需要在alps\mediatek\custom\common\kernel\touchpanel添加对应的TP驱动代码,

    如果项目需要特别改动,则在wingcust自己的项目下添加。
    一般配置文件tpd_custom_xx.h需要在wingcust自己的项目下面增加。

3.3根据具体的项目的分辨率和硬件信息,需要在tpd_custom_xx.h中配置宏控。

 因为每个IC的配置信息都有所不同,不同IC 具体的宏控定义需要在调试时找FAE确认清楚,

下面只介绍一下GT9XX的配置定义:
#define GTP_AUTO_UPDATE 0 //update FW,默认关
#define GTP_FW_DOWNLOAD 0 //update FW to TP SRAM,默认关
GTP_AUTO_UPDATE,GTP_FW_DOWNLOAD这两个宏控同时打开时,
会在开机时把gtp_default_FW[]数组写入TP固件。
如果只打开GTP_AUTO_UPDATE,则会查找T卡路径下的BIN文件,写入TP固件(未验证)
#define TPD_HAVE_BUTTON 1 //有虚拟按键需要在.h开启这个宏控
#define CTP_CFG_GROUP1 {} //对应ID为0的模组
#define CTP_CFG_GROUP2 {} //对应ID为1的模组
一般GT9XX模组厂会用CTP_CFG_GROUP第一个字节来表示当前TP配置参数的版本号。
大部分GT9XX的TP的各种效果问题都是通过修改这个配置参数解决。
但是每个IC都有自己的版本号定义方式,在调试的时候需要找FAE确认。

3.4简单介绍一下TP driver文件里面一些需要重点注意的配置

(a)在 tpd_driver_init里面i2c_register_board_info(TPD_I2C_NUMBER, &i2c_tpd, 1);
        这里的TPD_I2C_NUMBER表示硬件上接的I2C总线,
        如果TPD_I2C_NUMBER=0则是用SDA0,SCL0,TPD_I2C_NUMBER=1则是用SDA1,SCL1。

(b)i2c_tpd = { I2C_BOARD_INFO(“gt9xx”, (0xBA >> 1))};0XBA表示GT9XX的I2C设备地址,"gt9xx"表示i2C的设备类型
©添加tp的virtual key,需在tp对应的头文件(tpd_custom_xxx.h)中添加如下设置:
定义宏TPD_HAVE_BUTTON,定义TPD_BUTTON_HEIGHT,TPD_KEY_COUNT,TPD_KEYS和TPD_KEYS_DIM,
分别用于定义button被识别的纵向坐标,button的个数,对应的功能键,和每个功能键的坐标。配置示例:
#define TPD_HAVE_BUTTON 1 //为1表示有虚拟按键
#define TPD_KEY_COUNT 4 //虚拟按键个数
#define TPD_KEYS {KEY_MENU, KEY_HOME, KEY_BACK, KEY_SEARCH}
//虚拟按键的功能名字,平台不同可能会有不同的名字
#define TPD_KEYS_DIM {{40,500,40,60},{120,500,40,60},{200,500,40,60},{280,500,40,60}}
其中,{40,500,40,60}对应了KEY_MENU的坐标, (40,50)是该key center的坐标,40是该键的宽度,60是该键的高度.
这个坐标数组配置不对会导致工厂模式虚拟按键异常,正常模式下不会去判断这个坐标数组,只负责上报坐标值,由上层处理。

四. TP的测试

  驱动方面主要保证TP的基本功能可以使用,单点,画线,放大缩小图片,进入退出睡眠等功能正常。验证时需要确认以下几点内容:

(1)触摸屏最大支持几点
(2)触摸屏退出睡眠的响应时间,是否会出现等很久才能触摸的现象
(3)开机后可以在开发者选项里面开启“显示触摸操作”和“指针位置”来测试
(4)如果TP是直接上报虚拟按键的键值会导致按键震动异常,需要改为上报坐标
(5)需要检查TP的功耗是否超标
(6)需要检查工厂模式下的TP功能是否正常
(7)需要确认TP的APK升级功能是否正常,通过版本号检查升级是否成功
其他效果方面的测试由专门的测试人员完成

五. TP需要完善的功能

(1)需要在工厂模式显示TP的配置信息版本号
(2)CTS的升级需要修改文件权限
(3)TP自动测试方案导入

六.Touchpanel的主要参考资料

遇到触摸屏问题,主要通过MTK提供的FAQ文档查找。针对某些TP IC导致的问题需要找FAE现场解决。

七. 驱动代码流程介绍(以GT9XX为例)

(1)首先执行tpd_driver_init
i2c_tpd = { I2C_BOARD_INFO(“gt9xx”, (0xBA >> 1))}; //I2C读写地址
static int __init tpd_driver_init(void)
{
//注册I2C使用的NUMBER和对应TP的设备名字,配置不对会导致I2C通信失败
i2c_register_board_info(TPD_I2C_NUMBER, &i2c_tpd, 1);
//把所有兼容的TP执行函数统一添加到tpd_driver_list这个数组里面
if (tpd_driver_add(&tpd_device_driver) < 0)
return 0;
}
(2)接着会调用tpd_local_init
static int tpd_local_init(void) //在mtk_tpd.c的函数tpd_probe里面调用
{
if (i2c_add_driver(&tpd_i2c_driver) != 0) //这里会调用i2c_register_driver,加载TP的I2C执行函数
{
GTP_INFO(“unable to add i2c driver.\n”);
return -1;
}
#ifdef TPD_HAVE_BUTTON
tpd_button_setting(TPD_KEY_COUNT, tpd_keys_local, tpd_keys_dim_local); //初始化TP虚拟按键信息
#endif
}
int i2c_register_driver(struct module owner, struct i2c_driver driver)
{
/
When registration returns, the driver core will have called probe() for all matching-but-unbound devices
/
//这个函数没有看到实体,按照上面的说明这里执行完后会调用tpd_i2c_probe,通过开机LOG看到是这样的。
res = driver_register(&driver->driver);
}

//这个函数在kernel/drivers/i2c/i2c-core.c的i2c_device_probe里被调用,
   //如果函数执行完tpd_i2c_probe没有显示错误,说明I2C的读写已经正常
static s32 tpd_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)

{
i2c_client_point = client;
ret = tpd_power_on(client); //初始化电源和I2C
#if GTP_AUTO_UPDATE
ret = gup_init_update_proc(client); //开机自动更新固件
#endif
ret = gtp_init_panel(client); //区分同IC的不同模组,加载不同的配置信息
thread = kthread_run(touch_event_handler, 0, TPD_DEVICE); //注册tp 消息响应函数
if (!int_type) //EINTF_TRIGGER
{
//注册中断类型和消息
mt_eint_registration(CUST_EINT_TOUCH_PANEL_NUM, EINTF_TRIGGER_RISING, tpd_eint_interrupt_handler, 1);
}
{
#include <linux/hardware_info.h>
hardwareinfo_set_prop(HARDWARE_TP, “GT9xx”); //工程模式查询硬件信息
}
}

(3)触摸TP产生中断时都会调用touch_event_handler(void *unused)来上报坐标,一般走到这个函数说明中断能被正常触发。
static int touch_event_handler(void *unused)
{
ret = gtp_i2c_read(i2c_client_point, point_data, 12); //读取触摸后的TP数据
tpd_down(input_x, input_y, 0, 0); //TP down 的消息发送函数
tpd_up(0, 0, 0); //tp up的消息发送函数
}
static void tpd_down(s32 x, s32 y, s32 size, s32 id)
{
#ifdef TPD_HAVE_BUTTON
if (FACTORY_BOOT == get_boot_mode() || RECOVERY_BOOT == get_boot_mode())
{
tpd_button(x, y, 1); //工厂模式,android没有起来,需要另外处理按键消息
}
#endif
}

八. 对于TP异常的主要调试方法

[DESCRIPTION]
TouchPanel使用时突然没有响应的问题,通过adb shell getevent查看,此时TP driver还在给上层报数据。
(adb shell getevent /dev/input/event3)
使用 adb shell getevent 命令检查 TouchPanel是否正常工作
[SOLUTION]

  1. 使用如下命令找出 mtk-tpd 对应的event设备
    adb shell getevent -i
  2. 使用此设备读取 TouchPanel上报的事件:
    adb shell getevent /dev/input/event3
    每一行有三个数值,通过查询input.h,可以得到其含义,举例如下:
    type code value
    1=EV_KEY 0x14a(330) = BTN_TOUCH Down=1, Up=0
    3=EV_ABS 0x30(48) = ABS_MT_TOUCH_MAJOR 1
    3=EV_ABS 0x35(53) = ABS_MT_POSITION_X x=284
    3=EV_ABS 0x36(54) = ABS_MT_POSITION_Y y=366
    3=EV_ABS 0x39(57) = ABS_MT_TRACKING_ID point index=1
    0=EV_SYN 0x2(2) = SYN_MT_REPORT 0
    0=EV_SYN 0x0(0) = SYN_REPORT 0
    C:>adb shell getevent
    add device 1: /dev/input/event0
    name: “mtk-kpd”
    add device 2: /dev/input/event4
    name: “mtk-tpd-kpd”
    could not get driver version for /dev/input/mouse0, Not a typewriter
    add device 3: /dev/input/event3
    name: “mtk-tpd”
    add device 4: /dev/input/event2
    name: “hwmdata”
    add device 5: /dev/input/event1
    name: “ACCDET”
    could not get driver version for /dev/input/mice, Not a typewriter
    C:>adb shell
    root@android:/ # getevent dev/input/event3
    getevent dev/input/event3
    0000 0002 00000000
    0000 0000 00000000
    0001 014a 00000001 //表示down
    0003 0030 00000014
    0003 0035 000000f7 //x=247(f7)
    0003 0036 00000165 //y=357(165)
    0003 0039 00000000
    【问题分析】
    TP有丢数据给上层,但上层没有相应的动作,需要找出TP丢的数据跑到什么地方去了,主要涉及到的文件为inputreader.cpp和inputDispatcher.cpp。
    分析数据流向,需要做以下动作:
    第一步
    在inputreader.cpp中把 #define DEBUG_XXX 0全部修改为 #define DEBUG_XXX 1
    在InputDispatcher.cpp中把 #define DEBUG_XXX 0全部修改为 #define DEBUG_XXX 1
    第二步
    build InputReader.cpp和InputDispatcher.cpp所在的模块就可以了
    ./mk projectname mm frameworks/base/services/input
    第三步
    adb push out/target/product/projectname/system/lib/libinput.so system/lib
    第四步
    重启手机,可以抓相关的LOG了
    上面第一步有打开一项:DEBUG_FOCUS,这个会打印input 信息的取向,key words为“InputDispatcher: Focus entered window:”和“InputDispatcher: Focus left window:”
    【问题结论】
    可以通过key words“InputDispatcher: Focus entered window:”和“InputDispatcher: Focus left window:”
    来找数据跑到什么位置了,进而找出问题的root cause。
    [TouchPanel]Factory mode下,TouchPanel画线测试不流畅
    直接修改fmt_touch.c–àtouch_update_thread函数最后的两个point_count%2,修改为point_count%5就OK了。
    C-TouchPanel driver中,在送BTN_TOUCH时,必须要成对使用,即
    DOWN: input_report_key(tpd->dev, BTN_TOUCH,1);
    UP: input_report_key(tpd->dev, BTN_TOUCH,0);
    [DESCRIPTION]
    电容屏客制化文件vitual key的配置
    [SOLUTION]
    添加tp的virtual key,需在tp对应的头文件(tpd_custom_xxx.h)中添加如下设置:
    1.定义宏TPD_HAVE_BUTTON;
    2.定义TPD_BUTTON_HEIGHT,TPD_KEY_COUNT,TPD_KEYS和TPD_KEYS_DIM,
    分别用于定义button被识别的纵向坐标,button的个数,对应的功能键,和每个功能键的坐标。配置示例:
    #define TPD_HAVE_BUTTON
    #define TPD_BUTTON_HEIGHT 480 //这个不小于LCD的分辨率的height
    #define TPD_KEY_COUNT 4
    #define TPD_KEYS {KEY_MENU, KEY_HOME, KEY_BACK, KEY_SEARCH}
    #define TPD_KEYS_DIM {{40,500,40,60},{120,500,40,60},{200,500,40,60},{280,500,40,60}}
    其中,{40,500,40,60}对应了KEY_MENU的坐标, (40,50)是该key center的坐标,40是该键的宽度,60是该键的高度.
    3.button定义初始化成功后,通过adb shell,可以在/sys/board_properties/virtualkeys.mtk-tpd中看到这些button的定义。
    [DESCRIPTION]
    触屏太灵敏,有时候点击一下会误认为滑动事件,造成误识别。
    [SOLUTION]
    增大触发触屏滑动所需要的距离条件,将Config.xml(frameworks\base\core\res\res\values)中的语句
    8dp
    修改为:
    24dp
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人在路上……

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值