【设备树笔记整理3】设备树的规范(dts和dtb)

1 dts 文件格式

1.1 DTS文件布局(layout):

/dts-v1/;
[memory reservations] 
/ {[property definitions][child nodes]
};

(1)第一行表示当前设备树文件的版本

(2)第二行用来定义保留的内存区域,该区域不给内核使用,例如:

/memresersve/  0x33000000  0x10000

(3)第三行的 "/" 定义根节点

(4)根节点中包含根节点属性(property definitions)和子节点(child nodes)

[注意]: 大括号和属性都要在结尾处加 ";" 

1.2 节点属性格式

(1)Property格式2(没有值):

[label:] property-name;

(2)Property格式1:

[label:] property-name = value;

(3)Property取值有3种情况: 

① arrays of cells(1个或多个32位数据, 64位数据使用2个32位数据表示)

示例1:Arrays of cells : cell就是一个32位的数据

interrupts = <17 0xc>;

 示例2:64bit数据使用2个cell来表示:

clock-frequency = <0x00000001 0x00000000>;

② string(字符串)

示例:A null-terminated string (有结束符的字符串):

compatible = "simple-bus";

③ bytestring(1个或多个字节)

示例:A bytestring(字节序列) :

local-mac-address = [00 00 12 34 56 78];  // 每个byte使用2个16进制数来表示
local-mac-address = [000012345678];       // 每个byte使用2个16进制数来表示(空格可以省略)

[补充]: Property的取值还可以是各种值的组合(该用法不常见), 用逗号隔开:

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

1.3 设备节点的格式

Devicetree node格式:

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

1.4 特殊的、默认的属性 

(1)根结点的属性

#address-cells   // 在它的子节点的reg属性中, 使用多少个u32整数来描述地址(address)
#size-cells      // 在它的子节点的reg属性中, 使用多少个u32整数来描述大小(size)
compatible       // 定义一系列的字符串, 用来指定内核中哪个machine_desc可以支持本设备// 即这个板子兼容哪些平台 // uImage : smdk2410 smdk2440 mini2440     ==> machine_desc         model            // 咱这个板子是什么// 比如有2款板子配置基本一致, 它们的compatible是一样的// 那么就通过model来分辨这2款板子

[补充]: 关于 #address-cells 和 #size-cells

/ {model = "SMDK24440";compatible = "samsung,smdk2440";#address-cells = <1>;#size-cells = <1>;memory@30000000 {device_type = "memory";reg =  <0x30000000 0x4000000>;};
}

 由于#address-cells和#size-cells的值都为1,所以上述例子reg的值中0x30000000表示地址,而0x4000000就表示地址的长度。已知#address-cells和#size-cells,reg可以区分多组地址段:

/ {model = "SMDK24440";compatible = "samsung,smdk2440";#address-cells = <1>;#size-cells = <1>;memory@30000000 {device_type = "memory";reg =  <0x30000000 0x4000000 0 4096>;};
}

上述例子中的reg表示两组数据,第一组是地址为0x30000000,长度为0x4000000的地址段;而第二组数据是地址为0,长度为4096的地址段。

(2)/memory 结点

device_type = "memory";
reg             // 用来指定内存的地址、大小

(3)/chosen 结点

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

(4)/cpus 结点

/cpus节点下有1个或多个cpu子节点, cpu子节点中用reg属性用来标明自己是哪一个cpu
所以 /cpus 中有以下2个属性:

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

(5)/cpus/cpu* 结点(多个cpu中的每个cpu结点)

device_type = "cpu";
reg             // 表明自己是哪一个cpu

1.5 引用其他节点

(1)phandle : // 节点中的phandle属性, 它的取值必须是唯一的(不要跟其他的phandle值一样)

pic@10000000 {phandle = <1>;interrupt-controller;
};another-device-node {interrupt-parent = <1>;   // 使用phandle值为1来引用上述节点
};

(2)label:

