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
arch/int/W7500x_toe.cpp@15:24a9f2df2145, 2015-06-22 (annotated)
- Committer:
- embeddist
- Date:
- Mon Jun 22 09:11:47 2015 +0000
- Revision:
- 15:24a9f2df2145
- Parent:
- 14:2101ab5ee40f
- Child:
- 19:d8773cd4edc5
- Child:
- 24:06e3836a627b
- fixed DHCP bug.; - fixed link check func.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Soohwan Kim |
0:6f28332c466f | 1 | /* Copyright (C) 2012 mbed.org, MIT License |
Soohwan Kim |
0:6f28332c466f | 2 | * |
Soohwan Kim |
0:6f28332c466f | 3 | * and associated documentation files (the "Software"), to deal in the Software without restriction, |
Soohwan Kim |
0:6f28332c466f | 4 | * including without limitation the rights to use, copy, modify, merge, publish, distribute, |
Soohwan Kim |
0:6f28332c466f | 5 | * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is |
Soohwan Kim |
0:6f28332c466f | 6 | * furnished to do so, subject to the following conditions: |
Soohwan Kim |
0:6f28332c466f | 7 | * |
Soohwan Kim |
0:6f28332c466f | 8 | * The above copyright notice and this permission notice shall be included in all copies or |
Soohwan Kim |
0:6f28332c466f | 9 | * substantial portions of the Software. |
Soohwan Kim |
0:6f28332c466f | 10 | * |
Soohwan Kim |
0:6f28332c466f | 11 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING |
Soohwan Kim |
0:6f28332c466f | 12 | * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
Soohwan Kim |
0:6f28332c466f | 13 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
Soohwan Kim |
0:6f28332c466f | 14 | * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
Soohwan Kim |
0:6f28332c466f | 15 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
Soohwan Kim |
0:6f28332c466f | 16 | */ |
embeddist | 3:f8c6efc8bf83 | 17 | #include "eth_arch.h" |
Soohwan Kim |
8:4c02de1dbf3a | 18 | #if defined(TARGET_WIZwiki_W7500) |
Soohwan Kim |
0:6f28332c466f | 19 | |
Soohwan Kim |
0:6f28332c466f | 20 | #include "mbed.h" |
Soohwan Kim |
0:6f28332c466f | 21 | #include "mbed_debug.h" |
Soohwan Kim |
0:6f28332c466f | 22 | #include "DNSClient.h" |
Soohwan Kim |
0:6f28332c466f | 23 | |
Soohwan Kim |
0:6f28332c466f | 24 | |
Soohwan Kim |
0:6f28332c466f | 25 | /* |
Soohwan Kim |
0:6f28332c466f | 26 | * MDIO via GPIO |
Soohwan Kim |
0:6f28332c466f | 27 | * mdio via gpio is supported and related functions as follows. |
Soohwan Kim |
0:6f28332c466f | 28 | * - mdio_init(),mdio_read(),mdio_write() |
Soohwan Kim |
0:6f28332c466f | 29 | * - input_MDIO(),output_MDIO(),turnaroud_MDIO(),idle_MDIO() |
Soohwan Kim |
0:6f28332c466f | 30 | * called by ethernet_link() and ethernet_set_link() |
Soohwan Kim |
0:6f28332c466f | 31 | */ |
Soohwan Kim |
0:6f28332c466f | 32 | #define MDIO GPIO_Pin_14 |
Soohwan Kim |
0:6f28332c466f | 33 | #define MDC GPIO_Pin_15 |
Soohwan Kim |
0:6f28332c466f | 34 | #define GPIO_MDC GPIOB |
Soohwan Kim |
0:6f28332c466f | 35 | #define PHY_ADDR_IP101G 0x07 |
Soohwan Kim |
0:6f28332c466f | 36 | #define PHY_ADDR PHY_ADDR_IP101G |
Soohwan Kim |
0:6f28332c466f | 37 | #define SVAL 0x2 //right shift val = 2 |
Soohwan Kim |
0:6f28332c466f | 38 | #define PHYREG_CONTROL 0x0 //Control Register address (Contorl basic register) |
Soohwan Kim |
0:6f28332c466f | 39 | #define PHYREG_STATUS 0x1 //Status Register address (Status basic register) |
Soohwan Kim |
0:6f28332c466f | 40 | #define CNTL_DUPLEX (0x01ul<< 7) |
Soohwan Kim |
0:6f28332c466f | 41 | #define CNTL_AUTONEGO (0x01ul<<11) |
Soohwan Kim |
0:6f28332c466f | 42 | #define CNTL_SPEED (0x01ul<<12) |
Soohwan Kim |
0:6f28332c466f | 43 | #define MDC_WAIT (1) |
Soohwan Kim |
0:6f28332c466f | 44 | void mdio_init(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin_MDC, uint16_t GPIO_Pin_MDIO); |
Soohwan Kim |
0:6f28332c466f | 45 | void mdio_write(GPIO_TypeDef* GPIOx, uint32_t PhyRegAddr, uint32_t val); |
Soohwan Kim |
0:6f28332c466f | 46 | uint32_t mdio_read(GPIO_TypeDef* GPIOx, uint32_t PhyRegAddr); |
Soohwan Kim |
0:6f28332c466f | 47 | |
Soohwan Kim |
0:6f28332c466f | 48 | WIZnet_Chip* WIZnet_Chip::inst; |
Soohwan Kim |
0:6f28332c466f | 49 | |
Soohwan Kim |
0:6f28332c466f | 50 | WIZnet_Chip::WIZnet_Chip() |
Soohwan Kim |
0:6f28332c466f | 51 | { |
Soohwan Kim |
0:6f28332c466f | 52 | inst = this; |
Soohwan Kim |
0:6f28332c466f | 53 | } |
Soohwan Kim |
0:6f28332c466f | 54 | |
Soohwan Kim |
8:4c02de1dbf3a | 55 | bool WIZnet_Chip::setmac() |
Soohwan Kim |
8:4c02de1dbf3a | 56 | { |
Soohwan Kim |
8:4c02de1dbf3a | 57 | |
Soohwan Kim |
8:4c02de1dbf3a | 58 | for (int i =0; i < 6; i++) reg_wr<uint8_t>(SHAR+i, mac[i]); |
Soohwan Kim |
8:4c02de1dbf3a | 59 | |
Soohwan Kim |
8:4c02de1dbf3a | 60 | return true; |
Soohwan Kim |
8:4c02de1dbf3a | 61 | } |
Soohwan Kim |
8:4c02de1dbf3a | 62 | |
Soohwan Kim |
0:6f28332c466f | 63 | // Set the IP |
Soohwan Kim |
0:6f28332c466f | 64 | bool WIZnet_Chip::setip() |
Soohwan Kim |
0:6f28332c466f | 65 | { |
Soohwan Kim |
0:6f28332c466f | 66 | reg_wr<uint32_t>(SIPR, ip); |
Soohwan Kim |
0:6f28332c466f | 67 | reg_wr<uint32_t>(GAR, gateway); |
Soohwan Kim |
0:6f28332c466f | 68 | reg_wr<uint32_t>(SUBR, netmask); |
Soohwan Kim |
0:6f28332c466f | 69 | return true; |
Soohwan Kim |
0:6f28332c466f | 70 | } |
Soohwan Kim |
0:6f28332c466f | 71 | |
Soohwan Kim |
0:6f28332c466f | 72 | bool WIZnet_Chip::setProtocol(int socket, Protocol p) |
Soohwan Kim |
0:6f28332c466f | 73 | { |
Soohwan Kim |
0:6f28332c466f | 74 | if (socket < 0) { |
Soohwan Kim |
0:6f28332c466f | 75 | return false; |
Soohwan Kim |
0:6f28332c466f | 76 | } |
Soohwan Kim |
0:6f28332c466f | 77 | sreg<uint8_t>(socket, Sn_MR, p); |
Soohwan Kim |
0:6f28332c466f | 78 | return true; |
Soohwan Kim |
0:6f28332c466f | 79 | } |
Soohwan Kim |
0:6f28332c466f | 80 | |
Soohwan Kim |
0:6f28332c466f | 81 | bool WIZnet_Chip::connect(int socket, const char * host, int port, int timeout_ms) |
Soohwan Kim |
0:6f28332c466f | 82 | { |
Soohwan Kim |
0:6f28332c466f | 83 | if (socket < 0) { |
Soohwan Kim |
0:6f28332c466f | 84 | return false; |
Soohwan Kim |
0:6f28332c466f | 85 | } |
Soohwan Kim |
0:6f28332c466f | 86 | sreg<uint8_t>(socket, Sn_MR, TCP); |
Soohwan Kim |
0:6f28332c466f | 87 | scmd(socket, OPEN); |
Soohwan Kim |
0:6f28332c466f | 88 | sreg_ip(socket, Sn_DIPR, host); |
Soohwan Kim |
0:6f28332c466f | 89 | sreg<uint16_t>(socket, Sn_DPORT, port); |
Soohwan Kim |
0:6f28332c466f | 90 | sreg<uint16_t>(socket, Sn_PORT, new_port()); |
Soohwan Kim |
0:6f28332c466f | 91 | scmd(socket, CONNECT); |
Soohwan Kim |
0:6f28332c466f | 92 | Timer t; |
Soohwan Kim |
0:6f28332c466f | 93 | t.reset(); |
Soohwan Kim |
0:6f28332c466f | 94 | t.start(); |
Soohwan Kim |
0:6f28332c466f | 95 | while(!is_connected(socket)) { |
Soohwan Kim |
0:6f28332c466f | 96 | if (t.read_ms() > timeout_ms) { |
Soohwan Kim |
0:6f28332c466f | 97 | return false; |
Soohwan Kim |
0:6f28332c466f | 98 | } |
Soohwan Kim |
0:6f28332c466f | 99 | } |
Soohwan Kim |
0:6f28332c466f | 100 | return true; |
Soohwan Kim |
0:6f28332c466f | 101 | } |
Soohwan Kim |
0:6f28332c466f | 102 | |
Soohwan Kim |
0:6f28332c466f | 103 | bool WIZnet_Chip::gethostbyname(const char* host, uint32_t* ip) |
Soohwan Kim |
0:6f28332c466f | 104 | { |
Soohwan Kim |
0:6f28332c466f | 105 | uint32_t addr = str_to_ip(host); |
Soohwan Kim |
0:6f28332c466f | 106 | char buf[17]; |
Soohwan Kim |
0:6f28332c466f | 107 | snprintf(buf, sizeof(buf), "%d.%d.%d.%d", |
Soohwan Kim |
0:6f28332c466f | 108 | (uint8_t)((addr>>24)&0xff), |
Soohwan Kim |
0:6f28332c466f | 109 | (uint8_t)((addr>>16)&0xff), |
Soohwan Kim |
0:6f28332c466f | 110 | (uint8_t)((addr>>8)&0xff), |
Soohwan Kim |
0:6f28332c466f | 111 | (uint8_t)(addr&0xff)); |
Soohwan Kim |
0:6f28332c466f | 112 | if (strcmp(buf, host) == 0) { |
Soohwan Kim |
0:6f28332c466f | 113 | *ip = addr; |
Soohwan Kim |
0:6f28332c466f | 114 | return true; |
Soohwan Kim |
0:6f28332c466f | 115 | } |
Soohwan Kim |
0:6f28332c466f | 116 | DNSClient client; |
Soohwan Kim |
0:6f28332c466f | 117 | if(client.lookup(host)) { |
Soohwan Kim |
0:6f28332c466f | 118 | *ip = client.ip; |
Soohwan Kim |
0:6f28332c466f | 119 | return true; |
Soohwan Kim |
0:6f28332c466f | 120 | } |
Soohwan Kim |
0:6f28332c466f | 121 | return false; |
Soohwan Kim |
0:6f28332c466f | 122 | } |
Soohwan Kim |
0:6f28332c466f | 123 | |
Soohwan Kim |
0:6f28332c466f | 124 | |
Soohwan Kim |
0:6f28332c466f | 125 | bool WIZnet_Chip::is_connected(int socket) |
Soohwan Kim |
0:6f28332c466f | 126 | { |
Soohwan Kim |
0:6f28332c466f | 127 | /* |
Soohwan Kim |
0:6f28332c466f | 128 | if (sreg<uint8_t>(socket, Sn_SR) == SOCK_ESTABLISHED) { |
Soohwan Kim |
0:6f28332c466f | 129 | return true; |
Soohwan Kim |
0:6f28332c466f | 130 | } |
Soohwan Kim |
0:6f28332c466f | 131 | */ |
Soohwan Kim |
0:6f28332c466f | 132 | uint8_t tmpSn_SR; |
Soohwan Kim |
0:6f28332c466f | 133 | tmpSn_SR = sreg<uint8_t>(socket, Sn_SR); |
Soohwan Kim |
0:6f28332c466f | 134 | // packet sending is possible, when state is SOCK_CLOSE_WAIT. |
Soohwan Kim |
0:6f28332c466f | 135 | if ((tmpSn_SR == SOCK_ESTABLISHED) || (tmpSn_SR == SOCK_CLOSE_WAIT)) { |
Soohwan Kim |
0:6f28332c466f | 136 | return true; |
Soohwan Kim |
0:6f28332c466f | 137 | } |
Soohwan Kim |
0:6f28332c466f | 138 | return false; |
Soohwan Kim |
0:6f28332c466f | 139 | } |
Soohwan Kim |
0:6f28332c466f | 140 | // Reset the chip & set the buffer |
Soohwan Kim |
0:6f28332c466f | 141 | void WIZnet_Chip::reset() |
Soohwan Kim |
0:6f28332c466f | 142 | { |
Soohwan Kim |
0:6f28332c466f | 143 | /* S/W Reset PHY */ |
Soohwan Kim |
0:6f28332c466f | 144 | mdio_write(GPIO_MDC, PHYREG_CONTROL, 0x8000); |
Soohwan Kim |
0:6f28332c466f | 145 | wait_ms(10);//for S/W reset |
Soohwan Kim |
0:6f28332c466f | 146 | wait_ms(10);//for MDC I/F RDY |
Soohwan Kim |
0:6f28332c466f | 147 | |
embeddist | 15:24a9f2df2145 | 148 | mdio_init(GPIO_MDC, MDC, MDIO); |
embeddist | 15:24a9f2df2145 | 149 | |
Soohwan Kim |
0:6f28332c466f | 150 | /* S/W Reset WZTOE */ |
Soohwan Kim |
0:6f28332c466f | 151 | reg_wr<uint8_t>(MR, MR_RST); |
Soohwan Kim |
0:6f28332c466f | 152 | // set PAD strengh and pull-up for TXD[3:0] and TXE |
Soohwan Kim |
0:6f28332c466f | 153 | #ifdef __DEF_USED_IC101AG__ //For using IC+101AG |
Soohwan Kim |
0:6f28332c466f | 154 | *(volatile uint32_t *)(0x41003068) = 0x64; //TXD0 |
Soohwan Kim |
0:6f28332c466f | 155 | *(volatile uint32_t *)(0x4100306C) = 0x64; //TXD1 |
Soohwan Kim |
0:6f28332c466f | 156 | *(volatile uint32_t *)(0x41003070) = 0x64; //TXD2 |
Soohwan Kim |
0:6f28332c466f | 157 | *(volatile uint32_t *)(0x41003074) = 0x64; //TXD3 |
Soohwan Kim |
0:6f28332c466f | 158 | *(volatile uint32_t *)(0x41003050) = 0x64; //TXE |
Soohwan Kim |
0:6f28332c466f | 159 | #endif |
Soohwan Kim |
0:6f28332c466f | 160 | // set ticker counter |
Soohwan Kim |
0:6f28332c466f | 161 | reg_wr<uint32_t>(TIC100US, (SystemCoreClock/10000)); |
Soohwan Kim |
0:6f28332c466f | 162 | // write MAC address inside the WZTOE MAC address register |
Soohwan Kim |
0:6f28332c466f | 163 | reg_wr_mac(SHAR, mac); |
Soohwan Kim |
0:6f28332c466f | 164 | /* |
Soohwan Kim |
0:6f28332c466f | 165 | * set RX and TX buffer size |
Soohwan Kim |
0:6f28332c466f | 166 | * for (int socket = 0; socket < MAX_SOCK_NUM; socket++) { |
Soohwan Kim |
0:6f28332c466f | 167 | * sreg<uint8_t>(socket, Sn_RXBUF_SIZE, 2); |
Soohwan Kim |
0:6f28332c466f | 168 | * sreg<uint8_t>(socket, Sn_TXBUF_SIZE, 2); |
Soohwan Kim |
0:6f28332c466f | 169 | * } |
Soohwan Kim |
0:6f28332c466f | 170 | */ |
Soohwan Kim |
0:6f28332c466f | 171 | } |
Soohwan Kim |
0:6f28332c466f | 172 | |
Soohwan Kim |
0:6f28332c466f | 173 | |
Soohwan Kim |
0:6f28332c466f | 174 | bool WIZnet_Chip::close(int socket) |
Soohwan Kim |
0:6f28332c466f | 175 | { |
Soohwan Kim |
0:6f28332c466f | 176 | if (socket < 0) { |
Soohwan Kim |
0:6f28332c466f | 177 | return false; |
Soohwan Kim |
0:6f28332c466f | 178 | } |
Soohwan Kim |
0:6f28332c466f | 179 | // if SOCK_CLOSED, return |
Soohwan Kim |
0:6f28332c466f | 180 | if (sreg<uint8_t>(socket, Sn_SR) == SOCK_CLOSED) { |
Soohwan Kim |
0:6f28332c466f | 181 | return true; |
Soohwan Kim |
0:6f28332c466f | 182 | } |
Soohwan Kim |
0:6f28332c466f | 183 | // if SOCK_ESTABLISHED, send FIN-Packet to peer |
Soohwan Kim |
0:6f28332c466f | 184 | if (sreg<uint8_t>(socket, Sn_MR) == TCP) { |
Soohwan Kim |
0:6f28332c466f | 185 | scmd(socket, DISCON); |
Soohwan Kim |
0:6f28332c466f | 186 | } |
Soohwan Kim |
0:6f28332c466f | 187 | // close socket |
Soohwan Kim |
0:6f28332c466f | 188 | scmd(socket, CLOSE); |
Soohwan Kim |
0:6f28332c466f | 189 | // clear Socket Interrupt Register |
Soohwan Kim |
0:6f28332c466f | 190 | sreg<uint8_t>(socket, Sn_ICR, 0xff); |
Soohwan Kim |
0:6f28332c466f | 191 | return true; |
Soohwan Kim |
0:6f28332c466f | 192 | } |
Soohwan Kim |
0:6f28332c466f | 193 | |
Soohwan Kim |
0:6f28332c466f | 194 | int WIZnet_Chip::wait_readable(int socket, int wait_time_ms, int req_size) |
Soohwan Kim |
0:6f28332c466f | 195 | { |
Soohwan Kim |
0:6f28332c466f | 196 | if (socket < 0) { |
Soohwan Kim |
0:6f28332c466f | 197 | return -1; |
Soohwan Kim |
0:6f28332c466f | 198 | } |
Soohwan Kim |
0:6f28332c466f | 199 | Timer t; |
Soohwan Kim |
0:6f28332c466f | 200 | t.reset(); |
Soohwan Kim |
0:6f28332c466f | 201 | t.start(); |
Soohwan Kim |
0:6f28332c466f | 202 | while(1) { |
Soohwan Kim |
0:6f28332c466f | 203 | int size = sreg<uint16_t>(socket, Sn_RX_RSR); |
Soohwan Kim |
0:6f28332c466f | 204 | if (size > req_size) { |
Soohwan Kim |
0:6f28332c466f | 205 | return size; |
Soohwan Kim |
0:6f28332c466f | 206 | } |
Soohwan Kim |
0:6f28332c466f | 207 | if (wait_time_ms != (-1) && t.read_ms() > wait_time_ms) { |
Soohwan Kim |
0:6f28332c466f | 208 | break; |
Soohwan Kim |
0:6f28332c466f | 209 | } |
Soohwan Kim |
0:6f28332c466f | 210 | } |
Soohwan Kim |
0:6f28332c466f | 211 | return -1; |
Soohwan Kim |
0:6f28332c466f | 212 | } |
Soohwan Kim |
0:6f28332c466f | 213 | |
Soohwan Kim |
0:6f28332c466f | 214 | int WIZnet_Chip::wait_writeable(int socket, int wait_time_ms, int req_size) |
Soohwan Kim |
0:6f28332c466f | 215 | { |
Soohwan Kim |
0:6f28332c466f | 216 | if (socket < 0) { |
Soohwan Kim |
0:6f28332c466f | 217 | return -1; |
Soohwan Kim |
0:6f28332c466f | 218 | } |
Soohwan Kim |
0:6f28332c466f | 219 | Timer t; |
Soohwan Kim |
0:6f28332c466f | 220 | t.reset(); |
Soohwan Kim |
0:6f28332c466f | 221 | t.start(); |
Soohwan Kim |
0:6f28332c466f | 222 | while(1) { |
Soohwan Kim |
0:6f28332c466f | 223 | int size = sreg<uint16_t>(socket, Sn_TX_FSR); |
Soohwan Kim |
0:6f28332c466f | 224 | if (size > req_size) { |
Soohwan Kim |
0:6f28332c466f | 225 | return size; |
Soohwan Kim |
0:6f28332c466f | 226 | } |
Soohwan Kim |
0:6f28332c466f | 227 | if (wait_time_ms != (-1) && t.read_ms() > wait_time_ms) { |
Soohwan Kim |
0:6f28332c466f | 228 | break; |
Soohwan Kim |
0:6f28332c466f | 229 | } |
Soohwan Kim |
0:6f28332c466f | 230 | } |
Soohwan Kim |
0:6f28332c466f | 231 | return -1; |
Soohwan Kim |
0:6f28332c466f | 232 | } |
Soohwan Kim |
0:6f28332c466f | 233 | |
Soohwan Kim |
0:6f28332c466f | 234 | int WIZnet_Chip::send(int socket, const char * str, int len) |
Soohwan Kim |
0:6f28332c466f | 235 | { |
Soohwan Kim |
0:6f28332c466f | 236 | if (socket < 0) { |
Soohwan Kim |
0:6f28332c466f | 237 | return -1; |
Soohwan Kim |
0:6f28332c466f | 238 | } |
Soohwan Kim |
0:6f28332c466f | 239 | |
Soohwan Kim |
0:6f28332c466f | 240 | uint16_t ptr = sreg<uint16_t>(socket, Sn_TX_WR); |
Soohwan Kim |
0:6f28332c466f | 241 | uint32_t sn_tx_base = W7500x_TXMEM_BASE + (uint32_t)(socket<<18); |
Soohwan Kim |
0:6f28332c466f | 242 | |
Soohwan Kim |
0:6f28332c466f | 243 | for(int i=0; i<len; i++) |
Soohwan Kim |
0:6f28332c466f | 244 | *(volatile uint8_t *)(sn_tx_base + ((ptr+i)&0xFFFF)) = str[i]; |
Soohwan Kim |
0:6f28332c466f | 245 | |
Soohwan Kim |
0:6f28332c466f | 246 | sreg<uint16_t>(socket, Sn_TX_WR, ptr + len); |
Soohwan Kim |
0:6f28332c466f | 247 | scmd(socket, SEND); |
Soohwan Kim |
0:6f28332c466f | 248 | |
Soohwan Kim |
0:6f28332c466f | 249 | uint8_t tmp_Sn_IR; |
Soohwan Kim |
0:6f28332c466f | 250 | while (( (tmp_Sn_IR = sreg<uint8_t>(socket, Sn_IR)) & INT_SEND_OK) != INT_SEND_OK) { |
Soohwan Kim |
0:6f28332c466f | 251 | // @Jul.10, 2014 fix contant name, and udp sendto function. |
Soohwan Kim |
0:6f28332c466f | 252 | switch (sreg<uint8_t>(socket, Sn_SR)) { |
Soohwan Kim |
0:6f28332c466f | 253 | case SOCK_CLOSED : |
Soohwan Kim |
0:6f28332c466f | 254 | close(socket); |
Soohwan Kim |
0:6f28332c466f | 255 | return 0; |
Soohwan Kim |
0:6f28332c466f | 256 | //break; |
Soohwan Kim |
0:6f28332c466f | 257 | case SOCK_UDP : |
Soohwan Kim |
0:6f28332c466f | 258 | // ARP timeout is possible. |
Soohwan Kim |
0:6f28332c466f | 259 | if ((tmp_Sn_IR & INT_TIMEOUT) == INT_TIMEOUT) { |
Soohwan Kim |
0:6f28332c466f | 260 | sreg<uint8_t>(socket, Sn_ICR, INT_TIMEOUT); |
Soohwan Kim |
0:6f28332c466f | 261 | return 0; |
Soohwan Kim |
0:6f28332c466f | 262 | } |
Soohwan Kim |
0:6f28332c466f | 263 | break; |
Soohwan Kim |
0:6f28332c466f | 264 | default : |
Soohwan Kim |
0:6f28332c466f | 265 | break; |
Soohwan Kim |
0:6f28332c466f | 266 | } |
Soohwan Kim |
0:6f28332c466f | 267 | } |
Soohwan Kim |
0:6f28332c466f | 268 | |
Soohwan Kim |
0:6f28332c466f | 269 | sreg<uint8_t>(socket, Sn_ICR, INT_SEND_OK); |
Soohwan Kim |
0:6f28332c466f | 270 | |
Soohwan Kim |
0:6f28332c466f | 271 | return len; |
Soohwan Kim |
0:6f28332c466f | 272 | } |
Soohwan Kim |
0:6f28332c466f | 273 | |
Soohwan Kim |
0:6f28332c466f | 274 | int WIZnet_Chip::recv(int socket, char* buf, int len) |
Soohwan Kim |
0:6f28332c466f | 275 | { |
Soohwan Kim |
0:6f28332c466f | 276 | if (socket < 0) { |
Soohwan Kim |
0:6f28332c466f | 277 | return -1; |
Soohwan Kim |
0:6f28332c466f | 278 | } |
Soohwan Kim |
0:6f28332c466f | 279 | uint16_t ptr = sreg<uint16_t>(socket, Sn_RX_RD); |
Soohwan Kim |
0:6f28332c466f | 280 | uint32_t sn_rx_base = W7500x_RXMEM_BASE + (uint32_t)(socket<<18); |
Soohwan Kim |
0:6f28332c466f | 281 | |
Soohwan Kim |
0:6f28332c466f | 282 | for(int i=0; i<len; i++) |
Soohwan Kim |
0:6f28332c466f | 283 | buf[i] = *(volatile uint8_t *)(sn_rx_base + ((ptr+i)&0xFFFF)); |
Soohwan Kim |
0:6f28332c466f | 284 | |
Soohwan Kim |
0:6f28332c466f | 285 | sreg<uint16_t>(socket, Sn_RX_RD, ptr + len); |
Soohwan Kim |
0:6f28332c466f | 286 | scmd(socket, RECV); |
Soohwan Kim |
0:6f28332c466f | 287 | |
Soohwan Kim |
0:6f28332c466f | 288 | return len; |
Soohwan Kim |
0:6f28332c466f | 289 | } |
Soohwan Kim |
0:6f28332c466f | 290 | |
Soohwan Kim |
0:6f28332c466f | 291 | int WIZnet_Chip::new_socket() |
Soohwan Kim |
0:6f28332c466f | 292 | { |
Soohwan Kim |
0:6f28332c466f | 293 | for(int s = 0; s < MAX_SOCK_NUM; s++) { |
Soohwan Kim |
0:6f28332c466f | 294 | if (sreg<uint8_t>(s, Sn_SR) == SOCK_CLOSED) { |
Soohwan Kim |
0:6f28332c466f | 295 | return s; |
Soohwan Kim |
0:6f28332c466f | 296 | } |
Soohwan Kim |
0:6f28332c466f | 297 | } |
Soohwan Kim |
0:6f28332c466f | 298 | return -1; |
Soohwan Kim |
0:6f28332c466f | 299 | } |
Soohwan Kim |
0:6f28332c466f | 300 | |
Soohwan Kim |
0:6f28332c466f | 301 | uint16_t WIZnet_Chip::new_port() |
Soohwan Kim |
0:6f28332c466f | 302 | { |
Soohwan Kim |
0:6f28332c466f | 303 | uint16_t port = rand(); |
Soohwan Kim |
0:6f28332c466f | 304 | port |= 49152; |
Soohwan Kim |
0:6f28332c466f | 305 | return port; |
Soohwan Kim |
0:6f28332c466f | 306 | } |
Soohwan Kim |
0:6f28332c466f | 307 | |
Soohwan Kim |
0:6f28332c466f | 308 | bool WIZnet_Chip::link(int wait_time_ms) |
Soohwan Kim |
0:6f28332c466f | 309 | { |
Soohwan Kim |
0:6f28332c466f | 310 | Timer t; |
Soohwan Kim |
0:6f28332c466f | 311 | t.reset(); |
Soohwan Kim |
0:6f28332c466f | 312 | t.start(); |
Soohwan Kim |
0:6f28332c466f | 313 | while(1) { |
Soohwan Kim |
0:6f28332c466f | 314 | int is_link = ethernet_link(); |
Soohwan Kim |
0:6f28332c466f | 315 | printf("is_link:%d\r\n", is_link); |
Soohwan Kim |
0:6f28332c466f | 316 | if (is_link) { |
Soohwan Kim |
0:6f28332c466f | 317 | return true; |
Soohwan Kim |
0:6f28332c466f | 318 | } |
Soohwan Kim |
0:6f28332c466f | 319 | if (wait_time_ms != (-1) && t.read_ms() > wait_time_ms) { |
Soohwan Kim |
0:6f28332c466f | 320 | break; |
Soohwan Kim |
0:6f28332c466f | 321 | } |
Soohwan Kim |
0:6f28332c466f | 322 | } |
Soohwan Kim |
0:6f28332c466f | 323 | return 0; |
Soohwan Kim |
0:6f28332c466f | 324 | } |
Soohwan Kim |
0:6f28332c466f | 325 | |
Soohwan Kim |
0:6f28332c466f | 326 | void WIZnet_Chip::set_link(PHYMode phymode) |
Soohwan Kim |
0:6f28332c466f | 327 | { |
Soohwan Kim |
0:6f28332c466f | 328 | int speed = -1; |
Soohwan Kim |
0:6f28332c466f | 329 | int duplex = 0; |
Soohwan Kim |
0:6f28332c466f | 330 | |
Soohwan Kim |
0:6f28332c466f | 331 | switch(phymode) { |
Soohwan Kim |
0:6f28332c466f | 332 | case AutoNegotiate : speed = -1; duplex = 0; break; |
Soohwan Kim |
0:6f28332c466f | 333 | case HalfDuplex10 : speed = 0; duplex = 0; break; |
Soohwan Kim |
0:6f28332c466f | 334 | case FullDuplex10 : speed = 0; duplex = 1; break; |
Soohwan Kim |
0:6f28332c466f | 335 | case HalfDuplex100 : speed = 1; duplex = 0; break; |
Soohwan Kim |
0:6f28332c466f | 336 | case FullDuplex100 : speed = 1; duplex = 1; break; |
Soohwan Kim |
0:6f28332c466f | 337 | } |
Soohwan Kim |
0:6f28332c466f | 338 | |
Soohwan Kim |
0:6f28332c466f | 339 | ethernet_set_link(speed, duplex); |
Soohwan Kim |
0:6f28332c466f | 340 | } |
Soohwan Kim |
0:6f28332c466f | 341 | |
Soohwan Kim |
0:6f28332c466f | 342 | uint32_t str_to_ip(const char* str) |
Soohwan Kim |
0:6f28332c466f | 343 | { |
Soohwan Kim |
0:6f28332c466f | 344 | uint32_t ip = 0; |
Soohwan Kim |
0:6f28332c466f | 345 | char* p = (char*)str; |
Soohwan Kim |
0:6f28332c466f | 346 | for(int i = 0; i < 4; i++) { |
Soohwan Kim |
0:6f28332c466f | 347 | ip |= atoi(p); |
Soohwan Kim |
0:6f28332c466f | 348 | p = strchr(p, '.'); |
Soohwan Kim |
0:6f28332c466f | 349 | if (p == NULL) { |
Soohwan Kim |
0:6f28332c466f | 350 | break; |
Soohwan Kim |
0:6f28332c466f | 351 | } |
Soohwan Kim |
0:6f28332c466f | 352 | ip <<= 8; |
Soohwan Kim |
0:6f28332c466f | 353 | p++; |
Soohwan Kim |
0:6f28332c466f | 354 | } |
Soohwan Kim |
0:6f28332c466f | 355 | return ip; |
Soohwan Kim |
0:6f28332c466f | 356 | } |
Soohwan Kim |
0:6f28332c466f | 357 | |
Soohwan Kim |
0:6f28332c466f | 358 | void printfBytes(char* str, uint8_t* buf, int len) |
Soohwan Kim |
0:6f28332c466f | 359 | { |
Soohwan Kim |
0:6f28332c466f | 360 | printf("%s %d:", str, len); |
Soohwan Kim |
0:6f28332c466f | 361 | for(int i = 0; i < len; i++) { |
Soohwan Kim |
0:6f28332c466f | 362 | printf(" %02x", buf[i]); |
Soohwan Kim |
0:6f28332c466f | 363 | } |
Soohwan Kim |
0:6f28332c466f | 364 | printf("\n"); |
Soohwan Kim |
0:6f28332c466f | 365 | } |
Soohwan Kim |
0:6f28332c466f | 366 | |
Soohwan Kim |
0:6f28332c466f | 367 | void printHex(uint8_t* buf, int len) |
Soohwan Kim |
0:6f28332c466f | 368 | { |
Soohwan Kim |
0:6f28332c466f | 369 | for(int i = 0; i < len; i++) { |
Soohwan Kim |
0:6f28332c466f | 370 | if ((i%16) == 0) { |
Soohwan Kim |
0:6f28332c466f | 371 | printf("%p", buf+i); |
Soohwan Kim |
0:6f28332c466f | 372 | } |
Soohwan Kim |
0:6f28332c466f | 373 | printf(" %02x", buf[i]); |
Soohwan Kim |
0:6f28332c466f | 374 | if ((i%16) == 15) { |
Soohwan Kim |
0:6f28332c466f | 375 | printf("\n"); |
Soohwan Kim |
0:6f28332c466f | 376 | } |
Soohwan Kim |
0:6f28332c466f | 377 | } |
Soohwan Kim |
0:6f28332c466f | 378 | printf("\n"); |
Soohwan Kim |
0:6f28332c466f | 379 | } |
Soohwan Kim |
0:6f28332c466f | 380 | |
Soohwan Kim |
0:6f28332c466f | 381 | void debug_hex(uint8_t* buf, int len) |
Soohwan Kim |
0:6f28332c466f | 382 | { |
Soohwan Kim |
0:6f28332c466f | 383 | for(int i = 0; i < len; i++) { |
Soohwan Kim |
0:6f28332c466f | 384 | if ((i%16) == 0) { |
Soohwan Kim |
0:6f28332c466f | 385 | debug("%p", buf+i); |
Soohwan Kim |
0:6f28332c466f | 386 | } |
Soohwan Kim |
0:6f28332c466f | 387 | debug(" %02x", buf[i]); |
Soohwan Kim |
0:6f28332c466f | 388 | if ((i%16) == 15) { |
Soohwan Kim |
0:6f28332c466f | 389 | debug("\n"); |
Soohwan Kim |
0:6f28332c466f | 390 | } |
Soohwan Kim |
0:6f28332c466f | 391 | } |
Soohwan Kim |
0:6f28332c466f | 392 | debug("\n"); |
Soohwan Kim |
0:6f28332c466f | 393 | } |
Soohwan Kim |
0:6f28332c466f | 394 | |
Soohwan Kim |
0:6f28332c466f | 395 | void WIZnet_Chip::scmd(int socket, Command cmd) |
Soohwan Kim |
0:6f28332c466f | 396 | { |
Soohwan Kim |
0:6f28332c466f | 397 | sreg<uint8_t>(socket, Sn_CR, cmd); |
Soohwan Kim |
0:6f28332c466f | 398 | while(sreg<uint8_t>(socket, Sn_CR)); |
Soohwan Kim |
0:6f28332c466f | 399 | } |
Soohwan Kim |
0:6f28332c466f | 400 | |
Soohwan Kim |
0:6f28332c466f | 401 | |
Soohwan Kim |
0:6f28332c466f | 402 | void mdio_init(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin_MDC, uint16_t GPIO_Pin_MDIO) |
Soohwan Kim |
0:6f28332c466f | 403 | { |
Soohwan Kim |
0:6f28332c466f | 404 | /* Set GPIOs for MDIO and MDC */ |
Soohwan Kim |
0:6f28332c466f | 405 | GPIO_InitTypeDef MDIO_InitDef; |
Soohwan Kim |
0:6f28332c466f | 406 | HAL_PAD_AFConfig(PAD_PB, GPIO_Pin_MDIO, PAD_AF1); |
Soohwan Kim |
0:6f28332c466f | 407 | HAL_PAD_AFConfig(PAD_PB, GPIO_Pin_MDC, PAD_AF1); |
Soohwan Kim |
0:6f28332c466f | 408 | MDIO_InitDef.GPIO_Pin = GPIO_Pin_MDC | GPIO_Pin_MDIO; |
Soohwan Kim |
0:6f28332c466f | 409 | MDIO_InitDef.GPIO_Mode = GPIO_Mode_OUT; |
Soohwan Kim |
0:6f28332c466f | 410 | HAL_GPIO_Init(GPIOx, &MDIO_InitDef); |
Soohwan Kim |
0:6f28332c466f | 411 | } |
Soohwan Kim |
0:6f28332c466f | 412 | |
Soohwan Kim |
0:6f28332c466f | 413 | void output_MDIO(GPIO_TypeDef* GPIOx, uint32_t val, uint32_t n) |
Soohwan Kim |
0:6f28332c466f | 414 | { |
Soohwan Kim |
0:6f28332c466f | 415 | for(val <<= (32-n); n; val<<=1, n--) |
Soohwan Kim |
0:6f28332c466f | 416 | { |
Soohwan Kim |
0:6f28332c466f | 417 | if(val & 0x80000000) |
Soohwan Kim |
0:6f28332c466f | 418 | HAL_GPIO_SetBits(GPIOx, MDIO); |
Soohwan Kim |
0:6f28332c466f | 419 | else |
Soohwan Kim |
0:6f28332c466f | 420 | HAL_GPIO_ResetBits(GPIOx, MDIO); |
Soohwan Kim |
0:6f28332c466f | 421 | |
Soohwan Kim |
0:6f28332c466f | 422 | wait_ms(MDC_WAIT); |
Soohwan Kim |
0:6f28332c466f | 423 | HAL_GPIO_SetBits(GPIOx, MDC); |
Soohwan Kim |
0:6f28332c466f | 424 | wait_ms(MDC_WAIT); |
Soohwan Kim |
0:6f28332c466f | 425 | HAL_GPIO_ResetBits(GPIOx, MDC); |
Soohwan Kim |
0:6f28332c466f | 426 | } |
Soohwan Kim |
0:6f28332c466f | 427 | } |
Soohwan Kim |
0:6f28332c466f | 428 | |
Soohwan Kim |
0:6f28332c466f | 429 | uint32_t input_MDIO( GPIO_TypeDef* GPIOx ) |
Soohwan Kim |
0:6f28332c466f | 430 | { |
Soohwan Kim |
0:6f28332c466f | 431 | uint32_t i, val=0; |
Soohwan Kim |
0:6f28332c466f | 432 | for(i=0; i<16; i++) |
Soohwan Kim |
0:6f28332c466f | 433 | { |
Soohwan Kim |
0:6f28332c466f | 434 | val <<=1; |
Soohwan Kim |
0:6f28332c466f | 435 | HAL_GPIO_SetBits(GPIOx, MDC); |
Soohwan Kim |
0:6f28332c466f | 436 | wait_ms(MDC_WAIT); |
Soohwan Kim |
0:6f28332c466f | 437 | HAL_GPIO_ResetBits(GPIOx, MDC); |
Soohwan Kim |
0:6f28332c466f | 438 | wait_ms(MDC_WAIT); |
Soohwan Kim |
0:6f28332c466f | 439 | val |= HAL_GPIO_ReadInputDataBit(GPIOx, MDIO); |
Soohwan Kim |
0:6f28332c466f | 440 | } |
Soohwan Kim |
0:6f28332c466f | 441 | return (val); |
Soohwan Kim |
0:6f28332c466f | 442 | } |
Soohwan Kim |
0:6f28332c466f | 443 | |
Soohwan Kim |
0:6f28332c466f | 444 | void turnaround_MDIO( GPIO_TypeDef* GPIOx) |
Soohwan Kim |
0:6f28332c466f | 445 | { |
Soohwan Kim |
0:6f28332c466f | 446 | GPIOx->OUTENCLR = MDIO ; |
Soohwan Kim |
0:6f28332c466f | 447 | HAL_GPIO_SetBits(GPIOx, MDC); |
Soohwan Kim |
0:6f28332c466f | 448 | wait_ms(MDC_WAIT); |
Soohwan Kim |
0:6f28332c466f | 449 | HAL_GPIO_ResetBits(GPIOx, MDC); |
Soohwan Kim |
0:6f28332c466f | 450 | wait_ms(MDC_WAIT); |
Soohwan Kim |
0:6f28332c466f | 451 | } |
Soohwan Kim |
0:6f28332c466f | 452 | |
Soohwan Kim |
0:6f28332c466f | 453 | void idle_MDIO( GPIO_TypeDef* GPIOx ) |
Soohwan Kim |
0:6f28332c466f | 454 | { |
Soohwan Kim |
0:6f28332c466f | 455 | GPIOx->OUTENSET = MDIO ; |
Soohwan Kim |
0:6f28332c466f | 456 | HAL_GPIO_SetBits(GPIOx,MDC); |
Soohwan Kim |
0:6f28332c466f | 457 | wait_ms(MDC_WAIT); |
Soohwan Kim |
0:6f28332c466f | 458 | HAL_GPIO_ResetBits(GPIOx, MDC); |
Soohwan Kim |
0:6f28332c466f | 459 | wait_ms(MDC_WAIT); |
Soohwan Kim |
0:6f28332c466f | 460 | } |
Soohwan Kim |
0:6f28332c466f | 461 | |
Soohwan Kim |
0:6f28332c466f | 462 | uint32_t mdio_read(GPIO_TypeDef* GPIOx, uint32_t PhyRegAddr) |
Soohwan Kim |
0:6f28332c466f | 463 | { |
Soohwan Kim |
0:6f28332c466f | 464 | output_MDIO(GPIOx, 0xFFFFFFFF, 32); |
Soohwan Kim |
0:6f28332c466f | 465 | output_MDIO(GPIOx, 0x06, 4); |
Soohwan Kim |
0:6f28332c466f | 466 | output_MDIO(GPIOx, PHY_ADDR, 5); |
Soohwan Kim |
0:6f28332c466f | 467 | output_MDIO(GPIOx, PhyRegAddr, 5); |
Soohwan Kim |
0:6f28332c466f | 468 | turnaround_MDIO(GPIOx); |
Soohwan Kim |
0:6f28332c466f | 469 | uint32_t val = input_MDIO(GPIOx ); |
Soohwan Kim |
0:6f28332c466f | 470 | idle_MDIO(GPIOx); |
Soohwan Kim |
0:6f28332c466f | 471 | return val; |
Soohwan Kim |
0:6f28332c466f | 472 | } |
Soohwan Kim |
0:6f28332c466f | 473 | |
Soohwan Kim |
0:6f28332c466f | 474 | void mdio_write(GPIO_TypeDef* GPIOx, uint32_t PhyRegAddr, uint32_t val) |
Soohwan Kim |
0:6f28332c466f | 475 | { |
Soohwan Kim |
0:6f28332c466f | 476 | output_MDIO(GPIOx, 0xFFFFFFFF, 32); |
Soohwan Kim |
0:6f28332c466f | 477 | output_MDIO(GPIOx, 0x05, 4); |
Soohwan Kim |
0:6f28332c466f | 478 | output_MDIO(GPIOx, PHY_ADDR, 5); |
Soohwan Kim |
0:6f28332c466f | 479 | output_MDIO(GPIOx, PhyRegAddr, 5); |
Soohwan Kim |
0:6f28332c466f | 480 | output_MDIO(GPIOx, 0x02, 2); |
Soohwan Kim |
0:6f28332c466f | 481 | output_MDIO(GPIOx, val, 16); |
Soohwan Kim |
0:6f28332c466f | 482 | idle_MDIO(GPIOx); |
Soohwan Kim |
0:6f28332c466f | 483 | } |
Soohwan Kim |
0:6f28332c466f | 484 | |
embeddist | 14:2101ab5ee40f | 485 | int WIZnet_Chip::ethernet_link(void) { |
Soohwan Kim |
0:6f28332c466f | 486 | return ((mdio_read(GPIO_MDC, PHYREG_STATUS)>>SVAL)&0x01); |
Soohwan Kim |
0:6f28332c466f | 487 | } |
Soohwan Kim |
0:6f28332c466f | 488 | |
embeddist | 14:2101ab5ee40f | 489 | void WIZnet_Chip::ethernet_set_link(int speed, int duplex) { |
Soohwan Kim |
0:6f28332c466f | 490 | uint32_t val=0; |
Soohwan Kim |
0:6f28332c466f | 491 | if((speed < 0) || (speed > 1)) { |
Soohwan Kim |
0:6f28332c466f | 492 | val = CNTL_AUTONEGO; |
Soohwan Kim |
0:6f28332c466f | 493 | } else { |
Soohwan Kim |
0:6f28332c466f | 494 | val = ((CNTL_SPEED&(speed<<11))|(CNTL_DUPLEX&(duplex<<7))); |
Soohwan Kim |
0:6f28332c466f | 495 | } |
Soohwan Kim |
0:6f28332c466f | 496 | mdio_write(GPIO_MDC, PHYREG_CONTROL, val); |
Soohwan Kim |
0:6f28332c466f | 497 | } |
embeddist | 14:2101ab5ee40f | 498 | |
embeddist | 14:2101ab5ee40f | 499 | void WIZnet_Chip::reg_rd_mac(uint16_t addr, uint8_t* data) |
embeddist | 14:2101ab5ee40f | 500 | { |
embeddist | 14:2101ab5ee40f | 501 | data[0] = *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+3)); |
embeddist | 14:2101ab5ee40f | 502 | data[1] = *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+2)); |
embeddist | 14:2101ab5ee40f | 503 | data[2] = *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+1)); |
embeddist | 14:2101ab5ee40f | 504 | data[3] = *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+0)); |
embeddist | 14:2101ab5ee40f | 505 | data[4] = *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+7)); |
embeddist | 14:2101ab5ee40f | 506 | data[5] = *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+6)); |
embeddist | 14:2101ab5ee40f | 507 | } |
embeddist | 14:2101ab5ee40f | 508 | |
embeddist | 14:2101ab5ee40f | 509 | void WIZnet_Chip::reg_wr_ip(uint16_t addr, uint8_t cb, const char* ip) |
embeddist | 14:2101ab5ee40f | 510 | { |
embeddist | 14:2101ab5ee40f | 511 | uint8_t buf[4]={0,}; |
embeddist | 14:2101ab5ee40f | 512 | uint32_t wr_ip = 0; |
embeddist | 14:2101ab5ee40f | 513 | char* p = (char*)ip; |
embeddist | 14:2101ab5ee40f | 514 | |
embeddist | 14:2101ab5ee40f | 515 | for(int i = 0; i < 4; i++) { |
embeddist | 14:2101ab5ee40f | 516 | wr_ip = (wr_ip<<8); |
embeddist | 14:2101ab5ee40f | 517 | buf[i] = atoi(p); |
embeddist | 14:2101ab5ee40f | 518 | wr_ip |= buf[i]; |
embeddist | 14:2101ab5ee40f | 519 | p = strchr(p, '.'); |
embeddist | 14:2101ab5ee40f | 520 | if (p == NULL) break; |
embeddist | 14:2101ab5ee40f | 521 | p++; |
embeddist | 14:2101ab5ee40f | 522 | } |
embeddist | 14:2101ab5ee40f | 523 | *(volatile uint32_t *)(W7500x_WZTOE_BASE + (uint32_t)((cb<<16)+addr)) = wr_ip; |
embeddist | 14:2101ab5ee40f | 524 | } |
embeddist | 14:2101ab5ee40f | 525 | |
embeddist | 14:2101ab5ee40f | 526 | void WIZnet_Chip::sreg_ip(int socket, uint16_t addr, const char* ip) { |
embeddist | 14:2101ab5ee40f | 527 | reg_wr_ip(addr, (uint8_t)(0x01+(socket<<2)), ip); |
embeddist | 14:2101ab5ee40f | 528 | } |
embeddist | 14:2101ab5ee40f | 529 | |
Soohwan Kim |
0:6f28332c466f | 530 | #endif |
Soohwan Kim |
0:6f28332c466f | 531 |