ARM处理器 -- 处理器中的级联中断控制器

目录

1.级联结构中断控制器

2.级联结构猜想及级联结构中断控制器的能力

3.级联结构中断控制器在软件中的体现

        中断控制器dts特性:


      

        本文在以移动产品Arm处理器为例,介绍级联中断控制器。

        随着手机功能的增加,手机系统的复杂度也在不断的提升,处理器由之前的单核、演变为双核、多核,系统的中断控制器也有单一的GIC控制器演变问题级联结构的多中断控制器。

1.级联结构中断控制器

        手机处理器的中断控制器级联结构如图。图中GIC与PEx连接方式在《Arm中断控制器GICv3 -- 阅读笔记》一文中有介绍,非本文重点;图中黄色框图GPIO Control 、PMIC除具有GPIO控制器、电源管理的功能外,还具有interrupt controller功能。

        如图GPIO Control作为中断控制器时,与GIC(直接连接处理PE处理单元的中断控制器、与处理器结构有关)中断控制器通过SPI中断pin连接,即GPIO中断控制器收到中断时,该中断会作为SPI共享类型中断被GIC接受进而传递给PE处理。因为GPIO中断控制器用来重要用来接受外设中断,所以GPIO中断控制器不需要像GIC控制器一样区分太多的中断类型(SPI、PPI、GSI、LPI)。

        PMIC作为中断控制器时通过GPIO pin连接在GPIO中断控制器上。当PMIC产生中断时,GPIO中断控制器会在与PMIC连接的pin上捕获到对应的中断信号,进而将中断信号传递给GIC,再通过GIC将中断传递给PE进行处理。

ARM处理器 -- 处理器中的级联中断控制器_第1张图片

2.级联结构猜想及级联结构中断控制器的能力

        为什么PMIC中断控制器的中断没有直接连接到GIC而是连接到了GPIO中断控制器?猜想:原因可能与硬件系统休眠唤醒流程(此处的唤醒指硬件模块上唤醒,非软件逻辑上的resume&suspend)有关。如果PMIC中断控制器直接连接在GIC上,当通过power按键唤醒系统时则直接唤醒了GIC再唤醒PE处理该中断,此时GPIO模块可能要等PE去唤醒。

        如上中断控制器的级联结构,通过power按键唤醒系统时,会先唤醒GPIO模块后唤醒GIC最后给PE处理。此功能要求GPIO中断控制器的中断具备与GIC一样唤醒系统的能力,实际上GPIO & PMIC等子中断控制器拥有同GIC中断控制器一样基本的能力:使能中断irq_enalbe、关闭中断irq_disable、设置中断极性irq_set_type、设置中断唤醒能力irq_set_wake 等,不同的中断控制器支持的能力不同。

        因为每个中断控制作用域的的不同,所以其支持的中断控制能力也不同。如GPIO & PMIC 子中断控制器不需要像GIC的一样拥有中断distributor能力,而不要GIC的PPI、SGI等中断能力。

3.级联结构中断控制器在软件中的体现

        设备devicetree配置文件可以直观的系统系统中中断控制器的级联结构。如下:Main_PMIC、PIO、GIC三个中断控制器在设备在dts文件的中的设置,三者之间的级联关系是:Main_PMIC中断控制器的parent是PIO,PIO中断控制器的parent是GIC,GIC为root中断控制器;也就是Main_PMIC会连接在PIO的222号硬件中断pin上,PIO会连接到GIC的SPI类型的212号中断pin上。

        当Main_PMIC产生中断时,其中断信号的传递、处理路径为:Main_PMIC中断信号经PIO的222号中断pin传递给PIO中断控制器,在由PIO中经GIC的212号共享中断pin传递给GIC中断控制器,之后由GIC传递给PE进行中断的处理。

main_pmic: mt6359-pmic {
    compatible = "mediatek,mt6359-pmic";
    interrupt-controller;   //表示该设备为中断控制器
    #interrupt-cells = <2>;
    interrupt-parent = <&pio>;  //该中断控制器的父中断控制器为PIO
    interrupts = <222 IRQ_TYPE_LEVEL_HIGH 222 0>; //表示其连接在PIO中断器的222号硬中断pin上
}

pio: pinctrl {
    compatible = "mediatek,mt6885-pinctrl";
    interrupt-controller;    //表示该设备为中断控制器
    #interrupt-cells = <4>;
    interrupts = ;  //表示其连接在GIC中断控制器的212号共享类型中断上
    interrupt-parent = <&gic>;  //该中断控制器的父中断控制器为GIC
};

gic: interrupt-controller {
    compatible = "arm,gic-v3";
    #interrupt-cells = <3>;
    interrupt-parent = <&gic>;   //该中断控制器的父中断控制器为自身,表示其为root中断控制器
    interrupt-controller;     //表示该设备为中断控制器
    reg = <0 0x0c000000 0 0x40000>, // distributor
          <0 0x0c040000 0 0x200000>; // redistributor
    interrupts = ;
};
        中断控制器dts特性:

                a.中断控制器设备的node必须有interrupt-controller属性

                b.中断控制器设备的node需要通过interrupt-parent 属性指明其parent

                c.root中断控制器的interrupt-parent是其自身;

                d.#interrupt-cells 属性表明连接在该中断控制器上中断的node的interrupts属性中元素的个数;

你可能感兴趣的:(Linux,interrupt,arm,linux,kernel)