次の方法で共有


SD カードの割り込みの処理

Secure Digital (SD) カード ドライバーには割り込みサービス ルーチン (ISR) がないため、割り込み要求 (IRQ) リソースは取得されません。 「セキュア デジタル (SD) ドライバー スタック」と「SD バス インターフェイスを開いて初期化」のセクションで説明しているように、SD バス ドライバーはハードウェア割り込みを検出してインターセプトし、割り込み通知コールバック ルーチン "PSDBUS_CALLBACK_ROUTINE" を使用してデバイス ドライバーに報告します。

デバイス ドライバーは、割り込み通知コールバック ルーチンのコンテキストにおいて割り込み処理を完了する必要はありません。 ドライバーはコールバック ルーチンから戻り、独自のコンテキストで割り込み処理を完了できます。 ドライバーが割り込み処理を完了すると、SD バス インターフェイスを伴う割り込み確認ルーチンを明示的に呼び出してバス ドライバーに通知します。 割り込み確認ルーチンの詳細については、「PSDBUS_ACKNOWLEDGE_INT_ROUTINE」を参照してください。 この呼び出しを受信したバス ドライバーは、割り込みを再び有効化します。

実行時の IRQ レベル (IRQL) に関して、SD デバイス ドライバーには 2 つのオプションがあります。 SD ドライバーは PASSIVE_LEVEL だけで実行するか、割り込み通知コールバック ルーチンのコンテキストにおいては DISPATCH_LEVEL で、残りは PASSIVE_LEVEL で実行できます。 SD デバイス ドライバーを PASSIVE_LEVEL だけで実行する場合、バス ドライバーが割り込みを同期する責任を負います。 ドライバーの設計を簡素化できるため、割り込み待ち時間を厳密に制限することなくデバイスを動作させることができる場合は、このオプションを選択します。 割り込み同期のタスクをバス ドライバーにオフロードすること以外にも、利点があります。 たとえば、ドライバーは割り込みに応じてデータを頻繁に転送する必要があります。 ドライバーのコールバック ルーチンが PASSIVE_LEVEL で実行されている場合は、非同期ではなく同期で I/O 操作を行えます。 コールバック ルーチンが DISPATCH_LEVEL で実行される場合、ドライバーは IRQL が低下するまで待ってから、同期 I/O を実行する必要があります。

SD デバイス ドライバーは、SD バス インターフェイスを初期化する際の IRQL を指定します。 ドライバーを割り込み通知コールバック ルーチンにおいて DISPATCH_LEVEL で実行するには、SDBUS_INTERFACE_PARAMETERS 構造体の CallbackAtDpcLevel メンバーを "TRUE" に設定し、この構造体をインターフェイス初期化ルーチンに渡す必要があります。 インターフェイス ルーチンの説明については、「PSDBUS_INITIALIZE_INTERFACE_ROUTINE」を参照してください。 PASSIVE_LEVEL だけでドライバーを実行する場合、CallbackAtDpcLevel を "FALSE" に設定する必要があります。