【设备树使用】-- 1 基础概念

本页介绍了如何为新机器编写设备树。 它旨在提供设备树概念的概述以及它们如何用于描述机器。

有关设备树数据格式的完整技术说明,请参阅ePAPR v1.1规范。 ePAPR规范涵盖了比本页面涵盖的基本主题更多的细节,请参阅此页面以获取本页面未涵盖的更高级用法。 ePAPR目前正在使用Devicetree规范文档的新名称进行更新。

 

1 基本数据格式

设备树是节点和属性的简单树形结构。 属性是键值对,节点可能包含属性和子节点。 例如,以下是.dts格式的简单树:

/dts-v1/;

/ {
    node1 {
        a-string-property = "A string";
        a-string-list-property = "first string", "second string";
        // hex is implied in byte arrays. no '0x' prefix is required
        a-byte-data-property = [01 23 34 56];
        child-node1 {
            first-child-property;
            second-child-property = <1>;
            a-string-property = "Hello, world";
        };
        child-node2 {
        };
    };
    node2 {
        an-empty-property;
        a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */
        child-node1 {
        };
    };
};

这棵树显然没用,因为它没有描述任何东西,但它确实显示了节点和属性的结构。含有:

  • 单个根节点:“/”
  • 一对子节点:“node1”和“node2”
  • node1 的几个孩子:“child-node1”和“child-node2”
  • 一堆散落在树上的属性。

属性是简单的键值对,其值可以是空的或包含任意字节流。虽然数据类型不会编码到数据结构中,但有一些基本数据表示可以在设备树源文件中表示。

  • 文本字符串(空终止)用双引号表示:
string-property = "a string";
  • 'Cells'是由尖括号分隔的32位无符号整数:
cell-property = <0xbeef 123 0xabcd1234>;
  • 二进制数据用方括号分隔:
binary-property = [0x01 0x23 0x45 0x67];
  • 不同表示的数据可以使用逗号连接在一起:
mixed-property = "a string", [0x01 0x23 0x45 0x67], <0x12345678>;
  • 逗号也用于创建字符串列表:
string-list = "red fish", "blue fish";

 

2 基本概念

 

要了解如何使用设备树,我们将从一个简单的机器开始,并构建一个设备树来逐步描述它。

2.1 样机

考虑下面的虚拟机器(松散地基于ARM Versatile),由“Acme”制造并命名为“Coyote's Revenge”:

  • 一个32位ARM CPU
  • 处理器本地总线连接到内存映射串行端口,spi总线控制器,i2c控制器,中断控制器和外部总线桥
  • 基于0的256MB SDRAM
  • 2个串口,基于0x101F1000和0x101F2000
  • GPIO控制器基于0x101F3000
  • 基于0x10170000的SPI控制器和以下设备
  •     带SS引脚连接到GPIO#1的MMC插槽
  • 带以下设备的外部总线桥
  •     SMC SMC91111以太网设备连接到基于0x10100000的外部总线
  •     基于0x10160000的i2c控制器和以下设备
  •         Maxim DS1338实时时钟。 响应从机地址1101000(0x58)
  •     基于0x30000000的64MB NOR闪存

2.2 初始结构

第一步是为机器铺设一个骨架结构。 这是有效设备树所需的最低限度结构。 在这个阶段,你想唯一标识机器。

/dts-v1/;

/ {
    compatible = "acme,coyotes-revenge";
};

compatible指定系统的名称。 它包含一个字符串,格式为“<制造商>,<模型>“。指定确切的设备并包含制造商名称以避免命名空间冲突很重要。由于操作系统将使用兼容值来决定如何在机器上运行,将正确的数据放入此属性非常重要。

从理论上说,兼容性是OS需要唯一标识一台机器的所有数据。 如果所有的机器细节都是硬编码的,那么操作系统可以专门针对顶级兼容属性中的“acme,coyotes-reveng”。

2.3 CPU

下一步是描述每个CPU。 添加一个“cpus”的容器节点,其中包含每个CPU子节点。 在本例里,该系统是ARM的双核Cortex A9系统。

/dts-v1/;

/ {
    compatible = "acme,coyotes-revenge";

    cpus {
        cpu@0 {
            compatible = "arm,cortex-a9";
        };
        cpu@1 {
            compatible = "arm,cortex-a9";
        };
    };
};

每个cpu节点中的兼容属性是一个字符串,它以<manufacturer>,<model>的形式指定确切的cpu模型,就像顶层的兼容属性一样。

稍后将向cpu节点添加更多属性,但我们首先需要讨论更多基本概念。

2.4 节点名称

 

