一:什么是设备树
设备树(Device Tree)是一种描述硬件的数据结构,是结构化的语言,有点像C语言的结构体。在操作系统引导启动阶段进行设备初始化的时候,设备树中描述硬件的信息被检测到并传递给操作系统。
本文引用地址://www.hqyj.com/emb/Column/7506.html
二:设备树起源与意义
设备树在2011年被引入到ARM Linux内核中,也就是在Linux内核3.x以后引入的,在内核3.x之前都是没有设备树的概念的,都是使用平台文件来描述硬件的。它的引入主要是想解决ARM Linux内核代码冗余的问题。
三:内核中与设备树相关的文件
dts文件,Device Tree Source,是以ASCII文本形式来描述设备树内容。
dtb文件是二进制格式,是编译后终生成的二进制文件。
dtsi文件,类似于C语言头文件。
四:基本语法
1. 节点
节点名
语法: <name>
名字的命名是由字符、数字、“-”等组成,长是31个字符,一般是设备类型命名,unit-address一般的是设备地址。
比如:
对于节点来说,有节点引用、合并节点内容、替换节点内容。
节点引用另一个节点:
demo节点的属性item引用了节点的node的属性值。
节点内容引用
有时候在一个节点中会引用到其他节点的属性值,会使用到节点内容引用。
节点内容合并
有时候一个硬件设备的部分信息内容可能会有变化,这里可能会出现节点内容合并的概念。
移植者在根节点中添加一个node节点,节点中的内容与上面的节点内容是不同,此时需要合并,合并完成结果如下:
节点内容替换
在根节点中有相同名字的子节点,此时会出现替换内容的概念。
内容替换完成后的结果如下:
节点查找
通过节点的compatible属性值查找指定节点
通过节点名查找指定节点
通过节点路径查找指定节点
2. 节点属性分析
设备树中常见的属性有compatible、地址address、中断interrupt、MAC地址、GPIO口、clock、power、regulator、等等。
compatible属性
该属性是用于匹配设备节点和设备驱动的。
在设备树中compatible="davicom,dm9000";需要与驱动代码中的.compatible匹配。
address属性
#address-cells:描述子节点reg属性值的地址表中首地址cell数量
#size-cells:描述子节点reg属性值的地址表中地址长度cell数量
reg:描述地址表,I/O地址。
父节点#address-cells值为1,#size-cells值为1,则子节点中reg的值就是一个首地址加一个地址长度为一个单元。
ranges:有些设备是有片选的,所以需要描述片选和片选的偏移量,在地址说明的时候还要说明地址映射范围。
举例说明,
片选0,偏移0,被映射到CPU地址空间的0x10100000~0x10110000中,地址长度为0x10000。
interrupt属性
interrupt-parent 标识此设备节点属于哪一个中断控制器,如果没有设置这个属性,会自动依附父节点的;
interrupts 一个中断标识符列表,表示每一个中断输出信号,引用中断号及中断触发类型
#interrupt-cells 这是中断控制器节点的属性,用来标识这个控制器需要几个单位做中断描述符;
interrupt-controller 一个空属性用来声明这个node接收中断信号;
比如:父节点的#interrupt-cells的值是3,则子节点的interrupts一个cell有三个32bits整型值,<中断域 中断 触发方式>
gpio属性
gpio-controller:说明该节点描述的是一个gpio控制器
#gpio-cells:描述gpio使用节点的属性一个cell的内容
属性名=<&引用GPIO节点别名 GPIO标号 工作模式>;