是搁浅控制器节点的性质,一般情况暂停发生设备数量要多于中断控制器

http://www.cnblogs.com/targethero/p/5080499.html

四 中断

https://www.cnblogs.com/xiaojiang1025/p/6131381.html

暂停一般包蕴中断发生设备和间断处理设备。中断控制器负责处理搁浅,每一个停顿都有对应的间歇号及触发条件。中断爆发设备可能有八个中断源,有时多个中断源对应中断控制器中的一个搁浅,那种场所暂停爆发设备的中止源称之为中断控制器中对应暂停的子中断。一般情况暂停暴发设备数据要多于中断控制器,多少个中断发生设备的暂停都由一个停顿控制器处理,这种多对一的关联也很像一个树形结构,所以在装置树中,中断也被描述成树,叫中断树。以下表述的时候为了明确是在说中断树,在父节点和子节点前面我们都充裕“中断”二字,是为着防备和设备树的父节点、子节点混淆(即便大部分状态设备树的父子关系就是中断树的父子关系,可是因为存在特例,所以大家如故强调是暂停父子关系)。

 

暂停暴发设备用interrupts属性描述中断源(interrupt
specifier),因为分裂的硬件描述中断源需求的数据量差距,所以interrupts属性的项目也是<prop-encoded-array>。为了明确表示一个抛锚由多少个u32表示,又引入了#interrupt-cells属性,#interrupt-cells属性的门类是u32,如果一个中断源须要2个u32表示(一个表示中断号,另一个象征暂停类型),那么#interrupt-cells就安装成2。有些情状下,设备树的父节点不是暂停的父节点(紧如若暂停控制器一般不是父节点),为此引入了interrupt-parent属性,该属性的品种是<phandle>,用来引用中断父节点(我们面前说过,一般用父节点的竹签,这几个地方说刹车父节点而不是刹车控制器是有缘由的)。假使设备树的父节点就是暂停父节点,那么可以毫不安装interrupt-parent属性。interrupts属性和interrupt-parent属性都是刹车发生设备节点的特性,可是#interrupt-cells属性不是,#interrupt-cells属性是刹车控制器节点以及interrupt
nexus节点的品质,那两类节点都可能是暂停父节点。

interrupts

停顿控制器节点用interrupt-controller属性表示自己是刹车控制器,这几个特性的花色是空,不用安装值,只要存在这么些节点就象征该节点是刹车控制器。除了这些属性外,中断控制器节点还有#interrupt-cells属性,用来代表该中断控制器直接保管下的interrupt
domain(前边大家会讲中断控制器的中断子节点interrupt
nexus节点有独立的interrupt domain)用多少个u32表示一个中断源(interrupt
specifier)。中断控制器节点就概括interrupt-controller和#interrupt-cells多少个有关中断的质量。中断控制器的#address-cells属性和间断映射有关系,不过该属性不是为中断设计的,中断映射只是利用了那一个特性而已。

一个电脑系列中大量配备都是透过中断请求CPU服务的,所以设备节点就需要在指定中断号。常用的质量;

面前说刹车控制器中的一个抛锚可能对应中断爆发设备中的多少个中断源,那那种对应关系用什么描述呢?大家还说过#interrupt-celll属性不仅是暂停控制器节点的特性,仍然interrupt
nexus节点的属性,那一个interrupt
nexus节点就是讲述中断映射关系的,该节点通过interrupt-map,interrupt-map-mask属性描述中断映射关系。interrupt-map属性是<prop-encoded-array>类型的,每个元素表示一个停顿映射关系(注意是一个”中断映射关系”,不是”一个停顿”映射关系),从前向后席卷:中断子设备地址,中断子设备中断源(interrupt
specifier),中断父设备,中断父设备地址,中断父设备中断源(interrupt
specifier)五有些。中断子设备地址具体由多少个u32组成是由中断子设备所在总线(不是暂停父设备)的#address-cells属性决定的,那个地点怎么用中断设备地址而不用中断设备的phandle,是有原因的,因为中断设备会用interrupt-parrent属性指向中断父节点,所以中断子设备是足以规定的,不要求验证。还因为中断子设备地址可以做与运算,通过interrupt-map-mask属性就足以兑现多对一的照耀。中断子设备中断源(interrupt
specifier)由多少个u32组成是由该interrupt
nexus节点下的#interrupt-cell决定的。中断父设备是一个针对性中断父设备的<phandle>属性,一般处境下是刹车控制器,不过依照中断树的逻辑,也恐怕是更高顶尖的interrupt
nexus节点。中断父设备地址具体由多少个u32组成是由刹车父设备节点下的#address-cells属性决定的(注意,不是搁浅父设备所在总线的#address-cells属性)。中断父设备中断源(interrupt
specifier)由多少个u32组成是由刹车父设备的#interrupt-cells属性决定的。

 

