Android MTK TP Driver 触屏驱动

本文介绍了在MTK 6765(Android9.0 / kernel - 4.9)环境下调试focaltech触屏驱动的方法。先概述了TP启动过程及驱动组成,接着详细阐述修改驱动文件的步骤,包括添加内核驱动文件、DTS设备树配置、DWS文件配置和用户文件配置,最后进行了小结。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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,查看正确获取设备树数据。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

火星papa

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

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

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

打赏作者

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

抵扣说明:

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

余额充值