设备树(DTB)

设备树 = 给 Linux 看的 “硬件说明书”

设备树不是在 U-Boot 里生成的!

设备树 = Linux 内核里的文件

设备树不改,硬件等于不存在!

设备树位置:Z:\F1C200S\Linux\linux-5.7.1\arch\arm\boot\dts

设备树编译:

1
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- dtbs

.dts/.dtsi 不能直接脱离内核单独编译,因为依赖内核头文件和绑定定义。

.dtb 只能保证在编译它的那个内核版本上稳定运行,跨版本使用有兼容性风险。

如果你想在新内核上用自己改好的设备树,把.dts.dtsi复制过去,在新内核里重新编译即可。

1. 结论

不管是 USB、串口、SPI、I2C、网卡、LED、屏幕…… 只要是硬件,想让 Linux 认识、驱动跑起来, 99% 都要在这里(设备树)修改配置!

你现在的路径:

1
linux-5.7.1/arch/arm/boot/dts/

这里就是所有硬件的 “户口本”。


2. 我用 USB 举个最直白的例子(F1C100s)

假如你要打开 USB 驱动,你必须去设备树里:

步骤 1:打开 USB 控制器

1
2
3
usb_otg: usb@1c13000 {
status = "okay"; // 这里必须写 okay
};

步骤 2:配置 USB 引脚(GPIO)

1
2
3
4
usb_pins: usb-pins {
pins = "PA23", "PA24", "PA25";
function = "usb";
};

步骤 3:配置供电

1
2
3
usb_power: usb-power {
gpio = <&pio 3 3 GPIO_ACTIVE_HIGH>;
};

编译 → 生成 dtb → 放到 SD 卡

Linux 启动后才能识别 USB!


3. 超级大白话总结(你一定要记住)

设备树 = Linux 的眼睛

  • 不修改设备树 → Linux 看不见这个硬件
  • 设备树写错 → Linux 识别错误 / 驱动不加载
  • 设备树写对 → Linux 自动加载驱动,硬件就能用

所有硬件都一样:

  • USB ✅ 要改设备树
  • 屏幕 ✅ 要改设备树
  • 网卡 ✅ 要改设备树
  • 串口 ✅ 要改设备树
  • I2C/SPI ✅ 要改设备树
  • 蜂鸣器、LED、按键 ✅ 都要改设备树

一、超简单一句话解释

  • .dts / .dtsi = 设备树源码(文本文件,可修改)
  • .dtb = 设备树二进制(U-Boot/Linux 加载的文件)
  • 修改 = 改 .dts
  • 生成 = 用编译器 dtc 编译成 .dtb

二、举个最实用的例子:修改 LED 引脚

假设你要改 用户 LED 从 PB5 改成 PB6

1. 找到设备树源文件

你的文件:

1
suniv-f1c100s-licheepi-nano.dts

2. 打开找到 LED 节点

1
2
3
4
5
6
7
8
9
leds {
compatible = "gpio-leds";

user_led {
label = "user:led";
gpios = <&pio 5 1 GPIO_ACTIVE_HIGH>; // PB5
default-state = "on";
};
};

3. 你想改成 PB6,只需要改一个数字

1
gpios = <&pio 6 1 GPIO_ACTIVE_HIGH>; // PB6

三、如何编译生成 dtb 文件(1 条命令)

你只需要一个工具:dtc(device tree compiler)

编译命令(Windows/Linux 都能用)

1
dtc -I dts -O dtb -o suniv-f1c100s-licheepi-nano.dtb suniv-f1c100s-licheepi-nano.dts

生成 →

suniv-f1c100s-licheepi-nano.dtb

复制到 SD 卡 FAT 分区,替换原来的 dtb 即可。

四、我再给你举 3 个最常用的修改例子

例 1:修改串口波特率

1
2
3
uart0: serial@1c25000 {
status = "okay";
};

例 2:修改 SD 卡支持 4GB / 32GB

1
2
3
4
mmc0: mmc@1c0f000 {
max-frequency = <50000000>;
bus-width = <4>;
};

例 3:给 GPIO 加一个自定义设备

1
2
3
4
my-gpio {
compatible = "gpio-leds";
gpios = <&pio 3 1 GPIO_ACTIVE_HIGH>; // PB3
};

五、超级重点(你必须知道)

设备树是跟芯片一一对应的

  • F1C100s 的设备树 不能给 STM32MP1 用
  • 换芯片就要换 dtsi + dts
  • 语法全世界都一样

设备树语法非常简单

就是:

1
2
3
4
节点名 {
属性 = 值;
属性 = <值 值 值>;
};

六、你现在就能学会的总结

  1. 设备树 = 硬件配置表
  2. 改 .dts 文本
  3. dtc 编译成 .dtb
  4. 放到 SD 卡 FAT 分区
  5. Linux 启动就会用新硬件配置

设备树基本位置

  1. Linux 设备树 → 在内核源码里

    1
    arch/arm/boot/dts/xxx.dts
  2. U-Boot 设备树 → 给 U-Boot 用,和 Linux 无关

  3. 修改 dts → 编译内核 → 得到 dtb → 放进 SD 卡

  4. Linux 启动时加载这个 dtb


相关链接(侵删)


=================我是分割线=================

欢迎到公众号来唠嗑: