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


Создание и инициализация транзакции 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 драйвер должен запустить транзакцию.