기기 트리 컴파일러(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를 오버레이한 결과를 확인할 수 있습니다.
/include/
를 사용하여 호스트에서 DTO를 시뮬레이션- 오버레이
.dts
의 사본을 생성합니다. 사본에서 첫 행의 헤더를 삭제합니다. 예:/dts-v1/; /plugin/;
파일을my_overlay_dt_wo_header.dts
(또는 원하는 파일 이름)로 저장합니다. - 기본
.dts
의 사본을 생성합니다. 1단계에서 생성한 파일의 include 문법을 사본의 마지막 행 다음에 추가합니다. 예:/include/ "my_overlay_dt_wo_header.dts"
파일을my_main_dt_with_include.dts
(또는 원하는 파일 이름)로 저장합니다. dtc
로my_main_dt_with_include.dts
를 컴파일하여 병합된 DT를 가져옵니다. 이는 DTO와 결과가 같아야 합니다. 예:dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
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.dts
는 overlay_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 파티션을 구현하려면 부트로더가 다음을 실행할 수 있어야 합니다.
- 실행되고 있는 보드를 식별하고 적용할 해당 오버레이를 선택합니다.
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"; }; }; |