Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 恢复键盘IRQ_Linux_Linux Kernel_Linux Device Driver - Fatal编程技术网

Linux 恢复键盘IRQ

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

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

我尝试了以下两种方法:

  • 基于中断的方法
  • 在遵循给出的指南之后,我开始编写代码。但唯一的问题是,当我运行
    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处理程序的内容。