从零到一:RK3566平台CST3XX触屏驱动移植与深度排错实战

张开发
2026/6/17 2:22:34 15 分钟阅读
从零到一:RK3566平台CST3XX触屏驱动移植与深度排错实战
1. RK3566平台CST3XX触屏驱动移植全流程第一次在RK3566开发板上调试CST3XX电容触摸屏时我踩了不少坑。记得那天深夜两点屏幕还是纹丝不动急得我直挠头。现在把完整移植过程梳理出来希望能帮到同样在折腾触屏驱动的朋友。驱动移植的第一步是源码集成。我习惯在kernel/driver/input/touchscreen目录下新建驱动文件夹这里要注意Makefile和Kconfig的修改细节。Makefile里要加上obj-$(CONFIG_TOUCHSCREEN_HYN_CST3XX) hyn_cst3xx/而Kconfig的配置更关键它决定了驱动能否在menuconfig中显示config TOUCHSCREEN_HYN_CST3XX tristate hyn cst3xx based touchscreens depends on I2C help Say Y here if you have a hyn based touchscreen controller.设备树配置是第二个关键点。在rk3566-rk817-tablet.dts的i2c4节点下我最初是这样写的ts38 { compatible cst3xx; reg 0x38; irq-gpio gpio3 RK_PD7 IRQ_TYPE_EDGE_RISING; wake-gpio gpio3 RK_PD6 GPIO_ACTIVE_LOW; };后来发现这个配置有几个隐患中断触发方式不对复位引脚电平设置不准确而且缺少关键的上拉配置。2. 典型故障排查实战2.1 内核日志分析技巧当触摸屏无响应时我首先用dmesg | grep cst3xx查看内核日志。初期常见的几种情况驱动加载成功但无中断input: cst3xx as /devices/.../input2I2C通信失败i2c i2c-4: send command error固件校验错误[HYN][Error] buf[6] ! 0xAB有次遇到特别诡异的现象日志显示驱动加载成功但evtest就是没反应。后来发现是GPIO映射错误# 查看GPIO状态 cat /sys/kernel/debug/gpio发现gpio-127对应GPIO3_D7根本没被正确初始化。2.2 硬件信号测量要点拿出万用表和示波器重点测量三个信号中断引脚正常应有1.8V-3.3V的脉冲复位引脚上电时序要满足规格书要求I2C波形用示波器看SCL/SDA的上升时间有次发现中断引脚电压只有1.8V而SoC端配置的是3.3V电平。解决方法是在设备树添加上拉pinctrl { hynitron { tp_gpio: tp-gpio { rockchip,pins 3 RK_PD6 RK_FUNC_GPIO pcfg_pull_none, 3 RK_PD7 RK_FUNC_GPIO pcfg_pull_up; }; }; }3. 驱动深度调试技巧3.1 中断问题排查遇到最头疼的问题是中断注册失败。通过cat /proc/interrupts发现中断号对不上103: 50954018 0 0 0 gpio3 31 Edge cst3xx调试发现需要修改驱动中的触发方式#define HYN_IRQ_TRIGGER_RISING_CONFIG 0x00 // 改为下降沿触发3.2 固件协议问题有次所有配置都正确但触摸就是没反应。查看内核日志发现[HYN][Error] buf[6] ! 0xAB data is not valid..这是典型的固件协议不匹配。解决方法联系原厂获取专用烧录工具更新触控IC固件确认I2C地址匹配0x38 vs 0x5A4. 终极解决方案经过两周的折腾最终稳定的设备树配置如下hynitron38 { compatible hynitron,hyn_ts; reg 0x38; pinctrl-names default; pinctrl-0 tp_gpio; hynitron,reset-gpio gpio3 RK_PD6 GPIO_ACTIVE_LOW; hynitron,irq-gpio gpio3 RK_PD7 IRQ_TYPE_EDGE_FALLING; hynitron,max-touch-number 5; hynitron,display-coords 480 854; };关键修改点增加pinctrl配置确保GPIO状态稳定修正中断触发方式为下降沿明确指定显示分辨率参数复位信号保持低电平有效记得最后测试时要用evtest全面验证evtest /dev/input/event3正常应该能看到实时的坐标数据流。如果遇到跳点或坐标偏移可能需要调整驱动中的xy轴映射参数。

更多文章