Linux で PCIe ベースのシリアル I/O カード ドライバーを作成します。
構成スペースからの私の知識によると、それは割り込み行を提供し、フラグを介してIRQF_SHARED
その対応する行と割り込みハンドラーを共有できIRQ
ます。
しかし、私の混乱は、どの回線が共有されているか共有されていないかをどのように知ることができるかということです?
Linux で PCIe ベースのシリアル I/O カード ドライバーを作成します。
構成スペースからの私の知識によると、それは割り込み行を提供し、フラグを介してIRQF_SHARED
その対応する行と割り込みハンドラーを共有できIRQ
ます。
しかし、私の混乱は、どの回線が共有されているか共有されていないかをどのように知ることができるかということです?
カーネル支援プロービング
Linux カーネルは、割り込み番号をプローブするための低レベルの機能を提供します。これは非共有割り込みに対してのみ機能しますが、共有割り込みモードで動作できるほとんどのハードウェアは、構成された割り込み番号を見つけるためのより良い方法を提供します。この機能は、で宣言された 2 つの関数で構成されます<linux/interrupt.h>
(これはプローブ機構についても説明します)。
unsigned long probe_irq_on(void);
この関数は、割り当てられていない割り込みのビット マスクを返します。ドライバは、返されたビット マスクを保持し、probe_irq_off
後で渡す必要があります。この呼び出しの後、ドライバーは、デバイスが少なくとも 1 つの割り込みを生成するように手配する必要があります。
int probe_irq_off(unsigned long);
デバイスが割り込みを要求した後、ドライバーはこの関数を呼び出し、以前に によって返されたビット マスクを引数として渡しますprobe_irq_on
。probe_irq_off
「probe_on」の後に発行された割り込みの番号を返します。割り込みが発生しなかった場合は、0 が返されます (したがって、IRQ 0 をプローブすることはできませんが、サポートされているアーキテクチャのいずれかでそれを使用できるカスタム デバイスはありません)。複数の割り込みが発生した場合 (あいまい検出)、probe_irq_off
負の値を返します。
probe_irq_on
プログラマは、 の呼び出し後にデバイスの割り込みを有効にし、 を呼び出す前に割り込みを無効にするように注意する必要があります
probe_irq_off
。さらに、 の後にデバイスで保留中の割り込みを処理することを忘れないでくださいprobe_irq_off
。