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

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

?? mac.c

?? 該程序為AT91RM9200引導程序
?? C
字號:
#include "..\config.h"
#include "AT91RM9200.h"
#include "lib_AT91RM9200.h"
#include "Emac.h"
#include "eth.h"
#include "mac.h"
#include "utils.h"
#include "console.h"

#ifdef	TFTP_SUPPORT

static U8 OurEmacAddr[ETH_ALEN] = {0x00,0x80,0x48,0x12,0x34,0x56};
//static U8 DstMacID[ETH_ALEN];

#define	DRAM_END		(DRAM_BASE + DRAM_SIZE)
//Buffer descriptor address must be word aligned
#define AT91C_EMAC_TDLIST_BASE	(DRAM_END-SIZE_2M)		//非Cache區,不能被下載數據沖掉!!!

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

static U8 lnk_stat;

void Delay(U32 ms)
{
	U16 i;
	
	i = AT91C_BASE_TC0->TC_RC>>1;	//1000us/2
	
	AT91C_BASE_TC0->TC_CCR = 4;	//復位為0,加計數
	
	while(ms--) {
		while(AT91C_BASE_TC0->TC_CV<=i);
		while(AT91C_BASE_TC0->TC_CV>i);
	}
}
// ****************************************************************************************************
// ** EMAC lowlevel functions 
// ****************************************************************************************************
//*----------------------------------------------------------------------------
//* \fn    AT91F_MII_ReadPhy
//* \brief This function return the MII phy register
//*----------------------------------------------------------------------------
static unsigned short AT91F_MII_ReadPhy(
	AT91PS_EMAC pEmac,     // \arg Pointer to AT91PS_EMAC service
	unsigned char addr) 
{
	unsigned int value = 0x60020000 | (addr << 18);

	pEmac->EMAC_MAN = value;
	Delay(10);
	return (pEmac->EMAC_MAN & 0x0000ffff);
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_MII_GetLinkSpeed
//* \brief This function configure the link speed
//*----------------------------------------------------------------------------
static 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);
	
	if(!(stat1 & 0x4))	//added by hzh
		return -1;		//no link, see the driver in linux

	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);
    	lnk_stat = (1<<1)|1;
    }
    //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;
    	lnk_stat = 1;
    }
    //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;
    	lnk_stat = 1<<1;
    }
    //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;
		lnk_stat = 0;
	}
	
	//add by hzh
//	printf("Now link status is %s-%s\n", (lnk_stat&(1<<8))?"100M BaseT":"10M BaseT",
//				(lnk_stat&1)?"FullDuplex":"HalfDuplex");

	return 0;
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_MDIO_StartupPhy
//* \brief This function start the phy
//*----------------------------------------------------------------------------
static int AT91F_MDIO_StartupPhy(AT91PS_EMAC pEmac)     // \arg Pointer to AT91PS_EMAC service
{
	int ret;
	if(pEmac->EMAC_SR & AT91C_EMAC_LINK)	//this bit has no means, reserved as 0
		return 0;
		
	pEmac->EMAC_CTL |= AT91C_EMAC_MPE;
	
	ret = MII_GetLinkSpeed(pEmac);	
	
	pEmac->EMAC_CTL &= ~AT91C_EMAC_MPE;
  
//	return 0;
	return ret;	//modified by hzh
}

//*----------------------------------------------------------------------------
//* \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);

	// 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];
	
	if ( status )
		return status;

	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
//*----------------------------------------------------------------------------
static 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));
}

int board_eth_init(void)
{	
	return AT91F_EmacEntry();
}

int board_eth_lnk_stat(void)
{
	if(lnk_stat!=-1) {
		printf("Now link status is %s-%s\n", (lnk_stat&(1<<1))?"100M BaseT":"10M BaseT",
				(lnk_stat&1)?"FullDuplex":"HalfDuplex");
		return 0;
	}
	
	printf("Link error\n");		
	return -1;
}

