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)
91 #if ( _WIZCHIP_ < 5200 )
100 #if _WIZCHIP_ == 5200
116 #if _WIZCHIP_ == 5500
117 if(flag & SF_UNI_BLOCK)
128 setSn_MR(sn, (protocol | (flag & 0xF0)));
131 port = sock_any_port++;
135 setSn_CR(sn,Sn_CR_OPEN);
138 sock_is_sending &= ~(1<<sn);
139 sock_remained_size[sn] = 0;
140 sock_pack_info[sn] = 0;
141 while(getSn_SR(sn) == SOCK_CLOSED);
149 setSn_CR(sn,Sn_CR_CLOSE);
151 while( getSn_CR(sn) );
154 sock_is_sending &= ~(1<<sn);
155 sock_remained_size[sn] = 0;
156 sock_pack_info[sn] = 0;
157 while(getSn_SR(sn) != SOCK_CLOSED);
166 setSn_CR(sn,Sn_CR_LISTEN);
168 while(getSn_SR(sn) != SOCK_LISTEN)
170 if(getSn_CR(sn) == SOCK_CLOSED)
180 int8_t
connect(uint8_t sn, uint8_t * addr, uint16_t port)
185 if( *((uint32_t*)addr) == 0xFFFFFFFF || *((uint32_t*)addr) == 0)
return SOCKERR_IPINVALID;
188 setSn_DPORT(sn,port);
189 #if _WIZCHIP_ == 5200 // for W5200 ARP errata
192 setSn_CR(sn,Sn_CR_CONNECT);
194 if(sock_io_mode & (1<<sn))
return SOCK_BUSY;
195 while(getSn_SR(sn) != SOCK_ESTABLISHED)
197 if (getSn_IR(sn) & Sn_IR_TIMEOUT)
199 setSn_IR(sn, Sn_IR_TIMEOUT);
200 #if _WIZCHIP_ == 5200 // for W5200 ARP errata
201 setSUBR((uint8_t*)
"\x00\x00\x00\x00");
206 #if _WIZCHIP_ == 5200 // for W5200 ARP errata
207 setSUBR((uint8_t*)
"\x00\x00\x00\x00");
217 setSn_CR(sn,Sn_CR_DISCON);
220 sock_is_sending &= ~(1<<sn);
221 if(sock_io_mode & (1<<sn))
return SOCK_BUSY;
222 while(getSn_SR(sn) != SOCK_CLOSED)
224 if(getSn_IR(sn) & Sn_IR_TIMEOUT)
233 int32_t
send(uint8_t sn, uint8_t * buf, uint16_t len)
243 if( sock_is_sending & (1<<sn) )
246 if(tmp & Sn_IR_SENDOK)
248 setSn_IR(sn, Sn_IR_SENDOK);
249 #if _WZICHIP_ == 5200
250 if(getSn_TX_RD(sn) != sock_next_rd[sn])
252 setSn_CR(sn,Sn_CR_SEND);
257 sock_is_sending &= ~(1<<sn);
259 else if(tmp & Sn_IR_TIMEOUT)
266 freesize = getSn_TxMAX(sn);
267 if (len > freesize) len = freesize;
270 freesize = getSn_TX_FSR(sn);
272 if ((tmp != SOCK_ESTABLISHED) && (tmp != SOCK_CLOSE_WAIT))
277 if( (sock_io_mode & (1<<sn)) && (len > freesize) )
return SOCK_BUSY;
278 if(len <= freesize)
break;
280 wiz_send_data(sn, buf, len);
281 #if _WIZCHIP_ == 5200
282 sock_next_rd[sn] = getSn_TX_RD(sn) + len;
284 setSn_CR(sn,Sn_CR_SEND);
287 sock_is_sending |= (1 << sn);
292 int32_t
recv(uint8_t sn, uint8_t * buf, uint16_t len)
295 uint16_t recvsize = 0;
300 recvsize = getSn_RxMAX(sn);
301 if(recvsize < len) len = recvsize;
304 recvsize = getSn_RX_RSR(sn);
306 if (tmp != SOCK_ESTABLISHED)
308 if(tmp == SOCK_CLOSE_WAIT)
310 if(recvsize != 0)
break;
311 else if(getSn_TX_FSR(sn) == getSn_TxMAX(sn))
323 if((sock_io_mode & (1<<sn)) && (recvsize == 0))
return SOCK_BUSY;
324 if(recvsize != 0)
break;
326 if(recvsize < len) len = recvsize;
327 wiz_recv_data(sn, buf, len);
328 setSn_CR(sn,Sn_CR_RECV);
333 int32_t
sendto(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t port)
336 uint16_t freesize = 0;
338 switch(getSn_MR(sn) & 0x0F)
353 setSn_DPORT(sn,port);
354 freesize = getSn_TxMAX(sn);
355 if (len > freesize) len = freesize;
358 freesize = getSn_TX_FSR(sn);
360 if( (sock_io_mode & (1<<sn)) && (len > freesize) )
return SOCK_BUSY;
361 if(len <= freesize)
break;
363 wiz_send_data(sn, buf, len);
365 #if _WIZCHIP_ == 5200 // for W5200 ARP errata
369 setSn_CR(sn,Sn_CR_SEND);
372 #if _WIZCHIP_ == 5200 // for W5200 ARP errata
373 setSUBR((uint8_t*)
"\x00\x00\x00\x00");
378 if(tmp & Sn_IR_SENDOK)
380 setSn_IR(sn, Sn_IR_SENDOK);
385 else if(tmp & Sn_IR_TIMEOUT)
387 setSn_IR(sn, Sn_IR_TIMEOUT);
397 int32_t
recvfrom(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t *port)
405 switch((mr=getSn_MR(sn)) & 0x0F)
410 #if ( _WIZCHIP_ < 5200 )
419 if(sock_remained_size[sn] == 0)
423 pack_len = getSn_RX_RSR(sn);
425 if( (sock_io_mode & (1<<sn)) && (pack_len == 0) )
return SOCK_BUSY;
426 if(pack_len != 0)
break;
433 if(sock_remained_size[sn] == 0)
435 wiz_recv_data(sn, head, 8);
436 setSn_CR(sn,Sn_CR_RECV);
444 *port = (*port << 8) + head[5];
445 sock_remained_size[sn] = head[6];
446 sock_remained_size[sn] = (sock_remained_size[sn] << 8) + head[7];
449 if(len < sock_remained_size[sn]) pack_len = len;
450 else pack_len = sock_remained_size[sn];
454 wiz_recv_data(sn, buf, pack_len);
457 if(sock_remained_size[sn] == 0)
459 wiz_recv_data(sn, head, 2);
460 setSn_CR(sn,Sn_CR_RECV);
463 sock_remained_size[sn] = head[0];
464 sock_remained_size[sn] = (sock_remained_size[sn] <<8) + head[1];
465 if(sock_remained_size[sn] > 1514)
472 if(len < sock_remained_size[sn]) pack_len = len;
473 else pack_len = sock_remained_size[sn];
474 wiz_recv_data(sn,buf,pack_len);
476 #if ( _WIZCHIP_ < 5200 )
478 if(sock_remained_size[sn] == 0)
480 wiz_recv_data(sn, head, 6);
481 setSn_CR(sn,Sn_CR_RECV);
487 sock_remained_size[sn] = head[4];
488 sock_remaiend_size[sn] = (sock_remained_size[sn] << 8) + head[5];
494 if(len < sock_remained_size[sn]) pack_len = len;
495 else pack_len = sock_remained_size[sn];
496 wiz_recv_data(sn, buf, pack_len);
500 wiz_recv_ignore(sn, pack_len);
501 sock_remained_size[sn] = pack_len;
504 setSn_CR(sn,Sn_CR_RECV);
506 while(getSn_CR(sn)) ;
507 sock_remained_size[sn] -= pack_len;
508 if(sock_remained_size[sn] != 0) sock_pack_info[sn] |= 0x01;
520 tmp = *((uint8_t*)arg);
526 *((uint8_t*)arg) = (sock_io_mode >> sn) & 0x0001;
529 *((uint16_t*)arg) = getSn_TxMAX(sn);
532 *((uint16_t*)arg) = getSn_RxMAX(sn);
536 setSn_IR(sn,*(uint8_t*)arg);
539 *((uint8_t*)arg) = getSn_IR(sn);
543 setSn_IMR(sn,*(uint8_t*)arg);
546 *((uint8_t*)arg) = getSn_IMR(sn);
561 setSn_TTL(sn,*(uint8_t*)arg);
564 setSn_TOS(sn,*(uint8_t*)arg);
567 setSn_MSSR(sn,*(uint16_t*)arg);
570 setSn_DIPR(sn, (uint8_t*)arg);
573 setSn_DPORT(sn, *(uint16_t*)arg);
575 #if _WIZCHIP_ != 5100
581 setSn_CR(sn,Sn_CR_SEND_KEEP);
582 while(getSn_CR(sn) != 0)
586 if (getSn_IR(sn) & Sn_IR_TIMEOUT)
588 setSn_IR(sn, Sn_IR_TIMEOUT);
594 case SO_KEEPALIVEAUTO:
596 setSn_KPALVTR(sn,*(uint8_t*)arg);
612 *(uint8_t*)arg = getSn_MR(sn) & 0xF0;
615 *(uint8_t*) arg = getSn_TTL(sn);
618 *(uint8_t*) arg = getSn_TOS(sn);
621 *(uint8_t*) arg = getSn_MSSR(sn);
623 getSn_DIPR(sn, (uint8_t*)arg);
626 *(uint16_t*) arg = getSn_DPORT(sn);
629 case SO_KEEPALIVEAUTO:
631 *(uint16_t*) arg = getSn_KPALVTR(sn);
635 *(uint16_t*) arg = getSn_TX_FSR(sn);
637 *(uint16_t*) arg = getSn_RX_RSR(sn);
639 *(uint8_t*) arg = getSn_SR(sn);
642 if(getSn_MR(sn) == Sn_MR_TCP)
643 *(uint16_t*)arg = getSn_RX_RSR(sn);
645 *(uint16_t*)arg = sock_remained_size[sn];
649 *(uint8_t*)arg = sock_pack_info[sn];