资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git...视频观看 百问网驱动大全 第四章GIC介绍与编程 资料下载 视频观看 4.1 GIC介绍 4.1.1 配置 4.1.2 初始化 4.1.3 GIC中断处理 4.2 GIC的寄存器 4.2.1 Distributor...下图是GIC控制器的逻辑结构: 4.1.1 配置 GIC作为内存映射的外围设备,被软件访问。...如果此字段为0b00000,则GIC不会实现配置锁定。 如果GIC没有实现安全扩展,则保留该字段。...处理GIC的基地址不一样外,对GIC的操作都是一样的。 在NXP官网可以找到IMX6ULL的SDK包。 下载后可以参考这个文件:core_ca7.h,里面含有GIC的初始化代码。
资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git...GIC中断处理流程源码分析 参考资料: linux kernel的中断子系统之(七):GIC代码分析 Linux 4.9.88内核源码 Linux-4.9.88\drivers\irqchip...\irq-gic.c Linux-4.9.88/arch/arm/boot/dts/imx6ull.dtsi Linux 5.4内核源码 Linux-5.4\drivers\irqchip\irq-gic.c...Linux-5.4/arch/arm/boot/dts/stm32mp151.dtsi 1....); 把宏IRQCHIP_DECLARE展开: // include\linux\irqchip.h #define IRQCHIP_DECLARE(name, compat, fn) OF_DECLARE
我们使用的是 IP 核,也就是 gic400、gic500、gic600。支持对应的架构。 gic400,支持 GIC-v2 架构。 gic500,支持 GIC-v3 架构。...gic600,支持 GIC-v3 和 GIC-v4 架构。 GIC-v2 GIC V2 最多支持 8 个核。...ARM 会根据 GIC 版本的不同研发出不同的 IP 核,半导体厂商直接购买对应的 IP 核即可,比如 ARM 针对 GIC V2 就开发出 了 gic400 这个中断控制器 IP 核。...GIC-v3 GIC-v3 架构有改变,中断号也变多了,不过还是向后兼容 GIC-v2 的。...GIC-v3 逻辑图总结如下: GIC -v2 架构寄存器: 来源于 GIC-v2 手册最后几页: 这里的 alias 别名很有意思,说明了这个寄存器是干嘛的: GIC -v3的寄存器不一样,
今天和大侠简单聊一聊英特尔 Altera系列 cyclone V HPS GIC,话不多说,上货。...一、CYCLONE V GIC配置 Cyclone v使用双核ARM CORTEX A9硬核处理器,MPU系统框图如下: ? 由上面图可以看出,双核CORTEXA9共同使用一个GIC,pl390。...而橙色箭头方向表示GIC提供了一个AXI接口,可以用于访问distributor,对GIC进行配置。蓝色表示软件可以通过CPU接口直接编程GIC,产生中断,该中断具有广播性质。...通用GIC系统框图如下所示: ? 由上图可以看到GIC明显分成了Distributor与cpu接口两部分。所有的中断都经过Distributor,SGI中断只是能edge触发。...中断结束寄存器(GICC_EOIR) 当中断服务程序(ISR)中的中断处理完成时,记录相应的中断ID,并通知gic已执行eoi处理。写该寄存器通过GIC中断处理完毕。 ? ?
资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git...多级中断控制器处理流程 参考资料: linux kernel的中断子系统之(七):GIC代码分析 使用逐步演进的方法才能形象地理解。 1....假设要使用UART模块,它发出的中断连接到GIC的32号中断,分配的irq_desc序号为16 在GIC domain中会记录(32, 16) 那么注册中断时就是:request_irq(16, ......发生UART中断时 程序从GIC中读取寄存器知道发生了32号中断,通过GIC irq_domain可以知道virq为16 调用irq_desc[16]中的handleA函数,它的作用是调用action...按下KEY时: 程序从GIC中读取寄存器知道发生了33号中断,通过GIC irq_domain可以知道virq为16 调用irq_desc[16]中的handleB函数 handleB
本节描述下ARM架构下的中断控制器,The Generic Interrupt Controller(GIC) ARM架构下GIC支持好几个版本,GIC-v1, GIC-v2, GIC-v3, GIC-v4...本系列文章重点聚焦在GIC-V3版本,而GIC-V3版本的典型代表就是GIC-500 关于GIC-500的特性 GIC-500可以最大支持128Cores GIC-500目前只支持ARMv8架构 GIC...支持四种中断类型 支持CPU-Interface, Distributor GIC-500和CPU之间的框图 ?...其实这就是GIC支持的几种中断类型 GIC是通过AXI4-Stream专用接口连接到CPU上的 GIC-500的内部布局 ?...,GIC-v2.
处理流程对比 在这里插入图片描述 参考资料: linux kernel的中断子系统之(七):GIC代码分析 Linux 4.9.88内核源码 Linux-4.9.88\drivers...\gpio\gpio-mxc.c Linux-4.9.88\arch\arm\boot\dts\imx6ull.dtsi Linux 5.4内核源码 Linux-5.4\drivers\pinctrl...\stm32\pinctrl-stm32mp157.c Linux-5.4\drivers\irqchip\irq-stm32-exti.c Linux-5.4\arch\arm\boot\dts\stm32mp151...它底下的4个中断触发时,都会导致GIC的33号中断被触发。 处理中断时,需要分辨:是谁触发了GIC 33号中断?这需要读取"chained intc"中的寄存器。...它底下的4个中断,跟GIC中的4个中断一一对应。 处理GIC 100~103号中断时,不需要读取"hierarchy intc"的寄存器来分辨是谁触发了中断。 2.
Linux内核中断初始化流程如下: start_kernel()-> init_IRQ()-> irqchip_init()-> of_irq_init(...中断控制器GICv3初始化流程如下: IRQCHIP_DECLARE(gic_v3, "arm,gic-v3", gic_of_init); gic_of_init()-> gic_init_bases...()-> set_handle_irq(gic_handle_irq) ## 设置handle_arch_irq = gic_handle_irq,中断触发时调用 重点关注: 1、IRQCHIP_DECLARE...宏IRQCHIP_DECLARE解析过程: ## 1.宏用法 IRQCHIP_DECLARE(gic_v3, "arm,gic-v3", gic_of_init); ## 2.宏定义 #define IRQCHIP_DECLARE...gic_of_init : gic_of_init } 2、gic_handle_irq() 功能:该函数通过读取ICC_IAR1_EL1寄存器获取INTID,根据INTID判断对应的中断,调用相关的中断处理函数
怎么触发中断 可以通过devmem命令直接写GIC的PENDING寄存区。 GICD_ISPENDRn有多个寄存器,每个寄存器中每一位对应一个GIC中断,写入1就可以触发该中断。...STM32MP157的GIC Distributor 地址是:0xa0021000 芯片 SPI中断号 GIC中断号 n,bit GICD_ISPENDRn地址 命令 IMX6LLL 122...STM32MP157 export ARCH=arm export CROSS_COMPILE=arm-buildroot-linux-gnueabihf- export PATH=$PATH:/home.../book/100ask_stm32mp157_pro-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin 2..../ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin 3.2 编译、替换设备树 1.
确定中断号n 查看芯片手册,选择一个保留的、未使用的GIC SPI中断即可。...怎么触发中断 可以通过devmem命令直接写GIC的PENDING寄存区。 GICD_ISPENDRn有多个寄存器,每个寄存器中每一位对应一个GIC中断,写入1就可以触发该中断。...STM32MP157 export ARCH=arm export CROSS_COMPILE=arm-buildroot-linux-gnueabihf- export PATH=$PATH:/home.../book/100ask_stm32mp157_pro-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin 2..../ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin 3.2 编译、替换设备树 1.
Linux 中断相关节点 /proc/interrupts cat 这个节点,会打印系统中所有的中断信息,如果是多核CPU,每个核都会打印出来。...更多介绍请参看 Linux 内核源代码自带的文档:linux-4.14/Documentation/IRQ-affinity.txt /proc/irq/{IRQ}/smp_affinity /proc...从GIC角度看,GIC 会发送高优先级中断请求给CPU。但是CPU不一定响应!!!...在中断处理过程中,主要是 GIC 和 CPU 的交互,即便 GIC 支持高优先级中断抢占正在执行的低优先级中断,发信号给 CPU core,但是 CPU core 可以不处理,因为 Linux 中当 CPU...对于这类中断,linux kernel有一套复杂的机制来处理,你可以通过command line参数(noirqdebug)来控制开关该功能。
linux驱动支持GICv1, GICv2, GICv3, GICv4驱动,本节我们重点来描述下GICv3的驱动初始化,结合ARM-Cortex平台详细描述 intc: interrupt-controller...- GIC CPU interface (GICC) - GIC Hypervisor interface (GICH) - GIC Virtual CPU interface (GICV...(typer); if (gic_irqs > 1020) gic_irqs = 1020; gic_data.irq_nr = gic_irqs; gic_data.domain...gic_smp_init(); gic_dist_init(); gic_cpu_init(); gic_cpu_pm_init(); return 0; out_free...); 如果中断号小于16,则此中断号是IPI中断,是core之间用于通信的中断,则会调用handle_IPI(irqnr, regs);去处理对应的中断 而linux中用一个irq chip结构体来描述一个中断控制器
Linux 中断管理机制 GIC 硬件原理 GIC,Generic Interrupt Controller。是ARM公司提供的一个通用的中断控制器。...驱动 这里主要分析 linux kernel 中 GIC v3 中断控制器的代码(drivers/irqchip/irq-gic-v3.c)。...linux 内核为了应对此问题,引入了 irq_domain 的概念。 irq_domain 的引入相当于一个中断控制器就是一个 irq_domain。这样一来所有的中断控制器就会出现级联的布局。...每一个中断控制器对应多个中断号, 而硬件中断号在不同的中断控制器上是会重复编码的, 这时仅仅用硬中断号已经不能唯一标识一个外设中断,因此 linux kernel 提供了一个虚拟中断号的概念。...包括从设备树获取中断源信息的解析,硬件中断号到 Linux 中断号的映射关系,irq_desc 等各个结构的分配及初始化、中断的注册等等,总而言之,就是完成静态关系创建,为中断处理做好准备。
硬中断和虚拟中断号 在Linux 内核笔记之高层中断处理一文中,介绍了ARM gic中断控制器对于硬中断的处理过程。...gic的中断处理程序是从ack一个硬件中断开始的, 在gic的中断处理过程中,会根据中断的映射去寻找对应的虚拟中断号, 再去进行后续的中断处理。...对于软件工程师而言,我们不需要care是中断哪个中断控制器的第几个中断号, 因此linux kernel提供了一个虚拟中断号的概念。...irq_domain 接下来讨论硬件中断号是如何映射到虚拟中断号的linux kernel提供irq_domain的管理框架, 将hwirq映射到虚拟中断号上。...interrupt controller初始化的过程中,注册irq domain 以gic 注册irq_domain为例 +-> gic_of_init +-> gic_init_bases +-
资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git...沿着中断的处理流程,GIC之下的中断控制器涉及这4个重要部分:handleB、GPIO Domain、handleC、irq_chip handleB:处理GIC 33号中断,handleB由GPIO...驱动提供 屏蔽GIC 33号中断:调用irq_dataA的irq_chip的函数,irq_dataA由GIC驱动提供 细分并处理某个GPIO中断: 读取GPIO寄存器得到hwirq,通过...GPIO Domain转换为virq,假设是102 调用irq_desc[102].handle_irq,即handleC 清除GIC 33号中断:调用irq_dataA的irq_chip的函数,由GIC...对于这些虚拟的中断控制器,我们没有真实按键,通过devmem指令写GIC的PENDING寄存器触发中断。 3. 编程 会涉及2个驱动程序:虚拟的中断控制器驱动程序,按键驱动程序,以及对应的设备树。
作者:韦东山 正文: 能弄清楚下面这个图,对Linux中断系统的掌握也基本到位了。 ?...外部设备1、外部设备n共享一个GPIO中断B,多个GPIO中断汇聚到GIC(通用中断控制器)的A号中断,GIC再去中断CPU。...那么软件处理时就是反过来,先读取GIC获得中断号A,再细分出GPIO中断B,最后判断是哪一个外部芯片发生了中断。...显然中断A是CPU感受到的顶层的中断,GIC中断CPU时,CPU读取GIC状态得到中断A。...② 模块的中断处理函数: 比如对于GPIO模块向GIC发出的中断B,它的处理函数是irq_desc[B].handle_irq。
初始化GIC控制器,最后通过gic_enable_irq使能按键对应GIC中断号使用的中断。 ...函数作用是屏蔽GPIO管脚中断 get_gic_base函数作用是得到GIC寄存器地址,通过GIC寄存器地址就可以访问GIC内部的寄存器。...1.5.2.2 修改Makefile PREFIX=arm-linux-gnueabihf- CC=$(PREFIX)gcc LD=$(PREFIX)ld AR=$(PREFIX)ar OBJCOPY=...nostdinc -fno-builtin -I$(INCLUDEDIR) LDFLAGS := -L /usr/arm/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf.../lib/gcc/arm-linux-gnueabihf/6.2.1 -lgcc objs := start.o main.o led.o key.o interrupt.o uart.o eabi_compat.o
A53(PS)使用Arm GIC-400,属于GICv2架构。...如果想了解GIC-400的具体细节,请参考文档APU GIC: CoreLink GIC-400 Generic Interrupt Controller, DDI 0471B, r0p1。...同时,GIC的Linux Kernel驱动内部有一个表,用于转换硬件中断号和软件中断号。...Linux Kernel使用的软件中断号,是整个Linux Kernel系统的,需要在Linux Kernel范围内保持唯一。...检查Linux中断信息 Linux在/proc/interrupts文件里,提供了系统的中断信息。
资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git...视频观看 百问网驱动大全 IMX6ULL的GPIO驱动源码分析 参考资料: Linux 4.x内核文档 Linux-4.9.88\Documentation\gpio Linux-4.9.88...\Documentation\devicetree\bindings\gpio\gpio.txt Linux-4.9.88\drivers\gpio\gpio-mxc.c Linux-4.9.88\arch...{ compatible = "fsl,imx6ul-gpio", "fsl,imx35-gpio"; reg = ; interrupts = , ; gpio-controller; #gpio-cells =
所以软件上的“中断控制器”就有很多个:GIC、GPIO1、GPIO2等等。 GPIO1连接到GIC,GPIO2连接到GIC,所以GPIO1的父亲是GIC,GPIO2的父亲是GIC。...假设GPIO1有32个中断源,但是它把其中的16个汇聚起来向GIC发出一个中断,把另外16个汇聚起来向GIC发出另一个中断。...这就意味着GPIO1会用到GIC的两个中断,会涉及GIC里的2个hwirq。 这些层级关系、中断号(hwirq),都会在设备树中有所体现。...它提供中断屏蔽、中断状态查询功能,实际上这些功能在GIC里也实现了,个人觉得有点多余。除此之外,它还提供唤醒功能,这才是保留它的原因。...label = "User Button"; gpios = ; gpio-key,wakeup; linux
领取专属 10元无门槛券
手把手带您无忧上云