PIC: pic@10000000 {interrupt-controller;
};another-device-node {interrupt-parent = <&PIC>;   // 使用label来引用上述节点, // 使用lable时实际上也是使用phandle来引用, // 在编译dts文件为dtb文件时, 编译器dtc会在dtb中插入phandle属性
};

1.6 dtsi 文件

        dtsi文件的格式和dts文件的格式一样,可以将公共的部分放到dtsi文件,并让dts文件包含该dtsi文件。在dts中包含dtsi文件的方法:

#include "jz2440.dtsi"

下面举两个dtsi文件相关的例子:

(1)示例1:覆盖结点

① 文件:jz2440.dtsi

/dtsi-v1/;/ {model = "SMDK24440";compatible = "samsung,smdk2440";#address-cells = <1>;#size-cells = <1>;memory@30000000 {device_type = "memory";reg =  <0x30000000 0x4000000>;};
/*cpus {cpu {compatible = "arm,arm926ej-s";};};
*/	chosen {bootargs = "noinitrd root=/dev/mtdblock4 rw init=/linuxrc console=ttySAC0,115200";};led {compatible = "jz2440_led";reg = <5>;};
};

② 文件:mytree.dts

/dts-v1/;#include "jz2440.dtsi"/ {led {reg = <6>;};
};

[说明]: 在mytree.dts中包含jz2440.dtsi文件,然后按照jz2440.dtsi中led的结点路径,重写led结点,并修改其reg属性为6。这样在最终编译生成的dtb文件中,led的reg属性就为6。也就是说在dts文件中可以覆盖dtsi文件的结点和属性。

(2)示例2:标签引用

① 文件:jz2440.dtsi

/dtsi-v1/;/ {model = "SMDK24440";compatible = "samsung,smdk2440";#address-cells = <1>;#size-cells = <1>;memory@30000000 {device_type = "memory";reg =  <0x30000000 0x4000000>;};
/*cpus {cpu {compatible = "arm,arm926ej-s";};};
*/	chosen {bootargs = "noinitrd root=/dev/mtdblock4 rw init=/linuxrc console=ttySAC0,115200";};LED: led {compatible = "jz2440_led";reg = <5>;};
};

 ② 文件:mytree.dts

/dts-v1/;#include "jz2440.dtsi"&LED {reg = <5>;
};

[说明]: 依旧让mytree.dts中包含jz2440.dtsi文件。但是这里通过led结点的标签LED来引用该结点,注意通过标签引用结点时不要从根路径开始写结点,否则会报错。

(3)dtc工具

  • dtc其实就是device-tree-compiler,也就是设备树文件dts的编译器。
  • dtc可以将dts和dtsi文件编译成dtb二进制文件,也可以将dtb文件反编译成dts文件。
  • dtc工具在Linux内核的scripts/dtc目录下,因此需要编译完内核源码后才会生成。

2 dtb 文件格式

2.1 dtb文件的布局 

             ------------------------------base -> |  struct boot_param_header  |------------------------------|      (alignment gap) (*)   |------------------------------|      memory reserve map    |------------------------------|      (alignment gap)       |------------------------------|                            ||    device-tree structure   ||                            |------------------------------|      (alignment gap)       |------------------------------|                            ||     device-tree strings    ||                            |-----> ------------------------------||--- (base + totalsize)

2.2 dtb二进制文件的分析

  

2.3 dtb文件采用大端存储模式

(1)大端存储模式和小端存储模式 

(2)补充

大端模式和小端模式是针对数值存储来说的,字符串存储则没有该规则。例如字符串"ab","b"总是存储在比"a"高的地址中。

2.4 查看二进制文件的工具

  • UltraEdit
  • Free-Hex-Editor-Neo

3 参考 

(1)官方文档: Specifications - DeviceTree

(2)内核文档1:  Documentation/devicetree/usage-model.txt

(3)内核文档2:  Documentation/devicetree/booting-without-of.txt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/76375.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GIS在地质灾害危险性评估与灾后重建中的应用教程

详情点击链接&#xff1a;GIS在地质灾害危险性评估与灾后重建中的实践技术应用 前言 地质灾害是指全球地壳自然地质演化过程中&#xff0c;由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。由于降水、地震等自然作用下&#xff0c;地质…

