Delen via


Een SD Card Bus-interface openen, initialiseren en sluiten

Secure Digital (SD)-apparaatstuurprogramma's moeten een SD-businterface openen en initialiseren om te communiceren met de apparaten die ze beheren of de hostcontroller. Hiervoor zijn twee aanroepen naar de SD-busbibliotheek vereist: een aanroep naar SdBusOpenInterface gevolgd door een oproep naar een routine die wordt geleverd door het busstuurprogramma dat de interface initialiseert. SdBusOpenInterface retourneert een aanwijzer naar de routine waarmee de interface in de InterfaceReference lid van de SDBUS_INTERFACE_STANDARD-structuur wordt geïnitialiseerd. Het apparaatstuurprogramma moet deze initialisatieroutine aanroepen om het busstuurprogramma te voorzien van een aanwijzer naar een callbackroutine voor interruptmeldingen. Het busstuurprogramma gebruikt deze callback om het apparaatstuurprogramma op de hoogte te stellen van een hardware-interrupt. Zie PSDBUS_INITIALIZE_INTERFACE_ROUTINEvoor meer informatie over de routine waarmee een SD-businterface wordt geïnitialiseerd. Het apparaatstuurprogramma opent en initialiseert normaal gesproken een SD-businterface binnen de AddDevice routine.

In het volgende codevoorbeeld ziet u de reeks aanroepen die een SD-businterface openen en initialiseren:

  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 dit codevoorbeeld roept het apparaatstuurprogramma SdBusOpenInterface aan om de interface te openen en slaat het busstuurprogramma een aanwijzer op in de initialisatieroutine in de apparaatextensie (DeviceExtension->BusInterface.InitializeInterface). Nadat SdBusOpenInterface retourneert, haalt het stuurprogramma deze aanwijzer op uit de apparaatextensie. Vervolgens plaatst het stuurprogramma een aanwijzer naar zijn eigen interrupt callback routine, pMyDriverCallback, in de SDBUS_INTERFACE_PARAMETERS structuur en geeft deze structuur door aan de initialisatieroutine.

Het apparaatstuurprogramma moet ook de contextinformatie ophalen die SdBusOpenInterface retourneert in het Context-lid van de SDBUS_INTERFACE_STANDARD-structuur. Telkens wanneer het besturingsprogramma een SD-businterfaceroutine aanroept, moeten deze contextgegevens worden doorgegeven.

Een SD-interface sluiten

Als u een SD-interface wilt sluiten, moeten stuurprogramma's de interface dereferentie uitvoeren door de routine aan te roepen in het InterfaceDereference element van de SDBUS_INTERFACE_STANDARD-structuur, waarmee alle resources worden vrijgemaakt die zijn toegewezen door de SdBusOpenInterface routine. SD-apparaatstuurprogramma's moeten alle geopende SD-interfaces sluiten bij ontvangst van een van de volgende IR's:

IRP_MN_QUERY_REMOVE_DEVICE

IRP_MN_REMOVE_DEVICE

IRP_MN_SURPRISE_REMOVAL

In het volgende codevoorbeeld wordt geïllustreerd hoe een stuurprogramma een SD-kaartbusinterface kan dereferenceren.

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

De SdBusOpenInterface-aanroep slaat een pointer naar de interfacederefentieroutine op in de SDBUS_INTERFACE_STANDARD-structuur. Bestuurders moeten er echter voor zorgen dat de aanwijzer niet NULL is voordat men probeert de routine aan te roepen.