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

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

?? ns9750_eth.c

?? UBOOT 源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*********************************************************************** * * Copyright (C) 2004 by FS Forth-Systeme GmbH. * All rights reserved. * * $Id: ns9750_eth.c,v 1.2 2004/02/24 14:09:39 mpietrek Exp $ * @Author: Markus Pietrek * @Descr: Ethernet driver for the NS9750. Uses DMA Engine with polling *	   interrupt status. But interrupts are not enabled. *	   Only one tx buffer descriptor and the RXA buffer descriptor are used *	   Currently no transmit lockup handling is included. eth_send has a 5s *	   timeout for sending frames. No retransmits are performed when an *	   error occurs. * @References: [1] NS9750 Hardware Reference, December 2003 *		[2] Intel LXT971 Datasheet #249414 Rev. 02 *		[3] NS7520 Linux Ethernet Driver * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * ***********************************************************************/#include <common.h>#include <net.h>		/* NetSendPacket */#include "ns9750_eth.h"		/* for Ethernet and PHY */#ifdef CONFIG_DRIVER_NS9750_ETHERNET/* some definition to make transistion to linux easier */#define NS9750_DRIVER_NAME	"eth"#define KERN_WARNING		"Warning:"#define KERN_ERR		"Error:"#define KERN_INFO		"Info:"#if 0# define DEBUG#endif#ifdef	DEBUG# define printk			printf# define DEBUG_INIT		0x0001# define DEBUG_MINOR		0x0002# define DEBUG_RX		0x0004# define DEBUG_TX		0x0008# define DEBUG_INT		0x0010# define DEBUG_POLL		0x0020# define DEBUG_LINK		0x0040# define DEBUG_MII		0x0100# define DEBUG_MII_LOW		0x0200# define DEBUG_MEM		0x0400# define DEBUG_ERROR		0x4000# define DEBUG_ERROR_CRIT	0x8000static int nDebugLvl = DEBUG_ERROR_CRIT;# define DEBUG_ARGS0( FLG, a0 ) if( ( nDebugLvl & (FLG) ) == (FLG) ) \		printf("%s: " a0, __FUNCTION__, 0, 0, 0, 0, 0, 0 )# define DEBUG_ARGS1( FLG, a0, a1 ) if( ( nDebugLvl & (FLG) ) == (FLG)) \		printf("%s: " a0, __FUNCTION__, (int)(a1), 0, 0, 0, 0, 0 )# define DEBUG_ARGS2( FLG, a0, a1, a2 ) if( (nDebugLvl & (FLG)) ==(FLG))\		printf("%s: " a0, __FUNCTION__, (int)(a1), (int)(a2), 0, 0,0,0 )# define DEBUG_ARGS3( FLG, a0, a1, a2, a3 ) if((nDebugLvl &(FLG))==(FLG))\		printf("%s: "a0,__FUNCTION__,(int)(a1),(int)(a2),(int)(a3),0,0,0)# define DEBUG_FN( FLG ) if( (nDebugLvl & (FLG)) == (FLG) ) \		printf("\r%s:line %d\n", (int)__FUNCTION__, __LINE__, 0,0,0,0);# define ASSERT( expr, func ) if( !( expr ) ) { \		printf( "Assertion failed! %s:line %d %s\n", \		(int)__FUNCTION__,__LINE__,(int)(#expr),0,0,0); \		func }#else /* DEBUG */# define printk(...)# define DEBUG_ARGS0( FLG, a0 )# define DEBUG_ARGS1( FLG, a0, a1 )# define DEBUG_ARGS2( FLG, a0, a1, a2 )# define DEBUG_ARGS3( FLG, a0, a1, a2, a3 )# define DEBUG_FN( n )# define ASSERT(expr, func)#endif /* DEBUG */#define NS9750_MII_NEG_DELAY		(5*CFG_HZ) /* in s */#define TX_TIMEOUT			(5*CFG_HZ) /* in s *//* @TODO move it to eeprom.h */#define FS_EEPROM_AUTONEG_MASK		0x7#define FS_EEPROM_AUTONEG_SPEED_MASK	0x1#define FS_EEPROM_AUTONEG_SPEED_10	0x0#define FS_EEPROM_AUTONEG_SPEED_100	0x1#define FS_EEPROM_AUTONEG_DUPLEX_MASK	0x2#define FS_EEPROM_AUTONEG_DUPLEX_HALF	0x0#define FS_EEPROM_AUTONEG_DUPLEX_FULL	0x2#define FS_EEPROM_AUTONEG_ENABLE_MASK	0x4#define FS_EEPROM_AUTONEG_DISABLE	0x0#define FS_EEPROM_AUTONEG_ENABLE	0x4/* buffer descriptors taken from [1] p.306 */typedef struct{	unsigned int* punSrc;	unsigned int unLen;	/* 11 bits */	unsigned int* punDest;	/* unused */	union {		unsigned int unReg;		struct {			unsigned uStatus : 16;			unsigned uRes : 12;			unsigned uFull : 1;			unsigned uEnable : 1;			unsigned uInt : 1;			unsigned uWrap : 1;		} bits;	} s;} rx_buffer_desc_t;typedef struct{	unsigned int* punSrc;	unsigned int unLen;	/* 10 bits */	unsigned int* punDest;	/* unused */	union {		unsigned int unReg; /* only 32bit accesses may done to NS9750				     * eth engine */		struct {			unsigned uStatus : 16;			unsigned uRes : 12;			unsigned uFull : 1;			unsigned uLast : 1;			unsigned uInt : 1;			unsigned uWrap : 1;		} bits;	} s;} tx_buffer_desc_t;static int ns9750_eth_reset( void );static void ns9750_link_force( void );static void ns9750_link_auto_negotiate( void );static void ns9750_link_update_egcr( void );static void ns9750_link_print_changed( void );/* the PHY stuff */static char ns9750_mii_identify_phy( void );static unsigned short ns9750_mii_read( unsigned short uiRegister );static void ns9750_mii_write( unsigned short uiRegister, unsigned short uiData );static unsigned int ns9750_mii_get_clock_divisor( unsigned int unMaxMDIOClk );static unsigned int ns9750_mii_poll_busy( void );static unsigned int nPhyMaxMdioClock = PHY_MDIO_MAX_CLK;static unsigned char ucLinkMode =      FS_EEPROM_AUTONEG_ENABLE;static unsigned int uiLastLinkStatus;static PhyType phyDetected = PHY_NONE;/* we use only one tx buffer descriptor */static tx_buffer_desc_t* pTxBufferDesc =	(tx_buffer_desc_t*) get_eth_reg_addr( NS9750_ETH_TXBD );/* we use only one rx buffer descriptor of the 4 */static rx_buffer_desc_t aRxBufferDesc[ 4 ];/*********************************************************************** * @Function: eth_init * @Return: -1 on failure otherwise 0 * @Descr: Initializes the ethernet engine and uses either FS Forth's default *	   MAC addr or the one in environment ***********************************************************************/int eth_init (bd_t * pbis){	/* This default MAC Addr is reserved by FS Forth-Systeme for the case of	   EEPROM failures */	unsigned char aucMACAddr[6] = { 0x00, 0x04, 0xf3, 0x00, 0x06, 0x35 };	char *pcTmp = getenv ("ethaddr");	char *pcEnd;	int i;	DEBUG_FN (DEBUG_INIT);	/* no need to check for hardware */	if (!ns9750_eth_reset ())		return -1;	if (pcTmp != NULL)		for (i = 0; i < 6; i++) {			aucMACAddr[i] =				pcTmp ? simple_strtoul (pcTmp, &pcEnd,							16) : 0;			pcTmp = (*pcTmp) ? pcEnd + 1 : pcEnd;		}	/* configure ethernet address */	*get_eth_reg_addr (NS9750_ETH_SA1) =		aucMACAddr[5] << 8 | aucMACAddr[4];	*get_eth_reg_addr (NS9750_ETH_SA2) =		aucMACAddr[3] << 8 | aucMACAddr[2];	*get_eth_reg_addr (NS9750_ETH_SA3) =		aucMACAddr[1] << 8 | aucMACAddr[0];	/* enable hardware */	*get_eth_reg_addr (NS9750_ETH_MAC1) = NS9750_ETH_MAC1_RXEN;	/* the linux kernel may give packets < 60 bytes, for example arp */	*get_eth_reg_addr (NS9750_ETH_MAC2) = NS9750_ETH_MAC2_CRCEN |		NS9750_ETH_MAC2_PADEN | NS9750_ETH_MAC2_HUGE;	/* enable receive and transmit FIFO, use 10/100 Mbps MII */	*get_eth_reg_addr (NS9750_ETH_EGCR1) =		NS9750_ETH_EGCR1_ETXWM |		NS9750_ETH_EGCR1_ERX |		NS9750_ETH_EGCR1_ERXDMA |		NS9750_ETH_EGCR1_ETX |		NS9750_ETH_EGCR1_ETXDMA | NS9750_ETH_EGCR1_ITXA;	/* prepare DMA descriptors */	for (i = 0; i < 4; i++) {		aRxBufferDesc[i].punSrc = 0;		aRxBufferDesc[i].unLen = 0;		aRxBufferDesc[i].s.bits.uWrap = 1;		aRxBufferDesc[i].s.bits.uInt = 1;		aRxBufferDesc[i].s.bits.uEnable = 0;		aRxBufferDesc[i].s.bits.uFull = 0;	}	/* NetRxPackets[ 0 ] is initialized before eth_init is called and never	   changes. NetRxPackets is 32bit aligned */	aRxBufferDesc[0].punSrc = (unsigned int *) NetRxPackets[0];	aRxBufferDesc[0].s.bits.uEnable = 1;	aRxBufferDesc[0].unLen = 1522;	/* as stated in [1] p.307 */	*get_eth_reg_addr (NS9750_ETH_RXAPTR) =		(unsigned int) &aRxBufferDesc[0];	/* [1] Tab. 221 states less than 5us */	*get_eth_reg_addr (NS9750_ETH_EGCR1) |= NS9750_ETH_EGCR1_ERXINIT;	while (!	       (*get_eth_reg_addr (NS9750_ETH_EGSR) & NS9750_ETH_EGSR_RXINIT))		/* wait for finish */		udelay (1);	/* @TODO do we need to clear RXINIT? */	*get_eth_reg_addr (NS9750_ETH_EGCR1) &= ~NS9750_ETH_EGCR1_ERXINIT;	*get_eth_reg_addr (NS9750_ETH_RXFREE) = 0x1;	return 0;}/*********************************************************************** * @Function: eth_send * @Return: -1 on timeout otherwise 1 * @Descr: sends one frame by DMA ***********************************************************************/int eth_send (volatile void *pPacket, int nLen){	ulong ulTimeout;	DEBUG_FN (DEBUG_TX);	/* clear old status values */	*get_eth_reg_addr (NS9750_ETH_EINTR) &=		*get_eth_reg_addr (NS9750_ETH_EINTR) & NS9750_ETH_EINTR_TX_MA;	/* prepare Tx Descriptors */	pTxBufferDesc->punSrc = (unsigned int *) pPacket;	/* pPacket is 32bit								 * aligned */	pTxBufferDesc->unLen = nLen;	/* only 32bit accesses allowed. wrap, full, interrupt and enabled to 1 */	pTxBufferDesc->s.unReg = 0xf0000000;	/* pTxBufferDesc is the first possible buffer descriptor */	*get_eth_reg_addr (NS9750_ETH_TXPTR) = 0x0;	/* enable processor for next frame */	*get_eth_reg_addr (NS9750_ETH_EGCR2) &= ~NS9750_ETH_EGCR2_TCLER;	*get_eth_reg_addr (NS9750_ETH_EGCR2) |= NS9750_ETH_EGCR2_TCLER;	ulTimeout = get_timer (0);	DEBUG_ARGS0 (DEBUG_TX | DEBUG_MINOR,		     "Waiting for transmission to finish\n");	while (!	       (*get_eth_reg_addr (NS9750_ETH_EINTR) &		(NS9750_ETH_EINTR_TXDONE | NS9750_ETH_EINTR_TXERR))) {		/* do nothing, wait for completion */		if (get_timer (0) - ulTimeout > TX_TIMEOUT) {			DEBUG_ARGS0 (DEBUG_TX, "Transmit Timed out\n");			return -1;		}	}	DEBUG_ARGS0 (DEBUG_TX | DEBUG_MINOR, "transmitted...\n");	return 0;}/*********************************************************************** * @Function: eth_rx * @Return: size of last frame in bytes or 0 if no frame available * @Descr: gives one frame to U-Boot which has been copied by DMA engine already *	   to NetRxPackets[ 0 ]. ***********************************************************************/int eth_rx (void){	int nLen = 0;	unsigned int unStatus;	unStatus =		*get_eth_reg_addr (NS9750_ETH_EINTR) & NS9750_ETH_EINTR_RX_MA;	if (!unStatus)		/* no packet available, return immediately */		return 0;	DEBUG_FN (DEBUG_RX);	/* unLen always < max(nLen) and discard checksum */	nLen = (int) aRxBufferDesc[0].unLen - 4;	/* acknowledge status register */	*get_eth_reg_addr (NS9750_ETH_EINTR) = unStatus;	aRxBufferDesc[0].unLen = 1522;	aRxBufferDesc[0].s.bits.uFull = 0;	/* Buffer A descriptor available again */	*get_eth_reg_addr (NS9750_ETH_RXFREE) |= 0x1;	/* NetReceive may call eth_send. Due to a possible bug of the NS9750 we	 * have to acknowledge the received frame before sending a new one */	if (unStatus & NS9750_ETH_EINTR_RXDONEA)		NetReceive (NetRxPackets[0], nLen);	return nLen;}/*********************************************************************** * @Function: eth_halt * @Return: n/a * @Descr: stops the ethernet engine ***********************************************************************/void eth_halt (void){	DEBUG_FN (DEBUG_INIT);	*get_eth_reg_addr (NS9750_ETH_MAC1) &= ~NS9750_ETH_MAC1_RXEN;	*get_eth_reg_addr (NS9750_ETH_EGCR1) &= ~(NS9750_ETH_EGCR1_ERX |						  NS9750_ETH_EGCR1_ERXDMA |						  NS9750_ETH_EGCR1_ETX |						  NS9750_ETH_EGCR1_ETXDMA);}/*********************************************************************** * @Function: ns9750_eth_reset * @Return: 0 on failure otherwise 1 * @Descr: resets the ethernet interface and the PHY, *	   performs auto negotiation or fixed modes ***********************************************************************/static int ns9750_eth_reset (void){	DEBUG_FN (DEBUG_MINOR);	/* Reset MAC */	*get_eth_reg_addr (NS9750_ETH_EGCR1) |= NS9750_ETH_EGCR1_MAC_HRST;	udelay (5);		/* according to [1], p.322 */	*get_eth_reg_addr (NS9750_ETH_EGCR1) &= ~NS9750_ETH_EGCR1_MAC_HRST;	/* reset and initialize PHY */	*get_eth_reg_addr (NS9750_ETH_MAC1) &= ~NS9750_ETH_MAC1_SRST;	/* we don't support hot plugging of PHY, therefore we don't reset	   phyDetected and nPhyMaxMdioClock here. The risk is if the setting is	   incorrect the first open	   may detect the PHY correctly but succeding will fail	   For reseting the PHY and identifying we have to use the standard	   MDIO CLOCK value 2.5 MHz only after hardware reset	   After having identified the PHY we will do faster */

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人精品视频一区二区三区 | 欧美一区三区四区| 成人国产在线观看| 国产白丝网站精品污在线入口 | 国产喂奶挤奶一区二区三区| 日韩欧美高清一区| 2024国产精品| 国产欧美一区二区精品性色 | 国产精品免费视频一区| 久久噜噜亚洲综合| 亚洲国产精品av| 亚洲码国产岛国毛片在线| 亚洲天堂2016| 亚洲成在线观看| 九九精品一区二区| 国产精品亚洲专一区二区三区| 水野朝阳av一区二区三区| 欧美经典一区二区三区| 日本欧美加勒比视频| 亚洲精品五月天| 久久久久久久久久电影| 亚洲一区二区三区四区五区中文 | 亚洲男人的天堂在线aⅴ视频| 国产一区二区三区在线观看免费| 欧美日韩你懂得| 亚洲亚洲人成综合网络| 色婷婷国产精品| 玉米视频成人免费看| 91精品福利视频| 日韩理论在线观看| 一本色道久久综合亚洲91 | 中文字幕免费不卡| 国产精品资源在线| 欧美国产日韩精品免费观看| 国产高清在线精品| 中文字幕亚洲精品在线观看 | 亚洲欧洲日韩一区二区三区| 波多野洁衣一区| 日韩美女精品在线| 91丨porny丨蝌蚪视频| 亚洲视频网在线直播| 日本韩国视频一区二区| 亚洲午夜久久久久久久久电影网| 91福利视频久久久久| 亚洲6080在线| 日韩欧美国产电影| 成人深夜在线观看| 亚洲女同一区二区| 正在播放亚洲一区| 国产一区二区精品久久| 国产精品福利一区二区三区| 色综合av在线| 麻豆国产欧美日韩综合精品二区| 欧美mv和日韩mv国产网站| 国产精品原创巨作av| 18成人在线观看| 欧美一区二视频| av不卡免费电影| 日韩av一区二| 欧美国产日韩a欧美在线观看| 色一情一伦一子一伦一区| 日韩高清欧美激情| 国产色爱av资源综合区| 91成人国产精品| 久久99精品一区二区三区三区| 国产欧美精品国产国产专区| 欧美无乱码久久久免费午夜一区| 美女视频黄a大片欧美| 国产精品美日韩| 欧美日韩高清一区| 成人精品gif动图一区| 日韩精品久久久久久| 国产精品免费看片| 日韩一级大片在线观看| av福利精品导航| 久久99在线观看| 一区二区三区加勒比av| 国产午夜精品一区二区三区四区 | av不卡一区二区三区| 日韩精品视频网站| 亚洲精品免费视频| 久久久久久麻豆| 欧美精品自拍偷拍| 97久久精品人人做人人爽| 老司机精品视频导航| 亚洲精品视频在线看| 久久丝袜美腿综合| 欧美三级电影一区| www.av精品| 国产福利精品一区二区| 日韩黄色一级片| 亚洲一区二区三区中文字幕在线| 久久精品综合网| 欧美不卡在线视频| 欧美日本一道本在线视频| 99这里只有精品| 国产一区二区三区免费播放| 日本麻豆一区二区三区视频| 亚洲国产日韩精品| 亚洲另类色综合网站| 国产精品婷婷午夜在线观看| 久久青草欧美一区二区三区| 欧美成人三级在线| 欧美一区二区三区系列电影| 欧美在线免费视屏| 色噜噜偷拍精品综合在线| 成人av网站在线观看免费| 国产精品一区三区| 国产一区二区三区视频在线播放| 精品在线免费观看| 精品在线亚洲视频| 国产一区在线观看视频| 经典一区二区三区| 久久er精品视频| 国产精品一区在线| 国产不卡视频一区二区三区| 国产成人av电影在线| 国产不卡一区视频| 99精品国产91久久久久久| 99久久精品免费看| 91麻豆精品在线观看| 在线影视一区二区三区| 欧美亚洲综合久久| 欧美乱妇15p| 欧美剧情片在线观看| 欧美一区日本一区韩国一区| 精品日本一线二线三线不卡| 26uuu另类欧美亚洲曰本| 国产亚洲婷婷免费| 中文字幕精品在线不卡| 1区2区3区欧美| 五月天激情综合网| 精品亚洲porn| 91亚洲国产成人精品一区二三| 色婷婷激情综合| 日韩一区二区免费在线电影| 国产网站一区二区| 亚洲视频在线一区观看| 亚洲国产日日夜夜| 黄色日韩网站视频| 91视频在线观看| 在线播放国产精品二区一二区四区| 日韩精品一区二区三区四区视频| 国产女主播在线一区二区| 亚洲综合丁香婷婷六月香| 捆绑调教一区二区三区| 大尺度一区二区| 欧美嫩在线观看| 欧美激情一区三区| 午夜视频一区在线观看| 国产一区二区三区在线观看精品 | 成人午夜激情影院| 欧美午夜精品一区二区蜜桃| 亚洲精品一区二区三区99| 亚洲人成网站精品片在线观看| 三级欧美韩日大片在线看| 岛国一区二区在线观看| 精品视频999| 国产精品伦理在线| 美国精品在线观看| jlzzjlzz亚洲女人18| 日韩欧美亚洲国产精品字幕久久久 | 欧美日韩极品在线观看一区| 久久精品夜色噜噜亚洲a∨| 亚洲高清免费视频| 成人动漫在线一区| 欧美va在线播放| 亚洲国产美女搞黄色| 成人av集中营| 精品国产乱码久久久久久浪潮 | 在线欧美小视频| 久久久久国产一区二区三区四区| 亚洲成av人片在线观看| 成人激情动漫在线观看| 精品久久国产字幕高潮| 午夜精品视频一区| 在线国产亚洲欧美| 日韩一区中文字幕| 成人a区在线观看| 久久综合一区二区| 热久久免费视频| 欧美精品乱码久久久久久按摩 | 色综合亚洲欧洲| 国产午夜亚洲精品羞羞网站| 久久99精品久久久久久| 欧美美女网站色| 午夜精品久久久久久久久久| 91亚洲精品久久久蜜桃网站| 国产精品卡一卡二| 国产成人在线视频免费播放| 久久综合一区二区| 国产尤物一区二区在线| 久久欧美中文字幕| 国产精品123区| 国产欧美一区二区精品久导航 | 18成人在线观看| 99久久99久久久精品齐齐| 国产精品日产欧美久久久久| 国产精品一区二区免费不卡| 国产日韩欧美不卡在线|