亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? lib_emac.c

?? 焦海波大蝦在uCOS_II上移植LwIP的源代碼。具體說明比較大
?? C
?? 第 1 頁 / 共 2 頁
字號:
	//* 設置EMAC地址
	AT91C_BASE_EMAC->EMAC_SA1L = 0xBC | ((ULONG)(0x20 << 8)) | ((ULONG)(0x06 << 16)) | ((ULONG)(0x09 << 24));
	AT91C_BASE_EMAC->EMAC_SA1H = 0x30 | ((ULONG)(0x11 << 8));
	
	//* 設置EMAC中斷
	OS_ENTER_CRITICAL()
	{
		//* 發(fā)送和接收結束中斷使能
		AT91C_BASE_EMAC->EMAC_IER = AT91C_EMAC_RCOMP | AT91C_EMAC_TCOMP;
		
		at91_irq_open(AT91C_ID_EMAC, AT91C_AIC_PRIOR_HIGHEST, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, irqEMACISR);
	}
	OS_EXIT_CRITICAL()
	
	//* 最后,接收、發(fā)送使能
	AT91C_BASE_EMAC->EMAC_NCR |= AT91C_EMAC_TE | AT91C_EMAC_RE;
}
//*------------------------------------------------------------------------------------------------
//* 函數名稱 : __HandlePHY
//* 功能描述 : 對PHY進行讀寫操作
//* 入口參數 : <ubRegAddr>[in]      指定對PHY的哪個寄存器進行讀寫
//*			 :   <puwData>[in][out] 指向操作數據的指針。對于讀,這個地址保存讀取的數據;對于寫則是要寫入
//*			 :                      寄存器的數據
//*			 :  <blIsRead>[in]      是否是讀操作,如果不是則是寫操作
//* 出口參數 : 無
//*------------------------------------------------------------------------------------------------
static void __HandlePHY(UBYTE ubRegAddr, UWORD *puwData, BOOLEAN blIsRead)
{
	ULONG	__ulHandleVal;	
	
	if(blIsRead)
	{
		__ulHandleVal = (0x01 << 30) 
						| (0x02 << 28) 
						| (PHY_ADDR << 23) 
						| (ubRegAddr << 18) 
						| (0x02 << 16);
	}
	else
	{
		__ulHandleVal = (0x01 << 30) 
						| (0x01 << 28) 
						| (PHY_ADDR << 23) 
						| (ubRegAddr << 18) 
						| (0x02 << 16) 
						| (*puwData & 0xFFFF);
	}
		
	AT91C_BASE_EMAC->EMAC_MAN = __ulHandleVal;
	while(!(AT91C_BASE_EMAC->EMAC_NSR & AT91C_EMAC_IDLE));		
	if(blIsRead)
		*puwData = AT91C_BASE_EMAC->EMAC_MAN & 0x0000FFFF;
}
//*------------------------------------------------------------------------------------------------
//* 函數名稱 : __ResetPHY
//* 功能描述 : 設置PHY芯片為UTP模式并復位PHY芯片
//* 入口參數 : 無
//* 出口參數 : 無
//*------------------------------------------------------------------------------------------------
static void __ResetPHY(void)
{
	//* PHY在上電或復位期間需要根據RXER/FXEN引腳(24腳)的鎖存輸入狀態(tài)來選擇是UTP模式還是光纖模式。每個PIO
	//*	口線都被內置了一個上拉電阻,所以整機上電后該引腳的邏輯電平為高,這樣就會使得PHY進入了光纖模式。我們
	//* 需要UTP模式,也就是PHY上電或復位期間的鎖存輸入狀態(tài)為低,所以在這里必須禁止該口線的內部上拉電阻,然后
	//* 再復位PHY芯片,使其進入UTP模式
	AT91C_BASE_PIOB->PIO_PPUDR = AT91C_PB7_ERXER;
		
	//* 復位PHY芯片,RTL8201BL的數據手冊要求必須維持至少10ms的低電平,這里設置為2的(8 + 1)次方個SCK周期,
	//* 時間為15.621ms
	AT91C_BASE_RSTC->RSTC_RMR = 0xA5000000 | (0x08 << 8);
	AT91C_BASE_RSTC->RSTC_RCR = 0xA5000000 | AT91C_RSTC_EXTRST;

	//* 等待NRST引腳恢復為高電平
	while(!(AT91C_BASE_RSTC->RSTC_RSR & AT91C_RSTC_NRSTL));
}
//*------------------------------------------------------------------------------------------------
//* 函數名稱 : __CheckPHYID
//* 功能描述 : 檢查PHY ID是否為0x82010000,如果不是則表明PHY還沒有就緒或者出現故障,函數將一直查詢直至正確
//* 入口參數 : 無
//* 出口參數 : 無
//*------------------------------------------------------------------------------------------------
static void __CheckPHYID(void)
{
	ULONG		__ulPHYID;
	UBYTE		__ubDelaySeconds = 0;

	EnableMDI()
	{
		while(TRUE)	
		{
			__HandlePHY(PHY_REG_ID1, (UWORD*)&__ulPHYID, TRUE);
			__HandlePHY(PHY_REG_ID2, ((UWORD*)&__ulPHYID)+1, TRUE);
			if(__ulPHYID == PHY_ID_RTL8201)
				break;
			else
			{
				__ResetPHY();
				if(__ubDelaySeconds < 15)
					__ubDelaySeconds++;
				OSTimeDlyHMSM(0, 0, __ubDelaySeconds, 0);
			}
		}
	}	
	DisableMDI()
}
//*------------------------------------------------------------------------------------------------
//* 函數名稱 : __ilWaitLinkEstablished
//* 功能描述 : 等待PHY建立鏈路
//* 入口參數 : 無
//* 出口參數 : 無
//*------------------------------------------------------------------------------------------------
__inline void __ilWaitLinkEstablished(void)
{
	UWORD		__uwHandleData;
	UBYTE		__ubDelaySeconds = 0;
	
	while(TRUE)
	{
		__HandlePHY(PHY_REG_BMSR, &__uwHandleData, TRUE);
		if(__uwHandleData & PHY_BMSR_LINKESTABLISHED)
			break;
		else
		{
			__ResetPHY();
			if(__ubDelaySeconds < 15)
				__ubDelaySeconds++;
			OSTimeDlyHMSM(0, 0, __ubDelaySeconds, 0);
		}
	}
}
//*------------------------------------------------------------------------------------------------
//* 函數名稱 : __ilWaitAutoNegEnd
//* 功能描述 : 等待PHY自動協商結束
//* 入口參數 : 無
//* 出口參數 : 無
//*------------------------------------------------------------------------------------------------
__inline void __ilWaitAutoNegEnd(void)
{
	UWORD		__uwHandleData;
	UBYTE		__ubDelaySeconds = 0;	

	do{
		if(__uwHandleData & PHY_BMSR_AUTONEGEND)
			break;
		else
		{
			__HandlePHY(PHY_REG_BMSR, &__uwHandleData, TRUE);
			OSTimeDlyHMSM(0, 0, 1, 0);
		}
	}while(TRUE);
}
//*------------------------------------------------------------------------------------------------
//* 函數名稱 : __SetupLinkSpeedAndDuplex
//* 功能描述 : 從PHY獲取自動協商的結果,設置EMAC自身的鏈路速度和單雙工方式。注意,該函數會阻塞所在任務的正
//*          : 常執(zhí)行直至設置成功
//* 入口參數 : 無
//* 出口參數 : 無
//*------------------------------------------------------------------------------------------------
static void __SetupLinkSpeedAndDuplex(void)
{
	UWORD		__uwHandleData;
	ULONG		__ulSpdAndFD = 0x00000000;

	EnableMDI()
	{
		__ilWaitLinkEstablished();
		
		__ilWaitAutoNegEnd();
		
		//* 獲得協商的結果
		__HandlePHY(PHY_REG_ANLPAR, &__uwHandleData, TRUE);
		//* 決定線速
		if((__uwHandleData & PHY_ANLPAR_100TX) || (__uwHandleData & PHY_ANLPAR_100TXFD))
			__ulSpdAndFD = AT91C_EMAC_SPD;
		//* 決定單雙工方式
		if((__uwHandleData & PHY_ANLPAR_100TXFD) || (__uwHandleData & PHY_ANLPAR_10TFD))
			__ulSpdAndFD |= AT91C_EMAC_FD;
		
		//* 將鏈路速度和單雙工方式設置進EMAC的網絡配置寄存器
		AT91C_BASE_EMAC->EMAC_NCFGR = (AT91C_BASE_EMAC->EMAC_NCFGR & EMAC_NCFGR_SPD_FD_MASK) | __ulSpdAndFD;
	}
	DisableMDI()
}
//*------------------------------------------------------------------------------------------------
//* 函數名稱 : __InitDescriptorsForRxBAndTxB
//* 功能描述 : 初始化接收和發(fā)送緩沖區(qū)描述符,使每個描述符指向正確的緩沖區(qū)地址,然后將描述符首地址寫入隊列指
//*			 : 針指針寄存器
//* 入口參數 : 無
//* 出口參數 : 無
//*------------------------------------------------------------------------------------------------
static void __InitDescriptorsForRxBAndTxB(void)
{
	LONG		i;
	
	//* 將接收緩沖區(qū)地址填充到緩沖區(qū)描述符
	for(i=0; i<NB_RX_BUFS; i++)
		__staRxBDescriptors[i].ulRxBAddrAndFlag = (int)baRxBufs[i];
	//* 置位最后一個緩沖區(qū)描述符的Wrap位
	__staRxBDescriptors[NB_RX_BUFS - 1].ulRxBAddrAndFlag |= RxDESC_FLAG_WARP;
	
	
	//* 將發(fā)送緩沖區(qū)地址填充到緩沖區(qū)描述符
	for(i=0; i<NB_TX_BUFS; i++)
	{
		__staTxBDescriptors[i].ulTxBAddr = (int)baTxBufs[i];
		//* 標記這個緩沖區(qū)為程序所有,根據數據手冊,該位為0表示這個緩沖區(qū)為EMAC所有
		__staTxBDescriptors[i].uStatus.bstStatus.bitIsUsed = 1;
	}
	//* 置位發(fā)送緩沖區(qū)的結束位(Wrap)
	__staTxBDescriptors[NB_TX_BUFS - 1].uStatus.bstStatus.bitIsWrap = 1;
	
	//* 將描述符隊列首地址寫入接收和發(fā)送隊列指針寄存器
	AT91C_BASE_EMAC->EMAC_RBQP = (int)__staRxBDescriptors;
	AT91C_BASE_EMAC->EMAC_TBQP = (int)__staTxBDescriptors;
}
//*------------------------------------------------------------------------------------------------
//* 函數名稱 : __ilResetTxBDescriptors
//* 功能描述 : 復位發(fā)送緩沖區(qū)描述符的Used位,使其能夠繼續(xù)被使用
//* 入口參數 : 無
//* 出口參數 : 無
//*------------------------------------------------------------------------------------------------
__inline void __ilResetTxBDescriptors(void)
{
	static LONG		__lIdxToReset = 0;
	
	//* 根據EMAC數據手冊,EMAC在發(fā)送完畢后會置位幀的第一個緩沖區(qū)描述符的Used位,所以在這里只需置位其它描
	//* 述符即可
	if(__staTxBDescriptors[__lIdxToReset].uStatus.bstStatus.bitIsUsed)
	{
		while(!__staTxBDescriptors[__lIdxToReset].uStatus.bstStatus.bitIsLastBuf)
		{
			__lIdxToReset++;
			if(__lIdxToReset >= NB_TX_BUFS)
				__lIdxToReset = 0;
				
			__staTxBDescriptors[__lIdxToReset].uStatus.bstStatus.bitIsUsed = 1;
		}
		
		__lIdxToReset++;
		
		if(__lIdxToReset >= NB_TX_BUFS)
			__lIdxToReset = 0;
	}
	else;
}
//*------------------------------------------------------------------------------------------------
//* 函數名稱 : GetInputPacketLen
//* 功能描述 : 獲取到達的信息包的長度
//* 入口參數 : 無
//* 出口參數 : 無
//*------------------------------------------------------------------------------------------------
UWORD GetInputPacketLen(void)
{
	UWORD		__uwIdx, __uwLen = 0;
	
	//* 跳過碎片幀,判斷依據是幀頭位未被置位
	while((__staRxBDescriptors[__uwCurRxBIdx].ulRxBAddrAndFlag & RxDESC_FLAG_OWNSHIP) 
			&& !__staRxBDescriptors[__uwCurRxBIdx].uStatus.bstStatus.bitStartOfFrm)
	{
		//* 釋放這個緩沖區(qū)
		__staRxBDescriptors[__uwCurRxBIdx].ulRxBAddrAndFlag &= (~RxDESC_FLAG_OWNSHIP);		
		__uwCurRxBIdx++;
		if(__uwCurRxBIdx >= NB_RX_BUFS )
		{
			__uwCurRxBIdx = 0;
		}
	}
	
	__uwIdx = __uwCurRxBIdx;
	
	//* 只有最后一個緩沖區(qū)才保存幀的長度,其它均為0
	while((__staRxBDescriptors[__uwIdx].ulRxBAddrAndFlag & RxDESC_FLAG_OWNSHIP))
	{
		__uwLen = __staRxBDescriptors[__uwIdx].uStatus.bstStatus.bitLen;
		if(__uwLen > 0)
			break;
			
		__uwIdx++;
		if(__uwIdx >= NB_RX_BUFS)
			__uwIdx = 0;
	}
	
	//* 保存信息包讀取位置
	__pbFrom = (BYTE*)(__staRxBDescriptors[__uwCurRxBIdx].ulRxBAddrAndFlag & EMAC_RxB_ADDR_MASK);
	
	return __uwLen;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区国产| 精品一区二区三区免费| 色香蕉久久蜜桃| 亚洲乱码国产乱码精品精的特点 | 日韩三级在线观看| 亚洲综合在线免费观看| 丝袜亚洲另类欧美| 国产一区二区在线看| 久久久久99精品国产片| fc2成人免费人成在线观看播放| 欧美极品另类videosde| 成人永久aaa| 亚洲最大成人综合| 精品免费国产一区二区三区四区| 韩国成人在线视频| 亚洲欧美日韩久久精品| 9191成人精品久久| 福利电影一区二区| 一区二区三区小说| 欧美成人精品1314www| 成人丝袜18视频在线观看| 亚洲欧美乱综合| 欧美一区二区三区视频免费播放| 国产美女av一区二区三区| 亚洲狼人国产精品| 欧美videos中文字幕| www.成人在线| 麻豆免费精品视频| 国产在线视频不卡二| 在线观看不卡视频| 欧美经典一区二区三区| 91老师国产黑色丝袜在线| 日韩国产在线一| 国产亚洲精品免费| 欧美午夜理伦三级在线观看| 国产在线播放一区三区四| 亚洲精品网站在线观看| 精品蜜桃在线看| 在线看国产一区二区| 国产精品911| 视频一区中文字幕国产| 国产精品电影一区二区| 日韩一级大片在线| 欧美午夜影院一区| 99热99精品| 国产在线麻豆精品观看| 午夜精品123| 亚洲欧美日韩中文播放| 国产欧美综合在线观看第十页| 欧美人与性动xxxx| 国产精品毛片a∨一区二区三区| 国产精品自拍三区| 天堂在线亚洲视频| 欧美四级电影网| 国产成人精品免费网站| 日韩三级电影网址| 91麻豆免费看片| 国产高清精品在线| 青椒成人免费视频| 亚洲成人资源在线| 一区二区三区日韩精品视频| 国产精品色在线| 久久―日本道色综合久久| 日韩一级大片在线| 日韩一区二区麻豆国产| 欧日韩精品视频| 99re这里都是精品| 成人影视亚洲图片在线| 国产九色精品成人porny | 精品美女被调教视频大全网站| 在线一区二区三区做爰视频网站| 美女脱光内衣内裤视频久久影院| 亚洲人成精品久久久久| 成人黄色777网| 亚洲网友自拍偷拍| 一区二区三区欧美日| 久久久www免费人成精品| 久久男人中文字幕资源站| 欧美一级夜夜爽| 精品捆绑美女sm三区| 欧美一区二区三区成人| 日韩免费高清av| 精品国产欧美一区二区| 国产亚洲视频系列| 国产精品久99| 亚洲免费观看高清| 亚洲成人av一区| 丝袜美腿亚洲综合| 精品一区二区在线免费观看| 国产精品综合av一区二区国产馆| 国产麻豆成人精品| 97se亚洲国产综合自在线不卡| 99天天综合性| 欧美日韩中文一区| 日韩一区二区三区电影在线观看| 欧美电影免费观看高清完整版 | 欧美日韩高清不卡| 4438x亚洲最大成人网| 欧美大片在线观看一区二区| 久久综合九色综合97_久久久| 久久久国产精品不卡| 亚洲丝袜另类动漫二区| 亚洲大片在线观看| 久久国产综合精品| 懂色av中文一区二区三区| 91激情五月电影| 欧美一卡2卡3卡4卡| 亚洲国产精品成人综合| 亚洲国产cao| 国内成人自拍视频| 日本精品一级二级| 日韩午夜在线观看视频| 国产精品三级av| 亚洲乱码国产乱码精品精的特点| 久久99国产精品久久| 最新中文字幕一区二区三区| 久久综合久久综合亚洲| 亚洲视频中文字幕| 日本成人超碰在线观看| 成人av小说网| 欧美日韩日日摸| 久久―日本道色综合久久| 一区二区三区在线观看国产| 国产综合色产在线精品| 色婷婷精品久久二区二区蜜臂av | 91老师片黄在线观看| 日韩欧美一二区| 亚洲免费在线播放| 国产一区高清在线| 欧美三级电影网| 中文字幕免费不卡| 日韩精品欧美精品| 91麻豆国产福利精品| 久久综合九色综合97_久久久| 亚洲一线二线三线视频| 国产成人鲁色资源国产91色综| 欧美日本在线播放| 日韩美女视频一区| 成人国产精品免费观看视频| 欧美天堂一区二区三区| 老司机午夜精品| 欧美视频你懂的| 国产精品理论在线观看| 青青草国产精品97视觉盛宴| 日本韩国欧美一区| 国产精品久久久久久久午夜片| 日韩成人精品视频| 在线观看日韩高清av| 中文字幕一区二区三区四区| 国产成人精品三级| 欧美精品一区二区高清在线观看| 亚洲成年人网站在线观看| 成人精品一区二区三区中文字幕| 亚洲精品一区二区三区香蕉| 人禽交欧美网站| 欧美日本国产一区| 五月天激情综合| 欧美日韩国产一级| 亚洲成人中文在线| 欧美午夜影院一区| 亚洲电影在线播放| 在线精品观看国产| 亚洲午夜一二三区视频| 日本二三区不卡| 一区二区三区在线高清| 在线观看日韩国产| 亚洲国产成人av网| 制服丝袜在线91| 精品亚洲成av人在线观看| 久久蜜桃av一区二区天堂| 国产精品毛片久久久久久| 国产高清精品在线| 国产精品污污网站在线观看| 成人午夜电影网站| 中文字幕一区在线观看| 99久久久久久99| 亚洲欧美日韩一区| 欧美日韩综合在线免费观看| 日韩影院免费视频| 日韩欧美色综合网站| 韩国v欧美v日本v亚洲v| 久久精品欧美日韩| 不卡av免费在线观看| 亚洲欧美日韩小说| 欧美伦理电影网| 免费视频一区二区| 久久色视频免费观看| 成人av免费在线播放| 亚洲人成网站色在线观看| 欧美日韩激情一区二区三区| 日本欧美一区二区在线观看| 26uuu国产一区二区三区| 粉嫩久久99精品久久久久久夜| 最新国产成人在线观看| 欧美三级一区二区| 国产一区二区福利| 亚洲免费观看在线观看| 日韩亚洲欧美中文三级| 福利一区福利二区| 亚洲大尺度视频在线观看|