值得花点时间谈谈命名约定。 每个节点都必须具有 <name> [@ <unit-address>] 形式的名称。

<name>是一个简单的ascii字符串,最长可达31个字符。 通常,节点根据它代表的设备类型命名。例如,一个3com以太网适配器的节点将使用 ethernet 名称,而不是3com509。

如果节点描述具有地址的设备,则包括单元地址。 通常,单元地址是用于访问设备的主要地址,并列在节点的reg属性中。 我们将在后续博文介绍reg属性。

同级节点必须是唯一命名的,但只要地址不同(即serial @ 101f1000和serial @ 101f2000),多个节点是可以使用相同名称的。

有关节点命名的完整详细信息,请参阅ePAPR规范的第2.2.1节。

2.5 设备

系统中的每个设备都由设备树节点表示。 下一步是使用每个设备的节点填充树。 现在,新节点将保持为空,直到我们可以讨论如何处理地址范围和irq。

/dts-v1/;

/ {
    compatible = "acme,coyotes-revenge";

    cpus {
        cpu@0 {
            compatible = "arm,cortex-a9";
        };
        cpu@1 {
            compatible = "arm,cortex-a9";
        };
    };

    serial@101F0000 {
        compatible = "arm,pl011";
    };

    serial@101F2000 {
        compatible = "arm,pl011";
    };

    gpio@101F3000 {
        compatible = "arm,pl061";
    };

    interrupt-controller@10140000 {
        compatible = "arm,pl190";
    };

    spi@10115000 {
        compatible = "arm,pl022";
    };

    external-bus {
        ethernet@0,0 {
            compatible = "smc,smc91c111";
        };

        i2c@1,0 {
            compatible = "acme,a1234-i2c-bus";
            rtc@58 {
                compatible = "maxim,ds1338";
            };
        };

        flash@2,0 {
            compatible = "samsung,k8f1315ebm", "cfi-flash";
        };
    };
};

在此树中,已为系统中的每个设备添加了一个节点,层次结构反映了设备连接到系统的方式。即外部总线上的设备是外部总线节点的子设备,i2c设备是i2c总线控制器节点的子设备。 通常,层次结构从CPU的角度表示系统的视图。

此树在此时无效。 它缺少有关设备之间连接的信息。 该数据将在稍后添加。

在这棵树中要注意的一些事情:

  • 每个设备节点都具有 compatible  的属性。
  • flash节点在兼容属性中有2个字符串。 请继续阅读下一节以了解原因。
  • 如前所述,节点名称反映了设备的类型,而不是特定的模型。 有关应尽可能使用的已定义通用节点名称列表,请参阅ePAPR规范的第2.2.2节。

2.6 了解兼容的属性

 

树中表示设备的每个节点都需要具有 compatible 属性。compatible 是操作系统用来决定绑定到设备的设备驱动程序的关键。

compatible 是一个字符串列表。列表中的第一个字符串指定节点以 "<manufacturer>,<model>" 形式表示的确切设备。以下字符串表示设备兼容的其他设备。

例如,飞思卡尔MPC8349片上系统(SoC)具有串行器件,该器件实现了美国国家半导体 ns16550寄存器接口。因此,MPC8349串行设备的兼容属性应为: compatible = "fsl,mpc8349-uart", "ns16550"。在这种情况下,fsl,mpc8349-uart 指定确切的器件,ns16550 声明它与美国国家半导体 16550 UART寄存器级兼容。

注意:ns16550 纯粹由于历史原因没有制造商前缀。所有新的兼容值都应使用制造商前缀。

这种做法允许将现有设备驱动程序绑定到较新的设备,同时仍然唯一地标识确切的硬件。

警告:不要使用通配符兼容值,例如“fsl,mpc83xx-uart”或类似值。硅供应商总是会做出改变,在改变它的时候为时已晚,打破了你的通配符假设。相反,选择特定的硅实现并使所有后续芯片与之兼容。


原文:https://elinux.org/Device_Tree_Usage

其他关于设备树的教程:

[1] A Tutorial on the Device Tree (Zynq) -- Part I ,http://xillybus.com/tutorials/device-tree-zynq-1

[2] A Tutorial on the Device Tree (Zynq) -- Part II,http://xillybus.com/tutorials/device-tree-zynq-2

[3] A Tutorial on the Device Tree (Zynq) -- Part III,http://xillybus.com/tutorials/device-tree-zynq-3

[4] A Tutorial on the Device Tree (Zynq) -- Part IV,http://xillybus.com/tutorials/device-tree-zynq-4

[5] A Tutorial on the Device Tree (Zynq) -- Part V,http://xillybus.com/tutorials/device-tree-zynq-5

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值