Abrir, inicializar e fechar uma interface de barramento de cartão SD
Os drivers de dispositivo SD (Secure Digital) devem abrir e inicializar uma interface de barramento SD para interagir com os dispositivos que gerenciam ou com o controlador de host. Isso requer duas chamadas para a biblioteca de barramento SD: uma chamada para SdBusOpenInterface seguida de uma chamada para uma rotina fornecida pelo driver de barramento que inicializa a interface. SdBusOpenInterface retorna um ponteiro para a rotina que inicializa a interface no membro InterfaceReference da estrutura SDBUS_INTERFACE_STANDARD . O driver do dispositivo deve chamar essa rotina de inicialização para fornecer ao motorista do ônibus um ponteiro para uma rotina de retorno de chamada de notificação de interrupção. O motorista do ônibus usa esse retorno de chamada para notificar o driver do dispositivo de uma interrupção de hardware. Para obter mais informações sobre a rotina que inicializa uma interface de barramento SD, consulte PSDBUS_INITIALIZE_INTERFACE_ROUTINE. O driver do dispositivo normalmente abre e inicializa uma interface de barramento SD de dentro de sua rotina AddDevice .
O exemplo de código a seguir ilustra a sequência de chamadas que abrem e inicializam uma interface de barramento 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);
}
}
Neste exemplo de código, o driver de dispositivo chama SdBusOpenInterface para abrir a interface e o driver de barramento armazena um ponteiro para a rotina de inicialização na extensão do dispositivo (DeviceExtension-BusInterface.InitializeInterface>). Depois que SdBusOpenInterface retorna, o driver recupera esse ponteiro da extensão do dispositivo. Em seguida, o driver coloca um ponteiro para sua própria rotina de retorno de chamada de interrupção, pMyDriverCallback, na estrutura SDBUS_INTERFACE_PARAMETERS e passa essa estrutura para a rotina de inicialização.
O driver de dispositivo também deve recuperar as informações de contexto que SdBusOpenInterface retorna no membro Context da estrutura SDBUS_INTERFACE_STANDARD. Sempre que o driver chama uma rotina de interface de barramento SD, ele deve passar esses dados de contexto.
Fechando uma interface SD
Para fechar uma interface SD, os drivers devem desreferenciar a interface chamando a rotina no membro InterfaceDereference da estrutura SDBUS_INTERFACE_STANDARD, que libera todos os recursos alocados pela rotina SdBusOpenInterface . Os drivers de dispositivo SD devem fechar todas as interfaces SD abertas ao receber qualquer um dos seguintes IRPs:
O exemplo de código a seguir ilustra como um driver pode desreferenciar um SD cartão interface de barramento:
if (pDevExt->BusInterface.InterfaceDereference) {
(pDevExt->BusInterface.InterfaceDereference) (pDevExt->BusInterface.Context);
RtlZeroMemory(&pDevExt->BusInterface, sizeof(SDBUS_INTERFACE_STANDARD));
}
A chamada SdBusOpenInterface armazena um ponteiro para a rotina de desreferência da interface na estrutura SDBUS_INTERFACE_STANDARD. No entanto, os drivers devem verificar se o ponteiro não é NULL antes de tentar chamar a rotina.