Linux/buildroot

디바이스 트리(Device Tree) 설정 및 수정

임베디드 친구 2025. 4. 29. 21:27
728x90
반응형

디바이스 트리(Device Tree) 설정 및 수정

1. 디바이스 트리(Device Tree)란?

디바이스 트리(Device Tree)는 하드웨어 정보를 정의하는 데이터 구조로, 임베디드 시스템에서 커널이 하드웨어를 인식하고 초기화할 수 있도록 지원합니다. ARM 아키텍처를 포함한 다양한 플랫폼에서 널리 사용되며, 특히 Buildroot와 같은 임베디드 리눅스 환경에서는 중요한 구성 요소 중 하나입니다.

디바이스 트리는 일반적으로 Device Tree Source(DTS) 파일로 작성되며, 이를 Device Tree Blob(DTB) 형식으로 변환하여 커널이 사용할 수 있도록 합니다. DTS 파일은 사람이 읽을 수 있는 텍스트 형식이며, DTB는 바이너리 형식입니다.

2. Buildroot에서 디바이스 트리의 역할

Buildroot 환경에서 디바이스 트리는 다음과 같은 역할을 합니다.

  • 타겟 보드의 하드웨어 구성 정의 (CPU, RAM, Flash, GPIO, I2C, SPI, UART 등)
  • 부트로더 및 커널이 하드웨어 정보를 올바르게 인식할 수 있도록 지원
  • 특정 드라이버 및 주변 장치 설정 제공
  • 필요에 따라 수정하여 커널이 올바르게 동작하도록 커스터마이징 가능

Buildroot에서 디바이스 트리는 보통 Board Support Package(BSP) 또는 커널 구성의 일부로 포함됩니다. 이를 적절히 수정하면 맞춤형 보드 환경을 구축할 수 있습니다.

3. 디바이스 트리 기본 구조

디바이스 트리의 기본 구조는 트리 형태이며, 루트 노드를 포함하여 여러 하위 노드들이 계층적으로 구성됩니다. 기본적인 DTS 파일의 구조는 다음과 같습니다.

/dts-v1/;

/ {
    model = "Custom Board";
    compatible = "custom,board";

    aliases {
        serial0 = &uart0;
    };

    memory {
        device_type = "memory";
        reg = <0x80000000 0x4000000>; // RAM 시작 주소 및 크기
    };

    soc {
        compatible = "simple-bus";
        #address-cells = <1>;
        #size-cells = <1>;

        uart0: serial@10000000 {
            compatible = "ns16550";
            reg = <0x10000000 0x100>;
            clock-frequency = <24000000>;
        };
    };
};

위의 예제에서 memory 노드는 RAM의 시작 주소(0x80000000)와 크기(64MB)를 정의하고 있으며, soc 노드는 SoC(System on Chip) 내부에 존재하는 주변 장치(uart0 등)를 정의하고 있습니다.

4. Buildroot에서 디바이스 트리 설정 방법

4.1. 디바이스 트리 파일 확인

Buildroot에서 디바이스 트리 파일은 보통 다음 경로에 위치합니다.

buildroot/output/build/linux-custom/arch/arm/boot/dts/

또는 특정 보드의 디바이스 트리는 다음 경로에서 확인할 수 있습니다.

buildroot/board/<보드명>/dts/

사용 중인 보드의 디바이스 트리 파일을 찾기 위해 make menuconfig를 실행하고, 다음 경로에서 설정을 확인할 수 있습니다.

Kernel -> Device Tree Source

4.2. 디바이스 트리 수정하기

예를 들어, 기본 제공되는 디바이스 트리 파일에서 추가적인 UART 포트를 활성화하고 싶다면, DTS 파일을 열고 해당 내용을 추가하면 됩니다.

    uart1: serial@10100000 {
        compatible = "ns16550";
        reg = <0x10100000 0x100>;
        clock-frequency = <24000000>;
    };

수정한 후, DTS 파일을 다시 컴파일하여 DTB 파일을 생성해야 합니다.

4.3. 디바이스 트리 컴파일하기

디바이스 트리 소스(DTS) 파일을 컴파일하여 바이너리 형식인 DTB로 변환하려면 dtc(Device Tree Compiler)를 사용합니다.

dtc -I dts -O dtb -o custom_board.dtb custom_board.dts

Buildroot에서 자동으로 디바이스 트리를 빌드하려면, make 명령어를 실행하면 됩니다.

make

4.4. DTB 파일의 부트로더 적용

생성된 DTB 파일을 부트로더(U-Boot)에서 사용하려면, 부트로더 설정을 변경해야 합니다. 보통 다음과 같은 방식으로 DTB 파일을 지정할 수 있습니다.

setenv fdt_file custom_board.dtb
saveenv
boot

U-Boot 환경에서 fdt_file을 설정하면 부팅 시 해당 DTB 파일을 로드하여 커널이 이를 참조하게 됩니다.

5. 디버깅 및 문제 해결

디바이스 트리를 수정한 후 예상과 다르게 동작할 경우, 다음과 같은 방법으로 문제를 해결할 수 있습니다.

5.1. DTB 디코딩 및 확인

DTB 파일을 다시 DTS 형식으로 변환하여 내용이 올바르게 반영되었는지 확인할 수 있습니다.

dtc -I dtb -O dts -o output.dts input.dtb

변환된 output.dts 파일을 열어 변경 사항이 적용되었는지 확인합니다.

5.2. 커널 부팅 로그 확인

커널이 부팅될 때 디바이스 트리를 정상적으로 인식했는지 확인하려면, 부팅 로그에서 관련 정보를 찾을 수 있습니다.

dmesg | grep -i dtb

또한, 특정 장치가 올바르게 등록되었는지 확인하려면 다음 명령어를 사용할 수 있습니다.

ls /proc/device-tree

5.3. U-Boot에서 DTB 설정 확인

U-Boot 환경에서 현재 사용 중인 DTB 파일을 확인하려면 다음 명령어를 실행합니다.

printenv fdt_file

잘못된 DTB 파일을 사용하고 있다면 setenv fdt_file 명령어로 변경할 수 있습니다.

6. 결론

디바이스 트리는 Buildroot 환경에서 커널과 하드웨어 간의 중요한 연결 고리 역할을 합니다. DTS 파일을 수정하여 특정 하드웨어를 활성화하거나 새로운 기능을 추가할 수 있으며, dtc를 활용하여 직접 컴파일하고 적용할 수도 있습니다. 또한, 부팅 로그와 U-Boot 설정을 확인하여 디버깅 과정을 거칠 수 있습니다.

이러한 과정을 통해, 자신만의 커스텀 보드에 맞게 디바이스 트리를 설정하고 수정할 수 있으며, 임베디드 시스템을 보다 효율적으로 관리할 수 있습니다.

728x90
반응형