以下是代码片段在设备树文件中:
flash@0 {
compatible = "n25q128";
reg = <0x0>;
spi-max-frequency = <50000000>;
#address-cells = <1>;
#size-cells = <1>;
partition@qspi-fsbl-uboot {
label = "qspi-fsbl-uboot";
reg = <0x0 0x100000>;
};
partition@qspi-linux {
label = "qspi-linux";
reg = <0x100000 0x500000>;
};
partition@qspi-device-tree {
label = "qspi-device-tree";
reg = <0x600000 0x20000>;
};
partition@qspi-rootfs {
label = "qspi-rootfs";
reg = <0x620000 0x5E0000>;
};
partition@qspi-bitstream {
label = "qspi-bitstream";
reg = <0xC00000 0x400000>;
};
};
我的简单问题是 < > 中的两个值是什么?例如在 reg = <0x600000 0x20000> 中;
我认为它是初始地址和最终地址,但这在这里意义不大,因为最终地址不能低于初始地址。
答案1
尖括号 (<>) 表示“32 位无符号整数数组”,我相信它们通常被称为“单元格”。在具有该属性的情况下reg
,第一个值是(偏移)地址,第二个值是寄存器的长度。请注意,也可以有多个范围,即
reg = <addr1 addr1_length addr2 addr2_length ... addrN addrN_length>
资料来源:
答案2
一般来说,它不必只是两个数字
此外,正如所解释的:https://elinux.org/Device_Tree_Usage#How_Addressing_Works每个不必只是两个数字。
例如,在 64 位设备中,我们经常有:
#address-cells = <2>;
#size-cells = <2>;
这意味着地址和偏移量的类型为:
reg = <0x1 0x2 0x3 0x4>
它代表一个区域:
- 基地址:00000001 00000002(由2个32位数字组成
#address-cells = <2>;
) - 长度:00000003 00000004(由2个32位数字组成
#size-cells = <2>;
)
这是因为根据定义,设备树中的每个数字都是 32 位宽,因此每个 64 位值需要两个数字。
答案3
是的,reg<0xxxx 0xxxx>
代表reg<offset length>
.
offset
是设备的基地址,长度将决定给定设备的地址范围。