ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

RK3588调试串口波特率从1500000改115200完整指南

RK3588调试串口波特率从1500000改115200完整指南 做RK3588开发的人十有八九都会遇到一个问题拿到开发板之后默认的debug串口波特率是1500000。这个速度虽然快但调试的时候并不友好——很多常见的USB转串口模块在这个速率下工作不稳定个别串口调试助手对1.5M波特率支持得也不好打印信息动不动就乱码。这篇文章把我自己在RK3588平台上把debug串口从1500000改成115200的完整过程整理出来涉及U-Boot、内核设备树、Android bootcmd几个层面的联动修改以及编译烧录和实际验证的细节。不管你是刚接触RK3588的新手还是正在做安卓系统定制或Linux驱动开发的老手只要需要把调试串口固定到115200这篇记录都能直接参考。1. 为什么要改RK3588调试串口波特率先想清楚再动手1.1 默认1500000波特率在实际调试中的痛点RK3588作为瑞芯微的旗舰级SoC在官方SDK里的默认调试串口波特率是1500000。开发人员一开始看串口文档时往往没注意这个细节等真正接线调试才发现问题。1500000波特率在板级调试中确实不算常见很多工控屏幕、串口服务器、老式调试工具默认都是9600或者115200和RK3588的默认值完全不匹配。而市面上常见的CH340、CP2102这类低成本USB转串口模块在1.5M波特率下偶尔会出现丢字节、误码率高的情况尤其是线材质量一般、接线又比较长的时候打印出来的日志基本没法看。另外一个容易忽略的点是不同阶段的启动日志波特率可能不一致。RK3588的引导过程大致是BootROM到DDR初始化、TPL/SPL、U-Boot、内核这几个阶段其中早期DDR初始化阶段的打印由预编译的二进制固件决定这部分波特率不好改但进入U-Boot之后波特率就完全受设备树和配置控制了。所以把U-Boot和内核阶段的波特率统一改成115200至少能保证你日常开发中最关心的那部分日志是稳定可读的。1.2 波特率联动机制为什么不能只改一个地方很多人第一次改串口波特率只改了内核设备树里串口节点的current-speed结果发现U-Boot阶段打印正常、一进内核就乱码或者反过来。根本原因是RK3588的debug串口贯穿多个软件层级每一层都要明确知道自己该用什么波特率。简单说U-Boot阶段打印用的是U-Boot设备树中chosen节点的stdout-path以及串口节点的current-speed属性内核阶段打印用的是内核设备树中对应串口节点的配置和bootargs里的console参数而Android系统启动时内核cmdline里如果显式写了consolettyS0,1500000这个参数优先级很高设备树里的数字反而会被覆盖掉。所以一个完整的修改流程至少要覆盖U-Boot设备树、内核设备树、以及bootargs/bootcmd三块缺一个都会出现半截正常、半截乱码的诡异现象。2. 动手前先确认硬件与固件基础2.1 找到你的调试串口UART编号和引脚电平不能猜不同厂家的RK3588开发板调试串口引出的位置和使用的UART控制器编号并不完全相同。阜 cereja所有的RK3588方案调试串口大多走UART0或者UART2但有些核心板会把调试串口放在专门的Debug接口上有些则是和其它UART复用排针。拿到板子后第一件事就是打开硬件原理图找到标有UART_DBG、DEBUG_TX、DEBUG_RX这类字样的引脚确认它对应的是哪一路UART以及IO电平是多少。RK3588的调试串口电平需要特别留意。标准开发板一般是3.3V TTL电平直接用CH340这种3.3V/5V兼容的模块就能读但部分工业级核心板或者定制板调试串口的IO电平可能是1.8V这种情况下如果直接用3.3V的USB转串口模块去接轻则数据读不出来重则可能损伤引脚。稳妥做法是先查原理图再用电平转换板中转一下。2.2 串口工具选型与主机驱动准备我自己的主力调试工具是CP2102模块加杜邦线偶尔也用FT232。CP2102在Ubuntu和Windows下都有原生驱动插上就能识别稳定性和兼容性都不错。CH340虽然便宜但在1.5M波特率下遇到过几次偶尔乱码的问题改到115200之后就很稳。如果你的主板已经带了RS232电平串口也可以用一个MAX3232电平转换板接出来效果差不多。Linux主机上我习惯用minicom或者直接在终端用screenWindows上就用串口调试助手或者MobaXterm。改波特率之前务必先确认串口设备节点是否正确。Ubuntu下插入USB转串口后一般会生成/dev/ttyUSB0如果插了多个设备用ls -l /dev/ttyUSB*看一下或者用dmesg | grep tty查看内核识别到的设备名。确认无误后先用默认的1500000波特率连接一下确保能看到U-Boot日志再开始改配置。3. U-Boot与内核串口配置修改实操3.1 U-Boot设备树中修改串口波特率以Rockchip官方Linux SDK为例U-Boot的设备树文件在u-boot/arch/arm/dts目录下板级文件通常是rk3588-evb.dts或者rk3588-evb1-v10.dts这类名字。打开文件后重点关注两个地方一个是根节点下的chosen节点另一个是调试串口对应的uart节点。chosen节点里往往会有一行stdout-path属性用于告诉U-Boot把标准输出定向到哪个串口。常见写法是chosen { stdout-path uart0; };有些版本会写成带波特率的格式比如stdout-path serial2:1500000n8这种写法下波特率直接跟在串口路径后面。如果写成这种格式要改成chosen { stdout-path serial2:115200n8; };接着找到对应的uart节点。RK3588的UART节点在rk3588.dtsi里有默认定义板级dts里会做覆盖。需要确认的关键属性是current-speed它告诉驱动当前串口使用的波特率。假设你的调试串口是uart0那么在板级dts里应该有这样的覆盖uart0 { status okay; current-speed 1500000; pinctrl-names default; pinctrl-0 uart0m0_xfer; };这里需要把current-speed改成115200。注意如果原来没写current-speed也要补上否则U-Boot内部会使用默认值未必是你期望的115200。改完之后u-boot的配置就算完成了一半。3.2 U-Boot defconfig与config头文件里的波特率配置除了设备树U-Boot里还有几处和波特率相关的配置。Rockchip的U-Boot会读取CONFIG_BAUDRATE这个宏来设定默认波特率在u-boot/configs/rk3588_defconfig文件里通常有一行CONFIG_BAUDRATE1500000这一行建议直接改成CONFIG_BAUDRATE115200另外在include/configs/rk3588_common.h这类公共头文件里有时会出现CONFIG_SYS_BAUDRATE_TABLE的定义里面列出的是U-Boot支持的一组波特率。默认的波特率表通常包含9600、19200、38400、57600、115200等一般不需要改但如果你的defconfig里只保留了1500000也要把115200加进去。为什么要改defconfig里的CONFIG_BAUDRATE因为设备树里的current-speed主要影响串口驱动初始化时设置的波特率而CONFIG_BAUDRATE影响的是U-Boot环境变量和终端相关的默认值。只改设备树不改这里有概率出现启动早期正常、进入U-Boot命令行后波特率又被环境变量重置的情况。两个都改了才能保持一致性。3.3 内核设备树与bootargs同步修改内核设备树的位置在kernel/arch/arm64/boot/dts/rockchip/同样是对应板级的dts文件。找到调试串口节点把current-speed改成115200uart0 { status okay; current-speed 115200; };接下来检查内核的bootargs。Rockchip SDK中bootargs一般由U-Boot的环境变量或者Android的BoardConfig来拼装。Linux SDK下U-Boot的env文件比如u-boot/include/configs/rk3588_common.h或者板级env文件里会默认加上consolettyS0,1500000这种参数。如果这一行存在且波特率和设备树不一致内核启动时后打印的日志会按照cmdline里的波特率走造成和U-Boot阶段不一致。改成consolettyS0,115200Android系统下还要另外查找device/rockchip/rk3588/目录下的BoardConfig.mk或者device/rockchip/common/BoardConfig.mk里面通常有一条BOARD_KERNEL_CMDLINE包含consolettyS0,1500000。同样改成115200。改完这一层U-Boot、内核、系统三段的波特率才能完全对齐。4. 编译、打包与烧录三步把改动落到板子上4.1 确认SDK编译环境与目录结构无论你用的是Linux SDK还是Android SDKRK3588的编译环境都建议在Ubuntu 20.04或22.04 x86_64宿主机上。开始之前先确认SDK目录结构是否完整重点看u-boot、kernel、device这三个目录是否存在。如果是从其他同事手里拷贝的SDK建议先检查一下是否有编译残留避免旧产物干扰。编译前还要确认交叉编译工具链是否就绪。Rockchip Linux SDK里面自带了一套预编译工具链通常在prebuilts/gcc/linux-x86/aarch64目录下。如果使用Android SDK则依赖Android自带的clang和aarch64工具链。建议在SDK根目录下用source envsetup.shLinux SDK或source build/envsetup.shAndroid SDK初始化环境一步到位。4.2 单独的U-Boot与内核编译命令如果你只想改debug串口波特率完全不需要全量编译整个系统单独编译U-Boot和内核就够了。Linux SDK下进入u-boot目录执行./make.sh rk3588编译产物在u-boot目录下会生成uboot.img、idbloader.img等镜像。内核编译在SDK根目录或者kernel目录下cd kernel make ARCHarm64 rk3588_defconfig make ARCHarm64 -j$(nproc) Image dtbsAndroid SDK下则是在SDK根目录执行./build.sh uboot ./build.sh kernel需要提醒的是单独编译U-Boot后烧录时不要只烧uboot.img最好把idbloader.img也一起烧进去。因为RK3588的引导流程中idbloader包含了TPL/SPL阶段串口初始化相关的部分在这里已经开始了如果idbloader和uboot.img版本不匹配可能出现启动卡住的现象。4.3 使用RKDevTool与upgrade_tool烧录的细节RK3588的烧录工具主要有Windows下的RKDevTool和Linux下的upgrade_tool。我平时在Ubuntu下用upgrade_tool基本流程是先让开发板进入Loader模式——按住板上的RECOVERY或者MASKROM按键再上电或者短接相关引脚具体看开发板说明书。连接后先用upgrade_tool l命令列出设备确认识别正常。烧录U-Boot时需要留意分区表。用upgrade_tool单独烧uboot.img的命令大致是upgrade_tool di -b uboot.img如果只是想快速验证也可以直接把整个镜像包通过完整烧录方式刷进去。但完整烧录耗时较长而且会一并覆盖系统分区。对于只改了串口波特率的场景单独烧U-Boot和boot分区就够了内核镜像在Linux SDK编译后生成kernel/arch/arm64/boot/Image烧录时对应boot分区。有一个很容易踩的坑烧录完成之后板子第一次上电串口终端可能没有任何输出或者显示的是乱码。这时候先别急着怀疑烧录失败十有八九是终端软件还停留在默认的1500000波特率或者U-Boot阶段和内核阶段的波特率没对齐。把终端切到115200重新连接再看输出是否正常。5. 验证方式与串口调试常见问题排查5.1 从U-Boot到内核完整验证波特率是否生效修改完并烧录成功后验证方法很简单把串口终端波特率设置为115200重新给开发板上电观察启动日志。正常情况下从U-Boot开始的打印信息应该是完全可读的包括DDR初始化完成、U-Boot版本信息、内核解压启动、系统服务拉起等。为了确保每一层都改干净了我建议分阶段检查。第一阶段看U-Boot是否正常第二阶段看内核打印的早期日志是否正常第三阶段进入系统后用echo命令主动往串口设备写数据再从串口终端查看是否收到正确内容。如果三个阶段都正常说明波特率修改彻底生效。在系统里还可以用stty命令进一步确认当前串口的实际波特率stty -F /dev/ttyS0 115200 stty -F /dev/ttyS0 -a看到speed 115200 baud这样的输出就说明内核驱动已经按新波特率工作了。如果设备节点是ttyS0前提是内核dts里串口别名和console参数匹配。5.2 常见问题速查表与解决办法从我自己踩过的坑和其他人反馈的问题来看RK3588修改波特率后最容易出现的情况基本都是因为各层配置不一致。下面整理了一个问题速查表按现象定位原因比你一个个试要快。现象可能原因解决办法U-Boot正常、内核打印乱码内核dts或bootargs仍是1500000改内核dts的current-speed并检查console参数内核正常、U-Boot打印乱码U-Boot的stdout-path带旧波特率检查chosen节点stdout-path去掉或改为115200n8完全没有输出接线错误、电平不匹配、烧录失败确认TX/RX没有接反检查电平重新检测Loader模式进入U-Boot命令行后波特率被重置defconfig的CONFIG_BAUDRATE没改修改rk3588_defconfig中的CONFIG_BAUDRATE115200系统起来之后ttyS0不存在内核dts中uart节点status不是okay确认设备树中调试串口为okay引脚的pinctrl配置正确特定终端软件在115200下乱码终端软件缓存或数据位设置不对检查数据位8、停止位1、无校验重连看看另外补充一个实操心得如果发现U-Boot早期阶段的打印仍然是1500000别慌。RK3588的BootROM和DDR初始化阶段的打印频率由预编译的固件二进制决定这部分改动涉及重新编译rkbin周期长、风险大对日常调试没有太大意义。你只要保证U-Boot主体之后是115200就行这种前快后慢的现象在开发板上其实很常见。还有一个容易被忽略的点是如果你在使用蓝牙或WiFi模块注意它们会不会占用同一个UART。RK3588的多个UART有不同的mux选项比如uart0可以工作在m0或者m1引脚组下。修改dts的pinctrl-0属性时不要只看uart编号还要看具体是哪个引脚组别和WiFi蓝牙的调试口搞混了否则系统起来后会发现串口设备虽然存在但怎么都没输出。最后再分享一个小技巧。如果你用的是Rockchip Linux SDK修改完设备树后可以先不重新编译整个内核只编译dtbs然后单独烧录boot分区里对应的dtb镜像。这样每次调试dts的响应周期会短很多。我在开发阶段就是这么干的省下的编译时间都够再刷几轮固件了。串口波特率这个东西说白了就是一层一层的约定U-Boot跟内核约定好了内核跟终端约定好了整套链路就通了。只要抓住设备树、DEFCONFIG、bootargs这三个抓手以后换到RK3568、RK3576这些平台思路完全一样。
返回列表