在ARM皮层A-9的U-boot中启用中断

时间:2013-04-05 08:50:32

标签: arm interrupt-handling interrupt u-boot

我正在尝试在uboot中配置GPIO中断,这是为了测试中断响应时间而不需要任何操作系统干预(裸机)。我能够配置引脚复用并成功设置GPIO引脚的中断。

我的问题是关于注册中断服务程序。我看到我的平台的中断向量表位于地址0xFFFF0000(我读了系统控制寄存器以找出这个)。 GPIO的中断ID为56,我刚刚计算了中断服务程序应该驻留的地址,并尝试用指向我的ISR例程的指针写入地址。这是正确的做法吗?或者我必须自己处理所有其他事情,如上下文保存等?

注意:我使用的是ARM Cortex A-9。

编辑:

根据我通过代码的答案,我有以下问题。

的定义 我的架构的 do_irq(arm v7)做得不多,而且CONFIG_USE_IRQ对我来说不起作用,因为没有为我定义像arch_interrupt_init这样的函数。所以我可以得出结论,我的架构不支持中断。现在,如果我必须自己定义我需要实现的所有功能,以使其工作?由于这只是我项目的一小部分,我想看看能否做到这一点是可行的。我只是想知道这是否需要几行代码或者需要一些努力来实现这种中断支持。

1 个答案:

答案 0 :(得分:6)

ARM将所有中断传送到地址0xFFFF0018(或0x00000018)。这通常是无条件的分支。然后代码将检查一些中断控制器硬件以确定数字 56 。通常,有一个例程来设置中断号的处理程序,因此您不需要手动修补代码;该表取决于u-boot中断处理的实现方式。

在我的u-boot来源 note 中,中断表如下所示,

.globl _start
_start:
    b       reset
    ldr     pc, _undefined_instruction
    ldr     pc, _software_interrupt
    ldr     pc, _prefetch_abort
    ldr     pc, _data_abort
    ldr     pc, _not_used
    ldr     pc, _irq
    ldr     pc, _fiq
...
_irq:
        .word irq

因此_irq是安装中断处理例程的标签;它在同一个文件中执行一些汇编程序,然后根据 CONFIG_USE_IRQ 调用do_irq()。 API的一部分位于* lib_arm / interrupts.c *中。对于S3C4510B,某些 CPU 被定义为处理 irqs ,例如 cpu / arm720t / interrupts.c 。在这里,您可以看到代码从该控制器获取一个寄存器,然后分支到一个表。

因此,默认情况下u-boot似乎不支持中断。这并不奇怪,因为引导加载程序通常是基于简单性和速度的轮询

注意:我的u-boot基于2009.01-rc3。