2.1设备树的规范(dts和dtb)——DTS格式

article/2025/10/24 6:43:37

本节学习设备树的规范

使用设备树时,需要编写dts文件,然后使用dtc编译dts文件,生成dtb文件。

所以本节分为两部分,第一部分讲解dts格式,第二部分讲解dtb格式

首先看一下dts文件的布局。

DTS文件布局(layout):
/dts-v1/;                         // 表示DTS文件的版本
[memory reservations]             // 保存的内存区域 格式为: /memreserve/ <address> <length>;
/ {[property definitions][child nodes]
};

第一行 /dts-v1/; 表示的是DTS文件的版本

第二行 [memory reservations] 表示保留的内存区域,假设有64MB内存,如果希望保留4MB内存,只提供60MB内存供内核使用,那么就可以设置这个选项,如果不设置则认为内核使用全部的内存。

接下来是 / { ... };,其中 / 是,是设备树的起点

对于每一个设备树,我们需要一些属性来描述这颗树,就是 [property definitions];同样,一颗树有很多树干,很多分支,一颗设备树同样也有很多子节点,子节点中又可以包含子节点,就是 [child nodes]

那么属性设备节点是如何定义的呢?

属性

首先来看属性。

属性的格式有两种,一种是没有值的空属性,一种是有值的属性

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

下面就是有值的属性,除了特殊规定的属性,比如bootargs是用来设置启动指令,其他没有特殊规定的属性,属性名是可以自由定义的,比如pin,就是我们自己定义的属性。

属性值的写法有三种

  1. 尖括号括起来 <xx xx xx ...>,例如<1 0x3 0x123>,每个成员都是32bit数据,称为arrays of cells
  2. 双引号括起来的字符串 "...",例如上面bootargs的字符串;
  3. 中括号括起来的字节序列(byte string)[xx xx xx ...],使用16进制表示1个/多个byte,需要注意的是,byte string中,一个byte必须用2位16进制数来表示,例如[00 11 22],其中00不能简写为0,但是byte之间的空格可以省略,也就是[00 11 22]和[001122]是一样的;

value的取值类型只有上述三种,但是这三种取值类型可以叠加,不过一般不会这么做。

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

设备节点

下图就是设备树中节点的格式。

第一行的 label 可加可不加,node-name是节点名字;@unit-address是地址,可以用来区分内存节点,比如memory@30000000和memory@0,分别表示起始地址为0x3000 0000和0的两块内存;

led {compatible = "jz2440_led";pin = <S3C2410_GPF(5)>;
};

以之前写的led为例,其中led就是node-name。

memory@30000000 {  /* /memory/memory@30000000 */device_type = "memory";reg =  <0x30000000 0x4000000>;		
};memory@0 {  /* /memory/memory@0 */device_type = "memory";reg =  <0 4096>;		
};

memory@30000000和memory@0就是两块不同起始地址的内存空间。

注意事项

dts文件中有一些默认的属性名字,比如model,compatible,#address-cells,#size-cells,这些是根节点必须有的属性,它们代表的含义都是默认的,是事先约定好的。

它们的定义如下。

 

 举例

override

设备树文件可以将一些公共的部分写为dtsi文件,dts文件可以包含dtsi文件,就像C文件包含h文件一样,语法格式也同C文件包含h文件一样

下面是一个dtsi文件。

