46 #define SOCK_ANY_PORT_NUM 0xC000;
49 static uint16_t sock_io_mode = 0;
50 static uint16_t sock_is_sending = 0;
58 #define CHECK_SOCKNUM() \
60 if(sn > _WIZCHIP_SOCK_NUM_) return SOCKERR_SOCKNUM; \
63 #define CHECK_SOCKMODE(mode) \
65 if((getSn_MR(sn) & 0x0F) != mode) return SOCKERR_SOCKMODE; \
68 #define CHECK_SOCKINIT() \
70 if((getSn_SR(sn) != SOCK_INIT)) return SOCKERR_SOCKINIT; \
73 #define CHECK_SOCKDATA() \
75 if(len == 0) return SOCKERR_DATALEN; \
80 int8_t
socket(uint8_t sn, uint8_t protocol, uint16_t port, uint8_t flag)
89 #if ( _WIZCHIP_ < 5200 )
114 #if _WIZCHIP_ == 5500
115 if(flag & SF_UNI_BLOCK)
126 setSn_MR(sn, (protocol | (flag & 0xF0)));
129 port = sock_any_port++;
136 sock_is_sending &= ~(1<<sn);
137 sock_remained_size[sn] = 0;
138 sock_pack_info[sn] = 0;
152 sock_is_sending &= ~(1<<sn);
153 sock_remained_size[sn] = 0;
154 sock_pack_info[sn] = 0;
178 int8_t
connect(uint8_t sn, uint8_t * addr, uint16_t port)
183 if( *((uint32_t*)addr) == 0xFFFFFFFF || *((uint32_t*)addr) == 0)
return SOCKERR_IPINVALID;
187 #if _WIZCHIP_ == 5200 // for W5200 ARP errata
192 if(sock_io_mode & (1<<sn))
return SOCK_BUSY;
198 #if _WIZCHIP_ == 5200 // for W5200 ARP errata
199 setSUBR((uint8_t*)
"\x00\x00\x00\x00");
204 #if _WIZCHIP_ == 5200 // for W5200 ARP errata
205 setSUBR((uint8_t*)
"\x00\x00\x00\x00");
218 sock_is_sending &= ~(1<<sn);
219 if(sock_io_mode & (1<<sn))
return SOCK_BUSY;
231 int32_t
send(uint8_t sn, uint8_t * buf, uint16_t len)
241 if( sock_is_sending & (1<<sn) )
247 #if _WZICHIP_ == 5200
255 sock_is_sending &= ~(1<<sn);
265 if (len > freesize) len = freesize;
275 if( (sock_io_mode & (1<<sn)) && (len > freesize) )
return SOCK_BUSY;
276 if(len <= freesize)
break;
279 #if _WIZCHIP_ == 5200
285 sock_is_sending |= (1 << sn);
290 int32_t
recv(uint8_t sn, uint8_t * buf, uint16_t len)
293 uint16_t recvsize = 0;
299 if(recvsize < len) len = recvsize;
308 if(recvsize != 0)
break;
321 if((sock_io_mode & (1<<sn)) && (recvsize == 0))
return SOCK_BUSY;
322 if(recvsize != 0)
break;
324 if(recvsize < len) len = recvsize;
331 int32_t
sendto(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t port)
334 uint16_t freesize = 0;
353 if (len > freesize) len = freesize;
358 if( (sock_io_mode & (1<<sn)) && (len > freesize) )
return SOCK_BUSY;
359 if(len <= freesize)
break;
363 #if _WIZCHIP_ == 5200 // for W5200 ARP errata
370 #if _WIZCHIP_ == 5200 // for W5200 ARP errata
371 setSUBR((uint8_t*)
"\x00\x00\x00\x00");
395 int32_t
recvfrom(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t *port)
408 #if ( _WIZCHIP_ < 5200 )
417 if(sock_remained_size[sn] == 0)
423 if( (sock_io_mode & (1<<sn)) && (pack_len == 0) )
return SOCK_BUSY;
424 if(pack_len != 0)
break;
431 if(sock_remained_size[sn] == 0)
442 *port = (*port << 8) + head[5];
443 sock_remained_size[sn] = head[6];
444 sock_remained_size[sn] = (sock_remained_size[sn] << 8) + head[7];
447 if(len < sock_remained_size[sn]) pack_len = len;
448 else pack_len = sock_remained_size[sn];
455 if(sock_remained_size[sn] == 0)
461 sock_remained_size[sn] = head[0];
462 sock_remained_size[sn] = (sock_remained_size[sn] <<8) + head[1];
463 if(sock_remained_size[sn] > 1514)
470 if(len < sock_remained_size[sn]) pack_len = len;
471 else pack_len = sock_remained_size[sn];
474 #if ( _WIZCHIP_ < 5200 )
476 if(sock_remained_size[sn] == 0)
485 sock_remained_size[sn] = head[4];
486 sock_remaiend_size[sn] = (sock_remained_size[sn] << 8) + head[5];
492 if(len < sock_remained_size[sn]) pack_len = len;
493 else pack_len = sock_remained_size[sn];
499 sock_remained_size[sn] = pack_len;
505 sock_remained_size[sn] -= pack_len;
506 if(sock_remained_size[sn] != 0) sock_pack_info[sn] |= 0x01;
518 tmp = *((uint8_t*)arg);
524 *((uint8_t*)arg) = (sock_io_mode >> sn) & 0x0001;
572 #if _WIZCHIP_ != 5100
589 case SO_KEEPALIVEAUTO:
607 *(uint8_t*)arg =
getSn_MR(sn) & 0xF0;
624 case SO_KEEPALIVEAUTO:
640 *(uint16_t*)arg = sock_remained_size[sn];
644 *(uint8_t*)arg = sock_pack_info[sn];