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

      

    一勤天下无难事。
  • 相关阅读:
    最近公共祖先LCA Tarjan 离线算法
    HDU 2586 How far away? LCA 转化成RMQ
    最近公共祖先 Least Common Ancestors(LCA)算法 --- 与RMQ问题的转换
    RMQ ---- ST(Sparse Table)算法
    二维计算几何系列(一) -------- 数据结构
    Goalng基础语法-输入和输出
    Golang基础语法-运算符
    Golang基础语法-数据类型
    Golang基础语法-常量
    Golang基本语法-变量
  • 原文地址:https://www.cnblogs.com/nowroot/p/14054586.html
Copyright © 2020-2023  润新知