还记得前边说过刹车设备的中断源和刹车控制器的中断源可能是多对一的涉及,如若每个子中断都用interrupt-map中的一行表示,那么interrupt-map属性将十分大。为了让八个子中断共享映射关系,引入了interrupt-map-mask属性,该属性的序列也是<prop-enacoded-array>,包蕴中断子设备地址和中断子设备中断源的bit
mask,给定一个子中断源,那么首先和interrupt-map-mask做与运算,运算结果再通过interrupt-map属性查找对应的中断父设备中断源。那就是我们面前为何说interrupt-map属性的一行是一个“中断映射关系”,而不是“一个停顿”映射关系的由来。

interrupt-controller
一个空属性用来声称这一个node接收中断,即一个node是一个暂停控制器;

俺们再来复习一下,整个中断树的最头部是刹车爆发设备(也可能是从interrupt
nexus节点),中断爆发设备用interrupts属性描述她能发生的暂停。因为他的暂停父设备可能和设备树的父设备差别,那么用interrupt-parent属性指向他的中止父设备。他的中止父设备或者是暂停控制器(如若中断爆发设备的间歇和刹车控制器的间歇是逐一对应的,或者最底部是interrupt
nexus节点),也说不定是interrupt
nexus节点(如若最底部是暂停爆发设备,且需求映射)。interrupt
nexus节点及她的保有直接子节点构成了一个interrupt domain,在该interrupt
domain下中断源怎么着表示由#interrupt-cells属性决定,如何由中断子设备中断源找到中断父设备中断源由interrupt-map和interrupt-map-mask属性决定。interrupt
nexus的父节点可能仍旧一个interrupt
nexus父节点,也说不定是一个抛锚控制器,当发展找到最终一个刹车控制器,并且该中断控制器再也向来不停顿父设备时,整个中断树就遍历已毕了。中断控制器用interrupt-controller属性表示自己是刹车控制器,并且用#interrupt-cells属性表示他所一向管制的interrupt
domain用多少个u32表示一个中断源。按照中断树的风味,一个配备树中是有可能有两个中断树的。

 

