컴파일 및 확인

기기 트리 컴파일러(DTC)를 사용하여 기기 트리 소스 파일을 컴파일할 수 있습니다. 하지만 대상 기본 DT에 오버레이 DT를 적용하기 전에 DTO 동작을 시뮬레이션하여 결과도 확인해야 합니다.

DTC로 컴파일

dtc를 사용하여 .dts를 컴파일할 때에는 옵션 -@를 추가하여 결과로 반환되는 .dtbo__symbols__ 노드를 추가해야 합니다. __symbols__ 노드에는 DTO 라이브러리에서 참조를 위해 사용할 수 있도록 라벨로 표시된 모든 노드의 목록이 포함됩니다.

기본 DT .dts 빌드 관련 샘플 명령어:

dtc -@ -O dtb -o my_main_dt.dtb my_main_dt.dts

오버레이 DT .dts 빌드 관련 샘플 명령어:

dtc -@ -O dtb -o my_overlay_dt.dtbo my_overlay_dt.dts

호스트에서 DTO 결과 확인

결과를 확인하면 오버레이 DT를 기본 DT에 배치할 때 발생할 수 있는 오류를 식별하는 데 도움이 됩니다. 대상을 업데이트하기 전에 .dts에서 /include/로 DTO의 동작을 시뮬레이션하여 호스트에 DT를 오버레이한 결과를 확인할 수 있습니다.

그림 1. 구문 /include/를 사용하여 호스트에서 DTO를 시뮬레이션
  1. 오버레이 .dts의 사본을 생성합니다. 사본에서 첫 행의 헤더를 삭제합니다. 예:
    /dts-v1/;
    /plugin/;
    
    파일을 my_overlay_dt_wo_header.dts(또는 원하는 파일 이름)로 저장합니다.
  2. 기본 .dts의 사본을 생성합니다. 1단계에서 생성한 파일의 include 구문을 사본의 마지막 행 다음에 추가합니다. 예:
    /include/ "my_overlay_dt_wo_header.dts"
    
    파일을 my_main_dt_with_include.dts(또는 원하는 파일 이름)로 저장합니다.
  3. dtcmy_main_dt_with_include.dts를 컴파일하여 병합된 DT를 가져옵니다. 이는 DTO와 결과가 같아야 합니다. 예:
    dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
    
  4. dtc를 사용하여 my_merged_dt.dto를 덤프합니다.
    dtc -O dts -o my_merged_dt.dts my_merged_dt.dtb
    

Android 9에서 DTO 확인

Android 9에는 기기 트리 Blob 오버레이(DTBO) 파티션이 필요합니다. 노드를 추가하거나 SoC DT의 속성을 변경하려면 부트로더가 기기별 DT를 SoC DT에 동적으로 오버레이해야 합니다.

적용된 오버레이 표시

공급업체 테스트 도구 모음(VTS)에서 오버레이 적용의 정확성을 평가할 수 있도록 하려면, 공급업체가 DTBO 파티션에서 선택한 오버레이를 나타내는 새로운 커널 명령줄 매개변수 androidboot.dtbo_idx를 추가해야 합니다. 커널 버전 5.10 이상을 사용하는 Android 12에서 이 매개변수는 bootconfig를 통해 전달됩니다. 예를 들어, 매개변수 androidboot.dtbo_idx=x,y,z는 부트로더가 기본 기기 트리(DT)에 적용한 DTBO 파티션에서 가져온 기기 트리 오버레이(DTO)의 0 기반 색인으로 x, y, z를 보고합니다(이 순서대로).

오버레이는 기본 기기 트리의 노드에 적용되거나 새 노드를 추가할 수 있지만 이전 오버레이에 추가된 노드를 참조하면 안 됩니다. 제한이 필요한 이유는 오버레이 적용 시 오버레이 기호 표를 기본 DT 기호 표와 병합하지 않기 때문입니다. 병합하지 않을 경우 기호 이름의 충돌과 오버레이 간 종속 항목의 복잡성을 피할 수 있습니다.

예: 잘못된 오버레이

