Минимальный reg
+ interrupt
пример с виртуальным устройством QEMU
Как говорили другие, дерево устройств предоставляется поставщиками оборудования и сообщает ядру Linux, как взаимодействовать с устройствами.
Возможно, две наиболее важные части информации, которые нужны ядру Linux, это:
В нашем примере к дереву устройств versatilepb
будет добавлен следующий узел дерева устройств, который QEMU будет использовать из-за-M versatilepb
:
lkmc_platform_device@101e9000 {
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:
Это основные компоненты примера:
.dts
Патч для форка Linux reg
и interrupt
жестко соответствуют числам -, закодированным в универсальной машине QEMU (, которая представляет SoC)compatible
соответствует platform_driver.name
в модуле ядра и сообщает ядру, какой модуль будет обрабатывать это устройство lkmc-asdf = <0x12345678>;
,который читается сof_property_read_u32
-dtb
-M versatilepb
В деревьях устройств есть много других функций, которые мы не рассмотрели, но этот пример должен помочь вам начать работу и легко позволить вам поиграть с любыми новыми функциями, которые появляются.
Дополнительные ресурсы:
dtc
для чисто синтаксических вопросов. Например, он показывает, как узлы просто объединяются по пути:https://unix.stackexchange.com/a/375923/32558За исключением требования «автоматическое обнаружение изменений в файлах», это можно сделать с помощью GNU id -utils . Это предоставляет инструмент под названием mkid
, который создает двоичный файл базы данных с именем ID
, который используется инструментом запросов lid
и другими.
Id -utils предназначен для программирования; он распознает типы файлов по суффиксам в соответствии с настраиваемым файлом id-lang.map
. Для каждого типа, который он поддерживает, у него есть отдельный сканер, чтобы токены из файла правильно обрабатывались. Существует резервный сканер для текстовых файлов, который mkid
использует, как мне кажется, в качестве резервного для нераспознанных типов файлов. Я думаю, что если вы направите mkid
на пустой id-lang.map
файл, который пуст, он будет использовать текстовый сканер для всего.
mkid
достаточно быстро индексирует деревья, а запросы выполняются молниеносно.
Я интегрировал его с Vim для просмотра исходного кода; это удобнее, чем использование отдельного инструмента, такого как cscope. С этими двумя настройками:
:set grepprg=lid\ --regex\ --result=grep\ '$*'\ \\\|\ sort\ -u\ -t\ :\ -k\ 1,1\ -k\ 2,2n
:set grepformat=%f:%l:%m
Я могу использовать базу данных идентификаторов в качестве основы для команды Vim :grep
. Например. :grep foo
выводит список всех местоположений, где находится foo
.
Шаг sort
в приведенном выше определении grepprg
необходим, потому что lid
выводит совпадения в забавном порядке. Это делает внутреннее хеширование или что-то в этом роде.