DTS设备树中中断节点的创建

DTS设备树中中断节点的创建

提到中断就必须了解到GIC,下面先了解一下GIC

一、GIC概念

        GIC(Generic Interrupt Controller)是ARM公司提供的一个通用的中断控制器。GIC通过AMBA(Advanced Microcontroller Bus Architecture)这样的片上总线连接到一个或者多个ARM processor上。

二、设备树中中断如何工作

       与遵循树的自然结构而进行的地址转换不同,机器上的任何设备都可以发起和终止中断信号。另外地址的编址也不同于中断信号,前者是设备树的自然表示,而后者者表现为独立于设备树结构的节点之间的链接。描述中断连接需要四个属性:

 ■  interrupt-controller - 一个空的属性定义(就是仅仅列出了该字符串,见下面)  , 该节点作为一个接收中断信号的设备。

 ■  #interrupt-cells - 这是一个中断控制器节点的属性。它声明了该中断控制器的中断指示符中 cell 的个数(类似于 #address-cells 和 #size-cells)。

 ■  interrupt-parent - 这是一个设备节点的属性,包含一个指向该设备连接的中断控制器的 phandle。那些没有 interrupt-parent 的节点则从它们的父节点中继承该属性。

 ■  interrupts - 一个设备节点属性,包含一个中断指示符的列表,对应于该设备上的每个中断输出信号。

      中断指示符是一个或多个 cell 的数据(由 #interrupt-cells 指定),这些数据指定了该设备连接至哪些输入中断。在以下的例子中,大部分设备都只有一个输出中断,但也有可能在一个设备上有多个输出中断。一个中断指示符的意义完全取决于与中断控制器设备的 binding。每个中断控制器可以决定使用几个 cell 来唯一的定义一个输入中断。

下面的代码为添加了中断连接:


1. / {  

2.   

3.     compatible = "acme,coyotes-revenge";  

4.     #address-cells = <1>;  

5.     #size-cells = <1>;  

6.     interrupt-parent = <&intc>;  

7.   

8.     cpus {  

9.         #address-cells = <1>;  

10.         #size-cells = <0>;  

11.         cpu@0 {  

12.             compatible = "arm,cortex-a9";  

13.             reg = <0>;  

14.         };  

15.   

16.         cpu@1 {  

17.             compatible = "arm,cortex-a9";  

18.             reg = <1>;  

19.         };  

20.     };  

21.   


40.   

41.     intc: interrupt-controller@10140000 {  

42.         compatible = "arm,pl190";  

43.         reg = <0x10140000 0x1000 >;  

44.         interrupt-controller;                         //见上面,空的属性,表明该节点是作为一个接收中断的设备

45.         #interrupt-cells = <2>;  

46.     };  

47.   

48.     spi@10115000 {  

49.         compatible = "arm,pl022";  

50.         reg = <0x10115000 0x1000 >;  

51.         interrupts = < 4 0 >;  

52.     };  

53.   

54. //external-bus的rangs属性:

55. //external-bus的ranges属性定义了经过external-bus桥后的地址范围如何映射到CPU的memory区域。看博客sbh的详细讲解

56.     external-bus {  

57.         #address-cells = <2>  

58.         #size-cells = <1>;  

59.         ranges = <0 0  0x10100000   0x10000         // Chipselect 1, Ethernet  

60.                      1 0  0x10160000   0x10000         // Chipselect 2, i2c controller  

61.                      2 0  0x30000000   0x1000000>; // Chipselect 3, NOR Flash  

62. //解释

63. //ranges属性为一个地址转换表。表中的每一行都包含了子地址、父地址、在自地址空间内的区域大小。他们的大小(包含的cell)分别由子节点的address-

64. //cells的值、父节点的address-cells的值和子节点

65. //的size-cells来决定。以第一行为例:

66. //0 0 两个cell,由子节点external-bus的address-cells=<2>决定;

67. //0x10100000 一个cell,由父节点的address-cells=<1>决定0x10000 一个cell,由子节点external-bus的size-cells=<1>决定。

68. //最终第一行说明的意思就是:片选0 (注意有片选,这应该是外设的一个特点),偏移0(选中了网卡),被映射到CPU地址空间的0x10100000~0x10110000中,地址长度为0x10000。

69.  

70.   

71.         ethernet@0,0 {  

72.             compatible = "smc,smc91c111";  

73.             reg = <0 0 0x1000>;  

74.             interrupts = < 5 2 >;  

75.         };  

76.   

77.         i2c@1,0 {  

78.             compatible = "acme,a1234-i2c-bus";  

79.             #address-cells = <1>;  

80.             #size-cells = <0>;  

81.             reg = <1 0 0x1000>;  

82.             interrupts = < 6 2 >;  

83.   

84.             rtc@58 {  

85.                 compatible = "maxim,ds1338";  

86.                 reg = <58>;  

87.                 interrupts = < 7 3 >;  

88.             };  

89.         };  

90.   

91.         flash@2,0 {  

92.             compatible = "samsung,k8f1315ebm", "cfi-flash";  

93.             reg = <2 0 0x4000000>;  

94.         };  

95.     };  

96. };  


需要注意的事情:

■ 这个机器只有一个中断控制器:interrupt-controller@10140000。

■ 中断控制器节点上添加了‘inc:’标签,该标签用于给根节点的 interrupt-parent 属性分配一个 phandle。这个 interrupt-parent 将成为本系统的默认值,因为所有的子节点都将继承它,除非显示覆写这个属性。

■ 每个设备使用 interrupts 属性来不同的中断输入线。

■ #interrupt-cells 是 2,所以每个中断指示符都有 2 个 cell。本例使用一种通用的模式,也就是用第一个 cell 来编码中断线号;然后用第二个 cell 编码标志位,比如高电平/低电平有效,或者边缘/水平触发。对于任何给定的中断控制器,请参考该控制器的 binding 文档以了解指示符如何编码。


三、GIC DTS描述

1、中断系统概述

    对于中断系统,主要有三个角色:

(1)processor:主要用于处理中断;

(2)Interrupt Generating Device:通过硬件的interrupt line表明自身需要处理器的进一步处理(例如有数据到来、异常状态等)

(3)interrupt controller:负责收集各个外设的异步事件,用有序、可控的方式通知一个或者多个processor。


2、DTS如何描述Interrupt Generating Device

     对于Interrupt Generating Device,我们需要定义下面两个属性:

(1) Interrupt属性:该属性主要描述了中断的HW interrupt ID以及类型。

(2)interrupt-parent 属性:该属性主要描述了该设备的interrupt request line连接到哪一个interrupt controller。


我们以一个简单的串口为例子, 

uart3: serial@48020000 {

       compatible = "ti,omap4-uart";

       reg = <0x48020000 0x100="">;

       interrupts = <GIC_SPI  74  IRQ_TYPE_LEVEL_HIGH>;

       ti,hwmods = "uart3";

       clock-frequency = <48000000>;

};

    对于uart3,interrupts属性用3个cell(对于device tree,cell是指由32bit组成的一个信息单位)表示。GIC_SPI 描述了interrupt type。

对于GIC,它可以管理4种类型的中断:

1)外设中断(Peripheral interrupt)

       根据目标CPU的不同,外设的中断可以分成PPI(Private Peripheral Interrupt)和SPI(Shared Peripheral Interrupt)。PPI只能分配给一个确定的processor,而SPI可以由Distributor将中断分配给一组Processor中的一个进行处理。外设类型的中断一般通过一个interrupt request line的硬件信号线连接到中断控制器,可能是电平触发的(Level-sensitive),也可能是边缘触发的(Edge-triggered)。

