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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? lib_emac.c

?? 焦海波大蝦在uCOS_II上移植LwIP的源代碼。具體說明比較大
?? C
?? 第 1 頁 / 共 2 頁
字號(hào):
//*------------------------------------------------------------------------------------------------
//* 文件名				: lib_emac.c
//* 功能描述			: EMAC外設(shè)的函數(shù)庫
//* 作者    			: 焦海波
//* 版本				: 0.1
//* 建立日期、時(shí)間		: 2006/10/08 10:25
//* 最近修改日期、時(shí)間	: 
//* 修改原因			: 
//*------------------------------------------------------------------------------------------------
//*------------------------------------------ 頭文件 ----------------------------------------------
#include	"/uCOS_II/includes.h"
#include	"/at91sam7x256/include/AT91SAM7X256.h"
#include	"/at91sam7x256/include/lib_AT91SAM7X256.h"
#include	"/LwIP/include/lwip/opt.h"
#include	"lib_emac.h"
//*------------------------------------- 常量、變量、宏 -------------------------------------------
//* 因?yàn)榻邮站彌_區(qū)描述符字0的2到31位保存緩沖區(qū)地址,最低兩位有其它用處,所以指定4字節(jié)對(duì)齊,以保證緩沖區(qū)地址
//* 的最低兩位為0
__align(4) static volatile BYTE baRxBufs[NB_RX_BUFS][ETH_RX_BUF_SIZE];	//* 接收緩沖區(qū)
static BYTE baTxBufs[NB_TX_BUFS][ETH_TX_BUF_SIZE];						//* 發(fā)送緩沖區(qū)

/* 因?yàn)榫彌_區(qū)描述符長度為雙字,正好8個(gè)字節(jié),所以指定雙字對(duì)齊 */
__align(8) static volatile AT91S_RxBDescriptor __staRxBDescriptors[NB_RX_BUFS];	//* 接收緩沖區(qū)描述符數(shù)組
__align(8) static volatile AT91S_TxBDescriptor __staTxBDescriptors[NB_TX_BUFS];	//* 發(fā)送緩沖區(qū)描述符數(shù)組

