这种观察可能是由于物理和虚拟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中断的基本控制流程:
- GPIO组中的中断发生更改。IRQ 62升高。
asm_do_IRQ
在IRQ 62上运行。GPIO子系统已通过平台初始化代码注册为处理IRQ 62。- GPIO子系统读取GPIO寄存器,并确定GPIO位X引起了中断。它计算从位X到linux虚拟IRQ编号的映射,在这种情况下为196。
- GPIO中断处理程序然后
generic_handle_irq
使用196 调用该函数,该函数调用您的中断处理程序。
平台通常在虚拟IRQ编号和物理IRQ编号之间定义 静态映射 。要查看此映射,
CONFIG_VIRQ_DEBUG
在早于linux-3.4的内核上启用,或CONFIG_IRQ_DOMAIN_DEBUG
在较新的内核上启用。
然后看一下
irq_domain_mappingdebugfs文件。例如在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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)