UART 串口驱动
1. 概述
1.1 功能简介
UART(Universal Asynchronous Receiver/Transmitter)通用异步收发器,是最常用的串行通信接口。RK3576 内置多路 UART 控制器,可用于调试串口、GPS 模块、蓝牙模块、工业设备通信等场景。M4-R2 底板提供 1 路调试串口(4pin/1.0mm,波特率 1500000)和 3 路 TTL 扩展串口(其中 2 路与 I2C 复用,见 40PIN 引脚定义)。
1.2 应用场景
- 调试串口:系统启动日志输出、终端交互
- GPS 模块:接收 NMEA 定位数据
- 蓝牙模块:UART 接口的 HC-05/HC-06 蓝牙模块
- 工业通信:RS485 总线通信(Modbus 协议)
- Modem 通信:4G/5G 模块 AT 指令交互
1.3 工作原理
UART 采用异步通信,无需时钟信号。数据格式为:起始位 + 数据位(5/6/7/8 位) + 校验位(无/奇/偶) + 停止位(1/1.5/2 位)。RK3576 的 UART 控制器内置 FIFO,支持中断与 DMA 传输方式。M4-R2 调试串口波特率为 1500000(8N1)。
⚠️ 调试串口网络命名:规格书(S-01)将调试串口标为 UART2(RX2/TX2);底板原理图(S-04)中为 UART0_TX_M0_DEBUG(GPIO0_D4_D)/ UART0_RX_M0_DEBUG(GPIO0_D5_D),两者命名不一致,具体以实际物料与 SDK 配置为准(待板上验证)。
详见 RK 官方文档:[《Rockchip_Developer_Guide_Linux_Software_CN.pdf》]
2. 硬件准备
2.1 硬件清单
| 组件 | 型号/规格 | 数量 | 备注 |
|---|---|---|---|
| 主控板 | C-3576BQ 核心板 + M4-R2 底板 | 1 | |
| USB 转 TTL 模块 | CH340/CP2102/FT232 | 1 | 用于调试串口连接 |
| 串口线 | USB 转 TTL(3.3V) | 1 | 波特率 1500000 |
| GPS 模块(可选) | BN-220 / NEO-6M | 1 | UART 接口 |
| 杜邦线 | 母对母 | 若干 |
2.2 引脚连接
调试串口(4pin/1.0mm 排针)
| 主控板引脚 | USB 转 TTL 模块 | 功能说明 |
|---|---|---|
| 调试串口 TX(GPIO0_D4_D) | RXD | 调试输出 |
| 调试串口 RX(GPIO0_D5_D) | TXD | 调试输入 |
| GND | GND | 共地 |
调试串口网络在底板原理图(S-04)中为
UART0_TX_M0_DEBUG(GPIO0_D4_D)/UART0_RX_M0_DEBUG(GPIO0_D5_D),与规格书标注的 UART2(RX2/TX2)命名不一致,以实际物料与 SDK 配置为准(待板上验证)。
扩展 TTL 串口(40PIN)
| 主控板引脚 | 外设引脚 | 功能说明 |
|---|---|---|
| TTL_TX1(40PIN Pin8) | GPS TX | 串口输出 |
| TTL_RX1(40PIN Pin10) | GPS RX | 串口输入 |
| 3.3V | GPS VCC | 电源 |
| GND | GPS GND | 共地 |
40PIN 提供 3 路 TTL 串口,其中 2 路与 I2C 复用(S-01),详细引脚位置见 40PIN 引脚定义。
2.3 硬件确认
# 查看可用串口设备
ls /dev/ttyS*
ls /dev/ttyUSB*
# 查看串口设备信息
stty -F /dev/ttyS0 -a3. 软件准备
3.1 内核配置
确认以下内核配置已启用:
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
CONFIG_SERIAL_ROCKCHIP=y
CONFIG_SERIAL_ROCKCHIP_CONSOLE=y
CONFIG_SERIAL_MFD=y
CONFIG_OF=y
CONFIG_OF_SERIAL=y
CONFIG_SERIAL_ROCKCHIP是 Rockchip UART 驱动,适用于 RK3576。调试串口需额外启用CONFIG_SERIAL_ROCKCHIP_CONSOLE=y。
3.2 设备树
RK3576 的 UART 控制器在设备树中定义(以下为 RK 平台通用结构示例):
uart2: serial@fe660000 {
compatible = "rockchip,rk3576-uart", "snps,dw-apb-uart";
reg = <0x0 0xfe660000 0x0 0x100>;
interrupts = <GIC_SPI 112 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru SCLK_UART2>, <&cru PCLK_UART2>;
clock-names = "baudclk", "apb_pclk";
pinctrl-names = "default";
pinctrl-0 = <&uart2m0_xfer>;
reg-shift = <2>;
reg-io-width = <4>;
status = "disabled";
};以上寄存器基地址、中断号与时钟标识为 RK 平台通用结构示例,具体数值以实际发布的 RK3576 SDK 设备树为准(待板上验证)。M4-R2 调试串口究竟是 UART0 还是 UART2,以实际 SDK 配置与板级验证为准。
4. 操作步骤
4.1 配置调试串口
# 在 U-Boot 中设置调试串口参数
# 具体寄存器基地址以实际 SDK 为准
setenv bootargs 'earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0'
# 或使用串口作为控制台(波特率 1500000)
setenv bootargs 'console=ttyS2,1500000n8'4.2 使用串口通信
# 设置串口参数
stty -F /dev/ttyS2 1500000 raw -echo -echoe -echok
# 发送数据
echo "Hello RK3576" > /dev/ttyS2
# 接收数据
cat /dev/ttyS2
# 使用 minicom 连接串口
minicom -D /dev/ttyS2 -b 15000004.3 RS485 模式配置
&uart4 {
status = "okay";
pinctrl-0 = <&uart4m0_xfer &uart4m0_ctsn>;
linux,rs485-enabled-at-boot-time;
rs485-rts-delay-low = <1>;
rs485-rts-delay-high = <1>;
};# 查看 RS485 配置
cat /sys/class/tty/ttyS4/device/rs485具体 UART 编号与引脚定义以实际 SDK 为准。
4.4 通过 sysfs 查看串口信息
# 查看串口中断
cat /proc/interrupts | grep uart
# 查看串口时钟
cat /sys/kernel/debug/clk/clk_uart2/clk_rate5. 代码详解
5.1 内核中 UART 驱动的注册
// RK3576 UART 控制器驱动(简化)
// drivers/tty/serial/rockchip_serial.c
static struct platform_driver rockchip_uart_driver = {
.probe = rockchip_uart_probe,
.remove = rockchip_uart_remove,
.driver = {
.name = "rockchip-uart",
.of_match_table = rockchip_uart_match,
},
};
static const struct of_device_id rockchip_uart_match[] = {
{ .compatible = "rockchip,rk3576-uart" },
{ /* sentinel */ }
};5.2 用户空间 UART 操作的内核调用链
用户空间 open(/dev/ttyS2)
→ tty_open()
→ uart_open()
→ rockchip_uart_startup()
→ 配置 UART 寄存器,启用 FIFO
用户空间 write()
→ tty_write()
→ uart_write()
→ rockchip_uart_tx_chars()
→ 将数据写入 UART 发送 FIFO6. 常见问题
6.1 调试串口无输出
现象: 上电后串口终端无任何输出
解决方案:
# 检查串口波特率设置
# M4-R2 调试串口默认波特率 1500000
minicom -D /dev/ttyUSB0 -b 1500000
# 检查 U-Boot 启动参数
# 确认 earlycon 和 console 参数正确检查 TX/RX 是否交叉连接、波特率是否匹配、电平是否兼容(3.3V)。
6.2 串口数据乱码
现象: 串口输出乱码或不完整
解决方案:
# 检查串口配置
stty -F /dev/ttyS2 -a
# 确认波特率、数据位、停止位、校验位设置正确
# 默认配置:1500000 8N1(1500000 波特率,8 数据位,无校验,1 停止位)检查晶振频率是否准确、时钟配置是否正确。
6.3 串口中断丢失
现象: 高速传输时数据丢失
解决方案:
# 查看串口 FIFO 状态
cat /sys/kernel/debug/uartclk/uart2
# 启用 DMA 传输减少 CPU 负载
# 在设备树中配置:
// dmas = <&dmac 0>, <&dmac 1>;
// dma-names = "tx", "rx";