wenbo2005.online

学习记录 / Linux

泰山派增加 UART5 全流程

Linux2026-09-22

板子:泰山派 4+64G | 原系统内核:Linux 4.19.232(Ubuntu) 目标:启用 UART5(底盘通信)→ /dev/ttyS5,与 UART3(雷达,/dev/ttyS3)并存


0. 核心原则(最重要)

内核版本必须与 rootfs 里的 /lib/modules/<版本> 完全一致。

板子内核 用来编 boot 的 SDK 结果
4.19.232 kernel 6.1 SDK ❌ 能开机,但网卡/蓝牙/GPU 模块全部失效
4.19.232 kernel 4.19 SDK ✅ 只换 boot,ROS/网卡/设置全部保留

结论:只改 DTS、不动内核大版本,是最稳的路线。整套只用 dd 换 boot 分区,不重烧整包。


1. 先确认板子信息

uname -r                                  # 4.19.232
cat /proc/cmdline
ls -l /dev/disk/by-partlabel/
lsblk -o NAME,SIZE,PARTLABEL

实测分区(4+64G eMMC):

分区 设备 大小 LBA 起始
uboot mmcblk0p1 4M 0x00004000
misc mmcblk0p2 4M 0x00006000
boot /dev/mmcblk0p3 64M 0x00008000
recovery mmcblk0p4 64M 0x00028000
backup mmcblk0p5 32M 0x00048000
rootfs mmcblk0p6 剩余(grow) 0x00058000

→ boot 分区 = /dev/mmcblk0p3(LBA 0x8000 = 16 MiB)


2. 下载正确的 SDK

立创网盘 → 第05章.【立创·泰山派】系统SDK → 【SDK】Linux → 【SDK】Linux-kernel4.9 文件夹(名字写 4.9,实为 4.19)

文件 说明
tspi_linux_sdk_repo_20240131.tar.gz (15.7G) ✅ 用这个
tspi_linux_sdk_20230916.tar.gz (13.7G) 旧版,不用
buildroot_dl_*.tar.gz 只编内核用不到
Tspi_Linux_config.cfg RKDevTool 烧录配置(可选)

3. 传进虚拟机并解压

别用 FileZilla 传 15.7G,用 VMware 共享文件夹: 虚拟机 → 设置 → 选项 → 共享文件夹 → 添加 SDK 所在目录

# 解压到虚拟机本地盘(不要解压到 /mnt/hgfs)
mkdir -p ~/TaiShaPaiSDK && cd ~/TaiShaPaiSDK
time tar -xzf /mnt/hgfs/<共享名>/tspi_linux_sdk_repo_20240131.tar.gz

# 解压后只有隐藏目录 .repo,删掉压缩包腾空间
rm -f /mnt/hgfs/<共享名>/tspi_linux_sdk_repo_20240131.tar.gz
ls -a

# 同步出源码
python3 .repo/repo/repo sync -l -j8

空间:压缩包 15.7G + .repo ~15G + 源码 ~30G + 编译产物 ~5G ≈ 65G


4. 验证内核版本(关键闸门)

head -4 kernel/Makefile

必须是:

VERSION = 4
PATCHLEVEL = 19
SUBLEVEL = 232

对不上就别往下走。


5. 改 DTS,加 UART5

文件:kernel/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts 引脚:rk3568-pinctrl.dtsi 里的 uart5m1_xfer = GPIO3_C3(rx) / GPIO3_C2(tx)

cd ~/TaiShaPaiSDK
python3 - <<'PY'
import re
f='kernel/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts'
s=open(f,'rb').read()                      # 二进制读写,不动文件里的中文注释
if re.search(rb'^\s*&uart5\s*\{',s,re.M):
    print('已改过,跳过'); raise SystemExit
m=re.search(rb'^\s*&uart3\s*\{.*?^\s*\};',s,re.M|re.S)
assert m,'找不到 &uart3 段'
b=b'\n\n//User UART5 (chassis)\n&uart5 {\n\tstatus = "okay";\n\tpinctrl-names = "default";\n\tpinctrl-0 = <&uart5m1_xfer>;\n};\n'
open(f,'wb').write(s[:m.end()]+b+s[m.end():])
print('OK: uart5 已插入')
PY

