【问题标题】:Restoring Keyboard IRQ恢复键盘 IRQ
【发布时间】:2017-02-06 20:58:33
【问题描述】:

我是 Linux 内核模块开发的新手,我正在尝试编写一个简单的内核模块,以后可以将其扩展为键盘驱动程序。

我尝试了以下两种方法:

  1. 基于中断的方法

我按照here 给出的指南开始编写代码。但唯一的问题是当我运行rmmod 时机器会死机,因为它无法将 IRQ 恢复到原始键盘驱动程序。

init() 请求IRQ 之前,有什么方法可以保存原始键盘驱动程序的device namedevice id,然后在exit()cleanup_module() 被触发后恢复一切正常?

void cleanup_module() {
    /* Something to restore everything back to normal */
    free_irq(1, NULL);
}
  1. 轮询方式

在这种方法中,我通过使用while 循环不断地轮询 Key Pressed & Released,然后将输入复制回用户。

while(!(inb(0x64) & 0x1) || (input = inb(0x60)) & 0x80);

我在这里面临的问题是它永远不会出现在while 循环中。我假设这是因为原始键盘驱动程序满足该请求。

有没有办法让原来的键盘驱动转发请求?

感谢您对此的任何帮助/指点。

谢谢!

【问题讨论】:

  • free_irq的最后一个参数不应该是NULL,必须与request_irq的最后一个参数匹配,并且对于这个IRQ号必须是唯一的。 IRQ 编号和这个最终参数值的组合就是您要释放的 IRQ 处理程序的标识。

标签: linux linux-kernel linux-device-driver


【解决方案1】:

恐怕我看不出只要正常的内核键盘驱动程序也在控制键盘,它是如何工作的,因为两个驱动程序都将尝试控制设备。内核 i8042 驱动程序(我认为这与您相关)将其中断注册为共享,如果您的驱动程序设法注册相同的中断,那么它也将其处理程序注册为共享,以便两者都收到有关中断的通知并且会竞相访问设备。

如果您注册了共享处理程序,这也可以解释卸载它时的崩溃:取消注册共享中断处理程序仅在第二个参数包含有效的 dev_id 时有效;因此,当您像您一样使用 NULL 调用时,取消注册会失败,但处理程序代码仍会从内存中卸载。这将导致未来中断时崩溃。

关于您的轮询方法,是的,因为普通驱动程序会在中断时收到通知,因此很可能会击败您阅读键盘。

【讨论】:

    猜你喜欢
    • 2016-04-25
    • 2016-10-03
    • 2018-12-24
    • 2015-06-28
    • 2013-11-26
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多