Как использовать дерево устройств


1. Базовый формат данных

2.   Основные понятия  

3. Как работает адресация

4. Как работают прерывания

5. Специфические данные устройства

6. Специальные узлы

7. Машина с мостом Host/PCI



2. Основные понятия

Чтобы понять, как используется дерево устройств, мы начнем с простой машины и построим дерево устройств, чтобы описать его шаг за шагом.


2.1. Образец машины

Рассмотрим следующую воображаемую машину (основанную на ARM Versatile), производимую Acme и получившую название «Coyote's Revenge»:

  • Один 32-битный процессор ARM
  • Локальная шина процессора подключена к последовательному порту с отображением памяти, контроллеру шины spi, контроллеру i2c, контроллеру прерываний и мосту внешней шины
  • 256 МБ SDRAM на основе 0
  • Два последовательных порта на базе 0x101F1000 и 0x101F2000
  • Контроллер GPIO на базе 0x101F3000
  • Контроллер SPI на базе 0x10170000 со следующими устройствами
  • Слот MMC с контактом SS, подключенным к GPIO # 1
  • Внешний шинный мост со следующими устройствами
  • SMC SMC91111 Ethernet-устройство, подключенное к внешней шине на базе 0x10100000
  • Контроллер i2c на базе 0x10160000 со следующими устройствами
  • Часы реального времени Maxim DS1338. Реагирует на подчиненный адрес 1101000 (0x58)
  • 64 МБ флэш-памяти NOR на основе 0x30000000

    2.2. Исходная структура

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

    Свойство compatible указывает имя системы. Оно содержит строку в формате производитель, модель. Важно указать точное устройство и включить имя производителя, чтобы избежать конфликтов пространства имен. Поскольку операционная система будет использовать значение compatible для принятия решений о том, как запускаться на машине, очень важно указать правильные данные в этом свойстве.

    Теоретически совместимыми являются все данные, необходимые ОС для однозначной идентификации машины. Если все детали машины жестко запрограммированы, тогда ОС может искать именно «acme, coyotes-revenge» в свойстве compatible верхнего уровня.


    2.3. Процессоры

    Следующий шаг - описать каждый из процессоров. Узел контейнера с именем cpus добавляется с дочерним узлом для каждого процессора. В данном случае это двухъядерная система Cortex A9 от ARM.

    Cвойство compatible в каждом узле процессора - это строка, которая указывает точную модель процессора в формате <manufacturer>, <model>, точно так же, как свойство совместимости на верхнем уровне.

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


    2.4. Имена узлов

    Соглашения об именах.
    У каждого узла должно быть имя в формате <name>[<@unit-address>].
    Имя представляет собой простую строку ascii длиной до 31 символа.
    Как правило, узлы именуются в зависимости от того, какое устройство они представляют. т.е. узел для адаптера Ethernet 3com будет использовать это имя ethernet, а не 3com509.

    Адрес устройства включается, если узел описывает устройство с адресом. Как правило, адрес устройства является основным адресом, используемым для доступа к устройству, и указан в свойстве reg узла. (Свойство reg будет рассмотрено позже).

    Узлы-братья должны иметь уникальное имя, но это нормально, когда несколько узлов используют одно и то же общее имя, если адрес отличается (например, serial@101f1000 и serial@101f2000). (См. Раздел 2.2.1 спецификации ePAPR для получения полной информации об именах узлов).


    2.5. Устройства

    Каждое устройство в системе представлено узлом дерева устройств. Следующим шагом является заполнение дерева узлом для каждого из устройств. На данный момент новые узлы останутся пустыми, пока мы не сможем поговорить о том, как обрабатываются диапазоны адресов и IRQ.

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

    Это дерево на данный момент недействительно. Отсутствует информация о соединениях между устройствами. Эти данные будут добавлены позже.

    Обратите внимание на то, что в этом дереве:

  • у каждого узла устройства есть свойство compatible
  • узел flash имеет 2 строки в свойстве compatible
  • как упоминалось ранее, имена узлов отражают тип устройства, а не конкретную модель.

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


    2.6. Особенности свойства compatible

    Каждый узел в дереве, представляющий устройство, должен иметь свойство compatible. Это ключ, который операционная система использует для решения, какой драйвер устройства привязать к устройству.

    Cвойство compatible - это список строк. Первая строка в списке формата производитель, модель указывает точно устройство, которое представляет этот узел. Остальные строки представляют другие устройства, с которыми устройство совместимо.

    Например, система на кристалле Freescale MPC8349 (SoC) имеет последовательное устройство, реализующее регистровый интерфейс National Semiconductor ns16550. Поэтому свойство для последовательного устройства MPC8349 должно быть: compatible = "fsl,mpc8349-uart", "ns16550".

    В этом случае fsl,mpc8349-uart указывает точное устройство и ns16550 указывает, что оно на уровне регистров совместимо с UART National Semiconductor 16550.

    Примечание: ns16550 не имеет префикса производителя исключительно по историческим причинам. Все новые совместимые значения должны использовать префикс производителя.

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

    Предупреждение. Не используйте символы-джокеры (wildcard) в значениях свойства compatible, например "fsl, mpc83xx-uart" или аналогичные.

    Примечание. Подстановочный символ (wildcard) - это символ (*,x,? и др.), который может быть использован в качестве замены для любого символа из одного класса символов

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



  •   1    2    3    4    5    6    7