<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Windows CE下驅動(dòng)程序開(kāi)發(fā)基礎(二)

Windows CE下驅動(dòng)程序開(kāi)發(fā)基礎(二)

作者: 時(shí)間:2006-12-09 來(lái)源:網(wǎng)絡(luò ) 收藏
函數SerInit接著(zhù)調用函數Ser_InternalMapRegisterAddresses轉換地址并且映射地址,Ser_InternalMapRegisterAddresses在內部調用系統提供的HalTranslateBusAddress(Isa, 0, ioPhysicalBase, inIoSpace, ioPhysicalBase)函數將與總線(xiàn)相關(guān)的地址轉換為系統地址,參數1為總線(xiàn)類(lèi)型,參數2為總線(xiàn)號,參數3為要轉換的地址(PHYSICAL_ADDRESS類(lèi)型,實(shí)際是LARGE_INTEGER型),參數4指定地址屬于地址空間還是物理地址空間,參數5返回轉換后的物理地址。觀(guān)察HalTranslateBusAddress的源碼得知如果是在x86平臺,這個(gè)函數除了把參數3賦給了參數5其余什么都沒(méi)有做,而非x86平臺將inIoSpace的值置為0,表示一定是物理地址。在調用HalTranslateBusAddress前要確定從注冊表中得到的地址到底是屬于哪個(gè)地址空間的,例如:

ULONG inIoSpace = 1; ///1表示是空間

PHYSICAL_ADDRESS ioPhysicalBase = {iobase, 0}; ///相當于ioPhysicalBase.LowPart = iobase

本文引用地址:http://dyxdggzs.com/article/258281.htm


  在地址轉換后就要將轉換后的地址映射到驅動(dòng)程序(一般IST和應用程序一樣運行在用戶(hù)模式)能夠訪(fǎng)問(wèn)的虛擬地址空間(0x80000000以下)和ISR能夠訪(fǎng)問(wèn)的靜態(tài)虛擬地址空間中(0x80000000以上)。例如:

////如果地址屬于物理地址空間

ioPortBase = (PUCHAR)MmMapIoSpace(ioPhysicalBase, Size, FALSE);
TransBusAddrToStatic(Isa, 0, ioPhysicalBase, Size, inIoSpace, ppStaticAddress);


  MmMapIoSpace函數負責將物理地址映射到驅動(dòng)程序能夠訪(fǎng)問(wèn)的虛擬地址空間中,通過(guò)源碼分析MmMapIoSpace在內部分別調用:

pVirtualAddress =VirtualAlloc(0, SourceSize, MEM_RESERVE, PAGE_NOACCESS);

VirtualCopy(pVirtualAddress, (PVOID)(SourcePhys >> 8), SourceSize, PAGE_PHYSICAL | PAGE_READWRITE |
(CacheEnable ? 0 : PAGE_NOCACHE));


  VirtualAlloc分配一塊和MemLen一樣大小的虛擬地址空間,因為參數1為0,所以?xún)群俗詣?dòng)分配。一般MemLen小于2MB,所以會(huì )在應用程序的地址空間中分配。VirtualCopy負責將硬件設備的物理地址與VirtualAlloc分配的虛擬地址做一個(gè)映射關(guān)系,這樣驅動(dòng)程序訪(fǎng)問(wèn)PvirtualAddress實(shí)際上就是訪(fǎng)問(wèn)第一個(gè)寄存器。因為硬件設備寄存器的物理地址一定是在512MB(CE支持RAM的最大值)以上,所以除了最后的參數要加PAGE_PHYSICAL外,第二個(gè)參數物理地址也要右移8位(或者除以256)。

映射硬件寄存器當然PAGE_NOCACHE是必須加的。TransBusAddrToStatic函數負責將物理地址映射到ISR能夠訪(fǎng)問(wèn)的靜態(tài)虛擬地址空間中,當出現中斷共享時(shí),ISR要負責訪(fǎng)問(wèn)硬件設備的某一個(gè)寄存器來(lái)判斷中斷源,所以將寄存器的物理地址映射到靜態(tài)虛擬地址空間中是必要的(ISR只能訪(fǎng)問(wèn)靜態(tài)的虛擬地址空間)。所謂靜態(tài)虛擬地址空間是指在OEMAddressTable中定義的虛擬地址空間(當然是0x80000000以上)。在x86平臺一般這個(gè)表只定義RAM的物理地址與虛擬地址對應關(guān)系,而硬件設備的寄存器地址并不在該表中定義,所以如果要創(chuàng )建一塊靜態(tài)的虛擬地址空間供ISR訪(fǎng)問(wèn),必須在此之前調用CreateStaticMapping函數在0xC4000000到0xE0000000虛擬地址空間中分配。TransBusAddrToStatic函數在內部就是調用了CreateStaticMapping函數。注:硬件設備的寄存器地址也可以在OEMAddressTable中定義。

////如果地址屬于IO空間

ioPortBase = (PUCHAR)ioPhysicalBase.LowPart;
*ppStaticAddress=ioPortBase


  這種情況只屬于x86平臺,是IO空間就可以直接訪(fǎng)問(wèn),即使是用戶(hù)模式。

  SerInit函數接著(zhù)初始化SER_INFO結構體成員,之后調用SL_Init函數,這個(gè)函數在ser16550中定義,負責初始化SER16550_INFO結構體,在這個(gè)結構體中保存串口8個(gè)寄存器的地址。SerInit函數執行完畢后COM_Init函數創(chuàng )建接收緩沖區,然后調用StartDispatchThread函數初始化中斷并且創(chuàng )建IST。StartDispatchThread函數在內部調用InterruptInitialize函數關(guān)聯(lián)SysIntr和Event,然后調用InterruptDone函數告訴內核當前串口可以中斷處理,接著(zhù)調用CreateThread函數創(chuàng )建IST線(xiàn)程。(over吧,再往下說(shuō)就和串口硬件有關(guān)了,看多了沒(méi)注釋的代碼我也煩?。。?/p>



關(guān)鍵詞: IO 寄存器

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>