Partager via


Ouverture, initialisation et fermeture d’une interface de bus de carte SD

Les pilotes de périphériques SD (Secure Digital) doivent ouvrir et initialiser une interface de bus SD pour interagir avec les appareils qu’ils gèrent ou le contrôleur hôte. Cela nécessite deux appels à la bibliothèque de bus SD : un appel à SdBusOpenInterface suivi d’un appel à une routine fournie par le pilote de bus qui initialise l’interface. SdBusOpenInterface retourne un pointeur vers la routine qui initialise l’interface dans le membre InterfaceReference de la structure SDBUS_INTERFACE_STANDARD . Le pilote de périphérique doit appeler cette routine d’initialisation pour fournir au pilote de bus un pointeur vers une routine de rappel de notification d’interruption. Le pilote de bus utilise ce rappel pour informer le pilote de périphérique d’une interruption matérielle. Pour plus d’informations sur la routine qui initialise une interface de bus SD, consultez PSDBUS_INITIALIZE_INTERFACE_ROUTINE. Le pilote de périphérique ouvre et initialise normalement une interface de bus SD à partir de sa routine AddDevice .

L’exemple de code suivant illustre la séquence d’appels qui ouvrent et initialisent une interface de 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);
    }
      }

Dans cet exemple de code, le pilote de périphérique appelle SdBusOpenInterface pour ouvrir l’interface, et le pilote bus stocke un pointeur vers la routine d’initialisation dans l’extension de périphérique (DeviceExtension-BusInterface.InitializeInterface>). Une fois que SdBusOpenInterface retourne, le pilote récupère ce pointeur à partir de l’extension de périphérique. Ensuite, le pilote place un pointeur vers sa propre routine de rappel d’interruption, pMyDriverCallback, dans la structure SDBUS_INTERFACE_PARAMETERS et transmet cette structure à la routine d’initialisation.

Le pilote de périphérique doit également récupérer les informations de contexte retournées par SdBusOpenInterface dans le membre Context de la structure SDBUS_INTERFACE_STANDARD. Chaque fois que le pilote appelle une routine d’interface de bus SD, il doit passer ces données de contexte.

Fermeture d’une interface SD

Pour fermer une interface SD, les pilotes doivent déréférencer l’interface en appelant la routine dans le membre InterfaceDereference de la structure SDBUS_INTERFACE_STANDARD, qui libère toutes les ressources allouées par la routine SdBusOpenInterface . Les pilotes de périphérique SD doivent fermer toutes les interfaces SD ouvertes lors de la réception de l’une des irps suivantes :

IRP_MN_QUERY_REMOVE_DEVICE

IRP_MN_REMOVE_DEVICE

IRP_MN_SURPRISE_REMOVAL

L’exemple de code suivant illustre comment un pilote peut déréférer une interface de bus de carte SD :

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

L’appel SdBusOpenInterface stocke un pointeur vers la routine de déréférencement de l’interface dans la structure SDBUS_INTERFACE_STANDARD. Toutefois, les pilotes doivent vérifier que le pointeur n’est pas NULL avant de tenter d’appeler la routine.