Device Tree의 이해
Embedded Linux Kernel을 다룰 때, Device Tree는 하드웨어와 소프트웨어를 연결하는 중요한 역할을 합니다. 이번 포스팅에서는 Device Tree의 개념과 기본 구조, 그리고 작성법에 대해 Rockchip RK3399 시스템을 기준으로 예제와 함께 살펴보겠습니다.
Device Tree란 무엇인가?
Device Tree는 하드웨어의 구성을 소프트웨어에 설명하기 위해 사용되는 데이터 구조입니다. 이는 특히 ARM 기반의 SoC(System on Chip)에서 널리 사용됩니다. 전통적으로 하드웨어 구성은 C 코드로 작성되었지만, 하드웨어가 복잡해지면서 유지보수가 어려워졌습니다. 이에 따라 하드웨어 정보를 독립적인 데이터 파일로 분리한 Device Tree가 도입되었습니다.
Device Tree의 주요 개념
- 하드웨어 추상화: Device Tree는 하드웨어 구성 정보를 커널 코드와 분리하여 독립적으로 관리합니다.
- 유연성: 동일한 커널 바이너리로 다양한 하드웨어 플랫폼을 지원할 수 있습니다.
- 표준화: 특정 제조업체에 종속되지 않는 표준 방식으로 하드웨어를 기술합니다.
Device Tree의 장점
- 유지보수 용이성
- 코드 복잡성 감소
- 하드웨어 간의 재사용성 향상
Device Tree의 기본 구조
Device Tree 파일은 노드와 속성으로 구성됩니다. 노드는 하드웨어 장치를 나타내며, 속성은 해당 장치의 설정값을 정의합니다. Device Tree는 주로 dts
확장자를 가진 소스 파일과 dtsi
확장자를 가진 포함 파일로 작성됩니다.
Device Tree 구조의 예
아래는 간단한 Device Tree 파일의 구조입니다:
/dts-v1/;
/ {
model = "Rockchip RK3399 Board";
compatible = "rockchip,rk3399";
memory {
device_type = "memory";
reg = <0x0 0x80000000>; // 메모리 시작 주소와 크기
};
soc {
compatible = "simple-bus";
#address-cells = <2>;
#size-cells = <2>;
ranges;
uart@ff1a0000 {
compatible = "rockchip,rk3399-uart";
reg = <0x0 0xff1a0000 0x0 0x1000>;
interrupts = <0 54 4>;
};
};
};
주요 구성 요소
- 노드:
/
와 같이 루트 노드부터 시작하며, 하위 노드가 중첩됩니다. - 속성: 각 노드에 대해 키-값 쌍으로 작성됩니다. 예:
compatible
,reg
. - 포함 파일: 반복되는 설정은
dtsi
파일로 분리하여 재사용할 수 있습니다.
Rockchip RK3399를 위한 Device Tree 작성법
Rockchip RK3399의 UART 장치를 설정하는 Device Tree 파일을 작성해보겠습니다.
예제: UART 설정
아래는 Rockchip RK3399의 UART 장치 노드를 설정하는 예제입니다:
/dts-v1/;
#include "rk3399.dtsi"
/ {
model = "Rockchip RK3399 Custom Board";
compatible = "rockchip,rk3399";
chosen {
bootargs = "console=ttyS2,115200n8 root=/dev/mmcblk0p1 rw";
};
uart2: serial@ff1a0000 {
compatible = "rockchip,rk3399-uart";
reg = <0x0 0xff1a0000 0x0 0x1000>;
interrupts = <0 54 4>;
clocks = <&cru UART2_PCLK>, <&cru UART2_SCLK>;
clock-names = "pclk", "sclk";
status = "okay";
};
};
주요 항목 설명
- compatible: 하드웨어 장치의 호환성을 정의합니다.
- reg: 장치의 메모리 매핑 주소와 크기를 정의합니다.
- interrupts: IRQ 번호와 플래그를 정의합니다.
- clocks: 필요한 클럭 소스를 정의합니다.
Device Tree 작성 및 적용
1. Device Tree 파일 컴파일
dtc
(Device Tree Compiler)를 사용하여 dts
파일을 바이너리 형태인 dtb
로 컴파일합니다:
dtc -I dts -O dtb -o rk3399-custom.dtb rk3399-custom.dts
2. Device Tree 파일 로드
생성된 dtb
파일을 부팅 로더(U-Boot) 또는 커널에 전달하여 적용합니다.
cp rk3399-custom.dtb /boot/
부팅 시 Device Tree 파일을 로드하려면 U-Boot 환경에서 다음 명령을 사용할 수 있습니다:
setenv fdtfile rk3399-custom.dtb
saveenv
boot
마무리
이 포스팅에서는 Device Tree의 개념과 기본 구조, Rockchip RK3399를 기준으로 한 Device Tree 작성법을 살펴보았습니다. Device Tree는 Embedded Linux 시스템에서 하드웨어와 소프트웨어 간의 인터페이스를 정의하는 중요한 도구입니다. 이를 잘 활용하면 복잡한 하드웨어 구성도 간단하게 관리할 수 있습니다.
'Linux > Kernel Driver' 카테고리의 다른 글
Board Support Package (BSP) 이해 (0) | 2025.03.12 |
---|---|
Embedded Linux Kernel 포팅 기본 (0) | 2025.03.11 |
Embedded Linux 부트 프로세스 이해하기 (0) | 2025.03.09 |
Embedded Linux Kernel 빌드 환경 구축하기 (0) | 2025.03.08 |
Embedded Linux Kernel의 개요 (0) | 2025.03.07 |