Linux dts 设备树详解(一) 基础知识
Linux dts 设备树详解(二) 动手编写设备树dts
前言
在简单了解概念之后,我们可以开始尝试写一个简单的设备树,从而加深对设备树整体架构以及部分语法的理解,因为整体知识面比价庞杂,无法面面俱到,本文旨在笔者学习之初对于设备树常用部分的总结与归纳。因为会涉及到很多硬件信息的绑定,详细的可以查阅Linux内核源码下的文档Documentation/devicetree/bindings
。具体如下图所示;
硬件结构
1个双核ARM Cortex-A9
32位处理器;
ARM本地总线上的内存映射区域分布有两个串口(分别位于0x101F1000
和0x101F2000
)
GPIO
控制器(位于0x101F3000
)
SPI
控制器(位于0x10170000
)
中断控制器(位于0x10140000
)
外部总线桥上连接的设备如下:
SMC SMC91111
以太网(位于0x10100000
)
I2C
控制器(位于0x10160000
)
64MB NOR Flash(位于0x30000000
)
外部总线桥上连接的I2C控制器所对应的I2C总线上又连接了Maxim DS1338
实时钟(I2C地址为0x58
)
具体如下图所示;
设备树dts文件
那么,如何将上面的硬件结构,通过设备树语言描述成dts
文件呢?具体我实现在下图,并且做出了详细的解释。其中需要注意的有以下几个属性:
compatitable
:兼容性属性;#address-cells
,#size-cells
:地址编码所采用的格式;节点名称@节点地址
:例如gpio@101f3000
,这里名称和地址要和实际的对应起来;标签
:例如interrupt-parent = <&intc>;
,这这里的intc
就是一个标签(label),通过&
可以获取它的值,这里可以简单的理解成一个变量,然后在下面需要对这个标签进行另外的解析,例如intc:interrupt-controller@10140000
;所以,这两个地方的intc
都是对应起来的。
最后,具体的实现可以参考下图;