什么是DTS?什么是快乐星球?
DTS学习
- DTS介绍
- 目的和范围
- DTS和 IEEE™ 1275、ePAPR的关系
- 名词解释
- 语法及使用
- 1.概述
- 2.设备数结构和约定
- 3.中端及中断映射
- 4.设备节点需求
- 5.绑定设备指南
- 6.设备树平台格式
- 7.设备树源码格式
- 总结
DTS介绍
DTS github:http://devicetree.org/Device_Tree_Usage
翻译版本:devicetree-specification-v0.2.pdf
"Open Firmware Device Tree"或者简单设备树,是一种描述硬件的一种数据结构和语言。特别的是,使用DTS描述操作系统只读的硬件信息,因此操作系统中不需要硬编码描述设备信息。
结构上,DT是一种树形结构,以node组成的非循环的图。每一个node都有多个属性和属性值。机制确保一个node和其他node任意的关联。
目的和范围
- 固定的I/O设备,高度定制的应用软件
- 系统硬件基于大小和成本进行优化
- 有限的用户交互
- 有限的资源,如有限的内存和有限的存储空间
- 实时性要求
- 广泛的操作系统,如linux、实时操作系统、定做或私有的操作系统
DTS和 IEEE™ 1275、ePAPR的关系
- Plug-in device drivers (可插入设备驱动)
- FCode(基于栈的可扩充标记语言;WiKi:https://www.openbios.info/Forth/FCode)
- The programmable Open Firmware user interface based on Forth
- FCode debugging(FCode代码调试)
- Operating system debugging(操作系统调试)
IEEE-1275 被保留的是利用设备数,在启动程序中描述和与传递系统硬件信息给客户程序。如此,排除了客户程序中对系统硬件的硬编码描述。
DTS规范部分接替了 ePAPR [EPAPR] 规范。ePAPR 文档描述了怎么通过 PowerISA使用设备树,以及覆盖了DTS规范的基础章节和bindings部分。
名词解释
语法及使用
1.概述
DTS规范详述一个描述系统硬件的规范。启动程序加载设备数信息到客户端程序的内存地址中并传递执行设备数信息的地址给客户端程序。
设备树是一个树形数据结构。每一个节点都有多个键值对(name-value),除了root节点,其他节点都有一个确定的父节点。
一个服从DTS规范的设备树描述的设备信息一定不可以被客户端程序动态检测到。例如:PCI总线探查和检测一个关联的设备,这不需要设备数描述;但是,一个PCI host bridge必须被描述为一个设备节点。
下图 是一个简单的足以启动一个简单的操作系统的设备树:
2.设备数结构和约定
1、节点定义
一个设备树节点定义方式:
node-name@unit-address
- 1
node-name指定一个节点的名称,有1到31个字符组成。可用字符如下:
名称必须以一个小写或大写的字符开头。
unit-address指定在总线类型的位置,包含一个或多个上表中的ASCII字符。如果描述的节点有reg属性值,unit-address必须是reg的第一个地址;如果没有reg属性,unit-address可以被忽略,禁用名称区别设备数同一层的其他节点。根节点没有名称和地址。节点例子如下:
节点名称应当通用,能直接反应设备功能。在规范中已定义了一些通用节点,可参考使用。
2、节点路径
设备数的每一个节点,基于根节点的路径,这设备树中是唯一的。比如
/node-name-1/node-name-2/node-name-N
- 1
如果节点的单元地址被忽略了,节点路径是不明确的。这种路径传递给客户端程序,客户端程序的行为是不确定的。
3、属性
每一个节点有多个属性描述节点特性。属性有属性名称和属性值组成。
属性名称由下表中1-31个字符组成
非标准属性名称,应该有一个唯一的前缀,前缀可以是公司、组织等的简称,如:
fsl,channel-fifo-len
ibm,ppc-interrupt-server#s
linux,network-index
- 1
- 2
- 3
前缀和名称用逗号隔开。
属性值是一个有0个或多个字节的信息。如果属性值是empty,该属性仅传送true-false信息,这种情况,值是否为empty,都足以描述属性了。下表是常用的属性值集合:
4、标准属性
节点描述,可以便准和非标准属性额外声明节点需求和约束条件。
compatible
Value type:
描述:指定设备程序模块。用于在客户端程序为设备选择对应的驱动。该属性值是一个非null终止的字符串集,描述等级从最匹配到通用,描述设备使用驱动从匹配到相似匹配,因此可以存在一个驱动匹配多个设备。
属性值格式"manufacturer,model",manufacturer描述设备制造商,model描述设备型号。例如:
compatible = "fsl,mpc8641", "ns16550";
- 1
在该例中,如果ns16550的驱动找不到,就会使用ns16550的驱动。
model
Value type:
描述:说明设备制造商制造该设备的设备型号。使用方式同属性compatible。
phandle
Value type:
描述:定义节点的设备树中唯一的数字标识。在另外一个节点中使用该数字标识,指向该节点。
例如:
pic@10000000 { phandle = <1>; interrupt-controller;
};
- 1
- 2
- 3
一个phandle值被定义,另外一个节点使用该节点
nother-device-node { interrupt-parent = <1>;
};
- 1
- 2
- 3
注意: 很多DTS中将不再清楚明描述phandle属性。DTC工具在编译时,会自动的添加phandle到DTB中。
device_type(deprecated)
Value type:
描述:该属性实在 IEEE 1275中使用,描述设备的FCode程序模型。由于DTS没有FCode,因此该属性不推荐使用。该属性仅仅被使用在cpu、memory节点使用 IEEE 1275–derived 描述的设备树中。
在这里仅列出几个常用的标准属性,其他属性可以在DTS的github中下载文档,自行查询。
3.中端及中断映射
1、概述
DTS在Open Firmware Recommended Practice采用中断树描述中断。在设备树中存在一个逻辑上的中断树,代表层级和硬件层面的中断路由。
物理连接中断源和中断控制器,在设备树中使用interrupt-parent代表。代表中断产生设备的节点需要有interrupt-parent属性,该属性值指向一个phandle值,一般phandle的设备是一个中断控制器。如果一个中断产生设备没有interrupt-parent属性,它的interrupt-parent默认是父设备树。
每一个设备产生设备节点,都会有一个中断属性描述一个或多个中断源,每一个中断源是一个interrupt specifier(中断说明)。每一个中断说明是一个中断域说明,依赖根下的中断域节点,在中断域节点中包含interrupt-cells属性,是一个的值,代表一个中断说明。例如,一个开放的PCI中断控制器,一个中断说明有两个32-bit的值,组成中断号和leve/sense信息。
一个中断域是中断的上下文,在中断域中一个中断被解释执行。一个中断域是一个中断控制器或者一个中断连接。
- 一个中断控制器是物理设备,需要驱动处理中断。中断控制器也可能关联另外一个中断域。被定义为中断控制器,在节点中使用interrupt-controller属性。
- 一个中断连接定义了两个中断域间中断的转移。中断转移基于域说明和总线说明信息。中断转移被执行使用interrupt-map属性说明。例如:一个PCI中断控制器设备节点定义一个中断转移,使用中断号从PCI中断空间(INTA、INTB,等)转移到中断控制器。当遍历整个中断树,到达一个没有中断属性的中断控制器,这时中断树根处理,如此就没有明确的父中断(这句不是很理解,存疑)。
下图展示设备树中父中断关系的图,同时展示了设备数及设备节点在逻辑中断树中的位置。
在例子中,展示信息如下:
- Open-pic中断控制器是中断树的根
- 中断树根有3个子设备,路由子设备的中断直接到open-pic
- device1
- PCI host controller
- GPIO Controller
- 有三个中断域:open-pic、PCI host brigde、GPIO Controller
- 两个中断连接:PCI host brigde、GPIO Controller
2、常用中断属性简单说明
interrupts
Value-type:
描述:中断产生设备中的一个或多个中断描述。属性值包含多个中断说明的一个任意数字。中断说明的格式由绑定的中断域定义。
例如:一个开放的PIC中断域的中断说明包含两个数据单元,一个中断号和level/sense信息。如下值
interrupts = <0xA 8>;
- 1
interrupt-parent
值类型:
描述:由于中断树的层级和设备树层级不相同,因此该属性明确中断的父中断。如果一个中断设备中没有该属性,则默认父中断为父设备树。
interrupt-controller
值类型:
描述:定义一个设备节点是一个中断控制器
#interrupt-cells
值类型:
描述:定义一个中断域需要中断说明中由几个数据单元。
interrupt-map
值类型:
描述:(比较复杂,不做说明)
3、中断部分总结
中断产生设备使用属性:interrupts、interrupt-parent、interrupts-extended
中断控制器设备使用属性:#interrupt-cells、interrupt-controller
中断连接使用属性:#interrupt-cells、interrupt-map、interrupt-map-mask
4.设备节点需求
1、基本设备节点
cpu、memory
2、根节点
根节点是/,需要由的属性如下:
3、节点别名
在根节点下使用aliases节点定义,别名名称有效字符如下:
例如:
aliases { serial0 = "/simple-bus@fe000000/serial@llc500"; ethernet0 = "/simple-bus@fe000000/ethernet@31c000";
};
- 1
- 2
- 3
- 4
4、memory节点
不说明,有兴趣的自行看官方文档
5、chosen节点
该节点不代表真实设备,仅描述系统固件运行时需要的参数。必须是根节点的子节点。属性如下:
例如:
chosen { bootargs = "root=/dev/nfs rw nfsroot=192.168.1.1 console=ttyS0,115200";
};
- 1
- 2
- 3
该节点比较重要,一般嵌入式开发,解决方案会单独把该节点拉出来成一个单独文件,在文件中描述更多参数,如内核log打印等级、分区信息等。
6.cpu节点
不说明,有兴趣的自行看官方文档。比较重要,建议详细了解
5.绑定设备指南
1、概述
当在设备树中添加一个设备节点时,对应的描述和属性和值被充分添加,这些属性和描述被传递到设备驱动中。
一些推荐练习如下:
- 使用约定描述定义一个可兼容的字符串。具体参考标准属性中的model及compatible。
- 使用标准属性应用到新添加设备,如reg、interrupts
- 使用指定的约定在设备上
- 使用杂项属性
- 使用非标准属性
3、4练习,在此处下面的内容中介绍
2、杂项属性
一些被多中类型设备使用的属性。
如:clock-frequency
其他属性不在此处详细说明。
6.设备树平台格式
DTB(Devicetree Blob)是平台二进制编码的设备树数据。被用来在软件程序间交换设备树数据。例如:当启动操作系统时,固件会传递DTB给kernel。
DTB设备树数据使用一个单一的、线性的、无指针的数据结构。包含一个小的头(header)、三个可变长度区域:内存预留块、结构数据块、字符串块。设备树作为一个整体,按照地址被加载进内存,像一个图表。
其余内容详见官网文档。
7.设备树源码格式
DTS是一个文本表示的文件,被dtc编译器编译为kernel中要使用二进制设备树。
其他的源码文件可以被DTS文件包含,被包含的源码文件后缀名应为”.dtsi“,被包含的文件也可以包含其他文件。
Labels
dts源码中支持一个标签和任何一个节点或者属性值关联。node中Phandle和路径引用可以使用标签代替明确指定,在编译时被自动集成进设备树。标签仅被使用在设备树源码中,不会在二进制设备树DTB中使用。
在标签名后面增加“:”,标签被创建;在标签名前加一个“&”,应用被创建。标签名可用字符,如下
节点使用标签
[label:] node-name[@unit-address] { [properties definitions] [child nodes]};
- 1
- 2
- 3
- 4
如果节点中包含子节点,节点的属性在子节点前定义。
之前定义的节点可能被删除
/delete-node/ node-name;
/delete-node/ &label;
- 1
- 2
定义一个属性-值对
[label:] property-name = value;
- 1
如果属性值为empty
[label:] property-name;
- 1
之前已定义的属性可能被删除
/delete-property/ property-name;
- 1
属性值可能是一个32位整形数组、null终止的字符串、多字节字符串或这些形式的组合。
- 数组定义。使用尖括号包住数组内容,数组元素间空格分隔。
- 值或许是一个表达式,运算符如下:
- 一个64位值用两个32位表示,简单拼接即可
clock-frequency = <0x00000001 0x00000000>;
- 1
- 一个null作为终结的字符串,用双引号
compatible = "simple-bus";
- 1
- 多字节字符串用[]括起来
local-mac-address = [00 00 12 34 56 78];
- 1
或等价于
local-mac-address = [000012345678];
- 1
一个属性或许有多个值,值之间用‘,’隔开
compatible = "ns16550", "ns8250";
example = <0xf00f0000 19>, "a strange property format";
- 1
- 2
- 在一个元数据数组中,扩展使用其他节点phandle,使用&lable引用
interrupt-parent = < &mpic >;
- 1
或者使用&node_full_path
interrupt-parent = < &{/soc/interrupt-controller@40000} >;
- 1
- 在元数据数组之外,引用另外一个节点将会被展开为那个节点的完整路径,如
ethernet0 = &EMAC0;
- 1
- 标签可能出现在任何属性值之前或之后,或者元数据之间,或者多字节字符串之间,如
reg = reglabel: <0 sizelabel: 0x1000000>;
prop = [ab cd ef byte4: 00 ff fe];
str = start: "string value" end: ;
- 1
- 2
- 3
文件布局
DTS完整布局如下
/dts-v1/;
[memory reservations] / {[property definitions] [child nodes]};
- 1
- 2
- 3
- 4
- 5
- 6
/dts-v1/:dts文件标识,作为一个版本号。
预留内存定义一个二级制设备树预留内存表。dts源码中dts格式为:
/memreserve/ <address> <length>;
- 1
其中地址和长度均是64为C风格整型。
- /{}; 设备树的根节点块
- C风格(/…/)和C++风格(//)注释都支持
总结
DTS源文件编写格式算是有了一个清晰的框架,之际编写内容的,在使用中可以根据规范查找。DTS支持自定义扩展标记,因此可以结合驱动了解使用方式。
什么是DTS?什么是快乐星球?相关推荐
- 计算机课还无聊吗,《快乐星球Ⅴ》电脑课还可以这样?
第八章[电脑课还可以这样?] 陌菱的叫声成功吸引了所有人的目光,于是,安静的教室瞬间炸开了锅!防火墙(王梦璇)和棒棒(张弛)对视了一眼,突然变得严肃了很多. 看到大家的目光,首领干咳了两声,教室里一下 ...
- 快乐星球计算机老师,《快乐星球Ⅴ》新电脑老师(下)
第六章[新电脑老师下] 张陌菱家中 张陌菱回到家中,习惯性地走到饭桌旁,拿起爸妈留下的100元钱,走进房间,打开电脑,开始搜索快乐星球中首领的扮演者的名字.最后的搜索结果显示--祝翔. "那 ...
- 快乐星球计算机老师,《快乐星球Ⅴ》新电脑老师(上)
第五章[新电脑老师上] 超市门口 "好香啊!"叶小艾闻了闻说:"我们到哪里去吃啊?" "那里吧!"张陌菱指了指路边上的石凳说道. 叶小艾看了 ...
- 打工人的快乐星球,还存在吗?
大家好,我是千与千寻,昨天是五一劳动节的假期第一天,不会还有人在工作吧,不会吧不会吧,好吧,是我. 最近正在整理节后假期结束后,要发的技术文章,包含基础的机器学习算法,以及后端开发方向的基础知识,同时 ...
- Pytorch Note 快乐星球
Pytorch Note 什么是快乐星球,让我用简单易懂的代码带你进入pytorch快乐星球 这是我的Pytoch学习笔记,下面会慢慢的更新我的学习笔记 part1: 深度学习基础 PyTorch介绍 ...
- 机票盲盒,能带你去“快乐星球”吗?
机票盲盒,能带你去"快乐星球"吗? 出品 l 观点财经 作者 l 亚瑟 "盲盒经济"持续火热,但藏在盲盒里的不只有潮玩,还可能是一段未知的旅程. 今年4月,多家 ...
- 什么是快乐星球?让我带你研究研究!
"什么是快乐星球?什么是快乐星球?" 最近,许多人都被这段魔性的BGM给刷屏了.在各种视频的背景音乐里,不断循环响起: "什么是快乐星球?什么是快乐星球?" & ...
- 快乐星球计算机老师007,这10大专业是真的累,第一名007是常事儿
原标题:这10大专业是真的累,第一名007是常事儿 最近22的同学们应该要重点放在择校择专业方面了吧,小班长也准备以后给大家多推送一些类似的内容,作为开篇呢,今天准备先给大家推送一些轻松娱乐的内容,仅 ...
- 星之卡比机器人汉化_星之卡比:机械星球
星之卡比:机械星球是星之卡比系列的全新作品,在本作中,我们的主人公卡比将会具有各种不同的变身能力,每种变身能力都有着各自的实用效果,精美的画质以及全新的冒险内容是本作的一大亮点,更是给游戏带来了诸多乐 ...
最新文章
- FIlterInputStream和FilterOutputStream
- inotify-tools使用方法介绍
- mysql数据库 集群_mysql数据库集群
- 电商活动难么多,不怕一个电商素材网站解救你,赶紧收藏
- 无需公式或代码,用生活实例谈谈 AI 自动控制技术“强化学习”算法框架
- numpy数组及处理:效率对比
- C语言实现扫雷游戏完整代码
- [maven] Maven面试宝典
- 再探阿里的“数据+业务”双中台架构
- Android 10.0 Launcher3 抽屉式(双层)app列表排序
- LabVIEW编程LabVIEW开发 CRC16-CCITT- False校验 表例程与相关资料
- 阴影(shadow mapping)(硬阴影)
- 基于单片机的六足机器人控制系统设计【100010379】
- 蘑菇云「行空板Python入门教程」第十课:多节点智慧农业系统
- STM32简易多级菜单(数组查表法)
- 千鸟弹幕机器人_千鸟熊猫TV直播弹幕机器人软件2.83
- 测试计划包括哪些主要步骤和信息?
- 0xc00000f怎么解决 0xc00000f错误代码解决方法[多图]
- 字符串两边指定字符删除
- 学术论文撰写注意事项