首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

GIC寄存器介绍

  • 25-03-04 14:01
  • 4537
  • 8119
blog.csdn.net

往期内容

本专栏往期内容,interrtupr子系统:

  1. 深入解析Linux内核中断管理:从IRQ描述符到irq domain的设计与实现
  2. Linux内核中IRQ Domain的结构、操作及映射机制详解
  3. 中断描述符irq_desc成员详解
  4. Linux 内核中断描述符 (irq_desc) 的初始化与动态分配机制详解
  5. 中断的硬件框架
  6. GIC介绍

pinctrl和gpio子系统专栏:

  1. 专栏地址:pinctrl和gpio子系统

  2. 编写虚拟的GPIO控制器的驱动程序:和pinctrl的交互使用

    – 末片,有专栏内容观看顺序

input子系统专栏:

  1. 专栏地址:input子系统
  2. input角度:I2C触摸屏驱动分析和编写一个简单的I2C驱动程序
    – 末片,有专栏内容观看顺序

I2C子系统专栏:

  1. 专栏地址:IIC子系统
  2. 具体芯片的IIC控制器驱动程序分析:i2c-imx.c-CSDN博客
    – 末篇,有专栏内容观看顺序

总线和设备树专栏:

  1. 专栏地址:总线和设备树
  2. 设备树与 Linux 内核设备驱动模型的整合-CSDN博客
    – 末篇,有专栏内容观看顺序

img

目录

  • 往期内容
  • 前言
  • 1.Distributor 寄存器描述
    • 1.1 Distributor Control Register, GICD_CTLR
    • 1.2 Interrupt Controller Type Register, GICD_TYPER
    • 1.3 Distributor Implementer Identification Register, GICD_IIDR
    • 1.4 Interrupt Group Registers, GICD_IGROUPRn
    • 1.5 Interrupt Set-Enable Registers, GICD_ISENABLERn
    • 1.6 Interrupt Clear-Enable Registers, GICD_ICENABLERn
    • 1.7 Interrupt Set-Active Registers, GICD_ISACTIVERn
    • 1.8 Interrupt Clear-Active Registers, GICD_ICACTIVERn
    • 1.9 Interrupt Priority Registers, GICD_IPRIORITYRn
    • 1.10 Interrupt Processor Targets Registers, GICD_ITARGETSRn
    • 1.11 Interrupt Configuration Registers, GICD_ICFGRn
    • 1.12 Identification registers: Peripheral ID2 Register, ICPIDR2
  • 2.CPU interface寄存器描述
    • 2.1 CPU Interface Control Register, GICC_CTLR
    • 2.2 Interrupt Priority Mask Register, GICC_PMR
    • 2.3 Binary Point Register, GICC_BPR
    • 2.4 Interrupt Acknowledge Register, GICC_IAR
    • 2.5 Interrupt Register, GICC_EOIR
  • 3.GIC编程

前言

GIC分为两部分:Distributor和CPU interface,它们的寄存器都有相应的前缀:“GICD*”、“GICC*”。这些寄存器都是映射为内存接口(memery map),CPU可以直接读写。
介绍了ARM的全局中断控制器(GIC)的结构与工作原理。GIC分为Distributor和CPU接口两部分,分别负责中断的分发和处理。文章详细解读了多个重要寄存器,包括Distributor控制寄存器(GICD_CTLR)、中断优先级寄存器(GICD_IPRIORITYRn)、中断使能寄存器(GICD_ISENABLERn)、以及CPU接口控制寄存器(GICC_CTLR)等。每个寄存器的作用、位域及其功能、偏移地址和如何找到对应的寄存器及位操作规则均有详尽说明。最后还提到NXP提供的IMX6ULL SDK包中的GIC初始化代码示例,用于GIC的实际配置和初始化,适合基于Cortex A7的GICv2环境。

1.Distributor 寄存器描述

1.1 Distributor Control Register, GICD_CTLR

控制Group 0和Group 1中断的使能和转发。

img

位域名读写描述
1EnableGrp1R/W用于将pending Group 1中断从Distributor转发到CPU interfaces 0:group 1中断不转发 1:根据优先级规则转发Group 1中断
0EnableGrp0R/W用于将pending Group 0中断从Distributor转发到CPU interfaces 0:group 0中断不转发 1:根据优先级规则转发Group 0中断

1.2 Interrupt Controller Type Register, GICD_TYPER

该寄存器包含对GIC配置的描述信息。

img

