一、设备树简介

       Linux设备树是一个硬件配置信息集合。源文件后缀为dts,通过编译器dtc将dts编译为二进制文件dtb。设备树顾名思义是一个以树状结构表示资源配置。关于设备树的使用背景这边就不赘述了,本篇主要讲解的是设备树的语法。

二、设备树语法

        设备树是由一个根节点、若干子节点和子节点中的属性组合而成。现在从最基础的部分开始来了解一下设备树dts文件到底要怎么写。

 1、节点和属性的取值

节点名称:node-name@unit-address

        node-name只能由数字、大小写字母和字符 ','(逗号), '.'(点),'_'(下划线),'+','-' 组成。节点应以字母为开头。unit-address表示的是节点所表示的硬件配置的起始地址即reg属性的起始值,若节点没有reg属性则不用不设置。

属性Property:通常情况下开发者都会使用设备树提供的标准属性,如果要自定义属性,属性的命名方式和节点名称对比没有字符’-‘,增加字符’?‘,'#',不一样的地方就是属性后不能紧跟地址。

Property格式:

        property-name = value;

        property-name;

value 类型如下所示:

        u32:32为整形

        u64:64位整型由两个u32组成<0x11223344 0x55667788>,表示0x1122334455667788

        string:和C语言一样是以’\0‘结尾的。eg: "Hello word"

        bytestring:每一位用两个16进制数来表示。eg:[00 00 12 34 56 78] 或 [000012345678]

2、特殊节点

        / :根节点,所有节点都是根节点的子孙节点。

        /aliases:别名节点。位于根目录下。可以为节点设置别名。

aliases {
    cpu-0 = "/cpus/cpu@0";
    cpu-1 = "/cpus/cpu@1";
};

        /memory :内存节点是设备树必须要有的节点,位于根目录下。用来描述物理内存布局,可以有多个memory节点来描述多个范围的内存。在其reg属性中可以指定内存的起始地址和size。

memory@0 {
    device_type = "memory";
    reg = <0x000000000 0x00000000 0x00000000 0x80000000>;
};
memory@100000000 {
    device_type = "memory";
    reg = <0x000000001 0x00000000 0x00000001 0x00000000>;
};

        /chosen:不代表一个硬件,位于根目录下。指定启动参数,类似u-boot启动内核时指定的bootargs。其中bootargs属性是必须存在,但可以设置空值。

chosen {
    bootargs = "root=/dev/nfs rw nfsroot=192.168.1.1 console=ttyS0,115200";
};

        /cpu:这个节点也是所有设备树必备的。作用和其特殊属性不展开讲,需要了解的话请查看设备树手册。

3、常规属性

        compatible:属性值为string,表示节点支持某厂家的某设备,当compatible属性位于根节点时用于匹配内核中的machine_desc,当在子节点中时多用于匹配驱动程序。eg:compatible = "fsl,mpc8641", "ns16550"; 先匹配"fsl,mpc8641",若匹配失败就匹配更通用的"ns16550"。

        model:属性值为string,用于指定设备的制造商和型号。eg:model = "fsl,MPC8349EMITX";

        phandle:属性值为u32,用于指定一个数字标识用于被需要的节点引用。这个数字标识的值不可重复。使用方式如下所示:

/{
    pic@10000000 {
        phandle = <1>;
        interrupt-controller;
    };
   another-device-node {
        interrupt-parent = <1>;
    };
}

        status:属性值为string,表示设备的运行状态  。okay表示设备可运行,disabled表示设备当前未运行,但可能在将来运行(设备未插入或处于关闭状态),fail表示设备无法运行,fail-sss表示该设备无法运行。在设备中检测到严重错误,不太可能运行。该值的sss部分是特定于该设备的,并指示所检测到的错误条件。

        #address-cells:属性值为u32,表示子节点中的reg属性使用一个u32来描述地址。默认值为2。

        #size-cells:属性值为u32,表示子节点中reg属性使用一个u32来描述地址size。默认值为1。

        reg:常用于用于描述地址和空间大小。  

4、中断属性

      interrupts:表示设备可以产生的一个或多个中断,声明中断号和触发方式。这个值会被interrupts-extended属性覆盖,一个节点中interrupts和interrupts-extended只能出现一个。

        interrupt-parent:表明节点父中断。

        interrupts-extended:当前节点拥有多个中断控制器时用此属性来声明中断。eg:interrupts-extended = <&pic 0xA 8>, <&gic 0xda>;

        #interrupt-cells:说明中断域下的中断节点要使用几个u32来描述一个中断。

        interrupt-controller:声明此节点时一个中断控制器。

这是设备树手册里拿出来的一个

/ {
	model="fsl,mpc8572ds";
	compatible="fsl,mpc8572ds";
	#address-cells=<1>;    /* reg属性中用1位代表起始地址 */
	#size-cells=<1>;    /* reg属性中用1位表示size */

	cpus {
		#address-cells=<1>;
		#size-cells=<0>;
		cpu@0 {
			device_type="cpu";
			reg=<0>;
			timebase-frequency=<825000000>;
			clock-frequency=<825000000>;
		};
		
		cpu@1 {
			device_type="cpu"
			reg=<1>;
			timebase-frequency=<825000000>;
			clock-frequency=<825000000>;
	};
	
	memory@0 {
		device_type="memory";
		reg=<0 0x20000000>;    /* 其地址为0,size为0x20000000 */
	};
	
	uart@fe001000 {
		compatible="ns16550";
		reg=<0xfe001000 0x100>; /* 其地址为0xfe001000 ,size为0x100*/
	};
	
	chosen {
		bootargs="root=/dev/sda2";
	};
	
	aliases {
		serial0="/uart@fe001000";
	};
};

 

物联沃分享整理
物联沃-IOTWORD物联网 » Linux设备树DTS语法详解

发表评论