加入收藏 | 设为首页 | 会员中心 | 我要投稿 佛山站长网 (https://www.0757zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux芯片级移植与底层驱动(基于3.7.4内核) 中断控制器

发布时间:2016-11-14 01:35:48 所属栏目:Linux 来源:网络整理
导读:3.中断控制器驱动 在Linux内核中,各个设备驱动可以简单地调用request_irq()、enable_irq()、disable_irq()、local_irq_disable()、local_irq_enable()等通用AP

而在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

(编辑:佛山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读