内核函数asm_do_IRQ()中的irq与我在模块中请求的irq不同

内核函数asm_do_IRQ()中的irq与我在模块中请求的irq不同,第1张

内核函数asm_do_IRQ()中的irq与我在模块中请求的irq不同

这种观察可能是由于物理和虚拟IRQ编号之间的映射。驱动程序中显示的数字是虚拟IRQ数字,仅在使用通用Linux中断处理子系统时有效。中的中断号

asm_do_IRQ
将是内核中断结构提供的物理中断号。

我相信OMAP处理器支持GPIO引脚上的中断。通常的实现方式是为一组GPIO输入(例如32位)分配一条IRQ线。当任何GPIO发生中断时,该IRQ线将被激活。这可能是处理器上的数字62。如果查看处理器手册,则应该看到IRQ
62对应于GPIO组中的中断。

现在,Linux GPIO子系统将允许您将中断处理程序分配给任何GPIO,从而为您提供从linux irq号到物理irq号的映射。您的linux
irq数为196。GPIO子系统配置为处理所有GPIO中断(例如中断62),读取GPIO寄存器以确定存储库中的哪些GPIO位可能已产生中断,然后调出您分配给的中断处理程序

request_irq

这是GPIO中断的基本控制流程:

  1. GPIO组中的中断发生更改。IRQ 62升高。
  2. asm_do_IRQ
    在IRQ 62上运行。GPIO子系统已通过平台初始化代码注册为处理IRQ 62。
  3. GPIO子系统读取GPIO寄存器,并确定GPIO位X引起了中断。它计算从位X到linux虚拟IRQ编号的映射,在这种情况下为196。
  4. GPIO中断处理程序然后
    generic_handle_irq
    使用196 调用该函数,该函数调用您的中断处理程序。

平台通常在虚拟IRQ编号和物理IRQ编号之间定义 静态映射 。要查看此映射,

  • CONFIG_VIRQ_DEBUG
    在早于linux-3.4的内核上启用,或
  • CONFIG_IRQ_DOMAIN_DEBUG
    在较新的内核上启用。

然后看一下

irq_domain_mapping
debugfs文件。例如在PowerPC上:

# mount -t debugfs none /sys/kernel/debug# cat /sys/kernel/debug/irq_domain_mapping irq    hwirq    chip name        chip data   domain name   16  0x00009  IPIC  0xcf801c80  /soc8347@e0000000/pic@700   18  0x00012  IPIC  0xcf801c80  /soc8347@e0000000/pic@700   19  0x0000e  IPIC  0xcf801c80  /soc8347@e0000000/pic@700   20  0x0000f  IPIC  0xcf801c80  /soc8347@e0000000/pic@700   21  0x00010  IPIC  0xcf801c80  /soc8347@e0000000/pic@700   77  0x0004d  IPIC  0xcf801c80  /soc8347@e0000000/pic@700


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5015206.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-15

发表评论

登录后才能评论

评论列表(0条)

保存