(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用来描述触发类型。
很奇怪,uart3并没有定义interrupt-parent属性,这里定义interrupt-parent属性的是root node,具体的描述在linux-
3.14\arch\arm\boot\dts\omap4.dtsi文件中:
/ {
compatible = "ti,omap4430", "ti,omap4";
interrupt-parent = <&gic>;
略去无关内容
}
难道root node会产生中断到interrupt controller吗?当然不会,只不过如果一个能够产生中断的device node没有定义
interrupt-parent的话,其interrupt-parent属性就是跟随parent node。因此,与其在所有的下游设备中定义interrupt-
parent,不如统一在root node中定义了。
3、DTS如何描述GIC
linux-3.14\arch\arm\boot\dts\omap4.dtsi文件中,
gic: interrupt-controller@48241000 {
compatible = "arm,cortex-a9-gic";
interrupt-controller;
#interrupt-cells = <3>;
reg = <0x48241000 0x1000="">,
<0x48240100 0x0100="">;
};
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的。
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
Linux TTY framework(3)_从应
用的角度看TTY设备
新技能get: 订阅Linux内核邮件
列表
“极致”神话和产品观念
玩转BLE(2)_使用bluepy扫描
BLE的广播数据
文章存档
2017年11月(2)
2017年10月(1)
2017年9月(5)
2017年8月(4)
2017年7月(4)
2017年6月(3)
2017年5月(3)
2017年4月(1)
2017年3月(8)
2017年2月(6)
2017年1月(5)
2016年12月(6)
2016年11月(11)
2016年10月(9)
2016年9月(6)
2016年8月(9)
2016年7月(5)
2016年6月(8)
2016年5月(8)
2016年4月(7)
2016年3月(5)
2016年2月(5)
2016年1月(6)
2015年12月(6)
2015年11月(9)
2015年10月(9)
2015年9月(4)
2015年8月(3)
2015年7月(7)
2015年6月(3)
2015年5月(6)
2015年4月(9)
2015年3月(9)
2015年2月(6)
2015年1月(6)
2014年12月(17)
2014年11月(8)
2014年10月(9)
2014年9月(7)
2014年8月(12)
2014年7月(6)
2014年6月(6)
2014年5月(9)
2014年4月(9)
2014年3月(7)
2014年2月(3)
2014年1月(4)