Bạn có thể sử dụng trình biên dịch cây thiết bị (DTC) để biên dịch các tệp nguồn cây thiết bị (DTS). Tuy nhiên, trước khi áp dụng cây thiết bị 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 lớp phủ cây thiết bị (DTO).
Biên dịch bằng DTC
Khi sử dụng dtc
để biên dịch .dts
, bạn phải thêm tuỳ chọn -@
để thêm một nút __symbols__
vào .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 chiếu.
Lệnh mẫu để tạo DT chính .dts
:
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ả của tổ chức buôn bán ma tuý 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 DT lớp phủ 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 /include/
trong .dts
.
Hình 1. Sử dụng cú pháp /include/ để mô phỏng DTO trên máy chủ lưu trữ.
- Tạo bản sao của lớp phủ
.dts
. Trong bản sao, hãy xoá 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 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 include cho tệp mà 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
nhằm lấy DT hợp nhất. Kết quả sẽ giống với DTO. Ví dụ:dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
- Sử dụng
dtc
để kết xuấ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 lớp phủ blob cây thiết bị (DTBO). Để thêm nút hoặc thực hiện thay đổi đối với các thuộc tính trong DT SoC, trình tải khởi động phải tự động phủ một DT dành riêng cho thiết bị lên DT SoC.
Cho biết các lớp phủ đã áp dụng
Để cho phép Bộ kiểm thử nhà cung cấp (VTS) đánh giá độ chính xác của ứng dụng lớp phủ, nhà cung cấp phải thêm một tham số dòng lệnh 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 sẽ truyền qua bootconfig.
Ví dụ: thông số androidboot.dtbo_idx=x,y,z
báo cáo x
, y
và z
dưới dạng chỉ mục dựa trên 0 của các DTO từ phân vùng DTBO được áp dụng (theo thứ tự đó) bởi trình tải khởi động cho DT cơ sở.
Lớp phủ có thể áp dụng cho các nút từ DT 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 đã thêm trong lớp phủ trước đó. Quy định 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 ký hiệu lớp phủ với bảng ký hiệu DT chính (không hợp nhất để tránh xung đột trong tên ký hiệu và sự phức tạp của các phần 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
do overlay_1.dts
thêm vào. Sau khi áp dụng overlay_1
cho DT chính, nếu bạn cố gắng áp dụng overlay_2
cho DT kết quả, thì ứng dụng lớp phủ sẽ không thành công với lỗi biểu tượng e
không có trong bảng biểu tượng cho DT cơ sở.
main.dts | lớp phủ_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ụ: 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ở, theo sau là ứng dụng của overlay_2
, giá trị của thuộc tính prop
trong nút e
(do overlay_1.dts
đặt) sẽ được ghi đè bằng giá trị do overlay_2.dts
đặt.
main.dts | lớp phủ_1.dts | lớp phủ_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 bắt buộc, hãy đảm bảo trình tải khởi động có thể làm những việc sau:
- Xác định bo mạch đang chạy và chọn lớp phủ tương ứng để áp dụng.
- Thêm tham số
androidboot.dtbo_idx
vào dòng lệnh nhân.- Tham số này phải cho biết các chỉ mục từ 0 của các DTO từ hình ảnh phân vùng DTBO được áp dụng cho DT cơ sở (theo cùng thứ tự).
- Các chỉ mục phải tham chiếu đến vị trí của lớp phủ trong phân vùng DTBO.
Để biết thông tin chi tiết về cấu trúc của phân vùng DTBO, hãy tham khảo phần Lớp phủ cây thiết bị.
Xác thực phân vùng DTBO
Bạn có thể sử dụng VTS để xác minh những thông tin 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 để đảm bảoInit
đã 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 để đảm bảo thuộc tính này 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 thay đổi thuộc tính trong DT thu được sẽ được trình bày cho nhân Linux.
Ví dụ: trong các lớp phủ và DT cuối cùng sau đây, việc thêm androidboot.dtbo_idx=5,3
vào dòng lệnh hạt nhân sẽ vượt qua quy trình xác thực, nhưng việc thêm androidboot.dtbo_idx=3,5
vào dòng lệnh hạt nhân sẽ không vượt qua quy trình xác thực.
Lớp phủ DT tại chỉ mục 3 | Lớp phủ DT tại chỉ mục 5 |
---|---|
[overlay_1.dts] /dts-v1/; /plugin/; &c { prop = <0xfe>; }; |
[overlay_2.dts] /dts-v1/; /plugin/; &c { prop = <0xff>; }; |
DT chung cuộc |
---|
/dts-v1/; / { a { phandle = <0x1>; }; b { phandle = <0x2>; }; c { phandle = <0x3>; prop = <0xfe>; }; __symbols__ { a = "/a"; b = "/b"; c = "/c"; }; }; |