W5200(WIZ820io) network interface

Committer:
va009039
Date:
Thu Apr 19 11:14:43 2012 +0000
Revision:
2:a8df39b4f3aa
Parent:
1:803123933c5a

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 2:a8df39b4f3aa 1 // MyNetTcpSocket.cpp 2012/4/19
va009039 0:61831b843b44 2 #include "mbed.h"
va009039 0:61831b843b44 3 #include "w5100.h"
va009039 0:61831b843b44 4 #include "MyNetTcpSocket.h"
va009039 2:a8df39b4f3aa 5 //#define __DEBUG
va009039 1:803123933c5a 6 #include "dbg/dbg.h"
va009039 0:61831b843b44 7
va009039 2:a8df39b4f3aa 8 #ifdef __DEBUG
va009039 2:a8df39b4f3aa 9 #define DBG2(...) do{ DebugStream::debug("%p %s ", this,__PRETTY_FUNCTION__); DebugStream::debug(__VA_ARGS__); } while(0);
va009039 2:a8df39b4f3aa 10 #else
va009039 2:a8df39b4f3aa 11 #define DBG2(...) while(0);
va009039 2:a8df39b4f3aa 12 #endif //__DEBUG
va009039 2:a8df39b4f3aa 13
va009039 1:803123933c5a 14 //#define DEBUG
va009039 0:61831b843b44 15
va009039 0:61831b843b44 16 #ifdef DEBUG
va009039 0:61831b843b44 17 #include "Utils.h"
va009039 0:61831b843b44 18 #define PRINT_FUNC() printf("%p %d:%s\n", this,__LINE__,__PRETTY_FUNCTION__)
va009039 0:61831b843b44 19 #else //DEBUG
va009039 0:61831b843b44 20 #define PRINT_FUNC()
va009039 0:61831b843b44 21 #endif //DEBUG
va009039 0:61831b843b44 22
va009039 1:803123933c5a 23 int w5200_new_socket()
va009039 1:803123933c5a 24 {
va009039 1:803123933c5a 25 for(int i = 0; i < MAX_SOCK_NUM; i++) {
va009039 1:803123933c5a 26 if (W5100.readSnMR(i) == SnMR::CLOSE) { // 0x00
va009039 1:803123933c5a 27 if (W5100.readSnSR(i) != SnSR::LISTEN) { // 0x14
va009039 1:803123933c5a 28 return i;
va009039 1:803123933c5a 29 }
va009039 1:803123933c5a 30 }
va009039 1:803123933c5a 31 }
va009039 1:803123933c5a 32 return -1; // not found
va009039 1:803123933c5a 33 }
va009039 1:803123933c5a 34
va009039 1:803123933c5a 35 MyNetTcpSocket::MyNetTcpSocket(int socket) : NetTcpSocket(),_socket(socket),wait_accept(false) {
va009039 0:61831b843b44 36 PRINT_FUNC();
va009039 2:a8df39b4f3aa 37 DBG2("socket: %d\n", socket);
va009039 1:803123933c5a 38 if (_socket == (-1)) {
va009039 1:803123933c5a 39 _socket = w5200_new_socket();
va009039 1:803123933c5a 40 }
va009039 1:803123933c5a 41 #ifdef DEBUG
va009039 1:803123933c5a 42 printf("%p socket: %d\n", this, _socket);
va009039 1:803123933c5a 43 #endif //DEBUG
va009039 1:803123933c5a 44 if (_socket != (-1)) {
va009039 1:803123933c5a 45 W5100.writeSnMR(_socket, SnMR::TCP); // set TCP mode
va009039 1:803123933c5a 46 }
va009039 0:61831b843b44 47 }
va009039 0:61831b843b44 48
va009039 0:61831b843b44 49 MyNetTcpSocket::~MyNetTcpSocket() {
va009039 0:61831b843b44 50 PRINT_FUNC();
va009039 2:a8df39b4f3aa 51 DBG2("socket=%d\n", _socket);
va009039 1:803123933c5a 52 close();
va009039 1:803123933c5a 53 if (_socket != (-1)) {
va009039 1:803123933c5a 54 W5100.writeSnMR(_socket, SnMR::CLOSE);
va009039 1:803123933c5a 55 }
va009039 0:61831b843b44 56 }
va009039 0:61831b843b44 57
va009039 0:61831b843b44 58 NetTcpSocketErr MyNetTcpSocket::bind(const Host& me) {
va009039 0:61831b843b44 59 PRINT_FUNC();
va009039 1:803123933c5a 60 if (_socket == (-1)) {
va009039 1:803123933c5a 61 return NETTCPSOCKET_MEM;
va009039 1:803123933c5a 62 }
va009039 0:61831b843b44 63 int port = me.getPort();
va009039 0:61831b843b44 64 W5100.writeSnPORT(_socket, port);
va009039 0:61831b843b44 65 return NETTCPSOCKET_OK;
va009039 0:61831b843b44 66 }
va009039 0:61831b843b44 67
va009039 0:61831b843b44 68 NetTcpSocketErr MyNetTcpSocket::listen() {
va009039 0:61831b843b44 69 PRINT_FUNC();
va009039 1:803123933c5a 70 if (_socket == (-1)) {
va009039 1:803123933c5a 71 return NETTCPSOCKET_MEM;
va009039 1:803123933c5a 72 }
va009039 0:61831b843b44 73 W5100.execCmdSn(_socket, Sock_OPEN); // set OPEN command
va009039 0:61831b843b44 74 W5100.execCmdSn(_socket, Sock_LISTEN); // listen
va009039 0:61831b843b44 75 #ifdef DEBUG
va009039 0:61831b843b44 76 uint8_t ip[4];
va009039 0:61831b843b44 77 printf("socket:%d SnMR:%02x SnIR:%02x SnSR:%02x\n", _socket,
va009039 0:61831b843b44 78 W5100.readSnMR(_socket), W5100.readSnIR(_socket), W5100.readSnSR(_socket));
va009039 0:61831b843b44 79 W5100.getIPAddress(ip);
va009039 0:61831b843b44 80 printf("SIPR: %d.%d.%d.%d Sn_PORT:%d\n", ip[0], ip[1], ip[2], ip[3], W5100.readSnPORT(_socket));
va009039 0:61831b843b44 81 #endif //DEBUG
va009039 1:803123933c5a 82 wait_accept = true;
va009039 0:61831b843b44 83 return NETTCPSOCKET_OK;
va009039 0:61831b843b44 84 }
va009039 0:61831b843b44 85
va009039 0:61831b843b44 86 NetTcpSocketErr MyNetTcpSocket::connect(const Host& host) {
va009039 0:61831b843b44 87 PRINT_FUNC();
va009039 1:803123933c5a 88 if (_socket == (-1)) {
va009039 1:803123933c5a 89 return NETTCPSOCKET_MEM;
va009039 1:803123933c5a 90 }
va009039 0:61831b843b44 91 uint8_t ip[4];
va009039 0:61831b843b44 92 ip[0] = host.getIp()[0];
va009039 0:61831b843b44 93 ip[1] = host.getIp()[1];
va009039 0:61831b843b44 94 ip[2] = host.getIp()[2];
va009039 0:61831b843b44 95 ip[3] = host.getIp()[3];
va009039 0:61831b843b44 96 int port = host.getPort();
va009039 0:61831b843b44 97 W5100.writeSnDIPR(_socket, ip);
va009039 0:61831b843b44 98 W5100.writeSnDPORT(_socket, port);
va009039 0:61831b843b44 99 if (W5100.readSnPORT(_socket) == 0) {
va009039 0:61831b843b44 100 W5100.writeSnPORT(_socket, 1024 + _socket);
va009039 0:61831b843b44 101 }
va009039 0:61831b843b44 102 W5100.execCmdSn(_socket, Sock_OPEN); // set OPEN command
va009039 0:61831b843b44 103 W5100.execCmdSn(_socket, Sock_CONNECT);
va009039 0:61831b843b44 104 #ifdef DEBUG
va009039 0:61831b843b44 105 printf("socket:%d SnMR:%02x SnIR:%02x SnSR:%02x\n", _socket,
va009039 0:61831b843b44 106 W5100.readSnMR(_socket), W5100.readSnIR(_socket), W5100.readSnSR(_socket));
va009039 0:61831b843b44 107 W5100.getIPAddress(ip);
va009039 0:61831b843b44 108 printf("SIPR: %d.%d.%d.%d Sn_PORT:%d\n", ip[0], ip[1], ip[2], ip[3], W5100.readSnPORT(_socket));
va009039 0:61831b843b44 109 W5100.readSnDIPR(_socket, ip);
va009039 0:61831b843b44 110 printf("Sn_DIPR: %d.%d.%d.%d Sn_DPORT:%d\n", ip[0], ip[1], ip[2], ip[3], W5100.readSnDPORT(_socket));
va009039 0:61831b843b44 111 #endif //DEBUG
va009039 0:61831b843b44 112 return NETTCPSOCKET_OK;
va009039 0:61831b843b44 113 }
va009039 0:61831b843b44 114
va009039 0:61831b843b44 115 NetTcpSocketErr MyNetTcpSocket::accept(Host* pClient, NetTcpSocket** ppNewNetTcpSocket) {
va009039 0:61831b843b44 116 PRINT_FUNC();
va009039 1:803123933c5a 117 if (_socket == (-1)) {
va009039 1:803123933c5a 118 return NETTCPSOCKET_MEM;
va009039 1:803123933c5a 119 }
va009039 0:61831b843b44 120 uint8_t ip[4];
va009039 0:61831b843b44 121 W5100.readSnDIPR(_socket, ip);
va009039 0:61831b843b44 122 pClient->setIp(IpAddr(ip[0],ip[1],ip[2],ip[3]));
va009039 0:61831b843b44 123 int port = W5100.readSnDPORT(_socket);
va009039 0:61831b843b44 124 pClient->setPort(port);
va009039 1:803123933c5a 125 Host me;
va009039 1:803123933c5a 126 me.setPort(W5100.readSnPORT(_socket));
va009039 2:a8df39b4f3aa 127 MyNetTcpSocket* pNewNetTcpSocket = new MyNetTcpSocket(_socket);
va009039 2:a8df39b4f3aa 128 if (pNewNetTcpSocket == NULL) {
va009039 2:a8df39b4f3aa 129 return NETTCPSOCKET_EMPTY;
va009039 2:a8df39b4f3aa 130 }
va009039 2:a8df39b4f3aa 131 pNewNetTcpSocket->m_refs++;
va009039 2:a8df39b4f3aa 132 *ppNewNetTcpSocket = pNewNetTcpSocket;
va009039 1:803123933c5a 133 _socket = w5200_new_socket();
va009039 1:803123933c5a 134 if (_socket != (-1)) {
va009039 1:803123933c5a 135 W5100.writeSnMR(_socket, SnMR::TCP); // set TCP mode
va009039 1:803123933c5a 136 bind(me);
va009039 1:803123933c5a 137 listen();
va009039 1:803123933c5a 138 }
va009039 0:61831b843b44 139 return NETTCPSOCKET_OK;
va009039 0:61831b843b44 140 }
va009039 0:61831b843b44 141
va009039 0:61831b843b44 142 int /*if < 0 : NetTcpSocketErr*/ MyNetTcpSocket::send(const char* buf, int len) {
va009039 0:61831b843b44 143 PRINT_FUNC();
va009039 0:61831b843b44 144 #ifdef DEBUG
va009039 0:61831b843b44 145 printf("buf:%p, len=%d\n", buf, len);
va009039 0:61831b843b44 146 printHex((u8*)buf, len);
va009039 0:61831b843b44 147 #endif //DEBUG
va009039 1:803123933c5a 148 if (_socket == (-1)) {
va009039 1:803123933c5a 149 return NETTCPSOCKET_MEM;
va009039 1:803123933c5a 150 }
va009039 0:61831b843b44 151 if (len > 0) {
va009039 0:61831b843b44 152 W5100.send_data_processing(_socket, (uint8_t*)buf, len);
va009039 0:61831b843b44 153 W5100.execCmdSn(_socket, Sock_SEND);
va009039 0:61831b843b44 154 }
va009039 0:61831b843b44 155 return len;
va009039 0:61831b843b44 156 }
va009039 0:61831b843b44 157
va009039 0:61831b843b44 158 int /*if < 0 : NetTcpSocketErr*/ MyNetTcpSocket::recv(char* buf, int len){
va009039 0:61831b843b44 159 PRINT_FUNC();
va009039 1:803123933c5a 160 if (_socket == (-1)) {
va009039 1:803123933c5a 161 return NETTCPSOCKET_MEM;
va009039 1:803123933c5a 162 }
va009039 0:61831b843b44 163 int size = W5100.getRXReceivedSize(_socket);
va009039 0:61831b843b44 164 if (size > len) {
va009039 0:61831b843b44 165 size = len;
va009039 0:61831b843b44 166 }
va009039 0:61831b843b44 167 if (size > 0) {
va009039 0:61831b843b44 168 W5100.recv_data_processing(_socket, (uint8_t*)buf, size);
va009039 0:61831b843b44 169 W5100.execCmdSn(_socket, Sock_RECV);
va009039 0:61831b843b44 170 }
va009039 0:61831b843b44 171 #ifdef DEBUG
va009039 0:61831b843b44 172 printHex((uint8_t*)buf, size);
va009039 0:61831b843b44 173 #endif //DEBUG
va009039 0:61831b843b44 174 return size;
va009039 0:61831b843b44 175 }
va009039 0:61831b843b44 176
va009039 0:61831b843b44 177 NetTcpSocketErr MyNetTcpSocket::close() {
va009039 0:61831b843b44 178 PRINT_FUNC();
va009039 2:a8df39b4f3aa 179 DBG2("m_closed=%d m_refs=%d\n", m_closed, m_refs);
va009039 0:61831b843b44 180 if(m_closed) {
va009039 0:61831b843b44 181 return NETTCPSOCKET_OK;
va009039 0:61831b843b44 182 }
va009039 0:61831b843b44 183 m_closed = true;
va009039 0:61831b843b44 184 cleanUp();
va009039 1:803123933c5a 185 if (_socket != (-1)) {
va009039 1:803123933c5a 186 W5100.execCmdSn(_socket, Sock_DISCON);
va009039 1:803123933c5a 187 W5100.execCmdSn(_socket, Sock_CLOSE);
va009039 1:803123933c5a 188 }
va009039 0:61831b843b44 189 return NETTCPSOCKET_OK;
va009039 0:61831b843b44 190 }
va009039 0:61831b843b44 191
va009039 0:61831b843b44 192 NetTcpSocketErr MyNetTcpSocket::poll(){
va009039 0:61831b843b44 193 PRINT_FUNC();
va009039 0:61831b843b44 194 NetTcpSocket::flushEvents();
va009039 0:61831b843b44 195 #ifdef DEBUG
va009039 1:803123933c5a 196 printf("%p socket:%d\n", this,_socket);
va009039 1:803123933c5a 197 if (_socket != (-1)) {
va009039 1:803123933c5a 198 printf("SnMR:%02x SnIR:%02x SnSR:%02x\n",
va009039 1:803123933c5a 199 W5100.readSnMR(_socket), W5100.readSnIR(_socket), W5100.readSnSR(_socket));
va009039 1:803123933c5a 200 uint8_t ip[4];
va009039 1:803123933c5a 201 W5100.readSnDIPR(_socket, ip);
va009039 1:803123933c5a 202 printf("Sn_DIPR: %d.%d.%d.%d Sn_DPORT: %d\n", ip[0], ip[1], ip[2], ip[3], W5100.readSnDPORT(_socket));
va009039 1:803123933c5a 203 printf("Sn_RX_RSR:%5d, Sn_RX_RD:%5d, Sn_RX_WR:%5d\n",
va009039 0:61831b843b44 204 W5100.readSnRX_RSR(_socket), W5100.readSnRX_RD(_socket), W5100.readSnRX_WR(_socket));
va009039 1:803123933c5a 205 printf("Sn_TX_FSR:%5d, Sn_TX_RD:%5d, Sn_TX_WR:%5d\n",
va009039 0:61831b843b44 206 W5100.readSnTX_FSR(_socket), W5100.readSnTX_RD(_socket), W5100.readSnTX_WR(_socket));
va009039 1:803123933c5a 207 }
va009039 1:803123933c5a 208 wait_ms(200);
va009039 0:61831b843b44 209 #endif //DEBUG
va009039 1:803123933c5a 210 if (_socket == (-1)) {
va009039 1:803123933c5a 211 return NETTCPSOCKET_OK;
va009039 1:803123933c5a 212 }
va009039 1:803123933c5a 213 uint8_t Sn_SR = W5100.readSnSR(_socket);
va009039 1:803123933c5a 214 if (wait_accept) {
va009039 1:803123933c5a 215 if (Sn_SR == 0x17) {
va009039 1:803123933c5a 216 queueEvent(NETTCPSOCKET_ACCEPT);
va009039 1:803123933c5a 217 wait_accept = false;
va009039 1:803123933c5a 218 }
va009039 1:803123933c5a 219 }
va009039 1:803123933c5a 220 if (Sn_SR == 0x1c) {
va009039 0:61831b843b44 221 queueEvent(NETTCPSOCKET_CONRST);
va009039 0:61831b843b44 222 }
va009039 0:61831b843b44 223 if (W5100.getRXReceivedSize(_socket) > 0) {
va009039 0:61831b843b44 224 queueEvent(NETTCPSOCKET_READABLE);
va009039 0:61831b843b44 225 }
va009039 1:803123933c5a 226 if (Sn_SR == 0x17) {
va009039 0:61831b843b44 227 queueEvent(NETTCPSOCKET_CONNECTED);
va009039 0:61831b843b44 228 if (W5100.getTXFreeSize(_socket) > 0) {
va009039 0:61831b843b44 229 queueEvent(NETTCPSOCKET_WRITEABLE);
va009039 0:61831b843b44 230 }
va009039 0:61831b843b44 231 }
va009039 1:803123933c5a 232 if (Sn_SR == 0x00) {
va009039 1:803123933c5a 233 queueEvent(NETTCPSOCKET_DISCONNECTED);
va009039 1:803123933c5a 234 }
va009039 0:61831b843b44 235 return NETTCPSOCKET_OK;
va009039 0:61831b843b44 236 }
va009039 0:61831b843b44 237
va009039 0:61831b843b44 238 void MyNetTcpSocket::cleanUp() //Flush input buffer
va009039 0:61831b843b44 239 {
va009039 0:61831b843b44 240 PRINT_FUNC();
va009039 1:803123933c5a 241 if (_socket == (-1)) {
va009039 1:803123933c5a 242 return;
va009039 1:803123933c5a 243 }
va009039 1:803123933c5a 244 while(W5100.getRXReceivedSize(_socket) > 0) {
va009039 1:803123933c5a 245 uint8_t temp[1];
va009039 1:803123933c5a 246 W5100.recv_data_processing(_socket, temp, 1);
va009039 0:61831b843b44 247 W5100.execCmdSn(_socket, Sock_RECV);
va009039 1:803123933c5a 248 }
va009039 0:61831b843b44 249 }