Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of WIZnetInterface by
arch/ext/W5500.cpp@4:4930f81bbe98, 2015-06-15 (annotated)
- Committer:
- Soohwan Kim
- Date:
- Mon Jun 15 22:12:21 2015 +0900
- Revision:
- 4:4930f81bbe98
- Parent:
- 3:f8c6efc8bf83
- Child:
- 8:4c02de1dbf3a
fixed W5500.h
Who changed what in which revision?
User | Revision | Line number | New 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 | */ |
embeddist | 3:f8c6efc8bf83 | 18 | #include "eth_arch.h" |
embeddist | 3:f8c6efc8bf83 | 19 | #ifdef USE_W5500 |
Soohwan Kim |
0:6f28332c466f | 20 | |
Soohwan Kim |
0:6f28332c466f | 21 | #include "mbed.h" |
Soohwan Kim |
0:6f28332c466f | 22 | #include "mbed_debug.h" |
Soohwan Kim |
0:6f28332c466f | 23 | #include "DNSClient.h" |
Soohwan Kim |
0:6f28332c466f | 24 | |
embeddist | 3:f8c6efc8bf83 | 25 | |
Soohwan Kim |
0:6f28332c466f | 26 | //Debug is disabled by default |
Soohwan Kim |
0:6f28332c466f | 27 | #if 0 |
Soohwan Kim |
0:6f28332c466f | 28 | #define DBG(...) do{debug("%p %d %s ", this,__LINE__,__PRETTY_FUNCTION__); debug(__VA_ARGS__); } while(0); |
Soohwan Kim |
0:6f28332c466f | 29 | //#define DBG(x, ...) debug("[W5500:DBG]"x"\r\n", ##__VA_ARGS__); |
Soohwan Kim |
0:6f28332c466f | 30 | #define WARN(x, ...) debug("[W5500:WARN]"x"\r\n", ##__VA_ARGS__); |
Soohwan Kim |
0:6f28332c466f | 31 | #define ERR(x, ...) debug("[W5500:ERR]"x"\r\n", ##__VA_ARGS__); |
Soohwan Kim |
0:6f28332c466f | 32 | #else |
Soohwan Kim |
0:6f28332c466f | 33 | #define DBG(x, ...) |
Soohwan Kim |
0:6f28332c466f | 34 | #define WARN(x, ...) |
Soohwan Kim |
0:6f28332c466f | 35 | #define ERR(x, ...) |
Soohwan Kim |
0:6f28332c466f | 36 | #endif |
Soohwan Kim |
0:6f28332c466f | 37 | |
Soohwan Kim |
0:6f28332c466f | 38 | #if 1 |
Soohwan Kim |
0:6f28332c466f | 39 | #define INFO(x, ...) debug("[W5500:INFO]"x"\r\n", ##__VA_ARGS__); |
Soohwan Kim |
0:6f28332c466f | 40 | #else |
Soohwan Kim |
0:6f28332c466f | 41 | #define INFO(x, ...) |
Soohwan Kim |
0:6f28332c466f | 42 | #endif |
Soohwan Kim |
0:6f28332c466f | 43 | |
Soohwan Kim |
0:6f28332c466f | 44 | #define DBG_SPI 0 |
Soohwan Kim |
0:6f28332c466f | 45 | |
Soohwan Kim |
0:6f28332c466f | 46 | WIZnet_Chip* WIZnet_Chip::inst; |
Soohwan Kim |
0:6f28332c466f | 47 | |
Soohwan Kim |
0:6f28332c466f | 48 | WIZnet_Chip::WIZnet_Chip(PinName mosi, PinName miso, PinName sclk, PinName _cs, PinName _reset): |
Soohwan Kim |
0:6f28332c466f | 49 | cs(_cs), reset_pin(_reset) |
Soohwan Kim |
0:6f28332c466f | 50 | { |
Soohwan Kim |
0:6f28332c466f | 51 | spi = new SPI(mosi, miso, sclk); |
Soohwan Kim |
0:6f28332c466f | 52 | cs = 1; |
Soohwan Kim |
0:6f28332c466f | 53 | reset_pin = 1; |
Soohwan Kim |
0:6f28332c466f | 54 | inst = this; |
Soohwan Kim |
4:4930f81bbe98 | 55 | sock_any_port = SOCK_ANY_PORT_NUM; |
Soohwan Kim |
0:6f28332c466f | 56 | } |
Soohwan Kim |
0:6f28332c466f | 57 | |
Soohwan Kim |
0:6f28332c466f | 58 | WIZnet_Chip::WIZnet_Chip(SPI* spi, PinName _cs, PinName _reset): |
Soohwan Kim |
0:6f28332c466f | 59 | cs(_cs), reset_pin(_reset) |
Soohwan Kim |
0:6f28332c466f | 60 | { |
Soohwan Kim |
0:6f28332c466f | 61 | this->spi = spi; |
Soohwan Kim |
0:6f28332c466f | 62 | cs = 1; |
Soohwan Kim |
0:6f28332c466f | 63 | reset_pin = 1; |
Soohwan Kim |
0:6f28332c466f | 64 | inst = this; |
Soohwan Kim |
4:4930f81bbe98 | 65 | sock_any_port = SOCK_ANY_PORT_NUM; |
Soohwan Kim |
4:4930f81bbe98 | 66 | } |
Soohwan Kim |
4:4930f81bbe98 | 67 | |
Soohwan Kim |
4:4930f81bbe98 | 68 | bool WIZnet_Chip::setmac() |
Soohwan Kim |
4:4930f81bbe98 | 69 | { |
Soohwan Kim |
4:4930f81bbe98 | 70 | |
Soohwan Kim |
4:4930f81bbe98 | 71 | for (int i =0; i < 6; i++) reg_wr<uint8_t>(SHAR+i, mac[i]); |
Soohwan Kim |
4:4930f81bbe98 | 72 | |
Soohwan Kim |
4:4930f81bbe98 | 73 | return true; |
Soohwan Kim |
0:6f28332c466f | 74 | } |
Soohwan Kim |
0:6f28332c466f | 75 | |
Soohwan Kim |
0:6f28332c466f | 76 | // Set the IP |
Soohwan Kim |
0:6f28332c466f | 77 | bool WIZnet_Chip::setip() |
Soohwan Kim |
0:6f28332c466f | 78 | { |
Soohwan Kim |
0:6f28332c466f | 79 | reg_wr<uint32_t>(SIPR, ip); |
Soohwan Kim |
0:6f28332c466f | 80 | reg_wr<uint32_t>(GAR, gateway); |
Soohwan Kim |
0:6f28332c466f | 81 | reg_wr<uint32_t>(SUBR, netmask); |
Soohwan Kim |
0:6f28332c466f | 82 | return true; |
Soohwan Kim |
0:6f28332c466f | 83 | } |
Soohwan Kim |
0:6f28332c466f | 84 | |
Soohwan Kim |
4:4930f81bbe98 | 85 | bool WIZnet_Chip::linkstatus() |
Soohwan Kim |
4:4930f81bbe98 | 86 | { |
Soohwan Kim |
4:4930f81bbe98 | 87 | if ( (reg_rd<uint8_t>(PHYCFGR) & 0x01) != 0x01 ) |
Soohwan Kim |
4:4930f81bbe98 | 88 | return false; |
Soohwan Kim |
4:4930f81bbe98 | 89 | |
Soohwan Kim |
4:4930f81bbe98 | 90 | return true; |
Soohwan Kim |
4:4930f81bbe98 | 91 | } |
Soohwan Kim |
4:4930f81bbe98 | 92 | |
Soohwan Kim |
4:4930f81bbe98 | 93 | |
Soohwan Kim |
0:6f28332c466f | 94 | bool WIZnet_Chip::setProtocol(int socket, Protocol p) |
Soohwan Kim |
0:6f28332c466f | 95 | { |
Soohwan Kim |
0:6f28332c466f | 96 | if (socket < 0) { |
Soohwan Kim |
0:6f28332c466f | 97 | return false; |
Soohwan Kim |
0:6f28332c466f | 98 | } |
Soohwan Kim |
0:6f28332c466f | 99 | sreg<uint8_t>(socket, Sn_MR, p); |
Soohwan Kim |
0:6f28332c466f | 100 | return true; |
Soohwan Kim |
0:6f28332c466f | 101 | } |
Soohwan Kim |
0:6f28332c466f | 102 | |
Soohwan Kim |
0:6f28332c466f | 103 | bool WIZnet_Chip::connect(int socket, const char * host, int port, int timeout_ms) |
Soohwan Kim |
0:6f28332c466f | 104 | { |
Soohwan Kim |
0:6f28332c466f | 105 | if (socket < 0) { |
Soohwan Kim |
0:6f28332c466f | 106 | return false; |
Soohwan Kim |
0:6f28332c466f | 107 | } |
Soohwan Kim |
0:6f28332c466f | 108 | sreg<uint8_t>(socket, Sn_MR, TCP); |
Soohwan Kim |
0:6f28332c466f | 109 | scmd(socket, OPEN); |
Soohwan Kim |
0:6f28332c466f | 110 | sreg_ip(socket, Sn_DIPR, host); |
Soohwan Kim |
0:6f28332c466f | 111 | sreg<uint16_t>(socket, Sn_DPORT, port); |
Soohwan Kim |
0:6f28332c466f | 112 | sreg<uint16_t>(socket, Sn_PORT, new_port()); |
Soohwan Kim |
0:6f28332c466f | 113 | scmd(socket, CONNECT); |
Soohwan Kim |
0:6f28332c466f | 114 | Timer t; |
Soohwan Kim |
0:6f28332c466f | 115 | t.reset(); |
Soohwan Kim |
0:6f28332c466f | 116 | t.start(); |
Soohwan Kim |
0:6f28332c466f | 117 | while(!is_connected(socket)) { |
Soohwan Kim |
0:6f28332c466f | 118 | if (t.read_ms() > timeout_ms) { |
Soohwan Kim |
0:6f28332c466f | 119 | return false; |
Soohwan Kim |
0:6f28332c466f | 120 | } |
Soohwan Kim |
0:6f28332c466f | 121 | } |
Soohwan Kim |
0:6f28332c466f | 122 | return true; |
Soohwan Kim |
0:6f28332c466f | 123 | } |
Soohwan Kim |
0:6f28332c466f | 124 | |
Soohwan Kim |
0:6f28332c466f | 125 | bool WIZnet_Chip::gethostbyname(const char* host, uint32_t* ip) |
Soohwan Kim |
0:6f28332c466f | 126 | { |
Soohwan Kim |
0:6f28332c466f | 127 | uint32_t addr = str_to_ip(host); |
Soohwan Kim |
0:6f28332c466f | 128 | char buf[17]; |
Soohwan Kim |
0:6f28332c466f | 129 | snprintf(buf, sizeof(buf), "%d.%d.%d.%d", (addr>>24)&0xff, (addr>>16)&0xff, (addr>>8)&0xff, addr&0xff); |
Soohwan Kim |
0:6f28332c466f | 130 | if (strcmp(buf, host) == 0) { |
Soohwan Kim |
0:6f28332c466f | 131 | *ip = addr; |
Soohwan Kim |
0:6f28332c466f | 132 | return true; |
Soohwan Kim |
0:6f28332c466f | 133 | } |
Soohwan Kim |
0:6f28332c466f | 134 | DNSClient client; |
Soohwan Kim |
0:6f28332c466f | 135 | if(client.lookup(host)) { |
Soohwan Kim |
0:6f28332c466f | 136 | *ip = client.ip; |
Soohwan Kim |
0:6f28332c466f | 137 | return true; |
Soohwan Kim |
0:6f28332c466f | 138 | } |
Soohwan Kim |
0:6f28332c466f | 139 | return false; |
Soohwan Kim |
0:6f28332c466f | 140 | } |
Soohwan Kim |
0:6f28332c466f | 141 | |
Soohwan Kim |
0:6f28332c466f | 142 | bool WIZnet_Chip::disconnect() |
Soohwan Kim |
0:6f28332c466f | 143 | { |
Soohwan Kim |
0:6f28332c466f | 144 | return true; |
Soohwan Kim |
0:6f28332c466f | 145 | } |
Soohwan Kim |
0:6f28332c466f | 146 | |
Soohwan Kim |
0:6f28332c466f | 147 | bool WIZnet_Chip::is_connected(int socket) |
Soohwan Kim |
0:6f28332c466f | 148 | { |
Soohwan Kim |
0:6f28332c466f | 149 | /* |
Soohwan Kim |
0:6f28332c466f | 150 | if (sreg<uint8_t>(socket, Sn_SR) == SOCK_ESTABLISHED) { |
Soohwan Kim |
0:6f28332c466f | 151 | return true; |
Soohwan Kim |
0:6f28332c466f | 152 | } |
Soohwan Kim |
0:6f28332c466f | 153 | */ |
Soohwan Kim |
0:6f28332c466f | 154 | uint8_t tmpSn_SR; |
Soohwan Kim |
0:6f28332c466f | 155 | tmpSn_SR = sreg<uint8_t>(socket, Sn_SR); |
Soohwan Kim |
0:6f28332c466f | 156 | // packet sending is possible, when state is SOCK_CLOSE_WAIT. |
Soohwan Kim |
0:6f28332c466f | 157 | if ((tmpSn_SR == SOCK_ESTABLISHED) || (tmpSn_SR == SOCK_CLOSE_WAIT)) { |
Soohwan Kim |
0:6f28332c466f | 158 | return true; |
Soohwan Kim |
0:6f28332c466f | 159 | } |
Soohwan Kim |
0:6f28332c466f | 160 | return false; |
Soohwan Kim |
0:6f28332c466f | 161 | } |
Soohwan Kim |
0:6f28332c466f | 162 | |
Soohwan Kim |
0:6f28332c466f | 163 | // Reset the chip & set the buffer |
Soohwan Kim |
0:6f28332c466f | 164 | void WIZnet_Chip::reset() |
Soohwan Kim |
0:6f28332c466f | 165 | { |
embeddist | 3:f8c6efc8bf83 | 166 | #if defined(USE_WIZ550IO_MAC) |
embeddist | 3:f8c6efc8bf83 | 167 | // hw reset |
Soohwan Kim |
0:6f28332c466f | 168 | reset_pin = 1; |
Soohwan Kim |
0:6f28332c466f | 169 | reset_pin = 0; |
Soohwan Kim |
0:6f28332c466f | 170 | wait_us(500); // 500us (w5500) |
Soohwan Kim |
0:6f28332c466f | 171 | reset_pin = 1; |
Soohwan Kim |
0:6f28332c466f | 172 | wait_ms(400); // 400ms (w5500) |
Soohwan Kim |
0:6f28332c466f | 173 | |
embeddist | 3:f8c6efc8bf83 | 174 | reg_rd_mac(SHAR, mac); // read the MAC address inside the modulea |
embeddist | 3:f8c6efc8bf83 | 175 | #else |
embeddist | 3:f8c6efc8bf83 | 176 | // hw reset |
embeddist | 3:f8c6efc8bf83 | 177 | reg_wr(MR, 0x80); |
embeddist | 3:f8c6efc8bf83 | 178 | wait_us(500); // 500us (w5500) |
Soohwan Kim |
0:6f28332c466f | 179 | #endif |
Soohwan Kim |
0:6f28332c466f | 180 | |
Soohwan Kim |
0:6f28332c466f | 181 | // write MAC address inside the WZTOE MAC address register |
Soohwan Kim |
0:6f28332c466f | 182 | reg_wr_mac(SHAR, mac); |
Soohwan Kim |
0:6f28332c466f | 183 | |
Soohwan Kim |
0:6f28332c466f | 184 | // set RX and TX buffer size |
Soohwan Kim |
0:6f28332c466f | 185 | #if 0 |
Soohwan Kim |
0:6f28332c466f | 186 | for (int socket = 0; socket < MAX_SOCK_NUM; socket++) { |
Soohwan Kim |
0:6f28332c466f | 187 | sreg<uint8_t>(socket, Sn_RXBUF_SIZE, 2); |
Soohwan Kim |
0:6f28332c466f | 188 | sreg<uint8_t>(socket, Sn_TXBUF_SIZE, 2); |
Soohwan Kim |
0:6f28332c466f | 189 | } |
Soohwan Kim |
0:6f28332c466f | 190 | #endif |
Soohwan Kim |
0:6f28332c466f | 191 | } |
Soohwan Kim |
0:6f28332c466f | 192 | |
Soohwan Kim |
0:6f28332c466f | 193 | |
Soohwan Kim |
0:6f28332c466f | 194 | bool WIZnet_Chip::close(int socket) |
Soohwan Kim |
0:6f28332c466f | 195 | { |
Soohwan Kim |
0:6f28332c466f | 196 | if (socket < 0) { |
Soohwan Kim |
0:6f28332c466f | 197 | return false; |
Soohwan Kim |
0:6f28332c466f | 198 | } |
Soohwan Kim |
0:6f28332c466f | 199 | // if not connected, return |
Soohwan Kim |
0:6f28332c466f | 200 | if (sreg<uint8_t>(socket, Sn_SR) == SOCK_CLOSED) { |
Soohwan Kim |
0:6f28332c466f | 201 | return true; |
Soohwan Kim |
0:6f28332c466f | 202 | } |
Soohwan Kim |
0:6f28332c466f | 203 | if (sreg<uint8_t>(socket, Sn_MR) == TCP) { |
Soohwan Kim |
0:6f28332c466f | 204 | scmd(socket, DISCON); |
Soohwan Kim |
0:6f28332c466f | 205 | } |
Soohwan Kim |
0:6f28332c466f | 206 | scmd(socket, CLOSE); |
Soohwan Kim |
0:6f28332c466f | 207 | sreg<uint8_t>(socket, Sn_IR, 0xff); |
Soohwan Kim |
0:6f28332c466f | 208 | return true; |
Soohwan Kim |
0:6f28332c466f | 209 | } |
Soohwan Kim |
0:6f28332c466f | 210 | |
Soohwan Kim |
0:6f28332c466f | 211 | int WIZnet_Chip::wait_readable(int socket, int wait_time_ms, int req_size) |
Soohwan Kim |
0:6f28332c466f | 212 | { |
Soohwan Kim |
0:6f28332c466f | 213 | if (socket < 0) { |
Soohwan Kim |
0:6f28332c466f | 214 | return -1; |
Soohwan Kim |
0:6f28332c466f | 215 | } |
Soohwan Kim |
0:6f28332c466f | 216 | Timer t; |
Soohwan Kim |
0:6f28332c466f | 217 | t.reset(); |
Soohwan Kim |
0:6f28332c466f | 218 | t.start(); |
Soohwan Kim |
0:6f28332c466f | 219 | while(1) { |
Soohwan Kim |
0:6f28332c466f | 220 | //int size = sreg<uint16_t>(socket, Sn_RX_RSR); |
Soohwan Kim |
0:6f28332c466f | 221 | // during the reading Sn_RX_RXR, it has the possible change of this register. |
Soohwan Kim |
0:6f28332c466f | 222 | // so read twice and get same value then use size information. |
Soohwan Kim |
0:6f28332c466f | 223 | int size, size2; |
Soohwan Kim |
0:6f28332c466f | 224 | do { |
Soohwan Kim |
0:6f28332c466f | 225 | size = sreg<uint16_t>(socket, Sn_RX_RSR); |
Soohwan Kim |
0:6f28332c466f | 226 | size2 = sreg<uint16_t>(socket, Sn_RX_RSR); |
Soohwan Kim |
0:6f28332c466f | 227 | } while (size != size2); |
Soohwan Kim |
0:6f28332c466f | 228 | |
Soohwan Kim |
0:6f28332c466f | 229 | if (size > req_size) { |
Soohwan Kim |
0:6f28332c466f | 230 | return size; |
Soohwan Kim |
0:6f28332c466f | 231 | } |
Soohwan Kim |
0:6f28332c466f | 232 | if (wait_time_ms != (-1) && t.read_ms() > wait_time_ms) { |
Soohwan Kim |
0:6f28332c466f | 233 | break; |
Soohwan Kim |
0:6f28332c466f | 234 | } |
Soohwan Kim |
0:6f28332c466f | 235 | } |
Soohwan Kim |
0:6f28332c466f | 236 | return -1; |
Soohwan Kim |
0:6f28332c466f | 237 | } |
Soohwan Kim |
0:6f28332c466f | 238 | |
Soohwan Kim |
0:6f28332c466f | 239 | int WIZnet_Chip::wait_writeable(int socket, int wait_time_ms, int req_size) |
Soohwan Kim |
0:6f28332c466f | 240 | { |
Soohwan Kim |
0:6f28332c466f | 241 | if (socket < 0) { |
Soohwan Kim |
0:6f28332c466f | 242 | return -1; |
Soohwan Kim |
0:6f28332c466f | 243 | } |
Soohwan Kim |
0:6f28332c466f | 244 | Timer t; |
Soohwan Kim |
0:6f28332c466f | 245 | t.reset(); |
Soohwan Kim |
0:6f28332c466f | 246 | t.start(); |
Soohwan Kim |
0:6f28332c466f | 247 | while(1) { |
Soohwan Kim |
0:6f28332c466f | 248 | //int size = sreg<uint16_t>(socket, Sn_TX_FSR); |
Soohwan Kim |
0:6f28332c466f | 249 | // during the reading Sn_TX_FSR, it has the possible change of this register. |
Soohwan Kim |
0:6f28332c466f | 250 | // so read twice and get same value then use size information. |
Soohwan Kim |
0:6f28332c466f | 251 | int size, size2; |
Soohwan Kim |
0:6f28332c466f | 252 | do { |
Soohwan Kim |
0:6f28332c466f | 253 | size = sreg<uint16_t>(socket, Sn_TX_FSR); |
Soohwan Kim |
0:6f28332c466f | 254 | size2 = sreg<uint16_t>(socket, Sn_TX_FSR); |
Soohwan Kim |
0:6f28332c466f | 255 | } while (size != size2); |
Soohwan Kim |
0:6f28332c466f | 256 | |
Soohwan Kim |
0:6f28332c466f | 257 | if (size > req_size) { |
Soohwan Kim |
0:6f28332c466f | 258 | return size; |
Soohwan Kim |
0:6f28332c466f | 259 | } |
Soohwan Kim |
0:6f28332c466f | 260 | if (wait_time_ms != (-1) && t.read_ms() > wait_time_ms) { |
Soohwan Kim |
0:6f28332c466f | 261 | break; |
Soohwan Kim |
0:6f28332c466f | 262 | } |
Soohwan Kim |
0:6f28332c466f | 263 | } |
Soohwan Kim |
0:6f28332c466f | 264 | return -1; |
Soohwan Kim |
0:6f28332c466f | 265 | } |
Soohwan Kim |
0:6f28332c466f | 266 | |
Soohwan Kim |
0:6f28332c466f | 267 | int WIZnet_Chip::send(int socket, const char * str, int len) |
Soohwan Kim |
0:6f28332c466f | 268 | { |
Soohwan Kim |
0:6f28332c466f | 269 | if (socket < 0) { |
Soohwan Kim |
0:6f28332c466f | 270 | return -1; |
Soohwan Kim |
0:6f28332c466f | 271 | } |
Soohwan Kim |
0:6f28332c466f | 272 | uint16_t ptr = sreg<uint16_t>(socket, Sn_TX_WR); |
Soohwan Kim |
0:6f28332c466f | 273 | uint8_t cntl_byte = (0x14 + (socket << 5)); |
Soohwan Kim |
0:6f28332c466f | 274 | spi_write(ptr, cntl_byte, (uint8_t*)str, len); |
Soohwan Kim |
0:6f28332c466f | 275 | sreg<uint16_t>(socket, Sn_TX_WR, ptr + len); |
Soohwan Kim |
0:6f28332c466f | 276 | scmd(socket, SEND); |
Soohwan Kim |
0:6f28332c466f | 277 | uint8_t tmp_Sn_IR; |
Soohwan Kim |
0:6f28332c466f | 278 | while (( (tmp_Sn_IR = sreg<uint8_t>(socket, Sn_IR)) & INT_SEND_OK) != INT_SEND_OK) { |
Soohwan Kim |
0:6f28332c466f | 279 | // @Jul.10, 2014 fix contant name, and udp sendto function. |
Soohwan Kim |
0:6f28332c466f | 280 | switch (sreg<uint8_t>(socket, Sn_SR)) { |
Soohwan Kim |
0:6f28332c466f | 281 | case SOCK_CLOSED : |
Soohwan Kim |
0:6f28332c466f | 282 | close(socket); |
Soohwan Kim |
0:6f28332c466f | 283 | return 0; |
Soohwan Kim |
0:6f28332c466f | 284 | //break; |
Soohwan Kim |
0:6f28332c466f | 285 | case SOCK_UDP : |
Soohwan Kim |
0:6f28332c466f | 286 | // ARP timeout is possible. |
Soohwan Kim |
0:6f28332c466f | 287 | if ((tmp_Sn_IR & INT_TIMEOUT) == INT_TIMEOUT) { |
Soohwan Kim |
0:6f28332c466f | 288 | sreg<uint8_t>(socket, Sn_IR, INT_TIMEOUT); |
Soohwan Kim |
0:6f28332c466f | 289 | return 0; |
Soohwan Kim |
0:6f28332c466f | 290 | } |
Soohwan Kim |
0:6f28332c466f | 291 | break; |
Soohwan Kim |
0:6f28332c466f | 292 | default : |
Soohwan Kim |
0:6f28332c466f | 293 | break; |
Soohwan Kim |
0:6f28332c466f | 294 | } |
Soohwan Kim |
0:6f28332c466f | 295 | } |
Soohwan Kim |
0:6f28332c466f | 296 | /* |
Soohwan Kim |
0:6f28332c466f | 297 | while ((sreg<uint8_t>(socket, Sn_IR) & INT_SEND_OK) != INT_SEND_OK) { |
Soohwan Kim |
0:6f28332c466f | 298 | if (sreg<uint8_t>(socket, Sn_SR) == CLOSED) { |
Soohwan Kim |
0:6f28332c466f | 299 | close(socket); |
Soohwan Kim |
0:6f28332c466f | 300 | return 0; |
Soohwan Kim |
0:6f28332c466f | 301 | } |
Soohwan Kim |
0:6f28332c466f | 302 | } |
Soohwan Kim |
0:6f28332c466f | 303 | */ |
Soohwan Kim |
0:6f28332c466f | 304 | sreg<uint8_t>(socket, Sn_IR, INT_SEND_OK); |
Soohwan Kim |
0:6f28332c466f | 305 | |
Soohwan Kim |
0:6f28332c466f | 306 | return len; |
Soohwan Kim |
0:6f28332c466f | 307 | } |
Soohwan Kim |
0:6f28332c466f | 308 | |
Soohwan Kim |
0:6f28332c466f | 309 | int WIZnet_Chip::recv(int socket, char* buf, int len) |
Soohwan Kim |
0:6f28332c466f | 310 | { |
Soohwan Kim |
0:6f28332c466f | 311 | if (socket < 0) { |
Soohwan Kim |
0:6f28332c466f | 312 | return -1; |
Soohwan Kim |
0:6f28332c466f | 313 | } |
Soohwan Kim |
0:6f28332c466f | 314 | uint16_t ptr = sreg<uint16_t>(socket, Sn_RX_RD); |
Soohwan Kim |
0:6f28332c466f | 315 | uint8_t cntl_byte = (0x18 + (socket << 5)); |
Soohwan Kim |
0:6f28332c466f | 316 | spi_read(ptr, cntl_byte, (uint8_t*)buf, len); |
Soohwan Kim |
0:6f28332c466f | 317 | sreg<uint16_t>(socket, Sn_RX_RD, ptr + len); |
Soohwan Kim |
0:6f28332c466f | 318 | scmd(socket, RECV); |
Soohwan Kim |
0:6f28332c466f | 319 | return len; |
Soohwan Kim |
0:6f28332c466f | 320 | } |
Soohwan Kim |
0:6f28332c466f | 321 | |
Soohwan Kim |
0:6f28332c466f | 322 | int WIZnet_Chip::new_socket() |
Soohwan Kim |
0:6f28332c466f | 323 | { |
Soohwan Kim |
0:6f28332c466f | 324 | for(int s = 0; s < MAX_SOCK_NUM; s++) { |
Soohwan Kim |
0:6f28332c466f | 325 | if (sreg<uint8_t>(s, Sn_SR) == SOCK_CLOSED) { |
Soohwan Kim |
0:6f28332c466f | 326 | return s; |
Soohwan Kim |
0:6f28332c466f | 327 | } |
Soohwan Kim |
0:6f28332c466f | 328 | } |
Soohwan Kim |
0:6f28332c466f | 329 | return -1; |
Soohwan Kim |
0:6f28332c466f | 330 | } |
Soohwan Kim |
0:6f28332c466f | 331 | |
Soohwan Kim |
0:6f28332c466f | 332 | uint16_t WIZnet_Chip::new_port() |
Soohwan Kim |
0:6f28332c466f | 333 | { |
Soohwan Kim |
0:6f28332c466f | 334 | uint16_t port = rand(); |
Soohwan Kim |
0:6f28332c466f | 335 | port |= 49152; |
Soohwan Kim |
0:6f28332c466f | 336 | return port; |
Soohwan Kim |
0:6f28332c466f | 337 | } |
Soohwan Kim |
0:6f28332c466f | 338 | |
Soohwan Kim |
0:6f28332c466f | 339 | void WIZnet_Chip::scmd(int socket, Command cmd) |
Soohwan Kim |
0:6f28332c466f | 340 | { |
Soohwan Kim |
0:6f28332c466f | 341 | sreg<uint8_t>(socket, Sn_CR, cmd); |
Soohwan Kim |
0:6f28332c466f | 342 | while(sreg<uint8_t>(socket, Sn_CR)); |
Soohwan Kim |
0:6f28332c466f | 343 | } |
Soohwan Kim |
0:6f28332c466f | 344 | |
Soohwan Kim |
0:6f28332c466f | 345 | void WIZnet_Chip::spi_write(uint16_t addr, uint8_t cb, const uint8_t *buf, uint16_t len) |
Soohwan Kim |
0:6f28332c466f | 346 | { |
Soohwan Kim |
0:6f28332c466f | 347 | cs = 0; |
Soohwan Kim |
0:6f28332c466f | 348 | spi->write(addr >> 8); |
Soohwan Kim |
0:6f28332c466f | 349 | spi->write(addr & 0xff); |
Soohwan Kim |
0:6f28332c466f | 350 | spi->write(cb); |
Soohwan Kim |
0:6f28332c466f | 351 | for(int i = 0; i < len; i++) { |
Soohwan Kim |
0:6f28332c466f | 352 | spi->write(buf[i]); |
Soohwan Kim |
0:6f28332c466f | 353 | } |
Soohwan Kim |
0:6f28332c466f | 354 | cs = 1; |
Soohwan Kim |
0:6f28332c466f | 355 | |
Soohwan Kim |
0:6f28332c466f | 356 | #if DBG_SPI |
Soohwan Kim |
0:6f28332c466f | 357 | debug("[SPI]W %04x(%02x %d)", addr, cb, len); |
Soohwan Kim |
0:6f28332c466f | 358 | for(int i = 0; i < len; i++) { |
Soohwan Kim |
0:6f28332c466f | 359 | debug(" %02x", buf[i]); |
Soohwan Kim |
0:6f28332c466f | 360 | if (i > 16) { |
Soohwan Kim |
0:6f28332c466f | 361 | debug(" ..."); |
Soohwan Kim |
0:6f28332c466f | 362 | break; |
Soohwan Kim |
0:6f28332c466f | 363 | } |
Soohwan Kim |
0:6f28332c466f | 364 | } |
Soohwan Kim |
0:6f28332c466f | 365 | debug("\r\n"); |
Soohwan Kim |
0:6f28332c466f | 366 | #endif |
Soohwan Kim |
0:6f28332c466f | 367 | } |
Soohwan Kim |
0:6f28332c466f | 368 | |
Soohwan Kim |
0:6f28332c466f | 369 | void WIZnet_Chip::spi_read(uint16_t addr, uint8_t cb, uint8_t *buf, uint16_t len) |
Soohwan Kim |
0:6f28332c466f | 370 | { |
Soohwan Kim |
0:6f28332c466f | 371 | cs = 0; |
Soohwan Kim |
0:6f28332c466f | 372 | spi->write(addr >> 8); |
Soohwan Kim |
0:6f28332c466f | 373 | spi->write(addr & 0xff); |
Soohwan Kim |
0:6f28332c466f | 374 | spi->write(cb); |
Soohwan Kim |
0:6f28332c466f | 375 | for(int i = 0; i < len; i++) { |
Soohwan Kim |
0:6f28332c466f | 376 | buf[i] = spi->write(0); |
Soohwan Kim |
0:6f28332c466f | 377 | } |
Soohwan Kim |
0:6f28332c466f | 378 | cs = 1; |
Soohwan Kim |
0:6f28332c466f | 379 | |
Soohwan Kim |
0:6f28332c466f | 380 | #if DBG_SPI |
Soohwan Kim |
0:6f28332c466f | 381 | debug("[SPI]R %04x(%02x %d)", addr, cb, len); |
Soohwan Kim |
0:6f28332c466f | 382 | for(int i = 0; i < len; i++) { |
Soohwan Kim |
0:6f28332c466f | 383 | debug(" %02x", buf[i]); |
Soohwan Kim |
0:6f28332c466f | 384 | if (i > 16) { |
Soohwan Kim |
0:6f28332c466f | 385 | debug(" ..."); |
Soohwan Kim |
0:6f28332c466f | 386 | break; |
Soohwan Kim |
0:6f28332c466f | 387 | } |
Soohwan Kim |
0:6f28332c466f | 388 | } |
Soohwan Kim |
0:6f28332c466f | 389 | debug("\r\n"); |
Soohwan Kim |
0:6f28332c466f | 390 | if ((addr&0xf0ff)==0x4026 || (addr&0xf0ff)==0x4003) { |
Soohwan Kim |
0:6f28332c466f | 391 | wait_ms(200); |
Soohwan Kim |
0:6f28332c466f | 392 | } |
Soohwan Kim |
0:6f28332c466f | 393 | #endif |
Soohwan Kim |
0:6f28332c466f | 394 | } |
Soohwan Kim |
0:6f28332c466f | 395 | |
Soohwan Kim |
0:6f28332c466f | 396 | uint32_t str_to_ip(const char* str) |
Soohwan Kim |
0:6f28332c466f | 397 | { |
Soohwan Kim |
0:6f28332c466f | 398 | uint32_t ip = 0; |
Soohwan Kim |
0:6f28332c466f | 399 | char* p = (char*)str; |
Soohwan Kim |
0:6f28332c466f | 400 | for(int i = 0; i < 4; i++) { |
Soohwan Kim |
0:6f28332c466f | 401 | ip |= atoi(p); |
Soohwan Kim |
0:6f28332c466f | 402 | p = strchr(p, '.'); |
Soohwan Kim |
0:6f28332c466f | 403 | if (p == NULL) { |
Soohwan Kim |
0:6f28332c466f | 404 | break; |
Soohwan Kim |
0:6f28332c466f | 405 | } |
Soohwan Kim |
0:6f28332c466f | 406 | ip <<= 8; |
Soohwan Kim |
0:6f28332c466f | 407 | p++; |
Soohwan Kim |
0:6f28332c466f | 408 | } |
Soohwan Kim |
0:6f28332c466f | 409 | return ip; |
Soohwan Kim |
0:6f28332c466f | 410 | } |
Soohwan Kim |
0:6f28332c466f | 411 | |
Soohwan Kim |
0:6f28332c466f | 412 | void printfBytes(char* str, uint8_t* buf, int len) |
Soohwan Kim |
0:6f28332c466f | 413 | { |
Soohwan Kim |
0:6f28332c466f | 414 | printf("%s %d:", str, len); |
Soohwan Kim |
0:6f28332c466f | 415 | for(int i = 0; i < len; i++) { |
Soohwan Kim |
0:6f28332c466f | 416 | printf(" %02x", buf[i]); |
Soohwan Kim |
0:6f28332c466f | 417 | } |
Soohwan Kim |
0:6f28332c466f | 418 | printf("\n"); |
Soohwan Kim |
0:6f28332c466f | 419 | } |
Soohwan Kim |
0:6f28332c466f | 420 | |
Soohwan Kim |
0:6f28332c466f | 421 | void printHex(uint8_t* buf, int len) |
Soohwan Kim |
0:6f28332c466f | 422 | { |
Soohwan Kim |
0:6f28332c466f | 423 | for(int i = 0; i < len; i++) { |
Soohwan Kim |
0:6f28332c466f | 424 | if ((i%16) == 0) { |
Soohwan Kim |
0:6f28332c466f | 425 | printf("%p", buf+i); |
Soohwan Kim |
0:6f28332c466f | 426 | } |
Soohwan Kim |
0:6f28332c466f | 427 | printf(" %02x", buf[i]); |
Soohwan Kim |
0:6f28332c466f | 428 | if ((i%16) == 15) { |
Soohwan Kim |
0:6f28332c466f | 429 | printf("\n"); |
Soohwan Kim |
0:6f28332c466f | 430 | } |
Soohwan Kim |
0:6f28332c466f | 431 | } |
Soohwan Kim |
0:6f28332c466f | 432 | printf("\n"); |
Soohwan Kim |
0:6f28332c466f | 433 | } |
Soohwan Kim |
0:6f28332c466f | 434 | |
Soohwan Kim |
0:6f28332c466f | 435 | void debug_hex(uint8_t* buf, int len) |
Soohwan Kim |
0:6f28332c466f | 436 | { |
Soohwan Kim |
0:6f28332c466f | 437 | for(int i = 0; i < len; i++) { |
Soohwan Kim |
0:6f28332c466f | 438 | if ((i%16) == 0) { |
Soohwan Kim |
0:6f28332c466f | 439 | debug("%p", buf+i); |
Soohwan Kim |
0:6f28332c466f | 440 | } |
Soohwan Kim |
0:6f28332c466f | 441 | debug(" %02x", buf[i]); |
Soohwan Kim |
0:6f28332c466f | 442 | if ((i%16) == 15) { |
Soohwan Kim |
0:6f28332c466f | 443 | debug("\n"); |
Soohwan Kim |
0:6f28332c466f | 444 | } |
Soohwan Kim |
0:6f28332c466f | 445 | } |
Soohwan Kim |
0:6f28332c466f | 446 | debug("\n"); |
Soohwan Kim |
0:6f28332c466f | 447 | } |
Soohwan Kim |
0:6f28332c466f | 448 | |
Soohwan Kim |
0:6f28332c466f | 449 | #endif |
embeddist | 3:f8c6efc8bf83 | 450 |