Не работает модуль ядра для обработки прерывания
Ниже привожу код. Пытался сделать обработчик нажатия клавиатуры. На деле после установки командой sudo insmod int.ko ничего не происходит. Лишь появился warnings: http://img.flashtux.org/upload/img132df7a5abx605cd48f.png
Что я делаю не так?
//int.c
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/workqueue.h>
#include <linux/sched.h>
#include <linux/interrupt.h>
#include <asm/io.h>
#define MY_WORK_QUEUE_NAME "WQsched.c"
static struct workqueue_struct *my_workqueue;
static void
got_char (struct work_struct *work)
{
//unsigned char status = inb (0x64);
unsigned char scancode = inb (0x60);
printk ("Scan Code %x %s.\n",
(int)*((char *)scancode) & 0x7F,
*((char *)scancode) & 0x80 ? "Released" : "Pressed");
}
irqreturn_t
irq_handler (void)
{
static int initialised = 0;
static struct work_struct task;
if (initialised == 0) {
INIT_WORK (&task, got_char);
initialised = 1;
} else {
PREPARE_WORK (&task, got_char);
}
queue_work (my_workqueue, &task);
return IRQ_HANDLED;
}
static int
init_interrupt (void)
{
my_workqueue = create_workqueue (MY_WORK_QUEUE_NAME);
free_irq(1, NULL);
return request_irq (1,
(irq_handler_t)irq_handler,
IRQF_SHARED,
"test_keyboard_irq_handler",
(void *)(irq_handler));
}
static void
cleanup_interrupt (void)
{
free_irq (1, NULL);
}
module_init (init_interrupt);
module_exit (cleanup_interrupt);
MODULE_LICENSE ("GPL");
#Makefile
obj-m += int.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean