设备树语法

1 Devicetree格式

1.1 DTS文件格式

/dts-v1/; //表示版本
[memory reservations]; //格式为:/memreserve/ <address> <length>
/{
	[property definitions]
	[child nodes]
};

举例:
在这里插入图片描述

1.2 node格式

[lable:] node-name[@unit-address] {
	[properties definitions];
	[child nodes] ;
};

举例:
在这里插入图片描述
【注】:lable是标号可以省略,但一个有label的node可以被方便的引用,例如,有下面一个节点:

/dts-v1/;
/ {
	uart0: uart@fe001000 {
	compatible="ns16550";
	reg=<0xfe001000 0x100>;
	};
};

两种引用方式分别为:
①用lable引用node

&uart0 {
	status = "disable";
};

②用全路径引用node

&{/uart@fe001000} {
	status = "disable";
};

1.3 properties格式

In simple terms:“name = value”,其中value可能没有,如果有value,则有多种取值方式。

  1. arrays of cells(1 个或多个 32 位数据, 64 位数据使用 2 个 32 位数据表示),
  2. string(字符串)
  3. bytestring(1个或多个字节)

举例:
a. Arrays of cells :cell就是一个32位的数,用尖括号<>围起来
b. 64bit 数据使用 2 个 cell来表示

 clock-frequency = <0x00000001 0x00000000>;

c. A bytestring(字节序列) ,用中括号包围起来,中括号括起来的为16进制单字节

local-mac-address = [00 00 12 34 56 78]; // 每个 byte 使用 2 个 16 进制数来表示

d. 也可是各种值的组合,用逗号隔开

compatible = "ns16550", "ns8250";
example = <0xf00f0000 19>, "a strange property format";

2 dts文件包好desi文件

dts文件不需要从头开始写,可以 通过include包含设备树模板,一般命名为XXX.dtsi文件,还可以包含一些.h文件,在.h文件中定义一些宏。(因为需要涉及到预处理过程,所以需要编译&&&编译,而不能直接用spr****编译)

3 常用的 属性 properties

3.1 #address-cells、#size-cells

其中cell指的是一个32位的数值。
address-cells:指address需要多少个32位数表示
size-cells:指size需要多少个32位数表示
【注】他们影响的是子节点中的reg属性;
在这里插入图片描述
此处的reg用于表示这是第几个CPU,设备不同reg属性的含义就不同。

3.2 compatible

表示兼容,如果对于某个LED驱动,内核中A、B、C三个驱动都支持它,可以写成:

led {
	compatible = "A", "B", "C";
};

内核启动时,就会为这个LED按这样的有限顺序为它找到驱动程序。
compatible 的值,建议取这样的形式:“manufacturer,model”,即“厂家名,模块名”。

3.3 model

compatible属性可以知道兼容哪些板子,而module属性可以明确的告诉你到底是什么板。举例,根节点中可以这样写:

/{
	compatible = "samsung,smdk2440", "samsung,mini2440";
	model = "jz2440_v3";
};

3.4 status

可以决定是否启用板子上的某些驱动,比如板子上没有uart1:

&uart1 {
	status = "disabled";
};
注:反过来写 "okay"

3.5 reg(设备不同reg属性的含义就不同)

register虽然本意是寄存器,但是ARM系统中寄存器和内存是统一编址的,他们在访问上没有任何区别,所以reg用于描述一段空间,reg属性的值是一系列的address和size。用多少个32位的数来表示address和size是由其父节点中#address-cells、#size-cells的属性决定的,举例:

/ {
	#address-cell = <1>;
	#size-cell = <1>;
	memory {
		reg = <0x80000000 0x20000000>;
	};
};

上例中表示寄存器的起始地址和大小,设备不同reg属性的含义就不同。

3.6 name、device_type(都过时了建议不用)

用于表示节点名字,在platform_driver匹配时优先级最低,device_type优先级为中。而compatible属性在匹配过程中优先级最高。

4 常用的 节点 node

4.1 根节点

在这里插入图片描述

4.2 cpu节点

芯片厂家提供的dtsi文件都定义好了。

4.2 memory节点

一般需要制作电路板的公司根据自己选用的内存芯片大小来设置。

4.3 chosen节点

这个是虚拟节点,不对应具体的设备,可以通过设备树文件给内核传入一些参数,比如可在chosen节点中设置bootargs:

chosen {
	bootargs = "noinitrd root=/dev/mtdblock4 rw init=/linuxrc console=ttySAC0,115200";
};

参考:韦东山《嵌入式Linux应用完全开发手册》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值