Embedded : : Linux/: : Device Tree

[Device Tree] 7. Device Tree Bindings

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

 

 

  7.  Device Tree Bindings

 

Device Tree Bindings는 한마디로 "디바이스 트리가 지켜야 할 약속(규격서)"입니다.

DTS가 하드웨어의 배치도라면, Bindings는 그 배치도에 들어갈 항목들이 올바르게 적혔는지 검사하는 데이터 명세서(Schema)와 같습니다. C언어에 비유하자면 함수 선언부(Header)나 API 문서 같은 역할을 하죠.

 

  7.1  왜 Binding이 필요한가?

 

하드웨어 제조사마다 자기들 마음대로 프로퍼티 이름을 정하면(예: 누구는 reg-shift, 누구는 offset), 커널 드라이버는 혼란에 빠집니다.

  • 표준화: 특정 하드웨어 IP에 필요한 프로퍼티 이름과 값의 형식을 통일합니다.
  • 검증: 부팅도 하기 전에 dtc나 스키마 검사 도구를 통해 DTS에 오타가 있는지, 필수 항목이 빠졌는지 잡아낼 수 있습니다.
  • 문서화: 드라이버 개발자가 하드웨어 노드를 어떻게 작성해야 하는지 알려주는 가이드라인이 됩니다.

 

  7.2  YAML 스키마 구조 분석

 

리눅스 커널(v5.2+)은 YAML 형식을 사용합니다. 제공해주신 예시의 핵심 내용을 짚어볼까요?

 

 compatible (가장 중요)

드라이버를 찾는 "키"입니다.

  • enum 또는 const: 허용되는 문자열 목록을 정의합니다.
  • items: 우선순위를 정할 수 있습니다. (예: 특정 SoC 전용 이름 뒤에 범용 IP 이름을 붙이는 관습)

 properties

각 노드가 가질 수 있는 필드를 정의합니다.

  • Type 검사: reg는 주소 형태여야 하고, clocks는 phandle 형태여야 함을 명시합니다.
  • 제약 조건: maxItems: 1 등을 통해 개수를 제한하거나, enum: [0, 2] 등을 통해 허용되는 값의 범위를 지정합니다.

 required

이 리스트에 포함된 프로퍼티가 DTS 노드에 없다면 검사 시 에러를 뱉습니다. "이건 없으면 하드웨어 작동 안 함!"이라는 뜻입니다.

 

 

  7.3  검증 도구 활용법

 

단순히 파일만 만드는 게 아니라, 커널 빌드 시스템에서 실제로 검증을 수행합니다.

명령어 설명
make dt_binding_check 작성한 YAML 파일 자체가 문법에 맞고 유효한지 검사합니다.
make dtbs_check 작성된 실제 DTS 파일들이 YAML 바인딩 규격을 잘 지켰는지 대조합니다.
 
 
  /*
   * DT Binding = 특정 하드웨어에 필요한 프로퍼티 규격
   *
   * 위치: Documentation/devicetree/bindings/
   * 형식: YAML schema (dt-schema, v5.2+) 또는 텍스트 문서 (레거시)
   *
   * 검증 도구:
   *     make dt_binding_check      ← YAML 스키마 자체 검증
   *     make dtbs_check                 ← DTB가 바인딩을 준수하는지 검증
   *
   * compatible 문자열 규칙:
   *     "vendor,device[-version]"
   *     vendor: JEDEC 또는 Documentation/devicetree/bindings/vendor-prefixes.yaml
   *     device: 구체적 칩/IP 이름
   *
   * 예시:
   *     "ti,am335x-uart"                    ← TI AM335x SoC의 UART
   *     "samsung,exynos4210-i2c"  ← Samsung Exynos4210의 I2C
   *     "snps,dw-apb-uart"               ← Synopsys DesignWare APB UART (IP 블록)
   */
 
  # YAML 바인딩 예시: Documentation/devicetree/bindings/serial/snps,dw-apb-uart.yaml
  # (간략화)
 
  # title: Synopsys DesignWare ABP UART
  # 
  # properties:
  #      compatible:
  #           oneOf:
  #                - items:
  #                     - enum:
  #                          - myvendor,my-soc-uart
  #                     - const: snps,dw-apb-uart
  #      reg:
  #           maxItems: 1
  #      interrupts:
  #           maxItems: 1
  #      clocks:
  #           minItems: 1
  #           maxItems: 2
  #      clock-names:
  #           items:
  #              - const: baudclk
  #              - const: apb_pclk
  #      reg-shift:
  #           enum: [0, 2]
  # 
  # required:
  #      - compatible
  #      - reg
  #      - interrupts
  #      - clocks
 
  # 바인딩 검증 실행
  $ make dt_binding_check DT_SCHEMA_FILES=serial/snps,dw-apb-uart.yaml
  $ make dtbs_check DT_SCHEMA_FILES=serial/snps,dw-apb-uart.yaml
 

 

 

  7.4  compatible 문자열 작성 관습

 

보통 "제조사,모델-버전" 형식을 따릅니다.

  • snps,dw-apb-uart: Synopsys(제조사)의 DesignWare APB UART(IP 명칭).
  • 이름이 구체적일수록 좋습니다. 만약 하드웨어 버그가 있다면 특정 compatible 문자열을 보고 드라이버에서 "아, 이 버전은 이 코드로 우회(Workaround)해야지"라고 판단하기 때문입니다.

정리하자면...

Device Tree Bindings는 하드웨어와 소프트웨어 사이의 "계약서"입니다. 이 계약서(YAML)가 엄격할수록 하드웨어 설정 오류로 인해 커널이 패닉에 빠지는 불상사를 미연에 방지할 수 있습니다.

 

 

 

 

 

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