Ouverture, initialisation et fermeture d’une interface de bus de carte SD
Les pilotes de périphérique Secure Digital (SD) 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 de bus stocke un pointeur vers la routine d’initialisation dans l’extension de périphérique (DeviceExtension-BusInterface.InitializeInterface>). Une fois que SdBusOpenInterface est retourné, 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 passe cette structure à la routine d’initialisation.
Le pilote de périphérique doit également récupérer les informations de contexte que SdBusOpenInterface retourne 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 dans ce contexte des données.
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’un des IRP suivants :
L’exemple de code suivant illustre comment un pilote peut déréférencer une interface de bus SD carte :
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 d’interface dans la structure SDBUS_INTERFACE_STANDARD. Toutefois, les pilotes doivent vérifier que le pointeur n’est pas NULL avant d’essayer d’appeler la routine.