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


Включение транзакций прямого доступа к памяти (DMA)

[Применимо только к KMDF]

Если драйвер на основе платформы обрабатывает операции ввода-вывода для устройств DMA, драйвер должен включить функции DMA платформы для каждого устройства DMA. Чтобы включить эти функции, функция обратного вызова драйвера EvtDriverDeviceAdd или EvtDevicePrepareHardware должна:

  1. Вызовите WdfDeviceSetAlignmentRequirement, чтобы задать требование к выравниванию буфера устройства.

  2. Вызовите WdfDmaEnablerCreate, чтобы указать тип операций DMA (один пакет или точечная или сборная) и максимальный размер передачи, поддерживаемый устройством. Начиная с KMDF версии 1.11 платформа поддерживает системный режим DMA в системах на микросхеме (SoC), работающих в Windows 8 или более поздних версиях операционной системы.

  3. Вызовите WdfDmaEnablerSetMaximumScatterGatherElements, чтобы указать максимальное количество элементов, которые устройство поддерживает в списке операций разброса/сбора, если устройство поддерживает такие операции.

В следующем примере кода из примера PLX9x5x показано, как включить функции DMA платформы. Этот код находится в файле init.c.

WDF_DMA_ENABLER_CONFIG   dmaConfig;

WdfDeviceSetAlignmentRequirement( DevExt->Device, PCI9656_DTE_ALIGNMENT_16 );
WDF_DMA_ENABLER_CONFIG_INIT( &dmaConfig,
                             WdfDmaProfileScatterGather64Duplex,
                             DevExt->MaximumTransferLength );
status = WdfDmaEnablerCreate( DevExt->Device,
                              &dmaConfig, 
                              WDF_NO_OBJECT_ATTRIBUTES,
                              &DevExt->DmaEnabler );

Если драйверу требуются общие буферы, функция обратного вызова драйвера EvtDriverDeviceAdd обычно настраивает их. Дополнительные сведения об этих буферах см. в разделе Использование общих буферов.

После вызова драйвера WdfDmaEnablerCreateон может вызывать WdfDmaEnablerWdmGetDmaAdapter для получения указателей на структуры WDM DMA_ADAPTER, создаваемые платформой для входных и выходных направлений устройства. Однако большинству драйверов на основе платформ не нужно обращаться к этим структурам.