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

📄 rtl8019.c

📁 44b0中USB slave端程序
💻 C
字号:
#include "44b0x.h"
#include "DataType.h"
#include "console.h"
#include "rtl8019.h"

static U8 SrcMacID[6]={0x00,0x0d,0x61,0xa9,0xf5,0x36};
#define ETH_FRAME_LEN 1500

#define	 Net_Addr	0x6000000

#define	RPSTART	0x4c
#define	RPSTOP	0x60
#define	SPSTART	0x40

static U8 net_start;
static U8 rBNRY;



/****************************************************************************
* 名称:WriteToNet()
* 功能:把数据写入RTL8019AS
* 入口参数:	ADDR		写入地址
WRITEDATA   写入数据
* 出口参数:无
****************************************************************************/

void  WriteToNet(U8 ADDR_8,U8 WRITEDATA)
{
   (*((volatile U8 *) Net_Addr+ADDR_8))=WRITEDATA;//0x83400000	 
}


/****************************************************************************
* 名称:ReadFromNet()
* 功能:从RTL8019AS把数据读出
* 入口参数:	ADDR		读出地址
* 出口参数:	READDATA   	读出数据
****************************************************************************/
U8  ReadFromNet(U8 ADDR_8)
{
   U8 temp;
   temp=(*((volatile U8 *) Net_Addr+ADDR_8));//0x83400000
   return (temp);
}

/**********************************************************************
**函数原型:    void  page(uchar pagenumber)
**入口参数:?uchar	pagenumber: 要切换的页
**出口参数:		无
**返 回 值:	无      
**说    明:	选择页,可选择0,1,2三页,第四页ne000兼容芯片保留 
************************************************************************/
void page(U8 pagenumber)  
{
   U8 temp;
   temp=ReadFromNet(0);//command register
   //temp=temp&0x3f;
   temp=temp&0x3B ;//注意txp位不能要
   pagenumber=pagenumber <<6;
   temp=temp | pagenumber;
   WriteToNet(0,temp);
}

/**********************************************************************
**函数原型:    void 	SetMacID()
**入口参数:		*mac_ptr
**出口参数:		无
**返 回 值:	无            
**说    明:	设置芯片物理地址,物理地址已经存储在程序空间内 
************************************************************************/
void SetMacID(void)
{	
	page(1);
    WriteToNet(1, SrcMacID[0]);
	WriteToNet(2, SrcMacID[1]);
	WriteToNet(3, SrcMacID[2]);
	WriteToNet(4, SrcMacID[3]);
	WriteToNet(5, SrcMacID[4]);
	WriteToNet(6, SrcMacID[5]);
	page(0);
}

U8 Rst8019(void)
{
	int i;
	
	WriteToNet(0x18, 0x5a);
	i = 20000;
	while(i--);
	page(0);
	return (ReadFromNet(0x07)&0x80);
	
}

void WakeRtl8019as(void)
{
	page(3);	
	WriteToNet(0x01, 0xcf);		//set eem1-0, 11 ,enable write config register
	WriteToNet(0x06, 0x70);	//clear pwrdn, sleep mode, set led0 as led_link, led1 as led_rx	
	WriteToNet(0x01, 0x3f); 	//disable write config register
}

void InitRS8019(void)
{
	net_start = 1;
	WriteToNet(0x00, 0x21);	/* set page 0 and stop */
	WriteToNet(0x01, RPSTART);		/* set Pstart 0x4c */
	WriteToNet(0x02, RPSTOP);		/* set Pstop 0x60 */
	WriteToNet(0x03, RPSTART);	/* BNRY-> the last page has been read */	
	WriteToNet(0x04, SPSTART);		/* transmit page start register, 0x40 */
	WriteToNet(12, 0xcc);		/* set RCR 0xcc */	
	WriteToNet(13, 0xe0);		/* set TCR 0xe0 */
#ifdef	RTL8019_OP_16
	WriteToNet(14, 0xc9);		/* set DCR 0xc9, 16bit DMA */	
#else
	WriteToNet(14, 0xc8);		/* 8bit DMA */
#endif
	WriteToNet(15, 0x03);		/* set IMR 0x03 */
	WriteToNet(7, 0xff);	
	
	page(1);	
	WriteToNet(7, RPSTART+1);	
	WriteToNet(8, 0x00);
	WriteToNet(9, 0x41);
	WriteToNet(10, 0x00);
	WriteToNet(11, 0x80);
	WriteToNet(12, 0x00);
	WriteToNet(13, 0x00);
	WriteToNet(14, 0x00);
	WriteToNet(15, 0x00);
	WriteToNet(0, 0x22);	/* set page 0 and start */
	
	net_start = 0;	
	rBNRY = RPSTART;
}

