Linux 设备树 DTS DTB DTC DTS 语法 模板设备树 设备树体现 特殊节点 Linux 内核解析 DTB 文件 绑定文档 OF 操作

 


设备树(Device Tree)

     DTS(Device Tree Source) : 描述设备树的文件

     DTS文件采用 树形结构描述板级设备

           如:CPU数目,内存基地址,IIC接口的设备,SPI接口的设备

     树干:系统总线

     树支:IIC控制器,GPIO控制器,SPI控制器,SDMMC控制器,PCI总线

           IIC分 :IIC1 和 IIC2

                 IIC1 接 FT5206 和 AT24C02

                 IIC2 接 MPU6050

      设备树:描述板级硬件信息的文件,扩展名:.dts

             .dts:描述板级信息(IIC设备,SPI设备)

             .dtsi:描述SOC级信息(CPU,主频,外设控制器)


DTS  DTB  DTC

       DTS 是设备树源码文件

      DTB 是 DTS 编译后的二进制文件

      DTC 工具 编译 DTB文件

# linux-5.5.4\linux-5.5.4\scripts\dtc\Makefile
# SPDX-License-Identifier: GPL-2.0
# scripts/dtc makefile
# SPDX许可证标识符:GPL-2.0
# 脚本 /dtc 生成文件

hostprogs-y    := dtc
always    := $(hostprogs-y)

# DTC工具依赖编译文件 .c
dtc-objs:= dtc.o flattrree.o fstree.o data.o livetree.o treesource.o srcpos.o checks.o util.o 

dtc-objs    += dtc-lexer.lex.o dtc-parser.tab.o

# ...
//Linux源码根文件
make all     //编译所有源码
make dtbs    //编译设备树

      ARM 架构的 SOC 有很多种,每个板子都有一个对应的 DTS 文件

# linux-5.5.4\linux-5.5.4\arch\arm\boot\dts\Makefile
# SPDX-License-Identifier: GPL-2.0

dtb-$(CONFIG_ARCH_ALPINE) += \
    alpine-db.dtb
dtb-$(CONFIG_MACH_ARTPEC6) += \
    artpec6_devboard.dtb
dtb-$(CONFIG_MACH_ASM9260) += \

# Keep at91 dtb files sorted alphabetically for each SoC
# 为每个SoC保留91个 按字母顺序排序的dtb文件

# 德州仪器
dtb-$(CONFIG_ARCH_OMAP3) += \
    am3517-craneboard.dtb \
    # ...

dtb-$(CONFIG_ARCH_STM32) += \
    stm32f429-disco.dtb \
    #...
# 全志
dtb-$(CONFIG_MACH_SUN7I) += \
    sun7i-a20-bananapi.dtb \
    # ...
# 三星
dtb-$(CONFIG_ARCH_S5PV210) += \
    s5pv210-aquila.dtb \
    # ...
# 三星
dtb-$(CONFIG_ARCH_EXYNOS4) += \
    exynos4210-origen.dtb \
    # ...
# 飞思卡尔 
dtb-$(CONFIG_SOC_IMX6UL) += \
    imx6ul-14x14-evk.dtb \
    # ...
# 德州仪器
dtb-$(CONFIG_SOC_TI81XX) += \
    am3874-iceboard.dtb \
    # ...
# 赛灵思
dtb-$(CONFIG_ARCH_ZYNQ) += \
    zynq-cc108.dtb \
    # ...

       当选中 xxx SOC ,后(CONFIG_SOC_xxx=y),所有用到这个 SOC 的板子对应的 .dts 文件会编译为 .dtb
       新板子,需要建 新板子 对应的.dts 文件,然后将对应的.dtb 文件名添加到 dtb-$(CONFIG_SOC_xxx)下,编译设备树时会将对应的.dts 编译为二进制的.dtb文件


DTS 语法

    .dtsi 头文件

             设备树支持头文件,设备树的头文件扩展名为.dtsi

//linux-5.5.4\linux-5.5.4\arch\arm\boot\dts\s5pv210-smdkv210.dts

// SPDX-License-Identifier: GPL-2.0
/*
 * Samsung's S5PV210 SoC device tree source
 *
 * Copyright (c) 2013-2014 Samsung Electronics, Co. Ltd.
 *
 * Mateusz Krawczuk <[email protected]>
 * Tomasz Figa <[email protected]>
 *
 * Board device tree source for YIC System SMDV210 board.
 *
 * NOTE: This file is completely based on original board file for mach-smdkv210
 * available in Linux 3.15 and intends to provide equivalent level of hardware
 * support. Due to lack of hardware, _no_ testing has been performed.
 */

/dts-v1/;

// #include 来引用.h .dtsi  .dts 文件

