WINCE下s3c2410+cs8900 板子的網(wǎng)絡(luò)問題解決
CS8900+s3c2410上網(wǎng)掉線的問題及其解決辦法
自我理解是,系統(tǒng)在運行網(wǎng)絡(luò)的時候,經(jīng)常會去使能網(wǎng)絡(luò)中斷,而造成網(wǎng)絡(luò)復(fù)位了
找到 E:WINCE420WINCE420PLATFORMSMDK2410KERNELHALcfw.c
找到 BOOL OEMInterruptEnable() 函數(shù) 里 case SYSINTR_ETHER:
使網(wǎng)卡的初始化只出現(xiàn)一次,因為每次初始化以后,連接就會斷掉
加一個全局變量 Inited == FALSE
case SYSINTR_ETHER: // Ethernet on EINT9.
if(Inited == FALSE) // edit by andy
{
s2410IOP->rEINTPEND = 0x200;
s2410INT->rSRCPND = BIT_EINT8_23; // by shim
if (s2410INT->rINTPND & BIT_EINT8_23)
s2410INT->rINTPND = BIT_EINT8_23;
Inited = TRUE;
}
s2410IOP->rEINTMASK &= ~0x200;
s2410INT->rINTMSK &= ~BIT_EINT8_23;
break;
http://hi.baidu.com/fei_chen/blog/item/c961e933ff04d342ac4b5f3c.html
WINCE下網(wǎng)絡(luò)PING通一會就斷,解決方法
根本原因 在于 中斷處理服務(wù)中,把已經(jīng)產(chǎn)生的 中斷 標(biāo)志 給 清除掉了!
這樣就丟失一次中斷。因為原驅(qū)動里配置中斷為上升沿觸發(fā)!一次中斷丟失,就導(dǎo)致不會再產(chǎn)生中斷信號跳變,因為,只有在中斷服務(wù)中讀取了cs8900的 Interrupt status queue寄存器后,才會產(chǎn)生下一次中斷!(見cs8900 datasheet 的 14頁 中關(guān)于 INTRQ的解釋!
關(guān)于為什么 , 原驅(qū)動 會 把已經(jīng)產(chǎn)生的 中斷 標(biāo)志 給 清除掉了! 你可以跟蹤一下 cs8900驅(qū)動 中斷服務(wù)中 開中斷 關(guān)中斷的過程! 解決cs8900+s3c2410+wince平臺網(wǎng)絡(luò)斷線的問題! <解決辦法: 找到 E:WINCE420WINCE420PLATFORMSMDK2410KERNELHALcfw.c
找到 BOOL OEMInterruptEnable() 函數(shù) 里 case SYSINTR_ETHER:
if(Inited == FALSE) s2410IOP->rEINTPEND = 0x200; s2410INT->rSRCPND = BIT_EINT8_23; // by shim
if (s2410INT->rINTPND & BIT_EINT8_23) s2410INT->rINTPND = BIT_EINT8_23; Inited = TRUE; s2410IOP->rEINTMASK &= ~0x200; s2410INT->rINTMSK &= ~BIT_EINT8_23; break;在 全局 定義: BOOL Inited = FALSE;這樣改過后! 可能需要 全部重新編譯, clean 后 再重新 build !! 再測試網(wǎng)絡(luò)!就沒有問題了!
轉(zhuǎn)貼,測試正確
解決辦法:
找到 E:WINCE420WINCE420PLATFORMSMDK2410KERNELHALcfw.c
找到 BOOL OEMInterruptEnable() 函數(shù) 里 case SYSINTR_ETHER:
if(Inited == FALSE)
{
s2410IOP->rEINTPEND = 0x200;
s2410INT->rSRCPND = BIT_EINT8_23; // by shim
if (s2410INT->rINTPND & BIT_EINT8_23)
s2410INT->rINTPND = BIT_EINT8_23;
Inited = TRUE;
}
s2410IOP->rEINTMASK &= ~0x200;
s2410INT->rINTMSK &= ~BIT_EINT8_23;
break;
在 全局 定義: BOOL Inited = FALSE;