int board_eth_send(unsigned char *data, unsigned int len)
{		
	if(len<60)
		for(; len<60; len++)
			data[len] = 0x20;		//just for pad, any data
	
	memcpy(TxPacket, data, len);
	
/*	{
		int i;
		
		for(i=0; i<len; i++)
			printf("%x,", data[i]);
			
		putch('\n');	
	}*/
	
	if (!(*AT91C_EMAC_TSR & AT91C_EMAC_BNQ))
			return -1;
  	*AT91C_EMAC_TSR |= AT91C_EMAC_COMP;
	*AT91C_EMAC_TAR = (unsigned int)TxPacket;
	*AT91C_EMAC_TCR = len;
	
	return 0;
}

int board_eth_rcv(unsigned char *data, unsigned int *len)
{
	unsigned int i;

	// Receive one packet
	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;	//清楚標識
			break;
		}
	}

	if(i==NB_ETH_RX_PACKETS)
		return -1;
		
//	printf("%d\n", i);
	
	memcpy(data, (char *)(tdList[i].addr&~3), tdList[i].size);
	
	// process the packet
	tdList[i].addr &= ~0x01;
	
	return 0;
}

int board_eth_get_addr(unsigned char *addr)
{
	memcpy(addr, OurEmacAddr, ETH_ALEN);
	return 0;
}