上述是暂停在配备树中什么描述的规则,听起来是挺复杂的,但要是知道了就很简短,为了帮扶驾驭我们举一个其实的例证。为了卓越中断部分,大家做了简化。
/ {
    model = “Marvell Armada 375 family SoC”;
    compatible = “marvell,armada375”;
    soc {
        #address-cells = <2>;
        #size-cells = <1>;
        interrupt-parent = <&gic>;

#interrupt-cells,是搁浅控制器节点的属性,用来标识那个控制器须要多少个单位做中断描述符,用来叙述子节点”interrupts”属性使用了父节点中的interrupt属性的切切实实哪个值;一般,即使父节点的该属性的值为3,则子节点的interrupts一个cell的七个32bits的整数值分别为:<中断域
中断 触发方式>,即使父节点的该属性为2,则是<中断 触发格局>
interrupt-parent,标识此设备节点属于哪一个搁浅控制器,即使没有设置这一个特性,会活动依附父节点的;

        internal-regs {
            compatible = “simple-bus”;
            #address-cells = <1>;
            #size-cells = <1>;

 

            timer@c600 {
                compatible = “arm,cortex-a9-twd-timer”;
                reg = <0xc600 0x20>;
                interrupts = <GIC_PPI 13 (IRQ_TYPE_EDGE_RISING |
GIC_CPU_MASK_SIMPLE(2))>;
                clocks = <&coreclk 2>;
            };

interrups,一个间断标识符列表,表示每一个抛锚输出信号;

            gic: interrupt-controller@d000 {
                compatible = “arm,cortex-a9-gic”;
                #interrupt-cells = <3>;
                #address-cells = <0>;
                interrupt-controller;
                reg = <0xd000 0x1000>,
                      <0xc100 0x100>;
            };
        }

 

        pcie-controller {
            compatible = “marvell,armada-370-pcie”;
            #address-cells = <3>;
            #size-cells = <2>;

 1 / {
 2     model = "Marvell Armada 375 family SoC";
 3     compatible = "marvell,armada375";
 4     soc {
 5         #address-cells = <2>;
 6         #size-cells = <1>;
 7         interrupt-parent = <&gic>;
 8 
 9         internal-regs {
10             compatible = "simple-bus";
11             #address-cells = <1>;
12             #size-cells = <1>;
13 
14             timer@c600 {
15                 compatible = "arm,cortex-a9-twd-timer";
16                 reg = <0xc600 0x20>;
17                 interrupts = <GIC_PPI 13 (IRQ_TYPE_EDGE_RISING | GIC_CPU_MASK_SIMPLE(2))>;
18                 clocks = <&coreclk 2>;
19             };
20 
21             gic: interrupt-controller@d000 {
22                 compatible = "arm,cortex-a9-gic";
23                 #interrupt-cells = <3>;
24                 #address-cells = <0>;
25                 interrupt-controller;
26                 reg = <0xd000 0x1000>,
27                       <0xc100 0x100>;
28             };
29         }
30 
31         pcie-controller {
32             compatible = "marvell,armada-370-pcie";
33             #address-cells = <3>;
34             #size-cells = <2>;
35 
36             pcie@1,0 {
37                 #address-cells = <3>;
38                 #size-cells = <2>;
39                 #interrupt-cells = <1>;
40                 interrupt-map-mask = <0 0 0 0>;
41                 interrupt-map = <0 0 0 0 &gic GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>;
42             };
43         };

            pcie@1,0 {
                #address-cells = <3>;
                #size-cells = <2>;
                #interrupt-cells = <1>;
                interrupt-map-mask = <0 0 0 0>;
                interrupt-map = <0 0 0 0 &gic GIC_SPI 29
IRQ_TYPE_LEVEL_HIGH>;
            };
        };
}

率先大家看到timer@c600那一个设备节点下定义了interrupts属性,那评释该设施得以生出中断,不过那些特性下描述了多少个中断大家是看不出来的(若是有经验了,我们能猜出只是一个半上落下,现在我们按照规则确认)。因为该节点没有interrupt-parent属性,那么认为设备树的父节点internal-regs就是搁浅父节点,在internal-regs父节点下或者尚未interrupt-parent属性,那么仍旧再三再四找设备树父节点,找到了soc,在该节点上面有interrupt-parent属性。该属性引用的价签为gic,搜索整个设施树,interrupt-controller@d000的竹签为gic。gic节点下有interrupt-controller属性,表达她是一个搁浅控制器。gic节点还有属性#interrupt-cells
= <3>,表达在该控制器的interrupt domain下,中断源(interrupt
specifier)用3个u32表示,大家再看timer@c600下的interrupts属性也确确实实由3个u32组成(可以参照GIC的正式,第四个u32表示暂停类型,第四个是中断号,第多个是刹车触发条件)。那几个事例表达即使中断暴发设备的中断源和刹车控制器的中断源是各样对应的,那么可以不需求interrupt
nexus节点及相关的性质来代表暂停映射。

率先大家看到timer@c600以此装置节点下定义了interrupts属性,这表明该装备可以生出中断,不过这些特性下描述了几个中断大家是看不出来的(假设有经历了,大家能猜出只是一个停顿,现在大家依据规则确认)。因为该节点没有interrupt-parent属性,那么认为设备树的父节点internal-regs就是刹车父节点,在internal-regs父节点下或者不曾interrupt-parent属性,那么如故三番五次找设备树父节点,找到了soc,在该节点上边有interrupt-parent属性。该属性引用的标签为gic,搜索整个设施树,interrupt-controller@d000的价签为gic。gic节点下有interrupt-controller属性,表明她是一个中断控制器。gic节点还有属性#interrupt-cells
= <3>,表明在该控制器的interrupt domain下,中断源(interrupt
specifier)用3个u32表示,大家再看timer@c600下的interrupts属性也确确实实由3个u32组成(能够参照GIC的正统,第三个u32表示暂停类型,第一个是中断号,第七个是刹车触发条件)。这几个例子表明若是中断暴发设备的中断源和间断控制器的中断源是各种对应的,那么可以不须要interrupt
nexus节点及相关的习性来表示暂停映射。

 

再看pcie@1,0那几个节点,有#interrupt-cells属性,但是尚未interrupt-controller属性,那表明他是一个interrupt
nexus节点。该节点的#interrupt-cells属性为1,表明该interrupt
nexus节点管辖下的中断源用1个u32表示就足以了。在pcie@1,0节点上面没有子节点,且也未尝节点的interrupt-parent属性指向pcie@1,0节点,所以从设备树上看不到该interrupt
domain下的暂停爆发设备,可能的来头是这个中断暴发设备软件可以动态识别所以不需求配备树描述。因为interrupt-map-mask属性是由刹车暴发设备的地方和中断源(interrupt
specifier)组成,且中断源用1个u32表示,那么可以估算中断爆发设备地址由3个u32组成。那里要求注意的是pcie@1,0节点的#address-cells属性为3,是说该总线上边的设施地址用3个u32表示,但并不意味着中断爆发设备的设备地址也必定3个u32表示,此处不可以算得巧合,不过大家要领悟中断发生设备的地址由多少个u32组成是由该设施所在总线决定的,对于pcie总线也真正是3,不过其他总线可能存在任何种的情形。现在我们来分析interrupt-map属性,前多少个数字是暂停设备地址,第多个数字是刹车设备的中断源。因为interrupt-map-mask是全0,那样无论与哪些数字做与运算结果都是0,interrupt-map属性的前4个数字也都是0,那申明在pcie@1,0底下所有的刹车映射到中断父节点的间歇都是一个刹车。接着是指向gic的<phandle>,因为gic节点下#address-cells属性为0,所以前边不必要描述中断父设备的地方了,前面3个数字都是表示暂停父设备中断源的。一句话描述就是pcie@1,0下的具备中断都映射到gic,GIC_SPI类型的第29号中断,触发类型为高电平触发。这么些事例表达在中断树的最下边能够是interrupt
nexus节点。

再看pcie@1,0那么些节点,有#interrupt-cells属性,可是没有interrupt-controller属性,那表达他是一个interrupt
nexus节点。该节点的#interrupt-cells属性为1,表达该interrupt
nexus节点管辖下的中止源用1个u32表示就足以了。在pcie@1,0节点上面没有子节点,且也平素不节点的interrupt-parent属性指向pcie@1,0节点,所以从设备树上看不到该interrupt
domain下的暂停爆发设备,可能的缘由是这几个中断暴发设备软件可以动态识别所以不要求设备树描述。因为interrupt-map-mask属性是由刹车爆发设备的地址和中断源(interrupt
specifier)组成,且中断源用1个u32表示,那么可以估算中断暴发设备地址由3个u32组成。那里要求小心的是pcie@1,0节点的#address-cells属性为3,是说该总线上面的装置地址用3个u32表示,但并不表示中断发生设备的装备地址也决然3个u32表示,此处不可能算得巧合,可是大家要领悟中断暴发设备的地方由多少个u32组成是由该装置所在总线决定的,对于pcie总线也的确是3,然则其余总线可能存在任何种的气象。现在大家来分析interrupt-map属性,前多个数字是搁浅设备地址,第多少个数字是暂停设备的中断源。因为interrupt-map-mask是全0,那样无论与什么数字做与运算结果都是0,interrupt-map属性的前4个数字也都是0,这阐明在pcie@1,0底下所有的暂停映射到中断父节点的暂停都是一个间断。接着是指向gic的<phandle>,因为gic节点下#address-cells属性为0,所未来面不须求描述中断父设备的地方了,前面3个数字都是代表暂停父设备中断源的。一句话描述就是pcie@1,0下的持有中断都映射到gic,GIC_SPI类型的第29号中断,触发类型为高电平触发。那一个事例表达在中断树的最上面可以是interrupt
nexus节点。

以上例子中断树的根是gic,gic上面有五个男女,一个是搁浅设备timer@c600,一个是interrupt
nexus节点pcie@1,0。gic直接管辖的interrupt
domain用3个u32表示中断源,timer@c600在那个interrupt
domain下。pcie@1,0下定义了一个新的interrupt domain,在该interrupt
domain下,中断源用1个u32表示,pcie@1,0用interrupt-map和interrupt-map-mask属性将上面所有装备的刹车映射到一个gic下面的刹车上。

 

上述例子中断树的根是gic,gic上边有七个儿女,一个是刹车设备timer@c600,一个是interrupt
nexus节点pcie@1,0。gic直接管辖的interrupt
domain用3个u32表示中断源,timer@c600在那几个interrupt
domain下。pcie@1,0下定义了一个新的interrupt domain,在该interrupt
domain下,中断源用1个u32表示,pcie@1,0用interrupt-map和interrupt-map-mask属性将上边所有设施的中断映射到一个gic上面的中止上。

相关文章