WIZNet W5500 with additional enhancements

Fork of WIZnetInterface by WIZnet

Committer:
Helmut Tschemernjak
Date:
Tue Oct 10 20:56:13 2017 +0200
Revision:
35:fe3028eda085
Parent:
34:7d44648ec5f2
Child:
36:0ba2e8d5274a
Added support for DHCP lease time and domain name
Enhance DHCP code to use opcode defines to make it easier to
understand and maintain.

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;
Helmut Tschemernjak 35:fe3028eda085 27 domainName = NULL;
Helmut Tschemernjak 35:fe3028eda085 28 leaseStart = 0;
embeddist 3:f8c6efc8bf83 29 }
embeddist 3:f8c6efc8bf83 30
embeddist 3:f8c6efc8bf83 31 EthernetInterface::EthernetInterface(SPI* spi, PinName cs, PinName reset) :
embeddist 3:f8c6efc8bf83 32 WIZnet_Chip(spi, cs, reset)
embeddist 3:f8c6efc8bf83 33 {
embeddist 3:f8c6efc8bf83 34 ip_set = false;
Helmut Tschemernjak 35:fe3028eda085 35 domainName = NULL;
Helmut Tschemernjak 35:fe3028eda085 36 leaseStart = 0;
embeddist 3:f8c6efc8bf83 37 }
embeddist 7:da6fcec0f3fe 38 #endif
Soohwan Kim 0:6f28332c466f 39
Helmut Tschemernjak 35:fe3028eda085 40 EthernetInterface::~EthernetInterface()
Helmut Tschemernjak 35:fe3028eda085 41 {
Helmut Tschemernjak 35:fe3028eda085 42 if (domainName)
Helmut Tschemernjak 35:fe3028eda085 43 free(domainName);
Helmut Tschemernjak 35:fe3028eda085 44 }
Helmut Tschemernjak 35:fe3028eda085 45
kaizen 20:bda61525ac71 46 int EthernetInterface::init()
kaizen 20:bda61525ac71 47 {
kaizen 20:bda61525ac71 48 dhcp = true;
kaizen 20:bda61525ac71 49 reset();
kaizen 20:bda61525ac71 50
kaizen 20:bda61525ac71 51 return 0;
kaizen 20:bda61525ac71 52 }
kaizen 20:bda61525ac71 53
Helmut Tschemernjak 34:7d44648ec5f2 54 int EthernetInterface::init(uint8_t *mac)
Soohwan Kim 0:6f28332c466f 55 {
Soohwan Kim 0:6f28332c466f 56 dhcp = true;
Soohwan Kim 0:6f28332c466f 57 //
Soohwan Kim 0:6f28332c466f 58 for (int i =0; i < 6; i++) this->mac[i] = mac[i];
Soohwan Kim 0:6f28332c466f 59 //
Soohwan Kim 0:6f28332c466f 60 reset();
Helmut Tschemernjak 31:a3fbfa5c8351 61 setmac();
Soohwan Kim 0:6f28332c466f 62 return 0;
Soohwan Kim 0:6f28332c466f 63 }
Soohwan Kim 0:6f28332c466f 64
Helmut Tschemernjak 34:7d44648ec5f2 65 int EthernetInterface::init(uint8_t * mac, const char* ip, const char* mask, const char* gateway, const char* dnsServer)
Soohwan Kim 0:6f28332c466f 66 {
Soohwan Kim 0:6f28332c466f 67 dhcp = false;
Soohwan Kim 0:6f28332c466f 68 //
Soohwan Kim 0:6f28332c466f 69 for (int i =0; i < 6; i++) this->mac[i] = mac[i];
Soohwan Kim 0:6f28332c466f 70 //
Soohwan Kim 0:6f28332c466f 71 this->ip = str_to_ip(ip);
Soohwan Kim 0:6f28332c466f 72 strcpy(ip_string, ip);
Soohwan Kim 0:6f28332c466f 73 ip_set = true;
Soohwan Kim 0:6f28332c466f 74 this->netmask = str_to_ip(mask);
Soohwan Kim 0:6f28332c466f 75 this->gateway = str_to_ip(gateway);
Helmut Tschemernjak 34:7d44648ec5f2 76 if (dnsServer)
Helmut Tschemernjak 34:7d44648ec5f2 77 this->dnsaddr = str_to_ip(dnsServer);
Soohwan Kim 0:6f28332c466f 78 reset();
Soohwan Kim 4:4930f81bbe98 79
Soohwan Kim 4:4930f81bbe98 80 // @Jul. 8. 2014 add code. should be called to write chip.
Soohwan Kim 4:4930f81bbe98 81 setmac();
Soohwan Kim 4:4930f81bbe98 82 setip();
embeddist 3:f8c6efc8bf83 83
Soohwan Kim 0:6f28332c466f 84 return 0;
Soohwan Kim 0:6f28332c466f 85 }
Soohwan Kim 0:6f28332c466f 86
Soohwan Kim 0:6f28332c466f 87 // Connect Bring the interface up, start DHCP if needed.
Soohwan Kim 0:6f28332c466f 88 int EthernetInterface::connect()
Soohwan Kim 0:6f28332c466f 89 {
Soohwan Kim 0:6f28332c466f 90 if (dhcp) {
Soohwan Kim 0:6f28332c466f 91 int r = IPrenew();
Soohwan Kim 0:6f28332c466f 92 if (r < 0) {
Soohwan Kim 0:6f28332c466f 93 return r;
Soohwan Kim 0:6f28332c466f 94 }
Soohwan Kim 0:6f28332c466f 95 }
Soohwan Kim 0:6f28332c466f 96 if (WIZnet_Chip::setip() == false) return -1;
Soohwan Kim 0:6f28332c466f 97 return 0;
Soohwan Kim 0:6f28332c466f 98 }
Soohwan Kim 0:6f28332c466f 99
Soohwan Kim 0:6f28332c466f 100 // Disconnect Bring the interface down.
Soohwan Kim 0:6f28332c466f 101 int EthernetInterface::disconnect()
Soohwan Kim 0:6f28332c466f 102 {
Soohwan Kim 0:6f28332c466f 103 //if (WIZnet_Chip::disconnect() == false) return -1;
Soohwan Kim 0:6f28332c466f 104 return 0;
Soohwan Kim 0:6f28332c466f 105 }
Soohwan Kim 0:6f28332c466f 106
Soohwan Kim 0:6f28332c466f 107
Soohwan Kim 0:6f28332c466f 108 char* EthernetInterface::getIPAddress()
Soohwan Kim 0:6f28332c466f 109 {
Soohwan Kim 0:6f28332c466f 110 uint32_t ip = reg_rd<uint32_t>(SIPR);
Soohwan Kim 0:6f28332c466f 111 snprintf(ip_string, sizeof(ip_string), "%d.%d.%d.%d",
Soohwan Kim 0:6f28332c466f 112 (uint8_t)((ip>>24)&0xff),
Soohwan Kim 0:6f28332c466f 113 (uint8_t)((ip>>16)&0xff),
Soohwan Kim 0:6f28332c466f 114 (uint8_t)((ip>>8)&0xff),
Soohwan Kim 0:6f28332c466f 115 (uint8_t)(ip&0xff));
Soohwan Kim 0:6f28332c466f 116 return ip_string;
Soohwan Kim 0:6f28332c466f 117 }
Soohwan Kim 0:6f28332c466f 118
Soohwan Kim 0:6f28332c466f 119 char* EthernetInterface::getNetworkMask()
Soohwan Kim 0:6f28332c466f 120 {
Soohwan Kim 0:6f28332c466f 121 uint32_t ip = reg_rd<uint32_t>(SUBR);
Soohwan Kim 0:6f28332c466f 122 snprintf(mask_string, sizeof(mask_string), "%d.%d.%d.%d",
Soohwan Kim 0:6f28332c466f 123 (uint8_t)((ip>>24)&0xff),
Soohwan Kim 0:6f28332c466f 124 (uint8_t)((ip>>16)&0xff),
Soohwan Kim 0:6f28332c466f 125 (uint8_t)((ip>>8)&0xff),
Soohwan Kim 0:6f28332c466f 126 (uint8_t)(ip&0xff));
Soohwan Kim 0:6f28332c466f 127 return mask_string;
Soohwan Kim 0:6f28332c466f 128 }
Soohwan Kim 0:6f28332c466f 129
Soohwan Kim 0:6f28332c466f 130 char* EthernetInterface::getGateway()
Soohwan Kim 0:6f28332c466f 131 {
Soohwan Kim 0:6f28332c466f 132 uint32_t ip = reg_rd<uint32_t>(GAR);
Soohwan Kim 0:6f28332c466f 133 snprintf(gw_string, sizeof(gw_string), "%d.%d.%d.%d",
Soohwan Kim 0:6f28332c466f 134 (uint8_t)((ip>>24)&0xff),
Soohwan Kim 0:6f28332c466f 135 (uint8_t)((ip>>16)&0xff),
Soohwan Kim 0:6f28332c466f 136 (uint8_t)((ip>>8)&0xff),
Soohwan Kim 0:6f28332c466f 137 (uint8_t)(ip&0xff));
Soohwan Kim 0:6f28332c466f 138 return gw_string;
Soohwan Kim 0:6f28332c466f 139 }
Soohwan Kim 0:6f28332c466f 140
Helmut Tschemernjak 33:879cfe51e66e 141
Helmut Tschemernjak 33:879cfe51e66e 142 char* EthernetInterface::getDNSServer()
Helmut Tschemernjak 33:879cfe51e66e 143 {
Helmut Tschemernjak 33:879cfe51e66e 144 uint32_t ip = getDNSAddr();
Helmut Tschemernjak 34:7d44648ec5f2 145 snprintf(dns_string, sizeof(gw_string), "%d.%d.%d.%d",
Helmut Tschemernjak 33:879cfe51e66e 146 (uint8_t)((ip>>24)&0xff),
Helmut Tschemernjak 33:879cfe51e66e 147 (uint8_t)((ip>>16)&0xff),
Helmut Tschemernjak 33:879cfe51e66e 148 (uint8_t)((ip>>8)&0xff),
Helmut Tschemernjak 33:879cfe51e66e 149 (uint8_t)(ip&0xff));
Helmut Tschemernjak 34:7d44648ec5f2 150 return dns_string;
Helmut Tschemernjak 33:879cfe51e66e 151 }
Helmut Tschemernjak 33:879cfe51e66e 152
Soohwan Kim 0:6f28332c466f 153 char* EthernetInterface::getMACAddress()
Soohwan Kim 0:6f28332c466f 154 {
Soohwan Kim 0:6f28332c466f 155 uint8_t mac[6];
Soohwan Kim 0:6f28332c466f 156 reg_rd_mac(SHAR, mac);
Soohwan Kim 0:6f28332c466f 157 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 158 //ethernet_address(mac_string);
Soohwan Kim 0:6f28332c466f 159 return mac_string;
Soohwan Kim 0:6f28332c466f 160
Soohwan Kim 0:6f28332c466f 161 }
Soohwan Kim 0:6f28332c466f 162
Helmut Tschemernjak 35:fe3028eda085 163
Soohwan Kim 0:6f28332c466f 164 int EthernetInterface::IPrenew(int timeout_ms)
Soohwan Kim 0:6f28332c466f 165 {
Soohwan Kim 0:6f28332c466f 166 DHCPClient dhcp;
Soohwan Kim 0:6f28332c466f 167 int err = dhcp.setup(timeout_ms);
Soohwan Kim 0:6f28332c466f 168 if (err == (-1)) {
Soohwan Kim 0:6f28332c466f 169 return -1;
Soohwan Kim 0:6f28332c466f 170 }
Soohwan Kim 0:6f28332c466f 171 // printf("Connected, IP: %d.%d.%d.%d\n", dhcp.yiaddr[0], dhcp.yiaddr[1], dhcp.yiaddr[2], dhcp.yiaddr[3]);
Helmut Tschemernjak 35:fe3028eda085 172 /*
Helmut Tschemernjak 35:fe3028eda085 173 * Sync DHCP response variables
Helmut Tschemernjak 35:fe3028eda085 174 */
Soohwan Kim 0:6f28332c466f 175 ip = (dhcp.yiaddr[0] <<24) | (dhcp.yiaddr[1] <<16) | (dhcp.yiaddr[2] <<8) | dhcp.yiaddr[3];
Soohwan Kim 0:6f28332c466f 176 gateway = (dhcp.gateway[0]<<24) | (dhcp.gateway[1]<<16) | (dhcp.gateway[2]<<8) | dhcp.gateway[3];
Soohwan Kim 0:6f28332c466f 177 netmask = (dhcp.netmask[0]<<24) | (dhcp.netmask[1]<<16) | (dhcp.netmask[2]<<8) | dhcp.netmask[3];
Soohwan Kim 0:6f28332c466f 178 dnsaddr = (dhcp.dnsaddr[0]<<24) | (dhcp.dnsaddr[1]<<16) | (dhcp.dnsaddr[2]<<8) | dhcp.dnsaddr[3];
Helmut Tschemernjak 35:fe3028eda085 179 timesrv = (dhcp.timesrv[0]<<24) | (dhcp.timesrv[1]<<16) | (dhcp.timesrv[2]<<8) | dhcp.timesrv[3];
Helmut Tschemernjak 35:fe3028eda085 180 leaseTime = (dhcp.leaseTime[0]<<24) | (dhcp.leaseTime[1]<<16) | (dhcp.leaseTime[2]<<8) | dhcp.leaseTime[3];
Helmut Tschemernjak 35:fe3028eda085 181 leaseStart = time(NULL);
Helmut Tschemernjak 35:fe3028eda085 182 if (domainName) {
Helmut Tschemernjak 35:fe3028eda085 183 free(domainName);
Helmut Tschemernjak 35:fe3028eda085 184 domainName = NULL;
Helmut Tschemernjak 35:fe3028eda085 185 }
Helmut Tschemernjak 35:fe3028eda085 186 if (dhcp.domainName) {
Helmut Tschemernjak 35:fe3028eda085 187 domainName = dhcp.domainName;
Helmut Tschemernjak 35:fe3028eda085 188 dhcp.domainName = NULL;
Helmut Tschemernjak 35:fe3028eda085 189 }
Soohwan Kim 0:6f28332c466f 190 return 0;
Soohwan Kim 0:6f28332c466f 191 }
Soohwan Kim 0:6f28332c466f 192