深入理解 Rockchip 平台 DTS 中的 UART3 引脚配置
在移植和调试基于 Rockchip SoC(如 RK3568、RK3576 等)的板子时,我们经常需要修改 UART 的引脚配置。本文以 uart3
的 DTS 节点为例,逐行解析 UART 的 TX/RX/RTS/CTS 配置,并解释其作用与应用场景。
1️⃣ 背景知识
在 SoC 芯片上,一个物理引脚往往可以复用为多种功能,例如:
- GPIO
- UART(串口)
- I²C
- SPI
- PWM 等
具体选择哪种功能,由 Pinmux(引脚复用控制器) 决定。
在 Linux 内核的 Device Tree (DTS) 文件中,就需要通过 pinctrl
节点来描述这些复用关系。
2️⃣ 示例代码
下面是 DTS 中典型的 UART3 配置:
uart3 {/omit-if-no-ref/uart3m0_xfer: uart3m0-xfer {rockchip,pins =<3 1 9 &pcfg_pull_up>, // UART3_TX<3 0 9 &pcfg_pull_up>; // UART3_RX};/omit-if-no-ref/uart3m0_ctsn: uart3m0-ctsn {rockchip,pins =<3 2 9 &pcfg_pull_none>; // UART3_CTS};/omit-if-no-ref/uart3m0_rtsn: uart3m0-rtsn {rockchip,pins =<3 3 9 &pcfg_pull_none>; // UART3_RTS};
};
3️⃣ 关键字段解释
(1) uart3m0_xfer
uart3m0_xfer: uart3m0-xfer {rockchip,pins =<3 1 9 &pcfg_pull_up>, // UART3_TX<3 0 9 &pcfg_pull_up>; // UART3_RX
};
- 功能:配置 UART3 的收发数据线(TXD / RXD)。
- 必需:UART 要工作,至少需要 TX 和 RX。
&pcfg_pull_up
:对 RX 脚开启上拉,避免悬空时产生随机数据。
(2) uart3m0_ctsn
uart3m0_ctsn: uart3m0-ctsn {rockchip,pins =<3 2 9 &pcfg_pull_none>; // UART3_CTS
};
- CTS (Clear To Send):硬件流控输入脚。
- 作用:对方设备通过拉低 CTS,告诉本机“可以发数据了”。
- 是否必需:可选,如果不用硬件流控,完全可以省略。
(3) uart3m0_rtsn
uart3m0_rtsn: uart3m0-rtsn {rockchip,pins =<3 3 9 &pcfg_pull_none>; // UART3_RTS
};
- RTS (Request To Send):硬件流控输出脚。
- 作用:本机通过拉低 RTS,告诉对方“可以发数据给我”。
- 是否必需:可选,和 CTS 搭配使用,属于硬件流控。
4️⃣ DTS 配置的实际应用场景
✅ 只用 TX/RX(最常见)
如果只是普通串口通信(例如调试口、MCU 通信):
&pinctrl {uart3 {uart3m0_xfer;};
};
对应的硬件只需接两根线:TXD、RXD。
✅ 带 RTS/CTS 硬件流控
如果通信对速率要求高,或者对方设备需要硬件握手信号:
&pinctrl {uart3 {uart3m0_xfer;uart3m0_ctsn;uart3m0_rtsn;};
};
对应的硬件需要接四根线:TXD、RXD、RTS、CTS。
5️⃣ 常见问题 & 调试经验
-
GPIO 冲突问题
- DTS 中一个引脚只能分配给一个功能。
- 如果同一个 pin 在别的外设节点里被占用了(比如 UART 和 GPIO 同时抢),会看到内核报错:
pin XXX already requested by ...
- 解决方法:要么换 GPIO,要么禁用对应的外设。
-
流控导致通信不通
- 如果驱动打开了硬件流控,而你硬件只接了 TX/RX → 串口可能无法正常通信。
- 解决:在 DTS 或驱动里关闭 RTS/CTS,或者在硬件上把 RTS/CTS 正确接线。
-
上拉/下拉配置
- RX 脚最好加
pull_up
,避免悬空乱触发。 - RTS/CTS 一般
pull_none
,因为它们由外设驱动。
- RX 脚最好加
6️⃣ 总结
uart3m0_xfer
→ 必需,配置 TX/RX。uart3m0_ctsn
/uart3m0_rtsn
→ 可选,用于硬件流控。- DTS 中拆分定义,是为了灵活选择串口模式(2 线 or 4 线)。
- 使用时要注意引脚复用冲突,避免一个 pin 被多个功能抢占。
✍️ 博文结尾建议:
初学者如果发现 UART 无法收发,首先检查 DTS 是否只启用了
xfer
,并确认没有开启 RTS/CTS;如果启用了硬件流控,记得硬件连线也要完整,否则通信会“卡死”。