Add [14_m1284p_WIZNET_FTPC_FATFS_v1.2] prj
This commit is contained in:
		
							
								
								
									
										225
									
								
								14_m1284p_WIZNET_FTPC_FATFS_v1.2/Application/loopback/loopback.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										225
									
								
								14_m1284p_WIZNET_FTPC_FATFS_v1.2/Application/loopback/loopback.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,225 @@
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include "loopback.h"
 | 
			
		||||
#include "socket.h"
 | 
			
		||||
#include "wizchip_conf.h"
 | 
			
		||||
 | 
			
		||||
#if LOOPBACK_MODE == LOOPBACK_MAIN_NOBLCOK
 | 
			
		||||
 | 
			
		||||
int32_t loopback_tcps(uint8_t sn, uint8_t* buf, uint16_t port)
 | 
			
		||||
{
 | 
			
		||||
   int32_t ret;
 | 
			
		||||
   uint16_t size = 0, sentsize=0;
 | 
			
		||||
 | 
			
		||||
#ifdef _LOOPBACK_DEBUG_
 | 
			
		||||
   uint8_t destip[4];
 | 
			
		||||
   uint16_t destport;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
   switch(getSn_SR(sn))
 | 
			
		||||
   {
 | 
			
		||||
      case SOCK_ESTABLISHED :
 | 
			
		||||
         if(getSn_IR(sn) & Sn_IR_CON)
 | 
			
		||||
         {
 | 
			
		||||
#ifdef _LOOPBACK_DEBUG_
 | 
			
		||||
			getSn_DIPR(sn, destip);
 | 
			
		||||
			destport = getSn_DPORT(sn);
 | 
			
		||||
 | 
			
		||||
			printf("%d:Connected - %d.%d.%d.%d : %d\r\n",sn, destip[0], destip[1], destip[2], destip[3], destport);
 | 
			
		||||
#endif
 | 
			
		||||
			setSn_IR(sn,Sn_IR_CON);
 | 
			
		||||
         }
 | 
			
		||||
		 if((size = getSn_RX_RSR(sn)) > 0) // Don't need to check SOCKERR_BUSY because it doesn't not occur.
 | 
			
		||||
         {
 | 
			
		||||
			if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE;
 | 
			
		||||
			ret = recv(sn, buf, size);
 | 
			
		||||
 | 
			
		||||
			if(ret <= 0) return ret;      // check SOCKERR_BUSY & SOCKERR_XXX. For showing the occurrence of SOCKERR_BUSY.
 | 
			
		||||
			size = (uint16_t) ret;
 | 
			
		||||
			sentsize = 0;
 | 
			
		||||
 | 
			
		||||
			while(size != sentsize)
 | 
			
		||||
			{
 | 
			
		||||
				ret = send(sn, buf+sentsize, size-sentsize);
 | 
			
		||||
				if(ret < 0)
 | 
			
		||||
				{
 | 
			
		||||
					close(sn);
 | 
			
		||||
					return ret;
 | 
			
		||||
				}
 | 
			
		||||
				sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.
 | 
			
		||||
			}
 | 
			
		||||
         }
 | 
			
		||||
         break;
 | 
			
		||||
      case SOCK_CLOSE_WAIT :
 | 
			
		||||
#ifdef _LOOPBACK_DEBUG_
 | 
			
		||||
         //printf("%d:CloseWait\r\n",sn);
 | 
			
		||||
#endif
 | 
			
		||||
         if((ret = disconnect(sn)) != SOCK_OK) return ret;
 | 
			
		||||
#ifdef _LOOPBACK_DEBUG_
 | 
			
		||||
         printf("%d:Socket Closed\r\n", sn);
 | 
			
		||||
#endif
 | 
			
		||||
         break;
 | 
			
		||||
      case SOCK_INIT :
 | 
			
		||||
#ifdef _LOOPBACK_DEBUG_
 | 
			
		||||
    	 printf("%d:Listen, TCP server loopback, port [%d]\r\n", sn, port);
 | 
			
		||||
#endif
 | 
			
		||||
         if( (ret = listen(sn)) != SOCK_OK) return ret;
 | 
			
		||||
         break;
 | 
			
		||||
      case SOCK_CLOSED:
 | 
			
		||||
#ifdef _LOOPBACK_DEBUG_
 | 
			
		||||
         //printf("%d:TCP server loopback start\r\n",sn);
 | 
			
		||||
#endif
 | 
			
		||||
         if((ret = socket(sn, Sn_MR_TCP, port, 0x00)) != sn) return ret;
 | 
			
		||||
#ifdef _LOOPBACK_DEBUG_
 | 
			
		||||
         //printf("%d:Socket opened\r\n",sn);
 | 
			
		||||
#endif
 | 
			
		||||
         break;
 | 
			
		||||
      default:
 | 
			
		||||
         break;
 | 
			
		||||
   }
 | 
			
		||||
   return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int32_t loopback_tcpc(uint8_t sn, uint8_t* buf, uint8_t* destip, uint16_t destport)
 | 
			
		||||
{
 | 
			
		||||
   int32_t ret; // return value for SOCK_ERRORs
 | 
			
		||||
   uint16_t size = 0, sentsize=0;
 | 
			
		||||
 | 
			
		||||
   // Destination (TCP Server) IP info (will be connected)
 | 
			
		||||
   // >> loopback_tcpc() function parameter
 | 
			
		||||
   // >> Ex)
 | 
			
		||||
   //	uint8_t destip[4] = 	{192, 168, 0, 214};
 | 
			
		||||
   //	uint16_t destport = 	5000;
 | 
			
		||||
 | 
			
		||||
   // Port number for TCP client (will be increased)
 | 
			
		||||
   static uint16_t any_port = 	50000;
 | 
			
		||||
 | 
			
		||||
   // Socket Status Transitions
 | 
			
		||||
   // Check the W5500 Socket n status register (Sn_SR, The 'Sn_SR' controlled by Sn_CR command or Packet send/recv status)
 | 
			
		||||
   switch(getSn_SR(sn))
 | 
			
		||||
   {
 | 
			
		||||
      case SOCK_ESTABLISHED :
 | 
			
		||||
         if(getSn_IR(sn) & Sn_IR_CON)	// Socket n interrupt register mask; TCP CON interrupt = connection with peer is successful
 | 
			
		||||
         {
 | 
			
		||||
#ifdef _LOOPBACK_DEBUG_
 | 
			
		||||
			printf("%d:Connected to - %d.%d.%d.%d : %d\r\n",sn, destip[0], destip[1], destip[2], destip[3], destport);
 | 
			
		||||
#endif
 | 
			
		||||
			setSn_IR(sn, Sn_IR_CON);  // this interrupt should be write the bit cleared to '1'
 | 
			
		||||
         }
 | 
			
		||||
 | 
			
		||||
         //////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
         // Data Transaction Parts; Handle the [data receive and send] process
 | 
			
		||||
         //////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
		 if((size = getSn_RX_RSR(sn)) > 0) // Sn_RX_RSR: Socket n Received Size Register, Receiving data length
 | 
			
		||||
         {
 | 
			
		||||
			if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE; // DATA_BUF_SIZE means user defined buffer size (array)
 | 
			
		||||
			ret = recv(sn, buf, size); // Data Receive process (H/W Rx socket buffer -> User's buffer)
 | 
			
		||||
 | 
			
		||||
			if(ret <= 0) return ret; // If the received data length <= 0, receive failed and process end
 | 
			
		||||
			size = (uint16_t) ret;
 | 
			
		||||
			sentsize = 0;
 | 
			
		||||
 | 
			
		||||
			// Data sentsize control
 | 
			
		||||
			while(size != sentsize)
 | 
			
		||||
			{
 | 
			
		||||
				ret = send(sn, buf+sentsize, size-sentsize); // Data send process (User's buffer -> Destination through H/W Tx socket buffer)
 | 
			
		||||
				if(ret < 0) // Send Error occurred (sent data length < 0)
 | 
			
		||||
				{
 | 
			
		||||
					close(sn); // socket close
 | 
			
		||||
					return ret;
 | 
			
		||||
				}
 | 
			
		||||
				sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.
 | 
			
		||||
			}
 | 
			
		||||
         }
 | 
			
		||||
		 //////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case SOCK_CLOSE_WAIT :
 | 
			
		||||
#ifdef _LOOPBACK_DEBUG_
 | 
			
		||||
         //printf("%d:CloseWait\r\n",sn);
 | 
			
		||||
#endif
 | 
			
		||||
         if((ret=disconnect(sn)) != SOCK_OK) return ret;
 | 
			
		||||
#ifdef _LOOPBACK_DEBUG_
 | 
			
		||||
         printf("%d:Socket Closed\r\n", sn);
 | 
			
		||||
#endif
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case SOCK_INIT :
 | 
			
		||||
#ifdef _LOOPBACK_DEBUG_
 | 
			
		||||
    	 printf("%d:Try to connect to the %d.%d.%d.%d : %d\r\n", sn, destip[0], destip[1], destip[2], destip[3], destport);
 | 
			
		||||
#endif
 | 
			
		||||
    	 if( (ret = connect(sn, destip, destport)) != SOCK_OK) return ret;	//	Try to TCP connect to the TCP server (destination)
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case SOCK_CLOSED:
 | 
			
		||||
    	  close(sn);
 | 
			
		||||
    	  if((ret=socket(sn, Sn_MR_TCP, any_port++, 0x00)) != sn){
 | 
			
		||||
         if(any_port == 0xffff) any_port = 50000;
 | 
			
		||||
         return ret; // TCP socket open with 'any_port' port number
 | 
			
		||||
        } 
 | 
			
		||||
#ifdef _LOOPBACK_DEBUG_
 | 
			
		||||
    	 //printf("%d:TCP client loopback start\r\n",sn);
 | 
			
		||||
         //printf("%d:Socket opened\r\n",sn);
 | 
			
		||||
#endif
 | 
			
		||||
         break;
 | 
			
		||||
      default:
 | 
			
		||||
         break;
 | 
			
		||||
   }
 | 
			
		||||
   return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int32_t loopback_udps(uint8_t sn, uint8_t* buf, uint16_t port)
 | 
			
		||||
{
 | 
			
		||||
   int32_t  ret;
 | 
			
		||||
   uint16_t size, sentsize;
 | 
			
		||||
   uint8_t  destip[4];
 | 
			
		||||
   uint16_t destport;
 | 
			
		||||
 | 
			
		||||
   switch(getSn_SR(sn))
 | 
			
		||||
   {
 | 
			
		||||
      case SOCK_UDP :
 | 
			
		||||
         if((size = getSn_RX_RSR(sn)) > 0)
 | 
			
		||||
         {
 | 
			
		||||
            if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE;
 | 
			
		||||
            ret = recvfrom(sn, buf, size, destip, (uint16_t*)&destport);
 | 
			
		||||
            if(ret <= 0)
 | 
			
		||||
            {
 | 
			
		||||
#ifdef _LOOPBACK_DEBUG_
 | 
			
		||||
               printf("%d: recvfrom error. %ld\r\n",sn,ret);
 | 
			
		||||
#endif
 | 
			
		||||
               return ret;
 | 
			
		||||
            }
 | 
			
		||||
            size = (uint16_t) ret;
 | 
			
		||||
            sentsize = 0;
 | 
			
		||||
            while(sentsize != size)
 | 
			
		||||
            {
 | 
			
		||||
               ret = sendto(sn, buf+sentsize, size-sentsize, destip, destport);
 | 
			
		||||
               if(ret < 0)
 | 
			
		||||
               {
 | 
			
		||||
#ifdef _LOOPBACK_DEBUG_
 | 
			
		||||
                  printf("%d: sendto error. %ld\r\n",sn,ret);
 | 
			
		||||
#endif
 | 
			
		||||
                  return ret;
 | 
			
		||||
               }
 | 
			
		||||
               sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.
 | 
			
		||||
            }
 | 
			
		||||
         }
 | 
			
		||||
         break;
 | 
			
		||||
      case SOCK_CLOSED:
 | 
			
		||||
#ifdef _LOOPBACK_DEBUG_
 | 
			
		||||
         //printf("%d:UDP loopback start\r\n",sn);
 | 
			
		||||
#endif
 | 
			
		||||
         if((ret = socket(sn, Sn_MR_UDP, port, 0x00)) != sn)
 | 
			
		||||
            return ret;
 | 
			
		||||
#ifdef _LOOPBACK_DEBUG_
 | 
			
		||||
         printf("%d:Opened, UDP loopback, port [%d]\r\n", sn, port);
 | 
			
		||||
#endif
 | 
			
		||||
         break;
 | 
			
		||||
      default :
 | 
			
		||||
         break;
 | 
			
		||||
   }
 | 
			
		||||
   return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -0,0 +1,38 @@
 | 
			
		||||
#ifndef _LOOPBACK_H_
 | 
			
		||||
#define _LOOPBACK_H_
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
/* Loopback test debug message printout enable */
 | 
			
		||||
#define	_LOOPBACK_DEBUG_
 | 
			
		||||
 | 
			
		||||
/* DATA_BUF_SIZE define for Loopback example */
 | 
			
		||||
#ifndef DATA_BUF_SIZE
 | 
			
		||||
	#define DATA_BUF_SIZE			2048
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/************************/
 | 
			
		||||
/* Select LOOPBACK_MODE */
 | 
			
		||||
/************************/
 | 
			
		||||
#define LOOPBACK_MAIN_NOBLOCK    0
 | 
			
		||||
#define LOOPBACK_MODE   LOOPBACK_MAIN_NOBLOCK
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* TCP server Loopback test example */
 | 
			
		||||
int32_t loopback_tcps(uint8_t sn, uint8_t* buf, uint16_t port);
 | 
			
		||||
 | 
			
		||||
/* TCP client Loopback test example */
 | 
			
		||||
int32_t loopback_tcpc(uint8_t sn, uint8_t* buf, uint8_t* destip, uint16_t destport);
 | 
			
		||||
 | 
			
		||||
/* UDP Loopback test example */
 | 
			
		||||
int32_t loopback_udps(uint8_t sn, uint8_t* buf, uint16_t port);
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
		Reference in New Issue
	
	Block a user