Синтаксис DTO

Формат источника дерева устройств (DTS) представляет собой текстовое представление дерева устройств. Компилятор дерева устройств (DTC) обрабатывает этот формат в двоичное дерево устройств, которое является формой, ожидаемой ядром Linux.

Использование ссылок

Проект DTC (компилятор дерева устройств + патчи наложения) описывает формат DTS в файлах dtc-format.txt и manual.txt . Формат и правила DTO описаны в dt-object-internal.txt . В этих документах описывается, как обновить основное ОУ с помощью узла fragment@x и синтаксиса __overlay__ в оверлейном ОУ. Например:

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

Однако Google настоятельно рекомендует не использовать fragment@x @x и синтаксис __overlay__ , а вместо этого использовать эталонный синтаксис. Например:

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

Справочный синтаксис компилируется dtc в тот же объект, что и выше, с использованием синтаксиса __overlay__ . Этот синтаксис не требует нумерации фрагментов, позволяя легко читать и записывать оверлейные DTS. Если ваш dtc не поддерживает этот синтаксический сахар, используйте dtc в AOSP .

Использование ярлыков

Чтобы разрешить неопределенные ссылки на узлы, отсутствующие во время компиляции, файл .dts наложения DT должен иметь тег /plugin/ в заголовке. Например:

/dts-v1/;
/plugin/;

Отсюда вы можете выбрать узлы для наложения, используя ссылку, которая представляет собой абсолютный путь к узлу с префиксом амперсанда (&). Например, для node@0 в основном ОУ:

Определить метки в основном ОУ... ... затем используйте ярлыки.
[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 оверлей.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 оверлей.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 оверлей.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";
   
};
 
};
};