RISCVLinuxkernel启动代码分析之十:设备树介绍(1)

原创 嵌入式Lee 2024-12-05 08:30

一. 前言

opensbilinux kernel中我们看到都会涉及设备树的解析,本文就来分享下设备的一些基本知识。

设备树规格书下载

https://github.com/devicetree-org/devicetree-specification

DTSpec指定了一个称为设备树的构造来描述系统硬件。引导程序将设备树加载到客户端程序的内存中,并将指向设备树的指针传递给客户端。Opensbi中就是通过寄存器a1传递设备树的地址,最终还要传递给linux kernel

设备树是一种具有描述系统中设备的节点的树数据结构。每个节点都有描述所表示设备特性的属性/值对。除了根节点没有父节点外,每个节点只有一个父节点

节点不应为特定于操作系统或项目的目的而设计。它们应该描述可以由任何操作系统或项目实现的东西

设备树通常用于描述客户端程序不一定能动态检测到的设备。

例如,PCI的架构使客户端能够探测和检测连接的设备,因此可能不需要描述PCI设备的设备树节点。然而,设备节点通常用于描述系统中的PCI主机桥设备

如果探测无法检测到网桥,则此节点是必需的,但在其他情况下是可选的。此外,引导加载程序可以进行PCI探测,并生成一个包含其扫描结果的设备树,以传递给操作系统。

.基本语法

节点名

node-name@unit-address 

node-name节点名由以下1~31个字符,且只能字母开头。

unit-address单元地址必须与节点的reg属性中指定的第一个地址匹配。如果节点没有reg属性,则必须省略@unit-address,仅使用node-name将该节点与同一级别的其他节点区分开。

根节点没有节点名称或单元地址,由正斜杠(/)标识。

节点名示例,地址无需加0x前缀

节点的名称应该通用,反映设备的功能,而不是其精确的编程模型。如下是推荐的名称

路径名

通过指定从根节点通过所有子节点到所需节点的完整路径,可以唯一标识设备树中的节点。

/node-name-1/node-name-2/node-name-N 

例如

/cpus/cpu@1 

根节点的路径是/

属性

设备树中的每个节点都有描述节点特性的属性。属性由名称和值组成。

属性名:

由以下1~31个字符组成

非标准属性名称应指定一个唯一的字符串前缀,用于标识定义该属性的公司或组织的名称。示例:

fsl,channel-fifo-len

ibm,ppc-interrupt-server#s

linux,network-index 

属性值:

属性值是包含与属性关联信息的0或多个字节的数组。如果表示真假,属性可能为空值,此时属性存在或不存在应该具有足够的信息来确认

以下是标准值类型

描述

值为空。当属性是否存在有其他足够信息确认时,用于表示真假信息。

大端序格式的32位整数。

表示大端格式的64位整数。由两个值组成,其中第一个值包含整数的最高有效位,第二个值包含最低有效位。

比如0x1122334455667788表示为<0x11223344 0x55667788>.

字符串是可打印的,以null结尾。比如hello”占用6个字节。

address 68 'h'

address+1 65 'e'

address+2 6C 'l'

address+3 6C 'l'

address+4 6F 'o'

address+5 00 '\0' 

格式特定于属性。参见属性定义。

值。phandle值是引用设备树中另一个节点的一种方式。任何可以被引用的节点都定义了一个具有唯一值的phandle属性。

连接在一起的值列表。“hello”、“world”在内存中表示为:

address 68 'h'

address+1 65 'e'

address+2 6C 'l'

address+3 6C 'l'

address+4 6F 'o'

address+5 00 '\0'

address+6 77 'w'

address+7 6f 'o'

address+8 72 'r'

address+9 6C 'l'

address+10 64 'd'

address+11 00 '\0'

基本设备节点集

设备树有一个根节点/

根节点下只能有一个/cpus 节点,至少一个/memory节点。

根节点

根节点属性

属性名

使用

值类型

说明

#address-cells

R

指定根节点的子节点reg属性表示address需要的单元数

#size-cells

R

指定根节点的子节点reg属性表示size

需要的单元数

model

R

指定唯一标识系统板型号的字符串。建议格式为“制造商,型号”

compatible

R

指定与此平台兼容的平台体系结构列表。操作系统可以在选择特定于平台的代码时使用此属性。建议形式为:"manufacturer,model"

serial-number

O

指定表示设备序列号的字符串。

chassis-type

OR

指定标识系统形状因子的字符串。属性值可以是以下值之一:

"desktop"

"laptop"

"convertible"

"server"

"tablet"

"handset"

"watch"

"embedded" 

R=Required, O=Optional, OR=Optional but Recommended, SD=See Definition 

其他标准属性可选

/aliases 节点

