テクニカル ドキュメント #104



Doc ID: 104
製品: WinDriver
Version:  --

複数のデバイスで IRQ を共有している場合、どのカードからの割り込みか識別するために、WinDriver ISR からどのようにして PCI 割り込みステータスのレジスタの値を認識できますか?

ユーザー モードで割り込みを処理する場合、その割り込みが、対象のカードの割り込みかまたは他のカードの割り込みかを検知 (クリア) する必要があります。
どのカードの割り込みかを識別するには、対象のカードの割り込みの場合にのみ ISR を有効にし、WD_INTERRUPT 構造体の転送コマンドを設定します。
WD_INTERRUPT 構造体は、InterruptEnable() (InterruptThreadEnable() v4.30 - v5.22) またはより低いレベルの WD_IntEnable() 関数へ渡されます。 int.Cmds は、割り込みをクリアする前に割り込みレジスタから読込むコマンドを含みます。 割り込みを受信しクリアする前に直ぐにレジスタはカーネルで読まれます。読込み値を有効にすると、ユーザー モードの割り込み処理ルーチンから読込み値にアクセスできます。
読込み値を保存するには、WD_INTERRUPT 構造体の dwOptions フィールドに INTERRUPT_CMD_COPY フラグをセットする必要があります (int.dwOptions |= INTERRUPT_CMD_COPY)。

カーネルで直接割り込みを処理する WinDriver の Kernel PlugIn 機能を使用する場合、KP_IntAtIrql() ルーチンから、割り込みを受信した場合、直接カード上の割り込みステータス レジスタの値を読めます。そして、ステータス レジスタの値が、対象のカードが割り込みを発生している場合のみ、割り込みを検知 (クリア) し、ISR を実行します。