Condividi tramite


Apertura, inizializzazione e chiusura di un'interfaccia del bus di scheda SD

I driver di dispositivo Secure Digital (SD) devono aprire e inizializzare un'interfaccia del bus SD per interagire con i dispositivi gestiti o il controller host. Ciò richiede due chiamate alla libreria del bus SD: una chiamata a SdBusOpenInterface seguita da una chiamata a una routine fornita dal driver del bus che inizializza l'interfaccia. SdBusOpenInterface restituisce un puntatore alla routine che inizializza l'interfaccia nel membro InterfaceReference della struttura SDBUS_INTERFACE_STANDARD . Il driver del dispositivo deve chiamare questa routine di inizializzazione per fornire al driver del bus un puntatore a una routine di callback di notifica di interruzione. Il driver del bus usa questo callback per notificare al driver del dispositivo un interruzione hardware. Per altre informazioni sulla routine che inizializza un'interfaccia del bus SD, vedere PSDBUS_INITIALIZE_INTERFACE_ROUTINE. Il driver del dispositivo apre e inizializza normalmente un'interfaccia del bus SD dall'interno della routine AddDevice .

Nell'esempio di codice seguente viene illustrata la sequenza di chiamate aperte e inizializzate un'interfaccia del bus 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);
    }
      }

In questo esempio di codice il driver del dispositivo chiama SdBusOpenInterface per aprire l'interfaccia e il driver del bus archivia un puntatore alla routine di inizializzazione nell'estensione del dispositivo (DeviceExtension-BusInterface.InitializeInterface>). Dopo aver restituito SdBusOpenInterface , il driver recupera questo puntatore dall'estensione del dispositivo. Successivamente, il driver inserisce un puntatore alla routine di callback di interruzione, pMyDriverCallback, nella struttura SDBUS_INTERFACE_PARAMETERS e passa questa struttura alla routine di inizializzazione.

Il driver del dispositivo deve anche recuperare le informazioni di contesto restituite da SdBusOpenInterface nel membro Context della struttura SDBUS_INTERFACE_STANDARD. Ogni volta che il driver chiama una routine dell'interfaccia del bus SD, deve passare questi dati di contesto.

Chiusura di un'interfaccia SD

Per chiudere un'interfaccia SD, i driver devono dereferenziare l'interfaccia chiamando la routine nel membro InterfaceDereference della struttura SDBUS_INTERFACE_STANDARD, che libera tutte le risorse allocate dalla routine SdBusOpenInterface . I driver di dispositivo SD devono chiudere tutte le interfacce SD aperte durante la ricezione di uno dei seguenti IRP:

IRP_MN_QUERY_REMOVE_DEVICE

IRP_MN_REMOVE_DEVICE

IRP_MN_SURPRISE_REMOVAL

Nell'esempio di codice seguente viene illustrato come un driver può dereferenziare un'interfaccia del bus di scheda SD:

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

La chiamata SdBusOpenInterface archivia un puntatore alla routine di dereferenza dell'interfaccia nella struttura SDBUS_INTERFACE_STANDARD. Tuttavia, i driver devono verificare che il puntatore non sia NULL prima di tentare di chiamare la routine.