恢复键盘IRQ

时间:2017-02-06 00:48:18

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

我对Linux内核模块开发非常陌生,并试图编写一个简单的内核模块,以后可以作为键盘驱动程序进行扩展。

我尝试了两种方法:

  1. 基于中断的方法
  2. 我按照here指南开始编写代码。但唯一的问题是当我运行rmmod时机器冻结,因为它无法将IRQ恢复到原始键盘驱动程序。

    有没有办法保存device name&在device id中请求IRQ之前原始键盘驱动程序的init(),然后在exit()cleanup_module()被解雇后将所有内容恢复正常?

    void cleanup_module() {
        /* Something to restore everything back to normal */
        free_irq(1, NULL);
    }
    
    1. 投票方法
    2. 在这种方法中,我不断轮询Key Pressed&通过使用while循环释放,然后将输入复制回用户。

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

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

      有没有办法从原始键盘驱动程序转发请求?

      我感谢任何关于此的帮助/指示。

      谢谢!

1 个答案:

答案 0 :(得分:0)

我担心只要正常的内核键盘驱动程序也在控制键盘,我就不会看到它是如何工作的,因为两个驱动程序都会试图控制设备。内核i8042驱动程序(我假设它是相关的)将其中断注册为共享,如果您的驱动程序设法注册相同的中断,那么它也将其处理程序注册为共享,以便在中断时通知并将竞争访问该设备。

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

关于你的轮询方法,是的,因为正常的驱动程序会在中断时收到通知,所以很可能会让你不得不读到键盘。