设备树的介绍和使用
为什么引进设备树:
- device部分是描述硬件的。一般device部分的代码会放在内核源码中arch/arm/plat-xxx和arch/arm/machxxx下面。但是随着Linux支持的硬件越来越多,在内核源码下关于硬件描述的代码也越来越多。并且每修改一下就要编译一次内核。
- 长此以往Linux内核里面就存在了大量“垃圾代码”,而且非常多,这里说的“垃圾代码”是关于对硬件描述的代码。从长远看,这些代码对Linux内核本身并没有帮助,所以相当于Linux内核是“垃圾代码”。但是并不是说平台总线这种方法不好。
- 为了解决这个问题,设备树就被引入到了Linux上。使用设备树来剔除相对内核来说的“垃圾代码”,既用设备树来描述硬件信息,用来替代原来的device部分的代码。虽然用设备树替换了原来的device部分,但是平台
总线模型的匹配和使用基本不变。并且对硬件修改以后不必重新编译内核。直接需要将设备树文件编译成二进制文件,在通过bootloader传递给内核即可。
所以设备树就是用来描述硬件资源的文件。
基本名词解释
- DT:Device Tree //设备树
- FDT:Flattened Device Tree //开放设备树,起源于OpenFirmware (OF)
- dts: device tree source的缩写 //设备树源码
- dtsi: device tree source include的缩写 //通用的设备树源码
- dtb: device tree blob的缩写//编译设备树源码得到的文件
- dtc: device tree compiler的缩写 //设备树编译器
设备树编译格式:
编译设备树: dtc -I dts -0 dtb -o xxx.dtb xxx.dts
反编译设备树: dtc -I dtb -0 dts -o xxx.dts xxx.dtb
设备树的基本语法:
常用属性
根节点:
/dts-v1/;
/{
};
子节点:
格式:
[label:]node-name[@unit-address]{
[properties-list]
[child-node-list]
};
如:
nodel{ //子节点,名称node1
nodel_child{
//同级节点下不能出现相同名称
};
};
- 节点名称:在对节点进行命名的时候,一般要体现设备的类型,比如网口一般命名成ethernet,串口一般命名成uart,对于名称一般要遵循下面的命令格式。
格式:[标签]:<名称>[@<设备地址>]
其中,[标签]和[@<设备地址>]是可选项,<名称>是必选项。另外,这里的<设备地址>没有实际意义,只是让节点名称更人性化,更方便阅读。
举例:
uart: serial@02288000 其中, uart就是这个节点标签,也叫别名, serial@02288000就是节点名称。