]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_M7_SAMV71_Xplained/libchip_samv7/include/gmac.h
Update version number ready for V8.2.1 release.
[freertos] / FreeRTOS / Demo / CORTEX_M7_SAMV71_Xplained / libchip_samv7 / include / gmac.h
1 /* ----------------------------------------------------------------------------\r
2  *         SAM Software Package License \r
3  * ----------------------------------------------------------------------------\r
4  * Copyright (c) 2012, Atmel Corporation\r
5  *\r
6  * All rights reserved.\r
7  *\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
10  *\r
11  * - Redistributions of source code must retain the above copyright notice,\r
12  * this list of conditions and the disclaimer below.\r
13  *\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
16  *\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
28  */\r
29 \r
30 /** \file */\r
31 \r
32 /** \addtogroup gmac_module\r
33  * @{\r
34  * Provides the interface to configure and use the GMAC peripheral.\r
35  *\r
36  * \section gmac_usage Usage\r
37  * - Configure Gmac::GMAC_NCFG with GMAC_Configure(), some of related controls\r
38  *   are also available, such as:\r
39  *   - GMAC_SetSpeed(): Setup GMAC working clock.\r
40  *   - GMAC_FullDuplexEnable(): Working in full duplex or not.\r
41  *   - GMAC_CpyAllEnable(): Copying all valid frames (\ref GMAC_NCFG_CAF).\r
42  *   - ...\r
43  * - Setup Gmac::GMAC_NCR with GMAC_NetworkControl(), more related controls\r
44  *   can modify with:\r
45  *   - GMAC_ReceiveEnable(): Enable/Disable Rx.\r
46  *   - GMAC_TransmitEnable(): Enable/Disable Tx.\r
47  *   - GMAC_BroadcastDisable(): Enable/Disable broadcast receiving.\r
48  *   - ...\r
49  * - Manage GMAC interrupts with GMAC_EnableIt(), GMAC_DisableIt(),\r
50  *   GMAC_GetItMask() and GMAC_GetItStatus().\r
51  * - Manage GMAC Tx/Rx status with GMAC_GetTxStatus(), GMAC_GetRxStatus()\r
52  *   GMAC_ClearTxStatus() and GMAC_ClearRxStatus().\r
53  * - Manage GMAC Queue with GMAC_SetTxQueue(), GMAC_GetTxQueue(),\r
54  *   GMAC_SetRxQueue() and GMAC_GetRxQueue(), the queue descriptor can define\r
55  *   by \ref sGmacRxDescriptor and \ref sGmacTxDescriptor.\r
56  * - Manage PHY through GMAC is performed by\r
57  *   - GMAC_ManagementEnable(): Enable/Disable PHY management.\r
58  *   - GMAC_PHYMaintain(): Execute PHY management commands.\r
59  *   - GMAC_PHYData(): Return PHY management data.\r
60  *   - GMAC_IsIdle(): Check if PHY is idle.\r
61  * - Setup GMAC parameters with following functions:\r
62  *   - GMAC_SetHash(): Set Hash value.\r
63  *   - GMAC_SetAddress(): Set MAC address.\r
64  * - Enable/Disable GMAC transceiver clock via GMAC_TransceiverClockEnable()\r
65  * - Switch GMAC MII/RMII mode through GMAC_RMIIEnable()\r
66  *\r
67  * For more accurate information, please look at the GMAC section of the\r
68  * Datasheet.\r
69  *\r
70  * \sa \ref gmacd_module\r
71  *\r
72  * Related files:\n\r
73  * gmac.c\n\r
74  * gmac.h.\n\r
75  *\r
76  *   \defgroup gmac_defines GMAC Defines\r
77  *   \defgroup gmac_structs GMAC Data Structs\r
78  *   \defgroup gmac_functions GMAC Functions\r
79  */\r
80 /**@}*/\r
81 \r
82 #ifndef _GMAC_H\r
83 #define _GMAC_H\r
84 \r
85 /*----------------------------------------------------------------------------\r
86  *        Headers\r
87  *----------------------------------------------------------------------------*/\r
88 #include "chip.h"\r
89 \r
90 #include <stdint.h>\r
91 \r
92 #ifdef __cplusplus\r
93  extern "C" {\r
94 #endif\r
95 \r
96 /*----------------------------------------------------------------------------\r
97  *        Defines\r
98  *----------------------------------------------------------------------------*/\r
99 /** \addtogroup gmac_defines\r
100         @{*/\r
101 \r
102 #define NUM_GMAC_QUEUES 3\r
103 /// Board GMAC base address\r
104 \r
105    \r
106 /// Buffer Size\r
107 #define GMAC_RX_UNITSIZE            512     /// Fixed size for RX buffer\r
108 #define GMAC_TX_UNITSIZE            512    /// Size for ETH frame length\r
109 #define GMAC_FRAME_LENTGH_MAX       1536\r
110           \r
111 #define GMAC_DUPLEX_HALF 0\r
112 #define GMAC_DUPLEX_FULL 1\r
113 \r
114 //\r
115 #define GMAC_SPEED_10M      0\r
116 #define GMAC_SPEED_100M     1\r
117 #define GMAC_SPEED_1000M    2\r
118    \r
119 /*------------------------------------------------------------------------------\r
120          Definitions\r
121 ------------------------------------------------------------------------------\r
122 */\r
123 /// The buffer addresses written into the descriptors must be aligned so the\r
124 /// last few bits are zero.  These bits have special meaning for the GMAC\r
125 /// peripheral and cannot be used as part of the address.\r
126 #define GMAC_ADDRESS_MASK   ((unsigned int)0xFFFFFFFC)\r
127 #define GMAC_LENGTH_FRAME   ((unsigned int)0x3FFF)    /// Length of frame mask\r
128 \r
129 // receive buffer descriptor bits\r
130 #define GMAC_RX_OWNERSHIP_BIT   (1u <<  0)\r
131 #define GMAC_RX_WRAP_BIT        (1u <<  1)\r
132 #define GMAC_RX_SOF_BIT         (1u << 14)\r
133 #define GMAC_RX_EOF_BIT         (1u << 15)\r
134 \r
135 // Transmit buffer descriptor bits\r
136 #define GMAC_TX_LAST_BUFFER_BIT (1u << 15)\r
137 #define GMAC_TX_WRAP_BIT        (1u << 30)\r
138 #define GMAC_TX_USED_BIT        (1u << 31)\r
139 #define GMAC_TX_RLE_BIT         (1u << 29) /// Retry Limit Exceeded\r
140 #define GMAC_TX_UND_BIT         (1u << 28) /// Tx Buffer Underrun\r
141 #define GMAC_TX_ERR_BIT         (1u << 27) /// Exhausted in mid-frame\r
142 #define GMAC_TX_ERR_BITS  \\r
143     (GMAC_TX_RLE_BIT | GMAC_TX_UND_BIT | GMAC_TX_ERR_BIT)\r
144 \r
145 // Interrupt bits\r
146 #define GMAC_INT_RX_BITS  \\r
147     (GMAC_IER_RCOMP | GMAC_IER_RXUBR | GMAC_IER_ROVR)\r
148 #define GMAC_INT_TX_ERR_BITS  \\r
149     (GMAC_IER_TUR | GMAC_IER_RLEX | GMAC_IER_TFC | GMAC_IER_HRESP)\r
150 #define GMAC_INT_TX_BITS  \\r
151     (GMAC_INT_TX_ERR_BITS | GMAC_IER_TCOMP)\r
152 /*----------------------------------------------------------------------------\r
153  *        Types\r
154  *----------------------------------------------------------------------------*/\r
155 /** \addtogroup gmac_structs\r
156         @{*/\r
157    \r
158 /* This is the list of GMAC queue */\r
159 typedef enum  {\r
160   GMAC_QUE_0 = 0,\r
161   GMAC_QUE_1 = 1,\r
162   GMAC_QUE_2 = 2\r
163 }gmacQueList_t;\r
164 \r
165 /** Receive buffer descriptor struct */\r
166 typedef struct _GmacRxDescriptor {\r
167     union _GmacRxAddr {\r
168         uint32_t val;\r
169         struct _GmacRxAddrBM {\r
170             uint32_t bOwnership:1,  /**< User clear, GMAC set this to one once\r
171                                          it has successfully written a frame to\r
172                                          memory */\r
173                      bWrap:1,       /**< Marks last descriptor in receive buffer */\r
174                      addrDW:30;     /**< Address in number of DW */\r
175         } bm;\r
176     } addr;                    /**< Address, Wrap & Ownership */\r
177     union _GmacRxStatus {\r
178         uint32_t val;\r
179         struct _GmacRxStatusBM {\r
180             uint32_t len:12,                /** Length of frame including FCS */\r
181                      offset:2,              /** Receive buffer offset,\r
182                                                 bits 13:12 of frame length for jumbo\r
183                                                 frame */\r
184                      bSof:1,                /** Start of frame */\r
185                      bEof:1,                /** End of frame */\r
186                      bCFI:1,                /** Concatenation Format Indicator */\r
187                      vlanPriority:3,        /** VLAN priority (if VLAN detected) */\r
188                      bPriorityDetected:1,   /** Priority tag detected */\r
189                      bVlanDetected:1,       /**< VLAN tag detected */\r
190                      bTypeIDMatch:1,        /**< Type ID match */\r
191                      bAddr4Match:1,         /**< Address register 4 match */\r
192                      bAddr3Match:1,         /**< Address register 3 match */\r
193                      bAddr2Match:1,         /**< Address register 2 match */\r
194                      bAddr1Match:1,         /**< Address register 1 match */\r
195                      reserved:1,\r
196                      bExtAddrMatch:1,       /**< External address match */\r
197                      bUniHashMatch:1,       /**< Unicast hash match */\r
198                      bMultiHashMatch:1,     /**< Multicast hash match */\r
199                      bBroadcastDetected:1;  /**< Global all ones broadcast\r
200                                                  address detected */\r
201         } bm;\r
202     } status;\r
203 } sGmacRxDescriptor ;    /* GCC */\r
204 \r
205 /** Transmit buffer descriptor struct */\r
206 typedef struct _GmacTxDescriptor {\r
207     uint32_t addr;\r
208     union _GmacTxStatus {\r
209         uint32_t val;\r
210         struct _GmacTxStatusBM {\r
211             uint32_t len:11,        /**< Length of buffer */\r
212                      reserved:4,\r
213                      bLastBuffer:1, /**< Last buffer (in the current frame) */\r
214                      bNoCRC:1,      /**< No CRC */\r
215                      reserved1:10,\r
216                      bExhausted:1,  /**< Buffer exhausted in mid frame */\r
217                      bUnderrun:1,   /**< Transmit underrun */\r
218                      bError:1,      /**< Retry limit exceeded, error detected */\r
219                      bWrap:1,       /**< Marks last descriptor in TD list */\r
220                      bUsed:1;       /**< User clear, GMAC sets this once a frame\r
221                                          has been successfully transmitted */\r
222         } bm;\r
223     } status;\r
224 } sGmacTxDescriptor;     /* GCC */\r
225 \r
226 /**     @}*/\r
227 \r
228 //-----------------------------------------------------------------------------\r
229 //         PHY Exported functions\r
230 //-----------------------------------------------------------------------------\r
231 extern uint8_t GMAC_IsIdle(Gmac *pGmac);\r
232 extern void GMAC_PHYMaintain(Gmac      *pGmac,\r
233                              uint8_t   bPhyAddr,\r
234                              uint8_t   bRegAddr,\r
235                              uint8_t   bRW,\r
236                              uint16_t  wData);\r
237 extern uint16_t GMAC_PHYData(Gmac *pGmac);\r
238 extern void GMAC_ClearStatistics(Gmac *pGmac);\r
239 extern void GMAC_IncreaseStatistics(Gmac *pGmac);\r
240 extern void GMAC_StatisticsWriteEnable(Gmac *pGmac, uint8_t bEnaDis);\r
241 extern uint8_t GMAC_SetMdcClock(Gmac *pGmac, uint32_t mck );\r
242 extern void GMAC_EnableMdio(Gmac *pGmac );\r
243 extern void GMAC_DisableMdio(Gmac *pGmac );\r
244 extern void GMAC_EnableMII(Gmac *pGmac );\r
245 extern void GMAC_EnableRMII(Gmac *pGmac );\r
246 extern void GMAC_EnableGMII( Gmac *pGmac );\r
247 extern void GMAC_SetLinkSpeed(Gmac *pGmac, uint8_t speed, uint8_t fullduplex);\r
248 extern void GMAC_EnableIt(Gmac *pGmac, uint32_t dwSources, gmacQueList_t queueIdx);\r
249 extern void GMAC_EnableAllQueueIt(Gmac *pGmac, uint32_t dwSources);\r
250 extern void GMAC_DisableIt(Gmac *pGmac, uint32_t dwSources, gmacQueList_t queueIdx);\r
251 extern void GMAC_DisableAllQueueIt(Gmac *pGmac, uint32_t dwSources);\r
252 extern uint32_t GMAC_GetItStatus(Gmac *pGmac, gmacQueList_t queueIdx);\r
253 extern uint32_t GMAC_GetItMask(Gmac *pGmac, gmacQueList_t queueIdx);\r
254 extern uint32_t GMAC_GetTxStatus(Gmac *pGmac);\r
255 extern void GMAC_ClearTxStatus(Gmac *pGmac, uint32_t dwStatus);\r
256 extern uint32_t GMAC_GetRxStatus(Gmac *pGmac);\r
257 extern void GMAC_ClearRxStatus(Gmac *pGmac, uint32_t dwStatus);\r
258 extern void GMAC_ReceiveEnable(Gmac* pGmac, uint8_t bEnaDis);\r
259 extern void GMAC_TransmitEnable(Gmac *pGmac, uint8_t bEnaDis);\r
260 extern uint32_t GMAC_SetLocalLoopBack(Gmac *pGmac);\r
261 extern void GMAC_SetRxQueue(Gmac *pGmac, uint32_t dwAddr, gmacQueList_t queueIdx);\r
262 extern uint32_t GMAC_GetRxQueue(Gmac *pGmac, gmacQueList_t queueIdx);\r
263 extern void GMAC_SetTxQueue(Gmac *pGmac, uint32_t dwAddr, gmacQueList_t queueIdx);\r
264 extern uint32_t GMAC_GetTxQueue(Gmac *pGmac, gmacQueList_t queueIdx);\r
265 extern void GMAC_NetworkControl(Gmac *pGmac, uint32_t bmNCR);\r
266 extern uint32_t GMAC_GetNetworkControl(Gmac *pGmac);\r
267 extern void GMAC_SetAddress(Gmac *pGmac, uint8_t bIndex, uint8_t *pMacAddr);\r
268 extern void GMAC_SetAddress32(Gmac *pGmac, uint8_t bIndex, uint32_t dwMacT, uint32_t dwMacB);\r
269 extern void GMAC_SetAddress64(Gmac *pGmac, uint8_t bIndex, uint64_t ddwMac);\r
270 extern void GMAC_Configure(Gmac *pGmac, uint32_t dwCfg);\r
271 extern void GMAC_DmaConfigure(Gmac *pGmac, uint32_t dwCfg);\r
272 extern uint32_t GMAC_GetConfigure(Gmac *pGmac);\r
273 extern void GMAC_TransmissionStart(Gmac *pGmac);\r
274 extern void GMAC_TransmissionHalt(Gmac *pGmac);\r
275 extern void GMAC_EnableRGMII(Gmac *pGmac, uint32_t duplex, uint32_t speed);\r
276 #endif // #ifndef GMAC_H\r
277 \r