/*
 * @file:    EthDev.h
 * @purpose: Ethernet Device Definitions
 * @version: V1.10
 * @date:    24. Feb. 2009
 *----------------------------------------------------------------------------
 *
 * Copyright (C) 2009 ARM Limited. All rights reserved.
 *
 * ARM Limited (ARM) is supplying this software for use with Cortex-M3
 * processor based microcontrollers.  This file can be freely distributed
 * within development tools that are supporting such ARM based processors.
 *
 * THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED
 * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
 * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
 * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
 *
 */
/*
 * Modified for MiMic by R.Iizuka. 2011.08.27
 * http://nyatla.jp/mimic
 */

#ifndef _ETHDEV__H
#define _ETHDEV__H
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
#include "NyLPC_stdlib.h"
#include "../../uip/NyLPC_uip.h"
#ifndef NULL
 #define NULL   0
#endif

/*----------------------------------------------------------------------------
  Ethernet Device Defines
 *----------------------------------------------------------------------------*/
#define EthDev_ADDR_SIZE        6                      /*!< Ethernet Address size in bytes */
#define EthDev_MTU_SIZE         1514                   /*!< Maximum Transmission Unit      */


/*----------------------------------------------------------------------------
  Ethernet Device Configuration and Control Command Defines
 *----------------------------------------------------------------------------*/
typedef enum {
  EthDev_LINK_DOWN              = 0,                   /*!< Ethernet link not established */
  EthDev_LINK_UP                = 1,                   /*!< Ethernet link established */
} EthDev_LINK;

typedef enum {
  EthDev_SPEED_10M              = 0,                   /*!< 10.0 Mbps link speed  */
  EthDev_SPEED_100M             = 1,                   /*!< 100.0 Mbps link speed */
  EthDev_SPEED_1000M            = 2,                   /*!< 1.0 Gbps link speed   */
} EthDev_SPEED;

typedef enum {
  EthDev_DUPLEX_HALF            = 0,                   /*!< Link half duplex */
  EthDev_DUPLEX_FULL            = 1,                   /*!< Link full duplex */
} EthDev_DUPLEX;

typedef enum {
  EthDev_MODE_AUTO              = 0,
  EthDev_MODE_10M_FULL          = 1,
  EthDev_MODE_10M_HALF          = 2,
  EthDev_MODE_100M_FULL         = 3,
  EthDev_MODE_100M_HALF         = 4,
  EthDev_MODE_1000M_FULL        = 5,
  EthDev_MODE_1000M_HALF        = 6,
} EthDev_MODE;

typedef struct {
  EthDev_LINK   Link   : 1;
  EthDev_DUPLEX Duplex : 1;
  EthDev_SPEED  Speed  : 2;
} EthDev_STATUS;


/*----------------------------------------------------------------------------
  Ethernet Device IO Block Structure
 *----------------------------------------------------------------------------*/
typedef struct {

   /* Initialized by the user application before call to Init. */
   EthDev_MODE   Mode;
   unsigned char HwAddr[EthDev_ADDR_SIZE];
   void         *(*RxFrame)      (int size);
   void          (*RxFrameReady) (int size);

   /* Initialized by Ethernet driver. */
   int           (*Init)       (void);
   int           (*UnInit)     (void);
   int           (*SetMCFilter)(int NumHwAddr, unsigned char *pHwAddr);
   int           (*TxFrame)    (void *pData, int size);
   void          (*Lock)       (void);
   void          (*UnLock)     (void);
   EthDev_STATUS (*LinkChk)    (void);
} EthDev_IOB;




/*
 * Prepare the Ethernet hardware ready for TCP/IP comms.
 */
long lEMACInit(
	xSemaphoreHandle i_irs_emac_semaphore,
	const struct NyLPC_TEthAddr* i_eth_addr);

/**
 * 送信バッフメモリのヘッダ。
 * この構造体は、TXバッファメモリブロックのヘッダーです。
 * TXバッファメモリブロックは、この構造体の後ろに、sizeに一致したメモリを連結したもので表現します。
 * <pre>
 * buffer=[struct NyLPC_TTxBufferHeader][n]
 * </pre>
 */
struct NyLPC_TTxBufferHeader
{
	NyLPC_TInt8  ref;
	//送信用にロックしたかを示すフラグ
	NyLPC_TUInt8 is_lock;
	//32ビット境界に合わせるためのパディングです。
	NyLPC_TUInt16 padding;
};


/**
 * 受信キューの先頭にあるRXフレームのポインタを返します。
 * 関数は、受信キューのポインタを操作しません。続けて読み出したとしても、同じポインターを返します。
 * 制限として、返却したポインタの内容は、一時的に書き換え可としてください。（この制限は将来削除します。）
 * @return
 * 成功した場合、受信データを格納したバッファポインターです。
 * 次回nextRxEthFrameを呼び出すまで有効です。
 */
void* getRxEthFrame(unsigned short* o_len_of_data);

/**
 * 受信キューを進行します。
 * getRxEthFrameで返したメモリの内容の有効期間は、ここで終わります。
 */
void nextRxEthFrame(void);


/**
 * 送信バッファを取得します。
 * i_hintで示されるバッファを確保しようと「努力します。」
 *
 */
struct NyLPC_TTxBufferHeader* allocTxBuf(NyLPC_TUInt16 i_hint,NyLPC_TUInt16* o_size);


/**
 * 送信バッファを開放します。
 */
void releaseTxBuf(struct NyLPC_TTxBufferHeader* i_buf);

/**
 * Ethernetパケットを送信します。
 * allocTxBufで得たバッファを指定してください。
 */
void sendTxEthFrame(struct NyLPC_TTxBufferHeader* i_buf,unsigned short i_size);


NyLPC_TUInt32 waitForTxEthFrameEmpty(void);


#endif
