首页
学习
活动
专区
工具
TVP
发布

Linux Irq domain

可以参考内核文档IRQ-domain.txt 为什么引入IRQ-Domain 当早期的系统只存在一个interrupt-controller的时候,而且中断数目也不多的时候,一个很简单的做法就是一个中断对应到...interrupt-contoller的一个,可以说是简单的线性映射 而当一个系统中有多个interrupt-controller的时候,而且中断也逐渐增加。...linux内核为了应对此问题,引入了IRQ-domain的概念 irq-domain的引入相当于一个中断控制器就是一个irq-domain。就是一个中断区域。...而Hwirq-num就是dts中配置的irq 而第一列就是对应的softirq-num,也就是request_irq时传入的irq 中断控制器级联的情况图 hwirq到softirq的映射 当开机之后...函数进行hwirq到softirq的map 首先dts中配置的中断都是hwirq 刚开机hwirq没有对应的softirq的,所以第一次开机需要进行hwirq和softirq之间建立map int irq_domain_alloc_descs

1.2K20
您找到你想要的搜索结果了吗?
是的
没有找到

5.分析内核中断运行过程,以及中断3大结构体:irq_desc、irq_chip、irqaction(详解)

本节目标:    分析在linux中的中断是如何运行的,以及中断3大结构体:irq_desc、irq_chip、irqaction 在裸板程序中(参考stmdb和ldmia详解): 1.按键按下, 2....r5, lr   get_irqnr_and_base r0, r6, r5, lr // get_irqnr_and_base:获取中断,r0=中断...; 3).清中断 asmlinkage void __exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs) //irq:中断...*regs:发生中断前的各个寄存器基地址 { struct pt_regs *old_regs = set_irq_regs(regs); /*根据irq中断,找到哪个中断, *desc =irq_desc...根据中断和desc,调用函数指针,进入中断处理, irq_finish(irq); irq_exit(); set_irq_regs(old_regs); } 上面主要是执行desc_handle_irq

1.4K80

Linux中断处理

中断处理 - 上半部(硬中断) 由于 APIC中断控制器 有点小复杂,所以本文主要通过 8259A中断控制器 来介绍Linux中断的处理过程。...,handler 的第一个参数是中断,第二个参数是设备对应的ID,第三个参数是中断发生时由内核保存的各个寄存器的值。...(irq); // 注册proc文件系统 return 0; } setup_irq() 函数比较简单,就是通过 irq 来查找对应的 irq_desc_t 结构,并把新的 irqaction...regs) { int irq = regs.orig_eax & 0xff; /* 获取IRQ */ int cpu = smp_processor_id(); irq_desc_t...return 1; } do_IRQ() 函数首先通过IRQ获取到其对应的 irq_desc_t 结构,注意的是同一个中断有可能发生多次,所以要判断当前IRQ是否正在被处理当中(判断 irq_desc_t

6.5K20

Linux中断 - IDT

中断描述符项定义 当中断发生,cpu获取到中断向量后,查找IDT中断描述符表得到相应的中断描述符,再根据中断描述符记录的信息来作权限判断,运行级别转换,最终调用相应的中断处理程序; 这里涉及到Linux...int)regs->bp); #endif /* CONFIG_IA32_EMULATION */ } syscall_return_slowpath(regs); } 通过中断向量...硬件中断相关IDT的初始化也是在Linux启动时完成,在start_kernel中通过调用init_IRQ完成,我们来看一下: void __init init_IRQ(void) { int...pushq $(~vector+0x80) /* Note: always in signed byte range */ jmp common_interrupt 即先将中断压栈...} exiting_irq(); set_irq_regs(old_regs); return 1; } 首先根据中断向量获取到对应的中断描述符irq_desc,

6.5K10

Linux系统驱动之两类中断控制器处理流程_链式和层级

处理流程对比 在这里插入图片描述 参考资料: linux kernel的中断子系统之(七):GIC代码分析 Linux 4.9.88内核源码 Linux-4.9.88\drivers...它底下的4个中断触发时,都会导致GIC的33中断被触发。 处理中断时,需要分辨:是谁触发了GIC 33中断?这需要读取"chained intc"中的寄存器。...按下KEY时: 程序从GIC中读取寄存器知道发生了33中断,通过GIC irq_domain可以知道virq为17 处理virq 17中断:调用irq_desc[17].handle_irq...,确定是GPIO里2引脚发生中断 通过GPIO irq_domain可以知道virq为102 处理virq 102中断:调用irq_desc[102].handle_irq,即handleC...按下KEY时: 程序从GIC中读取寄存器知道发生了102中断,通过GIC irq_domain可以知道virq为236 处理virq 236中断:调用irq_desc[236].handle_irq

