clock_config.c 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889
  1. /*
  2. * Copyright 2020-2021 NXP
  3. * All rights reserved.
  4. *
  5. * SPDX-License-Identifier: BSD-3-Clause
  6. */
  7. /*
  8. * How to setup clock using clock driver functions:
  9. *
  10. * 1. Call CLOCK_InitXXXPLL() to configure corresponding PLL clock.
  11. *
  12. * 2. Call CLOCK_InitXXXpfd() to configure corresponding PLL pfd clock.
  13. *
  14. * 3. Call CLOCK_SetRootClock() to configure corresponding module clock source and divider.
  15. *
  16. */
  17. /* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
  18. !!GlobalInfo
  19. product: Clocks v8.0
  20. processor: MIMXRT1176xxxxx
  21. package_id: MIMXRT1176DVMAA
  22. mcu_data: ksdk2_0
  23. processor_version: 0.8.1
  24. board: MIMXRT1170-EVK
  25. * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
  26. #include "clock_config.h"
  27. #include "fsl_iomuxc.h"
  28. #include "fsl_dcdc.h"
  29. #include "fsl_pmu.h"
  30. #include "fsl_clock.h"
  31. /*******************************************************************************
  32. * Definitions
  33. ******************************************************************************/
  34. /*******************************************************************************
  35. * Variables
  36. ******************************************************************************/
  37. /* System clock frequency. */
  38. extern uint32_t SystemCoreClock;
  39. /*******************************************************************************
  40. ************************ BOARD_InitBootClocks function ************************
  41. ******************************************************************************/
  42. void BOARD_InitBootClocks(void)
  43. {
  44. BOARD_BootClockRUN();
  45. }
  46. #if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)
  47. #if defined(XIP_BOOT_HEADER_DCD_ENABLE) && (XIP_BOOT_HEADER_DCD_ENABLE == 1)
  48. /* This function should not run from SDRAM since it will change SEMC configuration. */
  49. AT_QUICKACCESS_SECTION_CODE(void UpdateSemcClock(void));
  50. void UpdateSemcClock(void)
  51. {
  52. /* Enable self-refresh mode and update semc clock root to 200MHz. */
  53. SEMC->IPCMD = 0xA55A000D;
  54. while ((SEMC->INTR & 0x3) == 0)
  55. ;
  56. SEMC->INTR = 0x3;
  57. SEMC->DCCR = 0x0B;
  58. /*
  59. * Currently we are using SEMC parameter which fit both 166MHz and 200MHz, only
  60. * need to change the SEMC clock root here. If customer is using their own DCD and
  61. * want to switch from 166MHz to 200MHz, extra SEMC configuration might need to be
  62. * adjusted here to fine tune the SDRAM performance
  63. */
  64. CCM->CLOCK_ROOT[kCLOCK_Root_Semc].CONTROL = 0x602;
  65. }
  66. #endif
  67. #endif
  68. /*******************************************************************************
  69. ********************** Configuration BOARD_BootClockRUN ***********************
  70. ******************************************************************************/
  71. /* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
  72. !!Configuration
  73. name: BOARD_BootClockRUN
  74. called_from_default_init: true
  75. outputs:
  76. - {id: ACMP_CLK_ROOT.outFreq, value: 24 MHz}
  77. - {id: ADC1_CLK_ROOT.outFreq, value: 24 MHz}
  78. - {id: ADC2_CLK_ROOT.outFreq, value: 24 MHz}
  79. - {id: ARM_PLL_CLK.outFreq, value: 996 MHz}
  80. - {id: ASRC_CLK_ROOT.outFreq, value: 24 MHz}
  81. - {id: AXI_CLK_ROOT.outFreq, value: 996 MHz}
  82. - {id: BUS_CLK_ROOT.outFreq, value: 240 MHz}
  83. - {id: BUS_LPSR_CLK_ROOT.outFreq, value: 160 MHz}
  84. - {id: CAN1_CLK_ROOT.outFreq, value: 24 MHz}
  85. - {id: CAN2_CLK_ROOT.outFreq, value: 24 MHz}
  86. - {id: CAN3_CLK_ROOT.outFreq, value: 24 MHz}
  87. - {id: CCM_CLKO1_CLK_ROOT.outFreq, value: 24 MHz}
  88. - {id: CCM_CLKO2_CLK_ROOT.outFreq, value: 24 MHz}
  89. - {id: CLK_1M.outFreq, value: 1 MHz}
  90. - {id: CSI2_CLK_ROOT.outFreq, value: 24 MHz}
  91. - {id: CSI2_ESC_CLK_ROOT.outFreq, value: 24 MHz}
  92. - {id: CSI2_UI_CLK_ROOT.outFreq, value: 24 MHz}
  93. - {id: CSI_CLK_ROOT.outFreq, value: 24 MHz}
  94. - {id: CSSYS_CLK_ROOT.outFreq, value: 24 MHz}
  95. - {id: CSTRACE_CLK_ROOT.outFreq, value: 132 MHz}
  96. - {id: ELCDIF_CLK_ROOT.outFreq, value: 24 MHz}
  97. - {id: EMV1_CLK_ROOT.outFreq, value: 24 MHz}
  98. - {id: EMV2_CLK_ROOT.outFreq, value: 24 MHz}
  99. - {id: ENET1_CLK_ROOT.outFreq, value: 24 MHz}
  100. - {id: ENET2_CLK_ROOT.outFreq, value: 24 MHz}
  101. - {id: ENET_1G_TX_CLK.outFreq, value: 24 MHz}
  102. - {id: ENET_25M_CLK_ROOT.outFreq, value: 24 MHz}
  103. - {id: ENET_QOS_CLK_ROOT.outFreq, value: 24 MHz}
  104. - {id: ENET_TIMER1_CLK_ROOT.outFreq, value: 24 MHz}
  105. - {id: ENET_TIMER2_CLK_ROOT.outFreq, value: 24 MHz}
  106. - {id: ENET_TIMER3_CLK_ROOT.outFreq, value: 24 MHz}
  107. - {id: FLEXIO1_CLK_ROOT.outFreq, value: 24 MHz}
  108. - {id: FLEXIO2_CLK_ROOT.outFreq, value: 24 MHz}
  109. - {id: FLEXSPI1_CLK_ROOT.outFreq, value: 24 MHz}
  110. - {id: FLEXSPI2_CLK_ROOT.outFreq, value: 24 MHz}
  111. - {id: GC355_CLK_ROOT.outFreq, value: 492.0000125 MHz}
  112. - {id: GPT1_CLK_ROOT.outFreq, value: 24 MHz}
  113. - {id: GPT1_ipg_clk_highfreq.outFreq, value: 24 MHz}
  114. - {id: GPT2_CLK_ROOT.outFreq, value: 24 MHz}
  115. - {id: GPT2_ipg_clk_highfreq.outFreq, value: 24 MHz}
  116. - {id: GPT3_CLK_ROOT.outFreq, value: 24 MHz}
  117. - {id: GPT3_ipg_clk_highfreq.outFreq, value: 24 MHz}
  118. - {id: GPT4_CLK_ROOT.outFreq, value: 24 MHz}
  119. - {id: GPT4_ipg_clk_highfreq.outFreq, value: 24 MHz}
  120. - {id: GPT5_CLK_ROOT.outFreq, value: 24 MHz}
  121. - {id: GPT5_ipg_clk_highfreq.outFreq, value: 24 MHz}
  122. - {id: GPT6_CLK_ROOT.outFreq, value: 24 MHz}
  123. - {id: GPT6_ipg_clk_highfreq.outFreq, value: 24 MHz}
  124. - {id: LCDIFV2_CLK_ROOT.outFreq, value: 24 MHz}
  125. - {id: LPI2C1_CLK_ROOT.outFreq, value: 24 MHz}
  126. - {id: LPI2C2_CLK_ROOT.outFreq, value: 24 MHz}
  127. - {id: LPI2C3_CLK_ROOT.outFreq, value: 24 MHz}
  128. - {id: LPI2C4_CLK_ROOT.outFreq, value: 24 MHz}
  129. - {id: LPI2C5_CLK_ROOT.outFreq, value: 24 MHz}
  130. - {id: LPI2C6_CLK_ROOT.outFreq, value: 24 MHz}
  131. - {id: LPSPI1_CLK_ROOT.outFreq, value: 24 MHz}
  132. - {id: LPSPI2_CLK_ROOT.outFreq, value: 24 MHz}
  133. - {id: LPSPI3_CLK_ROOT.outFreq, value: 24 MHz}
  134. - {id: LPSPI4_CLK_ROOT.outFreq, value: 24 MHz}
  135. - {id: LPSPI5_CLK_ROOT.outFreq, value: 24 MHz}
  136. - {id: LPSPI6_CLK_ROOT.outFreq, value: 24 MHz}
  137. - {id: LPUART10_CLK_ROOT.outFreq, value: 24 MHz}
  138. - {id: LPUART11_CLK_ROOT.outFreq, value: 24 MHz}
  139. - {id: LPUART12_CLK_ROOT.outFreq, value: 24 MHz}
  140. - {id: LPUART1_CLK_ROOT.outFreq, value: 24 MHz}
  141. - {id: LPUART2_CLK_ROOT.outFreq, value: 24 MHz}
  142. - {id: LPUART3_CLK_ROOT.outFreq, value: 24 MHz}
  143. - {id: LPUART4_CLK_ROOT.outFreq, value: 24 MHz}
  144. - {id: LPUART5_CLK_ROOT.outFreq, value: 24 MHz}
  145. - {id: LPUART6_CLK_ROOT.outFreq, value: 24 MHz}
  146. - {id: LPUART7_CLK_ROOT.outFreq, value: 24 MHz}
  147. - {id: LPUART8_CLK_ROOT.outFreq, value: 24 MHz}
  148. - {id: LPUART9_CLK_ROOT.outFreq, value: 24 MHz}
  149. - {id: M4_CLK_ROOT.outFreq, value: 4320/11 MHz}
  150. - {id: M4_SYSTICK_CLK_ROOT.outFreq, value: 24 MHz}
  151. - {id: M7_CLK_ROOT.outFreq, value: 996 MHz}
  152. - {id: M7_SYSTICK_CLK_ROOT.outFreq, value: 100 kHz}
  153. - {id: MIC_CLK_ROOT.outFreq, value: 24 MHz}
  154. - {id: MIPI_DSI_TX_CLK_ESC_ROOT.outFreq, value: 24 MHz}
  155. - {id: MIPI_ESC_CLK_ROOT.outFreq, value: 24 MHz}
  156. - {id: MIPI_REF_CLK_ROOT.outFreq, value: 24 MHz}
  157. - {id: MQS_CLK_ROOT.outFreq, value: 24 MHz}
  158. - {id: MQS_MCLK.outFreq, value: 24 MHz}
  159. - {id: OSC_24M.outFreq, value: 24 MHz}
  160. - {id: OSC_32K.outFreq, value: 32.768 kHz}
  161. - {id: OSC_RC_16M.outFreq, value: 16 MHz}
  162. - {id: OSC_RC_400M.outFreq, value: 400 MHz}
  163. - {id: OSC_RC_48M.outFreq, value: 48 MHz}
  164. - {id: OSC_RC_48M_DIV2.outFreq, value: 24 MHz}
  165. - {id: PLL_VIDEO_CLK.outFreq, value: 984.000025 MHz}
  166. - {id: SAI1_CLK_ROOT.outFreq, value: 24 MHz}
  167. - {id: SAI1_MCLK1.outFreq, value: 24 MHz}
  168. - {id: SAI1_MCLK3.outFreq, value: 24 MHz}
  169. - {id: SAI2_CLK_ROOT.outFreq, value: 24 MHz}
  170. - {id: SAI2_MCLK1.outFreq, value: 24 MHz}
  171. - {id: SAI2_MCLK3.outFreq, value: 24 MHz}
  172. - {id: SAI3_CLK_ROOT.outFreq, value: 24 MHz}
  173. - {id: SAI3_MCLK1.outFreq, value: 24 MHz}
  174. - {id: SAI3_MCLK3.outFreq, value: 24 MHz}
  175. - {id: SAI4_CLK_ROOT.outFreq, value: 24 MHz}
  176. - {id: SAI4_MCLK1.outFreq, value: 24 MHz}
  177. - {id: SEMC_CLK_ROOT.outFreq, value: 198 MHz}
  178. - {id: SPDIF_CLK_ROOT.outFreq, value: 24 MHz}
  179. - {id: SYS_PLL2_CLK.outFreq, value: 528 MHz}
  180. - {id: SYS_PLL2_PFD0_CLK.outFreq, value: 352 MHz}
  181. - {id: SYS_PLL2_PFD1_CLK.outFreq, value: 594 MHz}
  182. - {id: SYS_PLL2_PFD2_CLK.outFreq, value: 396 MHz}
  183. - {id: SYS_PLL2_PFD3_CLK.outFreq, value: 297 MHz}
  184. - {id: SYS_PLL3_CLK.outFreq, value: 480 MHz}
  185. - {id: SYS_PLL3_DIV2_CLK.outFreq, value: 240 MHz}
  186. - {id: SYS_PLL3_PFD0_CLK.outFreq, value: 8640/13 MHz}
  187. - {id: SYS_PLL3_PFD1_CLK.outFreq, value: 8640/17 MHz}
  188. - {id: SYS_PLL3_PFD2_CLK.outFreq, value: 270 MHz}
  189. - {id: SYS_PLL3_PFD3_CLK.outFreq, value: 4320/11 MHz}
  190. - {id: USDHC1_CLK_ROOT.outFreq, value: 24 MHz}
  191. - {id: USDHC2_CLK_ROOT.outFreq, value: 24 MHz}
  192. settings:
  193. - {id: CoreBusClockRootsInitializationConfig, value: selectedCore}
  194. - {id: SOCDomainVoltage, value: OD}
  195. - {id: ANADIG_OSC_OSC_24M_CTRL_LP_EN_CFG, value: Low}
  196. - {id: ANADIG_OSC_OSC_24M_CTRL_OSC_EN_CFG, value: Enabled}
  197. - {id: ANADIG_PLL.PLL_AUDIO_BYPASS.sel, value: ANADIG_OSC.OSC_24M}
  198. - {id: ANADIG_PLL.PLL_VIDEO.denom, value: '960000'}
  199. - {id: ANADIG_PLL.PLL_VIDEO.div, value: '41'}
  200. - {id: ANADIG_PLL.PLL_VIDEO.num, value: '1'}
  201. - {id: ANADIG_PLL.SYS_PLL1_BYPASS.sel, value: ANADIG_OSC.OSC_24M}
  202. - {id: ANADIG_PLL.SYS_PLL2.denom, value: '268435455'}
  203. - {id: ANADIG_PLL.SYS_PLL2.div, value: '22'}
  204. - {id: ANADIG_PLL.SYS_PLL2.num, value: '0'}
  205. - {id: ANADIG_PLL.SYS_PLL2_SS_DIV.scale, value: '268435455'}
  206. - {id: ANADIG_PLL.SYS_PLL3_PFD3_DIV.scale, value: '22', locked: true}
  207. - {id: ANADIG_PLL.SYS_PLL3_PFD3_MUL.scale, value: '18', locked: true}
  208. - {id: ANADIG_PLL_ARM_PLL_CTRL_POWERUP_CFG, value: Enabled}
  209. - {id: ANADIG_PLL_PLL_AUDIO_CTRL_GATE_CFG, value: Disabled}
  210. - {id: ANADIG_PLL_PLL_VIDEO_CTRL0_POWERUP_CFG, value: Enabled}
  211. - {id: ANADIG_PLL_SYS_PLL1_CTRL0_POWERUP_CFG, value: Disabled}
  212. - {id: ANADIG_PLL_SYS_PLL1_CTRL_GATE_CFG, value: Disabled}
  213. - {id: ANADIG_PLL_SYS_PLL2_CTRL_POWERUP_CFG, value: Enabled}
  214. - {id: ANADIG_PLL_SYS_PLL3_CTRL_POWERUP_CFG, value: Enabled}
  215. - {id: ANADIG_PLL_SYS_PLL3_CTRL_SYS_PLL3_DIV2_CFG, value: Enabled}
  216. - {id: CCM.CLOCK_ROOT0.MUX.sel, value: ANADIG_PLL.ARM_PLL_CLK}
  217. - {id: CCM.CLOCK_ROOT1.MUX.sel, value: ANADIG_PLL.SYS_PLL3_PFD3_CLK}
  218. - {id: CCM.CLOCK_ROOT2.DIV.scale, value: '2'}
  219. - {id: CCM.CLOCK_ROOT2.MUX.sel, value: ANADIG_PLL.SYS_PLL3_CLK}
  220. - {id: CCM.CLOCK_ROOT25.DIV.scale, value: '22'}
  221. - {id: CCM.CLOCK_ROOT25.MUX.sel, value: ANADIG_PLL.SYS_PLL2_CLK}
  222. - {id: CCM.CLOCK_ROOT26.DIV.scale, value: '22'}
  223. - {id: CCM.CLOCK_ROOT26.MUX.sel, value: ANADIG_PLL.SYS_PLL2_CLK}
  224. - {id: CCM.CLOCK_ROOT3.DIV.scale, value: '3'}
  225. - {id: CCM.CLOCK_ROOT3.MUX.sel, value: ANADIG_PLL.SYS_PLL3_CLK}
  226. - {id: CCM.CLOCK_ROOT4.DIV.scale, value: '3'}
  227. - {id: CCM.CLOCK_ROOT4.MUX.sel, value: ANADIG_PLL.SYS_PLL2_PFD1_CLK}
  228. - {id: CCM.CLOCK_ROOT6.DIV.scale, value: '4'}
  229. - {id: CCM.CLOCK_ROOT6.MUX.sel, value: ANADIG_PLL.SYS_PLL2_CLK}
  230. - {id: CCM.CLOCK_ROOT68.DIV.scale, value: '2'}
  231. - {id: CCM.CLOCK_ROOT68.MUX.sel, value: ANADIG_PLL.PLL_VIDEO_CLK}
  232. - {id: CCM.CLOCK_ROOT8.DIV.scale, value: '240'}
  233. * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
  234. /*******************************************************************************
  235. * Variables for BOARD_BootClockRUN configuration
  236. ******************************************************************************/
  237. #ifndef SKIP_POWER_ADJUSTMENT
  238. #if __CORTEX_M == 7
  239. #define BYPASS_LDO_LPSR 1
  240. #define SKIP_LDO_ADJUSTMENT 1
  241. #elif __CORTEX_M == 4
  242. #define SKIP_DCDC_ADJUSTMENT 1
  243. #define SKIP_FBB_ENABLE 1
  244. #endif
  245. #endif
  246. const clock_arm_pll_config_t armPllConfig_BOARD_BootClockRUN =
  247. {
  248. .postDivider = kCLOCK_PllPostDiv2, /* Post divider, 0 - DIV by 2, 1 - DIV by 4, 2 - DIV by 8, 3 - DIV by 1 */
  249. .loopDivider = 166, /* PLL Loop divider, Fout = Fin * ( loopDivider / ( 2 * postDivider ) ) */
  250. };
  251. const clock_sys_pll2_config_t sysPll2Config_BOARD_BootClockRUN =
  252. {
  253. .mfd = 268435455, /* Denominator of spread spectrum */
  254. .ss = NULL, /* Spread spectrum parameter */
  255. .ssEnable = false, /* Enable spread spectrum or not */
  256. };
  257. const clock_video_pll_config_t videoPllConfig_BOARD_BootClockRUN =
  258. {
  259. .loopDivider = 41, /* PLL Loop divider, valid range for DIV_SELECT divider value: 27 ~ 54. */
  260. .postDivider = 0, /* Divider after PLL, should only be 1, 2, 4, 8, 16, 32 */
  261. .numerator = 1, /* 30 bit numerator of fractional loop divider, Fout = Fin * ( loopDivider + numerator / denominator ) */
  262. .denominator = 960000, /* 30 bit denominator of fractional loop divider, Fout = Fin * ( loopDivider + numerator / denominator ) */
  263. .ss = NULL, /* Spread spectrum parameter */
  264. .ssEnable = false, /* Enable spread spectrum or not */
  265. };
  266. /*******************************************************************************
  267. * Code for BOARD_BootClockRUN configuration
  268. ******************************************************************************/
  269. void BOARD_BootClockRUN(void)
  270. {
  271. clock_root_config_t rootCfg = {0};
  272. /* Set DCDC to DCM mode to improve the efficiency for light loading in run mode and transient performance with a big loading step. */
  273. DCDC_BootIntoDCM(DCDC);
  274. #if !defined(SKIP_DCDC_ADJUSTMENT) || (!SKIP_DCDC_ADJUSTMENT)
  275. if((OCOTP->FUSEN[16].FUSE == 0x57AC5969U) && ((OCOTP->FUSEN[17].FUSE & 0xFFU) == 0x0BU))
  276. {
  277. DCDC_SetVDD1P0BuckModeTargetVoltage(DCDC, kDCDC_1P0BuckTarget1P15V);
  278. }
  279. else
  280. {
  281. /* Set 1.125V for production samples to align with data sheet requirement */
  282. DCDC_SetVDD1P0BuckModeTargetVoltage(DCDC, kDCDC_1P0BuckTarget1P125V);
  283. }
  284. #endif
  285. #if !defined(SKIP_FBB_ENABLE) || (!SKIP_FBB_ENABLE)
  286. /* Check if FBB need to be enabled in OverDrive(OD) mode */
  287. if(((OCOTP->FUSEN[7].FUSE & 0x10U) >> 4U) != 1)
  288. {
  289. PMU_EnableBodyBias(ANADIG_PMU, kPMU_FBB_CM7, true);
  290. }
  291. else
  292. {
  293. PMU_EnableBodyBias(ANADIG_PMU, kPMU_FBB_CM7, false);
  294. }
  295. #endif
  296. #if defined(BYPASS_LDO_LPSR) && BYPASS_LDO_LPSR
  297. PMU_StaticEnableLpsrAnaLdoBypassMode(ANADIG_LDO_SNVS, true);
  298. PMU_StaticEnableLpsrDigLdoBypassMode(ANADIG_LDO_SNVS, true);
  299. #endif
  300. #if !defined(SKIP_LDO_ADJUSTMENT) || (!SKIP_LDO_ADJUSTMENT)
  301. pmu_static_lpsr_ana_ldo_config_t lpsrAnaConfig;
  302. pmu_static_lpsr_dig_config_t lpsrDigConfig;
  303. if((ANADIG_LDO_SNVS->PMU_LDO_LPSR_ANA & ANADIG_LDO_SNVS_PMU_LDO_LPSR_ANA_BYPASS_MODE_EN_MASK) == 0UL)
  304. {
  305. PMU_StaticGetLpsrAnaLdoDefaultConfig(&lpsrAnaConfig);
  306. PMU_StaticLpsrAnaLdoInit(ANADIG_LDO_SNVS, &lpsrAnaConfig);
  307. }
  308. if((ANADIG_LDO_SNVS->PMU_LDO_LPSR_DIG & ANADIG_LDO_SNVS_PMU_LDO_LPSR_DIG_BYPASS_MODE_MASK) == 0UL)
  309. {
  310. PMU_StaticGetLpsrDigLdoDefaultConfig(&lpsrDigConfig);
  311. lpsrDigConfig.targetVoltage = kPMU_LpsrDigTargetStableVoltage1P117V;
  312. PMU_StaticLpsrDigLdoInit(ANADIG_LDO_SNVS, &lpsrDigConfig);
  313. }
  314. #endif
  315. /* Config CLK_1M */
  316. CLOCK_OSC_Set1MHzOutputBehavior(kCLOCK_1MHzOutEnableFreeRunning1Mhz);
  317. /* Init OSC RC 16M */
  318. ANADIG_OSC->OSC_16M_CTRL |= ANADIG_OSC_OSC_16M_CTRL_EN_IRC4M16M_MASK;
  319. /* Init OSC RC 400M */
  320. CLOCK_OSC_EnableOscRc400M();
  321. CLOCK_OSC_GateOscRc400M(true);
  322. /* Init OSC RC 48M */
  323. CLOCK_OSC_EnableOsc48M(true);
  324. CLOCK_OSC_EnableOsc48MDiv2(true);
  325. /* Config OSC 24M */
  326. ANADIG_OSC->OSC_24M_CTRL |= ANADIG_OSC_OSC_24M_CTRL_OSC_EN(1) | ANADIG_OSC_OSC_24M_CTRL_BYPASS_EN(0) | ANADIG_OSC_OSC_24M_CTRL_BYPASS_CLK(0) | ANADIG_OSC_OSC_24M_CTRL_LP_EN(1) | ANADIG_OSC_OSC_24M_CTRL_OSC_24M_GATE(0);
  327. /* Wait for 24M OSC to be stable. */
  328. while (ANADIG_OSC_OSC_24M_CTRL_OSC_24M_STABLE_MASK !=
  329. (ANADIG_OSC->OSC_24M_CTRL & ANADIG_OSC_OSC_24M_CTRL_OSC_24M_STABLE_MASK))
  330. {
  331. }
  332. /* Swicth both core, M7 Systick and Bus_Lpsr to OscRC48MDiv2 first */
  333. #if __CORTEX_M == 7
  334. rootCfg.mux = kCLOCK_M7_ClockRoot_MuxOscRc48MDiv2;
  335. rootCfg.div = 1;
  336. CLOCK_SetRootClock(kCLOCK_Root_M7, &rootCfg);
  337. rootCfg.mux = kCLOCK_M7_SYSTICK_ClockRoot_MuxOscRc48MDiv2;
  338. rootCfg.div = 1;
  339. CLOCK_SetRootClock(kCLOCK_Root_M7_Systick, &rootCfg);
  340. #endif
  341. #if __CORTEX_M == 4
  342. rootCfg.mux = kCLOCK_M4_ClockRoot_MuxOscRc48MDiv2;
  343. rootCfg.div = 1;
  344. CLOCK_SetRootClock(kCLOCK_Root_M4, &rootCfg);
  345. rootCfg.mux = kCLOCK_BUS_LPSR_ClockRoot_MuxOscRc48MDiv2;
  346. rootCfg.div = 1;
  347. CLOCK_SetRootClock(kCLOCK_Root_Bus_Lpsr, &rootCfg);
  348. #endif
  349. /*
  350. * if DCD is used, please make sure the clock source of SEMC is not changed in the following PLL/PFD configuration code.
  351. */
  352. /* Init Arm Pll. */
  353. CLOCK_InitArmPll(&armPllConfig_BOARD_BootClockRUN);
  354. /* Bypass Sys Pll1. */
  355. CLOCK_SetPllBypass(kCLOCK_PllSys1, true);
  356. /* DeInit Sys Pll1. */
  357. CLOCK_DeinitSysPll1();
  358. /* Init Sys Pll2. */
  359. CLOCK_InitSysPll2(&sysPll2Config_BOARD_BootClockRUN);
  360. /* Init System Pll2 pfd0. */
  361. CLOCK_InitPfd(kCLOCK_PllSys2, kCLOCK_Pfd0, 27);
  362. /* Init System Pll2 pfd1. */
  363. CLOCK_InitPfd(kCLOCK_PllSys2, kCLOCK_Pfd1, 16);
  364. /* Init System Pll2 pfd2. */
  365. CLOCK_InitPfd(kCLOCK_PllSys2, kCLOCK_Pfd2, 24);
  366. /* Init System Pll2 pfd3. */
  367. CLOCK_InitPfd(kCLOCK_PllSys2, kCLOCK_Pfd3, 32);
  368. /* Init Sys Pll3. */
  369. CLOCK_InitSysPll3();
  370. /* Init System Pll3 pfd0. */
  371. CLOCK_InitPfd(kCLOCK_PllSys3, kCLOCK_Pfd0, 13);
  372. /* Init System Pll3 pfd1. */
  373. CLOCK_InitPfd(kCLOCK_PllSys3, kCLOCK_Pfd1, 17);
  374. /* Init System Pll3 pfd2. */
  375. CLOCK_InitPfd(kCLOCK_PllSys3, kCLOCK_Pfd2, 32);
  376. /* Init System Pll3 pfd3. */
  377. CLOCK_InitPfd(kCLOCK_PllSys3, kCLOCK_Pfd3, 22);
  378. /* Bypass Audio Pll. */
  379. CLOCK_SetPllBypass(kCLOCK_PllAudio, true);
  380. /* DeInit Audio Pll. */
  381. CLOCK_DeinitAudioPll();
  382. /* Init Video Pll. */
  383. CLOCK_InitVideoPll(&videoPllConfig_BOARD_BootClockRUN);
  384. /* Module clock root configurations. */
  385. /* Configure M7 using ARM_PLL_CLK */
  386. #if __CORTEX_M == 7
  387. rootCfg.mux = kCLOCK_M7_ClockRoot_MuxArmPllOut;
  388. rootCfg.div = 1;
  389. CLOCK_SetRootClock(kCLOCK_Root_M7, &rootCfg);
  390. #endif
  391. /* Configure M4 using SYS_PLL3_PFD3_CLK */
  392. #if __CORTEX_M == 4
  393. rootCfg.mux = kCLOCK_M4_ClockRoot_MuxSysPll3Pfd3;
  394. rootCfg.div = 1;
  395. CLOCK_SetRootClock(kCLOCK_Root_M4, &rootCfg);
  396. #endif
  397. /* Configure BUS using SYS_PLL3_CLK */
  398. #if __CORTEX_M == 7
  399. rootCfg.mux = kCLOCK_BUS_ClockRoot_MuxSysPll3Out;
  400. rootCfg.div = 2;
  401. CLOCK_SetRootClock(kCLOCK_Root_Bus, &rootCfg);
  402. #endif
  403. /* Configure BUS_LPSR using SYS_PLL3_CLK */
  404. #if __CORTEX_M == 4
  405. rootCfg.mux = kCLOCK_BUS_LPSR_ClockRoot_MuxSysPll3Out;
  406. rootCfg.div = 3;
  407. CLOCK_SetRootClock(kCLOCK_Root_Bus_Lpsr, &rootCfg);
  408. #endif
  409. /* Configure SEMC using SYS_PLL2_PFD1_CLK */
  410. #ifndef SKIP_SEMC_INIT
  411. rootCfg.mux = kCLOCK_SEMC_ClockRoot_MuxSysPll2Pfd1;
  412. rootCfg.div = 3;
  413. CLOCK_SetRootClock(kCLOCK_Root_Semc, &rootCfg);
  414. #endif
  415. #if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)
  416. #if defined(XIP_BOOT_HEADER_DCD_ENABLE) && (XIP_BOOT_HEADER_DCD_ENABLE == 1)
  417. UpdateSemcClock();
  418. #endif
  419. #endif
  420. /* Configure CSSYS using OSC_RC_48M_DIV2 */
  421. rootCfg.mux = kCLOCK_CSSYS_ClockRoot_MuxOscRc48MDiv2;
  422. rootCfg.div = 1;
  423. CLOCK_SetRootClock(kCLOCK_Root_Cssys, &rootCfg);
  424. /* Configure CSTRACE using SYS_PLL2_CLK */
  425. rootCfg.mux = kCLOCK_CSTRACE_ClockRoot_MuxSysPll2Out;
  426. rootCfg.div = 4;
  427. CLOCK_SetRootClock(kCLOCK_Root_Cstrace, &rootCfg);
  428. /* Configure M4_SYSTICK using OSC_RC_48M_DIV2 */
  429. #if __CORTEX_M == 4
  430. rootCfg.mux = kCLOCK_M4_SYSTICK_ClockRoot_MuxOscRc48MDiv2;
  431. rootCfg.div = 1;
  432. CLOCK_SetRootClock(kCLOCK_Root_M4_Systick, &rootCfg);
  433. #endif
  434. /* Configure M7_SYSTICK using OSC_RC_48M_DIV2 */
  435. #if __CORTEX_M == 7
  436. rootCfg.mux = kCLOCK_M7_SYSTICK_ClockRoot_MuxOscRc48MDiv2;
  437. rootCfg.div = 240;
  438. CLOCK_SetRootClock(kCLOCK_Root_M7_Systick, &rootCfg);
  439. #endif
  440. /* Configure ADC1 using OSC_RC_48M_DIV2 */
  441. rootCfg.mux = kCLOCK_ADC1_ClockRoot_MuxOscRc48MDiv2;
  442. rootCfg.div = 1;
  443. CLOCK_SetRootClock(kCLOCK_Root_Adc1, &rootCfg);
  444. /* Configure ADC2 using OSC_RC_48M_DIV2 */
  445. rootCfg.mux = kCLOCK_ADC2_ClockRoot_MuxOscRc48MDiv2;
  446. rootCfg.div = 1;
  447. CLOCK_SetRootClock(kCLOCK_Root_Adc2, &rootCfg);
  448. /* Configure ACMP using OSC_RC_48M_DIV2 */
  449. rootCfg.mux = kCLOCK_ACMP_ClockRoot_MuxOscRc48MDiv2;
  450. rootCfg.div = 1;
  451. CLOCK_SetRootClock(kCLOCK_Root_Acmp, &rootCfg);
  452. /* Configure FLEXIO1 using OSC_RC_48M_DIV2 */
  453. rootCfg.mux = kCLOCK_FLEXIO1_ClockRoot_MuxOscRc48MDiv2;
  454. rootCfg.div = 1;
  455. CLOCK_SetRootClock(kCLOCK_Root_Flexio1, &rootCfg);
  456. /* Configure FLEXIO2 using OSC_RC_48M_DIV2 */
  457. rootCfg.mux = kCLOCK_FLEXIO2_ClockRoot_MuxOscRc48MDiv2;
  458. rootCfg.div = 1;
  459. CLOCK_SetRootClock(kCLOCK_Root_Flexio2, &rootCfg);
  460. /* Configure GPT1 using OSC_RC_48M_DIV2 */
  461. rootCfg.mux = kCLOCK_GPT1_ClockRoot_MuxOscRc48MDiv2;
  462. rootCfg.div = 1;
  463. CLOCK_SetRootClock(kCLOCK_Root_Gpt1, &rootCfg);
  464. /* Configure GPT2 using OSC_RC_48M_DIV2 */
  465. rootCfg.mux = kCLOCK_GPT2_ClockRoot_MuxOscRc48MDiv2;
  466. rootCfg.div = 1;
  467. CLOCK_SetRootClock(kCLOCK_Root_Gpt2, &rootCfg);
  468. /* Configure GPT3 using OSC_RC_48M_DIV2 */
  469. rootCfg.mux = kCLOCK_GPT3_ClockRoot_MuxOscRc48MDiv2;
  470. rootCfg.div = 1;
  471. CLOCK_SetRootClock(kCLOCK_Root_Gpt3, &rootCfg);
  472. /* Configure GPT4 using OSC_RC_48M_DIV2 */
  473. rootCfg.mux = kCLOCK_GPT4_ClockRoot_MuxOscRc48MDiv2;
  474. rootCfg.div = 1;
  475. CLOCK_SetRootClock(kCLOCK_Root_Gpt4, &rootCfg);
  476. /* Configure GPT5 using OSC_RC_48M_DIV2 */
  477. rootCfg.mux = kCLOCK_GPT5_ClockRoot_MuxOscRc48MDiv2;
  478. rootCfg.div = 1;
  479. CLOCK_SetRootClock(kCLOCK_Root_Gpt5, &rootCfg);
  480. /* Configure GPT6 using OSC_RC_48M_DIV2 */
  481. rootCfg.mux = kCLOCK_GPT6_ClockRoot_MuxOscRc48MDiv2;
  482. rootCfg.div = 1;
  483. CLOCK_SetRootClock(kCLOCK_Root_Gpt6, &rootCfg);
  484. /* Configure FLEXSPI1 using OSC_RC_48M_DIV2 */
  485. #if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1) || defined(FLEXSPI_IN_USE))
  486. rootCfg.mux = kCLOCK_FLEXSPI1_ClockRoot_MuxOscRc48MDiv2;
  487. rootCfg.div = 1;
  488. CLOCK_SetRootClock(kCLOCK_Root_Flexspi1, &rootCfg);
  489. #endif
  490. /* Configure FLEXSPI2 using OSC_RC_48M_DIV2 */
  491. rootCfg.mux = kCLOCK_FLEXSPI2_ClockRoot_MuxOscRc48MDiv2;
  492. rootCfg.div = 1;
  493. CLOCK_SetRootClock(kCLOCK_Root_Flexspi2, &rootCfg);
  494. /* Configure CAN1 using OSC_RC_48M_DIV2 */
  495. rootCfg.mux = kCLOCK_CAN1_ClockRoot_MuxOscRc48MDiv2;
  496. rootCfg.div = 1;
  497. CLOCK_SetRootClock(kCLOCK_Root_Can1, &rootCfg);
  498. /* Configure CAN2 using OSC_RC_48M_DIV2 */
  499. rootCfg.mux = kCLOCK_CAN2_ClockRoot_MuxOscRc48MDiv2;
  500. rootCfg.div = 1;
  501. CLOCK_SetRootClock(kCLOCK_Root_Can2, &rootCfg);
  502. /* Configure CAN3 using OSC_RC_48M_DIV2 */
  503. rootCfg.mux = kCLOCK_CAN3_ClockRoot_MuxOscRc48MDiv2;
  504. rootCfg.div = 1;
  505. CLOCK_SetRootClock(kCLOCK_Root_Can3, &rootCfg);
  506. /* Configure LPUART1 using SYS_PLL2_CLK */
  507. rootCfg.mux = kCLOCK_LPUART1_ClockRoot_MuxSysPll2Out;
  508. rootCfg.div = 22;
  509. CLOCK_SetRootClock(kCLOCK_Root_Lpuart1, &rootCfg);
  510. /* Configure LPUART2 using SYS_PLL2_CLK */
  511. rootCfg.mux = kCLOCK_LPUART2_ClockRoot_MuxSysPll2Out;
  512. rootCfg.div = 22;
  513. CLOCK_SetRootClock(kCLOCK_Root_Lpuart2, &rootCfg);
  514. /* Configure LPUART3 using OSC_RC_48M_DIV2 */
  515. rootCfg.mux = kCLOCK_LPUART3_ClockRoot_MuxOscRc48MDiv2;
  516. rootCfg.div = 1;
  517. CLOCK_SetRootClock(kCLOCK_Root_Lpuart3, &rootCfg);
  518. /* Configure LPUART4 using OSC_RC_48M_DIV2 */
  519. rootCfg.mux = kCLOCK_LPUART4_ClockRoot_MuxOscRc48MDiv2;
  520. rootCfg.div = 1;
  521. CLOCK_SetRootClock(kCLOCK_Root_Lpuart4, &rootCfg);
  522. /* Configure LPUART5 using OSC_RC_48M_DIV2 */
  523. rootCfg.mux = kCLOCK_LPUART5_ClockRoot_MuxOscRc48MDiv2;
  524. rootCfg.div = 1;
  525. CLOCK_SetRootClock(kCLOCK_Root_Lpuart5, &rootCfg);
  526. /* Configure LPUART6 using OSC_RC_48M_DIV2 */
  527. rootCfg.mux = kCLOCK_LPUART6_ClockRoot_MuxOscRc48MDiv2;
  528. rootCfg.div = 1;
  529. CLOCK_SetRootClock(kCLOCK_Root_Lpuart6, &rootCfg);
  530. /* Configure LPUART7 using OSC_RC_48M_DIV2 */
  531. rootCfg.mux = kCLOCK_LPUART7_ClockRoot_MuxOscRc48MDiv2;
  532. rootCfg.div = 1;
  533. CLOCK_SetRootClock(kCLOCK_Root_Lpuart7, &rootCfg);
  534. /* Configure LPUART8 using OSC_RC_48M_DIV2 */
  535. rootCfg.mux = kCLOCK_LPUART8_ClockRoot_MuxOscRc48MDiv2;
  536. rootCfg.div = 1;
  537. CLOCK_SetRootClock(kCLOCK_Root_Lpuart8, &rootCfg);
  538. /* Configure LPUART9 using OSC_RC_48M_DIV2 */
  539. rootCfg.mux = kCLOCK_LPUART9_ClockRoot_MuxOscRc48MDiv2;
  540. rootCfg.div = 1;
  541. CLOCK_SetRootClock(kCLOCK_Root_Lpuart9, &rootCfg);
  542. /* Configure LPUART10 using OSC_RC_48M_DIV2 */
  543. rootCfg.mux = kCLOCK_LPUART10_ClockRoot_MuxOscRc48MDiv2;
  544. rootCfg.div = 1;
  545. CLOCK_SetRootClock(kCLOCK_Root_Lpuart10, &rootCfg);
  546. /* Configure LPUART11 using OSC_RC_48M_DIV2 */
  547. rootCfg.mux = kCLOCK_LPUART11_ClockRoot_MuxOscRc48MDiv2;
  548. rootCfg.div = 1;
  549. CLOCK_SetRootClock(kCLOCK_Root_Lpuart11, &rootCfg);
  550. /* Configure LPUART12 using OSC_RC_48M_DIV2 */
  551. rootCfg.mux = kCLOCK_LPUART12_ClockRoot_MuxOscRc48MDiv2;
  552. rootCfg.div = 1;
  553. CLOCK_SetRootClock(kCLOCK_Root_Lpuart12, &rootCfg);
  554. /* Configure LPI2C1 using OSC_RC_48M_DIV2 */
  555. rootCfg.mux = kCLOCK_LPI2C1_ClockRoot_MuxOscRc48MDiv2;
  556. rootCfg.div = 1;
  557. CLOCK_SetRootClock(kCLOCK_Root_Lpi2c1, &rootCfg);
  558. /* Configure LPI2C2 using OSC_RC_48M_DIV2 */
  559. rootCfg.mux = kCLOCK_LPI2C2_ClockRoot_MuxOscRc48MDiv2;
  560. rootCfg.div = 1;
  561. CLOCK_SetRootClock(kCLOCK_Root_Lpi2c2, &rootCfg);
  562. /* Configure LPI2C3 using OSC_RC_48M_DIV2 */
  563. rootCfg.mux = kCLOCK_LPI2C3_ClockRoot_MuxOscRc48MDiv2;
  564. rootCfg.div = 1;
  565. CLOCK_SetRootClock(kCLOCK_Root_Lpi2c3, &rootCfg);
  566. /* Configure LPI2C4 using OSC_RC_48M_DIV2 */
  567. rootCfg.mux = kCLOCK_LPI2C4_ClockRoot_MuxOscRc48MDiv2;
  568. rootCfg.div = 1;
  569. CLOCK_SetRootClock(kCLOCK_Root_Lpi2c4, &rootCfg);
  570. /* Configure LPI2C5 using OSC_RC_48M_DIV2 */
  571. rootCfg.mux = kCLOCK_LPI2C5_ClockRoot_MuxOscRc48MDiv2;
  572. rootCfg.div = 1;
  573. CLOCK_SetRootClock(kCLOCK_Root_Lpi2c5, &rootCfg);
  574. /* Configure LPI2C6 using OSC_RC_48M_DIV2 */
  575. rootCfg.mux = kCLOCK_LPI2C6_ClockRoot_MuxOscRc48MDiv2;
  576. rootCfg.div = 1;
  577. CLOCK_SetRootClock(kCLOCK_Root_Lpi2c6, &rootCfg);
  578. /* Configure LPSPI1 using OSC_RC_48M_DIV2 */
  579. rootCfg.mux = kCLOCK_LPSPI1_ClockRoot_MuxOscRc48MDiv2;
  580. rootCfg.div = 1;
  581. CLOCK_SetRootClock(kCLOCK_Root_Lpspi1, &rootCfg);
  582. /* Configure LPSPI2 using OSC_RC_48M_DIV2 */
  583. rootCfg.mux = kCLOCK_LPSPI2_ClockRoot_MuxOscRc48MDiv2;
  584. rootCfg.div = 1;
  585. CLOCK_SetRootClock(kCLOCK_Root_Lpspi2, &rootCfg);
  586. /* Configure LPSPI3 using OSC_RC_48M_DIV2 */
  587. rootCfg.mux = kCLOCK_LPSPI3_ClockRoot_MuxOscRc48MDiv2;
  588. rootCfg.div = 1;
  589. CLOCK_SetRootClock(kCLOCK_Root_Lpspi3, &rootCfg);
  590. /* Configure LPSPI4 using OSC_RC_48M_DIV2 */
  591. rootCfg.mux = kCLOCK_LPSPI4_ClockRoot_MuxOscRc48MDiv2;
  592. rootCfg.div = 1;
  593. CLOCK_SetRootClock(kCLOCK_Root_Lpspi4, &rootCfg);
  594. /* Configure LPSPI5 using OSC_RC_48M_DIV2 */
  595. rootCfg.mux = kCLOCK_LPSPI5_ClockRoot_MuxOscRc48MDiv2;
  596. rootCfg.div = 1;
  597. CLOCK_SetRootClock(kCLOCK_Root_Lpspi5, &rootCfg);
  598. /* Configure LPSPI6 using OSC_RC_48M_DIV2 */
  599. rootCfg.mux = kCLOCK_LPSPI6_ClockRoot_MuxOscRc48MDiv2;
  600. rootCfg.div = 1;
  601. CLOCK_SetRootClock(kCLOCK_Root_Lpspi6, &rootCfg);
  602. /* Configure EMV1 using OSC_RC_48M_DIV2 */
  603. rootCfg.mux = kCLOCK_EMV1_ClockRoot_MuxOscRc48MDiv2;
  604. rootCfg.div = 1;
  605. CLOCK_SetRootClock(kCLOCK_Root_Emv1, &rootCfg);
  606. /* Configure EMV2 using OSC_RC_48M_DIV2 */
  607. rootCfg.mux = kCLOCK_EMV2_ClockRoot_MuxOscRc48MDiv2;
  608. rootCfg.div = 1;
  609. CLOCK_SetRootClock(kCLOCK_Root_Emv2, &rootCfg);
  610. /* Configure ENET1 using OSC_RC_48M_DIV2 */
  611. rootCfg.mux = kCLOCK_ENET1_ClockRoot_MuxOscRc48MDiv2;
  612. rootCfg.div = 1;
  613. CLOCK_SetRootClock(kCLOCK_Root_Enet1, &rootCfg);
  614. /* Configure ENET2 using OSC_RC_48M_DIV2 */
  615. rootCfg.mux = kCLOCK_ENET2_ClockRoot_MuxOscRc48MDiv2;
  616. rootCfg.div = 1;
  617. CLOCK_SetRootClock(kCLOCK_Root_Enet2, &rootCfg);
  618. /* Configure ENET_QOS using OSC_RC_48M_DIV2 */
  619. rootCfg.mux = kCLOCK_ENET_QOS_ClockRoot_MuxOscRc48MDiv2;
  620. rootCfg.div = 1;
  621. CLOCK_SetRootClock(kCLOCK_Root_Enet_Qos, &rootCfg);
  622. /* Configure ENET_25M using OSC_RC_48M_DIV2 */
  623. rootCfg.mux = kCLOCK_ENET_25M_ClockRoot_MuxOscRc48MDiv2;
  624. rootCfg.div = 1;
  625. CLOCK_SetRootClock(kCLOCK_Root_Enet_25m, &rootCfg);
  626. /* Configure ENET_TIMER1 using OSC_RC_48M_DIV2 */
  627. rootCfg.mux = kCLOCK_ENET_TIMER1_ClockRoot_MuxOscRc48MDiv2;
  628. rootCfg.div = 1;
  629. CLOCK_SetRootClock(kCLOCK_Root_Enet_Timer1, &rootCfg);
  630. /* Configure ENET_TIMER2 using OSC_RC_48M_DIV2 */
  631. rootCfg.mux = kCLOCK_ENET_TIMER2_ClockRoot_MuxOscRc48MDiv2;
  632. rootCfg.div = 1;
  633. CLOCK_SetRootClock(kCLOCK_Root_Enet_Timer2, &rootCfg);
  634. /* Configure ENET_TIMER3 using OSC_RC_48M_DIV2 */
  635. rootCfg.mux = kCLOCK_ENET_TIMER3_ClockRoot_MuxOscRc48MDiv2;
  636. rootCfg.div = 1;
  637. CLOCK_SetRootClock(kCLOCK_Root_Enet_Timer3, &rootCfg);
  638. /* Configure USDHC1 using OSC_RC_48M_DIV2 */
  639. rootCfg.mux = kCLOCK_USDHC1_ClockRoot_MuxOscRc48MDiv2;
  640. rootCfg.div = 1;
  641. CLOCK_SetRootClock(kCLOCK_Root_Usdhc1, &rootCfg);
  642. /* Configure USDHC2 using OSC_RC_48M_DIV2 */
  643. rootCfg.mux = kCLOCK_USDHC2_ClockRoot_MuxOscRc48MDiv2;
  644. rootCfg.div = 1;
  645. CLOCK_SetRootClock(kCLOCK_Root_Usdhc2, &rootCfg);
  646. /* Configure ASRC using OSC_RC_48M_DIV2 */
  647. rootCfg.mux = kCLOCK_ASRC_ClockRoot_MuxOscRc48MDiv2;
  648. rootCfg.div = 1;
  649. CLOCK_SetRootClock(kCLOCK_Root_Asrc, &rootCfg);
  650. /* Configure MQS using OSC_RC_48M_DIV2 */
  651. rootCfg.mux = kCLOCK_MQS_ClockRoot_MuxOscRc48MDiv2;
  652. rootCfg.div = 1;
  653. CLOCK_SetRootClock(kCLOCK_Root_Mqs, &rootCfg);
  654. /* Configure MIC using OSC_RC_48M_DIV2 */
  655. rootCfg.mux = kCLOCK_MIC_ClockRoot_MuxOscRc48MDiv2;
  656. rootCfg.div = 1;
  657. CLOCK_SetRootClock(kCLOCK_Root_Mic, &rootCfg);
  658. /* Configure SPDIF using OSC_RC_48M_DIV2 */
  659. rootCfg.mux = kCLOCK_SPDIF_ClockRoot_MuxOscRc48MDiv2;
  660. rootCfg.div = 1;
  661. CLOCK_SetRootClock(kCLOCK_Root_Spdif, &rootCfg);
  662. /* Configure SAI1 using OSC_RC_48M_DIV2 */
  663. rootCfg.mux = kCLOCK_SAI1_ClockRoot_MuxOscRc48MDiv2;
  664. rootCfg.div = 1;
  665. CLOCK_SetRootClock(kCLOCK_Root_Sai1, &rootCfg);
  666. /* Configure SAI2 using OSC_RC_48M_DIV2 */
  667. rootCfg.mux = kCLOCK_SAI2_ClockRoot_MuxOscRc48MDiv2;
  668. rootCfg.div = 1;
  669. CLOCK_SetRootClock(kCLOCK_Root_Sai2, &rootCfg);
  670. /* Configure SAI3 using OSC_RC_48M_DIV2 */
  671. rootCfg.mux = kCLOCK_SAI3_ClockRoot_MuxOscRc48MDiv2;
  672. rootCfg.div = 1;
  673. CLOCK_SetRootClock(kCLOCK_Root_Sai3, &rootCfg);
  674. /* Configure SAI4 using OSC_RC_48M_DIV2 */
  675. rootCfg.mux = kCLOCK_SAI4_ClockRoot_MuxOscRc48MDiv2;
  676. rootCfg.div = 1;
  677. CLOCK_SetRootClock(kCLOCK_Root_Sai4, &rootCfg);
  678. /* Configure GC355 using PLL_VIDEO_CLK */
  679. rootCfg.mux = kCLOCK_GC355_ClockRoot_MuxVideoPllOut;
  680. rootCfg.div = 2;
  681. CLOCK_SetRootClock(kCLOCK_Root_Gc355, &rootCfg);
  682. /* Configure LCDIF using OSC_RC_48M_DIV2 */
  683. rootCfg.mux = kCLOCK_LCDIF_ClockRoot_MuxOscRc48MDiv2;
  684. rootCfg.div = 1;
  685. CLOCK_SetRootClock(kCLOCK_Root_Lcdif, &rootCfg);
  686. /* Configure LCDIFV2 using OSC_RC_48M_DIV2 */
  687. rootCfg.mux = kCLOCK_LCDIFV2_ClockRoot_MuxOscRc48MDiv2;
  688. rootCfg.div = 1;
  689. CLOCK_SetRootClock(kCLOCK_Root_Lcdifv2, &rootCfg);
  690. /* Configure MIPI_REF using OSC_RC_48M_DIV2 */
  691. rootCfg.mux = kCLOCK_MIPI_REF_ClockRoot_MuxOscRc48MDiv2;
  692. rootCfg.div = 1;
  693. CLOCK_SetRootClock(kCLOCK_Root_Mipi_Ref, &rootCfg);
  694. /* Configure MIPI_ESC using OSC_RC_48M_DIV2 */
  695. rootCfg.mux = kCLOCK_MIPI_ESC_ClockRoot_MuxOscRc48MDiv2;
  696. rootCfg.div = 1;
  697. CLOCK_SetRootClock(kCLOCK_Root_Mipi_Esc, &rootCfg);
  698. /* Configure CSI2 using OSC_RC_48M_DIV2 */
  699. rootCfg.mux = kCLOCK_CSI2_ClockRoot_MuxOscRc48MDiv2;
  700. rootCfg.div = 1;
  701. CLOCK_SetRootClock(kCLOCK_Root_Csi2, &rootCfg);
  702. /* Configure CSI2_ESC using OSC_RC_48M_DIV2 */
  703. rootCfg.mux = kCLOCK_CSI2_ESC_ClockRoot_MuxOscRc48MDiv2;
  704. rootCfg.div = 1;
  705. CLOCK_SetRootClock(kCLOCK_Root_Csi2_Esc, &rootCfg);
  706. /* Configure CSI2_UI using OSC_RC_48M_DIV2 */
  707. rootCfg.mux = kCLOCK_CSI2_UI_ClockRoot_MuxOscRc48MDiv2;
  708. rootCfg.div = 1;
  709. CLOCK_SetRootClock(kCLOCK_Root_Csi2_Ui, &rootCfg);
  710. /* Configure CSI using OSC_RC_48M_DIV2 */
  711. rootCfg.mux = kCLOCK_CSI_ClockRoot_MuxOscRc48MDiv2;
  712. rootCfg.div = 1;
  713. CLOCK_SetRootClock(kCLOCK_Root_Csi, &rootCfg);
  714. /* Configure CKO1 using OSC_RC_48M_DIV2 */
  715. rootCfg.mux = kCLOCK_CKO1_ClockRoot_MuxOscRc48MDiv2;
  716. rootCfg.div = 1;
  717. CLOCK_SetRootClock(kCLOCK_Root_Cko1, &rootCfg);
  718. /* Configure CKO2 using OSC_RC_48M_DIV2 */
  719. rootCfg.mux = kCLOCK_CKO2_ClockRoot_MuxOscRc48MDiv2;
  720. rootCfg.div = 1;
  721. CLOCK_SetRootClock(kCLOCK_Root_Cko2, &rootCfg);
  722. /* Set SAI1 MCLK1 clock source. */
  723. IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk1Sel, 0);
  724. /* Set SAI1 MCLK2 clock source. */
  725. IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk2Sel, 3);
  726. /* Set SAI1 MCLK3 clock source. */
  727. IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk3Sel, 0);
  728. /* Set SAI2 MCLK3 clock source. */
  729. IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI2MClk3Sel, 0);
  730. /* Set SAI3 MCLK3 clock source. */
  731. IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI3MClk3Sel, 0);
  732. /* Set MQS configuration. */
  733. IOMUXC_MQSConfig(IOMUXC_GPR,kIOMUXC_MqsPwmOverSampleRate32, 0);
  734. /* Set ENET Ref clock source. */
  735. IOMUXC_GPR->GPR4 &= ~IOMUXC_GPR_GPR4_ENET_REF_CLK_DIR_MASK;
  736. /* Set ENET_1G Tx clock source. */
  737. IOMUXC_GPR->GPR5 = ((IOMUXC_GPR->GPR5 & ~IOMUXC_GPR_GPR5_ENET1G_TX_CLK_SEL_MASK) | IOMUXC_GPR_GPR5_ENET1G_RGMII_EN_MASK);
  738. /* Set ENET_1G Ref clock source. */
  739. IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_ENET1G_REF_CLK_DIR_MASK;
  740. /* Set ENET_QOS Tx clock source. */
  741. IOMUXC_GPR->GPR6 &= ~IOMUXC_GPR_GPR6_ENET_QOS_RGMII_EN_MASK;
  742. /* Set ENET_QOS Ref clock source. */
  743. IOMUXC_GPR->GPR6 &= ~IOMUXC_GPR_GPR6_ENET_QOS_REF_CLK_DIR_MASK;
  744. /* Set GPT1 High frequency reference clock source. */
  745. IOMUXC_GPR->GPR22 &= ~IOMUXC_GPR_GPR22_REF_1M_CLK_GPT1_MASK;
  746. /* Set GPT2 High frequency reference clock source. */
  747. IOMUXC_GPR->GPR23 &= ~IOMUXC_GPR_GPR23_REF_1M_CLK_GPT2_MASK;
  748. /* Set GPT3 High frequency reference clock source. */
  749. IOMUXC_GPR->GPR24 &= ~IOMUXC_GPR_GPR24_REF_1M_CLK_GPT3_MASK;
  750. /* Set GPT4 High frequency reference clock source. */
  751. IOMUXC_GPR->GPR25 &= ~IOMUXC_GPR_GPR25_REF_1M_CLK_GPT4_MASK;
  752. /* Set GPT5 High frequency reference clock source. */
  753. IOMUXC_GPR->GPR26 &= ~IOMUXC_GPR_GPR26_REF_1M_CLK_GPT5_MASK;
  754. /* Set GPT6 High frequency reference clock source. */
  755. IOMUXC_GPR->GPR27 &= ~IOMUXC_GPR_GPR27_REF_1M_CLK_GPT6_MASK;
  756. #if __CORTEX_M == 7
  757. SystemCoreClock = CLOCK_GetRootClockFreq(kCLOCK_Root_M7);
  758. #else
  759. SystemCoreClock = CLOCK_GetRootClockFreq(kCLOCK_Root_M4);
  760. #endif
  761. }