Added RAW sockets.

Fork of WIZnetInterface by WIZnet

Committer:
Soohwan Kim
Date:
Mon Jun 15 11:18:37 2015 +0900
Revision:
0:6f28332c466f
Child:
8:4c02de1dbf3a
initial version

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 #pragma once
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
Soohwan Kim 0:6f28332c466f 24 #define TEST_ASSERT(A) while(!(A)){debug("\n\n%s@%d %s ASSERT!\n\n",__PRETTY_FUNCTION__,__LINE__,#A);exit(1);};
Soohwan Kim 0:6f28332c466f 25
Soohwan Kim 0:6f28332c466f 26 #define DEFAULT_WAIT_RESP_TIMEOUT 500
Soohwan Kim 0:6f28332c466f 27
Soohwan Kim 0:6f28332c466f 28
Soohwan Kim 0:6f28332c466f 29 #define MAX_SOCK_NUM 8
Soohwan Kim 0:6f28332c466f 30
Soohwan Kim 0:6f28332c466f 31 // Peripheral base address
Soohwan Kim 0:6f28332c466f 32 #define W7500x_WZTOE_BASE (0x46000000)
Soohwan Kim 0:6f28332c466f 33 #define W7500x_TXMEM_BASE (W7500x_WZTOE_BASE + 0x00020000)
Soohwan Kim 0:6f28332c466f 34 #define W7500x_RXMEM_BASE (W7500x_WZTOE_BASE + 0x00030000)
Soohwan Kim 0:6f28332c466f 35 // Common register
Soohwan Kim 0:6f28332c466f 36 #define MR (0x2300)
Soohwan Kim 0:6f28332c466f 37 #define GAR (0x6008)
Soohwan Kim 0:6f28332c466f 38 #define SUBR (0x600C)
Soohwan Kim 0:6f28332c466f 39 #define SHAR (0x6000)
Soohwan Kim 0:6f28332c466f 40 #define SIPR (0x6010)
Soohwan Kim 0:6f28332c466f 41 //#define PHYSTATUS 0x0035 //not support in W7500
Soohwan Kim 0:6f28332c466f 42 // Added Common register @W7500
Soohwan Kim 0:6f28332c466f 43 #define TIC100US (0x2000)
Soohwan Kim 0:6f28332c466f 44
Soohwan Kim 0:6f28332c466f 45 // Socket register
Soohwan Kim 0:6f28332c466f 46 #define Sn_MR (0x0000)
Soohwan Kim 0:6f28332c466f 47 #define Sn_CR (0x0010)
Soohwan Kim 0:6f28332c466f 48 #define Sn_IR (0x0020) //--Sn_ISR
Soohwan Kim 0:6f28332c466f 49 #define Sn_SR (0x0030)
Soohwan Kim 0:6f28332c466f 50 #define Sn_PORT (0x0114)
Soohwan Kim 0:6f28332c466f 51 #define Sn_DIPR (0x0124)
Soohwan Kim 0:6f28332c466f 52 #define Sn_DPORT (0x0120)
Soohwan Kim 0:6f28332c466f 53 #define Sn_RXBUF_SIZE (0x0200)
Soohwan Kim 0:6f28332c466f 54 #define Sn_TXBUF_SIZE (0x0220)
Soohwan Kim 0:6f28332c466f 55 #define Sn_TX_FSR (0x0204)
Soohwan Kim 0:6f28332c466f 56 #define Sn_TX_WR (0x020C)
Soohwan Kim 0:6f28332c466f 57 #define Sn_RX_RSR (0x0224)
Soohwan Kim 0:6f28332c466f 58 #define Sn_RX_RD (0x0228)
Soohwan Kim 0:6f28332c466f 59 // added Socket register @W7500
Soohwan Kim 0:6f28332c466f 60 #define Sn_ICR (0x0028)
Soohwan Kim 0:6f28332c466f 61 enum PHYMode {
Soohwan Kim 0:6f28332c466f 62 AutoNegotiate = 0,
Soohwan Kim 0:6f28332c466f 63 HalfDuplex10 = 1,
Soohwan Kim 0:6f28332c466f 64 FullDuplex10 = 2,
Soohwan Kim 0:6f28332c466f 65 HalfDuplex100 = 3,
Soohwan Kim 0:6f28332c466f 66 FullDuplex100 = 4,
Soohwan Kim 0:6f28332c466f 67 };
Soohwan Kim 0:6f28332c466f 68
Soohwan Kim 0:6f28332c466f 69 //bool plink(int wait_time_ms= 3*1000);
Soohwan Kim 0:6f28332c466f 70
Soohwan Kim 0:6f28332c466f 71 class WIZnet_Chip {
Soohwan Kim 0:6f28332c466f 72 public:
Soohwan Kim 0:6f28332c466f 73 enum Protocol {
Soohwan Kim 0:6f28332c466f 74 CLOSED = 0,
Soohwan Kim 0:6f28332c466f 75 TCP = 1,
Soohwan Kim 0:6f28332c466f 76 UDP = 2,
Soohwan Kim 0:6f28332c466f 77 };
Soohwan Kim 0:6f28332c466f 78
Soohwan Kim 0:6f28332c466f 79 enum Command {
Soohwan Kim 0:6f28332c466f 80 OPEN = 0x01,
Soohwan Kim 0:6f28332c466f 81 LISTEN = 0x02,
Soohwan Kim 0:6f28332c466f 82 CONNECT = 0x04,
Soohwan Kim 0:6f28332c466f 83 DISCON = 0x08,
Soohwan Kim 0:6f28332c466f 84 CLOSE = 0x10,
Soohwan Kim 0:6f28332c466f 85 SEND = 0x20,
Soohwan Kim 0:6f28332c466f 86 SEND_MAC = 0x21,
Soohwan Kim 0:6f28332c466f 87 SEND_KEEP = 0x22,
Soohwan Kim 0:6f28332c466f 88 RECV = 0x40,
Soohwan Kim 0:6f28332c466f 89
Soohwan Kim 0:6f28332c466f 90 };
Soohwan Kim 0:6f28332c466f 91
Soohwan Kim 0:6f28332c466f 92 enum Interrupt {
Soohwan Kim 0:6f28332c466f 93 INT_CON = 0x01,
Soohwan Kim 0:6f28332c466f 94 INT_DISCON = 0x02,
Soohwan Kim 0:6f28332c466f 95 INT_RECV = 0x04,
Soohwan Kim 0:6f28332c466f 96 INT_TIMEOUT = 0x08,
Soohwan Kim 0:6f28332c466f 97 INT_SEND_OK = 0x10,
Soohwan Kim 0:6f28332c466f 98 };
Soohwan Kim 0:6f28332c466f 99 enum Status {
Soohwan Kim 0:6f28332c466f 100 SOCK_CLOSED = 0x00,
Soohwan Kim 0:6f28332c466f 101 SOCK_INIT = 0x13,
Soohwan Kim 0:6f28332c466f 102 SOCK_LISTEN = 0x14,
Soohwan Kim 0:6f28332c466f 103 SOCK_SYNSENT = 0x15,
Soohwan Kim 0:6f28332c466f 104 SOCK_ESTABLISHED = 0x17,
Soohwan Kim 0:6f28332c466f 105 SOCK_CLOSE_WAIT = 0x1c,
Soohwan Kim 0:6f28332c466f 106 SOCK_UDP = 0x22,
Soohwan Kim 0:6f28332c466f 107 };
Soohwan Kim 0:6f28332c466f 108 enum Mode {
Soohwan Kim 0:6f28332c466f 109 MR_RST = 0x80,
Soohwan Kim 0:6f28332c466f 110 MR_WOL = 0x20,
Soohwan Kim 0:6f28332c466f 111 MR_PB = 0x10,
Soohwan Kim 0:6f28332c466f 112 MR_FARP = 0x02,
Soohwan Kim 0:6f28332c466f 113 };
Soohwan Kim 0:6f28332c466f 114
Soohwan Kim 0:6f28332c466f 115 WIZnet_Chip();
Soohwan Kim 0:6f28332c466f 116
Soohwan Kim 0:6f28332c466f 117 /*
Soohwan Kim 0:6f28332c466f 118 * Connect the W7500 WZTOE to the ssid contained in the constructor.
Soohwan Kim 0:6f28332c466f 119 *
Soohwan Kim 0:6f28332c466f 120 * @return true if connected, false otherwise
Soohwan Kim 0:6f28332c466f 121 */
Soohwan Kim 0:6f28332c466f 122 bool setip();
Soohwan Kim 0:6f28332c466f 123
Soohwan Kim 0:6f28332c466f 124
Soohwan Kim 0:6f28332c466f 125 /*
Soohwan Kim 0:6f28332c466f 126 * Open a tcp connection with the specified host on the specified port
Soohwan Kim 0:6f28332c466f 127 *
Soohwan Kim 0:6f28332c466f 128 * @param host host (can be either an ip address or a name. If a name is provided, a dns request will be established)
Soohwan Kim 0:6f28332c466f 129 * @param port port
Soohwan Kim 0:6f28332c466f 130 * @ returns true if successful
Soohwan Kim 0:6f28332c466f 131 */
Soohwan Kim 0:6f28332c466f 132 bool connect(int socket, const char * host, int port, int timeout_ms = 10*1000);
Soohwan Kim 0:6f28332c466f 133
Soohwan Kim 0:6f28332c466f 134 /*
Soohwan Kim 0:6f28332c466f 135 * Set the protocol (UDP or TCP)
Soohwan Kim 0:6f28332c466f 136 *
Soohwan Kim 0:6f28332c466f 137 * @param p protocol
Soohwan Kim 0:6f28332c466f 138 * @ returns true if successful
Soohwan Kim 0:6f28332c466f 139 */
Soohwan Kim 0:6f28332c466f 140 bool setProtocol(int socket, Protocol p);
Soohwan Kim 0:6f28332c466f 141
Soohwan Kim 0:6f28332c466f 142 /*
Soohwan Kim 0:6f28332c466f 143 * Reset the W7500 WZTOE
Soohwan Kim 0:6f28332c466f 144 */
Soohwan Kim 0:6f28332c466f 145 void reset();
Soohwan Kim 0:6f28332c466f 146
Soohwan Kim 0:6f28332c466f 147 int wait_readable(int socket, int wait_time_ms, int req_size = 0);
Soohwan Kim 0:6f28332c466f 148
Soohwan Kim 0:6f28332c466f 149 int wait_writeable(int socket, int wait_time_ms, int req_size = 0);
Soohwan Kim 0:6f28332c466f 150
Soohwan Kim 0:6f28332c466f 151 /*
Soohwan Kim 0:6f28332c466f 152 * Check if an ethernet link is pressent or not.
Soohwan Kim 0:6f28332c466f 153 *
Soohwan Kim 0:6f28332c466f 154 * @returns true if successful
Soohwan Kim 0:6f28332c466f 155 */
Soohwan Kim 0:6f28332c466f 156 bool link(int wait_time_ms= 3*1000);
Soohwan Kim 0:6f28332c466f 157
Soohwan Kim 0:6f28332c466f 158 /*
Soohwan Kim 0:6f28332c466f 159 * Sets the speed and duplex parameters of an ethernet link.
Soohwan Kim 0:6f28332c466f 160 *
Soohwan Kim 0:6f28332c466f 161 * @returns true if successful
Soohwan Kim 0:6f28332c466f 162 */
Soohwan Kim 0:6f28332c466f 163 void set_link(PHYMode phymode);
Soohwan Kim 0:6f28332c466f 164
Soohwan Kim 0:6f28332c466f 165 /*
Soohwan Kim 0:6f28332c466f 166 * Check if a tcp link is active
Soohwan Kim 0:6f28332c466f 167 *
Soohwan Kim 0:6f28332c466f 168 * @returns true if successful
Soohwan Kim 0:6f28332c466f 169 */
Soohwan Kim 0:6f28332c466f 170 bool is_connected(int socket);
Soohwan Kim 0:6f28332c466f 171
Soohwan Kim 0:6f28332c466f 172 /*
Soohwan Kim 0:6f28332c466f 173 * Close a tcp connection
Soohwan Kim 0:6f28332c466f 174 *
Soohwan Kim 0:6f28332c466f 175 * @ returns true if successful
Soohwan Kim 0:6f28332c466f 176 */
Soohwan Kim 0:6f28332c466f 177 bool close(int socket);
Soohwan Kim 0:6f28332c466f 178
Soohwan Kim 0:6f28332c466f 179 /*
Soohwan Kim 0:6f28332c466f 180 * @param str string to be sent
Soohwan Kim 0:6f28332c466f 181 * @param len string length
Soohwan Kim 0:6f28332c466f 182 */
Soohwan Kim 0:6f28332c466f 183 int send(int socket, const char * str, int len);
Soohwan Kim 0:6f28332c466f 184
Soohwan Kim 0:6f28332c466f 185 int recv(int socket, char* buf, int len);
Soohwan Kim 0:6f28332c466f 186
Soohwan Kim 0:6f28332c466f 187 /*
Soohwan Kim 0:6f28332c466f 188 * Return true if the module is using dhcp
Soohwan Kim 0:6f28332c466f 189 *
Soohwan Kim 0:6f28332c466f 190 * @returns true if the module is using dhcp
Soohwan Kim 0:6f28332c466f 191 */
Soohwan Kim 0:6f28332c466f 192 bool isDHCP() {
Soohwan Kim 0:6f28332c466f 193 return dhcp;
Soohwan Kim 0:6f28332c466f 194 }
Soohwan Kim 0:6f28332c466f 195
Soohwan Kim 0:6f28332c466f 196 bool gethostbyname(const char* host, uint32_t* ip);
Soohwan Kim 0:6f28332c466f 197
Soohwan Kim 0:6f28332c466f 198 static WIZnet_Chip * getInstance() {
Soohwan Kim 0:6f28332c466f 199 return inst;
Soohwan Kim 0:6f28332c466f 200 };
Soohwan Kim 0:6f28332c466f 201
Soohwan Kim 0:6f28332c466f 202 int new_socket();
Soohwan Kim 0:6f28332c466f 203 uint16_t new_port();
Soohwan Kim 0:6f28332c466f 204
Soohwan Kim 0:6f28332c466f 205 void scmd(int socket, Command cmd);
Soohwan Kim 0:6f28332c466f 206
Soohwan Kim 0:6f28332c466f 207 template<typename T>
Soohwan Kim 0:6f28332c466f 208 void sreg(int socket, uint16_t addr, T data) {
Soohwan Kim 0:6f28332c466f 209 reg_wr<T>(addr, (uint8_t)(0x01+(socket<<2)), data);
Soohwan Kim 0:6f28332c466f 210 }
Soohwan Kim 0:6f28332c466f 211
Soohwan Kim 0:6f28332c466f 212 template<typename T>
Soohwan Kim 0:6f28332c466f 213 T sreg(int socket, uint16_t addr) {
Soohwan Kim 0:6f28332c466f 214 return reg_rd<T>(addr, (uint8_t)(0x01+(socket<<2)));
Soohwan Kim 0:6f28332c466f 215 }
Soohwan Kim 0:6f28332c466f 216
Soohwan Kim 0:6f28332c466f 217 template<typename T>
Soohwan Kim 0:6f28332c466f 218 void reg_wr(uint16_t addr, T data) {
Soohwan Kim 0:6f28332c466f 219 return reg_wr(addr, 0x00, data);
Soohwan Kim 0:6f28332c466f 220 }
Soohwan Kim 0:6f28332c466f 221
Soohwan Kim 0:6f28332c466f 222 template<typename T>
Soohwan Kim 0:6f28332c466f 223 void reg_wr(uint16_t addr, uint8_t cb, T data) {
Soohwan Kim 0:6f28332c466f 224 uint8_t buf[sizeof(T)];
Soohwan Kim 0:6f28332c466f 225 *reinterpret_cast<T*>(buf) = data;
Soohwan Kim 0:6f28332c466f 226 /*
Soohwan Kim 0:6f28332c466f 227 for(int i = 0; i < sizeof(buf)/2; i++) { // Little Endian to Big Endian
Soohwan Kim 0:6f28332c466f 228 uint8_t t = buf[i];
Soohwan Kim 0:6f28332c466f 229 buf[i] = buf[sizeof(buf)-1-i];
Soohwan Kim 0:6f28332c466f 230 buf[sizeof(buf)-1-i] = t;
Soohwan Kim 0:6f28332c466f 231 }
Soohwan Kim 0:6f28332c466f 232 */
Soohwan Kim 0:6f28332c466f 233 for(int i = 0; i < sizeof(buf); i++) { // Little Endian to Big Endian
Soohwan Kim 0:6f28332c466f 234 *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)((cb<<16)+addr)+i) = buf[i];
Soohwan Kim 0:6f28332c466f 235 }
Soohwan Kim 0:6f28332c466f 236 }
Soohwan Kim 0:6f28332c466f 237
Soohwan Kim 0:6f28332c466f 238 template<typename T>
Soohwan Kim 0:6f28332c466f 239 T reg_rd(uint16_t addr) {
Soohwan Kim 0:6f28332c466f 240 return reg_rd<T>(addr, (uint8_t)(0x00));
Soohwan Kim 0:6f28332c466f 241 }
Soohwan Kim 0:6f28332c466f 242
Soohwan Kim 0:6f28332c466f 243 template<typename T>
Soohwan Kim 0:6f28332c466f 244 T reg_rd(uint16_t addr, uint8_t cb) {
Soohwan Kim 0:6f28332c466f 245 uint8_t buf[sizeof(T)];
Soohwan Kim 0:6f28332c466f 246 for(int i = 0; i < sizeof(buf); i++) { // Little Endian to Big Endian
Soohwan Kim 0:6f28332c466f 247 buf[i] = *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)((cb<<16)+addr)+i);
Soohwan Kim 0:6f28332c466f 248 }
Soohwan Kim 0:6f28332c466f 249 /*
Soohwan Kim 0:6f28332c466f 250 for(int i = 0; i < sizeof(buf)/2; i++) { // Big Endian to Little Endian
Soohwan Kim 0:6f28332c466f 251 uint8_t t = buf[i];
Soohwan Kim 0:6f28332c466f 252 buf[i] = buf[sizeof(buf)-1-i];
Soohwan Kim 0:6f28332c466f 253 buf[sizeof(buf)-1-i] = t;
Soohwan Kim 0:6f28332c466f 254 }
Soohwan Kim 0:6f28332c466f 255 */
Soohwan Kim 0:6f28332c466f 256 return *reinterpret_cast<T*>(buf);
Soohwan Kim 0:6f28332c466f 257 }
Soohwan Kim 0:6f28332c466f 258
Soohwan Kim 0:6f28332c466f 259 void reg_rd_mac(uint16_t addr, uint8_t* data) {
Soohwan Kim 0:6f28332c466f 260 data[0] = *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+3));
Soohwan Kim 0:6f28332c466f 261 data[1] = *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+2));
Soohwan Kim 0:6f28332c466f 262 data[2] = *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+1));
Soohwan Kim 0:6f28332c466f 263 data[3] = *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+0));
Soohwan Kim 0:6f28332c466f 264 data[4] = *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+7));
Soohwan Kim 0:6f28332c466f 265 data[5] = *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+6));
Soohwan Kim 0:6f28332c466f 266 }
Soohwan Kim 0:6f28332c466f 267
Soohwan Kim 0:6f28332c466f 268 void reg_wr_ip(uint16_t addr, uint8_t cb, const char* ip) {
Soohwan Kim 0:6f28332c466f 269 uint8_t buf[4];
Soohwan Kim 0:6f28332c466f 270 uint32_t wr_ip = 0;
Soohwan Kim 0:6f28332c466f 271 char* p = (char*)ip;
Soohwan Kim 0:6f28332c466f 272 for(int i = 0; i < 4; i++) {
Soohwan Kim 0:6f28332c466f 273 wr_ip = (wr_ip<<8);
Soohwan Kim 0:6f28332c466f 274 buf[i] = atoi(p);
Soohwan Kim 0:6f28332c466f 275 wr_ip |= buf[i];
Soohwan Kim 0:6f28332c466f 276 p = strchr(p, '.');
Soohwan Kim 0:6f28332c466f 277 if (p == NULL) break;
Soohwan Kim 0:6f28332c466f 278 p++;
Soohwan Kim 0:6f28332c466f 279 }
Soohwan Kim 0:6f28332c466f 280 *(volatile uint32_t *)(W7500x_WZTOE_BASE + (uint32_t)((cb<<16)+addr)) = wr_ip;
Soohwan Kim 0:6f28332c466f 281 }
Soohwan Kim 0:6f28332c466f 282
Soohwan Kim 0:6f28332c466f 283 void sreg_ip(int socket, uint16_t addr, const char* ip) {
Soohwan Kim 0:6f28332c466f 284 reg_wr_ip(addr, (uint8_t)(0x01+(socket<<2)), ip);
Soohwan Kim 0:6f28332c466f 285 }
Soohwan Kim 0:6f28332c466f 286
Soohwan Kim 0:6f28332c466f 287 protected:
Soohwan Kim 0:6f28332c466f 288 uint8_t mac[6];
Soohwan Kim 0:6f28332c466f 289 uint32_t ip;
Soohwan Kim 0:6f28332c466f 290 uint32_t netmask;
Soohwan Kim 0:6f28332c466f 291 uint32_t gateway;
Soohwan Kim 0:6f28332c466f 292 uint32_t dnsaddr;
Soohwan Kim 0:6f28332c466f 293 bool dhcp;
Soohwan Kim 0:6f28332c466f 294
Soohwan Kim 0:6f28332c466f 295 static WIZnet_Chip* inst;
Soohwan Kim 0:6f28332c466f 296
Soohwan Kim 0:6f28332c466f 297 void reg_wr_mac(uint16_t addr, uint8_t* data) {
Soohwan Kim 0:6f28332c466f 298 *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+3)) = data[0] ;
Soohwan Kim 0:6f28332c466f 299 *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+2)) = data[1] ;
Soohwan Kim 0:6f28332c466f 300 *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+1)) = data[2] ;
Soohwan Kim 0:6f28332c466f 301 *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+0)) = data[3] ;
Soohwan Kim 0:6f28332c466f 302 *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+7)) = data[4] ;
Soohwan Kim 0:6f28332c466f 303 *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+6)) = data[5] ;
Soohwan Kim 0:6f28332c466f 304 }
Soohwan Kim 0:6f28332c466f 305 };
Soohwan Kim 0:6f28332c466f 306 extern int ethernet_link(void);
Soohwan Kim 0:6f28332c466f 307 extern void ethernet_set_link(int speed, int duplex);
Soohwan Kim 0:6f28332c466f 308
Soohwan Kim 0:6f28332c466f 309 extern uint32_t str_to_ip(const char* str);
Soohwan Kim 0:6f28332c466f 310 extern void printfBytes(char* str, uint8_t* buf, int len);
Soohwan Kim 0:6f28332c466f 311 extern void printHex(uint8_t* buf, int len);
Soohwan Kim 0:6f28332c466f 312 extern void debug_hex(uint8_t* buf, int len);