2)软件触发的中断(SGI,Software-generated interrupt)

       软件可以通过写GICD_SGIR寄存器来触发一个中断事件,这样的中断,可以用于processor之间的通信。

3)虚拟中断(Virtual interrupt)和 Maintenance interrupt。

     这两种中断和本文无关,不再赘述。

     在DTS中,外设的interrupt type有两种,一种是SPI,另外一种是PPI。SGI用于processor之间的通信,和外设无关。     uart3的interrupt属性中的74表示该外设使用的GIC interrupt ID号。GIC最大支持1020个HW interrupt ID,具体的ID分配情况如下:1)ID0~ID31是用于分发到一个特定的process的interrupt。标识这些interrupt不能仅仅依靠ID,因为各个interrupt source都用同样的ID0~ID31来标识,因此识别这些interrupt需要interrupt ID + CPU interface number。ID0~ID15用于SGI,ID16~ID31用于PPI。PPI类型的中断会送到指定的process上,和其他的process无关。SGI是通过写GICD_SGIR寄存器而触发的中断。Distributor通过processor source ID、中断ID和target processor ID来唯一识别一个SGI。2)ID32~ID1019用于SPI。uart3的interrupt属性中的IRQ_TYPE_LEVEL_HIGH用来描述触发类型。


3、DTS如何描述GIC

     linux-3.14\arch\arm\boot\dts\exynos4412.dtsi文件中


1. #include "exynos4x12.dtsi"  

