linux - IRQ 处理程序的问题:标志不匹配 irq
问题描述
我正在使用线程 irq 实现一个中断处理模块。我正面临这个错误:
1983.150961] Shut down eMMC app module init.
[ 1983.151115] genirq: Flags mismatch irq 49. 00000004 (eMMC_power_shutdown_irq_
handler) vs. 00000004 (xuartps)
fio@uz3cg-dgw:~$ (edited)
我选择的标志是 #define IRQF_TRIGGER_HIGH 0x00000004 并在这种情况下分配给 IRQ 号 49。
这是我的代码:
static int __init shutdownemmc_module_init(void)
{
printk("Shut down eMMC app module init. ");
if (request_threaded_irq( IRQ_NO, //IRQ number
(void *) emmc_irq_handler, //IRQ handler (Top half)
emmc_interrupt_thread_fn, //IRQ Thread handler (Bottom half).When the handler function returns IRQ_WAKE_THREAD
IRQF_TRIGGER_HIGH, //Handler will be called in raising edge
"eMMC_power_shutdown_irq_handler", //used to identify the device name using this IRQ
(void *)(emmc_irq_handler))) //device id for shared IRQ
{
pr_err("Cannot register IRQ ");
pr_err(" EIO %d , EINVAL %d\n", EIO, EINVAL);
return 0;
}
pr_info("Interrupt handler...Done!!!\n");
return 0;
}
有人可以解释什么是 Flags mismatch irq 问题以及我该如何解决这个问题?谢谢你,安
解决方案
这是因为“xuartps”已经请求了 IRQ 号并且没有请求共享它。
摘自__setup_irq()
“kernel/irq/manage.c”:
/*
* If nobody did set the configuration before, inherit
* the one provided by the requester.
*/
if (irqd_trigger_type_was_set(&desc->irq_data)) {
oldtype = irqd_get_trigger_type(&desc->irq_data);
} else {
oldtype = new->flags & IRQF_TRIGGER_MASK;
irqd_set_trigger_type(&desc->irq_data, oldtype);
}
if (!((old->flags & new->flags) & IRQF_SHARED) ||
(oldtype != (new->flags & IRQF_TRIGGER_MASK)) ||
((old->flags ^ new->flags) & IRQF_ONESHOT))
goto mismatch;
在上面,old
是“xuartps”设置的现有处理程序。new
是您的代码设置的新处理程序。为了共享 IRQ,上述条件之一是新旧处理程序都需要请求带有IRQF_SHARED
标志的 IRQ。但是,驱动程序应该只IRQF_SHARED
在底层中断应该是可共享的情况下进行设置;例如:所有 PCI 中断都是可共享的,并且 PCI 设备的驱动程序应该使用IRQF_SHARED
set 请求中断。
mismatch:
if (!(new->flags & IRQF_PROBE_SHARED)) {
pr_err("Flags mismatch irq %d. %08x (%s) vs. %08x (%s)\n",
irq, new->flags, new->name, old->flags, old->name);
#ifdef CONFIG_DEBUG_SHIRQ
dump_stack();
#endif
}
ret = -EBUSY;
以上是将“标志不匹配”消息打印到内核日志的位置。
如果您不希望已经请求了 IRQ,请检查您是否请求了正确的 IRQ。
推荐阅读
- pandas - 在 Pandas 中生成二项式排列
- cpython - 为什么 PySequence_GetItem 返回一个新的引用?
- testing - 选项不适用于跑步者
- mongodb - 通过 docker-composer 将 --wiredTigerCacheSizeGB 存储到 mongod.conf
- typo3 - 在 Extbase/Fluid 中访问 TYPO3 插件版本号
- file - 更改文件名 [Ionic 4]
- docker - 在 docker-compose 中设置 CPU 使用率
- laravel - 他们是否删除了 Laravel 6.0 中的 make:auth 命令?
- java - 错误:DexGuard Gradle 插件:不支持 Android Gradle 插件版本。(3.5.0),支持的版本包括 [2.3.0:3.4.*]
- php - 如何将 facebook-php-sdk 正确安装到 joomla 项目中?