R-Meta分析教程

详情点击链接&#xff1a;R-Meta模型教程 一&#xff1a;Meta分析的选题与文献计量分析CiteSpace应用 1、Meta分析的选题与文献检索 1)什么是Meta分析&#xff1f; 2)Meta分析的选题策略 3)文献检索数据库 4)精确检索策略&#xff0c;如何检索全、检索准 5)文献的管理与…

5个免费PPT模板、素材网站,赶紧马住了~

推荐几个做PPT必备的免费素材网站&#xff0c;直接套用模板&#xff0c;赶紧收藏起来~ 菜鸟图库 ppt模板免费下载|ppt背景图片 - 菜鸟图库 菜鸟图库网有非常丰富的免费素材&#xff0c;像设计类、办公类、自媒体类等素材都很丰富。PPT模板种类很多&#xff0c;全部都统一做好…

Stable Diffusion教程(6) - 图片高清放大

放大后细节 修复图片损坏 显存占用 速度 批量放大 文生图放大 好 是 高 慢 否 附加功能放大 一般 否 中 快 是 图生图放大 好 是 低 慢 是 tile模型放大 非常好 是 高 快 是 通过文生图页面的高清修复 优点&#xff1a;放大时能添加更多细节&am…

AutoSAR系列讲解(实践篇)11.6-服务映射(自顶向下)

目录 一、配置Service Needs 二、配置Cfg同步 我们在下一节的实验课中讲解这里的具体配置流程,本节主要讲一下这些配置的大致流程和配置项的作用。NvBlockSwComponents是一个可选项, 我们这里开始不使用NvBlockSwComponents,将我们的Application SWC直接和NvM通过C/S连接起…

【Linux】权限

1、shell命令以及运行原理 Linux 严格意义上说的是一个操作系统&#xff0c;我们称之为“核心&#xff08;kernel&#xff09;“ &#xff0c;但我们一般用户&#xff0c;不能直接使用 kernel。而是通过 kernel 的“外壳”程序&#xff0c;也就是所谓的shell&#xff0c;来与 k…

SpringMVC视图

SpringMVC视图 视图的作用是渲染数据&#xff0c;将模型Model中的数据展示给客户&#xff0c;SpringMVC中视图的种类有很多&#xff0c;默认有转发视图(InternalResourceView)和重定向视图(RedirectView)。 当工程引入jstl的依赖&#xff0c;转发视图会自动跳转jstlView,若使用…

【Spring Cloud 六】Hystrix熔断

这里写目录标题 系列文章目录背景一、Hystrix是什么服务雪崩服务容错的相关概念熔断器降级超时控制限流 二、会什么要有Hystrix三、如何使用Hystrix进行熔断处理整体项目代码服务提供者pom文件yml配置文件启动类controller 服务消费者pom文件yml配置文件启动类feignhystrixcont…

js省市区下拉框联动——前端笔记

问题&#xff1a; 我们常常要用到下拉框联动的功能&#xff0c;比如最常用的是选择地址的 省 市 区 的联动。思路&#xff1a; 先填充第一个下拉框&#xff0c;然后写一个第一个下拉框的change事件来加载第二个下拉框&#xff0c;再写第二个下拉框的change事件来加载第三个下…

Jmeter远程服务模式运行时引用csv文件的路径配置

问题 在使用jmeter过程中&#xff0c;本机的内存等配置不足&#xff0c;启动较多的线程时&#xff0c;可以采用分布式运行。 在分布式运行的时候&#xff0c;jmeter会自动将脚本从master主机发送到remote主机上&#xff0c;所以不需要考虑将脚本拷贝到remote主机。但是jmeter…

Mr. Cappuccino的第55杯咖啡——Mybatis一级缓存二级缓存

Mybatis一级缓存&二级缓存 概述一级缓存特点演示前准备效果演示在同一个SqlSession中在不同的SqlSession中 源代码怎么禁止使用一级缓存一级缓存在什么情况下会被清除 二级缓存特点演示前准备效果演示在不同的SqlSession中 源代码怎么关闭二级缓存 一级缓存&#xff08;Spr…

