热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

本节学习设备树的规范。使用设备树时,需要编写dts文件,然后使用dtc编译dts文件,生成dtb文件。所以本节分为两部分,

本节学习设备树的规范

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

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

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

DTS文件布局(layout):
/dts-v1/; // 表示DTS文件的版本
[memory reservations] // 保存的内存区域 格式为: /memreserve/

;
/ {[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. 尖括号括起来 ,例如<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 = ;
};

以之前写的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 = ;};
};

然后在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属性为,如果要修改为但是不想改变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 = ;};
};

将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属性被设置为了而不是


LABEL

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

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

LED: led {compatible = "jz2440_led";pin = ;
};

修改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 = ;
};

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

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

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


推荐阅读
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • 我用Tkinter制作了一个图形用户界面,有两个主按钮:“开始”和“停止”。请您就如何使用“停止”按钮终止“开始”按钮为以下代码调用的已运行功能提供建议 ... [详细]
  • 今天就跟大家聊聊有关怎么在Android应用中实现一个换肤功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根 ... [详细]
  • vb.net不用多线程如何同时运行两个过程?不用多线程?即使用多线程,也不会是“同时”执行,题主只要略懂一些计算机编译原理就能明白了。不用多线程更不可能让两个过程同步执行了。不过可 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • android 触屏处理流程,android触摸事件处理流程 ? FOOKWOOD「建议收藏」
    android触屏处理流程,android触摸事件处理流程?FOOKWOOD「建议收藏」最近在工作中,经常需要处理触摸事件,但是有时候会出现一些奇怪的bug,比如有时候会检测不到A ... [详细]
author-avatar
edftgggh_131
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有