是刹车控制器节点的习性,几个中断暴发设备的刹车都由一个间断控制器处理

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下面的中断上。

相关文章