Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
[Применимо только к KMDF]
DMA в системном режиме, в отличие от DMA шина-мастер, описывает конфигурацию, в которой несколько устройств совместно используют один, как правило, многоканальный контроллер DMA.
Начиная с Kernel-Mode Driver Framework (KMDF) версии 1.11 платформа поддерживает системный режим DMA в системе на микросхеме (SoC) на основе систем, работающих в windows 8 или более поздних версиях операционной системы Windows.
В этом разделе описывается код, который драйвер KMDF должен предоставлять в своих функциях обратного вызова событий, а также необязательных функциях обратного вызова событий, которые он может зарегистрировать, для обработки запросов ввода-вывода для устройства DMA в системном режиме.
Сведения о KMDF и управлении DMA с использованием шины см. в разделе о том, как обрабатывать запросы ввода-вывода в KMDF-драйвере для устройства DMA Bus-Master.
На следующем рисунке показаны функции обратного вызова событий, используемые драйвером для поддержки DMA в системном режиме:
Создание активатора DMA System-Mode
Создание профиля DMA в системном режиме — это двухэтапный процесс. Следующие шаги представляют собой типичный сценарий:
Как правило, в функции обратного вызова EvtDriverDeviceAdd драйвер вызывает WDF_DMA_ENABLER_CONFIG_INIT, задав параметр профиля для SystemMode или SystemModeDuplex. Затем драйвер вызывает WdfDmaEnablerCreate, передав структуру WDF_DMA_ENABLER_CONFIG, которую он только что получил.
Драйвер может, альтернативно, создать драйвер включения во время EvtDevicePrepareHardware.
Функция обратного вызова драйвера EvtDevicePrepareHardware связывает инициатор DMA с его ресурсами DMA, вызывая метод WdfDmaEnablerConfigureSystemProfile. Для дуплексного включения драйвер вызывает WdfDmaEnablerConfigureSystemProfile дважды, чтобы настроить каждое направление передачи.
Драйвер может вызывать WdfDmaEnablerConfigureSystemProfile после завершения EvtDevicePrepareHardware, но драйвер должен вызвать этот метод, прежде чем он инициализирует транзакции DMA.
Предоставление дополнительных функций обратного вызова
Как правило, драйверы KMDF не настраивают каналы DMA. Однако в определенных обстоятельствах драйверам может потребоваться выполнить настройку для конкретного канала. Например, драйвер может вызвать пользовательскую функцию, реализованную контроллером DMA, выполнив следующие действия.
- В одном из обработчиков запросов драйвера , драйвер вызывает функцию WdfDmaTransactionSetChannelConfigurationCallback, чтобы зарегистрировать функцию обратного вызова EvtDmaTransactionConfigureDmaChannel.
- Функция обратного вызова вашего драйвера EvtDmaTransactionConfigureDmaChannel вызывает WdfDmaEnablerWdmGetDmaAdapter для получения указателя на DMA_ADAPTERWDM. Эта структура — это объект адаптера, представляющий канал DMA в системном режиме драйвера.
- Затем драйвер может вызвать ConfigureAdapterChannel, чтобы включить пользовательские функции, реализованные контроллером DMA. Эта подпрограмма вызывается только указателем из адреса, возвращаемого в структуре DMA_OPERATIONS.
- Функция обратного вызова драйвера EvtDmaTransactionConfigureDmaChannel возвращает значение TRUE, если она успешно настраивает канал DMA.
- Платформа вызывает функцию обратного вызова драйвера EvtProgramDma.
Получение уведомления о завершении передачи
В отличие от устройств, использующих контроллеры шины, оборудование DMA в системном режиме может не сигнализировать о завершении передачи DMA путем выдачи прерывания.
Если устройство не вызывает прерывание для сигнализации завершения передачи DMA, драйвер может предоставить EvtDmaTransactionDmaTransferComplete функцию обратного вызова событий, которую фреймворк вызывает при завершении передачи DMA в системном режиме.
Чтобы зарегистрировать эту функцию обратного вызова, драйвер вызывает WdfDmaTransactionSetTransferCompleteCallback из одного из обработчиков запросов.