Открытие, инициализация и закрытие интерфейса шины 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:
В следующем примере кода показано, как драйвер может разыменовыть интерфейс sd карта шины:
if (pDevExt->BusInterface.InterfaceDereference) {
(pDevExt->BusInterface.InterfaceDereference) (pDevExt->BusInterface.Context);
RtlZeroMemory(&pDevExt->BusInterface, sizeof(SDBUS_INTERFACE_STANDARD));
}
Вызов SdBusOpenInterface сохраняет указатель на подпрограмму разыменования интерфейса в структуре SDBUS_INTERFACE_STANDARD. Однако драйверы должны убедиться, что указатель не равен NULL , прежде чем пытаться вызвать подпрограмму.