2014-10-29 2 views
2

У меня есть следующие фрагменты из двух разных источников дерева устройств.Чтение узла дерева устройств с использованием свойства прерывания

UART1: [email protected] { 
       device_type = "serial"; 
       compatible = "ns16550"; 
       reg = <0xef600400 8>; 
       virtual-reg = <0xef600400>; 
       clock-frequency = <0x00a8c000>; 
       current-speed = <0>; 
       interrupt-parent = <&UIC0>; 
       interrupts = <1 4>; 
        }; 


serial0: [email protected] { 
        cell-index = <0>; 
        device_type = "serial"; 
        compatible = "ns16550"; 
        reg = <0x4500 0x100>; 
        clock-frequency = <0>; 
        interrupts = <42 2>; 
        interrupt-parent = <&mpic>; 
      }; 

Я хотел бы знать, что делает прерывание = < 1 4>; interrupts = < 42 2>; стоять?

Где мы находимся < 1 4>, < 42 2> значения от?

+1

Здесь есть некоторая информация, но похоже, что значения будут специфическими для оборудования: http://www.devicetree.org/Device_Tree_Usage –

+0

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

ответ

7

Вам нужно немного больше контекста, чтобы определить, что представляют собой объекты interrupts. Принимая что-то похожее на первый пример, давайте посмотрим на arch/powerpc/boot/dts/bamboo.dts, который имеет следующий:

 UART1: [email protected] { 
      device_type = "serial"; 
      compatible = "ns16550"; 
      reg = <0xef600400 0x00000008>; 
      virtual-reg = <0xef600400>; 
      clock-frequency = <0>; 
      current-speed = <0>; 
      interrupt-parent = <&UIC0>; 
      interrupts = <0x1 0x4>; 
     }; 

Свойства interrupts описывает соединение от этого устройства к контроллеру прерываний. Предполагая, что контроллер имеет несколько входов (т. Е. Линии прерываний), нам нужно выяснить, с какой из линий будет взаимодействовать это устройство.

Различные контроллеры могут иметь различные методы демультиплексирования своих IRQ, следовательно, варьирование типов свойств. В этом случае давайте посмотрим на контроллер прерываний. Мы видим, что [email protected] узел имеет следующее свойство:

  interrupt-parent = <&UIC0>; 

Синтаксис &UIC0 говорит нам, что есть этикетка UIC0 в другом месте в дереве устройств. Это наш контроллер прерываний. Если мы находим, что ярлык, мы видим:

UIC0: interrupt-controller0 { 
    compatible = "ibm,uic-440ep","ibm,uic"; 
    interrupt-controller; 
    cell-index = <0>; 
    dcr-reg = <0x0c0 0x009>; 
    #address-cells = <0>; 
    #size-cells = <0>; 
    #interrupt-cells = <2>; 
}; 

Во-первых, мы видим, что #interrupt-cells 2 - это означает, что каждое прерывание дескриптор занимает две ячейки. Так как у свойства последовательного устройства interrupt есть две ячейки (0x1 и 0x4), это говорит нам о том, что существует одна строка прерывания.

Свойство compatible говорит нам, что это контроллер прерывания IBM UIC. Если мы посмотрим на драйвера для этого контроллера, мы видим:

static struct irq_domain_ops uic_host_ops = { 
    .map = uic_host_map, 
    .xlate = irq_domain_xlate_twocell, 
}; 

Эта функция xlate является то, что используется для отображения источников прерываний interrupts свойства ряда аппаратного IRQ (и, возможно, его типа IRQ). irq_domain_xlate_twocell функция довольно проста:

int irq_domain_xlate_twocell(struct irq_domain *d, struct device_node *ctrlr, 
      const u32 *intspec, unsigned int intsize, 
      irq_hw_number_t *out_hwirq, unsigned int *out_type) 
{ 
    if (WARN_ON(intsize < 2)) 
     return -EINVAL; 
    *out_hwirq = intspec[0]; 
    *out_type = intspec[1] & IRQ_TYPE_SENSE_MASK; 
    return 0; 
} 

Так (и как Питер L упомянул в своем комментарии), в этом случае две ячейки <0x1 0x4> представляют собой линию прерывания 1, и уровень высокой (0x4 == IRQ_TYPE_LEVEL_HIGH) тип прерывания.

Ваш второй пример немного сложнее: он использует контроллер прерывания mpic, который имеет свою собственную функцию xlate. Посмотрите на mpic_host_xlate в arch/powerpc/sysdev/mpic.c для внутренних деталей.

+0

, так как я могу найти драйвер устройства IBM UIC для прерывания? Файл dtc говорит, что он совместим с ibm-uic-440ep и ibm-uic, но я не могу найти один из этих драйверов, когда я ищу их с этими ключевыми словами. есть сопоставление между «именем драйвера» и совместимым параметром в файлах dts? –

+0

Драйверы почти всегда соответствуют их устройствам, используя «совместимое» свойство в дереве устройств. Если вы используете grep для 'ibm, uic' в дереве, вы найдете драйвер в' arch/powerpc/platform/4xx/uic.c'. Однако драйвер UIC немного отличается тем, что он не использует таблицу соответствия. Если вы хотите получить дополнительную информацию, отправьте вопрос, и я могу добавить более подробный ответ. –

Смежные вопросы