fsl_clock.h 56 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258
  1. /*
  2. * Copyright 2017 NXP
  3. *
  4. * Redistribution and use in source and binary forms, with or without modification,
  5. * are permitted provided that the following conditions are met:
  6. *
  7. * o Redistributions of source code must retain the above copyright notice, this list
  8. * of conditions and the following disclaimer.
  9. *
  10. * o Redistributions in binary form must reproduce the above copyright notice, this
  11. * list of conditions and the following disclaimer in the documentation and/or
  12. * other materials provided with the distribution.
  13. *
  14. * o Neither the name of the copyright holder nor the names of its
  15. * contributors may be used to endorse or promote products derived from this
  16. * software without specific prior written permission.
  17. *
  18. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  19. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  20. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  21. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
  22. * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  23. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  24. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
  25. * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  26. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  27. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  28. */
  29. #ifndef _FSL_CLOCK_H_
  30. #define _FSL_CLOCK_H_
  31. #include "fsl_device_registers.h"
  32. #include <stdint.h>
  33. #include <stdbool.h>
  34. #include <assert.h>
  35. /*!
  36. * @addtogroup clock
  37. * @{
  38. */
  39. /*******************************************************************************
  40. * Definitions
  41. ******************************************************************************/
  42. #define CCM_TUPLE(reg, shift, mask, busyShift) ((((uint32_t)(&((CCM_Type *)0U)->reg)) & 0xFFU) | ((shift) << 8U) | ((((mask) >> (shift)) & 0x1FFFU) << 13U) | ((busyShift) << 26U))
  43. #define CCM_TUPLE_REG(base, tuple) (*((volatile uint32_t *)(((uint32_t)(base)) + ((tuple) & 0xFFU))))
  44. #define CCM_TUPLE_SHIFT(tuple) (((tuple) >> 8U) & 0x1FU)
  45. #define CCM_TUPLE_MASK(tuple) ((uint32_t)((((tuple) >> 13U) & 0x1FFFU) << ((((tuple) >> 8U) & 0x1FU))))
  46. #define CCM_TUPLE_BUSY_SHIFT(tuple) (((tuple) >> 26U) & 0x3FU)
  47. #define CCM_NO_BUSY_WAIT (0x20U)
  48. /*! @brief Configure whether driver controls clock
  49. *
  50. * When set to 0, peripheral drivers will enable clock in initialize function
  51. * and disable clock in de-initialize function. When set to 1, peripheral
  52. * driver will not control the clock, application could control the clock out of
  53. * the driver.
  54. *
  55. * @note All drivers share this feature switcher. If it is set to 1, application
  56. * should handle clock enable and disable for all drivers.
  57. */
  58. #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL))
  59. #define FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL 0
  60. #endif
  61. /*! @name Driver version */
  62. /*@{*/
  63. /*! @brief CLOCK driver version 2.1.0. */
  64. #define FSL_CLOCK_DRIVER_VERSION (MAKE_VERSION(2, 1, 0))
  65. /*@}*/
  66. /*! @brief External XTAL (24M OSC/SYSOSC) clock frequency.
  67. *
  68. * The XTAL (24M OSC/SYSOSC) clock frequency in Hz, when the clock is setup, use the
  69. * function CLOCK_SetXtalFreq to set the value in to clock driver. For example,
  70. * if XTAL is 24MHz,
  71. * @code
  72. * CLOCK_InitExternalClk(false); // Setup the 24M OSC/SYSOSC
  73. * CLOCK_SetXtalFreq(240000000); // Set the XTAL value to clock driver.
  74. * @endcode
  75. */
  76. extern uint32_t g_xtalFreq;
  77. /*! @brief External RTC XTAL (32K OSC) clock frequency.
  78. *
  79. * The RTC XTAL (32K OSC) clock frequency in Hz, when the clock is setup, use the
  80. * function CLOCK_SetRtcXtalFreq to set the value in to clock driver.
  81. */
  82. extern uint32_t g_rtcXtalFreq;
  83. /* For compatible with other platforms */
  84. #define CLOCK_SetXtal0Freq CLOCK_SetXtalFreq
  85. #define CLOCK_SetXtal32Freq CLOCK_SetRtcXtalFreq
  86. /*! @brief Clock ip name array for ADC. */
  87. #define ADC_CLOCKS \
  88. { \
  89. kCLOCK_IpInvalid, kCLOCK_Adc1 \
  90. }
  91. /*! @brief Clock ip name array for ADC_5HC. */
  92. #define ADC_5HC_CLOCKS \
  93. { \
  94. kCLOCK_Adc_5hc \
  95. }
  96. /*! @brief Clock ip name array for AOI. */
  97. #define AOI_CLOCKS \
  98. { \
  99. kCLOCK_IpInvalid, kCLOCK_Aoi1, kCLOCK_Aoi2 \
  100. }
  101. /*! @brief Clock ip name array for BEE. */
  102. #define BEE_CLOCKS \
  103. { \
  104. kCLOCK_Bee \
  105. }
  106. /*! @brief Clock ip name array for CMP. */
  107. #define CMP_CLOCKS \
  108. { \
  109. kCLOCK_IpInvalid, kCLOCK_Acmp1, kCLOCK_Acmp2, \
  110. kCLOCK_Acmp3, kCLOCK_Acmp4 \
  111. }
  112. /*! @brief Clock ip name array for CSI. */
  113. #define CSI_CLOCKS \
  114. { \
  115. kCLOCK_Csi \
  116. }
  117. /*! @brief Clock ip name array for DCDC. */
  118. #define DCDC_CLOCKS \
  119. { \
  120. kCLOCK_Dcdc \
  121. }
  122. /*! @brief Clock ip name array for DCP. */
  123. #define DCP_CLOCKS \
  124. { \
  125. kCLOCK_Dcp \
  126. }
  127. /*! @brief Clock ip name array for DMAMUX_CLOCKS. */
  128. #define DMAMUX_CLOCKS \
  129. { \
  130. kCLOCK_Dma \
  131. }
  132. /*! @brief Clock ip name array for DMA. */
  133. #define EDMA_CLOCKS \
  134. { \
  135. kCLOCK_Dma \
  136. }
  137. /*! @brief Clock ip name array for ENC. */
  138. #define ENC_CLOCKS \
  139. { \
  140. kCLOCK_IpInvalid, kCLOCK_Enc1, kCLOCK_Enc2, \
  141. kCLOCK_Enc3, kCLOCK_Enc4 \
  142. }
  143. /*! @brief Clock ip name array for ENET. */
  144. #define ENET_CLOCKS \
  145. { \
  146. kCLOCK_Enet \
  147. }
  148. /*! @brief Clock ip name array for EWM. */
  149. #define EWM_CLOCKS \
  150. { \
  151. kCLOCK_Ewm0 \
  152. }
  153. /*! @brief Clock ip name array for FLEXCAN. */
  154. #define FLEXCAN_CLOCKS \
  155. { \
  156. kCLOCK_IpInvalid, kCLOCK_Can1, kCLOCK_Can2 \
  157. }
  158. /*! @brief Clock ip name array for FLEXCAN Peripheral clock. */
  159. #define FLEXCAN_PERIPH_CLOCKS \
  160. { \
  161. kCLOCK_IpInvalid, kCLOCK_Can1S, kCLOCK_Can2S \
  162. }
  163. /*! @brief Clock ip name array for FLEXIO. */
  164. #define FLEXIO_CLOCKS \
  165. { \
  166. kCLOCK_IpInvalid, kCLOCK_Flexio1, kCLOCK_Flexio2 \
  167. }
  168. /*! @brief Clock ip name array for FLEXRAM. */
  169. #define FLEXRAM_CLOCKS \
  170. { \
  171. kCLOCK_FlexRam \
  172. }
  173. /*! @brief Clock ip name array for FLEXSPI. */
  174. #define FLEXSPI_CLOCKS \
  175. { \
  176. kCLOCK_FlexSpi \
  177. }
  178. /*! @brief Clock ip name array for GPIO. */
  179. #define GPIO_CLOCKS \
  180. { \
  181. kCLOCK_IpInvalid, kCLOCK_Gpio1, kCLOCK_Gpio2, \
  182. kCLOCK_Gpio3, kCLOCK_Gpio4, kCLOCK_Gpio5 \
  183. }
  184. /*! @brief Clock ip name array for GPT. */
  185. #define GPT_CLOCKS \
  186. { \
  187. kCLOCK_IpInvalid, kCLOCK_Gpt1, kCLOCK_Gpt2 \
  188. }
  189. /*! @brief Clock ip name array for KPP. */
  190. #define KPP_CLOCKS \
  191. { \
  192. kCLOCK_Kpp \
  193. }
  194. /*! @brief Clock ip name array for LCDIF. */
  195. #define LCDIF_CLOCKS \
  196. { \
  197. kCLOCK_Lcd \
  198. }
  199. /*! @brief Clock ip name array for LCDIF PIXEL. */
  200. #define LCDIF_PERIPH_CLOCKS \
  201. { \
  202. kCLOCK_LcdPixel \
  203. }
  204. /*! @brief Clock ip name array for LPI2C. */
  205. #define LPI2C_CLOCKS \
  206. { \
  207. kCLOCK_IpInvalid, kCLOCK_Lpi2c1, kCLOCK_Lpi2c2, \
  208. kCLOCK_Lpi2c3, kCLOCK_Lpi2c4 \
  209. }
  210. /*! @brief Clock ip name array for LPSPI. */
  211. #define LPSPI_CLOCKS \
  212. { \
  213. kCLOCK_IpInvalid, kCLOCK_Lpspi1, kCLOCK_Lpspi2, \
  214. kCLOCK_Lpspi3, kCLOCK_Lpspi4 \
  215. }
  216. /*! @brief Clock ip name array for LPUART. */
  217. #define LPUART_CLOCKS \
  218. { \
  219. kCLOCK_IpInvalid, kCLOCK_Lpuart1, kCLOCK_Lpuart2, \
  220. kCLOCK_Lpuart3, kCLOCK_Lpuart4, kCLOCK_Lpuart5, \
  221. kCLOCK_Lpuart6, kCLOCK_Lpuart7, kCLOCK_Lpuart8 \
  222. }
  223. /*! @brief Clock ip name array for PIT. */
  224. #define PIT_CLOCKS \
  225. { \
  226. kCLOCK_Pit \
  227. }
  228. /*! @brief Clock ip name array for PWM. */
  229. #define PWM_CLOCKS \
  230. { \
  231. { \
  232. kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, \
  233. kCLOCK_IpInvalid \
  234. } \
  235. , \
  236. { \
  237. kCLOCK_Pwm1, kCLOCK_Pwm1,kCLOCK_Pwm1, kCLOCK_Pwm1 \
  238. } \
  239. , \
  240. { \
  241. kCLOCK_Pwm2, kCLOCK_Pwm2,kCLOCK_Pwm2, kCLOCK_Pwm2 \
  242. } \
  243. , \
  244. { \
  245. kCLOCK_Pwm3, kCLOCK_Pwm3,kCLOCK_Pwm3, kCLOCK_Pwm3 \
  246. } \
  247. , \
  248. { \
  249. kCLOCK_Pwm4, kCLOCK_Pwm4,kCLOCK_Pwm4, kCLOCK_Pwm4 \
  250. } \
  251. }
  252. /*! @brief Clock ip name array for PXP. */
  253. #define PXP_CLOCKS \
  254. { \
  255. kCLOCK_Pxp \
  256. }
  257. /*! @brief Clock ip name array for RTWDOG. */
  258. #define RTWDOG_CLOCKS \
  259. { \
  260. kCLOCK_Wdog3 \
  261. }
  262. /*! @brief Clock ip name array for SAI. */
  263. #define SAI_CLOCKS \
  264. { \
  265. kCLOCK_IpInvalid, kCLOCK_Sai1, kCLOCK_Sai2, \
  266. kCLOCK_Sai3 \
  267. }
  268. /*! @brief Clock ip name array for SEMC. */
  269. #define SEMC_CLOCKS \
  270. { \
  271. kCLOCK_Semc \
  272. }
  273. /*! @brief Clock ip name array for QTIMER. */
  274. #define TMR_CLOCKS \
  275. { \
  276. kCLOCK_IpInvalid, kCLOCK_Timer1, kCLOCK_Timer2, \
  277. kCLOCK_Timer3, kCLOCK_Timer4 \
  278. }
  279. /*! @brief Clock ip name array for TRNG. */
  280. #define TRNG_CLOCKS \
  281. { \
  282. kCLOCK_Trng \
  283. }
  284. /*! @brief Clock ip name array for TSC. */
  285. #define TSC_CLOCKS \
  286. { \
  287. kCLOCK_Tsc \
  288. }
  289. /*! @brief Clock ip name array for WDOG. */
  290. #define WDOG_CLOCKS \
  291. { \
  292. kCLOCK_IpInvalid, kCLOCK_Wdog1, kCLOCK_Wdog2 \
  293. }
  294. /*! @brief Clock ip name array for USDHC. */
  295. #define USDHC_CLOCKS \
  296. { \
  297. kCLOCK_IpInvalid, kCLOCK_Usdhc1, kCLOCK_Usdhc2 \
  298. }
  299. /*! @brief Clock ip name array for SPDIF. */
  300. #define SPDIF_CLOCKS \
  301. { \
  302. kCLOCK_Spdif \
  303. }
  304. /*! @brief Clock ip name array for XBARA. */
  305. #define XBARA_CLOCKS \
  306. { \
  307. kCLOCK_Xbar1 \
  308. }
  309. /*! @brief Clock ip name array for XBARB. */
  310. #define XBARB_CLOCKS \
  311. { \
  312. kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_Xbar2, \
  313. kCLOCK_Xbar3 \
  314. }
  315. /*! @brief Clock name used to get clock frequency. */
  316. typedef enum _clock_name
  317. {
  318. kCLOCK_CpuClk = 0x0U, /*!< CPU clock */
  319. kCLOCK_AhbClk = 0x1U, /*!< AHB clock */
  320. kCLOCK_SemcClk = 0x2U, /*!< SEMC clock */
  321. kCLOCK_IpgClk = 0x3U, /*!< IPG clock */
  322. kCLOCK_OscClk = 0x4U, /*!< OSC clock selected by PMU_LOWPWR_CTRL[OSC_SEL]. */
  323. kCLOCK_RtcClk = 0x5U, /*!< RTC clock. (RTCCLK) */
  324. kCLOCK_ArmPllClk = 0x6U, /*!< ARMPLLCLK. */
  325. kCLOCK_Usb1PllClk = 0x7U, /*!< USB1PLLCLK. */
  326. kCLOCK_Usb1PllPfd0Clk = 0x8U, /*!< USB1PLLPDF0CLK. */
  327. kCLOCK_Usb1PllPfd1Clk = 0x9U, /*!< USB1PLLPFD1CLK. */
  328. kCLOCK_Usb1PllPfd2Clk = 0xAU, /*!< USB1PLLPFD2CLK. */
  329. kCLOCK_Usb1PllPfd3Clk = 0xBU, /*!< USB1PLLPFD3CLK. */
  330. kCLOCK_Usb2PllClk = 0xCU, /*!< USB2PLLCLK. */
  331. kCLOCK_SysPllClk = 0xDU, /*!< SYSPLLCLK. */
  332. kCLOCK_SysPllPfd0Clk = 0xEU, /*!< SYSPLLPDF0CLK. */
  333. kCLOCK_SysPllPfd1Clk = 0xFU, /*!< SYSPLLPFD1CLK. */
  334. kCLOCK_SysPllPfd2Clk = 0x10U, /*!< SYSPLLPFD2CLK. */
  335. kCLOCK_SysPllPfd3Clk = 0x11U, /*!< SYSPLLPFD3CLK. */
  336. kCLOCK_EnetPll0Clk = 0x12U, /*!< Enet PLLCLK ref_enetpll0. */
  337. kCLOCK_EnetPll1Clk = 0x13U, /*!< Enet PLLCLK ref_enetpll1. */
  338. kCLOCK_EnetPll2Clk = 0x14U, /*!< Enet PLLCLK ref_enetpll2. */
  339. kCLOCK_AudioPllClk = 0x15U, /*!< Audio PLLCLK. */
  340. kCLOCK_VideoPllClk = 0x16U, /*!< Video PLLCLK. */
  341. } clock_name_t;
  342. #define kCLOCK_CoreSysClk kCLOCK_CpuClk /*!< For compatible with other platforms without CCM. */
  343. #define CLOCK_GetCoreSysClkFreq CLOCK_GetCpuClkFreq /*!< For compatible with other platforms without CCM. */
  344. /*!
  345. * @brief CCM CCGR gate control for each module independently.
  346. */
  347. typedef enum _clock_ip_name
  348. {
  349. kCLOCK_IpInvalid = -1,
  350. /* CCM CCGR0 */
  351. kCLOCK_Aips_tz1 = (0U << 8U) | CCM_CCGR0_CG0_SHIFT, /*!< CCGR0, CG0 */
  352. kCLOCK_Aips_tz2 = (0U << 8U) | CCM_CCGR0_CG1_SHIFT, /*!< CCGR0, CG1 */
  353. /*!< CCGR0, CG2, Reserved */
  354. /*!< CCGR0, CG3, Reserved */
  355. /*!< CCGR0, CG4, Reserved */
  356. kCLOCK_Dcp = (0U << 8U) | CCM_CCGR0_CG5_SHIFT, /*!< CCGR0, CG5 */
  357. kCLOCK_Lpuart3 = (0U << 8U) | CCM_CCGR0_CG6_SHIFT, /*!< CCGR0, CG6 */
  358. kCLOCK_Can1 = (0U << 8U) | CCM_CCGR0_CG7_SHIFT, /*!< CCGR0, CG7 */
  359. kCLOCK_Can1S = (0U << 8U) | CCM_CCGR0_CG8_SHIFT, /*!< CCGR0, CG8 */
  360. kCLOCK_Can2 = (0U << 8U) | CCM_CCGR0_CG9_SHIFT, /*!< CCGR0, CG9 */
  361. kCLOCK_Can2S = (0U << 8U) | CCM_CCGR0_CG10_SHIFT, /*!< CCGR0, CG10 */
  362. kCLOCK_Trace = (0U << 8U) | CCM_CCGR0_CG11_SHIFT, /*!< CCGR0, CG11 */
  363. kCLOCK_Gpt2 = (0U << 8U) | CCM_CCGR0_CG12_SHIFT, /*!< CCGR0, CG12 */
  364. kCLOCK_Gpt2S = (0U << 8U) | CCM_CCGR0_CG13_SHIFT, /*!< CCGR0, CG13 */
  365. kCLOCK_Lpuart2 = (0U << 8U) | CCM_CCGR0_CG14_SHIFT, /*!< CCGR0, CG14 */
  366. kCLOCK_Gpio2 = (0U << 8U) | CCM_CCGR0_CG15_SHIFT, /*!< CCGR0, CG15 */
  367. /* CCM CCGR1 */
  368. kCLOCK_Lpspi1 = (1U << 8U) | CCM_CCGR1_CG0_SHIFT, /*!< CCGR1, CG0 */
  369. kCLOCK_Lpspi2 = (1U << 8U) | CCM_CCGR1_CG1_SHIFT, /*!< CCGR1, CG1 */
  370. kCLOCK_Lpspi3 = (1U << 8U) | CCM_CCGR1_CG2_SHIFT, /*!< CCGR1, CG2 */
  371. kCLOCK_Lpspi4 = (1U << 8U) | CCM_CCGR1_CG3_SHIFT, /*!< CCGR1, CG3 */
  372. kCLOCK_Adc_5hc = (1U << 8U) | CCM_CCGR1_CG4_SHIFT, /*!< CCGR1, CG4 */
  373. kCLOCK_Enet = (1U << 8U) | CCM_CCGR1_CG5_SHIFT, /*!< CCGR1, CG5 */
  374. kCLOCK_Pit = (1U << 8U) | CCM_CCGR1_CG6_SHIFT, /*!< CCGR1, CG6 */
  375. kCLOCK_Aoi2 = (1U << 8U) | CCM_CCGR1_CG7_SHIFT, /*!< CCGR1, CG7 */
  376. kCLOCK_Adc1 = (1U << 8U) | CCM_CCGR1_CG8_SHIFT, /*!< CCGR1, CG8 */
  377. /*!< CCGR1, CG9, Reserved */
  378. kCLOCK_Gpt1 = (1U << 8U) | CCM_CCGR1_CG10_SHIFT, /*!< CCGR1, CG10 */
  379. kCLOCK_Gpt1S = (1U << 8U) | CCM_CCGR1_CG11_SHIFT, /*!< CCGR1, CG11 */
  380. kCLOCK_Lpuart4 = (1U << 8U) | CCM_CCGR1_CG12_SHIFT, /*!< CCGR1, CG12 */
  381. kCLOCK_Gpio1 = (1U << 8U) | CCM_CCGR1_CG13_SHIFT, /*!< CCGR1, CG13 */
  382. kCLOCK_Csu = (1U << 8U) | CCM_CCGR1_CG14_SHIFT, /*!< CCGR1, CG14 */
  383. kCLOCK_Gpio5 = (1U << 8U) | CCM_CCGR1_CG15_SHIFT, /*!< CCGR1, CG15 */
  384. /* CCM CCGR2 */
  385. /*!< CCGR2, CG0, Reserved */
  386. kCLOCK_Csi = (2U << 8U) | CCM_CCGR2_CG1_SHIFT, /*!< CCGR2, CG1 */
  387. kCLOCK_IomuxcSnvs = (2U << 8U) | CCM_CCGR2_CG2_SHIFT, /*!< CCGR2, CG2 */
  388. kCLOCK_Lpi2c1 = (2U << 8U) | CCM_CCGR2_CG3_SHIFT, /*!< CCGR2, CG3 */
  389. kCLOCK_Lpi2c2 = (2U << 8U) | CCM_CCGR2_CG4_SHIFT, /*!< CCGR2, CG4 */
  390. kCLOCK_Lpi2c3 = (2U << 8U) | CCM_CCGR2_CG5_SHIFT, /*!< CCGR2, CG5 */
  391. kCLOCK_Ocotp = (2U << 8U) | CCM_CCGR2_CG6_SHIFT, /*!< CCGR2, CG6 */
  392. kCLOCK_Xbar3 = (2U << 8U) | CCM_CCGR2_CG7_SHIFT, /*!< CCGR2, CG7 */
  393. kCLOCK_Ipmux1 = (2U << 8U) | CCM_CCGR2_CG8_SHIFT, /*!< CCGR2, CG8 */
  394. kCLOCK_Ipmux2 = (2U << 8U) | CCM_CCGR2_CG9_SHIFT, /*!< CCGR2, CG9 */
  395. kCLOCK_Ipmux3 = (2U << 8U) | CCM_CCGR2_CG10_SHIFT, /*!< CCGR2, CG10 */
  396. kCLOCK_Xbar1 = (2U << 8U) | CCM_CCGR2_CG11_SHIFT, /*!< CCGR2, CG11 */
  397. kCLOCK_Xbar2 = (2U << 8U) | CCM_CCGR2_CG12_SHIFT, /*!< CCGR2, CG12 */
  398. kCLOCK_Gpio3 = (2U << 8U) | CCM_CCGR2_CG13_SHIFT, /*!< CCGR2, CG13 */
  399. kCLOCK_Lcd = (2U << 8U) | CCM_CCGR2_CG14_SHIFT, /*!< CCGR2, CG14 */
  400. kCLOCK_Pxp = (2U << 8U) | CCM_CCGR2_CG15_SHIFT, /*!< CCGR2, CG15 */
  401. /* CCM CCGR3 */
  402. kCLOCK_Flexio2 = (3U << 8U) | CCM_CCGR3_CG0_SHIFT, /*!< CCGR3, CG0 */
  403. kCLOCK_Lpuart5 = (3U << 8U) | CCM_CCGR3_CG1_SHIFT, /*!< CCGR3, CG1 */
  404. kCLOCK_Semc = (3U << 8U) | CCM_CCGR3_CG2_SHIFT, /*!< CCGR3, CG2 */
  405. kCLOCK_Lpuart6 = (3U << 8U) | CCM_CCGR3_CG3_SHIFT, /*!< CCGR3, CG3 */
  406. kCLOCK_Aoi1 = (3U << 8U) | CCM_CCGR3_CG4_SHIFT, /*!< CCGR3, CG4 */
  407. kCLOCK_LcdPixel = (3U << 8U) | CCM_CCGR3_CG5_SHIFT, /*!< CCGR3, CG5 */
  408. kCLOCK_Gpio4 = (3U << 8U) | CCM_CCGR3_CG6_SHIFT, /*!< CCGR3, CG6 */
  409. kCLOCK_Ewm0 = (3U << 8U) | CCM_CCGR3_CG7_SHIFT, /*!< CCGR3, CG7 */
  410. kCLOCK_Wdog1 = (3U << 8U) | CCM_CCGR3_CG8_SHIFT, /*!< CCGR3, CG8 */
  411. kCLOCK_FlexRam = (3U << 8U) | CCM_CCGR3_CG9_SHIFT, /*!< CCGR3, CG9 */
  412. kCLOCK_Acmp1 = (3U << 8U) | CCM_CCGR3_CG10_SHIFT, /*!< CCGR3, CG10 */
  413. kCLOCK_Acmp2 = (3U << 8U) | CCM_CCGR3_CG11_SHIFT, /*!< CCGR3, CG11 */
  414. kCLOCK_Acmp3 = (3U << 8U) | CCM_CCGR3_CG12_SHIFT, /*!< CCGR3, CG12 */
  415. kCLOCK_Acmp4 = (3U << 8U) | CCM_CCGR3_CG13_SHIFT, /*!< CCGR3, CG13 */
  416. kCLOCK_Ocram = (3U << 8U) | CCM_CCGR3_CG14_SHIFT, /*!< CCGR3, CG14 */
  417. kCLOCK_IomuxcSnvsGpr = (3U << 8U) | CCM_CCGR3_CG15_SHIFT, /*!< CCGR3, CG15 */
  418. /* CCM CCGR4 */
  419. kCLOCK_Iomuxc = (4U << 8U) | CCM_CCGR4_CG1_SHIFT, /*!< CCGR4, CG1 */
  420. kCLOCK_IomuxcGpr = (4U << 8U) | CCM_CCGR4_CG2_SHIFT, /*!< CCGR4, CG2 */
  421. kCLOCK_Bee = (4U << 8U) | CCM_CCGR4_CG3_SHIFT, /*!< CCGR4, CG3 */
  422. kCLOCK_SimM7 = (4U << 8U) | CCM_CCGR4_CG4_SHIFT, /*!< CCGR4, CG4 */
  423. kCLOCK_Tsc = (4U << 8U) | CCM_CCGR4_CG5_SHIFT, /*!< CCGR4, CG5 */
  424. kCLOCK_SimM = (4U << 8U) | CCM_CCGR4_CG6_SHIFT, /*!< CCGR4, CG6 */
  425. kCLOCK_SimEms = (4U << 8U) | CCM_CCGR4_CG7_SHIFT, /*!< CCGR4, CG7 */
  426. kCLOCK_Pwm1 = (4U << 8U) | CCM_CCGR4_CG8_SHIFT, /*!< CCGR4, CG8 */
  427. kCLOCK_Pwm2 = (4U << 8U) | CCM_CCGR4_CG9_SHIFT, /*!< CCGR4, CG9 */
  428. kCLOCK_Pwm3 = (4U << 8U) | CCM_CCGR4_CG10_SHIFT, /*!< CCGR4, CG10 */
  429. kCLOCK_Pwm4 = (4U << 8U) | CCM_CCGR4_CG11_SHIFT, /*!< CCGR4, CG11 */
  430. kCLOCK_Enc1 = (4U << 8U) | CCM_CCGR4_CG12_SHIFT, /*!< CCGR4, CG12 */
  431. kCLOCK_Enc2 = (4U << 8U) | CCM_CCGR4_CG13_SHIFT, /*!< CCGR4, CG13 */
  432. kCLOCK_Enc3 = (4U << 8U) | CCM_CCGR4_CG14_SHIFT, /*!< CCGR4, CG14 */
  433. kCLOCK_Enc4 = (4U << 8U) | CCM_CCGR4_CG15_SHIFT, /*!< CCGR4, CG15 */
  434. /* CCM CCGR5 */
  435. kCLOCK_Rom = (5U << 8U) | CCM_CCGR5_CG0_SHIFT, /*!< CCGR5, CG0 */
  436. kCLOCK_Flexio1 = (5U << 8U) | CCM_CCGR5_CG1_SHIFT, /*!< CCGR5, CG1 */
  437. kCLOCK_Wdog3 = (5U << 8U) | CCM_CCGR5_CG2_SHIFT, /*!< CCGR5, CG2 */
  438. kCLOCK_Dma = (5U << 8U) | CCM_CCGR5_CG3_SHIFT, /*!< CCGR5, CG3 */
  439. kCLOCK_Kpp = (5U << 8U) | CCM_CCGR5_CG4_SHIFT, /*!< CCGR5, CG4 */
  440. kCLOCK_Wdog2 = (5U << 8U) | CCM_CCGR5_CG5_SHIFT, /*!< CCGR5, CG5 */
  441. kCLOCK_Aips_tz4 = (5U << 8U) | CCM_CCGR5_CG6_SHIFT, /*!< CCGR5, CG6 */
  442. kCLOCK_Spdif = (5U << 8U) | CCM_CCGR5_CG7_SHIFT, /*!< CCGR5, CG7 */
  443. kCLOCK_SimMain = (5U << 8U) | CCM_CCGR5_CG8_SHIFT, /*!< CCGR5, CG8 */
  444. kCLOCK_Sai1 = (5U << 8U) | CCM_CCGR5_CG9_SHIFT, /*!< CCGR5, CG9 */
  445. kCLOCK_Sai2 = (5U << 8U) | CCM_CCGR5_CG10_SHIFT, /*!< CCGR5, CG10 */
  446. kCLOCK_Sai3 = (5U << 8U) | CCM_CCGR5_CG11_SHIFT, /*!< CCGR5, CG11 */
  447. kCLOCK_Lpuart1 = (5U << 8U) | CCM_CCGR5_CG12_SHIFT, /*!< CCGR5, CG12 */
  448. kCLOCK_Lpuart7 = (5U << 8U) | CCM_CCGR5_CG13_SHIFT, /*!< CCGR5, CG13 */
  449. kCLOCK_SnvsHp = (5U << 8U) | CCM_CCGR5_CG14_SHIFT, /*!< CCGR5, CG14 */
  450. kCLOCK_SnvsLp = (5U << 8U) | CCM_CCGR5_CG15_SHIFT, /*!< CCGR5, CG15 */
  451. /* CCM CCGR6 */
  452. kCLOCK_UsbOh3 = (6U << 8U) | CCM_CCGR6_CG0_SHIFT, /*!< CCGR6, CG0 */
  453. kCLOCK_Usdhc1 = (6U << 8U) | CCM_CCGR6_CG1_SHIFT, /*!< CCGR6, CG1 */
  454. kCLOCK_Usdhc2 = (6U << 8U) | CCM_CCGR6_CG2_SHIFT, /*!< CCGR6, CG2 */
  455. kCLOCK_Dcdc = (6U << 8U) | CCM_CCGR6_CG3_SHIFT, /*!< CCGR6, CG3 */
  456. kCLOCK_Ipmux4 = (6U << 8U) | CCM_CCGR6_CG4_SHIFT, /*!< CCGR6, CG4 */
  457. kCLOCK_FlexSpi = (6U << 8U) | CCM_CCGR6_CG5_SHIFT, /*!< CCGR6, CG5 */
  458. kCLOCK_Trng = (6U << 8U) | CCM_CCGR6_CG6_SHIFT, /*!< CCGR6, CG6 */
  459. kCLOCK_Lpuart8 = (6U << 8U) | CCM_CCGR6_CG7_SHIFT, /*!< CCGR6, CG7 */
  460. kCLOCK_Timer4 = (6U << 8U) | CCM_CCGR6_CG8_SHIFT, /*!< CCGR6, CG8 */
  461. kCLOCK_Aips_tz3 = (6U << 8U) | CCM_CCGR6_CG9_SHIFT, /*!< CCGR6, CG9 */
  462. kCLOCK_SimPer = (6U << 8U) | CCM_CCGR6_CG10_SHIFT, /*!< CCGR6, CG10 */
  463. kCLOCK_Anadig = (6U << 8U) | CCM_CCGR6_CG11_SHIFT, /*!< CCGR6, CG11 */
  464. kCLOCK_Lpi2c4 = (6U << 8U) | CCM_CCGR6_CG12_SHIFT, /*!< CCGR6, CG12 */
  465. kCLOCK_Timer1 = (6U << 8U) | CCM_CCGR6_CG13_SHIFT, /*!< CCGR6, CG13 */
  466. kCLOCK_Timer2 = (6U << 8U) | CCM_CCGR6_CG14_SHIFT, /*!< CCGR6, CG14 */
  467. kCLOCK_Timer3 = (6U << 8U) | CCM_CCGR6_CG15_SHIFT, /*!< CCGR6, CG15 */
  468. } clock_ip_name_t;
  469. /*! @brief OSC 24M sorce select */
  470. typedef enum _clock_osc
  471. {
  472. kCLOCK_RcOsc = 0U, /*!< On chip OSC. */
  473. kCLOCK_XtalOsc = 1U, /*!< 24M Xtal OSC */
  474. } clock_osc_t;
  475. /*! @brief Clock gate value */
  476. typedef enum _clock_gate_value
  477. {
  478. kCLOCK_ClockNotNeeded = 0U, /*!< Clock is off during all modes. */
  479. kCLOCK_ClockNeededRun = 1U, /*!< Clock is on in run mode, but off in WAIT and STOP modes */
  480. kCLOCK_ClockNeededRunWait = 3U, /*!< Clock is on during all modes, except STOP mode */
  481. } clock_gate_value_t;
  482. /*! @brief System clock mode */
  483. typedef enum _clock_mode_t
  484. {
  485. kCLOCK_ModeRun = 0U, /*!< Remain in run mode. */
  486. kCLOCK_ModeWait = 1U, /*!< Transfer to wait mode. */
  487. kCLOCK_ModeStop = 2U, /*!< Transfer to stop mode. */
  488. } clock_mode_t;
  489. /*!
  490. * @brief MUX control names for clock mux setting.
  491. *
  492. * These constants define the mux control names for clock mux setting.\n
  493. * - 0:7: REG offset to CCM_BASE in bytes.
  494. * - 8:15: Root clock setting bit field shift.
  495. * - 16:31: Root clock setting bit field width.
  496. */
  497. typedef enum _clock_mux
  498. {
  499. kCLOCK_Pll3SwMux = CCM_TUPLE(CCSR, CCM_CCSR_PLL3_SW_CLK_SEL_SHIFT, CCM_CCSR_PLL3_SW_CLK_SEL_MASK, CCM_NO_BUSY_WAIT), /*!< pll3_sw_clk mux name */
  500. kCLOCK_PeriphMux = CCM_TUPLE(CBCDR, CCM_CBCDR_PERIPH_CLK_SEL_SHIFT, CCM_CBCDR_PERIPH_CLK_SEL_MASK, CCM_CDHIPR_PERIPH_CLK_SEL_BUSY_SHIFT), /*!< periph mux name */
  501. kCLOCK_SemcAltMux = CCM_TUPLE(CBCDR, CCM_CBCDR_SEMC_ALT_CLK_SEL_SHIFT, CCM_CBCDR_SEMC_ALT_CLK_SEL_MASK, CCM_NO_BUSY_WAIT), /*!< semc mux name */
  502. kCLOCK_SemcMux = CCM_TUPLE(CBCDR, CCM_CBCDR_SEMC_CLK_SEL_SHIFT, CCM_CBCDR_SEMC_CLK_SEL_MASK, CCM_NO_BUSY_WAIT), /*!< semc mux name */
  503. kCLOCK_PrePeriphMux = CCM_TUPLE(CBCMR, CCM_CBCMR_PRE_PERIPH_CLK_SEL_SHIFT, CCM_CBCMR_PRE_PERIPH_CLK_SEL_MASK, CCM_NO_BUSY_WAIT), /*!< pre-periph mux name */
  504. kCLOCK_TraceMux = CCM_TUPLE(CBCMR, CCM_CBCMR_TRACE_CLK_SEL_SHIFT, CCM_CBCMR_TRACE_CLK_SEL_MASK, CCM_NO_BUSY_WAIT), /*!< trace mux name */
  505. kCLOCK_PeriphClk2Mux = CCM_TUPLE(CBCMR, CCM_CBCMR_PERIPH_CLK2_SEL_SHIFT, CCM_CBCMR_PERIPH_CLK2_SEL_MASK, CCM_NO_BUSY_WAIT), /*!< periph clock2 mux name */
  506. kCLOCK_LpspiMux = CCM_TUPLE(CBCMR, CCM_CBCMR_LPSPI_CLK_SEL_SHIFT, CCM_CBCMR_LPSPI_CLK_SEL_MASK, CCM_NO_BUSY_WAIT), /*!< lpspi mux name */
  507. kCLOCK_FlexspiMux = CCM_TUPLE(CSCMR1, CCM_CSCMR1_FLEXSPI_CLK_SEL_SHIFT, CCM_CSCMR1_FLEXSPI_CLK_SEL_MASK, CCM_NO_BUSY_WAIT), /*!< flexspi mux name */
  508. kCLOCK_Usdhc2Mux = CCM_TUPLE(CSCMR1, CCM_CSCMR1_USDHC2_CLK_SEL_SHIFT, CCM_CSCMR1_USDHC2_CLK_SEL_MASK, CCM_NO_BUSY_WAIT), /*!< usdhc2 mux name */
  509. kCLOCK_Usdhc1Mux = CCM_TUPLE(CSCMR1, CCM_CSCMR1_USDHC1_CLK_SEL_SHIFT, CCM_CSCMR1_USDHC1_CLK_SEL_MASK, CCM_NO_BUSY_WAIT), /*!< usdhc1 mux name */
  510. kCLOCK_Sai3Mux = CCM_TUPLE(CSCMR1, CCM_CSCMR1_SAI3_CLK_SEL_SHIFT, CCM_CSCMR1_SAI3_CLK_SEL_MASK, CCM_NO_BUSY_WAIT), /*!< sai3 mux name */
  511. kCLOCK_Sai2Mux = CCM_TUPLE(CSCMR1, CCM_CSCMR1_SAI2_CLK_SEL_SHIFT, CCM_CSCMR1_SAI2_CLK_SEL_MASK, CCM_NO_BUSY_WAIT), /*!< sai2 mux name */
  512. kCLOCK_Sai1Mux = CCM_TUPLE(CSCMR1, CCM_CSCMR1_SAI1_CLK_SEL_SHIFT, CCM_CSCMR1_SAI1_CLK_SEL_MASK, CCM_NO_BUSY_WAIT), /*!< sai1 mux name */
  513. kCLOCK_PerclkMux = CCM_TUPLE(CSCMR1, CCM_CSCMR1_PERCLK_CLK_SEL_SHIFT, CCM_CSCMR1_PERCLK_CLK_SEL_MASK, CCM_NO_BUSY_WAIT), /*!< perclk mux name */
  514. kCLOCK_Flexio2Mux = CCM_TUPLE(CSCMR2, CCM_CSCMR2_FLEXIO2_CLK_SEL_SHIFT, CCM_CSCMR2_FLEXIO2_CLK_SEL_MASK, CCM_NO_BUSY_WAIT), /*!< flexio2 mux name */
  515. kCLOCK_CanMux = CCM_TUPLE(CSCMR2, CCM_CSCMR2_CAN_CLK_SEL_SHIFT, CCM_CSCMR2_CAN_CLK_SEL_MASK, CCM_NO_BUSY_WAIT), /*!< can mux name */
  516. kCLOCK_UartMux = CCM_TUPLE(CSCDR1, CCM_CSCDR1_UART_CLK_SEL_SHIFT, CCM_CSCDR1_UART_CLK_SEL_MASK, CCM_NO_BUSY_WAIT), /*!< uart mux name */
  517. kCLOCK_SpdifMux = CCM_TUPLE(CDCDR, CCM_CDCDR_SPDIF0_CLK_SEL_SHIFT, CCM_CDCDR_SPDIF0_CLK_SEL_MASK, CCM_NO_BUSY_WAIT), /*!< spdif mux name */
  518. kCLOCK_Flexio1Mux = CCM_TUPLE(CDCDR, CCM_CDCDR_FLEXIO1_CLK_SEL_SHIFT, CCM_CDCDR_FLEXIO1_CLK_SEL_MASK, CCM_NO_BUSY_WAIT), /*!< flexio1 mux name */
  519. kCLOCK_Lpi2cMux = CCM_TUPLE(CSCDR2, CCM_CSCDR2_LPI2C_CLK_SEL_SHIFT, CCM_CSCDR2_LPI2C_CLK_SEL_MASK, CCM_NO_BUSY_WAIT), /*!< lpi2c mux name */
  520. kCLOCK_Lcdif1PreMux = CCM_TUPLE(CSCDR2, CCM_CSCDR2_LCDIF_PRE_CLK_SEL_SHIFT, CCM_CSCDR2_LCDIF_PRE_CLK_SEL_MASK, CCM_NO_BUSY_WAIT), /*!< lcdif1 pre mux name */
  521. kCLOCK_Lcdif1Mux = CCM_TUPLE(CSCDR2, CCM_CSCDR2_LCDIF_CLK_SEL_SHIFT, CCM_CSCDR2_LCDIF_CLK_SEL_MASK, CCM_NO_BUSY_WAIT), /*!< lcdif1 mux name */
  522. kCLOCK_CsiMux = CCM_TUPLE(CSCDR3, CCM_CSCDR3_CSI_CLK_SEL_SHIFT, CCM_CSCDR3_CSI_CLK_SEL_MASK, CCM_NO_BUSY_WAIT), /*!< csi mux name */
  523. } clock_mux_t;
  524. /*!
  525. * @brief DIV control names for clock div setting.
  526. *
  527. * These constants define div control names for clock div setting.\n
  528. * - 0:7: REG offset to CCM_BASE in bytes.
  529. * - 8:15: Root clock setting bit field shift.
  530. * - 16:31: Root clock setting bit field width.
  531. */
  532. typedef enum _clock_div
  533. {
  534. kCLOCK_ArmDiv = CCM_TUPLE(CACRR, CCM_CACRR_ARM_PODF_SHIFT, CCM_CACRR_ARM_PODF_MASK, CCM_CDHIPR_ARM_PODF_BUSY_SHIFT), /*!< core div name */
  535. kCLOCK_PeriphClk2Div = CCM_TUPLE(CBCDR, CCM_CBCDR_PERIPH_CLK2_PODF_SHIFT, CCM_CBCDR_PERIPH_CLK2_PODF_MASK, CCM_NO_BUSY_WAIT), /*!< periph clock2 div name */
  536. kCLOCK_SemcDiv = CCM_TUPLE(CBCDR, CCM_CBCDR_SEMC_PODF_SHIFT, CCM_CBCDR_SEMC_PODF_MASK, CCM_CDHIPR_SEMC_PODF_BUSY_SHIFT), /*!< semc div name */
  537. kCLOCK_AhbDiv = CCM_TUPLE(CBCDR, CCM_CBCDR_AHB_PODF_SHIFT, CCM_CBCDR_AHB_PODF_MASK, CCM_CDHIPR_AHB_PODF_BUSY_SHIFT), /*!< ahb div name */
  538. kCLOCK_IpgDiv = CCM_TUPLE(CBCDR, CCM_CBCDR_IPG_PODF_SHIFT, CCM_CBCDR_IPG_PODF_MASK, CCM_NO_BUSY_WAIT), /*!< ipg div name */
  539. kCLOCK_LpspiDiv = CCM_TUPLE(CBCMR, CCM_CBCMR_LPSPI_PODF_SHIFT, CCM_CBCMR_LPSPI_PODF_MASK, CCM_NO_BUSY_WAIT), /*!< lpspi div name */
  540. kCLOCK_Lcdif1Div = CCM_TUPLE(CBCMR, CCM_CBCMR_LCDIF_PODF_SHIFT, CCM_CBCMR_LCDIF_PODF_MASK, CCM_NO_BUSY_WAIT), /*!< lcdif1 div name */
  541. kCLOCK_FlexspiDiv = CCM_TUPLE(CSCMR1, CCM_CSCMR1_FLEXSPI_PODF_SHIFT, CCM_CSCMR1_FLEXSPI_PODF_MASK, CCM_NO_BUSY_WAIT), /*!< flexspi div name */
  542. kCLOCK_PerclkDiv = CCM_TUPLE(CSCMR1, CCM_CSCMR1_PERCLK_PODF_SHIFT, CCM_CSCMR1_PERCLK_PODF_MASK, CCM_NO_BUSY_WAIT), /*!< perclk div name */
  543. kCLOCK_CanDiv = CCM_TUPLE(CSCMR2, CCM_CSCMR2_CAN_CLK_PODF_SHIFT, CCM_CSCMR2_CAN_CLK_PODF_MASK, CCM_NO_BUSY_WAIT), /*!< can div name */
  544. kCLOCK_TraceDiv = CCM_TUPLE(CSCDR1, CCM_CSCDR1_TRACE_PODF_SHIFT, CCM_CSCDR1_TRACE_PODF_MASK, CCM_NO_BUSY_WAIT), /*!< trace div name */
  545. kCLOCK_Usdhc2Div = CCM_TUPLE(CSCDR1, CCM_CSCDR1_USDHC2_PODF_SHIFT, CCM_CSCDR1_USDHC2_PODF_MASK, CCM_NO_BUSY_WAIT), /*!< usdhc2 div name */
  546. kCLOCK_Usdhc1Div = CCM_TUPLE(CSCDR1, CCM_CSCDR1_USDHC1_PODF_SHIFT, CCM_CSCDR1_USDHC1_PODF_MASK, CCM_NO_BUSY_WAIT), /*!< usdhc1 div name */
  547. kCLOCK_UartDiv = CCM_TUPLE(CSCDR1, CCM_CSCDR1_UART_CLK_PODF_SHIFT, CCM_CSCDR1_UART_CLK_PODF_MASK, CCM_NO_BUSY_WAIT), /*!< uart div name */
  548. kCLOCK_Flexio2Div = CCM_TUPLE(CS1CDR, CCM_CS1CDR_FLEXIO2_CLK_PODF_SHIFT, CCM_CS1CDR_FLEXIO2_CLK_PODF_MASK, CCM_NO_BUSY_WAIT), /*!< flexio2 pre div name */
  549. kCLOCK_Sai3PreDiv = CCM_TUPLE(CS1CDR, CCM_CS1CDR_SAI3_CLK_PRED_SHIFT, CCM_CS1CDR_SAI3_CLK_PRED_MASK, CCM_NO_BUSY_WAIT), /*!< sai3 pre div name */
  550. kCLOCK_Sai3Div = CCM_TUPLE(CS1CDR, CCM_CS1CDR_SAI3_CLK_PODF_SHIFT, CCM_CS1CDR_SAI3_CLK_PODF_MASK, CCM_NO_BUSY_WAIT), /*!< sai3 div name */
  551. kCLOCK_Flexio2PreDiv = CCM_TUPLE(CS1CDR, CCM_CS1CDR_FLEXIO2_CLK_PRED_SHIFT, CCM_CS1CDR_FLEXIO2_CLK_PRED_MASK, CCM_NO_BUSY_WAIT), /*!< sai3 pre div name */
  552. kCLOCK_Sai1PreDiv = CCM_TUPLE(CS1CDR, CCM_CS1CDR_SAI1_CLK_PRED_SHIFT, CCM_CS1CDR_SAI1_CLK_PRED_MASK, CCM_NO_BUSY_WAIT), /*!< sai1 pre div name */
  553. kCLOCK_Sai1Div = CCM_TUPLE(CS1CDR, CCM_CS1CDR_SAI1_CLK_PODF_SHIFT, CCM_CS1CDR_SAI1_CLK_PODF_MASK, CCM_NO_BUSY_WAIT), /*!< sai1 div name */
  554. kCLOCK_Sai2PreDiv = CCM_TUPLE(CS2CDR, CCM_CS2CDR_SAI2_CLK_PRED_SHIFT, CCM_CS2CDR_SAI2_CLK_PRED_MASK, CCM_NO_BUSY_WAIT), /*!< sai2 pre div name */
  555. kCLOCK_Sai2Div = CCM_TUPLE(CS2CDR, CCM_CS2CDR_SAI2_CLK_PODF_SHIFT, CCM_CS2CDR_SAI2_CLK_PODF_MASK, CCM_NO_BUSY_WAIT), /*!< sai2 div name */
  556. kCLOCK_Spdif0PreDiv = CCM_TUPLE(CDCDR, CCM_CDCDR_SPDIF0_CLK_PRED_SHIFT, CCM_CDCDR_SPDIF0_CLK_PRED_MASK, CCM_NO_BUSY_WAIT), /*!< spdif pre div name */
  557. kCLOCK_Spdif0Div = CCM_TUPLE(CDCDR, CCM_CDCDR_SPDIF0_CLK_PODF_SHIFT, CCM_CDCDR_SPDIF0_CLK_PODF_MASK, CCM_NO_BUSY_WAIT), /*!< spdif div name */
  558. kCLOCK_Flexio1PreDiv = CCM_TUPLE(CDCDR, CCM_CDCDR_FLEXIO1_CLK_PRED_SHIFT, CCM_CDCDR_FLEXIO1_CLK_PRED_MASK, CCM_NO_BUSY_WAIT), /*!< flexio1 pre div name */
  559. kCLOCK_Flexio1Div = CCM_TUPLE(CDCDR, CCM_CDCDR_FLEXIO1_CLK_PODF_SHIFT, CCM_CDCDR_FLEXIO1_CLK_PODF_MASK, CCM_NO_BUSY_WAIT), /*!< flexio1 div name */
  560. kCLOCK_Lpi2cDiv = CCM_TUPLE(CSCDR2, CCM_CSCDR2_LPI2C_CLK_PODF_SHIFT, CCM_CSCDR2_LPI2C_CLK_PODF_MASK, CCM_NO_BUSY_WAIT), /*!< lpi2c div name */
  561. kCLOCK_Lcdif1PreDiv = CCM_TUPLE(CSCDR2, CCM_CSCDR2_LCDIF_PRED_SHIFT, CCM_CSCDR2_LCDIF_PRED_MASK, CCM_NO_BUSY_WAIT), /*!< lcdif1 pre div name */
  562. kCLOCK_CsiDiv = CCM_TUPLE(CSCDR3, CCM_CSCDR3_CSI_PODF_SHIFT, CCM_CSCDR3_CSI_PODF_MASK, CCM_NO_BUSY_WAIT), /*!< csi div name */
  563. } clock_div_t;
  564. /*! @brief PLL configuration for ARM */
  565. typedef struct _clock_arm_pll_config
  566. {
  567. uint32_t loopDivider; /*!< PLL loop divider. Valid range for divider value: 54-108. Fout=Fin*loopDivider/2. */
  568. } clock_arm_pll_config_t;
  569. /*! @brief PLL configuration for USB */
  570. typedef struct _clock_usb_pll_config
  571. {
  572. uint8_t loopDivider; /*!< PLL loop divider.
  573. 0 - Fout=Fref*20;
  574. 1 - Fout=Fref*22 */
  575. } clock_usb_pll_config_t;
  576. /*! @brief PLL configuration for System */
  577. typedef struct _clock_sys_pll_config
  578. {
  579. uint8_t loopDivider; /*!< PLL loop divider. Intended to be 1 (528M).
  580. 0 - Fout=Fref*20;
  581. 1 - Fout=Fref*22 */
  582. uint32_t numerator; /*!< 30 bit numerator of fractional loop divider.*/
  583. uint32_t denominator; /*!< 30 bit denominator of fractional loop divider */
  584. } clock_sys_pll_config_t;
  585. /*! @brief PLL configuration for AUDIO and VIDEO */
  586. typedef struct _clock_audio_pll_config
  587. {
  588. uint8_t loopDivider; /*!< PLL loop divider. Valid range for DIV_SELECT divider value: 27~54. */
  589. uint8_t postDivider; /*!< Divider after the PLL, should only be 1, 2, 4, 8, 16. */
  590. uint32_t numerator; /*!< 30 bit numerator of fractional loop divider.*/
  591. uint32_t denominator; /*!< 30 bit denominator of fractional loop divider */
  592. } clock_audio_pll_config_t;
  593. /*! @brief PLL configuration for AUDIO and VIDEO */
  594. typedef struct _clock_video_pll_config
  595. {
  596. uint8_t loopDivider; /*!< PLL loop divider. Valid range for DIV_SELECT divider value: 27~54. */
  597. uint8_t postDivider; /*!< Divider after the PLL, should only be 1, 2, 4, 8, 16. */
  598. uint32_t numerator; /*!< 30 bit numerator of fractional loop divider.*/
  599. uint32_t denominator; /*!< 30 bit denominator of fractional loop divider */
  600. } clock_video_pll_config_t;
  601. /*! @brief PLL configuration for ENET */
  602. typedef struct _clock_enet_pll_config
  603. {
  604. bool enableClkOutput0; /*!< Power on and enable PLL clock output for ENET0 (ref_enetpll0). */
  605. bool enableClkOutput1; /*!< Power on and enable PLL clock output for ENET1 (ref_enetpll1). */
  606. bool enableClkOutput2; /*!< Power on and enable PLL clock output for ENET2 (ref_enetpll2). */
  607. uint8_t loopDivider0; /*!< Controls the frequency of the ENET0 reference clock.
  608. b00 25MHz
  609. b01 50MHz
  610. b10 100MHz (not 50% duty cycle)
  611. b11 125MHz */
  612. uint8_t loopDivider1; /*!< Controls the frequency of the ENET1 reference clock.
  613. b00 25MHz
  614. b01 50MHz
  615. b10 100MHz (not 50% duty cycle)
  616. b11 125MHz */
  617. } clock_enet_pll_config_t;
  618. /*! @brief PLL name */
  619. typedef enum _clock_pll
  620. {
  621. kCLOCK_PllArm = 0U, /*!< PLL ARM */
  622. kCLOCK_PllSys = 1U, /*!< PLL SYS */
  623. kCLOCK_PllUsb1 = 2U, /*!< PLL USB1 */
  624. kCLOCK_PllAudio = 3U, /*!< PLL Audio */
  625. kCLOCK_PllVideo = 4U, /*!< PLL Video */
  626. kCLOCK_PllEnet0 = 5U, /*!< PLL Enet0 */
  627. kCLOCK_PllEnet1 = 6U, /*!< PLL Enet1 */
  628. kCLOCK_PllEnet2 = 7U, /*!< PLL Enet2 */
  629. kCLOCK_PllUsb2 = 8U, /*!< PLL USB2 */
  630. } clock_pll_t;
  631. /*! @brief PLL PFD name */
  632. typedef enum _clock_pfd
  633. {
  634. kCLOCK_Pfd0 = 0U, /*!< PLL PFD0 */
  635. kCLOCK_Pfd1 = 1U, /*!< PLL PFD1 */
  636. kCLOCK_Pfd2 = 2U, /*!< PLL PFD2 */
  637. kCLOCK_Pfd3 = 3U, /*!< PLL PFD3 */
  638. } clock_pfd_t;
  639. /*! @brief USB clock source definition. */
  640. typedef enum _clock_usb_src
  641. {
  642. kCLOCK_Usb480M = 0, /*!< Use 480M. */
  643. kCLOCK_UsbSrcUnused = 0xFFFFFFFFU, /*!< Used when the function does not
  644. care the clock source. */
  645. } clock_usb_src_t;
  646. /*! @brief Source of the USB HS PHY. */
  647. typedef enum _clock_usb_phy_src
  648. {
  649. kCLOCK_Usbphy480M = 0, /*!< Use 480M. */
  650. } clock_usb_phy_src_t;
  651. /*******************************************************************************
  652. * API
  653. ******************************************************************************/
  654. #if defined(__cplusplus)
  655. extern "C" {
  656. #endif /* __cplusplus */
  657. /*!
  658. * @brief Set CCM MUX node to certain value.
  659. *
  660. * @param mux Which mux node to set, see \ref clock_mux_t.
  661. * @param value Clock mux value to set, different mux has different value range.
  662. */
  663. static inline void CLOCK_SetMux(clock_mux_t mux, uint32_t value)
  664. {
  665. uint32_t busyShift;
  666. busyShift = CCM_TUPLE_BUSY_SHIFT(mux);
  667. CCM_TUPLE_REG(CCM, mux) = (CCM_TUPLE_REG(CCM, mux) & (~CCM_TUPLE_MASK(mux))) |
  668. (((uint32_t)((value) << CCM_TUPLE_SHIFT(mux))) & CCM_TUPLE_MASK(mux));
  669. assert(busyShift <= CCM_NO_BUSY_WAIT);
  670. /* Clock switch need Handshake? */
  671. if (CCM_NO_BUSY_WAIT != busyShift)
  672. {
  673. /* Wait until CCM internal handshake finish. */
  674. while (CCM->CDHIPR & (1U << busyShift))
  675. {
  676. }
  677. }
  678. }
  679. /*!
  680. * @brief Get CCM MUX value.
  681. *
  682. * @param mux Which mux node to get, see \ref clock_mux_t.
  683. * @return Clock mux value.
  684. */
  685. static inline uint32_t CLOCK_GetMux(clock_mux_t mux)
  686. {
  687. return (CCM_TUPLE_REG(CCM, mux) & CCM_TUPLE_MASK(mux)) >> CCM_TUPLE_SHIFT(mux);
  688. }
  689. /*!
  690. * @brief Set CCM DIV node to certain value.
  691. *
  692. * @param divider Which div node to set, see \ref clock_div_t.
  693. * @param value Clock div value to set, different divider has different value range.
  694. */
  695. static inline void CLOCK_SetDiv(clock_div_t divider, uint32_t value)
  696. {
  697. uint32_t busyShift;
  698. busyShift = CCM_TUPLE_BUSY_SHIFT(divider);
  699. CCM_TUPLE_REG(CCM, divider) = (CCM_TUPLE_REG(CCM, divider) & (~CCM_TUPLE_MASK(divider))) |
  700. (((uint32_t)((value) << CCM_TUPLE_SHIFT(divider))) & CCM_TUPLE_MASK(divider));
  701. assert(busyShift <= CCM_NO_BUSY_WAIT);
  702. /* Clock switch need Handshake? */
  703. if (CCM_NO_BUSY_WAIT != busyShift)
  704. {
  705. /* Wait until CCM internal handshake finish. */
  706. while (CCM->CDHIPR & (1U << busyShift))
  707. {
  708. }
  709. }
  710. }
  711. /*!
  712. * @brief Get CCM DIV node value.
  713. *
  714. * @param divider Which div node to get, see \ref clock_div_t.
  715. */
  716. static inline uint32_t CLOCK_GetDiv(clock_div_t divider)
  717. {
  718. uint32_t value;
  719. value = (CCM_TUPLE_REG(CCM, divider) & CCM_TUPLE_MASK(divider)) >> CCM_TUPLE_SHIFT(divider);
  720. return value;
  721. }
  722. /*!
  723. * @brief Control the clock gate for specific IP.
  724. *
  725. * @param name Which clock to enable, see \ref clock_ip_name_t.
  726. * @param value Clock gate value to set, see \ref clock_gate_value_t.
  727. */
  728. static inline void CLOCK_ControlGate(clock_ip_name_t name, clock_gate_value_t value)
  729. {
  730. uint32_t index = ((uint32_t)name) >> 8U;
  731. uint32_t shift = ((uint32_t)name) & 0x1FU;
  732. volatile uint32_t *reg;
  733. assert (index <= 6);
  734. reg = ((volatile uint32_t *)&CCM->CCGR0) + index;
  735. *reg = ((*reg) & ~(3U << shift)) | (((uint32_t)value) << shift);
  736. }
  737. /*!
  738. * @brief Enable the clock for specific IP.
  739. *
  740. * @param name Which clock to enable, see \ref clock_ip_name_t.
  741. */
  742. static inline void CLOCK_EnableClock(clock_ip_name_t name)
  743. {
  744. CLOCK_ControlGate(name, kCLOCK_ClockNeededRunWait);
  745. }
  746. /*!
  747. * @brief Disable the clock for specific IP.
  748. *
  749. * @param name Which clock to disable, see \ref clock_ip_name_t.
  750. */
  751. static inline void CLOCK_DisableClock(clock_ip_name_t name)
  752. {
  753. CLOCK_ControlGate(name, kCLOCK_ClockNotNeeded);
  754. }
  755. /*!
  756. * @brief Setting the low power mode that system will enter on next assertion of dsm_request signal.
  757. *
  758. * @param mode Which mode to enter, see \ref clock_mode_t.
  759. */
  760. static inline void CLOCK_SetMode(clock_mode_t mode)
  761. {
  762. CCM->CLPCR = (CCM->CLPCR & ~CCM_CLPCR_LPM_MASK) | CCM_CLPCR_LPM((uint32_t)mode);
  763. }
  764. /*!
  765. * @brief Gets the clock frequency for a specific clock name.
  766. *
  767. * This function checks the current clock configurations and then calculates
  768. * the clock frequency for a specific clock name defined in clock_name_t.
  769. *
  770. * @param clockName Clock names defined in clock_name_t
  771. * @return Clock frequency value in hertz
  772. */
  773. uint32_t CLOCK_GetFreq(clock_name_t name);
  774. /*!
  775. * @brief Get the CCM CPU/core/system frequency.
  776. *
  777. * @return Clock frequency; If the clock is invalid, returns 0.
  778. */
  779. static inline uint32_t CLOCK_GetCpuClkFreq(void)
  780. {
  781. return CLOCK_GetFreq(kCLOCK_CpuClk);
  782. }
  783. /*!
  784. * @name OSC operations
  785. * @{
  786. */
  787. /*!
  788. * @brief Initialize the external 24MHz clock.
  789. *
  790. * This function supports two modes:
  791. * 1. Use external crystal oscillator.
  792. * 2. Bypass the external crystal oscillator, using input source clock directly.
  793. *
  794. * After this function, please call @ref CLOCK_SetXtal0Freq to inform clock driver
  795. * the external clock frequency.
  796. *
  797. * @param bypassXtalOsc Pass in true to bypass the external crystal oscillator.
  798. * @note This device does not support bypass external crystal oscillator, so
  799. * the input parameter should always be false.
  800. */
  801. void CLOCK_InitExternalClk(bool bypassXtalOsc);
  802. /*!
  803. * @brief Deinitialize the external 24MHz clock.
  804. *
  805. * This function disables the external 24MHz clock.
  806. *
  807. * After this function, please call @ref CLOCK_SetXtal0Freq to set external clock
  808. * frequency to 0.
  809. */
  810. void CLOCK_DeinitExternalClk(void);
  811. /*!
  812. * @brief Switch the OSC.
  813. *
  814. * This function switches the OSC source for SoC.
  815. *
  816. * @param osc OSC source to switch to.
  817. */
  818. void CLOCK_SwitchOsc(clock_osc_t osc);
  819. /*!
  820. * @brief Gets the OSC clock frequency.
  821. *
  822. * This function will return the external XTAL OSC frequency if it is selected as the source of OSC,
  823. * otherwise internal 24MHz RC OSC frequency will be returned.
  824. *
  825. * @param osc OSC type to get frequency.
  826. *
  827. * @return Clock frequency; If the clock is invalid, returns 0.
  828. */
  829. static inline uint32_t CLOCK_GetOscFreq(void)
  830. {
  831. return (XTALOSC24M->LOWPWR_CTRL & XTALOSC24M_LOWPWR_CTRL_OSC_SEL_MASK) ? 24000000UL : g_xtalFreq;
  832. }
  833. /*!
  834. * @brief Gets the RTC clock frequency.
  835. *
  836. * @return Clock frequency; If the clock is invalid, returns 0.
  837. */
  838. static inline uint32_t CLOCK_GetRtcFreq(void)
  839. {
  840. return 32768U;
  841. }
  842. /*!
  843. * @brief Set the XTAL (24M OSC) frequency based on board setting.
  844. *
  845. * @param freq The XTAL input clock frequency in Hz.
  846. */
  847. static inline void CLOCK_SetXtalFreq(uint32_t freq)
  848. {
  849. g_xtalFreq = freq;
  850. }
  851. /*!
  852. * @brief Set the RTC XTAL (32K OSC) frequency based on board setting.
  853. *
  854. * @param freq The RTC XTAL input clock frequency in Hz.
  855. */
  856. static inline void CLOCK_SetRtcXtalFreq(uint32_t freq)
  857. {
  858. g_rtcXtalFreq = freq;
  859. }
  860. /*!
  861. * @brief Initialize the RC oscillator 24MHz clock.
  862. */
  863. void CLOCK_InitRcOsc24M(void);
  864. /*!
  865. * @brief Power down the RCOSC 24M clock.
  866. */
  867. void CLOCK_DeinitRcOsc24M(void);
  868. /* @} */
  869. /*!
  870. * @name PLL/PFD operations
  871. * @{
  872. */
  873. /*!
  874. * @brief Initialize the ARM PLL.
  875. *
  876. * This function initialize the ARM PLL with specific settings
  877. *
  878. * @param config configuration to set to PLL.
  879. */
  880. void CLOCK_InitArmPll(const clock_arm_pll_config_t *config);
  881. /*!
  882. * @brief De-initialize the ARM PLL.
  883. */
  884. void CLOCK_DeinitArmPll(void);
  885. /*!
  886. * @brief Initialize the System PLL.
  887. *
  888. * This function initializes the System PLL with specific settings
  889. *
  890. * @param config Configuration to set to PLL.
  891. */
  892. void CLOCK_InitSysPll(const clock_sys_pll_config_t *config);
  893. /*!
  894. * @brief De-initialize the System PLL.
  895. */
  896. void CLOCK_DeinitSysPll(void);
  897. /*!
  898. * @brief Initialize the USB1 PLL.
  899. *
  900. * This function initializes the USB1 PLL with specific settings
  901. *
  902. * @param config Configuration to set to PLL.
  903. */
  904. void CLOCK_InitUsb1Pll(const clock_usb_pll_config_t *config);
  905. /*!
  906. * @brief Deinitialize the USB1 PLL.
  907. */
  908. void CLOCK_DeinitUsb1Pll(void);
  909. /*!
  910. * @brief Initialize the USB2 PLL.
  911. *
  912. * This function initializes the USB2 PLL with specific settings
  913. *
  914. * @param config Configuration to set to PLL.
  915. */
  916. void CLOCK_InitUsb2Pll(const clock_usb_pll_config_t *config);
  917. /*!
  918. * @brief Deinitialize the USB2 PLL.
  919. */
  920. void CLOCK_DeinitUsb2Pll(void);
  921. /*!
  922. * @brief Initializes the Audio PLL.
  923. *
  924. * This function initializes the Audio PLL with specific settings
  925. *
  926. * @param config Configuration to set to PLL.
  927. */
  928. void CLOCK_InitAudioPll(const clock_audio_pll_config_t *config);
  929. /*!
  930. * @brief De-initialize the Audio PLL.
  931. */
  932. void CLOCK_DeinitAudioPll(void);
  933. /*!
  934. * @brief Initialize the video PLL.
  935. *
  936. * This function configures the Video PLL with specific settings
  937. *
  938. * @param config configuration to set to PLL.
  939. */
  940. void CLOCK_InitVideoPll(const clock_video_pll_config_t *config);
  941. /*!
  942. * @brief De-initialize the Video PLL.
  943. */
  944. void CLOCK_DeinitVideoPll(void);
  945. /*!
  946. * @brief Initialize the ENET PLL.
  947. *
  948. * This function initializes the ENET PLL with specific settings.
  949. *
  950. * @param config Configuration to set to PLL.
  951. */
  952. void CLOCK_InitEnetPll(const clock_enet_pll_config_t *config);
  953. /*!
  954. * @brief Deinitialize the ENET PLL.
  955. *
  956. * This function disables the ENET PLL.
  957. */
  958. void CLOCK_DeinitEnetPll(void);
  959. /*!
  960. * @brief Get current PLL output frequency.
  961. *
  962. * This function get current output frequency of specific PLL
  963. *
  964. * @param pll pll name to get frequency.
  965. * @return The PLL output frequency in hertz.
  966. */
  967. uint32_t CLOCK_GetPllFreq(clock_pll_t pll);
  968. /*!
  969. * @brief Initialize the System PLL PFD.
  970. *
  971. * This function initializes the System PLL PFD. During new value setting,
  972. * the clock output is disabled to prevent glitch.
  973. *
  974. * @param pfd Which PFD clock to enable.
  975. * @param pfdFrac The PFD FRAC value.
  976. * @note It is recommended that PFD settings are kept between 12-35.
  977. */
  978. void CLOCK_InitSysPfd(clock_pfd_t pfd, uint8_t pfdFrac);
  979. /*!
  980. * @brief De-initialize the System PLL PFD.
  981. *
  982. * This function disables the System PLL PFD.
  983. *
  984. * @param pfd Which PFD clock to disable.
  985. */
  986. void CLOCK_DeinitSysPfd(clock_pfd_t pfd);
  987. /*!
  988. * @brief Initialize the USB1 PLL PFD.
  989. *
  990. * This function initializes the USB1 PLL PFD. During new value setting,
  991. * the clock output is disabled to prevent glitch.
  992. *
  993. * @param pfd Which PFD clock to enable.
  994. * @param pfdFrac The PFD FRAC value.
  995. * @note It is recommended that PFD settings are kept between 12-35.
  996. */
  997. void CLOCK_InitUsb1Pfd(clock_pfd_t pfd, uint8_t pfdFrac);
  998. /*!
  999. * @brief De-initialize the USB1 PLL PFD.
  1000. *
  1001. * This function disables the USB1 PLL PFD.
  1002. *
  1003. * @param pfd Which PFD clock to disable.
  1004. */
  1005. void CLOCK_DeinitUsb1Pfd(clock_pfd_t pfd);
  1006. /*!
  1007. * @brief Get current System PLL PFD output frequency.
  1008. *
  1009. * This function get current output frequency of specific System PLL PFD
  1010. *
  1011. * @param pfd pfd name to get frequency.
  1012. * @return The PFD output frequency in hertz.
  1013. */
  1014. uint32_t CLOCK_GetSysPfdFreq(clock_pfd_t pfd);
  1015. /*!
  1016. * @brief Get current USB1 PLL PFD output frequency.
  1017. *
  1018. * This function get current output frequency of specific USB1 PLL PFD
  1019. *
  1020. * @param pfd pfd name to get frequency.
  1021. * @return The PFD output frequency in hertz.
  1022. */
  1023. uint32_t CLOCK_GetUsb1PfdFreq(clock_pfd_t pfd);
  1024. /*! @brief Enable USB HS clock.
  1025. *
  1026. * This function only enables the access to USB HS prepheral, upper layer
  1027. * should first call the @ref CLOCK_EnableUsbhs0PhyPllClock to enable the PHY
  1028. * clock to use USB HS.
  1029. *
  1030. * @param src USB HS does not care about the clock source, here must be @ref kCLOCK_UsbSrcUnused.
  1031. * @param freq USB HS does not care about the clock source, so this parameter is ignored.
  1032. * @retval true The clock is set successfully.
  1033. * @retval false The clock source is invalid to get proper USB HS clock.
  1034. */
  1035. bool CLOCK_EnableUsbhs0Clock(clock_usb_src_t src, uint32_t freq);
  1036. /*! @brief Enable USB HS PHY PLL clock.
  1037. *
  1038. * This function enables the internal 480MHz USB PHY PLL clock.
  1039. *
  1040. * @param src USB HS PHY PLL clock source.
  1041. * @param freq The frequency specified by src.
  1042. * @retval true The clock is set successfully.
  1043. * @retval false The clock source is invalid to get proper USB HS clock.
  1044. */
  1045. bool CLOCK_EnableUsbhs0PhyPllClock(clock_usb_phy_src_t src, uint32_t freq);
  1046. /*! @brief Disable USB HS PHY PLL clock.
  1047. *
  1048. * This function disables USB HS PHY PLL clock.
  1049. */
  1050. void CLOCK_DisableUsbhs0PhyPllClock(void);
  1051. /*! @brief Enable USB HS clock.
  1052. *
  1053. * This function only enables the access to USB HS prepheral, upper layer
  1054. * should first call the @ref CLOCK_EnableUsbhs0PhyPllClock to enable the PHY
  1055. * clock to use USB HS.
  1056. *
  1057. * @param src USB HS does not care about the clock source, here must be @ref kCLOCK_UsbSrcUnused.
  1058. * @param freq USB HS does not care about the clock source, so this parameter is ignored.
  1059. * @retval true The clock is set successfully.
  1060. * @retval false The clock source is invalid to get proper USB HS clock.
  1061. */
  1062. bool CLOCK_EnableUsbhs1Clock(clock_usb_src_t src, uint32_t freq);
  1063. /*! @brief Enable USB HS PHY PLL clock.
  1064. *
  1065. * This function enables the internal 480MHz USB PHY PLL clock.
  1066. *
  1067. * @param src USB HS PHY PLL clock source.
  1068. * @param freq The frequency specified by src.
  1069. * @retval true The clock is set successfully.
  1070. * @retval false The clock source is invalid to get proper USB HS clock.
  1071. */
  1072. bool CLOCK_EnableUsbhs1PhyPllClock(clock_usb_phy_src_t src, uint32_t freq);
  1073. /*! @brief Disable USB HS PHY PLL clock.
  1074. *
  1075. * This function disables USB HS PHY PLL clock.
  1076. */
  1077. void CLOCK_DisableUsbhs1PhyPllClock(void);
  1078. /* @} */
  1079. #if defined(__cplusplus)
  1080. }
  1081. #endif /* __cplusplus */
  1082. /*! @} */
  1083. #endif /* _FSL_CLOCK_H_ */