news 2026/4/18 17:52:09

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零到一: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节点下,我最初是这样写的:

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. 中断引脚:正常应有1.8V-3.3V的脉冲
  2. 复位引脚:上电时序要满足规格书要求
  3. 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..

这是典型的固件协议不匹配。解决方法:

  1. 联系原厂获取专用烧录工具
  2. 更新触控IC固件
  3. 确认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>; };

关键修改点:

  1. 增加pinctrl配置确保GPIO状态稳定
  2. 修正中断触发方式为下降沿
  3. 明确指定显示分辨率参数
  4. 复位信号保持低电平有效

记得最后测试时要用evtest全面验证:

evtest /dev/input/event3

正常应该能看到实时的坐标数据流。如果遇到跳点或坐标偏移,可能需要调整驱动中的xy轴映射参数。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 17:45:07

Java JDBC 封装:从原生写法到工具类封装 + 增删改查

在 Java 操作数据库的过程中&#xff0c;原生 JDBC 代码存在大量重复逻辑&#xff1a;加载驱动、获取连接、释放资源…… 这些代码在每个业务中都要写一遍&#xff0c;不仅繁琐&#xff0c;还容易出错。 本文是个人的一些学习笔记&#xff0c;主要内容如下&#xff1a; 原生 …

作者头像 李华