2. /{        

3.     compatible = "samsung,exynos4412";       

4.     gic: interrupt-controller@10490000 {        

5.         cpu-offset = <0x4000>;   

6.     };       

7.   

8.     interrupt-controller@10440000 {              

9.         samsung,combiner-nr = <20>;              

10.         interrupts =    <0 0 0>, <0 1 0>, <0 2 0>, <0 3 0>,                         

11.                           <0 4 0>, <0 5 0>, <0 6 0>, <0 7 0>,                         

12.                               <0 8 0>, <0 9 0>, <0 10 0>, <0 11 0>,                        

13.                               <0 12 0>, <0 13 0>, <0 14 0>, <0 15 0>,                          

14.                               <0 107 0>, <0 108 0>, <0 48 0>, <0 42 0>;       

15.     };  

16. };  


a -- compatible属性

      compatible属性用来描述GIC的programming model。该属性的值是string list,定义了一系列的modle(每个string是一个model)。这些字符串列表被操作系统用来选择用哪一个driver来驱动该设备。

     假设定义该属性:compatible = “a厂商,p产品”, “标准bbb类型设备”。那么linux kernel可能首先使用“a厂商,p产品”来匹配适合的driver,如果没有匹配到,那么使用字符串“标准bbb类型设备”来继续寻找适合的driver。

     compatible属性有两个应用场景:

1)对于root node,compatible属性是用来匹配machine type的(参考Device Tree相关文档)

2)对于普通的HW block的节点(硬件模块节点如中断控制器),例如interrupt-controller,compatible属性是用来匹配适合的driver的。


b -- interrupt-controller 

       interrupt-controller这个没有定义value的属性用来表明本设备节点就是一个interrupt controller。理解#interrupt-cells这个属性需要理解interrupt specifier和interrupt domain这两个概念。interrupt specifier其实就是外设interrupt的属性值,对于uart3而言,其interrupt specifier就是<GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>,也就是说,interrupt specifier定义了一个外设产生中断的规格(HW interrupt ID + interrupt type)。

     具体如何解析interrupt specifier?这个需要限定在一定的上下文中,不同的interrupt controller会有不同的解释。因此,对于一个包含多个interrupt controller的系统,每个interrupt controller及其相连的外设组成一个interrupt domain,各个外设的interrupt specifier只能在属于它的那个interrupt domain中得到解析。#interrupt-cells定义了在该interrupt domain中,用多少个cell来描述一个外设的interrupt specifier。


c -- reg

      reg属性定义了GIC的memory map的地址.


三、GIC的HW block diagram描述

1、Distributor

      Distributor的主要的作用是检测各个interrupt source的状态,控制各个interrupt source的行为,分发各个interrupt source产生的中断事件到各个processor。

Distributor对中断的控制包括:

1)中断enable或者disable的控制。Distributor对中断的控制分成两个级别。一个是全局中断的控制。一旦disable了全局的中断,那么任何的interrupt source产生的interrupt event都不会被传递到CPU interface。另外一个级别是对针对各个interrupt source进行控制,disable某一个interrupt source会导致该interrupt event不会分发到CPU interface,但不影响其他interrupt source产生interrupt event的分发。

2)控制中断事件分发到processor。一个interrupt事件可以分发给一个processor,也可以分发给若干个processor。

3)优先级控制。

4)interrupt属性设定。例如是level-sensitive还是edge-triggered,是属于group 0还是group 1。

     Distributor可以管理若干个interrupt source,这些interrupt source用ID来标识,我们称之interrupt ID。

2、CPU interface

      CPU interface这个block主要用于和processor进行接口。该block的主要功能包括:

1)enable或者disable

     对于ARM,CPU interface block和processor之间的中断信号线是nIRQ和nFIQ这两个signal。如果disable了中断,那么即便是Distributor分发了一个中断事件到CPU interface,但是也不会assert指定的nIRQ或者nFIQ通知processor。

2)ackowledging中断

     processor会向CPU interface block应答中断,中断一旦被应答,Distributor就会把该中断的状态从pending状态修改成active。如果没有后续pending的中断,那么CPU interface就会deassert nIRQ或者nFIQ的signal。如果在这个过程中又产生了新的中断,那么Distributor就会把该中断的状态从pending状态修改成pending and active。这时候,CPU interface仍然会保持nIRQ或者nFIQ信号的asserted状态,也就是向processor signal下一个中断。

3)中断处理完毕的通知

     当interrupt handler处理完了一个中断的时候,会向写CPU interface的寄存器从而通知GIC CPU已经处理完该中断。做这个动作一方面是通知Distributor将中断状态修改为deactive,另外一方面,如果一个中断没有完成处理,那么后续比该中断优先级低的中断不会assert到processor。一旦标记中断处理完成,被block掉的那些比当前优先级低的中断就会递交给processor。

4)设定priority mask

     通过priority mask,可以mask掉一些优先级比较低的中断,这些中断不会通知到CPU。

5)设定preemption的策略

6)在多个中断事件同时到来的时候,选择一个优先级最高的通知processor

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容