Вам нужно немного больше контекста, чтобы определить, что представляют собой объекты 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
для внутренних деталей.
Здесь есть некоторая информация, но похоже, что значения будут специфическими для оборудования: http://www.devicetree.org/Device_Tree_Usage –
@AmitSinghTomar Вам нужно будет посмотреть привязки дерева устройств для этого устройства, но первое номер обычно указывает линию прерывания, а второй обычно указывает, срабатывает ли фронт, задний фронт, уровень срабатывания и т. д. –