设备树可能有一个别名节点(/aliases),用于定义一个或多个别名属性。别名节点应位于设备树的根节点。属性名指定别名。属性值指定设备树中节点的完整路径。

别名只能是1~31个如下字符,小写

别名值是一个设备路径,编码为字符串。该值表示节点的完整路径,但路径不需要引用叶子节点。

客户端程序可以使用别名属性名称来引用完整的设备路径作为其字符串值的全部或部分。当客户端程序将字符串视为设备路径时,应检测并使用别名

示例

serial0 = "/simple-bus@fe000000/serial@llc500"
aliases {
serial0 = "/simple-bus@fe000000/serial@llc500";
ethernet0 = "/simple-bus@fe000000/ethernet@31c000";
};

/memory节点

所有设备树都需要一个内存设备节点,它描述了系统的物理内存布局。如果系统具有多个内存范围,则可以创建多个内存节点,或者可以在单个内存节点的reg属性中指定这些范围。

当通过[UEFI]引导时,系统内存映射是通过[UEFI]中定义的GetMemoryMap()获得的,如果存在,操作系统必须忽略任何/memory节点

节点属性,其他标准属性可选

属性名

使用

值类型

说明

device_type

R

必须是memory

reg

R

由任意数量的addresssize对组成,指定内存范围的物理地址和大小

initial-mapped-area

O

指定初始映射区域的地址和大小。初始映射区域是一个由三元组(有效地址、物理地址、大小)组成的数组。有效地址和物理地址均应为64位(值),大小应为32位(值)

hotpluggable

O

向操作系统明确提示以后可能会移除此内存。

R=Required, O=Optional, OR=Optional but Recommended, SD=See Definition 

示例

假设

#address-cells = <2>

#size-cells = <2>

memory@0 {device_type = "memory";reg = <0x000000000 0x00000000 0x00000000 0x800000000x000000001 0x00000000 0x00000001 0x00000000>;};
memory@0 {device_type = "memory";reg = <0x000000000 0x00000000 0x00000000 0x80000000>;};memory@100000000 {device_type = "memory";reg = <0x000000001 0x00000000 0x00000001 0x00000000>;};

/reserved-memory节点

操作系统将保留内存排除在正常使用之外。这种存储区域通常是为各种设备驱动程序的特殊用途而设计的。

/reserved-memory父节点

#address-cells#size-cells使用与根节点相同的值,范围应为空,以便地址转换逻辑正常工作

属性名

使用

值类型

说明

#address-cells

R

指定单元的数量,以表示根的子节点中reg属性中的地址。

#size-cells

R

指定单元的数量,以表示根的子级中reg属性的大小

ranges

R

此属性表示父地址到子地址空间之间的映射,见标准属性ranges

R=Required, O=Optional, OR=Optional but Recommended, SD=See Definition 

/reserved-memory/子节点

保留内存节点的每个子节点指定一个或多个保留内存区域。每个子节点可以使用reg属性指定特定范围的保留内存,也可以使用具有可选约束的size属性请求动态分配的内存块

