次の方法で共有


SD カードのバス インターフェイスを開く、初期化する、および閉じる

Secure Digital (SD) デバイス ドライバーは、管理するデバイスやホスト コントローラーとやり取りするために、SD バス インターフェイスを開いて初期化する必要があります。 そのため、SdBusOpenInterface の呼び出し、次にインターフェイスを初期化するバス ドライバーが提供するルーチンの呼び出しという、2 つの SD バス ライブラリへの呼び出しが必要になります。 SdBusOpenInterface は、SDBUS_INTERFACE_STANDARD 構造体の InterfaceReference メンバーのインターフェイスを初期化するルーチンへのポインターを返します。 デバイス ドライバーはこの初期化ルーチンを呼び出し、割り込み通知コールバック ルーチンへのポインターをバス ドライバーに提供する必要があります。 バス ドライバーはこのコールバックを使用して、デバイス ドライバーにハードウェア割り込みを通知します。 SD バス インターフェイスを初期化するルーチンの詳細については、「PSDBUS_INITIALIZE_INTERFACE_ROUTINE」を参照してください。 デバイス ドライバーは通常、その AddDevice ルーチン内から SD バス インターフェイスを開いて初期化します。

次のコード例は、SD バス インターフェイスを開いて初期化する呼び出しのシーケンスを示しています。

  status = SdBusOpenInterface (pDevExt->UnderlyingPDO,
    &pDevExt->BusInterface,
    sizeof(SDBUS_INTERFACE_STANDARD),
    SDBUS_INTERFACE_VERSION);

  if (NT_SUCCESS(status)) {
    SDBUS_INTERFACE_PARAMETERS interfaceParameters = {0};
    interfaceParameters.Size = 
      sizeof(SDBUS_INTERFACE_PARAMETERS);
    interfaceParameters.TargetObject = 
      DeviceExtension->TargetObject;
    interfaceParameters.DeviceGeneratesInterrupts = TRUE;
    interfaceParameters.CallbackRoutine = pMyDriverCallback;
    status = STATUS_UNSUCCESSFUL;
    if (DeviceExtension->BusInterface.InitializeInterface) {
      status = (pDevExt->BusInterface.InitializeInterface)
        (pDevExt->BusInterface.Context, &interfaceParameters);
    }
      }

このコード例では、デバイス ドライバーが SdBusOpenInterface を呼び出してインターフェイスを開き、バス ドライバーが初期化ルーチンへのポインターをデバイス拡張機能 (DeviceExtension->BusInterface.InitializeInterface) に格納します。 SdBusOpenInterface が返されると、ドライバーはこのポインターをデバイス拡張機能から取得します。 次に、ドライバーは独自の割り込みコールバック ルーチン "pMyDriverCallback" へのポインターを SDBUS_INTERFACE_PARAMETERS 構造体に配置し、この構造体を初期化ルーチンに渡します。

デバイス ドライバーはまた、SdBusOpenInterface が SDBUS_INTERFACE_STANDARD 構造体の Context メンバーで返すコンテキスト情報も取得する必要があります。 ドライバーは SD バス インターフェイス ルーチンを呼び出すたびに、このコンテキスト データを渡す必要があります。

SD インターフェイスを閉じる

SD インターフェイスを閉じるために、ドライバーは SDBUS_INTERFACE_STANDARD 構造体の InterfaceDereference メンバーのルーチンを呼び出してインターフェイスを逆参照することで、SdBusOpenInterface ルーチンが割り当てたすべてのリソースを解放する必要があります。 次のいずれかの IRP を受信する際、SD デバイス ドライバーは開いているすべての SD インターフェイスを閉じる必要があります。

IRP_MN_QUERY_REMOVE_DEVICE

IRP_MN_REMOVE_DEVICE

IRP_MN_SURPRISE_REMOVAL

次のコード例は、ドライバーが SD カード バス インターフェイスを逆参照する方法を示しています。

if (pDevExt->BusInterface.InterfaceDereference) {
    (pDevExt->BusInterface.InterfaceDereference) (pDevExt->BusInterface.Context);
    RtlZeroMemory(&pDevExt->BusInterface, sizeof(SDBUS_INTERFACE_STANDARD));
}

SdBusOpenInterface 呼び出しにより、インターフェイス逆参照ルーチンへのポインターが SDBUS_INTERFACE_STANDARD 構造体に格納されます。 ただし、ルーチンの呼び出しを試みる前に、ドライバーはポインターが "NULL" ではないことを確認する必要があります。