ไวยากรณ์ DTO

รูปแบบแหล่งที่มาของแผนผังอุปกรณ์ (DTS) คือการแสดงแผนผังอุปกรณ์ (DT) เป็นข้อความ คอมไพเลอร์ Device Tree (DTC) จะประมวลผลรูปแบบนี้ให้เป็น DT แบบไบนารี ซึ่งเป็นรูปแบบที่เคอร์เนล Linux คาดไว้

ใช้ข้อมูลอ้างอิง

โปรเจ็กต์ DTC (คอมไพเลอร์ต้นไม้อุปกรณ์ + แพตช์การวางซ้อน) จะอธิบายรูปแบบ DTS ใน dtc-format.txt และ manual.txt รูปแบบและกฎของ DTO อธิบายไว้ใน dt-object-internal.txt เอกสารเหล่านี้อธิบายวิธีอัปเดต DT หลักโดยใช้โหนด fragment@x และไวยากรณ์ __overlay__ ใน DT การวางซ้อน เช่น

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

อย่างไรก็ตาม Google ขอแนะนําอย่างยิ่งให้คุณไม่ใช้ fragment@x และไวยากรณ์ __overlay__ และใช้ไวยากรณ์อ้างอิงแทน เช่น

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

dtc จะคอมไพล์ไวยากรณ์อ้างอิงให้เป็นออบเจ็กต์เดียวกับด้านบนโดยใช้ไวยากรณ์ __overlay__ รูปแบบคำสั่งนี้ไม่บังคับให้คุณต้องระบุหมายเลขของข้อมูลโค้ด ทำให้อ่านและเขียน DTS การวางซ้อนได้ง่ายๆ หาก dtc ไม่รองรับไวยากรณ์ที่ง่ายขึ้นนี้ ให้ใช้ dtc ใน AOSP

ใช้ป้ายกำกับ

หากต้องการอนุญาตการอ้างอิงที่ไม่ระบุซึ่งไม่มีอยู่ ณ เวลาคอมไพล์ ไฟล์ DT .dts ของการวางซ้อนต้องมีแท็ก /plugin/ ในส่วนหัว เช่น

/dts-v1/;
/plugin/;

จากที่นี่ คุณสามารถกําหนดเป้าหมายโหนดที่จะวางซ้อนกันโดยใช้ข้อมูลอ้างอิง ซึ่งเป็นเส้นทางโหนดแบบสัมบูรณ์ที่มีเครื่องหมายแอมเพอร์แซนด์ (&) นําหน้า เช่น สําหรับ node@0 ใน DT หลัก ให้ทำดังนี้

กำหนดป้ายกำกับใน DT หลัก ... ... จากนั้นใช้ป้ายกำกับ
[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>;
};

ลบล้าง

หากพร็อพเพอร์ตี้เป้าหมายอ้างอิงมีอยู่ใน DT หลัก ระบบจะลบล้างพร็อพเพอร์ตี้นั้นหลังจาก DTO มิเช่นนั้น ระบบจะเพิ่มพร็อพเพอร์ตี้นั้นต่อท้าย เช่น

main.dts overlay.dts ผลลัพธ์ที่ผสานรวม
[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";
  };
};

ต่อท้าย

หากพร็อพเพอร์ตี้เป้าหมายอ้างอิงไม่อยู่ใน DT หลัก ระบบจะเพิ่มพร็อพเพอร์ตี้นั้นต่อท้าย DTO เช่น

main.dts overlay.dts ผลลัพธ์ที่ผสานรวม
[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";
  };
};

โหนดย่อย

ตัวอย่างไวยากรณ์ของโหนดย่อย

main.dts overlay.dts ผลลัพธ์ที่ผสานรวม
[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";
    };
  };
};