嵌入式操作系统那些事儿

U-Boot/Linux设备树简明使用手册

2022-08-14  本文已影响0人  古斟布衣

设备树(Device Tree)起源于IEEE1275 OpenFirmware和Power(PC) ePAPR标准,主要适用于Power(PC)架构,用于引导程序(Bootloader)向操作系统内核传递硬件配置和内核参数。目前,设备树已经扩展到U-Boot/Linux的Power(PC)/ARM/RISC-V/MIPS/x86等多个架构,从而大大简化了代码中的驱动的配置信息。

1. 简介

设备树的官网为devicetree.org,提供相关的FAQ和最新的标准等。对应的文档和库存放在github.com/devicetree-orgkernel.org/dtc

设备树包括如下文件类型:

2. 设备树配置

设备树本质是一个树形结构,如下所示:

/dts-v1/;

#include "xxx.dtsi"

/ {
    model = "board name";
    compatible = "vendor,BSP name";

    aliases {
        ts0 = &tempsensor0;
    };

    cpus {
        #address-cells = <1>;
        #size-cells = <0>;

        cpu0: cpu@0 {
                device_type = "cpu";
                compatible = "arm,cortex-a72";
                enable-method = "psci";
                reg = <0x0>;
                clocks = <&clockgen 1 0>;
                d-cache-size = <0x8000>;
                ...
            };
        ...
        };

    memory@0 {
        device_type = "memory";
        reg = < 0x00 0x80000000 0x00 0x40000000 0x00 0x00 0x00 0x00 >;
    };

    chosen {
        stdout-path = "/soc/serial@48020000";
        bootargs = "console=ttyS0,115200n8 root=xxx rw rootfstype=ext4 ...";
    };
    ...
    soc {
        #address-cells = <2>;
        #size-cells = <2>;
        ...
        i2c0: i2c@2000000 {
            compatible = "fsl,vf610-i2c";
            #address-cells = <1>;
            #size-cells = <0>;
            reg = <0x0 0x2000000 0x0 0x10000>;
            interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>;
            clock-names = "i2c";
            clocks = <&clockgen 4 15>;
            scl-gpios = <&gpio2 15 GPIO_ACTIVE_HIGH>;

            tempsensor0: i2c3dev0@62 {
                compatible = "nxp,sa56004";
                reg = <0x4c>;
                vcc-supply = <&sb_3v3>;
            };
        ...
        };
        ...
    };
    ...
};

其中:

设备树的其他具体配置规范可以参考github.com/devicetree-org/devicetree-specification

3. 设备树访问

设备树源文件(DTS/DTSO)通过开源工具DTC(Devic Tree compiler)转换为为DTB文件或者包含DTB二进制数据的汇编文件,进而与U-Boot/Linux等编译在一起,并可以通过libfdt库从DTB文件和二进制数据中获取信息。

DTC工具源码托存在kernel.org/dtc,包含DTC工具和libfdt库,也可以使用操作系统自带的工具安装,例如:

sudo apt install device-tree-compiler

DTC工具除了可以从DTS生成DTB,还可以从DTB文件和文件系统(/sys/firmware/devicetree/base或者/proc/device-tree)生成DTS文件,例如:

$ dtc -h                                                    # 查看帮助信息
$ dtc -I dts -O dtb -o xxx.dtb xxx.dts                      # 从DTS生成DTB
$ dtc -I dtb -O dts -o xxx.dts xxx.dtb                      # 从DTB生成DTS
$ dtc -I fs -O dts -o xxx.dts /sys/firmware/devicetree/base # 从文件系统生成DTS

DTC工具包含的libfdt库用于访问通过DTB文件或者包含DTB二进制数据的汇编文件形式加载到内存或者其他存储介质中的设备树信息中,其接口定义在libfdt/libfdt.h

4. U-Boot/Linux设备树获取

有源码的情况下,设备树文件通常可以通过搜索后缀为dtsdtsidtso的文件来获取。其中:

没有源码的情况下,U-Boot的设备树暂时没有办法获取,但是Linux的设备树却可以通过U-Boot来获取:

此外,如果Linux文件系统中包含/sys/firmware/devicetree/base或者/proc/device-tree目录,则设备树还可以直接通过文件系统来获取:

$ dtc -I fs -O dts -o xxx.dts /sys/firmware/devicetree/base
上一篇下一篇

猜你喜欢

热点阅读