/* ---------------------------------------------------------------------------- */ /* Atmel Microcontroller Software Support */ /* SAM Software Package License */ /* ---------------------------------------------------------------------------- */ /* Copyright (c) 2015, Atmel Corporation */ /* */ /* All rights reserved. */ /* */ /* Redistribution and use in source and binary forms, with or without */ /* modification, are permitted provided that the following condition is met: */ /* */ /* - Redistributions of source code must retain the above copyright notice, */ /* this list of conditions and the disclaimer below. */ /* */ /* Atmel's name may not be used to endorse or promote products derived from */ /* this software without specific prior written permission. */ /* */ /* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR */ /* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */ /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE */ /* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, */ /* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT */ /* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ /* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF */ /* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ /* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, */ /* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* ---------------------------------------------------------------------------- */ /** \file */ /** \addtogroup gmacd_module * @{ * Implement GMAC data transfer and PHY management functions. * * \section Usage * -# Implement GMAC interrupt handler, which must invoke GMACD_Handler() * to handle GMAC interrupt events. * -# Implement sGmacd instance in application. * -# Initialize the instance with GMACD_Init() and GMACD_InitTransfer(), * so that GMAC data can be transmitted/received. * -# Some management callbacks can be set by GMACD_SetRxCallback() * and GMACD_SetTxWakeupCallback(). * -# Send ethernet packets using GMACD_Send(), GMACD_TxLoad() is used * to check the free space in TX queue. * -# Check and obtain received ethernet packets via GMACD_Poll(). * * \sa \ref gmacb_module, \ref gmac_module * * Related files:\n * \ref gmacd.c\n * \ref gmacd.h.\n * * \defgroup gmacd_defines GMAC Driver Defines * \defgroup gmacd_types GMAC Driver Types * \defgroup gmacd_functions GMAC Driver Functions */ /**@}*/ #ifndef _GMACD_H_ #define _GMACD_H_ /*--------------------------------------------------------------------------- * Headers *---------------------------------------------------------------------------*/ #include "chip.h" /*--------------------------------------------------------------------------- * Definitions *---------------------------------------------------------------------------*/ /** \addtogroup gmacd_defines @{*/ /** \addtogroup gmacd_rc GMACD Return Codes @{*/ #define GMACD_OK 0 /**< Operation OK */ #define GMACD_TX_BUSY 1 /**< TX in progress */ #define GMACD_RX_NULL 1 /**< No data received */ /** Buffer size not enough */ #define GMACD_SIZE_TOO_SMALL 2 /** Parameter error, TX packet invalid or RX size too small */ #define GMACD_PARAM 3 /** Transfer is not initialized */ #define GMACD_NOT_INITIALIZED 4 /** @}*/ /** @}*/ /* Should be a power of 2. - Buffer Length to store the timestamps of 1588 event messages */ #define EFRS_BUFFER_LEN (1u) /*--------------------------------------------------------------------------- * Types *---------------------------------------------------------------------------*/ /** \addtogroup gmacd_types @{*/ typedef enum ptpMsgType_t { SYNC_MSG_TYPE = 0, DELAY_REQ_MSG_TYPE = 1, PDELAY_REQ_TYPE = 2, PDELAY_RESP_TYPE = 3, FOLLOW_UP_MSG_TYPE = 8, DELAY_RESP_MSG_TYPE = 9 } ptpMsgType; /** RX callback */ typedef void (*fGmacdTransferCallback)(uint32_t status); /** Wakeup callback */ typedef void (*fGmacdWakeupCallback)(void); /** Tx PTP message callback */ typedef void (*fGmacdTxPtpEvtCallBack) (ptpMsgType msg, uint32_t sec, \ uint32_t nanosec, uint16_t seqId); /** * GMAC scatter-gather entry. */ typedef struct _GmacSG { uint32_t size; void *pBuffer; } sGmacSG; /** * GMAC scatter-gather list. */ typedef struct _GmacSGList { uint32_t len; sGmacSG *sg; } sGmacSGList; /** * GMAC Queue driver. */ typedef struct _GmacQueueDriver { uint8_t *pTxBuffer; /** Pointer to allocated RX buffer */ uint8_t *pRxBuffer; /** Pointer to Rx TDs (must be 8-byte aligned) */ sGmacRxDescriptor *pRxD; /** Pointer to Tx TDs (must be 8-byte aligned) */ sGmacTxDescriptor *pTxD; /** Optional callback to be invoked once a frame has been received */ fGmacdTransferCallback fRxCb; /** Optional callback to be invoked once several TD have been released */ fGmacdWakeupCallback fWakupCb; /** Optional callback list to be invoked once TD has been processed */ fGmacdTransferCallback *fTxCbList; /** Optional callback to be invoked on transmit of PTP Event messages */ fGmacdTxPtpEvtCallBack fTxPtpEvtCb; /** RX TD list size */ uint16_t wRxListSize; /** RX index for current processing TD */ uint16_t wRxI; /** TX TD list size */ uint16_t wTxListSize; /** Circular buffer head pointer by upper layer (buffer to be sent) */ uint16_t wTxHead; /** Circular buffer tail pointer incremented by handlers (buffer sent) */ uint16_t wTxTail; /** Number of free TD before wakeup callback is invoked */ uint8_t bWakeupThreshold; /** RX buffer size */ uint16_t wTxBufferSize; uint16_t wRxBufferSize; } sGmacQd; /** * GMAC driver struct. */ typedef struct _GmacDriver { /** Pointer to HW register base */ Gmac *pHw; /** HW ID */ uint8_t bId; /** Base Queue list params **/ sGmacQd queueList[NUM_GMAC_QUEUES]; } sGmacd; /** * GMAC driver init struct. */ typedef struct _GmacInit { uint32_t bIsGem: 1; uint32_t reserved: 31; uint8_t bDmaBurstLength; /** RX descriptor and data buffers */ uint8_t *pRxBuffer; /** RX data buffers: should be wRxBufferSize * wRxSize byte long in a DMA capable memory region */ sGmacRxDescriptor *pRxD; /** RX buffer descriptors: should have wRxSize entries in a DMA capable memory region */ uint16_t wRxBufferSize; /** size of a single RX data buffer */ uint16_t wRxSize; /** number of RX descriptor and data buffers */ /** TX descriptor and data buffers */ /** TX data buffers: should be wTxBufferSize * wTxSize byte long in a DMA capable memory region */ uint8_t *pTxBuffer; /** TX buffer descriptors: should have wTxSize entries in a DMA capable non-cached memory region */ sGmacTxDescriptor *pTxD; /** size of a single TX data buffer */ uint16_t wTxBufferSize; /** number of TX descriptor and data buffers */ uint16_t wTxSize; fGmacdTransferCallback *pTxCb; /** should have wTxSize entries */ } sGmacInit; /** @}*/ /** \addtogroup gmacd_functions @{*/ /*--------------------------------------------------------------------------- * GMAC Exported functions *---------------------------------------------------------------------------*/ extern void GMACD_Handler(sGmacd *pGmacd , gmacQueList_t queIdx); extern void GMACD_Init(sGmacd *pGmacd, Gmac *pHw, uint8_t bID, uint8_t enableCAF, uint8_t enableNBC); extern uint8_t GMACD_InitTransfer(sGmacd *pGmacd, const sGmacInit *pInit, gmacQueList_t queIdx); extern void GMACD_Reset(sGmacd *pGmacd); extern uint8_t GMACD_SendSG(sGmacd *pGmacd, const sGmacSGList *sgl, fGmacdTransferCallback fTxCb, gmacQueList_t queIdx); extern uint8_t GMACD_Send(sGmacd *pGmacd, void *pBuffer, uint32_t size, fGmacdTransferCallback fTxCb, gmacQueList_t queIdx); extern uint32_t GMACD_TxLoad(sGmacd *pGmacd, gmacQueList_t queIdx); extern uint8_t GMACD_Poll(sGmacd *pGmacd, uint8_t *pFrame, uint32_t frameSize, uint32_t *pRcvSize, gmacQueList_t queIdx); extern void GMACD_SetRxCallback(sGmacd *pGmacd, fGmacdTransferCallback fRxCb, gmacQueList_t queIdx); extern uint8_t GMACD_SetTxWakeupCallback(sGmacd *pGmacd, fGmacdWakeupCallback fWakeup, uint8_t bThreshold, gmacQueList_t queIdx); extern void GMACD_TxPtpEvtMsgCBRegister (sGmacd *pGmacd, fGmacdTxPtpEvtCallBack pTxPtpEvtCb, gmacQueList_t queIdx); /** @}*/ #endif // #ifndef _GMACD_H_