KL25 driver for Tango Control System

Dependencies:   mbed

Committer:
jskl
Date:
Thu Aug 28 07:50:06 2014 +0000
Revision:
2:9fe6f1e273b4
Parent:
0:5d27c333afa6
Fixed bugs in JSON format replies

Who changed what in which revision?

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