Dela via


Öppna, initiera och stänga ett SD Card Bus-gränssnitt

SD-enhetsdrivrutiner (Secure Digital) måste öppna och initiera ett SD-bussgränssnitt för att interagera med de enheter som de hanterar eller värdstyrenheten. Detta kräver två anrop till SD-bussbiblioteket: ett anrop till SdBusOpenInterface följt av ett anrop till en rutin som tillhandahålls av busschauffören som initierar gränssnittet. SdBusOpenInterface returnerar en pekare till den rutin som initierar gränssnittet i InterfaceReference medlem i SDBUS_INTERFACE_STANDARD-strukturen. Enhetsdrivrutinen måste anropa den här initieringsrutinen för att ge busschauffören en pekare till en rutin för återanrop av avbrottsmeddelanden. Busschauffören använder det här återanropet för att meddela enhetsdrivrutinen om ett maskinvaruavbrott. Mer information om rutinen som initierar ett SD-bussgränssnitt finns i PSDBUS_INITIALIZE_INTERFACE_ROUTINE. Enhetsdrivrutinen öppnar och initierar normalt ett SD-bussgränssnitt inifrån sin AddDevice- rutin.

I följande kodexempel visas sekvensen med anrop som öppnar och initierar ett SD-bussgränssnitt:

  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);
    }
      }

I det här kodexemplet anropar enhetsdrivrutinen SdBusOpenInterface för att öppna gränssnittet, och bussdrivrutinen lagrar en pekare till initieringsrutinen i enhetstillägget (DeviceExtension–>BusInterface.InitializeInterface). När SdBusOpenInterface- returnerar hämtar drivrutinen den här pekaren från enhetstillägget. Därefter lägger drivrutinen en pekare till sin egen avbrottsrutin för återanrop, pMyDriverCallback, i SDBUS_INTERFACE_PARAMETERS-strukturen och skickar den här strukturen till initieringsrutinen.

Enhetsdrivrutinen måste också hämta den kontextinformation som SdBusOpenInterface returnerar i fältet Context i SDBUS_INTERFACE_STANDARD-strukturen. När drivrutinen anropar en SD-bussgränssnittsrutin måste den skicka dessa kontextdata.

Stänga ett SD-gränssnitt

För att stänga ett SD-gränssnitt måste drivrutinerna avreferera gränssnittet genom att anropa rutinen i InterfaceDereference medlem i SDBUS_INTERFACE_STANDARD-strukturen, vilket frigör alla resurser som allokeras av SdBusOpenInterface rutin. SD-enhetsdrivrutiner bör stänga alla öppna SD-gränssnitt när de tar emot något av följande IRP:er:

IRP_MN_QUERY_REMOVE_DEVICE

IRP_MN_REMOVE_DEVICE

IRP_MN_SURPRISE_REMOVAL

Följande kodexempel illustrerar hur en drivrutin kan avreferera ett SD-kortbussgränssnitt:

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

Anropet SdBusOpenInterface lagrar en pekare till gränssnittets referensrutin i SDBUS_INTERFACE_STANDARD-strukturen. Förare bör dock kontrollera att pekaren inte är NULL- innan de försöker anropa rutinen.