次はコードセグメントデバイスツリーファイルから:
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>;
};
};
私の簡単な質問は<>の2つの値は何ですか?たとえば、reg = <0x600000 0x20000>;
最初のアドレスと最後のアドレスであることがわかりました。
答え1
山かっこ(<>)は「32ビット符号なし整数配列」を意味し、私はしばしば「セル」と呼びます。この属性の場合、reg
最初の値は(オフセット)アドレスで、2番目の値はレジスタの長さです。複数の範囲を持つことも可能です。
reg = <addr1 addr1_length addr2 addr2_length ... addrN addrN_length>
源泉:
答え2
通常、2つの数字しか必要ありません。
また、次のように説明しました。https://elinux.org/Device_Tree_Usage#How_Addressing_Worksそれぞれが2つの数字である必要はありません。
たとえば、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ビット値には2つの数値が必要であるためです。
答え3
はい、reg<0xxxx 0xxxx>
代表reg<offset length>
。
offset
はデバイスのベースアドレスであり、その長さによってそのデバイスのアドレス範囲が決まります。