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


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

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

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

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

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

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

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



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

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

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

Для описания соединений прерывания используются четыре свойства:

  • interrupt-controller - пустое свойство, объявляющее узел как устройство, получающее сигналы прерывания
  • #interrupt-cells - это свойство узла контроллера прерываний, которое показывает, сколько ячеек находится в спецификаторе прерывания для этого контроллера прерывания (аналогично #address-cells и #size-cells).
  • interrupt-parent - свойство узла устройства, содержащего уникальный идентификатор (phandle) контроллера прерываний, к которому он подключен.

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

    Спецификатор прерывания - это одна или несколько ячеек данных (как задано в #interrupt-cells), которые показывают, к какому входу прерывания подключено устройство. Большинство устройств имеют только один выход прерывания, как показано в примере ниже, но на устройстве может быть несколько выходов прерывания. Значение спецификатора прерывания полностью зависит от привязки устройства контроллера прерывания. Каждый контроллер прерывания может решить, сколько ячеек ему нужно, чтобы однозначно определить вход прерывания.

    Следующий код добавляет прерывания к нашей машине примера Coyote's Revenge:

    Здесь


  • 0 0 0x10100000 0x10000 // Chipselect 1, Ethernet
  • 1 0 0x10160000 0x10000 // Chipselect 2, i2c controller
  • 2 0 0x30000000 0x1000000>; // Chipselect 3, NOR Flash


    Некоторые вещи, на которые следует обратить внимание:

  • Машина имеет единственный контроллер прерываний interrupt-controller@10140000
  • Метка intc: была добавлена к узлу контроллера прерывания, и эта метка использовалась для назначения фандла (phandle) свойству interrupt-parent в корневом узле. Это родительское значение прерывания становится значением по умолчанию для системы, потому что все дочерние узлы наследуют его, если только оно не переопределено явно.
  • Каждое устройство использует свойство interrupt для указания отдельной строки ввода прерывания.
  • #interrupt-cells равно 2, поэтому каждый спецификатор прерывания имеет 2 ячейки. В этом примере используется общий шаблон использования первой ячейки для кодирования номера строки прерывания, а второй ячейки для кодирования флагов, таких как активный высокий и активный низкий или фронт к уровню чувствительности. Для любого данного контроллера прерывания обратитесь к документации привязки контроллера, чтобы узнать, как кодируется спецификатор.



  •   1    2    3    4    5    6    7