44 #define SOCK_ANY_PORT_NUM 0xC000;
47 static uint16_t sock_io_mode = 0;
48 static uint16_t sock_is_sending = 0;
56 #define CHECK_SOCKNUM() \
58 if(sn > _WIZCHIP_SOCK_NUM_) return SOCKERR_SOCKNUM; \
61 #define CHECK_SOCKMODE(mode) \
63 if((getSn_MR(sn) & 0x0F) != mode) return SOCKERR_SOCKMODE; \
66 #define CHECK_SOCKINIT() \
68 if((getSn_SR(sn) != SOCK_INIT)) return SOCKERR_SOCKINIT; \
71 #define CHECK_SOCKDATA() \
73 if(len == 0) return SOCKERR_DATALEN; \
78 int8_t
socket(uint8_t sn, uint8_t protocol, uint16_t port, uint8_t flag)
87 #if ( _WIZCHIP_ < 5200 )
112 #if _WIZCHIP_ == 5500
113 if(flag & SF_UNI_BLOCK)
124 setSn_MR(sn, (protocol | (flag & 0xF0)));
127 port = sock_any_port++;
134 sock_is_sending &= ~(1<<sn);
135 sock_remained_size[sn] = 0;
136 sock_pack_info[sn] = 0;
150 sock_is_sending &= ~(1<<sn);
151 sock_remained_size[sn] = 0;
152 sock_pack_info[sn] = 0;
176 int8_t
connect(uint8_t sn, uint8_t * addr, uint16_t port)
181 if( *((uint32_t*)addr) == 0xFFFFFFFF || *((uint32_t*)addr) == 0)
return SOCKERR_IPINVALID;
185 #if _WIZCHIP_ == 5200 // for W5200 ARP errata
190 if(sock_io_mode & (1<<sn))
return SOCK_BUSY;
196 #if _WIZCHIP_ == 5200 // for W5200 ARP errata
197 setSUBR((uint8_t*)
"\x00\x00\x00\x00");
202 #if _WIZCHIP_ == 5200 // for W5200 ARP errata
203 setSUBR((uint8_t*)
"\x00\x00\x00\x00");
216 sock_is_sending &= ~(1<<sn);
217 if(sock_io_mode & (1<<sn))
return SOCK_BUSY;
229 int32_t
send(uint8_t sn, uint8_t * buf, uint16_t len)
239 if( sock_is_sending & (1<<sn) )
245 #if _WZICHIP_ == 5200
253 sock_is_sending &= ~(1<<sn);
263 if (len > freesize) len = freesize;
273 if( (sock_io_mode & (1<<sn)) && (len > freesize) )
return SOCK_BUSY;
274 if(len <= freesize)
break;
277 #if _WIZCHIP_ == 5200
283 sock_is_sending |= (1 << sn);
288 int32_t
recv(uint8_t sn, uint8_t * buf, uint16_t len)
291 uint16_t recvsize = 0;
297 if(recvsize < len) len = recvsize;
306 if(recvsize != 0)
break;
319 if((sock_io_mode & (1<<sn)) && (recvsize == 0))
return SOCK_BUSY;
320 if(recvsize != 0)
break;
322 if(recvsize < len) len = recvsize;
329 int32_t
sendto(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t port)
332 uint16_t freesize = 0;
351 if (len > freesize) len = freesize;
356 if( (sock_io_mode & (1<<sn)) && (len > freesize) )
return SOCK_BUSY;
357 if(len <= freesize)
break;
361 #if _WIZCHIP_ == 5200 // for W5200 ARP errata
368 #if _WIZCHIP_ == 5200 // for W5200 ARP errata
369 setSUBR((uint8_t*)
"\x00\x00\x00\x00");
386 int32_t
recvfrom(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t *port)
399 #if ( _WIZCHIP_ < 5200 )
408 if(sock_remained_size[sn] == 0)
414 if( (sock_io_mode & (1<<sn)) && (pack_len == 0) )
return SOCK_BUSY;
415 if(pack_len != 0)
break;
422 if(sock_remained_size[sn] == 0)
433 *port = (*port << 8) + head[5];
434 sock_remained_size[sn] = head[6];
435 sock_remained_size[sn] = (sock_remained_size[sn] << 8) + head[7];
438 if(len < sock_remained_size[sn]) pack_len = len;
439 else pack_len = sock_remained_size[sn];
446 if(sock_remained_size[sn] == 0)
452 sock_remained_size[sn] = head[0];
453 sock_remained_size[sn] = (sock_remained_size[sn] <<8) + head[1];
454 if(sock_remained_size[sn] > 1514)
461 if(len < sock_remained_size[sn]) pack_len = len;
462 else pack_len = sock_remained_size[sn];
465 #if ( _WIZCHIP_ < 5200 )
467 if(sock_remained_size[sn] == 0)
476 sock_remained_size[sn] = head[4];
477 sock_remaiend_size[sn] = (sock_remained_size[sn] << 8) + head[5];
483 if(len < sock_remained_size[sn]) pack_len = len;
484 else pack_len = sock_remained_size[sn];
490 sock_remained_size[sn] = pack_len;
496 sock_remained_size[sn] -= pack_len;
497 if(sock_remained_size[sn] != 0) sock_pack_info[sn] |= 0x01;
509 tmp = *((uint8_t*)arg);
515 *((uint8_t*)arg) = (sock_io_mode >> sn) & 0x0001;
563 #if _WIZCHIP_ != 5100
580 case SO_KEEPALIVEAUTO:
598 *(uint8_t*)arg =
getSn_MR(sn) & 0xF0;
615 case SO_KEEPALIVEAUTO:
631 *(uint16_t*)arg = sock_remained_size[sn];
635 *(uint8_t*)arg = sock_pack_info[sn];