Embedded : : Linux/: : Device Tree

[Device Tree] 6. Device Tree Overlay (DTBO)

Jay.P Morgan 2026. 3. 4. 16:19

 

 

  6.  Device Tree Overlay (DTBO)

 

 

Device Tree Overlay (DTBO)는 이미 실행 중인 커널의 디바이스 트리(Live DT)에 하드웨어 설정을 "동적으로 덧칠하는 패치"라고 이해하면 가장 정확합니다.

 

기존의 .dts가 부팅 시점에 읽히는 "고정된 설계도"라면, .dtbo는 시스템 운영 중에 필요에 따라 끼웠다 뺐다 할 수 있는 "포스트잇 같은 추가 설명서"입니다.

 

 

  6.1  왜 사용하는가? (핵심 용도)

 

  • 가변적인 하드웨어: 라즈베리 파이의 HAT이나 비글본의 Cape처럼, 사용자가 어떤 확장 보드를 꽂을지 모르는 상황에서 유연하게 대응하기 위해 사용합니다.
  • 재부팅 없는 변경: 하드웨어 설정을 바꿀 때마다 커널을 다시 빌드하거나 리부팅할 필요가 없습니다. configfs를 통해 실시간으로 반영됩니다.
  • 모듈화: 기본 SoC 설정은 그대로 두고, 특정 기능을 수행하는 부분만 별도 파일로 관리하여 유지보수가 쉽습니다.

 

  6.2  문법의 핵심 포인트

 

제공해주신 예제 코드에서 눈여겨봐야 할 세 가지 요소입니다.

  • /plugin/;: 이 파일이 독립적인 전체 트리가 아니라, 어딘가에 달라붙을 **"플러그인(Overlay)"**임을 선언합니다.
  • fragment@n & __overlay__:
    • fragment: 변경사항을 담는 단위(조각)입니다.
    • target: 이 조각이 베이스 트리의 어느 부분(&i2c0 등)에 달라붙을지 지정합니다.
    • __overlay__: 실제 추가하거나 수정할 속성들을 정의하는 블록입니다.
  • -@ 옵션 (중요!): 베이스트리(DTB)를 컴파일할 때 이 옵션을 주면 라벨 정보를 포함한 __symbols__ 노드가 생깁니다. Overlay는 이 심볼을 보고 "아, 여기가 내가 붙을 자리구나!" 하고 찾아갑니다.

 

 
  /*
   * Device Tree Overlay (.dtbo):
   *
   * 런타임에 기존 DTB에 노드/프로퍼티를 추가·수정·삭제합니다.
   * 용도:
   *    - HAT/Cape/Shield 등 확장 보드 자동 인식
   *    - Raspberry Pi, BeagleBone 등에서 광범위하게 사용
   *    - 재부팅 없이 하드웨어 구성 변경 (configfs 기반)
   *
   * Overlay 문법:
   *    /plugin/; 지시어로 overlay 파일임을 선언
   *    fragment 또는 __overlay__ 블록으로 수정할 노드 지정
   */
 
  /* === my-hat-overlay.dts === */
  /dts-v1/;
  /plugin/;
 
  /* &{/path} 또는 &label로 대상 노드 참조 */
  &i2c0 {
          #address-cells = <1>;
          #size-cells = <0>;
          status = "okay";
 
          /* HAT에 장착된 OLED 디스플레이 */
          oled@3c {
                    compatible = "solomon,ssd1306";
                    reg = <0x3c>;
                    width = <128>;
                    height = <64>;
                    solomon,com-invdir;
          };
  };
 
  /* fragment 문법 (대체 형식) */
  / {
          fragment@0 {
                    target = <&spi0>;
                    __overlay__ {
                              status = "okay";
                              cs-gpios = <&gpio 8 GPIO_ACTIVE_LOW>;
 
                              can0: can@0 {
                                        compatible = "microchip,mcp2515";
                                        reg = <0>;
                                        spi-max-frequency = <10000000>;
                                        clocks = <&can_osc>;
                                        interrupt-parent = <&gpio>;
                                        interrupts = <25 IRQ_TYPE_EDGE_FALLING>;
                              };
                    };
          };
  };
 
  # Overlay 컴파일
  $ dtc -I dts -O dtb -@ -o my-hat.dtbo my-hat-overlay.dts
  # -@ : __symbols__ 노드 생성 (overlay 심볼 해석에 필요)
 
  # configfs를 통한 런타임 적용 (CONFIG_OF_OVERLAY, CONFIG_OF_CONFIGFS 필요)
  # 사전 준비: mount -t configfs none /sys/kernel/config
  $ mkdir -p /sys/kernel/config/device-tree/overlays/my-hat
  $ cat my-hat.dtbo > /sys/kernel/config/device-tree/overlays/my-hat/dtbo
  # → 커널이 overlay를 live DT에 병합, 새 디바이스 probe
 
  # Overlay 제거
  $ rmdir /sys/kernel/config/device-tree/overlays/my-hat
  # → 관련 디바이스 remove, DT에서 노드 제거
 
  # U-Boot에서 부팅 시 적용
  # fdt apply ${fdtoverlay_addr}
 

 

  6.3  작동 프로세스

 

  1. 컴파일: .dts를 dtc로 빌드하여 .dtbo 파일을 생성합니다.
  2. 로드: /sys/kernel/config/device-tree/overlays/ 경로에 디렉토리를 만들고 .dtbo 내용을 입력합니다.
  3. 병합(Merge): 커널의 Device Tree 프레임워크가 현재 메모리에 있는 트리(Live Tree)에 새 노드를 합칩니다.
  4. 프로빙(Probing): 트리가 업데이트되면 커널은 "어? 새 장치가 생겼네?"라고 인식하여 자동으로 해당 드라이버의 probe() 함수를 호출합니다.

 

  6.4  실전 팁: 제거(Unloading)의 마법

 

Overlay의 강력함은 제거할 때도 나타납니다. rmdir 명령어로 overlay 디렉토리를 삭제하면:

  • 추가됐던 노드가 트리에서 사라집니다.
  • 연결됐던 드라이버의 remove() 함수가 호출되며 장치가 안전하게 해제됩니다.

요약하자면, Overlay는 하드웨어를 소프트웨어 플러그인처럼 다루게 해주는 도구입니다.

 

 

 

 

참고: https://www.minzkn.com/linuxkernel/pages/device-tree.html#dt-device-node