Linux kernel 编写基本键盘中断处理程序,抛出;“未知密钥已释放”;
我已经编写了一个基本的键盘中断处理程序。它使用共享中断,并用于将按下的键打印到/var/log/消息。但是,当我尝试使用箭头键时,会出现以下错误,其余的键都可以正常工作 8月19日18:59:06 vim内核:[112.485102]atkbd serio0:未知密钥已释放(已翻译的集合2,ISA00060/serio0上的代码0xe0)。 8月19日18:59:06 vim内核:[112.485108]atkbd系列0:使用“setkeycodes e060”来公开它。 粘贴代码Linux kernel 编写基本键盘中断处理程序,抛出;“未知密钥已释放”;,linux-kernel,Linux Kernel,我已经编写了一个基本的键盘中断处理程序。它使用共享中断,并用于将按下的键打印到/var/log/消息。但是,当我尝试使用箭头键时,会出现以下错误,其余的键都可以正常工作 8月19日18:59:06 vim内核:[112.485102]atkbd serio0:未知密钥已释放(已翻译的集合2,ISA00060/serio0上的代码0xe0)。 8月19日18:59:06 vim内核:[112.485108]atkbd系列0:使用“setkeycodes e060”来公开它。 粘贴代码 #inclu
#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);
#包括
#包括
#包括
#包括
/*此功能服务于键盘中断*/
irq_处理程序\u t irq_处理程序(int irq,void*dev_id,struct pt_regs*regs){
静态无符号字符扫描码;
/*
读取键盘状态
*/
扫描码=inb(0x60);
如果((扫描代码==0x01)| |(扫描代码==0x81))
{
printk(“您按下了Esc!\n”);
}
}
返回(irq_处理程序)已处理的irq_;
}
/*初始化模块并注册IRQ处理程序*/
静态整数初始化键BRD整数寄存器(无效)
{
int结果;
/*请求IRQ 1,键盘IRQ*/
结果=请求irq(1,(irq处理程序)irq处理程序,IRQF共享,“键盘统计数据irq”,(void*)(irq处理程序));
如果(结果)
printk(KERN_INFO“无法获取键盘的共享中断”\n);
返回结果;
}
/*删除中断处理程序*/
静态无效\uuu退出键brd\u int\u注销(无效){
free_irq(1,(void*)(irq_handler));/*我不能传递NULL,这是一个共享中断处理程序*/
}
模块许可证(“GPL”);
模块初始化(keybrd int寄存器);
模块退出(按键退出);
有人能告诉我为什么当我插入我的模块并开始工作时,当我移除这些箭头键时,这些箭头键停止工作吗
我正在虚拟机上运行代码。原因是虚拟机出了问题。它在基本linux主机上运行良好。您可以看到完整的代码实现(naive)@我正在考虑编写一些代码,以便临时重新映射键盘键,您认为我可以使用这些中断处理程序吗?我的问题是: