一:基础知识
Kernel 通过input 子系统与Android交互,每当我们点击屏幕或抬起都会产生中断,
每当kernel收到中断会通过i2c总线读取TP控制器产生的坐标数据,kernel就会通过input系统上报给android层, android层会完成相应的动作。
1. 硬件管脚:
SCL0: IIC 时钟引脚
SDA0:IIC数据引脚
RST: 复位引脚
EINT: IIC 中断引脚,触摸事件通过IIC 贯穿到系统
2. TP 增加驱动原理
TMK 增加驱动到静态数组 tpd_driver_list 数组中
static struct tpd_driver_t tpd_device_driver = {
.tpd_device_name = "FT5x0x",
.tpd_local_init = tpd_local_init,
};
module_init(tpd_driver_init)--->tpd_driver_add(&tpd_device_driver)
kernel-3.18/drivers/input/touchscreen/mediatek/mtk_tpd.c TP 设备加载、卸载和平台总线注册
运行 tpd_probe
static int tpd_probe(struct platform_device *pdev)
{
...
/* 全局数组tpd_driver_lsit[i]中的tp驱动依次进行如下操作 ,遍历整个数组
执行tp驱动中的tpd_local_init()接口,此接口主要是对tpd_i2c_driver进行i2c
总线的注册,匹配成功后执行tpd_i2c_driver中的probe ,这个probe比较重要,
其中系统会跟TP进行一次i2c通信,如果成功则说明找到了这个驱动,根据
此,可以兼容多款不同IC的TP设备* /
for (i = 1; i < TP_DRV_MAX_COUNT; i++) {
/* add tpd driver into list */
if (tpd_driver_list[i].tpd_device_name != NULL) {
//运行驱动中i2c_add_driver(&tpd_i2c_driver) -->tpd_probe 读取成功则全局 tpd_load_status设置为1 ,这可以兼容不同TP
tpd_driver_list[i].tpd_local_init();
/* msleep(1); */
if (tpd_load_status == 1) {//// 如果上面的i2c总线注册成功,则将tpd_load_status置位
TPD_DMESG("[mtk-tpd]tpd_probe, tpd_driver_name=%s\n",
tpd_driver_list[i].tpd_device_name);
g_tpd_drv = &tpd_driver_list[i]; //并将g_tpd_drv指向这个驱动
break;
}
}
}
...
if(input_register_device(tpd->dev)) //向输入子系统注册输入设备
...
}
二:从零添加新TP
1. 修改kernel-3.18/arch/arm/configs/hys6737m_35_m0_debug_defconfig
kernel-3.18/arch/arm/configs/hys6737m_35_m0_defconfig
-CONFIG_TOUCHSCREEN_MTK_GT1151=y
+CONFIG_TOUCHSCREEN_MTK_FT6X36=y //打开指定的tp,关闭其他的
2. 修改 device/teksun/hys6737m_35_m0/ProjectConfig.mk
+CUSTOM_KERNEL_TOUCHPANEL = ft6x36 //修改为指定tp
3. 添加驱动代码,把ft6x36放到 kernel-3.18/drivers/input/touchscreen/mediatek/ 中
对TP功能进行修改,分辨率,等。
有dts 的需要修改kernel-3.18/arch/arm/boot/dts/hys6737m_35_m0.dts
- tpd-resolution = <720 1280>;
&nb
3TP调试
最新推荐文章于 2021-03-30 15:29:12 发布