Перейти до основного вмісту

Дерева пристроїв та оверлеї

Дерево пристроїв описує апаратне забезпечення плати, щоб ядро могло прив’язати до нього драйвери. Плата Modalix завантажує базове дерево пристроїв, а потім застосовує оверлеї для того, що ви під’єднуєте, наприклад для камери. На цій сторінці показано, як вибрати оверлей, що постачається з випуском, як написати власний і як перевірити результат.

Ще не перевірено на обладнанні

Цю сторінку написано на основі вихідного коду ядра та U-Boot для випуску платформи 2.1.3 та інших посібників цього сайту. Кроки в тому вигляді, як їх тут описано, ще не виконували на платі.

Як плата завантажує дерево пристроїв​

  1. U-Boot завантажує базове дерево пристроїв для плати з активного каталогу завантаження, boot-0 або boot-1.
  2. U-Boot застосовує кожен оверлей, названий у змінній dtbos, у вказаному порядку.
  3. Ядро запускається з об’єднаним деревом пристроїв.

Дерево пристроїв описує апаратне забезпечення. Воно не додає драйвер. Драйвер пристрою вже має бути в ядрі або встановлений як модуль. Див. модель використання дерева пристроїв у документації ядра.

Вибір оверлея з випуску​

Випуск містить оверлеї для підтримуваних камер і для конфігурацій PCIe та флеш-пам’яті. Їхні вихідні файли розміщено в каталозі overlays дерева ядра.

  1. Перегляньте оверлеї на платі:

    sima@modalix:~$ ls /boot/boot-*/*.dtbo
  2. Перервіть U-Boot, задайте в dtbos оверлей і завантажте плату:

    sima$ setenv dtbos modalix-som-waveshare-ARDU-IMX477-1CAM.dtbo
    sima$ saveenv
    sima$ boot

Щоб застосувати більше ніж один оверлей, розділіть назви пробілами. Про оверлеї камер див. розділ Підтримувані камери MIPI.

Написання власного оверлея​

Напишіть оверлей, коли під’єднуєте пристрій, для якого у випуску немає оверлея. У цьому прикладі додається розширювач GPIO з інтерфейсом I2C за адресою 0x27 на шині I2C 0:

/dts-v1/;
/plugin/;

&i2c00 {
status = "okay";
clock-frequency = <400000>;
#address-cells = <1>;
#size-cells = <0>;

pcf8574: gpio@27 {
compatible = "nxp,pcf8574";
reg = <0x27>;
gpio-controller;
#gpio-cells = <2>;
};
};
  • &i2c00 вибирає вузол, який потрібно змінити, за його міткою в базовому дереві пристроїв.
  • status = "okay" вмикає вузол, який базове дерево пристроїв залишає вимкненим.
  • #address-cells і #size-cells повторюють значення шини з базового дерева пристроїв. Без них dtc попереджає, що не може перевірити reg.
  • Дочірній вузол — це пристрій. compatible вибирає драйвер, а reg — це адреса пристрою на шині.

Перш ніж писати оверлей, перевірте, що ядро має драйвер. Рядок compatible має належати драйверу, який вмикає simaai_modalix_defconfig, або модулю, який ви збираєте та встановлюєте.

Більший приклад — оверлей камери з дерева ядра, наприклад modalix-som-waveshare-ARDU-IMX477-1CAM.dtso. Він додає тактовий сигнал для сенсора, налаштовує шину I2C і контакт вимкнення живлення, вмикає інтерфейс CSI та його відеовузли й під’єднує сенсор до інтерфейсу CSI двома лініями даних.

Збирання та встановлення оверлея​

  1. Скомпілюйте вихідний файл оверлея у файл .dtbo, як описано в розділі Збирання BSP з вихідного коду.

  2. Скопіюйте файл .dtbo до активного каталогу завантаження плати.

  3. Додайте файл до dtbos в U-Boot після оверлеїв, які вже там перелічено:

    sima$ env set dtbos $dtbos my-device.dtbo
    sima$ saveenv
    sima$ boot

Перевірка результату​

Перевіряйте в такому порядку. Кожен крок залежить від попереднього.

  1. Оверлей застосовано. Знайдіть новий вузол у дереві пристроїв, яке використовує ядро:

    root@modalix:~# find /proc/device-tree -name "gpio@27"
  2. Драйвер прив’язався до пристрою. Знайдіть драйвер у журналі ядра:

    root@modalix:~# dmesg | grep -i pcf857x
  3. Пристрій працює. Скористайтеся інструментом для такого типу пристроїв. Для розширювача GPIO gpiodetect показує новий чип. Для камери cam -l показує камеру.

Якщо не працює​

Що ви бачитеІмовірна причинаЩо перевірити
Вузла немає в /proc/device-treeU-Boot не застосував оверлейprintenv dtbos в U-Boot, файл в активному каталозі завантаження та помилки в консолі U-Boot
Вузол є, але драйвер не прив’язуєтьсяЯдро не має драйвера для рядка compatibleКонфігурацію ядра та dmesg
Драйвер повідомляє про помилкуНеправильна шина чи адреса або бракує тактового сигналу, живлення, скидання чи GPIOdmesg, а для пристрою I2C — i2cdetect
Інший пристрій перестає працюватиДва оверлеї змінюють той самий вузол або той самий контактЗастосовуйте оверлеї по одному

Наступні кроки​