触摸屏驱动
1. 概述
1.1 功能简介
触摸屏驱动负责处理触摸输入事件,包括手指触摸坐标、手势识别和多点触控。RK3576 支持通过 I2C 接口连接电容式触摸屏控制器(如 GT911、FT5406、GT9271),实现多点触控功能,适用于人机交互界面、平板电脑、工业控制面板等场景。M4-R2 底板具体的触摸屏接口以实际物料为准(待板上验证)。
1.2 应用场景
- 人机交互:嵌入式设备触摸操作界面
- 工业控制:工业触摸屏 HMI 界面
- 平板电脑:多点触控操作
- 自助终端:ATM、自助服务机触摸界面
- 智能家居:智能面板、中控屏
1.3 工作原理
RK3576 触摸屏接口支持以下特性:
| 特性 | 说明 |
|---|---|
| 接口 | I2C 总线(常用)/ SPI 总线 |
| 触摸类型 | 电容式触摸 |
| 触控点数 | 最多 10 点触控 |
| 分辨率 | 取决于触摸控制器(如 1024×600) |
| 报点率 | 最高 120Hz |
| 中断 | GPIO 中断方式 |
详见 RK 官方文档:[《Rockchip_Developer_Guide_Linux_Software_CN.pdf》]
2. 硬件准备
2.1 硬件清单
| 组件 | 型号/规格 | 数量 | 备注 |
|---|---|---|---|
| 主控板 | C-3576BQ 核心板 + M4-R2 底板 | 1 | |
| 调试串口线 | USB 转 TTL(3.3V) | 1 | 波特率 1500000 |
| 电容触摸屏 | GT911 / FT5406 + LCD 屏 | 1 | I2C 接口,含触摸层 |
| FPC 排线 | 6pin / 4pin | 1 | 触摸屏 FPC |
2.2 引脚连接
以 I2C 接口电容触摸屏为例:
| 主控板引脚 | 触摸屏引脚 | 功能说明 |
|---|---|---|
| I2C_SDA | SDA | I2C 数据 |
| I2C_SCL | SCL | I2C 时钟 |
| GPIO / INT | INT | 触摸中断(上升沿触发) |
| GPIO / RST | RST | 触摸控制器复位 |
| 3.3V | VCC | 触摸屏电源 |
| GND | GND | 共地 |
M4-R2 底板具体触摸屏 I2C 引脚和中断引脚引出,以实际原理图与 SDK 配置为准(待板上验证)。实际操作时应确认引脚连接正确。
2.3 硬件确认
# 确认 I2C 设备(触摸控制器通常地址为 0x38 或 0x14)
i2cdetect -y 3
# 输出示例:
# 0 1 2 3 4 5 6 7 8 9 a b c d e f
# 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
# 38: -- -- -- -- -- -- -- 38 -- -- -- -- -- -- -- --
# 查看输入设备
cat /proc/bus/input/devices
# 应能看到触摸屏设备(如 gt911)具体 I2C 总线编号以实际板卡 sysfs 输出为准。
3. 软件准备
3.1 内核配置
确认以下内核配置已启用:
CONFIG_INPUT=y
CONFIG_INPUT_TOUCHSCREEN=y
CONFIG_TOUCHSCREEN_GOODIX=y
CONFIG_TOUCHSCREEN_FTS=y
CONFIG_I2C=y
CONFIG_OF=y
CONFIG_TOUCHSCREEN_GOODIX是 Goodix GT911/GT9271 触摸屏驱动。
3.2 设备树
RK3576 的 I2C 控制器挂载触摸屏的设备树示例:
&i2c3 {
status = "okay";
gt911: touchscreen@38 {
compatible = "goodix,gt911";
reg = <0x38>;
interrupt-parent = <&gpio1>;
interrupts = <RK_PD3 IRQ_TYPE_EDGE_FALLING>;
reset-gpios = <&gpio1 RK_PD2 GPIO_ACTIVE_LOW>;
irq-gpios = <&gpio1 RK_PD3 GPIO_ACTIVE_LOW>;
touchscreen-size-x = <1920>;
touchscreen-size-y = <1080>;
irq-flags = <IRQ_TYPE_EDGE_FALLING>;
};
};触摸屏 I2C 地址常见值:GT911 为 0x38(或 0x5D),FT5406 为 0x38。实际地址应通过
i2cdetect确认。以上 I2C 编号与 GPIO 为 RK 平台通用示例,具体以实际 SDK 设备树为准。
4. 操作步骤
4.1 查看触摸设备
# 查看输入设备列表
cat /proc/bus/input/devices
# 查看触摸设备事件号
ls /dev/input/event*
# 输出示例:/dev/input/event1
# 查看触摸设备详细信息
evtest /dev/input/event1
# 选择设备后,触摸屏幕观察输出4.2 测试触摸输入
# 使用 evtest 测试(需安装)
apt-get install evtest
evtest /dev/input/event1
# 触摸屏幕,观察输出的 ABS_MT_POSITION_X / ABS_MT_POSITION_Y 事件
# 使用 input-kbd 测试
evtest --grab /dev/input/event14.3 查看触摸参数
# 查看触摸屏参数
cat /sys/class/input/input1/name
cat /sys/class/input/input1/phys
# 查看触摸中断
cat /proc/interrupts | grep -i touch
# 或
cat /proc/interrupts | grep gpio4.4 设备树中配置触摸屏
&i2c3 {
status = "okay";
gt911: touchscreen@38 {
compatible = "goodix,gt911";
reg = <0x38>;
interrupt-parent = <&gpio1>;
interrupts = <RK_PD3 IRQ_TYPE_EDGE_FALLING>;
reset-gpios = <&gpio1 RK_PD2 GPIO_ACTIVE_LOW>;
irq-gpios = <&gpio1 RK_PD3 GPIO_ACTIVE_LOW>;
// 触摸屏分辨率
touchscreen-size-x = <1920>;
touchscreen-size-y = <1080>;
// 触摸按键映射(可选)
goodix,button-map = <BTN_TOUCH 330 331 332>;
};
};5. 代码详解
5.1 内核中触摸屏驱动的注册
// GT911 触摸屏驱动(简化)
// drivers/input/touchscreen/goodix.c
static struct i2c_driver goodix_driver = {
.probe = goodix_ts_probe,
.remove = goodix_ts_remove,
.driver = {
.name = "goodix-ts",
.of_match_table = goodix_of_match,
},
};
static const struct of_device_id goodix_of_match[] = {
{ .compatible = "goodix,gt911" },
{ .compatible = "goodix,gt9271" },
{ /* sentinel */ }
};5.2 用户空间触摸操作的内核调用链
用户空间 evtest
→ open(/dev/input/event1)
→ read()
→ goodix_ts_work_func()
→ goodix_ts_read_input()
→ i2c_smbus_read_i2c_block_data()
→ 读取触摸坐标和事件
→ input_report_abs(dev, ABS_MT_POSITION_X, x)
→ input_report_abs(dev, ABS_MT_POSITION_Y, y)
→ input_mt_sync_frame(dev)6. 常见问题
6.1 触摸屏无响应
现象: 触摸屏幕无任何反应
解决方案:
# 检查 I2C 设备
i2cdetect -y 3
# 检查触摸中断是否触发
cat /proc/interrupts | grep -i gpio
# 检查设备树中触摸节点状态
# 具体节点路径以实际 DTB 反编译结果为准
dtc -I dtb -O dts /sys/firmware/fdt | grep -A3 "touchscreen@"确认设备树中触摸节点 status = "okay",检查 I2C 地址和中断引脚配置。
6.2 触摸坐标偏移
现象: 触摸位置与显示位置不一致
解决方案:
# 查看触摸屏分辨率
cat /sys/class/input/input1/name
# 使用 evtest 确认触摸范围
evtest /dev/input/event1
# 观察 ABS_MT_POSITION_X / ABS_MT_POSITION_Y 的最大值检查设备树中 touchscreen-size-x 和 touchscreen-size-y 是否与屏幕分辨率匹配。
6.3 触摸屏偶尔失灵
现象: 触摸时灵时不灵
解决方案:
# 查看触摸相关错误日志
dmesg | grep -i goodix
# 检查 I2C 通信错误
dmesg | grep -i i2c检查 I2C 通信速率,排查触摸屏 FPC 排线接触不良。
