54 #define SOCK_ANY_PORT_NUM 0xC000;
57 static uint16_t sock_io_mode = 0;
58 static uint16_t sock_is_sending = 0;
66 #define CHECK_SOCKNUM() \
68 if(sn > _WIZCHIP_SOCK_NUM_) return SOCKERR_SOCKNUM; \
71 #define CHECK_SOCKMODE(mode) \
73 if((getSn_MR(sn) & 0x0F) != mode) return SOCKERR_SOCKMODE; \
76 #define CHECK_SOCKINIT() \
78 if((getSn_SR(sn) != SOCK_INIT)) return SOCKERR_SOCKINIT; \
81 #define CHECK_SOCKDATA() \
83 if(len == 0) return SOCKERR_DATALEN; \
88 int8_t
socket(uint8_t sn, uint8_t protocol, uint16_t port, uint8_t flag)
97 #if ( _WIZCHIP_ < 5200 )
106 #if _WIZCHIP_ == 5200
122 #if _WIZCHIP_ == 5500
123 if(flag & SF_UNI_BLOCK)
134 setSn_MR(sn, (protocol | (flag & 0xF0)));
137 port = sock_any_port++;
144 sock_is_sending &= ~(1<<sn);
145 sock_remained_size[sn] = 0;
146 sock_pack_info[sn] = 0;
160 sock_is_sending &= ~(1<<sn);
161 sock_remained_size[sn] = 0;
162 sock_pack_info[sn] = 0;
186 int8_t
connect(uint8_t sn, uint8_t * addr, uint16_t port)
195 taddr = ((uint32_t)addr[0] & 0x000000FF);
196 taddr = (taddr << 8) + ((uint32_t)addr[1] & 0x000000FF);
197 taddr = (taddr << 8) + ((uint32_t)addr[2] & 0x000000FF);
198 taddr = (taddr << 8) + ((uint32_t)addr[0] & 0x000000FF);
206 #if _WIZCHIP_ == 5200 // for W5200 ARP errata
211 if(sock_io_mode & (1<<sn))
return SOCK_BUSY;
217 #if _WIZCHIP_ == 5200 // for W5200 ARP errata
218 setSUBR((uint8_t*)
"\x00\x00\x00\x00");
223 #if _WIZCHIP_ == 5200 // for W5200 ARP errata
224 setSUBR((uint8_t*)
"\x00\x00\x00\x00");
237 sock_is_sending &= ~(1<<sn);
238 if(sock_io_mode & (1<<sn))
return SOCK_BUSY;
250 int32_t
send(uint8_t sn, uint8_t * buf, uint16_t len)
260 if( sock_is_sending & (1<<sn) )
266 #if _WZICHIP_ == 5200
274 sock_is_sending &= ~(1<<sn);
284 if (len > freesize) len = freesize;
294 if( (sock_io_mode & (1<<sn)) && (len > freesize) )
return SOCK_BUSY;
295 if(len <= freesize)
break;
298 #if _WIZCHIP_ == 5200
304 sock_is_sending |= (1 << sn);
309 int32_t
recv(uint8_t sn, uint8_t * buf, uint16_t len)
312 uint16_t recvsize = 0;
318 if(recvsize < len) len = recvsize;
327 if(recvsize != 0)
break;
340 if((sock_io_mode & (1<<sn)) && (recvsize == 0))
return SOCK_BUSY;
341 if(recvsize != 0)
break;
343 if(recvsize < len) len = recvsize;
350 int32_t
sendto(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t port)
353 uint16_t freesize = 0;
368 taddr = ((uint32_t)addr[0]) & 0x000000FF;
369 taddr = (taddr << 8) + ((uint32_t)addr[1] & 0x000000FF);
370 taddr = (taddr << 8) + ((uint32_t)addr[2] & 0x000000FF);
371 taddr = (taddr << 8) + ((uint32_t)addr[3] & 0x000000FF);
382 if (len > freesize) len = freesize;
387 if( (sock_io_mode & (1<<sn)) && (len > freesize) )
return SOCK_BUSY;
388 if(len <= freesize)
break;
392 #if _WIZCHIP_ == 5200 // for W5200 ARP errata
399 #if _WIZCHIP_ == 5200 // for W5200 ARP errata
400 setSUBR((uint8_t*)
"\x00\x00\x00\x00");
424 int32_t
recvfrom(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t *port)
437 #if ( _WIZCHIP_ < 5200 )
446 if(sock_remained_size[sn] == 0)
452 if( (sock_io_mode & (1<<sn)) && (pack_len == 0) )
return SOCK_BUSY;
453 if(pack_len != 0)
break;
460 if(sock_remained_size[sn] == 0)
471 *port = (*port << 8) + head[5];
472 sock_remained_size[sn] = head[6];
473 sock_remained_size[sn] = (sock_remained_size[sn] << 8) + head[7];
476 if(len < sock_remained_size[sn]) pack_len = len;
477 else pack_len = sock_remained_size[sn];
484 if(sock_remained_size[sn] == 0)
490 sock_remained_size[sn] = head[0];
491 sock_remained_size[sn] = (sock_remained_size[sn] <<8) + head[1];
492 if(sock_remained_size[sn] > 1514)
499 if(len < sock_remained_size[sn]) pack_len = len;
500 else pack_len = sock_remained_size[sn];
503 #if ( _WIZCHIP_ < 5200 )
505 if(sock_remained_size[sn] == 0)
514 sock_remained_size[sn] = head[4];
515 sock_remaiend_size[sn] = (sock_remained_size[sn] << 8) + head[5];
521 if(len < sock_remained_size[sn]) pack_len = len;
522 else pack_len = sock_remained_size[sn];
528 sock_remained_size[sn] = pack_len;
534 sock_remained_size[sn] -= pack_len;
537 if(sock_remained_size[sn] != 0) sock_pack_info[sn] |=
PACK_REMAINED;
550 tmp = *((uint8_t*)arg);
558 *((uint8_t*)arg) = (uint8_t)((sock_io_mode >> sn) & 0x0001);
608 #if _WIZCHIP_ != 5100
627 case SO_KEEPALIVEAUTO:
645 *(uint8_t*)arg =
getSn_MR(sn) & 0xF0;
662 case SO_KEEPALIVEAUTO:
678 *(uint16_t*)arg = sock_remained_size[sn];
682 *(uint8_t*)arg = sock_pack_info[sn];