我正在尝试编写一个简单的模块,该模块应该替换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内核。

有帮助吗?

解决方案

您正在使用哪种类型的系统(体系结构)?

在普通PC上,IRQ 1是8042(键盘控制器),并且已经有一个中断处理程序。你将0传递到 request_irq() 为了 flags, ,因此您要求注册一个处理程序以进行非共享中断。核心内核中断代码将外观并发现已经为该IRQ注册了另一个处理程序,然后返回 -EBUSYrequest_irq.

您不能通过为同一IRQ注册另一个处理程序来覆盖现有处理程序。您需要在注册一个新的之前撤销第一个。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top