1K41

韦东山:剥丝抽茧分析linux中断系统的重要数据结构

最核心的结构体是irq_desc,之前为了易于理解,我们说在Linux内核中有一个中断数组,对于每一个硬件中断,都有一个数组项,这个数组就是irq_desc数组。...它就是个中转站,里面有irq_chip指针 irq_domain指针,都是指向别的结构体。 比较有意思的是irq、hwirq,irq是软件中断,hwirq是硬件中断。...比如上面我们举的例子,在GPIO中断B是软件中断,可以找到irq_desc[B]这个数组项;GPIO里的第x中断,这就是hwirq。 谁来建立irq、hwirq之间的联系呢?...比如GPIO控制器里有第1中断,UART模块里也有第1中断,这两个“第1中断”是不一样的,它们属于不同的“域”──irq_domain。...但是我们在驱动中会使用request_irq(irq, handler)这样的函数来注册中断irq是什么?它是软件中断,它应该从“gpio1的第5中断”转换得来。 谁把hwirq转换为irq

1K20

Linux系统GIC驱动程序分析

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...假设要使用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

4.1K21

Linux驱动实践:一起来梳理【中断】的前世今生(附代码)

目录 Linux 中断的知识点梳理 中断的分类 中断中断向量 中断服务程序ISR 上半部分和下半部分 中断处理的注册和注销 API 实操:捕获键盘中断 示例代码 驱动程序传参 IO编址:IO端口和IO...中断中断向量 这张图只要记住中断中断向量的关系就可以了: 中断中断控制器(PIC/APIC)相关; 中断向量与 CPU 相关,用来查找中断处理函数的入口地址; 中断服务例程 ISR 中断服务程序...(unsigned int irq, void *dev_id); 参数说明: irq: 硬件中断; dev_id: 中断程序的唯一标识; 实操:捕获键盘中断 示例代码 有了上面的知识铺垫,下面就来实操一下.../module.h> #include // 中断 static int irq; // 驱动程序名称 static char * devname;...向驱动程序传参 示例代码中,在调用 request_irq 时,需要指定中断和驱动程序的名称。 这两个参数是在加载驱动模块的时候,从命令行传入的。

1.1K30

Linux系统驱动之GIC驱动程序对中断的处理流程

一级中断控制器处理流程 2. 多级中断控制器处理流程 参考资料: 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...读取GPIO寄存器,确定是GPIO里2引脚发生中断 通过GPIO irq_domain可以知道virq为102 调用irq_desc[102]中的handleA函数,它的作用是调用action链表中用户注册的函数

2.1K20

内核中断系统中的设备树

#endif 9997: .endm linux-4.19-rc3\kernel\irq\handle.c e. handle_arch_irq的处理过程: 请看视频和图片 读取寄存器获得中断信息...使用irq_desc[virq].irq_data.chip的函数清中断 对于0中断,加上一个或控制器,形成一个共享中断,可以控制网卡中断irq_net和摄像头中断irq_camera, 在0中断上有两个设备...从中断开始依次查找,直到找到最后空闲项, 如果bit=0则虚拟中断就是2 虚拟中断保存在irq_domain结构体中 irq_domain     linear_revmap[hwirq]...,…),中断是通过宏方式进行定义的,所以直接使用中断进行注册 如何使用新型中断,注册irq 先在设备树中表明要使用那个中断,内核解析设备树时才会把这个中断和某一个虚拟中断挂钩,这些信息会转换成...-4.19-rc3.tar.gz 打上补丁: cd linux-4.19-rc3 patch -p1 < …/linux-4.19-rc3_device_tree_for_irq_jz2440.

1.1K21

linux 中断机制《Rice linux 学习笔记》

Linux中断的相关函数: 1、注册中断函数: 中断处理函数结构: typedef irqreturn_t (*irq_handler_t)(int, void*); 注册中断函数:int request_irq...dev:与request_irq的参数dev必须一致,将request_irq指定的dev传递给这个参数; Linux中断处理分析: 第一种方式:应用层的读,不管什么情况下,都会返回。...其中:IRQ_EINT0:按键对应引脚的中断。 button_irq:该中断指向中断函数。 IRQT_BOTHEDGE:中断类型标志,这里采用双边沿出发。 1. IRQT_NOEDGE 2....其中:IRQ_EINT0:按键对应引脚的中断。与加载的中断一致。...其中函数参数:irq中断对应的中断。 Dev_id:与请求中断函数的第五个参数保持一致。 通过wake_up_interruptible()函数实现等待队列的唤醒。

4.7K10
领券