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

📄 rtl8019.c

📁 44B0+8019系统
💻 C
📖 第 1 页 / 共 2 页
字号:

         i = 2;
		   data -= 2;
		   RxLen=(RxLength+1)/2;	
    
		   for(; RxLen--;)
		   {
			   if(!(i&0x7F))      //if i = 0x80.
				{
				   RxPageBeg++;
					if(RxPageBeg>=RPSTOP) RxPageBeg = RPSTART;					
				}
			   data[i++] = inportw(RWPORT);	           //读入8019接收到的数据	
		   }
    		   
		   outportb(BNRY, RxPageBeg);
         
         //下1包指针
         if( ETH_Rx_Receivex != ETH_Rx_Readx )
         {
            ETH_Rx_Receivex++;
            if( ETH_Rx_Receivex >= ETH_BUFRX ) ETH_Rx_Receivex = 0;
         }

         //统计接收包数
         ETH_ReceivePackets++;               //接收数据包计数
         ETH_EVENT |= ETH_NEWPACKET;         //标志ETH_EVENT接收了一个数据包。

	   }

    }else
    {	
       if( irqs & 0x02 )
       {
          ETH_SendPackets++;               //发送数据包计数
          ETH_EVENT |= ETH_SENDPACKET;
          
          txp = ETH_Tx_Sendx + 1;
          if( txp >=  ETH_BUFTX ) txp = 0;

          if( txp != ETH_Tx_Addx )
          {
             Rlt8019_Tx( &TXBuf[txp] );
             ETH_Tx_Sendx = txp;
             ETH_isTXing = 1;
          }else
          {
             ETH_isTXing = 0;
          }
       }
       outportb(ISR, 0xFE);
    }
}


/** 以太网操作函数 **/
#define IRQ_NET_ENABLE()  EnableInt()
#define IRQ_NET_DISABLE() DisableInt() 

#define ETH_P_REG_ARP            0x00000001
#define ETH_P_REG_IP             0x00000002
#define ETH_P_REG_ONEPACKETSEND  0x80000000
static unsigned int ETH_Protocol_REG;

unsigned  char   hwaddr_copy[6];

void ETH_StartSend();

void ETH_getHader(void *inbuf,void *h);
void ETH_setHader(void *inbuf,void *h);

void (*ETH_Arp_Receive)(unsigned char *pEth_Data);           //定义了函数指针ETH_Arp_Receive
void (*ETH_IP_Receive)(unsigned char *pEth_Data);
void (*ETH_OnePacketSend)();
void (*my_ttsend)();


void ETH_getHader(void *inbuf,void *h)
{
   unsigned char *pinbuf = (unsigned char*)inbuf;
   unsigned char *ph = (unsigned char*)h;

   memcpy(ph,pinbuf,6);
   memcpy(ph+6,pinbuf+6,6);
   ph[13] = pinbuf[12];
   ph[12] = pinbuf[13];
}

void ETH_setHader(void *inbuf,void *h)
{
   unsigned char *pinbuf = (unsigned char*)inbuf;
   unsigned char *ph = (unsigned char*)h;
   
   memcpy( pinbuf,ph,12);
   pinbuf[13] = ph[12];
   pinbuf[12] = ph[13];

}


void ETH_Init()
{
   unsigned int i;

   IRQ_NET_DISABLE();
   
   ETH_SendPackets = 0;
   ETH_ReceivePackets = 0;
   ETH_EVENT = 0;

   ETH_Protocol_REG = 0;

   //初始化接收缓冲
   for( i = 0 ; i < ETH_BUFRX ; i++ )
   {
      memset( &RXBuf[i],0,sizeof(Ethernet));
      RXBuf[i].pPacket = (unsigned char*)&RXBuf[i].Packet;
      RXBuf[i].pDestnodeid = &RXBuf[i].Packet[0];
      RXBuf[i].pSourcenodeid = &RXBuf[i].Packet[3];
      RXBuf[i].pProtocol = &RXBuf[i].Packet[6];
   }
   
   ETH_Rx_Readx = 0;
   ETH_Rx_Receivex = 1;

   //初始化发送缓冲
   for( i = 0 ; i < ETH_BUFTX ; i++ )
   {
      memset( &TXBuf[i],0,sizeof(Ethernet));
      TXBuf[i].pPacket = (unsigned char*)&TXBuf[i].Packet;
      TXBuf[i].pDestnodeid = &TXBuf[i].Packet[0];
      TXBuf[i].pSourcenodeid = &TXBuf[i].Packet[3];
      TXBuf[i].pProtocol = &TXBuf[i].Packet[6];
   }

   ETH_Tx_Sendx = 0;
   ETH_Tx_Addx = 1;

   //初始化8019
   i = 400000;
   while(i--);
   Rlt8019_Init();

   IRQ_NET_ENABLE();
}


