/*****************************************************/
//    w5500.c
// brief W5500 HAL Interface.
// version 1.0.2
// date 2013/10/21
/*****************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

#include "w5500_spi.h"
#include "w5500.h"

#define _W5500_SPI_VDM_OP_          0x00
#define _W5500_SPI_FDM_OP_LEN1_     0x01
#define _W5500_SPI_FDM_OP_LEN2_     0x02
#define _W5500_SPI_FDM_OP_LEN4_     0x03


/* FUNCTION **********************************/
uint16_t getSn_TX_FSR (uint8_t sn)
{
   uint16_t val = 0, val1 = 0;

   do
   {
      val1 = W5500_spi_read(Sn_TX_FSR(sn));
      val1 = (val1 << 8) + W5500_spi_read(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1));
      if (val1 != 0)
      {
        val = W5500_spi_read(Sn_TX_FSR(sn));
        val = (val << 8) + W5500_spi_read(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1));
      }
   } while (val != val1);
   return val;

} /* --- getSn_TX_FSR --- */


/* FUNCTION **********************************/
uint16_t getSn_RX_RSR (uint8_t sn)
{
   uint16_t val = 0, val1 = 0;

   do
   {
      val1 = W5500_spi_read(Sn_RX_RSR(sn));
      val1 = (val1 << 8) + W5500_spi_read(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
      if (val1 != 0)
      {
        val = W5500_spi_read(Sn_RX_RSR(sn));
        val = (val << 8) + W5500_spi_read(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
      }
   } while (val != val1);
   return val;

} /* --- getSn_RX_RSR --- */


/* FUNCTION **********************************/
void wiz_send_data (uint8_t sn, uint8_t *p_data, uint16_t len)
{
   uint16_t  ptr;
   uint32_t  addrsel;

   if (len == 0)  return;
   ptr = getSn_TX_WR(sn);
   //M20140501 : implict type casting -> explict type casting
   //addrsel = (ptr << 8) + (WIZCHIP_TXBUF_BLOCK(sn) << 3);
   addrsel = ((uint32_t)ptr << 8) + (WIZCHIP_TXBUF_BLOCK(sn) << 3);

   W5500_spi_write_buf (addrsel, p_data, len);

   ptr += len;
   setSn_TX_WR(sn,ptr);

} /* --- wiz_send_data --- */


/* FUNCTION **********************************/
void wiz_recv_data (uint8_t sn, uint8_t *p_data, uint16_t len)
{
   uint16_t  ptr;
   uint32_t  addrsel;

   if (len == 0) return;
   ptr = getSn_RX_RD(sn);
   //M20140501 : implict type casting -> explict type casting
   //addrsel = ((ptr << 8) + (WIZCHIP_RXBUF_BLOCK(sn) << 3);
   addrsel = ((uint32_t)ptr << 8) + (WIZCHIP_RXBUF_BLOCK(sn) << 3);
   //
   W5500_spi_read_buf (addrsel, p_data, len);
   ptr += len;

   setSn_RX_RD(sn,ptr);

} /* --- wiz_recv_data --- */


/* FUNCTION **********************************/
void wiz_recv_ignore (uint8_t sn, uint16_t len)
{
   uint16_t ptr = 0;

   ptr = getSn_RX_RD(sn);
   ptr += len;
   setSn_RX_RD(sn, ptr);

} /* --- wiz_recv_ignore --- */

/* ----------------------------------------------*/
/* -----------  End of file W5500.c  ----------- */
/* ----------------------------------------------*/