nu_whc.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. /**************************************************************************//**
  2. * @file nu_whc.h
  3. * @brief WHC driver header file
  4. *
  5. * SPDX-License-Identifier: Apache-2.0
  6. * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved.
  7. *****************************************************************************/
  8. #ifndef __NU_WHC_H__
  9. #define __NU_WHC_H__
  10. #ifdef __cplusplus
  11. extern "C"
  12. {
  13. #endif
  14. /** @addtogroup Standard_Driver Standard Driver
  15. @{
  16. */
  17. /** @addtogroup WHC_Driver WHC Driver
  18. @{
  19. */
  20. /** @addtogroup WHC_EXPORTED_CONSTANTS WHC Exported Constants
  21. @{
  22. */
  23. #define WHC_CH 4ul /*!<WHC channel number \hideinitializer */
  24. #define WHC_BUFFER_LEN 4ul /*!<WHC buffer size in unsigned int \hideinitializer */
  25. #define WHC_RUN_MODE 0 /*!<Specific core is in normal run mode \hideinitializer */
  26. #define WHC_POFF_MODE 1 /*!<Specific core is in power off mode \hideinitializer */
  27. #define WHC_PD_MODE 2 /*!<Specific core is in power down mode \hideinitializer */
  28. /*@}*/ /* end of group WHC_EXPORTED_CONSTANTS */
  29. /** @addtogroup WHC_EXPORTED_FUNCTIONS WHC Exported Functions
  30. @{
  31. */
  32. /**
  33. * @brief Recall message
  34. *
  35. * @param[in] whc The pointer of the specified WHC module.
  36. * @param[in] u32Ch WHC channel, valid channel numbers are 0~3
  37. * \hideinitializer
  38. */
  39. #define WHC_RECALL_MSG(whc, u32Ch) ((whc)->TXCTL |= (1ul << (u32Ch + WHC_TXCTL_CH0RC_Pos)))
  40. /**
  41. * @brief
  42. *
  43. * @param[in] whc The pointer of the specified WHC module.
  44. * @param[in] u32Ch WHC channel, valid channel numbers are 0~3
  45. * \hideinitializer
  46. */
  47. #define WHC_IS_TX_READY(whc, u32Ch) ((whc)->TXSTS & (1 << u32Ch))
  48. /**
  49. * @brief
  50. *
  51. * @param[in] whc The pointer of the specified WHC module.
  52. * @param[in] u32Ch WHC channel, valid channel numbers are 0~3
  53. * \hideinitializer
  54. */
  55. #define WHC_IS_RX_READY(whc, u32Ch) ((whc)->RXSTS & (1 << u32Ch))
  56. /**
  57. * @brief Enable specified WHC interrupt
  58. *
  59. * @param[in] whc The pointer of the specified WHC module
  60. * @param[in] u32IntSel Interrupt type select
  61. * - \ref WHC_INTEN_RST0IEN_Msk
  62. * - \ref WHC_INTEN_POFF0IEN_Msk
  63. * - \ref WHC_INTEN_PD0IEN_Msk
  64. * - \ref WHC_INTEN_RST1IEN_Msk
  65. * - \ref WHC_INTEN_POFF1IEN_Msk
  66. * - \ref WHC_INTEN_PD1IEN_Msk
  67. * - \ref WHC_INTEN_GI0IEN_Msk
  68. * - \ref WHC_INTEN_GI1IEN_Msk
  69. * - \ref WHC_INTEN_GI2IEN_Msk
  70. * - \ref WHC_INTEN_GI3IEN_Msk
  71. * - \ref WHC_INTEN_TX0IEN_Msk
  72. * - \ref WHC_INTEN_TX1IEN_Msk
  73. * - \ref WHC_INTEN_TX2IEN_Msk
  74. * - \ref WHC_INTEN_TX3IEN_Msk
  75. * - \ref WHC_INTEN_RX0IEN_Msk
  76. * - \ref WHC_INTEN_RX1IEN_Msk
  77. * - \ref WHC_INTEN_RX2IEN_Msk
  78. * - \ref WHC_INTEN_RX3IEN_Msk
  79. * \hideinitializer
  80. */
  81. #define WHC_ENABLE_INT(whc, u32IntSel) ((whc)->INTEN |= (u32IntSel))
  82. /**
  83. * @brief Disable specified WHC interrupt
  84. *
  85. * @param[in] whc The pointer of the specified WHC module
  86. * @param[in] u32IntSel Interrupt type select
  87. * - \ref WHC_INTEN_RST0IEN_Msk
  88. * - \ref WHC_INTEN_POFF0IEN_Msk
  89. * - \ref WHC_INTEN_PD0IEN_Msk
  90. * - \ref WHC_INTEN_RST1IEN_Msk
  91. * - \ref WHC_INTEN_POFF1IEN_Msk
  92. * - \ref WHC_INTEN_PD1IEN_Msk
  93. * - \ref WHC_INTEN_GI0IEN_Msk
  94. * - \ref WHC_INTEN_GI1IEN_Msk
  95. * - \ref WHC_INTEN_GI2IEN_Msk
  96. * - \ref WHC_INTEN_GI3IEN_Msk
  97. * - \ref WHC_INTEN_TX0IEN_Msk
  98. * - \ref WHC_INTEN_TX1IEN_Msk
  99. * - \ref WHC_INTEN_TX2IEN_Msk
  100. * - \ref WHC_INTEN_TX3IEN_Msk
  101. * - \ref WHC_INTEN_RX0IEN_Msk
  102. * - \ref WHC_INTEN_RX1IEN_Msk
  103. * - \ref WHC_INTEN_RX2IEN_Msk
  104. * - \ref WHC_INTEN_RX3IEN_Msk
  105. * \hideinitializer
  106. */
  107. #define WHC_DISABLE_INT(whc, u32IntSel) ((whc)->INTEN &= ~(u32IntSel))
  108. /**
  109. * @brief Get specified interrupt flag
  110. *
  111. * @param[in] whc The pointer of the specified WHC module
  112. * @param[in] u32IntTypeFlag Interrupt Type Flag, should be
  113. * - \ref WHC_INTSTS_RST0IF_Msk
  114. * - \ref WHC_INTSTS_POFF0IF_Msk
  115. * - \ref WHC_INTSTS_PD0IF_Msk
  116. * - \ref WHC_INTSTS_RST1IF_Msk
  117. * - \ref WHC_INTSTS_POFF1IF_Msk
  118. * - \ref WHC_INTSTS_PD1IF_Msk
  119. * - \ref WHC_INTSTS_GI0IF_Msk
  120. * - \ref WHC_INTSTS_GI1IF_Msk
  121. * - \ref WHC_INTSTS_GI2IF_Msk
  122. * - \ref WHC_INTSTS_GI3IF_Msk
  123. * - \ref WHC_INTSTS_TX0IF_Msk
  124. * - \ref WHC_INTSTS_TX1IF_Msk
  125. * - \ref WHC_INTSTS_TX2IF_Msk
  126. * - \ref WHC_INTSTS_TX3IF_Msk
  127. * - \ref WHC_INTSTS_RX0IF_Msk
  128. * - \ref WHC_INTSTS_RX1IF_Msk
  129. * - \ref WHC_INTSTS_RX2IF_Msk
  130. * - \ref WHC_INTSTS_RX3IF_Msk
  131. *
  132. * @retval 0 The specified interrupt is not happened.
  133. * 1 The specified interrupt is happened.
  134. * \hideinitializer
  135. */
  136. #define WHC_GET_INT_FLAG(whc, u32IntTypeFlag) (((whc)->INTSTS & (u32IntTypeFlag))?1:0)
  137. /**
  138. * @brief Clear specified interrupt flag
  139. *
  140. * @param[in] whc The pointer of the specified WHC module
  141. * @param[in] u32IntTypeFlag Interrupt Type Flag, should be
  142. * - \ref WHC_INTSTS_RST0IF_Msk
  143. * - \ref WHC_INTSTS_POFF0IF_Msk
  144. * - \ref WHC_INTSTS_PD0IF_Msk
  145. * - \ref WHC_INTSTS_RST1IF_Msk
  146. * - \ref WHC_INTSTS_POFF1IF_Msk
  147. * - \ref WHC_INTSTS_PD1IF_Msk
  148. * - \ref WHC_INTSTS_GI0IF_Msk
  149. * - \ref WHC_INTSTS_GI1IF_Msk
  150. * - \ref WHC_INTSTS_GI2IF_Msk
  151. * - \ref WHC_INTSTS_GI3IF_Msk
  152. * - \ref WHC_INTSTS_TX0IF_Msk
  153. * - \ref WHC_INTSTS_TX1IF_Msk
  154. * - \ref WHC_INTSTS_TX2IF_Msk
  155. * - \ref WHC_INTSTS_TX3IF_Msk
  156. * - \ref WHC_INTSTS_RX0IF_Msk
  157. * - \ref WHC_INTSTS_RX1IF_Msk
  158. * - \ref WHC_INTSTS_RX2IF_Msk
  159. * - \ref WHC_INTSTS_RX3IF_Msk
  160. * \hideinitializer
  161. */
  162. #define WHC_CLR_INT_FLAG(whc, u32IntTypeFlag) ((whc)->INTSTS = (u32IntTypeFlag))
  163. /**
  164. * @brief Trigger WHC general event interrupt
  165. * @param[in] whc The pointer of the specified WHC module
  166. * @param[in] u32IntNum General event interrupt number, valid number are 0~3
  167. *
  168. * \hideinitializer
  169. */
  170. #define WHC_TRIGGER_GINT(whc, u32IntNum) ((whc)->GINTTRG = (1ul << u32IntNum))
  171. /**
  172. * @brief Get counter part reset flag
  173. * @param[in] whc The pointer of the specified WHC module
  174. * @retval The combination of WHC_CPSTS_WDTRF_Msk, WHC_CPSTS_SYSRF_Msk, and WHC_CPSTS_CPURF_Msk
  175. *
  176. * \hideinitializer
  177. */
  178. #define WHC_GET_RST_FLAG(whc) ((whc)->CPSTS & (WHC_CPSTS_WDTRF_Msk | WHC_CPSTS_SYSRF_Msk | WHC_CPSTS_CPURF_Msk))
  179. /**
  180. * @brief Clear counter part reset flag
  181. * @param[in] whc The pointer of the specified WHC module
  182. *
  183. * \hideinitializer
  184. */
  185. #define WHC_CLR_RST_FLAG(whc) ((whc)->CPSTS = (whc)->CPSTS)
  186. /**
  187. * @brief Set wakeup up source
  188. *
  189. * @param[in] whc The pointer of the specified WHC module
  190. * @param[in] u32WakeupSrc Wake up source. Should be the combination of:
  191. * - \ref WHC_WKCTL_RST0WKEN_Msk
  192. * - \ref WHC_WKCTL_POFF0WKEN_Msk
  193. * - \ref WHC_WKCTL_PD0WKEN_Msk
  194. * - \ref WHC_WKCTL_RST1WKEN_Msk
  195. * - \ref WHC_WKCTL_POFF1WKEN_Msk
  196. * - \ref WHC_WKCTL_PD1WKEN_Msk
  197. * - \ref WHC_WKCTL_GI0WKEN_Msk
  198. * - \ref WHC_WKCTL_GI1WKEN_Msk
  199. * - \ref WHC_WKCTL_GI2WKEN_Msk
  200. * - \ref WHC_WKCTL_GI3WKEN_Msk
  201. * - \ref WHC_WKCTL_TX0WKEN_Msk
  202. * - \ref WHC_WKCTL_TX1WKEN_Msk
  203. * - \ref WHC_WKCTL_TX2WKEN_Msk
  204. * - \ref WHC_WKCTL_TX3WKEN_Msk
  205. * - \ref WHC_WKCTL_RX0WKEN_Msk
  206. * - \ref WHC_WKCTL_RX1WKEN_Msk
  207. * - \ref WHC_WKCTL_RX2WKEN_Msk
  208. * - \ref WHC_WKCTL_RX3WKEN_Msk
  209. * \hideinitializer
  210. */
  211. #define WHC_SET_WAKEUP_SRC(whc,u32WakeFlag) ((whc)->WKCTL |= (u32WakeFlag))
  212. /**
  213. * @brief Clear wakeup up source
  214. *
  215. * @param[in] whc The pointer of the specified WHC module
  216. * @param[in] u32WakeupSrc Wake up source. Should be the combination of:
  217. * - \ref WHC_WKCTL_RST0WKEN_Msk
  218. * - \ref WHC_WKCTL_POFF0WKEN_Msk
  219. * - \ref WHC_WKCTL_PD0WKEN_Msk
  220. * - \ref WHC_WKCTL_RST1WKEN_Msk
  221. * - \ref WHC_WKCTL_POFF1WKEN_Msk
  222. * - \ref WHC_WKCTL_PD1WKEN_Msk
  223. * - \ref WHC_WKCTL_GI0WKEN_Msk
  224. * - \ref WHC_WKCTL_GI1WKEN_Msk
  225. * - \ref WHC_WKCTL_GI2WKEN_Msk
  226. * - \ref WHC_WKCTL_GI3WKEN_Msk
  227. * - \ref WHC_WKCTL_TX0WKEN_Msk
  228. * - \ref WHC_WKCTL_TX1WKEN_Msk
  229. * - \ref WHC_WKCTL_TX2WKEN_Msk
  230. * - \ref WHC_WKCTL_TX3WKEN_Msk
  231. * - \ref WHC_WKCTL_RX0WKEN_Msk
  232. * - \ref WHC_WKCTL_RX1WKEN_Msk
  233. * - \ref WHC_WKCTL_RX2WKEN_Msk
  234. * - \ref WHC_WKCTL_RX3WKEN_Msk
  235. * \hideinitializer
  236. */
  237. #define WHC_CLR_WAKEUP_SRC(whc,u32WakeFlag) ((whc)->WKCTL &= ~(u32WakeFlag))
  238. int WHC_Send(WHC_T *whc, uint32_t u32Ch, uint32_t *pu32TxBuf);
  239. int WHC_Recv(WHC_T *whc, uint32_t u32Ch, uint32_t *pu32RxBuf);
  240. int WHC_GetCPSts(WHC_T *whc, uint32_t u32Core);
  241. /*@}*/ /* end of group WHC_EXPORTED_FUNCTIONS */
  242. /*@}*/ /* end of group WHC_Driver */
  243. /*@}*/ /* end of group Standard_Driver */
  244. #ifdef __cplusplus
  245. }
  246. #endif
  247. #endif