【问题标题】:/bits/ 64 in device tree source - where this is defined?/bits/ 设备树源中的 64 - 这是在哪里定义的?
【发布时间】:2022-10-15 04:47:10
【问题描述】:

我在 arm64 的一些 .dts 文件中看到了这种表示法:

  &foo {
    addrs = /bits/ 64 <0x11223344556677aa>,
            /bits/ 64 <0x11223344556677bb>;
  };

显然,这意味着一个 64 位的值。 但是这个语法是在哪里指定的?它不在latest 'official' spec 中。

【问题讨论】:

  • 它被实现为分隔符起始字符串脚本/dtc/treesource.c内核源代码。
  • 另请查看说明of_property_read_u8_array()of_property_read_u16_array()包括/linux/of.h但是这些程序的 32 位和 64 位版本并没有提及使用该大小说明符!?
  • 内核树中的 dtc 似乎来自“上游”(请参阅​​scripts/dtc/update-dtc-source.sh),所以这个 /bits/ 前缀看起来像未记录的语法扩展,不是特定于 Linux 的 - 如果目标知道其他元素大小。 @sawdust 如果您将 cmets 转换为回答,我会将其标记为已接受
  • /bits/ 8|16|32|64 的解析器 src 在 scripts/dtc/dtc-parser.y 中,arrayprefix: case (第 356 行)
  • 谢谢,但我会继续写一个答案,因为我的 cmets 就是这样,我没有什么要补充的。我很惊讶这没有记录。也许你可以收集你发现的所有东西,然后回答你自己的帖子。

标签: linux-kernel device-tree


【解决方案1】:

好的,所以我会回答我自己的问题。

/bits/ 8|16|32|64 前缀是未记录的扩展名;它已经存在了很长时间,但不会在下一个 devicetree.org 规范(v. 0.4)中合法化。

它允许布置指定位数(或单个值)的值数组。 前缀 /bits/ 32 给出与没有前缀完全相同的结果。

Linux 具有读取此类数组的内核 API:of_property_read_u64_array(), of_property_read_u32_array(), of_property_read_u16_array(), of_property_read_u8_array(),在include/linux/of.h 中定义。
(要查询使用此前缀定义的数组的大小,请使用“标准”数组的通用 API)。

它由 Linux 内核树中的 dtc 编译器处理(参见 scripts/dtc/dtc-parser.yarrayprefix: 案例;在第 356 行附近)。 请注意,在“/bits/”之后和“<”之前必须有一个空格。
在 devicetree.org 上找到的测试和参考 python 代码不支持此前缀。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 2022-10-09
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    相关资源
    最近更新 更多