按照通用名称推荐的做法,节点名称应反映节点的用途(即framebuffer “dma-pool)。如果节点是静态分配,则应在名称后附加单元地址(@

保留内存节点需要reg属性用于静态分配,或需要size属性用于动态分配。动态分配可以使用对齐和分配范围属性来约束内存的分配位置。如果regsize都存在,则该区域被视为静态分配,reg属性优先,size被忽略。

节点属性,其他标准属性可选

属性名

使用

值类型

说明

reg

O

由任意数量的地址和大小对组成,用于指定内存范围的物理地址和大小。

size

O

为动态分配的区域保留的内存大小(以字节为单位)。此属性的大小基于父节点的#size-cells

alignment

O

地址边界用于对齐分配。此属性的大小基于父节点的#size-cells属性。

alloc-ranges

O

指定可从中分配的内存区域。格式是与reg属性格式相同的(地址、长度对)元组。

compatible

O

可能包含以下字符串:

shared-dma-pool

厂商指定的字符串

,[-]

no-map

O

如果存在,则表示操作系统不得创建该区域的虚拟映射作为其系统内存标准映射的一部分,也不得允许在除使用该区域的设备驱动程序控制之外的任何情况下对其进行推测性访问。

reusable

O

操作系统可以使用此区域中的内存,但受限于拥有该区域的设备驱动程序需要能够将其回收。通常,这意味着操作系统可以使用该区域存储易失性或缓存的数据,这些数据可以以其他方式重新生成或迁移到其他地方。

R=Required, O=Optional, OR=Optional but Recommended, SD=See Definition 

no-map  reusable 属性是互斥的,不能在同一节点中同时使用。Linux实施说明:

如果存在linux,cma-default默认属性,则linux将使用该区域作为连续内存分配器的默认池。

如果存在linux,dma-default默认属性,则linux将使用该区域作为一致dma分配器的默认池

设备节点引用保留内存

通过向设备节点添加内存区域属性,其他设备节点可以引用/保留内存节点中的区域。

属性名

使用

值类型

说明

memory-region

O

phandle, specifier指向

/reserved-memory

memory-region-names

O

名称列表,内存区域属性中的每个对应条目对应一个名称

R=Required, O=Optional, OR=Optional but Recommended, SD=See Definition 

当通过[UEFI]引导时,静态/保留内存区域也必须列在通过[UEFI]中定义的GetMemoryMap()获得的系统内存映射中。保留的内存区域需要包含在UEFI内存映射中,以防止UEFI应用程序的分配。

具有无映射属性的保留区域必须在EfiReservedMemoryType类型的内存映射中列出。所有其他保留区域必须以EfiBootServicesData类型列出。

动态保留内存区域不得列在[UEFI]内存映射中,因为它们是在退出固件引导服务后由操作系统分配的

示例

此示例为Linux内核定义了3个连续的区域:一个是所有设备驱动程序的默认区域(大小分别为Linuxcma64MiB),另一个是专用于帧缓冲区设备的区域(名为framebuffer@780000008MiB),一个用于多媒体处理(命名为multimedia@77000000640MB

/ {#address-cells = <1>;#size-cells = <1>;memory {reg = <0x40000000 0x40000000>;};reserved-memory {#address-cells = <1>;#size-cells = <1>;ranges;/* global autoconfigured region for contiguous allocations */linux,cma {compatible = "shared-dma-pool";reusable;size = <0x4000000>;alignment = <0x2000>;linux,cma-default;};display_reserved: framebuffer@78000000 {reg = <0x78000000 0x800000>;};multimedia_reserved: multimedia@77000000 {compatible = "acme,multimedia-memory";reg = <0x77000000 0x4000000>;};};/* ... */fb0: video@12300000 {memory-region = <&display_reserved>;/* ... */};scaler: scaler@12500000 {memory-region = <&multimedia_reserved>;/* ... */};codec: codec@12600000 {memory-region = <&multimedia_reserved>;/* ... */};}

/chosen节点

/chosen节点不代表系统中的真实设备,而是描述了系统固件在运行时选择或指定的参数。它应该是根节点的子节点。

其中bootargs属性用于传递参数给内核,最常使用。

属性名

使用

值类型

说明

bootargs

O

一个字符串,指定客户端程序的启动参数。如果不需要启动参数,则该值可能是空字符串。

stdout-path

老版本是linux,stdout-path

O

一个字符串,指定表示用于引导控制台输出的设备的节点的完整路径。如果值中存在字符“:”,则终止路径。该值可能是别名。如果未指定stdin路径属性,则应假定stdout路径来定义输入设备。

stdin-path

O

一个字符串,指定表示用于引导控制台输入的设备的节点的完整路径。如果值中存在字符“:”,则终止路径。该值可能是别名。

R=Required, O=Optional, OR=Optional but Recommended, SD=See Definition 

示例

chosen {

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

};

/cpus节点

所有设备树都需要有一个/cpus节点。它并不代表系统中的真实设备,而是作为代表系统cpu的子cpu节点的容器。

属性名

使用

值类型

说明

#address-cells

R

指定单元的数量,以表示子节点中reg属性中的地址。

#size-cells

R

指定单元的数量,以表示子级中reg属性的大小

R=Required, O=Optional, OR=Optional but Recommended, SD=See Definition 


/cpus/cpu*节点

cpu节点表示一个硬件执行块,它足够独立,能够运行操作系统,而不会干扰可能运行其他操作系统的其他cpu

共享MMU的硬件线程通常在一个cpu节点下表示。如果设计了其他更复杂的CPU拓扑结构,CPU的绑定必须描述拓扑结构(例如,不共享MMU的线程)

CPU和线程通过统一的编号空间进行编号,该编号空间应尽可能与中断控制器的CPU/线程编号相匹配

cpu节点具有相同值的属性可以放置在/cpus节点中。客户端程序必须首先检查特定的cpu节点,但如果找不到预期的属性,则应查看父/cpus节点。这使得所有CPU上相同的属性表示不那么冗长。

每个CPU节点的节点名称应该是cpu

一般属性

老版本中clock-frequencybus-frequency

属性名

使用

值类型

说明

device_type

R

必须是"cpu"

reg

R

array


clock-frequency

O

array

指定CPU的时钟速度,单位为赫兹(如果恒定)。

U32或者u64格式

timebase-frequency

O

array

指定时基和递减器寄存器更新的当前频率(赫兹)。

U32或者u64格式

status

SD

"okay" :cpu在运行

"disabled" cpu

禁止

"fail"cpu未运行或不存在

 

enable-method

SD

"spin-table" :

"[vendor],[method]"

cpu-release-addr

SD

enable-method=spin-table时使用

该值指定了从其旋转循环中释放辅助CPU的旋转表条目的物理地址。 

R=Required, O=Optional, OR=Optional but Recommended, SD=See Definition 


属性名

使用

值类型

说明

power-isa-version

O

指定Power ISA版本字符串的数字部分的字符串。

power-isa-* 

O


cache-op-block-size

SD

指定缓存块指令操作的块大小(以字节为单位)(例如dcbz)。如果与L1缓存块大小不同,则为必填项。

reservation-granule-siz

SD

指定此处理器支持的保留粒度大小(以字节为单位)。

mmu-type

O

MMU类型

"mpc8xx"

"ppc40x"

"ppc440"

"ppc476"

"power-embedded"

"powerpc-classic"

"power-server-stab"

"power-server-slb"

"none" 

enable-method

SD

"spin-table" :

"[vendor],[method]"

cpu-release-addr

SD

enable-method=spin-table时使用

该值指定了从其旋转循环中释放辅助CPU的旋转表条目的物理地址。 

R=Required, O=Optional, OR=Optional but Recommended, SD=See Definition 

TLB属性

cpu节点的以下属性描述了处理器MMU中的转换备用缓冲区。

属性名

使用

值类型

说明

tlb-split

SD

如果存在,则指定TLB具有拆分配置,指令和数据具有单独的TLB。如果不存在,则指定TLB具有统一的配置。在拆分配置中具有TLBCPU需要此项。

tlb-size

SD

指定TLB中的条目数。具有统一TLBCPU需要指令和数据地址。

tlb-sets

SD

指定TLB中关联性集的数量。具有统一TLBCPU需要指令和数据地址

d-tlb-size

SD

指定数据TLB中的条目数。具有拆分TLB配置的CPU需要

d-tlb-sets

SD

指定数据TLB中的关联性集的数量。具有拆分TLB配置的CPU需要

i-tlb-size

SD

指定指令TLB中的条目数。具有拆分TLB配置的CPU需要

i-tlb-sets

SD

指定指令TLB中的关联性集的数量。具有拆分TLB配置的CPU需要。

R=Required, O=Optional, OR=Optional but Recommended, SD=See Definition 

Internal (L1) Cache属性

next-level-cache在老版本叫l2-cache

属性名

使用

值类型

说明

cache-unified

SD

如果存在,则指定缓存具有统一的组织。如果不存在,则指定缓存具有哈佛架构,其中包含用于指令和数据的单独缓存

cache-size

SD

指定统一缓存的大小(以字节为单位)。如果缓存是统一的(指令和数据组合),则需要

cache-sets

SD

指定统一缓存中关联性集的数量。如果缓存是统一的(指令和数据组合),则需要

cache-block-size

SD

指定统一缓存的块大小(以字节为单位)。如果处理器具有统一缓存(指令和数据组合),则需要

cache-line-size

SD

指定统一缓存的行大小(以字节为单位),如果与处理器具有统一缓存(组合指令和数据)时所需的缓存块大小不同

i-cache-size

SD

指定指令缓存的大小(以字节为单位)。如果cpu有单独的指令缓存,则需要

i-cache-sets

SD

指定指令缓存中关联性集的数量。如果cpu有单独的指令缓存,则需要

i-cache-block-size

SD

指定指令缓存的块大小(以字节为单位)。如果cpu有单独的指令缓存,则需要。

i-cache-line-size

SD

指定指令缓存的行大小(以字节为单位)(如果不同于缓存块大小)。如果cpu有单独的指令缓存,则需要。

d-cache-size

SD

指定数据缓存的大小(以字节为单位)。如果cpu有单独的数据缓存,则需要

d-cache-sets

SD

指定数据缓存中关联性集的数量。如果cpu有单独的数据缓存,则需要。

d-cache-block-size

SD

指定数据缓存的块大小(以字节为单位)。如果cpu有单独的数据缓存,则需要。

d-cache-line-size

SD

如果与缓存块大小不同,则指定数据缓存的行大小(以字节为单位)。如果cpu有单独的数据缓存,则需要

next-level-cache

SD

如果存在,则表示存在另一级缓存。该值是下一级缓存的phandle

R=Required, O=Optional, OR=Optional but Recommended, SD=See Definition 

示例

cpus {#address-cells = <1>;#size-cells = <0>;cpu@0 {device_type = "cpu";reg = <0>;d-cache-block-size = <32>; // L1 - 32 bytesi-cache-block-size = <32>; // L1 - 32 bytesd-cache-size = <0x8000>; // L1, 32Ki-cache-size = <0x8000>; // L1, 32Ktimebase-frequency = <82500000>; // 82.5 MHzclock-frequency = <825000000>; // 825 MHz};};

/cpus/cpu*/l?-cache节点

处理器和系统可以实现额外级别的缓存层次结构。例如,第二级(L2)或第三级(L3)缓存。这些缓存可以紧密集成到CPU中,也可以在多个CPU之间共享

具有兼容值“cache”的设备节点描述了这些类型的缓存。

缓存节点应定义phandle属性,与缓存关联或共享缓存的所有cpu节点或缓存节点都应包含一个下一级缓存属性,该属性将phandle指定给缓存节点。

缓存节点可以在CPU节点或设备树中的任何其他适当位置下表示


属性名

使用

值类型

说明

compatible

R

标准属性。该值应包括字符串cache”。。

cache-level

R

指定缓存层次结构中的级别。例如,2级缓存的值为2

R=Required, O=Optional, OR=Optional but Recommended, SD=See Definition 

示例

两个CPU,每个CPU都有自己的片上L2和共享L3

cpus {#address-cells = <1>;#size-cells = <0>;cpu@0 {device_type = "cpu";reg = <0>;cache-unified;cache-size = <0x8000>; // L1, 32 KBcache-block-size = <32>;timebase-frequency = <82500000>; // 82.5 MHznext-level-cache = <&L2_0>; // phandle to L2L2_0:l2-cache {compatible = "cache";cache-unified;cache-size = <0x40000>; // 256 KBcache-sets = <1024>;cache-block-size = <32>;cache-level = <2>;next-level-cache = <&L3>; // phandle to L3L3:l3-cache {compatible = "cache";cache-unified;cache-size = <0x40000>; // 256 KBcache-sets = <0x400>; // 1024cache-block-size = <32>;cache-level = <3>;};};};cpu@1 {device_type = "cpu";reg = <1>;cache-unified;cache-block-size = <32>;cache-size = <0x8000>; // L1, 32 KBtimebase-frequency = <82500000>; // 82.5 MHzclock-frequency = <825000000>; // 825 MHznext-level-cache = <&L2_1>; // phandle to L2L2_1:l2-cache {compatible = "cache";cache-unified;cache-level = <2>;cache-size = <0x40000>; // 256 KBcache-sets = <0x400>; // 1024cache-line-size = <32>; // 32 bytesnext-level-cache = <&L3>; // phandle to L3};};};

标准属性

compatible

属性名: compatible

值类型:

兼容compatible属性值由一个或多个字符串组成(字符串以\0结尾)多个字符串按一般到具体的顺序组织,这些字符串定义了设备的特定编程模型,用于表达一系列类似设备的兼容性,可能一个设备驱动程序兼容多个设备。

使用此字符串列表来选择设备驱动程序。

我们前面opensbilinux代码中就大量看到了使用compatible来进行匹配。

推荐“制造商,型号”的描述方式。

字符串应仅由小写字母、数字和破折号组成,并且应以字母开头。单个逗号通常仅在供应商前缀后使用。不应使用下划线。

示例:

compatible = "fsl,mpc8641", "ns16550";

在这个例子中,操作系统将首先尝试定位支持fsl的设备驱动程序mpc8641。如果找不到驱动程序,它将尝试查找支持更通用的ns16550设备类型的驱动程序。即按照一般到具体的描述组织。

model

属性名: model

值类型:

model属性值是一个,指定设备的制造商型号。推荐的格式是:制造商,型号

示例

model = "fsl,MPC8349EMITX";

phandle

属性名: phandle

值类型:

phandle属性为设备树中具备唯一的节点指定数字标识符。phandle属性值由需要引用节点的其他节点使用。

示例:

节点pic定义了phandle=1的标志,这样another-device-node可以通过1找到pic节点。

pic@10000000 {

phandle = <1>;

interrupt-controller;

reg = <0x10000000 0x100>;

}

another-device-node {

interrupt-parent = <1>;

}

注老版本属性名是linux,phandle. 如果要兼容则先看是否是phandle然后再看是不是linux,phandle.

DTS中的大多数设备树不包含显式的phandle属性。当DTS编译为二进制DTB格式时,DTC工具会自动插入phandle属性。

status

属性名: status

值类型:

status属性表示设备的运行状态。如果没有该属性则默认认为是okay

值有如下

描述

okay

表示设备是运行的

"disabled"

表示设备当前未运行,但将来可能会运行(例如,某些设备未插入或关闭)。

"reserved" 

表示设备可以运行,但不应使用。通常,这用于由另一个软件组件(如平台固件)控制的设备

"fail"

表示设备无法运行。在设备中检测到严重错误,如果不进行维修,它不太可能运行。

"fail-sss"

表示设备无法运行。在设备中检测到严重错误,如果不进行维修,设备不太可能运行。该值的sss部分特定于设备,表示检测到的错误情况。

#address-cells  #size-cells

属性名: #address-cells, #size-cells

值类型:

可以在设备树层次结构中具有子节点的任何节点中使用,并描述了应如何寻址子设备节点。

#address-cells属性定义了以多少个单元,对子节点的reg属性的地址进行编码;

#size-cells属性定义了以多少个单元,对子节点的reg属性的大小进行编码

#address-cells#size-cells不是从设备树中的祖先继承的,所以要在所有拥有子节点的节点处明确指定,不指定则dtc编译时会告警

程序解析时如果没找到这个属性则默认认为 #address-cells2,#size-cells1.

示例

#address-cells  #size-cells都是1,所以子节点serial中的reg属性,0x4600表示地址,0x100表示大小。

soc {#address-cells = <1>;#size-cells = <1>;serial@4600 {compatible = "ns16550";reg = <0x4600 0x100>;clock-frequency = <0>;interrupts = <0xA 0x8>;interrupt-parent = <&ipic>;};}

reg

属性名: reg

值类型: 编码为任意数量的 (address, length) 对。

reg属性描述了设备资源在其父总线定义的地址空间内的地址。最常见的是内存映射IO寄存器块的偏移量和长度,但在某些总线类型上可能有不同的含义。根节点定义的地址空间中的地址是CPU实际地址。

其中addresslength由多少个组成,由父节点的#address-cells #size-cells指定。

如果#size-cells0则表示没有length,只有address.

示例

假设父节点

#address-cells#size-cells values 都是1

则以下表示偏移0x3000处的0x20字节区域,和偏移0xFE00处的0x100字节区域。

reg = <0x3000 0x20 0xFE00 0x100>;

virtual-reg

属性名: virtual-reg

值类型:

指定了一个有效地址,该地址映射到由reg属性指定的第一个物理地址。此属性使引导程序能够为客户端程序提供已设置的虚拟到物理映射。

ranges

属性名: ranges

值类型: 或者  编码为任意数量的(child-bus-address, parent-busaddress, length)三元组。

range属性提供了一种定义总线地址空间(子地址空间)和总线节点父节点地址空间(父地址空间)之间映射或转换的方法。该属性定义在父节点。

child-bus-address是子总线地址空间内的物理地址。地址的单元数取决于ranges所在节点下的#address-cells属性的指定。

parent-busaddress是父总线地址空间内的物理地址。地址的单元数取决于ranges所在节点的父节点下的#address-cells属性的指定。

length指定了子地址空间中范围的大小。大小的单元数取决于ranges所在节点下的#address-cells属性的指定。

如果属性定义为值,则表示父地址空间和子地址空间相同,不需要进行地址转换。

如果总线节点中不存在该属性,则假定节点的子节点和父地址空间之间不存在映射。

示例

soc {compatible = "simple-bus";#address-cells = <1>;#size-cells = <1>;ranges = <0x0 0xe0000000 0x00100000>;
serial@4600 {device_type = "serial";compatible = "ns16550";reg = <0x4600 0x100>;clock-frequency = <0>;interrupts = <0xA 0x8>;interrupt-parent = <&ipic>;};}

soc节点指定ranges属性

<0x0 0xe0000000 0x00100000>;

对于1MB的地址空间范围,在物理0x0处寻址的子节点映射到物理0xe0000000的父地址。通过此映射,serial节点可以通过地址0xe0004600来寻址,偏移量为0x4600(在reg中指定)加上范围中指定的0xe0000000映射。

dma-ranges

属性名: dma-ranges

值类型: 或者 编码为任意数量的(child-bus-address, parent-busaddress, length) 三元组.

dma-ranges用于描述内存映射总线的(dma)结构,该总线的设备树父节点可以通过源自总线的dma操作进行访问。它提供了一种定义总线物理地址空间和总线父级物理地址空间之间的映射或转换的方法。该属性定义在父节点。和ranges类似。

child-bus-address 是子总线地址空间的物理地址, 单元数由dma-ranges所在节点的#address-cells 决定

parent-bus-address 是父总线地址空间的物理地址,单元数由dma-ranges父节点的#address-cells 决定

length指定了子地址空间中范围的大小。单元数由dma-ranges所在节点的#address-cells 决定。

dma-coherent

属性名: dma-coherent

值类型:

对于默认I/O non-coherent 架构,non-coherent用于表示设备支持coherent DMA 操作。某些架构默认是non-coherent DMA ,此属性不适用。

dma-noncoherent

属性名: dma-noncoherent

值类型:

对于默认I/O coherent 架构,dma-noncoherent用于表示设备不支持coherent DMA 操作。某些架构默认是non-coherent DMA ,此属性不适用。

name (已弃用)

属性名: name

值类型:

name属性用于指定节点名称。此属性已弃用,不建议使用。它可能用于较旧的不符合DTSpec的设备树。操作系统应根据node-name确定节点名称。

device_type (已弃用)

属性名: device_type

值类型:

device_type属性在IEEE 1275中用于描述设备的FCode编程模型。由于DTSpec没有FCode,因此该属性已被弃用,为了与IEEE 1275衍生的设备树兼容,它应该只包含在cpumemory节点上。






评论
  • 光耦合器,也称为光隔离器,是一种利用光在两个隔离电路之间传输电信号的组件。在医疗领域,确保患者安全和设备可靠性至关重要。在众多有助于医疗设备安全性和效率的组件中,光耦合器起着至关重要的作用。这些紧凑型设备经常被忽视,但对于隔离高压和防止敏感医疗设备中的电气危害却是必不可少的。本文深入探讨了光耦合器的功能、其在医疗应用中的重要性以及其实际使用示例。什么是光耦合器?它通常由以下部分组成:LED(发光二极管):将电信号转换为光。光电探测器(例如光电晶体管):检测光并将其转换回电信号。这种布置确保输入和
    腾恩科技-彭工 2025-01-03 16:27 155浏览
  • 本文继续介绍Linux系统查看硬件配置及常用调试命令,方便开发者快速了解开发板硬件信息及进行相关调试。触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。查看系统版本信息查看操作系统版本信息root@ido:/# cat /etc/*releaseDISTRIB_ID=UbuntuDISTRIB_RELEASE=20.04DISTRIB_CODENAME=focalDIS
    Industio_触觉智能 2025-01-03 11:37 136浏览
  • 在快速发展的能源领域,发电厂是发电的支柱,效率和安全性至关重要。在这种背景下,国产数字隔离器已成为现代化和优化发电厂运营的重要组成部分。本文探讨了这些设备在提高性能方面的重要性,同时展示了中国在生产可靠且具有成本效益的数字隔离器方面的进步。什么是数字隔离器?数字隔离器充当屏障,在电气上将系统的不同部分隔离开来,同时允许无缝数据传输。在发电厂中,它们保护敏感的控制电路免受高压尖峰的影响,确保准确的信号处理,并在恶劣条件下保持系统完整性。中国国产数字隔离器经历了重大创新,在许多方面达到甚至超过了全球
    克里雅半导体科技 2025-01-03 16:10 117浏览
  • 前言近年来,随着汽车工业的快速发展,尤其是新能源汽车与智能汽车领域的崛起,汽车安全标准和认证要求日益严格,应用范围愈加广泛。ISO 26262和ISO 21448作为两个重要的汽车安全标准,它们在“系统安全”中扮演的角色各自不同,但又有一定交集。在智能网联汽车的高级辅助驾驶系统(ADAS)应用中,理解这两个标准的区别及其相互关系,对于保障车辆的安全性至关重要。ISO 26262:汽车功能安全的基石如图2.1所示,ISO 26262对“功能安全”的定义解释为:不存在由于电子/电气系统失效引起的危害
    广电计量 2025-01-02 17:18 214浏览
  • 国际标准IPC 标准:IPC-A-600:规定了印刷电路板制造过程中的质量要求和验收标准,涵盖材料、外观、尺寸、焊接、表面处理等方面。IPC-2221/2222:IPC-2221 提供了用于设计印刷电路板的一般原则和要求,IPC-2222 则针对高可靠性电子产品的设计提供了进一步的指导。IPC-6012:详细定义了刚性基板和柔性基板的要求,包括材料、工艺、尺寸、层次结构、特征等。IPC-4101:定义了印刷电路板的基板材料的物理和电气特性。IPC-7351:提供了元件封装的设计规范,包括封装尺寸
    Jeffreyzhang123 2025-01-02 16:50 194浏览
  • Matter加持:新世代串流装置如何改变智能家居体验?随着现在智能家庭快速成长,串流装置(Streaming Device,以下简称Streaming Device)除了提供更卓越的影音体验,越来越多厂商开始推出支持Matter标准的串流产品,使其能作为智能家庭中枢,连结多种智能家电。消费者可以透过Matter的功能执行多样化功能,例如:开关灯、控制窗帘、对讲机开门,以及操作所有支持Matter的智能家电。此外,再搭配语音遥控器与语音助理,打造出一个更加智能、便捷的居家生活。支持Matter协议
    百佳泰测试实验室 2025-01-03 10:29 136浏览
  • 从无到有:智能手机的早期探索无线电话装置的诞生:1902 年,美国人内森・斯塔布菲尔德在肯塔基州制成了第一个无线电话装置,这是人类对 “手机” 技术最早的探索。第一部移动手机问世:1938 年,美国贝尔实验室为美国军方制成了世界上第一部 “移动” 手机。民用手机的出现:1973 年 4 月 3 日,摩托罗拉工程师马丁・库珀在纽约曼哈顿街头手持世界上第一台民用手机摩托罗拉 DynaTAC 8000X 的原型机,给竞争对手 AT&T 公司的朋友打了一个电话。这款手机重 2 磅,通话时间仅能支持半小时
    Jeffreyzhang123 2025-01-02 16:41 167浏览
  • 车身域是指负责管理和控制汽车车身相关功能的一个功能域,在汽车域控系统中起着至关重要的作用。它涵盖了车门、车窗、车灯、雨刮器等各种与车身相关的功能模块。与汽车电子电气架构升级相一致,车身域发展亦可以划分为三个阶段,功能集成愈加丰富:第一阶段为分布式架构:对应BCM车身控制模块,包含灯光、雨刮、门窗等传统车身控制功能。第二阶段为域集中架构:对应BDC/CEM域控制器,在BCM基础上集成网关、PEPS等。第三阶段为SOA理念下的中央集中架构:VIU/ZCU区域控制器,在BDC/CEM基础上集成VCU、
    北汇信息 2025-01-03 16:01 166浏览
  • 物联网(IoT)的快速发展彻底改变了从智能家居到工业自动化等各个行业。由于物联网系统需要高效、可靠且紧凑的组件来处理众多传感器、执行器和通信设备,国产固态继电器(SSR)已成为满足中国这些需求的关键解决方案。本文探讨了国产SSR如何满足物联网应用的需求,重点介绍了它们的优势、技术能力以及在现实场景中的应用。了解物联网中的固态继电器固态继电器是一种电子开关设备,它使用半导体而不是机械触点来控制负载。与传统的机械继电器不同,固态继电器具有以下优势:快速切换:确保精确快速的响应,这对于实时物联网系统至
    克里雅半导体科技 2025-01-03 16:11 160浏览
  • 影像质量应用于多个不同领域,无论是在娱乐、医疗或工业应用中,高质量的影像都是决策的关键基础。清晰的影像不仅能提升观看体验,还能保证关键细节的准确传达,例如:在医学影像中,它对诊断结果有着直接的影响!不仅如此,影像质量还影响了:▶ 压缩技术▶ 存储需求▶ 传输效率随着技术进步,影像质量的标准不断提高,对于研究与开发领域,理解并提升影像质量已成为不可忽视的重要课题。在图像处理的过程中,硬件与软件除了各自扮演着不可或缺的基础角色,有效地协作能够确保图像处理过程既高效又具有优异的质量。软硬件各扮演了什么
    百佳泰测试实验室 2025-01-03 10:39 132浏览
  • 在测试XTS时会遇到修改产品属性、SElinux权限、等一些内容,修改源码再编译很费时。今天为大家介绍一个便捷的方法,让OpenHarmony通过挂载镜像来修改镜像内容!触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器,树莓派卡片电脑设计,支持开源鸿蒙OpenHarmony3.2-5.0系统,适合鸿蒙开发入门学习。挂载镜像首先,将要修改内容的镜像传入虚拟机当中,并创建一个要挂载镜像的文件夹,如下图:之后通过挂载命令将system.img镜像挂载到sys
    Industio_触觉智能 2025-01-03 11:39 112浏览
  • 【工程师故事】+半年的经历依然忧伤,带着焦虑和绝望  对于一个企业来说,赚钱才是第一位的,对于一个人来说,赚钱也是第一位的。因为企业要活下去,因为个人也要活下去。企业打不了倒闭。个人还是要吃饭的。企业倒闭了,打不了从头再来。个人失业了,面对的不仅是房贷车贷和教育,还有找工作的焦虑。企业说,一个公司倒闭了,说明不了什么,这是正常的一个现象。个人说,一个中年男人失业了,面对的压力太大了,焦虑会摧毁你的一切。企业说,是个公司倒闭了,也不是什么大的问题,只不过是这些公司经营有问题吧。
    curton 2025-01-02 23:08 284浏览
  • 自动化已成为现代制造业的基石,而驱动隔离器作为关键组件,在提升效率、精度和可靠性方面起到了不可或缺的作用。随着工业技术不断革新,驱动隔离器正助力自动化生产设备适应新兴趋势,并推动行业未来的发展。本文将探讨自动化的核心趋势及驱动隔离器在其中的重要角色。自动化领域的新兴趋势智能工厂的崛起智能工厂已成为自动化生产的新标杆。通过结合物联网(IoT)、人工智能(AI)和机器学习(ML),智能工厂实现了实时监控和动态决策。驱动隔离器在其中至关重要,它确保了传感器、执行器和控制单元之间的信号完整性,同时提供高
    腾恩科技-彭工 2025-01-03 16:28 157浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