0

我正在尝试编写一个简单的模块,它应该替换 irq 1 处理程序。我一直收到以下错误:'-1 设备或资源忙'。有什么办法可以解决吗?这是我的代码:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/workqueue.h>
#include <linux/interrupt.h>
#include <asm/io.h>


irqreturn_t myhandler(int irq, void *dev_id, struct pt_regs *regs) 
{
  printk(KERN_ALERT"\n\nMy interrupt handler\n\n");
  return IRQ_HANDLED;
}

int init_module()
{
  int res;
  free_irq(1, NULL);                  
  res = request_irq(1, (void*)myhandler,0, "my_handler", (void*)(myhandler)); 
  return res;
}

void cleanup_module()
{
  free_irq(1, NULL);
}
MODULE_LICENSE("GPL");

也许任何人都可以说什么是错的。PS。我正在使用 2.6.39.3 内核。

4

1 回答 1

1

您使用的是哪种类型的系统(架构)?

在普通 PC 上,IRQ 1 是 8042(键盘控制器)并且已经有一个中断处理程序。您将 0 传递给request_irq()for flags,因此您要求为非共享中断注册一个处理程序。核心内核中断代码将查看并看到已经为该 IRQ 注册了另一个处理程序,并-EBUSYrequest_irq.

您不能通过为同一个 IRQ 注册另一个处理程序来覆盖现有处理程序。您需要先取消注册第一个,然后才能注册新的。

您可以查看 /proc/interrupts 以查看系统上已使用 IRQ 1 的内容。

于 2011-11-30T23:38:39.247 回答