【发布时间】:2017-02-06 20:58:33
【问题描述】:
我是 Linux 内核模块开发的新手,我正在尝试编写一个简单的内核模块,以后可以将其扩展为键盘驱动程序。
我尝试了以下两种方法:
- 基于中断的方法
我按照here 给出的指南开始编写代码。但唯一的问题是当我运行rmmod 时机器会死机,因为它无法将 IRQ 恢复到原始键盘驱动程序。
在init() 请求IRQ 之前,有什么方法可以保存原始键盘驱动程序的device name 和device id,然后在exit() 即cleanup_module() 被触发后恢复一切正常?
void cleanup_module() {
/* Something to restore everything back to normal */
free_irq(1, NULL);
}
- 轮询方式
在这种方法中,我通过使用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