一,Ilitek 触摸屏简介
Ilitek 提供多种型号的触控屏控制器,如 ILI6480、ILI9341 等,采用 I2C 接口。
这些控制器能够支持多点触控,并具有优秀的灵敏度和响应速度。
Ilitek 的触摸屏控制器监测屏幕上的触摸事件。
当触摸发生时,控制器将触摸坐标(通常是 x 和 y 坐标)通过 I2C 总线发送给主机。
二,驱动移植
1. 设备树配置
查看原理图TP是挂在i2c5节点下:
&i2c5 {
ilitek: ilitek@41 {
compatible = "tchip,ilitek";
reg = <0x41>; //I2C设备地址
pinctrl-names = "default";
pinctrl-0 = <&ilitek_touch_gpio>;
ilitek,irq-gpio = <&gpio3 RK_PC0 IRQ_TYPE_LEVEL_LOW>; //使能引脚
ilitek,reset-gpio = <&gpio3 RK_PC1 GPIO_ACTIVE_HIGH>; //中断引脚
status = "okay";
};
};
&pinctrl {
ilitek-touch {
ilitek_touch_gpio: ilitek-touch-gpio {
rockchip,pins =
<3 RK_PC1 RK_FUNC_GPIO &pcfg_pull_down>,
<3 RK_PC0 RK_FUNC_GPIO &pcfg_pull_up>;
};
};
};
注:一定要对应的I2C bus节点(硬件原理图上会有标注)。
2. 驱动文件配置
a. 拷贝驱动文件
各个文件说明如下:
ilitek_ts.h:驱动头文件,包含驱动中要用到的一些头文件以及宏和函数的声明等。
ilitek_platform_init.c:平台加载初始化需要的文件。
ilitek_main.c:驱动主文件,完成probe的具体实现,GPIO注册、读取TP信息、注册输入设备信息,报点,休眠唤醒处理等。
ilitek_update.c:驱动升级IC固件功能的具体实现。
ilitek_tool.c:用于支持TouchUtility apk 以及创建用命令升级固件、sensor test、查看固件版本的设备节点,以及一些调试命令的使用等等。
ilitek_protocol.c:共用的函数与ilitek protocol等。
ilitek_mp.c:用于sensor test功能。
驱动下载链接:https://download.csdn.net/download/weixin_45639314/90592022
将以上驱动文件( ilitek)拷贝到如下目录:
kernel-5.10/drivers/input/touchscreen/
b. 修改Makefile以及Kconfig
kernel-5.10/drivers/input/touchscreen/Makefile中添加:
obj-$(CONFIG_TOUCHSCREEN_ILITEK) += ilitek/
-------------------------------------------------------
kernel-5.10/drivers/input/touchscreen/Kconfig中添加:
config TOUCHSCREEN_ILITEK
tristate "ILITEK touchscreens matched with screen support for rockchip platform"
depends on I2C && ARCH_ROCKCHIP
help
Say Y here if you have a touchscreen interface using the ILITEK
touchscreen chip on Rockchip platform, and your board-specific
initialization code includes that in its table of IIC devices.
If unsure, say N.
c. 内核中加载驱动
kernel-5.10/arch/arm64/configs/rockchip_defconfig中添加:
CONFIG_TOUCHSCREEN_ILITEK=y
添加结束后单编内核即可。
三,部分驱动代码解析
int ilitek_power_on(bool status)
当定义了 ILITEK_ENABLE_REGULATOR_POWER_ON
宏时才有具体实现,对应的 ilitek_data->vdd
或 ilitek_data->vdd_i2c
需在平台初始化代码中实现。若采用其他供电方式,需根据具体方式修改。
int ilitek_get_gpio_num(void)
用于获取 reset 和 irq GPIO 编号。若无需动态获取,需直接定义ILITEK_RESET_GPIO
和 ILITEK_IRQ_GPIO
为固定值。
int ilitek_request_gpio(void)
申请 GPIO 资源。若申请失败,会先释放再重试一次。成功后会将 reset 设置为输出高电平,irq 设置为输入模式。GPIO 操作需以具体平台接口为准。
复位函数(reset)
参数 delay 表示从拉低到拉高后的延时时间,需大于 IC 的初始化时间。
void ilitek_reset(int delay) {
tp_log_info("delay = %d\n", delay);
if (ilitek_data->reset_gpio > 0) {
#if ILITEK_PLAT != ILITEK_PLAT_MTK
gpio_direction_output(ilitek_data->reset_gpio, 1);
mdelay(10);
gpio_direction_output(ilitek_data->reset_gpio, 0);
mdelay(10);
gpio_direction_output(ilitek_data->reset_gpio, 1);
mdelay(delay);
#else
tpd_gpio_output(ilitek_data->reset_gpio, 1);
mdelay(10);
tpd_gpio_output(ilitek_data->reset_gpio, 0);
mdelay(10);
tpd_gpio_output(ilitek_data->reset_gpio, 1);
mdelay(delay);
#endif
} else {
tp_log_err("reset pin is invalid\n");
}
return;
}
int ilitek_read_tp_info(void)
-
检测到 IC 型号为 ILI2511 时,会将 ilitek_repeat_start 置为 false。
-
对于大尺寸 IC,若通过 0xC0 命令读到数据 0x55(即 Bootloader 模式),会强制设置升级标志
ilitek_data->force_update
-
按键信息数组 keyinfo 默认大小为 10,若按键数超过 10,需在
struct ilitek_ts_data
中修改 keyinfo 的容量。
static int ilitek_request_irq(void)
#if ILITEK_PLAT != ILITEK_PLAT_MTK
ilitek_data->client->irq = gpio_to_irq(ilitek_data->irq_gpio);
#else
node = of_find_matching_node(NULL, touch_of_match);
if (node) {
ilitek_data->client->irq = irq_of_parse_and_map(node, 0);
}
#endif
注意:中断号(IRQ)的获取方式需适配平台。若平台对 IRQ 有特殊配置,需修改此处以确保获取正确的中断号。
四,调试
a. 驱动无法进入 probe 函数
- 使用 board file 方式注册
检查 ILITEK_TS_NAME 与注册的 I2C 设备名称是否完全一致,必须匹配才能正确加载驱动。
- 使用 DTS(Device Tree)方式注册
检查 .of_match_table = ilitek_touch_match_table
中的 compatible 字符串是否与 DTS 中定义的 compatible 完全匹配,否则驱动无法正确绑定设备。
b. 通信不通
- 软件问题
确保 I2C 总线号和设备地址配置正确,这两项直接影响通信。
本文使用到的I2C总线号(I2C5)和设备地址(0x41),具体以实际硬件为主。
- 硬件问题
检查 IC **供电(VDD/VDD_I2C)**是否正常,确保电源稳定。
抓取 I2C 波形,确认是否符合通信协议(如 START/STOP 信号、ACK/NACK 响应)。
尝试移除同一 I2C 总线上的其他设备,排除总线冲突。
c. 报点问题
- 有触摸效果,但坐标映射错误
X、Y 轴需要交换
修改 ILITEK_ROTATE_FLAG 的值(0 ↔ 1)。
X/Y 轴需要镜像翻转(最大值变最小值)
调整 ILITEK_REVERT_X 或 ILITEK_REVERT_Y 的值(0 ↔ 1)。
使用显示屏分辨率
启用宏 #define ILITEK_USE_LCM_RESOLUTION,并正确设置 TOUCH_SCREEN_X_MAX 和 TOUCH_SCREEN_Y_MAX。
- 触摸无反应
中断问题
确认中断是否注册成功,检查 中断号 是否正确。
数据解析问题
通过日志确认触摸时是否有中断触发:
若有中断但无坐标,检查 ilitek_read_data_and_report_2120 或 ilitek_read_data_and_report_3XX 函数,打印原始数据确认是否有效。
硬件信号问题
抓取 INT 引脚波形,确认触摸时是否有正常的拉高/拉低动作。