No more update~~ please use W5500Interface.

Fork of EthernetInterfaceW5500 by Bongjun Hur


Bongjun Hur wrote:

NO more update for this library.

Please move to this page W5500Interface for newer version.

Import libraryW5500Interface

This is the Interface library for WIZnet W5500 chip which forked of EthernetInterfaceW5500, WIZnetInterface and WIZ550ioInterface. This library has simple name as "W5500Interface". and can be used for Wiz550io users also.

This Library for W5500 users. no need to use lwIP(or S/W TCP/IP) Some update & code clean for W5500 only refer from WIZ550ioInterface, WIZnetLibrary and WiflyInterface.

Thanks for ban4jp. This library forks of WIZ550ioInterface.

Committer:
ppo
Date:
Fri Aug 29 12:00:38 2014 +0000
Revision:
15:fe68ac753657
Parent:
10:cadac6bcd169
bug fixed in close(), now socket is really closed

Who changed what in which revision?

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