irq_of_parse_and_map()->of_irq_parse_one():主要用于解析DTS文件中设备定义的属性,如reg、interrupts等, 最后把DTS中的interrupts的值存放在oirq->args[]数组中irq_of_parse_and_map()->irq_create_of_mapping->irq_create_fwspec_mapping(): unsigned int irq_create_fwspec_mapping(struct irq_fwspec ...
(1)调用irq_create_mapping函数建立HW interrupt ID和IRQ number的映射关系。该接口函数以irq domain和HW interrupt ID为参数,返回IRQ number(这个IRQ number是动态分配的)。该函数的原型定义如下: extern unsigned int irq_create_mapping(struct irq_domain *host, irq_hw_number_t hwirq); 驱动调用该函数的时候...
(1)调用irq_create_mapping函数建立HW interrupt ID和IRQ number的映射关系。该接口函数以irq domain和HW interrupt ID为参数,返回IRQ number(这个IRQ number是动态分配的)。该函数的原型定义如下: extern unsigned int irq_create_mapping(struct irq_domain *host, irq_hw_number_t hwirq); 驱动调用该函数的时候...
* @map: Create or update a mapping between a virtual irq number and a hw * irq number. This is called only once for a given mapping. * @unmap: Dispose of such a mapping * @xlate: Given a device tree node and interrupt specifier, decode * the hardware irq number and linux irq type...
(1)首先找到root interrupt controller对应的irq domain。 (2)根据HW 寄存器信息和irq domain信息获取HW interrupt ID (3)调用irq_find_mapping找到HW interrupt ID对应的irq number (4)调用handle_IRQ(对于ARM平台)来处理该irq number 三、gpio中断举例
unsigned int irq_base, irq_hw_number_t hwirq_base, int count); (3)irq_create_of_mapping。看到函数名字中的of(open firmware),我想你也可以猜到了几分,这个接口当然是利用device tree进行映射关系的建立。具体函数的原型定义如下: extern unsigned int irq_create_of_mapping(struct of_phandle_args *irq...
irq_hw_number_t first_hwirq, const struct irq_domain_ops *ops, void *host_data) { struct irq_domain *domain; unsigned int i; domain = irq_domain_alloc(of_node, IRQ_DOMAIN_MAP_LEGACY, ops, host_data); if (!domain) return NULL; ...
对于ARM64,irq_handler将调用gic_handle_irq gic_handle_irq首先读取中断寄存器得到硬件中断号,调用handle_domain_irq函数 handle_domain_irq->irq_enter进入中断上下文 handle_domain_irq->irq_find_mapping通过硬件中断号获取IRQ Number handle_domain_irq->generic_handle_irq进入中断通用层处理 ...
对于ARM64,irq_handler将调用gic_handle_irq gic_handle_irq首先读取中断寄存器得到硬件中断号,调用handle_domain_irq函数 handle_domain_irq->irq_enter进入中断上下文 handle_domain_irq->irq_find_mapping通过硬件中断号获取IRQ Number handle_domain_irq->generic_handle_irq进入中断通用层处理 ...
先开始分析这个报错的来源,可以查找到错误来源于函数irq_create_fwspec_mapping(),调用顺序为:查看报错源码,这里报错的原因是从中断获取到的中断源配置和设备树中的不一致,也不为IRQ_TYPE_NONE,这也能解释第一次insmod驱动不会出现问题,只有移除驱动重新insmod后才会出现的现象。