Device Tree学习

Device Tree最初是从PowerPC的Flattened Device Tree(FDT)引入的,它是一种描述硬件的数据结构。Device Tree由一系列被命名的结点(node)和属性(property)组成,结点本身可以包含子结点。而属性则是成对出现的name和value构成,在device tree中一般可以描述如下的一些信息:

  • CPU数量和类别
  • 内存基地址和大小
  • 总线和桥
  • 外设连接
  • 中断控制器和中断使用情况
  • clock控制器和clock使用情况

设备树可以形象地理解为画一棵电路板上的CPU,总线,设备等组成的树,linux内核通过展开这些信息从而将特定的资源绑定给相应的设备。

基本结构

device tree用文本描述硬件,通过编译生成内核可以识别的二进制。DTS(Device tree source)是ASCII格式的device tree描述,适合人类的阅读。device tree实际也会有一些共有的信息,一般我们会将这些共有的信息放到提炼成一个.dtsi的文件,相当于C语言的头文件,当然.dtsi文件也是可以包含.dtsi文件的。一个基本的dts文件举例如下:

/ {
    node1 {
        a-string-property = "A string";
        a-string-list-property = "first string", "second string";
        a-byte-data-property = [0x01 0x23 0x34 0x56];
        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 {
        };
    };
};

上述例子中/是一个根结点,里面有两个结点node1node2,而node1下面又有一个child-node1当然每个结点还会有一系列的属性,这些属性可以为空,可能是数字或者字符串及字符串数组。

.dts文件和每个设备都会有一个compatible属性,它可以为用户驱动和设备提供绑定,比如一个flash结点:

flash@0,00000000 {
    compatible = "arm,vexpress-flash", "cfi-flash";
    reg = <0 0x00000000 0x04000000>,
    <1 0x00000000 0x04000000>;
    bank-width = <4>;
};

DTC(Device Tree Compiler)是将dts编译为dtb的工具, DTB(Device Tree Blob)是Linux内核可以解析的二进制格式。

参考资料:ARM-Device-Tree设备树.pdf


本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。

发表新评论