次の方法で共有


SD カードの要求

Secure Digital (SD) カード デバイス ドライバーが開き、SD バス ドライバーへのインターフェイスを初期化したら、要求を送信できるようになります。 SdBusSubmitRequest ルーチンを使用して同期的に送信する方法と、SdBusSubmitRequestAsync ルーチンを使用して非同期的に送信するという 2 つの方法で要求を送信できます。 これらのルーチンはどちらも、SD バス ライブラリ (sdbus.lib) によってエクスポートされます。

同期要求ルーチンは、インターフェイス コンテキストと要求パケットの 2 つのパラメーターを受け取ります。

インターフェイス コンテキスト
デバイス ドライバーは、SdBusOpenInterface で SD インターフェイスを開いた後、SDBUS_INTERFACE_STANDARD 構造体の Context メンバーからインターフェイス コンテキストを取得します。 ドライバーは、インターフェイスでメソッドを呼び出すたびに、このコンテキスト情報を渡す必要があります。

要求パケット
デバイス ドライバーは、SDBUS_REQUEST_PACKET 構造体を割り当てて初期化する必要があります。 この構造体は、要求関数と要求のその他の特性を指定します。

SdBusSubmitRequest は同期的であるため、"STATUS_PENDING" を返しません。 デバイス ドライバーは、このルーチンを呼び出すときに IRQL < DISPATCH_LEVEL で実行されている必要があります。

非同期要求ルーチンは、インターフェイス コンテキスト、要求パケット、IRP、完了ルーチンへのポインター、完了コンテキストの 5 つのパラメーターを受け取ります。

インターフェイス コンテキスト
このパラメーターは、同期の場合に使用する同名のパラメーターと同じです。

要求パケット
このパラメーターは、同期の場合に使用する同名のパラメーターと同じです。

IRP
このパラメーターは、デバイス ドライバーが割り当てた IRP、またはドライバー スタックの上方に位置するドライバーからドライバーが受信した IRP を保持します。 IRP は、要求のキャリアとして使用されます。

完了ルーチン
このパラメーターは、IRP パラメーターで指定された IRP の IoCompletion ルーチンを保持します。

ユーザー コンテキスト
このパラメーターは、完了ルーチンのパラメーターで指定された完了ルーチンにシステムが渡すユーザー コンテキスト データへのポインターを保持します。

デバイス ドライバーは、SdBusSubmitRequestAsync ルーチンを呼び出すときに IRQL <= DISPATCH_LEVEL で実行されている必要があります。 SdBusSubmitRequest は、独自の IRP を割り当て、SdBusSubmitRequestAsync を呼び出すラッパーです。 これは、ドライバーの作者の利便性を高めるためのものです。

次のセクションのコード例は、デバイス ドライバーが 2 つの主要なカテゴリの SD 要求を送信する方法を示すものです。さまざまな要求の説明については、「SD_REQUEST_FUNCTION」を参照してください。

Secure Digital (SD) プロパティ要求

Secure Digital (SD) カード ドライバーは、プロパティ要求を使用して、カードのプロパティの読み取りや設定を行います。 たとえば、SD カードの書き込み保護スイッチがロックされた位置にあるかどうかを判断するために、SD カード ドライバーがプロパティを読み取る場合があります。あるいは、多機能 SDIO カードの特定の機能のドライバーが、バス ドライバーが管理する機能に割り当てる番号を要求することがあります。

次のコード例は、多機能カードの機能のドライバーがバス ドライバーに機能番号を要求する方法を示しています。

 sdrp = ExAllocatePool(NonPagedPool, 
 sizeof(SDBUS_REQUEST_PACKET));
 if (!sdrp) {
 return STATUS_INSUFFICIENT_RESOURCES;
 }
 RtlZeroMemory(sdrp, sizeof(SDBUS_REQUEST_PACKET));
 sdrp->RequestFunction = SDRF_GET_PROPERTY;
 sdrp->Parameters.GetSetProperty.Property = 
 SDP_FUNCTION_NUMBER;
 sdrp->Parameters.GetSetProperty.Buffer = 
 &pDevExt->FunctionNumber;
 sdrp->Parameters.GetSetProperty.Length = 
 sizeof(pDevExt->FunctionNumber);
 status = SdBusSubmitRequest (pDevExt->BusInterface.Context,sdrp);
 ExFreePool(sdrp);
 if (!NT_SUCCESS(status)) {
 return status;
 }

このコード例では、デバイス ドライバーが SD バス要求パケット "SDBUS_REQUEST_PACKET" を初期化して SdBusSubmitRequest に渡します。 完全に初期化された要求パケットには次の特性があります。

要求タイプ
このコード例では、要求パケットの RequestFunction メンバーに "SDRF_GET_PROPERTY" 要求を指定します。この要求は、バス ドライバーにカードからプロパティを取得するように指示します。 SDRF_GET_PROPERTY 要求の説明については、「SD_REQUEST_FUNCTION」を参照してください。

取得するプロパティ
このコード例では、要求パケットの Parameters.GetSetProperty.Property メンバーの "SDP_FUNCTION_NUMBER" プロパティを指定します。このプロパティは、ファンクション番号プロパティの内容を取得するようにバス ドライバーに指示します。 SDP_FUNCTION_NUMBER プロパティの詳細については、「SDBUS_PROPERTY」を参照してください。

プロパティの内容と長さ
デバイス拡張機能内のバッファーへのポインターを配置するコード例です。

要求パケットの Parameters.GetSetProperty.Buffer メンバー。 バス ドライバーは、この場所にファンクション番号を格納します。 このコード例では、要求パケットの Parameters.GetSetProperty.Length メンバーにもこのバッファーのサイズが格納されます。

Secure Digital (SD) デバイス コマンド要求

ドライバーは、Secure Digital (SD) カード コマンド要求を使用して、SD デバイスにコマンドを送信します。 SD コマンドのプロトコルは、セキュア デジタル カード仕様で定義されています。 ドライバーは、デバイスを起動する IRP_MN_START_DEVICE IRP が正常に完了した後、いつでもコマンド要求を送信できます。

このセクションには、ダイレクト I/O を使用して SD カードのレジスタからデータのバイトを読み取るコマンド要求と、拡張 I/O を使用して SD カードに大量のデータを書き込むデバイス コマンド要求の 2 つのコード例が含まれています。 2 つ目のセクションの説明は最初のセクションによって異なるため、最初のセクションをよく確認してから 2 つ目のセクションに進んでください。

次を使用するセキュア デジタル要求

拡張 I/O を使用するセキュア デジタル要求