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

📄 w5300.c

📁 带硬件TCP/IP网卡芯片W5300 AVR下应用工程代码
💻 C
📖 第 1 页 / 共 3 页
字号:
   addr[2] = (uint8)(IINCHIP_READ(Sn_DIPR2(s))>>8);
// M_15052008 : Replace Sn_DHAR2 with Sn_DIPR.   
// addr[3] = (uint8)IINCHIP_READ(Sn_DHAR2(s));   
   addr[3] = (uint8)IINCHIP_READ(Sn_DIPR2(s));   
}
void     setSn_DIPR(SOCKET s, uint8* addr)
{
   IINCHIP_WRITE(Sn_DIPR(s),  ((uint16)(addr[0]<<8)) + addr[1]);
   IINCHIP_WRITE(Sn_DIPR2(s), ((uint16)(addr[2]<<8)) + addr[3]);  
}

uint16   getSn_MSSR(SOCKET s)
{
	 uint16 ret = 0;
	 ret = IINCHIP_READ(Sn_MSSR0(s)) << 8;
	 ret |= IINCHIP_READ(Sn_MSSR1(s));
   return ret;
}

void     setSn_MSSR(SOCKET s, uint16 mss)
{
   IINCHIP_WRITE(Sn_MSSR0(s), mss >> 8);
   IINCHIP_WRITE(Sn_MSSR1(s), mss);
}


/* SOCKET communication */

uint8    getSn_KPALVTR(SOCKET s)
{
   return (uint8)(IINCHIP_READ(Sn_KPALVTR(s)) >> 8);
}

void     setSn_KPALVTR(SOCKET s, uint8 time)
{
   uint16 keepalive=0;
   keepalive = (IINCHIP_READ(Sn_KPALVTR(s)) & 0x00FF) + ((uint16)time<<8);
   IINCHIP_WRITE(Sn_KPALVTR(s),keepalive);
}

uint32   getSn_TX_WRSR(SOCKET s)
{
	union {
		uint32 s32;
		uint8 s8[4];
	} u32;

	u32.s8[3] = IINCHIP_READ(Sn_TX_WRSR(s));
	u32.s8[2] = IINCHIP_READ(Sn_TX_WRSR1(s));
	u32.s8[1] = IINCHIP_READ(Sn_TX_WRSR2(s));
	u32.s8[0] = IINCHIP_READ(Sn_TX_WRSR3(s));

	return u32.s32;
}
void     setSn_TX_WRSR(SOCKET s, uint32 size)
{
	union {
		uint32 s32;
		uint8 s8[4];
	} u32;

	u32.s32 = size;

	IINCHIP_WRITE(Sn_TX_WRSR(s), u32.s8[3]);
	IINCHIP_WRITE(Sn_TX_WRSR1(s), u32.s8[2]);
	IINCHIP_WRITE(Sn_TX_WRSR2(s), u32.s8[1]);
	IINCHIP_WRITE(Sn_TX_WRSR3(s), u32.s8[0]);
}

uint32   getSn_TX_FSR(SOCKET s)
{
   uint32 free_tx_size=0;
   uint32 free_tx_size1=0;
   while(1)
   {
      free_tx_size = IINCHIP_READ(Sn_TX_FSR(s));                           // read                                       
      free_tx_size = (free_tx_size << 8) + IINCHIP_READ(Sn_TX_FSR1(s));
      free_tx_size = (free_tx_size << 8) + IINCHIP_READ(Sn_TX_FSR2(s));
      free_tx_size = (free_tx_size << 8) + IINCHIP_READ(Sn_TX_FSR3(s));                                                       
      if(free_tx_size == free_tx_size1) break;                             // if first == sencond, Sn_TX_FSR value is valid.                                                          
      free_tx_size1 = free_tx_size;                                        // save second value into firs                                                    
   }                                                                       
   return free_tx_size;                                                    
}                                                                          

