пишет базовый обработчик прерываний клавиатуры, выдает «Неизвестный ключ отпущен» - PullRequest
5 голосов
/ 19 августа 2011

Я написал элементарный обработчик прерываний клавиатуры. Он использует общие прерывания и используется для печати в / 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);

Может кто-нибудь подсказать, почему эти клавиши со стрелками перестают работать, когда я вставляю свой модуль и начинаю работать, когда я их удаляю?

Я выполняю свой код на виртуальной машине.

1 Ответ

3 голосов
/ 29 февраля 2012

Причина была в том, что какая-то VM испортила.Он отлично работает на базовых хостах Linux.Вы можете увидеть полную реализацию кода (наивный) @ https://github.com/vigith/Linux-Device-Drivers/tree/master/keyboard

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...