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

📄 rtl8019as_m128.c

📁 网卡驱动程序
💻 C
字号:
#include "Rtl8019as_M128.h"

//*	Initialize the RTL8019AS
void Rtl8019_Init(void)
{
   //地址端口初始化
   RTL8019_ADDR_DDR = RTL8019_ADDR_PINS;
   RTL8019_ADDR_PORT = 0;

   //数据端口初始化
   RTL8019_DATA_DDR = 0;
   RTL8019_DATA_PORT = 0xff;   
   
   //中断端口初始化
   RTL8019_INT_DDR &= ~(1<<INT0_PIN);
   RTL8019_INT_PORT |= (1<<INT0_PIN);   

   //控制端口初始化
   RTL8019_CTRL_DDR |= (1<<IORB_PIN) | (1<<IOWB_PIN);
   RTL8019_CTRL_PORT |= (1<<IORB_PIN) | (1<<IOWB_PIN);      
   RTL8019_CTRL_DDR |= (1<<RSTDRV_PIN) ;

   //硬复位RTL8019
   RTL8019_CTRL_PORT |= (1<<RSTDRV_PIN) ;
   Delay_nms_Preci(10);
   RTL8019_CTRL_PORT &= ~(1<<RSTDRV_PIN) ;
   Delay_nms_Preci(5);   // Delay time > 1.6 ms

   //软复位RTL8019  (这里注释掉, 再测试看) 
   Rtl8019_WriteData( RSTPORT, Rtl8019_ReadData(RSTPORT) )
   Delay_nms_Preci(5);   // Delay time > 1.6 ms
   
   //检查复位是否成功
   if ( !( Rtl8019_ReadData(RSTPORT) & RST) )
   {
      while (1)
	  {
	     //printf("RTL8019AS INIT FAILED!\r\n");
		 Delay_nms_Preci(1000);
	  }   
   }
  
   //Rtl8019_WriteData( CR, 0x21 );  
   Rtl8019_WriteData(CR, CR_PAGE0 + CR_NODMA + CR_STOP);   //设置Page0, 结束DMA的读写操作,并使芯片处于停止模式,
                                                           //停止模式下,将不会发送和接收数据包
   Delay_nms_Preci(5);                // Delay time >= 2 ms
   Rtl8019_WriteData(DCR, DCR_FT10 + DCR_ARM + DCR_BMS);   //设置FIFO寄存器,设置数据传送方式  
   Rtl8019_WriteData(RBCR0, 0);       //要读取的字节数的计数(低8位) 
   Rtl8019_WriteData(RBCR1, 0);       //要读取的字节数的计数(高8位) 
   Rtl8019_WriteData(RCR, RCR_BCST);  //接收寄存器配置,可接收广播地址的数据包
   Rtl8019_WriteData(TPSR, TXSTART);  //设置发送页的起始页地址0X40 (如果发送第2个缓冲区,则设TPSR为0x46)
                                      //网卡有16K RAM,地址为0x4000-0x7fff,页地址为0x40--0x7f
   Rtl8019_WriteData(TCR, TCR_LB01);  //发送寄存器配置,Internal Lookback ,append crc

   Rtl8019_WriteData(PSTART, RXSTART);  //接收缓冲区起始页
   Rtl8019_WriteData(BNRY, RXSTART);    //下一次将要去读取的页
   Rtl8019_WriteData(PSTOP, RXSTOP);    //接收缓冲区结束页
   Rtl8019_WriteData(CR, CR_PAGE0 + CR_NODMA + CR_STOP); //设置Page0, 结束DMA的读写操作,并使芯片处于停止模式,
                                                         //停止模式下,将不会发送和接收数据包
   
   Rtl8019_WriteData(CR, CR_PAGE1 + CR_NODMA + CR_STOP); //设置Page1
   Rtl8019_WriteData(CURR, RXSTART);    //当前要写入的页

   for(i=0;i<6;++i)
      Rtl8019_WriteData(PAR0+i, nodLoc.cMac[i]);
      
   Rtl8019_WriteData(CR, CR_PAGE0 + CR_NODMA + CR_START);   //设置Page0, 结束DMA的读写操作,并启动8019芯片
   Rtl8019_WriteData(ISR,0xFF);    //清除所有中断标志
   Rtl8019_WriteData(IMR,ISR_ALL); //屏蔽所有中断   
   Rtl8019_WriteData(TCR, TCR_LB00);  //Normal Operation
}

void Rtl8019_SetPage(unsigned char cPage)
{
   unsigned char cTemp;
   
   cTemp = CR;
   cTemp = cTemp & 0x3B; //注意不是0x3F ,TXP位在平时一定要置为0.
   cTemp = cTemp | (cPage << 6);
   CR = cTemp;
}


/*
 
//******************************************************************
//*	Write to NIC Control Register
//******************************************************************
void write_rtl(unsigned int regaddr, unsigned int regdata)
{
    rtladdr = regaddr;
    rtldata = regdata;
    tortl;
	nop;
    clr_iow_pin;
	nop;
    set_iow_pin;
	nop;
    fromrtl;
	PORTA = 0xFF; 
}

//******************************************************************
//*	Read From NIC Control Register
//******************************************************************
void read_rtl(unsigned int regaddr)
{
   fromrtl;
   PORTA = 0xFF; 
   rtladdr = regaddr;
   clr_ior_pin;
   nop;
   byte_read = PINA;
   nop;
   set_ior_pin;
   nop;   
}

//******************************************************************
//*	Handle Receive Ring Buffer Overrun
//*   No packets are recovered
//******************************************************************
void overrun()
{
   read_rtl(CR);
   data_L = byte_read;
   write_rtl(CR,0x21);
   delay_ms(2);
   write_rtl(RBCR0,0x00);
   write_rtl(RBCR1,0x00);
   if(!(data_L & 0x04))
      resend = 0;
   else if(data_L & 0x04)
      {
         read_rtl(ISR);
         data_L = byte_read;
         if((data_L & 0x02) || (data_L & 0x08))
            resend = 0;
         else
            resend = 1;
      }

   write_rtl(TCR,0x02);
   write_rtl(CR,0x22);
   write_rtl(BNRY,rxstart);
   write_rtl(CR,0x62);
   write_rtl(CURR,rxstart);
   write_rtl(CR,0x22);
   write_rtl(ISR,0x10);
   write_rtl(TCR,tcrval);
}

//******************************************************************
//*	Echo Packet Function
//*   This routine does not modify the incoming packet size and
//*   thus echoes the original packet structure.
//******************************************************************
void SendNetPacket()
{
   write_rtl(CR,0x22);
   write_rtl(TPSR,txstart);
   write_rtl(RSAR0,0x00);
   write_rtl(RSAR1,0x40);
   write_rtl(ISR,0xFF);
   write_rtl(RBCR0,pageheader[enetpacketLenL] - 4 );
   write_rtl(RBCR1,pageheader[enetpacketLenH]);
   write_rtl(CR,0x12);

   txlen = make16(pageheader[enetpacketLenH],pageheader[enetpacketLenL]) - 4;
   for(i=0;i<txlen;++i)
      write_rtl(RDMAPORT,packet[enetpacketDest0+i]);

   byte_read = 0;
   while(!(byte_read & RDC))
      read_rtl(ISR);

   write_rtl(TBCR0,pageheader[enetpacketLenL] - 4);
   write_rtl(TBCR1,pageheader[enetpacketLenH]);
   write_rtl(CR,0x24);   
}

//******************************************************************
//*	功能:从以太网络取得数据包 ()
//* 包括UDP

⌨️ 快捷键说明

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