Создание и инициализация транзакции DMA

[Относится только к KMDF]

Прежде чем драйвер сможет отправить запрос ввода-вывода на устройство DMA, драйвер должен:

  1. Вызовите WdfDmaTransactionCreate , чтобы создать объект транзакции DMA для запроса.

  2. Вызовите WdfDmaTransactionInitializeUsingRequest, WdfDmaTransactionInitialize или WdfDmaTransactionInitializeUsingOffset для инициализации объекта транзакции.

Как правило, драйвер создает транзакцию DMA , так как обработчик запросов получил объект запроса платформы и должен передать запрос оборудованию. В этом случае драйвер должен вызвать WdfDmaTransactionInitializeUsingRequest, который принимает дескриптор объекта запроса в качестве входных данных и извлекает параметры адреса запроса из объекта запроса.

Если драйвер должен создать транзакцию DMA, которая не основана на объекте запроса платформы, полученном драйвером, драйвер может вызвать WdfDmaTransactionInitialize или WdfDmaTransactionInitializeUsingOffset. Оба метода принимают параметры адреса, которые предоставляет драйвер.

Для всех трех методов инициализации в качестве входного параметра требуется адрес функции обратного вызова события EvtProgramDma . Эта функция обратного вызова программируется на устройстве, а платформа вызывает функцию обратного вызова каждый раз, когда доступна передача DMA .

Когда драйвер вызывает WdfDmaEnablerCreate для создания объекта включения DMA, драйвер предоставляет WDF_DMA_ENABLER_CONFIG структуру, содержащую максимальную длину передачи устройства. Платформа использует это значение в качестве максимальной длины по умолчанию для всех передач DMA.

Для некоторых типов транзакций DMA может потребоваться указать максимальную длину передачи, которая отличается от максимальной длины устройства по умолчанию. Вы можете использовать WdfDmaTransactionSetMaximumLength , чтобы задать максимальную длину передачи для отдельной транзакции. Платформа использует указанную максимальную длину передачи только во время обработки указанной транзакции.

Обратите внимание, что максимальная длина передачи ограничена количеством регистров карты , которые операционная система делает доступными для объекта средства включения DMA. Чтобы определить максимальную длину передачи, драйвер может вызвать WdfDmaEnablerGetFragmentLength. Если значение, возвращаемое WdfDmaEnablerGetFragmentLength , меньше максимальной длины передачи, предоставленной драйвером для WdfDmaEnablerCreate, платформа использует меньшее значение.

После создания и инициализации транзакции DMA драйвер должен запустить транзакцию.