This is the Interface library for WIZnet W5500 chip which forked of EthernetInterfaceW5500, WIZnetInterface and WIZ550ioInterface. This library has simple name as "W5500Interface". and can be used for Wiz550io users also.

Dependents:   EvrythngApi Websocket_Ethernet_HelloWorld_W5500 Websocket_Ethernet_W5500 CurrentWeatherData_W5500 ... more

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers W5500.h Source File

W5500.h

00001 #pragma once
00002 
00003 #include "mbed.h"
00004 #include "mbed_debug.h"
00005 
00006 
00007 #define TEST_ASSERT(A) while(!(A)){debug("\n\n%s@%d %s ASSERT!\n\n",__PRETTY_FUNCTION__,__LINE__,#A);exit(1);};
00008 
00009 #define DEFAULT_WAIT_RESP_TIMEOUT 500
00010 
00011 
00012 
00013 #define SOCK_OK               1        ///< Result is OK about socket process.
00014 #define SOCK_BUSY             0        ///< Socket is busy on processing the operation. Valid only Non-block IO Mode.
00015 #define SOCK_FATAL            -1000    ///< Result is fatal error about socket process.
00016 
00017 #define SOCK_ERROR            0        
00018 #define SOCKERR_SOCKNUM       (SOCK_ERROR - 1)     ///< Invalid socket number
00019 #define SOCKERR_SOCKOPT       (SOCK_ERROR - 2)     ///< Invalid socket option
00020 #define SOCKERR_SOCKINIT      (SOCK_ERROR - 3)     ///< Socket is not initialized
00021 #define SOCKERR_SOCKCLOSED    (SOCK_ERROR - 4)     ///< Socket unexpectedly closed.
00022 #define SOCKERR_SOCKMODE      (SOCK_ERROR - 5)     ///< Invalid socket mode for socket operation.
00023 #define SOCKERR_SOCKFLAG      (SOCK_ERROR - 6)     ///< Invalid socket flag
00024 #define SOCKERR_SOCKSTATUS    (SOCK_ERROR - 7)     ///< Invalid socket status for socket operation.
00025 #define SOCKERR_ARG           (SOCK_ERROR - 10)    ///< Invalid argrument.
00026 #define SOCKERR_PORTZERO      (SOCK_ERROR - 11)    ///< Port number is zero
00027 #define SOCKERR_IPINVALID     (SOCK_ERROR - 12)    ///< Invalid IP address
00028 #define SOCKERR_TIMEOUT       (SOCK_ERROR - 13)    ///< Timeout occurred
00029 #define SOCKERR_DATALEN       (SOCK_ERROR - 14)    ///< Data length is zero or greater than buffer max size.
00030 #define SOCKERR_BUFFER        (SOCK_ERROR - 15)    ///< Socket buffer is not enough for data communication.
00031 
00032 #define SOCK_ANY_PORT_NUM  0xC000;
00033 
00034 
00035 #define MAX_SOCK_NUM 8
00036 
00037 #define MR        0x0000
00038 #define GAR       0x0001
00039 #define SUBR      0x0005
00040 #define SHAR      0x0009
00041 #define SIPR      0x000f
00042 #define INTLEVEL  0x0013
00043 #define IR        0x0015
00044 #define IMR       0x0016
00045 #define SIR       0x0017
00046 #define SIMR      0x0018
00047 #define RTR       0x0019
00048 #define RCR       0x001b
00049 #define PTIMER    0x001c
00050 #define PMAGIC    0x001d
00051 #define PHAR      0x001e
00052 #define PSID      0x0024
00053 #define PMRU      0x0026
00054 #define UIPR      0x0028
00055 #define UPORTR    0x002c
00056 #define PHYCFGR   0x002e
00057 #define VERSIONR  0x0039
00058 
00059 // W5500 socket register
00060 #define Sn_MR         0x0000
00061 #define Sn_CR         0x0001
00062 #define Sn_IR         0x0002
00063 #define Sn_SR         0x0003
00064 #define Sn_PORT       0x0004
00065 #define Sn_DHAR       0x0006
00066 #define Sn_DIPR       0x000c
00067 #define Sn_DPORT      0x0010
00068 #define Sn_MSSR       0x0012
00069 #define Sn_TOS        0x0015
00070 #define Sn_TTL        0x0016
00071 #define Sn_RXBUF_SIZE 0x001e
00072 #define Sn_TXBUF_SIZE 0x001f
00073 #define Sn_TX_FSR     0x0020
00074 #define Sn_TX_RD      0x0022
00075 #define Sn_TX_WR      0x0024
00076 #define Sn_RX_RSR     0x0026
00077 #define Sn_RX_RD      0x0028
00078 #define Sn_RX_WR      0x002a
00079 #define Sn_IMR        0x002c
00080 #define Sn_FRAG        0x002d
00081 #define Sn_KPALVTR    0x002f
00082 
00083 //define for Mode Register option value
00084 #define MR_PPPOE      0x08
00085 #define MR_RST        0x80
00086 
00087 //Define for Socket Command register option value
00088 #define Sn_CR_OPEN      0x01
00089 #define Sn_CR_LISTEN    0x02
00090 #define Sn_CR_CONNECT   0x04
00091 #define Sn_CR_DISCON    0x08
00092 #define Sn_CR_CLOSE     0x10
00093 #define Sn_CR_SEND      0x20
00094 #define Sn_CR_SEND_MAC  0x21
00095 #define Sn_CR_SEND_KEEP 0x22
00096 #define Sn_CR_RECV      0x40
00097 
00098 
00099 //Define for Socket Mode register option value
00100 #define Sn_MR_CLOSE   0x00
00101 #define Sn_MR_TCP     0x01
00102 #define Sn_MR_UDP     0x02
00103 #define Sn_MR_MACRAW  0x04
00104 #define Sn_MR_UCASTB  0x10
00105 #define Sn_MR_ND      0x20
00106 #define Sn_MR_BCASTB  0x40
00107 #define Sn_MR_MULTI   0x80
00108 
00109 #define Sn_IR_SENDOK                 0x10
00110 
00111 //Sn_IR values
00112 
00113 #define Sn_IR_TIMEOUT                0x08
00114 #define Sn_IR_RECV                   0x04
00115 #define Sn_IR_DISCON                 0x02
00116 #define Sn_IR_CON                    0x01
00117 
00118 /*
00119  * SOCKET FLAG
00120  */
00121 #define SF_ETHER_OWN           (Sn_MR_MFEN)        ///< In \ref Sn_MR_MACRAW, Receive only the packet as broadcast, multicast and own packet
00122 #define SF_IGMP_VER2           (Sn_MR_ND)          ///< In \ref Sn_MR_UDP with \ref SF_MULTI_ENABLE, Select IGMP version 2.   
00123 #define SF_TCP_NODELAY         (Sn_MR_ND)          ///< In \ref Sn_MR_TCP, Use to nodelayed ack.
00124 #define SF_MULTI_ENABLE        (Sn_MR_MULTI)       ///< In \ref Sn_MR_UDP, Enable multicast mode.
00125 #define SF_IO_NONBLOCK           0x01              ///< Socket nonblock io mode. It used parameter in \ref socket().
00126 #define SF_BROAD_BLOCK         (Sn_MR_BCASTB)   ///< In \ref Sn_MR_UDP or \ref Sn_MR_MACRAW, Block broadcast packet. Valid only in W5500
00127 #define SF_MULTI_BLOCK         (Sn_MR_MMB)      ///< In \ref Sn_MR_MACRAW, Block multicast packet. Valid only in W5500
00128 #define SF_IPv6_BLOCK          (Sn_MR_MIP6B)    ///< In \ref Sn_MR_MACRAW, Block IPv6 packet. Valid only in W5500
00129 #define SF_UNI_BLOCK           (Sn_MR_UCASTB)   ///< In \ref Sn_MR_UDP with \ref SF_MULTI_ENABLE. Valid only in W5500
00130 
00131 #define SOCK_MACRAW                  0x42
00132 
00133 
00134 /* PHYCFGR register value */
00135 #define PHYCFGR_RST                  ~(1<<7)  //< For PHY reset, must operate AND mask.
00136 #define PHYCFGR_OPMD                 (1<<6)   // Configre PHY with OPMDC value
00137 #define PHYCFGR_OPMDC_ALLA           (7<<3)
00138 #define PHYCFGR_OPMDC_PDOWN          (6<<3)
00139 #define PHYCFGR_OPMDC_NA             (5<<3)
00140 #define PHYCFGR_OPMDC_100FA          (4<<3)
00141 #define PHYCFGR_OPMDC_100F           (3<<3)
00142 #define PHYCFGR_OPMDC_100H           (2<<3)
00143 #define PHYCFGR_OPMDC_10F            (1<<3)
00144 #define PHYCFGR_OPMDC_10H            (0<<3)           
00145 #define PHYCFGR_DPX_FULL             (1<<2)
00146 #define PHYCFGR_DPX_HALF             (0<<2)
00147 #define PHYCFGR_SPD_100              (1<<1)
00148 #define PHYCFGR_SPD_10               (0<<1)
00149 #define PHYCFGR_LNK_ON               (1<<0)
00150 #define PHYCFGR_LNK_OFF              (0<<0)
00151 
00152 //PHY status define
00153 #define PHY_CONFBY_HW            0     ///< Configured PHY operation mode by HW pin
00154 #define PHY_CONFBY_SW            1     ///< Configured PHY operation mode by SW register   
00155 #define PHY_MODE_MANUAL          0     ///< Configured PHY operation mode with user setting.
00156 #define PHY_MODE_AUTONEGO        1     ///< Configured PHY operation mode with auto-negotiation
00157 #define PHY_SPEED_10             0     ///< Link Speed 10
00158 #define PHY_SPEED_100            1     ///< Link Speed 100
00159 #define PHY_DUPLEX_HALF          0     ///< Link Half-Duplex
00160 #define PHY_DUPLEX_FULL          1     ///< Link Full-Duplex
00161 #define PHY_LINK_OFF             0     ///< Link Off
00162 #define PHY_LINK_ON              1     ///< Link On
00163 #define PHY_POWER_NORM           0     ///< PHY power normal mode
00164 #define PHY_POWER_DOWN           1     ///< PHY power down mode 
00165 
00166 class WIZnet_Chip {
00167 public:
00168 
00169     enum Protocol   { CLOSED = 0, TCP = 1, UDP = 2,};
00170     enum Command    { OPEN = 0x01, LISTEN = 0x02, CONNECT = 0x04, DISCON = 0x08, CLOSE = 0x10, SEND = 0x20, \
00171                         SEND_MAC = 0x21, SEND_KEEP = 0x22, RECV = 0x40, };
00172     enum Interrupt  { INT_CON = 0x01, INT_DISCON = 0x02, INT_RECV = 0x04, INT_TIMEOUT = 0x08, INT_SEND_OK = 0x10,};
00173 
00174     enum Status     { SOCK_CLOSED = 0x00, SOCK_INIT = 0x13, SOCK_LISTEN = 0x14, SOCK_SYNSENT = 0x15, SOCK_ESTABLISHED = 0x17, \
00175                          SOCK_CLOSE_WAIT = 0x1c, SOCK_UDP   = 0x22, };
00176 
00177     
00178     uint16_t sock_any_port;
00179      
00180     /*
00181     * Constructor
00182     *
00183     * @param spi spi class
00184     * @param cs cs of the W5500
00185     * @param reset reset pin of the W5500
00186     */
00187     WIZnet_Chip(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName reset);
00188     WIZnet_Chip(SPI* spi, PinName cs, PinName reset);
00189 
00190     /*
00191     * Set MAC Address to W5500
00192     *
00193     * @return true if connected, false otherwise
00194     */ 
00195     bool setmac();
00196 
00197     /*
00198     * Set Network Informations (SrcIP, Netmask, Gataway)
00199     *
00200     * @return true if connected, false otherwise
00201     */ 
00202     bool setip();
00203 
00204     /*
00205     * Get Link Status
00206     *
00207     * @return true if Link up, false Link down
00208     */
00209     bool linkstatus();
00210 
00211     /*
00212     * Disconnect the connection
00213     *
00214     * @ returns true 
00215     */
00216     bool disconnect();
00217 
00218     /*
00219     * Open a tcp connection with the specified host on the specified port
00220     *
00221     * @param host host (can be either an ip address or a name. If a name is provided, a dns request will be established)
00222     * @param port port
00223     * @ returns true if successful
00224     */
00225     bool connect(int socket, const char * host, int port, int timeout_ms = 10*1000);
00226 
00227     /*
00228     * Set the protocol (UDP or TCP)
00229     *
00230     * @param p protocol
00231     * @ returns true if successful
00232     */
00233     bool setProtocol(int socket, Protocol p);
00234 
00235     /*
00236     * Reset the W5500
00237     */
00238     void reset();
00239    
00240     int wait_readable(int socket, int wait_time_ms, int req_size = 0);
00241 
00242     int wait_writeable(int socket, int wait_time_ms, int req_size = 0);
00243 
00244     /*
00245     * Check if a tcp link is active
00246     *
00247     * @returns true if successful
00248     */
00249     bool is_connected(int socket);
00250     
00251     int8_t Socket_macraw(uint8_t sn, uint16_t port, uint8_t flag)
00252     {
00253         //CHECK_SOCKNUM();
00254                 
00255         if((flag & 0x06) != 0) return SOCKERR_SOCKFLAG;
00256         
00257         close(sn);
00258         setSn_MR(sn, (Sn_MR_MACRAW | (flag & 0xF0)));
00259         if(!port)
00260         {
00261            port = sock_any_port++;
00262            if(sock_any_port == 0xFFF0) sock_any_port = SOCK_ANY_PORT_NUM;
00263         }
00264         setSn_PORT(sn,port); 
00265         setSn_CR(sn,Sn_CR_OPEN);
00266         while(getSn_CR(sn));
00267         //sock_io_mode |= ((flag & SF_IO_NONBLOCK) << sn);   
00268         //sock_is_sending &= ~(1<<sn);
00269         //sock_remained_size[sn] = 0;
00270         //sock_pack_info[sn] = 0;
00271         while(getSn_SR(sn) == SOCK_CLOSED);
00272         return (int8_t)sn;
00273     }  
00274 
00275     /*
00276     * Close a tcp connection
00277     *
00278     * @ returns true if successful
00279     */
00280     bool close(int socket);
00281 
00282     /*
00283     * @param str string to be sent
00284     * @param len string length
00285     */
00286     int send(int socket, const char * str, int len);
00287 
00288     int recv(int socket, char* buf, int len);
00289 
00290     /*
00291     * Return true if the module is using dhcp
00292     *
00293     * @returns true if the module is using dhcp
00294     */
00295     bool isDHCP() {
00296         return dhcp;
00297     }
00298 
00299     bool gethostbyname(const char* host, uint32_t* ip);
00300 
00301     static WIZnet_Chip * getInstance() {
00302         return inst;
00303     };
00304 
00305     int new_socket();
00306     uint16_t new_port();
00307     void scmd(int socket, Command cmd);
00308 
00309     template<typename T>
00310     void sreg(int socket, uint16_t addr, T data) {
00311         reg_wr<T>(addr, (0x0C + (socket << 5)), data);
00312     }
00313 
00314     template<typename T>
00315     T sreg(int socket, uint16_t addr) {
00316         return reg_rd<T>(addr, (0x08 + (socket << 5)));
00317     }
00318 
00319     template<typename T>
00320     void reg_wr(uint16_t addr, T data) {
00321         return reg_wr(addr, 0x04, data);
00322     }
00323     
00324     template<typename T>
00325     void reg_wr(uint16_t addr, uint8_t cb, T data) {
00326         uint8_t buf[sizeof(T)];
00327         *reinterpret_cast<T*>(buf) = data;
00328         for(int i = 0; i < sizeof(buf)/2; i++) { //  Little Endian to Big Endian
00329             uint8_t t = buf[i];
00330             buf[i] = buf[sizeof(buf)-1-i];
00331             buf[sizeof(buf)-1-i] = t;
00332         }
00333         spi_write(addr, cb, buf, sizeof(buf));
00334     }
00335 
00336     template<typename T>
00337     T reg_rd(uint16_t addr) {
00338         return reg_rd<T>(addr, 0x00);
00339     }
00340 
00341     template<typename T>
00342     T reg_rd(uint16_t addr, uint8_t cb) {
00343         uint8_t buf[sizeof(T)];
00344         spi_read(addr, cb, buf, sizeof(buf));
00345         for(int i = 0; i < sizeof(buf)/2; i++) { // Big Endian to Little Endian
00346             uint8_t t = buf[i];
00347             buf[i] = buf[sizeof(buf)-1-i];
00348             buf[sizeof(buf)-1-i] = t;
00349         }
00350         return *reinterpret_cast<T*>(buf);
00351     }
00352 
00353     void reg_rd_mac(uint16_t addr, uint8_t* data) {
00354         spi_read(addr, 0x00, data, 6);
00355     }
00356 
00357     void reg_wr_ip(uint16_t addr, uint8_t cb, const char* ip) {
00358         uint8_t buf[4];
00359         char* p = (char*)ip;
00360         for(int i = 0; i < 4; i++) {
00361             buf[i] = atoi(p);
00362             p = strchr(p, '.');
00363             if (p == NULL) {
00364                 break;
00365             }
00366             p++;
00367         }
00368         spi_write(addr, cb, buf, sizeof(buf));
00369     }
00370     
00371     void sreg_ip(int socket, uint16_t addr, const char* ip) {
00372         reg_wr_ip(addr, (0x0C + (socket << 5)), ip);
00373     }
00374     
00375     void reg_rd_ip_byte(uint16_t addr, uint8_t* data) {
00376         spi_read(addr, 0x00, data, 4);
00377     }
00378     
00379     void reg_wr_ip_byte(uint16_t addr, uint8_t* data) {
00380         spi_write(addr, 0x04, data, 4);
00381     }
00382        
00383 /////////////////////////////////
00384 // Common Register I/O function //
00385 /////////////////////////////////
00386 /**
00387  * @ingroup Common_register_access_function
00388  * @brief Set Mode Register
00389  * @param (uint8_t)mr The value to be set.
00390  * @sa getMR()
00391  */
00392     void setMR(uint8_t mr) {
00393         reg_wr<uint8_t>(MR,mr);
00394     }
00395 
00396 
00397 /**
00398  * @ingroup Common_register_access_function
00399  * @brief Get Mode Register
00400  * @return uint8_t. The value of Mode register.
00401  * @sa setMR()
00402  */
00403     uint8_t getMR() {
00404         return reg_rd<uint8_t>(MR);
00405     }
00406 
00407 /**
00408  * @ingroup Common_register_access_function
00409  * @brief Set gateway IP address
00410  * @param (uint8_t*)gar Pointer variable to set gateway IP address. It should be allocated 4 bytes.
00411  * @sa getGAR()
00412  */
00413     void setGAR(uint8_t * gar) {
00414         reg_wr_ip_byte(GAR,gar);
00415     }
00416 
00417 /**
00418  * @ingroup Common_register_access_function
00419  * @brief Get gateway IP address
00420  * @param (uint8_t*)gar Pointer variable to get gateway IP address. It should be allocated 4 bytes.
00421  * @sa setGAR()
00422  */
00423     void getGAR(uint8_t * gar) { 
00424         reg_rd_ip_byte(GAR,gar);
00425     }
00426 
00427 /**
00428  * @ingroup Common_register_access_function
00429  * @brief Set subnet mask address
00430  * @param (uint8_t*)subr Pointer variable to set subnet mask address. It should be allocated 4 bytes.
00431  * @sa getSUBR()
00432  */
00433     void setSUBR(uint8_t * subr) {
00434         reg_wr_ip_byte(SUBR, subr);
00435     }
00436 
00437 
00438 /**
00439  * @ingroup Common_register_access_function
00440  * @brief Get subnet mask address
00441  * @param (uint8_t*)subr Pointer variable to get subnet mask address. It should be allocated 4 bytes.
00442  * @sa setSUBR()
00443  */
00444     void getSUBR(uint8_t * subr) {
00445         reg_rd_ip_byte(SUBR, subr);
00446     }
00447 
00448 /**
00449  * @ingroup Common_register_access_function
00450  * @brief Set local MAC address
00451  * @param (uint8_t*)shar Pointer variable to set local MAC address. It should be allocated 6 bytes.
00452  * @sa getSHAR()
00453  */
00454     void setSHAR(uint8_t * shar) {
00455         reg_wr_mac(SHAR, shar);
00456     }
00457 
00458 /**
00459  * @ingroup Common_register_access_function
00460  * @brief Get local MAC address
00461  * @param (uint8_t*)shar Pointer variable to get local MAC address. It should be allocated 6 bytes.
00462  * @sa setSHAR()
00463  */
00464     void getSHAR(uint8_t * shar) {
00465         reg_rd_mac(SHAR, shar);
00466     }
00467 
00468 /**
00469  * @ingroup Common_register_access_function
00470  * @brief Set local IP address
00471  * @param (uint8_t*)sipr Pointer variable to set local IP address. It should be allocated 4 bytes.
00472  * @sa getSIPR()
00473  */
00474     void setSIPR(uint8_t * sipr) {
00475         reg_wr_ip_byte(SIPR, sipr);
00476     }
00477 
00478 /**
00479  * @ingroup Common_register_access_function
00480  * @brief Get local IP address
00481  * @param (uint8_t*)sipr Pointer variable to get local IP address. It should be allocated 4 bytes.
00482  * @sa setSIPR()
00483  */
00484     void getSIPR(uint8_t * sipr) {
00485         reg_rd_ip_byte(SIPR, sipr);
00486     }
00487 
00488 /**
00489  * @ingroup Common_register_access_function
00490  * @brief Set INTLEVEL register
00491  * @param (uint16_t)intlevel Value to set @ref INTLEVEL register.
00492  * @sa getINTLEVEL()
00493  */
00494     void setINTLEVEL(uint16_t intlevel)  {
00495         reg_wr<uint16_t>(INTLEVEL, intlevel); 
00496     }
00497 
00498 
00499 /**
00500  * @ingroup Common_register_access_function
00501  * @brief Get INTLEVEL register
00502  * @return uint16_t. Value of @ref INTLEVEL register.
00503  * @sa setINTLEVEL()
00504  */
00505     uint16_t  getINTLEVEL() { 
00506         return reg_rd<uint16_t>(INTLEVEL);
00507     }
00508 
00509 /**
00510  * @ingroup Common_register_access_function
00511  * @brief Set @ref IR register
00512  * @param (uint8_t)ir Value to set @ref IR register.
00513  * @sa getIR()
00514  */
00515     void setIR(uint8_t ir) { 
00516         reg_wr<uint8_t>(IR, (ir & 0xF0));
00517     }
00518 
00519 /**
00520  * @ingroup Common_register_access_function
00521  * @brief Get @ref IR register
00522  * @return uint8_t. Value of @ref IR register.
00523  * @sa setIR()
00524  */
00525     uint8_t getIR() {
00526        return reg_rd<uint8_t>(IR & 0xF0);
00527     }
00528     
00529 /**
00530  * @ingroup Common_register_access_function
00531  * @brief Set @ref IMR register
00532  * @param (uint8_t)imr Value to set @ref IMR register.
00533  * @sa getIMR()
00534  */
00535     void setIMR(uint8_t imr) {
00536         reg_wr<uint8_t>(IMR, imr);
00537     }
00538 
00539 /**
00540  * @ingroup Common_register_access_function
00541  * @brief Get @ref IMR register
00542  * @return uint8_t. Value of @ref IMR register.
00543  * @sa setIMR()
00544  */
00545     uint8_t getIMR() {
00546         return reg_rd<uint8_t>(IMR);
00547     }
00548 
00549 
00550 /**
00551  * @ingroup Common_register_access_function
00552  * @brief Set @ref SIR register
00553  * @param (uint8_t)sir Value to set @ref SIR register.
00554  * @sa getSIR()
00555  */
00556     void setSIR(uint8_t sir) {
00557         reg_wr<uint8_t>(SIR, sir);
00558     }
00559 
00560 /**
00561  * @ingroup Common_register_access_function
00562  * @brief Get @ref SIR register
00563  * @return uint8_t. Value of @ref SIR register.
00564  * @sa setSIR()
00565  */
00566     uint8_t getSIR() {
00567         return reg_rd<uint8_t>(SIR);
00568     }
00569 /**
00570  * @ingroup Common_register_access_function
00571  * @brief Set @ref SIMR register
00572  * @param (uint8_t)simr Value to set @ref SIMR register.
00573  * @sa getSIMR()
00574  */
00575     void setSIMR(uint8_t simr) {
00576         reg_wr<uint8_t>(SIMR, simr);
00577     }
00578 
00579 /**
00580  * @ingroup Common_register_access_function
00581  * @brief Get @ref SIMR register
00582  * @return uint8_t. Value of @ref SIMR register.
00583  * @sa setSIMR()
00584  */
00585     uint8_t getSIMR() {
00586         return reg_rd<uint8_t>(SIMR);
00587     }
00588 
00589 /**
00590  * @ingroup Common_register_access_function
00591  * @brief Set @ref RTR register
00592  * @param (uint16_t)rtr Value to set @ref RTR register.
00593  * @sa getRTR()
00594  */
00595     void setRTR(uint16_t rtr)   {
00596         reg_wr<uint16_t>(RTR, rtr);
00597     } 
00598 
00599 /**
00600  * @ingroup Common_register_access_function
00601  * @brief Get @ref RTR register
00602  * @return uint16_t. Value of @ref RTR register.
00603  * @sa setRTR()
00604  */
00605     uint16_t getRTR() {
00606         return reg_rd<uint16_t>(RTR);
00607     }
00608 
00609 /**
00610  * @ingroup Common_register_access_function
00611  * @brief Set @ref RCR register
00612  * @param (uint8_t)rcr Value to set @ref RCR register.
00613  * @sa getRCR()
00614  */
00615     void setRCR(uint8_t rcr) {
00616         reg_wr<uint8_t>(RCR, rcr);
00617     }
00618 
00619 /**
00620  * @ingroup Common_register_access_function
00621  * @brief Get @ref RCR register
00622  * @return uint8_t. Value of @ref RCR register.
00623  * @sa setRCR()
00624  */
00625     uint8_t getRCR() {
00626         return reg_rd<uint8_t>(RCR);
00627     }
00628 
00629 //================================================== test done ===========================================================
00630 
00631 /**
00632  * @ingroup Common_register_access_function
00633  * @brief Set @ref PTIMER register
00634  * @param (uint8_t)ptimer Value to set @ref PTIMER register.
00635  * @sa getPTIMER()
00636  */
00637     void setPTIMER(uint8_t ptimer) { 
00638         reg_wr<uint8_t>(PTIMER, ptimer);
00639     }
00640 
00641 /**
00642  * @ingroup Common_register_access_function
00643  * @brief Get @ref PTIMER register
00644  * @return uint8_t. Value of @ref PTIMER register.
00645  * @sa setPTIMER()
00646  */
00647     uint8_t getPTIMER() {
00648         return reg_rd<uint8_t>(PTIMER);
00649     }
00650 
00651 /**
00652  * @ingroup Common_register_access_function
00653  * @brief Set @ref PMAGIC register
00654  * @param (uint8_t)pmagic Value to set @ref PMAGIC register.
00655  * @sa getPMAGIC()
00656  */
00657 /*
00658 #define setPMAGIC(pmagic) \
00659         WIZCHIP_WRITE(PMAGIC, pmagic)
00660 */
00661     void setPMAGIC(uint8_t pmagic) {
00662         reg_wr<uint8_t>(PMAGIC, pmagic );
00663     }
00664 /**
00665  * @ingroup Common_register_access_function
00666  * @brief Get @ref PMAGIC register
00667  * @return uint8_t. Value of @ref PMAGIC register.
00668  * @sa setPMAGIC()
00669  */
00670 /*
00671 #define getPMAGIC() \
00672         WIZCHIP_READ(PMAGIC)
00673 */
00674     uint8_t getPMAGIC(uint8_t pmagic) {
00675         return reg_rd<uint8_t>(PMAGIC, pmagic);
00676     }
00677 /**
00678  * @ingroup Common_register_access_function
00679  * @brief Set PHAR address
00680  * @param (uint8_t*)phar Pointer variable to set PPP destination MAC register address. It should be allocated 6 bytes.
00681  * @sa getPHAR()
00682  */
00683     void setPHAR(uint8_t * phar) {
00684         reg_wr_mac(PHAR, phar);
00685     }
00686 
00687 /**
00688  * @ingroup Common_register_access_function
00689  * @brief Get local IP address
00690  * @param (uint8_t*)phar Pointer variable to PPP destination MAC register address. It should be allocated 6 bytes.
00691  * @sa setPHAR()
00692  */
00693     void getPHAR(uint8_t * phar) {
00694         reg_rd_mac(PHAR, phar);
00695     }
00696 
00697 /**
00698  * @ingroup Common_register_access_function
00699  * @brief Set @ref PSID register
00700  * @param (uint16_t)psid Value to set @ref PSID register.
00701  * @sa getPSID()
00702  */
00703     void setPSID(uint16_t psid)  {
00704         reg_wr<uint16_t>(PSID,   psid ); 
00705     }
00706 
00707 /**
00708  * @ingroup Common_register_access_function
00709  * @brief Get @ref PSID register
00710  * @return uint16_t. Value of @ref PSID register.
00711  * @sa setPSID()
00712  */
00713 //uint16_t getPSID(void);
00714      uint16_t getPSID() { 
00715         return reg_rd<uint16_t>(PSID);
00716     }
00717 
00718 /**
00719  * @ingroup Common_register_access_function
00720  * @brief Set @ref PMRU register
00721  * @param (uint16_t)pmru Value to set @ref PMRU register.
00722  * @sa getPMRU()
00723  */
00724     void setPMRU(uint16_t pmru) { 
00725         reg_wr<uint16_t>(PMRU, pmru); 
00726     }
00727 
00728 /**
00729  * @ingroup Common_register_access_function
00730  * @brief Get @ref PMRU register
00731  * @return uint16_t. Value of @ref PMRU register.
00732  * @sa setPMRU()
00733  */
00734     uint16_t getPMRU() {
00735         return reg_rd<uint16_t>(PMRU);
00736     }
00737 
00738 /**
00739  * @ingroup Common_register_access_function
00740  * @brief Get unreachable IP address
00741  * @param (uint8_t*)uipr Pointer variable to get unreachable IP address. It should be allocated 4 bytes.
00742  */
00743     void getUIPR(uint8_t * uipr) {
00744         reg_rd_ip_byte(UIPR,uipr);
00745     }
00746 
00747 /**
00748  * @ingroup Common_register_access_function
00749  * @brief Get @ref UPORTR register
00750  * @return uint16_t. Value of @ref UPORTR register.
00751  */
00752     uint16_t getUPORTR() {
00753         return reg_rd<uint16_t>(UPORTR);
00754     }
00755 
00756 /**
00757  * @ingroup Common_register_access_function
00758  * @brief Set @ref PHYCFGR register
00759  * @param (uint8_t)phycfgr Value to set @ref PHYCFGR register.
00760  * @sa getPHYCFGR()
00761  */
00762    void setPHYCFGR(uint8_t phycfgr) {
00763         reg_wr<uint8_t>(PHYCFGR, phycfgr);
00764    }
00765 
00766 /**
00767  * @ingroup Common_register_access_function
00768  * @brief Get @ref PHYCFGR register
00769  * @return uint8_t. Value of @ref PHYCFGR register.
00770  * @sa setPHYCFGR()
00771  */
00772     uint8_t getPHYCFGR() {
00773         return reg_rd<uint8_t>(PHYCFGR);
00774     }
00775 
00776 /**
00777  * @ingroup Common_register_access_function
00778  * @brief Get @ref VERSIONR register
00779  * @return uint8_t. Value of @ref VERSIONR register.
00780  */
00781     uint8_t getVERSIONR() {
00782         return reg_rd<uint8_t>(VERSIONR);
00783     }
00784 
00785 /////////////////////////////////////
00786 
00787 ///////////////////////////////////
00788 // Socket N register I/O function //
00789 ///////////////////////////////////
00790 /**
00791  * @ingroup Socket_register_access_function
00792  * @brief Set @ref Sn_MR register
00793  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
00794  * @param (uint8_t)mr Value to set @ref Sn_MR
00795  * @sa getSn_MR()
00796  */
00797     void setSn_MR(uint8_t sn, uint8_t mr) {
00798         sreg<uint8_t>(sn, MR, mr);
00799     }
00800 
00801 /**
00802  * @ingroup Socket_register_access_function
00803  * @brief Get @ref Sn_MR register
00804  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
00805  * @return uint8_t. Value of @ref Sn_MR.
00806  * @sa setSn_MR()
00807  */
00808     uint8_t getSn_MR(uint8_t sn) {
00809         return sreg<uint8_t>(sn, Sn_MR);
00810     }
00811 
00812 /**
00813  * @ingroup Socket_register_access_function
00814  * @brief Set @ref Sn_CR register
00815  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
00816  * @param (uint8_t)cr Value to set @ref Sn_CR
00817  * @sa getSn_CR()
00818  */
00819     void setSn_CR(uint8_t sn, uint8_t cr) {
00820         sreg<uint8_t>(sn, Sn_CR, cr);
00821     }
00822 
00823 /**
00824  * @ingroup Socket_register_access_function
00825  * @brief Get @ref Sn_CR register
00826  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
00827  * @return uint8_t. Value of @ref Sn_CR.
00828  * @sa setSn_CR()
00829  */
00830     uint8_t getSn_CR(uint8_t sn) {
00831         return sreg<uint8_t>(sn, Sn_CR);
00832     }
00833 
00834 /**
00835  * @ingroup Socket_register_access_function
00836  * @brief Set @ref Sn_IR register
00837  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
00838  * @param (uint8_t)ir Value to set @ref Sn_IR
00839  * @sa getSn_IR()
00840  */
00841     void setSn_IR(uint8_t sn, uint8_t ir) { 
00842         sreg<uint8_t>(sn, Sn_IR, (ir & 0x1F));
00843     }
00844 
00845 /**
00846  * @ingroup Socket_register_access_function
00847  * @brief Get @ref Sn_IR register
00848  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
00849  * @return uint8_t. Value of @ref Sn_IR.
00850  * @sa setSn_IR()
00851  */
00852     uint8_t getSn_IR(uint8_t sn) {
00853         return (sreg<uint8_t>(sn, Sn_IR)) & 0x1F;
00854     }
00855 
00856 /**
00857  * @ingroup Socket_register_access_function
00858  * @brief Set @ref Sn_IMR register
00859  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
00860  * @param (uint8_t)imr Value to set @ref Sn_IMR
00861  * @sa getSn_IMR()
00862  */
00863     void setSn_IMR(uint8_t sn, uint8_t imr) {
00864         sreg<uint8_t>(sn, Sn_IMR, (imr & 0x1F));
00865     }
00866 
00867 /**
00868  * @ingroup Socket_register_access_function
00869  * @brief Get @ref Sn_IMR register
00870  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
00871  * @return uint8_t. Value of @ref Sn_IMR.
00872  * @sa setSn_IMR()
00873  */
00874     uint8_t getSn_IMR(uint8_t sn) {
00875         return (sreg<uint8_t>(sn, Sn_IMR)) & 0x1F;
00876     }
00877 
00878 /**
00879  * @ingroup Socket_register_access_function
00880  * @brief Get @ref Sn_SR register
00881  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
00882  * @return uint8_t. Value of @ref Sn_SR.
00883  */
00884     uint8_t getSn_SR(uint8_t sn) {
00885         return sreg<uint8_t>(sn, Sn_SR);
00886     }
00887 
00888 /**
00889  * @ingroup Socket_register_access_function
00890  * @brief Set @ref Sn_PORT register
00891  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
00892  * @param (uint16_t)port Value to set @ref Sn_PORT.
00893  * @sa getSn_PORT()
00894  */
00895     void setSn_PORT(uint8_t sn, uint16_t port)  { 
00896         sreg<uint16_t>(sn, Sn_PORT, port );
00897     } 
00898 
00899 /**
00900  * @ingroup Socket_register_access_function
00901  * @brief Get @ref Sn_PORT register
00902  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
00903  * @return uint16_t. Value of @ref Sn_PORT.
00904  * @sa setSn_PORT()
00905  */
00906     uint16_t getSn_PORT(uint8_t sn) {
00907         return sreg<uint16_t>(sn, Sn_PORT);
00908     }
00909 
00910 /**
00911  * @ingroup Socket_register_access_function
00912  * @brief Set @ref Sn_DHAR register
00913  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
00914  * @param (uint8_t*)dhar Pointer variable to set socket n destination hardware address. It should be allocated 6 bytes.
00915  * @sa getSn_DHAR()
00916  */
00917     void setSn_DHAR(uint8_t sn, uint8_t * dhar) {
00918         spi_write(Sn_DHAR, (0x0C + (sn << 5)), dhar, 6);
00919     }
00920 
00921 /**
00922  * @ingroup Socket_register_access_function
00923  * @brief Get @ref Sn_MR register
00924  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
00925  * @param (uint8_t*)dhar Pointer variable to get socket n destination hardware address. It should be allocated 6 bytes.
00926  * @sa setSn_DHAR()
00927  */
00928     void getSn_DHAR(uint8_t sn, uint8_t * dhar) {
00929         spi_read(Sn_DHAR, (0x08 + (sn << 5)), dhar, 6);
00930     }
00931 
00932 /**
00933  * @ingroup Socket_register_access_function
00934  * @brief Set @ref Sn_DIPR register
00935  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
00936  * @param (uint8_t*)dipr Pointer variable to set socket n destination IP address. It should be allocated 4 bytes.
00937  * @sa getSn_DIPR()
00938  */
00939     void setSn_DIPR(uint8_t sn, uint8_t * dipr) {
00940         spi_write(Sn_DIPR, (0x0C + (sn << 5)), dipr, 4);
00941     }
00942 
00943 /**
00944  * @ingroup Socket_register_access_function
00945  * @brief Get @ref Sn_DIPR register
00946  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
00947  * @param (uint8_t*)dipr Pointer variable to get socket n destination IP address. It should be allocated 4 bytes.
00948  * @sa SetSn_DIPR()
00949  */
00950     void getSn_DIPR(uint8_t sn, uint8_t * dipr) {
00951         spi_read(Sn_DIPR, (0x08 + (sn << 5)), dipr, 4);
00952     }
00953 
00954 /**
00955  * @ingroup Socket_register_access_function
00956  * @brief Set @ref Sn_DPORT register
00957  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
00958  * @param (uint16_t)dport Value to set @ref Sn_DPORT
00959  * @sa getSn_DPORT()
00960  */
00961     void setSn_DPORT(uint8_t sn, uint16_t dport) { 
00962         sreg<uint16_t>(sn, Sn_DPORT, dport);
00963     } 
00964 
00965 /**
00966  * @ingroup Socket_register_access_function
00967  * @brief Get @ref Sn_DPORT register
00968  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
00969  * @return uint16_t. Value of @ref Sn_DPORT.
00970  * @sa setSn_DPORT()
00971  */
00972     uint16_t getSn_DPORT(uint8_t sn) {
00973         return sreg<uint16_t>(sn, Sn_DPORT);
00974     }
00975 
00976 /**
00977  * @ingroup Socket_register_access_function
00978  * @brief Set @ref Sn_MSSR register
00979  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
00980  * @param (uint16_t)mss Value to set @ref Sn_MSSR
00981  * @sa setSn_MSSR()
00982  */
00983     void setSn_MSSR(uint8_t sn, uint16_t mss) { 
00984         sreg<uint16_t>(sn, Sn_MSSR, mss); 
00985     }
00986 
00987 /**
00988  * @ingroup Socket_register_access_function
00989  * @brief Get @ref Sn_MSSR register
00990  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
00991  * @return uint16_t. Value of @ref Sn_MSSR.
00992  * @sa setSn_MSSR()
00993  */
00994     uint16_t getSn_MSSR(uint16_t sn) {
00995         return sreg<uint16_t>(sn, Sn_MSSR);
00996     }
00997 
00998 /**
00999  * @ingroup Socket_register_access_function
01000  * @brief Set @ref Sn_TOS register
01001  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
01002  * @param (uint8_t)tos Value to set @ref Sn_TOS
01003  * @sa getSn_TOS()
01004  */
01005     void setSn_TOS(uint8_t sn, uint8_t tos) {
01006         sreg<uint8_t>(sn, Sn_TOS, tos);
01007     }
01008 
01009 /**
01010  * @ingroup Socket_register_access_function
01011  * @brief Get @ref Sn_TOS register
01012  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
01013  * @return uint8_t. Value of Sn_TOS.
01014  * @sa setSn_TOS()
01015  */
01016     uint8_t getSn_TOS(uint8_t sn) {
01017         return sreg<uint8_t>(sn, Sn_TOS);
01018     }
01019 
01020 /**
01021  * @ingroup Socket_register_access_function
01022  * @brief Set @ref Sn_TTL register
01023  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
01024  * @param (uint8_t)ttl Value to set @ref Sn_TTL
01025  * @sa getSn_TTL()
01026  */
01027     void setSn_TTL(uint8_t sn, uint8_t ttl) {
01028         sreg<uint8_t>(sn, Sn_TTL, ttl);
01029     }
01030 
01031 
01032 /**
01033  * @ingroup Socket_register_access_function
01034  * @brief Get @ref Sn_TTL register
01035  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
01036  * @return uint8_t. Value of @ref Sn_TTL.
01037  * @sa setSn_TTL()
01038  */
01039     uint8_t getSn_TTL(uint8_t sn) {
01040         return sreg<uint8_t>(sn, Sn_TTL);
01041     }
01042 
01043 
01044 /**
01045  * @ingroup Socket_register_access_function
01046  * @brief Set @ref Sn_RXBUF_SIZE register
01047  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
01048  * @param (uint8_t)rxbufsize Value to set @ref Sn_RXBUF_SIZE
01049  * @sa getSn_RXBUF_SIZE()
01050  */
01051     void setSn_RXBUF_SIZE(uint8_t sn, uint8_t rxbufsize) {
01052         sreg<uint8_t>(sn, Sn_RXBUF_SIZE ,rxbufsize);
01053     }
01054 
01055 
01056 /**
01057  * @ingroup Socket_register_access_function
01058  * @brief Get @ref Sn_RXBUF_SIZE register
01059  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
01060  * @return uint8_t. Value of @ref Sn_RXBUF_SIZE.
01061  * @sa setSn_RXBUF_SIZE()
01062  */
01063     uint8_t getSn_RXBUF_SIZE(uint8_t sn) {
01064         return sreg<uint8_t>(sn, Sn_RXBUF_SIZE);
01065     }
01066 
01067 /**
01068  * @ingroup Socket_register_access_function
01069  * @brief Set @ref Sn_TXBUF_SIZE register
01070  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
01071  * @param (uint8_t)txbufsize Value to set @ref Sn_TXBUF_SIZE
01072  * @sa getSn_TXBUF_SIZE()
01073  */
01074     void setSn_TXBUF_SIZE(uint8_t sn, uint8_t txbufsize) {
01075         sreg<uint8_t>(sn, Sn_TXBUF_SIZE, txbufsize);
01076     }
01077 
01078 /**
01079  * @ingroup Socket_register_access_function
01080  * @brief Get @ref Sn_TXBUF_SIZE register
01081  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
01082  * @return uint8_t. Value of @ref Sn_TXBUF_SIZE.
01083  * @sa setSn_TXBUF_SIZE()
01084  */
01085     uint8_t getSn_TXBUF_SIZE(uint8_t sn) {
01086         return sreg<uint8_t>(sn, Sn_TXBUF_SIZE);
01087     }
01088 
01089 /**
01090  * @ingroup Socket_register_access_function
01091  * @brief Get @ref Sn_TX_FSR register
01092  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
01093  * @return uint16_t. Value of @ref Sn_TX_FSR.
01094  */
01095     uint16_t getSn_TX_FSR(uint8_t sn) {
01096         return sreg<uint16_t>(sn, Sn_TX_FSR);
01097     }
01098 
01099 
01100 /**
01101  * @ingroup Socket_register_access_function
01102  * @brief Get @ref Sn_TX_RD register
01103  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
01104  * @return uint16_t. Value of @ref Sn_TX_RD.
01105  */
01106     uint16_t getSn_TX_RD(uint8_t sn) {
01107         return sreg<uint16_t>(sn, Sn_TX_RD);
01108     }
01109 
01110 /**
01111  * @ingroup Socket_register_access_function
01112  * @brief Set @ref Sn_TX_WR register
01113  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
01114  * @param (uint16_t)txwr Value to set @ref Sn_TX_WR
01115  * @sa GetSn_TX_WR()
01116  */
01117     void setSn_TX_WR(uint8_t sn, uint16_t txwr) { 
01118         sreg<uint16_t>(sn, Sn_TX_WR, txwr); 
01119     }
01120 
01121 /**
01122  * @ingroup Socket_register_access_function
01123  * @brief Get @ref Sn_TX_WR register
01124  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
01125  * @return uint16_t. Value of @ref Sn_TX_WR.
01126  * @sa setSn_TX_WR()
01127  */
01128     uint16_t getSn_TX_WR(uint8_t sn) {
01129         return sreg<uint16_t>(sn, Sn_TX_WR);
01130     }
01131 
01132 
01133 /**
01134  * @ingroup Socket_register_access_function
01135  * @brief Get @ref Sn_RX_RSR register
01136  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
01137  * @return uint16_t. Value of @ref Sn_RX_RSR.
01138  */
01139     uint16_t getSn_RX_RSR(uint8_t sn) {
01140         return sreg<uint16_t>(sn, Sn_RX_RSR);
01141     }
01142 
01143 
01144 /**
01145  * @ingroup Socket_register_access_function
01146  * @brief Set @ref Sn_RX_RD register
01147  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
01148  * @param (uint16_t)rxrd Value to set @ref Sn_RX_RD
01149  * @sa getSn_RX_RD()
01150  */
01151     void setSn_RX_RD(uint8_t sn, uint16_t rxrd) { 
01152         sreg<uint16_t>(sn, Sn_RX_RD, rxrd); 
01153     }
01154 
01155 /**
01156  * @ingroup Socket_register_access_function
01157  * @brief Get @ref Sn_RX_RD register
01158  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
01159  * @regurn uint16_t. Value of @ref Sn_RX_RD.
01160  * @sa setSn_RX_RD()
01161  */
01162     uint16_t getSn_RX_RD(uint8_t sn) {
01163         return sreg<uint16_t>(sn, Sn_RX_RD);
01164     }
01165 
01166 /**
01167  * @ingroup Socket_register_access_function
01168  * @brief Get @ref Sn_RX_WR register
01169  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
01170  * @return uint16_t. Value of @ref Sn_RX_WR.
01171  */
01172     uint16_t getSn_RX_WR(uint8_t sn) { 
01173         return sreg<uint16_t>(sn, Sn_RX_WR);
01174     }
01175 
01176 
01177 /**
01178  * @ingroup Socket_register_access_function
01179  * @brief Set @ref Sn_FRAG register
01180  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
01181  * @param (uint16_t)frag Value to set @ref Sn_FRAG
01182  * @sa getSn_FRAD()
01183  */
01184     void setSn_FRAG(uint8_t sn, uint16_t frag) { 
01185         sreg<uint16_t>(sn, Sn_FRAG, frag ); 
01186     }
01187 
01188 /**
01189  * @ingroup Socket_register_access_function
01190  * @brief Get @ref Sn_FRAG register
01191  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
01192  * @return uint16_t. Value of @ref Sn_FRAG.
01193  * @sa setSn_FRAG()
01194  */
01195     uint16_t getSn_FRAG(uint8_t sn) { 
01196         return sreg<uint16_t>(sn, Sn_FRAG);
01197     }
01198 
01199 /**
01200  * @ingroup Socket_register_access_function
01201  * @brief Set @ref Sn_KPALVTR register
01202  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
01203  * @param (uint8_t)kpalvt Value to set @ref Sn_KPALVTR
01204  * @sa getSn_KPALVTR()
01205  */
01206     void setSn_KPALVTR(uint8_t sn, uint8_t kpalvt) {
01207         sreg<uint8_t>(sn, Sn_KPALVTR, kpalvt);
01208     }
01209 
01210 /**
01211  * @ingroup Socket_register_access_function
01212  * @brief Get @ref Sn_KPALVTR register
01213  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
01214  * @return uint8_t. Value of @ref Sn_KPALVTR.
01215  * @sa setSn_KPALVTR()
01216  */
01217     uint8_t getSn_KPALVTR(uint8_t sn) {
01218         return sreg<uint8_t>(sn, Sn_KPALVTR);
01219     }
01220 
01221 //////////////////////////////////////
01222 
01223 /////////////////////////////////////
01224 // Sn_TXBUF & Sn_RXBUF IO function //
01225 /////////////////////////////////////
01226 /**  
01227  * @brief Gets the max buffer size of socket sn passed as parameter.
01228  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
01229  * @return uint16_t. Value of Socket n RX max buffer size.
01230  */
01231     uint16_t getSn_RxMAX(uint8_t sn) {
01232         return (getSn_RXBUF_SIZE(sn) << 10);
01233     }
01234 
01235 /**  
01236  * @brief Gets the max buffer size of socket sn passed as parameters.
01237  * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
01238  * @return uint16_t. Value of Socket n TX max buffer size.
01239  */
01240 //uint16_t getSn_TxMAX(uint8_t sn);
01241     uint16_t getSn_TxMAX(uint8_t sn) {
01242         return (getSn_TXBUF_SIZE(sn) << 10);
01243     }
01244 
01245 
01246 protected:
01247     uint8_t mac[6];
01248     uint32_t ip;
01249     uint32_t netmask;
01250     uint32_t gateway;
01251     uint32_t dnsaddr;
01252     bool dhcp;
01253     
01254     
01255 
01256     static WIZnet_Chip* inst;
01257 
01258     void reg_wr_mac(uint16_t addr, uint8_t* data) {
01259         spi_write(addr, 0x04, data, 6);
01260     }
01261 
01262     void spi_write(uint16_t addr, uint8_t cb, const uint8_t *buf, uint16_t len);
01263     void spi_read(uint16_t addr, uint8_t cb, uint8_t *buf, uint16_t len);
01264     SPI* spi;
01265     DigitalOut cs;
01266     DigitalOut reset_pin;
01267 };
01268 
01269 extern uint32_t str_to_ip(const char* str);
01270 extern void printfBytes(char* str, uint8_t* buf, int len);
01271 extern void printHex(uint8_t* buf, int len);
01272 extern void debug_hex(uint8_t* buf, int len);