抖音seo矩阵系统源码搭建开发详解

抖音SEO矩阵系统是一个用于提高抖音视频在搜索引擎排名的工具。如果你想开发自己的抖音SEO矩阵系统&#xff0c;以下是详细的步骤&#xff1a; 开发步骤详解&#xff1a; 确定你需要的功能和算法 抖音SEO矩阵系统包含很多功能&#xff0c;比如关键词研究、内容优化、链接建设、…

TypeScript【enum 枚举】

导语 在 TypeScript 中&#xff0c;新增了很多具有特性的一些数据类型处理方法&#xff0c;enum 【枚举】就是其中&#xff0c;很具有代表性的一种&#xff0c;所以本章节就来聊聊 在 TypeScript 中如何去运用 enum 【枚举】。 枚举的概念&#xff1a; 枚举&#xff08;Enum&am…

MySql UNION 一行转多列

背景:DataEase饼图有特定格式&#xff0c;并且报表要求全部使用SQL语句获取数据 原先数据格式如下&#xff0c;需要行转换列 转换后结果&#xff1a; 原理 字段1&#xff0c;target作为一个不存在的字段&#xff0c;用于命名。 字段2&#xff0c;count字段是关键&#xff0c;…

基于Java的中国文化传承网站系统的设计与实现(编号S65)

基于Java的中国文化传承网站系统的设计与实现&#xff08;编号S65&#xff09; 大家好&#xff0c;小辰今天给大家介绍一个基于Spring Springboot MyBatis实现的中国文化传承网站系统&#xff0c;演示视频文章末尾公众号对号查询观看即可 文章目录 基于Java的中国文化传承网站…

Dockerfile构建Tomcat镜像(源码)

Dockerfile构建Tomcat镜像 目录 Dockerfile构建Tomcat镜像 1、建立工作目录 2、编写Dockerfile文件 3、构建镜像 4、测试容器 5、浏览器访问测试&#xff1a; 1、建立工作目录 [roothuyang1 ~]# mkdir tomcat[roothuyang1 ~]# cd tomcat/[roothuyang1 tomcat]# lsapach…

架构训练营学习笔记:5-1 计算架构模式之多级缓存架构

序 本节主要是计算架构。 多级缓存架构 缓存与缓冲&#xff1a;通常场景是读缓存&#xff0c;写缓冲。 缓存技术的本质&#xff1a;空间换时间&#xff0c;因此缓存架构属于高性能计算 架构。 缓存设计框架 主要考虑存什么&#xff1f;存多久&#xff1f;存哪里&#xff1f;如…

初识网络(JavaEE初阶系列9)

目录 前言&#xff1a; 1.网络的发展史 1.1独立模式 1.2网络互联 1.3局域网LAN 1.4广域网WAN 2.网络通信基础 2.1IP地址 2.2端口号 3.认识协议 3.1协议分层 3.2分层的作用 3.3TCP/IP五层&#xff08;或四层&#xff09;模型 3.4OSI七层模型 3.5网络设备所在分层 …

【Elasticsearch】Elasticsearch快速入门,掌握这些刚刚好!(官网入门案例)

文章目录 1. 简介2. 相关概念3. 安装4. 集群状态查看5. 索引操作6. 文档操作7. 数据搜索数据准备搜索入门(match_all)条件搜索(match)组合搜索(bool)过滤搜索(filter)搜索聚合(aggs) 8. 参考资料 本文的主要功能是带领从0到1入门Elasticsearch的基础使用&#xff0c;重点是Elas…

springboot+vue农产品特产商城销售平台_50kf2 多商家

随着我国经济的高速发展与人们生活水平的日益提高&#xff0c;人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下&#xff0c;人们更趋向于足不出户解决生活上的问题&#xff0c;南阳特产销售平台展现了其蓬勃生命力和广阔的前景。与此同时&#xff0c;为解决…