int s3c44b0_eth_init(void)
{	
	U16 i;
	
	WakeRtl8019as();

	if(!Rst8019())
	{
		printf("\nRtl8019 Reset Failed!\n");
		printf("%x ", ReadFromNet(7));		
		return -1;
	}
	printf("\nRtl8019 Reset Successfully\n");		
		
	InitRS8019();
	
	i  = ReadFromNet(10);	
	i |= ReadFromNet(11)<<8;
	
	printf("The ID of the Rtl8019 is: %#4x\n",i);
	
	SetMacID();	
	return 0;			
}


int s3c44b0_eth_send(unsigned char *data, unsigned int len)
{
	static sFlag = 0;
	int i;
	U8 send_page;
	
	send_page  = SPSTART;
	send_page += (sFlag&1)?6:0;
	sFlag++;			
		
	if(len<60)	
		for(; len<60; len++)
			data[len] = 0x20;		//just for pad, any data										
	
	page(0);
	WriteToNet(0x00, 0x22);
	WriteToNet(0x08, 0);
	WriteToNet(0x09, send_page);
	WriteToNet(0x0a, len&0xff);
	WriteToNet(0x0b, len>>8);		
	WriteToNet(0x00, 0x12);
#ifdef	RTL8019_OP_16
	len += len&1;
	for(i=0; i<(len>>1); i++)
		WriteToNet(0x10, ((U16 *)data)[i]);
#else	
	for(i=0; i<len; i++)
		WriteToNet(0x10, data[i]);		// tarns to ram			
#endif		
			
    while(ReadFromNet(0x00)&4);
	WriteToNet(0x04, send_page);
	WriteToNet(0x05, len&0xff);
	WriteToNet(0x06, len>>8);
	WriteToNet(0x00, 0x1e);			// begin to send

	return 0;
}


int s3c44b0_eth_rcv(unsigned char *data, unsigned int *len)
{
	U8 RxPageBeg, RxPageEnd;
	U8 RxNextPage;
	U8 RxStatus;
	int i, RxLength;
	U16 *data_16;
	
	data_16 = (U16 *)data;
	
	page(0);
	WriteToNet(0x03, rBNRY);
	if(ReadFromNet(0x07)&1)			//接收成功
		WriteToNet(0x07, 0x1);		//清除中断标志
	else
		return 0;
		
	page(1);
	RxPageEnd = ReadFromNet(0x07);
	page(0);

	RxPageBeg = rBNRY+1;
	if(RxPageBeg>=RPSTOP)
		RxPageBeg = RPSTART;
	WriteToNet(0x00, 0x22);
		
	//outport(RSAR0, RxPageBeg<<8);
	//outport(RBCR0, 256);
	WriteToNet(0x08, 0);
	WriteToNet(0x09, RxPageBeg);
	WriteToNet(0x0a, 4);
	WriteToNet(0x0b, 0);
	WriteToNet(0x00, 0xa);
#ifdef	RTL8019_OP_16
	RxLength   = ReadFromNet(0x10);
	RxStatus   = RxLength&0xff;
	RxNextPage = RxLength>>8;
	RxLength   = ReadFromNet(0x10);
	RxLength  += RxLength&1;
#else
	RxStatus   = ReadFromNet(0x10);
	RxNextPage = ReadFromNet(0x10);	
	RxLength   = ReadFromNet(0x10);
	RxLength  |= ReadFromNet(0x10)<<8;
#endif	
		
	if(RxLength>ETH_FRAME_LEN)
	{
		if(RxPageEnd==RPSTART)
			rBNRY = RPSTOP-1;
		else
			rBNRY = RxPageEnd-1;
		WriteToNet(0x03, rBNRY);
		return -1;
	}
	RxLength-=4;      //去掉CRC
	*len=RxLength;
	WriteToNet(0x08, 4);
	WriteToNet(0x09, RxPageBeg);
	WriteToNet(0x0a, RxLength);
	WriteToNet(0x0b, RxLength>>8);	
	WriteToNet(0x00, 0xa);
    
    
    
#ifdef	RTL8019_OP_16
	i = 2;
	data_16 -= i;
	RxLength >>= 1;
	for(; RxLength--;) {
		if(!(i&0x7f)) {
			WriteToNet(0x03, RxPageBeg);				
				RxPageBeg++;
				if(RxPageBeg>=RPSTOP)
					RxPageBeg = RPSTART;
		}
		data_16[i++] = ReadFromNet(0x10);
//		printf("%x,", data_16[i-1]);
	}	
#else
	i     = 4;
	data -= i;
	for(; RxLength--;)
	{
		if(!(i&0xff))
			{
				WriteToNet(0x03, RxPageBeg);				
				RxPageBeg++;
				if(RxPageBeg>=RPSTOP)
					RxPageBeg = RPSTART;					
			}
		data[i++] = ReadFromNet(0x10);		
	}
#endif	
	WriteToNet(0x03, RxPageBeg);	
	rBNRY = RxPageBeg;
	
	return 1;
}

⌨️ 快捷键说明

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