arm linux设备树学习笔记1

mac2024-11-24  49

设备树是由一系列被命名的节点(Node)和属性(Property)组成。节点本身可包含子节点。设备树可描述的信息有: . CPU的数量和类别 .内存基地址和大小 .总线和桥 .外设连接 .中断控制器和中断使用情况 .GPIO控制和GPIO使用情况 .时钟控制器和时钟使用情况

Bootloader会将设备树信息传递给内核。(Bootloader也需要支持将编译后的设备树传递给内核。uboot从V1.1.3开始支持设备树)

设备树文件一般放置在arch/arm/boot/dts目录中

DTS文件

一个dts文件对应一个ARM的设备 为了简化把SoC公用的部分或多个设备共用的部分一般提炼为.dtsi。类似于C头文件。其他设备对应的.dts就包括这个.dtsi。dtsi文件也可以包括其他dtsi文件

DTC(Device Tree Compiler)

DTC是将.dts编译为.dtb的工具。DTC的源码位于内核的scripts/dtc中。在内核是能设备树的时候主机工具DTC会被编译出来。

DTB

经编译后的二进制设备树文件

设备树语法

DTS文件布局

/dts-v1/;// 版本 [memory reservations] // 格式为: /memreserve/ <address> <length>; / { [property definitions] [child nodes] };

节点

[label:] node-name[@unit-address] { [properties definitions] [child nodes] };

标准属性

节点都是一堆属性组成,除了用户自定义的属性很多属性是标准属性。

1、compatible属性

compatible属性又称“兼容属性”。 一般驱动程序文件都会有一个 OF 匹配表,此 OF 匹配表保存着一些 compatible 值,如果设备节点的 compatible 属性值和 OF 匹配表中的任何一个值相等,那么就表示设备可以使用这个驱动 对于某个led,可能有A,B,C三个驱动程序都支持它。可以这样写

led{ compatible = "A", "B", "C"; };

内核启动时会根据优先级A,B,C依次寻找 **根节点 compatible 属性:**用来选择哪一个“machine desc”(机器描述):一个内核可以支持machine A,也支持 machine B,内核启动后会根据根节点的 compatible 属性找到对应的machine desc 结构体,执行其中的初始化函数。 compatible 的值,建议取这样的形式:“manufacturer,model”,即“厂家名,模块名”

2、model

model 属性与 compatible 属性有些类似,但是有差别。 compatible 属性是一个字符串列表,表示可以你的硬件兼容 A、B、C等驱动; model 用来准确地定义这个硬件是什么。

/ { compatible = "samsung,smdk2440", "samsung,mini2440"; model = "jz2440_v3"; };

它表示这个单板,可以兼容内核中的“smdk2440”,也兼容“mini2440”。 从 compatible 属性中可以知道它兼容哪些板,但是它到底是什么板?用 model 属性来明确。

3、status

dtsi 文件中定义了很多设备,但是在你的板子上某些设备是没有的。这时你可以给这个设备节点添加一个 status 属性,设置为“disabled”:

&uart1 { status = "disabled"; };

4、#address-cells 和#size-cells 属性

#address-cells: address用多少个32位表示 #size-cells: size用多少个32位表示 这两个属性可以用在任何拥有子节点的设备中,用于描述子节点的地址信息

5、reg 属性

/dts-v1/; / { #address-cells = <1>; #size-cells = <1>; memory { reg = <0x80000000 0x20000000>; }; };

6、 ranges

ranges 属性值可以为空或者按照(child-bus-address,parent-bus-address,length)格式编写的数字矩阵

特殊节点

aliases 子节点

打开imx6dl.dtsi有内容如下:

aliases { i2c3 = &i2c4; }; 单词 aliases 的意思是“别名”,因此 aliases 节点的主要功能就是定义别名,定义别名的目的就是为了方便访问节点。不过我们一般会在节点命名的时候会加上 label,然后通过&label来访问节点,这样也很方便,而且设备树里面大量的用&label 的形式来访问节点。``` ### chosen 子节点 chosen 并不是一个真实的设备,chosen 节点主要是为了 uboot 向 Linux 内核传递数据,重点是 bootargs 参数。一般.dts 文件中 chosen 节点通常为空或者内容很少 ## 内核解析DTB文件 Linux 内核在启动的时候会解析 DTB 文件,然后在/proc/device-tree 目录下生成相应的设备树节点文件。
最新回复(0)