榪欐槸鎴戜粠1鏈?鏃ュ紑濮嬩富鎸佸ぉ鏋佺綉璁哄潧宓屽叆寮忓紑鍙戠増浠ユ潵絎竴嬈″彂琛ㄦ枃绔狅紝鍔犱笂浠ュ墠鐞愮鐨勬枃绔犲叡
璁?0綃囥傜爺絀剁殑瓚婂灝辮秺鎰熻鑷繁鎳傜殑澶皯錛屽叾瀹炲湪椹卞姩寮鍙戞柟闈㈡垜榪樻槸涓彍楦燂紝鎴戞槸鎯沖啀嬈℃姏鐮栧紩鐜夛紝璁╁仛椹卞姩鏈塏騫寸粡楠岀殑浜哄鐚竴鐐瑰嚭鏉ワ紝璁╁ぇ瀹跺噺灝戜竴浜?
鐮旂┒椹卞姩婧愮爜鑰屽張緙哄皯娉ㄩ噴鎵甯︽潵鐨勭棝鑻︺?br>
銆銆鎴戞兂鍗充嬌璇昏呯湅榪囧井杞殑鍏充簬椹卞姩寮鍙戠殑鍩硅鏁欐潗鍜孋E甯姪鏂囨。涓殑椹卞姩閮ㄥ垎錛屽ご鑴戜腑浠嶇劧涓鐗囪尗鐒躲傝鎯崇湡姝d簡瑙i┍鍔ㄧ▼搴忓繀欏葷粨鍚堜竴浜涢┍鍔ㄧ▼搴忔簮鐮侊紝鍦ㄦ鎴戜互涓插彛椹卞姩紼嬪簭錛圕OM16550錛変腑鍒濆鍖栬繃紼嬩負綰跨儲綆鍗曡涓璁查┍鍔ㄥ紑鍙戠殑鍩虹鐭ヨ瘑銆?br>
銆銆Windows
CE涓嬬殑涓插彛椹卞姩紼嬪簭鑳藉澶勭悊鎵鏈塈/O琛屼負綾諱技涓插彛鐨勮澶囷紝鍖呮嫭鍩轟簬16450銆?6550
UART錛堥氱敤寮傛鏀跺彂鑺墖錛夌殑璁懼鍜屼竴浜涢噰鐢―MA鐨勮澶囷紝甯歌鐨勬湁9閽堜覆鍙c佺孩澶朓/O鍙c丮odem絳夈傚湪%_WINCEROOT%\Public
\Common\OAK\Drivers\Serial鐩綍涓嬶紝COM_MDD2瀛愮洰褰曞寘鍚柊鐨勪覆鍙i┍鍔∕DD灞傚嚱鏁頒唬鐮併侰OM16550瀛愮洰褰曞寘鍚覆
鍙i┍鍔≒DD灞備唬鐮併係ER16550瀛愮洰褰曞寘鍚殑涓緋誨垪鍑芥暟涓撶敤浜庢帶鍒朵笌16550鍏煎鐨刄ART錛岃繖鏍稰DD灞傜殑涓昏宸ヤ綔灝辨槸璋冪敤SER16550涓?
鐨勫嚱鏁般傝繕鏈変竴涓狪SR16550瀛愮洰褰曞寘鍚殑鏄覆鍙i┍鍔ㄧ▼搴忎笓鐢ㄧ殑鍙畨瑁匢SR錛堜腑鏂湇鍔′緥紼嬶級錛岃屽緢澶氱‖浠惰澶囬┍鍔ㄧ▼搴忛噰鐢–E榛樿鐨勫彲瀹夎ISR
giisr.dll銆備竴鑸覆鍙h澶囩浉搴旂殑娉ㄥ唽琛ㄨ緗緥瀛愬強鎰忎箟濡備笅錛?
| 閿?/strong> |
鎰忎箟 |
| "SysIntr"=dword:13 |
涓插彛1鐨勪腑鏂璉D涓哄崄榪涘埗13 |
| "IoBase"=dword:02F8 |
涓插彛1鐨処O絀洪棿棣栧湴鍧涓哄崄鍏繘鍒?F8 |
| "IoLen"=dword:8 |
涓插彛1鐨処O絀洪棿闀垮害涓?涓瓧鑺?/td>
|
| "DeviceArrayIndex"=dword:0 |
涓插彛1鐨勭儲寮曪紝鏄?鐨勭敱鏉?/td>
|
| "Order"=dword:0 |
涓插彛1椹卞姩鐨勫姞杞介『搴?/td>
|
| "DeviceType"=dword:0 |
涓插彛1鐨勮澶囩被鍨?/td>
|
| "DevConfig"=hex: 10,00 .... |
涓插彛1鍦ㄤ笌Modem璁懼閫氳鏃剁殑閰嶇疆錛屽娉㈢壒鐜囥佸鍋舵牎媯絳?/td>
|
| "FriendlyName"="COM1:" |
涓插彛1鍦ㄦ嫧鍙風▼搴忎腑鏄劇ず鐨勫悕瀛?/td>
|
| "Tsp"="Unimodem.dll" |
涓插彛1 琚敤浜庝笌Modem璁懼閫氳鐨勬椂鍊欒鍔犺澆鐨凾SP錛圱API Service provider錛塂LL |
| "Prefix"="COM" |
涓插彛1鐨勬祦鎺ュ彛鐨勫墠緙 |
| "Dll"="com16550.Dll" |
涓插彛1鐨勯┍鍔ㄧ▼搴廌LL |
銆銆SysIntr
鐢盋E鍦ㄦ枃浠禢kintr.h涓瀹氫箟錛岀敤浜庡敮涓鏍囪瘑涓柇璁懼銆侽EM鍙互鍦ㄦ枃浠禣alintr.h涓畾涔夎嚜宸辯殑SysIntr銆傚父瑙佺殑棰勫畾涔?
SysIntr鏈塖YSINTR_NOP錛堜腑鏂彧鐢盜SR澶勭悊錛孖ST涓嶅啀澶勭悊錛夛紝SYSINTR_RESCHED錛堥噸鏂拌皟搴︾嚎
紼嬶級錛孲YSINTR_DEVICES錛堢敱CE棰勫畾涔夌殑璁懼涓柇ID鐨勫熀鍊鹼級錛孲YSINTR_PROFILE銆丼YSINTR_TIMING銆?
SYSINTR_FIRMWARE絳夐兘鏄熀浜嶴YSINTR_DEVICES瀹氫箟鐨勩侷oBase鏄覆鍙?鐨処O鍦板潃絀洪棿鐨勯鍦板潃錛孖oLen鏄疘O絀洪棿
鐨勫ぇ灝忋侷O鍦板潃絀洪棿鍙瓨鍦ㄤ簬x86騫沖彴錛屽鏋滃湪鍏跺畠騫沖彴紜歡瀵勫瓨鍣ㄥ繀欏繪槧灝勫埌鐗╃悊鍦板潃絀洪棿錛岄偅瀛愰敭鐨勫悕縐頒負MemBase鍜孧emLen銆傚湪x86騫沖彴
鏇村紜歡鐨勫瘎瀛樺櫒鐢變簬IO絀洪棿鐨勫眬闄愪篃鏄犲皠鍒扮墿鐞嗗湴鍧絀洪棿銆侱eviceArrayIndex鏄澶囩殑绱㈠紩錛岀敤浜庡尯鍒嗗悓綾誨瀷鐨勮澶囥侾refix鏄祦椹卞姩
紼嬪簭鐨勫墠緙錛屽綋搴旂敤紼嬪簭璋冪敤CreateFile鍑芥暟浼犻扖OM1:鍙傛暟鏃訛紝鏂囦歡緋葷粺璐熻矗涓庝覆鍙i┍鍔ㄧ▼搴忛氫俊錛屼覆鍙i┍鍔ㄧ▼搴忔槸鍦–E鍚姩鏃剁敱
device.exe鍔犺澆鐨勩?br>
銆銆涓嬮潰浠嶮DD
灞傚嚱鏁癈OM_Init寮濮嬫帰绱覆鍙i┍鍔ㄧ殑鍒濆鍖栬繃紼嬨侰OM_Init鏄湪涓插彛璁懼琚嫻嬪悗鐢辮澶囩鐞嗗櫒device.exe璋冪敤鐨勶紝涓昏鐨勪綔鐢ㄦ槸鍒濆
鍖栬澶囷紝瀹冪殑鍞竴鍙傛暟Identifier鏄敱device.exe浼犻掔殑錛屽叾綾誨瀷鏄竴涓瓧絎︿覆鎸囬拡錛屽瓧絎︿覆鐨勫唴瀹規槸HLM\Drivers
\Active\xx錛寈x鏄竴涓崄榪涘埗鏁幫紙device.exe浼氳窡韙郴緇熶腑姣忎釜椹卞姩紼嬪簭錛屾妸鍔犺澆鐨勯┍鍔ㄧ▼搴忚褰曞湪Active閿笅錛夈?
COM_Init鍏堝垎閰嶄竴涓狧W_INDEP_INFO緇撴瀯浣擄紝榪欎釜緇撴瀯浣撴槸鐙珛浜庝覆鍙g‖浠剁殑澶翠俊鎭紙MDD銆丳DD銆丼ER16550閮藉寘鍚嚜宸辯嫭鐗圭殑
緇撴瀯浣擄紝鍏蜂綋鐨勭粨鏋勪綋瀹氫箟璇峰弬瑙佷覆鍙i┍鍔ㄦ簮鐮侊級錛屽垎閰嶄箣鍚庡啀鍒濆鍖栫粨鏋勪綋涓瘡涓垚鍛橈紝鍒濆鍖栫粨鏋勪綋鍚庤皟鐢?
OpenDeviceKey((LPCTSTR)Identifier)鎵撳紑HLM\Drivers\Active\xx\Key鍖呭惈鐨勬敞鍐岃〃璺緞錛屽湪榪?
閲岃礬寰勪竴鑸負HLM\Drivers\BuiltIn\Serial錛屽嵆涓插彛鐨勯┍鍔ㄧ▼搴忎俊鎭湪娉ㄥ唽琛ㄤ腑鎵澶勭殑浣嶇疆銆侰OM_Init鎺ョ潃鍦℉LM
\Drivers\BuiltIn\Serial涓嬫煡璇eviceArrayIndex銆丳riority256鐨勫鹼紝Priority256鎸囧畾浜嗛┍
鍔ㄧ▼搴忕殑浼樺厛綰э紝濡傛灉娌℃湁灝辯敤榛樿鐨勪紭鍏堢駭銆傛帴涓嬫潵璋冪敤GetSerialObject(DeviceArrayIndex)錛岃繖涓嚱鏁扮敱PDD灞傚畾涔夛紝
榪斿洖HWOBJ緇撴瀯浣擄紝榪欎釜緇撴瀯浣撲富瑕佸寘鍚玃DD灞傚拰SER16550瀹氫箟鐨勫嚱鏁扮殑鎸囬拡銆備篃灝辨槸璇碝DD閫氳繃璋冪敤榪欎釜鍑芥暟鎵嶈兘璋冪敤搴曞眰瀹炵幇鐨勫嚱鏁般傛帴涓嬫潵
鐨勫ぇ澶氭暟宸ヤ綔閮芥槸璋冪敤搴曞眰鍑芥暟瀹炵幇鍒濆鍖栥傜涓涓皟鐢ㄧ殑搴曞眰鍑芥暟SerInit涓昏璁劇疆鐢辯敤鎴瘋緗殑紜歡閰嶇疆錛屼緥濡傜嚎璺帶鍒躲佹嘗鐗圭巼銆傚畠璋冪敤
Ser_GetRegistryData鍑芥暟寰楀埌淇濆瓨鍦ㄦ敞鍐岃〃涓殑紜歡淇℃伅錛孲er_GetRegistryData鍦ㄥ唴閮ㄨ皟鐢ㄧ郴緇熸彁渚涚殑
DDKReg_GetIsrInfoDDK鍜孌DKReg_GetWindowInfo鍑芥暟寰楀埌鍦℉LM\Drivers\BuiltIn\Serial
涓嬩繚瀛樼殑IRQ銆丼ysIntr銆両srDll銆両srHandler銆両oBase銆両oLen銆侷RQ鏄昏緫涓柇鍙鳳紝IsrDll琛ㄧず褰撳墠椹卞姩紼嬪簭鐨?
鍙畨瑁匢SR鎵鍦ㄧ殑DLL鍚嶇О錛孖srHandler
琛ㄧず鍙畨瑁匢SR鐨勫嚱鏁板悕縐般傚湪榪欓噷欏轟究鎻愪竴涓嬪彲瀹夎ISR錛岃鑰呭湪鎴戜互鍓嶅彂琛ㄧ殑鍏充簬OAL鐨勬枃绔犱腑鍙互浜嗚В鍒癘EM鍦∣EMInit鍑芥暟涓叧鑱擨RQ鍜?
SysIntr錛屽綋紜歡璁懼鍙戠敓涓柇鏃訛紝ISR浼氱姝㈠悓綰у拰浣庣駭涓柇錛岀劧鍚庢牴鎹甀RQ榪斿洖鍏寵仈鐨凷ysIntr錛屽唴鏍告牴鎹甀SR榪斿洖鐨凷ysIntr鍞ら啋
鐩稿簲鐨処ST錛圫ysIntr涓嶪ST鍒涘緩鐨凟vent鍏寵仈錛夛紝IST澶勭悊涓柇涔嬪悗璋冪敤InterruptDone瑙i櫎涓柇紱佹銆傚湪OEMInit涓叧鑱?
鐨勭己鐐規槸涓鏃︾紪璇戜簡CE鍐呮牳鍚庡氨鏃犳硶娣誨姞榪欑鍏寵仈浜嗭紝鑰屼竴浜涚‖浠惰澶囦細闅忔椂鎻掓嫈鎴栬呭叡浜腑鏂紝瑕佸叧鑱旇繖鏍風殑紜歡璁懼瑙e喅鏂規硶灝辨槸鍙畨瑁匢SR錛屽彲瀹夎
ISR涓撶敤浜庡鐞嗘寚瀹氱殑紜歡璁懼鍙戝嚭鐨勪腑鏂紝鎵浠ュ鏋滅‖浠惰澶囬渶瑕佸彲瀹夎ISR蹇呴』鍦ㄦ敞鍐岃〃涓坊鍔營srDll銆両srHandler銆傚鏁扮‖浠惰澶囬噰鐢?
CE榛樿鐨勫彲瀹夎ISR giisr.dll錛屾牸寮忓涓嬶細
"IsrDll"="giisr.dll"
"IsrHandler"="ISRHandler"
銆銆濡傛灉涓涓‖浠墮┍鍔ㄧ▼搴忛渶瑕佸彲瀹夎ISR鑰屽紑鍙戣呭張涓嶆兂鑷繁鍐欎竴涓紝閭d箞鍙互鍒╃敤giisr.dll鏉ュ疄鐜般傞櫎浜嗗湪娉ㄥ唽琛ㄤ腑娣誨姞濡備笂鎵紺哄錛岃繕瑕佸湪椹卞姩紼嬪簭涓皟鐢ㄧ浉鍏沖嚱鏁版敞鍐屽彲瀹夎ISR銆備吉浠g爜濡備笅錛?/p>
g_IsrHandle = LoadIntChainHandler(IsrDll, IsrHandler, (BYTE)Irq);
GIISR_INFO Info;
PHYSICAL_ADDRESS PortAddress = {PhysAddr, 0};
TransBusAddrToStatic(BusType, dwBusNumber, PortAddress, dwAddrLen, &dwIOSpace, &(PVOID)PhysAddr)
Info.SysIntr = dwSysIntr;
Info.CheckPort = TRUE;
Info.PortIsIO = (dwIOSpace) ? TRUE : FALSE;
Info.UseMaskReg = TRUE;
Info.PortAddr = PhysAddr + 0x0C;
Info.PortSize = sizeof(DWORD);
Info.MaskAddr = PhysAddr + 0x10;
KernelLibIoControl(g_IsrHandle, IOCTL_GIISR_INFO, &Info, sizeof(Info), NULL, 0, NULL);
銆銆LoadIntChainHandler
鍑芥暟璐熻矗娉ㄥ唽鍙畨瑁匢SR錛屽弬鏁?涓篋LL鍚嶇О錛屽弬鏁?涓篒SR鍑芥暟鍚嶇О錛屽弬鏁?涓篒RQ銆俆ransBusAddrToStatic鍑芥暟鍦ㄥ悗闈㈣銆傚鏋?
瑕佸埄鐢╣iisr.dll浣滀負鍙畨瑁匢SR錛屽繀欏誨厛濉厖GIISR_INFO緇撴瀯浣擄紝CheckPort=TRUE琛ㄧずgiisr瑕佹嫻嬫寚瀹氱殑瀵勫瓨鍣ㄦ潵紜?
瀹氬綋鍓嶅彂鍑轟腑鏂殑鏄惁鏄繖涓澶囥侾ortIsIO琛ㄧず瀵勫瓨鍣ㄥ湴鍧灞炰簬鍝釜鍦板潃絀洪棿錛孎ALSE琛ㄧず鏄唴瀹氱┖闂達紝TRUE琛ㄧずIO絀洪棿銆?
UseMaskReg=TRUE琛ㄧず璁懼鏈変竴涓帺鐮佸瘎瀛樺櫒錛屼笓鐢ㄤ簬鎸囧畾褰撳墠璁懼鏄惁鏄腑鏂簮錛屼篃灝辨槸鍙戝嚭涓柇錛岃孧askAddr琛ㄧず鎺╃爜瀵勫瓨鍣ㄧ殑鍦板潃銆?
濡傛灉瀵笽nfo.Mask璧嬪鹼紝閭d箞PortAddr琛ㄧず涓涓壒孌婄殑瀵勫瓨鍣ㄥ湴鍧錛岃繖涓瘎瀛樺櫒鐨勫間笌Mask鐨勫?amp;榪愮畻鐨勭粨鏋滃鏋滀負鐪燂紝鍒欒瘉鏄庡綋鍓?
璁懼鏄腑鏂簮錛屽惁鍒欒繑鍥濻YSINTR_CHAIN錛堣〃紺哄綋鍓岻SR娌℃湁澶勭悊涓柇錛屽唴鏍稿皢璋冪敤ISR閾句腑涓嬩竴涓狪SR錛夛紝濡傛灉
UseMaskReg=TRUE錛岄偅涔圡askReg瀵勫瓨鍣ㄧ殑鍊間笌PortAddr鎸囧畾鐨勫瘎瀛樺櫒鐨勫?amp;榪愮畻鐨勭粨鏋滃鏋滀負鐪燂紝鍒欒瘉鏄庡綋鍓嶈澶囨槸涓柇
婧愩?br>
銆銆鍑芥暟SerInit鎺ョ潃璋冪敤鍑芥暟
Ser_InternalMapRegisterAddresses杞崲IO鍦板潃騫朵笖鏄犲皠鍦?
鍧錛孲er_InternalMapRegisterAddresses鍦ㄥ唴閮ㄨ皟鐢ㄧ郴緇熸彁渚涚殑HalTranslateBusAddress(Isa,
0, ioPhysicalBase, &inIoSpace,
&ioPhysicalBase)鍑芥暟灝嗕笌鎬葷嚎鐩稿叧鐨勫湴鍧杞崲涓虹郴緇熷湴鍧錛屽弬鏁?涓烘葷嚎綾誨瀷錛屽弬鏁?涓烘葷嚎鍙鳳紝鍙傛暟3涓鴻杞崲鐨勫湴鍧
錛圥HYSICAL_ADDRESS綾誨瀷錛屽疄闄呮槸LARGE_INTEGER鍨嬶級錛屽弬鏁?鎸囧畾瀵勫瓨鍣ㄥ湴鍧灞炰簬IO鍦板潃絀洪棿榪樻槸鐗╃悊鍦板潃絀洪棿錛屽弬鏁?榪斿洖杞?
鎹㈠悗鐨勭墿鐞嗗湴鍧銆傝瀵烪alTranslateBusAddress鐨勬簮鐮佸緱鐭ュ鏋滄槸鍦▁86騫沖彴錛岃繖涓嚱鏁伴櫎浜嗘妸鍙傛暟3璧嬬粰浜嗗弬鏁?鍏朵綑浠涔堥兘娌℃湁鍋氾紝
鑰岄潪x86騫沖彴灝唅nIoSpace鐨勫肩疆涓?錛岃〃紺轟竴瀹氭槸鐗╃悊鍦板潃銆傚湪璋冪敤HalTranslateBusAddress鍓嶈紜畾浠庢敞鍐岃〃涓緱鍒扮殑瀵勫瓨
鍣ㄥ湴鍧鍒板簳鏄睘浜庡摢涓湴鍧絀洪棿鐨勶紝渚嬪錛?/p>
ULONG inIoSpace = 1; ///1琛ㄧず鏄疘O絀洪棿
PHYSICAL_ADDRESS ioPhysicalBase = {iobase, 0}; ///鐩稿綋浜巌oPhysicalBase.LowPart = iobase
銆銆鍦ㄥ湴鍧杞崲鍚庡氨瑕佸皢杞崲鍚庣殑鍦板潃鏄犲皠鍒伴┍鍔ㄧ▼搴忥紙涓鑸琁ST鍜屽簲鐢ㄧ▼搴忎竴鏍瘋繍琛屽湪鐢ㄦ埛妯″紡錛夎兘澶熻闂殑铏氭嫙鍦板潃絀洪棿錛?x80000000浠ヤ笅錛夊拰ISR鑳藉璁塊棶鐨勯潤鎬佽櫄鎷熷湴鍧絀洪棿涓紙0x80000000浠ヤ笂錛夈備緥濡傦細
////濡傛灉鍦板潃灞炰簬鐗╃悊鍦板潃絀洪棿
ioPortBase = (PUCHAR)MmMapIoSpace(ioPhysicalBase, Size, FALSE);
TransBusAddrToStatic(Isa, 0, ioPhysicalBase, Size, &inIoSpace, ppStaticAddress);
銆銆MmMapIoSpace鍑芥暟璐熻矗灝嗙墿鐞嗗湴鍧鏄犲皠鍒伴┍鍔ㄧ▼搴忚兘澶熻闂殑铏氭嫙鍦板潃絀洪棿涓紝閫氳繃婧愮爜鍒嗘瀽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涓鏍峰ぇ灝忕殑铏氭嫙鍦板潃絀洪棿錛屽洜涓哄弬鏁?涓?錛屾墍浠ュ唴鏍歌嚜鍔ㄥ垎閰嶃備竴鑸琈emLen灝忎簬2MB錛屾墍浠ヤ細鍦ㄥ簲鐢ㄧ▼搴忕殑鍦板潃絀洪棿涓垎閰嶃?
VirtualCopy璐熻矗灝嗙‖浠惰澶囧瘎瀛樺櫒鐨勭墿鐞嗗湴鍧涓嶸irtualAlloc鍒嗛厤鐨勮櫄鎷熷湴鍧鍋氫竴涓槧灝勫叧緋伙紝榪欐牱椹卞姩紼嬪簭璁塊棶
PvirtualAddress瀹為檯涓婂氨鏄闂涓涓瘎瀛樺櫒銆傚洜涓虹‖浠惰澶囧瘎瀛樺櫒鐨勭墿鐞嗗湴鍧涓瀹氭槸鍦?12MB錛圕E鏀寔RAM鐨勬渶澶у鹼級浠ヤ笂錛屾墍浠ラ櫎浜?
鏈鍚庣殑鍙傛暟瑕佸姞PAGE_PHYSICAL澶栵紝絎簩涓弬鏁扮墿鐞嗗湴鍧涔熻鍙崇Щ8浣嶏紙鎴栬呴櫎浠?56錛夈傛槧灝勭‖浠跺瘎瀛樺櫒褰撶劧PAGE_NOCACHE鏄繀欏誨姞
鐨勩俆ransBusAddrToStatic鍑芥暟璐熻矗灝嗙墿鐞嗗湴鍧鏄犲皠鍒癐SR鑳藉璁塊棶鐨勯潤鎬佽櫄鎷熷湴鍧絀洪棿涓紝褰撳嚭鐜頒腑鏂叡浜椂錛孖SR瑕佽礋璐h闂‖浠惰
澶囩殑鏌愪竴涓瘎瀛樺櫒鏉ュ垽鏂腑鏂簮錛屾墍浠ュ皢瀵勫瓨鍣ㄧ殑鐗╃悊鍦板潃鏄犲皠鍒伴潤鎬佽櫄鎷熷湴鍧絀洪棿涓槸蹇呰鐨勶紙ISR鍙兘璁塊棶闈欐佺殑铏氭嫙鍦板潃絀洪棿錛夈傛墍璋撻潤鎬佽櫄鎷熷湴鍧絀洪棿鏄?
鎸囧湪OEMAddressTable涓畾涔夌殑铏氭嫙鍦板潃絀洪棿錛堝綋鐒舵槸0x80000000浠ヤ笂錛夈傚湪x86騫沖彴涓鑸繖涓〃鍙畾涔塕AM鐨勭墿鐞嗗湴鍧涓庤櫄鎷熷湴鍧
瀵瑰簲鍏崇郴錛岃岀‖浠惰澶囩殑瀵勫瓨鍣ㄥ湴鍧騫朵笉鍦ㄨ琛ㄤ腑瀹氫箟錛屾墍浠ュ鏋滆鍒涘緩涓鍧楅潤鎬佺殑铏氭嫙鍦板潃絀洪棿渚汭SR璁塊棶錛屽繀欏誨湪姝や箣鍓嶈皟鐢?
CreateStaticMapping鍑芥暟鍦?xC4000000鍒?xE0000000铏氭嫙鍦板潃絀洪棿涓垎閰嶃?
TransBusAddrToStatic鍑芥暟鍦ㄥ唴閮ㄥ氨鏄皟鐢ㄤ簡CreateStaticMapping鍑芥暟銆傛敞錛氱‖浠惰澶囩殑瀵勫瓨鍣ㄥ湴鍧涔熷彲浠ュ湪
OEMAddressTable涓畾涔夈?/p>
////濡傛灉鍦板潃灞炰簬IO絀洪棿
ioPortBase = (PUCHAR)ioPhysicalBase.LowPart;
*ppStaticAddress=ioPortBase
榪欑鎯呭喌鍙睘浜巟86騫沖彴錛屾槸IO絀洪棿灝卞彲浠ョ洿鎺ヨ闂紝鍗充嬌鏄敤鎴鋒ā寮忋?br>
銆銆SerInit
鍑芥暟鎺ョ潃鍒濆鍖朣ER_INFO緇撴瀯浣撴垚鍛橈紝涔嬪悗璋冪敤SL_Init鍑芥暟錛岃繖涓嚱鏁板湪ser16550涓畾涔夛紝璐熻矗鍒濆鍖朣ER16550_INFO緇撴瀯
浣擄紝鍦ㄨ繖涓粨鏋勪綋涓繚瀛樹覆鍙?涓瘎瀛樺櫒鐨勫湴鍧銆係erInit鍑芥暟鎵ц瀹屾瘯鍚嶤OM_Init鍑芥暟鍒涘緩鎺ユ敹緙撳啿鍖猴紝鐒跺悗璋冪敤
StartDispatchThread鍑芥暟鍒濆鍖栦腑鏂茍涓斿垱寤篒ST銆係tartDispatchThread鍑芥暟鍦ㄥ唴閮ㄨ皟鐢?
InterruptInitialize鍑芥暟鍏寵仈SysIntr鍜孍vent錛岀劧鍚庤皟鐢↖nterruptDone鍑芥暟鍛婅瘔鍐呮牳褰撳墠涓插彛鍙互涓柇澶勭悊錛屾帴
鐫璋冪敤CreateThread鍑芥暟鍒涘緩IST綰跨▼銆傦紙over鍚э紝鍐嶅線涓嬭灝卞拰涓插彛紜歡鏈夊叧浜嗭紝鐪嬪浜嗘病娉ㄩ噴鐨勪唬鐮佹垜涔熺儲錛侊紒錛?/p>
]]>