如何解包 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 调试技巧。

相关推荐
阳光九叶草LXGZXJ2 分钟前
达梦数据库-学习-47-DmDrs控制台命令(LSN、启停、装载)
linux·运维·数据库·sql·学习
春日见10 分钟前
如何避免代码冲突,拉取分支
linux·人工智能·算法·机器学习·自动驾驶
无垠的广袤1 小时前
【VisionFive 2 Lite 单板计算机】边缘AI视觉应用部署:缺陷检测
linux·人工智能·python·opencv·开发板
阿波罗尼亚1 小时前
Kubectl 命令记录
linux·运维·服务器
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.1 小时前
Keepalived单播模式配置与实战指南
linux·服务器·负载均衡
IDC02_FEIYA1 小时前
Linux文件搜索命令有哪些?Linux常用命令之文件搜索命令find详解
linux·运维·服务器
江畔何人初1 小时前
kubectl apply与kubectl create的区别
linux·运维·云原生
M158227690552 小时前
四通道全能组网!SG-Canet-410 CAN转以太网网关,破解工业CAN通信瓶颈
linux·运维·服务器
誰能久伴不乏2 小时前
【Qt实战】工业级多线程串口通信:从底层协议设计到完美收发闭环
linux·c++·qt
bjxiaxueliang2 小时前
一文解决蓝牙连接难题:Ubuntu命令行蓝牙强制配对
linux·ubuntu·蓝牙连接命令