nu_emac.h 15 KB

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