WINCE下s3c2410+cs8900 板子的網(wǎng)絡(luò)問(wèn)題解決
掃描二維碼
隨時(shí)隨地手機(jī)看文章
CS8900+s3c2410上網(wǎng)掉線的問(wèn)題及其解決辦法
自我理解是,系統(tǒng)在運(yùn)行網(wǎng)絡(luò)的時(shí)候,經(jīng)常會(huì)去使能網(wǎng)絡(luò)中斷,而造成網(wǎng)絡(luò)復(fù)位了
找到 E:WINCE420WINCE420PLATFORMSMDK2410KERNELHALcfw.c
找到 BOOL OEMInterruptEnable() 函數(shù) 里 case SYSINTR_ETHER:
使網(wǎng)卡的初始化只出現(xiàn)一次,因?yàn)槊看纬跏蓟院?連接就會(huì)斷掉
加一個(gè)全局變量 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通一會(huì)就斷,解決方法
根本原因 在于 中斷處理服務(wù)中,把已經(jīng)產(chǎn)生的 中斷 標(biāo)志 給 清除掉了!
這樣就丟失一次中斷。因?yàn)樵?qū)動(dòng)里配置中斷為上升沿觸發(fā)!一次中斷丟失,就導(dǎo)致不會(huì)再產(chǎn)生中斷信號(hào)跳變,因?yàn)椋挥性谥袛喾?wù)中讀取了cs8900的 Interrupt status queue寄存器后,才會(huì)產(chǎn)生下一次中斷!(見cs8900 datasheet 的 14頁(yè) 中關(guān)于 INTRQ的解釋!
關(guān)于為什么 , 原驅(qū)動(dòng) 會(huì) 把已經(jīng)產(chǎn)生的 中斷 標(biāo)志 給 清除掉了! 你可以跟蹤一下 cs8900驅(qū)動(dòng) 中斷服務(wù)中 開中斷 關(guān)中斷的過(guò)程! 解決cs8900+s3c2410+wince平臺(tái)網(wǎng)絡(luò)斷線的問(wè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;這樣改過(guò)后! 可能需要 全部重新編譯, clean 后 再重新 build !! 再測(cè)試網(wǎng)絡(luò)!就沒有問(wèn)題了!
轉(zhuǎn)貼,測(cè)試正確
解決辦法:
找到 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;