sed -n '100,125p' kernel/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts

6. 绕过编译期的 IO 域人工确认

scripts/mkimg 会调用 scripts/io-domain.sh,弹 whiptail 菜单让你手选 IO 域电压(1.8V/3.3V),选不中 dts 里的值就 exit 1,导致 make: *** [arch/arm64/Makefile:203: tspi-rk3566-user-v10-linux.img] Error 1。

该脚本只做检查(独立进程,不修改 dtb),而本次完全没动 io-domain 配置 → 直接跳过:

cp kernel/scripts/io-domain.sh kernel/scripts/io-domain.sh.bak
sed -i '1a exit 0' kernel/scripts/io-domain.sh
head -4 kernel/scripts/io-domain.sh          # 第 2 行应为 exit 0

7. 编译

cd ~/TaiShaPaiSDK

# 切到泰山派板级配置(务必显式指定,见「坑 6」)
./build.sh BoardConfig-rk3566-tspi-v10.mk
# 或交互式:./build.sh lunch  → 输入 3

./build.sh kernel

成功标志:Running 10-kernel.sh - build_kernel succeeded.

产物:

ls -l kernel/boot.img
# rockdev/boot.img 是指向它的软链接
# 实测大小 24046080 字节(22.9 MB)< boot 分区 64MB ✅

8. 备份 + 烧写

先在板子上备份原 boot(救砖用):

ls -l /dev/disk/by-partlabel/boot          # 确认 mmcblk0p3
sudo cat /dev/mmcblk0p3 > /home/lckfb/boot_orig.img
ls -l /home/lckfb/boot_orig.img            # 必须是 67108864

把新 kernel/boot.img 传到板子(scp 或 FileZilla),然后写进去:

sudo cp /home/lckfb/boot.img /dev/mmcblk0p3
sync
sudo reboot

也可以用 dd,但注意写法必须是 if= of= 连在一起: sudo dd if=/home/lckfb/boot.img of=/dev/mmcblk0p3 bs=1M conv=fsync


9. 验证

uname -r                                   # 仍是 4.19.232 ✅
ls -l /dev/ttyS*
dmesg | grep -iE "ttyS|fe690000"

期望结果:

fe650000.serial: ttyS1 ...      # uart1
fe670000.serial: ttyS3 ...      # uart3  雷达
fe690000.serial: ttyS5 ...      # uart5  底盘  ← 本次新增

10. 串口权限

sudo tee /etc/udev/rules.d/99-ttyS.rules > /dev/null <<'EOF'
KERNEL=="ttyS3", MODE="0666"
KERNEL=="ttyS5", MODE="0666"
EOF

sudo udevadm control --reload-rules
sudo udevadm trigger
ls -l /dev/ttyS*                           # 应为 crw-rw-rw-

附:踩过的坑

# 现象 原因 / 处理
1 6.1 的 boot.img 烧进 4.19 系统,网卡/GPU 挂 内核版本必须与 /lib/modules 一致,只能换同版本内核
2 tspi-rk3566-user-v10-linux.img Error 1 io-domain.sh 的人工确认没过 → sed -i '1a exit 0' 跳过
3 RKDevTool 读分区表报 "system" did not find match partition Linux 固件没有 system 分区,正常提示;工具地址栏单位是扇区(LBA)
4 dd: 无法识别的操作数 "if" if = 中间多了空格 → 改用 cat / cp 更省心
5 编译"没动静" \| tail 会把输出全缓存,看不见交互框 → 别用管道
6 ./build.sh -h 之后配置变了 它会自动 lunch 并切成 rk3568-evb1-ddr4-v10 → 编译前显式指定板级配置
7 解压后 ls 看不到东西 repo 版解压出来只有隐藏目录 .repo,要 ls -a + repo sync -l
8 2+16 / 4+64 是否固件通用 通用。DTS 与容量无关;rootfs 用 -@…(rootfs:grow) 自动撑满 eMMC

一页速查(以后重新编译)

cd ~/TaiShaPaiSDK
vim kernel/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts   # 改引脚/串口
./build.sh kernel
ls -l kernel/boot.img
# 传到板子后:
sudo cp boot.img /dev/mmcblk0p3 && sync && sudo reboot