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 WIZnet_Library by
W5100.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_ESTABLISHED = 0x17, 00061 SOCK_CLOSE_WAIT = 0x1c, 00062 SOCK_UDP = 0x22, 00063 }; 00064 00065 #define MAX_SOCK_NUM 4 00066 00067 #define MR 0x0000 00068 #define GAR 0x0001 00069 #define SUBR 0x0005 00070 #define SHAR 0x0009 00071 #define SIPR 0x000f 00072 00073 // W5100 socket 00074 #define Sn_MR 0x0400 00075 #define Sn_CR 0x0401 00076 #define Sn_IR 0x0402 00077 #define Sn_SR 0x0403 00078 #define Sn_PORT 0x0404 00079 #define Sn_DIPR 0x040c 00080 #define Sn_DPORT 0x0410 00081 //#define Sn_RXBUF_SIZE 0x401e 00082 //#define Sn_TXBUF_SIZE 0x401f 00083 #define Sn_TX_FSR 0x0420 00084 #define Sn_TX_WR 0x0424 00085 #define Sn_RX_RSR 0x0426 00086 #define Sn_RX_RD 0x0428 00087 00088 class WIZnet_Chip { 00089 public: 00090 /* 00091 * Constructor 00092 * 00093 * @param spi spi class 00094 * @param cs cs of the W5200 00095 * @param reset reset pin of the W5200 00096 */ 00097 WIZnet_Chip(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName reset); 00098 WIZnet_Chip(SPI* spi, PinName cs, PinName reset); 00099 00100 /* 00101 * Connect the W5200 module to the ssid contained in the constructor. 00102 * 00103 * @return true if connected, false otherwise 00104 */ 00105 bool setip(); 00106 00107 /* 00108 * Disconnect the W5200 module from the access point 00109 * 00110 * @ returns true if successful 00111 */ 00112 bool disconnect(); 00113 00114 /* 00115 * Open a tcp connection with the specified host on the specified port 00116 * 00117 * @param host host (can be either an ip address or a name. If a name is provided, a dns request will be established) 00118 * @param port port 00119 * @ returns true if successful 00120 */ 00121 bool connect(int socket, const char * host, int port, int timeout_ms = 10*1000); 00122 00123 /* 00124 * Set the protocol (UDP or TCP) 00125 * 00126 * @param p protocol 00127 * @ returns true if successful 00128 */ 00129 bool setProtocol(int socket, Protocol p); 00130 00131 /* 00132 * Reset the W5100 module 00133 */ 00134 void reset(); 00135 00136 00137 int wait_readable(int socket, int wait_time_ms, int req_size = 0); 00138 00139 int wait_writeable(int socket, int wait_time_ms, int req_size = 0); 00140 00141 /* 00142 * Check if a tcp link is active 00143 * 00144 * @returns true if successful 00145 */ 00146 bool is_connected(int socket); 00147 00148 /* 00149 * Check if FIN received. 00150 * 00151 * @returns true if successful 00152 */ 00153 bool is_fin_received(int socket); 00154 00155 /* 00156 * Close a tcp connection 00157 * 00158 * @ returns true if successful 00159 */ 00160 bool close(int socket); 00161 00162 /* 00163 * @param str string to be sent 00164 * @param len string length 00165 */ 00166 int send(int socket, const char * str, int len); 00167 00168 int recv(int socket, char* buf, int len); 00169 00170 /* 00171 * Return true if the module is using dhcp 00172 * 00173 * @returns true if the module is using dhcp 00174 */ 00175 bool isDHCP() { 00176 return dhcp; 00177 } 00178 00179 bool gethostbyname(const char* host, uint32_t* ip); 00180 00181 static WIZnet_Chip * getInstance() { 00182 return inst; 00183 }; 00184 00185 int new_socket(); 00186 uint16_t new_port(); 00187 void scmd(int socket, Command cmd); 00188 00189 template<typename T> 00190 void sreg(int socket, uint16_t addr, T data) { 00191 reg_wr<T>(addr+0x100*socket, data); 00192 } 00193 00194 template<typename T> 00195 T sreg(int socket, uint16_t addr) { 00196 return reg_rd<T>(addr+0x100*socket); 00197 } 00198 00199 template<typename T> 00200 void reg_wr(uint16_t addr, T data) { 00201 uint8_t buf[sizeof(T)]; 00202 *reinterpret_cast<T*>(buf) = data; 00203 for(int i = 0; i < sizeof(buf)/2; i++) { // Little Endian to Big Endian 00204 uint8_t t = buf[i]; 00205 buf[i] = buf[sizeof(buf)-1-i]; 00206 buf[sizeof(buf)-1-i] = t; 00207 } 00208 spi_write(addr, buf, sizeof(buf)); 00209 } 00210 00211 template<typename T> 00212 T reg_rd(uint16_t addr) { 00213 uint8_t buf[sizeof(T)]; 00214 spi_read(addr, buf, sizeof(buf)); 00215 for(int i = 0; i < sizeof(buf)/2; i++) { // Big Endian to Little Endian 00216 uint8_t t = buf[i]; 00217 buf[i] = buf[sizeof(buf)-1-i]; 00218 buf[sizeof(buf)-1-i] = t; 00219 } 00220 return *reinterpret_cast<T*>(buf); 00221 } 00222 00223 void reg_rd_mac(uint16_t addr, uint8_t* data) { 00224 spi_read(addr, data, 6); 00225 } 00226 00227 void reg_wr_ip(uint16_t addr, const char* ip) { 00228 uint8_t buf[4]; 00229 char* p = (char*)ip; 00230 for(int i = 0; i < 4; i++) { 00231 buf[i] = atoi(p); 00232 p = strchr(p, '.'); 00233 if (p == NULL) { 00234 break; 00235 } 00236 p++; 00237 } 00238 spi_write(addr, buf, sizeof(buf)); 00239 } 00240 00241 void sreg_ip(int socket, uint16_t addr, const char* ip) { 00242 reg_wr_ip(addr+0x100*socket, ip); 00243 } 00244 00245 protected: 00246 uint8_t mac[6]; 00247 uint32_t ip; 00248 uint32_t netmask; 00249 uint32_t gateway; 00250 uint32_t dnsaddr; 00251 bool dhcp; 00252 00253 static WIZnet_Chip* inst; 00254 00255 void reg_wr_mac(uint16_t addr, uint8_t* data) { 00256 spi_write(addr, data, 6); 00257 } 00258 00259 void spi_write(uint16_t addr, const uint8_t *buf, uint16_t len); 00260 void spi_read(uint16_t addr, uint8_t *buf, uint16_t len); 00261 SPI* spi; 00262 DigitalOut cs; 00263 DigitalOut reset_pin; 00264 }; 00265 00266 extern uint32_t str_to_ip(const char* str); 00267 extern void printfBytes(char* str, uint8_t* buf, int len); 00268 extern void printHex(uint8_t* buf, int len); 00269 extern void debug_hex(uint8_t* buf, int len);
Generated on Wed Jul 13 2022 13:08:19 by
1.7.2
