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


Поддержка System-Mode DMA

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

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

Начиная с Kernel-Mode Driver Framework (KMDF) версии 1.11, платформа поддерживает системный режим DMA в системах на микросхеме (SoC), работающих в Windows 8 или более поздних версиях операционной системы Windows.

В этом разделе описывается код, который драйвер KMDF должен предоставить в своих функциях обратного вызова событий, а также необязательные функции обратного вызова событий, которые он может регистрировать для обработки запросов ввода-вывода для устройства DMA в системном режиме.

Сведения о KMDF и master DMA см. в статье Обработка запросов ввода-вывода в драйвере KMDF для Bus-Master устройства DMA.

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

Блок-схема, показывающая функции обратного вызова событий для реализации DMA в системном режиме в драйверах KMDF.

Создание System-Mode enabler DMA

Создание профиля DMA в системном режиме состоит из двух этапов. Ниже приведен типичный сценарий.

  1. Как правило, в функции обратного вызова EvtDriverDeviceAdd драйвер вызывает WDF_DMA_ENABLER_CONFIG_INIT, задав для параметра Profile значение SystemMode или SystemModeDuplex. Затем драйвер вызывает WdfDmaEnablerCreate, передавая только что полученную структуру WDF_DMA_ENABLER_CONFIG .

    Драйвер также может создать средство включения во время EvtDevicePrepareHardware.

  2. Функция обратного вызова EvtDevicePrepareHardware вашего драйвера связывает активатор DMA с его ресурсами DMA путем вызова метода WdfDmaEnablerConfigureSystemProfile . Для дуплексного включения драйвер вызывает WdfDmaEnablerConfigureSystemProfile дважды, один раз, чтобы настроить каждое направление передачи.

    Драйвер может вызывать WdfDmaEnablerConfigureSystemProfile после завершения работы EvtDevicePrepareHardware , но драйвер должен вызвать этот метод, прежде чем инициализировать транзакции DMA.

Предоставление необязательных функций обратного вызова

Как правило, драйверы KMDF не настраивают каналы DMA. Однако в некоторых случаях драйверам может потребоваться выполнить настройку канала. Например, драйвер может вызвать пользовательскую функцию, реализованную контроллером DMA, выполнив следующие действия:

  1. В одном из обработчиков запросов драйвера драйвер вызывает WdfDmaTransactionSetChannelConfigurationCallback для регистрации функции обратного вызова EvtDmaTransactionConfigureDmaChannel .
  2. Функция обратного вызова EvtDmaTransactionConfigureDmaChannel вашего драйвера вызывает WdfDmaEnablerWdmGetDmaAdapter , чтобы получить указатель на DMA_ADAPTER WDM. Эта структура представляет собой объект адаптера, представляющий системный канал DMA драйвера.
  3. Затем драйвер может вызвать ConfigureAdapterChannel , чтобы включить пользовательские функции, реализованные контроллером DMA. Эта подпрограмма может вызываться только указателем из адреса, возвращаемого в DMA_OPERATIONS структуре.
  4. Функция обратного вызова EvtDmaTransactionConfigureDmaChannel вашего драйвера возвращает значение TRUE, если канал DMA успешно настроен.
  5. Платформа вызывает функцию обратного вызова EvtProgramDma драйвера.

Получение уведомления о завершении передачи

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

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

Чтобы зарегистрировать эту функцию обратного вызова, драйвер вызывает WdfDmaTransactionSetTransferCompleteCallback из одного из своих обработчиков запросов.