uint32   getSn_RX_RSR(SOCKET s)
{
   uint32 received_rx_size=0;
   uint32 received_rx_size1=1;
   while(1)
   {
      received_rx_size = IINCHIP_READ(Sn_RX_RSR(s));
      received_rx_size = (received_rx_size << 8) + IINCHIP_READ(Sn_RX_RSR1(s));  // read    
      received_rx_size = (received_rx_size << 8) + IINCHIP_READ(Sn_RX_RSR2(s));
      received_rx_size = (received_rx_size << 8) + IINCHIP_READ(Sn_RX_RSR3(s));                                  
      if(received_rx_size == received_rx_size1) break;                                                                         
      received_rx_size1 = received_rx_size;                                      // if first == sencond, Sn_RX_RSR value is valid.
   }                                                                             // save second value into firs                
   return received_rx_size;   
}


void     setSn_TX_FIFOR(SOCKET s, uint16 data)
{
   IINCHIP_WRITE(Sn_TX_FIFOR(s), data >> 8);
   IINCHIP_WRITE(Sn_TX_FIFOR1(s), data);
}

uint16   getSn_RX_FIFOR(SOCKET s)
{
	 uint16 ret = 0;
	 ret = IINCHIP_READ(Sn_RX_FIFOR(s)) << 8;
	 ret |= IINCHIP_READ(Sn_RX_FIFOR1(s));
   return ret;
}


/* IP header field */

uint8    getSn_PROTOR(SOCKET s)
{
   return (uint8)IINCHIP_READ(Sn_PROTOR(s));
}
void     setSn_PROTOR(SOCKET s, uint8 pronum)
{
   uint16 protocolnum;
   protocolnum = (IINCHIP_READ(Sn_PROTOR(s)) & 0xFF00) + pronum;
   IINCHIP_WRITE(Sn_PROTOR(s),protocolnum);
}

uint8    getSn_TOSR(SOCKET s)
{
   return (uint8)IINCHIP_READ(Sn_TOSR(s));
}
void     setSn_TOSR(SOCKET s, uint8 tos)
{
   IINCHIP_WRITE(Sn_TOSR(s),tos);
}

uint8    getSn_TTLR(SOCKET s)
{
   return (uint8)IINCHIP_READ(Sn_TTLR(s));
}
void     setSn_TTLR(SOCKET s, uint8 ttl)
{
   IINCHIP_WRITE(Sn_TTLR(s),ttl);
}

uint8    getSn_FRAGR(SOCKET s)
{
   return (uint8)IINCHIP_READ(Sn_FRAGR(s));
}

void     setSn_FRAGR(SOCKET s, uint8 frag)
{
   IINCHIP_WRITE(Sn_FRAGR(s),frag);
}


/*******
 * ETC *
 *******/

/* Initialization & Interrupt request routine */

void     iinchip_init(void)
{
	*((volatile uint8*)MR) = MR_RST;
	wait_1ms(5);				// wait PLL lock
#if (__DEF_IINCHIP_ADDRESS_MODE__ == __DEF_IINCHIP_INDIRECT_MODE__)
		*((volatile uint8*)MR) = MR_IND;
    #ifndef __DEF_IINCHIP_DBG__	
	      printf("MR value is %04x\r\n",*((volatile uint8*)MR));
    #endif	
#endif
}


#ifdef __DEF_IINCHIP_INT__ 
/**
 * \todo You should do implement your interrupt request routine instead of this function.
 *       If you want to use ISR, this function should be mapped in your ISR handler.
 */

ISR(INT5_vect)
{
   uint16 int_val;
   uint16 idx;
   IINCHIP_CRITICAL_SECTION_ENTER();
   //M_01052008 : replaced '==' with '='.
   //while(int_val == IINCHIP_READ(IR))  // process all interrupt 
   printf("ISR routine enter\r\n");
   while((int_val = (IINCHIP_READ(IR0) << 8 | IINCHIP_READ(IR1))))     
   {          
      for(idx = 0 ; idx < MAX_SOCK_NUM ; idx++)
      {
         if (int_val & IR_SnINT(idx))  // check the SOCKETn interrupt
         {
            SOCK_INT[idx] |= (uint8)IINCHIP_READ(Sn_IR(idx)); // Save the interrupt stauts to SOCK_INT[idx]
            IINCHIP_WRITE(Sn_IR(idx),(uint16)SOCK_INT[idx]);  // Clear the interrupt status bit of SOCKETn
         }
      }
      
      if (int_val & (IR_IPCF << 8))    // check the IP conflict interrupt
      {
         printf("IP conflict : %04x\r\n", int_val);
      }
      if (int_val & (IR_DPUR << 8))    // check the unreachable destination interrupt
      {
         printf("INT Port Unreachable : %04x\r\n", int_val);
         printf("UIPR : %d.%d.%d.%d\r\n", (uint8)(IINCHIP_READ(UIPR)>>8),
                                          (uint8)IINCHIP_READ(UIPR),
                                          (uint8)(IINCHIP_READ(UIPR2)>>8),
                                          (uint8)IINCHIP_READ(UIPR2));
         printf("UPORTR : %04x\r\n", IINCHIP_READ(UPORTR));
      }
      IINCHIP_WRITE(IR, int_val & 0xFF00);
   }
   IINCHIP_CRITICAL_SECTION_EXIT();
}
#endif 


