48 #define SOCK_ANY_PORT_NUM 0xC000;
51 static uint16_t sock_io_mode = 0;
52 static uint16_t sock_is_sending = 0;
60 #define CHECK_SOCKNUM() \
62 if(sn > _WIZCHIP_SOCK_NUM_) return SOCKERR_SOCKNUM; \
65 #define CHECK_SOCKMODE(mode) \
67 if((getSn_MR(sn) & 0x0F) != mode) return SOCKERR_SOCKMODE; \
70 #define CHECK_SOCKINIT() \
72 if((getSn_SR(sn) != SOCK_INIT)) return SOCKERR_SOCKINIT; \
75 #define CHECK_SOCKDATA() \
77 if(len == 0) return SOCKERR_DATALEN; \
82 int8_t
socket(uint8_t sn, uint8_t protocol, uint16_t port, uint8_t flag)
117 #if _WIZCHIP_ == 5500
118 if(flag & SF_UNI_BLOCK)
129 setSn_MR(sn, (protocol | (flag & 0xF0)));
132 port = sock_any_port++;
139 sock_is_sending &= ~(1<<sn);
140 sock_remained_size[sn] = 0;
141 sock_pack_info[sn] = 0;
155 sock_is_sending &= ~(1<<sn);
156 sock_remained_size[sn] = 0;
157 sock_pack_info[sn] = 0;
181 int8_t
connect(uint8_t sn, uint8_t * addr, uint16_t port)
186 if( *((uint32_t*)addr) == 0xFFFFFFFF || *((uint32_t*)addr) == 0)
return SOCKERR_IPINVALID;
190 #if _WIZCHIP_ == 5200 // for W5200 ARP errata
195 if(sock_io_mode & (1<<sn))
return SOCK_BUSY;
201 #if _WIZCHIP_ == 5200 // for W5200 ARP errata
202 setSUBR((uint8_t*)
"\x00\x00\x00\x00");
207 #if _WIZCHIP_ == 5200 // for W5200 ARP errata
208 setSUBR((uint8_t*)
"\x00\x00\x00\x00");
221 sock_is_sending &= ~(1<<sn);
222 if(sock_io_mode & (1<<sn))
return SOCK_BUSY;
234 int32_t
send(uint8_t sn, uint8_t * buf, uint16_t len)
244 if( sock_is_sending & (1<<sn) )
250 #if _WZICHIP_ == 5200
258 sock_is_sending &= ~(1<<sn);
268 if (len > freesize) len = freesize;
278 if( (sock_io_mode & (1<<sn)) && (len > freesize) )
return SOCK_BUSY;
279 if(len <= freesize)
break;
282 #if _WIZCHIP_ == 5200
288 sock_is_sending |= (1 << sn);
293 int32_t
recv(uint8_t sn, uint8_t * buf, uint16_t len)
296 uint16_t recvsize = 0;
302 if(recvsize < len) len = recvsize;
311 if(recvsize != 0)
break;
324 if((sock_io_mode & (1<<sn)) && (recvsize == 0))
return SOCK_BUSY;
325 if(recvsize != 0)
break;
327 if(recvsize < len) len = recvsize;
334 int32_t
sendto(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t port)
337 uint16_t freesize = 0;
357 if (len > freesize) len = freesize;
362 if( (sock_io_mode & (1<<sn)) && (len > freesize) )
return SOCK_BUSY;
363 if(len <= freesize)
break;
367 #if _WIZCHIP_ == 5200 // for W5200 ARP errata
374 #if _WIZCHIP_ == 5200 // for W5200 ARP errata
375 setSUBR((uint8_t*)
"\x00\x00\x00\x00");
399 int32_t
recvfrom(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t *port)
413 #if ( _WIZCHIP_ < 5200 )
421 if(sock_remained_size[sn] == 0)
427 if( (sock_io_mode & (1<<sn)) && (pack_len == 0) )
return SOCK_BUSY;
428 if(pack_len != 0)
break;
436 if(sock_remained_size[sn] == 0)
447 *port = (*port << 8) + head[5];
448 sock_remained_size[sn] = head[6];
449 sock_remained_size[sn] = (sock_remained_size[sn] << 8) + head[7];
452 if(len < sock_remained_size[sn]) pack_len = len;
453 else pack_len = sock_remained_size[sn];
460 if(sock_remained_size[sn] == 0)
466 sock_remained_size[sn] = head[0];
467 sock_remained_size[sn] = (sock_remained_size[sn] <<8) + head[1];
468 if(sock_remained_size[sn] > 1514)
475 if(len < sock_remained_size[sn]) pack_len = len;
476 else pack_len = sock_remained_size[sn];
481 if(sock_remained_size[sn] == 0)
490 sock_remained_size[sn] = head[4];
491 sock_remained_size[sn] = (sock_remained_size[sn] << 8) + head[5];
498 if(len < sock_remained_size[sn]) pack_len = len;
499 else pack_len = sock_remained_size[sn];
505 sock_remained_size[sn] = pack_len;
511 sock_remained_size[sn] -= pack_len;
512 if(sock_remained_size[sn] != 0) sock_pack_info[sn] |= 0x01;
524 tmp = *((uint8_t*)arg);
530 *((uint8_t*)arg) = (sock_io_mode >> sn) & 0x0001;
579 #if _WIZCHIP_ != 5100
598 case SO_KEEPALIVEAUTO:
616 *(uint8_t*)arg =
getSn_MR(sn) & 0xF0;
633 case SO_KEEPALIVEAUTO:
649 *(uint16_t*)arg = sock_remained_size[sn];
653 *(uint8_t*)arg = sock_pack_info[sn];