零、点亮新tp
1. 修改kernel-3.18\arch\arm\configs\len6737m_35_m0_debug_defconfig、len6737m_35_m0_defconfig
CONFIG_INPUT_TOUCHSCREEN=y
CONFIG_TOUCHSCREEN_MTK=y
#CONFIG_TOUCHSCREEN_MTK_FT6X36=y
CONFIG_TOUCHSCREEN_MTK_GT1X=y //打开指定的tp,关闭其他的
#CONFIG_TOUCHSCREEN_MTK_GSLX680=y
2. 修改device\alibaba\b905_lezhou\ProjectConfig.mk
CUSTOM_KERNEL_TOUCHPANEL = GT1XX //修改为指定tp
3. 添加驱动代码,放到kernel-3.18\drivers\input\touchscreen\mediatek\
创建文件夹 GT1X,文件夹中包含gt1x_tpd.c、gt1x_generic.c、Makefile等近10个文件
4. Y:\code\code5\mtk6737_pb5_1_0_cmcc\kernel-3.18\drivers\input\touchscreen\mediatek\Kconfig 添加:
config TOUCHSCREEN_MTK_GT1X
bool "GT1X for Mediatek package"
default n
help
Say Y here if you have GT1X touch panel.
If unsure, say N.
To compile this dirver as a module, choose M here: the
module will be called.
5. 在kernel-3.18\drivers\input\touchscreen\mediatek\Makefile 添加:
obj-$(CONFIG_TOUCHSCREEN_MTK_GT1X) += GT1X/
一、tp常用调试方法:
1. adb查看tp型号: -- 从log中查看
2. 查看tp报点
2.1 驱动中有打印的话:
cat /proc/kmsg | grep "tpd"
cat /proc/kmsg | grep -i "key|power|backlight"
2.2 可以直接从input设备节点/dev/input/event?读取
getevent -i
getevent -t /dev/input/event5 (event?,用[getevent -i] 查看)
-- 查看到的是原始数据,看不出坐标点,只能看出有无上报
2.3 查看hal层收到的数据
-- 尚未找到hal层代码路径
3. 在tp还不通的时候/frameworks/base/include/ui/KeycodeLabels.h中定义了很多keyevent
inut keyevent 3 //home
inut keyevent 4 //back
inut keyevent 26 //power
4 检查硬件
用万用表测量6个引脚的电压:
正常工作电压 休眠电压
INT 1.8V 0V
RST 1.8V 1.8V
VDD 2.8V 2.8V
SDA 1.8V 1.8V
SCL 1.8V 1.8V
GND 0V 0V
通过[万用表]查看中断脚有无中断 - 实测可以
通过[万用表]查看TP的GND是否与主板的GND导通
通过[示波器]查看sda有无数据波形
二、如何使能tp的log
1 GT5668 默认打开 GTP_DEBUG() 由宏控制
#define GTP_DEBUG_ON 1 // enable log printed by GTP_DEBUG(...)
2 ft6xx6_ges 默认关闭 TPD_DEBUG()
-- 暂时没找到哪边开关
三、虚拟按键
1 虚拟按键坐标通常写在dts中,也可能写死在驱动,具体看驱动
&touch {
tpd-resolution = <720 1280>; // 分辨率 - 不用这里的,而是用defconfig中的lcm宽与高
use-tpd-button = <1>; // 虚拟按键使能
tpd-key-num = <3>; // 虚拟按键个数
tpd-key-local= <139 172 158 0>; // 虚拟按键坐标 - 兑换139 与158的位置可以按键对换
tpd-key-dim-local = <90 883 100 40 230 883 100 40 370 883 100 40 0 0 0 0>;
2 通过sys节点读取
cat /sys/board_properties/virtualkeys.mtk-tpd // 获取软件中虚拟按键坐标
2.1 读取底层TP虚拟安静键值
cat proc/kmsg | grep "tpd"
2.2 读取上层TP虚拟安静键值
logcat | grep "keyCode"
3 从input设备节点/dev/input/event?读取
getevent -i
getevent -t /dev/input/event5 // 获取tp在内核中通过input上报的数据
-----虚拟按键跟tp供用一个input设备
4 getevent -l /dev/input/event5 // 可以查看键值坐标,如:
// =========虚拟按键按下所报键值===========
EV_ABS ABS_MT_TOUCH_MAJOR 00000014
EV_ABS ABS_MT_TRACKING_ID 00000000
EV_KEY BTN_TOUCH DOWN
EV_ABS ABS_MT_POSITION_X 0000003c // 换成十进制为(60,2100)
EV_ABS ABS_MT_POSITION_Y 00000640 // 换成十进制为(60,2100)
EV_SYN SYN_MT_REPORT 00000000
EV_SYN SYN_REPORT 00000000
EV_KEY BTN_TOUCH UP
EV_SYN SYN_MT_REPORT 00000000
EV_SYN SYN_REPORT 00000000
四、tp翻转180度
kernel-3.18\drivers\input\touchscreen\mediatek\ft6x36\focaltech_core.c 打开宏:
#define CONFIG_TPD_ROTATE_180
驱动中有:(没有可以自己实现)
#if defined(CONFIG_TPD_ROTATE_90) || defined(CONFIG_TPD_ROTATE_270) || defined(CONFIG_TPD_ROTATE_180)
static void tpd_rotate_180(int *x, int *y)
{
*y = TPD_RES_Y + 1 - *y; // TPD_RES_Y -- mtk_tpd.c从defconfig的CONFIG_LCM_HEIGT获得
*x = TPD_RES_X + 1 - *x;
}
#endif
static void tpd_down(int x, int y, int p, int id)
{
#if defined(CONFIG_TPD_ROTATE_180)
tpd_rotate_180(&x, &y);
#endif
...
input_report_abs(tpd->dev, ABS_MT_POSITION_X, x);
}
或者再直接一点,在上报之前:
+ events[i].x = 720 + 1 - events[i].x;
+ events[i].y = 1440 + 1 - events[i].y;
input_report_abs(tpd->dev, ABS_MT_TOUCH_MAJOR, events[i].area);
input_report_abs(tpd->dev, ABS_MT_POSITION_X, events[i].x);
input_report_abs(tpd->dev, ABS_MT_POSITION_Y, events[i].y);
五、相同ic的tp模组做兼容 - 根据读寄存器OxB8,
1.
2.
3.
六、打开ESD - 打静电的时候出现tp无功能(按电源键休眠再唤醒才会恢复正常)
1. 思立微的tp: 修改kernel-3.18/drivers/input/touchscreen/mediatek/gsl915/mtk_gslX680_V2.c(固件也需要打开ESD)
- //#define GSL_MONITOR
+ #define GSL_MONITOR
2. 汇顶的tp: 修改kernel-3.18/drivers/input/touchscreen/mediatek/GT5668/gt1x_generic.h(固件也需要打开ESD)
- #define GTP_ESD_PROTECT 0 // esd-protection module (with a cycle of 2 seconds)
+ #define GTP_ESD_PROTECT 1 // esd-protection module (with a cycle of 2 seconds)
3.
tp调试案例
案例一 : tp(gt5668)无功能 - 5行代码应该要跑 却被宏关掉 - 挪到宏外
现象 : 触摸tp无反应,查看log(getevent)也不报点
平台 : androidN,MTK6737
排查过程: 1. 查看tp 报点(getevent -t /dev/input/event*),触摸时无报点
2. 修改下发参数,先关闭gt1x_generic.h中的宏 -> 无改善
- #define GTP_DRIVER_SEND_CFG 1
+ #define GTP_DRIVER_SEND_CFG 0 //1
3. 请项目经理找tp模组厂要下发的参数,何入gt1x_generic.h中的
#define GTP_CFG_GROUP0(宏数组)中,并打开上一步关闭的宏 -> 无改善
4. 查看mtklog:
(1)[164:mtk-tpd]<>[gt1x_touch_event_handler:1344]Additional Int Pulse.// 额外的中断信号 -> 不明
5. 老大徐工拿去处理之后,发现修改gt1x_generic.h就ok了
- #define GTP_PROXIMITY 0 // proximity module (function as the p-sensor)
+ #define GTP_PROXIMITY 1 //0 // proximity module (function as the p-sensor)
6. alps\kernel-3.18\drivers\input\touchscreen\mediatek\GT5668\gt1x_tpd.c
static int tpd_event_handler(void *unused)
{
- #if (GTP_PROXIMITY || HOTKNOT_BLOCK_RW)
u8 end_cmd = 0;
- #endif
sched_setscheduler(current, SCHED_RR, ¶m);
do {
set_current_state(TASK_INTERRUPTIBLE);
wait_event_interruptible(waiter, tpd_flag != 0);
tpd_flag = 0;
set_current_state(TASK_RUNNING);
#if (GTP_PROXIMITY || HOTKNOT_BLOCK_RW)
exit_work_func:
+ #endif // 使下面5行代码,无论宏开没开都有跑
if (!gt1x_rawdiff_mode && (ret >= 0 || ret == ERROR_VALUE)) {
ret = gt1x_i2c_write(GTP_READ_COOR_ADDR, &end_cmd, 1);
if (ret < 0) {
GTP_INFO("I2C write end_cmd error!");
}
}
- #endif
} while (!kthread_should_stop());
return 0;
}
==> ok
案例二 : tp(gsl915)打开静电处理 - 导致camera无连拍
现象 : camera连拍失效,按住拍照键理应连拍40张,结果只拍到1张
平台 : androidN,MTK6737
排查过程: 1. 用版本回退的方法,发现有个commit在tp驱动中打开了宏:
#define GSL_MONITOR,导致camera无连拍
2. 查看tp 报点(getevent -t /dev/input/event*),发现camera拍照按住一会就不报点了
3. 思立微gsl915,打开#define GSL_MONITOR - 静电处理
处理方案: 暂时关闭宏#define GSL_MONITOR, 安排FAE过来优化tp之后再打开
总结 : camera连拍问题,比较难怀疑到tp,可以用版本回退方法排查。
案例三 : tp(hx8527)i2c地址 - 八位地址与七位地址
现象 : tp不通
平台 : androidN,MTK6737
排查过程: 1.tp不通,询问FAE得知tp的i2c地址为0x90,由于dws最大只能写0x80,故在驱动中写死0x90
查看串口log, 以下报错信息:
[name:i2c&]ERROR,510: id=1,addr: 90, transfer error
[name:i2c&]ERROR,516: I2C_ACKERR
2.觉得i2c地址还是不大对劲,尝试将0x90右移一位,变为0x48,尝试,不在报上面的错误
处理方案: 将八位地址改为七位地址
总结 : 由于是模组厂的FAE,提供的信息可能生硬,并不准确,比如这边FAE提供i2c地址为0x90,而我们需要的是七位地址
案例四 : tp(hx8527)无功能 - 驱动版本太老旧
现象 : tp不通
平台 : androidN,MTK6737
排查过程: 1.接着案例三(i2c八位地址改为七位地址后)
2.查看mtklog(kernel_log),找到tp报错信息,由i2c.c打印:
[165:mtk-tpd][name:i2c&]: _i2c_get_transfer_len fail,return_value=-22
[165:mtk-tpd][name:i2c&]: non-WRRD transfer length is not right. trans_len=80,
3.问题未解决,等待FAE支持
FAE提供了一份新的驱动就ok了(驱动中要打开宏: #define MTK_I2C_DMA)
处理方案: FAE更换一份驱动
总结 : 驱动工程师自己搞不定的可以找FAE,蛮好的
案例五 : 概率性tp(GSL915)无功能 - 静电导致
现象 : 整机在使用过程中,概率性出现TP卡死(即除虚拟按键外,点击界面上任何图标均无作用)
平台 : androidL,MTK6580
排查过程: 1. 客户组装厂发现问题,研发内部进行测试未发现,但通过对TP打静电复现了此问题
(正常情况下,用一只手触摸到TP上,同时在另外点击其他位置时也是没有触摸功能,现象相同)
处理方案: 1.TP 增加ESD 软件功能和升级固件增强ESD及死点处理:
代码修改参考:
#define GSL_MONITOR (打开ESD 功能并优化固件参数)
2.TP 处增加环境处理(贴导电胶布),提高GSL915 抗静电能力
总结 : 由静电等原因引起的TP 一直报点(俗称“死点”),导致的视频中的现象(即主界面上有一直报点,导致无法点击任何功能,
但虚拟按键是上报按键值而非TP 坐标点,固虚拟按键有作用的但主界面上TP点无功能)
案例六 : GT5668 与 GT9XX 兼容(两个tp共用一份驱动:GT9XX)
现象 :
平台 : androidL,MTK6580
排查过程: 1. alps\kernel-3.10\drivers\input\touchscreen\mediatek\GT9XX\gt9xx_driver.c
static s8 gtp_i2c_test(struct i2c_client *client)
- if ((!ret) && (hw_info == 0x00900600 )) // GT970 读出来是0x00900600
+ if ((!ret) && ((hw_info == 0x00900600) || (hw_info == 0x00901003))) // GT5668读出来是0x00901003
2. alps\kernel-3.10\drivers\misc\mediatek\mach\mt6580\hct6580_weg_a_l\touchpanel\GT9XX\tpd_custom_gt9xx.h
- #define GTP_DRIVER_SEND_CFG 1 //driver send config to TP on intilization (for no config built in TP flash)
+ #define GTP_DRIVER_SEND_CFG 0 //driver send config to TP on intilization (for no config built in TP flash)
- #define GTP_COMPATIBLE_MODE 1 // ningshuigen // compatible with GT9XXF
+ #define GTP_COMPATIBLE_MODE 0 // ningshuigen // compatible with GT9XXF
- #define GTP_GESTURE_WAKEUP 1
+ #define GTP_GESTURE_WAKEUP 0
- #define GTP_DEBUG_ARRAY_ON 1
- #define GTP_DEBUG_FUNC_ON 1
+ #define GTP_DEBUG_ARRAY_ON 0
+ #define GTP_DEBUG_FUNC_ON 0
总结 : GT5668 与 GT9XX flash大小不一致故无法使用下发参数与固件升级,只能由tp模组厂烧录固件,且手势唤醒、tp灭屏功能都要关闭
案例七 : tp双点触摸偏差(mstar - MSG2256)需要 DTS文件里面tpd--filter--enable的参数设置为0
现象 : 单点触摸正常,双点触摸有一点偏查大
平台 : androidN,MTK6737
排查过程: 1. 无排查过程,fae提供修改方法:
alps\kernel-3.18\arch\arm64\boot\dts\magc6737m_65_n.dts
&touch {
...
- tpd-filter-enable = <1>;
+ tpd-filter-enable = <0>;
==>ok
案例八 : tp功耗过大 - 0.8mA - 关闭tp手势唤醒
现象 : 整机功耗过大,飞行模式待机电流:5.7mA,拔掉tp后4.9mA
平台 : androidN,MTK6737
排查过程: 1. 硬件测试发现整机功耗过大,飞行模式待机电流:5.7mA
2. 测单板电流 - 正常
3. 逐一去掉外围(lcm、tp、camera、fingerprint、sensor),发现由tp引起
4. 检查配置,发现没有tp手势唤醒,而软件默认开启手势唤醒
修改alps\kernel-3.18\drivers\input\touchscreen\mediatek\ft6xx6_ges\focaltech_core.h
- #define FTS_GESTRUE_EN 1
+ #define FTS_GESTRUE_EN 0
==>功耗正常
案例九 : tp(gsl915) i2c不通 - TP地线没接
现象 : tp无功能
平台 : androidN,MTK6737
排查过程: 1. 查看dmesg(adb shell dmesg > e:5.log),发现i2c报错
[ 14.021471] .(2)[102:kworker/u8:1][name:i2c&]ERROR,510: id=1,addr: 40, transfer error
[ 14.022486] .(2)[102:kworker/u8:1][name:i2c&]ERROR,516: I2C_ACKERR
[ 14.039876] .(2)[102:kworker/u8:1]------gslX680 test_i2c error------
[ 14.040699] .(2)[102:kworker/u8:1]gslx680 init error,exit!!
2. 兼容其他tp - JD100的tp(icn85xx) - 发现是ok的
3. fae现场调试 - 发现tp的地线与主板不通(此tp的座子在屏的fpc上),而用别的tp时接在主板的tp座子是ok的
-> 跳线把地线接上 - tp i2c通讯成功
4. tp报点错乱 -> fae升级固件 -> ok
处理方案: 暂时把地线接上调试,通知模组厂修改fpc
总结 : tp的fpc转接线经常出问题,i2c不通时可以用万用表测一下tp六个脚是否与主板导通
案例十 : tp 断点,解锁的时候概率性断点,导致无法解锁
平台: androidN,MTK6737
修改: 1. alps\frameworks\base\packages\SystemUI\src\com\android\systemui\classifier\FalsingManager.java
public class FalsingManager implements SensorEventListener {
private static final String ENFORCE_BOUNCER = "falsing_manager_enforce_bouncer";
private static final int[] CLASSIFIER_SENSORS = new int[] {
android.hardware.Sensor.TYPE_GYROSCOPE,
+ //android.hardware.Sensor.TYPE_PROXIMITY, // 修改这里只会影响真ps,不会影响tp_ps
};
private static final int[] COLLECTOR_SENSORS = new int[] {
Sensor.TYPE_ACCELEROMETER,
Sensor.TYPE_GYROSCOPE,
+ //android.hardware.Sensor.TYPE_PROXIMITY, // 修改这里只会影响真ps,不会影响tp_ps
Sensor.TYPE_LIGHT,
Sensor.TYPE_ROTATION_VECTOR,
};
案例十一: tp(gt5668) 手势唤醒后,tp无功能
现象: tp手势唤醒后未能退出手势模式,触摸无报点,但有上报手势键值
平台: androidL,MTK6580
修改: 1. 抓取log - 显示手势唤醒之后打开了tp灭屏功能 - 不该打开的
[ 359.892565] (0)[143:mtk-tpd]<>[gesture_event_handler:204]0x814c = 0xCC,0x01,0x92,0x20
[ 359.894424] (0)[143:mtk-tpd]<>[gesture_event_handler:318]Gesture: 0xCC, points: 1
[ 359.894442] (0)[143:mtk-tpd]<>[gesture_event_handler:325] Double click to light up the screen! // 双击手势
[ 359.987675] (0)[1003:Binder:718_4]<>[gt1x_ps_enable:1538] psensoroperator cmd:2
[ 359.987682] (0)[1003:Binder:718_4]<>[gt1x_ps_enable:1489] Proximity function to be on.
[ 360.051551] (0)[1003:Binder:718_4]<>[gt1x_ps_enable:1505] Proximity function enable success. // 进入tp灭屏
[ 360.239886] (1)[99:kworker/u8:1]GTP touch_resume_workqueue_callback
[ 360.239907] (1)[99:kworker/u8:1]<>[gt1x_resume:2277] Resume start...
[ 360.239922] (1)[99:kworker/u8:1]<>[gt1x_resume:2281] Proximity is on!
[ 360.251645] (0)[2480:kworker/0:3]<>[gt1x_ps_operate:1538] psensor operator cmd:4
2. 正常按电源键唤醒log
[1501:kworker/u8:4]GTP touch_resume_workqueue_callback
[1501:kworker/u8:4]<>[gt1x_resume:2277] Resume start...
[1501:kworker/u8:4]<>[gt1x_wakeup_sleep:982]Wake up begin. // 应该会跑这句log
[1501:kworker/u8:4]<>[gt1x_reset_guitar:810] GTP RESET!
[143:mtk-tpd]<>[gt1x_touch_event_handler:1348]Additional Int Pulse.<196 -> 2733>
3. 电话tp灭屏,移开后唤醒log
[ 847.904369] (0)[143:mtk-tpd]<>[gt1x_ps_operate:1538] psensor operator cmd:4
[ 847.904418] (0)[143:mtk-tpd]<>[gt1x_ps_report:1481] Report proximity state: FARAWAY
[ 847.904436] (0)[143:mtk-tpd]<>[gt1x_prox_event_handler:1518]REG INDEX[0x814E]:0x80
[ 848.499616] (3)[4027:kworker/u8:0]GTP touch_resume_workqueue_callback
[ 848.499629] (3)[4027:kworker/u8:0]<>[gt1x_resume:2277] Resume start...
[ 848.499635] (3)[4027:kworker/u8:0]<>[gt1x_resume:2281] Proximity is on! // 对比发现手势唤醒的log与此相同
4. 对比上面3个log发现问题出在:
手势唤醒时跑了gt1x_ps_enable()函数[怀疑是上层调用,只在80 5.1出现]
在gt1x_ps_enable()做区分,如果是手势唤醒直接return
static s32 gt1x_ps_enable(s32 enable)
{
u8 state;
s32 ret = -1;
#if GTP_GESTURE_WAKEUP
if (gesture_doze_status != DOZE_DISABLED) { // 如果现在是手势模式
GTP_INFO("PS ignore");
return ret;
}
#endif
案例十二: tp(FT8006M) i2c不通 - DVDD2.8v没有供电
现象 : tp无功能
平台 : androidN,MTK6580
排查过程: 1. 查看dmesg(adb shell dmesg > e:5.log),发现i2c报错
[ 14.021471] .(2)[102:kworker/u8:1][name:i2c&]ERROR,510: id=1,addr: 40, transfer error
[ 14.022486] .(2)[102:kworker/u8:1][name:i2c&]ERROR,516: I2C_ACKERR
2. 万用表查看中断脚有无中断 - 无中断
3. 万用表测量DVDD电压: 0v
4. 检查代码:alps\kernel-3.18\drivers\input\touchscreen\mediatek\focaltech_ts\focaltech_core.c
#if FTS_POWER_SOURCE_CUST_EN
tpd->reg = regulator_get(tpd->tpd_dev, "vtouch");
retval = regulator_set_voltage(tpd->reg, 2800000, 2800000);
DVDD上电受宏控制,而宏没开
==> 打开宏: FTS_POWER_SOURCE_CUST_EN
案例十三: tp(hxchipset) - 中断不触发 - 暂时改为轮询 - 中断模式修改固件中触发方式(有边缘触发改为电平触发)
平台: androidO,MTK6737
修改: 1. tp中断函数不触发 - tp注册流程都跑过了,中断也成功注册(cat /proc/interrupts)
2. 查看gpio口引脚状态也是对的,(cat /sys/class/misc/mtgpio/pin)
用示波器测量中断脚,无触摸中断脚高低电平也在变化,时大约10ms来一次中断
3. ==> 改为轮询模式,tp可以滑动
修改alps\kernel-3.18\drivers\input\touchscreen\mediatek\hxchipset\himax_platform.c
+ #define HX_POLL_MODE 1
static void himax_ts_work_func(struct work_struct *work)
{
struct himax_ts_data *ts = container_of(work, struct himax_ts_data, work);
+ #if defined(HX_POLL_MODE)
+ if (ts->client->irq == 0 && ts->suspended == false)
+ #endif
himax_ts_work(ts);
}
int himax_ts_register_interrupt(struct i2c_client *client)
{
ts->irq_enabled = 0;
ts->use_irq = 0;
+ #if defined(HX_POLL_MODE)
+ client->irq = 0; //use polling mode, add by chenjp
+ #endif
4. 最后fae更新了固件之后中断模式ok - 仅修改固件中触发方式(有边缘触发改为电平触发)
具体是固件中有一个位0-电平触发 1-边缘触发
0x05 -> 0x04
案例十四: tp(FT8006M)i2c不通 -- 实际是nt36xxx而非FT8006M
平台: androidO,MTK6737
修改: 1. kernel log(dmesg)显示:
[ 15.047317] <1>.(1)[141:kworker/u8:2][name:i2c&]ERROR,510: id=1,addr: 38, transfer error
[ 15.048377] <1>.(1)[141:kworker/u8:2][name:i2c&]ERROR,516: I2C_ACKERR
2. 后来发现是驱动合入错误,更换供应商提供的驱动nt36xxx -->ok
案例十五: tp虚拟按键无功能 - dts中配置有误
现象: 同一台机器在androidN中ok,在androidO中tp虚拟按键无功能
平台: androidO,MTK6737
修改: 1. 查看getevent上报(getevent -l /dev/input/event2)
触摸tp下方的虚拟按键时候,有坐标上报
k37mv1_64_bsp:/ # getevent -l /dev/input/event2
EV_ABS ABS_MT_TOUCH_MAJOR 00000014 // 按下返回键上报
EV_ABS ABS_MT_TRACKING_ID 00000000
EV_KEY BTN_TOUCH DOWN
EV_ABS ABS_MT_POSITION_X 000001c2 // 换成十进制为(450,2100)
EV_ABS ABS_MT_POSITION_Y 00000640 // 换成十进制为(450,2100)
EV_SYN SYN_MT_REPORT 00000000
EV_SYN SYN_REPORT 00000000
EV_KEY BTN_TOUCH UP
EV_SYN SYN_MT_REPORT 00000000
EV_SYN SYN_REPORT 00000000
EV_ABS ABS_MT_TOUCH_MAJOR 00000014
EV_ABS ABS_MT_TRACKING_ID 00000000
EV_KEY BTN_TOUCH DOWN
EV_ABS ABS_MT_POSITION_X 0000010e // 换成十进制为(270,2100)
EV_ABS ABS_MT_POSITION_Y 00000640 // 换成十进制为(270,2100)
EV_SYN SYN_MT_REPORT 00000000
EV_SYN SYN_REPORT 00000000
EV_KEY BTN_TOUCH UP
EV_SYN SYN_MT_REPORT 00000000
EV_SYN SYN_REPORT 00000000
EV_ABS ABS_MT_TOUCH_MAJOR 00000014
EV_ABS ABS_MT_TRACKING_ID 00000000
EV_KEY BTN_TOUCH DOWN
EV_ABS ABS_MT_POSITION_X 0000003c // 换成十进制为(60,2100)
EV_ABS ABS_MT_POSITION_Y 00000640 // 换成十进制为(60,2100)
EV_SYN SYN_MT_REPORT 00000000
EV_SYN SYN_REPORT 00000000
EV_KEY BTN_TOUCH UP
EV_SYN SYN_MT_REPORT 00000000
EV_SYN SYN_REPORT 00000000
--> 与dts中配置一致
&touch {
tpd-resolution = <720 1280>;
use-tpd-button = <1>;
tpd-key-num = <3>;
tpd-key-local= <580 172 158 0>;
tpd-key-dim-local = <60 2100 100 100 240 2100 100 100 450 2100 100 100 0 0 0 0>;
2. 查看tp数据上报log - 正常
kernel-3.18\drivers\input\touchscreen\mediatek\GT9XX\gt9xx_driver.c
tpd_i2c_probe()
tpd_irq_registration();
request_irq(touch_irq, (irq_handler_t) tpd_eint_interrupt_handler, IRQF_TRIGGER_FALLING, "TOUCH_PANEL-eint", NULL);
static void tpd_eint_interrupt_handler(void)
{
tpd_flag = 1;
+ printk("liuzhigou tpd_eint_interrupt_handler() start\n"); // 在中断处理函数中添加log
wake_up_interruptible(&waiter);
}
static int touch_event_handler(void *unused)
do
{
set_current_state(TASK_INTERRUPTIBLE);
wait_event_interruptible(waiter, tpd_flag != 0);
+ printk("liuzhigou i2c read tp point data start\n"); // tp读坐标数据
gtp_i2c_read(i2c_client_point, point_data, 12);
#ifdef TPD_HAVE_BUTTON
key_value = point_data[3 + 8 * touch_num];
if (key_value || pre_key)
{
for(i=0;iOK
案例十七:
平台: androidO,MTK6737
修改: 1.
2.
3.
案例检索:
案例一 : tp(gt5668)无功能 - 5行代码应该要跑 却被宏关掉 - 挪到宏外
案例二 : tp(gsl915)打开静电处理 - 导致camera无连拍
案例三 : tp(hx8527)i2c地址 - 八位地址与七位地址 - dws写7位地址
案例四 : tp(hx8527)无功能 - 驱动版本太老旧 - 更新驱动
案例五 : 概率性tp(GSL915)无功能 - 静电导致 - 打开防静电的宏
案例六 : GT5668 与 GT9XX 兼容(两个tp共用一份驱动:GT9XX)
案例七 : tp(mstar - MSG2256)双点触摸偏差需要 DTS文件里面tpd--filter--enable的参数设置为0
案例八 : tp(ft6xx6_ges)功耗过大 - 0.8mA - 关闭tp手势唤醒
案例九 : tp(gsl915) i2c不通 - TP地线没接
案例十 : tp 断点,解锁的时候概率性断点,导致无法解锁 - 修改FalsingManager.java