板子:泰山派 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