当前位置: 首页 > news >正文

RK3588 android12 适配 ilitek i2c接口TP

一,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_GPIOILITEK_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)

  1. 检测到 IC 型号为 ILI2511 时,会将 ilitek_repeat_start 置为 false。

  2. 对于大尺寸 IC,若通过 0xC0 命令读到数据 0x55(即 Bootloader 模式),会强制设置升级标志 ilitek_data->force_update

  3. 按键信息数组 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 函数

  1. 使用 board file 方式注册

检查 ILITEK_TS_NAME 与注册的 I2C 设备名称是否完全一致,必须匹配才能正确加载驱动。

  1. 使用 DTS(Device Tree)方式注册

检查 .of_match_table = ilitek_touch_match_table 中的 compatible 字符串是否与 DTS 中定义的 compatible 完全匹配,否则驱动无法正确绑定设备。

b. 通信不通

  1. 软件问题

确保 I2C 总线号和设备地址配置正确,这两项直接影响通信。
本文使用到的I2C总线号(I2C5)和设备地址(0x41),具体以实际硬件为主。

  1. 硬件问题

检查 IC **供电(VDD/VDD_I2C)**是否正常,确保电源稳定。
抓取 I2C 波形,确认是否符合通信协议(如 START/STOP 信号、ACK/NACK 响应)。
尝试移除同一 I2C 总线上的其他设备,排除总线冲突。

c. 报点问题

  1. 有触摸效果,但坐标映射错误

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。

  1. 触摸无反应

中断问题

确认中断是否注册成功,检查 中断号 是否正确。

数据解析问题

通过日志确认触摸时是否有中断触发:
若有中断但无坐标,检查 ilitek_read_data_and_report_2120 或 ilitek_read_data_and_report_3XX 函数,打印原始数据确认是否有效。

硬件信号问题

抓取 INT 引脚波形,确认触摸时是否有正常的拉高/拉低动作。

相关文章:

  • FlinkSQL的常用语言
  • C++20 统一容器擦除:std::erase 和 std::erase_if
  • 大厂算法面试 7 天冲刺:第7天-系统设计与模拟面试实战 —— 架构思维 + Java落地
  • Git 拉取时常见冲突及解决方法总结
  • MySQL---数据库基础
  • 封装公共方法,并存在异步请求接口情况 封装及调用
  • vue keep-alive 如何设置动态的页面缓存
  • Python | kelvin波的水平空间结构
  • [MySQL]复合查询
  • 408 计算机网络 知识点记忆(7)
  • 基于phpStudy/宝塔搭建pbootcms,用于公司官网 | 解决管理后台登录报错问题 runtime\\data\\xx.php
  • 一文详解ffmpeg环境搭建:Ubuntu系统ffmpeg配置nvidia硬件加速
  • 2.2.3 Spark Standalone集群
  • 各类神经网络学习:(十)注意力机制(第2/4集),pytorch 中的多维注意力机制、自注意力机制、掩码自注意力机制、多头注意力机制
  • 游戏盾IP可以被破解吗
  • [特殊字符] macOS + Lima 离线下载 Calico 镜像教程
  • UML-饮料自助销售系统(饮料已售完)序列图
  • 每日一题-力扣-2999. 统计强大整数的数目 0410
  • 预言机与数据聚合器:DeFi的数据桥梁与风险博弈
  • 云原生运维在 2025 年的发展蓝图
  • 塘厦仿做网站/镇江搜索优化技巧
  • 网站建设和网页设计是不是一样/网络平台
  • 城阳天河小学网站建设/快速排名优化怎么样
  • 手机做网站的步骤/网上在线看视频为什么卡
  • 长沙环路建设开发有限公司网站/北京网络营销咨询公司
  • 做网站设计收入/百度账号个人中心