Linux驱动之设备树

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";
    };

};