이 예에서 overlay_2.dtsoverlay_1.dts에 의해 추가된 노드 e를 참조합니다. overlay_1이 기본 DT에 적용된 후에는 overlay_2를 결과로 반환된 DT에 적용하려는 시도가 발생할 경우, 오버레이 적용에 실패하고 기호 e가 기본 DT의 기호 표에 없다는 오류 메시지가 표시됩니다.

main.dts overlay_1.dts overlay_2.dts

[main.dts]

/dts-v1/;

/ {
  a: a {};
  b: b {};
  c: c {};
};

[overlay_1.dts]

/dts-v1/;
/plugin/;

&b { ref1 =  <&a>;
    e: e {
        prop = <0x0a>;
        phandle = <0x04>;
    };
};

[overlay_2.dts]

/dts-v1/;
/plugin/;

/* invalid! */
&e {
    prop = <0x0b>;
};

예: 올바른 오버레이

이 예에서 overlay_2.dts는 기본 DTS의 노드 b만 참조합니다. overlay_1이 기본 DT에 적용된 후 overlay_2를 적용하면 노드 e에 있는 속성 prop의 값(overlay_1.dts에 의해 설정됨)이 overlay_2.dts에 의해 설정된 값으로 재설정됩니다.

main.dts overlay_1.dts overlay_2.dts

[final.dts]

/dts-v1/;

/ {
  a: a {};
  b: b {};
  c: c {};
};

[overlay_1.dts]

/dts-v1/;
/plugin/;

&b { ref1 =  <&a>;
     e {
          prop = <0x0c>;
      };
};

[overlay_2.dts]

/dts-v1/;
/plugin/;

/* valid */
&b { ref1 =  <&c>;
     e {
          prop = <0x0d>;
      };
};

DTBO 파티션 구현

필수 DTBO 파티션을 구현하려면 부트로더가 다음을 실행할 수 있어야 합니다.

  1. 실행되고 있는 보드를 식별하고 적용할 해당 오버레이를 선택합니다.
  2. androidboot.dtbo_idx 매개변수를 커널 명령줄에 추가합니다.
    • 매개변수는 기본 DT에 적용한 DTBO 파티션 이미지에서 가져온 DTO의 0 기반 색인을 나타내야 합니다(순서 동일).
    • 색인은 DTBO 파티션 내 오버레이의 위치를 참조해야 합니다.

DTBO 파티션의 구조에 관한 자세한 내용은 source.android.com에서 기기 트리 오버레이를 참조하세요.

DTBO 파티션 유효성 검사

VTS를 사용하여 다음을 확인할 수 있습니다.

  • 커널 명령줄 매개변수 androidboot.dtbo_idx의 존재(Init가 상응하는 ro.boot.dtbo_idx 시스템 속성을 자동으로 설정했는지 확인).
  • ro.boot.dtbo_idx 시스템 속성의 유효성(속성이 1개 이상의 유효한 DTBO 이미지 색인을 명시하는지 확인)
  • DTBO 파티션의 유효성(마찬가지로 기본 DT에 적용된 오버레이를 DTBO 파티션에서 확인)
  • 결과로 반환된 DT의 추가적인 노드 또는 속성 변경사항이 Linux 커널에 제시되었는지 여부

예를 들어 아래의 오버레이와 최종 DT에서는 androidboot.dtbo_idx=5,3을 커널 명령줄에 추가할 경우 유효성 검사가 통과되지만 androidboot.dtbo_idx=3,5를 커널 명령줄에 추가하면 유효성 검사에 통과할 수 없습니다.

색인 3의 오버레이 DT 색인 5의 오버레이 DT

[overlay_1.dts]

/dts-v1/;
/plugin/;

&c { prop = <0xfe>; };

[overlay_2.dts]

/dts-v1/;
/plugin/;

&c { prop = <0xff>; };
최종 DT

/dts-v1/;
/ {

	a {
		phandle = <0x1>;
	};

	b {
		phandle = <0x2>;
	};

	c {
		phandle = <0x3>;
		prop = <0xfe>;
	};

	__symbols__ {
		a = "/a";
		b = "/b";
		c = "/c";
	};
};