#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线亚洲一区二区| 99精品桃花视频在线观看| 亚洲最快最全在线视频| 国产精品美女久久久久久2018 | 视频一区免费在线观看| 亚洲免费在线观看| 亚洲欧美色图小说| 亚洲成人高清在线| 久88久久88久久久| 粉嫩av一区二区三区| 不卡视频在线观看| 欧洲在线/亚洲| 欧美一区二区黄色| 国产午夜亚洲精品理论片色戒 | 成人激情黄色小说| 97超碰欧美中文字幕| 91电影在线观看| 欧美丰满高潮xxxx喷水动漫| 51精品国自产在线| 欧美激情综合网| 一区二区激情视频| 韩国女主播一区二区三区| 国产精品99久久久久久久女警 | 亚洲亚洲精品在线观看| 日韩av一二三| 国产a区久久久| 91国偷自产一区二区三区观看| 欧美二区三区的天堂| 国产情人综合久久777777| 亚洲人成人一区二区在线观看| 日韩成人一级大片| 成人亚洲一区二区一| 69久久99精品久久久久婷婷| 国产精品系列在线| 午夜精彩视频在线观看不卡| 国产一区二区按摩在线观看| 欧美性受xxxx黑人xyx性爽| 精品裸体舞一区二区三区| 日韩美女视频一区| 久久疯狂做爰流白浆xx| 欧美在线观看禁18| 国产午夜三级一区二区三| 偷拍自拍另类欧美| 99久久免费精品| 精品国产成人在线影院| 亚洲影院久久精品| 丁香网亚洲国际| 日韩欧美aaaaaa| 亚洲小说欧美激情另类| www.在线欧美| 久久久久国产精品厨房| 日本麻豆一区二区三区视频| 日本乱人伦aⅴ精品| 国产精品久久久久久久浪潮网站| 免费观看久久久4p| 欧美日韩精品一区视频| 日韩毛片高清在线播放| 国产一本一道久久香蕉| 欧美mv和日韩mv国产网站| 午夜精品久久久久久久久| 色综合久久99| 欧美激情一区二区三区不卡 | 欧美日韩一卡二卡三卡| 亚洲欧美中日韩| 成人一区二区三区视频在线观看| 精品国产露脸精彩对白| 精品系列免费在线观看| 欧美一区二区三区日韩视频| 日韩精品一二三区| 4438成人网| 日韩国产成人精品| 日韩小视频在线观看专区| 日韩成人免费电影| 欧美成人欧美edvon| 日韩成人伦理电影在线观看| 日韩一级二级三级| 国产在线精品一区二区夜色| 日韩欧美国产精品一区| 国产一区欧美一区| 国产区在线观看成人精品| 成人黄色免费短视频| 亚洲色图在线视频| 在线观看亚洲精品| 调教+趴+乳夹+国产+精品| 欧美一区二区美女| 激情六月婷婷久久| 欧美韩国日本综合| 在线精品视频一区二区三四| 亚洲成人免费看| 精品乱码亚洲一区二区不卡| 国产老妇另类xxxxx| 国产精品国产三级国产aⅴ原创| 99精品欧美一区二区三区小说 | 777奇米四色成人影色区| 天天免费综合色| xfplay精品久久| 99久久99久久精品免费看蜜桃| 亚洲一区二区三区四区中文字幕| 欧美日韩综合不卡| 国产福利一区在线| 亚洲免费电影在线| 欧美不卡123| youjizz国产精品| 免费人成在线不卡| 国产精品水嫩水嫩| 欧美三级在线播放| 国产sm精品调教视频网站| 亚洲色图清纯唯美| 欧美电影免费观看高清完整版| www.亚洲色图.com| 久久国产夜色精品鲁鲁99| 亚洲视频1区2区| 久久在线观看免费| 欧美日韩视频专区在线播放| 国产suv精品一区二区6| 日韩av成人高清| 亚洲婷婷国产精品电影人久久| 日韩美女在线视频| 在线观看欧美精品| 国产精品888| 青青草国产成人99久久| 亚洲免费看黄网站| 国产日韩成人精品| 欧美大片一区二区| 色婷婷激情久久| 懂色av一区二区三区蜜臀| 蜜臀久久99精品久久久画质超高清| 亚洲另类春色国产| 欧美激情一区二区三区| 欧美成人一区二区三区片免费| 欧美日韩一二三区| 91免费看`日韩一区二区| 精品一区免费av| 轻轻草成人在线| 亚洲国产精品久久久久婷婷884 | 成人成人成人在线视频| 日本美女一区二区| 亚洲aⅴ怡春院| 亚洲女人****多毛耸耸8| 国产精品乱人伦中文| 久久久久久久一区| 久久久久久毛片| 久久久久久久网| 精品国产一区二区三区久久久蜜月 | 首页国产欧美日韩丝袜| 一区二区三区视频在线看| 国产精品久久久久久久久免费桃花 | 成人高清视频在线观看| 国产精品伊人色| 韩国三级中文字幕hd久久精品| 久久99精品久久久久婷婷| 奇米四色…亚洲| 久久99久久精品| 久久99精品久久久久久国产越南| 麻豆国产91在线播放| 麻豆精品新av中文字幕| 国产在线精品一区二区三区不卡| 国产一区二区三区高清播放| 国产伦精品一区二区三区免费| 国产一区二区免费在线| 国产乱子轮精品视频| 国产宾馆实践打屁股91| voyeur盗摄精品| 91福利精品第一导航| 欧美精品 日韩| 精品国产麻豆免费人成网站| 久久五月婷婷丁香社区| 国产精品九色蝌蚪自拍| 亚洲制服丝袜一区| 秋霞午夜鲁丝一区二区老狼| 国产一区视频网站| 色中色一区二区| 91精品国产欧美一区二区18| 久久久久久久电影| 亚洲人妖av一区二区| 日本视频中文字幕一区二区三区| 国模一区二区三区白浆| 99免费精品在线| 欧美夫妻性生活| 国产日韩成人精品| 亚洲影院理伦片| 国内精品免费在线观看| 日本电影欧美片| 国产性天天综合网| 亚洲国产裸拍裸体视频在线观看乱了| 日韩vs国产vs欧美| 成人av网址在线| 欧美挠脚心视频网站| 久久久蜜臀国产一区二区| 亚洲一区二区在线免费看| 韩国成人在线视频| 91国偷自产一区二区开放时间| 欧美一卡在线观看| 18成人在线观看| 激情六月婷婷久久| 欧美日韩精品高清| 国产精品美女久久久久久久久| 日韩激情av在线| 欧美亚洲国产怡红院影院| 欧美国产综合色视频|