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

摘要:
第01_节DTS格式(1)语法:Devicetreenode格式:[label:]节点名称[@unit address]{[propertiesdefinitions]属性,请参阅下面的属性[childnodes]节点}了解格式;属性格式1:[标签:]属性名称=值;属性格式2(无值):[标签:]

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

第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 of cells(1个或多个32位数据, 64位数据使用2个32位数据表示), 使用<>扩起来的
string(字符串),  使用双引号扩起来
bytestring(1个或多个字节) ,使用[]括起来的,16进制表示的  

示例:
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)
compatible // 定义一系列的字符串, 用来指定内核中哪个machine_desc可以支持本设备,eg:compatible = “samsung,smdk2440”,"samsung,s3c24xx"   这种情况,优先比较第一个“samsung,smdk2440”
      // 即这个板子兼容哪些平台
      // uImage : smdk2410 smdk2440 mini2440 ==> machine_desc

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

b. /memory
device_type = "memory";
reg // 用来指定内存的地址、大小,里面的值可以是<起始地址1   长度1   起始地址2    长度2>

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

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

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

pic@10000000 {
phandle = <1>;
interrupt-controller;        中断控制器
};

another-device-node {
interrupt-parent = <1>; // 使用phandle值为1来引用上述节点    表示该节点产生的中断传给那个中断控制器
};

b. label:

PIC: pic@10000000 {
interrupt-controller;
};

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


官方文档:
https://www.devicetree.org/specifications/

第02节_DTB格式
官方文档:
https://www.devicetree.org/specifications/

内核文档:
Documentation/devicetree/booting-without-of.txt

DTB文件布局:(内存中存储格式是大端)
------------------------------
base -> | struct boot_param_header |
------------------------------
| (alignment gap) (*) |
------------------------------
| memory reserve map |
------------------------------
| (alignment gap) |
------------------------------
| |
| device-tree structure |
| |
------------------------------
| (alignment gap) |
------------------------------
| |
| device-tree strings |
| |
-----> ------------------------------
|
|
--- (base + totalsize)

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

免责声明:文章转载自《2、设备树的规范(dts和dtb格式)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇insert时出现主键冲突的处理方法【转载】springboot 整合websocket实现消息推送(nginx、vue)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

编译和反编译设备树

如何单独编译设备树? cd linux-x.xx make dtbs 生成的dtb位置在:out/target/product/AM809/obj/KERNEL_OBJ/arch/arm/boot/dts/AM809_msm8909-1gb-qrd-skue.dtb 生成的dtc位置在:out/target/product/AM809/obj/KERNE...

原创-阿里云DTS双向同步,反向同步失败案例

近期有需求,从自建ECS数据库迁移至RDS,因担心有迁移失败的风险,选择了DTS双向同步做迁移。 正向同步:源同步数据至目标。 反向同步:目标同步至源。需在正向同步完成后配置,确保目标已经有源的所有数据,切换至目标后反向同步就可以把新数据迁移回源。 刚开始很正常,所有数据均同步至RDS直到将入口切换至RDS之后,反向同步开始报错:  查看报错原因 DTS...

SQL SERVER的DTS功能

我用DTS把SQLSERVER的数据库和ACCESS数据库上载到AS/400的PF中,非常方便,速度也比较快,上万条记录不到一分钟就上载完了,汉字也没问题. 大多数组织都使用多种格式和多个位置来存储数据。为了支持决策、改善系统性能或对现有系统进行升级,经常必须将数据从一个数据存储位置移动到另一个存储位置。。这样,我们需要一套数据转换的工具,来完成这不同平台...

计算视频播放的时间(pts)

http://yejun8500.blog.163.com/blog/static/463360020095298410979/ 在解码视频流的时候对每一个视频帧都会有一个时间戳pts(显示时间戳),得到这个pts的值,并记下最开始的一个pts值(pts_00),以后画面显示的时间就可以用当前播放的帧的时间戳(pts_now -pts_00)/90000获...

支付宝 分布式事务服务 DTS三-copy

典型场景和实现原理首先来看一个典型的分布式事务场景 在这个例子中,app1 作为分布式事务的发起方调用了参与者 app2 的 insert 操作和 app3 的 update 操作,之后调用自己的本地 insert 操作,在这个分布式事务中包含了 3 次对 db 的操作,而 3 个 db 分属于不同的系统,图中虚线覆盖的范围是 app1 的一个本地事务模版...

嵌入式Linux学习笔记(四) 设备树和UART驱动开发

目录 (1).参考资料 (2).Uart硬件配置 (3).设备树的说明和修改 (4).测试代码     通过完成LED的驱动,我们熟悉了驱动编写的大致结构框架,然而在实际开发中,嵌入式Linux和普通单片机最大的不同就是提供大量的代码,满足大部分的应用需求,如本节中,我们使用的UART驱动已经被集成到内核。不过通过对底层驱动更高级的抽象,使用设备树实现了底...