對外設進行
I/O
操作實際上也就是讀寫外設的寄存器,而我們通常使用的X86或者ARM處理器在硬件上決定了wince系統啟動后,無法直接訪問物理地址,因此需要做一些工作來實現I/O操作.
首先要理解
windows CE
下的地址映射機制。
wince有兩種地址:物理地址和虛擬地址.不同架構的
CPU
硬件上的區別導致地址映射也不同。MIPS和SH
x
處理器,不采用MMU,直接在CPU和內核里定義
1G
的物理地址;而X86和ARM帶有
MMU
單元,在
OEMAddressTable
中定義物理地址到虛擬地址間的映射關系或者是OS啟動后調用
CreateStaticMapping
和
NKCreateStaticMapping
來實現從虛擬地址到物理地址的靜態映射.經過靜態映射的地址,可以由操作系統內核用于
ISR
訪問設備。如果我們要在應用程序中訪問外設,必須在物理地址和虛擬地址間建立動態映射關系,我們可以使用
VirtualAlloc
和
VirtualCopy
(或者直接調用
MmmapIoSpace
函數)來實現。
其次,如果是操作通過總線掛接的
I/O
或者存儲器,必須先把總線地址轉化成
CPU
上的系統地址,再做物理地址到虛擬地址的映射。這里需要查
CPU
的
Datasheet
,找出所要操作的I/O地址.先調用
HALTranslateBusAddress( )把總線地址轉化成CPU上的系統地址,
再調用
MmmapIoSpace
函數實現虛實映射;也可以使用
TransBusAddrToVirtual
()直接把總線上的地址轉化成系統的虛擬地址。
第三,在一般的應用程序中訪問
I/O
是訪問它的緩存段虛擬地址,而驅動中必須訪問無緩存段虛擬地址。簡單來說無緩存段虛擬地址
=
緩存段虛擬地址
+0x20000000
。
??? 總結起來,如果是
wince
內核(如HAL)訪問外部
I/O
,只需要在
OEMAddressTable
中定義物理地址到虛擬地址間的映射關系就可以了;如果是應用程序或者驅動要訪問
I/O
,要做的工作包括:
1
。在
CPU
物理地址和虛擬地址間做一個動態映射,
2
。對虛擬地址進行操作。