Поделиться через


Открытие, инициализация и закрытие интерфейса шины SD-карты

Драйверы устройств Secure Digital (SD) должны открыть и инициализировать интерфейс шины SD для взаимодействия с управляемыми ими устройствами или контроллером узла. Для этого требуется два вызова библиотеки шины SD: вызов SdBusOpenInterface , за которым следует вызов подпрограммы, предоставляемой драйвером шины, который инициализирует интерфейс. SdBusOpenInterface возвращает указатель на подпрограмму, которая инициализирует интерфейс в элементе InterfaceReferenceструктуры SDBUS_INTERFACE_STANDARD . Драйвер устройства должен вызвать эту подпрограмму инициализации, чтобы предоставить драйверу шины указатель на подпрограмму обратного вызова уведомления о прерывании. Драйвер шины использует этот обратный вызов для уведомления драйвера устройства об аппаратном прерывании. Дополнительные сведения о подпрограмме, которая инициализирует интерфейс sd-шины, см. в разделе PSDBUS_INITIALIZE_INTERFACE_ROUTINE. Драйвер устройства обычно открывает и инициализирует интерфейс шины SD из своей процедуры AddDevice .

В следующем примере кода показана последовательность вызовов, которые открывают и инициализируют интерфейс шины 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);
    }
      }

В этом примере кода драйвер устройства вызывает SdBusOpenInterface, чтобы открыть интерфейс, а драйвер шины сохраняет указатель на подпрограмму инициализации в расширении устройства (DeviceExtension-BusInterface.InitializeInterface>). После возврата SdBusOpenInterface драйвер получает этот указатель из расширения устройства. Затем драйвер помещает указатель на собственную процедуру обратного вызова прерывания pMyDriverCallback в структуру SDBUS_INTERFACE_PARAMETERS и передает эту структуру в подпрограмму инициализации.

Драйвер устройства также должен получить сведения о контексте, возвращаемые SdBusOpenInterface в элементе Context структуры SDBUS_INTERFACE_STANDARD. Всякий раз, когда водитель вызывает подпрограмму интерфейса sd bus, он должен передавать данные этого контекста.

Закрытие интерфейса SD

Чтобы закрыть интерфейс SD, драйверы должны разыменовать интерфейс, вызвав подпрограмму в элементе InterfaceDereference структуры SDBUS_INTERFACE_STANDARD, которая освобождает все ресурсы, выделенные подпрограммой SdBusOpenInterface . Драйверы sd-устройств должны закрывать все открытые интерфейсы SD при получении любого из следующих irP:

IRP_MN_QUERY_REMOVE_DEVICE

IRP_MN_REMOVE_DEVICE

IRP_MN_SURPRISE_REMOVAL

В следующем примере кода показано, как драйвер может разыменовыть интерфейс sd карта шины:

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

Вызов SdBusOpenInterface сохраняет указатель на подпрограмму разыменования интерфейса в структуре SDBUS_INTERFACE_STANDARD. Однако драйверы должны убедиться, что указатель не равен NULL , прежде чем пытаться вызвать подпрограмму.