Paul Staron / W5500-Interface

Dependents:   W5500-SNTPClient-example

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);