位域名读写描述
15:11LSPIR如果GIC实现了安全扩展,则此字段的值是已实现的可锁定SPI的最大数量,范围为0(0b00000)到31(0b11111)。 如果此字段为0b00000,则GIC不会实现配置锁定。 如果GIC没有实现安全扩展,则保留该字段。
10SecurityExtnR表示GIC是否实施安全扩展: 0未实施安全扩展; 1实施了安全扩展
7:5CPUNumberR表示已实现的CPU interfaces的数量。 已实现的CPU interfaces数量比该字段的值大1。 例如,如果此字段为0b011,则有四个CPU interfaces。
4:0ITLinesNumberR表示GIC支持的最大中断数。 如果ITLinesNumber = N,则最大中断数为32*(N+1)。 中断ID的范围是0到(ID的数量– 1)。 例如:0b00011最多128条中断线,中断ID 0-127。 中断的最大数量为1020(0b11111)。 无论此字段定义的中断ID的范围如何,都将中断ID 1020-1023保留用于特殊目的

1.3 Distributor Implementer Identification Register, GICD_IIDR

img

位域名读写描述
31:24ProductIDR产品标识ID
23:20保留
19:16VariantR通常是产品的主要版本号
15:12RevisionR通常此字段用于区分产品的次版本号
11:0ImplementerR含有实现这个GIC的公司的JEP106代码; [11:8]:JEP106 continuation code,对于ARM实现,此字段为0x4; [7]:始终为0; [6:0]:实现者的JEP106code,对于ARM实现,此字段为0x3B

1.4 Interrupt Group Registers, GICD_IGROUPRn

用于设置每个中断的Group属性

img

位域名读写描述
31:0Group status bitsR/W组状态位,对于每个位: 0:相应的中断为Group 0; 1:相应的中断为Group 1;3:相应的中断为Group 3。

对于一个中断,如何设置它的Group ?首先找到对应的GICD_IGROUPRn寄存器,即n是多少?还要确定使用这个寄存器里哪一位。
对于interrtups ID m,如下计算:

n = m DIV 32,GICD_IGROUPRn里的n就确定了;
GICD_IGROUPRn在GIC内部的偏移地址是多少?0x080+(4*n)
使用GICD_IPRIORITYRn中哪一位来表示interrtups ID m?
bit = m mod 32。
  • 1
  • 2
  • 3
  • 4

1.5 Interrupt Set-Enable Registers, GICD_ISENABLERn

控制中断的转发使能状态。

img

位域名读写描述
31:0Set-enable bitsR/W对于SPI和PPI类型的中断,每一位控制对应中断的转发行为:从Distributor转发到CPU interface: 读: 0:表示当前是禁止转发的; 1:表示当前是使能转发的; 写: 0:无效 1:使能转发

对于一个中断,如何找到GICD_ISENABLERn并确定相应的位?

对于interrtups ID m,如下计算:
n = m DIV 32,GICD_ISENABLERn里的n就确定了;
GICD_ISENABLERn在GIC内部的偏移地址是多少?0x100+(4*n)
使用GICD_ISENABLERn中哪一位来表示interrtups ID m?
bit = m mod 32。
  • 1
  • 2
  • 3
  • 4
  • 5

1.6 Interrupt Clear-Enable Registers, GICD_ICENABLERn

控制中断的禁止转发状态。

img

位域名读写描述
31:0Clear-enable bitsR/W对于SPI和PPI类型的中断,每一位控制对应中断的转发行为:从Distributor转发到CPU interface: 读: 0:表示当前是禁止转发的; 1:表示当前是使能转发的; 写: 0:无效 1:禁止转发

对于一个中断,如何找到GICD_ICENABLERn并确定相应的位?

对于interrtups ID m,如下计算:
n = m DIV 32,GICD_ICENABLERn里的n就确定了;
GICD_ICENABLERn在GIC内部的偏移地址是多少?0x180+(4*n)
使用GICD_ICENABLERn中哪一位来表示interrtups ID m?
bit = m mod 32。
  • 1
  • 2
  • 3
  • 4
  • 5

1.7 Interrupt Set-Active Registers, GICD_ISACTIVERn

设置或清除中断的活动状态。

img

位域名读写描述
31:0Set-active bitsR/W读: 0:表示相应中断不是active状态; 1:表示相应中断是active状态; 写: 0:无效 1:把相应中断设置为active状态,如果中断已处于Active状态,则写入无效

对于一个中断,如何找到GICD_ISACTIVERn并确定相应的位?

对于interrtups ID m,如下计算:
n = m DIV 32,GICD_ISACTIVERn里的n就确定了;
GICD_ISACTIVERn在GIC内部的偏移地址是多少?0x300+(4*n)
使用GICD_ISACTIVERn 中哪一位来表示interrtups ID m?
bit = m mod 32。
  • 1
  • 2
  • 3
  • 4
  • 5