// SPDX-License-Identifier: GPL-2.0
/** SAMSUNG SMDK2440 board device tree source** Copyright (c) 2018 weidongshan@qq.com* dtc -I dtb -O dts -o jz2440.dts jz2440.dtb*/#define S3C2410_GPA(_nr)	((0<<16) + (_nr))
#define S3C2410_GPB(_nr)	((1<<16) + (_nr))
#define S3C2410_GPC(_nr)	((2<<16) + (_nr))
#define S3C2410_GPD(_nr)	((3<<16) + (_nr))
#define S3C2410_GPE(_nr)	((4<<16) + (_nr))
#define S3C2410_GPF(_nr)	((5<<16) + (_nr))
#define S3C2410_GPG(_nr)	((6<<16) + (_nr))
#define S3C2410_GPH(_nr)	((7<<16) + (_nr))
#define S3C2410_GPJ(_nr)	((8<<16) + (_nr))
#define S3C2410_GPK(_nr)	((9<<16) + (_nr))
#define S3C2410_GPL(_nr)	((10<<16) + (_nr))
#define S3C2410_GPM(_nr)	((11<<16) + (_nr))/dts-v1/;/ {model = "SMDK24440";compatible = "samsung,smdk2440";#address-cells = <1>;#size-cells = <1>;memory {  /* /memory */device_type = "memory";reg =  <0x30000000 0x4000000 0 4096>;		};/*cpus {cpu {compatible = "arm,arm926ej-s";};};
*/	chosen {bootargs = "noinitrd root=/dev/mtdblock4 rw init=/linuxrc console=ttySAC0,115200";};led {compatible = "jz2440_led";pin = <S3C2410_GPF(5)>;};
};

然后在dts文件中包含这个dtsi文件, 只要添加一个#include "jz2440.dtsi"即可。

// SPDX-License-Identifier: GPL-2.0
/** SAMSUNG SMDK2440 board device tree source** Copyright (c) 2018 weidongshan@qq.com* dtc -I dtb -O dts -o jz2440.dts jz2440.dtb*//dts-v1/;#include "jz2440.dtsi"

在dtsi文件中led节点的pin属性为<S3C2410_GPF(5)>,如果要修改为<S3C2410_GPF(6)>但是不想改变dtsi文件,那么只需要在dts文件中重新定义led节点的pin属性即可。

增加led节点pin属性的设置,设置如下。也就是说,设置以最终的设置值为准。

// SPDX-License-Identifier: GPL-2.0
/** SAMSUNG SMDK2440 board device tree source** Copyright (c) 2018 weidongshan@qq.com* dtc -I dtb -O dts -o jz2440.dts jz2440.dtb*//dts-v1/;#include "jz2440.dtsi"/ {led {pin = <S3C2410_GPF(6)>;};
};

将dts和dtsi文件复制到arch\arm\boot\dts目录下,设置编译工具链。

export PATH=/home/book/code/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin/:$PATH

然后在根目录下执行make dtbs指令,编译dts文件,得到dtb文件。

想要看编译后的dtb文件是否和我们设置的相同,可以使用dtc工具将dtb文件反编译成dts文件,看看反编译的dts文件是否符合上面的设置。

 执行下面指令,将jz2440.dtb反编译得到一个tmp.dts文件。

./scripts/dtc/dtc -I dtb -O dts -o tmp.dts arch/arm/boot/dts/jz2440.dtb

dtc的说明如下。

 然后查看tmp.dts文件,可以看到led节点的pin属性被设置为了<S3C2410_GPF(6)>而不是<S3C2410_GPF(5)>。

LABEL

在之前,想要修改dtsi文件中的led节点,需要将led的整个路径写出,除了这个方法之外,还可以增加一个led节点的label,在dts文件中通过label来引用led节点。

如下所示,其他部分不变,将led节点的label设置为LED。

LED: led {compatible = "jz2440_led";pin = <S3C2410_GPF(5)>;
};

修改dts文件,引用led节点的标签LED,将pin属性设置为7。

// SPDX-License-Identifier: GPL-2.0
/** SAMSUNG SMDK2440 board device tree source** Copyright (c) 2018 weidongshan@qq.com* dtc -I dtb -O dts -o jz2440.dts jz2440.dtb*//dts-v1/;#include "jz2440.dtsi"
&LED {pin = <S3C2410_GPF(7)>;
};

重新编译dtb文件,然后反编译,得到新的tmp.dts文件。

可以看到,led节点的pin属性被覆盖为了7。

最后,本节内容来自设备树的官方文档,可以从https://www.devicetree.org/specifications/下载到关于设备树知识的官方文档。


