RV1126开发板JD9366触摸屏驱动移植实战:从零开始的避坑手册
第一次拿到RV1126开发板和JD9366触摸屏时,我对着满屏的内核源码和陌生的术语完全不知所措。网上能找到的教程大多语焉不详,充斥着"根据实际情况调整"这类让人抓狂的模糊描述。经过三天痛苦的摸索和无数次编译失败后,我终于总结出了这份真正面向新手的避坑指南。本文将用最直白的语言,拆解那些老手们觉得"理所当然"的细节,带你一步步点亮触摸屏。
1. 环境准备与源码获取
在开始移植前,确保你的开发环境已经正确搭建。RV1126的开发环境有些特殊要求,这也是第一个容易踩坑的地方。
开发环境配置清单:
- Ubuntu 18.04 LTS(官方推荐版本,其他版本可能遇到兼容性问题)
- 交叉编译工具链:
gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf - 内核源码版本:RV1126_Linux_SDK_V1.0.0(不同SDK版本驱动接口可能有差异)
获取官方SDK后,解压时要注意路径不要包含中文或空格。我遇到过因为路径中有空格导致编译脚本报错的诡异问题。
tar -xvf RV1126_Linux_SDK_V1.0.0.tar.gz -C ~/workspace/JD9366驱动源码通常有三个来源:
- 屏幕厂商提供的专用驱动
- 社区维护的通用驱动
- 内核自带的类似驱动(如goodix驱动)
新手建议优先使用厂商提供的驱动,虽然可能需要根据内核版本做些调整,但比从头移植要简单得多。
2. 驱动文件放置与路径陷阱
拿到驱动源码后,第一个挑战是如何把它放到正确的位置。内核源码树有严格的目录结构规范,放错位置会导致后续配置无法找到驱动。
正确的文件放置步骤:
进入内核驱动目录:
cd ~/workspace/RV1126_Linux_SDK/kernel/drivers/input/touchscreen创建专用目录(建议以芯片型号命名):
mkdir jd9366 cp ~/Downloads/jd9366_driver/* ./jd9366/
这里有个新手容易忽略的关键点:目录名必须与Kconfig中的配置保持一致。我曾在目录名用了"jd9366_touch"而在Kconfig里写了"jd9366",结果编译时死活找不到驱动。
检查驱动源码中的Kconfig文件,确认有以下内容:
config TOUCHSCREEN_JD9366 tristate "JD9366 Touchscreen Driver" depends on I2C help Say Y here if you have JD9366 touch controller.3. Makefile与Kconfig的隐藏规则
修改Makefile和Kconfig是驱动移植的核心步骤,但官方文档往往一笔带过,留下无数坑给新手。
Makefile修改示例:
obj-$(CONFIG_TOUCHSCREEN_JD9366) += jd9366/注意这里的+=操作符和结尾的斜杠。我曾错误地使用=和省略斜杠,导致编译系统无法正确识别子目录。
Kconfig的修改更需要小心:
- 打开
touchscreen/Kconfig文件 - 在文件末尾添加:
source "drivers/input/touchscreen/jd9366/Kconfig"
常见错误排查:
- 如果menuconfig中看不到JD9366选项,检查:
- Kconfig文件路径是否正确
- source语句是否拼写错误
- 是否在正确的Kconfig文件中添加了source语句
4. 内核配置的玄学问题
修改defconfig是另一个充满陷阱的环节。RV1126的SDK提供了多种配置方式,新手很容易混淆。
推荐的操作流程:
首先备份原始配置:
cp kernel/arch/arm/configs/rv1126_defconfig rv1126_defconfig.bak使用menuconfig界面配置:
make ARCH=arm rv1126_defconfig make ARCH=arm menuconfig
在menuconfig界面中:
- 进入 Device Drivers → Input device support → Touchscreens
- 找到JD9366驱动并选择为
<M>(模块)或<*>(内置) - 保存退出
关键提示:
保存时确认修改的是当前项目的.config文件,而不是全局配置。我曾因为误操作导致所有配置丢失,不得不重新开始。
5. DTS配置的硬件对接实战
设备树(DTS)配置是驱动能否正常工作的关键,也是错误最隐蔽的部分。JD9366通常通过I2C接口连接,需要正确配置引脚和中断。
典型的DTS配置示例:
&i2c1 { status = "okay"; clock-frequency = <400000>; jd9366: touchscreen@5d { compatible = "sitronix,jd9366"; reg = <0x5d>; interrupt-parent = <&gpio2>; interrupts = <RK_PB0 IRQ_TYPE_LEVEL_LOW>; reset-gpios = <&gpio2 RK_PB1 GPIO_ACTIVE_LOW>; irq-gpios = <&gpio2 RK_PB0 GPIO_ACTIVE_LOW>; status = "okay"; }; };必须检查的细节:
- I2C总线号(i2c1)是否与实际硬件连接一致
- 从机地址(0x5d)是否与屏幕规格书一致
- GPIO引脚编号是否正确对应开发板原理图
- 中断触发类型(LEVEL_LOW)是否与驱动代码中一致
我曾因为中断触发类型配置为EDGE_FALLING而驱动代码中检测LEVEL_LOW,导致触摸完全无响应,调试了整整一天。
6. 编译与调试技巧
完成所有配置后,就是激动人心的编译时刻了。但别高兴太早,这里还有几个坑等着你。
推荐的编译命令:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8常见编译错误及解决方案:
| 错误类型 | 可能原因 | 解决方法 |
|---|---|---|
| 未定义引用 | 驱动依赖未配置 | 检查CONFIG_I2C等依赖项是否启用 |
| 文件找不到 | 路径错误 | 检查Makefile中的路径是否正确 |
| 类型不匹配 | 内核API变更 | 对比内核版本与驱动兼容性 |
编译成功后,通过以下命令检查驱动是否正常加载:
dmesg | grep jd9366 lsmod | grep jd93667. 触摸校准与性能优化
驱动加载成功只是第一步,要获得良好的触摸体验还需要校准和优化。
校准步骤:
安装校准工具:
apt-get install xinput-calibrator运行校准:
xinput_calibrator --device "JD9366 Touchscreen"将校准参数写入启动脚本:
echo "xinput set-prop 'JD9366 Touchscreen' 'Calibration' '100, 2000, 200, 2000'" >> /etc/rc.local
性能优化参数:
# 调整采样率 echo 100 > /sys/module/jd9366/parameters/sample_rate # 开启滤波降噪 echo 1 > /sys/module/jd9366/parameters/noise_filter8. 疑难杂症解决方案
即使按照上述步骤操作,仍可能遇到各种奇怪问题。以下是我遇到过的典型问题及解决方法:
触摸无反应:
- 检查电源:用万用表测量触摸屏供电电压(通常是3.3V)
- 检查I2C通信:
i2cdetect -y 1查看设备是否出现在总线 - 检查中断:
cat /proc/interrupts查看中断计数是否增加
触摸漂移:
- 重新校准
- 检查是否有电磁干扰(如靠近电源适配器)
- 尝试降低采样率
驱动加载失败:
- 检查内核日志:
dmesg | grep -i error - 确认驱动版本与内核匹配
- 检查依赖模块是否加载(如i2c-core)
移植完JD9366驱动后,我最大的体会是:嵌入式开发中,魔鬼真的藏在细节里。那些教程中一笔带过的"注意对应"、"根据实际情况调整",往往就是新手卡壳的关键所在。现在当我在终端看到"[jd9366] Touchscreen initialized"的日志信息时,那种成就感是无可替代的。