unsigned int ETH_Send(unsigned char *OutBuf, unsigned char *HW_Addr, unsigned short int P_Type , unsigned short int Len)
{
   unsigned short int t;
   unsigned char buf;

   memcpy(OutBuf ,HW_Addr , 6);
   memcpy(OutBuf + 6 , my_hwaddr , 6);
   memcpy(OutBuf + 12 , (unsigned char*)&P_Type , 2 );

   buf = OutBuf[12];
   OutBuf[12] = OutBuf[13];
   OutBuf[13] = buf;

   IRQ_NET_DISABLE();
   t = ETH_Tx_Sendx;
   IRQ_NET_ENABLE();

   if( t != ETH_Tx_Addx )
   {
      memcpy( TXBuf[ETH_Tx_Addx].pPacket, OutBuf , Len + 14 );
      TXBuf[ETH_Tx_Addx].Length = Len + 14;

      IRQ_NET_DISABLE();
      ETH_Tx_Addx++;
      if( ETH_Tx_Addx >= ETH_BUFTX ) ETH_Tx_Addx = 0;
      IRQ_NET_ENABLE();

      ETH_StartSend();

      return 1;
   }else
   {
      return 0;
   }
}

void ETH_StartSend()
{
   unsigned short int t;

   IRQ_NET_DISABLE();
   
   if( ETH_isTXing )
   {
      IRQ_NET_ENABLE();
      return;
   }
   
   t = ETH_Tx_Sendx + 1;

   if( t >=  ETH_BUFTX ) t = 0;

   if( t != ETH_Tx_Addx )
   {
      Rlt8019_Tx( &TXBuf[t] );
      ETH_Tx_Sendx = t;
      ETH_TX_TimeOut = 0;
      ETH_isTXing = 1;
   }

   IRQ_NET_ENABLE();
}

//以太网接收
void ETH_Receive()
{
   unsigned short readx,receivex;
   ETH_HEADER eth;

   unsigned int i;

   /* 处理新的以太网数据包 */
   if( ETH_EVENT & ETH_NEWPACKET )      //ETH_EVENT |= ETH_NEWPACKET;
   {
      IRQ_NET_DISABLE();                //EnableInt()
      readx = ETH_Rx_Readx + 1;
      if( readx >= ETH_BUFRX ) readx = 0;
      receivex = ETH_Rx_Receivex;
      IRQ_NET_ENABLE();                 //DisableInt() 

      while( readx != receivex )
      {
         IRQ_NET_DISABLE();
         readx = ETH_Rx_Readx + 1;
         if( readx >= ETH_BUFRX ) readx = 0;
         receivex = ETH_Rx_Receivex;
         IRQ_NET_ENABLE();  

         if( readx == receivex ) break;
         
         /* 数据包分类 */
         ETH_getHader( RXBuf[readx].pPacket, &eth);



         switch( eth.frame_type )
         {
            case ARP_PACKET: //ARP
            {
               if( ETH_Protocol_REG & ETH_P_REG_ARP )
               {
                  (*ETH_Arp_Receive)( RXBuf[readx].pPacket );
               }

               break;
            } 
         
            case IP_PACKET:  //IP
            {
               if( ETH_Protocol_REG & ETH_P_REG_IP )
               {
                  (*ETH_IP_Receive)( RXBuf[readx].pPacket );
               }

               break;
            }
         }

         IRQ_NET_DISABLE();
         ETH_Rx_Readx = readx;
         IRQ_NET_ENABLE();
      }

      IRQ_NET_DISABLE();
      ETH_EVENT = ETH_EVENT & (~ETH_NEWPACKET);
      IRQ_NET_ENABLE();
   }

   if( ETH_EVENT & ETH_SENDPACKET )
   {
      //数据包发送后处理
      if( ETH_Protocol_REG & ETH_P_REG_ONEPACKETSEND )
      {
         (*ETH_OnePacketSend)();
      }
      //================
      IRQ_NET_DISABLE();
      ETH_EVENT = ETH_EVENT & (~ETH_SENDPACKET);
      IRQ_NET_ENABLE();
   }
   
   
}


//void ok_send()
//{
  //(*my_ttsend)();
    //  (*ETH_Arp_Receive)( RXBuf[readx].pPacket );
//}
/* 协议处理函数注册 */
void ETH_Reg_ArpReceive( void (*Arp_Receive)(unsigned char *pEth_Data) )
{
   ETH_Arp_Receive = Arp_Receive;            //ETH_Arp_Receive是函数指针
   ETH_Protocol_REG |= ETH_P_REG_ARP;
}

void ETH_Reg_IPReceive( void (*IP_Receive)(unsigned char *pEth_Data) )
{
   ETH_IP_Receive = IP_Receive;
   ETH_Protocol_REG |= ETH_P_REG_IP;
}

void ETH_Reg_OnePacketSend( void (*ETH_OnePacketSend)() )
{
   ETH_OnePacketSend = ETH_OnePacketSend;
   ETH_Protocol_REG |= ETH_P_REG_ONEPACKETSEND;
}

//void  tt_send( void (*mytt)())
//{
//	my_ttsend = mytt;
//}

⌨️ 快捷键说明

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