⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 re8670poll.c.svn-base

📁 realtek的8186芯片ADSL路由AP源代码
💻 SVN-BASE
字号:
/* re8670pool.c - RealTek re8670 Fast Ethernet interface header */


#include "re8670poll.h"
#include "iob.h"

#define NULL	0

unsigned char descriptor_tx[TX_DESC_NUM*16+256];
unsigned char descriptor_rx[RX_DESC_NUM*16+256];

NIC_FD_T *pTxBDPtr;
NIC_FD_T *pRxBDPtr;
unsigned int	txBDhead = 0;	// index for system to release buffer
unsigned int	txBDtail = 0;	// index for system to set buf to BD
unsigned int	rxBDtail = 0;	// index for system to set buf to BD


char *Lan_Receive(void)
{
char *pBuf, *pData;

	EISR = 0xffff;  //reset RDU flag to start rx again

	if(pRxBDPtr[rxBDtail].StsLen & OWN_BIT)
		return NULL;

	pData = (char*)pRxBDPtr[rxBDtail].DataPtr;
	pBuf = IOBGetHdr(pData);
	IOB_PKT_LEN(pBuf) = (pRxBDPtr[rxBDtail].StsLen & 0xfff) - 4;

#if 0
	{
	int i;
	unsigned char *sbuf = pData;
		printf("p=%x, l=%d\n\r", sbuf, IOB_PKT_LEN(pBuf));
		for(i=0;i<IOB_PKT_LEN(pBuf); i++)
		{
			if((i%16)==0)
				printf("\n\r");
			printf("%02x ", sbuf[i]);
		}
		printf("\n\r");
	}
#endif

	pRxBDPtr[rxBDtail].StsLen &= ~0xfff;
	pRxBDPtr[rxBDtail].StsLen |= 2048;
	
	pRxBDPtr[rxBDtail].StsLen |= OWN_BIT;
	EthrntRxCPU_Des_Num = rxBDtail;
	rxBDtail++;
	rxBDtail %= RX_DESC_NUM;

	return (pBuf);
}

int Lan_Transmit(void * buff, unsigned int length)
{

	pTxBDPtr[txBDtail].DataPtr = (unsigned int)buff | UNCACHE_MASK;
	if(length < 60)
		length = 60;
	pTxBDPtr[txBDtail].StsLen &= ~0xfff;
	pTxBDPtr[txBDtail].StsLen |= length;

	// trigger to send
	pTxBDPtr[txBDtail].StsLen |= OWN_BIT|FS_BIT|LS_BIT|(1<<23);
	IO_CMD |= (1<<0);
	
	delay_msec(1);
	while(pTxBDPtr[txBDtail].StsLen & OWN_BIT)
		delay_msec(1);

	/* advance one */
	txBDtail++;
	txBDtail %= TX_DESC_NUM;
	
	return 0;
}

int Lan_Initialed = 0;

//11/09/05' hrchen, disable NIC
void Lan_Stop(void)
{
   	CR = 0x01;	 /* Reset */	
	while ( CR & 0x1 );		
	CR = RX_DISALBE;	 /* receive checksum */

	/* Interrupt Register, ISR, IMR */
	EIMR = 0;
	EISR = 0xffff;
	
    Lan_Initialed = 0;
}

int Lan_Initialize(char *mac)
{
int i;

	if(Lan_Initialed)
		return 0;
		
	initIOB();
	
	Lan_Stop();

	pTxBDPtr = (NIC_FD_T *)((((unsigned int)(descriptor_tx+0xff))& 0xffffff00)|UNCACHE_MASK);
	pRxBDPtr = (NIC_FD_T *)((((unsigned int)(descriptor_rx+0xff))& 0xffffff00)|UNCACHE_MASK);
	
	/* setup descriptor */
	RxFDP = pRxBDPtr;
	RxCDO = 0;
	TxFDP1 = pTxBDPtr;
	TxCDO1 = 0;	
	// init xmt BD
	for(i=0;i<TX_DESC_NUM;i++)
	{
		pTxBDPtr[i].StsLen = 0;
		pTxBDPtr[i].VLan = 0;
		pTxBDPtr[i].DataPtr = 0;
	}
	pTxBDPtr[TX_DESC_NUM-1].StsLen |= EOR_BIT;

	for(i=0;i<RX_DESC_NUM;i++)
	{
	char *pBuf;
		if ( (pBuf = getIOB()) == 0 ) {
            return -1;
        }

		pRxBDPtr[i].StsLen = 2048+ OWN_BIT + RX_DESC_BUFFER_SIZE;
		pRxBDPtr[i].VLan = 0;
		pRxBDPtr[i].DataPtr = (unsigned long) IOB_PKT_PTR(pBuf);
	}
	pRxBDPtr[RX_DESC_NUM-1].StsLen |= EOR_BIT;
	//    

	// set MAC address
	{
	unsigned long mac_reg0, mac_reg1;
		//mac_reg0 = (mac[0] << 24) | (mac[1] << 16) | (mac[2] << 8) | (mac[3] << 0);
		//mac_reg1 = (mac[4] << 24) | (mac[5] << 16);
		memcpy(&mac_reg0, mac, 4);
		memcpy(&mac_reg1, &mac[4], 2);
		NIC_ID0 = mac_reg0;
		NIC_ID1 = mac_reg1;	
	}
	
	/* RCR, don't accept error packet */
	RCR = NoErrAccept;
	
	/* TCR: IFG, Mode */
	TCR = (unsigned long)(TCR_IFG<<TCR_IFG_OFFSET)|(TCR_NORMAL<<TCR_MODE_OFFSET);
	
	Rx_Pse_Des_Thres = RX_FC_THRESHOLD;

	/* Rx descriptor Size */	
	EthrntRxCPU_Des_Num = RX_DESC_NUM-1;

	RxRingSize = 0x00;	// 16 descriptor

	/* Flow Control */
	MSR &= ~(TXFCE | RXFCE);
 	
	/* Ethernet IO CMD */
	IO_CMD = CMD_CONFIG;

	Lan_Initialed = 1;
    txBDtail = 0;	// index for system to set buf to BD
    rxBDtail = 0;	// index for system to set buf to BD

	return 0;
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -