使用虚拟irq注册 linux通用中断处理程序,该irq映射到域的实际hwirq以处理中断。
我在处理中断方面遇到了问题。到目前为止,我已经通过设置ops并在域和hwirq之间创建映射,基于以下内核docuentation IRQ-domain.txt注册了一个中断处理程序。但无法在新注册的虚拟中断线上接收中断。
所以我的问题是:
我在映射中做错了什么,因为我没有看到在cat / proc / interrupts中处理任何中断。
request_thereaded_irq()是否应该由实际的hwirq组成,后来在virq的线程处理程序中处理,就像在亚利桑那州一样。
代码参考:arizona-irq.c
static struct irq_chip irq_chip = {
.name = "CHIP-IRQ",
.irq_disable = noop,
.irq_enable = noop,
};
static int irq_map(struct irq_domain *h, unsigned int virq,
irq_hw_number_t hw)
{
struct chipdata *data = h->host_data;
irq_set_chip_and_handler(virq, &irq_chip, handle_simple_irq);
irq_set_chip_data(virq, data);
irq_set_noprobe(virq);
return 0;
}
static const struct irq_domain_ops irq_domain_ops = {
.map = irq_map,
.xlate = irq_domain_xlate_twocell,
};
/* Register an interrupt domain */ `
chipdata.irq_domain = irq_domain_create_linear( fwn, 20, &irq_domain_ops, ebus);
if (!chipdata.irq_domain) {
dev_err(ebus->bus.dev, "Failed to add core IRQ domain\n");
}
/* Create mapping between domain and hwirq*/
virq = irq_create_mapping( chipdata.irq_domain, hwirq);
ret = request_threaded_irq( virq, interrupt, threaded_interrupt, IRQF_SHARED, KBUILD_MODNAME, ebus);
if (ret) {
dev_err(bus->dev, "unable to grab IRQ %d, disabling device\n", virq);
return ret;
}