RK平台UART开发!从驱动配置到测试全流程 电子说
在嵌入式开发中,UART(通用异步收发传输器)是实现设备间数据交互的关键接口,广泛应用于调试、传感器通信等场景。瑞芯微(Rockchip)平台针对不同操作系统(Linux、RT-Thread)提供了完善的 UART 开发支持,本文将结合官方开发指南,从功能特点、驱动配置、测试验证三个维度,带大家快速掌握 RK 平台 UART 开发技巧,文末还附上知识脑图方便梳理思路~
无论基于 Linux 还是 RT-Thread 系统,RK 平台 UART 均以 16550A 串口标准为基础,核心功能保持一致,实际支持情况需以具体芯片手册为准:
•数据格式灵活:支持 5-8 位数据位、1/1.5/2 位停止位,仅支持奇校验 / 偶校验(不支持 mark/space 校验)。
•高效传输能力:自带 32 字节或 64 字节的收发 FIFO,最高支持 4M 波特率(需配合芯片时钟分频策略),支持中断传输和 DMA 传输两种模式。
•增强功能支持:部分 UART 模块支持硬件自动流控(RTS+CTS)和串口唤醒系统(需修改 trust 固件)。
Linux 系统中,RK UART 分为 “普通串口” 和 “控制台” 两种使用场景,配置流程差异较大,以下以常用的 Linux 4.4/4.19 内核为例说明。
普通串口适用于设备间数据通信(如与传感器、模块交互),核心是完成驱动路径确认、配置项开启和 DTS 参数修改。
Linux 3.10 内核使用独立驱动文件 drivers/tty/serial/rk_serial.c;Linux 4.4 及以上内核采用 8250 通用串口驱动,核心文件包括:
•drivers/tty/serial/8250/8250_core.c(驱动核心)
•drivers/tty/serial/8250/8250_dw.c(Synopsis DesignWare 适配)
•drivers/tty/serial/8250/8250_dma.c(DMA 功能支持)
进入内核配置界面,按以下路径勾选 UART 相关选项,建议使用 RK SDK 默认配置:
Device Drivers --->Character devices --->Serial drivers --->[*] 8250/16550 and compatible serial support(勾选8250驱动)[*] Rockchip serial port support(RK专属选项)
DTS(设备树)用于定义 UART 硬件资源,以 RK3568 芯片 UART1 为例,典型配置如下,仅允许修改标注的可配置参数:

&uart1 {compatible = "rockchip,rk3568-uart", "snps,dw-apb-uart";reg = <0x0 0xfe650000 0x0 0x100>; // 硬件地址(不可修改)interrupts =117 IRQ_TYPE_LEVEL_HIGH>; // 中断号(不可修改)clocks = <&cru SCLK_UART1>, <&cru PCLK_UART1>; // 时钟(不可修改)clock-names = "baudclk", "apb_pclk"; // 时钟名称(不可修改)reg-shift = <2>; // 寄存器移位(不可修改)reg-io-width = <4>; // 寄存器宽度(不可修改)// 可配置参数1:DMA使能/关闭dma-names = "tx", "rx"; // "tx"/"rx"开启,"!tx"/"!rx"关闭// 可配置参数2:引脚复用(含流控引脚)pinctrl-names = "default";pinctrl-0 = <&uart1m0_xfer &uart1m0_ctsn &uart1m0_rtsn>; // 开启流控引脚// 可配置参数3:模块使能/关闭status = "okay"; // "okay"开启,"disabled"关闭// 可配置参数4:串口唤醒(需配合trust固件)wakeup-source;};
示例需求:开启 RK3568 UART1,启用 DMA 和硬件流控。
DTS 修改后:如上配置,确保dma-names为 "tx"/"rx",pinctrl-0包含流控引脚,status设为 "okay"。
•波特率计算:UART 波特率 = 工作时钟源 / 内部分频系数 / 16,驱动会自动根据配置的波特率获取时钟,常用波特率(115200、921600、1.5M、3M、4M)均稳定支持。
•设备注册验证:系统启动后,若日志出现fe650000.serial: ttyS1 at MMIO 0xfe650000 (irq = 67, base_baud = 1500000) is a 16550A,说明设备注册成功,对应节点为/dev/ttyS1(可通过 DTS 的aliases修改编号)。
控制台串口用于输出系统日志、执行调试命令,基于 fiq_debugger 实现,以 UART2 为例:
•Linux 3.10:arch/arm/mach-rockchip/rk_fiq_debugger.c
•Linux 4.4 及以上:drivers/soc/rockchip/rk_fiq_debugger.c
核心驱动文件:drivers/staging/android/fiq_debugger/fiq_debugger.c
1.menuconfig 开启:
Device Drivers --->[*] Staging drivers --->[*] Android --->[*] Rockchip FIQ Debugger
1.DTS 配置:需禁用对应普通串口,配置 bootargs 和 fiq-debugger 节点:
chosen: chosen {bootargs = "earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0"; // 指向控制台设备};fiq-debugger {compatible = "rockchip,fiq-debugger";rockchip,serial-id = <2>; // 使用UART2rockchip,wake-irq = <0>;rockchip,irq-mode-enable = <1>; // 1=IRQ模式,0=FIQ模式rockchip,baudrate = <1500000>; // 仅支持115200或1.5Minterrupts =252 IRQ_TYPE_LEVEL_LOW>;pinctrl-names = "default";pinctrl-0 = <&uart2m0_xfer>;status = "okay";};&uart2 {status = "disabled"; // 禁用普通串口模式};
1.parameter.txt 配置(Linux 3.10/4.4 需添加):
CMDLINE: console=ttyFIQ0 androidboot.console=ttyFIQ0
瑞芯微提供测试程序ts_uart.uart及测试文件send_0x55/send_00_ff(可联系 FAE 获取),测试步骤如下:
1.准备工作:通过 ADB 推送文件到开发板并赋予权限:
adb root && adb remountadb push ts_uart.uart /dataadb push send_0x55 /data && adb push send_00_ff /dataadb shell "su -c chmod +x /data/ts_uart.uart"
1.测试发送:向/dev/ttyS1发送send_0x55文件,波特率 1.5M,关闭流控:
adb shell "/data/ts_uart.uart s /data/send_0x55 1500000 0 0 0 /dev/ttyS1"
通过 USB 转 UART 模块连接 PC,用串口工具(如 SecureCRT)接收数据,验证发送是否正常。
1.测试自发自收:无需外部硬件,验证串口内部收发一致性:
adb shell "/data/ts_uart.uart m /data/send_00_ff 1500000 0 0 0 /dev/ttyS1"
若日志显示send:1172, receive:1172 total:1172,说明收发一致,测试通过。
1.测试流控:验证 RTS/CTS 硬件流控:
•拉高 CTS 引脚电平,执行发送命令,数据应阻塞;
•释放 CTS 为低电平,阻塞数据应继续发送;
•测量 RTS 引脚电平,确认能正常高低切换。
RT-Thread 作为轻量级实时操作系统,RK UART 配置更简洁,核心是开启驱动、配置设备节点和测试验证。
1.核心代码路径:
◦串口框架:components/drivers/serial/(serial.c/serial.h)
◦适配层:bsp/rockchip-pisces/drivers/drv_uart.c/drv_uart.h
◦测试程序:bsp/rockchip-common/tests/termios_test.c
1.开启 UART 配置:进入 RT-Thread 配置界面,勾选需要的 UART 设备:
RT-Thread bsp drivers --->RT-Thread rockchip common drivers --->[*] Enable UART[*] Enable UART0[*] Enable UART2// 根据需求勾选其他UART(如UART1、UART3)
配置完成后,系统会生成/dev/uart0//dev/uart2等设备节点,通过list_device命令可查看:
msh > list_devicedevice type ref count------ -------------------- ----------uart2 Character Device 0uart0 Character Device 0
1.开启测试程序:
RT-Thread bsp test case --->[*] Enable BSP Common TEST[*] Enable BSP Common UART TESTRT-Thread Components --->Device virtual file system --->[*] Using device virtual file system[*] Using devfs for device objectsPOSIX layer and C standard library --->[*] Enable termios feature
1.测试命令:
◦接收数据:termtest r /dev/uart4 115200(从 uart4 接收,波特率 115200)
◦发送数据:termtest s /dev/uart4 115200(向 uart4 发送)
◦收发双向测试:termtest t /dev/uart4 115200
1.控制台配置:将 UART2 设为控制台,输出rt_kprintf日志:
RT-Thread Kernel --->Kernel Device Object --->[*] Using console for rt_kprintf(128) the buffer size for console log printf(uart2) the device name for console(1500000) the baud rate for console
RT-Thread 下,1.5M 及以下波特率可稳定支持,1.5M 以上需结合芯片时钟树实际测试,确保数据传输稳定性。

1.硬件差异:不同 RK 芯片 UART 功能可能裁剪(如部分不支持 DMA 或流控),需优先参考对应芯片手册。
2.资源冲突:控制台模式与普通串口模式互斥,启用 fiq_debugger 后需禁用对应普通串口节点。
3.DMA 使用场景:仅当数据量极大时,DMA 才能明显减轻 CPU 负载,普通场景建议用中断模式(启动更快、资源消耗少)。
掌握以上内容,即可轻松应对 RK 平台 UART 在不同系统下的开发需求,无论是调试接口还是设备通信,都能高效实现~
全部0条评论
快来发表一下你的评论吧 !