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节点上。






评论 (0)
  • 递交招股书近一年后,曹操出行 IPO 进程终于迎来关键节点。从 2024 年 4 月首次递表,到 2025 年 4 月顺利通过中国证监会境外发行上市备案,并迅速更新招股书。而通过上市备案也标志着其赴港IPO进程进入实质性推进阶段,曹操出行最快有望于2025年内完成港股上市,成为李书福商业版图中又一关键落子。行路至此,曹操出行面临的挑战依然不容忽视。当下的网约车赛道,早已不是当年群雄逐鹿的草莽时代,市场渐趋饱和,竞争近乎白热化。曹操出行此时冲刺上市,既是背水一战,也是谋篇布局。其招股书中披露的资金
    用户1742991715177 2025-05-10 21:18 57浏览
  •   基于 2025 年行业权威性与时效性,以下梳理国内知名软件定制开发企业,涵盖综合型、垂直领域及特色技术服务商:   华盛恒辉科技有限公司:是一家专注于高端软件定制开发服务和高端建设的服务机构,致力于为企业提供全面、系统的开发制作方案。在部队政企开发、建设到运营推广领域拥有丰富经验,在教育,工业,医疗,APP,管理,商城,人工智能,部队软件、工业软件、数字化转型、新能源软件、光伏软件、汽车软件,ERP,系统二次开发,CRM等领域有很多成功案例。   五木恒润科技有限公司:是一家专业的部队信
    华盛恒辉l58ll334744 2025-05-12 16:13 72浏览
  • 在 AI 浪潮席卷下,厨电行业正经历着深刻变革。AWE 2025期间,万得厨对外首次发布了wan AiOS 1.0组织体超智能系统——通过AI技术能够帮助全球家庭实现从健康检测、膳食推荐,到食材即时配送,再到一步烹饪、营养总结的个性化健康膳食管理。这一创新之举并非偶然的个案,而是整个厨电行业大步迈向智能化、数字化转型浪潮的一个关键注脚,折射出全行业对 AI 赋能的热切渴求。前有标兵后有追兵,万得厨面临着高昂的研发成本与技术迭代压力,稍有懈怠便可能被后来者赶
    用户1742991715177 2025-05-11 22:44 72浏览
  •   定制软件开发公司推荐清单   在企业数字化转型加速的2025年,定制软件开发需求愈发多元复杂。不同行业、技术偏好与服务模式的企业,对开发公司的要求大相径庭。以下从技术赛道、服务模式及行业场景出发,为您提供适配的定制软件开发公司推荐及选择建议。   华盛恒辉科技有限公司:是一家专注于高端软件定制开发服务和高端建设的服务机构,致力于为企业提供全面、系统的开发制作方案。在部队政企开发、建设到运营推广领域拥有丰富经验,在教育,工业,医疗,APP,管理,商城,人工智能,部队软件、工业软件、数字化转
    华盛恒辉l58ll334744 2025-05-12 15:55 103浏览
  • 在印度与巴基斯坦的军事对峙情境下,歼10C的出色表现如同一颗投入平静湖面的巨石,激起层层涟漪,深刻印证了“质量大于数量”这一铁律。军事领域,技术优势就是决定胜负的关键钥匙。歼10C凭借先进的航电系统、强大的武器挂载能力以及卓越的机动性能,在战场上大放异彩。它能够精准捕捉目标,迅速发动攻击,以一敌多却毫不逊色。与之形成鲜明对比的是,单纯依靠数量堆砌的军事力量,在面对先进技术装备时,往往显得力不从心。这一现象绝非局限于军事范畴,在当今社会的各个领域,“质量大于数量”都已成为不可逆转的趋势。在科技行业
    curton 2025-05-11 19:09 178浏览
  • ‌磁光克尔效应(Magneto-Optic Kerr Effect, MOKE)‌ 是指当线偏振光入射到磁性材料表面并反射后,其偏振状态(偏振面旋转角度和椭偏率)因材料的磁化强度或方向发生改变的现象。具体表现为:1、‌偏振面旋转‌:反射光的偏振方向相对于入射光发生偏转(克尔旋转角 θK)。2、‌椭偏率变化‌:反射光由线偏振变为椭圆偏振(克尔椭偏率 εK)。这一效应直接关联材料的磁化状态,是表征磁性材料(如铁磁体、反铁磁体)磁学性质的重要非接触式光学探测手段,广泛用于
    锦正茂科技 2025-05-12 11:02 95浏览
  • 蓝牙耳机是长这个样子,如下图。背部图,如下图。拆开L耳的一侧,有NFC和电池包(501230 3.7V 150mAh)如下图。电池包(501230 3.7V 150mAh)如下图。NFC正面,如下图。NFC背面,如下图。如何理解NFC的工作原理呢,搜集一下相关的资料,如下图。拆开R耳的一侧,PCB正面,如下图。PCB背面,如下图。有两组红黑的线,一组连接到了喇叭,另一组连接到了MIC头上,MIC头参数如下图。蓝牙模块(CSR 8635),有蛇形PCB走线做成天线,节约了天线成本,如下图。该IC介
    liweicheng 2025-05-10 00:45 36浏览
  • 体积大小:14*11*2.6CM,电气参数:输入100V-240V/10A,输出16V24A。PCB 正面如下图。PCB 背面如下图。根据实际功能可以将PCB分成几部分:EMI滤波,PFC电路,LLC电路。EMI滤波区域,两级共模电感,LN各用了保险丝加压敏电阻,继电器(HF32FV-G)用来切除NTC的,为了提高效率点,如下图。PFC电路区域,如下图。LLC电路区域,如下图。详细分析一下该电源用的主要IC还有功率器件。AC侧采用了两颗整流桥进行并联,器件增加电流应力,如下图。共模电感都有放电针
    liweicheng 2025-05-10 20:03 39浏览
  • 行车记录仪是长这个样子的,如下图。从前面拆去玻璃挡板,可以清晰的看见里面的部件,5个按键电路板,液晶显示屏,摄像头,喇叭,电池包,还有一块主电路板。液晶显示屏正面,如下图。液晶显示屏背面,如下图。喇叭,如下图。5个按键的电路板,MENU,DOWN,POWER,UP,OK总共5个按键功能,导线连接到主电路板上,如下图。电池包,303040聚合物锂电池,3.7V,300mAH,如下图。如下图。摄像头,如下图。拿去摄像头外壳,如下图。分离广角聚集镜头和PCB板,如下图。广角聚焦镜头,具体结构如下图。P
    liweicheng 2025-05-09 22:50 29浏览
  • 【拆解】+自动喷香机拆解 家里之前买了从PDD买了一个小型自动喷香机放在厕所里。来增加家里的温馨感,这东西看着确实小巧,精致。可是这东西吧,耗电就是快,没过几天就没电了。今个就让我拆开看看什么在捣鬼。如下是产品的实物和宣传图: 由于螺丝孔太小和限位很深。对于我的螺丝刀套装没用。只能使用那种螺丝刀细头,同时又长的小螺丝刀进行拆解 拧下三颗螺丝钉,用一字螺丝刀撬开外壳,内部结构就呈现在眼前。 内部构造相当简单,部件没多少。就是锂电池供电,通过MCU实现按键控制,段码屏控制,LE
    zhusx123 2025-05-10 19:55 53浏览
  •         信创产业含义的“信息技术应用创新”一词,最早公开信息见于2019年3月26日,在江苏南京召开的信息技术应用创新研讨会。本次大会主办单位为江苏省工业和信息化厅和中国电子工业标准化技术协会安全可靠工作委员会。        2019年5月16日,美国将华为列入实体清单,在未获得美国商务部许可的情况下,美国企业将无法向华为供应产品。       2019年6
    天涯书生 2025-05-11 10:41 128浏览
  • 【拆解】+CamFi卡菲单反无线传输器拆解 对于单反爱好者,想要通过远程控制自拍怎么办呢。一个远程连接,远程控制相机拍摄的工具再合适不过了。今天给大伙介绍的是CamFi卡菲单反无线传输器。 CamFi 是专为数码单反相机打造的无线传输控制器,自带的 WiFi 功能(无需手机流量),不但可通过手机、平板、电脑等设备远程连接操作单反相机进行拍摄,而且还可实时传输相机拍摄的照片到 iPad 和电视等大屏设备进行查看和分享。 CamFi 支持大部分佳能和尼康单反相机,内置可充电锂离子电池,无需相机供电。
    zhusx123 2025-05-11 14:14 89浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