WIZNet W5500 with additional enhancements

Fork of WIZnetInterface by WIZnet

Committer:
Helmut Tschemernjak
Date:
Mon Oct 09 19:58:19 2017 +0200
Revision:
34:7d44648ec5f2
Parent:
33:879cfe51e66e
Child:
35:fe3028eda085
Added support for manual DNS server config or DHCP DNS config.
Now the DNS 8.8.8.8 is only a fallback if no DNS server is specified.
Replaced error() messages with printf() to avoid hanging code in error()

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Soohwan Kim 0:6f28332c466f 1 /* Copyright (C) 2012 mbed.org, MIT License
Soohwan Kim 0:6f28332c466f 2 *
Soohwan Kim 0:6f28332c466f 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
Soohwan Kim 0:6f28332c466f 4 * and associated documentation files (the "Software"), to deal in the Software without restriction,
Soohwan Kim 0:6f28332c466f 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
Soohwan Kim 0:6f28332c466f 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
Soohwan Kim 0:6f28332c466f 7 * furnished to do so, subject to the following conditions:
Soohwan Kim 0:6f28332c466f 8 *
Soohwan Kim 0:6f28332c466f 9 * The above copyright notice and this permission notice shall be included in all copies or
Soohwan Kim 0:6f28332c466f 10 * substantial portions of the Software.
Soohwan Kim 0:6f28332c466f 11 *
Soohwan Kim 0:6f28332c466f 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
Soohwan Kim 0:6f28332c466f 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
Soohwan Kim 0:6f28332c466f 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
Soohwan Kim 0:6f28332c466f 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Soohwan Kim 0:6f28332c466f 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Soohwan Kim 0:6f28332c466f 17 */
Soohwan Kim 0:6f28332c466f 18
Soohwan Kim 0:6f28332c466f 19 #include "EthernetInterface.h"
Soohwan Kim 0:6f28332c466f 20 #include "DHCPClient.h"
embeddist 7:da6fcec0f3fe 21
embeddist 28:200e63e513a8 22 #if (not defined TARGET_WIZwiki_W7500) && (not defined TARGET_WIZwiki_W7500P) && (not defined TARGET_WIZwiki_W7500ECO)
embeddist 3:f8c6efc8bf83 23 EthernetInterface::EthernetInterface(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName reset) :
embeddist 3:f8c6efc8bf83 24 WIZnet_Chip(mosi, miso, sclk, cs, reset)
embeddist 3:f8c6efc8bf83 25 {
embeddist 3:f8c6efc8bf83 26 ip_set = false;
embeddist 3:f8c6efc8bf83 27 }
embeddist 3:f8c6efc8bf83 28
embeddist 3:f8c6efc8bf83 29 EthernetInterface::EthernetInterface(SPI* spi, PinName cs, PinName reset) :
embeddist 3:f8c6efc8bf83 30 WIZnet_Chip(spi, cs, reset)
embeddist 3:f8c6efc8bf83 31 {
embeddist 3:f8c6efc8bf83 32 ip_set = false;
embeddist 3:f8c6efc8bf83 33 }
embeddist 7:da6fcec0f3fe 34 #endif
Soohwan Kim 0:6f28332c466f 35
kaizen 20:bda61525ac71 36 int EthernetInterface::init()
kaizen 20:bda61525ac71 37 {
kaizen 20:bda61525ac71 38 dhcp = true;
kaizen 20:bda61525ac71 39 reset();
kaizen 20:bda61525ac71 40
kaizen 20:bda61525ac71 41 return 0;
kaizen 20:bda61525ac71 42 }
kaizen 20:bda61525ac71 43
Helmut Tschemernjak 34:7d44648ec5f2 44 int EthernetInterface::init(uint8_t *mac)
Soohwan Kim 0:6f28332c466f 45 {
Soohwan Kim 0:6f28332c466f 46 dhcp = true;
Soohwan Kim 0:6f28332c466f 47 //
Soohwan Kim 0:6f28332c466f 48 for (int i =0; i < 6; i++) this->mac[i] = mac[i];
Soohwan Kim 0:6f28332c466f 49 //
Soohwan Kim 0:6f28332c466f 50 reset();
Helmut Tschemernjak 31:a3fbfa5c8351 51 setmac();
Soohwan Kim 0:6f28332c466f 52 return 0;
Soohwan Kim 0:6f28332c466f 53 }
Soohwan Kim 0:6f28332c466f 54
Helmut Tschemernjak 34:7d44648ec5f2 55 int EthernetInterface::init(uint8_t * mac, const char* ip, const char* mask, const char* gateway, const char* dnsServer)
Soohwan Kim 0:6f28332c466f 56 {
Soohwan Kim 0:6f28332c466f 57 dhcp = false;
Soohwan Kim 0:6f28332c466f 58 //
Soohwan Kim 0:6f28332c466f 59 for (int i =0; i < 6; i++) this->mac[i] = mac[i];
Soohwan Kim 0:6f28332c466f 60 //
Soohwan Kim 0:6f28332c466f 61 this->ip = str_to_ip(ip);
Soohwan Kim 0:6f28332c466f 62 strcpy(ip_string, ip);
Soohwan Kim 0:6f28332c466f 63 ip_set = true;
Soohwan Kim 0:6f28332c466f 64 this->netmask = str_to_ip(mask);
Soohwan Kim 0:6f28332c466f 65 this->gateway = str_to_ip(gateway);
Helmut Tschemernjak 34:7d44648ec5f2 66 if (dnsServer)
Helmut Tschemernjak 34:7d44648ec5f2 67 this->dnsaddr = str_to_ip(dnsServer);
Soohwan Kim 0:6f28332c466f 68 reset();
Soohwan Kim 4:4930f81bbe98 69
Soohwan Kim 4:4930f81bbe98 70 // @Jul. 8. 2014 add code. should be called to write chip.
Soohwan Kim 4:4930f81bbe98 71 setmac();
Soohwan Kim 4:4930f81bbe98 72 setip();
embeddist 3:f8c6efc8bf83 73
Soohwan Kim 0:6f28332c466f 74 return 0;
Soohwan Kim 0:6f28332c466f 75 }
Soohwan Kim 0:6f28332c466f 76
Soohwan Kim 0:6f28332c466f 77 // Connect Bring the interface up, start DHCP if needed.
Soohwan Kim 0:6f28332c466f 78 int EthernetInterface::connect()
Soohwan Kim 0:6f28332c466f 79 {
Soohwan Kim 0:6f28332c466f 80 if (dhcp) {
Soohwan Kim 0:6f28332c466f 81 int r = IPrenew();
Soohwan Kim 0:6f28332c466f 82 if (r < 0) {
Soohwan Kim 0:6f28332c466f 83 return r;
Soohwan Kim 0:6f28332c466f 84 }
Soohwan Kim 0:6f28332c466f 85 }
Soohwan Kim 0:6f28332c466f 86
Soohwan Kim 0:6f28332c466f 87 if (WIZnet_Chip::setip() == false) return -1;
Soohwan Kim 0:6f28332c466f 88 return 0;
Soohwan Kim 0:6f28332c466f 89 }
Soohwan Kim 0:6f28332c466f 90
Soohwan Kim 0:6f28332c466f 91 // Disconnect Bring the interface down.
Soohwan Kim 0:6f28332c466f 92 int EthernetInterface::disconnect()
Soohwan Kim 0:6f28332c466f 93 {
Soohwan Kim 0:6f28332c466f 94 //if (WIZnet_Chip::disconnect() == false) return -1;
Soohwan Kim 0:6f28332c466f 95 return 0;
Soohwan Kim 0:6f28332c466f 96 }
Soohwan Kim 0:6f28332c466f 97
Soohwan Kim 0:6f28332c466f 98
Soohwan Kim 0:6f28332c466f 99 char* EthernetInterface::getIPAddress()
Soohwan Kim 0:6f28332c466f 100 {
Soohwan Kim 0:6f28332c466f 101 uint32_t ip = reg_rd<uint32_t>(SIPR);
Soohwan Kim 0:6f28332c466f 102 snprintf(ip_string, sizeof(ip_string), "%d.%d.%d.%d",
Soohwan Kim 0:6f28332c466f 103 (uint8_t)((ip>>24)&0xff),
Soohwan Kim 0:6f28332c466f 104 (uint8_t)((ip>>16)&0xff),
Soohwan Kim 0:6f28332c466f 105 (uint8_t)((ip>>8)&0xff),
Soohwan Kim 0:6f28332c466f 106 (uint8_t)(ip&0xff));
Soohwan Kim 0:6f28332c466f 107 return ip_string;
Soohwan Kim 0:6f28332c466f 108 }
Soohwan Kim 0:6f28332c466f 109
Soohwan Kim 0:6f28332c466f 110 char* EthernetInterface::getNetworkMask()
Soohwan Kim 0:6f28332c466f 111 {
Soohwan Kim 0:6f28332c466f 112 uint32_t ip = reg_rd<uint32_t>(SUBR);
Soohwan Kim 0:6f28332c466f 113 snprintf(mask_string, sizeof(mask_string), "%d.%d.%d.%d",
Soohwan Kim 0:6f28332c466f 114 (uint8_t)((ip>>24)&0xff),
Soohwan Kim 0:6f28332c466f 115 (uint8_t)((ip>>16)&0xff),
Soohwan Kim 0:6f28332c466f 116 (uint8_t)((ip>>8)&0xff),
Soohwan Kim 0:6f28332c466f 117 (uint8_t)(ip&0xff));
Soohwan Kim 0:6f28332c466f 118 return mask_string;
Soohwan Kim 0:6f28332c466f 119 }
Soohwan Kim 0:6f28332c466f 120
Soohwan Kim 0:6f28332c466f 121 char* EthernetInterface::getGateway()
Soohwan Kim 0:6f28332c466f 122 {
Soohwan Kim 0:6f28332c466f 123 uint32_t ip = reg_rd<uint32_t>(GAR);
Soohwan Kim 0:6f28332c466f 124 snprintf(gw_string, sizeof(gw_string), "%d.%d.%d.%d",
Soohwan Kim 0:6f28332c466f 125 (uint8_t)((ip>>24)&0xff),
Soohwan Kim 0:6f28332c466f 126 (uint8_t)((ip>>16)&0xff),
Soohwan Kim 0:6f28332c466f 127 (uint8_t)((ip>>8)&0xff),
Soohwan Kim 0:6f28332c466f 128 (uint8_t)(ip&0xff));
Soohwan Kim 0:6f28332c466f 129 return gw_string;
Soohwan Kim 0:6f28332c466f 130 }
Soohwan Kim 0:6f28332c466f 131
Helmut Tschemernjak 33:879cfe51e66e 132
Helmut Tschemernjak 33:879cfe51e66e 133 char* EthernetInterface::getDNSServer()
Helmut Tschemernjak 33:879cfe51e66e 134 {
Helmut Tschemernjak 33:879cfe51e66e 135 uint32_t ip = getDNSAddr();
Helmut Tschemernjak 34:7d44648ec5f2 136 snprintf(dns_string, sizeof(gw_string), "%d.%d.%d.%d",
Helmut Tschemernjak 33:879cfe51e66e 137 (uint8_t)((ip>>24)&0xff),
Helmut Tschemernjak 33:879cfe51e66e 138 (uint8_t)((ip>>16)&0xff),
Helmut Tschemernjak 33:879cfe51e66e 139 (uint8_t)((ip>>8)&0xff),
Helmut Tschemernjak 33:879cfe51e66e 140 (uint8_t)(ip&0xff));
Helmut Tschemernjak 34:7d44648ec5f2 141 return dns_string;
Helmut Tschemernjak 33:879cfe51e66e 142 }
Helmut Tschemernjak 33:879cfe51e66e 143
Soohwan Kim 0:6f28332c466f 144 char* EthernetInterface::getMACAddress()
Soohwan Kim 0:6f28332c466f 145 {
Soohwan Kim 0:6f28332c466f 146 uint8_t mac[6];
Soohwan Kim 0:6f28332c466f 147 reg_rd_mac(SHAR, mac);
Soohwan Kim 0:6f28332c466f 148 snprintf(mac_string, sizeof(mac_string), "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
Soohwan Kim 0:6f28332c466f 149 //ethernet_address(mac_string);
Soohwan Kim 0:6f28332c466f 150 return mac_string;
Soohwan Kim 0:6f28332c466f 151
Soohwan Kim 0:6f28332c466f 152 }
Soohwan Kim 0:6f28332c466f 153
Soohwan Kim 0:6f28332c466f 154 int EthernetInterface::IPrenew(int timeout_ms)
Soohwan Kim 0:6f28332c466f 155 {
Soohwan Kim 0:6f28332c466f 156 DHCPClient dhcp;
Soohwan Kim 0:6f28332c466f 157 int err = dhcp.setup(timeout_ms);
Soohwan Kim 0:6f28332c466f 158 if (err == (-1)) {
Soohwan Kim 0:6f28332c466f 159 return -1;
Soohwan Kim 0:6f28332c466f 160 }
Soohwan Kim 0:6f28332c466f 161 // printf("Connected, IP: %d.%d.%d.%d\n", dhcp.yiaddr[0], dhcp.yiaddr[1], dhcp.yiaddr[2], dhcp.yiaddr[3]);
Soohwan Kim 0:6f28332c466f 162 ip = (dhcp.yiaddr[0] <<24) | (dhcp.yiaddr[1] <<16) | (dhcp.yiaddr[2] <<8) | dhcp.yiaddr[3];
Soohwan Kim 0:6f28332c466f 163 gateway = (dhcp.gateway[0]<<24) | (dhcp.gateway[1]<<16) | (dhcp.gateway[2]<<8) | dhcp.gateway[3];
Soohwan Kim 0:6f28332c466f 164 netmask = (dhcp.netmask[0]<<24) | (dhcp.netmask[1]<<16) | (dhcp.netmask[2]<<8) | dhcp.netmask[3];
Soohwan Kim 0:6f28332c466f 165 dnsaddr = (dhcp.dnsaddr[0]<<24) | (dhcp.dnsaddr[1]<<16) | (dhcp.dnsaddr[2]<<8) | dhcp.dnsaddr[3];
Soohwan Kim 0:6f28332c466f 166 return 0;
Soohwan Kim 0:6f28332c466f 167 }
Soohwan Kim 0:6f28332c466f 168