2016-04-05 30 views
2

ARM用のアーキテクチャー固有のIRQ初期化(ベクタテーブルと第1レベルの割り込みhadlers)を理解しようとしています。ARM固有のIRQの初期化

start_kernel() init/main.c -----> setup_arch() arch/arm/kernel/setup.c,を確認しましたが、IRQの初期化に関連するソースが見つかりませんでした。私はstart_kernel()の中で呼び出されたinit_IRQ()がカーネルのIRQ処理インフラストラクチャを設定することだと思います。

私は3.14カーネルを参照しています。 ARM固有のIRQ初期化(ARM GIC initialization)を理解するのに役立ちますか?CortexA15の3.14カーネルを参照しています。

答えて

4

セクションの魔法などでコールバックやその他のメカニズムを介して呼び出されるコードは、追跡が困難です。また、我々は歴史的なメカニズムとデバイスツリーの初期化注1を持っています。


init_irq of the machine structureにコールバックがあります。これらは通常、ボードファイルで定義されます。たとえば、機械の説明からDT_MACHINE_STARTマクロを経由してがmachine_desc in the .arch.info.init sectionです。このコードは起動時に非常に早く呼び出され、IRQハードウェアを動作させるために必要です。典型的にはクロッキング機構を含む。

Linuxはいくつかのコントローラをサポートしています。irqchipコントローラ。たとえば、いくつかのARMシステムでは、複数のGICチップがあります。これは〜1020個以上の割り込み要因がある場合に必要です。同様に、GPIOハードウェアは、しばしば、GPIO割り込みを有効/無効にする一種の2次IRQチップです。

マシンは、デバイスツリーでGICを宣言する必要があります。これはa table entry in irq-gic.cと一致し、gic_of_init()が呼び出されます。このテーブルは、of_irq_init()が、ハードウェアアドレスと割り込み番号でGICコントローラを初期化するために使用します。つまり、これはirq-gicドライバをとり、具体的なデバイスを与えます注2

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仕様に準拠しています。 'flattened device tree'の場合は、ほとんどがu-boot peopleです。FDTです。また、ちょうどDTとして。ですから、次の接頭辞OF、DT、FDTのいずれかを見ると、それはしばしば「デバイスツリー」です。

注2:デバイスは、具体的なハードウェアです。ドライバは、デバイスを処理するためのコードです。 Linuxはメモリを割り当て、これをドライバコードに提供します。このようにして、1つのコードで複数のデバイス(この場合は割り込みコントローラ)を処理できます。これはオブジェクト指向のコンセプトであり、ARMはのアドレス+オフセットのロード/ストアユニットの使用でそれをうまく処理します。

+0

ありがとうございました。今、私はその流れを理解しました。 – user3693586