设备树的规范(dts)

如何看下面这张图:

1)从根节点开始看起,即 /

2)在根节点中有属性以及设备节点名称

3)属性的格式有两种形式,当property-name = value时,value的取值有三种形式

4)设备节点(child nodes)的格式

总结:

(1) 语法:
Devicetree node格式:
[label:] node-name[@unit-address] {
  [properties definitions]
  [child nodes]
};

Property格式1:
[label:] property-name = value;

Property格式2(没有值):
[label:] property-name;

Property取值只有3种:
arrays of cells(1个或多个32位数据, 64位数据使用2个32位数据表示),
string(字符串),
bytestring(1个或多个字节)

示例:
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";

(2)
DTS文件布局(layout):
/dts-v1/;
[memory reservations] // 格式为: /memreserve/ <address> <length>;
/ {
  [property definitions]
  [child nodes]
};

(3) 特殊的、默认的属性:
a. 根节点:
#address-cells    // 在它的子节点的reg属性中, 使用多少个u32整数来描述地址(address)
#size-cells      // 在它的子节点的reg属性中, 使用多少个u32整数来描述大小(size)

例子:

#address-cells = <1>;
#size-cells = <1>;

[email protected] {
  device_type = "memory";
  reg = <0x30000000 0x4000000>;  
};

在子节点的reg属性中,0x30000000表示地址,0x4000000来表示大小。我凭什么知道在reg中用一个32位整数来描述地址,一个32位整数来描述大小。就是通过

#address-cells = <1>;
#size-cells = <1>;

进行指定的。

compatible     // 定义一系列的字符串, 用来指定内核中哪个machine_desc可以支持本设备
           // 即这个板子兼容哪些平台
           // uImage : smdk2410 smdk2440 mini2440 ==> machine_desc 。一个uImage可以支持多种单板,比如说smdk2410、smdk2440、mini2440。每种单板在内核中都有一个对应的machine_desc结构体,里面会有不同的初始化函数。因此利用compatible这个属性可以选择单板,让内核去执行对应的初始化函数。

举例:

compatible = "samsung,smdk2440";  通过这样指定,内核就会去执行smdk2440中的初始化函数

compatible可以是一个或多个字符串。比如说compatible = "samsung,smdk2440"  "samsung,smdk24xx"

smdk2440就更加具体,s3c24xx就比较广泛些,可以适配更多的单板。使用设备树时,优先去内核中寻找支持smdk2440的machine_desc,如果找不到的话,再去寻找支持smdk24xx的machine_desc。优先选择第一项,如果没有,再往后选择。

model    // 咱这个板子是什么
        // 比如有2款板子配置基本一致, 它们的compatible是一样的
       // 那么就通过model来分辨这2款板子

b. /memory
device_type = "memory";   //这是约定俗称的,必须写这个。
reg // 用来指定内存的地址、大小

c. /chosen
bootargs // 内核command line参数, 跟u-boot中设置的bootargs作用一样

例子:

chosen {
bootargs = "noinitrd root=/dev/mtdblock4 rw init=/linuxrc console=ttySAC0,115200";   //内核启动时的命令行参数
};

d. /cpus
/cpus节点下有1个或多个cpu子节点, cpu子节点中用reg属性用来标明自己是哪一个cpu
所以 /cpus 中有以下2个属性:
#address-cells // 在它的子节点的reg属性中, 使用多少个u32整数来描述地址(address)

#size-cells   // 在它的子节点的reg属性中, 使用多少个u32整数来描述大小(size)
         // 必须设置为0

e. /cpus/cpu*
device_type = "cpu";
reg // 表明自己是哪一个cpu

原文地址:https://www.cnblogs.com/-glb/p/11674707.html

时间: 2024-10-11 01:43:20

设备树的规范(dts)的相关文章

Linux 获取设备树源文件(DTS)里描述的资源【转】