1.8 Interrupt Clear-Active Registers, GICD_ICACTIVERn

img

位域名读写描述
31:0Clear-active bitsR/W读: 0:表示相应中断不是active状态; 1:表示相应中断是active状态; 写: 0:无效 1:把相应中断设置为deactive状态,如果中断已处于dective状态,则写入无效

对于一个中断,如何找到GICD_ICACTIVERn并确定相应的位?

对于interrtups ID m,如下计算:
n = m DIV 32,GICD_ICACTIVERn里的n就确定了;
GICD_ICACTIVERn 在GIC内部的偏移地址是多少?0x380+(4*n)
使用GICD_ICACTIVERn中哪一位来表示interrtups ID m?
bit = m mod 32。
  • 1
  • 2
  • 3
  • 4
  • 5

1.9 Interrupt Priority Registers, GICD_IPRIORITYRn

用于设置每个中断的优先级

img

位域名读写描述
31:24Priority, byte offset 3R/W对于每一个中断,都有对应的8位数据用来描述:它的优先级。 每个优先级字段都对应一个优先级值,值越小,相应中断的优先级越高
23:16Priority, byte offset 2R/W
15:8Priority, byte offset 1R/W
7:0Priority, byte offset 0R/W

对于一个中断,如何设置它的优先级(Priority),首先找到对应的GICD_IPRIORITYRn寄存器,即n是多少?还要确定使用这个寄存器里哪一个字节。

对于interrtups ID m,如下计算:
n = m DIV 4,GICD_IPRIORITYRn里的n就确定了;
GICD_IPRIORITYRn在GIC内部的偏移地址是多少?0x400+(4*n)
使用GICD_IPRIORITYRn中4个字节中的哪一个来表示interrtups ID m的优先级?
byte offset = m mod 4。
byte offset 0对应寄存器里的[7:0];
byte offset 1对应寄存器里的[15:8];
byte offset 2对应寄存器里的[23:16];
byte offset 3对应寄存器里的[31:24]。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

1.10 Interrupt Processor Targets Registers, GICD_ITARGETSRn

中断处理目标寄存器, 指定中断目标CPU。

img

位域名读写描述
31:24CPU targets, byte offset 3R/W对于每一个中断,都有对应的8位数据用来描述:这个中断可以发给哪些CPU。 处理器编号从0开始,8位数里每个位均指代相应的处理器。 例如,值0x3表示将中断发送到处理器0和1。 当读取GICD_ITARGETSR0~GICD_ITARGETSR7时,读取里面任意字节,返回的都是执行这个读操作的CPU的编号。
23:16CPU targets, byte offset 2R/W
15:8CPU targets, byte offset 1R/W
7:0CPU targets, byte offset 0R/W

对于一个中断,如何设置它的目标CPU?优先级(Priority),首先找到对应的GICD_ITARGETSRn寄存器,即n是多少?还要确定使用这个寄存器里哪一个字节。

对于interrtups ID m,如下计算:
n = m DIV 4,GICD_ITARGETSRn里的n就确定了;
GICD_ITARGETSRn在GIC内部的偏移地址是多少?0x800+(4*n)
使用GICD_ITARGETSRn中4个字节中的哪一个来表示interrtups ID m的目标CPU?
byte offset = m mod 4。
byte offset 0对应寄存器里的[7:0];
byte offset 1对应寄存器里的[15:8];
byte offset 2对应寄存器里的[23:16];
byte offset 3对应寄存器里的[31:24]。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

1.11 Interrupt Configuration Registers, GICD_ICFGRn

定义中断的触发模式。

img

位域名读写描述
[2F+1:2F]Int_config, field FR/W对于每一个中断,都有对应的2位数据用来描述:它的边沿触发,还是电平触发。 对于Int_config [1],即高位[2F + 1],含义为: 0:相应的中断是电平触发; 1:相应的中断是边沿触发。 对于Int_config [0],即低位[2F],是保留位。

对于一个中断,如何找到GICD_ICFGRn并确定相应的位域F?

对于interrtups ID m,如下计算:
n = m DIV 16,GICD_ICFGRn里的n就确定了;
GICD_ICACTIVERn 在GIC内部的偏移地址是多少?0xC00+(4*n)
F = m mod 16。
  • 1
  • 2
  • 3
  • 4

1.12 Identification registers: Peripheral ID2 Register, ICPIDR2

img

