am_hal_pwrctrl.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558
  1. //*****************************************************************************
  2. //
  3. // am_hal_pwrctrl.c
  4. //! @file
  5. //!
  6. //! @brief Functions for enabling and disabling power domains.
  7. //!
  8. //! @addtogroup pwrctrl2 Power Control
  9. //! @ingroup apollo2hal
  10. //! @{
  11. //
  12. //*****************************************************************************
  13. //*****************************************************************************
  14. //
  15. // Copyright (c) 2017, Ambiq Micro
  16. // All rights reserved.
  17. //
  18. // Redistribution and use in source and binary forms, with or without
  19. // modification, are permitted provided that the following conditions are met:
  20. //
  21. // 1. Redistributions of source code must retain the above copyright notice,
  22. // this list of conditions and the following disclaimer.
  23. //
  24. // 2. Redistributions in binary form must reproduce the above copyright
  25. // notice, this list of conditions and the following disclaimer in the
  26. // documentation and/or other materials provided with the distribution.
  27. //
  28. // 3. Neither the name of the copyright holder nor the names of its
  29. // contributors may be used to endorse or promote products derived from this
  30. // software without specific prior written permission.
  31. //
  32. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  33. // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  34. // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  35. // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  36. // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  37. // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  38. // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  39. // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  40. // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  41. // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  42. // POSSIBILITY OF SUCH DAMAGE.
  43. //
  44. // This is part of revision 1.2.11 of the AmbiqSuite Development Package.
  45. //
  46. //*****************************************************************************
  47. #include <stdint.h>
  48. #include <stdbool.h>
  49. #include "am_mcu_apollo.h"
  50. //*****************************************************************************
  51. //
  52. // ONE_BIT - true iff value has exactly 1 bit set.
  53. //
  54. //*****************************************************************************
  55. #define ONE_BIT(ui32Value) (ui32Value && !(ui32Value & (ui32Value - 1)))
  56. //*****************************************************************************
  57. //
  58. // Determine if this is an Apollo2 revision that requires additional handling
  59. // of the BUCK to LDO transition when only the ADC is in use and going to
  60. // deepsleep.
  61. //
  62. //*****************************************************************************
  63. static bool
  64. isRev_ADC(void)
  65. {
  66. return AM_BFM(MCUCTRL, CHIPREV, REVMAJ) == AM_REG_MCUCTRL_CHIPREV_REVMAJ_B ?
  67. true : false;
  68. }
  69. //*****************************************************************************
  70. //
  71. //! @brief Enable power for a peripheral.
  72. //!
  73. //! @param ui32Peripheral - The peripheral to enable
  74. //!
  75. //! This function directly enables or disables power for the chosen peripheral.
  76. //!
  77. //! @note Unpowered peripherals may lose their configuration information. This
  78. //! function does not save or restore peripheral configuration registers.
  79. //!
  80. //! @return None.
  81. //
  82. //*****************************************************************************
  83. void
  84. am_hal_pwrctrl_periph_enable(uint32_t ui32Peripheral)
  85. {
  86. am_hal_debug_assert_msg(ONE_BIT(ui32Peripheral),
  87. "Cannot enable more than one peripheral at a time.");
  88. //
  89. // Begin critical section.
  90. //
  91. AM_CRITICAL_BEGIN_ASM
  92. //
  93. // Enable power control for the given device.
  94. //
  95. AM_REG(PWRCTRL, DEVICEEN) |= ui32Peripheral;
  96. //
  97. // End Critical Section.
  98. //
  99. AM_CRITICAL_END_ASM
  100. //
  101. // Wait for the power to stablize. Using a simple delay loop is more
  102. // power efficient than a polling loop.
  103. //
  104. am_hal_flash_delay(AM_HAL_PWRCTRL_DEVICEEN_DELAYCYCLES / 3);
  105. //
  106. // Quick check to guarantee we're good (should never be more than 1 read).
  107. //
  108. POLL_PWRSTATUS(ui32Peripheral);
  109. }
  110. //*****************************************************************************
  111. //
  112. //! @brief Disable power for a peripheral.
  113. //!
  114. //! @param ui32Peripheral - The peripheral to disable
  115. //!
  116. //! This function directly disables or disables power for the chosen peripheral.
  117. //!
  118. //! @note Unpowered peripherals may lose their configuration information. This
  119. //! function does not save or restore peripheral configuration registers.
  120. //!
  121. //! @return None.
  122. //
  123. //*****************************************************************************
  124. void
  125. am_hal_pwrctrl_periph_disable(uint32_t ui32Peripheral)
  126. {
  127. am_hal_debug_assert_msg(ONE_BIT(ui32Peripheral),
  128. "Cannot enable more than one peripheral at a time.");
  129. //
  130. // Begin critical section.
  131. //
  132. AM_CRITICAL_BEGIN_ASM
  133. //
  134. // Disable power control for the given device.
  135. //
  136. AM_REG(PWRCTRL, DEVICEEN) &= ~ui32Peripheral;
  137. //
  138. // End critical section.
  139. //
  140. AM_CRITICAL_END_ASM
  141. //
  142. // Wait for the power to stablize
  143. //
  144. am_hal_flash_delay(AM_HAL_PWRCTRL_DEVICEDIS_DELAYCYCLES / 3);
  145. }
  146. //*****************************************************************************
  147. //
  148. //! @brief Enable and disable power for memory devices (SRAM, flash, cache).
  149. //!
  150. //! @param ui32MemEn - The memory and amount to be enabled.
  151. //! Must be one of the following:
  152. //! AM_HAL_PWRCTRL_MEMEN_CACHE
  153. //! AM_HAL_PWRCTRL_MEMEN_CACHE_DIS
  154. //! AM_HAL_PWRCTRL_MEMEN_FLASH512K
  155. //! AM_HAL_PWRCTRL_MEMEN_FLASH1M
  156. //! AM_HAL_PWRCTRL_MEMEN_SRAM8K
  157. //! AM_HAL_PWRCTRL_MEMEN_SRAM16K
  158. //! AM_HAL_PWRCTRL_MEMEN_SRAM24K
  159. //! AM_HAL_PWRCTRL_MEMEN_SRAM32K
  160. //! AM_HAL_PWRCTRL_MEMEN_SRAM64K
  161. //! AM_HAL_PWRCTRL_MEMEN_SRAM96K
  162. //! AM_HAL_PWRCTRL_MEMEN_SRAM128K
  163. //! AM_HAL_PWRCTRL_MEMEN_SRAM160K
  164. //! AM_HAL_PWRCTRL_MEMEN_SRAM192K
  165. //! AM_HAL_PWRCTRL_MEMEN_SRAM224K
  166. //! AM_HAL_PWRCTRL_MEMEN_SRAM256K
  167. //! AM_HAL_PWRCTRL_MEMEN_ALL (the default, power-up state)
  168. //!
  169. //! This function enables/disables power to provide only the given amount of
  170. //! the type of memory specified.
  171. //!
  172. //! Only the type of memory specified is affected. Therefore separate calls
  173. //! are required to affect power settings for FLASH, SRAM, or CACHE.
  174. //!
  175. //! Settings for zero SRAM or FLASH are not provided as device behavior under
  176. //! either of those conditions is undefined.
  177. //!
  178. //! @note Unpowered memory devices may lose their configuration information.
  179. //! This function does not save or restore peripheral configuration registers.
  180. //!
  181. //! @return None.
  182. //
  183. //*****************************************************************************
  184. bool
  185. am_hal_pwrctrl_memory_enable(uint32_t ui32MemEn)
  186. {
  187. uint32_t ui32MemEnMask, ui32MemDisMask;
  188. uint32_t ui32PwrStatEnMask, ui32PwrStatDisMask;
  189. int32_t i32TOcnt;
  190. if ( ui32MemEn == AM_HAL_PWRCTRL_MEMEN_FLASH512K )
  191. {
  192. ui32MemEnMask = AM_REG_PWRCTRL_MEMEN_FLASH0_EN;
  193. ui32MemDisMask = AM_REG_PWRCTRL_MEMEN_FLASH1_EN;
  194. ui32PwrStatEnMask = AM_REG_PWRCTRL_PWRONSTATUS_PD_FLAM0_M;
  195. ui32PwrStatDisMask = AM_REG_PWRCTRL_PWRONSTATUS_PD_FLAM1_M;
  196. }
  197. else if ( ui32MemEn == AM_HAL_PWRCTRL_MEMEN_FLASH1M )
  198. {
  199. ui32MemEnMask = AM_REG_PWRCTRL_MEMEN_FLASH0_EN |
  200. AM_REG_PWRCTRL_MEMEN_FLASH1_EN;
  201. ui32MemDisMask = 0;
  202. ui32PwrStatEnMask = AM_REG_PWRCTRL_PWRONSTATUS_PD_FLAM0_M |
  203. AM_REG_PWRCTRL_PWRONSTATUS_PD_FLAM1_M;
  204. ui32PwrStatDisMask = 0;
  205. }
  206. else if ( ui32MemEn == AM_HAL_PWRCTRL_MEMEN_SRAM8K )
  207. {
  208. ui32MemEnMask = AM_REG_PWRCTRL_MEMEN_SRAMEN_SRAM8K;
  209. ui32MemDisMask = AM_REG_PWRCTRL_MEMEN_SRAMEN_ALL &
  210. ~AM_REG_PWRCTRL_MEMEN_SRAMEN_SRAM8K;
  211. ui32PwrStatEnMask = AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_8K;
  212. ui32PwrStatDisMask = AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_ALL &
  213. ~AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_8K;
  214. }
  215. else if ( ui32MemEn == AM_HAL_PWRCTRL_MEMEN_SRAM16K )
  216. {
  217. ui32MemEnMask = AM_REG_PWRCTRL_MEMEN_SRAMEN_SRAM16K;
  218. ui32MemDisMask = AM_REG_PWRCTRL_MEMEN_SRAMEN_ALL &
  219. ~AM_REG_PWRCTRL_MEMEN_SRAMEN_SRAM16K;
  220. ui32PwrStatEnMask = AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_16K;
  221. ui32PwrStatDisMask = AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_ALL &
  222. ~AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_16K;
  223. }
  224. else if ( ui32MemEn == AM_HAL_PWRCTRL_MEMEN_SRAM24K )
  225. {
  226. ui32MemEnMask = AM_REG_PWRCTRL_MEMEN_SRAMEN_GROUP0_SRAM0 |
  227. AM_REG_PWRCTRL_MEMEN_SRAMEN_GROUP0_SRAM1 |
  228. AM_REG_PWRCTRL_MEMEN_SRAMEN_GROUP0_SRAM2;
  229. ui32MemDisMask = AM_REG_PWRCTRL_MEMEN_SRAMEN_ALL &
  230. ~(AM_REG_PWRCTRL_MEMEN_SRAMEN_GROUP0_SRAM0 |
  231. AM_REG_PWRCTRL_MEMEN_SRAMEN_GROUP0_SRAM1 |
  232. AM_REG_PWRCTRL_MEMEN_SRAMEN_GROUP0_SRAM2);
  233. ui32PwrStatEnMask = AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_24K;
  234. ui32PwrStatDisMask = AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_ALL &
  235. ~AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_24K;
  236. }
  237. else if ( ui32MemEn == AM_HAL_PWRCTRL_MEMEN_SRAM32K )
  238. {
  239. ui32MemEnMask = AM_REG_PWRCTRL_MEMEN_SRAMEN_SRAM32K;
  240. ui32MemDisMask = AM_REG_PWRCTRL_MEMEN_SRAMEN_ALL &
  241. ~AM_REG_PWRCTRL_MEMEN_SRAMEN_SRAM32K;
  242. ui32PwrStatEnMask = AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_32K;
  243. ui32PwrStatDisMask = AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_ALL &
  244. ~AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_32K;
  245. }
  246. else if ( ui32MemEn == AM_HAL_PWRCTRL_MEMEN_SRAM64K )
  247. {
  248. ui32MemEnMask = AM_REG_PWRCTRL_MEMEN_SRAMEN_SRAM64K;
  249. ui32MemDisMask = AM_REG_PWRCTRL_MEMEN_SRAMEN_ALL &
  250. ~AM_REG_PWRCTRL_MEMEN_SRAMEN_SRAM64K;
  251. ui32PwrStatEnMask = AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_64K;
  252. ui32PwrStatDisMask = AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_ALL &
  253. ~AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_64K;
  254. }
  255. else if ( ui32MemEn == AM_HAL_PWRCTRL_MEMEN_SRAM96K )
  256. {
  257. ui32MemEnMask = AM_HAL_PWRCTRL_MEMEN_SRAM96K;
  258. ui32MemDisMask = AM_REG_PWRCTRL_MEMEN_SRAMEN_ALL &
  259. ~AM_HAL_PWRCTRL_MEMEN_SRAM96K;
  260. ui32PwrStatEnMask = AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_96K;
  261. ui32PwrStatDisMask = AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_ALL &
  262. ~AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_96K;
  263. }
  264. else if ( ui32MemEn == AM_HAL_PWRCTRL_MEMEN_SRAM128K )
  265. {
  266. ui32MemEnMask = AM_REG_PWRCTRL_MEMEN_SRAMEN_SRAM128K;
  267. ui32MemDisMask = AM_REG_PWRCTRL_MEMEN_SRAMEN_ALL &
  268. ~AM_REG_PWRCTRL_MEMEN_SRAMEN_SRAM128K;
  269. ui32PwrStatEnMask = AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_128K;
  270. ui32PwrStatDisMask = AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_ALL &
  271. ~AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_128K;
  272. }
  273. else if ( ui32MemEn == AM_HAL_PWRCTRL_MEMEN_SRAM160K )
  274. {
  275. ui32MemEnMask = AM_HAL_PWRCTRL_MEMEN_SRAM160K;
  276. ui32MemDisMask = AM_REG_PWRCTRL_MEMEN_SRAMEN_ALL &
  277. ~AM_HAL_PWRCTRL_MEMEN_SRAM160K;
  278. ui32PwrStatEnMask = AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_160K;
  279. ui32PwrStatDisMask = AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_ALL &
  280. ~AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_160K;
  281. }
  282. else if ( ui32MemEn == AM_HAL_PWRCTRL_MEMEN_SRAM192K )
  283. {
  284. ui32MemEnMask = AM_HAL_PWRCTRL_MEMEN_SRAM192K;
  285. ui32MemDisMask = AM_REG_PWRCTRL_MEMEN_SRAMEN_ALL &
  286. ~AM_HAL_PWRCTRL_MEMEN_SRAM192K;
  287. ui32PwrStatEnMask = AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_192K;
  288. ui32PwrStatDisMask = AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_ALL &
  289. ~AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_192K;
  290. }
  291. else if ( ui32MemEn == AM_HAL_PWRCTRL_MEMEN_SRAM224K )
  292. {
  293. ui32MemEnMask = AM_HAL_PWRCTRL_MEMEN_SRAM224K;
  294. ui32MemDisMask = AM_REG_PWRCTRL_MEMEN_SRAMEN_ALL &
  295. ~AM_HAL_PWRCTRL_MEMEN_SRAM224K;
  296. ui32PwrStatEnMask = AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_224K;
  297. ui32PwrStatDisMask = AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_ALL &
  298. ~AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_224K;
  299. }
  300. else if ( ui32MemEn == AM_HAL_PWRCTRL_MEMEN_SRAM256K )
  301. {
  302. ui32MemEnMask = AM_REG_PWRCTRL_MEMEN_SRAMEN_SRAM256K;
  303. ui32MemDisMask = AM_REG_PWRCTRL_MEMEN_SRAMEN_ALL &
  304. ~AM_REG_PWRCTRL_MEMEN_SRAMEN_SRAM256K;
  305. ui32PwrStatEnMask = AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_256K;
  306. ui32PwrStatDisMask = AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_ALL &
  307. ~AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_256K;
  308. }
  309. else if ( ui32MemEn == AM_HAL_PWRCTRL_MEMEN_CACHE )
  310. {
  311. ui32MemEnMask = AM_REG_PWRCTRL_MEMEN_CACHEB0_EN |
  312. AM_REG_PWRCTRL_MEMEN_CACHEB2_EN;
  313. ui32MemDisMask = 0;
  314. ui32PwrStatEnMask = AM_REG_PWRCTRL_PWRONSTATUS_PD_CACHEB2_M |
  315. AM_REG_PWRCTRL_PWRONSTATUS_PD_CACHEB0_M;
  316. ui32PwrStatDisMask = 0;
  317. }
  318. else if ( ui32MemEn == AM_HAL_PWRCTRL_MEMEN_CACHE_DIS )
  319. {
  320. ui32MemEnMask = 0;
  321. ui32MemDisMask = AM_REG_PWRCTRL_MEMEN_CACHEB0_EN |
  322. AM_REG_PWRCTRL_MEMEN_CACHEB2_EN;
  323. ui32PwrStatEnMask = 0;
  324. ui32PwrStatDisMask = AM_REG_PWRCTRL_PWRONSTATUS_PD_CACHEB2_M |
  325. AM_REG_PWRCTRL_PWRONSTATUS_PD_CACHEB0_M;
  326. }
  327. else if ( ui32MemEn == AM_HAL_PWRCTRL_MEMEN_ALL )
  328. {
  329. ui32MemEnMask = AM_HAL_PWRCTRL_MEMEN_ALL;
  330. ui32MemDisMask = 0;
  331. ui32PwrStatEnMask = AM_HAL_PWRCTRL_PWRONSTATUS_SRAM_ALL;
  332. ui32PwrStatDisMask = 0;
  333. }
  334. else
  335. {
  336. return false;
  337. }
  338. //
  339. // Disable unneeded memory. If nothing to be disabled, skip to save time.
  340. //
  341. // Note that a deliberate disable step using a disable mask is taken here
  342. // for 2 reasons: 1) To only affect the specified type of memory, and 2)
  343. // To avoid inadvertently disabling any memory currently being depended on.
  344. //
  345. if ( ui32MemDisMask != 0 )
  346. {
  347. AM_REG(PWRCTRL, MEMEN) &= ~ui32MemDisMask;
  348. }
  349. //
  350. // Enable the required memory.
  351. //
  352. if ( ui32MemEnMask != 0 )
  353. {
  354. AM_REG(PWRCTRL, MEMEN) |= ui32MemEnMask;
  355. }
  356. //
  357. // Wait for the power to be turned on.
  358. // Apollo2 note - these loops typically end up taking 1 iteration.
  359. //
  360. i32TOcnt = 200;
  361. if ( ui32PwrStatDisMask )
  362. {
  363. while ( --i32TOcnt &&
  364. ( AM_REG(PWRCTRL, PWRONSTATUS) & ui32PwrStatDisMask ) );
  365. }
  366. if ( i32TOcnt <= 0 )
  367. {
  368. return false;
  369. }
  370. i32TOcnt = 200;
  371. if ( ui32PwrStatEnMask )
  372. {
  373. while ( --i32TOcnt &&
  374. (( AM_REG(PWRCTRL, PWRONSTATUS) & ui32PwrStatEnMask )
  375. != ui32PwrStatEnMask) );
  376. }
  377. if ( i32TOcnt <= 0 )
  378. {
  379. return false;
  380. }
  381. return true;
  382. }
  383. //*****************************************************************************
  384. //
  385. //! @brief Initialize the core and memory buck converters.
  386. //!
  387. //! This function is intended to be used for first time core and memory buck
  388. //! converters initialization.
  389. //!
  390. //! @return None
  391. //
  392. //*****************************************************************************
  393. void
  394. am_hal_pwrctrl_bucks_init(void)
  395. {
  396. am_hal_pwrctrl_bucks_enable();
  397. while ( ( AM_REG(PWRCTRL, POWERSTATUS) &
  398. ( AM_REG_PWRCTRL_POWERSTATUS_COREBUCKON_M |
  399. AM_REG_PWRCTRL_POWERSTATUS_MEMBUCKON_M ) ) !=
  400. ( AM_REG_PWRCTRL_POWERSTATUS_COREBUCKON_M |
  401. AM_REG_PWRCTRL_POWERSTATUS_MEMBUCKON_M ) );
  402. //
  403. // Additional delay to make sure BUCKs are initialized.
  404. //
  405. am_hal_flash_delay(200 / 3);
  406. }
  407. //*****************************************************************************
  408. //
  409. //! @brief Enable the core and memory buck converters.
  410. //!
  411. //! This function enables the core and memory buck converters.
  412. //!
  413. //! @return None
  414. //
  415. //*****************************************************************************
  416. #define LDO_TRIM_REG_ADDR (0x50023004)
  417. #define BUCK_TRIM_REG_ADDR (0x50023000)
  418. void
  419. am_hal_pwrctrl_bucks_enable(void)
  420. {
  421. //
  422. // Check to see if the bucks are already on. If so, we can just return.
  423. //
  424. if ( AM_BFR(PWRCTRL, POWERSTATUS, COREBUCKON) &&
  425. AM_BFR(PWRCTRL, POWERSTATUS, MEMBUCKON) )
  426. {
  427. return;
  428. }
  429. //
  430. // Enable BUCK power up
  431. //
  432. AM_BFW(PWRCTRL, SUPPLYSRC, COREBUCKEN, 1);
  433. AM_BFW(PWRCTRL, SUPPLYSRC, MEMBUCKEN, 1);
  434. //
  435. // Make sure bucks are ready.
  436. //
  437. while ( ( AM_REG(PWRCTRL, POWERSTATUS) &
  438. ( AM_REG_PWRCTRL_POWERSTATUS_COREBUCKON_M |
  439. AM_REG_PWRCTRL_POWERSTATUS_MEMBUCKON_M ) ) !=
  440. ( AM_REG_PWRCTRL_POWERSTATUS_COREBUCKON_M |
  441. AM_REG_PWRCTRL_POWERSTATUS_MEMBUCKON_M ) );
  442. }
  443. //*****************************************************************************
  444. //
  445. //! @brief Disable the core and memory buck converters.
  446. //!
  447. //! This function disables the core and memory buck converters.
  448. //!
  449. //! @return None
  450. //
  451. //*****************************************************************************
  452. void
  453. am_hal_pwrctrl_bucks_disable(void)
  454. {
  455. //
  456. // Check to see if the bucks are already off. If so, we can just return.
  457. //
  458. if ( AM_BFR(PWRCTRL, POWERSTATUS, COREBUCKON) == 0 &&
  459. AM_BFR(PWRCTRL, POWERSTATUS, MEMBUCKON) == 0)
  460. {
  461. return;
  462. }
  463. //
  464. // Handle the special case if only the ADC is powered.
  465. //
  466. if ( isRev_ADC() &&
  467. (AM_REG(PWRCTRL, DEVICEEN) == AM_REG_PWRCTRL_DEVICEEN_ADC_EN) )
  468. {
  469. //
  470. // Set SUPPLYSRC to handle this case
  471. //
  472. AM_REG(PWRCTRL, SUPPLYSRC) &=
  473. (AM_REG_PWRCTRL_SUPPLYSRC_SWITCH_LDO_IN_SLEEP_EN |
  474. AM_REG_PWRCTRL_SUPPLYSRC_MEMBUCKEN_EN);
  475. }
  476. else
  477. {
  478. //
  479. // Power them down
  480. //
  481. AM_BFW(PWRCTRL, SUPPLYSRC, COREBUCKEN, 0);
  482. AM_BFW(PWRCTRL, SUPPLYSRC, MEMBUCKEN, 0);
  483. }
  484. //
  485. // Wait until BUCKs are disabled.
  486. //
  487. am_hal_flash_delay(AM_HAL_PWRCTRL_BUCKDIS_DELAYCYCLES / 3);
  488. }
  489. //*****************************************************************************
  490. //
  491. //! @brief Misc low power initializations.
  492. //!
  493. //! This function performs low power initializations that aren't specifically
  494. //! handled elsewhere.
  495. //!
  496. //! @return None
  497. //
  498. //*****************************************************************************
  499. void
  500. am_hal_pwrctrl_low_power_init(void)
  501. {
  502. //
  503. // For lowest power, we enable clock gating for all SRAM configuration.
  504. //
  505. AM_REG(PWRCTRL, SRAMCTRL) |=
  506. AM_REG_PWRCTRL_SRAMCTRL_SRAM_MASTER_CLKGATE_EN |
  507. AM_REG_PWRCTRL_SRAMCTRL_SRAM_CLKGATE_EN |
  508. AM_REG_PWRCTRL_SRAMCTRL_SRAM_LIGHT_SLEEP_DIS;
  509. //
  510. // For lowest deep sleep power, make sure we stay in BUCK mode.
  511. //
  512. AM_REG(PWRCTRL, SUPPLYSRC) &=
  513. ~AM_REG_PWRCTRL_SUPPLYSRC_SWITCH_LDO_IN_SLEEP_M;
  514. }
  515. //*****************************************************************************
  516. //
  517. // End Doxygen group.
  518. //! @}
  519. //
  520. //*****************************************************************************