Cú pháp DTO

Định dạng nguồn cây thiết bị (DTS) là một bản trình bày dạng văn bản của cây thiết bị (DT). Trình biên dịch cây thiết bị (DTC) xử lý định dạng này thành DT nhị phân, đây là hình thức mà nhân Linux dự kiến.

Sử dụng tệp đối chiếu

Dự án DTC (trình biên dịch Cây thiết bị + bản vá lớp phủ) mô tả định dạng DTS trong dtc-format.txtmanual.txt. Quy tắc và định dạng DTO được mô tả trong tệp dt-object-internal.txt. Các tài liệu này mô tả cách cập nhật DT chính bằng cách sử dụng nút fragment@x và cú pháp __overlay__ trong DT lớp phủ. Ví dụ:

/ {
  fragment@0 {
    target = <&some_node>;
      __overlay__ {
        some_prop = "okay";
        ...
      };
  };
};

Tuy nhiên, Google khuyên bạn không sử dụng fragment@x và cú pháp __overlay__, mà thay vào đó hãy sử dụng cú pháp tham chiếu. Ví dụ:

&some_node {
  some_prop = "okay";
  ...
};

Cú pháp tham chiếu được dtc biên dịch thành cùng một đối tượng như ở trên bằng cách sử dụng cú pháp __overlay__. Cú pháp này không bắt buộc bạn phải đánh số các mảnh, cho phép bạn dễ dàng đọc và ghi lớp phủ DTS. Nếu dtc không hỗ trợ cú pháp đơn giản này, hãy sử dụng dtc trong AOSP.

Sử dụng nhãn

Để cho phép các tệp tham chiếu không xác định đến các nút không xuất hiện tại thời điểm biên dịch, tệp .dts DT lớp phủ phải có thẻ /plugin/ trong tiêu đề. Ví dụ:

/dts-v1/;
/plugin/;

Từ đây, bạn có thể nhắm mục tiêu các nút cần phủ bằng cách sử dụng một tệp tham chiếu, đây là một đường dẫn nút tuyệt đối có tiền tố là ký hiệu và (&). Ví dụ: đối với node@0 trong DT chính:

Xác định nhãn trong DT chính ... ... sau đó sử dụng nhãn.
[my_main_dt.dts]

/dts-v1/;

/ {
  my_node: node@0 {
    status = "disabled";

    my_child: child@0 {
      value = <0xffffffff>;
    };
  };
};
[my_overlay_dt.dts]

/dts-v1/;
/plugin/;

&my_node {
  status = "okay";
};

&my_child {
  value = <0x1>;
};

Ghi đè

Nếu thuộc tính mục tiêu tham chiếu tồn tại trong DT chính, thì thuộc tính này sẽ bị ghi đè sau DTO; nếu không, thuộc tính này sẽ được thêm vào. Ví dụ:

main.dts overlay.dts Kết quả hợp nhất
[my_main_dt.dts]

/dts-v1/;

/ {
  compatible = "corp,foo";

  my_node: node@0 {
    status = "disabled";
  };
};
[my_overlay_dt.dts]

/dts-v1/;
/plugin/;

&my_node {
  status = "okay";
};
/dts-v1/;

/ {
  compatible = "corp,foo";

  ...

  node@0 {
    linux,phandle = <0x1>;
    phandle = <0x1>;
    status = "okay";
  };
};

Thêm

Nếu thuộc tính mục tiêu tham chiếu không tồn tại trong DT chính, thì thuộc tính này sẽ được thêm vào sau DTO. Ví dụ:

main.dts overlay.dts Kết quả hợp nhất
[my_main_dt.dts]

/dts-v1/;

/ {
  compatible = "corp,foo";

  my_node: node@0 {
    status = "okay";
  };
};
[my_overlay_dt.dts]

/dts-v1/;
/plugin/;

&my_node {
  new_prop = "bar";
};
/dts-v1/;

/ {
  compatible = "corp,foo";

  ...

  node@0 {
    linux,phandle = <0x1>;
    phandle = <0x1>;
    status = "okay";
    new_prop = "bar";
  };
};

Nút con

Ví dụ về cú pháp nút con:

main.dts overlay.dts Kết quả hợp nhất
[my_main_dt.dts]

/dts-v1/;

/ {
  compatible = "corp,foo";

  my_nodes: nodes {
    compatible = "corp,bar";

    node@0 {
      status = "disabled";
    };
  };
};
[my_overlay_dt.dts]

/dts-v1/;
/plugin/;

&my_nodes {
  new_prop1 = "abc";

  node@0 {
    status = "okay";
    new_prop2 = "xyz";
  };
};
/dts-v1/;

/ {
  compatible = "corp,foo";

  ...

  nodes {
    linux,phandle = <0x1>;
    phandle = <0x1>;
    compatible = "corp,bar";
    new_prop1 = "abc";

    node@0 {
      linux,phandle = <0x2>;
      phandle = <0x2>;
      status = "okay";
      new_prop2 = "xyz";
    };
  };
};