Udostępnij przez


Obiekty kanału DMA

Uwaga / Notatka

Firma Microsoft obsługuje zróżnicowane i inkluzywne środowisko. Ten artykuł zawiera odwołania do terminologii, którą przewodnik stylu Microsoft dotyczący komunikacji bezstronnej uznaje za wykluczającą. Słowo lub fraza jest używana w tym artykule na potrzeby spójności, ponieważ jest ona obecnie wyświetlana w oprogramowaniu. Po zaktualizowaniu oprogramowania w celu usunięcia języka ten artykuł zostanie zaktualizowany tak, aby był wyrównany.

Sterownik systemowy PortCls implementuje interfejsy IDmaChannel iIDmaChannelSlave z korzyścią dla sterowników WaveCyclic i WavePci miniport. IDmaChannel reprezentuje kanał DMA oraz skojarzony z nim bufor DMA i parametry użycia buforu. Ponadto sterowniki miniportu WaveCyclic używają IDmaChannelSlave do zarządzania kanałem DMA dla urządzenia podrzędnego. IDmaChannelSlave dziedziczy z IDmaChannel. Aby uzyskać informacje na temat kontrolowania operacji DMA, zobacz Adapter Objects and DMA (Obiekty adaptera i DMA).

Obiekt IDmaChannel hermetyzuje następujące elementy:

  • Kanał DMA dla urządzenia głównego lub podrzędnego

  • Bufor danych skojarzony z kanałem

  • Informacje opisujące sposób użycia kanału

Sterowniki portów i miniportów używają obiektów kanału DMA do przekazywania informacji dotyczących użycia kanału DMA. Zazwyczaj sterownik miniportu przydziela zestaw kanałów DMA podczas inicjowania lub podczas tworzenia strumienia. Podczas tworzenia nowego strumienia sterownik miniportu informuje sterownik portu, który obiekt kanału DMA zostanie użyty dla strumienia.

Obiekt kanału DMA można utworzyć dla urządzenia głównego lub podrzędnego:

  • Urządzenie podrzędne nie ma wbudowanych funkcji sprzętowych DMA i musi polegać na kontrolerze DMA systemu, aby wykonywać transfery danych wymagane przez urządzenie.

  • Urządzenie główne korzysta z własnego sprzętu do bus-mastering DMA, aby wykonywać transfery danych na magistrali systemowej.

Aby zapoznać się z przykładem urządzenia WaveCyclic korzystającego z podrzędnego obiektu kanału DMA, zobacz przykładowy sterownik audio Sb16 we wcześniejszych wersjach zestawu Microsoft Windows Driver Kit (WDK). Główny obiekt kanału DMA stanowi głównie podstawę do udostępniania informacji o kanale DMA między sterownikami portów i miniportów. Aby uzyskać więcej informacji na temat urządzeń głównych i podrzędnych, zobacz Wprowadzenie do obiektów adaptera.

Obiekt kanału DMA dla głównego lub podrzędnego urządzenia uwidacznia następujące elementy:

  • Obiekt adaptera

  • Jeden wspólny bufor, który może współużytkować sterownik i sprzęt DMA

  • Wartość rozmiaru buforu, którą można wykonywać zapytania i zmieniać

Obiekt adaptera jest strukturą adaptera DMA dla obiektu urządzenia fizycznego (PDO). Obiekt adaptera jest tworzony automatycznie, gdy sterownik miniportu tworzy obiekt kanału DMA, wywołując jedną z następujących metod:

IPortWavePci::NewMasterDmaChannel

IPortWaveCyclic::NewMasterDmaChannel

IPortWaveCyclic::NewSlaveDmaChannel

Metoda IDmaChannel::GetAdapterObject może służyć do uzyskania wskaźnika do obiektu adaptera.

Sterownik adaptera może również wywołać funkcję PcNewDmaChannel w celu utworzenia obiektu kanału DMA, ale ta funkcja jest trudniejsza do użycia niż wywołania IPortWaveXxx::NewXxxDmaChannel , ponieważ obiekt wywołujący musi jawnie określić obiekt urządzenia i inne informacje kontekstowe.

W przypadku kanału DMA dla urządzenia podrzędnego metoda IDmaChannel::TransferCount zwraca maksymalny rozmiar transferu (parametr MapSize ), który został określony w wywołaniu IDmaChannelSlave::Start. Ponadto obiekt adaptera udostępnia niektóre metody manipulowania urządzeniem DMA i wykonywania względem nich zapytań. Żadna z tych metod nie ma znaczenia dla głównych kanałów DMA.

