首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解设备树机制

理解设备树机制
EN

Stack Overflow用户
提问于 2013-12-11 09:31:50
回答 2查看 6.7K关注 0票数 2

正在读取设备树使用并到达描述节点的ranges键属性的部分。

代码语言:javascript
复制
external-bus {
        #address-cells = <2>
        #size-cells = <1>;
        ranges = <0 0  0x10100000   0x10000     // Chipselect 1, Ethernet
                  1 0  0x10160000   0x10000     // Chipselect 2, i2c controller
                  2 0  0x30000000   0x1000000>; // Chipselect 3, NOR Flash

        ethernet@0,0 {
            compatible = "smc,smc91c111";
            reg = <0 0 0x1000>;
            interrupts = < 5 2 >;
        };

        i2c@1,0 {
            compatible = "acme,a1234-i2c-bus";
            #address-cells = <1>;
            #size-cells = <0>;
            reg = <1 0 0x1000>;
            interrupts = < 6 2 >;
            rtc@58 {
                compatible = "maxim,ds1338";
                reg = <58>;
                interrupts = < 7 3 >;
            };
        };

        flash@2,0 {
            compatible = "samsung,k8f1315ebm", "cfi-flash";
            reg = <2 0 0x4000000>;
        };
    };
  1. rangesreg有什么区别?
  2. 范围的维度是什么,解析器是如何计算出在其中写入的内容的?
  3. 一个我还不明白的缺失部分?不能在.h文件中包含.dts文件而不能包含硬编码值?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-11 21:51:00

"range“属性将当前节点”外部总线“节点中的一个或多个地址(从范围左侧的第二个数字)映射到父节点(可能是CPU)地址空间中的地址(范围中的第三个数字)。第四个数字是范围的长度。总线可以在外接外设的外部有自己的地址,因此管理总线外设的司机需要知道这些范围,以便读取或写入设备。

"reg“属性指示设备驻留在定义设备的节点的地址范围内的地址(本例中为”外部总线“)。因此,在本例中,flash@2,0驻留在外部总线范围的地址0,并扩展到地址0x04000000。这对应于父(CPU)地址空间中的地址范围0x30000000至0x34000000。

我假设第三个范围的长度说明符2 0 0x30000000 0x1000000>; // Chipselect 3, NOR Flash实际上应该是0x04000000而不是0x1000000

票数 5
EN

Stack Overflow用户

发布于 2021-03-04 01:45:13

对于这个经典的例子,的解释是正确的。但是,了解设备树中ranges属性的详细结构是很好的。

  • 范围是地址翻译的列表。
  • ranges表中的每个条目都是包含子地址、父地址和子地址空间中区域的大小的元组。

喜欢

代码语言:javascript
复制
ranges = < Child1Address ParentAddressForChild1 sizeofchild1 
           Child2Address ParentAddressForChild2 sizeofchild2
           Child3Address ParentAddressForChild3 sizeofchild3
>;
  • 每个字段的大小如下所示

要获取子地址大小,请检查子节点的#address-cells值。

若要对父节点的父地址大小进行检查,请检查父节点的#address-cells值,

若要获取大小长度,请检查子节点的#size-cells值。

Exampe1:在as问题中提到

代码语言:javascript
复制
    #address-cells = <1>;
    #size-cells = <1>;
    external-bus {
        #address-cells = <2>;
        #size-cells = <1>;
        ranges = <0 0  0x10100000   0x10000     // Chipselect 1, Ethernet
                  1 0  0x10160000   0x10000     // Chipselect 2, i2c controller
                  2 0  0x30000000   0x1000000>; // Chipselect 3, NOR Flash

让我们破译第一项。

  1. 子地址-单元格大小为2,所以前两个条目提到子地址。(此地址仅限于本地子地址)此外,如何解码这两个条目是特定于设备的。设备驱动程序应该有这些文档)
  2. 父地址-单元格大小为1,因此下一项是该子项目的父地址。
  3. 子大小-单元格为1,因此下一项是子项的范围(wrt到父地址)。

Exampe2: PCI设备入口

代码语言:javascript
复制
#address-cells = <1>;
#size-cells = <1>;
pci@0x10180000 {
    compatible = "arm,versatile-pci-hostbridge", "pci";
    reg = <0x10180000 0x1000>;
    interrupts = <8 0>;
    bus-range = <0 0>;

    #address-cells = <3>
    #size-cells = <2>;
    ranges = <0x42000000 0 0x80000000 0x80000000 0 0x20000000
              0x02000000 0 0xa0000000 0xa0000000 0 0x10000000
              0x01000000 0 0x00000000 0xb0000000 0 0x01000000>;

这里

0x42000000 0 0x80000000是child1的地址。在PCI驱动程序文档中提到了如何解码这三个条目。

0x80000000是父地址。父节点是cpu,因此从cpu中,这个地址用于与此分支进行对话。

0 0x20000000是此设备在父地址空间中的大小。(地址0至512 to )

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20515374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档