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


Запросы SD-карты

После того как драйвер устройства Secure Digital (SD) карта откроет и инициализирует интерфейс для драйвера шины SD, он может отправлять запросы. Существует два способа отправки запросов: синхронно с помощью процедуры SdBusSubmitRequest и асинхронно с помощью процедуры SdBusSubmitRequestAsync . Обе эти процедуры экспортируются библиотекой шины SD (sdbus.lib).

Синхронная подпрограмма запроса принимает два параметра: контекст интерфейса и пакет запроса.

Контекст интерфейса
Драйвер устройства получает контекст интерфейса из элемента Contextструктуры SDBUS_INTERFACE_STANDARD после открытия интерфейса SD с помощью SdBusOpenInterface. Драйвер должен передавать эти сведения контекста в при каждом вызове метода в интерфейсе .

Пакет запроса
Драйвер устройства должен выделить и инициализировать структуру SDBUS_REQUEST_PACKET . Эта структура определяет функцию запроса и другие характеристики запроса.

Так как SdBusSubmitRequest является синхронным, он не возвращает STATUS_PENDING. Драйвер устройства должен работать на DISPATCH_LEVEL IRQL < при вызове этой подпрограммы.

Подпрограмма асинхронного запроса принимает следующие пять параметров: контекст интерфейса, пакет запроса, IRP, указатель на подпрограмму завершения и контекст завершения.

Контекст интерфейса
Этот параметр совпадает с параметром с тем же именем, который используется в синхронном регистре.

Пакет запроса
Этот параметр совпадает с параметром с тем же именем, который используется в синхронном регистре.

IRP
Этот параметр содержит IRP, выделенный драйвером устройства, или IRP, полученный драйвером от драйвера, расположенного над ним в стеке драйверов. IRP используется в качестве оператора для запроса.

Подпрограмма завершения
Этот параметр содержит подпрограмму IoCompletion для IRP, указанной в параметре IRP.

Контекст пользователя
Этот параметр содержит указатель на данные контекста пользователя, которые система передает в подпрограмму завершения, указанную в параметре подпрограммы завершения.

При вызове подпрограммы SdBusSubmitRequestAsync драйвер устройства должен работать в среде IRQL <= DISPATCH_LEVEL. SdBusSubmitRequest — это оболочка, которая выделяет собственный IRP и вызывает SdBusSubmitRequestAsync. Он предоставляется для удобства модуля записи драйвера.

В следующих разделах приведены примеры кода, иллюстрирующие, как драйвер устройства отправляет каждую из двух основных категорий запросов SD. Описание различных запросов см. в разделе SD_REQUEST_FUNCTION.

Запросы свойств Secure Digital (SD)

Драйверы карта Secure Digital (SD) используют запросы свойств для чтения или задания свойств карта. Например, драйвер SD карта может считывать свойство , чтобы определить, находится ли переключатель защиты от записи на sd-карта в заблокированном положении или драйвер для конкретной функции в многофункциональном карта SDIO может запросить номер, который драйвер шины назначает управляемой функции.

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

 sdrp = ExAllocatePool(NonPagedPool, 
 sizeof(SDBUS_REQUEST_PACKET));
 if (!sdrp) {
 return STATUS_INSUFFICIENT_RESOURCES;
 }
 RtlZeroMemory(sdrp, sizeof(SDBUS_REQUEST_PACKET));
 sdrp->RequestFunction = SDRF_GET_PROPERTY;
 sdrp->Parameters.GetSetProperty.Property = 
 SDP_FUNCTION_NUMBER;
 sdrp->Parameters.GetSetProperty.Buffer = 
 &pDevExt->FunctionNumber;
 sdrp->Parameters.GetSetProperty.Length = 
 sizeof(pDevExt->FunctionNumber);
 status = SdBusSubmitRequest (pDevExt->BusInterface.Context,sdrp);
 ExFreePool(sdrp);
 if (!NT_SUCCESS(status)) {
 return status;
 }

В этом примере кода драйвер устройства инициализирует пакет запроса шины SD, SDBUS_REQUEST_PACKET и передает его в SdBusSubmitRequest. Полностью инициализированный пакет запроса имеет следующие характеристики:

Тип запроса
В примере кода указывается запрос SDRF_GET_PROPERTY в элементе RequestFunction пакета запроса, который указывает драйверу шины получить свойство из карта. Описание запроса SDRF_GET_PROPERTY см. в разделе SD_REQUEST_FUNCTION.

Извлекаемое свойство
В примере кода указывается свойство SDP_FUNCTION_NUMBER в элементе Parameters.GetSetProperty.Property пакета запроса, который указывает драйверу шины получить содержимое свойства номера функции. Описание свойства SDP_FUNCTION_NUMBER см. в разделе SDBUS_PROPERTY.

Содержимое и длина свойства
В этом примере кода указатель на буфер помещает в расширение устройства в

Элемент Parameters.GetSetProperty.Buffer пакета запроса. Водитель автобуса сохранит номер функции в этом расположении. В примере кода также сохраняется размер этого буфера в элементе Parameters.GetSetProperty.Length пакета запроса.

Запросы команд устройства Secure Digital (SD)

Драйверы используют Secure Digital (SD) карта запросов команд для отправки команд на устройство SD. Протокол для команд SD определен в спецификации Secure Digital Card . Драйверы могут отправлять командные запросы в любое время после успешного завершения IRP_MN_START_DEVICE IRP, запускающего устройство.

Этот раздел содержит два примера кода: командный запрос, который считывает байт данных из регистра SD-карта с помощью прямого ввода-вывода, и командный запрос устройства, который записывает больше данных в SD-карта с использованием расширенных операций ввода-вывода. Объяснение во втором разделе зависит от первого, поэтому читатели должны изучить первый раздел перед изучением второго:

Защита используемых цифровых запросов

Защита цифровых запросов, использующих расширенный ввод-вывод