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 // MyNetUdpSocket.cpp 2012/4/15
va009039 0:61831b843b44 2 #include "mbed.h"
va009039 0:61831b843b44 3 #include "MyNetUdpSocket.h"
va009039 0:61831b843b44 4 #include "w5100.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 MyNetUdpSocket::MyNetUdpSocket() : NetUdpSocket() {
va009039 0:61831b843b44 16 PRINT_FUNC();
va009039 0:61831b843b44 17 _socket = 0;
va009039 0:61831b843b44 18 W5100.writeSnMR(_socket, SnMR::UDP); // set UDP mode
va009039 0:61831b843b44 19 }
va009039 0:61831b843b44 20
va009039 0:61831b843b44 21 MyNetUdpSocket::~MyNetUdpSocket() {
va009039 0:61831b843b44 22 PRINT_FUNC();
va009039 0:61831b843b44 23 close();
va009039 0:61831b843b44 24 }
va009039 0:61831b843b44 25
va009039 0:61831b843b44 26 NetUdpSocketErr MyNetUdpSocket::bind(const Host& me) {
va009039 0:61831b843b44 27 PRINT_FUNC();
va009039 0:61831b843b44 28 int port = me.getPort();
va009039 0:61831b843b44 29 W5100.writeSnPORT(_socket, port);
va009039 0:61831b843b44 30 W5100.execCmdSn( _socket, Sock_OPEN); // set OPEN command
va009039 0:61831b843b44 31 return NETUDPSOCKET_OK;
va009039 0:61831b843b44 32 }
va009039 0:61831b843b44 33
va009039 0:61831b843b44 34 int /*if < 0 : NetUdpSocketErr*/ MyNetUdpSocket::sendto(const char* buf, int len, Host* pHost) {
va009039 0:61831b843b44 35 PRINT_FUNC();
va009039 0:61831b843b44 36 uint8_t ip[4];
va009039 0:61831b843b44 37 ip[0] = pHost->getIp()[0];
va009039 0:61831b843b44 38 ip[1] = pHost->getIp()[1];
va009039 0:61831b843b44 39 ip[2] = pHost->getIp()[2];
va009039 0:61831b843b44 40 ip[3] = pHost->getIp()[3];
va009039 0:61831b843b44 41 int port = pHost->getPort();
va009039 0:61831b843b44 42 W5100.writeSnDIPR(_socket, ip);
va009039 0:61831b843b44 43 W5100.writeSnDPORT(_socket, port);
va009039 0:61831b843b44 44 W5100.send_data_processing(_socket, (uint8_t*)buf, len);
va009039 0:61831b843b44 45 W5100.execCmdSn(_socket, Sock_SEND);
va009039 0:61831b843b44 46 #ifdef DEBUG
va009039 0:61831b843b44 47 printHex((u8*)buf, len);
va009039 0:61831b843b44 48 W5100.getIPAddress(ip);
va009039 0:61831b843b44 49 printf("SIPR: %d.%d.%d.%d Sn_PORT:%d\n", ip[0], ip[1], ip[2], ip[3], W5100.readSnPORT(_socket));
va009039 0:61831b843b44 50 W5100.readSnDIPR(_socket, ip);
va009039 0:61831b843b44 51 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 52 #endif //DEBUG
va009039 0:61831b843b44 53 return len;
va009039 0:61831b843b44 54 }
va009039 0:61831b843b44 55
va009039 0:61831b843b44 56 int /*if < 0 : NetUdpSocketErr*/ MyNetUdpSocket::recvfrom(char* buf, int len, Host* pHost) {
va009039 0:61831b843b44 57 PRINT_FUNC();
va009039 0:61831b843b44 58 int size = W5100.getRXReceivedSize(_socket);
va009039 0:61831b843b44 59 if (size < 8) {
va009039 0:61831b843b44 60 return -1;
va009039 0:61831b843b44 61 }
va009039 0:61831b843b44 62 uint8_t info[8];
va009039 0:61831b843b44 63 W5100.recv_data_processing(_socket, info, 8);
va009039 0:61831b843b44 64 W5100.execCmdSn(_socket, Sock_RECV);
va009039 0:61831b843b44 65 pHost->setIp(IpAddr(info[0],info[1],info[2],info[3]));
va009039 0:61831b843b44 66 pHost->setPort(info[4]<<8|info[5]);
va009039 0:61831b843b44 67 size -= 8;
va009039 0:61831b843b44 68 if (size > len) {
va009039 0:61831b843b44 69 size = len;
va009039 0:61831b843b44 70 }
va009039 0:61831b843b44 71 W5100.recv_data_processing(_socket, (uint8_t*)buf, size);
va009039 0:61831b843b44 72 W5100.execCmdSn(_socket, Sock_RECV);
va009039 0:61831b843b44 73 #ifdef DEBUG
va009039 0:61831b843b44 74 printfBytes("UDP PACKET-INFO", (u8*)info, 8);
va009039 0:61831b843b44 75 printHex((u8*)buf, size);
va009039 0:61831b843b44 76 #endif //DEBUG
va009039 0:61831b843b44 77 return size;
va009039 0:61831b843b44 78 }
va009039 0:61831b843b44 79
va009039 0:61831b843b44 80 NetUdpSocketErr MyNetUdpSocket::close() {
va009039 0:61831b843b44 81 PRINT_FUNC();
va009039 0:61831b843b44 82 if(m_closed) {
va009039 0:61831b843b44 83 return NETUDPSOCKET_OK;
va009039 0:61831b843b44 84 }
va009039 0:61831b843b44 85 m_closed = true;
va009039 0:61831b843b44 86 cleanUp();
va009039 0:61831b843b44 87 return NETUDPSOCKET_OK;
va009039 0:61831b843b44 88 }
va009039 0:61831b843b44 89
va009039 0:61831b843b44 90 NetUdpSocketErr MyNetUdpSocket::poll() {
va009039 0:61831b843b44 91 PRINT_FUNC();
va009039 0:61831b843b44 92 NetUdpSocket::flushEvents();
va009039 0:61831b843b44 93 #ifdef DEBUG
va009039 0:61831b843b44 94 printf("socket:%d SnMR:%02x SnIR:%02x SnSR:%02x\n", _socket,
va009039 0:61831b843b44 95 W5100.readSnMR(_socket), W5100.readSnIR(_socket), W5100.readSnSR(_socket));
va009039 0:61831b843b44 96 uint8_t ip[4];
va009039 0:61831b843b44 97 W5100.readSnDIPR(_socket, ip);
va009039 0:61831b843b44 98 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 99 uint8_t mac[6];
va009039 0:61831b843b44 100 W5100.readSnDHAR(_socket, mac);
va009039 0:61831b843b44 101 printf("Sn_DHAR: %02x:%02x:%02x:%02x:%02x:%02x\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
va009039 0:61831b843b44 102 printf("Sn_RX_RSR:%d, Sn_RX_RD:%d, Sn_RX_WR:%d\n",
va009039 0:61831b843b44 103 W5100.readSnRX_RSR(_socket), W5100.readSnRX_RD(_socket), W5100.readSnRX_WR(_socket));
va009039 0:61831b843b44 104 printf("Sn_TX_FSR:%d, Sn_TX_RD:%d, Sn_TX_WR:%d\n",
va009039 0:61831b843b44 105 W5100.readSnTX_FSR(_socket), W5100.readSnTX_RD(_socket), W5100.readSnTX_WR(_socket));
va009039 0:61831b843b44 106 wait_ms(500);
va009039 0:61831b843b44 107 #endif //DEBUG
va009039 0:61831b843b44 108 if (W5100.getRXReceivedSize(_socket) > 0) {
va009039 0:61831b843b44 109 queueEvent(NETUDPSOCKET_READABLE);
va009039 0:61831b843b44 110 }
va009039 0:61831b843b44 111 return NETUDPSOCKET_OK;
va009039 0:61831b843b44 112 }
va009039 0:61831b843b44 113
va009039 0:61831b843b44 114 void MyNetUdpSocket::cleanUp() //Flush input buffer
va009039 0:61831b843b44 115 {
va009039 0:61831b843b44 116 PRINT_FUNC();
va009039 0:61831b843b44 117 while(1) {
va009039 0:61831b843b44 118 int len = W5100.getRXReceivedSize(_socket);
va009039 0:61831b843b44 119 if (len <= 0) {
va009039 0:61831b843b44 120 break;
va009039 0:61831b843b44 121 }
va009039 0:61831b843b44 122 uint8_t temp[8];
va009039 0:61831b843b44 123 W5100.recv_data_processing(_socket, temp, sizeof(temp));
va009039 0:61831b843b44 124 W5100.execCmdSn(_socket, Sock_RECV);
va009039 0:61831b843b44 125 }
va009039 0:61831b843b44 126 }