2.27.2008

HalAllocateCommonBuffer

HalAllocateCommonBuffer

PVOID HalAllocateCommonBuffer(
PDMA_ADAPTER_OBJECT DmaAdapter,
ULONG Length,
PPHYSICAL_ADDRESS LogicalAddress,
BOOLEAN CacheEnabled
);

是要alloc一塊memory給 "不認識virtual address" 的hardware用 (?)

參數中指定需要的大小 (Length) 和 CacheEable。並且指定是要給哪一個hardware用 (DmaAdaptor)。
    pVirtDMABufferAddr =
(PBYTE)HalAllocateCommonBuffer(&Adapter,(AUDIO_DMA_PAGE_SIZE),&PhysDMABufferAddr, FALSE);
就會alloc一塊memory,memory的virtual address會return 回來,physical address 就放在 argument 的 "LogicalAddress" 中。

一般是給DMA用 (DMA只認識 physical address ?)

以 DMA 的 output channel 來看,allocate的memory,physical address要填入DMA的source pointer register。
DMA.SourceAddress = LogicalAddress。
然後,driver要藉由DMA送出資料,就要寫入 pVirtDMABufferAddr

2 則留言:

Titan.Song 提到...

HalAllocateCommonBuffer这个函数会连续的分配一段内存(虚拟和物理上都连续,比较猛!),而DMA传输的话,当然是连续的内存会比较高效一点。
所以一般用DMA会用这个函数啦。

checko 提到...

原來是這樣,感謝 !