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 インターフェイスを閉じる必要があります。
次のコード例は、ドライバーが SD カード バス インターフェイスを逆参照する方法を示しています。
if (pDevExt->BusInterface.InterfaceDereference) {
(pDevExt->BusInterface.InterfaceDereference) (pDevExt->BusInterface.Context);
RtlZeroMemory(&pDevExt->BusInterface, sizeof(SDBUS_INTERFACE_STANDARD));
}
SdBusOpenInterface 呼び出しにより、インターフェイス逆参照ルーチンへのポインターが SDBUS_INTERFACE_STANDARD 構造体に格納されます。 ただし、ルーチンの呼び出しを試みる前に、ドライバーはポインターが "NULL" ではないことを確認する必要があります。