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ị (DT) lớp phủ 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 .dts chính:
dtc -@ -O dtb -o my_main_dt.dtb my_main_dt.dts
Lệnh mẫu để tạo DT .dts lớp phủ:
dtc -@ -O dtb -o my_overlay_dt.dtbo my_overlay_dt.dts
Xác minh kết quả DTO trên máy chủ
Quá trình 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ủ.
- Tạo bản sao của
.dtslớp phủ. Trong bản sao, hãy xoá tiêu đề dòng đầu tiên. Ví dụ: Lưu tệp dưới dạng/dts-v1/; /plugin/;
my_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
.dtschính. Trong bản sao, sau dòng cuối cùng, hãy thêm cú pháp include cho tệp bạn đã tạo ở bước 1. Ví dụ: Lưu tệp dưới dạng/include/ "my_overlay_dt_wo_header.dts"
my_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.dtsnhằm nhận DT đã hợp nhất. Kết quả này phải 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để trích xuất dữ liệumy_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 blob lớp phủ cây thiết bị (DTBO). Để thêm các nút hoặc thay đổi các thuộc tính trong SoC DT, trình tải khởi động phải phủ lớp phủ DT dành riêng cho thiết bị một cách linh hoạt trên SoC DT.
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á tính chính xác của ứng dụng lớp phủ, nhà cung cấp phải thêm tham số dòng lệnh kernel 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 kernel
5.10 trở lên, tham số này sẽ truyề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ỉ mục dựa trên 0 của
các DTO từ phân vùng DTBO được bộ nạp khởi động áp dụng (theo thứ tự đó)
cho DT cơ sở.
Các 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 được thêm vào 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 ký hiệu lớp phủ với bảng ký hiệu DT chính (việc không hợp nhất sẽ 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 tham chiếu đến nút
e , được thêm bởi
overlay_1.dts. Sau khi overlay_1 được áp dụng cho
DT chính, nếu bạn cố gắng áp dụng overlay_2 cho
DT kết quả, ứng dụng lớp phủ sẽ gặp lỗi rằng 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ụ: 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 đó là
ứng dụng overlay_2, giá trị của thuộc tính
prop trong nút e
(do overlay_1.dts đặt) sẽ bị ghi đè bởi giá trị do
overlay_2.dts đặt.
| 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 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 các lớp phủ tương ứng sẽ được áp dụng.
- Thêm tham số
androidboot.dtbo_idxvào dòng lệnh kernel.- Tham số phải cho biết các chỉ mục dựa trên 0 của DTOs từ hình ảnh phân vùng DTBO mà tham số đó áp dụng cho DT cơ sở (theo cùng một 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 partition.
Để 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 bài viết 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 nội dung sau:
- Sự tồn tại của tham số dòng lệnh kernel
androidboot.dtbo_idx(bằng cách kiểm tra xemInitcó tự động thiết lập thuộc tính hệ thốngro.boot.dtbo_idxtương ứng hay khô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 có chỉ định ít nhất một chỉ mục hình ảnh DTBO hợp lệ hay không). - 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 phân vùng được áp dụng cho DT cơ sở).
- Các nút bổ sung hoặc thay đổi thuộc tính trong DT kết quả được trình bày cho kernel 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 kernel sẽ vượt qua quá trình xác thực nhưng việc thêm androidboot.dtbo_idx=3,5 vào dòng lệnh kernel
sẽ không vượt qua quá trình xác thực.
| Lớp phủ DT ở chỉ mục 3 | Lớp phủ DT ở chỉ mục 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";
};
};
|