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 WIZnetInterface by
W7500x_toe.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 #pragma once 00020 00021 #include "mbed.h" 00022 #include "mbed_debug.h" 00023 00024 #define TEST_ASSERT(A) while(!(A)){debug("\n\n%s@%d %s ASSERT!\n\n",__PRETTY_FUNCTION__,__LINE__,#A);exit(1);}; 00025 00026 #define DEFAULT_WAIT_RESP_TIMEOUT 500 00027 00028 00029 #define MAX_SOCK_NUM 8 00030 00031 // Peripheral base address 00032 #define W7500x_WZTOE_BASE (0x46000000) 00033 #define W7500x_TXMEM_BASE (W7500x_WZTOE_BASE + 0x00020000) 00034 #define W7500x_RXMEM_BASE (W7500x_WZTOE_BASE + 0x00030000) 00035 // Common register 00036 #define MR (0x2300) 00037 #define GAR (0x6008) 00038 #define SUBR (0x600C) 00039 #define SHAR (0x6000) 00040 #define SIPR (0x6010) 00041 00042 // Added Common register @W7500 00043 #define TIC100US (0x2000) 00044 00045 // Socket register 00046 #define Sn_MR (0x0000) 00047 #define Sn_CR (0x0010) 00048 #define Sn_IR (0x0020) //--Sn_ISR 00049 #define Sn_SR (0x0030) 00050 #define Sn_PORT (0x0114) 00051 #define Sn_DIPR (0x0124) 00052 #define Sn_DPORT (0x0120) 00053 #define Sn_RXBUF_SIZE (0x0200) 00054 #define Sn_TXBUF_SIZE (0x0220) 00055 #define Sn_TX_FSR (0x0204) 00056 #define Sn_TX_WR (0x020C) 00057 #define Sn_RX_RSR (0x0224) 00058 #define Sn_RX_RD (0x0228) 00059 // added Socket register @W7500 00060 #define Sn_ICR (0x0028) 00061 enum PHYMode { 00062 AutoNegotiate = 0, 00063 HalfDuplex10 = 1, 00064 FullDuplex10 = 2, 00065 HalfDuplex100 = 3, 00066 FullDuplex100 = 4, 00067 }; 00068 00069 //bool plink(int wait_time_ms= 3*1000); 00070 00071 class WIZnet_Chip { 00072 public: 00073 enum Protocol { 00074 CLOSED = 0, 00075 TCP = 1, 00076 UDP = 2, 00077 }; 00078 00079 enum Command { 00080 OPEN = 0x01, 00081 LISTEN = 0x02, 00082 CONNECT = 0x04, 00083 DISCON = 0x08, 00084 CLOSE = 0x10, 00085 SEND = 0x20, 00086 SEND_MAC = 0x21, 00087 SEND_KEEP = 0x22, 00088 RECV = 0x40, 00089 00090 }; 00091 00092 enum Interrupt { 00093 INT_CON = 0x01, 00094 INT_DISCON = 0x02, 00095 INT_RECV = 0x04, 00096 INT_TIMEOUT = 0x08, 00097 INT_SEND_OK = 0x10, 00098 }; 00099 enum Status { 00100 SOCK_CLOSED = 0x00, 00101 SOCK_INIT = 0x13, 00102 SOCK_LISTEN = 0x14, 00103 SOCK_SYNSENT = 0x15, 00104 SOCK_ESTABLISHED = 0x17, 00105 SOCK_CLOSE_WAIT = 0x1c, 00106 SOCK_UDP = 0x22, 00107 }; 00108 enum Mode { 00109 MR_RST = 0x80, 00110 MR_WOL = 0x20, 00111 MR_PB = 0x10, 00112 MR_FARP = 0x02, 00113 }; 00114 00115 WIZnet_Chip(); 00116 00117 /* 00118 * Set MAC Address to W7500x_TOE 00119 * 00120 * @return true if connected, false otherwise 00121 */ 00122 bool setmac(); 00123 00124 /* 00125 * Connect the W7500 WZTOE to the ssid contained in the constructor. 00126 * 00127 * @return true if connected, false otherwise 00128 */ 00129 bool setip(); 00130 00131 00132 /* 00133 * Open a tcp connection with the specified host on the specified port 00134 * 00135 * @param host host (can be either an ip address or a name. If a name is provided, a dns request will be established) 00136 * @param port port 00137 * @ returns true if successful 00138 */ 00139 bool connect(int socket, const char * host, int port, int timeout_ms = 10*1000); 00140 00141 /* 00142 * Set the protocol (UDP or TCP) 00143 * 00144 * @param p protocol 00145 * @ returns true if successful 00146 */ 00147 bool setProtocol(int socket, Protocol p); 00148 00149 /* 00150 * Reset the W7500 WZTOE 00151 */ 00152 void reset(); 00153 00154 int wait_readable(int socket, int wait_time_ms, int req_size = 0); 00155 00156 int wait_writeable(int socket, int wait_time_ms, int req_size = 0); 00157 00158 /* 00159 * Check if an ethernet link is pressent or not. 00160 * 00161 * @returns true if successful 00162 */ 00163 bool link(int wait_time_ms= 3*1000); 00164 00165 /* 00166 * Sets the speed and duplex parameters of an ethernet link. 00167 * 00168 * @returns true if successful 00169 */ 00170 void set_link(PHYMode phymode); 00171 00172 /* 00173 * Check if a tcp link is active 00174 * 00175 * @returns true if successful 00176 */ 00177 bool is_connected(int socket); 00178 00179 /* 00180 * Close a tcp connection 00181 * 00182 * @ returns true if successful 00183 */ 00184 bool close(int socket); 00185 00186 /* 00187 * @param str string to be sent 00188 * @param len string length 00189 */ 00190 int send(int socket, const char * str, int len); 00191 00192 int recv(int socket, char* buf, int len); 00193 00194 /* 00195 * Return true if the module is using dhcp 00196 * 00197 * @returns true if the module is using dhcp 00198 */ 00199 bool isDHCP() { 00200 return dhcp; 00201 } 00202 00203 bool gethostbyname(const char* host, uint32_t* ip); 00204 00205 static WIZnet_Chip * getInstance() { 00206 return inst; 00207 }; 00208 00209 int new_socket(); 00210 uint16_t new_port(); 00211 00212 void scmd(int socket, Command cmd); 00213 00214 template<typename T> 00215 void sreg(int socket, uint16_t addr, T data) { 00216 reg_wr<T>(addr, (uint8_t)(0x01+(socket<<2)), data); 00217 } 00218 00219 template<typename T> 00220 T sreg(int socket, uint16_t addr) { 00221 return reg_rd<T>(addr, (uint8_t)(0x01+(socket<<2))); 00222 } 00223 00224 template<typename T> 00225 void reg_wr(uint16_t addr, T data) { 00226 return reg_wr(addr, 0x00, data); 00227 } 00228 00229 template<typename T> 00230 void reg_wr(uint16_t addr, uint8_t cb, T data) { 00231 uint8_t buf[sizeof(T)]; 00232 *reinterpret_cast<T*>(buf) = data; 00233 /* 00234 for(int i = 0; i < sizeof(buf)/2; i++) { // Little Endian to Big Endian 00235 uint8_t t = buf[i]; 00236 buf[i] = buf[sizeof(buf)-1-i]; 00237 buf[sizeof(buf)-1-i] = t; 00238 } 00239 */ 00240 for(int i = 0; i < sizeof(buf); i++) { // Little Endian to Big Endian 00241 *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)((cb<<16)+addr)+i) = buf[i]; 00242 } 00243 } 00244 00245 template<typename T> 00246 T reg_rd(uint16_t addr) { 00247 return reg_rd<T>(addr, (uint8_t)(0x00)); 00248 } 00249 00250 template<typename T> 00251 T reg_rd(uint16_t addr, uint8_t cb) { 00252 uint8_t buf[sizeof(T)] = {0,}; 00253 for(int i = 0; i < sizeof(buf); i++) { // Little Endian to Big Endian 00254 buf[i] = *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)((cb<<16)+addr)+i); 00255 } 00256 /* 00257 for(int i = 0; i < sizeof(buf)/2; i++) { // Big Endian to Little Endian 00258 uint8_t t = buf[i]; 00259 buf[i] = buf[sizeof(buf)-1-i]; 00260 buf[sizeof(buf)-1-i] = t; 00261 } 00262 */ 00263 return *reinterpret_cast<T*>(buf); 00264 } 00265 00266 void reg_rd_mac(uint16_t addr, uint8_t* data); 00267 00268 void reg_wr_ip(uint16_t addr, uint8_t cb, const char* ip); 00269 00270 void sreg_ip(int socket, uint16_t addr, const char* ip); 00271 00272 int ethernet_link(void); 00273 00274 void ethernet_set_link(int speed, int duplex); 00275 00276 00277 protected: 00278 uint8_t mac[6]; 00279 uint32_t ip; 00280 uint32_t netmask; 00281 uint32_t gateway; 00282 uint32_t dnsaddr; 00283 bool dhcp; 00284 00285 static WIZnet_Chip* inst; 00286 00287 void reg_wr_mac(uint16_t addr, uint8_t* data) { 00288 *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+3)) = data[0] ; 00289 *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+2)) = data[1] ; 00290 *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+1)) = data[2] ; 00291 *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+0)) = data[3] ; 00292 *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+7)) = data[4] ; 00293 *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+6)) = data[5] ; 00294 } 00295 }; 00296 00297 extern uint32_t str_to_ip(const char* str); 00298 extern void printfBytes(char* str, uint8_t* buf, int len); 00299 extern void printHex(uint8_t* buf, int len); 00300 extern void debug_hex(uint8_t* buf, int len);
Generated on Tue Jul 12 2022 20:38:48 by
1.7.2
