Прочла всё, что вы тут написали.
Решила проблему по-своему – просто изменила обработчик так, чтобы при вызове он напрямую обращался к функции вывода символа в системный журнал.
Вод код
#include <linux/kernel.h> /* We're doing kernel work */
#include <linux/module.h> /* Specifically, a module */
#include <linux/sched.h>
#include <linux/workqueue.h>
#include <linux/interrupt.h> /* We want an interrupt */
#include <asm/io.h>#define MY_WORK_QUEUE_NAME "WQsched.c"
#define SA_SHIRQ IRQF_SHARED
//static struct workqueue_struct *my_workqueue;
static void got_char(void *scancode)
{
printk(KERN_INFO "Scan Code %x %s.\n",
(int)*((char *)scancode) & 0x7F,
*((char *)scancode) & 0x80 ? "Released" : "Pressed");
}
irqreturn_t irq_handler(int irq, void *dev_id, struct pt_regs *regs)
{
//static int initialised = 0;
static unsigned char scancode;
//static struct work_struct task;
unsigned char status;
status = inb(0x64);
scancode = inb(0x60);
/*if (initialised == 0) {
INIT_WORK(&task, got_char, &scancode);
initialised = 1;
} else {
PREPARE_WORK(&task, got_char, &scancode);
}
queue_work(my_workqueue, &task);*/
got_char(&scancode);
return IRQ_HANDLED;
}
int init_module()
{
//my_workqueue = create_workqueue(MY_WORK_QUEUE_NAME);
free_irq(1, NULL);
return request_irq(1, /* The number of the keyboard IRQ on PCs */
irq_handler, /* our handler */
SA_SHIRQ, "test_keyboard_irq_handler",
(void *)(irq_handler));
}
void cleanup_module()
{
free_irq(1, NULL);
}
MODULE_LICENSE("GPL");
Он проверен и работает. Лабу я сдала)