是刹车控制器节点的特性,一般意况暂停爆发设备数据要多于中断控制器

是中断控制器节点的属性,多个中断产生设备的中断都由一个中断控制器处理

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

四 中断

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

停顿一般包涵中断发生设备和刹车处理设施。中断控制器负责处理搁浅,每一个暂停都有照应的中断号及触发条件。中断爆发设备恐怕有多个中断源,有时八个中断源对应中断控制器中的多少个停顿,那种景况暂停暴发设备的间歇源称之为中断控制器中对应暂停的子中断。一般景色暂停发生设备数据要多于中断控制器,七个中断爆发设备的中止都由1个搁浅控制器处理,那种多对一的关系也很像一个树形结构,所以在装备树中,中断也被描述成树,叫中断树。以下表述的时候为了分明是在说中断树,在父节点和子节点前面大家都添加“中断”二字,是为着防止和装置树的父节点、子节点混淆(即使半数以上气象设备树的父子关系就是中断树的父子关系,然则因为存在特例,所以大家照旧强调是刹车父子关系)。

 

停顿暴发设备用interrupts属性描述中断源(interrupt
specifier),因为分歧的硬件描述中断源须要的数据量差别,所以interrupts属性的系列也是<prop-encoded-array>。为了分明表示三个暂停由多少个u32表示,又引入了#interrupt-cells属性,#interrupt-cells属性的项目是u32,如果壹个中断源必要二个u32表示(3个意味着中断号,另二个意味暂停类型),那么#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服务的,所以设备节点就须要在指定中断号。常用的性能;

前方说刹车控制器中的2个间断只怕对应中断发生设备中的七个中断源,那那种对应关系用什么样描述呢?大家还说过#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属性的一行是3个“中断映射关系”,而不是“3个停顿”映射关系的缘故。

interrupt-controller
二个空属性用来声称那一个node接收中断,即1个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的父节点或许依旧3个interrupt
nexus父节点,也说不定是2个抛锚控制器,当发展找到最终2个刹车控制器,并且该中断控制器再也未曾停顿父设备时,整个中断树就遍历完毕了。中断控制器用interrupt-controller属性表示友好是刹车控制器,并且用#interrupt-cells属性表示他所一直管制的interrupt
domain用多少个u32表示2个中断源。依照中断树的特色,贰个装备树中是有大概有几个中断树的。

 

上述是刹车在装备树中怎么着描述的规则,听起来是挺复杂的,但如果精晓了就很粗略,为了救助精晓我们举贰个实在的事例。为了优秀中断部分,大家做了简化。
/ {
    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,1个停顿标识符列表,表示每1个间断输出信号;

            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属性,表明她是1个因噎废食控制器。gic节点还有属性#interrupt-cells
= <3>,表达在该控制器的interrupt domain下,中断源(interrupt
specifier)用三个u32表示,大家再看timer@c600下的interrupts属性也实在由1个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)用一个u32表示,大家再看timer@c600下的interrupts属性也着实由3个u32组成(可以参见GIC的正规化,第2个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)组成,且中断源用一个u32表示,那么能够想见中断发生设备地址由一个u32组成。那里需求留意的是pcie@1,0节点的#address-cells属性为3,是说该总线上边的装备地址用一个u32表示,但并不意味中断爆发设备的设施地址也必定三个u32表示,此处无法说是巧合,然则我们要精晓中断爆发设备的地址由多少个u32组成是由该设备所在总线决定的,对于pcie总线也真正是3,不过任何总线恐怕存在其余种的景色。以往我们来分析interrupt-map属性,前两个数字是刹车设备地址,第捌个数字是刹车设备的中断源。因为interrupt-map-mask是全0,这样不管与哪些数字做与运算结果都以0,interrupt-map属性的前六个数字也都以0,那表明在pcie@1,0上边全数的中断映射到中断父节点的中断都是二个停顿。接着是指向gic的<phandle>,因为gic节点下#address-cells属性为0,所今后面不须求描述中断父设备的地址了,前边3个数字都以意味着暂停父设备中断源的。一句话描述就是pcie@1,0下的具有中断都映射到gic,GIC_SPI类型的第壹9号中断,触发类型为高电平触发。那些例子表明在中断树的最下边可以是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)组成,且中断源用3个u32表示,那么可以想见中断发生设备地址由一个u32组成。那里须求留意的是pcie@1,0节点的#address-cells属性为3,是说该总线上边的装备地址用3个u32表示,但并不表示中断发生设备的设备地址也必然二个u32表示,此处无法算得巧合,不过大家要知道中断发生设备的地方由多少个u32组成是由该装置所在总线决定的,对于pcie总线也确实是3,但是其余总线可能存在任何种的情事。今后大家来分析interrupt-map属性,前七个数字是刹车设备地址,第二个数字是搁浅设备的中断源。因为interrupt-map-mask是全0,那样无论与什么数字做与运算结果都以0,interrupt-map属性的前五个数字也都以0,这阐明在pcie@1,0上面全部的中断映射到中断父节点的中止都是3个搁浅。接着是指向gic的<phandle>,因为gic节点下#address-cells属性为0,所今后面不须要描述中断父设备的地址了,前面3个数字都是意味暂停父设备中断源的。一句话描述就是pcie@1,0下的具有中断都映射到gic,GIC_SPI类型的第叁9号中断,触发类型为高电平触发。那些事例表达在中断树的最上面可以是interrupt
nexus节点。

上述例子中断树的根是gic,gic下面有七个男女,一个是刹车设备timer@c600,3个是interrupt
nexus节点pcie@1,0。gic间接管辖的interrupt
domain用贰个u32表示中断源,timer@c600在那么些interrupt
domain下。pcie@1,0下定义了二个新的interrupt domain,在该interrupt
domain下,中断源用3个u32表示,pcie@1,0用interrupt-map和interrupt-map-mask属性将上面全部设施的间歇映射到贰个gic下面的暂停上。

 

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