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

相关推荐
QT 小鲜肉13 分钟前
【Linux命令大全】001.文件管理之which命令(实操篇)
linux·运维·服务器·前端·chrome·笔记
梦幻通灵21 分钟前
Mysql字段判空实用技巧
android·数据库·mysql
oMcLin1 小时前
Ubuntu 22.04 无法连接外部网络的故障排查与解决(解决 DNS 配置问题)
linux·网络·ubuntu
还不秃顶的计科生1 小时前
LeetCode 热题 100第二题:字母易位词分组python版本
linux·python·leetcode
咯哦哦哦哦1 小时前
WSL + ubantu22.04 + 远程桌面闪退+黑屏闪退解决
linux·开发语言
fantasy5_52 小时前
Linux 动态进度条实战:从零掌握开发工具与核心原理
linux·运维·服务器
weixin_462446232 小时前
exo + tinygrad:Linux 节点设备能力自动探测(NVIDIA / AMD / CPU 安全兜底)
linux·运维·python·安全
..过云雨2 小时前
17-2.【Linux系统编程】线程同步详解 - 条件变量的理解及应用
linux·c++·人工智能·后端
oMcLin2 小时前
CentOS 7 频繁出现 “Connection Refused” 错误的原因分析与解决
linux·运维·centos
龘龍龙3 小时前
Python基础(九)
android·开发语言·python