linux设备树dts和dtb规范

一、dts文件格式介绍

1、代码讲解

/dts-v1/;                           /*版本号*、
/memreserve/ 0x33f00000 0x100000;   /*最高1M自己使用*/  
/ {
    
    
    /*属性名+值得方式*/
    /*根节点属性,定义使用compatible 的哪个版本*/     
	model = "SMDK24440";       
	compatible = "samsung,smdk2440";  
	/*通过compatible 这个名字找到内核中不同单板的初始化函数*/
	/*使用以下memory中的reg 1个32位代表地址 */
	/*#不表示屏蔽*/
	#address-cells = <1>;  
	/*使用以下memory中的reg 1个32位代表数据 */
	#size-cells = <1>;   
	/*byestring表示多个十六进制的数,必须两位来表示,空格可以省略*/
    #size-cells = [00 11 22]; 
	memory {
    
      /* /memory */
	    /*也可以用“”来表示字符串*/
		device_type = "memory";      //约定好的,不变 
		/*尖括号里面可以表示多个32位的数据,reg指定根节点的起始地址和大小
        0x30000000 0x4000000代表一段内存
        0 4096 代表一段内存
        */
		reg =  <0x30000000 0x4000000 0 4096>;		
	};	
	chosen {
    
    
	    /*内核启动时候的命令行参数*/
		bootargs = "noinitrd root=/dev/mtdblock4 rw init=/linuxrc  console=ttySAC0,115200";
	};
	/*代表不同的cpu
	cpus {
		cpu {
			compatible = "arm,arm926ej-s";
		};
	};
*/	
	led {
    
        /*节点名字*/ 
	     /*通过compatible这个名字来找到驱动程序*/
		compatible = "jz2440_led";
		pin = <S3C2410_GPF(5)>;
	};
};

2、属性、数据实例

a. Arrays of cells : cell就是一个32位的数据
interrupts = <17 0xc>;

b. 64bit数据使用2个cell来表示:
clock-frequency = <0x00000001 0x00000000>;

c. A null-terminated string (有结束符的字符串):
compatible = “simple-bus”;

d. A bytestring(字节序列) :
local-mac-address = [00 00 12 34 56 78]; // 每个byte使用2个16进制数来表示
local-mac-address = [000012345678]; // 每个byte使用2个16进制数来表示

e. 可以是各种值的组合, 用逗号隔开:
compatible = “ns16550”, “ns8250”;
example = <0xf00f0000 19>, “a strange property format”;

3、xxx.dts包括xxx.dtsi文件

dtsi文件是保持不变的文件。
在xxx.dts里面包括xxx.dtsi文件如下
#include “xxx.dtsi”

4、xxx.dts文件实例

(1)、xxx.dts的节点属性可以覆盖掉xxx.dtsi里面的节点属性。

/*xxx.dtsi*/
/dts-v1/;

/ {
    
    
	model = "SMDK24440";
	compatible = "samsung,smdk2440";
	/*#不表示屏蔽*/
	#address-cells = <1>;  
	/*使用以下memory中的reg 1个32位代表数据 */
	#size-cells = <1>;   
	/*byestring表示多个十六进制的数,必须两位来表示,空格可以省略*/
    #size-cells = [00 11 22]; 
    memory {
    
      /* /memory */
		device_type = "memory";
		reg =  <0x30000000 0x4000000 0 4096>;		
	};
	chosen {
    
    
		bootargs = "noinitrd root=/dev/mtdblock4 rw init=/linuxrc console=ttySAC0,115200";
	};
	led {
    
    
		compatible = "jz2440_led";
		pin = <S3C2410_GPF(5)>;
	};
};
/*xxx.dts*/
/dts-v1/;
#include "xxx.dtsi"
/*
将xxx.dtsi中的led覆盖了
括号前面的/为jz2440.dtsi里面的根节点
*/
/ {
    
      
    led {
    
    
		pin = <S3C2410_GPF(6)>;
	};
};

(2)、xxx.dts的节点属性可以引用xxx.dtsi里面的节点属性。

/*xxx.dtsi*/
/dts-v1/;

/ {
    
    
	model = "SMDK24440";
	compatible = "samsung,smdk2440";
	/*#不表示屏蔽*/
	#address-cells = <1>;  
	/*使用以下memory中的reg 1个32位代表数据 */
	#size-cells = <1>;   
	/*byestring表示多个十六进制的数,必须两位来表示,空格可以省略*/
    #size-cells = [00 11 22]; 
	memory {
    
      /* /memory */
		device_type = "memory";
		reg =  <0x30000000 0x4000000 0 4096>;		
	};
	chosen {
    
    
		bootargs = "noinitrd root=/dev/mtdblock4 rw init=/linuxrc console=ttySAC0,115200";
	};
	LED: led {
    
    
		compatible = "jz2440_led";
		pin = <S3C2410_GPF(5)>;
	};
};
/*xxx.dts*/
/dts-v1/;
#include "xxx.dtsi"
/*
可以通过&来引用xxx.dtsi里面的LED
*/
&LED {
    
    
   pin = <S3C2410_GPF(7)>;
};

二、dtb文件格式介绍

1、dtb文件简介

dtb文件是dts文件编译得到的二进制文件。
dtb文件可以通过反汇编的汇编文件查看dts文件是否正确。

2、dtb文件的分布图

在这里插入图片描述

2、dtb文件节点的分布图

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_18077275/article/details/108848060