linux 中断学习记录
@jiffy:中断处理分成两个层次: 1、CPU层次的中断处理 2、各个IRQ层面的处理 由于中文习惯通常中断,因此工程师很容易混淆这两个概念。 T64时刻 3个clock之后,由于CPU已经ack了中断,因此GIC中CPU interface模块 deassert nFIQCPU信号线 @tuya:dts中的中断号当然是硬件中断号了,对于一个使用中断的外设的dts中,一定要描述下面的内容: 1、使用哪一个interrupt controller 2、使用该interrupt controller的哪一个中断号。这个中断号是和interrupt controller和外设interrupt request signal的物理连接有关系,当然是该interrupt controller这个domain中的硬件interrupt ID 你说的软件中断号应该是指IRQ number,这个IRQ number是系统分配的,和硬件无关 这时候,对于这个版本的GIC driver而言,初始化之后,HW interrupt ID和IRQ number的映射关系已经建立,保存在线性lookup table中,size等于GIC支持的中断数目,具体如下: index 0~15对应的IRQ无效 16号IRQ <------------------>16号HW interrupt ID 17号IRQ <------------------>17号HW interrupt ID 是不是说在gic driver中HW interrupt ID和IRQ number是相等的? 但是你文中又说到 if (domain->ops->xlate(domain, irq_data->np, irq_data->args,----C irq_data->args_count, &hwirq, &type)) return 0; } /* Create mapping */ virq = irq_create_mapping(domain, hwirq);--------D if (!virq) return virq; 解析完了,最终还是要调用irq_create_mapping函数来创建HW interrupt ID和IRQ number的映射关系。 我的理解是在gic_irq_domain_xlate中会将dts中的中断号+32获得真正的HW interrupt ID,然后在用virq = irq_create_mapping(domain, hwirq)获得HW interrupt ID和IRQ number的映射。不知到这样理解对吗? 如果是简单的情况下,这个request_irq传入的irq num本质的数值大小就等于物理中断号吧? 本质上virtual interrupt ID(irq number)和HW interrupt ID之间可以建立任何的映射关系。不过对于本文中的GIC驱动代码,它采用了偷懒的做法,初始化的时候就创建了映射,这个映射关系就是virtual interrupt ID等于HW interrupt ID。 @gzz:对于gic而言,HW interrupt ID是[0-1019],其中: 1、SPI interrupts 范围是 [32-1019] 2、SGI interrupts 范围是 [0-15] 3、PPI interrupts 范围是 [16-31] 在dts文件中的HW interrupt ID定义如下: 1、SPI interrupts 范围是 [0-987] 2、PPI interrupts 范围是 [0-15] 只要掌握这两个编码规则,一切都很简单了 @tuya:dts中的中断号当然是硬件中断号了,对于一个使用中断的外设的dts中,一定要描述下面的内容: 1、使用哪一个interrupt controller 2、使用该interrupt controller的哪一个中断号。这个中断号是和interrupt controller和外设interrupt request signal的物理连接有关系,当然是该interrupt controller这个domain中的硬件interrupt ID gic: interrupt-controller@ffc01000 { compatible = "arm,gic-400"; interrupt-controller; #interrupt-cells = <3>; #address-cells = <0>; reg = <0xffc01000 0x1000="">,----Distributor address range <0xffc02000 0x1000="">,-----CPU interface address range <0xffc04000 0x2000="">,-----Virtual interface control block <0xffc06000 0x2000="">;-----Virtual CPU interfaces interrupts = ; };
一勤天下无难事。