Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
[Platí jenom pro KMDF]
Ovladače pro zařízení DMA někdy musí přidělit místo vyrovnávací paměti, ke kterému má zařízení i ovladač přístup. Zařízení může například zapisovat informace o přenosu, jako jsou počty bajtů, do tohoto prostoru vyrovnávací paměti a ovladač ho může přečíst, aby určil počet přenesených bajtů. Tento typ vyrovnávací paměti se nazývá společná vyrovnávací paměť.
Pokud chcete přidělit společnou vyrovnávací paměť, použije se zpětná volací funkce EvtDriverDeviceAdd vašeho ovladače:
Volá WdfDmaEnablerCreate pro vytvoření objektu povolení DMA.
Volání WdfCommonBufferCreate nebo WdfCommonBufferCreateWithConfig pro vytvoření vyrovnávací paměti.
Volá WdfCommonBufferGetAlignedLogicalAddress k získání logické adresy vyrovnávací paměti, ke které má zařízení přístup.
Volá WdfCommonBufferGetAlignedVirtualAddress, aby získal virtuální adresu vyrovnávací paměti, ke které má ovladač přístup.
Následující příklad kódu pochází ze souboru Init.c ukázky PLX9x5x. Tento kód ukazuje, jak ovladač KMDF přiděluje společný prostor vyrovnávací paměti.
// Allocate common buffer for building writes
DevExt->WriteCommonBufferSize =
sizeof( DMA_TRANSFER_ELEMENT) * DevExt->WriteTransferElements;
status = WdfCommonBufferCreate( DevExt->DmaEnabler,
DevExt->WriteCommonBufferSize,
WDF_NO_OBJECT_ATTRIBUTES,
&DevExt->WriteCommonBuffer );
if (!NT_SUCCESS(status)) {
. . . //Error-handling code omitted
}
DevExt->WriteCommonBufferBase =
WdfCommonBufferGetAlignedVirtualAddress(
DevExt->WriteCommonBuffer);
DevExt->WriteCommonBufferBaseLA =
WdfCommonBufferGetAlignedLogicalAddress(
DevExt->WriteCommonBuffer);
RtlZeroMemory( DevExt->WriteCommonBufferBase, DevExt->WriteCommonBufferSize);
Pokud ovladač volá WdfDeviceSetAlignmentRequirement před voláním WdfDmaEnablerCreate, vyrovnávací paměti, které jsou vytvořeny funkcí WdfDmaEnablerCreate, se zarovnají na hranici adresy paměti, kterou ovladač specifikoval pro WdfDeviceSetAlignmentRequirement. V opačném případě se běžné vyrovnávací paměti zarovnají na hranice slovních adres. Ovladač může také zavolat WdfCommonBufferCreateWithConfig, aby určil zarovnání pro jednu vyrovnávací paměť.
Chcete-li získat délku společné vyrovnávací paměti, kterou ovladač přidělil, může ovladač použít funkci WdfCommonBufferGetLength.
Když ovladač dokončí používání společné vyrovnávací paměti, volá WdfObjectDelete.