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