For a question in forum this is a working example, there will be the example that is not working
Fork of eth_v13 by
w5100.h@4:a10e3d1bdb17, 2014-03-27 (annotated)
- Committer:
- hggerdd
- Date:
- Thu Mar 27 21:55:57 2014 +0000
- Revision:
- 4:a10e3d1bdb17
- Parent:
- 0:f7caac9b804e
working with wiznet w5100
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hggerdd | 0:f7caac9b804e | 1 | /* |
hggerdd | 0:f7caac9b804e | 2 | * Copyright (c) 2010 by Cristian Maglie <c.maglie@bug.st> |
hggerdd | 0:f7caac9b804e | 3 | * |
hggerdd | 0:f7caac9b804e | 4 | * This file is free software; you can redistribute it and/or modify |
hggerdd | 0:f7caac9b804e | 5 | * it under the terms of either the GNU General Public License version 2 |
hggerdd | 0:f7caac9b804e | 6 | * or the GNU Lesser General Public License version 2.1, both as |
hggerdd | 0:f7caac9b804e | 7 | * published by the Free Software Foundation. |
hggerdd | 0:f7caac9b804e | 8 | */ |
hggerdd | 0:f7caac9b804e | 9 | |
hggerdd | 0:f7caac9b804e | 10 | #ifndef W5100_H_INCLUDED |
hggerdd | 0:f7caac9b804e | 11 | #define W5100_H_INCLUDED |
hggerdd | 0:f7caac9b804e | 12 | |
hggerdd | 0:f7caac9b804e | 13 | #define MBED |
hggerdd | 0:f7caac9b804e | 14 | |
hggerdd | 0:f7caac9b804e | 15 | #ifdef MBED |
hggerdd | 0:f7caac9b804e | 16 | #include "mbed.h" |
hggerdd | 0:f7caac9b804e | 17 | typedef unsigned char uint8_t; |
hggerdd | 0:f7caac9b804e | 18 | typedef unsigned short uint16_t; |
hggerdd | 0:f7caac9b804e | 19 | #else //MBED |
hggerdd | 0:f7caac9b804e | 20 | #include <avr/pgmspace.h> |
hggerdd | 0:f7caac9b804e | 21 | #include <SPI.h> |
hggerdd | 0:f7caac9b804e | 22 | #endif //MBED |
hggerdd | 0:f7caac9b804e | 23 | |
hggerdd | 0:f7caac9b804e | 24 | #include "ipaddr.h" |
hggerdd | 0:f7caac9b804e | 25 | |
hggerdd | 0:f7caac9b804e | 26 | //#define W5200 |
hggerdd | 0:f7caac9b804e | 27 | |
hggerdd | 0:f7caac9b804e | 28 | #ifdef W5200 |
hggerdd | 0:f7caac9b804e | 29 | #define MAX_SOCK_NUM 8 |
hggerdd | 0:f7caac9b804e | 30 | #else |
hggerdd | 0:f7caac9b804e | 31 | #define MAX_SOCK_NUM 4 |
hggerdd | 0:f7caac9b804e | 32 | #endif |
hggerdd | 0:f7caac9b804e | 33 | |
hggerdd | 0:f7caac9b804e | 34 | |
hggerdd | 0:f7caac9b804e | 35 | typedef uint8_t SOCKET; |
hggerdd | 0:f7caac9b804e | 36 | |
hggerdd | 0:f7caac9b804e | 37 | #ifndef W5200 |
hggerdd | 0:f7caac9b804e | 38 | #define IDM_OR 0x8000 |
hggerdd | 0:f7caac9b804e | 39 | #define IDM_AR0 0x8001 |
hggerdd | 0:f7caac9b804e | 40 | #define IDM_AR1 0x8002 |
hggerdd | 0:f7caac9b804e | 41 | #define IDM_DR 0x8003 |
hggerdd | 0:f7caac9b804e | 42 | #endif |
hggerdd | 0:f7caac9b804e | 43 | |
hggerdd | 0:f7caac9b804e | 44 | /* |
hggerdd | 0:f7caac9b804e | 45 | class MR { |
hggerdd | 0:f7caac9b804e | 46 | public: |
hggerdd | 0:f7caac9b804e | 47 | static const uint8_t RST = 0x80; |
hggerdd | 0:f7caac9b804e | 48 | static const uint8_t PB = 0x10; |
hggerdd | 0:f7caac9b804e | 49 | static const uint8_t PPPOE = 0x08; |
hggerdd | 0:f7caac9b804e | 50 | static const uint8_t LB = 0x04; |
hggerdd | 0:f7caac9b804e | 51 | static const uint8_t AI = 0x02; |
hggerdd | 0:f7caac9b804e | 52 | static const uint8_t IND = 0x01; |
hggerdd | 0:f7caac9b804e | 53 | }; |
hggerdd | 0:f7caac9b804e | 54 | */ |
hggerdd | 0:f7caac9b804e | 55 | /* |
hggerdd | 0:f7caac9b804e | 56 | class IR { |
hggerdd | 0:f7caac9b804e | 57 | public: |
hggerdd | 0:f7caac9b804e | 58 | static const uint8_t CONFLICT = 0x80; |
hggerdd | 0:f7caac9b804e | 59 | static const uint8_t UNREACH = 0x40; |
hggerdd | 0:f7caac9b804e | 60 | static const uint8_t PPPoE = 0x20; |
hggerdd | 0:f7caac9b804e | 61 | static const uint8_t SOCK0 = 0x01; |
hggerdd | 0:f7caac9b804e | 62 | static const uint8_t SOCK1 = 0x02; |
hggerdd | 0:f7caac9b804e | 63 | static const uint8_t SOCK2 = 0x04; |
hggerdd | 0:f7caac9b804e | 64 | static const uint8_t SOCK3 = 0x08; |
hggerdd | 0:f7caac9b804e | 65 | static inline uint8_t SOCK(SOCKET ch) { return (0x01 << ch); }; |
hggerdd | 0:f7caac9b804e | 66 | }; |
hggerdd | 0:f7caac9b804e | 67 | */ |
hggerdd | 0:f7caac9b804e | 68 | |
hggerdd | 0:f7caac9b804e | 69 | |
hggerdd | 0:f7caac9b804e | 70 | |
hggerdd | 0:f7caac9b804e | 71 | |
hggerdd | 0:f7caac9b804e | 72 | class SnMR |
hggerdd | 0:f7caac9b804e | 73 | { |
hggerdd | 0:f7caac9b804e | 74 | public: |
hggerdd | 0:f7caac9b804e | 75 | static const uint8_t CLOSE = 0x00; |
hggerdd | 0:f7caac9b804e | 76 | static const uint8_t TCP = 0x01; |
hggerdd | 0:f7caac9b804e | 77 | static const uint8_t UDP = 0x02; |
hggerdd | 0:f7caac9b804e | 78 | static const uint8_t IPRAW = 0x03; |
hggerdd | 0:f7caac9b804e | 79 | static const uint8_t MACRAW = 0x04; |
hggerdd | 0:f7caac9b804e | 80 | static const uint8_t PPPOE = 0x05; |
hggerdd | 0:f7caac9b804e | 81 | static const uint8_t ND = 0x20; |
hggerdd | 0:f7caac9b804e | 82 | static const uint8_t MULTI = 0x80; |
hggerdd | 0:f7caac9b804e | 83 | }; |
hggerdd | 0:f7caac9b804e | 84 | |
hggerdd | 0:f7caac9b804e | 85 | enum SockCMD { |
hggerdd | 0:f7caac9b804e | 86 | Sock_OPEN = 0x01, |
hggerdd | 0:f7caac9b804e | 87 | Sock_LISTEN = 0x02, |
hggerdd | 0:f7caac9b804e | 88 | Sock_CONNECT = 0x04, |
hggerdd | 0:f7caac9b804e | 89 | Sock_DISCON = 0x08, |
hggerdd | 0:f7caac9b804e | 90 | Sock_CLOSE = 0x10, |
hggerdd | 0:f7caac9b804e | 91 | Sock_SEND = 0x20, |
hggerdd | 0:f7caac9b804e | 92 | Sock_SEND_MAC = 0x21, |
hggerdd | 0:f7caac9b804e | 93 | Sock_SEND_KEEP = 0x22, |
hggerdd | 0:f7caac9b804e | 94 | Sock_RECV = 0x40 |
hggerdd | 0:f7caac9b804e | 95 | }; |
hggerdd | 0:f7caac9b804e | 96 | |
hggerdd | 0:f7caac9b804e | 97 | /*class SnCmd { |
hggerdd | 0:f7caac9b804e | 98 | public: |
hggerdd | 0:f7caac9b804e | 99 | static const uint8_t OPEN = 0x01; |
hggerdd | 0:f7caac9b804e | 100 | static const uint8_t LISTEN = 0x02; |
hggerdd | 0:f7caac9b804e | 101 | static const uint8_t CONNECT = 0x04; |
hggerdd | 0:f7caac9b804e | 102 | static const uint8_t DISCON = 0x08; |
hggerdd | 0:f7caac9b804e | 103 | static const uint8_t CLOSE = 0x10; |
hggerdd | 0:f7caac9b804e | 104 | static const uint8_t SEND = 0x20; |
hggerdd | 0:f7caac9b804e | 105 | static const uint8_t SEND_MAC = 0x21; |
hggerdd | 0:f7caac9b804e | 106 | static const uint8_t SEND_KEEP = 0x22; |
hggerdd | 0:f7caac9b804e | 107 | static const uint8_t RECV = 0x40; |
hggerdd | 0:f7caac9b804e | 108 | }; |
hggerdd | 0:f7caac9b804e | 109 | */ |
hggerdd | 0:f7caac9b804e | 110 | |
hggerdd | 0:f7caac9b804e | 111 | class SnIR |
hggerdd | 0:f7caac9b804e | 112 | { |
hggerdd | 0:f7caac9b804e | 113 | public: |
hggerdd | 0:f7caac9b804e | 114 | static const uint8_t SEND_OK = 0x10; |
hggerdd | 0:f7caac9b804e | 115 | static const uint8_t TIMEOUT = 0x08; |
hggerdd | 0:f7caac9b804e | 116 | static const uint8_t RECV = 0x04; |
hggerdd | 0:f7caac9b804e | 117 | static const uint8_t DISCON = 0x02; |
hggerdd | 0:f7caac9b804e | 118 | static const uint8_t CON = 0x01; |
hggerdd | 0:f7caac9b804e | 119 | }; |
hggerdd | 0:f7caac9b804e | 120 | |
hggerdd | 0:f7caac9b804e | 121 | class SnSR |
hggerdd | 0:f7caac9b804e | 122 | { |
hggerdd | 0:f7caac9b804e | 123 | public: |
hggerdd | 0:f7caac9b804e | 124 | static const uint8_t CLOSED = 0x00; |
hggerdd | 0:f7caac9b804e | 125 | static const uint8_t INIT = 0x13; |
hggerdd | 0:f7caac9b804e | 126 | static const uint8_t LISTEN = 0x14; |
hggerdd | 0:f7caac9b804e | 127 | static const uint8_t SYNSENT = 0x15; |
hggerdd | 0:f7caac9b804e | 128 | static const uint8_t SYNRECV = 0x16; |
hggerdd | 0:f7caac9b804e | 129 | static const uint8_t ESTABLISHED = 0x17; |
hggerdd | 0:f7caac9b804e | 130 | static const uint8_t FIN_WAIT = 0x18; |
hggerdd | 0:f7caac9b804e | 131 | static const uint8_t CLOSING = 0x1A; |
hggerdd | 0:f7caac9b804e | 132 | static const uint8_t TIME_WAIT = 0x1B; |
hggerdd | 0:f7caac9b804e | 133 | static const uint8_t CLOSE_WAIT = 0x1C; |
hggerdd | 0:f7caac9b804e | 134 | static const uint8_t LAST_ACK = 0x1D; |
hggerdd | 0:f7caac9b804e | 135 | static const uint8_t UDP = 0x22; |
hggerdd | 0:f7caac9b804e | 136 | static const uint8_t IPRAW = 0x32; |
hggerdd | 0:f7caac9b804e | 137 | static const uint8_t MACRAW = 0x42; |
hggerdd | 0:f7caac9b804e | 138 | static const uint8_t PPPOE = 0x5F; |
hggerdd | 0:f7caac9b804e | 139 | }; |
hggerdd | 0:f7caac9b804e | 140 | |
hggerdd | 0:f7caac9b804e | 141 | class IPPROTO |
hggerdd | 0:f7caac9b804e | 142 | { |
hggerdd | 0:f7caac9b804e | 143 | public: |
hggerdd | 0:f7caac9b804e | 144 | static const uint8_t IP = 0; |
hggerdd | 0:f7caac9b804e | 145 | static const uint8_t ICMP = 1; |
hggerdd | 0:f7caac9b804e | 146 | static const uint8_t IGMP = 2; |
hggerdd | 0:f7caac9b804e | 147 | static const uint8_t GGP = 3; |
hggerdd | 0:f7caac9b804e | 148 | static const uint8_t TCP = 6; |
hggerdd | 0:f7caac9b804e | 149 | static const uint8_t PUP = 12; |
hggerdd | 0:f7caac9b804e | 150 | static const uint8_t UDP = 17; |
hggerdd | 0:f7caac9b804e | 151 | static const uint8_t IDP = 22; |
hggerdd | 0:f7caac9b804e | 152 | static const uint8_t ND = 77; |
hggerdd | 0:f7caac9b804e | 153 | static const uint8_t RAW = 255; |
hggerdd | 0:f7caac9b804e | 154 | }; |
hggerdd | 0:f7caac9b804e | 155 | |
hggerdd | 0:f7caac9b804e | 156 | class W5100Class |
hggerdd | 0:f7caac9b804e | 157 | { |
hggerdd | 0:f7caac9b804e | 158 | public: |
hggerdd | 0:f7caac9b804e | 159 | #ifdef MBED |
hggerdd | 0:f7caac9b804e | 160 | void hardware_reset(); |
hggerdd | 0:f7caac9b804e | 161 | #endif //MBED |
hggerdd | 0:f7caac9b804e | 162 | void init(); |
hggerdd | 0:f7caac9b804e | 163 | |
hggerdd | 0:f7caac9b804e | 164 | /** |
hggerdd | 0:f7caac9b804e | 165 | * @brief This function is being used for copy the data form Receive buffer of the chip to application buffer. |
hggerdd | 0:f7caac9b804e | 166 | * |
hggerdd | 0:f7caac9b804e | 167 | * It calculate the actual physical address where one has to read |
hggerdd | 0:f7caac9b804e | 168 | * the data from Receive buffer. Here also take care of the condition while it exceed |
hggerdd | 0:f7caac9b804e | 169 | * the Rx memory uper-bound of socket. |
hggerdd | 0:f7caac9b804e | 170 | */ |
hggerdd | 0:f7caac9b804e | 171 | void read_data(SOCKET s, volatile uint8_t * src, volatile uint8_t * dst, uint16_t len); |
hggerdd | 0:f7caac9b804e | 172 | |
hggerdd | 0:f7caac9b804e | 173 | /** |
hggerdd | 0:f7caac9b804e | 174 | * @brief This function is being called by send() and sendto() function also. |
hggerdd | 0:f7caac9b804e | 175 | * |
hggerdd | 0:f7caac9b804e | 176 | * This function read the Tx write pointer register and after copy the data in buffer update the Tx write pointer |
hggerdd | 0:f7caac9b804e | 177 | * register. User should read upper byte first and lower byte later to get proper value. |
hggerdd | 0:f7caac9b804e | 178 | */ |
hggerdd | 0:f7caac9b804e | 179 | void send_data_processing(SOCKET s, const uint8_t *data, uint16_t len); |
hggerdd | 0:f7caac9b804e | 180 | /** |
hggerdd | 0:f7caac9b804e | 181 | * @brief A copy of send_data_processing that uses the provided ptr for the |
hggerdd | 0:f7caac9b804e | 182 | * write offset. Only needed for the "streaming" UDP API, where |
hggerdd | 0:f7caac9b804e | 183 | * a single UDP packet is built up over a number of calls to |
hggerdd | 0:f7caac9b804e | 184 | * send_data_processing_ptr, because TX_WR doesn't seem to get updated |
hggerdd | 0:f7caac9b804e | 185 | * correctly in those scenarios |
hggerdd | 0:f7caac9b804e | 186 | * @param ptr value to use in place of TX_WR. If 0, then the value is read |
hggerdd | 0:f7caac9b804e | 187 | * in from TX_WR |
hggerdd | 0:f7caac9b804e | 188 | * @return New value for ptr, to be used in the next call |
hggerdd | 0:f7caac9b804e | 189 | */ |
hggerdd | 0:f7caac9b804e | 190 | // FIXME Update documentation |
hggerdd | 0:f7caac9b804e | 191 | void send_data_processing_offset(SOCKET s, uint16_t data_offset, const uint8_t *data, uint16_t len); |
hggerdd | 0:f7caac9b804e | 192 | |
hggerdd | 0:f7caac9b804e | 193 | /** |
hggerdd | 0:f7caac9b804e | 194 | * @brief This function is being called by recv() also. |
hggerdd | 0:f7caac9b804e | 195 | * |
hggerdd | 0:f7caac9b804e | 196 | * This function read the Rx read pointer register |
hggerdd | 0:f7caac9b804e | 197 | * and after copy the data from receive buffer update the Rx write pointer register. |
hggerdd | 0:f7caac9b804e | 198 | * User should read upper byte first and lower byte later to get proper value. |
hggerdd | 0:f7caac9b804e | 199 | */ |
hggerdd | 0:f7caac9b804e | 200 | void recv_data_processing(SOCKET s, uint8_t *data, uint16_t len, uint8_t peek = 0); |
hggerdd | 0:f7caac9b804e | 201 | |
hggerdd | 0:f7caac9b804e | 202 | inline void setGatewayIp(uint8_t *_addr); |
hggerdd | 0:f7caac9b804e | 203 | inline void getGatewayIp(uint8_t *_addr); |
hggerdd | 0:f7caac9b804e | 204 | |
hggerdd | 0:f7caac9b804e | 205 | inline void setSubnetMask(uint8_t *_addr); |
hggerdd | 0:f7caac9b804e | 206 | inline void getSubnetMask(uint8_t *_addr); |
hggerdd | 0:f7caac9b804e | 207 | |
hggerdd | 0:f7caac9b804e | 208 | inline void setMACAddress(uint8_t * addr); |
hggerdd | 0:f7caac9b804e | 209 | inline void getMACAddress(uint8_t * addr); |
hggerdd | 0:f7caac9b804e | 210 | |
hggerdd | 0:f7caac9b804e | 211 | inline void setIPAddress(uint8_t * addr); |
hggerdd | 0:f7caac9b804e | 212 | inline void getIPAddress(uint8_t * addr); |
hggerdd | 0:f7caac9b804e | 213 | |
hggerdd | 0:f7caac9b804e | 214 | inline void setRetransmissionTime(uint16_t timeout); |
hggerdd | 0:f7caac9b804e | 215 | inline void setRetransmissionCount(uint8_t _retry); |
hggerdd | 0:f7caac9b804e | 216 | |
hggerdd | 0:f7caac9b804e | 217 | |
hggerdd | 0:f7caac9b804e | 218 | void execCmdSn(SOCKET s, SockCMD _cmd); |
hggerdd | 0:f7caac9b804e | 219 | |
hggerdd | 0:f7caac9b804e | 220 | uint16_t getTXFreeSize(SOCKET s); |
hggerdd | 0:f7caac9b804e | 221 | uint16_t getRXReceivedSize(SOCKET s); |
hggerdd | 0:f7caac9b804e | 222 | |
hggerdd | 0:f7caac9b804e | 223 | |
hggerdd | 0:f7caac9b804e | 224 | // W5100 Registers |
hggerdd | 0:f7caac9b804e | 225 | // --------------- |
hggerdd | 0:f7caac9b804e | 226 | private: |
hggerdd | 0:f7caac9b804e | 227 | static uint8_t write(uint16_t _addr, uint8_t _data); |
hggerdd | 0:f7caac9b804e | 228 | static uint16_t write(uint16_t addr, const uint8_t *buf, uint16_t len); |
hggerdd | 0:f7caac9b804e | 229 | static uint8_t read(uint16_t addr); |
hggerdd | 0:f7caac9b804e | 230 | static uint16_t read(uint16_t addr, uint8_t *buf, uint16_t len); |
hggerdd | 0:f7caac9b804e | 231 | |
hggerdd | 0:f7caac9b804e | 232 | #define __GP_REGISTER8(name, address) \ |
hggerdd | 0:f7caac9b804e | 233 | static inline void write##name(uint8_t _data) { \ |
hggerdd | 0:f7caac9b804e | 234 | write(address, _data); \ |
hggerdd | 0:f7caac9b804e | 235 | } \ |
hggerdd | 0:f7caac9b804e | 236 | static inline uint8_t read##name() { \ |
hggerdd | 0:f7caac9b804e | 237 | return read(address); \ |
hggerdd | 0:f7caac9b804e | 238 | } |
hggerdd | 0:f7caac9b804e | 239 | #define __GP_REGISTER16(name, address) \ |
hggerdd | 0:f7caac9b804e | 240 | static void write##name(uint16_t _data) { \ |
hggerdd | 0:f7caac9b804e | 241 | write(address, _data >> 8); \ |
hggerdd | 0:f7caac9b804e | 242 | write(address+1, _data & 0xFF); \ |
hggerdd | 0:f7caac9b804e | 243 | } \ |
hggerdd | 0:f7caac9b804e | 244 | static uint16_t read##name() { \ |
hggerdd | 0:f7caac9b804e | 245 | uint16_t res = read(address); \ |
hggerdd | 0:f7caac9b804e | 246 | res = (res << 8) + read(address + 1); \ |
hggerdd | 0:f7caac9b804e | 247 | return res; \ |
hggerdd | 0:f7caac9b804e | 248 | } |
hggerdd | 0:f7caac9b804e | 249 | #define __GP_REGISTER_N(name, address, size) \ |
hggerdd | 0:f7caac9b804e | 250 | static uint16_t write##name(uint8_t *_buff) { \ |
hggerdd | 0:f7caac9b804e | 251 | return write(address, _buff, size); \ |
hggerdd | 0:f7caac9b804e | 252 | } \ |
hggerdd | 0:f7caac9b804e | 253 | static uint16_t read##name(uint8_t *_buff) { \ |
hggerdd | 0:f7caac9b804e | 254 | return read(address, _buff, size); \ |
hggerdd | 0:f7caac9b804e | 255 | } |
hggerdd | 0:f7caac9b804e | 256 | |
hggerdd | 0:f7caac9b804e | 257 | public: |
hggerdd | 0:f7caac9b804e | 258 | __GP_REGISTER8 (MR, 0x0000); // Mode |
hggerdd | 0:f7caac9b804e | 259 | __GP_REGISTER_N(GAR, 0x0001, 4); // Gateway IP address |
hggerdd | 0:f7caac9b804e | 260 | __GP_REGISTER_N(SUBR, 0x0005, 4); // Subnet mask address |
hggerdd | 0:f7caac9b804e | 261 | __GP_REGISTER_N(SHAR, 0x0009, 6); // Source MAC address |
hggerdd | 0:f7caac9b804e | 262 | __GP_REGISTER_N(SIPR, 0x000F, 4); // Source IP address |
hggerdd | 0:f7caac9b804e | 263 | __GP_REGISTER8 (IR, 0x0015); // Interrupt |
hggerdd | 0:f7caac9b804e | 264 | __GP_REGISTER8 (IMR, 0x0016); // Interrupt Mask |
hggerdd | 0:f7caac9b804e | 265 | __GP_REGISTER16(RTR, 0x0017); // Timeout address |
hggerdd | 0:f7caac9b804e | 266 | __GP_REGISTER8 (RCR, 0x0019); // Retry count |
hggerdd | 0:f7caac9b804e | 267 | |
hggerdd | 0:f7caac9b804e | 268 | #ifndef W5200 |
hggerdd | 0:f7caac9b804e | 269 | __GP_REGISTER8 (RMSR, 0x001A); // Receive memory size |
hggerdd | 0:f7caac9b804e | 270 | __GP_REGISTER8 (TMSR, 0x001B); // Transmit memory size |
hggerdd | 0:f7caac9b804e | 271 | #endif |
hggerdd | 0:f7caac9b804e | 272 | __GP_REGISTER8 (PATR, 0x001C); // Authentication type address in PPPoE mode |
hggerdd | 0:f7caac9b804e | 273 | __GP_REGISTER8 (VERSIONR,0x001f); // Chip version |
hggerdd | 0:f7caac9b804e | 274 | __GP_REGISTER8 (PTIMER, 0x0028); // PPP LCP Request Timer |
hggerdd | 0:f7caac9b804e | 275 | __GP_REGISTER8 (PMAGIC, 0x0029); // PPP LCP Magic Number |
hggerdd | 0:f7caac9b804e | 276 | #ifndef W5200 |
hggerdd | 0:f7caac9b804e | 277 | __GP_REGISTER_N(UIPR, 0x002A, 4); // Unreachable IP address in UDP mode |
hggerdd | 0:f7caac9b804e | 278 | __GP_REGISTER16(UPORT, 0x002E); // Unreachable Port address in UDP mode |
hggerdd | 0:f7caac9b804e | 279 | #endif |
hggerdd | 0:f7caac9b804e | 280 | __GP_REGISTER8 (PHYSTATUS,0x0035); // PHY Status |
hggerdd | 0:f7caac9b804e | 281 | |
hggerdd | 0:f7caac9b804e | 282 | #undef __GP_REGISTER8 |
hggerdd | 0:f7caac9b804e | 283 | #undef __GP_REGISTER16 |
hggerdd | 0:f7caac9b804e | 284 | #undef __GP_REGISTER_N |
hggerdd | 0:f7caac9b804e | 285 | |
hggerdd | 0:f7caac9b804e | 286 | // W5100 Socket registers |
hggerdd | 0:f7caac9b804e | 287 | // ---------------------- |
hggerdd | 0:f7caac9b804e | 288 | private: |
hggerdd | 0:f7caac9b804e | 289 | static inline uint8_t readSn(SOCKET _s, uint16_t _addr); |
hggerdd | 0:f7caac9b804e | 290 | static inline uint8_t writeSn(SOCKET _s, uint16_t _addr, uint8_t _data); |
hggerdd | 0:f7caac9b804e | 291 | static inline uint16_t readSn(SOCKET _s, uint16_t _addr, uint8_t *_buf, uint16_t len); |
hggerdd | 0:f7caac9b804e | 292 | static inline uint16_t writeSn(SOCKET _s, uint16_t _addr, uint8_t *_buf, uint16_t len); |
hggerdd | 0:f7caac9b804e | 293 | |
hggerdd | 0:f7caac9b804e | 294 | #ifdef W5200 |
hggerdd | 0:f7caac9b804e | 295 | static const uint16_t CH_BASE = 0x4000; |
hggerdd | 0:f7caac9b804e | 296 | #else |
hggerdd | 0:f7caac9b804e | 297 | static const uint16_t CH_BASE = 0x0400; |
hggerdd | 0:f7caac9b804e | 298 | #endif |
hggerdd | 0:f7caac9b804e | 299 | |
hggerdd | 0:f7caac9b804e | 300 | static const uint16_t CH_SIZE = 0x0100; |
hggerdd | 0:f7caac9b804e | 301 | |
hggerdd | 0:f7caac9b804e | 302 | #define __SOCKET_REGISTER8(name, address) \ |
hggerdd | 0:f7caac9b804e | 303 | static inline void write##name(SOCKET _s, uint8_t _data) { \ |
hggerdd | 0:f7caac9b804e | 304 | writeSn(_s, address, _data); \ |
hggerdd | 0:f7caac9b804e | 305 | } \ |
hggerdd | 0:f7caac9b804e | 306 | static inline uint8_t read##name(SOCKET _s) { \ |
hggerdd | 0:f7caac9b804e | 307 | return readSn(_s, address); \ |
hggerdd | 0:f7caac9b804e | 308 | } |
hggerdd | 0:f7caac9b804e | 309 | #define __SOCKET_REGISTER16(name, address) \ |
hggerdd | 0:f7caac9b804e | 310 | static void write##name(SOCKET _s, uint16_t _data) { \ |
hggerdd | 0:f7caac9b804e | 311 | writeSn(_s, address, _data >> 8); \ |
hggerdd | 0:f7caac9b804e | 312 | writeSn(_s, address+1, _data & 0xFF); \ |
hggerdd | 0:f7caac9b804e | 313 | } \ |
hggerdd | 0:f7caac9b804e | 314 | static uint16_t read##name(SOCKET _s) { \ |
hggerdd | 0:f7caac9b804e | 315 | uint16_t res = readSn(_s, address); \ |
hggerdd | 0:f7caac9b804e | 316 | res = (res << 8) + readSn(_s, address + 1); \ |
hggerdd | 0:f7caac9b804e | 317 | return res; \ |
hggerdd | 0:f7caac9b804e | 318 | } |
hggerdd | 0:f7caac9b804e | 319 | #define __SOCKET_REGISTER_N(name, address, size) \ |
hggerdd | 0:f7caac9b804e | 320 | static uint16_t write##name(SOCKET _s, uint8_t *_buff) { \ |
hggerdd | 0:f7caac9b804e | 321 | return writeSn(_s, address, _buff, size); \ |
hggerdd | 0:f7caac9b804e | 322 | } \ |
hggerdd | 0:f7caac9b804e | 323 | static uint16_t read##name(SOCKET _s, uint8_t *_buff) { \ |
hggerdd | 0:f7caac9b804e | 324 | return readSn(_s, address, _buff, size); \ |
hggerdd | 0:f7caac9b804e | 325 | } |
hggerdd | 0:f7caac9b804e | 326 | |
hggerdd | 0:f7caac9b804e | 327 | public: |
hggerdd | 0:f7caac9b804e | 328 | __SOCKET_REGISTER8(SnMR, 0x0000) // Mode |
hggerdd | 0:f7caac9b804e | 329 | __SOCKET_REGISTER8(SnCR, 0x0001) // Command |
hggerdd | 0:f7caac9b804e | 330 | __SOCKET_REGISTER8(SnIR, 0x0002) // Interrupt |
hggerdd | 0:f7caac9b804e | 331 | __SOCKET_REGISTER8(SnSR, 0x0003) // Status |
hggerdd | 0:f7caac9b804e | 332 | __SOCKET_REGISTER16(SnPORT, 0x0004) // Source Port |
hggerdd | 0:f7caac9b804e | 333 | __SOCKET_REGISTER_N(SnDHAR, 0x0006, 6) // Destination Hardw Addr |
hggerdd | 0:f7caac9b804e | 334 | __SOCKET_REGISTER_N(SnDIPR, 0x000C, 4) // Destination IP Addr |
hggerdd | 0:f7caac9b804e | 335 | __SOCKET_REGISTER16(SnDPORT, 0x0010) // Destination Port |
hggerdd | 0:f7caac9b804e | 336 | __SOCKET_REGISTER16(SnMSSR, 0x0012) // Max Segment Size |
hggerdd | 0:f7caac9b804e | 337 | __SOCKET_REGISTER8(SnPROTO, 0x0014) // Protocol in IP RAW Mode |
hggerdd | 0:f7caac9b804e | 338 | __SOCKET_REGISTER8(SnTOS, 0x0015) // IP TOS |
hggerdd | 0:f7caac9b804e | 339 | __SOCKET_REGISTER8(SnTTL, 0x0016) // IP TTL |
hggerdd | 0:f7caac9b804e | 340 | __SOCKET_REGISTER16(SnTX_FSR, 0x0020) // TX Free Size |
hggerdd | 0:f7caac9b804e | 341 | __SOCKET_REGISTER16(SnTX_RD, 0x0022) // TX Read Pointer |
hggerdd | 0:f7caac9b804e | 342 | __SOCKET_REGISTER16(SnTX_WR, 0x0024) // TX Write Pointer |
hggerdd | 0:f7caac9b804e | 343 | __SOCKET_REGISTER16(SnRX_RSR, 0x0026) // RX Free Size |
hggerdd | 0:f7caac9b804e | 344 | __SOCKET_REGISTER16(SnRX_RD, 0x0028) // RX Read Pointer |
hggerdd | 0:f7caac9b804e | 345 | __SOCKET_REGISTER16(SnRX_WR, 0x002A) // RX Write Pointer (supported?) |
hggerdd | 0:f7caac9b804e | 346 | |
hggerdd | 0:f7caac9b804e | 347 | #undef __SOCKET_REGISTER8 |
hggerdd | 0:f7caac9b804e | 348 | #undef __SOCKET_REGISTER16 |
hggerdd | 0:f7caac9b804e | 349 | #undef __SOCKET_REGISTER_N |
hggerdd | 0:f7caac9b804e | 350 | |
hggerdd | 0:f7caac9b804e | 351 | |
hggerdd | 0:f7caac9b804e | 352 | private: |
hggerdd | 0:f7caac9b804e | 353 | static const uint8_t RST = 7; // Reset BIT |
hggerdd | 0:f7caac9b804e | 354 | |
hggerdd | 0:f7caac9b804e | 355 | #ifdef W5200 |
hggerdd | 0:f7caac9b804e | 356 | static const int SOCKETS = 8; |
hggerdd | 0:f7caac9b804e | 357 | #else |
hggerdd | 0:f7caac9b804e | 358 | static const int SOCKETS = 4; |
hggerdd | 0:f7caac9b804e | 359 | #endif |
hggerdd | 0:f7caac9b804e | 360 | |
hggerdd | 0:f7caac9b804e | 361 | static const uint16_t SMASK = 0x07FF; // Tx buffer MASK |
hggerdd | 0:f7caac9b804e | 362 | static const uint16_t RMASK = 0x07FF; // Rx buffer MASK |
hggerdd | 0:f7caac9b804e | 363 | public: |
hggerdd | 0:f7caac9b804e | 364 | static const uint16_t SSIZE = 2048; // Max Tx buffer size |
hggerdd | 0:f7caac9b804e | 365 | private: |
hggerdd | 0:f7caac9b804e | 366 | static const uint16_t RSIZE = 2048; // Max Rx buffer size |
hggerdd | 0:f7caac9b804e | 367 | uint16_t SBASE[SOCKETS]; // Tx buffer base address |
hggerdd | 0:f7caac9b804e | 368 | uint16_t RBASE[SOCKETS]; // Rx buffer base address |
hggerdd | 0:f7caac9b804e | 369 | |
hggerdd | 0:f7caac9b804e | 370 | private: |
hggerdd | 0:f7caac9b804e | 371 | #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) |
hggerdd | 0:f7caac9b804e | 372 | inline static void initSS() { |
hggerdd | 0:f7caac9b804e | 373 | DDRB |= _BV(4); |
hggerdd | 0:f7caac9b804e | 374 | }; |
hggerdd | 0:f7caac9b804e | 375 | inline static void setSS() { |
hggerdd | 0:f7caac9b804e | 376 | PORTB &= ~_BV(4); |
hggerdd | 0:f7caac9b804e | 377 | }; |
hggerdd | 0:f7caac9b804e | 378 | inline static void resetSS() { |
hggerdd | 0:f7caac9b804e | 379 | PORTB |= _BV(4); |
hggerdd | 0:f7caac9b804e | 380 | }; |
hggerdd | 0:f7caac9b804e | 381 | #elif defined(__AVR_ATmega32U4__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB162__) |
hggerdd | 0:f7caac9b804e | 382 | inline static void initSS() { |
hggerdd | 0:f7caac9b804e | 383 | DDRB |= _BV(0); |
hggerdd | 0:f7caac9b804e | 384 | }; |
hggerdd | 0:f7caac9b804e | 385 | inline static void setSS() { |
hggerdd | 0:f7caac9b804e | 386 | PORTB &= ~_BV(0); |
hggerdd | 0:f7caac9b804e | 387 | }; |
hggerdd | 0:f7caac9b804e | 388 | inline static void resetSS() { |
hggerdd | 0:f7caac9b804e | 389 | PORTB |= _BV(0); |
hggerdd | 0:f7caac9b804e | 390 | }; |
hggerdd | 0:f7caac9b804e | 391 | #else |
hggerdd | 0:f7caac9b804e | 392 | #ifndef MBED |
hggerdd | 0:f7caac9b804e | 393 | inline static void initSS() { |
hggerdd | 0:f7caac9b804e | 394 | DDRB |= _BV(2); |
hggerdd | 0:f7caac9b804e | 395 | }; |
hggerdd | 0:f7caac9b804e | 396 | inline static void setSS() { |
hggerdd | 0:f7caac9b804e | 397 | PORTB &= ~_BV(2); |
hggerdd | 0:f7caac9b804e | 398 | }; |
hggerdd | 0:f7caac9b804e | 399 | inline static void resetSS() { |
hggerdd | 0:f7caac9b804e | 400 | PORTB |= _BV(2); |
hggerdd | 0:f7caac9b804e | 401 | }; |
hggerdd | 0:f7caac9b804e | 402 | #endif //MBED |
hggerdd | 0:f7caac9b804e | 403 | #endif |
hggerdd | 0:f7caac9b804e | 404 | |
hggerdd | 0:f7caac9b804e | 405 | }; |
hggerdd | 0:f7caac9b804e | 406 | |
hggerdd | 0:f7caac9b804e | 407 | extern W5100Class W5100; |
hggerdd | 0:f7caac9b804e | 408 | |
hggerdd | 0:f7caac9b804e | 409 | uint8_t W5100Class::readSn(SOCKET _s, uint16_t _addr) |
hggerdd | 0:f7caac9b804e | 410 | { |
hggerdd | 0:f7caac9b804e | 411 | return read(CH_BASE + _s * CH_SIZE + _addr); |
hggerdd | 0:f7caac9b804e | 412 | } |
hggerdd | 0:f7caac9b804e | 413 | |
hggerdd | 0:f7caac9b804e | 414 | uint8_t W5100Class::writeSn(SOCKET _s, uint16_t _addr, uint8_t _data) |
hggerdd | 0:f7caac9b804e | 415 | { |
hggerdd | 0:f7caac9b804e | 416 | return write(CH_BASE + _s * CH_SIZE + _addr, _data); |
hggerdd | 0:f7caac9b804e | 417 | } |
hggerdd | 0:f7caac9b804e | 418 | |
hggerdd | 0:f7caac9b804e | 419 | uint16_t W5100Class::readSn(SOCKET _s, uint16_t _addr, uint8_t *_buf, uint16_t _len) |
hggerdd | 0:f7caac9b804e | 420 | { |
hggerdd | 0:f7caac9b804e | 421 | return read(CH_BASE + _s * CH_SIZE + _addr, _buf, _len); |
hggerdd | 0:f7caac9b804e | 422 | } |
hggerdd | 0:f7caac9b804e | 423 | |
hggerdd | 0:f7caac9b804e | 424 | uint16_t W5100Class::writeSn(SOCKET _s, uint16_t _addr, uint8_t *_buf, uint16_t _len) |
hggerdd | 0:f7caac9b804e | 425 | { |
hggerdd | 0:f7caac9b804e | 426 | return write(CH_BASE + _s * CH_SIZE + _addr, _buf, _len); |
hggerdd | 0:f7caac9b804e | 427 | } |
hggerdd | 0:f7caac9b804e | 428 | |
hggerdd | 0:f7caac9b804e | 429 | void W5100Class::getGatewayIp(uint8_t *_addr) |
hggerdd | 0:f7caac9b804e | 430 | { |
hggerdd | 0:f7caac9b804e | 431 | readGAR(_addr); |
hggerdd | 0:f7caac9b804e | 432 | } |
hggerdd | 0:f7caac9b804e | 433 | |
hggerdd | 0:f7caac9b804e | 434 | void W5100Class::setGatewayIp(uint8_t *_addr) |
hggerdd | 0:f7caac9b804e | 435 | { |
hggerdd | 0:f7caac9b804e | 436 | writeGAR(_addr); |
hggerdd | 0:f7caac9b804e | 437 | } |
hggerdd | 0:f7caac9b804e | 438 | |
hggerdd | 0:f7caac9b804e | 439 | void W5100Class::getSubnetMask(uint8_t *_addr) |
hggerdd | 0:f7caac9b804e | 440 | { |
hggerdd | 0:f7caac9b804e | 441 | readSUBR(_addr); |
hggerdd | 0:f7caac9b804e | 442 | } |
hggerdd | 0:f7caac9b804e | 443 | |
hggerdd | 0:f7caac9b804e | 444 | void W5100Class::setSubnetMask(uint8_t *_addr) |
hggerdd | 0:f7caac9b804e | 445 | { |
hggerdd | 0:f7caac9b804e | 446 | writeSUBR(_addr); |
hggerdd | 0:f7caac9b804e | 447 | } |
hggerdd | 0:f7caac9b804e | 448 | |
hggerdd | 0:f7caac9b804e | 449 | void W5100Class::getMACAddress(uint8_t *_addr) |
hggerdd | 0:f7caac9b804e | 450 | { |
hggerdd | 0:f7caac9b804e | 451 | readSHAR(_addr); |
hggerdd | 0:f7caac9b804e | 452 | } |
hggerdd | 0:f7caac9b804e | 453 | |
hggerdd | 0:f7caac9b804e | 454 | void W5100Class::setMACAddress(uint8_t *_addr) |
hggerdd | 0:f7caac9b804e | 455 | { |
hggerdd | 0:f7caac9b804e | 456 | writeSHAR(_addr); |
hggerdd | 0:f7caac9b804e | 457 | } |
hggerdd | 0:f7caac9b804e | 458 | |
hggerdd | 0:f7caac9b804e | 459 | void W5100Class::getIPAddress(uint8_t *_addr) |
hggerdd | 0:f7caac9b804e | 460 | { |
hggerdd | 0:f7caac9b804e | 461 | readSIPR(_addr); |
hggerdd | 0:f7caac9b804e | 462 | } |
hggerdd | 0:f7caac9b804e | 463 | |
hggerdd | 0:f7caac9b804e | 464 | void W5100Class::setIPAddress(uint8_t *_addr) |
hggerdd | 0:f7caac9b804e | 465 | { |
hggerdd | 0:f7caac9b804e | 466 | writeSIPR(_addr); |
hggerdd | 0:f7caac9b804e | 467 | } |
hggerdd | 0:f7caac9b804e | 468 | |
hggerdd | 0:f7caac9b804e | 469 | void W5100Class::setRetransmissionTime(uint16_t _timeout) |
hggerdd | 0:f7caac9b804e | 470 | { |
hggerdd | 0:f7caac9b804e | 471 | writeRTR(_timeout); |
hggerdd | 0:f7caac9b804e | 472 | } |
hggerdd | 0:f7caac9b804e | 473 | |
hggerdd | 0:f7caac9b804e | 474 | void W5100Class::setRetransmissionCount(uint8_t _retry) |
hggerdd | 0:f7caac9b804e | 475 | { |
hggerdd | 0:f7caac9b804e | 476 | writeRCR(_retry); |
hggerdd | 0:f7caac9b804e | 477 | } |
hggerdd | 0:f7caac9b804e | 478 | |
hggerdd | 0:f7caac9b804e | 479 | #endif |