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

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

?? emac.c

?? DM9161在ARM9200下的驅動源碼
?? 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]  = {172, 17, 242, 132}; // {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色图| 成人性色生活片| 欧美在线视频你懂得| 亚洲天堂福利av| 在线免费不卡电影| 亚洲成人黄色小说| 91精品国产aⅴ一区二区| 美女爽到高潮91| 久久蜜臀中文字幕| 成人高清视频免费观看| 一区二区在线观看免费| 欧美精品少妇一区二区三区| 另类成人小视频在线| 久久这里只有精品首页| 97久久超碰国产精品电影| 香蕉加勒比综合久久| 精品国产一区二区三区四区四| 国产丶欧美丶日本不卡视频| 亚洲欧美日韩久久| 日韩欧美在线一区二区三区| 国产成都精品91一区二区三| 一区二区三区在线视频观看58 | 91精品国产色综合久久久蜜香臀| 婷婷国产在线综合| 国产色一区二区| 欧美视频一二三区| 国产成人免费在线观看| 亚洲精品视频在线观看免费| 日韩亚洲欧美成人一区| 不卡的电影网站| 欧美aaaaa成人免费观看视频| 国产精品全国免费观看高清 | 日韩国产欧美三级| 国产精品日日摸夜夜摸av| 欧美精品aⅴ在线视频| 成人激情午夜影院| 石原莉奈一区二区三区在线观看| 国产精品理伦片| 精品理论电影在线观看| 欧美在线视频不卡| 成人短视频下载| 精品午夜久久福利影院| 亚洲精品成人在线| 国产欧美日韩另类视频免费观看 | 午夜亚洲福利老司机| 亚洲精品一线二线三线| 欧美亚州韩日在线看免费版国语版| 九九**精品视频免费播放| 亚洲小少妇裸体bbw| 中文字幕在线视频一区| 国产日韩精品一区二区浪潮av | 日韩二区三区四区| 亚洲综合av网| 亚洲欧美日韩一区二区| 中文字幕中文字幕一区| 国产精品网站一区| 久久久高清一区二区三区| 色播五月激情综合网| 九色|91porny| 视频在线观看国产精品| 亚洲人成网站色在线观看| 日韩精品一区二区三区视频在线观看| 95精品视频在线| 粉嫩av亚洲一区二区图片| 久久精品国产第一区二区三区| 亚洲一区日韩精品中文字幕| 亚洲视频你懂的| 综合婷婷亚洲小说| 一区二区三区av电影| 一区二区视频在线| 亚洲成人动漫一区| 欧美激情一区二区三区| 欧美岛国在线观看| 欧美久久久久久久久中文字幕| 91在线观看高清| 国产成人av电影在线| 国产一区二区不卡| 国产91精品入口| 麻豆极品一区二区三区| 亚洲精品你懂的| 中文字幕一区二| 亚洲成人动漫在线免费观看| 欧美中文字幕一二三区视频| 亚洲丝袜制服诱惑| 亚洲精品成人少妇| 亚洲不卡在线观看| 国产一区高清在线| 国产成人高清在线| 国产在线一区二区| 日韩中文字幕不卡| 日日摸夜夜添夜夜添亚洲女人| 亚洲线精品一区二区三区| 亚洲bt欧美bt精品| 蜜桃av噜噜一区| 不卡的av在线播放| 欧洲国内综合视频| 26uuu精品一区二区三区四区在线| 26uuu精品一区二区| 亚洲乱码精品一二三四区日韩在线| 午夜婷婷国产麻豆精品| 成人一级片网址| 在线不卡中文字幕播放| 国产精品天天看| 日韩和的一区二区| av一区二区三区四区| 欧美大片一区二区| 亚洲午夜免费福利视频| 国产中文字幕一区| 欧美日韩卡一卡二| 中文字幕日韩精品一区| 麻豆传媒一区二区三区| 色婷婷av一区二区三区软件 | 日韩欧美自拍偷拍| 精品国产乱码久久久久久闺蜜| 欧美一级国产精品| 国产精品久久毛片| 亚洲国产精品久久久男人的天堂| 久久精品av麻豆的观看方式| 91社区在线播放| 91精品视频网| 一区视频在线播放| 久久99热99| 色婷婷亚洲综合| 久久久久久久久久久久久女国产乱| 亚洲成人免费观看| 日本韩国欧美一区| 国产精品免费人成网站| 蜜臀av在线播放一区二区三区| 国产成人aaaa| 日本久久一区二区| 国产精品免费久久| 日韩精品色哟哟| 99re66热这里只有精品3直播| 久久久久97国产精华液好用吗| 人禽交欧美网站| 欧美日韩一区二区三区免费看| 亚洲视频电影在线| 97精品久久久久中文字幕 | 一区二区在线观看视频 | 亚洲精品国产第一综合99久久 | 国产精品久久777777| 日韩精品一二三| 欧美日韩亚洲不卡| 国产精品理伦片| 久久国产三级精品| 在线观看亚洲a| 中文字幕色av一区二区三区| 国产伦精品一区二区三区视频青涩| 欧美丰满少妇xxxxx高潮对白| 亚洲电影中文字幕在线观看| 91黄色免费看| 亚洲va国产va欧美va观看| 在线综合视频播放| 久久激五月天综合精品| 久久久久久久久久久黄色| 国产精品一区免费在线观看| 国产欧美一区二区三区网站| 国产成人在线电影| 亚洲精选一二三| 制服丝袜成人动漫| 国产精品白丝jk黑袜喷水| 国产精品久久久久久久裸模| 色综合婷婷久久| 视频一区在线播放| 国产午夜精品久久久久久免费视 | 亚洲欧美综合网| 欧美三级韩国三级日本一级| 免费在线成人网| 国产视频一区在线播放| 97久久精品人人澡人人爽| 日韩综合小视频| 国产精品视频在线看| 欧美猛男男办公室激情| 国产成人免费在线| 亚洲影视资源网| 精品国偷自产国产一区| 色综合 综合色| 国产在线精品一区二区夜色| 日韩理论片一区二区| 日韩一区二区不卡| 91色乱码一区二区三区| 免费精品视频在线| 亚洲色图视频免费播放| 精品国产精品一区二区夜夜嗨| 91亚洲男人天堂| 韩国欧美一区二区| 亚洲动漫第一页| 日韩毛片精品高清免费| 精品91自产拍在线观看一区| 欧美日韩1234| 色偷偷一区二区三区| 国产精品66部| 精品一区二区av| 日韩avvvv在线播放| 一区二区在线观看免费| 中文字幕中文字幕中文字幕亚洲无线| 日韩欧美亚洲另类制服综合在线| 色老汉一区二区三区| 成人午夜激情在线| 国产一区二区三区免费播放|