/* Internal memory operation */
 
uint8    sysinit(uint8* tx_size, uint8* rx_size)
{
   uint8 k;
   uint16 i;
   uint16 ssum=0,rsum=0;
   uint mem_cfg = 0;
   
   for(i=0; i < MAX_SOCK_NUM; i++)
   {
      if(tx_size[i] > 64)
      {
      #ifdef __DEF_IINCHIP_DBG__
         printf("Illegal Channel(%d) TX Memory Size.\r\n",i);
      #endif
         return 0;
      }
      if(rx_size[i] > 64)
      {
      #ifdef __DEF_IINCHIP_DBG__         
         printf("Illegal Channel(%d) RX Memory Size.\r\n",i);
      #endif
         return 0;
      }
      ssum += (uint16)tx_size[i];
      rsum += (uint16)rx_size[i];
      TXMEM_SIZE[i] = ((uint32)tx_size[i]) << 10;
      RXMEM_SIZE[i] = ((uint32)rx_size[i]) << 10;
   }
   if( (ssum % 8) || ((ssum + rsum) != 128) )
   {
   #ifdef __DEF_IINCHIP_DBG__
      printf("Illegal Memory Allocation\r\n");
   #endif
      return 0;
   }
   
   k = 0;
   for(i = TMSR0; i <= TMSR7; i++) {
      IINCHIP_WRITE(i, tx_size[k]);
   k++;
	 }
   
   k = 0;
   for(i = RMSR0; i <= RMSR7; i++) {
      IINCHIP_WRITE(i, rx_size[k]);
   k++;
   }
   
   for(i=0; i <ssum/8 ; i++)
   {
      mem_cfg <<= 1;
      mem_cfg |= 1;
   }
   
   IINCHIP_WRITE(MTYPER, mem_cfg >> 8);
   IINCHIP_WRITE(MTYPER1, mem_cfg & 0xff);
   
   #ifdef __DEF_IINCHIP_DBG__
      printf("Total TX Memory Size = %dKB\r\n",ssum);
      printf("Total RX Memory Size = %dKB\r\n",rsum);
      printf("Ch : TX SIZE : RECV SIZE\r\n");
      printf("%02d : %07dKB : %07dKB \r\n", 0, (uint8)(IINCHIP_READ(TMSR0)),(uint8)(IINCHIP_READ(RMSR0)));
      printf("%02d : %07dKB : %07dKB \r\n", 1, (uint8)(IINCHIP_READ(TMSR1)),(uint8)(IINCHIP_READ(RMSR1)));
      printf("%02d : %07dKB : %07dKB \r\n", 2, (uint8)(IINCHIP_READ(TMSR2)),(uint8)(IINCHIP_READ(RMSR2)));
      printf("%02d : %07dKB : %07dKB \r\n", 3, (uint8)(IINCHIP_READ(TMSR3)),(uint8)(IINCHIP_READ(RMSR3)));
      printf("%02d : %07dKB : %07dKB \r\n", 4, (uint8)(IINCHIP_READ(TMSR4)),(uint8)(IINCHIP_READ(RMSR4)));
      printf("%02d : %07dKB : %07dKB \r\n", 5, (uint8)(IINCHIP_READ(TMSR5)),(uint8)(IINCHIP_READ(RMSR5)));
      printf("%02d : %07dKB : %07dKB \r\n", 6, (uint8)(IINCHIP_READ(TMSR6)),(uint8)(IINCHIP_READ(RMSR6)));
      printf("%02d : %07dKB : %07dKB \r\n", 7, (uint8)(IINCHIP_READ(TMSR7)),(uint8)(IINCHIP_READ(RMSR7)));
      printf("\r\nMTYPER=%04x\r\n",IINCHIP_READ(MTYPER));
   #endif
   
   return 1;
}

