SD カードのドライバー スタック
セキュア デジタル (SD) カード テクノロジはポータブルの小型メモリ カードから始まりましたが、セキュア・デジタル・アソシエーション (SDA) はセキュア デジタル I/O (SDIO) 仕様をリリースして SD テクノロジの定義を広げており、現在は Bluetooth デバイス、ビデオ カメラ、ワイヤレス LAN デバイス、GPS (Global Positioning System) 受信機など、様々なカードの機能が含まれるようになっています。 このドキュメントでは、オペレーティング システムが SD テクノロジのカード機能拡張をサポートする方法を説明します。
初期の SD ストレージ デバイスのカード リーダーの多くは、USB バスに接続するように設計されていました。 次の図に示すように、Windows は USB 大容量記憶装置ドライバー (usbstor.sys) とネイティブ ストレージ クラス ドライバー (disk.sys) を使用してこれらのデバイスを管理します。
USB バスに接続するメモリ カード用に Windows が作成するデバイス スタックの詳細については、「USB 大容量記憶装置のデバイス オブジェクトの例」を参照してください。
まず、オペレーティング システムにより、PCI バスに直接接続する SD ホスト コントローラーのサポートが提供されます。 システムは SD ホスト コントローラーを列挙する際に、ネイティブ SD バス ドライバー (sdbus.sys) を読み込みます。 ユーザーが SD メモリ カードを挿入すると、Windows はネイティブ SD ストレージ クラス ドライバー (sffdisk.sys) とストレージ ミニポート ドライバー (sffp_sd.sys) をバス ドライバー上に読み込みます。 GPS やワイヤレス LAN など、別の種類の機能を持つ SD カードをユーザーが挿入した場合、Windows はデバイスのベンダーが提供するドライバーを読み込みます。
SD スタック内のすべてのデバイス ドライバー (ネイティブまたはベンダー提供) は、静的 SD バス ライブラリ (sdbus.lib) のルーチンを呼び出すことで、SD バス ドライバーと通信する必要があります。 SD ドライバーは、コンパイル時にこのライブラリとリンクしなければなりません。 次の図は、システムが SD コントローラーとそれに付随するカードを列挙する際に作成する SD ドライバー スタックを示しています。
SD デバイス ドライバーは、ホスト コントローラーのレジスタ セットに直接アクセスすることも、ホスト コントローラーのパススルー コマンドを I/O 要求パケット (IRP) に埋め込むこともできません。 SD デバイス ドライバーが SD バス ライブラリ ルーチンを呼び出すことでホスト コントローラーにコマンドを発行したら、ライブラリはホスト コントローラーのために適切な SD コマンドを生成します。
SD デバイス ドライバーは標準的な PnP と電源 IRP を処理する必要がありますが、ポート、メモリ、割り込みベクターなどのハードウェア リソースを要求したり、管理したりすることはありません。 そのため、SD デバイス ドライバーは、IRP_MN_START_DEVICE 要求を処理する際にハードウェア リソースをマッピングする必要はありません。 ただし、IRP_MN_STOP_DEVICE 要求を受信した SD デバイス ドライバーは、すべての I/O 操作を停止する必要があります。 さらに、ドライバーは IRP_MN_QUERY_REMOVE_DEVICE 要求に応じて、SD バス ドライバーへのインターフェイスを閉じる必要があります。
ハードウェア割り込みが発生すると、SD バス ライブラリは割り込みをインターセプトし、続く割り込みをマスクアウトし、ハードウェア割り込みが発生したことをコールバック ルーチンによって SD デバイス ドライバーに通知します。 バス ドライバーが SD デバイス ドライバーにハードウェア割り込みを通知するために使用するコールバック ルーチンの説明については、「PSDBUS_CALLBACK_ROUTINE」を参照してください。 SD ドライバー スタックとライブラリがハードウェア割り込みを管理する一般的な方法については、「Secure Digital (SD) ハードウェア割り込みの処理」を参照してください。
Windows Driver Kit (WDK) が提供する ntddsd.h ヘッダー ファイルは、SD バス ライブラリが公開するルーチンのプロトタイプを宣言します。