Ошибка: устройство или ресурс занят - PullRequest
0 голосов
/ 01 декабря 2011

Я пытаюсь написать простой модуль, который должен заменить обработчик 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.

1 Ответ

1 голос
/ 01 декабря 2011

Какой тип системы (архитектуры) вы используете?

На обычном ПК IRQ 1 - это 8042 (контроллер клавиатуры) и уже имеет обработчик прерываний. Вы передаете 0 в request_irq() для flags, поэтому вы просите зарегистрировать обработчик для необщего прерывания. Код прерывания ядра ядра посмотрит и увидит, что для этого IRQ уже зарегистрирован другой обработчик, и вернет -EBUSY из request_irq.

Вы не можете переопределить существующий обработчик, зарегистрировав другой обработчик для того же IRQ. Вам необходимо отменить регистрацию первого, прежде чем вы сможете зарегистрировать новый.

Вы можете посмотреть / proc / interrupts, чтобы увидеть, что уже использует IRQ 1 в вашей системе.

...