Я написал элементарный обработчик прерываний клавиатуры. Он использует общие прерывания и используется для печати в / var / log / messages, какая клавиша была нажата. Но я получаю следующую ошибку, когда пытаюсь использовать клавиши со стрелками, а остальные клавиши работают нормально.
19 августа 18:59:06 vim kernel: [112.485102] atkbd serio0: Неизвестный ключ освобожден (переведенный набор 2, код 0xe0 для isa0060 / serio0).
19 августа 18:59:06 vim kernel: [112.485108] atkbd serio0: используйте 'setkeycodes e060', чтобы сделать его известным.
Вставка кода.
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/interrupt.h>
#include <asm/io.h>
/* This function services keyboard interrupts */
irq_handler_t irq_handler (int irq, void *dev_id, struct pt_regs *regs) {
static unsigned char scancode;
/*
Read keyboard status
*/
scancode = inb (0x60);
if ((scancode == 0x01) || (scancode == 0x81))
{
printk ("You pressed Esc !\n");
}
}
return (irq_handler_t) IRQ_HANDLED;
}
/* Initialize the module and Register the IRQ handler */
static int __init keybrd_int_register(void)
{
int result;
/* Request IRQ 1, the keyboard IRQ */
result = request_irq (1, (irq_handler_t) irq_handler, IRQF_SHARED, "keyboard_stats_irq", (void *)(irq_handler));
if (result)
printk(KERN_INFO "can't get shared interrupt for keyboard\n");
return result;
}
/* Remove the interrupt handler */
static void __exit keybrd_int_unregister(void) {
free_irq(1, (void *)(irq_handler)); /* i can't pass NULL, this is a shared interrupt handler! */
}
MODULE_LICENSE ("GPL");
module_init(keybrd_int_register);
module_exit(keybrd_int_unregister);
Может кто-нибудь подсказать, почему эти клавиши со стрелками перестают работать, когда я вставляю свой модуль и начинаю работать, когда я их удаляю?
Я выполняю свой код на виртуальной машине.