位域名读写描述
[31:0]-R/W由实现定义
[7:4]ArchRevR该字段的值取决于GIC架构版本: 0x1:GICv1; 0x2:GICv2。
[3:0]-R/W由实现定义

2.CPU interface寄存器描述

2.1 CPU Interface Control Register, GICC_CTLR

此寄存器用来控制CPU interface传给CPU的中断信号。对于不同版本的GIC,这个寄存器里各个位的含义大有不同。以GICv2为例,有如下2种格式:

img

​ 以GIC2 with Security Extensions, Non-secure copy 为例,GICC_CTLR中各个位的定义如下:

位域名读写描述
[31:10]-保留
[9]EOImodeNSR/W控制对GICC_EOIR和GICC_DIR寄存器的非安全访问: 0:GICC_EOIR具有降低优先级和deactivate中断的功能; 对GICC_DIR的访问是未定义的。 1:GICC_EOIR仅具有降低优先级功能; GICC_DIR寄存器具有deactivate中断功能。
[8:7]-保留
[6]IRQBypDisGrp1R/W当CPU interface的IRQ信号被禁用时,该位控制是否向处理器发送bypass IRQ信号: 0:将bypass IRQ信号发送给处理器; 1:将bypass IRQ信号不发送到处理器。
[5]FIQBypDisGrp1R/W当CPU interface的FIQ信号被禁用时,该位控制是否向处理器发送bypass FIQ信号: 0:将bypass FIQ信号发送给处理器; 1:旁路FIQ信号不发送到处理器
[4:1]-保留
[0]-R/W使能CPU interface向连接的处理器发出的组1中断的信号: 0:禁用中断信号 1:使能中断信号

2.2 Interrupt Priority Mask Register, GICC_PMR

提供优先级过滤功能,优先级高于某值的中断,才会发送给CPU。 通过此寄存器可设置优先级阈值,只有高于该值的中断会被传递给CPU。

img

位域名读写描述
[31:8]-保留
[7:0]-R/W优先级高于这个值的中断,才会发送给CPU

[7:0]共8位,可以表示256个优先级。但是某些芯片里的GIC支持的优先级少于256个,则某些位为RAZ / WI,如下所示:

如果有128个级别,则寄存器中bit[0] = 0b0,即使用[7:1]来表示优先级;
如果有64个级别,则寄存器中bit[1:0] = 0b00,即使用[7:2]来表示优先级;
如果有32个级别,则寄存器中bit[2:0] = 0b000,即使用[7:3]来表示优先级;
如果有16个级别,则寄存器中bit[3:0] = 0b0000,即使用[7:4]来表示优先级;
  • 1
  • 2
  • 3
  • 4

注意:imx6ull最多为32个级别

2.3 Binary Point Register, GICC_BPR

此寄存器用来把8位的优先级字段拆分为组优先级和子优先级,组优先级用来决定中断抢占。

img

位域名读写描述
[31:3]-保留
[2:0]Binary pointR/W此字段的值控制如何将8bit中断优先级字段拆分为组优先级和子优先级,组优先级用来决定中断抢占。 更多信息还得看看GIC手册。

2.4 Interrupt Acknowledge Register, GICC_IAR

CPU读此寄存器,获得当前中断的interrtup ID。

img

位域名读写描述
[31:13]-保留
[12:10]CPUIDR对于SGI类中断,它表示谁发出了中断。例如,值为3表示该请求是通过对CPU interface 3上的GICD_SGIR的写操作生成的。
[9:0]Interrupt IDR中断ID

2.5 Interrupt Register, GICC_EOIR

用于通知GIC该中断已处理完毕。写此寄存器,表示某中断已经处理完毕。GICC_IAR的值表示当前在处理的中断,把GICC_IAR的值写入GICC_EOIR就表示中断处理完了。

img

位域名读写描述
[31:13]-保留
[12:10]CPUIDW对于SGI类中断,它的值跟GICD_IAR. CPUID的相同。
[9:0]EOIINTIDW中断ID,它的值跟GICD_IAR里的中断ID相同

3.GIC编程

?gic.c?gic.h

使用cortex A7处理器的芯片,一般都是使用GIC v2的中断控制器。处理GIC的基地址不一样外,对GIC的操作都是一样的。在NXP官网可以找到IMX6ULL的SDK包i.MX 6ULL应用处理器|Arm® Cortex®-A7单核,频率为900 MHz。

下载后可以参考这个文件:core_ca7.h,里面含有GIC的初始化代码。

注:本文转载自blog.csdn.net的憧憬一下的文章"https://blog.csdn.net/caiji0169/article/details/143754860"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top