1.简介
本wiki主要记录一下设备树的使用,简单介绍内容涵盖,设备树dts作用,解析原理,常见语法。
2.设备树概念
设备树,作用,早期linux上驱动,有很多相关代码,后续开发中为了替换driver中过多的platform_device部分的 静态资源,从而将硬件资源抽象出来,由系统统一解析,这样可以有效避免各驱动中对硬件资源的大量重复定义。 设备树中的节点目标是转换成platform_device结构,在驱动开发时,只需要添加相应的platform driver部分进行 匹配。 流程: DTS--> DTB-->device_node --> platform_device 构成: device tree文件格式dts文件,头文件dtsi,需要编译成dtb文件,系统才能识别使用。
3. 设备树语法
如上图,1个root节点,root节点下面包含一系列的子节点,node@0 node@1, 节点node@0下面又有child-node@0,各节点都有一系列属性。
属性可能为空,如“en-empty-property”,可能为字符串,也可能问字符串数组。
使用参考:
3.1 设备树的头文件扩展名
dts文件 + dtsi文件(类似头文件)
3.2 设备节点 cells属性值的某个组成部分
node-name@unit-address ---命名规范 注意:根节点,没有node-name 或者 unit-address,它定义为 "/ {"
3.3 带标签的设备节点名称
PIC: pic@1000000{
interrupt-controller;
};
another-device-node {
interrupt-parent = <&PIC>;
//使用label来引用上述节点,
//使用label时实际上也是使用phandle来引用
//在编译dts文件为dtb文件时,编译器dtc会在dtb中插入phandle属性
};
3.4 使用示例
//dts文件
#include .h //一般h文件里面放置一堆地址宏定义
#include .dtsi //类似头文件
/{
属性名1 = “属性值”
compatible="fsl,imx6ull-14x14","fsl,imx6ull"
属性名3 =“属性值”
......
......
一级子节点1{
.......
};
memory{
reg = <0x80000000 0x20000000>; //一般reg都类似,寄存器地址,总大小
};
一级子节点3{
......
};
......
}
//&标签:是向标签处追加,某个标签在定义的某个节点开头,
//所有标签就是向某一个节点追加
追加语句1{
......
};
&clks {
status = "okay";
assigned-cloks = <&clks IMX6UL_CLK_PLL4_AUDIO_DIV>;
};
追加语句3{
......
};
//对应dtsi文件
//skeleton.dtsi文件
//在 “/ {” 和 “}”之间添加,如下:
/ {
#address-cells = <1>;
#size-cells = <1>;
chosen {};
aliases {};
memory{
reg =<0 0>;
device_type = "memory";
compatible = "fsl,imx6ll";
};
};
您还没有登录,请您登录后发表评论。