Linux 恢复键盘IRQ
我对Linux内核模块的开发非常陌生,并尝试编写一个简单的内核模块,稍后可以扩展为键盘驱动程序 我尝试了以下两种方法:Linux 恢复键盘IRQ,linux,linux-kernel,linux-device-driver,Linux,Linux Kernel,Linux Device Driver,我对Linux内核模块的开发非常陌生,并尝试编写一个简单的内核模块,稍后可以扩展为键盘驱动程序 我尝试了以下两种方法: 基于中断的方法 在遵循给出的指南之后,我开始编写代码。但唯一的问题是,当我运行rmmod时,机器会冻结,因为它无法将IRQ恢复到原始键盘驱动程序 在init()中请求IRQ之前,是否有办法保存原始键盘驱动程序的设备名称和设备id,然后在触发退出()即清除模块()后将一切恢复正常 void cleanup_module() { /* Something to restor
rmmod
时,机器会冻结,因为它无法将IRQ恢复到原始键盘驱动程序
在init()
中请求IRQ之前,是否有办法保存原始键盘驱动程序的设备名称
和设备id
,然后在触发退出()
即清除模块()
后将一切恢复正常
void cleanup_module() {
/* Something to restore everything back to normal */
free_irq(1, NULL);
}
不断轮询按下和释放的键,然后将输入复制回用户
while(!(inb(0x64) & 0x1) || (input = inb(0x60)) & 0x80);
我在这里面临的问题是,它永远不会退出while
循环。我假设这是因为原始键盘驱动程序提供了请求
有没有办法让原始键盘驱动程序转发请求
我非常感谢在这方面的任何帮助/指点
谢谢 我担心,只要普通的内核键盘驱动程序也在控制键盘,我看不出这是如何工作的,因为两个驱动程序都将试图控制设备。内核i8042驱动程序(我假设它与您相关)将其中断注册为共享,如果您的驱动程序成功注册为相同的中断,那么它也将其处理程序注册为共享,这样两个驱动程序都会在中断时收到通知并竞相访问设备
如果您注册了一个共享处理程序,这也可以解释卸载时的崩溃:只有在第二个参数包含有效的dev_id时,取消注册共享中断处理程序才有效;因此,当像您那样使用NULL调用时,注销将失败,但处理程序代码仍将从内存中卸载。这将导致将来中断时崩溃
关于您的轮询方法,是的,因为正常的驱动程序会在中断时收到通知,所以很可能会在读取键盘时击败您。我恐怕不知道,只要正常的内核键盘驱动程序也在控制键盘,这是如何工作的,因为两个驱动程序都将尝试控制设备。内核i8042驱动程序(我假设它与您相关)将其中断注册为共享,如果您的驱动程序成功注册为相同的中断,那么它也将其处理程序注册为共享,这样两个驱动程序都会在中断时收到通知并竞相访问设备
如果您注册了一个共享处理程序,这也可以解释卸载时的崩溃:只有在第二个参数包含有效的dev_id时,取消注册共享中断处理程序才有效;因此,当像您那样使用NULL调用时,注销将失败,但处理程序代码仍将从内存中卸载。这将导致将来中断时崩溃
关于您的轮询方法,是的,因为正常的驱动程序会在中断时收到通知,因此很可能会让您无法读取键盘。免费irq
的最终参数不应为NULL
,必须与请求irq
的最终参数匹配,并且对于此irq号必须是唯一的。IRQ编号和此最终参数值的组合用于标识您正在释放的IRQ处理程序。free\u IRQ
的最终参数不应为NULL
,必须与request\u IRQ
的最终参数匹配,并且对于此IRQ编号必须是唯一的。IRQ编号和此最终参数值的组合是标识要释放的IRQ处理程序的内容。