Как программировать файлы дерева файлов .dts Linux.dts?

Я собираюсь запустить Linux на моей доске разработки, и мне нужен файл dts (файл дерева устройств) для описания всего оборудования. Но я мало знаю о синтаксисе этого файла, которого недостаточно для правильной работы Linux на доске.

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

ps7_scuwdt_0: [email protected] {
                        compatible = "xlnx,ps7-scuwdt-1.00.a";
                        device_type = "watchdog";
                        interrupt-parent = <&ps7_scugic_0>;
                        interrupts = < 1 14 769 >;
                        reg = < 0xf8f00620 0xe0 >;
                } ;

Другое дополнительное использование или грамматика мне незнакомы.

Ответ 1

Взгляните на точки на доске, которая больше всего напоминает вашу дев-доску. Используйте это как ссылку и внесите изменения в dts в соответствии с различиями между эталонной платой и вашей девборд-платой.

Также проверьте следующее:
- Проект документации по дереву устройств в eLinux (имеет обширную коллекцию ссылок для начала чтения).
- Серия статей по основам дерева устройств.
- Прохождение миграции на дерево устройств.

Ответ 2

Минимальный reg + interrupt пример с виртуальным устройством QEMU

В нашем примере будет добавлено следующее дерево устройств node в дерево устройств versatilepb, которое QEMU будет использовать из-за -M versatilepb:

[email protected] {
    compatible = "lkmc_platform_device";
    reg = <0x101e9000 0x1000>;
    interrupts = <18>;
    interrupt-controller;
    #interrupt-cells = <2>;
    clocks = <&pclk>;
    clock-names = "apb_pclk";
    lkmc-asdf = <0x12345678>;
};

Затем, используя модуль ядра Linux для взаимодействия с устройством, мы проверим следующие функции DTS:

  • регистрирует адреса
  • IRQs
  • читать пользовательские свойства из драйвера

Это основные компоненты примера:

  • Универсальный патч .dts Linux для вилки Linux
    • reg и interrupt сопоставляемые номера жестко закодированы в универсальной машине QEMU (которая представляет собой SoC)
    • compatible соответствует platform_driver.name в модуле ядра и сообщает ядру, какой модуль будет обрабатывать это устройство
    • мы также передаем настраиваемое свойство драйверу: lkmc-asdf = <0x12345678>;, который считывается с помощью of_property_read_u32
    • дерево устройства передается в прошивку QEMU с аргументом -dtb
  • QEMU fork:
  • модуль ядра Записывает в память на зонде, чтобы проверить что-то, что также генерирует IRQ.

В деревьях устройств есть еще много функций, которые мы не рассмотрели, но этот пример должен помочь вам начать и легко позволить вам играть с любыми новыми функциями, которые появляются.

Дополнительные ресурсы:

Ответ 3

Давайте возьмем пример, и я объясню каждый из них ниже

auart0: [email protected] {
compatible = "fsl,imx28-auart", "fsl,imx23-auart";
reg = <0x8006a000 0x2000>;
interrupts = <112>;
dmas = <&dma_apbx 8>, <&dma_apbx 9>;
dma-names = "rx", "tx";
};

Обязательные свойства:
- совместимо: должно быть "fsl, -auart". Поддерживаемые SoCs включают imx23 и imx28.
- reg: адрес и длина набора регистров для устройства
- прерывания: должны содержать номера прерываний auart
- dmas: спецификатор DMA, состоящий из контроллера phandle для DMA node и идентификатор канала AUART DMA.
- dma-names: "rx" для канала RX, "tx" для канала TX.

Примечание. Каждый порт auart должен иметь псевдоним, правильно пронумерованный в "псевдонимах", node.
Для получения дополнительных свойств перейдите по этой ссылке, это очень полезно
Объяснение дерева устройств

Надеюсь, что это поможет!