Как программировать файлы дерева файлов .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.
Для получения дополнительных свойств перейдите по этой ссылке, это очень полезно
Объяснение дерева устройств
Надеюсь, что это поможет!
Ответ 4
Дополнительно к другим ответам:
Имейте в виду, что есть также раздел для devicetrees в официальном исходном коде ядра под root/Documentation/devicetree
(https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/дерево/Документация /devicetree? h = v5.2-rc5).