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

  • 相关阅读:
    开源项目
    [Accessibility] Missing contentDescription attribute on image [可取行]失踪contentDescription属性图像
    Android 布局 中实现适应屏幕大小及组件滚动
    EF 错误记录
    EasyUI 加载时需要显示和隐藏 panel(面板)内容破版问题
    IE 报表缩放后页面破版
    VS 2017 引入nuget 问题
    SSRS 报表显示页面 asp net session丢失或者找不到 asp net session has expired or could not be found()
    log4net 配置
    网站
  • 原文地址:https://www.cnblogs.com/dwj411024/p/13052627.html
Copyright © 2011-2022 走看看