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