Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Biên dịch & Xác minh

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 .

Hình 1. Sử dụng cú pháp /include/ để mô phỏng DTO trên máy chủ
  1. 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ạng my_overlay_dt_wo_header.dts (hoặc bất kỳ tên tệp nào bạn muốn).
  2. 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ạng my_main_dt_with_include.dts (hoặc bất kỳ tên tệp nào bạn muốn).
  3. Sử dụng dtc để biên dịch my_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
    
  4. Sử dụng dtc để kết my_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 , yz 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:

  1. 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.
  2. 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 xem Init đã tự động thiết lập thuộc tính hệ thống ro.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";
	};
};