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

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

?? emac.c

?? arm開發
?? C
字號:
//*----------------------------------------------------------------------------
//*         ATMEL Microcontroller Software Support  -  ROUSSET  -
//*----------------------------------------------------------------------------
//* The software is delivered "AS IS" without warranty or condition of any
//* kind, either express, implied or statutory. This includes without
//* limitation any warranty or condition with respect to merchantability or
//* fitness for any particular purpose, or against the infringements of
//* intellectual property rights of others.
//*----------------------------------------------------------------------------
//* File Name           : main.c
//* Object              : main application written in C
//* Creation            : Hi   11/18/2002
//*
//*----------------------------------------------------------------------------
#include "AT91RM9200.h"
#include "lib_AT91RM9200.h"
#include "Emac.h"
#include <string.h>

extern unsigned int AT91F_GetTickCount(void);

// Our Ethernet MAC address and IP address
char OurEmacAddr[6] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
unsigned char OurIpAddr[4]  = {10, 159, 245, 172}; // {0x0A, 0xD7, 0xF5, 0xAC}

//Buffer descriptor address must be word aligned
#define AT91C_EMAC_TDLIST_BASE	0x20010000

char RxPacket[NB_ETH_RX_PACKETS*ETH_PACKET_SIZE];
AT91PS_TdDescriptor tdList = (AT91PS_TdDescriptor)AT91C_EMAC_TDLIST_BASE;



// ****************************************************************************************************
// ** EMAC lowlevel functions 
// ****************************************************************************************************
//*----------------------------------------------------------------------------
//* \fn    AT91F_MII_ReadPhy
//* \brief This function return the MII phy register
//*----------------------------------------------------------------------------
unsigned short AT91F_MII_ReadPhy(
	AT91PS_EMAC pEmac,     // \arg Pointer to AT91PS_EMAC service
	unsigned char addr) 
{
	unsigned int Wait = AT91F_GetTickCount() + 10;
	unsigned int value = 0x60020000 | (addr << 18);

	pEmac->EMAC_MAN = value;
  	while(AT91F_GetTickCount() < Wait);
	return (pEmac->EMAC_MAN & 0x0000ffff);
}



