网站开发实训总结,天津企业网站设计哪家好,建网站备案好麻烦,用凡科做网站好弄吗今天呢#xff0c;我们就来具体的讲一下GIC的驱动源码啦#xff0c;这个才是重点来着#xff0c;我们来看看#xff1a;
GIC中的重要函数和结构体#xff1a;
沿着中断的处理流程#xff0c;GIC涉及这4个重要部分#xff1a; CPU从异常向量表中调用handle_arch_irq我们就来具体的讲一下GIC的驱动源码啦这个才是重点来着我们来看看
GIC中的重要函数和结构体
沿着中断的处理流程GIC涉及这4个重要部分 CPU从异常向量表中调用handle_arch_irq这个函数指针是有GIC驱动设置的 GIC才知道怎么判断发生的是哪个GIC中断 从GIC获得hwirq后要转换为virq需要有GIC Domain 调用irq_desc[virq].handle_irq函数这也应该由GIC驱动提供 处理中断时要屏蔽中断、清除中断等这些函数保存在irq_chip里由GIC驱动提供
从硬件上看GIC的功能是什么 可以使能、屏蔽中断 发生中断时可以从GIC里判断是哪个中断
在内核里使用gic_chip_data结构体表示GICgic_chip_data里有什么 irq_chip中断使能、屏蔽、清除放在irq_chip中的各个函数里实现 irq_domain 申请中断时 在设备树里指定hwirq、flag可以使用irq_domain的函数来解析设备树 根据hwirq可以分配virq把(hwirq, virq)存入irq_domain中 发生中断时从GIC读出hwirq可以通过irq_domain找到virq从而找到处理函数
所以GIC用gic_chip_data来表示gic_chip_data中重要的成员是irq_chip、irq_domain。
GIC初始化过程 内核支持多种GIC
按照设备树的套路 驱动程序注册platform_driver 它的of_match_table里有多个of_device_id表示能支持多个设备 有多种版本的GIC在内核为每一类GIC定义一个结构体of_device_id并放在一个段里 把宏IRQCHIP_DECLARE展开 在设备树里指定GIC
在设备树中指定GIC内核驱动程序根据设备树来选择、初始化GIC。
drivers\irqchip\irqchip.c中并没有定义一个platform_driver但是套路是一样的。 调用过程 of_irq_init: 内核有一个__irqchip_of_table数组里面有多个of_device_id表示多种GIC 要使用哪类GIC在设备树里指定 根据设备树找到__irqchip_of_table树组中对应的项调用它的初始化函数 IRQCHIP_DECLARE(cortex_a7_gic, arm,cortex-a7-gic, gic_of_init); 申请GIC中断
在设备树里指定中断 内核对设备树的处理
函数调用过程如下使用图片形式可以一目了然 函数调用过程如下使用文字格式方便复制 为设备树节点分配设备 解析设备树映射中断: irq_of_parse_and_map 下面我们来看看图片来进行分析 首先的话就是GIC去遍历自己的寄存器判断发生了哪个中断这个是在中断向量表里面的汇编来着小编也没有很明白(唯唯诺诺) 第二个就是那个irq_domain的关系是怎么去建立的 他会调用里面的translate函数去解析设备树 然后为他的hwirq找到一个空闲的virq然后记录在domain里面最后去调用domain里面的alloc函数去处理 allow主要是包括建立mapping关系然后就是就是注册那些irq_data这些在前面已经定义好了 这边就是提供irq_chip了那么到这里我们就彻底讲完啦其实GIC也没有想象的那么复杂逻辑性很强嘿嘿完结撒花(doge.)