STATIC err_t wiznet5k_netif_init(struct netif *netif) { netif->linkoutput = wiznet5k_netif_output; netif->output = etharp_output; netif->mtu = 1500; netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET | NETIF_FLAG_IGMP; wiznet5k_get_mac_address(netif->state, netif->hwaddr); netif->hwaddr_len = sizeof(netif->hwaddr); int ret = WIZCHIP_EXPORT(socket)(0, Sn_MR_MACRAW, 0, 0); if (ret != 0) { printf("WIZNET fatal error in netifinit: %d\n", ret); return ERR_IF; } // Enable MAC filtering so we only get frames destined for us, to reduce load on lwIP setSn_MR(0, getSn_MR(0) | Sn_MR_MFEN); return ERR_OK; }
int8_t close(uint8_t sn) { CHECK_SOCKNUM(); //A20160426 : Applied the erratum 1 of W5300 #if (_WIZCHIP_ == 5300) //M20160503 : Wrong socket parameter. s -> sn //if( ((getSn_MR(s)& 0x0F) == Sn_MR_TCP) && (getSn_TX_FSR(s) != getSn_TxMAX(s)) ) if( ((getSn_MR(sn)& 0x0F) == Sn_MR_TCP) && (getSn_TX_FSR(sn) != getSn_TxMAX(sn)) ) { uint8_t destip[4] = {0, 0, 0, 1}; // TODO // You can wait for completing to sending data; // wait about 1 second; // if you have completed to send data, skip the code of erratum 1 // ex> wait_1s(); // if (getSn_TX_FSR(s) == getSn_TxMAX(s)) continue; // //M20160503 : The socket() of close() calls close() itself again. It occures a infinite loop - close()->socket()->close()->socket()-> ~ //socket(s,Sn_MR_UDP,0x3000,0); //sendto(s,destip,1,destip,0x3000); // send the dummy data to an unknown destination(0.0.0.1). setSn_MR(sn,Sn_MR_UDP); setSn_PORTR(sn, 0x3000); setSn_CR(sn,Sn_CR_OPEN); while(getSn_CR(sn) != 0); while(getSn_SR(sn) != SOCK_UDP); sendto(sn,destip,1,destip,0x3000); // send the dummy data to an unknown destination(0.0.0.1). }; #endif setSn_CR(sn,Sn_CR_CLOSE); /* wait to process the command... */ while( getSn_CR(sn) ); /* clear all interrupt of the socket. */ setSn_IR(sn, 0xFF); //A20150401 : Release the sock_io_mode of socket n. sock_io_mode &= ~(1<<sn); // sock_is_sending &= ~(1<<sn); sock_remained_size[sn] = 0; sock_pack_info[sn] = 0; while(getSn_SR(sn) != SOCK_CLOSED); return SOCK_OK; }
int8_t socket(uint8_t sn, uint8_t protocol, uint16_t port, uint8_t flag) { CHECK_SOCKNUM(); switch(protocol) { case Sn_MR_TCP : 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; } if((flag & 0x06) != 0) return SOCKERR_SOCKFLAG; #if _WIZCHIP_ == 5200 if(flag & 0x10) return SOCKERR_SOCKFLAG; #endif if(flag != 0) { switch(protocol) { case Sn_MR_TCP: if((flag & (SF_TCP_NODELAY|SF_IO_NONBLOCK))==0) return SOCKERR_SOCKFLAG; break; case Sn_MR_UDP: if(flag & SF_IGMP_VER2) { if((flag & SF_MULTI_ENABLE)==0) return SOCKERR_SOCKFLAG; } #if _WIZCHIP_ == 5500 if(flag & SF_UNI_BLOCK) { if((flag & SF_MULTI_ENABLE) == 0) return SOCKERR_SOCKFLAG; } #endif break; default: break; } } close(sn); setSn_MR(sn, (protocol | (flag & 0xF0))); if(!port) { port = sock_any_port++; if(sock_any_port == 0xFFF0) sock_any_port = SOCK_ANY_PORT_NUM; } setSn_PORT(sn,port); setSn_CR(sn,Sn_CR_OPEN); while(getSn_CR(sn)); //mgg1010 line below added - without it, if a socket is re-used, it may inherit the previous // value of NONBLOCK sock_io_mode &= ~(1 << sn); sock_io_mode |= ((flag & SF_IO_NONBLOCK) << sn); sock_is_sending &= ~(1<<sn); sock_remained_size[sn] = 0; sock_pack_info[sn] = 0; while(getSn_SR(sn) == SOCK_CLOSED); return (int8_t)sn; }
int8_t socket(uint8_t sn, uint8_t protocol, uint16_t port, uint8_t flag) { CHECK_SOCKNUM(); switch(protocol) { case Sn_MR_TCP : { //M20150601 : Fixed the warning - taddr will never be NULL /* uint8_t taddr[4]; getSIPR(taddr); */ uint32_t taddr; getSIPR((uint8_t*)&taddr); if(taddr == 0) return SOCKERR_SOCKINIT; } case Sn_MR_UDP : case Sn_MR_MACRAW : case Sn_MR_IPRAW : break; #if ( _WIZCHIP_ < 5200 ) case Sn_MR_PPPoE : break; #endif default : return SOCKERR_SOCKMODE; } //M20150601 : For SF_TCP_ALIGN & W5300 //if((flag & 0x06) != 0) return SOCKERR_SOCKFLAG; if((flag & 0x04) != 0) return SOCKERR_SOCKFLAG; #if _WIZCHIP_ == 5200 if(flag & 0x10) return SOCKERR_SOCKFLAG; #endif if(flag != 0) { switch(protocol) { case Sn_MR_TCP: //M20150601 : For SF_TCP_ALIGN & W5300 #if _WIZCHIP_ == 5300 if((flag & (SF_TCP_NODELAY|SF_IO_NONBLOCK|SF_TCP_ALIGN))==0) return SOCKERR_SOCKFLAG; #else if((flag & (SF_TCP_NODELAY|SF_IO_NONBLOCK))==0) return SOCKERR_SOCKFLAG; #endif break; case Sn_MR_UDP: if(flag & SF_IGMP_VER2) { if((flag & SF_MULTI_ENABLE)==0) return SOCKERR_SOCKFLAG; } #if _WIZCHIP_ == 5500 if(flag & SF_UNI_BLOCK) { if((flag & SF_MULTI_ENABLE) == 0) return SOCKERR_SOCKFLAG; } #endif break; default: break; } } close(sn); //M20150601 #if _WIZCHIP_ == 5300 setSn_MR(sn, ((uint16_t)(protocol | (flag & 0xF0))) | (((uint16_t)(flag & 0x02)) << 7) ); #else setSn_MR(sn, (protocol | (flag & 0xF0))); #endif if(!port) { port = sock_any_port++; if(sock_any_port == 0xFFF0) sock_any_port = SOCK_ANY_PORT_NUM; } setSn_PORT(sn,port); setSn_CR(sn,Sn_CR_OPEN); while(getSn_CR(sn)); //A20150401 : For release the previous sock_io_mode sock_io_mode &= ~(1 <<sn); // sock_io_mode |= ((flag & SF_IO_NONBLOCK) << sn); sock_is_sending &= ~(1<<sn); sock_remained_size[sn] = 0; //M20150601 : repalce 0 with PACK_COMPLETED //sock_pack_info[sn] = 0; sock_pack_info[sn] = PACK_COMPLETED; // while(getSn_SR(sn) == SOCK_CLOSED); return (int8_t)sn; }