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

**问题摘要:**工作生产环境不规范,没有服务器保存驱动文件,调试完成的设备树因为 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:生产流程和环境正式化,规范化真的重要。

相关推荐
zbyyd1 小时前
Linux驱动开发:Misc混杂设备与设备树实战
linux·驱动开发
业余程序员plus1 小时前
RDMA-Verbs-软件架构(二)
linux·rdma·rocev2·mlx5·verbs·uverbs·libibverbs
坤坤子吖2 小时前
Linux 线程同步与互斥——条件变量与线程同步
linux·开发语言·c++·笔记·学习
深圳海导科技2 小时前
深圳海导科技navynav|小型RTK数传电台:高精度定位场景下的枢纽
单片机·嵌入式硬件
张文君2 小时前
vmware克隆后ubuntu26.04 ip怎么更改
linux·运维·服务器
2402_882893862 小时前
Linux进程控制(上):fork、写时拷贝、进程终止与进程等待,一篇吃透!
linux·进程·fork·写时拷贝
创界工坊工作室2 小时前
49-基于单片机的火警报警器设计
stm32·单片机·嵌入式硬件·51单片机·proteus
笨笨饿3 小时前
144_Codex变慢的解决办法
stm32·单片机·嵌入式硬件·mcu·物联网·51单片机·proteus
小此方3 小时前
Linux网络(二十九):从内网穿透到P2P打洞:NAT转换、代理机制与局域网通信的底层全景解析
linux·网络·p2p