11 Examples
예를 들어 Power Architecture®에서 디바이스 트리는 arch/powerpc/boot/dts에 있다. ARM® 아키텍처에서 디바이스 트리는 현재 arch/arm/boot/dts에 있다.
다음 섹션은 P2020와 LS1021A-TWR 두 가지 Freescale 제품에 대한 DTS와 DTSI 파일의 주석 처리된 예이다.
참고
간결함을 위해 특정 섹션만 아래에 요약되어 있다.
11.1 P2020 example
다음은 P2020 RDB에 대한 디바이스 트리의 예제 섹션이다. 이 특정 DTS 파일은 여러 DTSI 포함 파일을 사용한다.
11.1.1 P2020rdb.dts
이 테이블은 P2020 보드를 기술하는 P2020rdb.dts 파일을 보여준다.
Table 1. P2020rdb.dts
DTS File | Comments |
---|---|
/include/ "fsl/p2020si-pre.dtsi" | fsl/p2020si-pre.dtsi 파일을 포함한다. |
/ { | 루트 노드는 slash로 식별된다. |
model = "fsl,P2020RDB"; | 디바이스의 제조 업체(fsl)과 모델 번호(P2020RDB)를 정의한다. |
compatible = "fsl,P2020RDB"; | 특정 보드를 기술한다. |
aliases { | aliases 노드의 각 속성은 다른 노드의 인덱스를 정의한다. |
ethernet0 = &enet0; | |
ethernet1 = &enet1; | |
ethernet2 = &enet2; | |
serial0 = &serial0; | |
serial1 = &serial1; | |
pci0 = &pci0; | |
pci1 = &pci1; | |
}; | |
memory { | 메모리 노드 |
device_type = "memory"; | 디바이스 유형을 메모리로 정의한다. |
}; | |
lbc: localbus@ffe05000 { | 0xFFFE05000 주소에서 시작하는, 로컬 버스 노드 |
reg = <0 0xffe05000 0 0x1000>; | reg의 첫 번째 인스턴스는 로컬 버스 노드의 주소와 같아야 한다. address-cells = 2(DTSI 파일에 루트 노드에서 정의됨, 32비트 주소 셀이 2개라는 의미): - address (64비트 수량) = 0x0_FFE0_5000 - size (루트 노드에서) = 2 따라서, 여기서 크기는 0x1000과 동일한 64비트 수량(두 개의 <u32> 값으로 표시)이다. |
/* NOR and NAND Flashes */ | range 속성은 버스(자식)의 주소 공간과 부모의 주소 공간 사이의 변환을 매핑한다.첫 번재 셀은 chip-select address와 size에 대한 오프셋이 뒤따르는 chip select을 나타낸다. |
ranges = <0x0 0x0 0x0 0xef000000 0x01000000 | CS0, offset 0xef000000, size 0x1000000 |
0x1 0x0 0x0 0xffa00000 0x00040000 | CS1, offset 0xffa00000, size 0x40000 |
0x2 0x0 0x0 0xffb00000 0x00020000>; | CS2, offset 0xffb00000, size 0x20000 |
nor@0,0 { | 이것은 로컬 버스의 첫 번째 자식이다. CS = 0, address 오프셋은 0x0이다. |
#address-cells = <1>; | 자식(예로 파티션)의 address는 32비트이다. |
#size-cells = <1>; | 자식의 size는 32비트이다. |
compatible = "cfi-flash"; | NOR용 하드웨어는 cfi-flash로 표시되어 있다. |
reg = <0x0 0x0 0x1000000>; | 로컬 버스는 첫 번째 셀을 chip select으로 정의하고, 그 다음에 address와 size를 정의한다. CS = 0, address offset 0x0000_0000, size = 0x1000000 |
bank-width = <2>; | 로컬 버스에서 16비트 디바이스 |
device-width = <1>; | cfi-flash에 특정한 바인딩 |
partition@0 { | NOR의 첫 번째 자식 |
/* This location must not be altered */ | |
/* 256KB for Vitesse 7385 Switch firmware */ | |
reg = <0x0 0x00040000>; | reg = 0, 이는 NOR의 상단(부모 = 0x0_EF00_0000으로 정의됨)에서 시작되는 것을 나타내며, size = 0x40000으로 주어진다. |
label = "NOR (RO) Vitesse-7385 Firmware"; | label와 read-only는 드라이버에 대한 특정 바인딩이다. label은 디바이스를 정의하는 사람이 읽을 수 있는 문자열이다. |
read-only; | |
}; | |
partition@40000 { | NOR의 두번째 자식, 오프셋 0x40000에서 시작 |
/* 256KB for DTB Image */ | |
reg = <0x00040000 0x00040000>; | Start address = 0x40000이고 size = 0x40000 |
label = "NOR (RO) DTB Image"; | |
read-only; | |
}; | |
...... | |
nand@1,0 { | 로컬 버스의 nand 자식, chip select = 1, 부모로 부터 address offset = 0x0 |
#address-cells = <1>; | |
#size-cells = <1>; | |
compatible = "fsl,p2020-fcm-nand", | NAND 노드는 두 개의 드라이버와 호환되는 것으로 정의되어 있다(fsl와 p2020-fcm-nand). |
"fsl,elbc-fcm-nand"; | |
reg = <0x1 0x0 0x40000>; | 로컬 버스는 첫 번째 셀을 chip select로 정의하고, 그 다음에 address와 size를 정의한다. CS = 1, address offset 0x0000_0000, size = 0x4_0000 |
partition@0 { | |
/* This location must not be altered */ | |
/* 1MB for u-boot Boot loader Image */ | |
reg = <0x0 0x00100000>; | NAND의 첫 번째 자식, NAND 주소 범위의 상단에 있다. |
label = "NAND (RO) U-Boot Image"; | |
read-only; | |
}; | |
partition@100000 { | NAND의 두 번째 자식, address 오프셋이 0x10_0000 |
/* 1MB for DTB Image */ | |
reg = <0x00100000 0x00100000>; | address는 NAND 상단에서 부터 오프셋 0x10_0000이다. |
label = "NAND (RO) DTB Image"; | |
read-only; | |
}; | |
...... | |
soc: soc@ffe00000 { | 레이블은 주소가 0xFE00_0000인 SoC용이다. 참고 : 루트 노드의 #addresscells 속성이 2(실제로 dtsi 파일의 #address-cells에 매핑)로 설정되어 있기 때문에, 이것은 32비트보다 크다. 이 노드는 내부 SoC 레지스터를 주소 0x0FFE000000에 매핑한다. |
ranges = <0x0 0x0 0xffe00000 0x100000>; | 버스의 주소 공간과 부모의 주소 공간 사이의 변환을 매핑한다. 자식 노드의 주소 크기가 1이고, 이 노드의 주소 크기가 2이기 때문이다. 이것은 노드의 address 0x0을 size가 0x100000인 0x0_FFE0_0000에 매핑한다. |
...... | |
i2c@3000 { | address 0x3000의 I2C 노드 |
rtc@68 { | 부모로부터 오프셋 0x68의 자식 RTC |
compatible = "dallas,ds1339"; | 하드웨어는 Dallas, ds1339이다. |
reg = <0x68>; | address 0x68 |
}; | |
}; | |
...... | |
spi@7000 { | 오프셋 0x7000의 SPI 노드 |
flash@0 { | label이 flsah인, 오프셋 0의 SPI 자식 |
#address-cells = <1>; | 자식 노드는 하나의 <u32> address를 사용한다. |
#size-cells = <1>; | 자식 노드는 size를 위해 하나의 <u32>를 사용한다. |
compatible = "spansion,s25sl12801"; | 하드웨어는 Spansion, s25sl12801이다. |
reg = <0>; | |
spi-max-frequency = <40000000>; | 추가 정보 분석 - SPI 드라이버에서 가능한 SPI 포트에서 허용하는 최대 주파수 |
partition@0 { | flash의 자식, 오프셋 0 |
/* 512KB for u-boot Boot loader Image */ | |
reg = <0x0 0x00080000>; | 오프셋 0, size 0x80000 |
label = "SPI (RO) U-Boot Image"; | 파티션에 사용되는 label |
read-only; | 속성은 flash 드라이버로 분석 가능 |
}; | |
partition@80000 { | flash 아래 두 번째 자식 파티션 |
/* 512KB for DTB Image */ | |
reg = <0x00080000 0x00080000>; | 오프셋 0x80000, size = 0x80000 |
label = "SPI (RO) DTB Image"; | 파티션에 사용되는 label |
read-only; | 속성은 flash 드라이버로 분석 가능 |
}; | |
partition@100000 { | flash 자식 파티션, 오프셋 0x100000 |
/* 4MB for Linux Kernel Image */ | |
reg = <0x00100000 0x00400000>; | 오프셋 0x100000, size 0x400000 |
label = "SPI (RO) Linux Kernel Image"; | 파티션에 사용되는 label |
read-only; | 속성은 flash 드라이버로 분석 가능 |
}; | |
partition@500000 { | flash 자식 파티션, 오프셋 0x500000 |
/* 4MB for Compressed RFS Image */ | |
reg = <0x00500000 0x00400000>; | 오프셋 0x500000, size 0x400000 |
label = "SPI (RO) Compressed RFS Image"; | 파티션에 사용되는 label |
read-only; | 속성은 flash 드라이버로 분석 가능 |
}; | |
partition@900000 { | flash 자식 파티션, 오프셋 0x900000 |
/* 7MB for JFFS2 based RFS */ | |
reg = <0x00900000 0x00700000>; | 오프셋 0x900000, size 0x700000 |
label = "SPI (RW) JFFS2 RFS"; | 파티션에 사용되는 label |
}; | |
}; | |
}; | |
usb@22000 { | SoC로부터 오프셋 0x22000의 USB |
phy_type = "ulpi"; | ULPI 인터페이스를 나타내는 드라이버가 속성을 분석할 수 있다. |
dr_mode = "host"; | USB 호스트를 나타내는 드라이버가 속성을 분석할 수있다. |
}; | |
mdio@24520 { | 오프셋 0x24520의 MDIO 포트 |
phy0: ethernet-phy@0 { | MDIO로부터 오프셋 0x0의 자식 PHY0 |
interrupts = <3 1 0 0>; | xIVPR=3, active-low, normal |
reg = <0x0>; | |
}; | |
enet0: ethernet@24000 { | SoC로부터 오프셋 0x2400의 ethernet 0 |
fixed-link = <1 1 1000 0 0>; | fixed link 드라이버로 속성은 분석할 수 있다. |
phy-connection-type = "rgmii-id"; | PHY connection = RGMII를 나타내는 드라이버로 속성은 분석할 수 있다. |
}; | |
enet1: ethernet@25000 { | SoC로부터 오프셋 0x2500의 ethernet 1 |
tbi-handle = <&tbi0>; | TBI0에 대한 포인터 |
phy-handle = <&phy0>; | Ethernet PHY0(phandle)에 대한 포인터 |
phy-connection-type = "sgmii"; | PHY connection = SGMII를 나타내는 드라이버로 속성은 분석할 수 있다. |
}; | |
pci0: pcie@ffe08000 { | |
reg = <0 0xffe08000 0 0x1000>; | 루트 노드에서 오프셋 0xffe08000의 PCIe |
status = "disabled"; | 현재 비활성화로 설정됨 |
}; | |
pci1: pcie@ffe09000 { | 루트 노드에서 오프셋 0xffe09000의 PCIe |
reg = <0 0xffe09000 0 0x1000>; | PCI1 레지스터 0xffe090000. address-cells = 2 (DTSI 파일에 정의된 루트 노드) : - address (64비트 수량) = 0x0_ffe09000 - size = 0x1000 |
ranges = <0x2000000 0x0 0xa0000000 0 0xa0000000 0x0 0x20000000 |
PCI 자식 address는 세 개의 셀(phys.hi, phys.mid, phys.low)을 사용한다. phys.hi = 0x2000000, prefetchable, configuration space, memoryspace 등의 바인딩에 정의된 필드이다. 이 경우 32비트 메모리 공간에 매핑된다. PCI address = 0x0_a0000000 루트 노드에서 0x0_a0000000 공간 변환 (루트 공간의 address-size 사용) Size of window = 0x20000000 |
0x1000000 0x0 0x00000000 0 0xffc10000 0x0 0x10000>; | phys.hi = 0x2000000, prefetchable, configuration space, memory space 등의 바인딩에 정의된 필드이다. 이 경우 I/O 영역에 매핑된다. PCI address = 0x0_00000000 루트 노드에서 0x0_ffc10000 공간 변환(루트 공간의 address-size 사용) Size of window = 0x10000 |
pcie@0 { | 부모(루트에서 0xffe09000)에서 오프셋 0x0의 자식 PCIe |
ranges = <0x2000000 0x0 0xa0000000 | PCIe(p2020rdb-post.si에 있는)는 자식에 대한 3개의 <u32> address 셀, size = 2 <u32>로 정의된다. phys.hi=0x2000000 = 32비트 메모리 영역 PCI address = 0x0_a0000000 0x2000000 (phys.hi), 0x0 (phys.mid), 0xa0000000 (phys.low) 공간 변환 Size of window = 0x20000000 |
0x2000000 0x0 0xa0000000 | |
0x0 0x20000000 | |
0x1000000 0x0 0x0 | phys.hi=0x1000000 = I/O space PCI address = 0x0_00000000 0x1000000 (phys.hi), 0x0 (phys.mid), 0x0 (phys.low) 공간 변환 Size of window = 0x100000 |
0x1000000 0x0 0x0 | |
0x0 0x100000>; | |
}; | |
}; | |
/include/ "fsl/p2020si-post.dtsi" | "fsl/p2020si-post.dtsi" 파일을 포함 |
11.1.2 P2020si-pre.dtsi
이 테이블은 e500vs_power_isa.dtsi 파일을 포함하는, p2020si-pre.dtsi 파일에 포함되어 있는 디바이스 트리를 제공한다.
Table 2. P2020si-pre.dtsi
DTS file | Comments |
---|---|
/dts-v1/; | 이 DTS 파일이 DTS 버전 1을 준수한다는 것을 나타낸다. |
/include/ "e500v2_power_isa.dtsi" | e500v2_power_isa.dtsi 파일을 포함한다. |
/ { | 루트 노드는 전방의 슬래시로 식별된다. |
compatible = "fsl,P2020"; | 디바이스 드라이버 선택을 위해 프로그램에서 사용할 수 있음 (예: 플랫폼 별로 코드를 선택하기 위해 운영 체제에서 사용) |
#address-cells = <2>; | 자식 address를 인코딩하는 데 사용되는 <u32> 셀의 수를 2로 정의한다. |
#size-cells = <2>; | 루트 노드는 size를 두 개의 <u32>로 정의한다. |
interrupt-parent = <&mpic>; | 인터럽트는 MPIC로 전달한다. |
aliases { | aliases 노드의 각 속성은 다른 노드의 인덱스를 정의한다. |
serial0 = &serial0; | |
serial1 = &serial1; | |
ethernet0 = &enet0; | |
ethernet1 = &enet1; | |
ethernet2 = &enet2; | |
pci0 = &pci0; | |
pci1 = &pci1; | |
pci2 = &pci2; | |
}; | |
cpus { | CPU 노드 |
#address-cells = <1>; | 자식 노드 reg 속성의 address 필드를 인코딩하는 데 사용되는 <u32> 셀의 수를 정의한다. |
#size-cells = <0>; | 자식 노드의 reg 속성에서 size 필드를 인코딩하는 데 사용되는 <u32> 셀의 수를 정의한다. 이는 0이기 때문에, 자식은 reg 속성에 size 필드를 가질 것으로 예상되지 않는다. |
PowerPC,P2020@0 { | 노드는 PowerPC, P2020로 레이블 되어있다. |
device_type = "cpu"; | 이는 CPU 노드를 나타낸다. |
reg = <0x0>; | CPU 0를 나타낸다. |
next-level-cache = <&L2>; | 캐시의 다음 레벨에 대한 포인터 |
}; | |
PowerPC,P2020@1 { | 노드는 PowerPC, P2020로 레이블 되어있다. |
device_type = "cpu"; | 이는 CPU 노드를 나타낸다. |
reg = <0x1>; | CPU 1을 나타낸다. |
next-level-cache = <&L2>; | 캐시의 다음 레벨을 나타낸다. |
}; | |
}; | |
}; |
11.1.3 P2020si-post.dtsi
포스트 DTSI 파일에는 로컬 버스와 PCI와 같은 SoC 주변 디바이스에 대한 정의가 포함되어 있다. 이들 중 대부분은 메인 p2020rdb.dts 파일의 phandle로 참조되어 있다. 이 파일에는 특정 주변 디바이스를 정의하는 다른 많은 DTSI 파일이 포함된다. 이러한 파일은 SoC에 특정되어 있기 때문에, 많은 용도에서 이러한 파일을 만질 필요가 없다.
예를 들어, 다음은 post.dtsi 파일의 로컬 버스 컨트롤러 정의이다:
&lbc {
#address-cells = <2>;
#size-cells = <1>;
compatible = "fsl,p2020-elbc", "fsl,elbc", "simple-bus";
interrupts = <19 2 0 0>;
};
이것은 두 개의 address 셀과 하나의 size 셀을 갖도록 자식을 정의하는 일반적인 노드이다. LBC 하드웨어는 "fsl, p2020-elbc", "fsl, elbc", "simple-bus"와 호환된다. 인터럽트는 #19에서 정의되며, active-high 레벨에서 감지 되도록 설정된다. &lbc는 노드 경로에 대한 레이블이다.
11.2 LS1021A example
다음은 LS1021A-TWR 보드에 대한 디바이스 트리의 예이다. 이 DTS 파일은 LS1021A-TWR 보드를 설명하며, 다음 그림과 같이 다른 DTSI 파일을 포함한다.
11.2.1 ls1021a-twr.dts
이 테이블은 LS1021A-TWR 보드를 설명하는 ls1021a-twr.dts 파일을 보여준다.
Table 3. ls1021a-twr.dts
DTS file | Comments |
---|---|
/dts-v1/; | 이 DTS 파일이 DTS 버전 1을 준수한다는 것을 나타낸다. |
#include "ls1021a.dtsi" | ls1021a.dts 파일을 포함한다. |
/ { | 루트 노드는 전방의 슬래시로 식별된다. |
model = "LS1021A TWR Board"; | 디바이스의 모델 번호를 정의한다. |
aliases { | aliases 노드의 각 속성은 다른 노드의 인덱스를 정의한다. |
enet2_rgmii_phy = &rgmii_phy1; | |
enet0_sgmii_phy = &sgmii_phy2; | |
enet1_sgmii_phy = &sgmii_phy0; | |
}; | |
clocks { | clock 노드 |
sys_mclk: clock { | sys_mclk phandle 정의 |
compatible = "fixed-clock"; | fixed-clock 바인딩을 사용하여, fixed-frequency clock으로 정의 |
#clock-cells = <0>; | 단일 clock 출력 |
clock-frequency = <24576000>; | clock의 주파수 |
}; | |
}; | |
regulators { | regulator 노드 |
compatible = "simple-bus"; | 특정 드라이버 없이 매핑된 메모리; 자식 노드는 플랫폼 디바이스로 등록된다. |
#address-cells = <1>; | 자식 address를 인코딩하는 데 사용되는 <u32> 셀의 수를 1로 정의한다. |
#size-cells = <0>; | 자식 셀은 size 인코딩을 사용하지 않는다. |
reg_3p3v: regulator@0 { | address 0에서 regulator에 대한 reg_3pvp phandle을 정의한다. |
compatible = "regulator-fixed"; | 하드웨어는 "regulator-fixed"와 호환된다; 운영 체제나 디바이스 드라이버에서 사용할 수 있다. |
reg = <0>; | 노드 초기화(reg_3p3v: regulator@0)와 일치하는 주소로, regulator에는 단일 주소 0이 할당된다. |
regulator-name = "3P3V"; | regulator 출력의 이름 |
regulator-min-microvolt = <3300000>; | 허용되는 최소 전압 |
regulator-max-microvolt = <3300000>; | 허용되는 최대 전압 |
regulator-always-on; | regulator는 비활성화하면 절대 안된다. |
}; | |
}; | |
sound { | sound 노드 |
compatible = "fsl,vf610-sgtl5000"; | sound에 사용되는 특정 드라이버 |
simple-audio-card,name = "FSL-VF610-TWR-BOARD"; | |
simple-audio-card,routing = | 오디오 컴포넌트 사이에 연결 없음 |
"MIC_IN", "Microphone Jack", | |
"Microphone Jack", "Mic Bias", | |
"LINE_IN", "Line In Jack", | |
"Headphone Jack", "HP_OUT", | |
"Speaker Ext", "LINE_OUT"; | |
simple-audio-card,cpu = <&sai1>; | .dtsi에 정의되는, phandle &sai1에 대한 포인트 |
simple-audio-card,codec = <&codec>; | 이후에 sgtl5000로 정의되는, phandle &codec에 대한 포인트 |
}; | |
}; | |
&dcu0 { | phandle dcu0에 대한 포인터 |
display = <&display>; | phandle display에 대한 포인터 |
status = "okay"; | 디바이스가 활성화됨 |
display: display@0 { | address 0에 정의되는, display phandle |
bits-per-pixel = <24>; | RGB888의 경우 24이여야 한다. |
display-timings { | 바인딩은 바인딩 문서 display-timing.txt를 참조한다. |
native-mode = <&timing0>; | |
timing0: nl4827hc19 { | |
clock-frequency = <10870000>; | |
hactive = <480>; | |
vactive = <272>; | |
hback-porch = <2>; | |
hfront-porch = <2>; | |
vback-porch = <2>; | |
vfront-porch = <2>; | |
hsync-len = <41>; | |
vsync-len = <4>; | |
hsync-active = <1>; | |
vsync-active = <1>; | |
}; | |
}; | |
}; | |
}; | |
&duart0 { | DTSI 파일에 "duart0:label"와 노드의 확장 경로를 병합한다. |
status = "okay"; | 디바이스가 활성화됨 |
}; | |
&duart1 { | DTSI 파일에 "duart1:label"와 노드의 확장 경로를 병합한다. |
astatus = "okay"; | 디바이스가 활성화됨 |
}; | |
&enet0 { | DTSI 파일에 "enet0:label"와 노드의 확장 경로를 병합한다. |
tbi-handle = <&tbi1>; | 이 MAC에 대한 TBI 인터페이스의 phandle |
phy-handle = <&sgmii_phy2>; | 이 컨트롤러에 연결된 PHY phandle |
phy-connection-type = "sgmii"; | Controller/PHY 인터페이스는 SGMII이다. |
status = "okay"; | 디바이스가 활성화됨 |
}; | |
&enet1 { | DTSI 파일에 "enet1:label"와 노드의 확장 경로를 병합한다. |
tbi-handle = <&tbi1>; | 이 MAC에 대한 TBI 인터페이스의 phandle |
phy-handle = <&sgmii_phy0>; | 이 컨트롤러에 연결된 PHY phandle |
phy-connection-type = "sgmii"; | Controller/PHY 인터페이스는 SGMII이다. |
status = "okay"; | 디바이스가 활성화됨 |
}; | |
&enet2 { | DTSI 파일에 "enet2:label"와 노드의 확장 경로를 병합한다. |
phy-handle = <&rgmii_phy1>; | 이 컨트롤러에 연결된 PHY phandle |
phy-connection-type = "rgmii-id"; | Controller/PHY 인터페이스는 RGMII이다. |
status = "okay"; | 디바이스가 활성화됨 |
}; | |
&i2c0 { | DTSI 파일에 "i2c0:label"와 노드의 확장 경로를 병합한다. |
status = "okay"; | 디바이스가 활성화됨 |
}; | |
&i2c1 { | DTSI 파일에 "i2c1:label"와 노드의 확장 경로를 병합한다. |
status = "okay"; | 디바이스가 활성화됨 |
codec: sgtl5000@a { | |
compatible = "fsl,sgtl5000"; | 오디오 드라이버 sgtl5000 사용 |
reg = <0x0a>; | |
VDDA-supply = <®_3p3v>; | |
VDDIO-supply = <®_3p3v>; | |
clocks = <&sys_mclk 1>; | |
}; | |
hdmi: sii9022a@39 { | HDMI phandle 정의, address 0x39에서 노드 sii9022a를 가르킨다. |
compatible = "fsl,sii902x"; | sii902x 드라이버 사용 |
reg = <0x39>; | 디바이스의 I2C address |
interrupts = <GIC_SPI 167 IRQ_TYPE_EDGE_RISING>; | CPU에 대한 인터럽트 |
}; | |
}; | |
&i2c2 { | I2C2의 노드 경로 label |
status = "okay"; | 디바이스 활성화됨 |
monitor: ltc2945@67 { | |
reg = <0x67>; | |
}; | |
}; | |
&ifc { | DTSI 파일에 "ifc:label"와 노드의 확장 경로를 병합한다. |
status = "okay"; | 디바이스 활성화됨 |
#address-cells = <2>; | 자식 address를 인코딩하는 데 사용되는 <u32> 셀의 수를 2로 정의한다. |
#size-cells = <1>; | 자식 size를 인코딩하는 데 사용되는 <u32> 셀의 수를 1로 정의한다. |
/* NOR, and CPLD on board */ | range 속성은 버스(자식)의 주소 공간과 부모의 주소 공간 사이의 변환을 매핑한다. address-cells = 2이므로, 모든 주소 지정은 두 개의 <u32> 값을 통해 이루어진다. |
ranges = <0x0 0x0 0x0 0x60000000 0x08000000 | size 0x08000000로, 자식의 0x0을 부모의 0x60000000에 매핑한다. |
0x2 0x0 0x0 0x7fb00000 0x00000100>; | size 0x00000100로, 자식의 0x2_0000_0000을 부모의 0x7fb00000에 매핑한다. |
nor@0,0 { | IFC의 첫 번째 자식, address 0 (부모 address 0x60000000로 변환됨) |
compatible = "cfi-flash"; | NOR 플래시에 사용할 드라이버 |
#address-cells = <1>; | 자식 address를 인코딩하는 데 사용되는 <u32> 셀의 수를 1로 정의한다. |
#size-cells = <1>; | 자식 size를 인코딩하는 데 사용되는 <u32> 셀의 수를 1로 정의한다. |
reg = <0x0 0x0 0x8000000>; | size가 0x8000000인 address 0x0의 메모리 공간 |
bank-width = <2>; | 플래시 인터페이스 너비(바이트) |
device-width = <1>; | 단일 플래시 디바이스의 너비(바이트) |
partition@0 { | NOR 플래시의 첫 번째 mtd 파티션 |
/* 128KB for rcw */ | |
reg = <0x00000000 0x0020000>; | size가 0x0020000인 address 0x0의 메모리 공간 |
label = "NOR bank0 RCW Image"; | mtd 드라이버 label |
}; | |
partition@20000 { | 두 번째 파티션, address 20000 |
/* 1MB for DTB */ | |
reg = <0x00020000 0x00100000>; | size가 0x00100000인 address 0x00020000(주소는 노드 정의의 주소와 일치)의 메모리 공간 |
label = "NOR DTB Image"; | mtd 드라이버 label |
}; | |
partition@120000 { | NOR 플래시의 mtd 파티션 |
/* 8 MB for Linux Kernel Image */ | |
reg = <0x00120000 0x00800000>; | size가 0x00800000인 address 0x00120000의 메모리 공간 |
label = "NOR Linux Kernel Image"; | mtd 드라이버 label |
}; | |
partition@920000 { | NOR 플래시의 mtd 파티션 |
/* 56MB for Ramdisk Root File System */ | |
reg = <0x00920000 0x03600000>; | size가 0x03600000인 address 0x00920000의 메모리 공간 |
label = "NOR Ramdisk Root File System Image"; | mtd 드라이버 label |
}; | |
partition@3f80000 { | NOR 플래시의 mtd 파티션 |
/* 512KB for bank4 u-boot Image */ | |
reg = <0x03f80000 0x80000>; | size가 0x80000인 address 0x03f80000의 메모리 공간 |
label = "NOR bank4 u-boot Image"; | mtd 드라이버 label |
}; | |
partition@4000000 { | NOR 플래시의 mtd 파티션 |
/* 128KB for bank4 RCW Image */ | |
reg = <0x04000000 0x20000>; | size가 0x20000인 address 0x04000000의 메모리 공간 |
label = "NOR bank4 RCW Image"; | mtd 드라이버 label |
}; | |
partition@4020000 { | NOR 플래시 mtd 파티션 |
/* 63MB JFFS2 ROOT File System Image */ | |
reg = <0x04020000 0x3f00000>; | size가 0x3f00000인 address 0x04020000의 메모리 공간 |
label = "NOR JFFS2 ROOT File System Image"; | mtd 드라이버 label |
}; | |
partition@7f80000 { | NOR 플래시 mtd 파티션 |
/* 512KB for bank0 u-boot Image */ | |
reg = <0x07f80000 0x80000>; | size가 0x80000인 address 0x07f80000의 메모리 공간 |
label = "NOR bank0 u-boot Image"; | mtd 드라이버 label |
}; | |
}; | |
}; | |
&lpuart0 { | DTSI 파일에 "lpuart0:label"와 노드의 확장 경로를 병합한다. |
status = "okay"; | 디바이스 활성화됨 |
}; | |
&mdio0 { | DTSI 파일에 "mdio0:label"와 노드의 확장 경로를 병합한다. |
sgmii_phy0: ethernet-phy@0 { | PHY와 address 정의 |
reg = <0x0>; | 이 디바이스에 설정된 레지스터 오프셋 |
}; | |
rgmii_phy1: ethernet-phy@1 { | PHY와 address 정의 |
reg = <0x1>; | 이 디바이스에 설정된 레지스터 오프셋 |
}; | |
sgmii_phy2: ethernet-phy@2 { | PHY와 address 정의 |
reg = <0x2>; | 이 디바이스에 설정된 레지스터 오프셋 |
}; | |
tbi1: tbi-phy@1f { | address 0x1f에서 TBI PHY 정의 |
reg = <0x1f>; | 이 디바이스에 설정된 레지스터 오프셋 |
device_type = "tbi-phy"; | |
}; | |
}; | |
&uqe { | DTSI 파일에 "uqe:label"와 노드의 확장 경로를 병합한다. |
tdma: ucc@2000 { | |
compatible = "fsl,ucc-tdm"; | |
rx-clock-name = "clk8"; | |
tx-clock-name = "clk9"; | |
fsl,rx-sync-clock = "rsync_pin"; | |
fsl,tx-sync-clock = "tsync_pin"; | |
fsl,tx-timeslot = <0xfffffffe>; | |
fsl,rx-timeslot = <0xfffffffe>; | |
fsl,tdm-framer-type = "e1"; | |
fsl,tdm-mode = "normal"; | |
fsl,tdm-id = <0>; | |
fsl,siram-entry-id = <0>; | |
}; | |
serial: ucc@2200 { | address 0x2200의 노드 UCC |
device_type = "serial"; | UCC 디바이스 유형 정의 |
compatible = "ucc_uart"; | UCC Uart 드라이버 |
port-number = <1>; | /dev/ttyQE 디바이스에 해당 |
rx-clock-name = "brg2"; | UCC Rx clock source |
tx-clock-name = "brg2"; | UCC Tx clock source |
}; | |
}; | |
&pwm6 { | DTSI 파일에 "pwm6:label"와 노드의 확장 경로를 병합한다. |
status = "okay"; | 디바이스 활성화됨 |
}; | |
&pwm7 { | DTSI 파일에 "pwm7:label"와 노드의 확장 경로를 병합한다. |
status = "okay"; | 디바이스 활성화됨 |
}; | |
&qspi { | DTSI 파일에 "qspi:label"와 노드의 확장 경로를 병합한다. |
num-cs = <2>; | QSPI에 대한 chip select 번호 |
status = "okay"; | 디바이스 활성화됨 |
qflash0: n25q128a13@0 { | address 0에서 노드 n25q128a13을 가리키는 QFLASH0의 phandle을 정의한다. |
compatible = "micron,n25q128a13"; | 사용되는 드라이버는 "micron n25q128a13"이다 |
#address-cells = <1>; | 자식 노드는 하나의 address 셀을 사용한다. |
#size-cells = <1>; | 자식 노드는 하나의 size 셀을 사용한다. |
spi-max-frequency = <20000000>; | 최대 주파수 |
reg = <0>; | |
}; | |
}; | |
&sai1 { | DTSI 파일에 "sai1:label"와 노드의 확장 경로를 병합한다. |
status = "okay"; | 디바이스 활성화됨 |
}; |
11.2.2 ls1021a.dtsi
다음 섹션에서는 LS1021A SoC 하드웨어를 기술하고 타워 보드 디바이스 트리에 포함된, ls1021a.dtsi 파일의 정보를 사용한다. 이 파일에는 두 개의 추가 파일이 포함되어 있으며, 이 문서에서는 설명하지 않는다.
Table 4. ls1021a.dtsi
DTS file | Comments |
---|---|
#include "skeleton64.dtsi" | |
#include <dt-bindings/interrupt-controller/arm-gic.h> | 인터럽트 컨트롤러 정의를 위한, arm-gic.h 파일 포함 |
/ { | 루트 노드는 전방의 슬래시로 식별된다. |
compatible = "fsl,ls1021a"; | 디바이스 드라이버 선택을 위해 프로그램에서 사용될 수 있음.(예: 플랫폼별 코드를 선택하기 위해 운영 체제에서 사용) |
interrupt-parent = <&gic>; | 인터럽트 컨트롤러로 GIC phandle을 지정한다. |
#address-cells = <2>; | 자식 address를 인코딩하는 데 사용되는 <u32> 셀의 수를 2로 정의한다. |
#size-cells = <2>; | 자식 size를 인코딩하는 데 사용되는 <u32> 셀의 수를 2로 정의한다. |
aliases { | aliases 노드의 각 속성은 다른 노드의 인덱스를 정의한다. |
serial0 = &lpuart0; | |
serial1 = &lpuart1; | |
serial2 = &lpuart2; | |
serial3 = &lpuart3; | |
serial4 = &lpuart4; | |
serial5 = &lpuart5; | |
ethernet0 = &enet0; | |
ethernet1 = &enet1; | |
ethernet2 = &enet2; | |
sysclk = &sysclk; | |
gpio0 = &gpio1; | |
gpio1 = &gpio2; | |
gpio2 = &gpio3; | |
gpio3 = &gpio4; | |
crypto = &crypto; | |
}; | |
memory@80000000 { | 메모리는 주소 0x80000000에 위치하고 있다. |
device_type = "memory"; | |
reg = <0x0 0x80000000 0x0 0x20000000>; | size(부모에서 정의된 값은 2이고 address도 2임), address = 0x80000000와 size = 0x20000000 |
}; | |
cpus { | CPU 노드 |
#address-cells = <1>; | 자식 노드 reg 속성의 address 필드를 인코딩하는 데 사용되는 <u32> 셀의 수를 정의한다. |
#size-cells = <0>; | 자식 노드 reg 속성에서 size 필드를 인코딩하는 데 사용되는 <u32> 셀의 수를 정의한다. 이것은 0이기 때문에, 자식은 reg 속성에 크기 필드를 가질 것으로 예상되지 않는다. |
cpu@f00 { | 노드를 ARM, Cortex®-A7, address f00으로 정의한다.(예: CPU f00) |
compatible = "arm,cortex-a7"; | 디바이스 드라이버 선택을 위해 프로그램에서 사용될 수 있음.(예: 플랫폼별 코드를 선택하기 위해 운영체제에서 사용) |
device_type = "cpu"; | CPU 노드임을 나타낸다. |
reg = <0xf00>; | reg는 CPU ID 정의하며, CPU 노드의 address와 일치해야 한다. |
clocks = <&cluster1_clk>; | |
}; | |
cpu@f01 { | 노드를 ARM, Cortex®-A7, address f01으로 정의한다.(예: CPU f01) |
compatible = "arm,cortex-a7"; | |
device_type = "cpu"; | CPU 노드임을 나타낸다. |
reg = <0xf01>; | reg는 CPU ID 정의하며, CPU 노드의 address와 일치해야 한다. |
clocks = <&cluster1_clk>; | |
}; | |
}; | |
soc { | SoC를 정의하는 상위 레벨 노드 |
compatible = "simple-bus"; | 특정 드라이버 없이 매핑된 메모리. 자식 노드는 플랫폼 디바이스로 등록된다. |
#address-cells = <2>; | 자식 address를 인코딩하는 데 사용되는 <u32> 셀의 수를 2로 정의한다. |
#size-cells = <2>; | 자식 size를 인코딩하는 데 사용되는 <u32> 셀의 수를 2로 정의한다. |
device_type = "soc"; | 디바이스 유형 설정 |
interrupt-parent = <&gic>; | GIC phandle로 지정하도록 인터럽트를 설정 |
ranges; | 비어 있는 range는 ID 매핑이 사용되었음을 나타낸다. |
gic: interrupt-controller@1400000 { | address 0x1400000에 인터럽트 컨트롤러를 지정하는, GIC phandle |
compatible = "arm,cortex-a15-gic"; | 디바이스 드라이버 선택을 위해 프로그램에서 사용될 수 있음.(예: 플랫폼별 코드를 선택하기 위해 OS에서 사용) |
#interrupt-cells = <3>; | 인터럽트를 인코딩하는 데 필요한 셀 수 |
interrupt-controller; | 인터럽트 컨트롤로 노드를 정의 |
reg = <0x0 0x1401000 0x0 0x1000>, | 위치 0x1401000인 레지스터, size 0x1000 |
<0x0 0x1402000 0x0 0x1000>, | 위치 0x1402000인 레지스터, size 0x1000 |
<0x0 0x1404000 0x0 0x2000>, | 위치 0x1404000인 레지스터, size 0x2000 |
<0x0 0x1406000 0x0 0x2000>; | 위치 0x1406000인 레지스터, size 0x2000 |
interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_HIGH)>; |
GIC의 인터럽트 정의 |
}; | |
ifc: ifc@1530000 { | address 0x1530000인 IFC 노드 |
compatible = "fsl,ifc", "simple-bus"; | "fsl,ifc" 드라이버와 호환 가능 |
reg = <0x0 0x1530000 0x0 0x10000>; | 위치 0x1530000인 레지스터, size 0x10000 |
interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>; | IFC의 인터럽트 정의 |
}; | |
qspi: quadspi@1550000 { | address 0x1550000인 QSPI 노드 |
compatible = "fsl,ls1-qspi"; | 디바이스 드라이버 선택을 위해 프로그램에서 사용될 수 있음.(예: 플랫폼별 코드를 선택하기 위해 OS에서 사용) |
#address-cells = <1>; | 자식 address를 인코딩하는 데 사용되는 <u32> 셀의 수를 1로 정의한다. |
#size-cells = <0>; | 자식은 size 인코딩이 없다. |
reg = <0x0 0x1550000 0x0 0x10000>, | 0x1550000에 정의된 메모리 매핑 레지스터, size 0x10000 |
<0x0 0x40000000 0x0 0x4000000>; | 0x40000000에 정의된 메모리 매핑 레지스터, size 0x40000000 |
reg-names = "QuadSPI", "QuadSPI-memory"; | 레지스터의 첫 번째 블록이 QuadSPI로 명명되고, 두 번째 블록이 QuadSPI-memory임을 나타낸다. |
interrupts = <GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>; | QSPI 인터럽트 정의 |
clock-names = "qspi_en", "qspi"; | QSPI clock 이름 |
clocks = <&platform_clk 1>, <&platform_clk 1>; | QSPI에 해당하는 clock |
big-endian; | 주변 디바이스가 big-endian임을 나타낸다. |
amba-base = <0x40000000>; | AMBA® 기본 주소가 0x40000000임을 나타낸다. |
status = "disabled"; | QSPI 블록이 비활성화되어있음을 나타낸다. |
}; | |
i2c0: i2c@2180000 { | address 0x2180000인 I2C 노드 |
compatible = "fsl,vf610-i2c"; | 하드웨어는 vf610-i2c에 의해 기술되어 있다. |
#address-cells = <1>; | 자식 address를 인코딩하는 데 사용되는 <u32> 셀의 수를 1로 정의한다. |
#size-cells = <0>; | 자식은 size 인코딩이 없다. |
reg = <0x0 0x2180000 0x0 0x10000>; | 0x2180000인 레지스터, size 0x10000 |
interrupts = <GIC_SPI 88 IRQ_TYPE_LEVEL_HIGH>; | I2C0 인터럽트 정의 |
clock-names = "i2c"; | clock 레이블 |
clocks = <&platform_clk 1>; | clocks = phandle platform_clk |
status = "disabled"; | 디바이스가 현재 작동하지 않지만, 나중에 작동될 수 있음을 나타낸다. |
}; |
'NXP i.MX SoC Family > Device Trees' 카테고리의 다른 글
Introduction to Device Trees - Linux (0) | 2022.10.14 |
---|---|
Introduction to Device Trees - U-Boot (0) | 2022.10.14 |
Introduction to Device Trees - Device tree compiler (0) | 2022.10.13 |
Introduction to Device Trees - Device tree inclusion (0) | 2022.10.13 |
Introduction to Device Trees - Example: Device tree node (0) | 2022.10.13 |