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 = ; 
};

  

posted @ 2020-11-28 22:27  卷哭你  阅读(180)  评论(0编辑  收藏  举报