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节点下,我最初是这样写的:
ts@38 { 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/.../input2 - I2C通信失败:
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 0x5A)
4. 终极解决方案
经过两周的折腾,最终稳定的设备树配置如下:
hynitron@38 { 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轴映射参数。