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)
  • 六西格玛首先是作为一个量度质量水平的指标,它代表了近乎完美的质量的水平。如果你每天都吃一个苹果,有一间水果店的老板跟你说,他们所卖的苹果,质量达到六西格玛水平,换言之,他们每卖一百万个苹果,只会有3.4个是坏的。你算了一下,发现你如果要从这个店里买到一个坏苹果,需要805年。你会还会选择其他店吗?首先发明六西格玛这个词的人——比尔·史密斯(Bill Smith)他是摩托罗拉(Motorloa)的工程师,在追求这个近乎完美的质量水平的时候,发明了一套方法模型,开始时是MAIC,后来慢慢演变成DMA
    优思学院 2025-03-27 11:47 149浏览
  • 在嵌入式语音系统的开发过程中,广州唯创电子推出的WT588系列语音芯片凭借其优异的音质表现和灵活的编程特性,广泛应用于智能终端、工业控制、消费电子等领域。作为该系列芯片的关键状态指示信号,BUSY引脚的设计处理直接影响着系统交互的可靠性和功能拓展性。本文将从电路原理、应用场景、设计策略三个维度,深入解析BUSY引脚的技术特性及其工程实践要点。一、BUSY引脚工作原理与信号特性1.1 电气参数电平标准:输出3.3V TTL电平(与VDD同源)驱动能力:典型值±8mA(可直接驱动LED)响应延迟:语
    广州唯创电子 2025-03-26 09:26 201浏览
  • 汽车导航系统市场及应用环境参照调研机构GII的研究报告中的市场预测,全球汽车导航系统市场预计将于 2030年达到472亿美元的市场规模,而2024年至2030年的年复合成长率则为可观的6.7%。汽车导航系统无疑已成为智能汽车不可或缺的重要功能之一。随着人们在日常生活中对汽车导航功能的日渐依赖,一旦出现定位不准确或地图错误等问题,就可能导致车主开错路线,平白浪费更多行车时间,不仅造成行车不便,甚或可能引发交通事故的发生。有鉴于此,如果想要提供消费者完善的使用者体验,在车辆开发阶段便针对汽车导航功能
    百佳泰测试实验室 2025-03-27 14:51 187浏览
  • 案例概况在丹麦哥本哈根,西门子工程师们成功完成了一项高安全设施的数据集成项目。他们利用宏集Cogent DataHub软件,将高安全设施内的设备和仪器与远程监控位置连接起来,让技术人员能够在不违反安全规定、不引入未经授权人员的情况下,远程操作所需设备。突破OPC 服务器的远程连接难题该项目最初看似是一个常规的 OPC 应用:目标是将高安全性设施中的冷水机(chiller)设备及其 OPC DA 服务器,与远程监控站的两套 SCADA 系统(作为 OPC DA 客户端)连接起来。然而,在实际实施过
    宏集科技 2025-03-27 13:20 109浏览
  • 文/陈昊编辑/cc孙聪颖‍2025 年,作为中国实施制造强国战略第一个十年计划的关键里程碑,被赋予了极为重大的意义。两会政府工作报告清晰且坚定地指出,要全力加速新质生产力的发展进程,推动传统产业全方位向高端化、智能化与绿色化转型。基于此,有代表敏锐提议,中国制造应从前沿技术的应用切入,逐步拓展至产业生态的构建,最终延伸到提升用户体验的维度,打出独树一帜、具有鲜明特色的发展牌。正是在这样至关重要的时代背景之下,于 AWE 2025(中国家电及消费电子博览会)这一备受瞩目的舞台上,高端厨房的中国方案
    华尔街科技眼 2025-03-25 16:10 82浏览
  • WT588F02B是广州唯创电子推出的一款高性能语音芯片,广泛应用于智能家电、安防设备、玩具等领域。然而,在实际开发中,用户可能会遇到烧录失败的问题,导致项目进度受阻。本文将从下载连线、文件容量、线路长度三大核心因素出发,深入分析烧录失败的原因并提供系统化的解决方案。一、检查下载器与芯片的物理连接问题表现烧录时提示"连接超时"或"设备未响应",或烧录进度条卡顿后报错。原因解析接口错位:WT588F02B采用SPI/UART双模通信,若下载器引脚定义与芯片引脚未严格对应(如TXD/RXD交叉错误)
    广州唯创电子 2025-03-26 09:05 146浏览
  • 在智能语音产品的开发过程中,麦克风阵列的选型直接决定了用户体验的优劣。广州唯创电子提供的单麦克风与双麦克风解决方案,为不同场景下的语音交互需求提供了灵活选择。本文将深入解析两种方案的性能差异、适用场景及工程实现要点,为开发者提供系统化的设计决策依据。一、基础参数对比分析维度单麦克风方案双麦克风方案BOM成本¥1.2-2.5元¥4.8-6.5元信噪比(1m)58-62dB65-68dB拾音角度全向360°波束成形±30°功耗8mW@3.3V15mW@3.3V典型响应延迟120ms80ms二、技术原
    广州唯创电子 2025-03-27 09:23 154浏览
  • 家电,在人们的日常生活中扮演着不可或缺的角色,也是提升人们幸福感的重要组成部分,那你了解家电的发展史吗?#70年代结婚流行“四大件”:手表、自行车、缝纫机,收音机,合成“三转一响”。#80年代随着改革开放的深化,中国经济开始飞速发展,黑白电视机、冰箱、洗衣机这“新三件”,成为了人们对生活的新诉求。#90年代彩电、冰箱、全自动洗衣机开始大量进入普通家庭,快速全面普及,90年代末,家电产品实现了从奢侈品到必需品的转变。#00年代至今00年代,随着人们追求高品质生活的愿望,常用的电视机、洗衣机等已经远
    启英AI平台 2025-03-25 14:12 89浏览
  • 长期以来,智能家居对于大众家庭而言就像空中楼阁一般,华而不实,更有甚者,还将智能家居认定为资本家的营销游戏。商家们举着“智慧家居、智慧办公”的口号,将原本价格亲民、能用几十年的家电器具包装成为了高档商品,而消费者们最终得到的却是家居设备之间缺乏互操作性、不同品牌生态之间互不兼容的碎片化体验。这种早期的生态割裂现象致使消费者们对智能家居兴趣缺失,也造就了“智能家居无用论”的刻板印象。然而,自Matter协议发布之后,“命运的齿轮”开始转动,智能家居中的生态割裂现象与品牌生态之间的隔阂正被基于IP架
    华普微HOPERF 2025-03-27 09:46 109浏览
  • 在当今竞争激烈的工业环境中,效率和响应速度已成为企业制胜的关键。为了满足这一需求,我们隆重推出宏集Panorama COOX,这是Panorama Suite中首款集成的制造执行系统(MES)产品。这一创新产品将Panorama平台升级为全面的工业4.0解决方案,融合了工业SCADA和MES技术的双重优势,帮助企业实现生产效率和运营能力的全面提升。深度融合SCADA与MES,开启工业新纪元宏集Panorama COOX的诞生,源于我们对创新和卓越运营的不懈追求。通过战略性收购法国知名MES领域专
    宏集科技 2025-03-27 13:22 182浏览
  • 在电子设计中,电磁兼容性(EMC)是确保设备既能抵御外部电磁干扰(EMI),又不会对自身或周围环境产生过量电磁辐射的关键。电容器、电感和磁珠作为三大核心元件,通过不同的机制协同作用,有效抑制电磁干扰。以下是其原理和应用场景的详细解析:1. 电容器:高频噪声的“吸尘器”作用原理:电容器通过“通高频、阻低频”的特性,为高频噪声提供低阻抗路径到地,形成滤波效果。例如,在电源和地之间并联电容,可吸收电源中的高频纹波和瞬态干扰。关键应用场景:电源去耦:在IC电源引脚附近放置0.1μF陶瓷电容,滤除数字电路
    时源芯微 2025-03-27 11:19 152浏览
  • ​2025年3月27日​,贞光科技授权代理品牌紫光同芯正式发布新一代汽车安全芯片T97-415E。作为T97-315E的迭代升级产品,该芯片以大容量存储、全球化合规认证、双SPI接口协同为核心突破,直击智能网联汽车"多场景安全并行"与"出口合规"两大行业痛点,助力车企抢占智能驾驶与全球化市场双赛道。行业趋势锚定:三大升级回应智能化浪潮1. 大容量存储:破解车联网多任务瓶颈随着​车机功能泛在化​(数字钥匙、OTA、T-BOX等安全服务集成),传统安全芯片面临存储资源挤占难题。T97-415E创新性
    贞光科技 2025-03-27 13:50 148浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