IDmaChannel::AllocateBuffer i IDmaChannel::FreeBuffer są używane do zarządzania pojedynczym wspólnym buforem skojarzonym z obiektem kanału DMA. Bufor przydzielony przez obiekt ma gwarancję dostępności zarówno dla sterownika (z adresami pamięci wirtualnej jądra) jak i urządzenia DMA (z adresami pamięci fizycznej). Ponadto bufor będzie fizycznie ciągły. Zazwyczaj najlepszą strategią jest przydzielenie buforu DMA podczas inicjowania sterownika miniportu, kiedy fizycznie przylegająca pamięć jest najbardziej dostępna. IDmaChannel::AllocatedBufferSize zwraca rozmiar buforu, jak określono w wywołaniu metody IDmaChannel::AllocateBuffer.

IDmaChannel::MaximumBufferSize wskazuje rzeczywisty maksymalny rozmiar buforu, którego można użyć. Może to przekroczyć przydzielony rozmiar, jeśli przydzielony rozmiar nie jest wielokrotnością rozmiaru strony. Może to być mniejsze niż przydzielony rozmiar, jeśli urządzenie DMA nie może obsługiwać transferów przydzielonego rozmiaru. IDmaChannel::BufferSize i IDmaChannel::SetBufferSize służą do wykonywania zapytań i ustawiania rozmiaru buforu do użycia na potrzeby transferów DMA. Po przydzieleniu buforu rozmiar buforu jest ustawiany na maksymalny rozmiar buforu. Po zainicjowaniu zarówno sterownik portu, jak i sterownik miniportu mają możliwość zmiany rozmiaru buforu lub odnalezienia jego bieżącej wartości. Sterownik miniportu używa wyniku identyfikatora IDmaChannel::BufferSize , aby określić rozmiar transferu operacji DMA podczas uruchamiania kanału DMA. IDmaChannel::SystemAddress i IDmaChannel::P hysicalAddress są używane do uzyskiwania odpowiednio wirtualnych i fizycznych adresów buforu.

IDmaChannel::CopyTo i IDmaChannel::CopyFrom skopiuj przykładowe dane do i z buforu DMA. Sterownik portu WaveCyclic wywołuje te metody, aby skopiować dane audio między buforem aplikacji a buforem cyklicznym sterownika miniportu.

Bufor DMA nie musi być używany do transferu przesyłanych strumieniowo danych. W przypadku sterownika portu WavePci przesyłane strumieniowo dane są dostarczane do sterownika miniportu (lub pobierane z niego) jako lista mapowań scatter/gather. Jednak sterownik miniportu może nadal korzystać z buforu DMA jako miejsca pamięci udostępnionej do komunikacji z sterownikiem karty.

Sterowniki portów zapewniają sterowniki miniportów z funkcjami, których mogą używać do tworzenia kanałów DMA. O ile nie określono inaczej w opisie sterownika portu, nie jest absolutnie konieczne użycie obiektów DMA przydzielonych ze sterownika portu. Sterownik portu wymaga po prostu wskaźnika do interfejsu IDmaChannel , który obsługuje potrzebne metody. Zapoznaj się z dokumentacją każdego sterownika portu, aby uzyskać listę metod kanału DMA, których wymaga sterownik portu.

Zazwyczaj najprostszym rozwiązaniem jest użycie funkcji alokacji kanału DMA implementujących sterownik portu. W rzadkich przypadkach deweloperzy sterowników miniportu mogą wymagać zaimplementowania własnych obiektów kanału DMA w celu spełnienia specjalnych wymagań określonych adapterów. Czasami wymaga to implementacji nowego obiektu. W innych przypadkach wystarczy, aby obiekt strumienia sterownika miniportu uwidocznił interfejs IDmaChannel i zaimplementował metody kanału DMA.

Interfejs IDmaChannel obsługuje następujące metody:

IDmaChannel::AllocateBuffer

IDmaChannel::AllocatedBufferSize

IDmaChannel::BufferSize

IDmaChannel::CopyFrom

IDmaChannel::CopyTo

IDmaChannel::FreeBuffer

IDmaChannel::GetAdapterObject

IDmaChannel::MaximumBufferSize

IDmaChannel::PhysicalAddress

IDmaChannel::SetBufferSize

IDmaChannel::SystemAddress

IDmaChannel::TransferCount

Interfejs IDmaChannelSlave rozszerza IDmaChannel , dodając następujące metody:

IDmaChannelSlave::ReadCounter

IDmaChannelSlave::Start

IDmaChannelSlave::Stop

IDmaChannelSlave::WaitForTC