全志和瑞芯微平台反编译设备树

**问题摘要:**工作生产环境不规范,没有服务器保存驱动文件,调试完成的设备树因为 VMware 虚拟机损坏导致所有文件丢失。但系统保留了历史版本 OS,通过从历史版本镜像反编译得到对应设备树,重新调试,节省了大量时间。

设备树文件在哪里?

在 Ubuntu、Buildroot 等 Linux 系统中,设备树文件(dtb)的存在形式和位置因系统状态(源码中、运行时)而异。想要得到实际使用的 dts 文件,就需要先获取对应的 dtb 文件。

1. 在系统源码或编译输出目录中

这是 .dts 源文件和编译生成的 .dtb 文件最初存放的地方。

  • Linux 内核源码中 :.dts 源文件位于内核源码的 arch/<架构>/boot/dts/ 目录下。
    • ARM 32 位:arch/arm/boot/dts/
    • ARM 64 位:arch/arm64/boot/dts/
    • RISC-V:arch/riscv/boot/dts/
  • Buildroot 编译输出:编译生成的 .dtb 文件通常位于 output/images/ 目录下。
  • Ubuntu/Debian 系统包:安装的 .dtb 文件通常在 /boot/dtbs/(uname -r)/ 目录,旧版本可能在 /lib/firmware/(uname -r)/device-tree。
2. 在已运行的 Linux 系统中

系统启动后,dtb 文件会被内核加载并解析,在运行时可以通过以下方式访问:

  • /sys/firmware/fdt :这是一个原始、完整的 DTB 二进制文件的拷贝,可以直接从这里提取文件用于反编译。
  • /sys/firmware/devicetree/base/ :这是以目录和文件形式呈现的设备树,结构清晰。根节点是 base 目录,子节点是子目录,属性是文件,可通过 cat 查看其值。
  • /proc/device-tree :这是一个软链接,通常指向 /sys/firmware/devicetree/base。
  • /boot/ 目录 :系统启动时,U-Boot 等引导程序加载的 .dtb 文件通常存放在此,文件名可能为 dtb、dtbs 或 *.dtb 等。

如何反编译设备树文件?

要反编译 .dtb 文件,需要用到设备树编译器(Device Tree Compiler,DTC)。

1. 安装 DTC 工具

Ubuntu/Debian:
sudo apt install device-tree-compiler

**Buildroot:**在 menuconfig 中选中 dtc 包(通常位于 Target packages -> Hardware handling)。

**从源码编译:**可从内核源码的 scripts/dtc/ 目录获取。

2. 执行反编译

使用以下命令将 .dtb 文件反编译为可读的 .dts 源文件:
dtc -I dtb -O dts -o 输出文件.dts 输入文件.dtb

  • -I dtb:指定输入格式为 dtb。
  • -O dts:指定输出格式为 dts。

实际场景示例:

从运行系统中的 /sys/firmware/fdt 反编译(最常用):

1. 复制出 fdt 文件 cp /sys/firmware/fdt ./myboard.dtb # 2. 反编译 dtc -I dtb -O dts -o myboard.dts myboard.dtb

从 /boot/ 目录反编译:
dtc -I dtb -O dts -o boot.dts /boot/xxx.dtb

**注意:**反编译得到的 .dts 文件会把所有 .dtsi 头文件展开,是一个完整的、包含所有信息的大文件。

这里有一个坑点:全志和瑞芯微的 /sys/firmware 目录内容不是一样的,应该说,不同平台不一样(详细原因我没有深究,因为已经满足了我的需求)。

在全志平台下面有个 /sys/firmware/fdt 目录,下面是已经展开的、当前系统正在使用的设备树。

瑞芯微平台下面有 /sys/firmware/devicetree/base/,这个是 /proc/device-tree 软链接的地址,不同平台不一定都有这个软链接。

使用上面的反编译方法,成功帮我解决了上个工程师交接内容不清楚的问题。虽然反编译出来的内容不一定全部能看懂,但是对应的一些引脚,以及 dts 里面关于屏幕等参数是可以完整得到的。

ps:生产流程和环境正式化,规范化真的重要。

相关推荐
国科安芯2 小时前
人在回路中的总线:商业空间站环境控制与生命保障系统CANFD网络的可靠性与功能安全
网络·嵌入式硬件·安全·架构·php·抗辐射
程序员初一2 小时前
Linux 远程桌面有四种做法
linux·ssh
程序开发阿元3 小时前
1C1G 能跑什么:把留常驻服务和不留摆进一张内存表
linux·ssh
国科安芯3 小时前
算力上天之后的电与静:星上边缘计算载荷带外管理网络的低功耗调度与辐射容错
网络·人工智能·嵌入式硬件·安全·边缘计算·低轨卫星·商业航天
xbzb5 小时前
自定义 yum 软件源:Linux 上 createrepo,Windows 上纯 Python 也能造
linux·运维·windows·python·yum·createrepo
Android系统攻城狮5 小时前
Linux FFmpeg深度解析之avio_open调用流程与实战(三十八)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
独隅6 小时前
WebStorm Linux 版安装实战与核心效能展示
linux·ide·webstorm
t13970186 小时前
MPPT 和 PWM 有什么区别?小功率太阳能供电到底该选哪个
嵌入式硬件·物联网
en.en..7 小时前
STM32入门最佳学习顺序(寄存器→标准库→HAL库)
单片机·嵌入式硬件
雪落漂泊8 小时前
Linux进程(五):进程地址空间篇
linux·运维·服务器