Приветствую. Такое дело. Пишу модуль ядра Linux. Нужно определить собственный обработчик прерывания IRQ 8 (прерывание часов реального времени). Но дело в том, что request_irq возращает -16 (Resource busy) при попытке определить свой обработчик аппартного прерывания. Притом, ради интереса, попытался определить обработчик IRQ1 ( прерывание клавиатуры) - все работает -> код по идее правильный.
Кто подскажет, как можно определить свой обработчик для данного прерывания?
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/workqueue.h>
#include <linux/interrupt.h>
#define DRIVER_AUTHOR "Some author"
#define DRIVER_DESC "Some driver desription"
void irq8h(int irq, void *dev_id, struct pt_regs *regs);
void irq1h(int irq, void *dev_id, struct pt_regs *regs);
static unsigned long irq1;
static unsigned long irq8;
int init_module()
{
printk( KERN_INFO "some_module loaded\n");
int result;
result = request_irq(1, irq1h, IRQF_PROBE_SHARED | IRQF_SHARED, "keyb0", (void*) (&irq1) );
if( result < 0 )
{
printk( KERN_WARNING "some_module: warning %i\n", result);
return result;
}
result = request_irq(8, irq8h, IRQF_PROBE_SHARED , "alarm0", (void*) (&irq8) );
if( result < 0 )
{
printk( KERN_WARNING "some_module: warning %i\n", result);
return result;
}
return 0;
}
void beep()
{
}
void irq1h(int irq, void *dev_id, struct pt_regs *regs)
{
printk( KERN_WARNING "some_module: IRQ1 received\n");
printk( KERN_INFO "some_module: scan code: %x\n", inb( 0x60 ));
}
void irq8h(int irq, void *dev_id, struct pt_regs *regs)
{
printk(KERN_INFO "some_module: IRQ8 received\n");
}
void alarm_beep()
{
}
void cleanup_module()
{
//cleaning
free_irq( 8, &irq8 );
free_irq( 1, &irq1 );
printk( KERN_INFO "some_module: cleanup\n");
}
MODULE_LICENSE("GPL");