RK平台UART开发!从驱动配置到测试全流程

电子说

1.4w人已加入

描述

 

 

在嵌入式开发中,UART(通用异步收发传输器)是实现设备间数据交互的关键接口,广泛应用于调试、传感器通信等场景。瑞芯微(Rockchip)平台针对不同操作系统(LinuxRT-Thread)提供了完善的 UART 开发支持,本文将结合官方开发指南,从功能特点、驱动配置、测试验证三个维度,带大家快速掌握 RK 平台 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 系统下 UART 开发实战

 

Linux 系统中,RK UART 分为 普通串口” 和 控制台” 两种使用场景,配置流程差异较大,以下以常用的 Linux 4.4/4.19 内核为例说明。

 

 

(一)普通串口配置:三步搞定驱动与参数

 

普通串口适用于设备间数据通信(如与传感器、模块交互),核心是完成驱动路径确认、配置项开启和 DTS 参数修改。

 

 

1. 明确驱动路径

 

Linux 3.10 内核使用独立驱动文件 drivers/tty/serial/rk_serial.cLinux 4.4 及以上内核采用 8250 通用串口驱动,核心文件包括:

 

 

drivers/tty/serial/8250/8250_core.c(驱动核心)

 

 

drivers/tty/serial/8250/8250_dw.cSynopsis DesignWare 适配)

 

 

drivers/tty/serial/8250/8250_dma.cDMA 功能支持)

 

 

2. menuconfig 开启配置

 

进入内核配置界面,按以下路径勾选 UART 相关选项,建议使用 RK SDK 默认配置:

 

 

  •  
  •  
  •  
  •  
  •  
Device Drivers --->  Character devices --->    Serial drivers --->      [*8250/16550 and compatible serial support(勾选8250驱动)      [*] Rockchip serial port support(RK专属选项)

3. DTS 参数配置(关键!)

 

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"

 

 

4. 波特率配置与设备注册

 

波特率计算UART 波特率 工作时钟源 内部分频系数 / 16,驱动会自动根据配置的波特率获取时钟,常用波特率(1152009216001.5M3M4M)均稳定支持。

 

 

设备注册验证:系统启动后,若日志出现fe650000.serial: ttyS1 at MMIO 0xfe650000 (irq = 67, base_baud = 1500000) is a 16550A,说明设备注册成功,对应节点为/dev/ttyS1(可通过 DTS aliases修改编号)。

 

 

(二)控制台配置:作为系统调试接口

 

控制台串口用于输出系统日志、执行调试命令,基于 fiq_debugger 实现,以 UART2 为例:

 

 

1. 驱动路径

 

Linux 3.10arch/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

 

 

2. 配置流程

 

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>; // 使用UART2    rockchip,wake-irq = <0>;    rockchip,irq-mode-enable = <1>; // 1=IRQ模式,0=FIQ模式    rockchip,baudrate = <1500000>; // 仅支持115200或1.5M    interrupts = 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 需添加):

 

 

  •  
CMDLINEconsole=ttyFIQ0 androidboot.console=ttyFIQ0

 

 

 

(三)Linux UART 测试:用官方工具验证

 

瑞芯微提供测试程序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 系统下 UART 开发实战

 

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 objects  POSIX 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 以上需结合芯片时钟树实际测试,确保数据传输稳定性。

 

 

四、RK UART 开发知识脑图

 

瑞芯微

五、开发注意事项

 

1.硬件差异:不同 RK 芯片 UART 功能可能裁剪(如部分不支持 DMA 或流控),需优先参考对应芯片手册。

 

 

2.资源冲突:控制台模式与普通串口模式互斥,启用 fiq_debugger 后需禁用对应普通串口节点。

 

 

3.DMA 使用场景:仅当数据量极大时,DMA 才能明显减轻 CPU 负载,普通场景建议用中断模式(启动更快、资源消耗少)。

 

 

掌握以上内容,即可轻松应对 RK 平台 UART 在不同系统下的开发需求,无论是调试接口还是设备通信,都能高效实现~

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分