2016-04-05 2 views
2

Я пытаюсь понять архитектуру IRQ-инициализацию (векторную таблицу и лидера прерывания первого уровня) для 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). Я ссылаюсь на ядро ​​3.14 для CortexA15.

ответ

4

Это сложно отследить, так как код вызывается через раздел magic и другие с помощью обратных вызовов и других механизмов. Кроме того, у нас есть исторические механизмы и дерево устройств Инициализация Note1.


Обратный звонок: init_irq of the machine structure; они обычно определяются в файле платы. Например, imx6sl_init_irq() calls irqchip_init() из описания машины через макрос DT_MACHINE_START, который является machine_desc in the .arch.info.init section. Этот код называется очень ранней загрузкой и требуется для работы аппаратного обеспечения IRQ; он обычно включает механизмы синхронизации.

Linux поддерживает несколько контроллеров irqchip. Например, на некоторых ARM-системах есть несколько чипов GIC. Это необходимо, если имеется более ~ 1020 источников прерываний. Кроме того, оборудование GPIO часто является своего рода вторичным чипом IRQ, который включает/отключает прерывания GPIO.

Машина должна объявить GIC в дереве устройств. Это соответствует по сравнению с a table entry in irq-gic.c, который вызывает gic_of_init(). Таблицы используются of_irq_init() для инициализации контроллера GIC с аппаратными адресами и нумерацией прерываний. Т.е. это занимает драйвер irq-gic и дает конкретное устройство Note2.

Итак, код, который вы нашли в start_kernel(), который вызывает init_IRQ(), должен иметь смысл? Это будет выглядеть,

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. Пример imx6 solo-lite device tree include показывает, как данные закодированы. Этот текст получает скомпилированный в двоичный файл сплющенного дерева устройств, который передается из загрузчика (или прикрепляется к изображению).

Примечание 1: Дерево устройств вызывается несколькими именами. OF для открыть прошивку согласно оригинальной спецификации PowerPC. Как FDT для «сплющенного дерева устройств», в основном, людьми-загрузчиками. Также как только DT. Поэтому, когда вы видите один из следующих префиксов: OF, DT, FDT, это часто связано с «деревом устройств».

Примечание 2: Устройство представляет собой конкретное железо. Драйвер - это код для управления устройством. Linux выделяет память и предоставляет это код драйвера. Таким образом, один кусок кода может обрабатывать несколько устройств (в этом случае контроллеры прерываний). Это объектно-ориентированная концепция, и ARM хорошо справится с этим: адрес + смещение использование блока загрузки/хранения.

+0

Большое спасибо за информацию. Теперь я понял поток. – user3693586

Смежные вопросы