http://chatgpt.dhexx.cn/article/gSe0da28.shtml

相关文章

关于EMUELC适配各种机型,DTB如何修改教程

很多爱好者留言&#xff0c;都想问关于EMUELC的dtb适配机型问题&#xff0c;这里我就出一个教程&#xff0c;如何修改dtb&#xff0c;然后去适配自己的机型&#xff0c;然后启动 。这里我只是提供方法&#xff0c;具体的调试是需要原理图进行配置。 首先&#xff0c;不管是aml…

DTBO简介

1、DTBO简介 设备树 (DT) 是用于描述“不可发现”硬件的命名节点和属性构成的一种数据结构。操作系统&#xff08;例如在 Android 中使用的 Linux 内核&#xff09;会使用 DT 来支持 Android 设备使用的各种硬件配置。硬件供应商会提供自己的 DT 源文件&#xff0c;接下来…

【DTB/DTBO 分区介绍】

如果你的 DTB/DTBO 位于专属的分区&#xff08;例如 dtb 和 dtbo 分区&#xff09;中&#xff0c;请使用以下表格结构和头文件格式&#xff1a; 数据结构 dt_table_header 仅适用于 dtb/dtbo 分区&#xff1b;您不能在kernel( image.gz) 末尾处附加此格式。如果您有一个 DTB/D…

2.2设备树的规范(dts和dtb)——DTB格式

本节讲述设备树的dtb格式。 上节讲述了dts格式。回顾上节&#xff0c;在dts文件和dtsi文件中&#xff0c;可以使用C语言的define和include&#xff0c;使用方法和作用也同C语言相同。 编写dts文件后&#xff0c;需要使用dtc工具将dts文件编译成dtb文件。dtc工具可以检查dts文…

「设备树」dtb给内核的两种工作模式

一&#xff0c;传递dtb给内核 对于传统bootloader提供两种工作模式&#xff1a;一是启动加载模式&#xff08;start loading&#xff09;&#xff0c;一是下载模式&#xff08;downloading&#xff09; 工作在启动加载模式时&#xff0c;bootloader会自动执行bootcmd命令&#…

设备树_dtb文件分析

前言&#xff1a;我之前的原计划是没有打算写设备树dtb文件分析&#xff0c;但是情势所迫啊&#xff01;&#xff0c;学习还是要一步一步来的。 在前面的章节提到过.dts文件以文本方式对系统设备树进行描述&#xff0c;经过Device Tree Compiler(dtc)将dts文件转换成二进制文件…

Linux设备树学习2 - DTB文件格式

一. DTB文件简介 DTB文件是由DTS文件通过dtc命令编译生成的二进制文件。DTS文件不能直接被内核解析&#xff0c;需要编译成DTB文件才可以直接被内核识别并解析使用的。 二. DTB文件内容布局 从上图可以看出&#xff0c;DTB由四个部分组成&#xff0c;分别是struct fdt_header&a…

setUserVisibleHint-- fragment真正的onResume和onPause方法

这个情况仅适合与多个fragment之间切换时统计&#xff0c;而非activity和fragment同时交互&#xff0c;因当时项目为首页4个fargment时长统计&#xff0c;因此适合&#xff0c;经下面网友评论指出&#xff0c;特在这里写出此问题&#xff0c;因最近项目较忙&#xff0c;具体情况…

onCreate与onStart区别,onStart与onResume区别

http://www.cnblogs.com/kofi1122/archive/2011/04/10/2011772.html Activity生命周期之我见 关于Activity生命周期的文章很多&#xff0c;而且大部分也说得很详细&#xff0c;所以作为关于这方面的内容我本来不想多说&#xff0c;但是大家可能跟我之前一样&#xff0c;在看这方…

Flutter BaseWidget 实现onResume、onPause()

熟读唐诗三百首&#xff0c;不会作诗也会吟。——孙洙 最近用Flutter开发的项目算是完成了开发到上线第一阶段了。任何一个项目开始了&#xff0c;若想追求的是更好&#xff0c;那么就需要下功夫对项目用户体验和代码效率深入的研究了。作为用户和产品经理、老板、UI、不懂技术…

