1 设备树(device tree)简介DTSpec定义一个devicetree的约束来描述硬件设备,boot引导程序将设备树传递给用户程序的内存空间中,并传递给用户相应设备树的指针。设备树为一个树形结构用来描述系统中的设备。每个节点由属性/值来描述给出设备的特性,除了根节点之外,每一个节点有一个确定的父节点。

2 设备树基本模型

DTS基本模型,图2-1展示了一个设备树的基本结构。其中“/”为该设备树文件中唯一的根节点,其后的节点以此根节点发散展开,形成树状结构。

图2-1设备树基本结构

3  设备树编写规则

3.1 节点

3.1.1节点命名

设备树除根节点“/”外,其他节点命名根据以下规范:

Label:node-name@unit-address

其中:unit-address : 指定该节点在父节点地址空间中的地址。Lable是该节点的标号,可以省略。节点命名 node-name保证长度在1-31个字符之间,且仅能由表2-1中给出的字符组成。节点名必须以小写或者大写字母开头,并应尽量能够表明设备的类型。Unit-address必须和该节点属性中的一个 “reg” 的地址相匹配,如果该节点下没有”reg”属性,@unit-address则必须省略掉,node-name须保证在同一级下能够与其它节点区分。

表2-1有效的节点命名字符

Character

Description

0-9

digit

a-z

lowercase letter

A-Z

uppercase letter

,

comma

.

period

_

underscore

+

plus sign

dash

图2-2给出了设备树节点命名的例子,图中i2c通过A0895000和A0896000两个单元地址进行区分。

图2-2设备树节点命名

节点命名应该通用、可以反应出设备的设备的功能,以下是一些推荐的节点名称:

• adc

• accelerometer

• atm

• audio-codec

• audio-controller

• backlight

• Bluetooth

• bus

• cache-controller

• camera

• can

• charger

• clock

• clock-controller

• compact-flash

• cpu

• cpus

• crypto

• disk

• display

• dma-controller

• dsp •eeprom

• efuse•endpoint

• ethernet

• ethernet-phy

• fdc

• flash

• gnss

• gpio

• gpu

• gyrometer

• hdmi

• i2c

• i2c-mux

• ide

• interrupt-controller

• isa

• keyboard

• key

• keys

• lcd-controller

• led

• leds

• led-controller

• light-sensor

• magnetometer

• mailbox

• mdio

• memory

• memory-controller

• mmc

• mmc-slot

• mouse

• nand-controller

• nvram

• oscillator

• parallel

• pc-card

• pci

• pcie

• phy

• pinctrl

• pmic

• pmu

• port

• ports

• power-monitor

• pwm • regulator

• reset-controller

• rtc

• sata

• scsi

• serial

• sound

• spi

• sram-controller

• ssi-controller

• syscon

• temperature-sensor

• timer

• touchscreen

• usb

• usb-hub

• usb-phy

• video-codec

• vme

• watchdog

• wiifi

3.1.2节点路径

设备树中的节点可由从根节点开始的完整路径区分,使用方法如上,如果到节点的完整路径是明确的,则可以省略单元地址。如果客户端程序遇到不确的路径,它的行为将不确定。例如:/node-name-1/node-name-2

3.2 属性

属性赋值格式:“name=value”

3.2.1属性命名

设备树中每一个节点都有一些属性来描述该节点的特征,属性通常以“名称和值”的方式组成。属性命名字符组成如表3-2所示。非标准的属性名称应该赋予名称有特定具体的意义,如pin, function,tx_use_dma等。

表2-1有效的属性命名字符

Character

Description

0-9

digit

a-z

lowercase letter

A-Z

uppercase letter

,

comma

.

period

_

underscore

+

plus sign

?

question mark

#

hash

dash

3.2.2属性值

属性的值是由包含针对该属性相关的零或者多个字节组成的数组。当属性表征true-false信息的时候,属性值为空。

Value

Description

