gpt4 book ai didi

linux - 恢复键盘 IRQ

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:21:33 24 4
gpt4 key购买 nike

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

我尝试了以下两种方法:

  1. 基于中断的方法

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

init() 中请求 IRQ 和然后在 exit()cleanup_module() 被触发后将一切恢复正常?

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

在这种方法中,我通过使用 while 循环不断轮询按下和释放的键,然后将输入复制回用户。

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

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

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

我感谢任何帮助/指点。

谢谢!

最佳答案

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

如果您注册了一个共享处理程序,这也可以解释当您卸载它时发生的崩溃:注销共享中断处理程序仅在第二个参数包含有效的 dev_id 时有效;所以当你像你一样用 NULL 调用时注销会失败,但是处理程序代码仍然会从内存中卸载。这会导致 future 中断时发生崩溃。

关于您的轮询方法,是的,因为普通驱动程序会收到中断通知,所以很可能会先于您读取键盘。

关于linux - 恢复键盘 IRQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42059024/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com