Linux通用IRQ处理

时间:2017-11-06 05:34:54

标签: linux-device-driver interrupt interrupt-handling

使用虚拟irq注册 linux通用中断处理程序,该irq映射到域的实际hwirq以处理中断。

我在处理中断方面遇到了问题。到目前为止,我已经通过设置ops并在域和hwirq之间创建映射,基于以下内核docuentation IRQ-domain.txt注册了一个中断处理程序。但无法在新注册的虚拟中断线上接收中断。

所以我的问题是:

  1. 我在映射中做错了什么,因为我没有看到在cat / proc / interrupts中处理任何中断。

  2. request_thereaded_irq()是否应该由实际的hwirq组成,后来在virq的线程处理程序中处理,就像在亚利桑那州一样。

  3. 代码参考: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;
    }
    

0 个答案:

没有答案