Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of WIZ820ioInterface by
WIZ820io.h
00001 /* Copyright (C) 2012 mbed.org, MIT License 00002 * 00003 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software 00004 * and associated documentation files (the "Software"), to deal in the Software without restriction, 00005 * including without limitation the rights to use, copy, modify, merge, publish, distribute, 00006 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is 00007 * furnished to do so, subject to the following conditions: 00008 * 00009 * The above copyright notice and this permission notice shall be included in all copies or 00010 * substantial portions of the Software. 00011 * 00012 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING 00013 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 00014 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 00015 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00016 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 00017 * 00018 */ 00019 00020 #pragma once 00021 00022 #include "mbed.h" 00023 #include "mbed_debug.h" 00024 00025 #define TEST_ASSERT(A) while(!(A)){debug("\n\n%s@%d %s ASSERT!\n\n",__PRETTY_FUNCTION__,__LINE__,#A);exit(1);}; 00026 00027 #define DEFAULT_WAIT_RESP_TIMEOUT 500 00028 00029 enum Protocol { 00030 CLOSED = 0, 00031 TCP = 1, 00032 UDP = 2, 00033 }; 00034 00035 enum Command { 00036 OPEN = 0x01, 00037 LISTEN = 0x02, 00038 CONNECT = 0x04, 00039 DISCON = 0x08, 00040 CLOSE = 0x10, 00041 SEND = 0x20, 00042 SEND_MAC = 0x21, 00043 SEND_KEEP = 0x22, 00044 RECV = 0x40, 00045 00046 }; 00047 00048 enum Interrupt { 00049 INT_CON = 0x01, 00050 INT_DISCON = 0x02, 00051 INT_RECV = 0x04, 00052 INT_TIMEOUT = 0x08, 00053 INT_SEND_OK = 0x10, 00054 }; 00055 00056 enum Status { 00057 SOCK_CLOSED = 0x00, 00058 SOCK_INIT = 0x13, 00059 SOCK_LISTEN = 0x14, 00060 SOCK_SYNSENT = 0x15, 00061 SOCK_ESTABLISHED = 0x17, 00062 SOCK_CLOSE_WAIT = 0x1c, 00063 SOCK_UDP = 0x22, 00064 }; 00065 00066 #define MAX_SOCK_NUM 8 00067 00068 #define MR 0x0000 00069 #define GAR 0x0001 00070 #define SUBR 0x0005 00071 #define SHAR 0x0009 00072 #define SIPR 0x000f 00073 #define PHYSTATUS 0x0035 00074 // socket 00075 #define Sn_MR 0x4000 00076 #define Sn_CR 0x4001 00077 #define Sn_IR 0x4002 00078 #define Sn_SR 0x4003 00079 #define Sn_PORT 0x4004 00080 #define Sn_DIPR 0x400c 00081 #define Sn_DPORT 0x4010 00082 #define Sn_RXBUF_SIZE 0x401e 00083 #define Sn_TXBUF_SIZE 0x401f 00084 #define Sn_TX_FSR 0x4020 00085 #define Sn_TX_WR 0x4024 00086 #define Sn_RX_RSR 0x4026 00087 #define Sn_RX_RD 0x4028 00088 00089 class WIZ820io { 00090 public: 00091 /* 00092 * Constructor 00093 * 00094 * @param tx mbed pin to use for tx line of Serial interface 00095 * @param rx mbed pin to use for rx line of Serial interface 00096 * @param reset reset pin of the WIZ820io module 00097 */ 00098 WIZ820io(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName reset); 00099 WIZ820io(SPI* spi, PinName cs, PinName reset); 00100 00101 /* 00102 * Connect the WIZ820io module to the ssid contained in the constructor. 00103 * 00104 * @return true if connected, false otherwise 00105 */ 00106 bool join(); 00107 00108 /* 00109 * Disconnect the WIZ820io module from the access point 00110 * 00111 * @ returns true if successful 00112 */ 00113 bool disconnect(); 00114 00115 /* 00116 * Open a tcp connection with the specified host on the specified port 00117 * 00118 * @param host host (can be either an ip address or a name. If a name is provided, a dns request will be established) 00119 * @param port port 00120 * @ returns true if successful 00121 */ 00122 bool connect(int socket, const char * host, int port, int timeout_ms = 10*1000); 00123 00124 /* 00125 * Set the protocol (UDP or TCP) 00126 * 00127 * @param p protocol 00128 * @ returns true if successful 00129 */ 00130 bool setProtocol(int socket, Protocol p); 00131 00132 /* 00133 * Reset the WIZ820io module 00134 */ 00135 void reset(); 00136 00137 00138 int wait_readable(int socket, int wait_time_ms, int req_size = 0); 00139 00140 int wait_writeable(int socket, int wait_time_ms, int req_size = 0); 00141 00142 /* 00143 * Check if a tcp link is active 00144 * 00145 * @returns true if successful 00146 */ 00147 bool is_connected(int socket); 00148 00149 /* 00150 * Close a tcp connection 00151 * 00152 * @ returns true if successful 00153 */ 00154 bool close(int socket); 00155 00156 /* 00157 * @param str string to be sent 00158 * @param len string length 00159 */ 00160 int send(int socket, const char * str, int len); 00161 00162 int recv(int socket, char* buf, int len); 00163 00164 /* 00165 * Return true if the module is using dhcp 00166 * 00167 * @returns true if the module is using dhcp 00168 */ 00169 bool isDHCP() { 00170 return dhcp; 00171 } 00172 00173 bool gethostbyname(const char* host, uint32_t* ip); 00174 00175 static WIZ820io * getInstance() { 00176 return inst; 00177 }; 00178 00179 int new_socket(); 00180 uint16_t new_port(); 00181 void scmd(int socket, Command cmd); 00182 00183 template<typename T> 00184 void sreg(int socket, uint16_t addr, T data) { 00185 reg_wr<T>(addr+0x100*socket, data); 00186 } 00187 00188 template<typename T> 00189 T sreg(int socket, uint16_t addr) { 00190 return reg_rd<T>(addr+0x100*socket); 00191 } 00192 00193 template<typename T> 00194 void reg_wr(uint16_t addr, T data) { 00195 uint8_t buf[sizeof(T)]; 00196 *reinterpret_cast<T*>(buf) = data; 00197 for(int i = 0; i < sizeof(buf)/2; i++) { // Little Endian to Big Endian 00198 uint8_t t = buf[i]; 00199 buf[i] = buf[sizeof(buf)-1-i]; 00200 buf[sizeof(buf)-1-i] = t; 00201 } 00202 spi_write(addr, buf, sizeof(buf)); 00203 } 00204 00205 template<typename T> 00206 T reg_rd(uint16_t addr) { 00207 uint8_t buf[sizeof(T)]; 00208 spi_read(addr, buf, sizeof(buf)); 00209 for(int i = 0; i < sizeof(buf)/2; i++) { // Big Endian to Little Endian 00210 uint8_t t = buf[i]; 00211 buf[i] = buf[sizeof(buf)-1-i]; 00212 buf[sizeof(buf)-1-i] = t; 00213 } 00214 return *reinterpret_cast<T*>(buf); 00215 } 00216 00217 void reg_rd_mac(uint16_t addr, uint8_t* data) { 00218 spi_read(addr, data, 6); 00219 } 00220 00221 void reg_wr_ip(uint16_t addr, const char* ip) { 00222 uint8_t buf[4]; 00223 char* p = (char*)ip; 00224 for(int i = 0; i < 4; i++) { 00225 buf[i] = atoi(p); 00226 p = strchr(p, '.'); 00227 if (p == NULL) { 00228 break; 00229 } 00230 p++; 00231 } 00232 spi_write(addr, buf, sizeof(buf)); 00233 } 00234 00235 void sreg_ip(int socket, uint16_t addr, const char* ip) { 00236 reg_wr_ip(addr+0x100*socket, ip); 00237 } 00238 00239 protected: 00240 uint32_t ip; 00241 uint32_t netmask; 00242 uint32_t gateway; 00243 uint32_t dnsaddr; 00244 bool dhcp; 00245 00246 static WIZ820io* inst; 00247 00248 void reg_wr_mac(uint16_t addr, uint8_t* data) { 00249 spi_write(addr, data, 6); 00250 } 00251 00252 void spi_write(uint16_t addr, const uint8_t *buf, uint16_t len); 00253 void spi_read(uint16_t addr, uint8_t *buf, uint16_t len); 00254 SPI* spi; 00255 DigitalOut cs; 00256 DigitalOut reset_pin; 00257 }; 00258 00259 // WIZ820io.cpp 00260 extern uint32_t str_to_ip(const char* str); 00261 extern void printfBytes(char* str, uint8_t* buf, int len); 00262 extern void printHex(uint8_t* buf, int len); 00263 extern void debug_hex(uint8_t* buf, int len);
Generated on Thu Jul 14 2022 10:39:51 by
