了解设备树机制

0x9*_*x90 2 linux kernel device device-tree

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

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>;
        };
    };
Run Code Online (Sandbox Code Playgroud)
  1. ranges和 和有什么区别reg
  2. 范围的维度是多少,解析器如何计算出其中写入的内容?
  3. 缺少一个我还不明白的部分?无法.h在文件中包含文件而不是硬编码值.dts

Jon*_*ham 5

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

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

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