Google is committed to advancing racial equity for Black communities. See how.
Эта страница переведена с помощью Cloud Translation API.
Switch to English

Компиляция и проверка

Вы можете использовать компилятор дерева устройств (DTC) для компиляции исходных файлов дерева устройств. Однако перед применением оверлейного ОУ к целевому основному ОУ вы также должны проверить результат, смоделировав поведение DTO.

Компиляция с помощью DTC

При использовании dtc для компиляции .dts необходимо добавить опцию -@ чтобы добавить узел __symbols__ в полученный .dtbo . Узел __symbols__ содержит список всех узлов, помеченных меткой, которую библиотека DTO может использовать для ссылок.

Пример команды для создания основного DT .dts :

dtc -@ -O dtb -o my_main_dt.dtb my_main_dt.dts

Пример команды для создания оверлея DT .dts :

dtc -@ -O dtb -o my_overlay_dt.dtbo my_overlay_dt.dts

Проверить результаты DTO на хосте

Проверка может помочь вам определить ошибки, которые могут возникнуть при размещении оверлейного ОУ на основном ОУ. Перед обновлением цели вы можете проверить результат наложения DT на хост, смоделировав поведение DTO с помощью /include/ in .dts .

Рисунок 1. Используйте синтаксис /include/ для имитации DTO на хосте.
  1. Создайте копию оверлея .dts . В копии удалите заголовок первой строки. Пример:
    /dts-v1/;
    /plugin/;
    
    Сохраните файл как my_overlay_dt_wo_header.dts (или любое имя файла по вашему желанию).
  2. Создайте копию основного .dts . В копии после последней строки добавьте синтаксис включения для файла, созданного на шаге 1. Например:
    /include/ "my_overlay_dt_wo_header.dts"
    
    Сохраните файл как my_main_dt_with_include.dts (или любое имя файла по вашему my_main_dt_with_include.dts ).
  3. Используйте dtc для компиляции my_main_dt_with_include.dts чтобы получить объединенный DT, который должен иметь тот же результат, что и DTO. Например:
    dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
    
  4. Используйте dtc чтобы сбросить my_merged_dt.dto .
    dtc -O dts -o my_merged_dt.dts my_merged_dt.dtb
    

Проверка DTO в Android 9

Android 9 требует раздела дерева устройств Blob Overlay (DTBO). Чтобы добавить узлы или внести изменения в свойства в SoC DT, загрузчик должен динамически накладывать DT для конкретного устройства поверх SoC DT.

Обозначение примененных оверлеев

Чтобы тестовый пакет Vendor Test Suite (VTS) мог оценить корректность приложения наложения, поставщики должны добавить новый параметр командной строки ядра androidboot.dtbo_idx который указывает наложения, выбранные из раздела DTBO. Например, параметр androidboot. dtbo_idx=x,y,z сообщает x , y и z как отсчитываемые от нуля индексы наложений дерева устройств (DTO) из раздела DTBO, примененных (в этом порядке) загрузчиком к базовому дереву устройств (DT).

Наложения могут применяться к узлам из основного дерева устройств или добавлять новые узлы, но не могут относиться к узлу, добавленному в предыдущем наложении. Это ограничение необходимо, потому что приложение наложения не объединяет таблицу символов наложения с основной таблицей символов ОУ (отсутствие объединения позволяет избежать конфликтов в именах символов и усложнения зависимостей между наложениями).

Пример: недействительные оверлеи

В этом примере overlay_2.dts относится к узлу e , который был добавлен overlay_1.dts . После применения overlay_1 к основному DT, если будет сделана попытка применить overlay_2 к результирующему DT, приложение наложения завершится ошибкой с ошибкой, что символ e отсутствует в таблице символов для базового DT.

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>;
};

Пример: допустимые оверлеи

В этом примере overlay_2.dts относится только к узлу b из основного DTS. Когда overlay_1 применяется к базовому DT, а затем применяется overlay_2 , значение свойства prop в узле e (установленное overlay_1.dts ) перезаписывается значением, установленным 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>;
      };
};

Реализация раздела DTBO

Чтобы реализовать требуемый раздел DTBO, убедитесь, что загрузчик может выполнять следующие действия:

  1. Определите плату, на которой он работает, и выберите соответствующие наложения, которые нужно применить.
  2. Добавьте параметр androidboot.dtbo_idx в командную строку ядра.
    • Параметр должен указывать отсчитываемые от нуля индексы DTO из образа раздела DTBO, примененного к базовому DT (в том же порядке).
    • Индексы должны относиться к положению оверлея в разделе DTBO.

Подробные сведения о структуре раздела DTBO см. В разделе « Наложения дерева устройств» на сайте source.android.com.

Проверка раздела DTBO

Вы можете использовать VTS для проверки следующего:

  • Наличие параметра командной строки ядра androidboot.dtbo_idx (проверяя, что Init автоматически установил соответствующее системное свойство ro.boot.dtbo_idx ).
  • Действительность системного свойства ro.boot.dtbo_idx (путем проверки того, что свойство указывает хотя бы один допустимый индекс изображения DTBO).
  • Действительность раздела DTBO (также проверяет наложения в разделе DTBO, которые применяются к базовому DT).
  • Дополнительные узлы или изменения свойств в итоговом ОУ передаются ядру Linux.

Например, в следующих наложениях и окончательном DT добавление androidboot.dtbo_idx=5,3 в командную строку ядра проходит проверку, но добавление androidboot.dtbo_idx=3,5 в командную строку ядра не проходит проверку.

Наложение ОУ на индекс 3 Наложение ОУ на индекс 5
[overlay_1.dts]

/dts-v1/;
/plugin/;

&c { prop = <0xfe>; };
[overlay_2.dts]

/dts-v1/;
/plugin/;

&c { prop = <0xff>; };
Финал DT
/dts-v1/;
/ {

	a {
		phandle = <0x1>;
	};

	b {
		phandle = <0x2>;
	};

	c {
		phandle = <0x3>;
		prop = <0xfe>;
	};

	__symbols__ {
		a = "/a";
		b = "/b";
		c = "/c";
	};
};