ARM中断控制器GIC

发布时间:2022-06-25 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了ARM中断控制器GIC脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

一颗SOC集成了大量的外设,如何有序的控制和响应这些中断呢?

ARM中断控制器GIC

不同体系结构对中断控制器有着不同的设计理念,但是其设计方法基本相同。ARM公司提供了一个通用中断控制器GIC(Generic Interrupt Controller)。目前最新版本的GIC规范是version 3/4,支持ARM V8架构,version 2通常在ARM v7处理器中使用。下面我们以GIC-V2规范来讲解有关概念。

中断状态

gic为每个中断维护着4个状态。

ARM中断控制器GIC

中断类型

gic支持的中断类型有外设中断、软件中断。其中外设中断来自于硬件,软件中断是通过软件写gic寄存器产生的。

ARM中断控制器GIC

ARM中断控制器GIC

gic架构划分

gic从逻辑上分为Distributor和CPU interface。Distributor是中断的统一入口,负责分发中断给具体的CPU。每个CPU都有一个CPU interface负责本CPU的中断屏蔽和抢占的。

ARM中断控制器GIC

ARM中断控制器GIC

中断ID

ARM中断控制器GIC

中断处理流程

其中第五步,CPU读取GICC_IAR寄存器来响应该中断(一般是linux内核程序来读取寄存器),寄存器返回硬件中断号;第六步,CPU处理完中断后写GICC_EOIR寄存器来通知CPU interface。

ARM中断控制器GIC

ARM中断控制器GIC

硬件中断号与Linux软件中断号的映射

每一款ARM SOC在芯片设计阶段时,就会把各种中断和外设分配情况固定下来,因此对于底层软件来说,需要查询SOC的芯片手册来确定的外设的中断号。

随着芯片硬件的发展,使用直接映射的方式难以应对多个中断控制器级联的情况,Linux引入了irq domain的管理框架,irq domain框架可支持多个中断控制器并且完美地支持device tree机制。gIT_init_of->gic_init_bases->__irq_domain_add(),添加到全局变量irq_domain_list

注册中断的API函数request_irq()/requeset_threaded_irq()是使用内核软件中断号,而不是硬件中断号,那它们是如何映射的呢? 一般通过调用核心函数irq_of_parse_and_map来解析DTS中的硬件中断号,返回内核使用的IRQ中断号。 它初始化时在位图中寻找空闲的bit来分配描述符。 irq_of_parse_and_map()->irq_domain_alloc_irqs()->__irq_alloc_descs()->bitmap_find_next_zero_area() 在内核中有两种方式来分配struct irq_desc数据结构,一是内核配置了config_SPARSE_IRQ使用radix tree树结构来存储;二是采用数组的方式,定义一个全局的数组struct irq_desc irq_desc[NR_IRQS],每个中断对应一个元素。

struct irq_desc包含struct irq_data,其中irq是软件中断号,hwirq是硬件中断号,当这两个成员填写完成,即完成了硬件中断的注册。struct irq_data包含struct irq_chipstruct irq_chip是硬件中断控制器操作的抽象接口,如使能/去使能、响应、完成等接口。

struct irq_data {
	unsigned int	irq;
	unsigned long	hwirq;
	struct irq_chip	*chip;
	...
};
struct irq_chip {
	const char	*name;
	unsigned int	(*irq_startup)(struct irq_data *data);
	void		(*irq_shutdown)(struct irq_data *data);
	void		(*irq_enable)(struct irq_data *data);
	void		(*irq_disable)(struct irq_data *data);

	void		(*irq_ack)(struct irq_data *data);
	void		(*irq_mask)(struct irq_data *data);
	void		(*irq_mask_ack)(struct irq_data *data);
	void		(*irq_unmask)(struct irq_data *data);
	void		(*irq_eoi)(struct irq_data *data);
	...
};

注册中断

如果中断处理程序需要做很多工作,那么就要使用中断上下部的机制。上半部:中断处理程序快速响应硬件并退出中断;下半部:处理延后的任务

注册中断接口

这是linux比较旧的api接口,在2.6.30总新增了request_threaded_irq,中断线程化的目的是降低中断对系统实时延迟的硬性。为什么 request_irq

中断标志位

参考资料

  1. 《ARM Generic Interrupt Controller Architecture version 2.0 - Architecture SPEcification》
  2. 《Arm Generic Interrupt Controller Architecture Specification GIC architecture version 3 and version 4》

脚本宝典总结

以上是脚本宝典为你收集整理的ARM中断控制器GIC全部内容,希望文章能够帮你解决ARM中断控制器GIC所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。