WIZ820io(W5200) network interface、EthernetNetIf compatible.

/media/uploads/va009039/wiz820ionetif.jpg

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();
    }
}
Committer:
va009039
Date:
Sun Mar 24 11:25:31 2013 +0000
Revision:
1:22b9052d864d
Parent:
0:bdeec5f86894
WIZ820io(W8200) ethernet interface, EthernetNetIf compatible.

Who changed what in which revision?

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