Abrir, inicializar e fechar uma interface de barramento de cartão SD
Os controladores de dispositivo Secure Digital (SD) devem abrir e inicializar uma interface de barramento SD para interagir com os dispositivos que gerem ou com o controlador host. Isso requer duas chamadas para a biblioteca do barramento SD: uma chamada para SdBusOpenInterface seguida por uma chamada para uma rotina fornecida pelo controlador do 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 de dispositivo deve chamar essa rotina de inicialização para fornecer ao driver de barramento um ponteiro para uma rotina de retorno de chamada de notificação de interrupção. O condutor do autocarro usa esse retorno de chamada para notificar o driver de 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 de dispositivo normalmente abre e inicializa uma interface de barramento SD a partir da 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 de 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 motorista chama uma rotina de interface de barramento SD, ele deve passar dados neste 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 cancelar a referência de uma interface de barramento de cartão SD:
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 para a interface na estrutura SDBUS_INTERFACE_STANDARD. No entanto, os drivers devem verificar se o ponteiro não está NULL antes de tentar chamar a rotina.