Android MTK TP Driver 触屏驱动
——— 触屏驱动小结
智能手机驱动在LCD调试OK后,紧接着就是要将TP搞定了。此篇简单介绍了在MTK 6765(Android9.0 / kernel-4.9)环境下的调试focaltech的驱动小结。
目录
一、TP启动过程及驱动概述
Mtk Touch driver 驱动包括:Mtkplatform 虚拟平台设备驱动、Module touch IC 驱动、Inputsubsystem。
(1)Module touch IC 驱动就是我们要添加的主要内容。
(2)Mtk platform 设备驱动是mtk为了兼容多个touch IC驱动而设计出来的虚拟驱动,它会去遍历每一个touch IC驱动,直到其中一个初始化成功。
(3)Linux input_subsystem是linux的输入子系统,我们的输入设备都要通过这个子系统进行上报事件以及设置事件的类型。
下面这段就是驱动代码中最重要的接口主体部分:
static struct tpd_driver_t tpd_device_driver = {
.tpd_device_name = "FT5x0x",
.tpd_local_init = tpd_local_init, //tp初始化,主要是注册iic、设置电压、注册中断等
.suspend = tpd_suspend, //休眠
.resume = tpd_resume, //唤醒
.attrs = {
.attr = ft5x0x_attrs,
.num = ARRAY_SIZE(ft5x0x_attrs),
},
};
二、修改驱动文件
在这里我们以实例的方式描述增加有一款TP的驱动。
首先,我们要了解原理图,规格书。了解驱动是什么芯片,规格书上了解相关硬件属性通讯方式,然后再一步一步添加文件和验证。缺少的找供应商索要。
当前我要添加的TP芯片属性如下表:
项目 | 内容 |
---|---|
芯片名称 | FT5436 |
品牌 | focaltech |
I2C地址 | 0x38 |
分辨率 | 720*1280 |
触摸按键 | 带3个触屏按键 |
1、添加内核驱动文件
(1)驱动文件移植到指定目录
将驱动文件打包到 focaltech_touch文件夹, 并将focaltech_touch驱动文件夹复制到内核触屏的目录下,有的驱动文件分散文件就多,有的比较集中文件就少。
kernel-4.9/drivers/input/touchscreen/mediatek
(2)修改Kconfig 文件
修改 mediatek 目录下的 Kconfig 文件,在这个文件增加如下一行,添加编译配置项目:
config TOUCHSCREEN_MTK_FOCALTECH_TS
bool "FOCALTECH_TS for Mediatek package"
default n
help
Say Y here if you have focaltech_touch touch panel.
If unsure, say N.
To compile this dirver as a module, choose M here: the
module will be called.
source "drivers/input/touchscreen/mediatek/focaltech_touch/Kconfig"
(3)修改Makefile 文件
修改 mediatek 目录下的 Makefile 文件,在这个文件的末尾增加如下一行,添加编译路径:
obj-$(CONFIG_TOUCHSCREEN_MTK_FOCALTECH_TS) += focaltech_touch/
(4)修改内核主文件
内核主文件位置:
kernel-4.9\drivers\input\touchscreen\mediatek\focaltech_touch\focaduiyltech_core.c
修改I2C对应关键内容:
#define FTS_DRIVER_NAME "FT5436"//驱动名称定义
#define INTERVAL_READ_REG 100 /* interval time per read reg unit:ms */
#define TIMEOUT_READ_REG 1000 /* timeout of read reg unit:ms */
#define FTS_I2C_SLAVE_ADDR 0x38//对比的I2C地址
......
/*****************************************************************************
* Focaltech ts i2c driver configuration
*****************************************************************************/
static const struct i2c_device_id fts_tpd_id[] = {{FTS_DRIVER_NAME, 0}, {} };
static const struct of_device_id fts_dt_match[] = {
{.compatible = "mediatek,cap_touch"},//I2C设备树匹配项
{},
};
MODULE_DEVICE_TABLE(of, fts_dt_match);
static struct i2c_driver tpd_i2c_driver = {
.driver = {
.name = FTS_DRIVER_NAME,
.of_match_table = of_match_ptr(fts_dt_match),
},
.probe = tpd_probe,
.remove = tpd_remove,
.id_table = fts_tpd_id,
.detect = tpd_i2c_detect,
};
......
//初始化
static int __init tpd_driver_init(void)
{
FTS_FUNC_ENTER();
FTS_INFO("FocalTech Touchscreen [FT5436] Driver version: %s", FTS_DRIVER_VERSION);//打印logo排查问题
tpd_get_dts_info();//这里获取设备树touch节点位置的值
if (tpd_dts_data.touch_max_num < 2)
tpd_dts_data.touch_max_num = 2;
else if (tpd_dts_data.touch_max_num > FTS_MAX_POINTS_SUPPORT)
tpd_dts_data.touch_max_num = FTS_MAX_POINTS_SUPPORT;
//FTS_INFO("[FT5436]use_tpd_button = %d, tpd_key_num = %d, tpd_key_local = %d %d %d, tpd_dts_data.tpd_key_dim_local=%d",tpd_dts_data.use_tpd_button,tpd_dts_data.tpd_key_num,tpd_dts_data.tpd_key_local[0],tpd_dts_data.tpd_key_local[1],tpd_dts_data.tpd_key_local[2],*tpd_dts_data.tpd_key_dim_local);
FTS_INFO("[FT5436]tpd max touch num:%d", tpd_dts_data.touch_max_num);
#if FTS_PSENSOR_EN
fts_proximity_init();
#endif
if (tpd_driver_add(&tpd_device_driver) < 0) {
FTS_ERROR("[TPD]: Add FTS Touch driver failed!!");
}
FTS_FUNC_EXIT();
return 0;
}
(5)修改内核驱动配置文件
根据项目修改内核配置文件对应项目的宏。
文件路径:
kernel-4.9\drivers\input\touchscreen\mediatek\focaltech_touch\focaltech_config.h
以下几项是关键项,我将他们打开:
/*
* choose your ic chip type of focaltech //设置芯片类型
*/
#define FTS_CHIP_TYPE _FT5436
......
/*
* show debug log info
* enable it for debug, disable it for release //打开DEBUG
*/
#define FTS_DEBUG_EN 1
/*
* Customer power enable
* enable it when customer need control TP power //打开2,8V系统供电
* default: disable
*/
#define FTS_POWER_SOURCE_CUST_EN 1
2、DTS设备树配置
设备树位置:
kernel-4.9\arch\arm64\boot\dts\mediatek\k65v1_64_bsp.dts
调用DTS驱动路径:
kernel-4.9/drivers/input/touchscreen/mediatek/mtk_ypd.c
添加或修改内容:
/* TOUCH start */
&touch {
tpd-resolution = <720 1280>;// 分辨率
use-tpd-button = <1>; // 是否有按键
tpd-key-num = <3>; // 按键数量
// 按键值, 按键对应的值: KEY_MENU, KEY_HOMEPAGE,KEY_BACK
// 定义位于 dts/include/dt-bindings/input/input.h
tpd-key-local = <139 172 158 0>;//触屏按键编号
// 按键对应的矩形区域(中心点x, 中心点y, 宽度,高度)二维矩阵
tpd-key-dim-local = <120 1350 40 20 360 1350 40 20 600 1350 40 20 0 0 0 0>;
tpd-max-touch-num = <5>;// 最大触点个数
tpd-filter-enable = <1>;// 是否开启防抖
tpd-filter-pixel-density = <146>;// 防抖像素密度
tpd-filter-custom-prameters = <0 0 0 0 0 0 0 0 0 0 0 0>;
tpd-filter-custom-speed = <0 0 0>;
pinctrl-names = "default", "state_eint_as_int", "state_eint_output0",
"state_eint_output1", "state_rst_output0", "state_rst_output1";
pinctrl-0 = <&ctp_pins_default>;
pinctrl-1 = <&ctp_pins_eint_as_int>;// 设为INT
pinctrl-2 = <&ctp_pins_eint_output0>;// INT输出低
pinctrl-3 = <&ctp_pins_eint_output1>; // INT输出高
pinctrl-4 = <&ctp_pins_rst_output0>;// RST输出低
pinctrl-5 = <&ctp_pins_rst_output1>;// RST输出高
status = "okay";
};
&pio {
ctp_pins_default: eint0default {
};
ctp_pins_eint_as_int: eint@0 {
pins_cmd_dat {
pinmux = <PINMUX_GPIO0__FUNC_GPIO0>;// 中断IO
slew-rate = <0>;
bias-disable;
};
};
ctp_pins_eint_output0: eintoutput0 { // INT输出低
pins_cmd_dat {
pinmux = <PINMUX_GPIO0__FUNC_GPIO0>;
slew-rate = <1>;
output-low;
};
};
ctp_pins_eint_output1: eintoutput1 { // INT输出高
pins_cmd_dat {
pinmux = <PINMUX_GPIO0__FUNC_GPIO0>;
slew-rate = <1>;
output-high;
};
};
ctp_pins_rst_output0: rstoutput0 {// RST输出低
pins_cmd_dat {
pinmux = <PINMUX_GPIO90__FUNC_GPIO90>;// 复位IO
slew-rate = <1>;
output-low;
};
};
ctp_pins_rst_output1: rstoutput1 {// RST输出高
pins_cmd_dat {
pinmux = <PINMUX_GPIO90__FUNC_GPIO90>;
slew-rate = <1>;
output-high;
};
};
};
/* TOUCH end */
3、DWS文件配置
修改DWS文件的目的是为了配置系统的中断号、设备树I2C地址和对应的名称等。
使用DrvGen.exe工具,配置vendor和kernel目录下的dws文件,
工具路径:
vendor\mediatek\proprietary\scripts\dct\DrvGen.exe)
配置文件路径如下:
vendor:vendor\mediatek\proprietary\bootable\bootloader\lk\target\k65v1_64_bsp\dct\dct\codegen.dws
kernel:kernel-4.9\drivers\misc\mediatek\dws\mt6765\k65v1_64_bsp.dws
如图所示为:中断0;延时0;上升沿触发
如图所示为:I2C名称 CAP_TOUCH; I2C地址:0x38,I2C硬件编号:I2C-0
4、用户文件配置
配置文件路径:
\kernel-4.9\arch\arm64\configs\k65v1_64_bsp_debug_defconfig
\kernel-4.9\arch\arm64\configs\k65v1_64_bsp_defconfig
debug 对应debug版本,如果不嫌麻烦,建议一起更改掉。
对应修改的文件内容:
CONFIG_TOUCHSCREEN_MTK_FOCALTECH_TS=y//打开配置
CONFIG_TOUCHSCREEN_MTK_GT1151 is not set//关闭配置
#CONFIG_TOUCHSCREEN_MTK_FT5X0X is not set//关闭配置
三、小结
1、TP驱动没有动到MTK的系统配置,这一点我认为修改效率还是相对较好的,不用我们上来就要全编译。
2、配置触屏按键的参数是由系统接口来实现获取设备树节点数据的,要如果触屏按键功能不行,可以通过debug,查看正确获取设备树数据。