如何解包 Android boot.img 并检查 UART 是否启用

如何解包 Android boot.img 并检查 UART 是否启用(以 RK3588 为例)

在嵌入式 Android 开发中,我们经常需要确认某个硬件外设(如串口 UART)是否在系统启动时被启用。最可靠的方式之一是直接分析设备的 boot.img 中的设备树(Device Tree)

本文将以 Rockchip RK3588 平台为例,完整演示如何:

  1. 使用 AOSP 工具解包 boot.img
  2. 反编译设备树二进制文件(.dtb.dts
  3. 检查 uart0 是否启用
  4. 理解内核命令行中的串口配置

🛠️ 前提条件

  • 已成功编译 AOSP for RK3588(或拥有目标设备的 boot.img
  • Ubuntu/Linux 开发环境
  • 已安装 device-tree-compilerdtc

步骤 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=ttyFIQ0uart0 未启用

它只表示日志走 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 调试技巧。

相关推荐
每次的天空2 小时前
Android车机开发——内存优化操作
android·学习·设计模式
zl_dfq2 小时前
Linux 之 【进程替换】(execl、execlp、execle、execv、execvp、execve)
linux
乌蒙山连着山外山2 小时前
linux中查询多个匹配字段
java·linux·服务器
乘凉~2 小时前
在Ubuntu上部署并使用xianyu-auto-reply
linux·运维·ubuntu
学不完的路路路2 小时前
Makefile文件编写-Linux-Ubuntu系统
linux·运维·ubuntu
coding record2 小时前
linux 上安装Matlab,case: Matlab2020a,或者有效时间过期
linux·运维·服务器
冉佳驹2 小时前
Linux ——— sudo权限管理和GCC编译工具链的核心操作
linux·makefile·make·gcc·sudo·.phony
爱跑马的程序员2 小时前
Kernel i2c 设备驱动详细讲解
linux·安卓·内核驱动
love混世_魔王3 小时前
VIM经典命令系列之数字递增、递减
linux·编辑器·vim·verilog vim插件·vim使用技巧·vim高效编程