W5500 driver for mbed OS 5

Dependents:   http-webserver-example mbed-os-example-sockets

Fork of W5500Interface by Sergei G

Committer:
Bongjun
Date:
Fri Aug 10 04:22:24 2018 +0000
Revision:
8:c71c66d43703
Parent:
6:e2ab76b2be07
Child:
17:60f75e78f35d
add some defines related to SPI port name

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Bongjun 6:e2ab76b2be07 1 // modified 08/08/2018 by Bongjun Hur
dgriffin65 0:77e050d1fb12 2
dgriffin65 0:77e050d1fb12 3 #pragma once
dgriffin65 0:77e050d1fb12 4
dgriffin65 0:77e050d1fb12 5 #include "mbed.h"
dgriffin65 0:77e050d1fb12 6 #include "mbed_debug.h"
dgriffin65 0:77e050d1fb12 7
dgriffin65 0:77e050d1fb12 8 #define TEST_ASSERT(A) while(!(A)){debug("\n\n%s@%d %s ASSERT!\n\n",__PRETTY_FUNCTION__,__LINE__,#A);exit(1);};
dgriffin65 0:77e050d1fb12 9
dgriffin65 0:77e050d1fb12 10 #define DEFAULT_WAIT_RESP_TIMEOUT 500
dgriffin65 0:77e050d1fb12 11
dgriffin65 0:77e050d1fb12 12 enum Protocol {
dgriffin65 0:77e050d1fb12 13 CLOSED = 0,
dgriffin65 0:77e050d1fb12 14 TCP = 1,
dgriffin65 0:77e050d1fb12 15 UDP = 2,
dgriffin65 0:77e050d1fb12 16 };
dgriffin65 0:77e050d1fb12 17
dgriffin65 0:77e050d1fb12 18 enum Command {
dgriffin65 0:77e050d1fb12 19 OPEN = 0x01,
dgriffin65 0:77e050d1fb12 20 LISTEN = 0x02,
dgriffin65 0:77e050d1fb12 21 CONNECT = 0x04,
dgriffin65 0:77e050d1fb12 22 DISCON = 0x08,
dgriffin65 0:77e050d1fb12 23 CLOSE = 0x10,
dgriffin65 0:77e050d1fb12 24 SEND = 0x20,
dgriffin65 0:77e050d1fb12 25 SEND_MAC = 0x21,
dgriffin65 0:77e050d1fb12 26 SEND_KEEP = 0x22,
dgriffin65 0:77e050d1fb12 27 RECV = 0x40,
dgriffin65 0:77e050d1fb12 28
dgriffin65 0:77e050d1fb12 29 };
dgriffin65 0:77e050d1fb12 30
dgriffin65 0:77e050d1fb12 31 enum Interrupt {
dgriffin65 0:77e050d1fb12 32 INT_CON = 0x01,
dgriffin65 0:77e050d1fb12 33 INT_DISCON = 0x02,
dgriffin65 0:77e050d1fb12 34 INT_RECV = 0x04,
dgriffin65 0:77e050d1fb12 35 INT_TIMEOUT = 0x08,
dgriffin65 0:77e050d1fb12 36 INT_SEND_OK = 0x10,
dgriffin65 0:77e050d1fb12 37 };
dgriffin65 0:77e050d1fb12 38
dgriffin65 0:77e050d1fb12 39 enum Status {
dgriffin65 0:77e050d1fb12 40 SOCK_CLOSED = 0x00,
dgriffin65 0:77e050d1fb12 41 SOCK_INIT = 0x13,
dgriffin65 0:77e050d1fb12 42 SOCK_LISTEN = 0x14,
dgriffin65 0:77e050d1fb12 43 SOCK_SYNSENT = 0x15,
dgriffin65 0:77e050d1fb12 44 SOCK_ESTABLISHED = 0x17,
dgriffin65 0:77e050d1fb12 45 SOCK_CLOSE_WAIT = 0x1c,
dgriffin65 0:77e050d1fb12 46 SOCK_UDP = 0x22,
dgriffin65 0:77e050d1fb12 47 };
dgriffin65 0:77e050d1fb12 48
dgriffin65 0:77e050d1fb12 49 #define MAX_SOCK_NUM 8
dgriffin65 0:77e050d1fb12 50
dgriffin65 0:77e050d1fb12 51 #define MR 0x0000
dgriffin65 0:77e050d1fb12 52 #define GAR 0x0001
dgriffin65 0:77e050d1fb12 53 #define SUBR 0x0005
dgriffin65 0:77e050d1fb12 54 #define SHAR 0x0009
dgriffin65 0:77e050d1fb12 55 #define SIPR 0x000f
dgriffin65 1:2dee44ea52a9 56 #define SIR 0x0017
dgriffin65 1:2dee44ea52a9 57 #define SIMR 0x0018
dgriffin65 0:77e050d1fb12 58 #define PHYSTATUS 0x0035
dgriffin65 0:77e050d1fb12 59
dgriffin65 0:77e050d1fb12 60 // W5500 socket register
dgriffin65 0:77e050d1fb12 61 #define Sn_MR 0x0000
dgriffin65 0:77e050d1fb12 62 #define Sn_CR 0x0001
dgriffin65 0:77e050d1fb12 63 #define Sn_IR 0x0002
dgriffin65 0:77e050d1fb12 64 #define Sn_SR 0x0003
dgriffin65 0:77e050d1fb12 65 #define Sn_PORT 0x0004
dgriffin65 0:77e050d1fb12 66 #define Sn_DIPR 0x000c
dgriffin65 0:77e050d1fb12 67 #define Sn_DPORT 0x0010
dgriffin65 0:77e050d1fb12 68 #define Sn_RXBUF_SIZE 0x001e
dgriffin65 0:77e050d1fb12 69 #define Sn_TXBUF_SIZE 0x001f
dgriffin65 0:77e050d1fb12 70 #define Sn_TX_FSR 0x0020
dgriffin65 0:77e050d1fb12 71 #define Sn_TX_WR 0x0024
dgriffin65 0:77e050d1fb12 72 #define Sn_RX_RSR 0x0026
dgriffin65 0:77e050d1fb12 73 #define Sn_RX_RD 0x0028
dgriffin65 1:2dee44ea52a9 74 #define Sn_IMR 0x002C
dgriffin65 1:2dee44ea52a9 75
dgriffin65 1:2dee44ea52a9 76
dgriffin65 0:77e050d1fb12 77
dgriffin65 0:77e050d1fb12 78 class WIZnet_Chip {
dgriffin65 0:77e050d1fb12 79 public:
dgriffin65 0:77e050d1fb12 80 /*
dgriffin65 0:77e050d1fb12 81 * Constructor
dgriffin65 0:77e050d1fb12 82 *
dgriffin65 0:77e050d1fb12 83 * @param spi spi class
dgriffin65 0:77e050d1fb12 84 * @param cs cs of the W5500
dgriffin65 0:77e050d1fb12 85 * @param reset reset pin of the W5500
dgriffin65 0:77e050d1fb12 86 */
dgriffin65 0:77e050d1fb12 87 WIZnet_Chip(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName reset);
Bongjun 8:c71c66d43703 88 //WIZnet_Chip(SPI* spi, PinName cs, PinName reset);
Bongjun 8:c71c66d43703 89
Bongjun 8:c71c66d43703 90 virtual ~WIZnet_Chip();
dgriffin65 0:77e050d1fb12 91
dgriffin65 0:77e050d1fb12 92 /*
dgriffin65 0:77e050d1fb12 93 * Set MAC Address to W5500
dgriffin65 0:77e050d1fb12 94 *
dgriffin65 0:77e050d1fb12 95 * @return true if connected, false otherwise
dgriffin65 0:77e050d1fb12 96 */
dgriffin65 0:77e050d1fb12 97 bool setmac();
dgriffin65 0:77e050d1fb12 98
dgriffin65 0:77e050d1fb12 99 /*
dgriffin65 0:77e050d1fb12 100 * Set Network Informations (SrcIP, Netmask, Gataway)
dgriffin65 0:77e050d1fb12 101 *
dgriffin65 0:77e050d1fb12 102 * @return true if connected, false otherwise
dgriffin65 0:77e050d1fb12 103 */
dgriffin65 0:77e050d1fb12 104 bool setip();
dgriffin65 0:77e050d1fb12 105
dgriffin65 0:77e050d1fb12 106 /*
dgriffin65 0:77e050d1fb12 107 * Disconnect the connection
dgriffin65 0:77e050d1fb12 108 *
dgriffin65 0:77e050d1fb12 109 * @ returns true
dgriffin65 0:77e050d1fb12 110 */
dgriffin65 0:77e050d1fb12 111 bool disconnect();
dgriffin65 0:77e050d1fb12 112
dgriffin65 0:77e050d1fb12 113 /*
dgriffin65 0:77e050d1fb12 114 * Open a tcp connection with the specified host on the specified port
dgriffin65 0:77e050d1fb12 115 *
dgriffin65 0:77e050d1fb12 116 * @param host host (can be either an ip address or a name. If a name is provided, a dns request will be established)
dgriffin65 0:77e050d1fb12 117 * @param port port
dgriffin65 0:77e050d1fb12 118 * @ returns true if successful
dgriffin65 0:77e050d1fb12 119 */
dgriffin65 0:77e050d1fb12 120 bool connect(int socket, const char * host, int port, int timeout_ms = 10*1000);
dgriffin65 0:77e050d1fb12 121
dgriffin65 0:77e050d1fb12 122 /*
dgriffin65 0:77e050d1fb12 123 * Set the protocol (UDP or TCP)
dgriffin65 0:77e050d1fb12 124 *
dgriffin65 0:77e050d1fb12 125 * @param p protocol
dgriffin65 0:77e050d1fb12 126 * @ returns true if successful
dgriffin65 0:77e050d1fb12 127 */
dgriffin65 0:77e050d1fb12 128 bool setProtocol(int socket, Protocol p);
dgriffin65 0:77e050d1fb12 129
dgriffin65 0:77e050d1fb12 130 /*
Bongjun 6:e2ab76b2be07 131 * Set local port number
Bongjun 6:e2ab76b2be07 132 *
Bongjun 6:e2ab76b2be07 133 * @return true if connected, false otherwise
Bongjun 6:e2ab76b2be07 134 */
Bongjun 6:e2ab76b2be07 135 bool setLocalPort(int socket, uint16_t port);
Bongjun 6:e2ab76b2be07 136
Bongjun 6:e2ab76b2be07 137 /*
dgriffin65 0:77e050d1fb12 138 * Reset the W5500
dgriffin65 0:77e050d1fb12 139 */
dgriffin65 0:77e050d1fb12 140 void reset();
dgriffin65 0:77e050d1fb12 141
dgriffin65 0:77e050d1fb12 142 int wait_readable(int socket, int wait_time_ms, int req_size = 0);
dgriffin65 0:77e050d1fb12 143
dgriffin65 0:77e050d1fb12 144 int wait_writeable(int socket, int wait_time_ms, int req_size = 0);
dgriffin65 0:77e050d1fb12 145
dgriffin65 0:77e050d1fb12 146 /*
dgriffin65 0:77e050d1fb12 147 * Check if a tcp link is active
dgriffin65 0:77e050d1fb12 148 *
dgriffin65 0:77e050d1fb12 149 * @returns true if successful
dgriffin65 0:77e050d1fb12 150 */
dgriffin65 0:77e050d1fb12 151 bool is_connected(int socket);
dgriffin65 0:77e050d1fb12 152
dgriffin65 0:77e050d1fb12 153 /*
dgriffin65 0:77e050d1fb12 154 * Close a tcp connection
dgriffin65 0:77e050d1fb12 155 *
dgriffin65 0:77e050d1fb12 156 * @ returns true if successful
dgriffin65 0:77e050d1fb12 157 */
dgriffin65 0:77e050d1fb12 158 bool close(int socket);
dgriffin65 0:77e050d1fb12 159
dgriffin65 0:77e050d1fb12 160 /*
sgnezdov 4:80e302a610fd 161 * Check if status of socket is closed.
sgnezdov 4:80e302a610fd 162 *
sgnezdov 4:80e302a610fd 163 * Used by automatically open socket (bind to local address).
sgnezdov 4:80e302a610fd 164 *
sgnezdov 4:80e302a610fd 165 * @ returns true if socket is closed.
sgnezdov 4:80e302a610fd 166 */
sgnezdov 4:80e302a610fd 167 bool is_closed(int socket);
sgnezdov 4:80e302a610fd 168
sgnezdov 4:80e302a610fd 169 /*
dgriffin65 0:77e050d1fb12 170 * @param str string to be sent
dgriffin65 0:77e050d1fb12 171 * @param len string length
dgriffin65 0:77e050d1fb12 172 */
dgriffin65 0:77e050d1fb12 173 int send(int socket, const char * str, int len);
dgriffin65 0:77e050d1fb12 174
dgriffin65 0:77e050d1fb12 175 int recv(int socket, char* buf, int len);
dgriffin65 0:77e050d1fb12 176
dgriffin65 0:77e050d1fb12 177 /*
dgriffin65 0:77e050d1fb12 178 * Return true if the module is using dhcp
dgriffin65 0:77e050d1fb12 179 *
dgriffin65 0:77e050d1fb12 180 * @returns true if the module is using dhcp
dgriffin65 0:77e050d1fb12 181 */
dgriffin65 0:77e050d1fb12 182 bool isDHCP() {
dgriffin65 0:77e050d1fb12 183 return dhcp;
dgriffin65 0:77e050d1fb12 184 }
dgriffin65 0:77e050d1fb12 185
dgriffin65 0:77e050d1fb12 186 bool gethostbyname(const char* host, uint32_t* ip);
dgriffin65 0:77e050d1fb12 187
dgriffin65 0:77e050d1fb12 188 static WIZnet_Chip * getInstance() {
dgriffin65 0:77e050d1fb12 189 return inst;
dgriffin65 0:77e050d1fb12 190 };
dgriffin65 0:77e050d1fb12 191
dgriffin65 0:77e050d1fb12 192 int new_socket();
dgriffin65 0:77e050d1fb12 193 uint16_t new_port();
dgriffin65 0:77e050d1fb12 194 void scmd(int socket, Command cmd);
dgriffin65 0:77e050d1fb12 195
dgriffin65 0:77e050d1fb12 196 template<typename T>
dgriffin65 0:77e050d1fb12 197 void sreg(int socket, uint16_t addr, T data) {
dgriffin65 0:77e050d1fb12 198 reg_wr<T>(addr, (0x0C + (socket << 5)), data);
dgriffin65 0:77e050d1fb12 199 }
dgriffin65 0:77e050d1fb12 200
dgriffin65 0:77e050d1fb12 201 template<typename T>
dgriffin65 0:77e050d1fb12 202 T sreg(int socket, uint16_t addr) {
dgriffin65 0:77e050d1fb12 203 return reg_rd<T>(addr, (0x08 + (socket << 5)));
dgriffin65 0:77e050d1fb12 204 }
dgriffin65 0:77e050d1fb12 205
dgriffin65 0:77e050d1fb12 206 template<typename T>
dgriffin65 0:77e050d1fb12 207 void reg_wr(uint16_t addr, T data) {
dgriffin65 0:77e050d1fb12 208 return reg_wr(addr, 0x04, data);
dgriffin65 0:77e050d1fb12 209 }
dgriffin65 0:77e050d1fb12 210
dgriffin65 0:77e050d1fb12 211 template<typename T>
dgriffin65 0:77e050d1fb12 212 void reg_wr(uint16_t addr, uint8_t cb, T data) {
dgriffin65 0:77e050d1fb12 213 uint8_t buf[sizeof(T)];
dgriffin65 0:77e050d1fb12 214 *reinterpret_cast<T*>(buf) = data;
dgriffin65 0:77e050d1fb12 215 for(int i = 0; i < sizeof(buf)/2; i++) { // Little Endian to Big Endian
dgriffin65 0:77e050d1fb12 216 uint8_t t = buf[i];
dgriffin65 0:77e050d1fb12 217 buf[i] = buf[sizeof(buf)-1-i];
dgriffin65 0:77e050d1fb12 218 buf[sizeof(buf)-1-i] = t;
dgriffin65 0:77e050d1fb12 219 }
dgriffin65 0:77e050d1fb12 220 spi_write(addr, cb, buf, sizeof(buf));
dgriffin65 0:77e050d1fb12 221 }
dgriffin65 0:77e050d1fb12 222
dgriffin65 0:77e050d1fb12 223 template<typename T>
dgriffin65 0:77e050d1fb12 224 T reg_rd(uint16_t addr) {
dgriffin65 0:77e050d1fb12 225 return reg_rd<T>(addr, 0x00);
dgriffin65 0:77e050d1fb12 226 }
dgriffin65 0:77e050d1fb12 227
dgriffin65 0:77e050d1fb12 228 template<typename T>
dgriffin65 0:77e050d1fb12 229 T reg_rd(uint16_t addr, uint8_t cb) {
dgriffin65 0:77e050d1fb12 230 uint8_t buf[sizeof(T)];
dgriffin65 0:77e050d1fb12 231 spi_read(addr, cb, buf, sizeof(buf));
dgriffin65 0:77e050d1fb12 232 for(int i = 0; i < sizeof(buf)/2; i++) { // Big Endian to Little Endian
dgriffin65 0:77e050d1fb12 233 uint8_t t = buf[i];
dgriffin65 0:77e050d1fb12 234 buf[i] = buf[sizeof(buf)-1-i];
dgriffin65 0:77e050d1fb12 235 buf[sizeof(buf)-1-i] = t;
dgriffin65 0:77e050d1fb12 236 }
dgriffin65 0:77e050d1fb12 237 return *reinterpret_cast<T*>(buf);
dgriffin65 0:77e050d1fb12 238 }
dgriffin65 0:77e050d1fb12 239
dgriffin65 0:77e050d1fb12 240 void reg_rd_mac(uint16_t addr, uint8_t* data) {
dgriffin65 0:77e050d1fb12 241 spi_read(addr, 0x00, data, 6);
dgriffin65 0:77e050d1fb12 242 }
dgriffin65 0:77e050d1fb12 243
dgriffin65 0:77e050d1fb12 244 void reg_wr_ip(uint16_t addr, uint8_t cb, const char* ip) {
dgriffin65 0:77e050d1fb12 245 uint8_t buf[4];
dgriffin65 0:77e050d1fb12 246 char* p = (char*)ip;
dgriffin65 0:77e050d1fb12 247 for(int i = 0; i < 4; i++) {
dgriffin65 0:77e050d1fb12 248 buf[i] = atoi(p);
dgriffin65 0:77e050d1fb12 249 p = strchr(p, '.');
dgriffin65 0:77e050d1fb12 250 if (p == NULL) {
dgriffin65 0:77e050d1fb12 251 break;
dgriffin65 0:77e050d1fb12 252 }
dgriffin65 0:77e050d1fb12 253 p++;
dgriffin65 0:77e050d1fb12 254 }
dgriffin65 0:77e050d1fb12 255 spi_write(addr, cb, buf, sizeof(buf));
dgriffin65 0:77e050d1fb12 256 }
dgriffin65 0:77e050d1fb12 257
dgriffin65 0:77e050d1fb12 258 void sreg_ip(int socket, uint16_t addr, const char* ip) {
dgriffin65 0:77e050d1fb12 259 reg_wr_ip(addr, (0x0C + (socket << 5)), ip);
dgriffin65 0:77e050d1fb12 260 }
dgriffin65 0:77e050d1fb12 261
dgriffin65 0:77e050d1fb12 262 uint8_t mac[6];
dgriffin65 0:77e050d1fb12 263 uint32_t ip;
dgriffin65 0:77e050d1fb12 264 uint32_t netmask;
dgriffin65 0:77e050d1fb12 265 uint32_t gateway;
dgriffin65 0:77e050d1fb12 266 uint32_t dnsaddr;
dgriffin65 0:77e050d1fb12 267 bool dhcp;
dgriffin65 0:77e050d1fb12 268
Bongjun 6:e2ab76b2be07 269 protected:
dgriffin65 0:77e050d1fb12 270 static WIZnet_Chip* inst;
dgriffin65 0:77e050d1fb12 271
dgriffin65 0:77e050d1fb12 272 void reg_wr_mac(uint16_t addr, uint8_t* data) {
dgriffin65 0:77e050d1fb12 273 spi_write(addr, 0x04, data, 6);
dgriffin65 0:77e050d1fb12 274 }
dgriffin65 0:77e050d1fb12 275
dgriffin65 0:77e050d1fb12 276 void spi_write(uint16_t addr, uint8_t cb, const uint8_t *buf, uint16_t len);
dgriffin65 0:77e050d1fb12 277 void spi_read(uint16_t addr, uint8_t cb, uint8_t *buf, uint16_t len);
dgriffin65 0:77e050d1fb12 278 SPI* spi;
dgriffin65 0:77e050d1fb12 279 DigitalOut cs;
dgriffin65 0:77e050d1fb12 280 DigitalOut reset_pin;
dgriffin65 0:77e050d1fb12 281 };
dgriffin65 0:77e050d1fb12 282
dgriffin65 0:77e050d1fb12 283 extern uint32_t str_to_ip(const char* str);
dgriffin65 0:77e050d1fb12 284 extern void printfBytes(char* str, uint8_t* buf, int len);
dgriffin65 0:77e050d1fb12 285 extern void printHex(uint8_t* buf, int len);
dgriffin65 0:77e050d1fb12 286 extern void debug_hex(uint8_t* buf, int len);