PVOID MmMapIoSpace(
IN PHYSICAL_ADDRESS PhysicalAddress,
IN ULONG NumberOfBytes,
IN MEMORY_CACHING_TYPE CacheType
);
//----example:
PHYSICAL_ADDRESS RegPA;
ULONG uBase;
RegPA.QuadPart = 0xA0000000;
uBase = (ULONG)MmMapIoSpace(RegPA, 4, 0);
//----
//Header: CEDDK.h
//Link Library: CEDDK.lib
出現link error的話,把ceddk.lib的path加到
Project -> Settings -> Link的object/library modules應該就可以過了
from WinCE driver and BSP Develop blog
驅動開發過程中可能遇到以下幾種與內在訪問相關的情況:
1.CPU訪問設備寄存器:
在ARM中可以直接將設備的寄存器映射到ARM的存儲空間中,我們需要使用幾個函數將硬體寄存器位址映射到系統空間:
如果已知硬體的虛擬位址,可以使用VirtualAlloc,VirtualCopy,
如果已知硬體的物理位址,需要使用MmMapIoSpace映射.
2.CPU與DMA或其他硬體交換資料。
DMA需要使用物理位址,因為DMA訪問記憶體時不會向CPU一樣先經過MMU,所以它使用物理位址。如果硬體需要與CPU交互資料,比如CPU需要將圖像畫到LCD控制器使用的記憶體中,LCD才會將其顯示出來。我們在設置硬體硬體時需要將CPU使用的虛擬位址轉換成物理位址,再告訴硬體物理位址。通常有以下幾種辦法:
1. 為該硬體保留一塊記憶體空間。一般用於記憶體使用量比較大的,且位址不再改變的設備,例如LCD控制器。
記錄下該塊記憶體的物理位址給硬體使用,計算出該塊記憶體的虛擬位址位址給CPU使用。
2. 當驅動需要訪問硬體時才將虛擬位址轉換成物理位址,一般用在記憶體空間經常變化的場合。例如塊設備的驅動,檔系統或者其他上層程式讀寫資料時並不會保證每次使用同一段位址。這種情況下,可以使用LockPages函數將虛擬位址轉換成物理位址。
3. 分配一塊物理位址,這可以用在記憶體位址不需要變化,且用量不大的情況,這時可以用AllocPhysMem分配一塊位址,同時得到物理位址與虛擬位址。
Thursday, October 11, 2007
Mapping physical to virtual address
Posted by cins at 11:03 AM
Labels: Application Programming, WinCE 筆記
Subscribe to:
Post Comments (Atom)
0 comments:
Post a Comment