转自:http://www.linuxidc.com/Linux/2013-07/86839.htm 转自:http://blog.sina.com.cn/s/blog_636a55070101mced.html 在linux使用platform_driver_register() 注册  platform_driver 时, 需要在 platform_driver 的probe() 里面知道设备的中断号, 内存地址等资源. 这些资源的描述信息存放在 resource 数据结构中, 相同的资源存

2、设备树的规范(dts和dtb格式)

第01节_DTS格式(1) 语法:Devicetree node格式:[label:] node-name[@unit-address] { [properties definitions]          属性,格式见下面Property [child nodes] 节点 }; Property格式1:[label:] property-name = value; Property格式2(没有值):[label:] property-name; Property取值只有3种: arrays

我眼中的Linux设备树(二 基础规范概述)

二 基础规范概述 DTS(Device tree syntax,另一种说法是Device tree source)是设备树源文件,为了方便阅读及修改,采用文本格式.DTC(Device tree compiler)是一个小工具,负责将DTS转换成DTB(Device tree blob).DTB是DTS的二进制形式,供机器使用.使用中,我们首先根据硬件修改DTS文件,然后在编译的时候通过DTC工具将DTS文件转换成DTB文件,然后将DTB文件烧写到机器上(如emmc,磁盘等存储介质).系统启动时

Linux设备树(2)——设备树格式和使用

一.设备树dts文件的语法规范 1. DTS文件布局(layout) /dts-v1/; [memory reservations] // 格式为: /memreserve/ <address> <length>; / { [property definitions] [child nodes] }; (1) 特殊的.默认的属性 a. 根节点的: #address-cells // 在它的子节点的reg属性中, 使用多少个u32整数来描述地址(address) #size-cell

设备树网址【原创笔记】

设备树学习网址 DTS: http://blog.csdn.net/21cnbao/article/details/8457546 http://www.wowotech.net/device_model/why-dt.html IRQ_DOMIAN: http://www.wowotech.net/linux_kenrel/irq-domain.html PINCTRL: http://blog.csdn.net/mike8825/article/details/51475985 http:/

我眼中的Linux设备树(一 概述)

一 概述 设备树(Device tree)是一套用来描述硬件属相的规则.ARM Linux采用设备树机制源于2011年3月份Linux创始人Linus Torvalds发的一封邮件,在这封邮件中他提倡ARM平台应该参考其他平台如PowerPC的设备树机制描述硬件.因为在此之前,ARM平台还是采用旧的机制,在kernel/arch/arm/plat-xxx目录和kernel/arch/arm/mach-xxx目录下用代码描述硬件,如注册platform设备,声明设备的resource等.因为这些代

分析内核源码,设备树【转】

转自:http://blog.csdn.net/fight_onlyfor_you/article/details/78092204 U-Boot需要将设备树在内存中的存储地址传给内核.该树主要由三大部分组成:头(Header).结构块(Structure block).字符串块(Strings block). 设备树在内存中的存储布局图如下 1.1 头(header) 1.2 结构块(struct block)  扁平设备树结构块是线性化的树形结构,和字符串块一起组成了设备树的主体,以节点形式

编写设备树DTS

第一步就是要为这个模型机构建一个基本结构,这是一个有效的设备树最基本的结构.在这个阶段你需要唯一的标识该机器. /{ compatible= " Marvell ,armada38x" };compatible 指定了系统的名称.它包含了一个“<制造商>,<型号>”形式的字符串.重要的是要指定一个确切的设备,并且包括制造商的名子,以避免命名空间冲突.由于操作系统会使用 compatible 的值来决定如何在机器上运行,所以正确的设置这个属性变得非常重要. 接下来

设备树DTS使用

参考:<设备树DTS使用总结 - 基于MT76X8> .<linux内核设备树及编译> 一.Linux设备树的起源 在Linux 2.6中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥着大量的垃圾代码,相当多数的代码只是在描述板级细节,而这些板级细节对于内核来讲,不过是垃圾,如板上的platform设备.resource.i2c_board_info.spi_board_info以及各种硬件platform_data. 在Linux3.x版本后,ar