我们以4.9.44版本内核的IR遥控器为例。
1. 查看平台中断表
使用cat /proc/interrupts命令
其中横向,第一列是中断号,第二列是各中断在CPU中发生的次数,GICv2 是中断控制器的名称,第三列也是中断逻辑号,第四列是驱动注册的中断名称。例如:中断号 130 对应的就是遥控器的中断。
2. 中断注册
vendor\mstar\kernel\linaro\mstar2\drv\ir_mirc\mstar_ir.c中,会注册
注册中断函数。
其中参数,如下:
INT_NUM_IR_ALL 就是中断号
文件mstar2\hal\m7221\ir\mhal_ir_reg.h
#define INT_NUM_IR_ALL (E_FIQEXPL_IR_IN)
文件star2\hal\m7221\cpu\arm64\chip_int.h
E_FIQEXPL_IR_IN = E_FIQEXPL_START + 2, //FIQ34
为平台的第34个中断,而对应的值是130。
中断flag的含义:
_MDrv_IR_ISR 就是中断函数,“IR” 就是中断名称。
3. 中断属性
系统还会为每个中断创建以编号命名的子目录。在/proc/irq/目录下,
# pwd
/proc/irq/130
# ls
IR affinity_hint irq node smp_affinity smp_affinity_list spurious
smp_affinity irq和cpu之间的亲缘绑定关系;
smp_affinity_hint 只读条目,用于用户空间做irq平衡只用;
spurious 可以获得该irq被处理和未被处理的次数的统计信息;
handler_name 驱动程序注册该irq时传入的处理程序的名字;
5. 测试
按下遥控器,前后分别查看对应中断信息
# cat /proc/interrupts |grep 130
130: 24 0 0 0 GICv2 130 Level IR
# cat /proc/interrupts |grep 130
130: 26 0 0 0 GICv2 130 Level IR
发现在cpu0 响应了两次,分别是遥控器的down,up事件。
更多中断深度解析可以看博友文章
https://blog.csdn.net/zhoutaopower/article/details/86506725