fsl_clock.h 56 KB

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