1 /* ----------------------------------------------------------------------------
\r
2 * SAM Software Package License
\r
3 * ----------------------------------------------------------------------------
\r
4 * Copyright (c) 2012, Atmel Corporation
\r
6 * All rights reserved.
\r
8 * Redistribution and use in source and binary forms, with or without
\r
9 * modification, are permitted provided that the following conditions are met:
\r
11 * - Redistributions of source code must retain the above copyright notice,
\r
12 * this list of conditions and the disclaimer below.
\r
14 * Atmel's name may not be used to endorse or promote products derived from
\r
15 * this software without specific prior written permission.
\r
17 * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
\r
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
\r
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
\r
20 * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
\r
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
\r
22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
\r
23 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
\r
24 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
\r
25 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
\r
26 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\r
27 * ----------------------------------------------------------------------------
\r
32 /** \addtogroup gmacd_module
\r
34 * Implement GMAC data transfer and PHY management functions.
\r
37 * -# Implement GMAC interrupt handler, which must invoke GMACD_Handler()
\r
38 * to handle GMAC interrupt events.
\r
39 * -# Implement sGmacd instance in application.
\r
40 * -# Initialize the instance with GMACD_Init() and GMACD_InitTransfer(),
\r
41 * so that GMAC data can be transmitted/received.
\r
42 * -# Some management callbacks can be set by GMACD_SetRxCallback()
\r
43 * and GMACD_SetTxWakeupCallback().
\r
44 * -# Send ethernet packets using GMACD_Send(), GMACD_TxLoad() is used
\r
45 * to check the free space in TX queue.
\r
46 * -# Check and obtain received ethernet packets via GMACD_Poll().
\r
48 * \sa \ref gmacb_module, \ref gmac_module
\r
54 * \defgroup gmacd_defines GMAC Driver Defines
\r
55 * \defgroup gmacd_types GMAC Driver Types
\r
56 * \defgroup gmacd_functions GMAC Driver Functions
\r
63 /*---------------------------------------------------------------------------
\r
65 *---------------------------------------------------------------------------*/
\r
70 /*---------------------------------------------------------------------------
\r
72 *---------------------------------------------------------------------------*/
\r
73 /** \addtogroup gmacd_defines
\r
77 /** \addtogroup gmacd_rc GMACD Return Codes
\r
79 #define GMACD_OK 0 /**< Operation OK */
\r
80 #define GMACD_TX_BUSY 1 /**< TX in progress */
\r
81 #define GMACD_RX_NULL 1 /**< No data received */
\r
82 /** Buffer size not enough */
\r
83 #define GMACD_SIZE_TOO_SMALL 2
\r
84 /** Parameter error, TX packet invalid or RX size too small */
\r
85 #define GMACD_PARAM 3
\r
86 /** Transter is not initialized */
\r
87 #define GMACD_NOT_INITIALIZED 4
\r
92 /*---------------------------------------------------------------------------
\r
94 *---------------------------------------------------------------------------*/
\r
95 /** \addtogroup gmacd_types
\r
99 typedef void (*fGmacdTransferCallback)(uint32_t status);
\r
100 /** Wakeup callback */
\r
101 typedef void (*fGmacdWakeupCallback)(void);
\r
104 * GMAC scatter-gather entry.
\r
106 typedef struct _GmacSG {
\r
112 * GMAC scatter-gather list.
\r
114 typedef struct _GmacSGList {
\r
120 * GMAC Queue driver.
\r
122 typedef struct _GmacQueueDriver {
\r
123 uint8_t *pTxBuffer;
\r
124 /** Pointer to allocated RX buffer */
\r
125 uint8_t *pRxBuffer;
\r
127 /** Pointer to Rx TDs (must be 8-byte aligned) */
\r
128 sGmacRxDescriptor *pRxD;
\r
129 /** Pointer to Tx TDs (must be 8-byte aligned) */
\r
130 sGmacTxDescriptor *pTxD;
\r
132 /** Optional callback to be invoked once a frame has been received */
\r
133 fGmacdTransferCallback fRxCb;
\r
134 /** Optional callback to be invoked once several TD have been released */
\r
135 fGmacdWakeupCallback fWakupCb;
\r
136 /** Optional callback list to be invoked once TD has been processed */
\r
137 fGmacdTransferCallback *fTxCbList;
\r
139 /** RX TD list size */
\r
140 uint16_t wRxListSize;
\r
141 /** RX index for current processing TD */
\r
144 /** TX TD list size */
\r
145 uint16_t wTxListSize;
\r
146 /** Circular buffer head pointer by upper layer (buffer to be sent) */
\r
148 /** Circular buffer tail pointer incremented by handlers (buffer sent) */
\r
151 /** Number of free TD before wakeup callback is invoked */
\r
152 uint8_t bWakeupThreshold;
\r
157 * GMAC driver struct.
\r
159 typedef struct _GmacDriver {
\r
161 /** Pointer to HW register base */
\r
165 /** Base Queue list params **/
\r
166 sGmacQd queueList[NUM_GMAC_QUEUES];
\r
171 /** \addtogroup gmacd_functions
\r
174 /*---------------------------------------------------------------------------
\r
175 * GMAC Exported functions
\r
176 *---------------------------------------------------------------------------*/
\r
178 extern void GMACD_Handler(sGmacd *pGmacd , gmacQueList_t queIdx);
\r
180 extern void GMACD_Init(sGmacd *pGmacd,
\r
183 uint8_t enableCAF,
\r
184 uint8_t enableNBC );
\r
186 extern uint8_t GMACD_InitTransfer( sGmacd *pGmacd,
\r
187 uint8_t *pRxBuffer,
\r
188 sGmacRxDescriptor *pRxD,
\r
190 uint8_t *pTxBuffer,
\r
191 sGmacTxDescriptor *pTxD,
\r
192 fGmacdTransferCallback *pTxCb,
\r
194 gmacQueList_t queIdx);
\r
196 extern void GMACD_Reset(sGmacd *pGmacd);
\r
198 extern uint8_t GMACD_SendSG(sGmacd *pGmacd,
\r
199 const sGmacSGList *sgl,
\r
200 fGmacdTransferCallback fTxCb,
\r
201 gmacQueList_t queIdx);
\r
203 extern uint8_t GMACD_Send(sGmacd *pGmacd,
\r
206 fGmacdTransferCallback fTxCb,
\r
207 gmacQueList_t queIdx );
\r
209 extern uint32_t GMACD_TxLoad(sGmacd *pGmacd, gmacQueList_t queIdx);
\r
211 extern uint8_t GMACD_Poll(sGmacd * pGmacd,
\r
213 uint32_t frameSize,
\r
214 uint32_t *pRcvSize,
\r
215 gmacQueList_t queIdx);
\r
217 extern void GMACD_SetRxCallback(sGmacd * pGmacd, fGmacdTransferCallback fRxCb, gmacQueList_t queIdx);
\r
219 extern uint8_t GMACD_SetTxWakeupCallback(sGmacd * pGmacd,
\r
220 fGmacdWakeupCallback fWakeup,
\r
221 uint8_t bThreshold,
\r
222 gmacQueList_t queIdx);
\r
226 #endif // #ifndef _GMACD_H_
\r