值为空,如用来表征true-false属性

32位整形数,以大端形式, 一个cell  如0x1234567

字符串,如“hello”

<  string list>

字符串数组,如:“hello”,“world”

编码对,具体格式参见个属性规定

一个的值,可以代表设备树中任何一个节点。

3.2.3标准属性

设备树节点有一些标准的属性,可以统一描述该节点具有的一些特征。

  • compatible属性

属性名称:compatible 属性值类型

compatible属性由一个或多个字符串组成。这些字符串定义了特定的设备模型。该属性允许一个设备表达它与一系列类似设备的兼容性,允许一个设备驱动程序与多个设备匹配。推荐的属性值赋值方式为“"manufacturer,model”。其中manufacturer为芯片制造商的名字,model指定了该设备的型号。

例如:

compatible= "leadcore,comip-powerkey";

在此例中,操作系统会先去找支持"leadcore,comip-powerkey"设备的驱动,如果没有,则驱动与设备匹配失败,该设备无法正常运行。

  • phandle属性

属性名称:phandle 属性值

phandle使用一个u32的数值来表征设备树中唯一的节点。其他节点应用该节点时,可以引用该节点定义的phandle属性定义的值。

例如:

pic@10000000{       phandle = <1>;       interrupt-controller;

该节点中phandle 被定义了,其他设备节点可以使用值1来引用pic这个节点,如:

another_node@10909009{      interrupt-patrent =<1>;

:大多数设备树中不会显示包含phandle属性,DTC编译工具在编译设备树源码时会自动的插入调用phandle属性。

  • model属性

属性名称:model属性值类型

Model属性描述了设备生产商以及该设备的型号,格式为字符串形式。model用来准确地定义这个硬件是什么

例如:

model= "lc1860c evb2w board on LC1860";

  • status属性

属性名称:status 属性值类型

status属性表明了设备的运行状态。有效值为以下几个:“okay” : 表明设备是可以操作的

“disabled”:表明设备当前不可用,但是可能在以后成为可用设备,例如该设备依赖的某些开关或者设备没有打开或者接入到系统中。

“reserved”:通常表示设备已经运行但是不可以备操作,例如总线固件部分。

“fail” :设备不可被操作,发生了错误,在未修复之前无法操作。

“fail-sss” :表明设备无法被操作,sss是设备特有的,表明探测到了设备的错误。

  • #address-cell #size_sells属性

属性名称:#address-cell 和 #size-cells 属性值:

#address-cell 和 #size-cells通常用在具有子节点继承的节点中,并且指出子设备节点应该如何写地址。其中#address-cell的值若为1,其子设备reg中用1个数来表示地址,表示为一个32位地址,若为2则用两个数来表示地址,表示为一个63位的地址;size-cells为1,所以reg中用1个数来表示大小。

例如:

soc {     #address-cells = <1>;     #size-cells = <1>;     …}uart0:serial@a0882000 {        compatible = "leadcore,comip-uart";        reg = <0xa0882000 0x400>;        …

};

节点serial是soc的子节点,注意到soc中,定义了#address-cells = <1>和#size-cells = <1>,因此所有以soc为父节点的节点在配置属性时,其reg中应使用1个cell表示地址,1个cell表示范围。上例中,0xa0882000为该子节点设备起始地址,0x400为子节点设备地址空间的大小。

  • Reg属性

属性名称:reg属性值: 编码任意数量的(地址长度)对。

reg属性表征了该节点设备资源在其父节点地址空间内的地址。最常见的是说给出映射IO寄存器块的内存的偏移量和长度。reg值是由一系列的 组成的,每一个“地址”、“长度”是一个u32的cell,而这两者是否被赋值依赖于其父节点的#address-cell 和#size-cells属性。当#size-cells为0时,reg中的长度值应该被省略。

例如:

uart2: serial@a0884000 {       compatible = "leadcore,comip-uart";       reg = <0xa0884000 0x400>;        …                }

Serial是soc的子节点,soc节点中#address-cells = <1>和#size-cells = <1>,因此serial节点中reg属性的值须包含地址(u32)以及长度(u32)值。以上reg表明该节点设备在其父节点地址的偏移量为0x0884000,长度1024字节的内存块(soc的地址从0开始)。该设备起始地址为0x0884000,结束地址为0x0884400。

图2-1lc1860手册中串口的基地址

  • Virtual-reg

属性名称:virtual-reg 属性值:

virtual-reg定义了一个有效地址,这个地址映射到设备节点中reg中的第一个地址值,此属性使引导程序可以为客户端程序提供已经设置的“虚拟-实体”的内存映射。

  • Ranges

属性名称:ranges 属性值:或者编码任意数量的(子节点地址,父节点地址,长度)对。当ranges属性值为empty时,表明子节点地址空间与父节点地址空间为1:1映射。

ranges属性提供了一种子节点地址空间以及父节点地址空间的映射关系或转换关系,该属性值是任意的三元数组对。其中子节点地址是父节点地址空间中的实际的物理地址。该节点的地址cell(u32)个数取决于当前节点中的#address-cells,该节点中的长度cell(u32)取决于当前节点中的#size-cells属性。

例如:

soc {     #address-cells= <1>;     #size-cells= <1>;     ranges= <0x0 0x10000000 0xd0000000>;     uart2: serial@a0884000 {           compatible ="leadcore,comip-uart";           reg = <0xa08840000x400>;            …      }      …}

ranges =<0x0 0xe0000000 0x00100000>表示子地址空间从0开始,其长度为0x00100000的范围,该地址映射到其父总线地址空间的起始地址为0xe0000000,长度为0x00100000,具体地址范围如表2所示。

表2 ranges属性表示的地址范围

ranges

子总线空间

父总线空间

0x0 0xe0000000 0xd0000000

0x0 ~0x0+0xd0000000

0x10000000~0x10000000+0xd0000000

明确该节点下的设备serial节点地址在serial子空间地址范围为:

0xa0884000~0xa0884000+0x400,

其在父节点地址空间的映射范围为:

0x10000000+0xa0884000~0x10000000+0xa0884000+0x400

  • Dma-ranges

属性名称:dma-ramges 属性值:或者编码任意数量的(子节点地址,父节点地址,长度)对。

dma-ranges用来描述dma子设备节点与其dma父设备节点的地址空间的映射或者转换关系。其属性值也是一个任意数量的三元数组对,表征了DMA子节点在其父DMA节点中的映射关系。该节点的地址cell(u32)个数取决于当前节点中的#address-cells,该节点中的长度cell(u32)取决于当前节点中的#size-cells属性。

  • Interrupts属性

属性名称:interrupts属性值任意数量的数值对,表征中断说明。中断说明的格式由绑定的中断域定义。

       三个数 interrupts = ;

       X指的是:

PPI:per processor interrupts      私有中断, 中断必须绑定一个固定CPU核,当处理该中断时,必须由绑定的CPU核处理,中断号16~31

SPI:shared processor interrupts   共享中断,中断的处理可被任意的CPU核处理,中断号 32 ~32+224

在arm-gic.h文件中定义的只有SPIPPI,如下:

#define GIC_SPI 0#define GIC_PPI 1

 Y指的是:物理中断号

 Z指的是:触发方式

#defineIRQ_TYPE_NONE 0x00000000          \\ 未指明类型#defineIRQ_TYPE_EDGE_RISING 0x00000001   \\ 上升沿触发#defineIRQ_TYPE_EDGE_FALLING 0x00000002  \\下降沿触发 #defineIRQ_TYPE_EDGE_BOTH (IRQ_TYPE_EDGE_FALLING |IRQ_TYPE_EDGE_RISING)  \\  边沿触发#define IRQ_TYPE_LEVEL_HIGH0x00000004     \\  高电平触发#define IRQ_TYPE_LEVEL_LOW 0x00000008     \\    低电平触发#defineIRQ_TYPE_SENSE_MASK 0x0000000f

例如:

interrupts = <0 61 0>;

表明此节点中断类型为GIC_SPI,物理中断号为61+32=93,触发方式未指定。

四个数:<|子中断(0:主,1:子)主中断号子中断号触发方式>

两个数:<中断号,中断等级>

一个数:<中断号>

  • Interrupt-parent

属性名称:interrupt-parent属性值:表明父中断节点。

由于中断树的层级和设备树层级有差异,具有中断功能的设备节点必须明确通过该属性其父中断。若该设备无interrupt-parent属性,则默认其interrupt-parent属性为其父中断具有的该属性,如果遍历其中断树后,中断设备中没有该属性,则默认其父中断为设备树。

例如:

soc {    interrupt-parent =<&gic>;    …}

节点soc的中断父节点是gic。

  • Interrupts-extended

属性名称:interrupts-extended,属性值phandle或者

该属性指明所属的中断控制器,又描述中断,当一个设备连接到多个中断控制器时,使用该属性来进行中断定义。例如:

interrupts-extended =<&pic 0xA 8>, <&gic 0xda>;

该节点既能响应pic控制器的中断,又能响应gic控制器的中断,但二者不能同时响应。

中断控制器的属性:

  • #interrupt-cells

属性名称:#interrupt-cells,属性值 该属性定义了其及其子中断对中断域说明的编码所需要的cell个数。即interrups属性中的cell个数。例如:

gic:interrupt-controller@a0118000 {                  compatible = "arm,cortex-a7-gic";                  interrupt-controller;                   #interrupt-cells = <3>;                   …         };   timer {            compatible = "arm,armv7-timer";            interrupt-parent = ;            interrupts = ;            …         }

timer的父中断为gic中断控制器,gic节点中#interrupt-cells属性为 <3>,因此,timer中interrupts属性为3个cell。

  • Interrupt-controller

属性名称:#interrupt-controller, 属性值 ,该属性表明该节点是一个中断控制器。

例如:

gic:interrupt-controller@a0118000 {                                     interrupt-controller;                                     #interrupt-cells = <3>;                                     …                                   };

4 基本设备节点与属性

4.1基本设备节点

所有的设备树必须拥有一个根节点 “/”,并且以下的节点是一个系统必须的,且必须为根节点的子节点:

  • 必须要有cpus 节点

  • 至少一个 memory 节点

  • 根节点

设备树只有一个根节点,其它所有的节点都是它的子节点,根节点的完整路径是 “/”

根节点必须具有的属性:

model            字符串,唯一表明系统板的型号,建议“厂家,型号”

compatible    字符串数组,表明可以兼容的平台,建议“厂家,型号”

#size-cells         说明其子节点reg属性中地址参数的个数

#address-cells   说明其子节点reg属性中长度的参数个数

其它标准属性位可选属性

4.1.2 cpus节点

所有设备树都需要/CPU节点。它不代表系统中的真实设备,而是充当表示系统cpus的子cpu节点的容器。Cpus节点必须包含#address-cells和#size-cells节点,并且该节点包含的属性,其子节点都应该遵守。

例如:

cpus{        #address-cells= <1>;        #size-cells= <0>;        cpu1:cpu@1 {               device_type= "cpu";               compatible= "arm,cortex-a7";               reg= <0x101>;               clock-frequency= <1495000000>;        };        cpu2:cpu@2 {               device_type= "cpu";               compatible= "arm,cortex-a7";               reg= <0x102>;               clock-frequency= <1495000000>;        };        …}

cpu节点表示一个硬件执行块,该硬件执行块具有足够的独立性,能够运行一个操作系统,而不会干扰其他可能运行其他操作系统的cpu。CPU和线程通过统一的编号空间进行编号,该空间应尽可能与中断控制器的CPU/线程编号相匹配。CPU节点的地址用法是最简单的。每个CPU被分配了唯一的ID号,而且这个没有size。在上面的cpus节点中,#address-cells被设为了1,#size-cells则被设为了0,这就表示它的子节点中的reg属性是一个32位整数的address,而且没有size部分。

在cpu节点中,必须具有的几个属性:

属性名称:device_type,属性值 值必须是 “cpu”属性名称:"reg" 属性值 数组它定义了由CPU节点表示的CPU/线程的唯一CPU/线程id。属性名称:clock-frequency属性值< prop-encoded-array>数组说明了当前节点的CPU工作的时钟频率(Hz)

4.1.3 Aliases 节点

一个设备树仅能有一个aliases节点,该节点为其它节点定义一个“别名”。该节点必须为设备树根节点的子节点。该节点中其属性名称为属性值节点的别名,属性值为节点在设备树中的全路径。

例如:

/{    …    aliases {    serial0 = &uart0;    …    }}

为uart0定义了一个别名为 “serial0”。别名的命名只能选取数字“0-9”,小写字母“a-z”以及短横线“-”组合形成的字符串。

4.1.4 Memory节点

Memory节点是所有设备树所必须的节点,其位于根节点之下。该节点描述了系统物理内存分配,如果一个系统有多块内存,可以创建多个memory节点或者一个memoery节点在使用时用reg属性进行说明。

例如:

memory {        reg= <0 0x6400000 0 0x39000000>;       };

表明该系统起始地址是0x6400000,长度为0x39000000 (912MB),以上在一个64位的机器中,假设#address-cells= <2>,#size-cells = <2>

4.1.5 Chosen节点

choosen节点不代表系统中的实际设备,但描述了系统软件在运行时选择或指定的参数。它必须是根节点的子节点。对于Linux内核,该节点下最有用的属性是bootargs,该属性的类型是字符串,用来向Linux内核传递cmdline。规范中还定义了stdout-path和stdin-path两个可选的、字符串类型的属性,这两个属性的目的是用来指定标准输入输出设备的,在linux中,这两个属性基本不用。

属性bootargs,属性值,指定客户端程序启动参数的字符串。如果不需要启动参数,则该值是空字符串。通常,chosen 节点在 .dts 源文件中为空,并在启动时填充。

例如:

chosen {      bootargs ="root=/dev/nfs rw nfsroot=192.168.1.1                  console=ttyS0,115200";};

4.2特殊属性

4.2.1 simple-bus compatible 属性值

系统会将该node下所有的child nodes都作为platform device注册进kernel。

例如:

soc {        #address-cells= <1>;        #size-cells= <1>;        ranges= <0 0 0 0xffffffff>;        compatible= "simple-bus";        interrupt-parent= ;}

Soc下的设备节点都将作为platformdevice被注册进kenel

echarts树状图点击展开子节点_CPU眼里的结构设备树节点及属性详解相关推荐

  1. echarts树状图点击展开子节点_Echarts树形图展开和收缩

    一.实现效果 收缩效果: 展开效果: 二.实现代码 展开/收缩 切换 ; var dom = document.getElementById("container"); var m ...

  2. 如何在 LaTeX 中画一个树状图(使用tikz和tikz-qtree包中的宏绘制树、森林、二叉树)

    简单介绍 在计算机相关的文章中,树状图是最常见的几种图之一.树状图经常被用来用来演示结构.层次.算法等内容.而二叉树是最基础的树状图之一,掌握二叉树的画法就可以用图像展示一些算法或者数据结构了. 在 ...

  3. elementui tree获取父节点_elementUI 树状图 点击子节点获取父节点

    权限使用elementUI tree 组件,点击子节点获取对应多级的父节点 这是应用的组件 :data="hovePermissData" :default-checked- ke ...

  4. layui 树状图默认全部展开_SolidWorks 钣金展开基础设定

    这是一个客户传过来直接加工的零件,不用我们设计,只用负责展开 右键点 钣金 选择编辑特征 先说折弯半径,这个选择跟板厚有关系,材料越厚,折弯半径应该越大,但是最主要的还是跟单位的折弯刀具有关系,你们单 ...

  5. CSS3 垂直树状图——运用 :before 和 :after

    CSS3 垂直树状图--运用 :before 和 :after 直接上图(原网址),还有步骤想详解视频.自己CSS3练习demo. [demo] [HTML] <div class=" ...

  6. html树状图右侧_树状图及制作方法(Excel 2016/Excel 2013)

    ↑↑↑关注ExcelEasy,让Excel更简单 树状图是一种展示层次结构数据的图表,可以很好的揭示各类别数据的比例关系及类别内数据的组成结构.今天为大家详细介绍一下树状图的制作方法 树状图在Exce ...

  7. Plotly.js使用详细介绍(折线图、饼状图、点图、水平条形图、桑基图、树状图、等值线图)

    目录 0 写在前面 1 HTML代码 2 折线图 2.1 基本折线图 2.2 复杂折线图 2.2.1 轨迹 2.2.2 布局 3 饼状图 3.1 基本饼状图 3.2 饼图子图 3.3 甜甜圈图 4 点 ...

  8. 聚类树状图_聚集聚类和树状图-解释

    聚类树状图 Agglomerative Clustering is a type of hierarchical clustering algorithm. It is an unsupervised ...

  9. Tree Map:树状图——绘制COVID-19阵列图

    Tree Map树状图, 可视化 饼状图用于表示每个数据在总体中的占比, 但当数据个体数量较多,规模差异较大时, 饼状图无法很好展现. 树状图是一种通过空间填充占比展示数据比率的可视化方式.能够很好的 ...

最新文章

  1. Asp.net无刷新调用后台实体类数据并以Json格式返回
  2. Android开发之ViewPager滑动页面效果实现(源代码分享)
  3. 高德推出查岗功能_新型「查岗」工具?高德推出「家人地图」新功能
  4. static详解java_java中static作用详解
  5. crazyradio焊接和下载固件过程
  6. 【SpringMVC】SpringMVC : 注解 @EnableWebMvc
  7. if name==main是什么意思_Python中if __name__ == quot;__main__quot;:是什么意思
  8. 案例实操-Top10热门品类
  9. nginx访问502,日志报错:connect() to 127.0.0.1:180 failed (13: Permission denied)解决
  10. OpenCV---轮廓发现
  11. Ubuntu Eclipse 解决中文乱码
  12. 计算机系统 基础知识点汇总,超全!!!
  13. android清理软件评测,四大垃圾清理软件横向评测
  14. WANLSHOP B2B2C + 社区种草 —— 运营级插件
  15. VB Label自动换行妙招
  16. php doctrine 使用,php – 在Symfony中使用Doctrine创建表
  17. 主干分支开发模式_源代码主干分支开发四大模式
  18. html网页随机一言,搭建Hitokoto网站·一言经典语句功能及调用案例
  19. 如何给自己的公司做一个网站
  20. 抖抖代码-爬取企查查企业信息

热门文章

  1. python系统关键字_python基础之常用关键字总结
  2. python网络通信协议_Python网络概述:协议与体系结构的运用
  3. activiti mysql数据库表_Mysql安装activiti数据库的2种解决办法
  4. 上的网页显示拒绝访问_DLink家庭路由器上发现6个漏洞
  5. java 访问线程_java线程简介(共享对数据的访问)
  6. ORA-02082: 回送数据库链接必须具有连接限定词
  7. python mysql library popular_【过时】MySQLdb:Python 操作 MySQL 数据库
  8. 自动刷新_AutoRefresh插件:开启页面自动刷新!
  9. 创建多线程_你真的了解多线程吗?
  10. java 弹出下载_java如何实现下载弹出的对话框