ST Americas mbed Team / Mbed 2 deprecated m2x-temp_ethernet_demo

Dependencies:   LM75B M2XStreamClient jsonlite mbed-rtos mbed Nucleo_Sensor_Shield

Fork of m2x-seeed_ethernet_demo by Sean Newton

Committer:
SeanNewton
Date:
Thu Sep 25 16:36:51 2014 +0000
Revision:
7:a94ba2e0cd04
CHange WIZnet_Library to folder to keep configuration changes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
SeanNewton 7:a94ba2e0cd04 1 /* Copyright (C) 2012 mbed.org, MIT License
SeanNewton 7:a94ba2e0cd04 2 *
SeanNewton 7:a94ba2e0cd04 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
SeanNewton 7:a94ba2e0cd04 4 * and associated documentation files (the "Software"), to deal in the Software without restriction,
SeanNewton 7:a94ba2e0cd04 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
SeanNewton 7:a94ba2e0cd04 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
SeanNewton 7:a94ba2e0cd04 7 * furnished to do so, subject to the following conditions:
SeanNewton 7:a94ba2e0cd04 8 *
SeanNewton 7:a94ba2e0cd04 9 * The above copyright notice and this permission notice shall be included in all copies or
SeanNewton 7:a94ba2e0cd04 10 * substantial portions of the Software.
SeanNewton 7:a94ba2e0cd04 11 *
SeanNewton 7:a94ba2e0cd04 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
SeanNewton 7:a94ba2e0cd04 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
SeanNewton 7:a94ba2e0cd04 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
SeanNewton 7:a94ba2e0cd04 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
SeanNewton 7:a94ba2e0cd04 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
SeanNewton 7:a94ba2e0cd04 17 *
SeanNewton 7:a94ba2e0cd04 18 */
SeanNewton 7:a94ba2e0cd04 19
SeanNewton 7:a94ba2e0cd04 20 #pragma once
SeanNewton 7:a94ba2e0cd04 21
SeanNewton 7:a94ba2e0cd04 22 #include "mbed.h"
SeanNewton 7:a94ba2e0cd04 23 #include "mbed_debug.h"
SeanNewton 7:a94ba2e0cd04 24
SeanNewton 7:a94ba2e0cd04 25 #define TEST_ASSERT(A) while(!(A)){debug("\n\n%s@%d %s ASSERT!\n\n",__PRETTY_FUNCTION__,__LINE__,#A);exit(1);};
SeanNewton 7:a94ba2e0cd04 26
SeanNewton 7:a94ba2e0cd04 27 #define DEFAULT_WAIT_RESP_TIMEOUT 500
SeanNewton 7:a94ba2e0cd04 28
SeanNewton 7:a94ba2e0cd04 29 enum Protocol {
SeanNewton 7:a94ba2e0cd04 30 CLOSED = 0,
SeanNewton 7:a94ba2e0cd04 31 TCP = 1,
SeanNewton 7:a94ba2e0cd04 32 UDP = 2,
SeanNewton 7:a94ba2e0cd04 33 };
SeanNewton 7:a94ba2e0cd04 34
SeanNewton 7:a94ba2e0cd04 35 enum Command {
SeanNewton 7:a94ba2e0cd04 36 OPEN = 0x01,
SeanNewton 7:a94ba2e0cd04 37 LISTEN = 0x02,
SeanNewton 7:a94ba2e0cd04 38 CONNECT = 0x04,
SeanNewton 7:a94ba2e0cd04 39 DISCON = 0x08,
SeanNewton 7:a94ba2e0cd04 40 CLOSE = 0x10,
SeanNewton 7:a94ba2e0cd04 41 SEND = 0x20,
SeanNewton 7:a94ba2e0cd04 42 SEND_MAC = 0x21,
SeanNewton 7:a94ba2e0cd04 43 SEND_KEEP = 0x22,
SeanNewton 7:a94ba2e0cd04 44 RECV = 0x40,
SeanNewton 7:a94ba2e0cd04 45
SeanNewton 7:a94ba2e0cd04 46 };
SeanNewton 7:a94ba2e0cd04 47
SeanNewton 7:a94ba2e0cd04 48 enum Interrupt {
SeanNewton 7:a94ba2e0cd04 49 INT_CON = 0x01,
SeanNewton 7:a94ba2e0cd04 50 INT_DISCON = 0x02,
SeanNewton 7:a94ba2e0cd04 51 INT_RECV = 0x04,
SeanNewton 7:a94ba2e0cd04 52 INT_TIMEOUT = 0x08,
SeanNewton 7:a94ba2e0cd04 53 INT_SEND_OK = 0x10,
SeanNewton 7:a94ba2e0cd04 54 };
SeanNewton 7:a94ba2e0cd04 55
SeanNewton 7:a94ba2e0cd04 56 enum Status {
SeanNewton 7:a94ba2e0cd04 57 SOCK_CLOSED = 0x00,
SeanNewton 7:a94ba2e0cd04 58 SOCK_INIT = 0x13,
SeanNewton 7:a94ba2e0cd04 59 SOCK_LISTEN = 0x14,
SeanNewton 7:a94ba2e0cd04 60 SOCK_SYNSENT = 0x15,
SeanNewton 7:a94ba2e0cd04 61 SOCK_ESTABLISHED = 0x17,
SeanNewton 7:a94ba2e0cd04 62 SOCK_CLOSE_WAIT = 0x1c,
SeanNewton 7:a94ba2e0cd04 63 SOCK_UDP = 0x22,
SeanNewton 7:a94ba2e0cd04 64 };
SeanNewton 7:a94ba2e0cd04 65
SeanNewton 7:a94ba2e0cd04 66 #define MAX_SOCK_NUM 8
SeanNewton 7:a94ba2e0cd04 67
SeanNewton 7:a94ba2e0cd04 68 #define MR 0x0000
SeanNewton 7:a94ba2e0cd04 69 #define GAR 0x0001
SeanNewton 7:a94ba2e0cd04 70 #define SUBR 0x0005
SeanNewton 7:a94ba2e0cd04 71 #define SHAR 0x0009
SeanNewton 7:a94ba2e0cd04 72 #define SIPR 0x000f
SeanNewton 7:a94ba2e0cd04 73 #define PHYSTATUS 0x0035
SeanNewton 7:a94ba2e0cd04 74
SeanNewton 7:a94ba2e0cd04 75 // W5500 socket register
SeanNewton 7:a94ba2e0cd04 76 #define Sn_MR 0x0000
SeanNewton 7:a94ba2e0cd04 77 #define Sn_CR 0x0001
SeanNewton 7:a94ba2e0cd04 78 #define Sn_IR 0x0002
SeanNewton 7:a94ba2e0cd04 79 #define Sn_SR 0x0003
SeanNewton 7:a94ba2e0cd04 80 #define Sn_PORT 0x0004
SeanNewton 7:a94ba2e0cd04 81 #define Sn_DIPR 0x000c
SeanNewton 7:a94ba2e0cd04 82 #define Sn_DPORT 0x0010
SeanNewton 7:a94ba2e0cd04 83 #define Sn_RXBUF_SIZE 0x001e
SeanNewton 7:a94ba2e0cd04 84 #define Sn_TXBUF_SIZE 0x001f
SeanNewton 7:a94ba2e0cd04 85 #define Sn_TX_FSR 0x0020
SeanNewton 7:a94ba2e0cd04 86 #define Sn_TX_WR 0x0024
SeanNewton 7:a94ba2e0cd04 87 #define Sn_RX_RSR 0x0026
SeanNewton 7:a94ba2e0cd04 88 #define Sn_RX_RD 0x0028
SeanNewton 7:a94ba2e0cd04 89
SeanNewton 7:a94ba2e0cd04 90 class WIZnet_Chip {
SeanNewton 7:a94ba2e0cd04 91 public:
SeanNewton 7:a94ba2e0cd04 92 /*
SeanNewton 7:a94ba2e0cd04 93 * Constructor
SeanNewton 7:a94ba2e0cd04 94 *
SeanNewton 7:a94ba2e0cd04 95 * @param spi spi class
SeanNewton 7:a94ba2e0cd04 96 * @param cs cs of the W5500
SeanNewton 7:a94ba2e0cd04 97 * @param reset reset pin of the W5500
SeanNewton 7:a94ba2e0cd04 98 */
SeanNewton 7:a94ba2e0cd04 99 WIZnet_Chip(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName reset);
SeanNewton 7:a94ba2e0cd04 100 WIZnet_Chip(SPI* spi, PinName cs, PinName reset);
SeanNewton 7:a94ba2e0cd04 101
SeanNewton 7:a94ba2e0cd04 102 /*
SeanNewton 7:a94ba2e0cd04 103 * Connect the W5500 to the ssid contained in the constructor.
SeanNewton 7:a94ba2e0cd04 104 *
SeanNewton 7:a94ba2e0cd04 105 * @return true if connected, false otherwise
SeanNewton 7:a94ba2e0cd04 106 */
SeanNewton 7:a94ba2e0cd04 107 bool setip();
SeanNewton 7:a94ba2e0cd04 108
SeanNewton 7:a94ba2e0cd04 109 /*
SeanNewton 7:a94ba2e0cd04 110 * Disconnect the connection
SeanNewton 7:a94ba2e0cd04 111 *
SeanNewton 7:a94ba2e0cd04 112 * @ returns true
SeanNewton 7:a94ba2e0cd04 113 */
SeanNewton 7:a94ba2e0cd04 114 bool disconnect();
SeanNewton 7:a94ba2e0cd04 115
SeanNewton 7:a94ba2e0cd04 116 /*
SeanNewton 7:a94ba2e0cd04 117 * Open a tcp connection with the specified host on the specified port
SeanNewton 7:a94ba2e0cd04 118 *
SeanNewton 7:a94ba2e0cd04 119 * @param host host (can be either an ip address or a name. If a name is provided, a dns request will be established)
SeanNewton 7:a94ba2e0cd04 120 * @param port port
SeanNewton 7:a94ba2e0cd04 121 * @ returns true if successful
SeanNewton 7:a94ba2e0cd04 122 */
SeanNewton 7:a94ba2e0cd04 123 bool connect(int socket, const char * host, int port, int timeout_ms = 10*1000);
SeanNewton 7:a94ba2e0cd04 124
SeanNewton 7:a94ba2e0cd04 125 /*
SeanNewton 7:a94ba2e0cd04 126 * Set the protocol (UDP or TCP)
SeanNewton 7:a94ba2e0cd04 127 *
SeanNewton 7:a94ba2e0cd04 128 * @param p protocol
SeanNewton 7:a94ba2e0cd04 129 * @ returns true if successful
SeanNewton 7:a94ba2e0cd04 130 */
SeanNewton 7:a94ba2e0cd04 131 bool setProtocol(int socket, Protocol p);
SeanNewton 7:a94ba2e0cd04 132
SeanNewton 7:a94ba2e0cd04 133 /*
SeanNewton 7:a94ba2e0cd04 134 * Reset the W5500
SeanNewton 7:a94ba2e0cd04 135 */
SeanNewton 7:a94ba2e0cd04 136 void reset();
SeanNewton 7:a94ba2e0cd04 137
SeanNewton 7:a94ba2e0cd04 138 int wait_readable(int socket, int wait_time_ms, int req_size = 0);
SeanNewton 7:a94ba2e0cd04 139
SeanNewton 7:a94ba2e0cd04 140 int wait_writeable(int socket, int wait_time_ms, int req_size = 0);
SeanNewton 7:a94ba2e0cd04 141
SeanNewton 7:a94ba2e0cd04 142 /*
SeanNewton 7:a94ba2e0cd04 143 * Check if a tcp link is active
SeanNewton 7:a94ba2e0cd04 144 *
SeanNewton 7:a94ba2e0cd04 145 * @returns true if successful
SeanNewton 7:a94ba2e0cd04 146 */
SeanNewton 7:a94ba2e0cd04 147 bool is_connected(int socket);
SeanNewton 7:a94ba2e0cd04 148
SeanNewton 7:a94ba2e0cd04 149 /*
SeanNewton 7:a94ba2e0cd04 150 * Close a tcp connection
SeanNewton 7:a94ba2e0cd04 151 *
SeanNewton 7:a94ba2e0cd04 152 * @ returns true if successful
SeanNewton 7:a94ba2e0cd04 153 */
SeanNewton 7:a94ba2e0cd04 154 bool close(int socket);
SeanNewton 7:a94ba2e0cd04 155
SeanNewton 7:a94ba2e0cd04 156 /*
SeanNewton 7:a94ba2e0cd04 157 * @param str string to be sent
SeanNewton 7:a94ba2e0cd04 158 * @param len string length
SeanNewton 7:a94ba2e0cd04 159 */
SeanNewton 7:a94ba2e0cd04 160 int send(int socket, const char * str, int len);
SeanNewton 7:a94ba2e0cd04 161
SeanNewton 7:a94ba2e0cd04 162 int recv(int socket, char* buf, int len);
SeanNewton 7:a94ba2e0cd04 163
SeanNewton 7:a94ba2e0cd04 164 /*
SeanNewton 7:a94ba2e0cd04 165 * Return true if the module is using dhcp
SeanNewton 7:a94ba2e0cd04 166 *
SeanNewton 7:a94ba2e0cd04 167 * @returns true if the module is using dhcp
SeanNewton 7:a94ba2e0cd04 168 */
SeanNewton 7:a94ba2e0cd04 169 bool isDHCP() {
SeanNewton 7:a94ba2e0cd04 170 return dhcp;
SeanNewton 7:a94ba2e0cd04 171 }
SeanNewton 7:a94ba2e0cd04 172
SeanNewton 7:a94ba2e0cd04 173 bool gethostbyname(const char* host, uint32_t* ip);
SeanNewton 7:a94ba2e0cd04 174
SeanNewton 7:a94ba2e0cd04 175 static WIZnet_Chip * getInstance() {
SeanNewton 7:a94ba2e0cd04 176 return inst;
SeanNewton 7:a94ba2e0cd04 177 };
SeanNewton 7:a94ba2e0cd04 178
SeanNewton 7:a94ba2e0cd04 179 int new_socket();
SeanNewton 7:a94ba2e0cd04 180 uint16_t new_port();
SeanNewton 7:a94ba2e0cd04 181 void scmd(int socket, Command cmd);
SeanNewton 7:a94ba2e0cd04 182
SeanNewton 7:a94ba2e0cd04 183 template<typename T>
SeanNewton 7:a94ba2e0cd04 184 void sreg(int socket, uint16_t addr, T data) {
SeanNewton 7:a94ba2e0cd04 185 reg_wr<T>(addr, (0x0C + (socket << 5)), data);
SeanNewton 7:a94ba2e0cd04 186 }
SeanNewton 7:a94ba2e0cd04 187
SeanNewton 7:a94ba2e0cd04 188 template<typename T>
SeanNewton 7:a94ba2e0cd04 189 T sreg(int socket, uint16_t addr) {
SeanNewton 7:a94ba2e0cd04 190 return reg_rd<T>(addr, (0x08 + (socket << 5)));
SeanNewton 7:a94ba2e0cd04 191 }
SeanNewton 7:a94ba2e0cd04 192
SeanNewton 7:a94ba2e0cd04 193 template<typename T>
SeanNewton 7:a94ba2e0cd04 194 void reg_wr(uint16_t addr, T data) {
SeanNewton 7:a94ba2e0cd04 195 return reg_wr(addr, 0x04, data);
SeanNewton 7:a94ba2e0cd04 196 }
SeanNewton 7:a94ba2e0cd04 197
SeanNewton 7:a94ba2e0cd04 198 template<typename T>
SeanNewton 7:a94ba2e0cd04 199 void reg_wr(uint16_t addr, uint8_t cb, T data) {
SeanNewton 7:a94ba2e0cd04 200 uint8_t buf[sizeof(T)];
SeanNewton 7:a94ba2e0cd04 201 *reinterpret_cast<T*>(buf) = data;
SeanNewton 7:a94ba2e0cd04 202 for(int i = 0; i < sizeof(buf)/2; i++) { // Little Endian to Big Endian
SeanNewton 7:a94ba2e0cd04 203 uint8_t t = buf[i];
SeanNewton 7:a94ba2e0cd04 204 buf[i] = buf[sizeof(buf)-1-i];
SeanNewton 7:a94ba2e0cd04 205 buf[sizeof(buf)-1-i] = t;
SeanNewton 7:a94ba2e0cd04 206 }
SeanNewton 7:a94ba2e0cd04 207 spi_write(addr, cb, buf, sizeof(buf));
SeanNewton 7:a94ba2e0cd04 208 }
SeanNewton 7:a94ba2e0cd04 209
SeanNewton 7:a94ba2e0cd04 210 template<typename T>
SeanNewton 7:a94ba2e0cd04 211 T reg_rd(uint16_t addr) {
SeanNewton 7:a94ba2e0cd04 212 return reg_rd<T>(addr, 0x00);
SeanNewton 7:a94ba2e0cd04 213 }
SeanNewton 7:a94ba2e0cd04 214
SeanNewton 7:a94ba2e0cd04 215 template<typename T>
SeanNewton 7:a94ba2e0cd04 216 T reg_rd(uint16_t addr, uint8_t cb) {
SeanNewton 7:a94ba2e0cd04 217 uint8_t buf[sizeof(T)];
SeanNewton 7:a94ba2e0cd04 218 spi_read(addr, cb, buf, sizeof(buf));
SeanNewton 7:a94ba2e0cd04 219 for(int i = 0; i < sizeof(buf)/2; i++) { // Big Endian to Little Endian
SeanNewton 7:a94ba2e0cd04 220 uint8_t t = buf[i];
SeanNewton 7:a94ba2e0cd04 221 buf[i] = buf[sizeof(buf)-1-i];
SeanNewton 7:a94ba2e0cd04 222 buf[sizeof(buf)-1-i] = t;
SeanNewton 7:a94ba2e0cd04 223 }
SeanNewton 7:a94ba2e0cd04 224 return *reinterpret_cast<T*>(buf);
SeanNewton 7:a94ba2e0cd04 225 }
SeanNewton 7:a94ba2e0cd04 226
SeanNewton 7:a94ba2e0cd04 227 void reg_rd_mac(uint16_t addr, uint8_t* data) {
SeanNewton 7:a94ba2e0cd04 228 spi_read(addr, 0x00, data, 6);
SeanNewton 7:a94ba2e0cd04 229 }
SeanNewton 7:a94ba2e0cd04 230
SeanNewton 7:a94ba2e0cd04 231 void reg_wr_ip(uint16_t addr, uint8_t cb, const char* ip) {
SeanNewton 7:a94ba2e0cd04 232 uint8_t buf[4];
SeanNewton 7:a94ba2e0cd04 233 char* p = (char*)ip;
SeanNewton 7:a94ba2e0cd04 234 for(int i = 0; i < 4; i++) {
SeanNewton 7:a94ba2e0cd04 235 buf[i] = atoi(p);
SeanNewton 7:a94ba2e0cd04 236 p = strchr(p, '.');
SeanNewton 7:a94ba2e0cd04 237 if (p == NULL) {
SeanNewton 7:a94ba2e0cd04 238 break;
SeanNewton 7:a94ba2e0cd04 239 }
SeanNewton 7:a94ba2e0cd04 240 p++;
SeanNewton 7:a94ba2e0cd04 241 }
SeanNewton 7:a94ba2e0cd04 242 spi_write(addr, cb, buf, sizeof(buf));
SeanNewton 7:a94ba2e0cd04 243 }
SeanNewton 7:a94ba2e0cd04 244
SeanNewton 7:a94ba2e0cd04 245 void sreg_ip(int socket, uint16_t addr, const char* ip) {
SeanNewton 7:a94ba2e0cd04 246 reg_wr_ip(addr, (0x0C + (socket << 5)), ip);
SeanNewton 7:a94ba2e0cd04 247 }
SeanNewton 7:a94ba2e0cd04 248
SeanNewton 7:a94ba2e0cd04 249 protected:
SeanNewton 7:a94ba2e0cd04 250 uint8_t mac[6];
SeanNewton 7:a94ba2e0cd04 251 uint32_t ip;
SeanNewton 7:a94ba2e0cd04 252 uint32_t netmask;
SeanNewton 7:a94ba2e0cd04 253 uint32_t gateway;
SeanNewton 7:a94ba2e0cd04 254 uint32_t dnsaddr;
SeanNewton 7:a94ba2e0cd04 255 bool dhcp;
SeanNewton 7:a94ba2e0cd04 256
SeanNewton 7:a94ba2e0cd04 257 static WIZnet_Chip* inst;
SeanNewton 7:a94ba2e0cd04 258
SeanNewton 7:a94ba2e0cd04 259 void reg_wr_mac(uint16_t addr, uint8_t* data) {
SeanNewton 7:a94ba2e0cd04 260 spi_write(addr, 0x04, data, 6);
SeanNewton 7:a94ba2e0cd04 261 }
SeanNewton 7:a94ba2e0cd04 262
SeanNewton 7:a94ba2e0cd04 263 void spi_write(uint16_t addr, uint8_t cb, const uint8_t *buf, uint16_t len);
SeanNewton 7:a94ba2e0cd04 264 void spi_read(uint16_t addr, uint8_t cb, uint8_t *buf, uint16_t len);
SeanNewton 7:a94ba2e0cd04 265 SPI* spi;
SeanNewton 7:a94ba2e0cd04 266 DigitalOut cs;
SeanNewton 7:a94ba2e0cd04 267 DigitalOut reset_pin;
SeanNewton 7:a94ba2e0cd04 268 };
SeanNewton 7:a94ba2e0cd04 269
SeanNewton 7:a94ba2e0cd04 270 extern uint32_t str_to_ip(const char* str);
SeanNewton 7:a94ba2e0cd04 271 extern void printfBytes(char* str, uint8_t* buf, int len);
SeanNewton 7:a94ba2e0cd04 272 extern void printHex(uint8_t* buf, int len);
SeanNewton 7:a94ba2e0cd04 273 extern void debug_hex(uint8_t* buf, int len);