Activity生命周期中onStart()和onResume()的区别

Activity生命周期中onStart()和onResume()的区别 在讲onStart()和onResume()的区别之前&#xff0c;必须清楚Activity的四种状态&#xff1a; 1.Running状态&#xff1a;一个新的Activity的启动入栈后&#xff0c;它在屏幕最前端&#xff0c;处于栈的最顶端&#xff0c;此时它…

android Activity的onPause()与onResume()

官方文档地址&#xff1a;http://www.android-doc.com/training/basics/activity-lifecycle/pausing.html#Resume Pause和Resume一个Activity 在一般的app使用中&#xff0c;前台的activity一般是会被视觉组件所遮住的&#xff0c;这就会导致activity的pause。举个例子&#x…

android中onResume、onPause等方法

程序正常启动&#xff1a;onCreate()->onStart()->onResume(); 正常退出&#xff1a;onPause()->onStop()->onDestory() 程序按back 退出&#xff1a; onPause()->onStop()->onDestory(),再进入&#xff1a;onCreate()->onStart()->onResume(); 程序按…

OnStart()方法和OnResume()方法的区别

文章目录 一、Activity的生命周期简述在讲onStart()和onResume()的区别之前&#xff0c;必须清楚Activity的四种状态&#xff1a; 二、OnStart()和OnResume()方法的区别区别&#xff1a; 总结 一、Activity的生命周期简述 在讲onStart()和onResume()的区别之前&#xff0c;必须…

简单介绍几种Java后台开发常用框架组合

01 前言 Java框架一直以来都是面试必备的知识点&#xff0c;而掌握Java框架&#xff0c;不管在成熟的大公司&#xff0c;快速发展的公司&#xff0c;还是创业阶段的公司&#xff0c;都能对当前正在开发中的系统有整体的认知&#xff0c;从而更好的熟悉和学习技术&#xff0c;这…

用IDEA进行Java后台开发(一)

想尝试着进行java后台开发&#xff0c;发现能找到的完整工程教程很多都是用eclipse开发的&#xff0c;于是照着搭了一套开发环境&#xff0c;也简单的写了一个测试代码&#xff0c;由于好几年没有使用eclipse了&#xff0c;快捷键实在用的费劲&#xff0c;遂找到了IDEA这个开发…

Java后台学习路线

2021.01.31.更新 2018.11.10更新&#xff0c;请看文章末尾惊喜 或者点击 https://blog.csdn.net/qq_40374604/article/details/83932163 本文摘自---https://blog.csdn.net/u014624241/article/details/52946378---感谢作者的分享 ①一段摘自知乎的文档 Java就业方向目前主…

Java后台开发一:环境搭建

很久之前就想做Java后台开发了&#xff0c;苦于一直没有找到合适的后台开发教程&#xff0c;某日发现一篇很不错的Java后台开发配置文章&#xff0c;记录如下&#xff1a; jdkeclipsesvnmavenmysqltomcat7.0sublime安装包和jar插件 配置管理工具-SVN http://download.csdn.net/…

Java后台开发知识一览

Java后台开发知识一览 1、后端 WEB服务器&#xff1a;Weblogic、Tomcat、WebSphere、JBoss、Jetty 核心框架&#xff1a;Spring Framework 分布式服务框架 Dubbo&#xff08;感谢浅浅浅丿忧伤指正&#xff09; 安全框架&#xff1a;Apache Shiro 视图框架&#xff1a;Spr…

Java后台开发常见官方网站汇总

Java后台开发常见官方网站汇总 写在前面开发工具篇JDKJavaSE开发文档Oracle数据库&#xff08;收费&#xff09;MySQL数据库&#xff08;免费&#xff09;RedisMongoDBJDBCDruid连接池ElasticsearchKibana——Elasticsearch的客户端RabbitMQMavenGitSpring Framework&#xff0…