zoukankan      html  css  js  c++  java
  • zephyr文档部分翻译及学习笔记(三)-devicetree

    devicetree是描述硬件的分层数据结构。Devicetree规范定义了它的源和二进制表示。Zephyr使用devicetree来描述其支持板上可用的硬件,以及硬件的初始配置。

    devicetree输入文件有两种类型:devicetree源文件和devicetree绑定文件。这些源包含devicetree本身。绑定描述其内容,包括数据类型。构建系统使用devicetree源和绑定来生成生成的C头文件。生成的头的内容由devicetree.h API抽象,您可以使用该API从devicetree获取信息。

    以下是该过程的简化视图:

    所有Zephyr和应用程序源代码文件都可以包含并使用devicetree.h。这包括设备驱动程序、应用程序、测试、内核等。

    API本身是基于C宏的。宏名称都以DT_开头。通常,如果您在Zephyr源文件中看到以DT_开头的宏,那么它可能是devicetree.h宏。生成的C头也包含以DT_开头的宏;您可能会在编译器错误消息中看到这些。您总是可以区分生成的-和非生成的宏:生成的宏有一些小写字母,而devicetree.h宏名称都是大写字母。

    devicetree中定义的一些信息可以通过Kconfig生成的CONFIG_宏来获得。这通常是为了向后兼容,因为Zephyr使用Kconfig的时间比devicetree要长,而且还在将一些信息从Kconfig转换到devicetree的过程中。它还允许Kconfig覆盖从devicetree获取的默认值。Devicetree信息通过Kconfig函数从Kconfig引用。有关与Kconfig的其他比较,请参阅Devicetree与Kconfig。

    语法和结构

    /dts-v1/;
    
    / {
            a-node {
                    subnode_label: a-sub-node {
                            foo = <3>;
                    };
            };
    };

    /dts-v1/表明文件内容使用的是DTS语法的版本1,版本1取代了已废弃的版本0

    该树有三个节点:①根节点:/②根节点的子节点:a-node③a-node的子节点:a-sub-node。节点可以被赋予标签,这些标签是唯一的缩写,可以在设备树的其他地方通过这些标签引用节点。在上图中,a-sub-node有一个标签subnode-label。一个节点可以有0个、1个或多个节点标签

    设备树节点有可以标识他们在树中位置的路径。与unix文件系统一样,设备树路径是以/分隔的字符串,根节点的路径就是一个斜杠/。每个节点的路径是由它父辈节点名字与本节点名字用/连接起来的。例如,a-sub-node的路径是/a-node/a-sub-node。

    设备树节点也有属性。属性是名称/值对。属性值可以是任意字节序列。在某些情况下,只是一个被称为cell的数组。

    节点a-sub-node有一个名为foo的属性,属性值为3。foo的大小和类型由尖括号中的值指定

    实际上,devicetree节点通常对应于某些硬件,节点的层次结构反映了硬件的物理布局。例如,让我们考虑一个板,该板有三个I2C外设连接到SOC的I2C总线控制器。

    在设备树中将会有相应的体现I2C总线控制器和I2C外设的节点。为了反映硬件布局,I2C外设节点将会是总线控制器节点的子节点。其他类型的硬件也有类似的约定

    DTS将会如下面这个样子:

    /dts-v1/;
    
    / {
            soc {
                    i2c-bus-controller {
                            i2c-peripheral-1 {
                            };
                            i2c-peripheral-2 {
                            };
                            i2c-peripheral-3 {
                            };
                    };
            };
    };

    在实际中,属性是用来描述或配置节点所表示的硬件的。例如,I2C外设节点有一个属性,它的值是外设在总线上的地址

    下面是一个表示相同示例的树,但包含您在使用I2C设备时可能会看到的真实节点名称和属性。

    相应的DTS如下:

    /dts-v1/;
    
    / {
            soc {
                    i2c@40003000 {
                            compatible = "nordic,nrf-twim";
                            label = "I2C_0";
                            reg = <0x40003000 0x1000>;
    
                            apds9960@39 {
                                    compatible = "avago,apds9960";
                                    label = "APDS9960";
                                    reg = <0x39>;
                            };
                            ti_hdc@43 {
                                    compatible = "ti,hdc", "ti,hdc1010";
                                    label = "HDC1010";
                                    reg = <0x43>;
                            };
                            mma8652fc@1d {
                                    compatible = "nxp,fxos8700", "nxp,mma8652fc";
                                    label = "MMA8652FC";
                                    reg = <0x1d>;
                            };
                    };
            };
    };

    除了显示更真实的名称和属性外,上面的示例还引入了一个新的devicetree概念:单元地址。单元地址是节点名中“at”符号(@)后面的部分,如i2c@40003000中的40003000或apds9960@39中的39。单元地址是可选的:soc节点没有。

    Unit address examples

  • 相关阅读:
    CSS——半透明
    CSS——dispaly、overflow、visibility、opacity
    html——特例
    CSS——◇demo
    html——ico
    JS——函数
    JS——数组
    JS——for
    JS——i++与++i
    JS——三元表达式
  • 原文地址:https://www.cnblogs.com/dwj411024/p/13052627.html
Copyright © 2011-2022 走看看