sys_pmm.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. /** @file sys_pmm.c
  2. * @brief PCR Driver Implementation File
  3. * @date 29.May.2013
  4. * @version 03.05.02
  5. *
  6. */
  7. /* (c) Texas Instruments 2009-2013, All rights reserved. */
  8. #include "sys_pmm.h"
  9. /** @fn void pmmInit(void)
  10. * @brief Initializes the PMM Driver
  11. *
  12. * This function initializes the PMM module.
  13. */
  14. void pmmInit(void)
  15. {
  16. /*Disable clocks to all logic domains*/
  17. pmmREG->PDCLKDISREG = 0xFU;
  18. /*Enable or disable clock to pmctrl_wakeup block and automatic clock wake up*/
  19. pmmREG->GLOBALCTRL1 = (0U << 8U) | (0U << 0U); /*from GUI*/
  20. /*Power on the logic power domains*/
  21. pmmREG->LOGICPDPWRCTRL0 = PMM_LOGICPDPWRCTRL0_CONFIGVALUE;
  22. /*Power on the memory-only power domains*/
  23. pmmREG->MEMPDPWRCTRL0 = PMM_MEMPDPWRCTRL0_CONFIGVALUE;
  24. /*wait till Logic Power Domain PD2 turns ON*/
  25. while((pmmREG->LOGICPDPWRSTAT[PMM_LOGICPD2] & PMM_LOGICPDPWRSTAT_DOMAINON) == 0U)
  26. {
  27. }/* Wait */
  28. /*wait till Logic Power Domain PD3 turns ON*/
  29. while((pmmREG->LOGICPDPWRSTAT[PMM_LOGICPD3] & PMM_LOGICPDPWRSTAT_DOMAINON) == 0U)
  30. {
  31. }/* Wait */
  32. /*wait till Logic Power Domain PD4 turns OFF*/
  33. while((pmmREG->LOGICPDPWRSTAT[PMM_LOGICPD4] & PMM_LOGICPDPWRSTAT_LOGICPDPWRSTAT) != 0U)
  34. {
  35. }/* Wait */
  36. /*wait till Logic Power Domain PD5 turns ON*/
  37. while((pmmREG->LOGICPDPWRSTAT[PMM_LOGICPD5] & PMM_LOGICPDPWRSTAT_DOMAINON) == 0U)
  38. {
  39. }/* Wait */
  40. /*wait till Memory Only Power Domain RAM_PD1 turns ON*/
  41. while((pmmREG->MEMPDPWRSTAT[PMM_MEMPD1] & PMM_MEMPDPWRSTAT_DOMAINON) == 0U)
  42. {
  43. }/* Wait */
  44. /*wait till Memory Only Power Domain RAM_PD2 turns ON*/
  45. while((pmmREG->MEMPDPWRSTAT[PMM_MEMPD2] & PMM_MEMPDPWRSTAT_DOMAINON) == 0U)
  46. {
  47. }/* Wait */
  48. /*wait till Memory Only Power Domain RAM_PD3 turns ON*/
  49. while((pmmREG->MEMPDPWRSTAT[PMM_MEMPD3] & PMM_MEMPDPWRSTAT_DOMAINON) == 0U)
  50. {
  51. }/* Wait */
  52. if ((pmmREG->GLOBALCTRL1 & PMM_GLOBALCTRL1_AUTOCLKWAKEENA) == 0U)
  53. {
  54. /* Enable clocks for the selected logic domain */
  55. pmmREG->PDCLKDISREG = PMM_PDCLKDISREG_CONFIGVALUE;
  56. }
  57. }
  58. /** @fn void pmmTurnONLogicPowerDomain(pmm_LogicPD_t logicPD)
  59. * @brief Turns on Logic Power Domain
  60. * @param[in] logicPD - Power Domain to be turned on
  61. * - PMM_LOGICPD2: Power domain PD2 will be turned on
  62. * - PMM_LOGICPD3: Power domain PD3 will be turned on
  63. * - PMM_LOGICPD4: Power domain PD4 will be turned on
  64. * - PMM_LOGICPD5: Power domain PD5 will be turned on
  65. *
  66. * This function turns on the selected Logic Power Domain
  67. *
  68. */
  69. void pmmTurnONLogicPowerDomain(pmm_LogicPD_t logicPD)
  70. {
  71. if (logicPD != PMM_LOGICPD1)
  72. {
  73. /* Power on the domain */
  74. if (logicPD == PMM_LOGICPD2)
  75. {
  76. pmmREG->LOGICPDPWRCTRL0 = (pmmREG->LOGICPDPWRCTRL0 & 0xF0FFFFFFU) | (0x5U << 24U);
  77. }
  78. else if (logicPD == PMM_LOGICPD3)
  79. {
  80. pmmREG->LOGICPDPWRCTRL0 = (pmmREG->LOGICPDPWRCTRL0 & 0xFFF0FFFFU) | (0x5U << 16U);
  81. }
  82. else if (logicPD == PMM_LOGICPD4)
  83. {
  84. pmmREG->LOGICPDPWRCTRL0 = (pmmREG->LOGICPDPWRCTRL0 & 0xFFFFF0FFU) | (0x5U << 8U);
  85. }
  86. else
  87. {
  88. pmmREG->LOGICPDPWRCTRL0 = (pmmREG->LOGICPDPWRCTRL0 & 0xFFFFFFF0U) | (0x5U << 0U);
  89. }
  90. /* Wait until the power domain turns on */
  91. while((pmmREG->LOGICPDPWRSTAT[logicPD] & PMM_LOGICPDPWRSTAT_DOMAINON) == 0U)
  92. {
  93. }/* Wait */
  94. if ((pmmREG->GLOBALCTRL1 & PMM_GLOBALCTRL1_AUTOCLKWAKEENA) == 0U)
  95. {
  96. /* Enable clocks to the power domain */
  97. pmmREG->PDCLKDISCLRREG = 1U << (uint32)logicPD;
  98. }
  99. }
  100. }
  101. /** @fn void pmmTurnONMemPowerDomain(pmm_MemPD_t memPD)
  102. * @brief Turns on Memory Power Domain
  103. * @param[in] memPD - Power Domain to be tured on
  104. * - PMM_MEMPD1: Power domain RAM_PD1 will be turned on
  105. * - PMM_MEMPD2: Power domain RAM_PD2 will be turned on
  106. * - PMM_MEMPD3: Power domain RAM_PD3 will be turned on
  107. *
  108. * This function turns on the selected Memory Power Domain
  109. *
  110. */
  111. void pmmTurnONMemPowerDomain(pmm_MemPD_t memPD)
  112. {
  113. /* Power on the domain */
  114. if (memPD == PMM_MEMPD1)
  115. {
  116. pmmREG->MEMPDPWRCTRL0 = (pmmREG->MEMPDPWRCTRL0 & 0xF0FFFFFFU) | (0x5U << 24U);
  117. }
  118. else if (memPD == PMM_MEMPD2)
  119. {
  120. pmmREG->MEMPDPWRCTRL0 = (pmmREG->MEMPDPWRCTRL0 & 0xFFF0FFFFU) | (0x5U << 16U);
  121. }
  122. else
  123. {
  124. pmmREG->MEMPDPWRCTRL0 = (pmmREG->MEMPDPWRCTRL0 & 0xFFFFF0FFU) | (0x5U << 8U);
  125. }
  126. /*Wait until the power domain turns on*/
  127. while((pmmREG->MEMPDPWRSTAT[memPD] & PMM_MEMPDPWRSTAT_DOMAINON) == 0U)
  128. {
  129. }/* Wait */
  130. }
  131. /** @fn void pmmTurnOFFLogicPowerDomain(pmm_LogicPD_t logicPD)
  132. * @brief Turns off Logic Power Domain
  133. * @param[in] logicPD - Power Domain to be tured off
  134. * - PMM_LOGICPD2: Power domain PD2 will be turned off
  135. * - PMM_LOGICPD3: Power domain PD3 will be turned off
  136. * - PMM_LOGICPD4: Power domain PD4 will be turned off
  137. * - PMM_LOGICPD5: Power doamin PD5 will be turned off
  138. *
  139. * This function turns off the selected Logic Power Domain
  140. *
  141. */
  142. void pmmTurnOFFLogicPowerDomain(pmm_LogicPD_t logicPD)
  143. {
  144. if (logicPD != PMM_LOGICPD1)
  145. {
  146. /* Disable all clocks to the power domain */
  147. pmmREG->PDCLKDISSETREG = 1U << (uint32)logicPD;
  148. /* Power down the domain */
  149. if (logicPD == PMM_LOGICPD2)
  150. {
  151. pmmREG->LOGICPDPWRCTRL0 = (pmmREG->LOGICPDPWRCTRL0 & 0xF0FFFFFFU) | (0xAU << 24U);
  152. }
  153. else if (logicPD == PMM_LOGICPD3)
  154. {
  155. pmmREG->LOGICPDPWRCTRL0 = (pmmREG->LOGICPDPWRCTRL0 & 0xFFF0FFFFU) | (0xAU << 16U);
  156. }
  157. else if (logicPD == PMM_LOGICPD4)
  158. {
  159. pmmREG->LOGICPDPWRCTRL0 = (pmmREG->LOGICPDPWRCTRL0 & 0xFFFFF0FFU) | (0xAU << 8U);
  160. }
  161. else
  162. {
  163. pmmREG->LOGICPDPWRCTRL0 = (pmmREG->LOGICPDPWRCTRL0 & 0xFFFFFFF0U) | (0xAU << 0U);
  164. }
  165. /* Wait until the power domain turns off */
  166. while((pmmREG->LOGICPDPWRSTAT[logicPD] & PMM_LOGICPDPWRSTAT_LOGICPDPWRSTAT) != 0U)
  167. {
  168. }/* Wait */
  169. }
  170. }
  171. /** @fn void pmmTurnOFFMemPowerDomain(pmm_MemPD_t memPD)
  172. * @brief Turns off Memory Power Domain
  173. * @param[in] memPD - Power Domain to be tured off
  174. * - PMM_MEMPD1: Power domain RAM_PD1 will be turned off
  175. * - PMM_MEMPD2: Power domain RAM_PD2 will be turned off
  176. * - PMM_MEMPD3: Power domain RAM_PD3 will be turned off
  177. *
  178. * This function turns off the selected Memory Power Domain
  179. *
  180. */
  181. void pmmTurnOFFMemPowerDomain(pmm_MemPD_t memPD)
  182. {
  183. /* Power down the domain */
  184. if (memPD == PMM_MEMPD1)
  185. {
  186. pmmREG->MEMPDPWRCTRL0 = (pmmREG->MEMPDPWRCTRL0 & 0xF0FFFFFFU) | (0xAU << 24U);
  187. }
  188. else if (memPD == PMM_MEMPD2)
  189. {
  190. pmmREG->MEMPDPWRCTRL0 = (pmmREG->MEMPDPWRCTRL0 & 0xFFF0FFFFU) | (0xAU << 16U);
  191. }
  192. else
  193. {
  194. pmmREG->MEMPDPWRCTRL0 = (pmmREG->MEMPDPWRCTRL0 & 0xFFFFF0FFU) | (0xAU << 8U);
  195. }
  196. /*Wait until the power domain turns off*/
  197. while((pmmREG->MEMPDPWRSTAT[memPD] & PMM_MEMPDPWRSTAT_MEMPDPWRSTAT) != 0U)
  198. {
  199. }/* Wait */
  200. }
  201. /** @fn boolean pmmIsLogicPowerDomainActive(pmm_LogicPD_t logicPD)
  202. * @brief Check if the power domain is active or not
  203. * @param[in] logicPD - Power Domain to be be checked
  204. * - PMM_LOGICPD2: Checks whether Power domain PD2 is active or not
  205. * - PMM_LOGICPD3: Checks whether Power domain PD3 is active or not
  206. * - PMM_LOGICPD4: Checks whether Power domain PD4 is active or not
  207. * - PMM_LOGICPD5: Checks whether Power domain PD5 is active or not
  208. * @return The function will return:
  209. * - TRUE : When the selected power domain is in Active state.
  210. * - FALSE: When the selected power domain is in OFF state.
  211. *
  212. * This function checks whether the selected power domain is active or not.
  213. *
  214. */
  215. boolean pmmIsLogicPowerDomainActive(pmm_LogicPD_t logicPD)
  216. {
  217. boolean status;
  218. if ((pmmREG->LOGICPDPWRSTAT[logicPD] & PMM_LOGICPDPWRSTAT_DOMAINON) == 0U)
  219. {
  220. status = FALSE;
  221. }
  222. else
  223. {
  224. status = TRUE;
  225. }
  226. return status;
  227. }
  228. /** @fn boolean pmmIsMemPowerDomainActive(pmm_MemPD_t memPD)
  229. * @brief Check if the power domain is active or not
  230. * @param[in] memPD - Power Domain to be tured off
  231. * - PMM_MEMPD1: Checks whether Power domain RAM_PD1 is active or not
  232. * - PMM_MEMPD2: Checks whether Power domain RAM_PD2 is active or not
  233. * - PMM_MEMPD3: Checks whether Power domain RAM_PD3 is active or not
  234. * @return The function will return:
  235. * - TRUE : When the selected power domain is in Active state.
  236. * - FALSE: When the selected power domain is in OFF state.
  237. *
  238. * This function checks whether the selected power domain is active or not.
  239. *
  240. */
  241. boolean pmmIsMemPowerDomainActive(pmm_MemPD_t memPD)
  242. {
  243. boolean status;
  244. if ((pmmREG->MEMPDPWRSTAT[memPD] & PMM_MEMPDPWRSTAT_DOMAINON) == 0U)
  245. {
  246. status = FALSE;
  247. }
  248. else
  249. {
  250. status = TRUE;
  251. }
  252. return status;
  253. }
  254. /** @fn void pmmGetConfigValue(pmm_config_reg_t *config_reg, config_value_type_t type)
  255. * @brief Get the initial or current values of the configuration register
  256. * @param[in] *config_reg - pointer to the struct to which the initial or current value of the configuration registers need to be stored
  257. * @param[in] type - whether initial or current value of the configuration registers need to be stored
  258. * - InitialValue: initial value of the configuration registers will be stored in the struct pointed by config_reg
  259. * - CurrentValue: initial value of the configuration registers will be stored in the struct pointed by config_reg
  260. * This function will copy the initial or current value (depending on the parameter 'type') of the configuration registers to the struct pointed by config_reg
  261. */
  262. void pmmGetConfigValue(pmm_config_reg_t *config_reg, config_value_type_t type)
  263. {
  264. if (type == InitialValue)
  265. {
  266. config_reg->CONFIG_LOGICPDPWRCTRL0 = PMM_LOGICPDPWRCTRL0_CONFIGVALUE;
  267. config_reg->CONFIG_MEMPDPWRCTRL0 = PMM_MEMPDPWRCTRL0_CONFIGVALUE;
  268. config_reg->CONFIG_PDCLKDISREG = PMM_PDCLKDISREG_CONFIGVALUE;
  269. config_reg->CONFIG_GLOBALCTRL1 = PMM_GLOBALCTRL1_CONFIGVALUE;
  270. }
  271. else
  272. {
  273. config_reg->CONFIG_LOGICPDPWRCTRL0 = pmmREG->LOGICPDPWRCTRL0;
  274. config_reg->CONFIG_MEMPDPWRCTRL0 = pmmREG->MEMPDPWRCTRL0;
  275. config_reg->CONFIG_PDCLKDISREG = pmmREG->PDCLKDISREG;
  276. config_reg->CONFIG_GLOBALCTRL1 = pmmREG->GLOBALCTRL1;
  277. }
  278. }
  279. /** @fn void pmmSetMode(pmm_Mode_t mode)
  280. * @brief Set PSCON Compare Block Mode
  281. * @param[in] mode - PSCON Compare Block mode
  282. * - LockStep : PSCON compare block is set to Lock-Step mode
  283. * - SelfTest : PSCON compare block is set to Self-Test mode
  284. * - ErrorForcing : PSCON compare block is set to Error-Forcing mode
  285. * - SelfTestErrorForcing : PSCON compare block is set to Self-Test-Error-Forcing mode
  286. *
  287. * This function sets the PSCON Compare block to the selected mode
  288. *
  289. */
  290. void pmmSetMode(pmm_Mode_t mode)
  291. {
  292. /* Set PSCON Compare Block Mode */
  293. pmmREG->PRCKEYREG = mode;
  294. }
  295. /** @fn boolean pmmPerformSelfTest(void)
  296. * @brief Perform self test and return the result
  297. *
  298. * @return The function will return
  299. * - TRUE if PSCON compare block passed self-test
  300. * - FALSE if PSCON compare block failed in self-test
  301. *
  302. * This function checks whether PSCON compare block passed the self-test or not.
  303. *
  304. */
  305. boolean pmmPerformSelfTest(void)
  306. {
  307. boolean status = TRUE;
  308. /*Enter self-test mode*/
  309. pmmREG->PRCKEYREG = SelfTest;
  310. /*Wait till self test is completed*/
  311. while ((pmmREG->LPDDCSTAT1 & 0xFU) != 0xFU)
  312. {
  313. }/* Wait */
  314. while ((pmmREG->MPDDCSTAT1 & 0x7U) != 0x7U)
  315. {
  316. }/* Wait */
  317. /*Check whether self-test passed or not*/
  318. if ((pmmREG->LPDDCSTAT2 & 0xFU) != 0U)
  319. {
  320. status = FALSE;
  321. }
  322. if ((pmmREG->MPDDCSTAT2 & 0x7U) != 0U)
  323. {
  324. status = FALSE;
  325. }
  326. /*Enter lock-step mode*/
  327. pmmREG->PRCKEYREG = LockStep;
  328. return status;
  329. }