fsl_gpc.h 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651
  1. /*
  2. * Copyright 2019-2021 NXP
  3. * All rights reserved.
  4. *
  5. *
  6. * SPDX-License-Identifier: BSD-3-Clause
  7. */
  8. #ifndef _FSL_GPC_H_
  9. #define _FSL_GPC_H_
  10. #include "fsl_common.h"
  11. /*!
  12. * @addtogroup gpc
  13. * @{
  14. */
  15. /*******************************************************************************
  16. * Definitions
  17. ******************************************************************************/
  18. /*! @name Driver version */
  19. /*@{*/
  20. /*! @brief GPC driver version 2.2.0. */
  21. #define FSL_GPC_RIVER_VERSION (MAKE_VERSION(2, 2, 0))
  22. /*! @}*/
  23. #define GPC_RESERVED_USE_MACRO 0xFFFFFFFFU
  24. /* GPC CPU module step control register offset. */
  25. #define GPC_CM_SLEEP_SSAR_CTRL_OFFSET (0x200)
  26. #define GPC_CM_SLEEP_LPCG_CTRL_OFFSET (0x208)
  27. #define GPC_CM_SLEEP_PLL_CTRL_OFFSET (0x210)
  28. #define GPC_CM_SLEEP_ISO_CTRL_OFFSET (0x218)
  29. #define GPC_CM_SLEEP_RESET_CTRL_OFFSET (0x220)
  30. #define GPC_CM_SLEEP_POWER_CTRL_OFFSET (0x228)
  31. #define GPC_CM_WAKEUP_POWER_CTRL_OFFSET (0x290)
  32. #define GPC_CM_WAKEUP_RESET_CTRL_OFFSET (0x298)
  33. #define GPC_CM_WAKEUP_ISO_CTRL_OFFSET (0x2A0)
  34. #define GPC_CM_WAKEUP_PLL_CTRL_OFFSET (0x2A8)
  35. #define GPC_CM_WAKEUP_LPCG_CTRL_OFFSET (0x2B0)
  36. #define GPC_CM_WAKEUP_SSAR_CTRL_OFFSET (0x2B8)
  37. /* GPC set point module step control register offset. */
  38. #define GPC_SP_SSAR_SAVE_CTRL_OFFSET (0x100)
  39. #define GPC_SP_LPCG_OFF_CTRL_OFFSET (0x110)
  40. #define GPC_SP_GROUP_DOWN_CTRL_OFFSET (0x120)
  41. #define GPC_SP_ROOT_DOWN_CTRL_OFFSET (0x130)
  42. #define GPC_SP_PLL_OFF_CTRL_OFFSET (0x140)
  43. #define GPC_SP_ISO_ON_CTRL_OFFSET (0x150)
  44. #define GPC_SP_RESET_EARLY_CTRL_OFFSET (0x160)
  45. #define GPC_SP_POWER_OFF_CTRL_OFFSET (0x170)
  46. #define GPC_SP_BIAS_OFF_CTRL_OFFSET (0x180)
  47. #define GPC_SP_BG_PLDO_OFF_CTRL_OFFSET (0x190)
  48. #define GPC_SP_LDO_PRE_CTRL_OFFSET (0x1A0)
  49. #define GPC_SP_DCDC_DOWN_CTRL_OFFSET (0x1B0)
  50. #define GPC_SP_DCDC_UP_CTRL_OFFSET (0x2B0)
  51. #define GPC_SP_LDO_POST_CTRL_OFFSET (0x210)
  52. #define GPC_SP_BG_PLDO_ON_CTRL_OFFSET (0x220)
  53. #define GPC_SP_BIAS_ON_CTRL_OFFSET (0x230)
  54. #define GPC_SP_POWER_ON_CTRL_OFFSET (0x240)
  55. #define GPC_SP_RESET_LATE_CTRL_OFFSET (0x250)
  56. #define GPC_SP_ISO_OFF_CTRL_OFFSET (0x260)
  57. #define GPC_SP_PLL_ON_CTRL_OFFSET (0x270)
  58. #define GPC_SP_ROOT_UP_CTRL_OFFSET (0x280)
  59. #define GPC_SP_GROUP_UP_CTRL_OFFSET (0x290)
  60. #define GPC_SP_LPCG_ON_CTRL_OFFSET (0x2A0)
  61. #define GPC_SP_SSAR_RESTORE_CTRL_OFFSET (0x2B0)
  62. /* GPC standby module step control register offset. */
  63. #define GPC_STBY_LPCG_IN_CTRL_OFFSET (0xF0)
  64. #define GPC_STBY_PLL_IN_CTRL_OFFSET (0x100)
  65. #define GPC_STBY_BIAS_IN_CTRL_OFFSET (0x110)
  66. #define GPC_STBY_PLDO_IN_CTRL_OFFSET (0x120)
  67. #define GPC_STBY_BANDGAP_IN_CTRL_OFFSET (0x128)
  68. #define GPC_STBY_LDO_IN_CTRL_OFFSET (0x130)
  69. #define GPC_STBY_DCDC_IN_CTRL_OFFSET (0x140)
  70. #define GPC_STBY_PMIC_IN_CTRL_OFFSET (0x150)
  71. #define GPC_STBY_PMIC_OUT_CTRL_OFFSET (0x200)
  72. #define GPC_STBY_DCDC_OUT_CTRL_OFFSET (0x210)
  73. #define GPC_STBY_LDO_OUT_CTRL_OFFSET (0x220)
  74. #define GPC_STBY_BANDGAP_OUT_CTRL_OFFSET (0x238)
  75. #define GPC_STBY_PLDO_OUT_CTRL_OFFSET (0x238)
  76. #define GPC_STBY_BIAS_OUT_CTRL_OFFSET (0x240)
  77. #define GPC_STBY_PLL_OUT_CTRL_OFFSET (0x250)
  78. #define GPC_STBY_LPCG_OUT_CTRL_OFFSET (0x260)
  79. /* GPC CPU module step register offset. */
  80. #define GPC_CM_STEP_REG_OFFSET \
  81. { \
  82. GPC_CM_SLEEP_SSAR_CTRL_OFFSET, GPC_CM_SLEEP_LPCG_CTRL_OFFSET, GPC_CM_SLEEP_PLL_CTRL_OFFSET, \
  83. GPC_CM_SLEEP_ISO_CTRL_OFFSET, GPC_CM_SLEEP_RESET_CTRL_OFFSET, GPC_CM_SLEEP_POWER_CTRL_OFFSET, \
  84. GPC_RESERVED_USE_MACRO, GPC_RESERVED_USE_MACRO, GPC_RESERVED_USE_MACRO, GPC_RESERVED_USE_MACRO, \
  85. GPC_CM_WAKEUP_POWER_CTRL_OFFSET, GPC_CM_WAKEUP_RESET_CTRL_OFFSET, GPC_CM_WAKEUP_ISO_CTRL_OFFSET, \
  86. GPC_CM_WAKEUP_PLL_CTRL_OFFSET, GPC_CM_WAKEUP_LPCG_CTRL_OFFSET, GPC_CM_WAKEUP_SSAR_CTRL_OFFSET, \
  87. }
  88. /* GPC set point module step control register offset. */
  89. #define GPC_SP_STEP_REG_OFFSET \
  90. { \
  91. GPC_SP_SSAR_SAVE_CTRL_OFFSET, GPC_SP_LPCG_OFF_CTRL_OFFSET, GPC_SP_GROUP_DOWN_CTRL_OFFSET, \
  92. GPC_SP_ROOT_DOWN_CTRL_OFFSET, GPC_SP_PLL_OFF_CTRL_OFFSET, GPC_SP_ISO_ON_CTRL_OFFSET, \
  93. GPC_SP_RESET_EARLY_CTRL_OFFSET, GPC_SP_POWER_OFF_CTRL_OFFSET, GPC_SP_BIAS_OFF_CTRL_OFFSET, \
  94. GPC_SP_BG_PLDO_OFF_CTRL_OFFSET, GPC_SP_LDO_PRE_CTRL_OFFSET, GPC_SP_DCDC_DOWN_CTRL_OFFSET, \
  95. GPC_SP_DCDC_UP_CTRL_OFFSET, GPC_SP_LDO_POST_CTRL_OFFSET, GPC_SP_BG_PLDO_ON_CTRL_OFFSET, \
  96. GPC_SP_BIAS_ON_CTRL_OFFSET, GPC_SP_POWER_ON_CTRL_OFFSET, GPC_SP_RESET_LATE_CTRL_OFFSET, \
  97. GPC_SP_ISO_OFF_CTRL_OFFSET, GPC_SP_PLL_ON_CTRL_OFFSET, GPC_SP_ROOT_UP_CTRL_OFFSET, \
  98. GPC_SP_GROUP_UP_CTRL_OFFSET, GPC_SP_LPCG_ON_CTRL_OFFSET, GPC_SP_SSAR_RESTORE_CTRL_OFFSET, \
  99. }
  100. /* GPC standby module step register offset. */
  101. #define GPC_STBY_STEP_REG_OFFSET \
  102. { \
  103. GPC_STBY_LPCG_IN_CTRL_OFFSET, GPC_STBY_PLL_IN_CTRL_OFFSET, GPC_STBY_BIAS_IN_CTRL_OFFSET, \
  104. GPC_STBY_PLDO_IN_CTRL_OFFSET, GPC_STBY_BANDGAP_IN_CTRL_OFFSET, GPC_STBY_LDO_IN_CTRL_OFFSET, \
  105. GPC_STBY_DCDC_IN_CTRL_OFFSET, GPC_STBY_PMIC_IN_CTRL_OFFSET, GPC_STBY_PMIC_OUT_CTRL_OFFSET, \
  106. GPC_STBY_DCDC_OUT_CTRL_OFFSET, GPC_STBY_LDO_OUT_CTRL_OFFSET, GPC_STBY_BANDGAP_OUT_CTRL_OFFSET, \
  107. GPC_STBY_PLDO_OUT_CTRL_OFFSET, GPC_STBY_BIAS_OUT_CTRL_OFFSET, GPC_STBY_PLL_OUT_CTRL_OFFSET, \
  108. GPC_STBY_LPCG_OUT_CTRL_OFFSET, \
  109. }
  110. /* Make/Get status. */
  111. /* Make the mask/shift value of GPC status register in a variable. */
  112. #define GPC_STAT(mask, shift) (uint32_t)(((uint32_t)(shift) << 16UL) + ((uint32_t)(mask) >> (uint32_t)(shift)))
  113. #define GPC_CM_ALL_INTERRUPT_STATUS \
  114. (GPC_CPU_MODE_CTRL_CM_INT_CTRL_SP_REQ_NOT_ALLOWED_SLEEP_INT_MASK | \
  115. GPC_CPU_MODE_CTRL_CM_INT_CTRL_SP_REQ_NOT_ALLOWED_WAKEUP_INT_MASK | \
  116. GPC_CPU_MODE_CTRL_CM_INT_CTRL_SP_REQ_NOT_ALLOWED_SOFT_INT_MASK)
  117. /*! @brief _gpc_cm_non_irq_wakeup_request GPC Non-IRQ wakeup request. */
  118. enum
  119. {
  120. kGPC_CM_EventWakeupRequest =
  121. GPC_CPU_MODE_CTRL_CM_NON_IRQ_WAKEUP_MASK_EVENT_WAKEUP_MASK_MASK, /*!< Event wakeup request. */
  122. kGPC_CM_DebugWakeupRequest =
  123. GPC_CPU_MODE_CTRL_CM_NON_IRQ_WAKEUP_MASK_DEBUG_WAKEUP_MASK_MASK, /*!< Debug wakeup request. */
  124. };
  125. /* @brief _gpc_setpoint_map GPC setpoint map. */
  126. enum
  127. {
  128. kGPC_SetPoint0 = 1UL << 0UL, /*!< GPC set point 0. */
  129. kGPC_SetPoint1 = 1UL << 1UL, /*!< GPC set point 1. */
  130. kGPC_SetPoint2 = 1UL << 2UL, /*!< GPC set point 2. */
  131. kGPC_SetPoint3 = 1UL << 3UL, /*!< GPC set point 3. */
  132. kGPC_SetPoint4 = 1UL << 4UL, /*!< GPC set point 4. */
  133. kGPC_SetPoint5 = 1UL << 5UL, /*!< GPC set point 5. */
  134. kGPC_SetPoint6 = 1UL << 6UL, /*!< GPC set point 6. */
  135. kGPC_SetPoint7 = 1UL << 7UL, /*!< GPC set point 7. */
  136. kGPC_SetPoint8 = 1UL << 8UL, /*!< GPC set point 8. */
  137. kGPC_SetPoint9 = 1UL << 9UL, /*!< GPC set point 9. */
  138. kGPC_SetPoint10 = 1UL << 10UL, /*!< GPC set point 10. */
  139. kGPC_SetPoint11 = 1UL << 11UL, /*!< GPC set point 11. */
  140. kGPC_SetPoint12 = 1UL << 12UL, /*!< GPC set point 12. */
  141. kGPC_SetPoint13 = 1UL << 13UL, /*!< GPC set point 13. */
  142. kGPC_SetPoint14 = 1UL << 14UL, /*!< GPC set point 14. */
  143. kGPC_SetPoint15 = 1UL << 15UL, /*!< GPC set point 15. */
  144. };
  145. /*!
  146. * @brief _gpc_cm_interrupt_status_flag
  147. */
  148. enum
  149. {
  150. kGPC_CM_SoftSPNotAllowedStatusFlag = GPC_CPU_MODE_CTRL_CM_INT_CTRL_SP_REQ_NOT_ALLOWED_SOFT_INT_MASK,
  151. kGPC_CM_WaitSPNotAllowedStatusFlag = GPC_CPU_MODE_CTRL_CM_INT_CTRL_SP_REQ_NOT_ALLOWED_WAKEUP_INT_MASK,
  152. kGPC_CM_SleepSPNotAllowedStatusFlag = GPC_CPU_MODE_CTRL_CM_INT_CTRL_SP_REQ_NOT_ALLOWED_SLEEP_INT_MASK,
  153. };
  154. /*! @brief CPU standby mode status. */
  155. typedef enum _gpc_cm_standby_mode_status
  156. {
  157. kGPC_CM_SleepBusy = GPC_STAT(
  158. GPC_CPU_MODE_CTRL_CM_STBY_CTRL_STBY_SLEEP_BUSY_MASK,
  159. GPC_CPU_MODE_CTRL_CM_STBY_CTRL_STBY_SLEEP_BUSY_SHIFT), /*!< Indicate the CPU is busy entering standby mode. */
  160. kGPC_CM_WakeupBusy = GPC_STAT(
  161. GPC_CPU_MODE_CTRL_CM_STBY_CTRL_STBY_WAKEUP_BUSY_MASK,
  162. GPC_CPU_MODE_CTRL_CM_STBY_CTRL_STBY_WAKEUP_BUSY_SHIFT), /*!< Indicate the CPU is busy exiting standby mode. */
  163. } gpc_cm_standby_mode_status_t;
  164. /*! @brief CPU mode transition step in sleep/wakeup sequence. */
  165. typedef enum _gpc_cm_tran_step
  166. {
  167. kGPC_CM_SleepSsar = 0UL, /*!< SSAR (State Save And Restore) sleep step. */
  168. kGPC_CM_SleepLpcg = 1UL, /*!< LPCG (Low Power Clock Gating) sleep step. */
  169. kGPC_CM_SleepPll = 2UL, /*!< PLL sleep step. */
  170. kGPC_CM_SleepIso = 3UL, /*!< ISO (Isolation) sleep step. */
  171. kGPC_CM_SleepReset = 4UL, /*!< Reset sleep step. */
  172. kGPC_CM_SleepPower = 5UL, /*!< Power sleep step. */
  173. kGPC_CM_SleepSP = 6UL, /*!< Setpoint sleep step. Note that this step is controlled by setpoint controller. */
  174. kGPC_CM_SleepSTBY = 7UL, /*!< Standby sleep step. Note that this step is controlled by standby controller. */
  175. kGPC_CM_WakeupSTBY = 8UL, /*!< Standby wakeup step. Note that this step is controlled by standby controller. */
  176. kGPC_CM_WakeupSP = 9UL, /*!< Setpoint wakeup step. Note that this step is controlled by setpoint countroller. */
  177. kGPC_CM_WakeupPower = 10UL, /*!< Power wakeup step. */
  178. kGPC_CM_WakeupReset = 11UL, /*!< Reset wakeup step. */
  179. kGPC_CM_WakeupIso = 12UL, /*!< ISO wakeup step. */
  180. kGPC_CM_WakeupPll = 13UL, /*!< PLL wakeup step. */
  181. kGPC_CM_WakeupLpcg = 14UL, /*!< LPCG wakeup step. */
  182. kGPC_CM_WakeupSsar = 15UL, /*!< SSAR wakeup step. */
  183. } gpc_cm_tran_step_t;
  184. /*! @brief Step counter work mode. */
  185. typedef enum _gpc_tran_step_counter_mode
  186. {
  187. kGPC_StepCounterDisableMode =
  188. 0UL, /*!< Counter disable mode: not use step counter, step completes once receiving step_done. */
  189. kGPC_StepCounterDelayMode =
  190. 1UL, /*!< Counter delay mode: delay after receiving step_done, delay cycle number is STEP_CNT */
  191. kGPC_StepCounterIgnoreResponseMode = 2UL, /*!< Ignore step_done response, the counter starts to count once step
  192. begins, when counter reaches STEP_CNT value, the step completes. */
  193. kGPC_StepCounterTimeOutMode = 3UL, /*!< Time out mode, the counter starts to count once step begins, the step
  194. completes when either step_done received or counting to STEP_CNT value. */
  195. } gpc_tran_step_counter_mode_t;
  196. /*! @brief GPC set point transition steps. */
  197. typedef enum _gpc_sp_tran_step
  198. {
  199. kGPC_SP_SsarSave = 0UL, /*!< SSAR save step. */
  200. kGPC_SP_LpcgOff = 1UL, /*!< LPCG off step. */
  201. kGPC_SP_GroupDown = 2UL, /*!< Group down step. */
  202. kGPC_SP_RootDown = 3UL, /*!< Root down step. */
  203. kGPC_SP_PllOff = 4UL, /*!< PLL off step. */
  204. kGPC_SP_IsoOn = 5UL, /*!< ISO on. */
  205. kGPC_SP_ResetEarly = 6UL, /*!< Reset early step. */
  206. kGPC_SP_PowerOff = 7UL, /*!< Power off step. */
  207. kGPC_SP_BiasOff = 8UL, /*!< Bias off step. */
  208. kGPC_SP_BandgapPllLdoOff = 9UL, /*!< Bandgap and PLL_LDO off step. */
  209. kGPC_SP_LdoPre = 10UL, /*!< LDO (Low-Dropout) pre step. */
  210. kGPC_SP_DcdcDown = 11UL, /*!< DCDC down step. */
  211. kGPC_SP_DcdcUp = 12UL, /*!< DCDC up step. */
  212. kGPC_SP_LdoPost = 13UL, /*!< LDO post step. */
  213. kGPC_SP_BandgapPllLdoOn = 14UL, /*!< Bandgap and PLL_LDO on step. */
  214. kGPC_SP_BiasOn = 15UL, /*!< Bias on step. */
  215. kGPC_SP_PowerOn = 16UL, /*!< Power on step. */
  216. kGPC_SP_ResetLate = 17UL, /*!< Reset late step. */
  217. kGPC_SP_IsoOff = 18UL, /*!< ISO off step. */
  218. kGPC_SP_PllOn = 19UL, /*!< PLL on step */
  219. kGPC_SP_RootUp = 20UL, /*!< Root up step. */
  220. kGPC_SP_GroupUp = 21UL, /*!< Group up step. */
  221. kGPC_SP_LpcgOn = 22UL, /*!< LPCG on step. */
  222. kGPC_SP_SsarRestore = 23UL, /*!< SSAR restore step. */
  223. } gpc_sp_tran_step_t;
  224. /*! @brief CPU mode. */
  225. typedef enum _gpc_cpu_mode
  226. {
  227. kGPC_RunMode = 0x0UL, /*!< Stay in RUN mode. */
  228. kGPC_WaitMode = 0x1UL, /*!< Transit to WAIT mode. */
  229. kGPC_StopMode = 0x2UL, /*!< Transit to STOP mode. */
  230. kGPC_SuspendMode = 0x3UL, /*!< Transit to SUSPEND mode. */
  231. } gpc_cpu_mode_t;
  232. /*! @brief Configuration for GPC transition step. */
  233. typedef struct _gpc_tran_step_config
  234. {
  235. uint32_t stepCount; /*!< Step count, which is depended on the value of cntMode. */
  236. gpc_tran_step_counter_mode_t cntMode; /*!< Step counter working mode. */
  237. bool enableStep; /*!< Enable the step. */
  238. } gpc_tran_step_config_t;
  239. /*! @brief CPU wakeup sequence setpoint options. */
  240. typedef enum _gpc_cm_wakeup_sp_sel
  241. {
  242. kGPC_CM_WakeupSetpoint =
  243. 0UL, /*!< Request SP transition to CPU_SP_WAKEUP (param "setPointWakeup" in gpc_cm_sleep_sp_tran_config_t). */
  244. kGPC_CM_RequestPreviousSetpoint = 1UL, /*!< Request SP transition to the set point when the sleep event happens. */
  245. } gpc_cm_wakeup_sp_sel_t;
  246. /*! @brief GPC standby mode transition steps. */
  247. typedef enum _gpc_stby_tran_step
  248. {
  249. kGPC_STBY_LpcgIn = 0UL, /*!< LPCG in step. */
  250. kGPC_STBY_PllIn = 1UL, /*!< PLL in step. */
  251. kGPC_STBY_BiasIn = 2UL, /*!< Bias in step. */
  252. kGPC_STBY_PldoIn = 3UL, /*!< PLDO in step. */
  253. kGPC_STBY_BandgapIn = 4UL, /*!< Bandgap in step. */
  254. kGPC_STBY_LdoIn = 5UL, /*!< LDO in step. */
  255. kGPC_STBY_DcdcIn = 6UL, /*!< DCDC in step. */
  256. kGPC_STBY_PmicIn = 7UL, /*!< PMIC in step. */
  257. kGPC_STBY_PmicOut = 8UL, /*!< PMIC out step. */
  258. kGPC_STBY_DcdcOut = 9UL, /*!< DCDC out step. */
  259. kGPC_STBY_LdoOut = 10UL, /*!< LDO out step. */
  260. kGPC_STBY_BandgapOut = 11UL, /*!< Bandgap out step. */
  261. kGPC_STBY_PldoOut = 12UL, /*!< PLDO out step. */
  262. kGPC_STBY_BiasOut = 13UL, /*!< Bias out step. */
  263. kGPC_STBY_PllOut = 14UL, /*!< PLL out step. */
  264. kGPC_STBY_LpcgOut = 15UL, /*!< LPCG out step. */
  265. } gpc_stby_tran_step_t;
  266. /*******************************************************************************
  267. * API
  268. ******************************************************************************/
  269. #if defined(__cplusplus)
  270. extern "C" {
  271. #endif
  272. /*!
  273. * @name CPU mode control
  274. * @{
  275. */
  276. /*
  277. * @brief Hold core in sleep state.
  278. *
  279. * This function is used to hold the core in sleep state once it enters WFI, and until finishing wakeup sequence. If a
  280. * wakeup IRQ happens during the delay between core sleeps and core clock stops, the core will be woken up but GPC is on
  281. * sleep sequence and shut off the clock when core is processing the IRQ, this may leads to an unpredictable status.
  282. *
  283. * @param base GPC CPU module base address.
  284. */
  285. static inline void GPC_CM_EnableCpuSleepHold(GPC_CPU_MODE_CTRL_Type *base, bool enable)
  286. {
  287. if (enable)
  288. {
  289. base->CM_MISC |= GPC_CPU_MODE_CTRL_CM_MISC_SLEEP_HOLD_EN_MASK;
  290. }
  291. else
  292. {
  293. base->CM_MISC &= ~GPC_CPU_MODE_CTRL_CM_MISC_SLEEP_HOLD_EN_MASK;
  294. }
  295. }
  296. /*!
  297. * @brief Set the CPU mode on the next sleep event.
  298. *
  299. * This function configures the CPU mode that the CPU core will transmit to on next sleep event.
  300. *
  301. * @note This API must be called each time before entering sleep.
  302. *
  303. * @param base GPC CPU module base address.
  304. * @param mode The CPU mode that the core will transmit to, refer to "gpc_cpu_mode_t".
  305. */
  306. static inline void GPC_CM_SetNextCpuMode(GPC_CPU_MODE_CTRL_Type *base, gpc_cpu_mode_t mode)
  307. {
  308. base->CM_MODE_CTRL = (base->CM_MODE_CTRL & ~GPC_CPU_MODE_CTRL_CM_MODE_CTRL_CPU_MODE_TARGET_MASK) |
  309. GPC_CPU_MODE_CTRL_CM_MODE_CTRL_CPU_MODE_TARGET(mode);
  310. }
  311. /*!
  312. * @brief Get current CPU mode.
  313. *
  314. * @param base GPC CPU module base address.
  315. * @return The current CPU mode, in type of @ref gpc_cpu_mode_t.
  316. */
  317. static inline gpc_cpu_mode_t GPC_CM_GetCurrentCpuMode(GPC_CPU_MODE_CTRL_Type *base)
  318. {
  319. return (gpc_cpu_mode_t)(uint32_t)((base->CM_MODE_STAT & GPC_CPU_MODE_CTRL_CM_MODE_STAT_CPU_MODE_CURRENT_MASK) >>
  320. GPC_CPU_MODE_CTRL_CM_MODE_STAT_CPU_MODE_CURRENT_SHIFT);
  321. }
  322. /*!
  323. * @brief Get previous CPU mode.
  324. *
  325. * @param base GPC CPU module base address.
  326. * @return The previous CPU mode, in type of @ref gpc_cpu_mode_t.
  327. */
  328. static inline gpc_cpu_mode_t GPC_CM_GetPreviousCpuMode(GPC_CPU_MODE_CTRL_Type *base)
  329. {
  330. return (gpc_cpu_mode_t)(uint32_t)((base->CM_MODE_STAT & GPC_CPU_MODE_CTRL_CM_MODE_STAT_CPU_MODE_PREVIOUS_MASK) >>
  331. GPC_CPU_MODE_CTRL_CM_MODE_STAT_CPU_MODE_PREVIOUS_SHIFT);
  332. }
  333. /*!
  334. * @brief Enable IRQ wakeup request.
  335. *
  336. * This function enables the IRQ request which can wakeup the CPU platform.
  337. *
  338. * @param base GPC CPU module base address.
  339. * @param irqId ID of the IRQ, accessible range is 0-255.
  340. * @param enable Enable the IRQ request or not.
  341. */
  342. void GPC_CM_EnableIrqWakeup(GPC_CPU_MODE_CTRL_Type *base, uint32_t irqId, bool enable);
  343. /*!
  344. * @brief Enable Non-IRQ wakeup request.
  345. *
  346. * This function enables the non-IRQ request which can wakeup the CPU platform.
  347. *
  348. * @param base GPC CPU module base address.
  349. * @param mask Non-IRQ type, refer to "_gpc_cm_non_irq_wakeup_request".
  350. * @param enable Enable the Non-IRQ request or not.
  351. */
  352. static inline void GPC_CM_EnableNonIrqWakeup(GPC_CPU_MODE_CTRL_Type *base, uint32_t mask, bool enable)
  353. {
  354. assert(mask < 2UL);
  355. if (true == enable)
  356. {
  357. base->CM_NON_IRQ_WAKEUP_MASK &= ~mask;
  358. }
  359. else
  360. {
  361. base->CM_NON_IRQ_WAKEUP_MASK |= mask;
  362. }
  363. }
  364. /*!
  365. * @brief Get the status of the IRQ wakeup request.
  366. *
  367. * @param base GPC CPU module base address.
  368. * @param irqId ID of the IRQ, accessible range is 0-255.
  369. * @return Indicate the IRQ request is asserted or not.
  370. */
  371. bool GPC_CM_GetIrqWakeupStatus(GPC_CPU_MODE_CTRL_Type *base, uint32_t irqId);
  372. /*!
  373. * @brief Get the status of the Non-IRQ wakeup request.
  374. *
  375. * @param base GPC CPU module base address.
  376. * @param mask Non-IRQ type, refer to "_gpc_cm_non_irq_wakeup_request".
  377. * @return Indicate the Non-IRQ request is asserted or not.
  378. */
  379. static inline bool GPC_CM_GetNonIrqWakeupStatus(GPC_CPU_MODE_CTRL_Type *base, uint32_t mask)
  380. {
  381. return (mask == (base->CM_NON_IRQ_WAKEUP_STAT & mask));
  382. }
  383. /*!
  384. * @brief Config the cpu mode transition step.
  385. *
  386. * @note This function can not config the setpoint sleep/wakeup operation for those
  387. * operation is controlled by setpoint control. This funcion can not config the standby
  388. * sleep/wakeup too, because those operation is controlled by standby controlled.
  389. *
  390. * @param base GPC CPU module base address.
  391. * @param step step type, refer to "gpc_cm_tran_step_t".
  392. * @param config transition step configuration, refer to "gpc_tran_step_config_t".
  393. */
  394. void GPC_CM_ConfigCpuModeTransitionStep(GPC_CPU_MODE_CTRL_Type *base,
  395. gpc_cm_tran_step_t step,
  396. const gpc_tran_step_config_t *config);
  397. /*!
  398. * @brief Request a set point transition before the CPU transfers into a sleep mode.
  399. *
  400. * This function triggers the set point transition during a CPU Sleep/wakeup event and selects which one the CMC want
  401. * to transfer to.
  402. *
  403. * @param base GPC CPU module base address.
  404. * @param setPointSleep The set point CPU want the system to transit to on next CPU platform sleep sequence.
  405. * @param setPointWakeup The set point CPU want the system to transit to on next CPU platform wakeup sequence.
  406. * @param wakeupSel Select the set point transition on the next CPU platform wakeup sequence.
  407. */
  408. void GPC_CM_RequestSleepModeSetPointTransition(GPC_CPU_MODE_CTRL_Type *base,
  409. uint8_t setPointSleep,
  410. uint8_t setPointWakeup,
  411. gpc_cm_wakeup_sp_sel_t wakeupSel);
  412. /*!
  413. * @brief Request a set point transition during run mode.
  414. *
  415. * This function triggers the set point transition and selects which one the CMC want to transfer to.
  416. *
  417. * @param base GPC CPU module base address.
  418. * @param setPointRun The set point CPU want the system to transit in the run mode.
  419. */
  420. void GPC_CM_RequestRunModeSetPointTransition(GPC_CPU_MODE_CTRL_Type *base, uint8_t setPointRun);
  421. /*!
  422. * @brief Set the set point mapping value for each set point.
  423. *
  424. * This function configures which set point is allowed after current set point. If there are multiple setpoints, use:
  425. * @code
  426. * map = kkGPC_SetPoint0 | kGPC_SetPoint1 | ... | kGPC_SetPoint15;
  427. * @endcode
  428. *
  429. * @param base GPC CPU module base address.
  430. * @param setPoint Set point index, available range is 0-15.
  431. * @param map Map value of the set point. Refer to "_gpc_setpoint_map".
  432. */
  433. static inline void GPC_CM_SetSetPointMapping(GPC_CPU_MODE_CTRL_Type *base, uint32_t setPoint, uint32_t map)
  434. {
  435. assert(setPoint < 16UL);
  436. base->CM_SP_MAPPING[setPoint] = (map & 0xFFFFUL);
  437. }
  438. /*!
  439. * @brief Set the set point mapping value for each cpu mode.
  440. *
  441. * This function configures which set point is allowed when CPU enters RUN/WAIT/STOP/SUSPEND. If there are multiple
  442. * setpoints, use:
  443. * @code
  444. * map = kkGPC_SetPoint0 | kGPC_SetPoint1 | ... | kGPC_SetPoint15;
  445. * @endcode
  446. *
  447. * @param base GPC CPU module base address.
  448. * @param mode CPU mode. Refer to "gpc_cpu_mode_t".
  449. * @param map Map value of the set point. Refer to "_gpc_setpoint_map".
  450. */
  451. void GPC_CM_SetCpuModeSetPointMapping(GPC_CPU_MODE_CTRL_Type *base, gpc_cpu_mode_t mode, uint32_t map);
  452. /*!
  453. * @brief Request the chip into standby mode.
  454. *
  455. * @param base GPC CPU module base address.
  456. * @param mode CPU mode. Refer to "gpc_cpu_mode_t".
  457. */
  458. void GPC_CM_RequestStandbyMode(GPC_CPU_MODE_CTRL_Type *base, const gpc_cpu_mode_t mode);
  459. /*!
  460. * @brief Clear the standby mode request.
  461. *
  462. * @param base GPC CPU module base address.
  463. * @param mode CPU mode. Refer to "gpc_cpu_mode_t".
  464. */
  465. void GPC_CM_ClearStandbyModeRequest(GPC_CPU_MODE_CTRL_Type *base, const gpc_cpu_mode_t mode);
  466. /*!
  467. * @brief Get the status of the CPU standby mode transition.
  468. *
  469. * @param base GPC CPU module base address.
  470. * @param mask Standby mode transition status mask, refer to "gpc_cm_standby_mode_status_t".
  471. * @return Indicate the CPU's standby transition status.
  472. */
  473. static inline bool GPC_CM_GetStandbyModeStatus(GPC_CPU_MODE_CTRL_Type *base, uint32_t mask)
  474. {
  475. return (mask == (base->CM_STBY_CTRL & mask));
  476. }
  477. /*!
  478. * @brief Get the status flags of the GPC CPU module.
  479. *
  480. * @param base GPC CPU module base address.
  481. * @return The OR'ed value of status flags.
  482. */
  483. static inline uint32_t GPC_CM_GetInterruptStatusFlags(GPC_CPU_MODE_CTRL_Type *base)
  484. {
  485. return ((base->CM_INT_CTRL) & GPC_CM_ALL_INTERRUPT_STATUS);
  486. }
  487. /*!
  488. * @brief Clears CPU module interrut status flags.
  489. *
  490. * @param base GPC CPU module base address.
  491. * @param mask The interrupt status flags to be cleared. Should be the OR'ed value of _gpc_cm_interrupt_status_flag.
  492. */
  493. void GPC_CM_ClearInterruptStatusFlags(GPC_CPU_MODE_CTRL_Type *base, uint32_t mask);
  494. /*!
  495. * @}
  496. */
  497. /*!
  498. * @name Set point request control
  499. * @{
  500. */
  501. /*!
  502. * @brief Set the priority of set point.
  503. *
  504. * This function will configure the priority of the set point. If the result of API GPC_SP_GetAllowedSetPointMap() has
  505. * more than one valid bit, high priority set point will be taken.
  506. *
  507. * @param base GPC Setpoint controller base address.
  508. * @param setPoint Set point index, available range is 0-15.
  509. * @param priority Priority level, available range is 0-15.
  510. */
  511. static inline void GPC_SP_SetSetpointPriority(GPC_SET_POINT_CTRL_Type *base, uint32_t setPoint, uint32_t priority)
  512. {
  513. assert(priority < 16UL);
  514. assert(setPoint < 16UL);
  515. if (setPoint < 8UL)
  516. {
  517. base->SP_PRIORITY_0_7 |= (priority << (setPoint * 4UL));
  518. }
  519. else
  520. {
  521. base->SP_PRIORITY_8_15 |= (priority << ((setPoint - 8UL) * 4UL));
  522. }
  523. }
  524. /*!
  525. * @brief Config the set point transition step.
  526. *
  527. * @param base GPC Setpoint controller base address.
  528. * @param step step type, refer to "gpc_sp_tran_step_t".
  529. * @param config transition step configuration, refer to "gpc_tran_step_config_t".
  530. */
  531. void GPC_SP_ConfigSetPointTransitionStep(GPC_SET_POINT_CTRL_Type *base,
  532. gpc_sp_tran_step_t step,
  533. const gpc_tran_step_config_t *config);
  534. /*!
  535. * @brief Get system current setpoint, only valid when setpoint trans not busy.
  536. *
  537. * @param base GPC Setpoint controller base address.
  538. * @return The current setpoint number, range from 0 to 15.
  539. */
  540. static inline uint8_t GPC_SP_GetCurrentSetPoint(GPC_SET_POINT_CTRL_Type *base)
  541. {
  542. return (uint8_t)((base->SP_SYS_STAT & GPC_SET_POINT_CTRL_SP_SYS_STAT_SYS_SP_CURRENT_MASK) >>
  543. GPC_SET_POINT_CTRL_SP_SYS_STAT_SYS_SP_CURRENT_SHIFT);
  544. }
  545. /*!
  546. * @brief Get system previous setpoint, only valid when setpoint trans not busy.
  547. *
  548. * @param base GPC Setpoint controller base address.
  549. * @return The previous setpoint number, range from 0 to 15.
  550. */
  551. static inline uint8_t GPC_SP_GetPreviousSetPoint(GPC_SET_POINT_CTRL_Type *base)
  552. {
  553. return (uint8_t)((base->SP_SYS_STAT & GPC_SET_POINT_CTRL_SP_SYS_STAT_SYS_SP_PREVIOUS_MASK) >>
  554. GPC_SET_POINT_CTRL_SP_SYS_STAT_SYS_SP_PREVIOUS_SHIFT);
  555. }
  556. /*!
  557. * @brief Get target setpoint.
  558. *
  559. * @param base GPC Setpoint controller base address.
  560. * @return The target setpoint number, range from 0 to 15.
  561. */
  562. static inline uint8_t GPC_SP_GetTargetSetPoint(GPC_SET_POINT_CTRL_Type *base)
  563. {
  564. return (uint8_t)((base->SP_SYS_STAT & GPC_SET_POINT_CTRL_SP_SYS_STAT_SYS_SP_TARGET_MASK) >>
  565. GPC_SET_POINT_CTRL_SP_SYS_STAT_SYS_SP_TARGET_SHIFT);
  566. }
  567. /*!
  568. * @}
  569. */
  570. /*!
  571. * @name Standby mode control
  572. * @{
  573. */
  574. /*!
  575. * @brief Config the standby transition step.
  576. *
  577. * @param base GPC Setpoint controller base address.
  578. * @param step step type, refer to "gpc_stby_tran_step_t".
  579. * @param config transition step configuration, refer to "gpc_tran_step_config_t".
  580. */
  581. void GPC_STBY_ConfigStandbyTransitionStep(GPC_STBY_CTRL_Type *base,
  582. gpc_stby_tran_step_t step,
  583. const gpc_tran_step_config_t *config);
  584. /*!
  585. * @}
  586. */
  587. #if defined(__cplusplus)
  588. }
  589. #endif
  590. /*!
  591. * @}
  592. */
  593. #endif /* _FSL_GPC_H_ */