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


Обработка запросов ввода-вывода в драйвере KMDF для Bus-Master устройства DMA

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

В этом разделе описано, как драйвер KMDF для устройства DMA master шины обрабатывает запрос ввода-вывода. Если вы пишете драйвер KMDF, реализующий DMA в системном режиме, см. раздел Поддержка System-Mode DMA.

Для обработки запросов ввода-вывода в драйвере KMDF для устройства DMA в шине master требуется код в нескольких функциях обратного вызова событий драйвера, как показано на следующем рисунке:

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

Как показано выше, обработка, связанная с DMA, выполняется в четыре этапа:

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

  2. Когда драйвер получает запрос ввода-вывода, требующий от устройства выполнения операции DMA, один из обработчиков запросов драйвера должен создать и инициализировать новую транзакцию DMA. (Обратите внимание, что если драйвер повторно использует объекты транзакций DMA, функция обратного вызова EvtDriverDeviceAdd драйвера может создавать объекты транзакций.) Затем обработчик запросов должен инициировать транзакцию DMA , чтобы платформа при необходимости начала разбивать транзакцию на меньшие передачи DMA и вызывать функцию обратного вызова EvtProgramDma драйвера.

  3. Функция обратного вызова EvtProgramDma вашего драйвера программирует оборудование DMA для одной передачи DMA и обеспечивает прерывания устройства.

  4. Когда устройство прерывается, платформа вызывает функцию обратного вызова EvtInterruptIsr драйвера, которая сохраняет переменные сведения об устройстве и планирует выполнение функции обратного вызова EvtInterruptDpc драйвера.

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

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

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

Некоторые драйверы используют общие буферы , к которым может получить доступ как устройство, так и драйвер.