Ethernet interface for W5500 with bug fixed in socket::close()

Fork of EthernetInterfaceW5500 by W5500-Ethernet-Interface Makers

Committer:
ppo
Date:
Fri Aug 29 12:00:38 2014 +0000
Revision:
15:fe68ac753657
Parent:
10:cadac6bcd169
bug fixed in close(), now socket is really closed

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Bongjun 10:cadac6bcd169 1 // EthernetInterfaceW5500.cpp 2014/7/17
Bongjun 10:cadac6bcd169 2
Bongjun 10:cadac6bcd169 3 #include "EthernetInterfaceW5500.h"
Bongjun 10:cadac6bcd169 4 #include "DHCPClient.h"
Bongjun 10:cadac6bcd169 5
Bongjun 10:cadac6bcd169 6 EthernetInterfaceW5500::EthernetInterfaceW5500(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName reset) :
Bongjun 10:cadac6bcd169 7 WIZnet_Chip(mosi, miso, sclk, cs, reset)
Bongjun 10:cadac6bcd169 8 {
Bongjun 10:cadac6bcd169 9 ip_set = false;
Bongjun 10:cadac6bcd169 10 }
Bongjun 10:cadac6bcd169 11
Bongjun 10:cadac6bcd169 12 EthernetInterfaceW5500::EthernetInterfaceW5500(SPI* spi, PinName cs, PinName reset) :
Bongjun 10:cadac6bcd169 13 WIZnet_Chip(spi, cs, reset)
Bongjun 10:cadac6bcd169 14 {
Bongjun 10:cadac6bcd169 15 ip_set = false;
Bongjun 10:cadac6bcd169 16 }
Bongjun 10:cadac6bcd169 17
Bongjun 10:cadac6bcd169 18 int EthernetInterfaceW5500::init()
Bongjun 10:cadac6bcd169 19 {
Bongjun 10:cadac6bcd169 20 dhcp = true;
Bongjun 10:cadac6bcd169 21 //
Bongjun 10:cadac6bcd169 22 //for (int i =0; i < 6; i++) this->mac[i] = mac[i];
Bongjun 10:cadac6bcd169 23 //
Bongjun 10:cadac6bcd169 24 reset();
Bongjun 10:cadac6bcd169 25 return 0;
Bongjun 10:cadac6bcd169 26 }
Bongjun 10:cadac6bcd169 27
Bongjun 10:cadac6bcd169 28 int EthernetInterfaceW5500::init(uint8_t * mac)
Bongjun 10:cadac6bcd169 29 {
Bongjun 10:cadac6bcd169 30 dhcp = true;
Bongjun 10:cadac6bcd169 31 //
Bongjun 10:cadac6bcd169 32 for (int i =0; i < 6; i++) this->mac[i] = mac[i];
Bongjun 10:cadac6bcd169 33 //
Bongjun 10:cadac6bcd169 34 reset();
Bongjun 10:cadac6bcd169 35 setmac();
Bongjun 10:cadac6bcd169 36 return 0;
Bongjun 10:cadac6bcd169 37 }
Bongjun 10:cadac6bcd169 38
Bongjun 10:cadac6bcd169 39 // add this function, because sometimes no needed MAC address in init calling.
Bongjun 10:cadac6bcd169 40 int EthernetInterfaceW5500::init(const char* ip, const char* mask, const char* gateway)
Bongjun 10:cadac6bcd169 41 {
Bongjun 10:cadac6bcd169 42 dhcp = false;
Bongjun 10:cadac6bcd169 43 //
Bongjun 10:cadac6bcd169 44 //for (int i =0; i < 6; i++) this->mac[i] = mac[i];
Bongjun 10:cadac6bcd169 45 //
Bongjun 10:cadac6bcd169 46 this->ip = str_to_ip(ip);
Bongjun 10:cadac6bcd169 47 strcpy(ip_string, ip);
Bongjun 10:cadac6bcd169 48 ip_set = true;
Bongjun 10:cadac6bcd169 49 this->netmask = str_to_ip(mask);
Bongjun 10:cadac6bcd169 50 this->gateway = str_to_ip(gateway);
Bongjun 10:cadac6bcd169 51 reset();
Bongjun 10:cadac6bcd169 52
Bongjun 10:cadac6bcd169 53 // @Jul. 8. 2014 add code. should be called to write chip.
Bongjun 10:cadac6bcd169 54 setip();
Bongjun 10:cadac6bcd169 55
Bongjun 10:cadac6bcd169 56 return 0;
Bongjun 10:cadac6bcd169 57 }
Bongjun 10:cadac6bcd169 58
Bongjun 10:cadac6bcd169 59 int EthernetInterfaceW5500::init(uint8_t * mac, const char* ip, const char* mask, const char* gateway)
Bongjun 10:cadac6bcd169 60 {
Bongjun 10:cadac6bcd169 61 dhcp = false;
Bongjun 10:cadac6bcd169 62 //
Bongjun 10:cadac6bcd169 63 for (int i =0; i < 6; i++) this->mac[i] = mac[i];
Bongjun 10:cadac6bcd169 64 //
Bongjun 10:cadac6bcd169 65 this->ip = str_to_ip(ip);
Bongjun 10:cadac6bcd169 66 strcpy(ip_string, ip);
Bongjun 10:cadac6bcd169 67 ip_set = true;
Bongjun 10:cadac6bcd169 68 this->netmask = str_to_ip(mask);
Bongjun 10:cadac6bcd169 69 this->gateway = str_to_ip(gateway);
Bongjun 10:cadac6bcd169 70 reset();
Bongjun 10:cadac6bcd169 71
Bongjun 10:cadac6bcd169 72 // @Jul. 8. 2014 add code. should be called to write chip.
Bongjun 10:cadac6bcd169 73 setmac();
Bongjun 10:cadac6bcd169 74 setip();
Bongjun 10:cadac6bcd169 75
Bongjun 10:cadac6bcd169 76 return 0;
Bongjun 10:cadac6bcd169 77 }
Bongjun 10:cadac6bcd169 78
Bongjun 10:cadac6bcd169 79 // Connect Bring the interface up, start DHCP if needed.
Bongjun 10:cadac6bcd169 80 int EthernetInterfaceW5500::connect()
Bongjun 10:cadac6bcd169 81 {
Bongjun 10:cadac6bcd169 82 if (dhcp) {
Bongjun 10:cadac6bcd169 83 int r = IPrenew();
Bongjun 10:cadac6bcd169 84 if (r < 0) {
Bongjun 10:cadac6bcd169 85 return r;
Bongjun 10:cadac6bcd169 86 }
Bongjun 10:cadac6bcd169 87 }
Bongjun 10:cadac6bcd169 88
Bongjun 10:cadac6bcd169 89 if (WIZnet_Chip::setip() == false) return -1;
Bongjun 10:cadac6bcd169 90 return 0;
Bongjun 10:cadac6bcd169 91 }
Bongjun 10:cadac6bcd169 92
Bongjun 10:cadac6bcd169 93 // Disconnect Bring the interface down.
Bongjun 10:cadac6bcd169 94 int EthernetInterfaceW5500::disconnect()
Bongjun 10:cadac6bcd169 95 {
Bongjun 10:cadac6bcd169 96 if (WIZnet_Chip::disconnect() == false) return -1;
Bongjun 10:cadac6bcd169 97 return 0;
Bongjun 10:cadac6bcd169 98 }
Bongjun 10:cadac6bcd169 99
Bongjun 10:cadac6bcd169 100 char* EthernetInterfaceW5500::getIPAddress()
Bongjun 10:cadac6bcd169 101 {
Bongjun 10:cadac6bcd169 102 uint32_t ip = reg_rd<uint32_t>(SIPR);
Bongjun 10:cadac6bcd169 103 snprintf(ip_string, sizeof(ip_string), "%d.%d.%d.%d", (ip>>24)&0xff, (ip>>16)&0xff, (ip>>8)&0xff, ip&0xff);
Bongjun 10:cadac6bcd169 104 return ip_string;
Bongjun 10:cadac6bcd169 105 }
Bongjun 10:cadac6bcd169 106
Bongjun 10:cadac6bcd169 107 char* EthernetInterfaceW5500::getNetworkMask()
Bongjun 10:cadac6bcd169 108 {
Bongjun 10:cadac6bcd169 109 uint32_t ip = reg_rd<uint32_t>(SUBR);
Bongjun 10:cadac6bcd169 110 snprintf(mask_string, sizeof(mask_string), "%d.%d.%d.%d", (ip>>24)&0xff, (ip>>16)&0xff, (ip>>8)&0xff, ip&0xff);
Bongjun 10:cadac6bcd169 111 return mask_string;
Bongjun 10:cadac6bcd169 112 }
Bongjun 10:cadac6bcd169 113
Bongjun 10:cadac6bcd169 114 char* EthernetInterfaceW5500::getGateway()
Bongjun 10:cadac6bcd169 115 {
Bongjun 10:cadac6bcd169 116 uint32_t ip = reg_rd<uint32_t>(GAR);
Bongjun 10:cadac6bcd169 117 snprintf(gw_string, sizeof(gw_string), "%d.%d.%d.%d", (ip>>24)&0xff, (ip>>16)&0xff, (ip>>8)&0xff, ip&0xff);
Bongjun 10:cadac6bcd169 118 return gw_string;
Bongjun 10:cadac6bcd169 119 }
Bongjun 10:cadac6bcd169 120
Bongjun 10:cadac6bcd169 121 char* EthernetInterfaceW5500::getMACAddress()
Bongjun 10:cadac6bcd169 122 {
Bongjun 10:cadac6bcd169 123 uint8_t mac[6];
Bongjun 10:cadac6bcd169 124 reg_rd_mac(SHAR, mac);
Bongjun 10:cadac6bcd169 125 snprintf(mac_string, sizeof(mac_string), "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
Bongjun 10:cadac6bcd169 126 return mac_string;
Bongjun 10:cadac6bcd169 127 }
Bongjun 10:cadac6bcd169 128
Bongjun 10:cadac6bcd169 129 int EthernetInterfaceW5500::IPrenew(int timeout_ms)
Bongjun 10:cadac6bcd169 130 {
Bongjun 10:cadac6bcd169 131 // printf("DHCP Started, waiting for IP...\n");
Bongjun 10:cadac6bcd169 132 DHCPClient dhcp;
Bongjun 10:cadac6bcd169 133 int err = dhcp.setup(timeout_ms);
Bongjun 10:cadac6bcd169 134 if (err == (-1)) {
Bongjun 10:cadac6bcd169 135 // printf("Timeout.\n");
Bongjun 10:cadac6bcd169 136 return -1;
Bongjun 10:cadac6bcd169 137 }
Bongjun 10:cadac6bcd169 138 // printf("Connected, IP: %d.%d.%d.%d\n", dhcp.yiaddr[0], dhcp.yiaddr[1], dhcp.yiaddr[2], dhcp.yiaddr[3]);
Bongjun 10:cadac6bcd169 139 ip = (dhcp.yiaddr[0] <<24) | (dhcp.yiaddr[1] <<16) | (dhcp.yiaddr[2] <<8) | dhcp.yiaddr[3];
Bongjun 10:cadac6bcd169 140 gateway = (dhcp.gateway[0]<<24) | (dhcp.gateway[1]<<16) | (dhcp.gateway[2]<<8) | dhcp.gateway[3];
Bongjun 10:cadac6bcd169 141 netmask = (dhcp.netmask[0]<<24) | (dhcp.netmask[1]<<16) | (dhcp.netmask[2]<<8) | dhcp.netmask[3];
Bongjun 10:cadac6bcd169 142 dnsaddr = (dhcp.dnsaddr[0]<<24) | (dhcp.dnsaddr[1]<<16) | (dhcp.dnsaddr[2]<<8) | dhcp.dnsaddr[3];
Bongjun 10:cadac6bcd169 143 return 0;
Bongjun 10:cadac6bcd169 144 }