WIZ820io(W5200) network interface、EthernetNetIf compatible.
example
#include "WIZ820ioNetIf.h" #include "HTTPClient.h" #include "HTTPServer.h" #if defined(TARGET_KL25Z) WIZ820ioNetIf eth(PTD2,PTD3,PTD1,PTD0,PTD5); #endif HTTPClient http; HTTPStream stream; void callback(HTTPResult r){ printf("callback %d %s\n", r, HTTPClient::ResultStr(r)); } int main() { int err = eth.setup(); if (err < 0) { printf("setup error %d\n", err); exit(-1); } HTTPServer svr; svr.addHandler<SimpleHandler>("/"); svr.bind(80); const char* uri = "http://va009039-mbed.appspot.com/kl25z/"; http.get(uri, &stream, callback); uint8_t buf[256]; int total = 0; stream.readNext(buf, sizeof(buf)); while(1) { if(stream.readable()) { int len = stream.readLen(); total += len; printf("%d %d\n", total, len); stream.readNext(buf, sizeof(buf)); } Net::poll(); } }
w5200.h@1:22b9052d864d, 2013-03-24 (annotated)
- Committer:
- va009039
- Date:
- Sun Mar 24 11:25:31 2013 +0000
- Revision:
- 1:22b9052d864d
- Parent:
- w5100.h@0:bdeec5f86894
WIZ820io(W8200) ethernet interface, EthernetNetIf compatible.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
va009039 | 0:bdeec5f86894 | 1 | /* |
va009039 | 0:bdeec5f86894 | 2 | * Copyright (c) 2010 by Cristian Maglie <c.maglie@bug.st> |
va009039 | 0:bdeec5f86894 | 3 | * |
va009039 | 0:bdeec5f86894 | 4 | * This file is free software; you can redistribute it and/or modify |
va009039 | 0:bdeec5f86894 | 5 | * it under the terms of either the GNU General Public License version 2 |
va009039 | 0:bdeec5f86894 | 6 | * or the GNU Lesser General Public License version 2.1, both as |
va009039 | 0:bdeec5f86894 | 7 | * published by the Free Software Foundation. |
va009039 | 0:bdeec5f86894 | 8 | */ |
va009039 | 1:22b9052d864d | 9 | #include "mbed.h" |
va009039 | 1:22b9052d864d | 10 | #pragma once |
va009039 | 0:bdeec5f86894 | 11 | |
va009039 | 0:bdeec5f86894 | 12 | #define MAX_SOCK_NUM 8 |
va009039 | 0:bdeec5f86894 | 13 | |
va009039 | 0:bdeec5f86894 | 14 | typedef uint8_t SOCKET; |
va009039 | 0:bdeec5f86894 | 15 | |
va009039 | 0:bdeec5f86894 | 16 | class SnMR { |
va009039 | 0:bdeec5f86894 | 17 | public: |
va009039 | 0:bdeec5f86894 | 18 | static const uint8_t CLOSE = 0x00; |
va009039 | 0:bdeec5f86894 | 19 | static const uint8_t TCP = 0x01; |
va009039 | 0:bdeec5f86894 | 20 | static const uint8_t UDP = 0x02; |
va009039 | 0:bdeec5f86894 | 21 | static const uint8_t IPRAW = 0x03; |
va009039 | 0:bdeec5f86894 | 22 | static const uint8_t MACRAW = 0x04; |
va009039 | 0:bdeec5f86894 | 23 | static const uint8_t PPPOE = 0x05; |
va009039 | 0:bdeec5f86894 | 24 | static const uint8_t ND = 0x20; |
va009039 | 0:bdeec5f86894 | 25 | static const uint8_t MULTI = 0x80; |
va009039 | 0:bdeec5f86894 | 26 | }; |
va009039 | 0:bdeec5f86894 | 27 | |
va009039 | 0:bdeec5f86894 | 28 | enum SockCMD { |
va009039 | 0:bdeec5f86894 | 29 | Sock_OPEN = 0x01, |
va009039 | 0:bdeec5f86894 | 30 | Sock_LISTEN = 0x02, |
va009039 | 0:bdeec5f86894 | 31 | Sock_CONNECT = 0x04, |
va009039 | 0:bdeec5f86894 | 32 | Sock_DISCON = 0x08, |
va009039 | 0:bdeec5f86894 | 33 | Sock_CLOSE = 0x10, |
va009039 | 0:bdeec5f86894 | 34 | Sock_SEND = 0x20, |
va009039 | 0:bdeec5f86894 | 35 | Sock_SEND_MAC = 0x21, |
va009039 | 0:bdeec5f86894 | 36 | Sock_SEND_KEEP = 0x22, |
va009039 | 0:bdeec5f86894 | 37 | Sock_RECV = 0x40 |
va009039 | 0:bdeec5f86894 | 38 | }; |
va009039 | 0:bdeec5f86894 | 39 | |
va009039 | 0:bdeec5f86894 | 40 | class SnIR { |
va009039 | 0:bdeec5f86894 | 41 | public: |
va009039 | 0:bdeec5f86894 | 42 | static const uint8_t SEND_OK = 0x10; |
va009039 | 0:bdeec5f86894 | 43 | static const uint8_t TIMEOUT = 0x08; |
va009039 | 0:bdeec5f86894 | 44 | static const uint8_t RECV = 0x04; |
va009039 | 0:bdeec5f86894 | 45 | static const uint8_t DISCON = 0x02; |
va009039 | 0:bdeec5f86894 | 46 | static const uint8_t CON = 0x01; |
va009039 | 0:bdeec5f86894 | 47 | }; |
va009039 | 0:bdeec5f86894 | 48 | |
va009039 | 0:bdeec5f86894 | 49 | class SnSR { |
va009039 | 0:bdeec5f86894 | 50 | public: |
va009039 | 0:bdeec5f86894 | 51 | static const uint8_t CLOSED = 0x00; |
va009039 | 0:bdeec5f86894 | 52 | static const uint8_t INIT = 0x13; |
va009039 | 0:bdeec5f86894 | 53 | static const uint8_t LISTEN = 0x14; |
va009039 | 0:bdeec5f86894 | 54 | static const uint8_t SYNSENT = 0x15; |
va009039 | 0:bdeec5f86894 | 55 | static const uint8_t SYNRECV = 0x16; |
va009039 | 0:bdeec5f86894 | 56 | static const uint8_t ESTABLISHED = 0x17; |
va009039 | 0:bdeec5f86894 | 57 | static const uint8_t FIN_WAIT = 0x18; |
va009039 | 0:bdeec5f86894 | 58 | static const uint8_t CLOSING = 0x1A; |
va009039 | 0:bdeec5f86894 | 59 | static const uint8_t TIME_WAIT = 0x1B; |
va009039 | 0:bdeec5f86894 | 60 | static const uint8_t CLOSE_WAIT = 0x1C; |
va009039 | 0:bdeec5f86894 | 61 | static const uint8_t LAST_ACK = 0x1D; |
va009039 | 0:bdeec5f86894 | 62 | static const uint8_t UDP = 0x22; |
va009039 | 0:bdeec5f86894 | 63 | static const uint8_t IPRAW = 0x32; |
va009039 | 0:bdeec5f86894 | 64 | static const uint8_t MACRAW = 0x42; |
va009039 | 0:bdeec5f86894 | 65 | static const uint8_t PPPOE = 0x5F; |
va009039 | 0:bdeec5f86894 | 66 | }; |
va009039 | 0:bdeec5f86894 | 67 | |
va009039 | 0:bdeec5f86894 | 68 | class IPPROTO { |
va009039 | 0:bdeec5f86894 | 69 | public: |
va009039 | 0:bdeec5f86894 | 70 | static const uint8_t IP = 0; |
va009039 | 0:bdeec5f86894 | 71 | static const uint8_t ICMP = 1; |
va009039 | 0:bdeec5f86894 | 72 | static const uint8_t IGMP = 2; |
va009039 | 0:bdeec5f86894 | 73 | static const uint8_t GGP = 3; |
va009039 | 0:bdeec5f86894 | 74 | static const uint8_t TCP = 6; |
va009039 | 0:bdeec5f86894 | 75 | static const uint8_t PUP = 12; |
va009039 | 0:bdeec5f86894 | 76 | static const uint8_t UDP = 17; |
va009039 | 0:bdeec5f86894 | 77 | static const uint8_t IDP = 22; |
va009039 | 0:bdeec5f86894 | 78 | static const uint8_t ND = 77; |
va009039 | 0:bdeec5f86894 | 79 | static const uint8_t RAW = 255; |
va009039 | 0:bdeec5f86894 | 80 | }; |
va009039 | 0:bdeec5f86894 | 81 | |
va009039 | 1:22b9052d864d | 82 | class W5200Class { |
va009039 | 0:bdeec5f86894 | 83 | public: |
va009039 | 0:bdeec5f86894 | 84 | void init(); |
va009039 | 0:bdeec5f86894 | 85 | |
va009039 | 0:bdeec5f86894 | 86 | /** |
va009039 | 0:bdeec5f86894 | 87 | * @brief This function is being used for copy the data form Receive buffer of the chip to application buffer. |
va009039 | 0:bdeec5f86894 | 88 | * |
va009039 | 0:bdeec5f86894 | 89 | * It calculate the actual physical address where one has to read |
va009039 | 0:bdeec5f86894 | 90 | * the data from Receive buffer. Here also take care of the condition while it exceed |
va009039 | 0:bdeec5f86894 | 91 | * the Rx memory uper-bound of socket. |
va009039 | 0:bdeec5f86894 | 92 | */ |
va009039 | 0:bdeec5f86894 | 93 | void read_data(SOCKET s, volatile uint8_t * src, volatile uint8_t * dst, uint16_t len); |
va009039 | 0:bdeec5f86894 | 94 | |
va009039 | 0:bdeec5f86894 | 95 | /** |
va009039 | 0:bdeec5f86894 | 96 | * @brief This function is being called by send() and sendto() function also. |
va009039 | 0:bdeec5f86894 | 97 | * |
va009039 | 0:bdeec5f86894 | 98 | * This function read the Tx write pointer register and after copy the data in buffer update the Tx write pointer |
va009039 | 0:bdeec5f86894 | 99 | * register. User should read upper byte first and lower byte later to get proper value. |
va009039 | 0:bdeec5f86894 | 100 | */ |
va009039 | 0:bdeec5f86894 | 101 | void send_data_processing(SOCKET s, const uint8_t *data, uint16_t len); |
va009039 | 0:bdeec5f86894 | 102 | /** |
va009039 | 0:bdeec5f86894 | 103 | * @brief A copy of send_data_processing that uses the provided ptr for the |
va009039 | 0:bdeec5f86894 | 104 | * write offset. Only needed for the "streaming" UDP API, where |
va009039 | 0:bdeec5f86894 | 105 | * a single UDP packet is built up over a number of calls to |
va009039 | 0:bdeec5f86894 | 106 | * send_data_processing_ptr, because TX_WR doesn't seem to get updated |
va009039 | 0:bdeec5f86894 | 107 | * correctly in those scenarios |
va009039 | 0:bdeec5f86894 | 108 | * @param ptr value to use in place of TX_WR. If 0, then the value is read |
va009039 | 0:bdeec5f86894 | 109 | * in from TX_WR |
va009039 | 0:bdeec5f86894 | 110 | * @return New value for ptr, to be used in the next call |
va009039 | 0:bdeec5f86894 | 111 | */ |
va009039 | 0:bdeec5f86894 | 112 | // FIXME Update documentation |
va009039 | 0:bdeec5f86894 | 113 | void send_data_processing_offset(SOCKET s, uint16_t data_offset, const uint8_t *data, uint16_t len); |
va009039 | 0:bdeec5f86894 | 114 | |
va009039 | 0:bdeec5f86894 | 115 | /** |
va009039 | 0:bdeec5f86894 | 116 | * @brief This function is being called by recv() also. |
va009039 | 0:bdeec5f86894 | 117 | * |
va009039 | 0:bdeec5f86894 | 118 | * This function read the Rx read pointer register |
va009039 | 0:bdeec5f86894 | 119 | * and after copy the data from receive buffer update the Rx write pointer register. |
va009039 | 0:bdeec5f86894 | 120 | * User should read upper byte first and lower byte later to get proper value. |
va009039 | 0:bdeec5f86894 | 121 | */ |
va009039 | 0:bdeec5f86894 | 122 | void recv_data_processing(SOCKET s, uint8_t *data, uint16_t len, uint8_t peek = 0); |
va009039 | 0:bdeec5f86894 | 123 | |
va009039 | 0:bdeec5f86894 | 124 | inline void setGatewayIp(uint8_t *_addr); |
va009039 | 0:bdeec5f86894 | 125 | inline void getGatewayIp(uint8_t *_addr); |
va009039 | 0:bdeec5f86894 | 126 | |
va009039 | 0:bdeec5f86894 | 127 | inline void setSubnetMask(uint8_t *_addr); |
va009039 | 0:bdeec5f86894 | 128 | inline void getSubnetMask(uint8_t *_addr); |
va009039 | 0:bdeec5f86894 | 129 | |
va009039 | 0:bdeec5f86894 | 130 | inline void setMACAddress(uint8_t * addr); |
va009039 | 0:bdeec5f86894 | 131 | inline void getMACAddress(uint8_t * addr); |
va009039 | 0:bdeec5f86894 | 132 | |
va009039 | 0:bdeec5f86894 | 133 | inline void setIPAddress(uint8_t * addr); |
va009039 | 0:bdeec5f86894 | 134 | inline void getIPAddress(uint8_t * addr); |
va009039 | 0:bdeec5f86894 | 135 | |
va009039 | 0:bdeec5f86894 | 136 | inline void setRetransmissionTime(uint16_t timeout); |
va009039 | 0:bdeec5f86894 | 137 | inline void setRetransmissionCount(uint8_t _retry); |
va009039 | 0:bdeec5f86894 | 138 | |
va009039 | 0:bdeec5f86894 | 139 | void execCmdSn(SOCKET s, SockCMD _cmd); |
va009039 | 0:bdeec5f86894 | 140 | |
va009039 | 0:bdeec5f86894 | 141 | uint16_t getTXFreeSize(SOCKET s); |
va009039 | 0:bdeec5f86894 | 142 | uint16_t getRXReceivedSize(SOCKET s); |
va009039 | 0:bdeec5f86894 | 143 | |
va009039 | 0:bdeec5f86894 | 144 | |
va009039 | 1:22b9052d864d | 145 | // W5200 Registers |
va009039 | 0:bdeec5f86894 | 146 | // --------------- |
va009039 | 0:bdeec5f86894 | 147 | private: |
va009039 | 0:bdeec5f86894 | 148 | static uint8_t write(uint16_t _addr, uint8_t _data); |
va009039 | 0:bdeec5f86894 | 149 | static uint16_t write(uint16_t addr, const uint8_t *buf, uint16_t len); |
va009039 | 0:bdeec5f86894 | 150 | static uint8_t read(uint16_t addr); |
va009039 | 0:bdeec5f86894 | 151 | static uint16_t read(uint16_t addr, uint8_t *buf, uint16_t len); |
va009039 | 0:bdeec5f86894 | 152 | |
va009039 | 0:bdeec5f86894 | 153 | #define __GP_REGISTER8(name, address) \ |
va009039 | 0:bdeec5f86894 | 154 | static inline void write##name(uint8_t _data) { \ |
va009039 | 0:bdeec5f86894 | 155 | write(address, _data); \ |
va009039 | 0:bdeec5f86894 | 156 | } \ |
va009039 | 0:bdeec5f86894 | 157 | static inline uint8_t read##name() { \ |
va009039 | 0:bdeec5f86894 | 158 | return read(address); \ |
va009039 | 0:bdeec5f86894 | 159 | } |
va009039 | 0:bdeec5f86894 | 160 | #define __GP_REGISTER16(name, address) \ |
va009039 | 0:bdeec5f86894 | 161 | static void write##name(uint16_t _data) { \ |
va009039 | 0:bdeec5f86894 | 162 | write(address, _data >> 8); \ |
va009039 | 0:bdeec5f86894 | 163 | write(address+1, _data & 0xFF); \ |
va009039 | 0:bdeec5f86894 | 164 | } \ |
va009039 | 0:bdeec5f86894 | 165 | static uint16_t read##name() { \ |
va009039 | 0:bdeec5f86894 | 166 | uint16_t res = read(address); \ |
va009039 | 0:bdeec5f86894 | 167 | res = (res << 8) + read(address + 1); \ |
va009039 | 0:bdeec5f86894 | 168 | return res; \ |
va009039 | 0:bdeec5f86894 | 169 | } |
va009039 | 0:bdeec5f86894 | 170 | #define __GP_REGISTER_N(name, address, size) \ |
va009039 | 0:bdeec5f86894 | 171 | static uint16_t write##name(uint8_t *_buff) { \ |
va009039 | 0:bdeec5f86894 | 172 | return write(address, _buff, size); \ |
va009039 | 0:bdeec5f86894 | 173 | } \ |
va009039 | 0:bdeec5f86894 | 174 | static uint16_t read##name(uint8_t *_buff) { \ |
va009039 | 0:bdeec5f86894 | 175 | return read(address, _buff, size); \ |
va009039 | 0:bdeec5f86894 | 176 | } |
va009039 | 0:bdeec5f86894 | 177 | |
va009039 | 0:bdeec5f86894 | 178 | public: |
va009039 | 0:bdeec5f86894 | 179 | __GP_REGISTER8 (MR, 0x0000); // Mode |
va009039 | 0:bdeec5f86894 | 180 | __GP_REGISTER_N(GAR, 0x0001, 4); // Gateway IP address |
va009039 | 0:bdeec5f86894 | 181 | __GP_REGISTER_N(SUBR, 0x0005, 4); // Subnet mask address |
va009039 | 0:bdeec5f86894 | 182 | __GP_REGISTER_N(SHAR, 0x0009, 6); // Source MAC address |
va009039 | 0:bdeec5f86894 | 183 | __GP_REGISTER_N(SIPR, 0x000F, 4); // Source IP address |
va009039 | 0:bdeec5f86894 | 184 | __GP_REGISTER8 (IR, 0x0015); // Interrupt |
va009039 | 0:bdeec5f86894 | 185 | __GP_REGISTER8 (IMR, 0x0016); // Interrupt Mask |
va009039 | 0:bdeec5f86894 | 186 | __GP_REGISTER16(RTR, 0x0017); // Timeout address |
va009039 | 0:bdeec5f86894 | 187 | __GP_REGISTER8 (RCR, 0x0019); // Retry count |
va009039 | 0:bdeec5f86894 | 188 | __GP_REGISTER8 (RMSR, 0x001A); // Receive memory size |
va009039 | 0:bdeec5f86894 | 189 | __GP_REGISTER8 (TMSR, 0x001B); // Transmit memory size |
va009039 | 0:bdeec5f86894 | 190 | __GP_REGISTER8 (PATR, 0x001C); // Authentication type address in PPPoE mode |
va009039 | 0:bdeec5f86894 | 191 | __GP_REGISTER8 (VERSIONR,0x001f); // Chip version |
va009039 | 0:bdeec5f86894 | 192 | __GP_REGISTER8 (PTIMER, 0x0028); // PPP LCP Request Timer |
va009039 | 0:bdeec5f86894 | 193 | __GP_REGISTER8 (PMAGIC, 0x0029); // PPP LCP Magic Number |
va009039 | 0:bdeec5f86894 | 194 | __GP_REGISTER8 (PHYSTATUS,0x0035); // PHY Status |
va009039 | 0:bdeec5f86894 | 195 | |
va009039 | 0:bdeec5f86894 | 196 | #undef __GP_REGISTER8 |
va009039 | 0:bdeec5f86894 | 197 | #undef __GP_REGISTER16 |
va009039 | 0:bdeec5f86894 | 198 | #undef __GP_REGISTER_N |
va009039 | 0:bdeec5f86894 | 199 | |
va009039 | 1:22b9052d864d | 200 | // W5200 Socket registers |
va009039 | 0:bdeec5f86894 | 201 | // ---------------------- |
va009039 | 0:bdeec5f86894 | 202 | private: |
va009039 | 0:bdeec5f86894 | 203 | static inline uint8_t readSn(SOCKET _s, uint16_t _addr); |
va009039 | 0:bdeec5f86894 | 204 | static inline uint8_t writeSn(SOCKET _s, uint16_t _addr, uint8_t _data); |
va009039 | 0:bdeec5f86894 | 205 | static inline uint16_t readSn(SOCKET _s, uint16_t _addr, uint8_t *_buf, uint16_t len); |
va009039 | 0:bdeec5f86894 | 206 | static inline uint16_t writeSn(SOCKET _s, uint16_t _addr, uint8_t *_buf, uint16_t len); |
va009039 | 0:bdeec5f86894 | 207 | |
va009039 | 0:bdeec5f86894 | 208 | static const uint16_t CH_BASE = 0x4000; |
va009039 | 0:bdeec5f86894 | 209 | static const uint16_t CH_SIZE = 0x0100; |
va009039 | 0:bdeec5f86894 | 210 | |
va009039 | 0:bdeec5f86894 | 211 | #define __SOCKET_REGISTER8(name, address) \ |
va009039 | 0:bdeec5f86894 | 212 | static inline void write##name(SOCKET _s, uint8_t _data) { \ |
va009039 | 0:bdeec5f86894 | 213 | writeSn(_s, address, _data); \ |
va009039 | 0:bdeec5f86894 | 214 | } \ |
va009039 | 0:bdeec5f86894 | 215 | static inline uint8_t read##name(SOCKET _s) { \ |
va009039 | 0:bdeec5f86894 | 216 | return readSn(_s, address); \ |
va009039 | 0:bdeec5f86894 | 217 | } |
va009039 | 0:bdeec5f86894 | 218 | #define __SOCKET_REGISTER16(name, address) \ |
va009039 | 0:bdeec5f86894 | 219 | static void write##name(SOCKET _s, uint16_t _data) { \ |
va009039 | 0:bdeec5f86894 | 220 | writeSn(_s, address, _data >> 8); \ |
va009039 | 0:bdeec5f86894 | 221 | writeSn(_s, address+1, _data & 0xFF); \ |
va009039 | 0:bdeec5f86894 | 222 | } \ |
va009039 | 0:bdeec5f86894 | 223 | static uint16_t read##name(SOCKET _s) { \ |
va009039 | 0:bdeec5f86894 | 224 | uint16_t res = readSn(_s, address); \ |
va009039 | 0:bdeec5f86894 | 225 | res = (res << 8) + readSn(_s, address + 1); \ |
va009039 | 0:bdeec5f86894 | 226 | return res; \ |
va009039 | 0:bdeec5f86894 | 227 | } |
va009039 | 0:bdeec5f86894 | 228 | #define __SOCKET_REGISTER_N(name, address, size) \ |
va009039 | 0:bdeec5f86894 | 229 | static uint16_t write##name(SOCKET _s, uint8_t *_buff) { \ |
va009039 | 0:bdeec5f86894 | 230 | return writeSn(_s, address, _buff, size); \ |
va009039 | 0:bdeec5f86894 | 231 | } \ |
va009039 | 0:bdeec5f86894 | 232 | static uint16_t read##name(SOCKET _s, uint8_t *_buff) { \ |
va009039 | 0:bdeec5f86894 | 233 | return readSn(_s, address, _buff, size); \ |
va009039 | 0:bdeec5f86894 | 234 | } |
va009039 | 0:bdeec5f86894 | 235 | |
va009039 | 0:bdeec5f86894 | 236 | public: |
va009039 | 0:bdeec5f86894 | 237 | __SOCKET_REGISTER8(SnMR, 0x0000) // Mode |
va009039 | 0:bdeec5f86894 | 238 | __SOCKET_REGISTER8(SnCR, 0x0001) // Command |
va009039 | 0:bdeec5f86894 | 239 | __SOCKET_REGISTER8(SnIR, 0x0002) // Interrupt |
va009039 | 0:bdeec5f86894 | 240 | __SOCKET_REGISTER8(SnSR, 0x0003) // Status |
va009039 | 0:bdeec5f86894 | 241 | __SOCKET_REGISTER16(SnPORT, 0x0004) // Source Port |
va009039 | 0:bdeec5f86894 | 242 | __SOCKET_REGISTER_N(SnDHAR, 0x0006, 6) // Destination Hardw Addr |
va009039 | 0:bdeec5f86894 | 243 | __SOCKET_REGISTER_N(SnDIPR, 0x000C, 4) // Destination IP Addr |
va009039 | 0:bdeec5f86894 | 244 | __SOCKET_REGISTER16(SnDPORT, 0x0010) // Destination Port |
va009039 | 0:bdeec5f86894 | 245 | __SOCKET_REGISTER16(SnMSSR, 0x0012) // Max Segment Size |
va009039 | 0:bdeec5f86894 | 246 | __SOCKET_REGISTER8(SnPROTO, 0x0014) // Protocol in IP RAW Mode |
va009039 | 0:bdeec5f86894 | 247 | __SOCKET_REGISTER8(SnTOS, 0x0015) // IP TOS |
va009039 | 0:bdeec5f86894 | 248 | __SOCKET_REGISTER8(SnTTL, 0x0016) // IP TTL |
va009039 | 0:bdeec5f86894 | 249 | __SOCKET_REGISTER16(SnTX_FSR, 0x0020) // TX Free Size |
va009039 | 0:bdeec5f86894 | 250 | __SOCKET_REGISTER16(SnTX_RD, 0x0022) // TX Read Pointer |
va009039 | 0:bdeec5f86894 | 251 | __SOCKET_REGISTER16(SnTX_WR, 0x0024) // TX Write Pointer |
va009039 | 0:bdeec5f86894 | 252 | __SOCKET_REGISTER16(SnRX_RSR, 0x0026) // RX Free Size |
va009039 | 0:bdeec5f86894 | 253 | __SOCKET_REGISTER16(SnRX_RD, 0x0028) // RX Read Pointer |
va009039 | 0:bdeec5f86894 | 254 | __SOCKET_REGISTER16(SnRX_WR, 0x002A) // RX Write Pointer (supported?) |
va009039 | 0:bdeec5f86894 | 255 | |
va009039 | 0:bdeec5f86894 | 256 | #undef __SOCKET_REGISTER8 |
va009039 | 0:bdeec5f86894 | 257 | #undef __SOCKET_REGISTER16 |
va009039 | 0:bdeec5f86894 | 258 | #undef __SOCKET_REGISTER_N |
va009039 | 0:bdeec5f86894 | 259 | |
va009039 | 0:bdeec5f86894 | 260 | private: |
va009039 | 0:bdeec5f86894 | 261 | static const uint8_t RST = 7; // Reset BIT |
va009039 | 0:bdeec5f86894 | 262 | static const int SOCKETS = 8; |
va009039 | 0:bdeec5f86894 | 263 | |
va009039 | 0:bdeec5f86894 | 264 | static const uint16_t SMASK = 0x07FF; // Tx buffer MASK |
va009039 | 0:bdeec5f86894 | 265 | static const uint16_t RMASK = 0x07FF; // Rx buffer MASK |
va009039 | 0:bdeec5f86894 | 266 | public: |
va009039 | 0:bdeec5f86894 | 267 | static const uint16_t SSIZE = 2048; // Max Tx buffer size |
va009039 | 0:bdeec5f86894 | 268 | private: |
va009039 | 0:bdeec5f86894 | 269 | static const uint16_t RSIZE = 2048; // Max Rx buffer size |
va009039 | 0:bdeec5f86894 | 270 | uint16_t SBASE[SOCKETS]; // Tx buffer base address |
va009039 | 0:bdeec5f86894 | 271 | uint16_t RBASE[SOCKETS]; // Rx buffer base address |
va009039 | 0:bdeec5f86894 | 272 | }; |
va009039 | 0:bdeec5f86894 | 273 | |
va009039 | 1:22b9052d864d | 274 | extern W5200Class W5200; |
va009039 | 0:bdeec5f86894 | 275 | |
va009039 | 1:22b9052d864d | 276 | uint8_t W5200Class::readSn(SOCKET _s, uint16_t _addr) { |
va009039 | 0:bdeec5f86894 | 277 | return read(CH_BASE + _s * CH_SIZE + _addr); |
va009039 | 0:bdeec5f86894 | 278 | } |
va009039 | 0:bdeec5f86894 | 279 | |
va009039 | 1:22b9052d864d | 280 | uint8_t W5200Class::writeSn(SOCKET _s, uint16_t _addr, uint8_t _data) { |
va009039 | 0:bdeec5f86894 | 281 | return write(CH_BASE + _s * CH_SIZE + _addr, _data); |
va009039 | 0:bdeec5f86894 | 282 | } |
va009039 | 0:bdeec5f86894 | 283 | |
va009039 | 1:22b9052d864d | 284 | uint16_t W5200Class::readSn(SOCKET _s, uint16_t _addr, uint8_t *_buf, uint16_t _len) { |
va009039 | 0:bdeec5f86894 | 285 | return read(CH_BASE + _s * CH_SIZE + _addr, _buf, _len); |
va009039 | 0:bdeec5f86894 | 286 | } |
va009039 | 0:bdeec5f86894 | 287 | |
va009039 | 1:22b9052d864d | 288 | uint16_t W5200Class::writeSn(SOCKET _s, uint16_t _addr, uint8_t *_buf, uint16_t _len) { |
va009039 | 0:bdeec5f86894 | 289 | return write(CH_BASE + _s * CH_SIZE + _addr, _buf, _len); |
va009039 | 0:bdeec5f86894 | 290 | } |
va009039 | 0:bdeec5f86894 | 291 | |
va009039 | 1:22b9052d864d | 292 | void W5200Class::getGatewayIp(uint8_t *_addr) { |
va009039 | 0:bdeec5f86894 | 293 | readGAR(_addr); |
va009039 | 0:bdeec5f86894 | 294 | } |
va009039 | 0:bdeec5f86894 | 295 | |
va009039 | 1:22b9052d864d | 296 | void W5200Class::setGatewayIp(uint8_t *_addr) { |
va009039 | 0:bdeec5f86894 | 297 | writeGAR(_addr); |
va009039 | 0:bdeec5f86894 | 298 | } |
va009039 | 0:bdeec5f86894 | 299 | |
va009039 | 1:22b9052d864d | 300 | void W5200Class::getSubnetMask(uint8_t *_addr) { |
va009039 | 0:bdeec5f86894 | 301 | readSUBR(_addr); |
va009039 | 0:bdeec5f86894 | 302 | } |
va009039 | 0:bdeec5f86894 | 303 | |
va009039 | 1:22b9052d864d | 304 | void W5200Class::setSubnetMask(uint8_t *_addr) { |
va009039 | 0:bdeec5f86894 | 305 | writeSUBR(_addr); |
va009039 | 0:bdeec5f86894 | 306 | } |
va009039 | 0:bdeec5f86894 | 307 | |
va009039 | 1:22b9052d864d | 308 | void W5200Class::getMACAddress(uint8_t *_addr) { |
va009039 | 0:bdeec5f86894 | 309 | readSHAR(_addr); |
va009039 | 0:bdeec5f86894 | 310 | } |
va009039 | 0:bdeec5f86894 | 311 | |
va009039 | 1:22b9052d864d | 312 | void W5200Class::setMACAddress(uint8_t *_addr) { |
va009039 | 0:bdeec5f86894 | 313 | writeSHAR(_addr); |
va009039 | 0:bdeec5f86894 | 314 | } |
va009039 | 0:bdeec5f86894 | 315 | |
va009039 | 1:22b9052d864d | 316 | void W5200Class::getIPAddress(uint8_t *_addr) { |
va009039 | 0:bdeec5f86894 | 317 | readSIPR(_addr); |
va009039 | 0:bdeec5f86894 | 318 | } |
va009039 | 0:bdeec5f86894 | 319 | |
va009039 | 1:22b9052d864d | 320 | void W5200Class::setIPAddress(uint8_t *_addr) { |
va009039 | 0:bdeec5f86894 | 321 | writeSIPR(_addr); |
va009039 | 0:bdeec5f86894 | 322 | } |
va009039 | 0:bdeec5f86894 | 323 | |
va009039 | 1:22b9052d864d | 324 | void W5200Class::setRetransmissionTime(uint16_t _timeout) { |
va009039 | 0:bdeec5f86894 | 325 | writeRTR(_timeout); |
va009039 | 0:bdeec5f86894 | 326 | } |
va009039 | 0:bdeec5f86894 | 327 | |
va009039 | 1:22b9052d864d | 328 | void W5200Class::setRetransmissionCount(uint8_t _retry) { |
va009039 | 0:bdeec5f86894 | 329 | writeRCR(_retry); |
va009039 | 0:bdeec5f86894 | 330 | } |