Udostępnij przez


Obsługa System-Mode DMA

[Dotyczy tylko usługi KMDF]

Funkcja DMA w trybie systemowym, w przeciwieństwie do DMA głównego sterownika magistrali, opisuje konfigurację, w której wiele urządzeń współużytkuje jeden, zazwyczaj wielokanałowy kontroler DMA.

Począwszy od platformy Kernel-Mode Driver Framework (KMDF) w wersji 1.11, platforma obsługuje systemową wersję DMA w systemie w systemach opartych na mikroukładach (SoC) działających w systemie Windows 8 lub nowszych wersjach systemu operacyjnego Windows.

W tym temacie opisano kod, który sterownik KMDF musi podać w swoich funkcjach zwrotnych zdarzeń oraz opcjonalnych funkcjach zwrotnych, które może zarejestrować w celu obsługi żądań I/O dla urządzenia DMA działającego w trybie systemowym.

Aby uzyskać informacje o KMDF i DMA z bus-masteringiem, zobacz Obsługa żądań we/wy w sterowniku KMDF dla urządzenia DMA Bus-Master.

Na poniższym rysunku przedstawiono funkcje wywołania zwrotnego dla zdarzeń, z których sterownik korzysta do obsługi DMA w trybie systemowym.

Schemat blokowy przedstawiający funkcje wywołania zwrotnego zdarzeń dla implementacji DMA w trybie systemowym w sterownikach KMDF.

Tworzenie System-Mode Enablera DMA

Tworzenie profilu DMA w trybie systemowym jest procesem dwuetapowym. Poniższe kroki reprezentują typowy scenariusz:

  1. Zazwyczaj w swojej funkcji wywołania zwrotnego EvtDriverDeviceAdd, sterownik wywołuje WDF_DMA_ENABLER_CONFIG_INIT, ustawiając parametr Profile na SystemMode lub SystemModeDuplex. Następnie sterownik wywołuje WdfDmaEnablerCreate, przekazując strukturę WDF_DMA_ENABLER_CONFIG, którą właśnie otrzymał.

    Sterownik może również utworzyć aktywator podczas EvtDevicePrepareHardware.

  2. Funkcja wywołania zwrotnego sterownika EvtDevicePrepareHardware kojarzy funkcję włączania DMA z jej zasobami, wywołując metodę WdfDmaEnablerConfigureSystemProfile. W przypadku włączania dwukierunkowego sterownik wywołuje dwukrotnie funkcję WdfDmaEnablerConfigureSystemProfile , raz w celu skonfigurowania każdego kierunku transferu.

    Sterownik może wywołać metodę WdfDmaEnablerConfigureSystemProfile po zakończeniu evtDevicePrepareHardware , ale sterownik musi wywołać tę metodę przed zainicjowaniem transakcji DMA.

Umożliwienie opcjonalnych funkcji wywołania zwrotnego

Zazwyczaj sterowniki KMDF nie konfigurują kanałów DMA. Jednak w pewnych okolicznościach sterowniki mogą wymagać wykonania konfiguracji specyficznej dla kanału. Na przykład sterownik może wywołać funkcję niestandardową zaimplementowaną przez kontroler DMA, wykonując następujące czynności:

  1. W jednym z programów obsługi żądań sterownika sterownik wywołuje WdfDmaTransactionSetChannelConfigurationCallback, aby zarejestrować funkcję wywołania zwrotnego EvtDmaTransactionConfigureDmaChannel.
  2. Funkcja wywołania zwrotnego w sterowniku EvtDmaTransactionConfigureDmaChannel wywołuje funkcję WdfDmaEnablerWdmGetDmaAdapter, aby pobrać wskaźnik do WDM DMA_ADAPTER. Ta struktura jest obiektem adaptera reprezentującym kanał DMA w trybie systemowym sterownika.
  3. Sterownik może następnie wywołać metodę ConfigureAdapterChannel , aby włączyć funkcje niestandardowe implementowane przez kontroler DMA. Tę rutynę można wywołać tylko za pomocą wskaźnika pod adresem zwróconym w strukturze DMA_OPERATIONS.
  4. Sterownikowa funkcja wywołania zwrotnego EvtDmaTransactionConfigureDmaChannel zwraca wartość TRUE, jeśli pomyślnie skonfiguruje kanał DMA.
  5. Struktura wywołuje funkcję wywołania zwrotnego EvtProgramDma sterownika.

Otrzymywanie powiadomienia o zakończeniu transferu

W przeciwieństwie do urządzeń korzystających z kontrolerów masteringu magistrali, sprzęt dla urządzenia DMA w trybie systemowym może nie sygnalizować ukończenia transferu DMA, wysyłając przerwanie.

Jeśli urządzenie nie zgłasza przerwania sygnalizującego zakończenie transferu DMA, sterownik może zapewnić funkcję zdarzenia zwrotnego EvtDmaTransactionDmaTransferComplete, którą platforma wywołuje po zakończeniu transferu DMA w trybie systemowym.

Aby zarejestrować tę funkcję wywołania zwrotnego, sterownik wywołuje WdfDmaTransactionSetTransferCompleteCallback z jednego ze swoich programów obsługi żądań.