]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_A5_SAMA5D4x_EK_IAR/AtmelFiles/libchip_sama5d4x/include/emac.h
Core kernel code:
[freertos] / FreeRTOS / Demo / CORTEX_A5_SAMA5D4x_EK_IAR / AtmelFiles / libchip_sama5d4x / include / emac.h
1 /* ----------------------------------------------------------------------------\r
2  *         SAM Software Package License \r
3  * ----------------------------------------------------------------------------\r
4  * Copyright (c) 2011, 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 emac_module\r
33  * @{\r
34  * Provides the interface to configure and use the EMAC peripheral.\r
35  *\r
36  * \section emac_usage Usage\r
37  * - Configure Emac::EMAC_NCFG with EMAC_Configure(), some of related controls\r
38  *   are also available, such as:\r
39  *   - EMAC_SetSpeed(): Setup EMAC working clock.\r
40  *   - EMAC_FullDuplexEnable(): Working in full duplex or not.\r
41  *   - EMAC_CpyAllEnable(): Copying all valid frames (\ref EMAC_NCFG_CAF).\r
42  *   - ...\r
43  * - Setup Emac::EMAC_NCR with EMAC_NetworkControl(), more related controls\r
44  *   can modify with:\r
45  *   - EMAC_ReceiveEnable(): Enable/Disable Rx.\r
46  *   - EMAC_TransmitEnable(): Enable/Disable Tx.\r
47  *   - EMAC_BroadcastDisable(): Enable/Disable broadcast receiving.\r
48  *   - ...\r
49  * - Manage EMAC interrupts with EMAC_EnableIt(), EMAC_DisableIt(),\r
50  *   EMAC_GetItMask() and EMAC_GetItStatus().\r
51  * - Manage EMAC Tx/Rx status with EMAC_GetTxStatus(), EMAC_GetRxStatus()\r
52  *   EMAC_ClearTxStatus() and EMAC_ClearRxStatus().\r
53  * - Manage EMAC Queue with EMAC_SetTxQueue(), EMAC_GetTxQueue(),\r
54  *   EMAC_SetRxQueue() and EMAC_GetRxQueue(), the queue descriptor can define\r
55  *   by \ref sEmacRxDescriptor and \ref sEmacTxDescriptor.\r
56  * - Manage PHY through EMAC is performed by\r
57  *   - EMAC_ManagementEnable(): Enable/Disable PHY management.\r
58  *   - EMAC_PHYMaintain(): Execute PHY management commands.\r
59  *   - EMAC_PHYData(): Return PHY management data.\r
60  *   - EMAC_IsIdle(): Check if PHY is idle.\r
61  * - Setup EMAC parameters with following functions:\r
62  *   - EMAC_SetHash(): Set Hash value.\r
63  *   - EMAC_SetAddress(): Set MAC address.\r
64  * - Enable/Disable EMAC transceiver clock via EMAC_TransceiverClockEnable()\r
65  * - Switch EMAC MII/RMII mode through EMAC_RMIIEnable()\r
66  *\r
67  * For more accurate information, please look at the EMAC section of the\r
68  * Datasheet.\r
69  *\r
70  * \sa \ref emacd_module\r
71  *\r
72  * Related files:\n\r
73  * emac.c\n\r
74  * emac.h.\n\r
75  *\r
76  *   \defgroup emac_defines EMAC Defines\r
77  *   \defgroup emac_structs EMAC Data Structs\r
78  *   \defgroup emac_functions EMAC Functions\r
79  */\r
80 /**@}*/\r
81 \r
82 #ifndef _EMAC_H\r
83 #define _EMAC_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 emac_defines\r
100         @{*/\r
101 \r
102 /** The buffer addresses written into the descriptors must be aligned so the\r
103     last few bits are zero.  These bits have special meaning for the EMAC\r
104     peripheral and cannot be used as part of the address. */\r
105 #define EMAC_RXD_ADDR_MASK      0xFFFFFFFC\r
106 #define EMAC_RXD_bmWRAP         (1ul << 1)  /**< Wrap bit */\r
107 #define EMAC_RXD_bmOWNERSHIP    (1ul << 0)  /**< Ownership bit */\r
108 \r
109 #define EMAC_RXD_bmBROADCAST    (1ul << 31) /**< Broadcast detected */\r
110 #define EMAC_RXD_bmMULTIHASH    (1ul << 30) /**< Multicast hash match */\r
111 #define EMAC_RXD_bmUNIHASH      (1ul << 29) /**< Unicast hash match */\r
112 #define EMAC_RXD_bmEXTADDR      (1ul << 28) /**< External address match */\r
113 #define EMAC_RXD_bmADDR1        (1ul << 26) /**< Address 1 match */\r
114 #define EMAC_RXD_bmADDR2        (1ul << 25) /**< Address 2 match */\r
115 #define EMAC_RXD_bmADDR3        (1ul << 24) /**< Address 3 match */\r
116 #define EMAC_RXD_bmADDR4        (1ul << 23) /**< Address 4 match */\r
117 #define EMAC_RXD_bmTYPE         (1ul << 22) /**< Type ID match */\r
118 #define EMAC_RXD_bmVLAN         (1ul << 21) /**< VLAN tag detected */\r
119 #define EMAC_RXD_bmPRIORITY     (1ul << 20) /**< Prority tag detected */\r
120 #define EMAC_RXD_PRIORITY_MASK  (3ul << 17) /**< VLAN prority */\r
121 #define EMAC_RXD_bmCFI          (1ul << 16) /**< Concatenation Format Indicator\r
122                                                  only if bit 21 is set */\r
123 #define EMAC_RXD_bmEOF          (1ul << 15) /**< End of frame */\r
124 #define EMAC_RXD_bmSOF          (1ul << 14) /**< Start of frame */\r
125 #define EMAC_RXD_OFFSET_MASK                /**< Receive buffer offset */\r
126 #define EMAC_RXD_LEN_MASK       (0xFFF)     /**< Length of frame including FCS\r
127                                                  (if selected) */\r
128 #define EMAC_RXD_LENJUMBO_MASK  (0x3FFF)    /**< Jumbo frame length */\r
129 \r
130 #define EMAC_TXD_bmUSED         (1ul << 31) /**< Frame is transmitted */\r
131 #define EMAC_TXD_bmWRAP         (1ul << 30) /**< Last descriptor */\r
132 #define EMAC_TXD_bmERROR        (1ul << 29) /**< Retry limit exceed, error */\r
133 #define EMAC_TXD_bmUNDERRUN     (1ul << 28) /**< Transmit underrun */\r
134 #define EMAC_TXD_bmEXHAUSTED    (1ul << 27) /**< Buffer exhausted */\r
135 #define EMAC_TXD_bmNOCRC        (1ul << 16) /**< No CRC */\r
136 #define EMAC_TXD_bmLAST         (1ul << 15) /**< Last buffer in frame */\r
137 #define EMAC_TXD_LEN_MASK       (0x7FF)     /**< Length of buffer */\r
138 \r
139 \r
140 /** The MAC can support frame lengths up to 1536 bytes. */\r
141 #define EMAC_FRAME_LENTGH_MAX       1536\r
142 \r
143 /**     @}*/\r
144 /*----------------------------------------------------------------------------\r
145  *        Types\r
146  *----------------------------------------------------------------------------*/\r
147 /** \addtogroup emac_structs\r
148         @{*/\r
149 #ifdef __ICCARM__          // IAR\r
150 #define PACKED_ATTR \r
151 #elif defined (  __GNUC__  ) /* GCC CS3 */\r
152 #define PACKED_ATTR     __attribute__((packed, aligned(8))) \r
153 #endif                     \r
154 \r
155 /** Receive buffer descriptor struct */\r
156 typedef struct _EmacRxDescriptor {\r
157     union _EmacRxAddr {\r
158         uint32_t val;\r
159         struct _EmacRxAddrBM {\r
160             uint32_t bOwnership:1,  /**< User clear, EMAC set this to one once\r
161                                          it has successfully written a frame to\r
162                                          memory */\r
163                      bWrap:1,       /**< Marks last descriptor in receive buffer */\r
164                      addrDW:30;     /**< Address in number of DW */\r
165         } bm;\r
166     } addr;                    /**< Address, Wrap & Ownership */\r
167     union _EmacRxStatus {\r
168         uint32_t val;\r
169         struct _EmacRxStatusBM {\r
170             uint32_t len:12,                /** Length of frame including FCS */\r
171                      offset:2,              /** Receive buffer offset,\r
172                                                 bits 13:12 of frame length for jumbo\r
173                                                 frame */\r
174                      bSof:1,                /** Start of frame */\r
175                      bEof:1,                /** End of frame */\r
176                      bCFI:1,                /** Concatenation Format Indicator */\r
177                      vlanPriority:3,        /** VLAN priority (if VLAN detected) */\r
178                      bPriorityDetected:1,   /** Priority tag detected */\r
179                      bVlanDetected:1,       /**< VLAN tag detected */\r
180                      bTypeIDMatch:1,        /**< Type ID match */\r
181                      bAddr4Match:1,         /**< Address register 4 match */\r
182                      bAddr3Match:1,         /**< Address register 3 match */\r
183                      bAddr2Match:1,         /**< Address register 2 match */\r
184                      bAddr1Match:1,         /**< Address register 1 match */\r
185                      reserved:1,\r
186                      bExtAddrMatch:1,       /**< External address match */\r
187                      bUniHashMatch:1,       /**< Unicast hash match */\r
188                      bMultiHashMatch:1,     /**< Multicast hash match */\r
189                      bBroadcastDetected:1;  /**< Global all ones broadcast\r
190                                                  address detected */\r
191         } bm;\r
192     } status;\r
193 }PACKED_ATTR sEmacRxDescriptor;    /* GCC */\r
194 \r
195 /** Transmit buffer descriptor struct */\r
196 typedef struct _EmacTxDescriptor {\r
197     uint32_t addr;\r
198     union _EmacTxStatus {\r
199         uint32_t val;\r
200         struct _EmacTxStatusBM {\r
201             uint32_t len:11,        /**< Length of buffer */\r
202                      reserved:4,\r
203                      bLastBuffer:1, /**< Last buffer (in the current frame) */\r
204                      bNoCRC:1,      /**< No CRC */\r
205                      reserved1:10,\r
206                      bExhausted:1,  /**< Buffer exhausted in mid frame */\r
207                      bUnderrun:1,   /**< Transmit underrun */\r
208                      bError:1,      /**< Retry limit exceeded, error detected */\r
209                      bWrap:1,       /**< Marks last descriptor in TD list */\r
210                      bUsed:1;       /**< User clear, EMAC sets this once a frame\r
211                                          has been successfully transmitted */\r
212         } bm;\r
213     } status;\r
214 } PACKED_ATTR sEmacTxDescriptor;     /* GCC */\r
215 \r
216 /**     @}*/\r
217 /*----------------------------------------------------------------------------\r
218  *        Exported functions\r
219  *----------------------------------------------------------------------------*/\r
220 \r
221 /** \addtogroup emac_functions\r
222         @{*/\r
223 extern void EMAC_NetworkControl(Emac *pEmac, uint32_t bmNCR);\r
224 extern uint32_t EMAC_GetNetworkControl(Emac * pEmac);\r
225 extern void EMAC_ReceiveEnable(Emac * pEmac,uint8_t bEnaDis);\r
226 extern void EMAC_TransmitEnable(Emac * pEmac,uint8_t bEnaDis);\r
227 extern void EMAC_ManagementEnable(Emac * pEmac,uint8_t bEnaDis);\r
228 extern void EMAC_ClearStatistics(Emac * pEmac);\r
229 extern void EMAC_IncreaseStatistics(Emac * pEmac);\r
230 extern void EMAC_StatisticsWriteEnable(Emac * pEmac,uint8_t bEnaDis);\r
231 extern void EMAC_BackPressureEnable(Emac * pEmac,uint8_t bEnaDis);\r
232 extern void EMAC_TransmissionStart(Emac * pEmac);\r
233 extern void EMAC_TransmissionHalt(Emac * pEmac);\r
234 \r
235 extern void EMAC_Configure(Emac * pEmac,uint32_t dwCfg);\r
236 extern uint32_t EMAC_GetConfigure(Emac * pEmac);\r
237 extern void EMAC_SetSpeed(Emac * pEmac,uint8_t bSpeed);\r
238 extern void EMAC_FullDuplexEnable(Emac * pEmac,uint8_t bFD);\r
239 extern void EMAC_CpyAllEnable(Emac * pEmac,uint8_t bCAF);\r
240 extern void EMAC_JumboFrameEnable(Emac * pEmac,uint8_t bEnaDis);\r
241 extern void EMAC_BroadcastDisable(Emac * pEmac,uint8_t bDisEna);\r
242 extern void EMAC_MulticastHashEnable(Emac * pEmac,uint8_t bEnaDis);\r
243 extern void EMAC_BigFrameEnable(Emac * pEmac,uint8_t bEnaDis);\r
244 extern uint8_t EMAC_SetClock(Emac * pEmac,uint32_t dwMck);\r
245 extern void EMAC_RetryTestEnable(Emac * pEmac,uint8_t bEnaDis);\r
246 extern void EMAC_PauseFrameEnable(Emac * pEmac,uint8_t bEnaDis);\r
247 extern void EMAC_SetRxBufferOffset(Emac * pEmac,uint8_t bOffset);\r
248 extern void EMAC_RxLenthCheckEnable(Emac * pEmac,uint8_t bEnaDis);\r
249 extern void EMAC_DiscardFCSEnable(Emac * pEmac,uint8_t bEnaDis);\r
250 extern void EMAC_EFRHD(Emac * pEmac,uint8_t bEnaDis);\r
251 extern void EMAC_IRXFCS(Emac * pEmac,uint8_t bEnaDis);\r
252 \r
253 extern uint32_t EMAC_GetStatus(Emac * pEmac);\r
254 extern uint8_t EMAC_GetMDIO(Emac * pEmac);\r
255 extern uint8_t EMAC_IsIdle(Emac * pEmac);\r
256 \r
257 extern uint32_t EMAC_GetTxStatus(Emac * pEmac);\r
258 extern void EMAC_ClearTxStatus(Emac * pEmac,uint32_t dwStatus);\r
259 \r
260 extern uint32_t EMAC_GetRxStatus(Emac * pEmac);\r
261 extern void EMAC_ClearRxStatus(Emac * pEmac,uint32_t dwStatus);\r
262 \r
263 extern void EMAC_SetTxQueue(Emac * pEmac,uint32_t dwAddr);\r
264 extern uint32_t EMAC_GetTxQueue(Emac * pEmac);\r
265 \r
266 extern void EMAC_SetRxQueue(Emac * pEmac,uint32_t dwAddr);\r
267 extern uint32_t EMAC_GetRxQueue(Emac * pEmac);\r
268 \r
269 extern void EMAC_EnableIt(Emac * pEmac,uint32_t dwSources);\r
270 extern void EMAC_DisableIt(Emac * pEmac,uint32_t dwSources);\r
271 extern uint32_t EMAC_GetItMask(Emac * pEmac);\r
272 extern uint32_t EMAC_GetItStatus(Emac * pEmac);\r
273 \r
274 extern void EMAC_PHYMaintain(Emac * pEmac,\r
275                              uint8_t bPhyAddr, uint8_t bRegAddr,\r
276                              uint8_t bRW,\r
277                              uint16_t wData);\r
278 extern uint16_t EMAC_PHYData(Emac * pEmac);\r
279 \r
280 extern void EMAC_SetPauseTime(Emac * pEmac,uint16_t wPTime);\r
281 \r
282 extern void EMAC_SetHash(Emac * pEmac,uint32_t dwHashTop,uint32_t dwHashBottom);\r
283 extern void EMAC_SetHash64(Emac * pEmac,uint64_t ddwHash);\r
284 \r
285 extern void EMAC_SetAddress(Emac * pEmac,uint8_t bIndex,uint8_t * pMacAddr);\r
286 extern void EMAC_SetAddress32(Emac * pEmac,uint8_t bIndex,\r
287                               uint32_t dwMacT,uint32_t dwMacB);\r
288 extern void EMAC_SetAddress64(Emac * pEmac,uint8_t bIndex,uint64_t ddwMac);\r
289 \r
290 extern void EMAC_SetTypeID(Emac * pEmac,uint16_t wTID);\r
291 extern uint16_t EMAC_GetTypeID(Emac * pEmac);\r
292 \r
293 extern void EMAC_RMIIEnable(Emac * pEmac,uint8_t bEnaDis);\r
294 extern void EMAC_TransceiverClockEnable(Emac * pEmac,uint8_t bEnaDis);\r
295 /**     @}*/\r
296 \r
297 #ifdef __cplusplus\r
298 }\r
299 #endif\r
300 \r
301 #endif /* #ifndef _EMAC_H */\r
302 \r