11

割り込みを登録して処理できる単純なカーネルモジュールを書いています。ただし、request_irq関数を呼び出して割り込みを登録しようとすると、エラーコード-22が返されます。

エラー:IRQ 30を要求できません-コード-22、EIO 5、EINVAL 22

このエラーコードはEINVAL(無効な引数)と同じだと思います

私が間違っていることを教えてください。モジュールは次のとおりです。

#include <linux/init.h>
#include <linux/module.h>
#include <linux/irq.h>
#include <linux/io.h>
#include <linux/irqdomain.h>
#include <linux/interrupt.h>
#include <linux/of.h>
#include <linux/of_address.h>

#include <asm/exception.h>
#include <asm/mach/irq.h>

void int068_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
    printk("Interrupt should be handled there\n");
}

static int __init
clcdint_init(void)
{
    unsigned int irq;
    unsigned int irqflags;
    int ret;

    irq=68;
    irqflags=IRQF_SHARED | IRQF_NO_SUSPEND;

    ret = request_irq(irq, int068_interrupt,
            irqflags, "clcdint-int068", NULL);

    if (ret!=0) {
            printk("ERROR: Cannot request IRQ %d", irq);
            printk(" - code %d , EIO %d , EINVAL %d\n", ret, EIO, EINVAL);
    }

    printk("CLCDINT_INIT\n");
    return 0;
}

module_init(clcdint_init);

static void __exit
clcdint_exit(void)
{
    unsigned int irq;
    irq=68;
    free_irq(irq, NULL);
    printk("CLCDINT_EXIT\n");
}

module_exit(clcdint_exit);
4

2 に答える 2

15

共有割り込みライン(IRQF_SHAREDフラグがオン)を処理する場合、NULLコンテキスト(request_irq()呼び出しの最後のパラメーター)を渡すことはできません。

次のシナリオを検討する理由を理解するには、同じIRQを共有する2つの同一のネットワークカードがあります。同じドライバーは、同じ割り込みハンドラー関数、同じirq番号、同じ説明を渡します。コンテキストパラメータを使用する場合を除いて、登録の2つのインスタンスを区別する方法はありません。

したがって、予防措置として、IRQF_SHAREDフラグを渡す場合、NULLコンテキストパラメータを渡すことはできません。

于 2013-03-06T11:11:06.937 に答える