4 Memory mapping and addressing
주소는 다음 세 가지 속성을 사용하여 인코딩된다.
- reg
- #address-cells
- #size-cells
주소를 지정할 수 있는 각 디바이스는 reg 속성이 있다. 이 속성은 셀(cells)이라고 하는 하나 이상의 32비트 정수를 사용하여, 디바이스에서 사용되는 주소 범위를 나열한다. 주소와 길이 모두 크기가 가변이므로, 부모 노드의 #address-cells와 #size-cells 속성은 각 필드의 셀 수를 정의한다.
CPU 노드는 주소 지정의 간단한 경우를 나타낸다. 각 CPU에는 고유한 ID가 할당되며, CPU ID와 관련된 크기는 없다.
cpus {
#address-cells = <1>;
#size-cells = <0>;
cpu0: PowerPC,e6500@0 {
device_type = "cpu";
reg = <0 1>;
next-level-cache = <&L2>;
};
cpu1: PowerPC,e65000@2 {
device_type = "cpu";
reg = <2 3>;
next-level-cache = <&L2>;
};
cpu2: PowerPC,e6500@4 {
device_type = "cpu";
reg = <4 5>;
next-level-cache = <&L2>;
};
cpu3: PowerPC,e65000@6 {
device_type = "cpu";
reg = <6 7>;
next-level-cache = <&L2>;
};
};
메모리 매핑된 디바이스에는 CPU 노드에서 볼 수 있는 단일 주소 값이 아니라 주소 범위가 할당된다. 부모의 #size-cells는 각 자식의 길이 필드(32비트 수량)가 얼마나 큰 지를 나타낸다. #address-cells는 자식당 얼마나 많은 32비트 주소 셀이 사용되는지 나타낸다.
{
#address-cells = <0x1>;
#size-cells = <0x1>;
compatible = "fsl,p1022-immr", "simple-bus";
i2c@3100 {
reg = <0x3100 0x100>;
};
}
위의 예에서, I2C 자식 노드의 reg 속성에 두 개의 셀이 있다. 첫 번째 셀은 0x3100의 기본 주소에 해당한다. 두 번째 셀은 크기이다. 따라서 이 특정 I2C 컨트롤러의 레지스터 맵은 0x3100 ~ 0x31ff 이다.
또한 메모리 맵핑된 디바이스는 부모 디바이스에서 자식 디바이스로 주소 범위를 변환하기 위해 범위 속성을 포함할 수 있다.
루트 노드는 CPU의 주소 공간을 기술한다. 루트의 자식 노드는 CPU의 주소 도메인을 사용하고 명시적인 매핑은 필요하지 않다. 그러나 루트 노드의 직계 자식이 아닌 노드는 CPU의 주소 도메인을 사용하지 않는다. 디바이스 트리는 한 도메인에서 다른 도메인으로 주소를 변환하는 방법을 지정해 주어야 한다. 범위 속성을 사용하여, 이러한 변환이 수행되고 직접 매핑되지 않은 자식은 메모리 매핑된 주소를 얻을 수 있다.
/ {
#address-cells = <0x2>;
#size-cells = <0x2>;
soc@fffe00000 {
ranges = <0x0 0xf 0xffe00000 0x100000>;
#address-cells = <0x1>;
#size-cells = <0x1>;
compatible = "fsl,p1022-immr", "simple-bus";
i2c@3100 {
#address-cells = <0x1>;
#size-cells = <0x0>;
cell-index = <0x1>;
compatible = "fsl-i2c";
reg = <0x3100 0x100>;
codec@1a {
compatible = "wlf,wm8776";
reg = <0x1a>;
};
};
범위 속성은 <bus-address parent-bus-address size> 형식으로 서브 디바이스의 주소 범위를 정의한다.
- bus-address - 이 버스 노드의 #address-size를 사용하는, 버스 기본 주소
- parent-bus-address - 부모 노드의 #address-size를 사용하는, 부모 주소 공간의 기본 주소
- size - 이 노드의 #address-size를 사용하는, 매핑 크기
빈 범위 속성은 부모 주소 공간에서 자식 주소 공간으로의 변환이 ID 매핑 전용임을 나타내며, 이는 부모의 버스 주소 공간이 자식의 버스 주소 공간과 동일함을 의미한다. 범위 속성이 없는 것은 빈 범위 속성과 다르다. 범위 속성이 없으면 변환이 불가능함을 의미한다(예: CPU 노드 사용).
위의 예에서, SoC에는 다음으로 매핑되는 범위가 정의되어 있다:
- Bus address = 0x0 (SoC 노드의 #address-size를 사용)
- Parent address = 0x0F_FFE0_0000
이 예에서 SoC 노드는 이 주소에서 정의된다. 이것은 QorIQ P1022 디바이스의 CCSR 기본 주소(또는 내부 레지스터 맵 기본 주소)에 해당한다. - Size = 0x100000 (자식 노드의 #address-size를 사용)
참고 (Parent address = 0x0F_FFE0_0000)
숫자는 디바이스 트리에서 32비트 빅엔디안으로 표시된다. 그러나 부모 노드의 #address-size가 2로 설정되어 있기 때문에, 64비트 주소 0x0000_000F_FFE0_0000로 두 셀을 연결한다.
이들은 본질적으로 자식의 주소 0x0을 SoC의 기본 주소인 0xF_FFE0_0000에 매핑한다. 예를 들어, 정의된 I2C 컨트롤러는 주소 0x3100에 있으며, 이는 베이스에서 오프셋 0x3100에 해당하거나, SoC 절대 주소 0xF_FFE0_3100에 해당한다.
마지막으로 프로세서 버스에 메모리 매핑되지 않은 디바이스가 있다. CPU에서 직접 액세스할 수 없는 간접 주소가 있을 수 있다. 대신, 부모의 디바이스 드라이버가 버스 액세스를 담당하게 된다.
i2c@3000 {
gpio3: gpio@21 {
compatible = "nxp,pca9555";
reg = <0x21>;
#gpio-cells = <2>;
gpio-controller;
polarity = <0x00>;
};
예를 들어, PSC9131rdb.dts에서 가져온 위의 I2C 컨트롤러는 주소 0x21이 할당된 I2C 디바이스를 보여주지만, 연결된 길이나 범위가 없다.
PCI 주소 공간은 CPU 주소 공간과 완전히 분리되며, 주소 변환은 약간 다르게 처리된다. 이것은 여전히 range, #address-cells, #size-cells 속성을 사용하여 수행된다.
pci1: pcie@ffe09000 {
reg = <0 0xffe09000 0 0x1000>;
ranges = <0x2000000 0x0 0xa0000000 0 0xa0000000 0x0 0x20000000
0x1000000 0x0 0x00000000 0 0xffc10000 0x0 0x10000>;
PCI 자식 주소는 phys.hi, phys.mid, phys.low로 레이블이 지정된 세 개의 셀을 사용한다. 이들 중 첫 번째인 phys.hi는 공간에 대한 정보를 인코딩한다. 가장 흥미로운 것은 구성 공간, I/O 공간이나 32/64비트 메모리 공간을 나타내는 코딩된 공간일 수 있다.
PCI 자식 주소 다음에는 CPU 주소 공간과 크기가 따라온다. 이들의 크기는 부모의 #address-cells와 #size-cells 정의에 따라 결정된다.
위의 예에는, 두 개의 주소 공간이 정의되어 있다:
- PCI 주소 0xa0000000에서 시작하는 32비트 메모리 영역, CPU 주소 0xa000000에 매핑되고 size = 0x20000000이다.
- PCI 주소 0x0에서 시작하는 I/O 영역, CPU 주소 0xffc10000에 매핑되고 size = 0x10000이다.
4.1 Partitions
여러번, 플래시 파티션은 디바이스 트리에 기술되어 있다(TABLE 1 참조). 예를 들어, 이것은 커널이 보는 mtd 디바이스의 파티션에 해당한다. 그러나 파티션은 일반적으로 하드웨어 기술을 기반으로 하지 않으며, 대신 디바이스 트리 작성자가 임의로 파티셔닝하므로 권장하지 않는다.
'NXP i.MX SoC Family > Device Trees' 카테고리의 다른 글
Introduction to Device Trees - Example: Device tree node (0) | 2022.10.13 |
---|---|
Introduction to Device Trees - Interrupts (0) | 2022.10.12 |
Introduction to Device Trees - Syntax (0) | 2022.10.11 |
Introduction to Device Trees - Basic device tree (0) | 2022.10.11 |
Introduction to Device Trees - Introduction (0) | 2022.10.11 |