W5200(WIZ820io) network interface

Committer:
va009039
Date:
Tue Apr 17 12:13:15 2012 +0000
Revision:
1:803123933c5a
Parent:
0:61831b843b44
Child:
2:a8df39b4f3aa

        

Who changed what in which revision?

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