本页介绍了如何为新机器编写设备树。 它旨在提供设备树概念的概述以及它们如何用于描述机器。

有关设备树数据格式的完整技术说明,请参阅ePAPR v1.1规范。 ePAPR规范涵盖了比本页面涵盖的基本主题更多的细节,请参阅此页面以获取本页面未涵盖的更高级用法。 ePAPR目前正在使用Devicetree规范文档的新名称进行更新。

1 基本数据格式

设备树是节点和属性的简单树形结构。 属性是键值对,节点可能包含属性和子节点。 例如,以下是.dts格式的简单树:

/dts-v1/;/ {node1 {a-string-property = "A string";a-string-list-property = "first string", "second string";// hex is implied in byte arrays. no '0x' prefix is requireda-byte-data-property = [01 23 34 56];child-node1 {first-child-property;second-child-property = <1>;a-string-property = "Hello, world";};child-node2 {};};node2 {an-empty-property;a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */child-node1 {};};
};

这棵树显然没用,因为它没有描述任何东西,但它确实显示了节点和属性的结构。含有:

  • 单个根节点:“/”
  • 一对子节点:“node1”和“node2”
  • node1 的几个孩子:“child-node1”和“child-node2”
  • 一堆散落在树上的属性。

属性是简单的键值对,其值可以是空的或包含任意字节流。虽然数据类型不会编码到数据结构中,但有一些基本数据表示可以在设备树源文件中表示。

  • 文本字符串(空终止)用双引号表示:
string-property = "a string";
  • 'Cells'是由尖括号分隔的32位无符号整数:
cell-property = <0xbeef 123 0xabcd1234>;
  • 二进制数据用方括号分隔:
binary-property = [0x01 0x23 0x45 0x67];
  • 不同表示的数据可以使用逗号连接在一起:
mixed-property = "a string", [0x01 0x23 0x45 0x67], <0x12345678>;
  • 逗号也用于创建字符串列表:
string-list = "red fish", "blue fish";

2 基本概念

要了解如何使用设备树,我们将从一个简单的机器开始,并构建一个设备树来逐步描述它。

2.1 样机

考虑下面的虚拟机器(松散地基于ARM Versatile),由“Acme”制造并命名为“Coyote's Revenge”:

  • 一个32位ARM CPU
  • 处理器本地总线连接到内存映射串行端口,spi总线控制器,i2c控制器,中断控制器和外部总线桥
  • 基于0的256MB SDRAM
  • 2个串口,基于0x101F1000和0x101F2000
  • GPIO控制器基于0x101F3000
  • 基于0x10170000的SPI控制器和以下设备
  • 带SS引脚连接到GPIO#1的MMC插槽
  • 带以下设备的外部总线桥
  • SMC SMC91111以太网设备连接到基于0x10100000的外部总线
  • 基于0x10160000的i2c控制器和以下设备
  • Maxim DS1338实时时钟。 响应从机地址1101000(0x58)
  • 基于0x30000000的64MB NOR闪存

2.2 初始结构

第一步是为机器铺设一个骨架结构。 这是有效设备树所需的最低限度结构。 在这个阶段,你想唯一标识机器。

/dts-v1/;/ {compatible = "acme,coyotes-revenge";
};

compatible指定系统的名称。 它包含一个字符串,格式为“<制造商>,<模型>“。指定确切的设备并包含制造商名称以避免命名空间冲突很重要。由于操作系统将使用兼容值来决定如何在机器上运行,将正确的数据放入此属性非常重要。

从理论上说,兼容性是OS需要唯一标识一台机器的所有数据。 如果所有的机器细节都是硬编码的,那么操作系统可以专门针对顶级兼容属性中的“acme,coyotes-reveng”。

2.3 CPU

下一步是描述每个CPU。 添加一个“cpus”的容器节点,其中包含每个CPU子节点。 在本例里,该系统是ARM的双核Cortex A9系统。

/dts-v1/;/ {compatible = "acme,coyotes-revenge";cpus {cpu@0 {compatible = "arm,cortex-a9";};cpu@1 {compatible = "arm,cortex-a9";};};
};

每个cpu节点中的兼容属性是一个字符串,它以<manufacturer>,<model>的形式指定确切的cpu模型,就像顶层的兼容属性一样。

稍后将向cpu节点添加更多属性,但我们首先需要讨论更多基本概念。

2.4 节点名称

值得花点时间谈谈命名约定。 每个节点都必须具有 <name> [@ <unit-address>] 形式的名称。

<name>是一个简单的ascii字符串,最长可达31个字符。 通常,节点根据它代表的设备类型命名。例如,一个3com以太网适配器的节点将使用 ethernet 名称,而不是3com509。

如果节点描述具有地址的设备,则包括单元地址。 通常,单元地址是用于访问设备的主要地址,并列在节点的reg属性中。 我们将在后续博文介绍reg属性。

同级节点必须是唯一命名的,但只要地址不同(即serial @ 101f1000和serial @ 101f2000),多个节点是可以使用相同名称的。

有关节点命名的完整详细信息,请参阅ePAPR规范的第2.2.1节。

2.5 设备

系统中的每个设备都由设备树节点表示。 下一步是使用每个设备的节点填充树。 现在,新节点将保持为空,直到我们可以讨论如何处理地址范围和irq。

/dts-v1/;/ {compatible = "acme,coyotes-revenge";cpus {cpu@0 {compatible = "arm,cortex-a9";};cpu@1 {compatible = "arm,cortex-a9";};};serial@101F0000 {compatible = "arm,pl011";};serial@101F2000 {compatible = "arm,pl011";};gpio@101F3000 {compatible = "arm,pl061";};interrupt-controller@10140000 {compatible = "arm,pl190";};spi@10115000 {compatible = "arm,pl022";};external-bus {ethernet@0,0 {compatible = "smc,smc91c111";};i2c@1,0 {compatible = "acme,a1234-i2c-bus";rtc@58 {compatible = "maxim,ds1338";};};flash@2,0 {compatible = "samsung,k8f1315ebm", "cfi-flash";};};
};

在此树中,已为系统中的每个设备添加了一个节点,层次结构反映了设备连接到系统的方式。即外部总线上的设备是外部总线节点的子设备,i2c设备是i2c总线控制器节点的子设备。 通常,层次结构从CPU的角度表示系统的视图。

此树在此时无效。 它缺少有关设备之间连接的信息。 该数据将在稍后添加。

在这棵树中要注意的一些事情:

  • 每个设备节点都具有 compatible  的属性。
  • flash节点在兼容属性中有2个字符串。 请继续阅读下一节以了解原因。
  • 如前所述,节点名称反映了设备的类型,而不是特定的模型。 有关应尽可能使用的已定义通用节点名称列表,请参阅ePAPR规范的第2.2.2节。

2.6 了解兼容的属性

树中表示设备的每个节点都需要具有 compatible 属性。compatible 是操作系统用来决定绑定到设备的设备驱动程序的关键。

compatible 是一个字符串列表。列表中的第一个字符串指定节点以 "<manufacturer>,<model>" 形式表示的确切设备。以下字符串表示设备兼容的其他设备。

例如,飞思卡尔MPC8349片上系统(SoC)具有串行器件,该器件实现了美国国家半导体 ns16550寄存器接口。因此,MPC8349串行设备的兼容属性应为: compatible = "fsl,mpc8349-uart", "ns16550"。在这种情况下,fsl,mpc8349-uart 指定确切的器件,ns16550 声明它与美国国家半导体 16550 UART寄存器级兼容。

注意:ns16550 纯粹由于历史原因没有制造商前缀。所有新的兼容值都应使用制造商前缀。

这种做法允许将现有设备驱动程序绑定到较新的设备,同时仍然唯一地标识确切的硬件。

警告:不要使用通配符兼容值,例如“fsl,mpc83xx-uart”或类似值。硅供应商总是会做出改变,在改变它的时候为时已晚,打破了你的通配符假设。相反,选择特定的硅实现并使所有后续芯片与之兼容。

原文:https://elinux.org/Device_Tree_Usage

其他关于设备树的教程:

[1] A Tutorial on the Device Tree (Zynq) -- Part I ,http://xillybus.com/tutorials/device-tree-zynq-1

[2] A Tutorial on the Device Tree (Zynq) -- Part II,http://xillybus.com/tutorials/device-tree-zynq-2

[3] A Tutorial on the Device Tree (Zynq) -- Part III,http://xillybus.com/tutorials/device-tree-zynq-3

[4] A Tutorial on the Device Tree (Zynq) -- Part IV,http://xillybus.com/tutorials/device-tree-zynq-4

[5] A Tutorial on the Device Tree (Zynq) -- Part V,http://xillybus.com/tutorials/device-tree-zynq-5

【设备树使用】-- 1 基础概念相关推荐

  1. linux设备树笔记__dts基本概念及语法

    设备树手册(Device Tree Usage)原文地址:http://www.devicetree.org/Device_Tree_Usage 有关device tree数据格式的更完整技术说明,读 ...

  2. 设备树基本语法及属性分析

    一:什么是设备树 设备树(Device Tree)是一种描述硬件的数据结构,是结构化的语言,有点像C语言的结构体.在操作系统引导启动阶段进行设备初始化的时候,设备树中描述硬件的信息被检测到并传递给操作 ...

  3. linux设备树笔记__基于msm8x10的基本分析

    由文章,linux设备树笔记__dts基本概念及语法,我们知道了基本概念,知道了大概的设备树节点及其属性,而节点下的属性大多是自定义,除了保留的几个属性,大多从.dts是无法知道其用途的,这个就需要看 ...

  4. linux 驱动之设备树基础概念

    Table of Contents 一.设备节点 1.1.节点命名方式 1.2.aliases 节点 1.3.memory节点 1.4.chosen 节点 二.节点内的属性 1.属性值格式 2.1.1 ...

  5. linux 设备树dts基础

    ​ ​ 活动地址:CSDN21天学习挑战赛 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩:迟一天就多一天平庸的困扰.各位小伙伴,如果您: 想系统/深入学习某技术知识点- 一个人摸索学习很难坚持 ...

  6. [21天学习挑战赛——内核笔记](二)——设备树基础

    ​ ​ 活动地址:CSDN21天学习挑战赛 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩:迟一天就多一天平庸的困扰.各位小伙伴,如果您: 想系统/深入学习某技术知识点- 一个人摸索学习很难坚持 ...

  7. 【Linux开发】linux设备驱动归纳总结(一):内核的相关基础概念

    linux设备驱动归纳总结(一):内核的相关基础概念 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  8. 奇小葩讲设备树(1/5)-- Linux设备树详解(一) 基础知识

    关于设备树,之前就经过详细的系统培训,但是本着会用就行的原则,对各个知识点都没有进行系统的总结.都是用到哪里学哪里,时间长了,基本也忘记了.所以对于后期知识各个知识点进行总结,本章主要讨论一下内容,能 ...

  9. linux驱动内核哪个文件夹,linux设备驱动归纳总结(一):内核的相关基础概念...

    linux设备驱动归纳总结(一):内核的相关基础概念 1. 内核与 linux 设备驱动的作用与关系 内核:用于管理软硬件资源,并提供运行环境.如分配 4G 虚拟空间等. linux 设备驱动:是连接 ...

最新文章

  1. java实现最长连续子序列_最长公共子序列/最长公共子串 Python/Java实现
  2. ai的弹窗点了都不响应_【评价集合】拼多多评价,你所不知道的点都在这里!...
  3. android+内存清理+代码,最新版本:Android一键式清理,内存清理功能的实现
  4. 95-190-544-源码-window-清除器(Evictors)-DeltaEvitor简介
  5. Qt中鼠标事件捕获与Qt对象事件过滤
  6. edgewin10无法安装_Win10系统下卸载Edge浏览器后无法重装
  7. BurpSuite 1.6~2.x版本汉化版工具
  8. AI智能语音系统,智能语音机器人详解
  9. 职业规划路线(研究生阶段)
  10. 技嘉显卡性能测试软件,显卡性能与超频:性能高于公版,超频潜力可圈可点
  11. 项目实训--Unity多人游戏开发(九、PUN2学习记录)
  12. linux QT 结束当前进程_Qt与Web混合开发(一)--简单使用
  13. 卸载系统的dhcp服务器,dhcp服务器释放ip地址
  14. aws mediatailor运行原理图
  15. 全国计算机等级一级b真题,2011年3月全国计算机等级考试一级B真题及参考答案.doc...
  16. Git 学习笔记 ignore 忽略文件
  17. 校园智能储物柜方案开发
  18. 双栈完全解决计算器问题
  19. 【SHOI 2002】百事世界杯之旅
  20. 一个诗人的一生——诗人小G的人生

热门文章

  1. PMP12月-3月份群习题汇总
  2. 认证密钥协商(Authentication key agreement)的安全目标
  3. 当百度大脑小度完胜人类《最强大脑》
  4. 九号电动国标车BC系列区别于传统电动车之新颖功能全览
  5. 你的态度决定你的未来
  6. win8.1 + tomcat8 + JDK1.8 配置经验
  7. 如何使用JBUILDER开发J2ME应用(转)
  8. Java项目源代码基于S2SH实现的客运站网上售票系统
  9. 众多流行软音源素材一键即可获取
  10. js制作 电子杂志(附源代码)