如何解包 Android boot.img 并检查 UART 是否启用(以 RK3588 为例)
在嵌入式 Android 开发中,我们经常需要确认某个硬件外设(如串口 UART)是否在系统启动时被启用。最可靠的方式之一是直接分析设备的 boot.img 中的设备树(Device Tree)。
本文将以 Rockchip RK3588 平台为例,完整演示如何:
- 使用 AOSP 工具解包
boot.img - 反编译设备树二进制文件(
.dtb→.dts) - 检查
uart0是否启用 - 理解内核命令行中的串口配置
🛠️ 前提条件
- 已成功编译 AOSP for RK3588(或拥有目标设备的
boot.img) - Ubuntu/Linux 开发环境
- 已安装
device-tree-compiler(dtc)
步骤 1:使用 unpack_bootimg 解包 boot.img
AOSP 提供了官方工具 unpack_bootimg,可安全解析 boot.img 的各个组成部分。
bash
# 进入 AOSP 根目录
cd ~/workspace/Taurus-RK3588-Android12
# 解包 boot.img
out/host/linux-x86/bin/unpack_bootimg \
--boot_img out/target/product/rk3588s_s/boot.img \
--out extracted/
成功执行后,你会看到类似输出:
boot magic: ANDROID!
kernel_size: 37210120
ramdisk size: 40795323
dtb size: 227434
...
解包结果位于 extracted/ 目录:
bash
$ ls extracted/
dtb kernel ramdisk recovery_dtbo second
其中:
dtb:主设备树二进制文件(正是我们要分析的对象)kernel:压缩的 Linux 内核镜像ramdisk:初始根文件系统
步骤 2:反编译 DTB 为可读的 DTS
设备树二进制(.dtb)是内核启动时使用的机器可读格式。我们需要将其转换为人类可读的源码格式(.dts)。
安装 device-tree-compiler
bash
sudo apt update
sudo apt install device-tree-compiler
执行反编译
bash
cd extracted/
dtc -I dtb -O dts -o main.dts dtb
这将生成 main.dts 文件,包含完整的设备树源码。
步骤 3:检查 uart0 是否启用
在 Rockchip 平台上,UART 控制器通常以 &uart0, &uart1, ... 的形式在设备树中引用。
方法一:直接搜索 uart0 节点
bash
grep -A 10 -B 5 "&uart0\|uart0 {" main.dts
✅ 启用状态示例:
dts
&uart0 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&uart0m2_xfer>;
};
status = "okay"表示该 UART 控制器已被启用,驱动会加载并创建/dev/ttyS0。
❌ 禁用状态示例:
dts
&uart0 {
status = "disabled";
};
或完全找不到 uart0 节点 → 表示未启用。
方法二:检查 aliases(别名映射)
有时串口通过别名引用:
bash
grep -A 5 "aliases" main.dts
输出可能包含:
dts
aliases {
serial0 = &uart0;
serial1 = &uart1;
};
这意味着 serial0 对应 uart0,通常会被注册为 /dev/ttyS0。
步骤 4:理解内核命令行中的 console 配置
回到 unpack_bootimg 的输出,注意这一行:
command line args: console=ttyFIQ0 ... androidboot.console=ttyFIQ0
这说明:
- 系统控制台(kernel log)输出到
ttyFIQ0 ttyFIQ0是 Rockchip 特有的 FIQ Debugger,一种高性能调试串口- 即使
uart0被启用,也不一定作为 console 使用
💡 关键结论:
console=ttyFIQ0≠uart0 未启用它只表示日志走 FIQ,而
uart0仍可能用于蓝牙、GPS 或 MCU 通信。
🔍 实用技巧:快速判断 UART 状态
| 条件 | 结论 |
|---|---|
&uart0 { status = "okay"; } 存在 |
✅ 硬件已启用,可被应用或驱动使用 |
status = "disabled" 或无此节点 |
❌ 未启用 |
console=ttyFIQ0 |
📝 仅表示系统日志不走标准 UART,不影响 uart0 功能 |
✅ 总结
通过解包 boot.img 并反编译设备树,我们可以精准判断硬件外设的启用状态,无需依赖运行时猜测。这对于:
- 调试串口通信问题
- 移植旧版 AOSP 配置
- 定制板级支持包(BSP)
都具有极高价值。
记住:设备树是硬件配置的"真相之源"。
📌 附录:常用命令速查
bash
# 解包 boot.img
out/host/linux-x86/bin/unpack_bootimg --boot_img boot.img --out extracted/
# 反编译 dtb
dtc -I dtb -O dts -o main.dts extracted/dtb
# 检查 uart0
grep -A5 -B5 "uart0\|&uart0" main.dts
# 检查别名
grep -A10 "aliases" main.dts
希望这篇文章对你有帮助!如果你正在开发基于 RK3588 的产品,欢迎关注更多嵌入式 Android 调试技巧。