1. RK3568 Android 11串口驱动适配实战指南
作为一名在嵌入式领域摸爬滚打多年的驱动工程师,我深知串口驱动适配在项目开发中的重要性。今天就来分享我在RK3568平台上适配Android 11串口驱动的完整过程,涵盖TTL、RS232和RS485三种常见接口的实战经验。
串口通信作为嵌入式系统中最基础也最可靠的通信方式之一,其驱动适配质量直接影响后续外设调试的顺利程度。在RK3568这样的高性能ARM平台上,虽然SoC厂商已经提供了完善的底层支持,但在实际项目中仍然会遇到各种意料之外的问题。本文将系统性地介绍从内核配置到设备树修改,再到实际测试的全流程,并分享我在多个项目中积累的避坑经验。
2. 内核编译配置详解
2.1 驱动加载方式选择
在Android/Linux系统中,驱动加载主要有两种方式:
- 静态编译进内核:驱动代码直接编译进内核镜像,在内核初始化阶段自动加载
- 动态模块加载:驱动编译为.ko模块文件,在用户空间通过insmod或系统初始化脚本加载
对于串口这类基础设备驱动,我强烈建议采用第一种方式。原因有三:
- 串口是系统早期调试的关键通道,需要在内核初始化阶段就可用
- 静态编译可以避免模块加载失败导致的复杂问题排查
- 8250串口驱动已经非常稳定,不需要频繁更换版本
2.2 内核配置实操
RK3568使用的8250_dw串口驱动需要通过以下配置启用:
bash复制CONFIG_SERIAL_8250_DW=y
这个配置项位于kernel/arch/arm64/configs/rockchip_defconfig文件中。修改后,建议执行以下验证步骤:
- 编译后检查.config文件
bash复制grep CONFIG_SERIAL_8250_DW kernel/.config
正确配置应该显示CONFIG_SERIAL_8250_DW=y且未被注释
- 检查目标驱动是否生成
进入驱动目录查看目标文件:
bash复制ls kernel/drivers/tty/serial/8250/8250_dw.o
如果文件存在,说明配置生效。
注意:在Android源码树中编译内核时,记得先执行
source build/envsetup.sh和lunch选择正确的目标设备,否则配置修改可能不会生效。
3. 设备树配置实战
3.1 TTL串口配置
TTL电平是最简单的串口配置,RK3568的UART4默认就是TTL电平接口。配置步骤如下:
-
原理图分析
首先在原理图中找到目标串口的引脚定义,例如UART4_RX_M1和UART4_TX_M1。确认以下几点:- 引脚是否连接到正确的连接器
- 是否有上拉/下拉电阻
- 是否与其他功能引脚复用
-
设备树节点配置
在设备树文件中添加或修改以下节点:
dts复制&uart4 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&uart4m1_xfer>;
};
关键参数说明:
status: 必须设为"okay"才能启用设备pinctrl-names: 引脚控制状态名称pinctrl-0: 指定默认状态使用的引脚配置组
- 引脚复用配置验证
检查rk3568-pinctrl.dtsi文件中uart4m1_xfer的定义是否与原理图一致:
dts复制uart4m1_xfer: uart4m1-xfer {
rockchip,pins =
<3 RK_PB2 RK_FUNC_2 &pcfg_pull_up>,
<3 RK_PB1 RK_FUNC_2 &pcfg_pull_up>;
};
3.2 RS232串口配置
RS232需要电平转换芯片(如MAX3232),但驱动层面与TTL配置基本相同:
-
硬件电路分析
典型的RS232电路包含:- 电平转换芯片(如MAX3232)
- 电荷泵电容(通常为0.1μF)
- ESD保护二极管
-
设备树配置
dts复制&uart3 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&uart3m1_xfer>;
};
实际项目中常见问题:RS232的TX和RX需要交叉连接(设备A的TX接设备B的RX),很多调试失败都是因为这个原因。
3.3 RS485串口配置
RS485配置与前述类似,但需要注意半双工特性:
-
硬件设计要点
- 使用芯片如SIT3485E
- 终端电阻(120Ω)是否使能
- 方向控制引脚(如果使用)
-
设备树配置
dts复制&uart7 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&uart7m1_xfer>;
};
对于需要方向控制的RS485,设备树还需要配置GPIO:
dts复制&uart7 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&uart7m1_xfer>;
rs485-rts-active-low;
rts-gpios = <&gpio3 RK_PC6 GPIO_ACTIVE_LOW>;
linux,rs485-enabled-at-boot-time;
};
4. 驱动加载验证
4.1 内核日志检查
通过调试串口或adb查看内核启动日志:
bash复制adb shell dmesg | grep ttyS
正常应该看到类似输出:
code复制[ 1.234567] ff160000.serial: ttyS3 at MMIO 0xff160000 (irq = 45, base_baud = 1500000) is a 16550A
4.2 设备节点验证
检查/dev下设备节点是否存在:
bash复制adb shell ls -l /dev/ttyS*
如果节点不存在,可能是:
- 设备树配置错误
- 内核配置未启用串口
- 驱动初始化失败
5. 串口测试实战
5.1 测试工具准备
推荐使用以下工具:
- ComAssistant:Android端串口调试APP
- minicom:Linux主机端工具
- Python serial:自动化测试脚本
5.2 测试步骤
- 设置正确权限
bash复制adb shell chmod 0777 /dev/ttyS*
-
TTL/RS232回环测试
- 短接TX和RX引脚
- 发送数据并检查是否回显
-
RS485测试要点
- 确保终端电阻匹配(120Ω)
- 测试半双工通信
- 检查方向控制时序(如有)
5.3 常见问题排查
-
无数据收发
- 检查线序是否正确(特别是RS232)
- 验证波特率、数据位、停止位、校验位设置
- 测量信号线电平是否正常
-
数据乱码
- 确认双方波特率一致
- 检查时钟源精度
- 排查电磁干扰问题
-
间歇性通信失败
- 检查连接器接触是否良好
- 评估线路长度是否超过协议限制
- 测试在不同波特率下的表现
6. 工程管理与经验分享
6.1 代码版本控制
建议将设备树修改提交到版本控制系统,例如:
bash复制git add arch/arm64/boot/dts/rockchip/rk3568-myboard.dts
git commit -m "enable uart3/4/7 for serial ports"
6.2 调试技巧
- 使用示波器:直接观察信号质量
- 分步验证:先验证TTL电平,再测试RS232/RS485
- 日志分析:提高内核日志级别获取更多调试信息
bash复制adb shell echo 8 > /proc/sys/kernel/printk
6.3 性能优化
- 提高缓冲区大小:在设备树中调整fifo-size
dts复制&uart4 {
fifo-size = <64>;
};
- 优化中断处理:对于高波特率应用,可以考虑使用DMA
在多个RK3568项目实践中,我总结出最关键的几点:仔细阅读原理图、分步验证配置、保留完整的调试记录。特别是在同时调试多个串口时,建议逐个启用和测试,避免相互干扰。
