You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

注册threaded irq时出现Flags mismatch irq错误的原因及解决方法咨询

问题根因分析

这个报错是Linux内核中断子系统的标准校验逻辑触发的,具体原因如下:

  • 你要注册的IRQ 49已经被xuartps(Xilinx UART控制器驱动)预先注册占用
  • 你当前注册时的flags没有携带IRQF_SHARED共享中断标志,内核认为你要独占该IRQ,因此只要IRQ已经被注册,就会直接报标志不匹配错误,哪怕你和现有使用者的触发类型标志(这里都是IRQF_TRIGGER_HIGH 0x00000004)完全一致也会拦截
  • 额外的代码问题:你当前传入的dev_id参数不符合共享中断的要求,共享中断要求每个注册者必须传入唯一、非空的dev_id,用于中断触发时区分设备、以及注销中断时定位对应注册项,你现在传入的是中断处理函数的指针,既不规范也无法保证唯一性。
修复方案

场景1:本不该共享IRQ 49,是引脚复用配置错误

如果你设计上本就打算将对应引脚作为eMMC电源中断的专用引脚,出现该报错是硬件配置错误:

  • 检查设备树中对应引脚的复用配置,确认该引脚是否被错误配置为了xuartps的功能引脚
  • 修改设备树,关闭对应引脚的xuartps复用,切换为你需要的中断功能,确保xuartps不会再占用IRQ 49,重新编译设备树更新后即可正常注册独占IRQ。

场景2:硬件设计上确实要共享IRQ 49

如果确认该中断线就是要和xuartps共享,按以下步骤修改代码:

  1. 修改注册时的flags参数,增加IRQF_SHARED标志:
// 原flags参数
IRQF_TRIGGER_HIGH
// 修改后
IRQF_TRIGGER_HIGH | IRQF_SHARED
  1. 修正dev_id参数:将原来的(void *)(emmc_irq_handler)替换为你的eMMC设备对应的唯一结构体实例地址,或者定义一个全局唯一的变量传地址,保证和同IRQ上其他设备的dev_id不重复。
  2. 完善顶半中断处理函数emmc_irq_handler的逻辑:
    • 进入处理函数后首先读取你自己设备的中断状态寄存器,判断是否是你的设备触发的中断
    • 如果是自身设备触发,处理后返回IRQ_WAKE_THREAD唤醒底半线程
    • 如果不是自身设备触发,直接返回IRQ_NONE,交给同IRQ的其他设备处理函数处理
  3. 修正注册失败的返回值:你当前注册失败直接返回0会导致内核认为模块加载成功,实际功能未正常加载,应该返回负错误码,例如return -EBUSY;

内容的提问来源于stack exchange,提问作者Anh Hoang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 21:57:01