#include <dt-bindings/input/input.h>
#include "s5pv210.dtsi"
//...

          .dtsi 文件 描述 SOC 的内部外设信息 (CPU架构  主频  外设寄存器地址范围)

// linux-5.5.4\linux-5.5.4\arch\arm\boot\dts\s5pv210.dtsi

// SPDX-License-Identifier: GPL-2.0
/*
 * Samsung's S5PV210 SoC device tree source
 *
 * Copyright (c) 2013-2014 Samsung Electronics, Co. Ltd.
 * 版权所有(c)2013-2014三星电子有限公司
 *
 * Mateusz Krawczuk <[email protected]>
 * Tomasz Figa <[email protected]>
 *
 * Samsung's S5PV210 SoC device nodes are listed in this file. S5PV210
 * based board files can include this file and provide values for board specfic
 * bindings.
 * 三星的S5PV210 SoC设备节点列在这个文件中
 * 基于S5PV210的板文件可以包含此文件并为板特定绑定提供值
 *
 * Note: This file does not include device nodes for all the controllers in
 * S5PV210 SoC. As device tree coverage for S5PV210 increases, additional
 * nodes can be added to this file.
 * 注意:此文件不包括S5PV210 SoC中所有控制器的设备节点
 * 随着S5PV210的设备树覆盖率的增加,可以向该文件添加额外的节点
 */

#include <dt-bindings/clock/s5pv210.h>
#include <dt-bindings/clock/s5pv210-audss.h>

/ {                        // 根节点 /
	#address-cells = <1>;
	#size-cells = <1>;

	aliases {                //子节点
   	    csis0 = &csis0;
	    //...
	};

	cpus {                  //子节点
  	    #address-cells = <1>;
	    #size-cells = <0>;

	    cpu@0 {                    // cpus 的子节点
		 device_type = "cpu";
		 compatible = "arm,cortex-a8";    //架构信息

                 // reg 属性为 0,数据形式:32 位无符号整数
		 reg = <0>;
	    };
	};
        soc {

            // : 前为 节点标签(label)
            // :后为 节点名 是 ASCII 字符串
            // @ 后为 设备的地址 或 寄存器首地址
            // 可 &spi0 访问该节点
            spi0: spi@e1300000 { 
   
                // compatible 属性为 "samsung,s5pv210-spi",数据形式:字符串
		compatible = "samsung,s5pv210-spi";

                // reg属性为 一组值
		reg = <0xe1300000 0x1000>;
		interrupt-parent = <&vic1>;
		interrupts = <15>;
		dmas = <&pdma0 7>, <&pdma0 6>;
		dma-names = "tx", "rx";
		clocks = <&clocks SCLK_SPI0>, <&clocks CLK_SPI0>;
		clock-names = "spi", "spi_busclk0";
		pinctrl-names = "default";
		pinctrl-0 = <&spi0_bus>;
		#address-cells = <1>;
		#size-cells = <0>;
		status = "disabled";
	    };
        };

    //...
};

#include "s5pv210-pinctrl.dtsi"


     标准属性

                   节点是很多属性组成,节点是具体的设备

                  不同的设备有属性不同,用户可自定义属性

         compatible 属性

static const struct of_device_id imx_wm8960_dt_ids[] =    //匹配表
{
    {
        // compatible 属性 也叫 “兼容性”属性
        // compatible 属性将 设备 和 驱动 绑定起来
        // 厂商:fsl 
        // 驱动名字:imx-dudio-wm8960
        .compatible = "fsl, imx-dudio-wm8960",            //配置值
    },
    {
        /*sentinel*/
    }
};
MODULE_DEVICE_TABLE(of, imx_wm8960_dt_ids);

static struct platform_driver imx_wm8960_driver =
{
    .driver =
    {
        .name = "imx-wm8960",
        .pm = &snd_soc_pm_ops,
        .of_match_table = imx_wm8960_dt_ids,    //platform_driver驱动模式,使用OF匹配表
    },
    .probe = imx_wm8960_probe,
    .remore = imx_wm8960_remore,
};

        model属性         

model = "wm8960-audio";    //设备模块信息

       status 属性

               表示 设备的状态信息

描述
“okay” 设备可操作
"disabled" 设备不可操作,具体看设备绑定文件
"fail" 设备不可操作,检测一系列的错误
"fail-sss" sss:检测错误内容

     #address-cells #size-cells 属性

             


     根节点 compatible 属性


     向节点追加或修改内容


创建小型模板设备树

 


设备树在系统中的体现


特殊节点

 


Linux 内核解析 DTB 文件

 


绑定信息文档

 


设备树常用 OF 操作函数
 

发布了51 篇原创文章 · 获赞 7 · 访问量 7893

猜你喜欢

转载自blog.csdn.net/qq_44226094/article/details/104331387