设备树

本文最后更新于:2022年8月17日 下午

设备树语法

设备树示例:

节点格式

label: node-name@unit-address

  • lable: 标号(可省略,其作用方便引用node,类似汇编中的label)

  • node-name: 节点名字

  • unit-address: 单元地址

属性格式

name=value

value有多种取值方式。

  • 一个32位的数据,用尖括号包围起来,如

    1
    interrupts = <17>
  • 一个64位数据(使用2个32位数据表示),用尖括号围起来,如:

    1
    clock-frequency = <0x00000001 0x00000000>
  • 一个有结束字符的字符串”disabled”,如

    1
    status = "disabled"
  • 字节序列,用中括号包起来

    1
    local-man-address = [1a 2b 3c 4d 5e 6f] //每个byte使用2个16进制数来表示
  • 也可以是各种值的组合,用隔开

    1
    compatible = "samsung,smart210", "samsung,s5pv210";

一些标准属性

compatiable 属性

其本意为“兼容”,对于某个LED,内核中有三个驱动A、B、C支持它。

1
2
3
led {
compiable = "A", "B", "C";
};

内核启动时,就会为这个LED按照A-B-C顺序为它寻找驱动程序。

model 属性

model属性与compatiable 有些相似,但又不同。

compilable是一个字符串序列,表示兼容什么,model指明这个硬件具体是什么。比如:

单板兼容samsung的smart210和s5pv210,这个板子是基于s5pv210的smart210

1
2
model = "SMART210 based on S5PV210";
compatible = "samsung,smart210", "samsung,s5pv210";
status 属性

status 属性是和设备状态有关的,属性值也是字符串,字符串是设备的状态信息

#address-cells 和 #size-cells属性
1
2
address-cells: address要用多少个32位数来表示
size-cells: size要用多少个32位数来表示

比如一段内存,怎么描述它的起始地址和大小?

以下示例中,address-cells为1,表示用1个32位数表示地址,即用0x80000000表示起始地址

size-cells为1,表示用1个32位数表示大小,即用0x20000000表示大小

1
2
3
4
5
6
7
/ {   
# address-cells = <1>;
# size-cells = <1>;
memory {
reg = <0x20000000 0x20000000>;
};
};
reg 属性

reg本意是register,用来表示寄存器地址。但在设备树中,用来描述一段空间。对于ARM系统,寄存器和内存是统一编址的,访问寄存器时用某块地址,访问内存时用某块地址,在访问方法上没有区别。

reg属性的值,是一系列的”address size”,用多少个32位的数来表示address和size,是由#address-cells 和 #size-cells决定的。

name 属性

过时了,建议不用。值是字符串,用来表示节点的名字。在跟platform_driver匹配时,优先级最低。compiable属性在匹配过程中,优先级最高。

常用的节点

根节点

用/标识根节点,如:

1
2
3
4
5
/ {    
model = "SMART210 based on S5PV210";
compatible = "samsung,smart210", "samsung,s5pv210";
...
};
CPU 节点

一般不需要我们设置,在dtsi中都设置好了。

memmory 节点

厂商不知道板子要用多大的内存,所以此处需要自行设定

1
2
3
memory {   
reg = <0x20000000 0x20000000>;
};

关于设备树更详细的语法,参考 devicetree-specification-v0.4-rc1.pdf

Power_ePAPR_APPROVED_v1.1.pdf

参考

  1. 【Linux笔记】设备树基础知识

设备树
https://www.glj0.top/posts/9faa78d2/
作者
gong lj
发布于
2022年4月29日
更新于
2022年8月17日
许可协议