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
76 /** \addtogroup gmacd_buf_size GMACD Default Buffer Size
\r
78 #define GMAC_RX_UNITSIZE 128 /**< Fixed size for RX buffer */
\r
79 #define GMAC_TX_UNITSIZE 1518 /**< Size for ETH frame length */
\r
82 /** \addtogroup gmacd_rc GMACD Return Codes
\r
84 #define GMACD_OK 0 /**< Operation OK */
\r
85 #define GMACD_TX_BUSY 1 /**< TX in progress */
\r
86 #define GMACD_RX_NULL 1 /**< No data received */
\r
87 /** Buffer size not enough */
\r
88 #define GMACD_SIZE_TOO_SMALL 2
\r
89 /** Parameter error, TX packet invalid or RX size too small */
\r
90 #define GMACD_PARAM 3
\r
91 /** Transter is not initialized */
\r
92 #define GMACD_NOT_INITIALIZED 4
\r
97 /*---------------------------------------------------------------------------
\r
99 *---------------------------------------------------------------------------*/
\r
100 /** \addtogroup gmacd_types
\r
104 typedef void (*fGmacdTransferCallback)(uint32_t status);
\r
105 /** Wakeup callback */
\r
106 typedef void (*fGmacdWakeupCallback)(void);
\r
109 * GMAC driver struct.
\r
111 typedef struct _GmacDriver {
\r
113 /** Pointer to HW register base */
\r
116 uint8_t *pTxBuffer;
\r
117 /** Pointer to allocated RX buffer */
\r
118 uint8_t *pRxBuffer;
\r
120 /** Pointer to Rx TDs (must be 8-byte aligned) */
\r
121 sGmacRxDescriptor *pRxD;
\r
122 /** Pointer to Tx TDs (must be 8-byte aligned) */
\r
123 sGmacTxDescriptor *pTxD;
\r
125 /** Optional callback to be invoked once a frame has been received */
\r
126 fGmacdTransferCallback fRxCb;
\r
127 /** Optional callback to be invoked once several TD have been released */
\r
128 fGmacdWakeupCallback fWakupCb;
\r
129 /** Optional callback list to be invoked once TD has been processed */
\r
130 fGmacdTransferCallback *fTxCbList;
\r
132 /** RX TD list size */
\r
133 uint16_t wRxListSize;
\r
134 /** RX index for current processing TD */
\r
137 /** TX TD list size */
\r
138 uint16_t wTxListSize;
\r
139 /** Circular buffer head pointer by upper layer (buffer to be sent) */
\r
141 /** Circular buffer tail pointer incremented by handlers (buffer sent) */
\r
144 /** Number of free TD before wakeup callback is invoked */
\r
145 uint8_t bWakeupThreshold;
\r
152 /** \addtogroup gmacd_functions
\r
155 /*---------------------------------------------------------------------------
\r
156 * GMAC Exported functions
\r
157 *---------------------------------------------------------------------------*/
\r
159 extern void GMACD_Handler(sGmacd *pGmacd );
\r
161 extern void GMACD_Init(sGmacd *pGmacd,
\r
164 uint8_t enableCAF,
\r
165 uint8_t enableNBC );
\r
167 extern uint8_t GMACD_InitTransfer( sGmacd *pGmacd,
\r
168 uint8_t *pRxBuffer,
\r
169 sGmacRxDescriptor *pRxD,
\r
171 uint8_t *pTxBuffer,
\r
172 sGmacTxDescriptor *pTxD,
\r
173 fGmacdTransferCallback *pTxCb,
\r
176 extern void GMACD_Reset(sGmacd *pGmacd);
\r
178 extern uint8_t GMACD_Send(sGmacd *pGmacd,
\r
181 fGmacdTransferCallback fTxCb );
\r
183 extern uint32_t GMACD_TxLoad(sGmacd *pGmacd);
\r
185 extern uint8_t GMACD_Poll(sGmacd * pGmacd,
\r
187 uint32_t frameSize,
\r
188 uint32_t *pRcvSize);
\r
190 extern void GMACD_SetRxCallback(sGmacd * pGmacd, fGmacdTransferCallback fRxCb);
\r
192 extern uint8_t GMACD_SetTxWakeupCallback(sGmacd * pGmacd,
\r
193 fGmacdWakeupCallback fWakeup,
\r
194 uint8_t bThreshold);
\r
198 #endif // #ifndef _GMACD_H_
\r