【问题标题】:Devicetree - how are "ranges" mmapped to device nodes?Devicetree - 如何将“范围”映射到设备节点?
【发布时间】:2022-01-26 07:41:56
【问题描述】:

假设我们有这个示例设备树:

我只想知道ranges 使用什么机制以便正确映射到设备节点(ethernet@0,0i2c@1,0flash@2,0)。

是否使用:

  • “孩子的域地址”(红色)或
  • “出现顺序”(紫色)

要正确计算映射?

【问题讨论】:

  • “它是否使用:...来正确计算映射?” -- 两者都不是。 DT 节点的顺序并不重要,通常是为了美观,因此可以立即排除“出现顺序”。看起来 "mechanism" 可能是每个节点的reg 属性的第一个值是内存索引。顺便说一句,设备 I/O 内存的实际映射通常由每个设备驱动程序执行。在 reg 属性中省略有效的基地址和长度是不寻常的。
  • 至少我知道顺序无所谓。 range 是一个三元组,包括 (a) 从子节点的角度来看的地址,(b) 从父节点的角度来看的地址和 (c) 该地址段的大小。所以我有两个想法......考虑范围0 0 0x10100000 0x100000 - 从子节点的角度来看它的地址是0 0。它可以映射到 A: 子节点的名称ethernet@0,0(注意@0,0)。但不太可能,因为我在某处读到 @0,0 部分根本没有使用。这是真的? B: 可能使用了reg = <0 0 0x100> 的初始部分,即0 0

标签: device-tree


【解决方案1】:

是否使用:
...
正确计算映射?

DT 节点的顺序并不重要,通常是为了美观而进行的,因此可以立即排除“外观顺序”。见The order in which the device-tree text file is written, does it matter?

range 属性应该是 值的三元组。
然而,#address-cells 属性(外部总线)指定(外部总线)

值将由 两个 值组成。此“双长度”仅适用于 ,而 是每个父节点的 #address-cells 属性的单个 值。 #size-cells 属性指定 值将由单个 值组成。
因此,rangle 属性在您的示例中显然由 4 个值组成的“三元组”组成,前两个用于 ,下一个用于 ,最后一个用于 .

reg 属性应该是一对

值。
由于外部总线 #address-cells 属性指定(和/或默认值为 2)
值将由 两个 值组成,而 #size-cells 属性指定 值将由单个 值组成,在您的示例中,reg 属性将包含由 3 个值组成的“对”,前两个用于
,最后一个用于 .

请注意,DT 规范要求 reg 属性中的

必须与节点名称中的“@”匹配。 中额外的“,0”就是你猜的,每个reg
的后半部分。

所以你的问题的答案是 ,它与片选值有关。
但是,设备节点中的显着链接 "mechanism" 不是引用节点名称中的 ,而是 reg 属性中的

【讨论】:

    猜你喜欢
    • 2015-07-21
    • 2017-07-30
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    • 2020-09-12
    • 2011-04-03
    相关资源
    最近更新 更多