Linux芯片级移植与底层驱动(基于3.7.4内核) 中断控制器
|
而在sirfsoc_gpio_handle_irq()函数的入口出调用chained_irq_enter()暗示自身进入链式IRQ处理,在函数体内判决具体的GPIO中断,并透过generic_handle_irq()调用到最终的外设驱动中的中断服务程序,最后调用chained_irq_exit()暗示自身退出链式IRQ处理: 1446static void sirfsoc_gpio_handle_irq(unsigned int irq, struct irq_desc *desc) 1447{ 1448 … 1454 chained_irq_enter(chip, desc); 1456 … 1477 generic_handle_irq(first_irq + idx); 1478 … 1484 chained_irq_exit(chip, desc); 1485} 很多中断控制器的寄存器定义呈现出简单的规律,如有一个mask寄存器,其中每1位可屏蔽1个中断等,这种情况下,我们无需实现1个完整的irq_chip驱动,可以使用内核提供的通用irq_chip驱动架构irq_chip_generic,这样只需要实现极少量的代码,如arch/arm/mach-prima2/irq.c中,注册CSR SiRFprimaII内部中断控制器的代码仅为: 26static __init void 27sirfsoc_alloc_gc(void __iomem *base, unsigned int irq_start, unsigned int num) 28{ 29 struct irq_chip_generic *gc; 30 struct irq_chip_type *ct; 31 32 gc = irq_alloc_generic_chip("SIRFINTC", 1, irq_start, base, handle_level_irq); 33 ct = gc->chip_types; 34 35 ct->chip.irq_mask = irq_gc_mask_clr_bit; 36 ct->chip.irq_unmask = irq_gc_mask_set_bit; 37 ct->regs.mask = SIRFSOC_INT_RISC_MASK0; 38 39 irq_setup_generic_chip(gc, IRQ_MSK(num), IRQ_GC_INIT_MASK_CACHE, IRQ_NOREQUEST, 0); 40} 特别值得一提的是,目前多数主流ARM芯片,内部的一级中断控制器都使用了ARM公司的GIC,我们几乎不需要实现任何代码,只需要在Device Tree中添加相关的结点并将gic_handle_irq()填入MACHINE的handle_irq成员。 如在arch/arm/boot/dts/exynos5250.dtsi即含有: 36 gic:interrupt-controller@10481000 { 37 compatible = "arm,cortex-a9-gic"; 38 #interrupt-cells = <3>; 39 interrupt-controller; 40 reg = <0x10481000 0x1000>, <0x10482000 0x2000>; 41 }; 而在arch/arm/mach-exynos/mach-exynos5-dt.c中即含有: 95DT_MACHINE_START(EXYNOS5_DT, "SAMSUNG EXYNOS5 (Flattened Device Tree)") 96 /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */ 97 .init_irq = exynos5_init_irq, 98 .smp = smp_ops(exynos_smp_ops), 99 .map_io = exynos5250_dt_map_io, 100 .handle_irq = gic_handle_irq, 101 .init_machine = exynos5250_dt_machine_init, 102 .init_late = exynos_init_late, 103 .timer = &exynos4_timer, 104 .dt_compat = exynos5250_dt_compat, 105 .restart = exynos5_restart, 106MACHINE_END (编辑:佛山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