//*----------------------------------------------------------------------------
//* \fn    AT91F_MII_GetLinkSpeed
//* \brief This function configure the link speed
//*----------------------------------------------------------------------------
int MII_GetLinkSpeed(AT91PS_EMAC pEmac)     // \arg Pointer to AT91PS_EMAC service
{
  unsigned short stat1, stat2; 
  
	stat1 = AT91F_MII_ReadPhy(pEmac, MII_STS_REG);
	stat1 = AT91F_MII_ReadPhy(pEmac, MII_STS_REG);

	stat2 = AT91F_MII_ReadPhy(pEmac, MII_STS2_REG);
    
    //set MII for 100BaseTX and Full Duplex
	if ((stat1 & 0x4000) && (stat2 & 0x8000) )
    	pEmac->EMAC_CFG |= (AT91C_EMAC_SPD| AT91C_EMAC_FD);    
    //set MII for 10BaseT and Full Duplex 
	else if ((stat1 & 0x1000) && (stat2 & 0x2000))
    	pEmac->EMAC_CFG = (pEmac->EMAC_CFG & AT91C_EMAC_SPD) | AT91C_EMAC_FD;
    //set MII for 100BaseTX and Half Duplex 
	else if ((stat1 & 0x2000) && (stat2 & 0x4000))
    	pEmac->EMAC_CFG = (pEmac->EMAC_CFG | AT91C_EMAC_SPD ) & ~AT91C_EMAC_FD;
    //set MII for 10BaseT and Half Duplex 
	else if ((stat1 & 0x0800) && (stat2 & 0x1000))
    	pEmac->EMAC_CFG = pEmac->EMAC_CFG & ~AT91C_EMAC_SPD & ~AT91C_EMAC_FD;

	return 0;
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_MDIO_StartupPhy
//* \brief This function start the phy
//*----------------------------------------------------------------------------
int AT91F_MDIO_StartupPhy(AT91PS_EMAC pEmac)     // \arg Pointer to AT91PS_EMAC service
{
	int ret;
	if(pEmac->EMAC_SR & AT91C_EMAC_LINK)
		return 0;

	pEmac->EMAC_CTL |= AT91C_EMAC_MPE;

	ret = MII_GetLinkSpeed(pEmac);

	pEmac->EMAC_CTL &= ~AT91C_EMAC_MPE;
  
	return 0;
}


//*----------------------------------------------------------------------------
//* \fn    AT91F_EMACInit
//* \brief This function initialise the ethernet
//*----------------------------------------------------------------------------
int AT91F_EMACInit( // \return Status ( Success = 0)
		AT91PS_EMAC pEmac,     // \arg Pointer to AT91PS_EMAC service
		unsigned int pTdList)
{
	int status;
	
	AT91F_EMAC_CfgPMC();
	AT91F_EMAC_CfgPIO();

	status = AT91F_MDIO_StartupPhy(pEmac);
	if ( status )
		return status;

	// the sequence write EMAC_SA1L and write EMAC_SA1H must be respected
	pEmac->EMAC_SA1L = ((int)OurEmacAddr[2] << 24) | ((int)OurEmacAddr[3] << 16) | ((int)OurEmacAddr[4] << 8) | OurEmacAddr[5];
	pEmac->EMAC_SA1H = ((int)OurEmacAddr[0] << 8) | OurEmacAddr[1];

	pEmac->EMAC_RBQP = pTdList;
	pEmac->EMAC_RSR  &= ~(AT91C_EMAC_OVR | AT91C_EMAC_REC | AT91C_EMAC_BNA);
	pEmac->EMAC_CFG  |= (AT91C_EMAC_CAF | AT91C_EMAC_NBC | AT91C_EMAC_RMII);
	pEmac->EMAC_CFG  &= ~(AT91C_EMAC_CLK);
	pEmac->EMAC_CTL  |= (AT91C_EMAC_TE | AT91C_EMAC_RE);

 	return 0;
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_EmacEntry
//* \brief Initialise Emac to receive packets
//*----------------------------------------------------------------------------
int AT91F_EmacEntry(void)
{
	unsigned int i;
	char *pRxPacket;
	
	pRxPacket = (char *)RxPacket;

	// Initialise tdList descriptor. This descriptor must be WORD aligned
	for (i = 0; i < NB_ETH_RX_PACKETS; ++i) 
	{
		tdList[i].addr = ((unsigned int) (pRxPacket + (i * ETH_PACKET_SIZE))) & 0xFFFFFFFC;
		tdList[i].size = 0;
	}
	
	// Set the WRAP bit at the end of the list descriptor
	tdList[NB_ETH_RX_PACKETS-1].addr |= 0x02;
	
	return(AT91F_EMACInit(AT91C_BASE_EMAC, (unsigned int) tdList));
}	



//*----------------------------------------------------------------------------
//* \fn    AT91F_IcmpChksum
//* \brief Process ICMP Checksum...
//*----------------------------------------------------------------------------
unsigned short AT91F_IcmpChksum(unsigned short *p, int len) 
{
	int i, t;
	
	for (i=0,t=0; i<len; i++, p++)
		t += SWAP16(*p);
	t = (t & 0xffff) + (t >> 16);
	return (~t);									
}



//*----------------------------------------------------------------------------
//* \fn    AT91F_ProcessEmacPacket
//* \brief Process ARP and ICMP packets...
//*----------------------------------------------------------------------------
int AT91F_ProcessEmacPacket(AT91PS_IPheader pHeader)
{
	unsigned short *pFrameType, *pArpOp;
	unsigned int i, icmp_len;
	char *pData;
	int status = AT91C_NO_IPPACKET;
	
	AT91PS_IPheader pIpHeader;
	AT91PS_IcmpEchoHdr pIcmpEcho;
	int process = 0;
	

	// Receive one packet		
	process = 0;	
	status = 0;
	for (i = 0; i < NB_ETH_RX_PACKETS; ++i) {				
		if(tdList[i].addr & 0x1) {
			if (*AT91C_EMAC_RSR & AT91C_EMAC_REC)
				(*AT91C_EMAC_RSR) |= AT91C_EMAC_REC;
			process = 1;	
			break;				
		}
	}
		
	if (!process)
		return AT91C_NO_IPPACKET;
						
	process = i;
		
	// Process this packet
	pFrameType = (unsigned short *) ((tdList[i].addr & 0xFFFFFFFC) + 12);
	pData      = (char *)(tdList[i].addr & 0xFFFFFFFC);

	switch (SWAP16(*pFrameType)) {
	case PROT_ARP: // ARP Packet format
		pArpOp = (unsigned short *) (pData + 20);

		if (SWAP16(*pArpOp) == ARP_REQUEST) {
		       // ARP REPLY operation
			*pArpOp =  SWAP16(ARP_REPLY);				
			// Fill the dest address and src address
			for (i = 0; i <6; i++) {
				// swap ethernet dest address and ethernet src address
				pData[i] = pData[i+6];
				pData[i+6] = OurEmacAddr[i];
				// swap sender ethernet address and target ethernet address
				pData[i+22] = OurEmacAddr[i];
				pData[i+32] = pData[i+6];
			}									
				// swap sender IP address and target IP address
			for (i = 0; i<4; i++) {				
				pData[i+38] = pData[i+28];
				pData[i+28] = OurIpAddr[i];
			}
				
			if (!(*AT91C_EMAC_TSR & AT91C_EMAC_BNQ))
				return AT91C_NO_IPPACKET;
		  	*AT91C_EMAC_TSR |= AT91C_EMAC_COMP;
			*AT91C_EMAC_TAR = (unsigned int)pData;
 			*AT91C_EMAC_TCR = 0x40;
		}			
	break; // case PROT_ARP
		
	case PROT_IP:	// IP protocol frame
		pIpHeader = (AT91PS_IPheader)(pData + 14);			
		pIcmpEcho = (AT91PS_IcmpEchoHdr)((char *)pIpHeader + 20);
		memcpy(pHeader, pIpHeader,sizeof(AT91S_IPheader));

#if AT91C_DISPLAY_ALL_IPHEADER
		status = AT91C_IPPACKET;
#endif		
		
		switch(pIpHeader->ip_p) {
		case PROT_ICMP:		
			// set the status variable to display in main.c only ICMP packets
			status = AT91C_IPPACKET;
				
			// if ICMP_ECHO_REQUEST ==> resp = ICMP_ECHO_REPLY
			if(pIcmpEcho->type == ICMP_ECHO_REQUEST) {
				pIcmpEcho->type = ICMP_ECHO_REPLY;
				pIcmpEcho->code = 0;
				pIcmpEcho->cksum = 0;

				// Checksum of the ICMP Message				
				icmp_len = (SWAP16(pIpHeader->ip_len) - 20)/(sizeof(unsigned short));
			    pIcmpEcho->cksum = SWAP16(AT91F_IcmpChksum((unsigned short *) pIcmpEcho, icmp_len));
					
				// Swap IP Dest address and IP Source address
				for(i = 0; i <4; i++) {
					pIpHeader->ip_dst[i] = pIpHeader->ip_src[i];
					pIpHeader->ip_src[i] = OurIpAddr[i];
				}

				// Swap Eth Dest address and Eth Source address
				for(i = 0; i <6; i++) {
					pData[i] = pData[i + 6];
					pData[i+6] = OurEmacAddr[i];
				}
					// send the echo_reply
			  	*AT91C_EMAC_TSR |= AT91C_EMAC_COMP;
				*AT91C_EMAC_TAR = (unsigned int)pData;
				*AT91C_EMAC_TCR = SWAP16(pIpHeader->ip_len)+ 14;
			}
		break; // case PROT_ICMP

		default:
			break;
		}
	break; // case PROT_IP
						
	default:
		break;
	}// switch (SWAP16(*pFrameType))
	// process the packet
	tdList[process].addr &= ~0x01;
	return status;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩一本二本av| 成人午夜又粗又硬又大| 午夜激情综合网| 日韩电影网1区2区| 国产福利一区二区三区视频在线| 精品制服美女丁香| 国产在线精品一区二区| 91在线看国产| 91成人在线精品| 欧美一区二区三区四区久久 | 欧美高清你懂得| 欧美一级夜夜爽| 中文字幕乱码日本亚洲一区二区| 亚洲一区二区三区四区五区中文| 亚洲电影在线播放| 国产在线精品一区二区不卡了| 91丝袜美腿高跟国产极品老师| 在线不卡的av| 亚洲免费视频中文字幕| 国产精品亚洲午夜一区二区三区| 精品视频1区2区| 国产精品无遮挡| 极品销魂美女一区二区三区| 色综合久久中文字幕综合网| 一区av在线播放| 粉嫩av亚洲一区二区图片| 91精品国产综合久久精品麻豆| 中文字幕va一区二区三区| 久久精品99国产精品| 在线不卡a资源高清| 午夜精品久久久久影视| 欧美亚洲国产一区在线观看网站| 日本一区二区三区高清不卡| 久久疯狂做爰流白浆xx| 日韩一二三区视频| 日本成人在线不卡视频| 欧美视频在线观看一区二区| 亚洲高清视频中文字幕| 欧美精品一二三区| 国产在线视频精品一区| 欧美激情在线看| 91小视频在线免费看| 亚洲四区在线观看| 欧美少妇bbb| 青娱乐精品视频| 久久先锋影音av| 国产美女久久久久| 中文字幕制服丝袜一区二区三区| 欧美大白屁股肥臀xxxxxx| 精品一区二区三区久久| 亚洲国产成人在线| 在线看国产一区| 国产精品乡下勾搭老头1| ●精品国产综合乱码久久久久| 成人夜色视频网站在线观看| 亚洲欧美在线aaa| 欧美在线小视频| 精品一区二区三区蜜桃| 欧美极品美女视频| 91黄色小视频| 麻豆成人久久精品二区三区红| 精品国产亚洲一区二区三区在线观看| 国产一区二区伦理| 欧美成人一区二区三区| av激情亚洲男人天堂| 青青草伊人久久| 中文字幕日本不卡| 欧美精品1区2区| 丁香激情综合国产| 天天影视色香欲综合网老头| 日本一区二区三区高清不卡| 欧美视频一区在线观看| 日韩激情av在线| 亚洲精品日韩综合观看成人91| 欧美va在线播放| 欧美日本在线视频| 波多野结衣中文一区| 国产一区二区在线免费观看| 婷婷久久综合九色综合绿巨人| 国产视频一区二区在线观看| 日韩精品在线网站| 欧美在线观看视频一区二区三区| 豆国产96在线|亚洲| 国产高清精品在线| 久久99热这里只有精品| 久久精品国产99国产| 美国三级日本三级久久99| 亚洲国产美女搞黄色| 国产精品久久久久久久久免费樱桃| 久久夜色精品国产噜噜av| 亚洲精品一区二区三区影院 | 成av人片一区二区| 99国产精品国产精品久久| 成人一区二区三区视频在线观看| 免费成人深夜小野草| 亚洲黄色免费电影| 亚洲bt欧美bt精品777| 午夜精品久久久久久| 久久成人免费网| 亚洲一二三区在线观看| 午夜成人在线视频| 久久97超碰色| aaa欧美日韩| 欧美日本精品一区二区三区| 欧美v亚洲v综合ⅴ国产v| 欧美国产一区在线| 性久久久久久久久久久久| 韩国中文字幕2020精品| aaa亚洲精品一二三区| 成人激情校园春色| 日韩一区二区三区高清免费看看| 久久夜色精品国产欧美乱极品| 91精品国产一区二区三区香蕉| 精品久久国产字幕高潮| 亚洲日本青草视频在线怡红院 | 国产精品麻豆网站| 精久久久久久久久久久| 91搞黄在线观看| 亚洲欧洲日韩女同| 国产一区不卡视频| 日韩视频中午一区| 日韩有码一区二区三区| 在线观看一区二区精品视频| 国产精品三级视频| 国产精品一区在线观看乱码| 欧美精品九九99久久| 日韩专区一卡二卡| 91精品国产麻豆| 日本系列欧美系列| 欧美一区二区视频网站| 日本中文一区二区三区| 成人福利在线看| 国产女同性恋一区二区| 国产精品羞羞答答xxdd | 国产精品久久久久久久久搜平片| 国产乱码精品1区2区3区| 欧美成人精品福利| 极品少妇xxxx偷拍精品少妇| 欧美草草影院在线视频| 国产一区二区精品久久| 国产欧美日韩另类一区| 99v久久综合狠狠综合久久| 中文字幕色av一区二区三区| 色丁香久综合在线久综合在线观看| 久久亚洲二区三区| 91网站视频在线观看| 亚洲一区日韩精品中文字幕| 一本一本大道香蕉久在线精品| 伊人夜夜躁av伊人久久| 日韩三级免费观看| 成人免费的视频| 日本aⅴ亚洲精品中文乱码| 日韩精品一区国产麻豆| 国产精品中文字幕欧美| 亚洲人成伊人成综合网小说| 欧美日韩免费一区二区三区视频| 免费观看91视频大全| 国产精品乱码久久久久久| 一本大道av伊人久久综合| 亚洲一区二区三区免费视频| 久久一区二区三区国产精品| 51精品视频一区二区三区| 成人丝袜视频网| 激情综合色综合久久综合| 一区二区久久久久久| 欧美韩国日本综合| 国产色产综合产在线视频| 欧美精品vⅰdeose4hd| 国产精品综合av一区二区国产馆| 中文字幕一区二区三区色视频| 久久午夜色播影院免费高清 | 在线一区二区三区做爰视频网站| 国产高清亚洲一区| 国产麻豆视频精品| 韩国成人在线视频| 国产中文字幕一区| 国产精品一区二区久激情瑜伽 | 国产精品人成在线观看免费| 亚洲免费视频中文字幕| 日本一区二区视频在线| 久久精品在这里| 亚洲精品美国一| 美女视频免费一区| 处破女av一区二区| 欧美日韩免费一区二区三区 | 一区二区三区不卡在线观看 | 884aa四虎影成人精品一区| 26uuu精品一区二区在线观看| 国产精品无码永久免费888| 亚洲激情av在线| 精品一区二区三区在线观看国产| 成人av中文字幕| 日韩午夜激情视频| 一区二区视频免费在线观看| 极品少妇xxxx偷拍精品少妇| 在线免费不卡视频| 欧美国产激情一区二区三区蜜月| 亚洲在线视频一区| 成人aa视频在线观看| 精品免费99久久|