//* 保存要讀取的接收緩沖區(qū)的索引位置
static UWORD	__uwCurRxBIdx = 0;
static BYTE		*__pbFrom;
//*-------------------------------------- 函數(shù)原型聲明 --------------------------------------------
static void __HandlePHY(UBYTE ubRegAddr, UWORD *puwData, BOOLEAN blIsRead);
static void __ResetPHY(void);
static void __CheckPHYID(void);
static void __SetupLinkSpeedAndDuplex(void);
static void __InitDescriptorsForRxBAndTxB(void);
__inline void __ilResetTxBDescriptors(void);
//*================================================================================================
//*                     函 數(shù) 區(qū)
//*================================================================================================
//*------------------------------------------------------------------------------------------------
//* 函數(shù)名稱 : irqEMACISR
//* 功能描述 : EMAC發(fā)送和接收結(jié)束中斷處理函數(shù)
//* 入口參數(shù) : 無
//* 出口參數(shù) : 無
//*------------------------------------------------------------------------------------------------
__irq void irqEMACISR(void)
{
	extern HANDLER hEthernetInput;
	ULONG	__ulIntStatus, __ulReceiveStatus;

	OSIntEnter();
	{	
		//* 在讀取時(shí)中斷狀態(tài)寄存器位會(huì)被清除
		__ulIntStatus = AT91C_BASE_EMAC->EMAC_ISR;
		//* 這個(gè)是容易忽略的地方,只有讀取RSR寄存器,EMAC中斷處理才能在寫EOICR寄存器之后真正結(jié)束
		__ulReceiveStatus = AT91C_BASE_EMAC->EMAC_RSR;
		
		if((__ulIntStatus & AT91C_EMAC_RCOMP) || (__ulReceiveStatus & AT91C_EMAC_REC))
		{
			//* 向EMAC接收任務(wù)發(fā)送信號(hào)
			OSAPISemSend(hEthernetInput);
			
			//* 清除REC(Frame Received)位
			AT91C_BASE_EMAC->EMAC_RSR = AT91C_EMAC_REC;
		}

		if(__ulIntStatus & AT91C_EMAC_TCOMP)
		{
			//* 復(fù)位發(fā)送緩沖區(qū)描述符的Used位使其為程序所有
			__ilResetTxBDescriptors();
			AT91C_BASE_EMAC->EMAC_TSR = AT91C_EMAC_COMP;
		}

		//* 清除中斷標(biāo)志,結(jié)束中斷處理
		AT91C_BASE_AIC->AIC_EOICR = 0;
	}
	OSIntExit();
}
//*------------------------------------------------------------------------------------------------
//* 函數(shù)名稱 : EMACSendPacket
//* 功能描述 : 由__low_level_output()函數(shù)調(diào)用,完成實(shí)際的數(shù)據(jù)發(fā)送。
//* 入口參數(shù) :         <pbFrom>[in] 指向pbuf中數(shù)據(jù)的指針
//*			 :       <ulLength>[in] pbuf中的數(shù)據(jù)長度
//*			 : <blIsEndOfFrame>[in] 是否是pbuf鏈中的最后一個(gè),也就是幀尾
//* 出口參數(shù) : 如果無法申請(qǐng)下內(nèi)存則返回ERR_MEM,成功則返回ERR_OK
//*------------------------------------------------------------------------------------------------
BOOLEAN EMACSendPacket(BYTE *pbFrom, ULONG ulLength, BOOLEAN blIsEndOfFrame)
{
	ULONG 			__ulTotalLenToWrite = 0, __ulCurLenToWrite, __ulLenRemainToWrite, __ulIsLastBuf;
	
	//* 注意這是一個(gè)私有的靜態(tài)變量
	static UWORD 	__uwTxBIndex = 0;
	
	LONG 			i;
	BYTE			*__pbBuf;
	
#if OS_CRITICAL_METHOD == 3                     
    OS_CPU_SR  		cpu_sr = 0;
#endif	

	//* 如果要發(fā)送的數(shù)據(jù)長度大于一個(gè)發(fā)送緩沖區(qū),則需要將這些數(shù)據(jù)分割進(jìn)多個(gè)緩沖區(qū)進(jìn)行發(fā)送
	while(__ulTotalLenToWrite < ulLength)
	{
		//* 等待緩沖區(qū)可用,最長等待3秒鐘
		i = 0;
		while(!__staTxBDescriptors[__uwTxBIndex].uStatus.bstStatus.bitIsUsed)
		{
			//* 如果已經(jīng)到達(dá)等待時(shí)間仍然沒有可用緩沖區(qū),則立即返回
			if(i > 300)
				return FALSE;
			
			OSTimeDly(1);
			i++;
		}
	
		OS_ENTER_CRITICAL()
		{
			//* 從描述符中獲得緩沖區(qū)地址,然后把數(shù)據(jù)復(fù)制到緩沖區(qū)
			__pbBuf = (BYTE*)__staTxBDescriptors[__uwTxBIndex].ulTxBAddr;
			
			//* 計(jì)算向緩沖區(qū)寫入的數(shù)據(jù)長度
			__ulLenRemainToWrite = ulLength - __ulTotalLenToWrite;
			if(__ulLenRemainToWrite > ETH_TX_BUF_SIZE)
				__ulCurLenToWrite = ETH_TX_BUF_SIZE;
			else
				__ulCurLenToWrite = __ulLenRemainToWrite;
			
			//* 將pbuf中的數(shù)據(jù)復(fù)制到發(fā)送緩沖區(qū)
			memcpy(__pbBuf, &(pbFrom[__ulTotalLenToWrite]), __ulCurLenToWrite);
			__ulTotalLenToWrite += __ulCurLenToWrite;
			
			//* 看看是否是已經(jīng)到達(dá)pbuf鏈的末尾,如果是則標(biāo)記當(dāng)前使用的緩沖區(qū)為最后一個(gè)緩沖區(qū)
			if(blIsEndOfFrame && (__ulTotalLenToWrite >= ulLength))
			{
				__ulIsLastBuf = TxDESC_STATUS_LAST_BUF;
			}
			else
				__ulIsLastBuf = 0;
	
			//* 填充當(dāng)前的描述符:緩沖區(qū)中的數(shù)據(jù)實(shí)際長度、最后一個(gè)緩沖區(qū)標(biāo)記、WRAP位(如果確實(shí)是最后一個(gè)描述符)
			if(__uwTxBIndex >= (NB_TX_BUFS-1))
			{				
				__staTxBDescriptors[__uwTxBIndex].uStatus.ulStatus = (__ulCurLenToWrite & TxDESC_STATUS_BUF_SIZE)
																		| __ulIsLastBuf
																		| TxDESC_STATUS_WRAP;
				__uwTxBIndex = 0;
			}
			else
			{
				__staTxBDescriptors[__uwTxBIndex].uStatus.ulStatus = (__ulCurLenToWrite & TxDESC_STATUS_BUF_SIZE)
																		| __ulIsLastBuf;
				__uwTxBIndex++;
			}
	
			//* 如果已經(jīng)到達(dá)pbuf鏈的末尾則立即發(fā)送
			if(__ulIsLastBuf)
				AT91C_BASE_EMAC->EMAC_NCR |= AT91C_EMAC_TSTART;
		}
		OS_EXIT_CRITICAL()
	}

	return TRUE;
}
//*------------------------------------------------------------------------------------------------
//* 函數(shù)名稱 : EMACReadPacket
//* 功能描述 : 從EMAC讀取信息包到申請(qǐng)的pbuf鏈,該函數(shù)要求PBUF_POOL_BUFSIZE大于或等于接收緩沖區(qū),最好是整
//*			 : 數(shù)倍,這樣函數(shù)處理最簡單。注意,在調(diào)用該函數(shù)之前必須先調(diào)用GetInputPacketLen()函數(shù),這樣才
//*			 : 能獲取正確的讀取位置
//* 入口參數(shù) :         <pbTo>[in] 指向pbuf的指針
//*			 : <uwSegmentLen>[in] pbuf中需要存儲(chǔ)的實(shí)際數(shù)據(jù)長度,因?yàn)樵谏暾?qǐng)pbuf時(shí),pbuf_alloc()已經(jīng)根據(jù)
//*			 :                    實(shí)際的幀長將其分割進(jìn)了多個(gè)pbuf組成的pbuf鏈中,而pstPbuf->len則保存了
//*			 :                    每個(gè)pbuf需要存儲(chǔ)的數(shù)據(jù)。換句話說pbuf鏈中的最后一個(gè)pbuf的len字段長度應(yīng)
//*			 :                    該小于或等于PBUF_POOL_BUFSIZE,而前面的pbuf則等于PBUF_POOL_BUFSIZE
//*			 : <blIsLastPbuf>[in] 是否是最后一個(gè)Pbuf
//* 出口參數(shù) : 無
//*------------------------------------------------------------------------------------------------
void EMACReadPacket(BYTE *pbTo, UWORD uwSegmentLen, BOOLEAN blIsLastPbuf)
{		
	UWORD			__uwTotalLenToRead = 0, 					//* 已經(jīng)讀取到pbuf的總字節(jié)數(shù)
					__uwRemainLenToRead,						//* 還剩多少字節(jié)沒有讀取到pbuf中
					__uwRemainLenInRxBToRead;					//* EMAC接收緩沖區(qū)中還剩下多少字節(jié)沒有讀取					
	static UWORD	__uwTotalLenInRxBToRead = 0;				//* EMAC接收緩沖區(qū)中已經(jīng)讀了多少字節(jié)的數(shù)據(jù)
	BOOLEAN			__blIsNotRelease;							//* 是否已經(jīng)主動(dòng)釋放給EMAC
	
	
	/* 注意,必須保證PBUF_POOL_BUFSIZE大于或等于接收緩沖區(qū) */
	
	while(__uwTotalLenToRead < uwSegmentLen)
	{
		__uwRemainLenInRxBToRead = ETH_RX_BUF_SIZE - __uwTotalLenInRxBToRead;
		__uwRemainLenToRead = uwSegmentLen - __uwTotalLenToRead;
		if(__uwRemainLenToRead >= __uwRemainLenInRxBToRead)
		{
			memcpy(pbTo + __uwTotalLenToRead, __pbFrom, __uwRemainLenInRxBToRead);
			__uwTotalLenToRead += __uwRemainLenInRxBToRead;
			__uwTotalLenInRxBToRead = 0;
			
			//* 將接收緩沖區(qū)歸還給EMAC
			__staRxBDescriptors[__uwCurRxBIdx].ulRxBAddrAndFlag &= (~RxDESC_FLAG_OWNSHIP);
			__blIsNotRelease = FALSE;
			
			//* 調(diào)整描述符索引與讀取指針
			__uwCurRxBIdx++;
			if(__uwCurRxBIdx >= NB_RX_BUFS)
				__uwCurRxBIdx = 0;
				
			__pbFrom = (BYTE*)(__staRxBDescriptors[__uwCurRxBIdx].ulRxBAddrAndFlag & EMAC_RxB_ADDR_MASK);
		}
		else
		{
			memcpy(pbTo + __uwTotalLenToRead, __pbFrom, __uwRemainLenToRead);
			__uwTotalLenToRead += __uwRemainLenToRead;
			__uwTotalLenInRxBToRead += __uwRemainLenToRead;
			
			__pbFrom = __pbFrom + __uwTotalLenInRxBToRead;						
			__blIsNotRelease = TRUE;
		}					
	}
	
	if(blIsLastPbuf)
	{
		//* 將接收緩沖區(qū)歸還給EMAC,如果存在恰好是PBUF_POOL_BUFSIZE的整數(shù)倍的數(shù)據(jù)包,則沒有必要再一次釋放,因?yàn)樗呀?jīng)在
		//* 上面被釋放
		if(__blIsNotRelease)
		{
			__staRxBDescriptors[__uwCurRxBIdx].ulRxBAddrAndFlag &= (~RxDESC_FLAG_OWNSHIP);
			__uwCurRxBIdx++;
			if(__uwCurRxBIdx >= NB_RX_BUFS)
				__uwCurRxBIdx = 0;
		}
			
		__uwTotalLenInRxBToRead = 0;
	}		
}
//*------------------------------------------------------------------------------------------------
//* 函數(shù)名稱 : EMACInit
//* 功能描述 : 初始化EMAC:對(duì)PHY、MII口線、EMAC操作模式進(jìn)行配置,設(shè)置接收和發(fā)送緩沖區(qū)描述符。設(shè)置
//*			 : EMAC接收和發(fā)送中斷
//* 入口參數(shù) : 無
//* 出口參數(shù) : 無
//*------------------------------------------------------------------------------------------------
void EMACInit(void)
{
	extern HANDLER hEthernetInput;
	
#if OS_CRITICAL_METHOD == 3                     
    OS_CPU_SR  		cpu_sr = 0;
#endif	

	//* 復(fù)位PHY芯片,使其進(jìn)入U(xiǎn)TP模式
	__ResetPHY();
	
	//* 等待一段指定的時(shí)間,使PHY就緒
	OSTimeDlyHMSM(0, 0, 3, 0);

	//* 設(shè)置PIOB引腳為外設(shè)A引腳(即EMAC引腳),禁止PIOB控制,改為外設(shè)控制
	AT91C_BASE_PIOB->PIO_ASR = EMAC_MII_PINS;
	AT91C_BASE_PIOB->PIO_PDR = EMAC_MII_PINS;
	
	//* 因?yàn)闆]有使用ETXER,所以這里將其配置為由PIO控制
	AT91C_BASE_PIOB->PIO_PER = AT91C_PB12_ETXER;
	AT91C_BASE_PIOB->PIO_ODR = AT91C_PB12_ETXER;
	
	//* 設(shè)置MDC時(shí)鐘分頻數(shù)
	AT91C_BASE_EMAC->EMAC_NCFGR |= AT91C_EMAC_CLK_HCLK_32;
	
	//* 檢查PHY ID是否為0x82010000,如果不是則表明PHY還沒有就緒或者出現(xiàn)故障,函數(shù)將一直查詢直至正確
	__CheckPHYID();
	
	//* 從PHY獲取自動(dòng)協(xié)商的結(jié)果,設(shè)置EMAC自身的鏈路速度和單雙工方式。注意,該函數(shù)會(huì)阻塞所在任務(wù)的正常執(zhí)行
	//* 直至設(shè)置成功
	__SetupLinkSpeedAndDuplex();
	
	//* 建立接收任務(wù)使用的信號(hào)量,對(duì)uCOS的配置保證信號(hào)量在軟件邏輯上能夠百分百建立成功
	hEthernetInput = OSAPISemNew(0);
	
	//* 初始化接收和發(fā)送緩沖區(qū)描述符,使每個(gè)描述符指向正確的緩沖區(qū)地址
	__InitDescriptorsForRxBAndTxB();
	
	//* 設(shè)置EMAC為MII模式,使能EMAC時(shí)鐘
	AT91C_BASE_EMAC->EMAC_USRIO = AT91C_EMAC_CLKEN;
	
	//* 清除接收狀態(tài)寄存器
	AT91C_BASE_EMAC->EMAC_RSR = AT91C_EMAC_OVR | AT91C_EMAC_REC | AT91C_EMAC_BNA;
	
	//* 復(fù)制所有有效幀到接收緩沖區(qū),不接收廣播幀,不復(fù)制FCS字段
	AT91C_BASE_EMAC->EMAC_NCFGR |= AT91C_EMAC_CAF | AT91C_EMAC_NBC | AT91C_EMAC_DRFCS;
	

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一激情一区二区三区| 视频一区国产视频| 亚洲一区二区在线视频| 石原莉奈在线亚洲二区| 久久精品国产第一区二区三区| 国产精品一级在线| 色综合久久天天综合网| 欧美三级乱人伦电影| 欧美不卡在线视频| 成人欧美一区二区三区白人 | 午夜成人免费视频| 久久精品国产在热久久| www.一区二区| 91精品国产综合久久福利| 久久九九久久九九| 亚洲高清一区二区三区| 国产乱码精品一区二区三区av| 中文子幕无线码一区tr| 亚洲激情在线激情| 精品一区二区三区免费观看| 色综合视频一区二区三区高清| 欧美一区二区三区免费观看视频 | 精品一区二区精品| 一本大道久久a久久精品综合| 91精品一区二区三区久久久久久| 国产欧美日韩视频一区二区 | 欧美日韩一区二区三区四区| 久久亚洲一区二区三区四区| 久久精品男人天堂av| 国产精品久久久久久久浪潮网站| 一区二区三区丝袜| 婷婷久久综合九色综合伊人色| 国产一区二区三区国产| 欧美久久久久中文字幕| 国产精品第13页| 精品亚洲国内自在自线福利| 91成人免费在线| 国产欧美日韩在线| 久久国产视频网| 在线视频一区二区三| 中文无字幕一区二区三区| 日日摸夜夜添夜夜添国产精品| 成人高清伦理免费影院在线观看| 日韩丝袜情趣美女图片| 亚洲大片精品永久免费| 99精品在线观看视频| 久久久精品中文字幕麻豆发布| 日韩专区在线视频| 欧美私人免费视频| 亚洲三级在线免费观看| 国产成人av一区| 精品国产乱子伦一区| 污片在线观看一区二区| 在线视频你懂得一区| 国产精品国产三级国产a| 国产麻豆精品一区二区| 精品久久久久久久久久久院品网| 午夜国产不卡在线观看视频| 91黄色小视频| 亚洲裸体在线观看| 99热在这里有精品免费| 国产精品美女www爽爽爽| 国产剧情av麻豆香蕉精品| www精品美女久久久tv| 蜜臀av亚洲一区中文字幕| 在线成人av影院| 污片在线观看一区二区| 正在播放亚洲一区| 天堂影院一区二区| 欧美日韩国产综合视频在线观看| 一区二区三区不卡在线观看 | 日韩精品最新网址| 日韩精品亚洲专区| 欧美一级夜夜爽| 青青草一区二区三区| 日韩三级视频在线看| 麻豆高清免费国产一区| 日韩精品一区二区三区老鸭窝 | 日韩欧美一级片| 琪琪一区二区三区| 精品91自产拍在线观看一区| 狠狠色综合播放一区二区| 26uuu亚洲婷婷狠狠天堂| 国产精品一级在线| 亚洲欧洲无码一区二区三区| 99在线精品视频| 亚洲精品综合在线| 欧美亚洲动漫精品| 免费观看91视频大全| 久久人人爽爽爽人久久久| 国产98色在线|日韩| 国产精品不卡视频| 欧美亚洲国产怡红院影院| 丝袜亚洲精品中文字幕一区| 欧美va亚洲va香蕉在线| 国产乱码精品一区二区三区av| 国产精品视频你懂的| 色婷婷av一区二区三区gif| 亚洲自拍偷拍图区| 欧美一卡二卡在线| 国产高清不卡一区| 亚洲美女少妇撒尿| 91精品在线麻豆| 国产精品亚洲视频| 亚洲精品美国一| 日韩一区二区电影网| 国产成人久久精品77777最新版本| 国产精品久久久久永久免费观看| 欧美最猛性xxxxx直播| 免费国产亚洲视频| 中文在线一区二区| 欧美日韩一区二区三区免费看| 麻豆精品久久精品色综合| 国产精品乱码人人做人人爱| 欧美亚洲丝袜传媒另类| 久久国产精品无码网站| 国产精品免费av| 欧美巨大另类极品videosbest | 福利一区在线观看| 一区二区三区国产精品| 精品欧美一区二区三区精品久久| 国产成人av一区二区三区在线观看| 亚洲精品老司机| 日韩欧美一卡二卡| 96av麻豆蜜桃一区二区| 另类小说视频一区二区| 亚洲精品自拍动漫在线| 精品福利二区三区| 色悠悠亚洲一区二区| 国产一区二区三区免费观看| 亚洲国产精品一区二区久久恐怖片 | 国产精品污网站| 欧美精品久久99| 不卡一区二区中文字幕| 日韩电影免费在线| 中文字幕欧美一| 日韩欧美一二三四区| 在线精品亚洲一区二区不卡| 国精产品一区一区三区mba桃花 | 99久久99久久综合| 麻豆免费看一区二区三区| 亚洲欧美日韩久久| 久久久青草青青国产亚洲免观| 欧美午夜一区二区| 99久久免费视频.com| 精品一区二区三区欧美| 亚洲va韩国va欧美va| 亚洲色图19p| 国产欧美日本一区视频| 日韩一二三四区| 欧美在线免费播放| 不卡一区二区中文字幕| 国产精品一区在线观看你懂的| 丝袜亚洲精品中文字幕一区| 亚洲特级片在线| 日本一区二区三区国色天香| 日韩精品专区在线| 678五月天丁香亚洲综合网| 一本到高清视频免费精品| 成人午夜激情视频| 国产一区二区三区免费| 久久精品国产一区二区三区免费看| 亚洲一级片在线观看| 中文字幕制服丝袜一区二区三区 | 欧美日韩国产综合久久| 色综合久久99| 91在线porny国产在线看| 国产精品456| 国产伦理精品不卡| 久久国产成人午夜av影院| 日本网站在线观看一区二区三区| 伊人夜夜躁av伊人久久| 中文字幕一区二区5566日韩| 国产丝袜在线精品| 26uuu精品一区二区| 日韩三级精品电影久久久| 666欧美在线视频| 欧美日韩国产精品成人| 欧美日韩三级一区| 欧美日韩在线综合| 在线播放视频一区| 在线电影欧美成精品| 91精品在线观看入口| 91精品国产福利| 日韩欧美在线影院| 日韩精品最新网址| 久久久久久亚洲综合影院红桃 | 成人国产精品免费| av午夜精品一区二区三区| 99久久亚洲一区二区三区青草| 91在线观看污| 91极品视觉盛宴| 欧美日韩国产三级| 91精品国产黑色紧身裤美女| 日韩美女一区二区三区四区| ww久久中文字幕| 国产精品青草综合久久久久99| 成人一区二区视频| 91啪九色porn原创视频在线观看| 一本一道波多野结衣一区二区|