arm linux设备树学习笔记1

设备树是由一系列被命名的节点(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";
};

status取值

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值