uint32   wiz_write_buf(SOCKET s,uint8* buf,uint32 len)
{
#if (__DEF_IINCHIP_ADDRESS_MODE__ == __DEF_IINCHIP_DIRECT_MODE__)
   #if (__DEF_IINCHIP_BUF_OP__ == __DEF_C__)
				uint32 z;					
				for(z=0; z<len; z+=2) { 
					*((vuint8*)Sn_TX_FIFOR(s)) = *(buf+z);
					*((vuint8*)Sn_TX_FIFOR1(s)) = *(buf+z+1);
				}							
   #endif
  
#elif (__DEF_IINCHIP_ADDRESS_MODE__ == __DEF_IINCHIP_INDIRECT_MODE__)
   #if (__DEF_IINCHIP_BUF_OP__ == __DEF_C__)
      uint32 idx=0;
	    *((vuint8*)IDM_AR) = Sn_TX_FIFOR(s) >> 8;
	    *((vuint8*)IDM_AR1) = Sn_TX_FIFOR(s);
     	for (idx = 0; idx < len; idx+=2) {
  			*((vuint8*)IDM_DR) = *(buf+idx);
  			*((vuint8*)IDM_DR1) = *(buf+idx+1);
  		}
   #else
      #error "Undefined __DEF_IINCHIP_BUF_OP__"
   #endif 
#else
   #error "Undefined __DEF_IINCHIP_ADDRESS_MODE__"   
#endif
    return len;   
}

uint32   wiz_read_buf(SOCKET s, uint8* buf,uint32 len)
{

#if (__DEF_IINCHIP_ADDRESS_MODE__ == __DEF_IINCHIP_DIRECT_MODE__)
   #if (__DEF_IINCHIP_BUF_OP__ == __DEF_C__)
				uint32 z;	
				for(z=0; z<len; z+=2) { 
					*(buf+z) = *((vuint8*)Sn_RX_FIFOR(s));
					*(buf+z+1) = *((vuint8*)Sn_RX_FIFOR1(s));
				}								
   #else
      #error "Undefined __DEF_IINCHIP_BUF_OP__"
   #endif 
#elif (__DEF_IINCHIP_ADDRESS_MODE__ == __DEF_IINCHIP_INDIRECT_MODE__)
   #if (__DEF_IINCHIP_BUF_OP__ == __DEF_C__)
      uint32 idx=0;
    	*((vuint8*)IDM_AR) = Sn_RX_FIFOR(s) >> 8;
	    *((vuint8*)IDM_AR1) = Sn_RX_FIFOR(s);
    	for (idx = 0; idx < len; idx+=2) {
  			*(buf+idx) = *((vuint8*)IDM_DR);
	  		*(buf+idx+1) = *((vuint8*)IDM_DR1);
    	}
   #else
      #error "Undefined __DEF_IINCHIP_BUF_OP__"
   #endif 
#else
   #error "Undefined __DEF_IINCHIP_ADDRESS_MODE__"   
#endif
    return len;
}


uint32   getIINCHIP_TxMAX(SOCKET s)
{
   return TXMEM_SIZE[s];
}

uint32   getIINCHIP_RxMAX(SOCKET s)
{
   return RXMEM_SIZE[s];
}


#ifdef __DEF_IINCHIP_PPP__

/**
 * Max lenght of PPPoE message 
 */
#define PPP_OPTION_BUF_LEN 64 

   /**
    * \fn uint8    pppinit_in(uint8 * id, uint8 idlen, uint8 * passwd, uint8 passwdlen)
    *  Internal function.
    * \details It is called in  pppinit().\n
    *          It processes 4 phases as following. 
    *          - PPPoE Discovery
    *          - LCP process
    *          - PPPoE authentication
    *          - IPCP process
    *
    * \param id User ID for connecting to a PPPoE server
    * \param idlen Length of \em id
    * \param passwd User password for connecting to a PPPoE server
    * \param passwdlen Length of \em passwd

⌨️ 快捷键说明

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