Linux kernel 无法为内核模块请求\u irq

Linux kernel 无法为内核模块请求\u irq,linux-kernel,arm,embedded,linux-device-driver,irq,Linux Kernel,Arm,Embedded,Linux Device Driver,Irq,我正在尝试在基于ARM的平台上将驱动程序从旧内核移植到新内核。在移植其中一个驱动程序时,我注意到请求\u irq在新内核上失败。实际上,这个驱动程序有很多硬编码的irq号,它试图为这个硬件线路请求\u irq。我开始搜索请求irq失败的原因是什么,-原因是适当的irq描述符(irq\u desc)设置了irq\u NOREQUEST标志 我开始搜索清除此标志的位置,发现它发生在以下位置: of_platform_populate | ...

我正在尝试在基于ARM的平台上将驱动程序从旧内核移植到新内核。在移植其中一个驱动程序时,我注意到请求\u irq在新内核上失败。实际上,这个驱动程序有很多硬编码的irq号,它试图为这个硬件线路请求\u irq。我开始搜索请求irq失败的原因是什么,-原因是适当的irq描述符(irq\u desc)设置了irq\u NOREQUEST标志

我开始搜索清除此标志的位置,发现它发生在以下位置:

of_platform_populate
          |
         ...
          |
   of_device_alloc
          |
         ...
          |
 irq_of_parse_and_map
(some levels below this flag is dropped)
因此,从mach init代码调用代码并解析DTB,DTB中提到的所有中断号都将映射到irq虚拟空间,并可通过适当的设备结构访问,例如:

irq = platform_get_irq(pdev, 0);
正如我已经说过的,这种老式的驱动程序只是在include文件中硬编码了irq号码,并且没有合适的dtb条目


问题是,从内核的角度来看,什么是正确的方法来移植它?我是否需要将这个旧驱动程序作为平台设备(现在它只是一个char设备)并为其创建适当的dtb描述?或者我可以使用一些内核API来标记这些中断是否可用?这是普通/普通款式吗?

可能会有帮助。您不能只使用一个数字,因为linux在较新的内核(支持稀疏中断映射)中有一个分配的结构。较新的内核还管理资源,这样驱动程序初始化异常和注销就不那么复杂了?你可以做任何一件事,但更明智的是把它变成一个平台设备;尤其是在特定于ARM/SOC的情况下。也就是说,它是一个平台设备。如果没有关于硬件和驱动程序可能做什么的更多细节,很难给出正确的答案。@artlessnoise您能提供关于“非正常”方式的更多细节吗?如果可能的话,我很乐意看到任何代码示例。看来如果我把这面最不需要的旗子掉了就不行了。请将其作为答案。请尝试
irq\u find\u映射(NULL,my\u irq\u num)
。另外,启用和调试FS(我认为是内核黑客),您就可以获得IRQ域信息。@AlexHoppus正确的方法是在设备树中定义IRQ。当然,这需要将驱动程序转换为使用设备树。您的驱动程序所代表的硬件是什么?