W5200(WIZ820io) network interface

Committer:
va009039
Date:
Sat Apr 14 17:21:11 2012 +0000
Revision:
0:61831b843b44
Child:
1:803123933c5a

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 0:61831b843b44 1 // MyNetTcpSocket.cpp 2012/4/15
va009039 0:61831b843b44 2 #include "mbed.h"
va009039 0:61831b843b44 3 #include "w5100.h"
va009039 0:61831b843b44 4 #include "MyNetTcpSocket.h"
va009039 0:61831b843b44 5
va009039 0:61831b843b44 6 #define DEBUG
va009039 0:61831b843b44 7
va009039 0:61831b843b44 8 #ifdef DEBUG
va009039 0:61831b843b44 9 #include "Utils.h"
va009039 0:61831b843b44 10 #define PRINT_FUNC() printf("%p %d:%s\n", this,__LINE__,__PRETTY_FUNCTION__)
va009039 0:61831b843b44 11 #else //DEBUG
va009039 0:61831b843b44 12 #define PRINT_FUNC()
va009039 0:61831b843b44 13 #endif //DEBUG
va009039 0:61831b843b44 14
va009039 0:61831b843b44 15 MyNetTcpSocket::MyNetTcpSocket() : NetTcpSocket() {
va009039 0:61831b843b44 16 PRINT_FUNC();
va009039 0:61831b843b44 17 _socket = 1;
va009039 0:61831b843b44 18 W5100.writeSnMR(_socket, SnMR:: TCP); // set TCP mode
va009039 0:61831b843b44 19 }
va009039 0:61831b843b44 20
va009039 0:61831b843b44 21 MyNetTcpSocket::~MyNetTcpSocket() {
va009039 0:61831b843b44 22 PRINT_FUNC();
va009039 0:61831b843b44 23 }
va009039 0:61831b843b44 24
va009039 0:61831b843b44 25 NetTcpSocketErr MyNetTcpSocket::bind(const Host& me) {
va009039 0:61831b843b44 26 PRINT_FUNC();
va009039 0:61831b843b44 27 int port = me.getPort();
va009039 0:61831b843b44 28 W5100.writeSnPORT(_socket, port);
va009039 0:61831b843b44 29 return NETTCPSOCKET_OK;
va009039 0:61831b843b44 30 }
va009039 0:61831b843b44 31
va009039 0:61831b843b44 32 NetTcpSocketErr MyNetTcpSocket::listen() {
va009039 0:61831b843b44 33 PRINT_FUNC();
va009039 0:61831b843b44 34 W5100.execCmdSn(_socket, Sock_OPEN); // set OPEN command
va009039 0:61831b843b44 35 W5100.execCmdSn(_socket, Sock_LISTEN); // listen
va009039 0:61831b843b44 36 #ifdef DEBUG
va009039 0:61831b843b44 37 uint8_t ip[4];
va009039 0:61831b843b44 38 printf("socket:%d SnMR:%02x SnIR:%02x SnSR:%02x\n", _socket,
va009039 0:61831b843b44 39 W5100.readSnMR(_socket), W5100.readSnIR(_socket), W5100.readSnSR(_socket));
va009039 0:61831b843b44 40 W5100.getIPAddress(ip);
va009039 0:61831b843b44 41 printf("SIPR: %d.%d.%d.%d Sn_PORT:%d\n", ip[0], ip[1], ip[2], ip[3], W5100.readSnPORT(_socket));
va009039 0:61831b843b44 42 #endif //DEBUG
va009039 0:61831b843b44 43 return NETTCPSOCKET_OK;
va009039 0:61831b843b44 44 }
va009039 0:61831b843b44 45
va009039 0:61831b843b44 46 NetTcpSocketErr MyNetTcpSocket::connect(const Host& host) {
va009039 0:61831b843b44 47 PRINT_FUNC();
va009039 0:61831b843b44 48 uint8_t ip[4];
va009039 0:61831b843b44 49 ip[0] = host.getIp()[0];
va009039 0:61831b843b44 50 ip[1] = host.getIp()[1];
va009039 0:61831b843b44 51 ip[2] = host.getIp()[2];
va009039 0:61831b843b44 52 ip[3] = host.getIp()[3];
va009039 0:61831b843b44 53 int port = host.getPort();
va009039 0:61831b843b44 54 W5100.writeSnDIPR(_socket, ip);
va009039 0:61831b843b44 55 W5100.writeSnDPORT(_socket, port);
va009039 0:61831b843b44 56 if (W5100.readSnPORT(_socket) == 0) {
va009039 0:61831b843b44 57 W5100.writeSnPORT(_socket, 1024 + _socket);
va009039 0:61831b843b44 58 }
va009039 0:61831b843b44 59 W5100.execCmdSn(_socket, Sock_OPEN); // set OPEN command
va009039 0:61831b843b44 60 W5100.execCmdSn(_socket, Sock_CONNECT);
va009039 0:61831b843b44 61 #ifdef DEBUG
va009039 0:61831b843b44 62 printf("socket:%d SnMR:%02x SnIR:%02x SnSR:%02x\n", _socket,
va009039 0:61831b843b44 63 W5100.readSnMR(_socket), W5100.readSnIR(_socket), W5100.readSnSR(_socket));
va009039 0:61831b843b44 64 W5100.getIPAddress(ip);
va009039 0:61831b843b44 65 printf("SIPR: %d.%d.%d.%d Sn_PORT:%d\n", ip[0], ip[1], ip[2], ip[3], W5100.readSnPORT(_socket));
va009039 0:61831b843b44 66 W5100.readSnDIPR(_socket, ip);
va009039 0:61831b843b44 67 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 68 #endif //DEBUG
va009039 0:61831b843b44 69 return NETTCPSOCKET_OK;
va009039 0:61831b843b44 70 }
va009039 0:61831b843b44 71
va009039 0:61831b843b44 72 NetTcpSocketErr MyNetTcpSocket::accept(Host* pClient, NetTcpSocket** ppNewNetTcpSocket) {
va009039 0:61831b843b44 73 PRINT_FUNC();
va009039 0:61831b843b44 74 uint8_t ip[4];
va009039 0:61831b843b44 75 W5100.readSnDIPR(_socket, ip);
va009039 0:61831b843b44 76 pClient->setIp(IpAddr(ip[0],ip[1],ip[2],ip[3]));
va009039 0:61831b843b44 77 int port = W5100.readSnDPORT(_socket);
va009039 0:61831b843b44 78 pClient->setPort(port);
va009039 0:61831b843b44 79
va009039 0:61831b843b44 80 return NETTCPSOCKET_OK;
va009039 0:61831b843b44 81 }
va009039 0:61831b843b44 82
va009039 0:61831b843b44 83 int /*if < 0 : NetTcpSocketErr*/ MyNetTcpSocket::send(const char* buf, int len) {
va009039 0:61831b843b44 84 PRINT_FUNC();
va009039 0:61831b843b44 85 #ifdef DEBUG
va009039 0:61831b843b44 86 printf("buf:%p, len=%d\n", buf, len);
va009039 0:61831b843b44 87 printHex((u8*)buf, len);
va009039 0:61831b843b44 88 #endif //DEBUG
va009039 0:61831b843b44 89 if (len > 0) {
va009039 0:61831b843b44 90 W5100.send_data_processing(_socket, (uint8_t*)buf, len);
va009039 0:61831b843b44 91 W5100.execCmdSn(_socket, Sock_SEND);
va009039 0:61831b843b44 92 }
va009039 0:61831b843b44 93 return len;
va009039 0:61831b843b44 94 }
va009039 0:61831b843b44 95
va009039 0:61831b843b44 96 int /*if < 0 : NetTcpSocketErr*/ MyNetTcpSocket::recv(char* buf, int len){
va009039 0:61831b843b44 97 PRINT_FUNC();
va009039 0:61831b843b44 98 int size = W5100.getRXReceivedSize(_socket);
va009039 0:61831b843b44 99 if (size > len) {
va009039 0:61831b843b44 100 size = len;
va009039 0:61831b843b44 101 }
va009039 0:61831b843b44 102 if (size > 0) {
va009039 0:61831b843b44 103 W5100.recv_data_processing(_socket, (uint8_t*)buf, size);
va009039 0:61831b843b44 104 W5100.execCmdSn(_socket, Sock_RECV);
va009039 0:61831b843b44 105 }
va009039 0:61831b843b44 106 #ifdef DEBUG
va009039 0:61831b843b44 107 printHex((uint8_t*)buf, size);
va009039 0:61831b843b44 108 #endif //DEBUG
va009039 0:61831b843b44 109 return size;
va009039 0:61831b843b44 110 }
va009039 0:61831b843b44 111
va009039 0:61831b843b44 112 NetTcpSocketErr MyNetTcpSocket::close() {
va009039 0:61831b843b44 113 PRINT_FUNC();
va009039 0:61831b843b44 114 if(m_closed) {
va009039 0:61831b843b44 115 return NETTCPSOCKET_OK;
va009039 0:61831b843b44 116 }
va009039 0:61831b843b44 117 m_closed = true;
va009039 0:61831b843b44 118 cleanUp();
va009039 0:61831b843b44 119 W5100.execCmdSn(_socket, Sock_DISCON);
va009039 0:61831b843b44 120 W5100.execCmdSn(_socket, Sock_CLOSE);
va009039 0:61831b843b44 121 return NETTCPSOCKET_OK;
va009039 0:61831b843b44 122 }
va009039 0:61831b843b44 123
va009039 0:61831b843b44 124 NetTcpSocketErr MyNetTcpSocket::poll(){
va009039 0:61831b843b44 125 PRINT_FUNC();
va009039 0:61831b843b44 126 NetTcpSocket::flushEvents();
va009039 0:61831b843b44 127 #ifdef DEBUG
va009039 0:61831b843b44 128 printf("socket:%d SnMR:%02x SnIR:%02x SnSR:%02x\n", _socket,
va009039 0:61831b843b44 129 W5100.readSnMR(_socket), W5100.readSnIR(_socket), W5100.readSnSR(_socket));
va009039 0:61831b843b44 130 uint8_t ip[4];
va009039 0:61831b843b44 131 W5100.readSnDIPR(_socket, ip);
va009039 0:61831b843b44 132 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 133 printf("Sn_RX_RSR:%d, Sn_RX_RD:%d, Sn_RX_WR:%d\n",
va009039 0:61831b843b44 134 W5100.readSnRX_RSR(_socket), W5100.readSnRX_RD(_socket), W5100.readSnRX_WR(_socket));
va009039 0:61831b843b44 135 printf("Sn_TX_FSR:%d, Sn_TX_RD:%d, Sn_TX_WR:%d\n",
va009039 0:61831b843b44 136 W5100.readSnTX_FSR(_socket), W5100.readSnTX_RD(_socket), W5100.readSnTX_WR(_socket));
va009039 0:61831b843b44 137 wait_ms(500);
va009039 0:61831b843b44 138 #endif //DEBUG
va009039 0:61831b843b44 139 if (W5100.readSnSR(_socket) == 0x1c) {
va009039 0:61831b843b44 140 queueEvent(NETTCPSOCKET_CONRST);
va009039 0:61831b843b44 141 }
va009039 0:61831b843b44 142 if (W5100.getRXReceivedSize(_socket) > 0) {
va009039 0:61831b843b44 143 queueEvent(NETTCPSOCKET_READABLE);
va009039 0:61831b843b44 144 }
va009039 0:61831b843b44 145 if (W5100.readSnSR(_socket) == 0x17) {
va009039 0:61831b843b44 146 queueEvent(NETTCPSOCKET_CONNECTED);
va009039 0:61831b843b44 147 if (W5100.getTXFreeSize(_socket) > 0) {
va009039 0:61831b843b44 148 queueEvent(NETTCPSOCKET_WRITEABLE);
va009039 0:61831b843b44 149 }
va009039 0:61831b843b44 150 }
va009039 0:61831b843b44 151 return NETTCPSOCKET_OK;
va009039 0:61831b843b44 152 }
va009039 0:61831b843b44 153
va009039 0:61831b843b44 154 void MyNetTcpSocket::cleanUp() //Flush input buffer
va009039 0:61831b843b44 155 {
va009039 0:61831b843b44 156 PRINT_FUNC();
va009039 0:61831b843b44 157 while(1) {
va009039 0:61831b843b44 158 int len = W5100.getRXReceivedSize(_socket);
va009039 0:61831b843b44 159 if (len <= 0) {
va009039 0:61831b843b44 160 break;
va009039 0:61831b843b44 161 }
va009039 0:61831b843b44 162 uint8_t temp[8];
va009039 0:61831b843b44 163 W5100.recv_data_processing(_socket, temp, sizeof(temp));
va009039 0:61831b843b44 164 W5100.execCmdSn(_socket, Sock_RECV);
va009039 0:61831b843b44 165 }
va009039 0:61831b843b44 166 }