2025. 3. 6. 19:40ㆍ프로그래밍/시스템
3.1 타겟 보드 선택 및 디바이스 트리 설정
커널 포팅을 진행할 때, 타겟 보드(Target Board)에 맞는 설정을 적용하는 것이 필수적입니다.
ARM 및 RISC-V 기반의 임베디드 시스템에서는 디바이스 트리(Device Tree, DT) 를 사용하여 CPU, 메모리, I/O 장치, 버스 등의 하드웨어 정보를 커널에 제공합니다.
🔹 디바이스 트리(Device Tree)의 개념과 역할
디바이스 트리(Device Tree, DT) 는 커널이 하드웨어 정보를 동적으로 읽을 수 있도록 하는 데이터 구조입니다.
이전에는 각 보드마다 하드웨어 정보를 하드코딩했지만,
디바이스 트리를 사용하면 커널 코드를 수정하지 않고도 하드웨어 구성을 변경할 수 있음.
✅ 디바이스 트리의 역할
- CPU, RAM, 클럭 정보 제공
- 버스 및 주변 장치(I2C, SPI, GPIO, USB 등) 설정
- 부트로더(U-Boot)와 커널 간 하드웨어 정보 공유
- 하드웨어 변경 시 커널 코드 수정 없이 DT만 변경 가능
✅ 디바이스 트리 사용 예시
- 라즈베리파이4: bcm2711-rpi-4-b.dtb
- BeagleBone Black: am335x-boneblack.dtb
- FriendlyARM NanoPi: sun8i-h3-nanopi.dtb
✅ 디바이스 트리 파일 구성 디바이스 트리는 DTS(Device Tree Source) 파일로 작성되며, 이를 DTB(Device Tree Blob) 로 변환하여 커널과 함께 사용합니다.
디바이스 트리는 크게 3단계로 구성됨:
- DTS (Device Tree Source)
- 사람이 읽을 수 있는 형태의 소스 파일 (.dts)
- 예: bcm2711-rpi-4-b.dts
- DTSI (Device Tree Include)
- 공통 설정을 포함하는 파일 (.dtsi)
- 여러 보드에서 공유 가능
- DTB (Device Tree Blob)
- 컴파일된 바이너리 형태 (.dtb)
- 부트로더(U-Boot)가 로드하여 커널에 전달
✅ 디바이스 트리 파일 변환 과정
DTS (텍스트) → [컴파일] → DTB (바이너리)
변환 명령어:
dtc -I dts -O dtb -o output.dtb input.dts
- dtc: Device Tree Compiler (디바이스 트리 컴파일러)
🔹 보드별 디바이스 트리 소스 분석 (arch/arm/boot/dts/)
리눅스 커널의 디바이스 트리 파일은 arch/arm/boot/dts/ 디렉토리에 위치하며, 각 보드 및 SoC별로 .dts 파일이 존재합니다.
✅ 디렉토리 구조
linux/arch/arm/boot/dts/
├── bcm2711-rpi-4-b.dts # 라즈베리파이 4
├── am335x-boneblack.dts # BeagleBone Black
├── sun8i-h3-nanopi.dts # NanoPi
├── imx6q-sabresd.dts # i.MX6 기반 보드
└── ...
✅ 디바이스 트리 예제 (bcm2711-rpi-4-b.dts)
/dts-v1/;
#include "bcm2711.dtsi"
/ {
compatible = "raspberrypi,4-model-b", "brcm,bcm2711";
model = "Raspberry Pi 4 Model B";
memory {
reg = <0x0 0x40000000>; /* 1GB RAM */
};
chosen {
bootargs = "console=ttyAMA0,115200 root=/dev/mmcblk0p2";
};
gpio: gpio@7e200000 {
compatible = "brcm,bcm2711-gpio";
reg = <0x7e200000 0x1000>;
};
};
✅ 디바이스 트리 주요 요소
속성 | 설명 |
/ | 루트 노드, 보드 전체 정보 포함 |
compatible | 보드 또는 SoC와의 호환성 정보 |
memory | RAM 크기 및 주소 지정 |
chosen | 부팅 관련 설정 (커널 파라미터, 시리얼 콘솔 등) |
gpio | GPIO 컨트롤러 정보 |
✅ DTSI 파일 포함 (#include)
#include "bcm2711.dtsi"
- bcm2711.dtsi 파일에 공통 설정이 들어 있으며, 이를 포함하여 코드 재사용 가능
🔹 디바이스 트리 수정 및 적용 (make dtbs)
타겟 보드에서 새로운 하드웨어를 추가하거나 수정하려면 디바이스 트리를 수정해야 합니다.
✅ 1️⃣ 디바이스 트리 수정 (예: 새로운 UART 추가) 파일: bcm2711-rpi-4-b.dts
serial1: uart@7e201400 {
compatible = "brcm,bcm2711-uart";
reg = <0x7e201400 0x100>;
clock-frequency = <250000000>;
};
✅ 2️⃣ 디바이스 트리 빌드
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- dtbs
✅ 3️⃣ 빌드된 디바이스 트리 확인
ls arch/arm/boot/dts/
bcm2711-rpi-4-b.dtb
✅ 4️⃣ U-Boot에서 디바이스 트리 로드
tftpboot 0x82000000 bcm2711-rpi-4-b.dtb
bootz 0x80000000 - 0x82000000
- tftpboot: 네트워크에서 DTB 파일 로드
- bootz: 커널과 디바이스 트리를 함께 실행
✅ 5️⃣ 커널 부팅 후 디바이스 트리 확인
dmesg | grep "Device Tree"
cat /proc/device-tree/model
- 부팅된 시스템이 올바른 DTB를 로드했는지 확인
🔹 디바이스 트리 수정 시 유용한 명령어
✅ DTB 파일을 DTS로 변환 (디버깅용)
dtc -I dtb -O dts -o output.dts input.dtb
✅ 부팅 시 커널이 사용하는 DTB 확인
cat /proc/device-tree/compatible
✅ DT 노드 정보 확인
ls /proc/device-tree/
✅ 정리
- 디바이스 트리(Device Tree)란?
- 하드웨어 정보를 커널에 제공하는 데이터 구조
- DTS(DTSI) → DTB로 변환하여 사용
- 보드별 디바이스 트리 소스 분석
- arch/arm/boot/dts/ 디렉토리에 저장
- 각 보드별 .dts 파일이 있으며, SoC 공통 정보는 .dtsi 파일로 관리
- 디바이스 트리 수정 및 적용
- make dtbs로 DTB 빌드
- tftpboot, bootz로 DTB 로드 및 실행
- 부팅 후 /proc/device-tree/에서 확인 가능
'프로그래밍 > 시스템' 카테고리의 다른 글
커널 포팅 (3. 커널 포팅 기본 실습 / 3.3 부트 로그 분석 및 디버깅) (0) | 2025.03.06 |
---|---|
커널 포팅 (3. 커널 포팅 기본 실습 / 3.2 새로운 SoC 지원을 위한 포팅) (0) | 2025.03.06 |
커널 포팅 (2. 커널 소스 분석 및 빌드 / 2.4 U-Boot과의 연동) (0) | 2025.03.06 |
커널 포팅 (2. 커널 소스 분석 및 빌드 / 2.3 크로스 컴파일러를 이용한 커널 빌드) (0) | 2025.03.06 |
커널 포팅 (2. 커널 소스 분석 및 빌드 / 2.2 커널 빌드 과정 이해) (0) | 2025.03.06 |