int32_t WIZCHIP_EXPORT(send)(uint8_t sn, uint8_t * buf, uint16_t len) { uint8_t tmp=0; uint16_t freesize=0; CHECK_SOCKNUM(); CHECK_SOCKMODE(Sn_MR_TCP); CHECK_SOCKDATA(); tmp = getSn_SR(sn); if(tmp != SOCK_ESTABLISHED && tmp != SOCK_CLOSE_WAIT) return SOCKERR_SOCKSTATUS; if( sock_is_sending & (1<<sn) ) { tmp = getSn_IR(sn); if(tmp & Sn_IR_SENDOK) { setSn_IR(sn, Sn_IR_SENDOK); #if _WZICHIP_ == 5200 if(getSn_TX_RD(sn) != sock_next_rd[sn]) { setSn_CR(sn,Sn_CR_SEND); while(getSn_CR(sn)); return SOCKERR_BUSY; } #endif sock_is_sending &= ~(1<<sn); } else if(tmp & Sn_IR_TIMEOUT) { WIZCHIP_EXPORT(close)(sn); return SOCKERR_TIMEOUT; } else return SOCK_BUSY; } freesize = getSn_TxMAX(sn); if (len > freesize) len = freesize; // check size not to exceed MAX size. while(1) { freesize = getSn_TX_FSR(sn); tmp = getSn_SR(sn); if ((tmp != SOCK_ESTABLISHED) && (tmp != SOCK_CLOSE_WAIT)) { WIZCHIP_EXPORT(close)(sn); return SOCKERR_SOCKSTATUS; } if( (sock_io_mode & (1<<sn)) && (len > freesize) ) return SOCK_BUSY; if(len <= freesize) break; MICROPY_THREAD_YIELD(); } wiz_send_data(sn, buf, len); #if _WIZCHIP_ == 5200 sock_next_rd[sn] = getSn_TX_RD(sn) + len; #endif setSn_CR(sn,Sn_CR_SEND); /* wait to process the command... */ while(getSn_CR(sn)); sock_is_sending |= (1 << sn); return len; }
int32_t WIZCHIP_EXPORT(recv)(uint8_t sn, uint8_t * buf, uint16_t len) { uint8_t tmp = 0; uint16_t recvsize = 0; CHECK_SOCKNUM(); CHECK_SOCKMODE(Sn_MR_TCP); CHECK_SOCKDATA(); recvsize = getSn_RxMAX(sn); if(recvsize < len) len = recvsize; while(1) { recvsize = getSn_RX_RSR(sn); tmp = getSn_SR(sn); if (tmp != SOCK_ESTABLISHED) { if(tmp == SOCK_CLOSE_WAIT) { if(recvsize != 0) break; else if(getSn_TX_FSR(sn) == getSn_TxMAX(sn)) { // dpgeorge: Getting here seems to be an orderly shutdown of the // socket, and trying to get POSIX behaviour we return 0 because: // "If no messages are available to be received and the peer has per‐ // formed an orderly shutdown, recv() shall return 0". // TODO this return value clashes with SOCK_BUSY in non-blocking mode. WIZCHIP_EXPORT(close)(sn); return 0; } } else { WIZCHIP_EXPORT(close)(sn); return SOCKERR_SOCKSTATUS; } } if((sock_io_mode & (1<<sn)) && (recvsize == 0)) return SOCK_BUSY; if(recvsize != 0) break; MICROPY_THREAD_YIELD(); }; if(recvsize < len) len = recvsize; wiz_recv_data(sn, buf, len); setSn_CR(sn,Sn_CR_RECV); while(getSn_CR(sn)); return len; }
int32_t recv(uint8_t sn, uint8_t * buf, uint16_t len) { uint8_t tmp = 0; uint16_t recvsize = 0; CHECK_SOCKNUM(); CHECK_SOCKMODE(Sn_MR_TCP); CHECK_SOCKDATA(); recvsize = getSn_RxMAX(sn); if(recvsize < len) len = recvsize; while(1) { recvsize = getSn_RX_RSR(sn); tmp = getSn_SR(sn); if (tmp != SOCK_ESTABLISHED) { if(tmp == SOCK_CLOSE_WAIT) { if(recvsize != 0) break; else if(getSn_TX_FSR(sn) == getSn_TxMAX(sn)) { close(sn); return SOCKERR_SOCKSTATUS; } } else { close(sn); return SOCKERR_SOCKSTATUS; } } if((sock_io_mode & (1<<sn)) && (recvsize == 0)) return SOCK_BUSY; if(recvsize != 0) break; HAL_Delay(1); }; if(recvsize < len) len = recvsize; wiz_recv_data(sn, buf, len); setSn_CR(sn,Sn_CR_RECV); while(getSn_CR(sn)); return len; }
int32_t recvfrom(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t *port) { uint8_t mr; uint8_t head[8]; uint16_t pack_len=0; CHECK_SOCKNUM(); //CHECK_SOCKMODE(Sn_MR_UDP); switch((mr=getSn_MR(sn)) & 0x0F) { case Sn_MR_UDP: case Sn_MR_MACRAW: break; #if ( _WIZCHIP_ < 5200 ) case Sn_MR_IPRAW: case Sn_MR_PPPoE: break; #endif default: return SOCKERR_SOCKMODE; } CHECK_SOCKDATA(); if(sock_remained_size[sn] == 0) { while(1) { pack_len = getSn_RX_RSR(sn); if(getSn_SR(sn) == SOCK_CLOSED) return SOCKERR_SOCKCLOSED; if( (sock_io_mode & (1<<sn)) && (pack_len == 0) ) return SOCK_BUSY; if(pack_len != 0) break; }; } sock_pack_info[sn] = PACK_COMPLETED; switch (mr & 0x07) { case Sn_MR_UDP : if(sock_remained_size[sn] == 0) { wiz_recv_data(sn, head, 8); setSn_CR(sn,Sn_CR_RECV); while(getSn_CR(sn)); // read peer's IP address, port number & packet length addr[0] = head[0]; addr[1] = head[1]; addr[2] = head[2]; addr[3] = head[3]; *port = head[4]; *port = (*port << 8) + head[5]; sock_remained_size[sn] = head[6]; sock_remained_size[sn] = (sock_remained_size[sn] << 8) + head[7]; sock_pack_info[sn] = PACK_FIRST; } if(len < sock_remained_size[sn]) pack_len = len; else pack_len = sock_remained_size[sn]; // // Need to packet length check (default 1472) // wiz_recv_data(sn, buf, pack_len); // data copy. break; case Sn_MR_MACRAW : if(sock_remained_size[sn] == 0) { wiz_recv_data(sn, head, 2); setSn_CR(sn,Sn_CR_RECV); while(getSn_CR(sn)); // read peer's IP address, port number & packet length sock_remained_size[sn] = head[0]; sock_remained_size[sn] = (sock_remained_size[sn] <<8) + head[1]; if(sock_remained_size[sn] > 1514) { close(sn); return SOCKFATAL_PACKLEN; } sock_pack_info[sn] = PACK_FIRST; } if(len < sock_remained_size[sn]) pack_len = len; else pack_len = sock_remained_size[sn]; wiz_recv_data(sn,buf,pack_len); break; #if ( _WIZCHIP_ < 5200 ) case Sn_MR_IPRAW: if(sock_remained_size[sn] == 0) { wiz_recv_data(sn, head, 6); setSn_CR(sn,Sn_CR_RECV); while(getSn_CR(sn)); addr[0] = head[0]; addr[1] = head[1]; addr[2] = head[2]; addr[3] = head[3]; sock_remained_size[sn] = head[4]; sock_remaiend_size[sn] = (sock_remained_size[sn] << 8) + head[5]; sock_pack_info[sn] = PACK_FIRST; } // // Need to packet length check // if(len < sock_remained_size[sn]) pack_len = len; else pack_len = sock_remained_size[sn]; wiz_recv_data(sn, buf, pack_len); // data copy. break; #endif default: wiz_recv_ignore(sn, pack_len); // data copy. sock_remained_size[sn] = pack_len; break; } setSn_CR(sn,Sn_CR_RECV); /* wait to process the command... */ while(getSn_CR(sn)) ; sock_remained_size[sn] -= pack_len; if(sock_remained_size[sn] != 0) sock_pack_info[sn] |= 0x01; return pack_len; }
int32_t sendto(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t port) { uint8_t tmp = 0; uint16_t freesize = 0; CHECK_SOCKNUM(); switch(getSn_MR(sn) & 0x0F) { case Sn_MR_UDP: case Sn_MR_MACRAW: break; default: return SOCKERR_SOCKMODE; } CHECK_SOCKDATA(); if(*((uint32_t*)addr) == 0) return SOCKERR_IPINVALID; if(port == 0) return SOCKERR_PORTZERO; tmp = getSn_SR(sn); if(tmp != SOCK_MACRAW && tmp != SOCK_UDP) return SOCKERR_SOCKSTATUS; setSn_DIPR(sn,addr); setSn_DPORT(sn,port); freesize = getSn_TxMAX(sn); if (len > freesize) len = freesize; // check size not to exceed MAX size. while(1) { freesize = getSn_TX_FSR(sn); if(getSn_SR(sn) == SOCK_CLOSED) return SOCKERR_SOCKCLOSED; if( (sock_io_mode & (1<<sn)) && (len > freesize) ) return SOCK_BUSY; if(len <= freesize) break; }; wiz_send_data(sn, buf, len); #if _WIZCHIP_ == 5200 // for W5200 ARP errata setSUBR(0); #endif setSn_CR(sn,Sn_CR_SEND); /* wait to process the command... */ while(getSn_CR(sn)); #if _WIZCHIP_ == 5200 // for W5200 ARP errata setSUBR((uint8_t*)"\x00\x00\x00\x00"); #endif while(1) { tmp = getSn_IR(sn); if(tmp & Sn_IR_SENDOK) { setSn_IR(sn, Sn_IR_SENDOK); break; } //M:20131104 //else if(tmp & Sn_IR_TIMEOUT) return SOCKERR_TIMEOUT; else if(tmp & Sn_IR_TIMEOUT) { setSn_IR(sn, Sn_IR_TIMEOUT); return SOCKERR_TIMEOUT; } //////////// } return len; }
int32_t recvfrom(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t *port) { //M20150601 : For W5300 #if _WIZCHIP_ == 5300 uint16_t mr; uint16_t mr1; #else uint8_t mr; #endif // uint8_t head[8]; uint16_t pack_len=0; CHECK_SOCKNUM(); //CHECK_SOCKMODE(Sn_MR_UDP); //A20150601 #if _WIZCHIP_ == 5300 mr1 = getMR(); #endif switch((mr=getSn_MR(sn)) & 0x0F) { case Sn_MR_UDP: case Sn_MR_IPRAW: case Sn_MR_MACRAW: break; #if ( _WIZCHIP_ < 5200 ) case Sn_MR_PPPoE: break; #endif default: return SOCKERR_SOCKMODE; } CHECK_SOCKDATA(); if(sock_remained_size[sn] == 0) { while(1) { pack_len = getSn_RX_RSR(sn); if(getSn_SR(sn) == SOCK_CLOSED) return SOCKERR_SOCKCLOSED; if( (sock_io_mode & (1<<sn)) && (pack_len == 0) ) return SOCK_BUSY; if(pack_len != 0) break; }; } //D20150601 : Move it to bottom // sock_pack_info[sn] = PACK_COMPLETED; switch (mr & 0x07) { case Sn_MR_UDP : if(sock_remained_size[sn] == 0) { wiz_recv_data(sn, head, 8); setSn_CR(sn,Sn_CR_RECV); while(getSn_CR(sn)); // read peer's IP address, port number & packet length //A20150601 : For W5300 #if _WIZCHIP_ == 5300 if(mr1 & MR_FS) { addr[0] = head[1]; addr[1] = head[0]; addr[2] = head[3]; addr[3] = head[2]; *port = head[5]; *port = (*port << 8) + head[4]; sock_remained_size[sn] = head[7]; sock_remained_size[sn] = (sock_remained_size[sn] << 8) + head[6]; } else { #endif addr[0] = head[0]; addr[1] = head[1]; addr[2] = head[2]; addr[3] = head[3]; *port = head[4]; *port = (*port << 8) + head[5]; sock_remained_size[sn] = head[6]; sock_remained_size[sn] = (sock_remained_size[sn] << 8) + head[7]; #if _WIZCHIP_ == 5300 } #endif sock_pack_info[sn] = PACK_FIRST; } if(len < sock_remained_size[sn]) pack_len = len; else pack_len = sock_remained_size[sn]; //A20150601 : For W5300 len = pack_len; #if _WIZCHIP_ == 5300 if(sock_pack_info[sn] & PACK_FIFOBYTE) { *buf++ = sock_remained_byte[sn]; pack_len -= 1; sock_remained_size[sn] -= 1; sock_pack_info[sn] &= ~PACK_FIFOBYTE; } #endif // // Need to packet length check (default 1472) // wiz_recv_data(sn, buf, pack_len); // data copy. break; case Sn_MR_MACRAW : if(sock_remained_size[sn] == 0) { wiz_recv_data(sn, head, 2); setSn_CR(sn,Sn_CR_RECV); while(getSn_CR(sn)); // read peer's IP address, port number & packet length sock_remained_size[sn] = head[0]; sock_remained_size[sn] = (sock_remained_size[sn] <<8) + head[1] -2; #if _WIZCHIP_ == W5300 if(sock_remained_size[sn] & 0x01) sock_remained_size[sn] = sock_remained_size[sn] + 1 - 4; else sock_remained_size[sn] -= 4; #endif if(sock_remained_size[sn] > 1514) { close(sn); return SOCKFATAL_PACKLEN; } sock_pack_info[sn] = PACK_FIRST; } if(len < sock_remained_size[sn]) pack_len = len; else pack_len = sock_remained_size[sn]; wiz_recv_data(sn,buf,pack_len); break; //#if ( _WIZCHIP_ < 5200 ) case Sn_MR_IPRAW: if(sock_remained_size[sn] == 0) { wiz_recv_data(sn, head, 6); setSn_CR(sn,Sn_CR_RECV); while(getSn_CR(sn)); addr[0] = head[0]; addr[1] = head[1]; addr[2] = head[2]; addr[3] = head[3]; sock_remained_size[sn] = head[4]; //M20150401 : For Typing Error //sock_remaiend_size[sn] = (sock_remained_size[sn] << 8) + head[5]; sock_remained_size[sn] = (sock_remained_size[sn] << 8) + head[5]; sock_pack_info[sn] = PACK_FIRST; } // // Need to packet length check // if(len < sock_remained_size[sn]) pack_len = len; else pack_len = sock_remained_size[sn]; wiz_recv_data(sn, buf, pack_len); // data copy. break; //#endif default: wiz_recv_ignore(sn, pack_len); // data copy. sock_remained_size[sn] = pack_len; break; } setSn_CR(sn,Sn_CR_RECV); /* wait to process the command... */ while(getSn_CR(sn)) ; sock_remained_size[sn] -= pack_len; //M20150601 : //if(sock_remained_size[sn] != 0) sock_pack_info[sn] |= 0x01; if(sock_remained_size[sn] != 0) { sock_pack_info[sn] |= PACK_REMAINED; #if _WIZCHIP_ == 5300 if(pack_len & 0x01) sock_pack_info[sn] |= PACK_FIFOBYTE; #endif } else sock_pack_info[sn] = PACK_COMPLETED; #if _WIZCHIP_ == 5300 pack_len = len; #endif // //M20150409 : Explicit Type Casting //return pack_len; return (int32_t)pack_len; }
int32_t sendto(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t port) { uint8_t tmp = 0; uint16_t freesize = 0; uint32_t taddr; CHECK_SOCKNUM(); switch(getSn_MR(sn) & 0x0F) { case Sn_MR_UDP: case Sn_MR_MACRAW: // break; // #if ( _WIZCHIP_ < 5200 ) case Sn_MR_IPRAW: break; // #endif default: return SOCKERR_SOCKMODE; } CHECK_SOCKDATA(); //M20140501 : For avoiding fatal error on memory align mismatched //if(*((uint32_t*)addr) == 0) return SOCKERR_IPINVALID; //{ //uint32_t taddr; taddr = ((uint32_t)addr[0]) & 0x000000FF; taddr = (taddr << 8) + ((uint32_t)addr[1] & 0x000000FF); taddr = (taddr << 8) + ((uint32_t)addr[2] & 0x000000FF); taddr = (taddr << 8) + ((uint32_t)addr[3] & 0x000000FF); //} // //if(*((uint32_t*)addr) == 0) return SOCKERR_IPINVALID; if((taddr == 0) && ((getSn_MR(sn)&Sn_MR_MACRAW) != Sn_MR_MACRAW)) return SOCKERR_IPINVALID; if((port == 0) && ((getSn_MR(sn)&Sn_MR_MACRAW) != Sn_MR_MACRAW)) return SOCKERR_PORTZERO; tmp = getSn_SR(sn); //#if ( _WIZCHIP_ < 5200 ) if((tmp != SOCK_MACRAW) && (tmp != SOCK_UDP) && (tmp != SOCK_IPRAW)) return SOCKERR_SOCKSTATUS; //#else // if(tmp != SOCK_MACRAW && tmp != SOCK_UDP) return SOCKERR_SOCKSTATUS; //#endif setSn_DIPR(sn,addr); setSn_DPORT(sn,port); freesize = getSn_TxMAX(sn); if (len > freesize) len = freesize; // check size not to exceed MAX size. while(1) { freesize = getSn_TX_FSR(sn); if(getSn_SR(sn) == SOCK_CLOSED) return SOCKERR_SOCKCLOSED; if( (sock_io_mode & (1<<sn)) && (len > freesize) ) return SOCK_BUSY; if(len <= freesize) break; }; wiz_send_data(sn, buf, len); #if _WIZCHIP_ < 5500 //M20150401 : for WIZCHIP Errata #4, #5 (ARP errata) getSIPR((uint8_t*)&taddr); if(taddr == 0) { getSUBR((uint8_t*)&taddr); setSUBR((uint8_t*)"\x00\x00\x00\x00"); } else taddr = 0; #endif //A20150601 : For W5300 #if _WIZCHIP_ == 5300 setSn_TX_WRSR(sn, len); #endif // setSn_CR(sn,Sn_CR_SEND); /* wait to process the command... */ while(getSn_CR(sn)); while(1) { tmp = getSn_IR(sn); if(tmp & Sn_IR_SENDOK) { setSn_IR(sn, Sn_IR_SENDOK); break; } //M:20131104 //else if(tmp & Sn_IR_TIMEOUT) return SOCKERR_TIMEOUT; else if(tmp & Sn_IR_TIMEOUT) { setSn_IR(sn, Sn_IR_TIMEOUT); //M20150409 : Fixed the lost of sign bits by type casting. //len = (uint16_t)SOCKERR_TIMEOUT; //break; #if _WIZCHIP_ < 5500 //M20150401 : for WIZCHIP Errata #4, #5 (ARP errata) if(taddr) setSUBR((uint8_t*)&taddr); #endif return SOCKERR_TIMEOUT; } //////////// } #if _WIZCHIP_ < 5500 //M20150401 : for WIZCHIP Errata #4, #5 (ARP errata) if(taddr) setSUBR((uint8_t*)&taddr); #endif //M20150409 : Explicit Type Casting //return len; return (int32_t)len; }
int32_t recv(uint8_t sn, uint8_t * buf, uint16_t len) { uint8_t tmp = 0; uint16_t recvsize = 0; //A20150601 : For integarating with W5300 #if _WIZCHIP_ == 5300 uint8_t head[2]; uint16_t mr; #endif // CHECK_SOCKNUM(); CHECK_SOCKMODE(Sn_MR_TCP); CHECK_SOCKDATA(); recvsize = getSn_RxMAX(sn); if(recvsize < len) len = recvsize; //A20150601 : For Integrating with W5300 #if _WIZCHIP_ == 5300 //sock_pack_info[sn] = PACK_COMPLETED; // for clear if(sock_remained_size[sn] == 0) { #endif // while(1) { recvsize = getSn_RX_RSR(sn); tmp = getSn_SR(sn); if (tmp != SOCK_ESTABLISHED) { if(tmp == SOCK_CLOSE_WAIT) { if(recvsize != 0) break; else if(getSn_TX_FSR(sn) == getSn_TxMAX(sn)) { close(sn); return SOCKERR_SOCKSTATUS; } } else { close(sn); return SOCKERR_SOCKSTATUS; } } if((sock_io_mode & (1<<sn)) && (recvsize == 0)) return SOCK_BUSY; if(recvsize != 0) break; }; #if _WIZCHIP_ == 5300 } #endif //A20150601 : For integrating with W5300 #if _WIZCHIP_ == 5300 if((sock_remained_size[sn] == 0) || (getSn_MR(sn) & Sn_MR_ALIGN)) { mr = getMR(); if((getSn_MR(sn) & Sn_MR_ALIGN)==0) { wiz_recv_data(sn,head,2); if(mr & MR_FS) recvsize = (((uint16_t)head[1]) << 8) | ((uint16_t)head[0]); else recvsize = (((uint16_t)head[0]) << 8) | ((uint16_t)head[1]); sock_pack_info[sn] = PACK_FIRST; } sock_remained_size[sn] = recvsize; } if(len > sock_remained_size[sn]) len = sock_remained_size[sn]; recvsize = len; if(sock_pack_info[sn] & PACK_FIFOBYTE) { *buf = sock_remained_byte[sn]; buf++; sock_pack_info[sn] &= ~(PACK_FIFOBYTE); recvsize -= 1; sock_remained_size[sn] -= 1; } if(recvsize != 0) { wiz_recv_data(sn, buf, recvsize); setSn_CR(sn,Sn_CR_RECV); while(getSn_CR(sn)); } sock_remained_size[sn] -= recvsize; if(sock_remained_size[sn] != 0) { sock_pack_info[sn] |= PACK_REMAINED; if(recvsize & 0x1) sock_pack_info[sn] |= PACK_FIFOBYTE; } else sock_pack_info[sn] = PACK_COMPLETED; if(getSn_MR(sn) & Sn_MR_ALIGN) sock_remained_size[sn] = 0; //len = recvsize; #else if(recvsize < len) len = recvsize; wiz_recv_data(sn, buf, len); setSn_CR(sn,Sn_CR_RECV); while(getSn_CR(sn)); #endif //M20150409 : Explicit Type Casting //return len; return (int32_t)len; }
int32_t send(uint8_t sn, uint8_t * buf, uint16_t len) { uint8_t tmp=0; uint16_t freesize=0; CHECK_SOCKNUM(); CHECK_SOCKMODE(Sn_MR_TCP); CHECK_SOCKDATA(); tmp = getSn_SR(sn); if(tmp != SOCK_ESTABLISHED && tmp != SOCK_CLOSE_WAIT) return SOCKERR_SOCKSTATUS; if( sock_is_sending & (1<<sn) ) { tmp = getSn_IR(sn); if(tmp & Sn_IR_SENDOK) { setSn_IR(sn, Sn_IR_SENDOK); //M20150401 : Typing Error //#if _WZICHIP_ == 5200 #if _WIZCHIP_ == 5200 if(getSn_TX_RD(sn) != sock_next_rd[sn]) { setSn_CR(sn,Sn_CR_SEND); while(getSn_CR(sn)); return SOCK_BUSY; } #endif sock_is_sending &= ~(1<<sn); } else if(tmp & Sn_IR_TIMEOUT) { close(sn); return SOCKERR_TIMEOUT; } else return SOCK_BUSY; } freesize = getSn_TxMAX(sn); if (len > freesize) len = freesize; // check size not to exceed MAX size. while(1) { freesize = getSn_TX_FSR(sn); tmp = getSn_SR(sn); if ((tmp != SOCK_ESTABLISHED) && (tmp != SOCK_CLOSE_WAIT)) { close(sn); return SOCKERR_SOCKSTATUS; } if( (sock_io_mode & (1<<sn)) && (len > freesize) ) return SOCK_BUSY; if(len <= freesize) break; } wiz_send_data(sn, buf, len); #if _WIZCHIP_ == 5200 sock_next_rd[sn] = getSn_TX_RD(sn) + len; #endif #if _WIZCHIP_ == 5300 setSn_TX_WRSR(sn,len); #endif setSn_CR(sn,Sn_CR_SEND); /* wait to process the command... */ while(getSn_CR(sn)); sock_is_sending |= (1 << sn); //M20150409 : Explicit Type Casting //return len; return (int32_t)len; }
int32_t WIZCHIP_EXPORT(sendto)(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t port) { uint8_t tmp = 0; uint16_t freesize = 0; CHECK_SOCKNUM(); switch(getSn_MR(sn) & 0x0F) { case Sn_MR_UDP: case Sn_MR_MACRAW: break; default: return SOCKERR_SOCKMODE; } CHECK_SOCKDATA(); //M20140501 : For avoiding fatal error on memory align mismatched //if(*((uint32_t*)addr) == 0) return SOCKERR_IPINVALID; { uint32_t taddr; taddr = ((uint32_t)addr[0]) & 0x000000FF; taddr = (taddr << 8) + ((uint32_t)addr[1] & 0x000000FF); taddr = (taddr << 8) + ((uint32_t)addr[2] & 0x000000FF); taddr = (taddr << 8) + ((uint32_t)addr[3] & 0x000000FF); if (taddr == 0xFFFFFFFF || taddr == 0) return SOCKERR_IPINVALID; } // if(port == 0) return SOCKERR_PORTZERO; tmp = getSn_SR(sn); if(tmp != SOCK_MACRAW && tmp != SOCK_UDP) return SOCKERR_SOCKSTATUS; setSn_DIPR(sn,addr); setSn_DPORT(sn,port); freesize = getSn_TxMAX(sn); if (len > freesize) len = freesize; // check size not to exceed MAX size. while(1) { freesize = getSn_TX_FSR(sn); if(getSn_SR(sn) == SOCK_CLOSED) return SOCKERR_SOCKCLOSED; if( (sock_io_mode & (1<<sn)) && (len > freesize) ) return SOCK_BUSY; if(len <= freesize) break; MICROPY_THREAD_YIELD(); }; wiz_send_data(sn, buf, len); #if _WIZCHIP_ == 5200 // for W5200 ARP errata setSUBR(wizchip_getsubn()); #endif setSn_CR(sn,Sn_CR_SEND); /* wait to process the command... */ while(getSn_CR(sn)); while(1) { tmp = getSn_IR(sn); if(tmp & Sn_IR_SENDOK) { setSn_IR(sn, Sn_IR_SENDOK); break; } //M:20131104 //else if(tmp & Sn_IR_TIMEOUT) return SOCKERR_TIMEOUT; else if(tmp & Sn_IR_TIMEOUT) { setSn_IR(sn, Sn_IR_TIMEOUT); #if _WIZCHIP_ == 5200 // for W5200 ARP errata setSUBR((uint8_t*)"\x00\x00\x00\x00"); #endif return SOCKERR_TIMEOUT; } //////////// MICROPY_THREAD_YIELD(); } #if _WIZCHIP_ == 5200 // for W5200 ARP errata setSUBR((uint8_t*)"\x00\x00\x00\x00"); #endif return len; }