nu_emac.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. /**************************************************************************//**
  2. * @file nu_emac.h
  3. * @version V1.00
  4. * @brief EMAC driver header file
  5. *
  6. * SPDX-License-Identifier: Apache-2.0
  7. * @copyright (C) 2016-2020 Nuvoton Technology Corp. All rights reserved.
  8. *****************************************************************************/
  9. #ifndef __NU_EMAC_H__
  10. #define __NU_EMAC_H__
  11. #ifdef __cplusplus
  12. extern "C"
  13. {
  14. #endif
  15. #include <stdint.h>
  16. #include "emac_reg.h"
  17. /** @addtogroup Standard_Driver Standard Driver
  18. @{
  19. */
  20. /** @addtogroup EMAC_Driver EMAC Driver
  21. @{
  22. */
  23. /** @addtogroup EMAC_EXPORTED_CONSTANTS EMAC Exported Constants
  24. @{
  25. */
  26. #define EMAC_PHY_ADDR 1UL /*!< PHY address, this address is board dependent \hideinitializer */
  27. #define EMAC_RX_DESC_SIZE 128UL /*!< Number of Rx Descriptors, should be 2 at least \hideinitializer */
  28. #define EMAC_TX_DESC_SIZE 64UL /*!< Number of Tx Descriptors, should be 2 at least \hideinitializer */
  29. #define EMAC_CAMENTRY_NB 16UL /*!< Number of CAM \hideinitializer */
  30. #define EMAC_MAX_PKT_SIZE 1536UL /*!< Number of HDR + EXTRA + VLAN_TAG + PAYLOAD + CRC \hideinitializer */
  31. #define EMAC_LINK_DOWN 0UL /*!< Ethernet link is down \hideinitializer */
  32. #define EMAC_LINK_100F 1UL /*!< Ethernet link is 100Mbps full duplex \hideinitializer */
  33. #define EMAC_LINK_100H 2UL /*!< Ethernet link is 100Mbps half duplex \hideinitializer */
  34. #define EMAC_LINK_10F 3UL /*!< Ethernet link is 10Mbps full duplex \hideinitializer */
  35. #define EMAC_LINK_10H 4UL /*!< Ethernet link is 10Mbps half duplex \hideinitializer */
  36. /*@}*/ /* end of group EMAC_EXPORTED_CONSTANTS */
  37. /** Tx/Rx buffer descriptor structure */
  38. typedef struct
  39. {
  40. uint32_t u32Status1; /*!< Status word 1 */
  41. uint32_t u32Data; /*!< Pointer to data buffer */
  42. uint32_t u32Status2; /*!< Status word 2 */
  43. uint32_t u32Next; /*!< Pointer to next descriptor */
  44. uint32_t u32Backup1; /*!< For backup descriptor fields over written by time stamp */
  45. uint32_t u32Backup2; /*!< For backup descriptor fields over written by time stamp */
  46. uint32_t u32Reserved1; /*!< For Reserved */
  47. uint32_t u32Reserved2; /*!< For Reserved */
  48. } EMAC_DESCRIPTOR_T;
  49. /** Tx/Rx buffer structure */
  50. typedef struct
  51. {
  52. uint8_t au8Buf[EMAC_MAX_PKT_SIZE];
  53. } EMAC_FRAME_T;
  54. typedef struct
  55. {
  56. EMAC_T *psEmac;
  57. uint32_t u32TxDescSize;
  58. uint32_t u32RxDescSize;
  59. EMAC_DESCRIPTOR_T *psRXDescs;
  60. EMAC_FRAME_T *psRXFrames;
  61. EMAC_DESCRIPTOR_T *psTXDescs;
  62. EMAC_FRAME_T *psTXFrames;
  63. EMAC_DESCRIPTOR_T *psCurrentTxDesc;
  64. EMAC_DESCRIPTOR_T *psNextTxDesc;
  65. EMAC_DESCRIPTOR_T *psCurrentRxDesc;
  66. } EMAC_MEMMGR_T;
  67. /** @addtogroup EMAC_EXPORTED_FUNCTIONS EMAC Exported Functions
  68. @{
  69. */
  70. /**
  71. * @brief Enable EMAC Tx function
  72. * @param None
  73. * @return None
  74. * \hideinitializer
  75. */
  76. #define EMAC_ENABLE_TX(EMAC) (EMAC->CTL |= EMAC_CTL_TXON_Msk)
  77. /**
  78. * @brief Enable EMAC Rx function
  79. * @param The pointer of the specified EMAC module
  80. * @return None
  81. * \hideinitializer
  82. */
  83. #define EMAC_ENABLE_RX(EMAC) do{EMAC->CTL |= EMAC_CTL_RXON_Msk; EMAC->RXST = 0;}while(0)
  84. /**
  85. * @brief Disable EMAC Tx function
  86. * @param The pointer of the specified EMAC module
  87. * @return None
  88. * \hideinitializer
  89. */
  90. #define EMAC_DISABLE_TX(EMAC) (EMAC->CTL &= ~EMAC_CTL_TXON_Msk)
  91. /**
  92. * @brief Disable EMAC Rx function
  93. * @param The pointer of the specified EMAC module
  94. * @return None
  95. * \hideinitializer
  96. */
  97. #define EMAC_DISABLE_RX(EMAC) (EMAC->CTL &= ~EMAC_CTL_RXON_Msk)
  98. /**
  99. * @brief Enable EMAC Magic Packet Wakeup function
  100. * @param The pointer of the specified EMAC module
  101. * @return None
  102. * \hideinitializer
  103. */
  104. #define EMAC_ENABLE_MAGIC_PKT_WAKEUP(EMAC) (EMAC->CTL |= EMAC_CTL_WOLEN_Msk)
  105. /**
  106. * @brief Disable EMAC Magic Packet Wakeup function
  107. * @param The pointer of the specified EMAC module
  108. * @return None
  109. * \hideinitializer
  110. */
  111. #define EMAC_DISABLE_MAGIC_PKT_WAKEUP(EMAC) (EMAC->CTL &= ~EMAC_CTL_WOLEN_Msk)
  112. /**
  113. * @brief Enable EMAC to receive broadcast packets
  114. * @param The pointer of the specified EMAC module
  115. * @return None
  116. * \hideinitializer
  117. */
  118. #define EMAC_ENABLE_RECV_BCASTPKT(EMAC) (EMAC->CAMCTL |= EMAC_CAMCTL_ABP_Msk)
  119. /**
  120. * @brief Disable EMAC to receive broadcast packets
  121. * @param The pointer of the specified EMAC module
  122. * @return None
  123. * \hideinitializer
  124. */
  125. #define EMAC_DISABLE_RECV_BCASTPKT(EMAC) (EMAC->CAMCTL &= ~EMAC_CAMCTL_ABP_Msk)
  126. /**
  127. * @brief Enable EMAC to receive multicast packets
  128. * @param The pointer of the specified EMAC module
  129. * @return None
  130. * \hideinitializer
  131. */
  132. #define EMAC_ENABLE_RECV_MCASTPKT(EMAC) (EMAC->CAMCTL |= EMAC_CAMCTL_AMP_Msk)
  133. /**
  134. * @brief Disable EMAC Magic Packet Wakeup function
  135. * @param The pointer of the specified EMAC module
  136. * @return None
  137. * \hideinitializer
  138. */
  139. #define EMAC_DISABLE_RECV_MCASTPKT(EMAC) (EMAC->CAMCTL &= ~EMAC_CAMCTL_AMP_Msk)
  140. /**
  141. * @brief Check if EMAC time stamp alarm interrupt occurred or not
  142. * @param The pointer of the specified EMAC module
  143. * @return If time stamp alarm interrupt occurred or not
  144. * @retval 0 Alarm interrupt does not occur
  145. * @retval 1 Alarm interrupt occurred
  146. * \hideinitializer
  147. */
  148. #define EMAC_GET_ALARM_FLAG(EMAC) (EMAC->INTSTS & EMAC_INTSTS_TSALMIF_Msk ? 1 : 0)
  149. /**
  150. * @brief Clear EMAC time stamp alarm interrupt flag
  151. * @param The pointer of the specified EMAC module
  152. * @return None
  153. * \hideinitializer
  154. */
  155. #define EMAC_CLR_ALARM_FLAG(EMAC) (EMAC->INTSTS = EMAC_INTSTS_TSALMIF_Msk)
  156. /**
  157. * @brief Trigger EMAC Rx function
  158. * @param The pointer of the specified EMAC module
  159. * @return None
  160. */
  161. #define EMAC_TRIGGER_RX(EMAC) do{EMAC->RXST = 0UL;}while(0)
  162. /**
  163. * @brief Trigger EMAC Tx function
  164. * @param The pointer of the specified EMAC module
  165. * @return None
  166. */
  167. #define EMAC_TRIGGER_TX(EMAC) do{EMAC->TXST = 0UL;}while(0)
  168. /**
  169. * @brief Enable specified EMAC interrupt
  170. *
  171. * @param[in] EMAC The pointer of the specified EMAC module
  172. * @param[in] u32eIntSel Interrupt type select
  173. * - \ref EMAC_INTEN_RXIEN_Msk : Receive
  174. * - \ref EMAC_INTEN_CRCEIEN_Msk : CRC Error
  175. * - \ref EMAC_INTEN_RXOVIEN_Msk : Receive FIFO Overflow
  176. * - \ref EMAC_INTEN_LPIEN_Msk : Long Packet
  177. * - \ref EMAC_INTEN_RXGDIEN_Msk : Receive Good
  178. * - \ref EMAC_INTEN_ALIEIEN_Msk : Alignment Error
  179. * - \ref EMAC_INTEN_RPIEN_Msk : Runt Packet
  180. * - \ref EMAC_INTEN_MPCOVIEN_Msk : Miss Packet Counter Overrun
  181. * - \ref EMAC_INTEN_MFLEIEN_Msk : Maximum Frame Length Exceed
  182. * - \ref EMAC_INTEN_DENIEN_Msk : DMA Early Notification
  183. * - \ref EMAC_INTEN_RDUIEN_Msk : Receive Descriptor Unavailable
  184. * - \ref EMAC_INTEN_RXBEIEN_Msk : Receive Bus Error
  185. * - \ref EMAC_INTEN_CFRIEN_Msk : Control Frame Receive
  186. * - \ref EMAC_INTEN_WOLIEN_Msk : Wake on LAN Interrupt
  187. * - \ref EMAC_INTEN_TXIEN_Msk : Transmit
  188. * - \ref EMAC_INTEN_TXUDIEN_Msk : Transmit FIFO Underflow
  189. * - \ref EMAC_INTEN_TXCPIEN_Msk : Transmit Completion
  190. * - \ref EMAC_INTEN_EXDEFIEN_Msk : Defer Exceed
  191. * - \ref EMAC_INTEN_NCSIEN_Msk : No Carrier Sense
  192. * - \ref EMAC_INTEN_TXABTIEN_Msk : Transmit Abort
  193. * - \ref EMAC_INTEN_LCIEN_Msk : Late Collision
  194. * - \ref EMAC_INTEN_TDUIEN_Msk : Transmit Descriptor Unavailable
  195. * - \ref EMAC_INTEN_TXBEIEN_Msk : Transmit Bus Error
  196. * - \ref EMAC_INTEN_TSALMIEN_Msk : Time Stamp Alarm
  197. *
  198. * @return None
  199. *
  200. * @details This macro enable specified EMAC interrupt.
  201. * \hideinitializer
  202. */
  203. #define EMAC_ENABLE_INT(EMAC, u32eIntSel) ((EMAC)->INTEN |= (u32eIntSel))
  204. /**
  205. * @brief Disable specified EMAC interrupt
  206. *
  207. * @param[in] emac The pointer of the specified EMAC module
  208. * @param[in] u32eIntSel Interrupt type select
  209. * - \ref EMAC_INTEN_RXIEN_Msk : Receive
  210. * - \ref EMAC_INTEN_CRCEIEN_Msk : CRC Error
  211. * - \ref EMAC_INTEN_RXOVIEN_Msk : Receive FIFO Overflow
  212. * - \ref EMAC_INTEN_LPIEN_Msk : Long Packet
  213. * - \ref EMAC_INTEN_RXGDIEN_Msk : Receive Good
  214. * - \ref EMAC_INTEN_ALIEIEN_Msk : Alignment Error
  215. * - \ref EMAC_INTEN_RPIEN_Msk : Runt Packet
  216. * - \ref EMAC_INTEN_MPCOVIEN_Msk : Miss Packet Counter Overrun
  217. * - \ref EMAC_INTEN_MFLEIEN_Msk : Maximum Frame Length Exceed
  218. * - \ref EMAC_INTEN_DENIEN_Msk : DMA Early Notification
  219. * - \ref EMAC_INTEN_RDUIEN_Msk : Receive Descriptor Unavailable
  220. * - \ref EMAC_INTEN_RXBEIEN_Msk : Receive Bus Error
  221. * - \ref EMAC_INTEN_CFRIEN_Msk : Control Frame Receive
  222. * - \ref EMAC_INTEN_WOLIEN_Msk : Wake on LAN Interrupt
  223. * - \ref EMAC_INTEN_TXIEN_Msk : Transmit
  224. * - \ref EMAC_INTEN_TXUDIEN_Msk : Transmit FIFO Underflow
  225. * - \ref EMAC_INTEN_TXCPIEN_Msk : Transmit Completion
  226. * - \ref EMAC_INTEN_EXDEFIEN_Msk : Defer Exceed
  227. * - \ref EMAC_INTEN_NCSIEN_Msk : No Carrier Sense
  228. * - \ref EMAC_INTEN_TXABTIEN_Msk : Transmit Abort
  229. * - \ref EMAC_INTEN_LCIEN_Msk : Late Collision
  230. * - \ref EMAC_INTEN_TDUIEN_Msk : Transmit Descriptor Unavailable
  231. * - \ref EMAC_INTEN_TXBEIEN_Msk : Transmit Bus Error
  232. * - \ref EMAC_INTEN_TSALMIEN_Msk : Time Stamp Alarm
  233. *
  234. * @return None
  235. *
  236. * @details This macro disable specified EMAC interrupt.
  237. * \hideinitializer
  238. */
  239. #define EMAC_DISABLE_INT(EMAC, u32eIntSel) ((EMAC)->INTEN &= ~ (u32eIntSel))
  240. /**
  241. * @brief Get specified interrupt flag/status
  242. *
  243. * @param[in] emac The pointer of the specified EMAC module
  244. * @param[in] u32eIntTypeFlag Interrupt Type Flag, should be
  245. * - \ref EMAC_INTSTS_RXIF_Msk : Receive
  246. * - \ref EMAC_INTSTS_CRCEIF_Msk : CRC Error
  247. * - \ref EMAC_INTSTS_RXOVIF_Msk : Receive FIFO Overflow
  248. * - \ref EMAC_INTSTS_LPIF_Msk : Long Packet
  249. * - \ref EMAC_INTSTS_RXGDIF_Msk : Receive Good
  250. * - \ref EMAC_INTSTS_ALIEIF_Msk : Alignment Error
  251. * - \ref EMAC_INTSTS_RPIF_Msk : Runt Packet
  252. * - \ref EMAC_INTSTS_MPCOVIF_Msk : Missed Packet Counter
  253. * - \ref EMAC_INTSTS_MFLEIF_Msk : Maximum Frame Length Exceed
  254. * - \ref EMAC_INTSTS_DENIF_Msk : DMA Early Notification
  255. * - \ref EMAC_INTSTS_RDUIF_Msk : Receive Descriptor Unavailable
  256. * - \ref EMAC_INTSTS_RXBEIF_Msk : Receive Bus Error
  257. * - \ref EMAC_INTSTS_CFRIF_Msk : Control Frame Receive
  258. * - \ref EMAC_INTSTS_WOLIF_Msk : Wake on LAN
  259. * - \ref EMAC_INTSTS_TXIF_Msk : Transmit
  260. * - \ref EMAC_INTSTS_TXUDIF_Msk : Transmit FIFO Underflow
  261. * - \ref EMAC_INTSTS_TXCPIF_Msk : Transmit Completion
  262. * - \ref EMAC_INTSTS_EXDEFIF_Msk : Defer Exceed
  263. * - \ref EMAC_INTSTS_NCSIF_Msk : No Carrier Sense
  264. * - \ref EMAC_INTSTS_TXABTIF_Msk : Transmit Abort
  265. * - \ref EMAC_INTSTS_LCIF_Msk : Late Collision
  266. * - \ref EMAC_INTSTS_TDUIF_Msk : Transmit Descriptor Unavailable
  267. * - \ref EMAC_INTSTS_TXBEIF_Msk : Transmit Bus Error
  268. * - \ref EMAC_INTSTS_TSALMIF_Msk : Time Stamp Alarm
  269. *
  270. * @return None
  271. *
  272. * @details This macro get specified interrupt flag or interrupt indicator status.
  273. * \hideinitializer
  274. */
  275. #define EMAC_GET_INT_FLAG(EMAC, u32eIntTypeFlag) (((EMAC)->INTSTS & (u32eIntTypeFlag))?1:0)
  276. /**
  277. * @brief Clear specified interrupt flag/status
  278. *
  279. * @param[in] emac The pointer of the specified EMAC module
  280. * @param[in] u32eIntTypeFlag Interrupt Type Flag, should be
  281. * - \ref EMAC_INTSTS_RXIF_Msk : Receive
  282. * - \ref EMAC_INTSTS_CRCEIF_Msk : CRC Error
  283. * - \ref EMAC_INTSTS_RXOVIF_Msk : Receive FIFO Overflow
  284. * - \ref EMAC_INTSTS_LPIF_Msk : Long Packet
  285. * - \ref EMAC_INTSTS_RXGDIF_Msk : Receive Good
  286. * - \ref EMAC_INTSTS_ALIEIF_Msk : Alignment Error
  287. * - \ref EMAC_INTSTS_RPIF_Msk : Runt Packet
  288. * - \ref EMAC_INTSTS_MPCOVIF_Msk : Missed Packet Counter
  289. * - \ref EMAC_INTSTS_MFLEIF_Msk : Maximum Frame Length Exceed
  290. * - \ref EMAC_INTSTS_DENIF_Msk : DMA Early Notification
  291. * - \ref EMAC_INTSTS_RDUIF_Msk : Receive Descriptor Unavailable
  292. * - \ref EMAC_INTSTS_RXBEIF_Msk : Receive Bus Error
  293. * - \ref EMAC_INTSTS_CFRIF_Msk : Control Frame Receive
  294. * - \ref EMAC_INTSTS_WOLIF_Msk : Wake on LAN
  295. * - \ref EMAC_INTSTS_TXIF_Msk : Transmit
  296. * - \ref EMAC_INTSTS_TXUDIF_Msk : Transmit FIFO Underflow
  297. * - \ref EMAC_INTSTS_TXCPIF_Msk : Transmit Completion
  298. * - \ref EMAC_INTSTS_EXDEFIF_Msk : Defer Exceed
  299. * - \ref EMAC_INTSTS_NCSIF_Msk : No Carrier Sense
  300. * - \ref EMAC_INTSTS_TXABTIF_Msk : Transmit Abort
  301. * - \ref EMAC_INTSTS_LCIF_Msk : Late Collision
  302. * - \ref EMAC_INTSTS_TDUIF_Msk : Transmit Descriptor Unavailable
  303. * - \ref EMAC_INTSTS_TXBEIF_Msk : Transmit Bus Error
  304. * - \ref EMAC_INTSTS_TSALMIF_Msk : Time Stamp Alarm
  305. *
  306. * @retval 0 The specified interrupt is not happened.
  307. * 1 The specified interrupt is happened.
  308. *
  309. * @details This macro clear specified interrupt flag or interrupt indicator status.
  310. * \hideinitializer
  311. */
  312. #define EMAC_CLEAR_INT_FLAG(EMAC, u32eIntTypeFlag) ((EMAC)->INTSTS |= (u32eIntTypeFlag))
  313. #define EMAC_CLEAR_ALL_INT_FLAG(EMAC) ((EMAC)->INTSTS |= (EMAC)->INTSTS)
  314. void EMAC_Open(EMAC_MEMMGR_T *psMemMgr, uint8_t *pu8MacAddr);
  315. void EMAC_Close(EMAC_T *EMAC);
  316. void EMAC_SetMacAddr(EMAC_T *EMAC, uint8_t *pu8MacAddr);
  317. void EMAC_EnableCamEntry(EMAC_T *EMAC, uint32_t u32Entry, uint8_t pu8MacAddr[]);
  318. void EMAC_DisableCamEntry(EMAC_T *EMAC, uint32_t u32Entry);
  319. uint32_t EMAC_RecvPkt(EMAC_MEMMGR_T *psMemMgr, uint8_t *pu8Data, uint32_t *pu32Size);
  320. uint32_t EMAC_RecvPktTS(EMAC_MEMMGR_T *psMemMgr, uint8_t *pu8Data, uint32_t *pu32Size, uint32_t *pu32Sec, uint32_t *pu32Nsec);
  321. void EMAC_RecvPktDone(EMAC_MEMMGR_T *psMemMgr);
  322. uint32_t EMAC_SendPkt(EMAC_MEMMGR_T *psMemMgr, uint8_t *pu8Data, uint32_t u32Size);
  323. uint32_t EMAC_SendPktDone(EMAC_MEMMGR_T *psMemMgr);
  324. uint32_t EMAC_SendPktDoneTS(EMAC_MEMMGR_T *psMemMgr, uint32_t *pu32Sec, uint32_t *pu32Nsec);
  325. void EMAC_EnableTS(EMAC_T *EMAC, uint32_t u32Sec, uint32_t u32Nsec);
  326. void EMAC_DisableTS(EMAC_T *EMAC);
  327. void EMAC_GetTime(EMAC_T *EMAC, uint32_t *pu32Sec, uint32_t *pu32Nsec);
  328. void EMAC_SetTime(EMAC_T *EMAC, uint32_t u32Sec, uint32_t u32Nsec);
  329. void EMAC_UpdateTime(EMAC_T *EMAC, uint32_t u32Neg, uint32_t u32Sec, uint32_t u32Nsec);
  330. void EMAC_EnableAlarm(EMAC_T *EMAC, uint32_t u32Sec, uint32_t u32Nsec);
  331. void EMAC_DisableAlarm(EMAC_T *EMAC);
  332. uint32_t EMAC_CheckLinkStatus(EMAC_T *EMAC);
  333. void EMAC_Reset(EMAC_T *EMAC);
  334. void EMAC_PhyInit(EMAC_T *EMAC);
  335. int32_t EMAC_FillCamEntry(EMAC_T *EMAC, uint8_t pu8MacAddr[]);
  336. uint8_t *EMAC_ClaimFreeTXBuf(EMAC_MEMMGR_T *psMemMgr);
  337. uint32_t EMAC_GetAvailRXBufSize(EMAC_MEMMGR_T *psMemMgr, uint8_t **ppuDataBuf);
  338. uint32_t EMAC_SendPktWoCopy(EMAC_MEMMGR_T *psMemMgr, uint32_t u32Size);
  339. EMAC_DESCRIPTOR_T * EMAC_RecvPktDoneWoRxTrigger(EMAC_MEMMGR_T *psMemMgr);
  340. void EMAC_RxTrigger(EMAC_MEMMGR_T *psMemMgr, EMAC_DESCRIPTOR_T * rx_desc);
  341. /*@}*/ /* end of group EMAC_EXPORTED_FUNCTIONS */
  342. /*@}*/ /* end of group EMAC_Driver */
  343. /*@}*/ /* end of group Standard_Driver */
  344. #ifdef __cplusplus
  345. }
  346. #endif
  347. #endif /* __NU_EMAC_H__ */
  348. /*** (C) COPYRIGHT 2016 Nuvoton Technology Corp. ***/