Bạn có thể sử dụng Trình biên dịch cây thiết bị (DTC) để biên dịch tệp Nguồn cây thiết bị. Tuy nhiên, trước khi áp dụng lớp phủ DT trên DT chính mục tiêu, bạn cũng nên xác minh kết quả bằng cách mô phỏng hành vi của DTO.
Biên dịch với DTC
Khi sử dụng dtc
để biên dịch .dts
, bạn phải thêm tùy chọn -@
để thêm nút __symbols__
trong .dtbo
kết quả. Nút __symbols__
chứa danh sách tất cả các nút được đánh dấu bằng nhãn mà thư viện DTO có thể sử dụng để tham khảo.
Lệnh mẫu để xây dựng DT .dts
chính:
dtc -@ -O dtb -o my_main_dt.dtb my_main_dt.dts
Lệnh mẫu để tạo lớp phủ DT .dts
:
dtc -@ -O dtb -o my_overlay_dt.dtbo my_overlay_dt.dts
Xác minh kết quả DTO trên máy chủ
Việc xác minh có thể giúp bạn xác định các lỗi có thể xảy ra khi đặt lớp phủ DT trên DT chính. Trước khi cập nhật mục tiêu, bạn có thể xác minh kết quả của việc phủ DT trên máy chủ bằng cách mô phỏng hành vi của DTO bằng cách sử dụng /include/
in .dts
.
/include/
để mô phỏng DTO trên máy chủ- Tạo một bản sao của lớp phủ
.dts
. Trong bản sao, hãy xóa tiêu đề dòng đầu tiên. Ví dụ:/dts-v1/; /plugin/;
Lưu tệp dưới dạngmy_overlay_dt_wo_header.dts
(hoặc bất kỳ tên tệp nào bạn muốn). - Tạo một bản sao của
.dts
chính. Trong bản sao, sau dòng cuối cùng, hãy thêm cú pháp bao gồm cho tệp bạn đã tạo ở bước 1. Ví dụ:/include/ "my_overlay_dt_wo_header.dts"
Lưu tệp dưới dạngmy_main_dt_with_include.dts
(hoặc bất kỳ tên tệp nào bạn muốn). - Sử dụng
dtc
để biên dịchmy_main_dt_with_include.dts
để lấy DT đã hợp nhất, phải có cùng kết quả với DTO. Ví dụ:dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
- Sử dụng
dtc
để kếtmy_merged_dt.dto
.dtc -O dts -o my_merged_dt.dts my_merged_dt.dtb
Xác minh DTO trong Android 9
Android 9 yêu cầu phân vùng Device Tree Blob Overlay (DTBO). Để thêm các nút hoặc thực hiện các thay đổi đối với các thuộc tính trong SoC DT, bộ nạp khởi động phải tự động phủ một DT cụ thể của thiết bị lên SoC DT.
Chỉ ra các lớp phủ được áp dụng
Để kích hoạt Bộ kiểm tra nhà cung cấp (VTS) để đánh giá tính đúng đắn của ứng dụng lớp phủ, nhà cung cấp phải thêm tham số dòng lệnh hạt nhân mới androidboot.dtbo_idx
cho biết các lớp phủ được chọn từ phân vùng DTBO. Trong Android 12 sử dụng phiên bản hạt nhân 5.10 trở lên, tham số này chuyển qua bootconfig. Ví dụ: tham số androidboot.dtbo_idx=x,y,z
báo cáo x
, y
và z
là các chỉ số dựa trên 0 của Lớp phủ cây thiết bị (DTOs) từ phân vùng DTBO được bộ nạp khởi động áp dụng (theo thứ tự đó) cho cơ sở Cây thiết bị (DT).
Lớp phủ có thể áp dụng cho các nút từ cây thiết bị chính hoặc thêm các nút mới, nhưng không thể tham chiếu đến một nút được thêm trong lớp phủ trước đó. Hạn chế này là cần thiết vì ứng dụng lớp phủ không hợp nhất bảng biểu tượng lớp phủ với bảng biểu tượng DT chính (không hợp nhất tránh xung đột trong tên biểu tượng và phức tạp về sự phụ thuộc giữa các lớp phủ).
Ví dụ: Lớp phủ không hợp lệ
Trong ví dụ này, overlay_2.dts
đề cập đến nút e
, được thêm bởi overlay_1.dts
. Sau khi áp dụng overlay_1
cho DT chính, nếu cố gắng áp dụng overlay_2
cho DT kết quả, ứng dụng overlay sẽ không thành công với lỗi ký hiệu e
không có trong bảng ký hiệu cho DT cơ sở.
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>; }; |
Ví dụ: Các lớp phủ hợp lệ
Trong ví dụ này, overlay_2.dts
chỉ tham chiếu đến nút b
từ DTS chính. Khi overlay_1
được áp dụng cho DT cơ sở, sau đó áp dụng overlay_2
, giá trị của thuộc tính prop
trong nút e
(do overlay_1.dts
) sẽ bị ghi đè bởi giá trị do 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>; }; }; |
Triển khai phân vùng DTBO
Để triển khai phân vùng DTBO cần thiết, hãy đảm bảo bộ nạp khởi động có thể thực hiện những việc sau:
- Xác định bảng mà nó đang chạy và chọn (các) lớp phủ tương ứng sẽ được áp dụng.
- Nối tham số
androidboot.dtbo_idx
vào dòng lệnh nhân.- Tham số phải chỉ ra, các chỉ số dựa trên 0 của DTO từ hình ảnh phân vùng DTBO mà nó đã áp dụng cho DT cơ sở (theo cùng một thứ tự).
- Các chỉ số phải tham chiếu đến vị trí của lớp phủ trong phân vùng DTBO.
Để biết chi tiết về cấu trúc của phân vùng DTBO, hãy tham khảo Lớp phủ cây thiết bị trên source.android.com.
Xác thực phân vùng DTBO
Bạn có thể sử dụng VTS để xác minh những điều sau:
- Sự tồn tại của tham số dòng lệnh hạt nhân
androidboot.dtbo_idx
(bằng cách kiểm tra xemInit
đã tự động thiết lập thuộc tính hệ thốngro.boot.dtbo_idx
tương ứng). - Tính hợp lệ của thuộc tính hệ thống
ro.boot.dtbo_idx
(bằng cách kiểm tra xem thuộc tính chỉ định ít nhất một chỉ mục hình ảnh DTBO hợp lệ). - Tính hợp lệ của phân vùng DTBO (cũng xác minh các lớp phủ trong phân vùng DTBO được áp dụng cho DT cơ sở).
- Các nút bổ sung hoặc các thay đổi thuộc tính trong DT kết quả được trình bày cho nhân Linux.
Ví dụ: trong các lớp phủ sau và DT cuối cùng, việc thêm androidboot.dtbo_idx=5,3
vào dòng lệnh hạt nhân sẽ vượt qua xác thực nhưng thêm androidboot.dtbo_idx=3,5
vào dòng lệnh hạt nhân không vượt qua xác thực.
Lớp phủ DT ở chỉ số 3 | Lớp phủ DT ở chỉ số 5 |
---|---|
[overlay_1.dts] /dts-v1/; /plugin/; &c { prop = <0xfe>; }; | [overlay_2.dts] /dts-v1/; /plugin/; &c { prop = <0xff>; }; |
DT cuối cùng |
---|
/dts-v1/; / { a { phandle = <0x1>; }; b { phandle = <0x2>; }; c { phandle = <0x3>; prop = <0xfe>; }; __symbols__ { a = "/a"; b = "/b"; c = "/c"; }; }; |
Content and code samples on this page are subject to the licenses described in the Content License. Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
Last updated 2022-06-06 UTC.