Device Tree是一种描述硬件的数据结构,它起源于OpenFirmware(OF)。Device Tree的应用使得Linux Kernel中的驱动代码和硬件信息实现了相互的隔离,减少了Kernel代码中的耦合。Linux内核从3.x开始正式引入设备树的概念。
Open Firmware是Sun在20世纪80年代后期设计的固件接口规范,并移植到许多架构中.它指定运行时OS客户端接口,跨平台设备接口(FCode),用户界面和用于描述机器的设备树布局.
FDT是开放固件DSDT对ACPI的作用.FDT重用Open Firmware建立的设备树布局.实际上,Linux PowerPC支持使用相同的代码库来支持Open Firmware和FDT平台.
看看Kernel源码目录下的drivers/of/base.c.它是在1996年添加的,但它的功能用于现今的ARM设备树.所以FDT只是OF的一部分.这就是为什么设备树的所有功能都以of_前缀开头的原因.
在学习Device Tree前需要主要目前讲到的Device Tree都是指的是Flattened Device Tree
/ o device-tree
|- name = "device-tree"
|- model = "MyBoardName"
|- compatible = "MyBoardFamilyName"
|- #address-cells = <2>
|- #size-cells = <2>
|- linux,phandle = <0>
|
o cpus
| | - name = "cpus"
| | - linux,phandle = <1>
| | - #address-cells = <1>
| | - #size-cells = <0>
| |
| o PowerPC,970@0
| |- name = "PowerPC,970"
| |- device_type = "cpu"
| |- reg = <0>
| |- clock-frequency = <0x5f5e1000>
| |- 64-bit
| |- linux,phandle = <2>
|
o memory@0
| |- name = "memory"
| |- device_type = "memory"
| |- reg = <0x00000000 0x00000000 0x00000000 0x20000000>
| |- linux,phandle = <3>
|
o chosen
|- name = "chosen"
|- bootargs = "root=/dev/sda2"
|- linux,phandle = <4>
上图是一个展示了简单device tree 的例子, 在这个例子中通过“o”和节点名称来代表一个节点(node)名称. device tree可以理解为节点和其属性构成,每个节点可以有2个或多个带名称的属性,而属性可以有对应的值。 这里只是以树形的方式的展示了什么是device tree.
上图的device tree就是由根节点和子节点构成.
根节点:
o cpus
memory@0
o chosen
子节点:
o PowerPC,970@0(父节点为cpus)
既然我们称上述结构为树,因此除了根节点没有父节点外其他节点有且只有一个节点。
一个节点可以有两个名称构成,主名称通常是和节点下的"name"相同, 另外一个在Linux Kernel的官方文档中称作"unit name", “unit name"主要是用于区分同级同主名称的jie节点, 通常一些节点还包含”@“符号和"unit address”, 用于指出该节点所在的bus类型。
ehh 整理到这里发现没表述好什么是device tree,于是又到互联网上找是否有更好的文章继续学习下,结果!!意外之中发现了一篇英文版本的文章,非常好的讲述了关于device tree的基本概念.
完整的目录结构如下:
Welcome to Devicetree Specification’s documentation!
献上链接: Welcome to Devicetree Specification’s documentation!
需要注意对于我们的实际开发中,不同的kernel版本使用的dts版本可能会有所差异,需要注意其语法差异;
Device_Tree_Reference
蜗窝科技-Device Tree
Android - Device Tree Overlays
Device Tree: DTS/DTB/FDT