ARM特定的IRQ初始化

时间:2016-04-05 09:58:23

标签: linux-kernel arm

我正在尝试了解ARM的体系结构特定的IRQ初始化(向量表和第一级中断函数)。

我检查了start_kernel() init/main.c -----> setup_arch() arch/arm/kernel/setup.c,,但无法找到与IRQ初始化相关的来源。我认为调用init_IRQ()内部的start_kernel()是设置内核IRQ处理基础设施。

我在推荐3.14内核。你能帮助理解ARM特定的IRQ初始化(ARM GIC initialization)。我正在为CortexA15引用3.14内核。

1 个答案:

答案 0 :(得分:4)

这很难跟踪,因为某些代码是通过 section magic 调用的,而其他代码是通过回调和其他机制调用的。此外,我们有历史机制和设备树初始化 Note1

init_irq of the machine structure中有一个回电;这些通常在电路板文件中定义。例如,来自机器描述的imx6sl_init_irq() calls irqchip_init()通过DT_MACHINE_STARTmachine_desc in the .arch.info.init section。这段代码在启动时很早就被调用,需要使IRQ硬件正常工作;它通常包括计时机制。

Linux支持多个 irqchip 控制器。例如,在某些ARM系统上有多个GIC芯片。如果有超过1020个中断源,则需要这样做。同样,GPIO硬件通常是一种辅助IRQ芯片,用于启用/禁用GPIO中断。

机器必须在设备树中声明GIC。这与调用gic_of_init()的{​​{3}}相匹配。这些表由a table entry in irq-gic.c用于初始化具有硬件地址和中断编号的GIC控制器。也就是说,这需要irq-gic驱动程序并提供具体设备 Note2

现在,您在start_kernel()中找到的代码of_irq_init()应该有意义吗?它看起来像,

 start_kernel     ->
  init_IRQ        ->
   machine_desc->init_irq (machine version)
    irqchip_init  ->
     of_irq_init  -> via *device tree* for address data
      gic_of_init -> actual controller initialization.

结构是到处因为Linux被组织为子系统,所以你有驱动程序基础结构(都需要中断),设备树(获取数据),初始化和中断代码(irqchip)。 DT或设备树功能旨在减少Linux中特定于板的代码量。示例init_IRQ()显示了数据编码的方式。此文本将编译转换为压缩的设备树二进制文件,该二进制文件从引导加载程序传递(或附加到映像)。

注1:设备树由多个名称调用。 OF 用于开放固件,符合原始PowerPC规范。作为“扁平设备树”的 FDT ,主要由u-boot人员提供。也只是 DT 。因此,当您看到以下前缀之一OF,DT,FDT时,它通常与“设备树”有关。

注2:设备是具体的硬件。驱动程序是处理设备的代码。 Linux分配内存并将其提供给驱动程序代码。通过这种方式,一段代码可以处理多个设备(在这种情况下是中断控制器)。它是一个面向对象的概念,ARM将通过地址+偏移使用加载/存储单元来很好地处理它。