RK3588平台串口配置修改指南:切换至串口8 电子说
在嵌入式开发中,串口作为基础调试接口至关重要。本文档针对 RK3588 平台,详细介绍如何将系统默认串口修改为串口 8(UART8),包括 U-Boot 阶段和内核阶段的配置调整。该修改适用于需要使用额外串口进行调试或通信的场景,例如当默认串口被其他功能占用时,需重新映射控制台到串口 8。
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3588-linux.dtsi+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3588-linux.dtsialiases {};chosen: chosen {- bootargs = "earlycon=uart8250,mmio32,0xfeb50000 console=ttyFIQ0 irqchip.gicv3_pseudo_nmi=0 root=PARTUUID=614e0000-0000 rw rootwait rcupdate.rcu_expedited=1 rcu_nocbs=all mtdparts=sfc_nor:0x00040000@0x00180000(vnvm),0x00800000@0x00800000(uboot)";+ bootargs = "earlycon=uart8250,mmio32,0xfeb50000 console=ttyFIQ0 console=ttyS8,1500000n8 irqchip.gicv3_pseudo_nmi=0 root=PARTUUID=614e0000-0000 rw rootwait rcupdate.rcu_expedited=1 rcu_nocbs=all mtdparts=sfc_nor:0x00040000@0x00180000(vnvm),0x00800000@0x00800000(uboot)";};
关键修改说明:
•在bootargs 中新增console=ttyS8,1500000n8 参数
◦ttyS8 表示使用串口 8 作为控制台
◦1500000n8 定义波特率为 1500000,数据位 8 位,无校验位,1 位停止位
•earlycon=uart8250,mmio32,0xfeb50000 用于早期控制台初始化,指定串口控制器基地址
--- a/u-boot/arch/arm/dts/rk3588-u-boot.dtsi+++ b/u-boot/arch/arm/dts/rk3588-u-boot.dtsistatus = "okay";};+&uart8 {+ clock-frequency = <24000000>;+ u-boot,dm-spl;+ pinctrl-names = "default";+ status = "okay";+ pinctrl-0 = <&uart8m0_xfer>;+};+&hw_decompress {u-boot,dm-spl;status = "okay";
关键修改说明:
•启用uart8 设备节点:
◦clock-frequency = <24000000>:设置串口时钟频率为 24MHz,用于波特率计算
◦u-boot,dm-spl:标记该串口用于 U-Boot SPL(Secondary Program Loader)阶段
◦pinctrl-0 = <&uart8m0_xfer>:指定串口 8 的引脚复用配置,需确保与硬件设计一致
•该配置使 U-Boot 在启动阶段能够初始化并使用串口 8
--- a/u-boot/common/cli.c+++ b/u-boot/common/cli.c@@ -15,6 +15,10 @@++++DECLARE_GLOBAL_DATA_PTR;@@ -218,6 +222,16 @@ err:void cli_loop(void){+ struct udevice *uart_dev;+ writel(0x00ff00aa, 0xfd5f8088);+ if (uclass_get_device_by_seq(UCLASS_SERIAL, 8, &uart_dev))+ printf("uart: failed to get devicen");+ else+ printf("uart: got devicen");+ serial_dev_setbrg(uart_dev, 1500000);++ gd->flags |= GD_FLG_SERIAL_READY;+ gd->cur_serial_dev = uart_dev;parse_file_outer();/* This point is never reached */
关键修改说明:
•新增头文件包含:serial.h、dm.h 等,用于串口设备管理
•通过uclass_get_device_by_seq(UCLASS_SERIAL, 8, &uart_dev) 获取串口 8 设备句柄
•serial_dev_setbrg(uart_dev, 1500000) 设置波特率为 1500000
•更新全局数据结构gd,标记串口已准备就绪并设置为当前串口设备
1.定位设备树文件
进入内核源码目录:cd kernel/arch/arm64/boot/dts/rockchip/
2.修改 bootargs 参数
使用文本编辑器打开rk3588-linux.dtsi,在chosen 节点中添加console=ttyS8,1500000n8,确保内核启动时使用串口 8 作为控制台。
1.定位 U-Boot 设备树文件
进入 U-Boot 源码目录:cd u-boot/arch/arm/dts/
2.启用串口 8 设备节点
打开rk3588-u-boot.dtsi,添加&uart8 节点配置,包括时钟频率、引脚控制和状态设置,确保 U-Boot 阶段能初始化串口 8。
3.修改 CLI 代码初始化串口
进入 U-Boot 源码目录:cd u-boot/common/
打开cli.c,添加串口设备获取、波特率设置及全局数据更新逻辑,确保 U-Boot 命令行使用串口 8。
•控制器基地址:根据设备树配置,串口 8 的基地址为 0xfeb50000(由earlycon=uart8250,mmio32,0xfeb50000 指定)
•引脚复用:需确保uart8m0_xfer 引脚配置与硬件设计一致,通常包括:
◦TXD8(发送引脚)
◦RXD8(接收引脚)
◦GND(接地)
1.启动日志检查
连接串口 8 到调试终端(波特率 1500000,8N1),重启设备后观察 U-Boot 输出:
◦若配置正确,U-Boot 启动时会输出 uart: got device 日志
◦命令行提示符(如=>)应出现在串口 8 终端
1.串口设备查询
在 U-Boot 命令行中执行:
printenv console# 应输出类似 "console=ttyS8,1500000"dev list | grep serial# 应显示串口 8 设备已注册
1.内核日志检查
内核启动后,串口 8 应输出完整的启动日志(dmesg 内容),并显示ttyS8 设备初始化信息:
[ 0.000000] console [ttyS8] enabled[ 1.234567] serial8250.8: ttyS8 at MMIO 0xfeb50000 (irq = 123) is a 16550A
1.串口设备测试
在系统中执行:
|
# 检查串口设备是否存在
ls /dev/ttyS8
# 测试串口通信(例如向串口 8 发送数据)
echo "Test Data" > /dev/ttyS8
|
•无输出问题:
a.检查硬件连接是否正确,引脚是否短路或虚接
b.确认串口 8 的时钟频率(24MHz)与波特率(1500000)计算是否正确
c.检查设备树中的status 是否为"okay",确保设备未被禁用
•波特率异常:
◦确认serial_dev_setbrg 和console 参数中的波特率一致
◦检查clock-frequency 设置是否与硬件时钟匹配
通过以上步骤,可在 RK3588 平台成功将系统串口修改为串口 8,实现 U-Boot 和内核阶段的串口重定向,满足特定硬件调试与通信需求。重要说明,uboot阶段的并没有完全修改为串口8,如需完全显示log,还需要修改其他,比如ddr.bin文件等。
全部0条评论
快来发表一下你的评论吧 !