首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

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

资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git...多级中断控制器处理流程 参考资料: linux kernel的中断子系统之(七):GIC代码分析 使用逐步演进的方法才能形象地理解。 1....一级中断控制器处理流程 对于irq_desc,内核有两种分配方法: 一次分配完所有的irq_desc 按需分配(用到某个中断才分配它的irq_desc 现在的内核基本使用第1种方法。...假设要使用UART模块,它发出的中断连接到GIC的32号中断,分配的irq_desc序号为16 在GIC domain中会记录(32, 16) 那么注册中断时就是:request_irq(16, ......假设这4个irq_desc的序号为100~103,在GPIO domain中记录(0,100) (1,101)(2,102) (3,103) 对于KEY,注册中断时就是:request_irq(102

2.1K20

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

本节目标:    分析在linux中的中断是如何运行的,以及中断3大结构体:irq_desc、irq_chip、irqaction 在裸板程序中(参考stmdb和ldmia详解): 1.按键按下, 2...., { r0-r12,pc }^ //^表示将spsr的值复制到cpsr,因为异常返回后需要恢复异常发生前的工作状态 在linux中: 需要先设置异常向量地址(参考linux应用手册P412): 在ARM...而linux内核中异常向量基地址是0xffff0000(虚拟地址), 位于代码arch/cam/kernel/traps.c,代码如下: void __init trap_init(void) {...[irq]*/ struct irq_desc *desc = irq_desc + irq; // irq_desc是个数组(位于kernel/irq/handle.c) if (irq >=...desc = irq_desc + irq; //在irq_desc结构体数组中找到对应的中断   ... ...

1.5K80

第3阶段——内核启动分析之start_kernel初始化函数(5)

start_kernel初始化函数(init/main.c) stext函数启动内核后,就开始进入start_kernel初始化各个函数, 下面只是浅尝辄止的描述一下函数的功能,很多函数真正理解需要对linux...通过这个标记可以帮助我们知道是否在”early bootup code”,也可以通过这个标志警告是有无效的终端打开 early_boot_irqs_off(); //每一个中断都有一个IRQ描述符(struct irq_desc...//这个函数的主要作用是设置所有的 IRQ描述符(struct irq_desc)的锁是统一的锁, //还是每一个IRQ描述符(struct irq_desc)都有一个小锁。...//初始化系统中支持的最大可能的中断描述结构struct irqdesc变量数组irq_desc[NR_IRQS], //把每个结构变量irq_desc[n]都初始化为预先定义好的坏中断描述结构变量...//这样我们就知道了其实这个函数是linux内核中一个cpu性能测试函数。

1.7K100

Linux系统驱动之层级中断控制器驱动程序编写

驱动提供,不需要handleB 假设GPIO模块下有4个引脚,都可以产生中断,分别链接到GIC的100~103号中断 GPIO就是一个层级中断控制器 对于GPIO模块中0~3这四个hwirq,分配四个irq_desc...,用到时再分配 假设这4个irq_desc的序号为234~237 在GIC domain中记录(100,234) (101,235)(102,236) (103,237) 在GPIO domain...按下KEY时: 程序从GIC中读取寄存器知道发生了102号中断,通过GIC irq_domain可以知道virq为236 处理virq 236号中断:调用irq_desc[236].handle_irq...,即handleA mask/ack中断: 调用irq_desc[236].irq_data->irq_chip的函数,即irq_dataB 它会调用父级...irq_dataA->irq_chip的函数 调用irq_desc[236].action链表中用户注册的函数 unmask中断: 调用irq_desc[236].irq_data->irq_chip

1.4K21

Exynos4412 中断处理流程详解

Linux 中,当外设触发中断后,大体处理流程如下:   a -- 具体CPU architecture相关的模块会进行现场保护,然后调用machine driver对应的中断处理handler;   ...CPU architecture相关的模块会进行现场恢复;   总结下来,整个过程可以分为三部分:1、硬件处理部分;2、汇编处理部分;3、C 处理部分;   下面我们来追踪一下代码,了解当中断发生时,Linux...  set_irq_regs(old_regs);   }   主要调用generic_handle_irq(irq)   3、generic_handle_irq(irq)  include/linux...中的成员   5、irq_desc结构体   Linux内核将所有中断统一编号,使用irq_desc结构来描述中断:每个数组项对应一个中断(也可能是一组中断,它们使用共同的中断号),里面记录了中断的名称...,中断状态,中断标记,并提供硬件访问函数(清除,屏蔽,使能中断),提供了这个中断的处理函数的入口,通过它可以调用用户注册的中断处理函数   include/linux/irq.h   {   ..

98830

Linux 中断子系统(一):框架

中断是大家用的最多的功能,不管是单片机还是 Linux 系统,都需要用到中断,对它的深入理解是非常必要的。 为什么需要中断?...机器设备的级联,因为得益于事先已经知道子控制器的硬件连接信息,内核可以方便地为子控制器保留相应的 irq_desc 结构和 irq 编号,处理起来相对简单。...设备级别的级联则不一样,驱动程序必须动态地决定组合设备中各个子设备的 irq 编号和 irq_desc 结构。我只讨论机器级别的级联,设备级别的关联可以使用同样的原理。...第二层是 Linux 内核提供的通用中断处理模块,这一层存在的意义在于,希望用户在第一层写的驱动在移植的时候更方便,保持接口不变,不让用户直接使用芯片原厂的 API,而是 Linux 的 API。...关于中断子系统,我写了八篇文章,从头到尾讲了一遍,大家可以去我的blog查看: http://www.linuxer.vip/linux-interrupt1/

3.2K10
领券