board.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. /*
  2. * File : board.c
  3. * This file is part of RT-Thread RTOS
  4. * COPYRIGHT (C) 2009 RT-Thread Develop Team
  5. *
  6. * The license and distribution terms for this file may be
  7. * found in the file LICENSE in this distribution or at
  8. * http://www.rt-thread.org/license/LICENSE
  9. *
  10. * Change Logs:
  11. * Date Author Notes
  12. * 2009-01-05 Bernard first implementation
  13. */
  14. #include <stdint.h>
  15. #include <rthw.h>
  16. #include <rtthread.h>
  17. #include "board.h"
  18. #include "drv_uart.h"
  19. #if defined(RT_USING_SDRAM) && defined(RT_USING_MEMHEAP_AS_HEAP)
  20. static struct rt_memheap system_heap;
  21. #endif
  22. /* ARM PLL configuration for RUN mode */
  23. const clock_arm_pll_config_t armPllConfig = { .loopDivider = 100U };
  24. /* SYS PLL configuration for RUN mode */
  25. const clock_sys_pll_config_t sysPllConfig = { .loopDivider = 1U };
  26. /* USB1 PLL configuration for RUN mode */
  27. const clock_usb_pll_config_t usb1PllConfig = { .loopDivider = 0U };
  28. static void BOARD_BootClockGate(void)
  29. {
  30. // /* Disable all unused peripheral clock */
  31. // CCM->CCGR0 = 0x00C0000FU;
  32. // CCM->CCGR1 = 0x30000000U;
  33. // CCM->CCGR2 = 0x003F0030U;
  34. // CCM->CCGR3 = 0xF0000330U;
  35. // CCM->CCGR4 = 0x0000FF3CU;
  36. // CCM->CCGR5 = 0xF000330FU;
  37. // CCM->CCGR6 = 0x00FC0300U;
  38. }
  39. static void BOARD_BootClockRUN(void)
  40. {
  41. /* Boot ROM did initialize the XTAL, here we only sets external XTAL OSC freq */
  42. CLOCK_SetXtalFreq(24000000U);
  43. CLOCK_SetRtcXtalFreq(32768U);
  44. CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 0x1); /* Set PERIPH_CLK2 MUX to OSC */
  45. CLOCK_SetMux(kCLOCK_PeriphMux, 0x1); /* Set PERIPH_CLK MUX to PERIPH_CLK2 */
  46. /* Setting the VDD_SOC to 1.5V. It is necessary to config AHB to 600Mhz */
  47. DCDC->REG3 = (DCDC->REG3 & (~DCDC_REG3_TRG_MASK)) | DCDC_REG3_TRG(0x12);
  48. CLOCK_InitArmPll(&armPllConfig); /* Configure ARM PLL to 1200M */
  49. #ifndef SKIP_SYSCLK_INIT
  50. CLOCK_InitSysPll(&sysPllConfig); /* Configure SYS PLL to 528M */
  51. #endif
  52. #ifndef SKIP_USB_PLL_INIT
  53. CLOCK_InitUsb1Pll(&usb1PllConfig); /* Configure USB1 PLL to 480M */
  54. #endif
  55. CLOCK_SetDiv(kCLOCK_ArmDiv, 0x1); /* Set ARM PODF to 0, divide by 2 */
  56. CLOCK_SetDiv(kCLOCK_AhbDiv, 0x0); /* Set AHB PODF to 0, divide by 1 */
  57. CLOCK_SetDiv(kCLOCK_IpgDiv, 0x3); /* Set IPG PODF to 3, divede by 4 */
  58. CLOCK_SetMux(kCLOCK_PrePeriphMux, 0x3); /* Set PRE_PERIPH_CLK to PLL1, 1200M */
  59. CLOCK_SetMux(kCLOCK_PeriphMux, 0x0); /* Set PERIPH_CLK MUX to PRE_PERIPH_CLK */
  60. /* Disable unused clock */
  61. BOARD_BootClockGate();
  62. /* Power down all unused PLL */
  63. CLOCK_DeinitAudioPll();
  64. CLOCK_DeinitVideoPll();
  65. CLOCK_DeinitEnetPll();
  66. CLOCK_DeinitUsb2Pll();
  67. /* iomuxc clock (iomuxc_clk_enable): 0x03u */
  68. CLOCK_EnableClock(kCLOCK_Iomuxc);
  69. /* Update core clock */
  70. SystemCoreClockUpdate();
  71. }
  72. /* MPU configuration. */
  73. static void BOARD_ConfigMPU(void)
  74. {
  75. /* Disable I cache and D cache */
  76. SCB_DisableICache();
  77. SCB_DisableDCache();
  78. /* Disable MPU */
  79. ARM_MPU_Disable();
  80. /* Region 0 setting */
  81. MPU->RBAR = ARM_MPU_RBAR(0, 0xC0000000U);
  82. MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB);
  83. /* Region 1 setting */
  84. MPU->RBAR = ARM_MPU_RBAR(1, 0x80000000U);
  85. MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1GB);
  86. /* Region 2 setting */
  87. // spi flash: normal type, cacheable, no bufferable, no shareable
  88. MPU->RBAR = ARM_MPU_RBAR(2, 0x60000000U);
  89. MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 0, 0, ARM_MPU_REGION_SIZE_512MB);
  90. /* Region 3 setting */
  91. MPU->RBAR = ARM_MPU_RBAR(3, 0x00000000U);
  92. MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1GB);
  93. /* Region 4 setting */
  94. MPU->RBAR = ARM_MPU_RBAR(4, 0x00000000U);
  95. MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_128KB);
  96. /* Region 5 setting */
  97. MPU->RBAR = ARM_MPU_RBAR(5, 0x20000000U);
  98. MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_128KB);
  99. /* Region 6 setting */
  100. MPU->RBAR = ARM_MPU_RBAR(6, 0x20200000U);
  101. MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB);
  102. #if defined(SDRAM_MPU_INIT)
  103. /* Region 7 setting */
  104. MPU->RBAR = ARM_MPU_RBAR(7, 0x80000000U);
  105. MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_32MB);
  106. /* Region 8 setting */
  107. MPU->RBAR = ARM_MPU_RBAR(8, 0x81E00000U);
  108. MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 1, 0, 0, 0, ARM_MPU_REGION_SIZE_2MB);
  109. #endif
  110. /* Enable MPU */
  111. ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk);
  112. /* Enable I cache and D cache */
  113. SCB_EnableDCache();
  114. SCB_EnableICache();
  115. }
  116. /**
  117. * This is the timer interrupt service routine.
  118. *
  119. */
  120. void SysTick_Handler(void)
  121. {
  122. /* enter interrupt */
  123. rt_interrupt_enter();
  124. rt_tick_increase();
  125. /* leave interrupt */
  126. rt_interrupt_leave();
  127. }
  128. void SystemInitHook(void)
  129. {
  130. BOARD_ConfigMPU();
  131. #if defined(RT_USING_SDRAM)
  132. extern int imxrt_sdram_init(void);
  133. imxrt_sdram_init();
  134. #endif
  135. }
  136. /**
  137. * This function will initial rt1050 board.
  138. */
  139. void rt_hw_board_init()
  140. {
  141. BOARD_BootClockRUN();
  142. SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);
  143. #ifdef RT_USING_COMPONENTS_INIT
  144. rt_components_board_init();
  145. #endif
  146. #ifdef RT_USING_CONSOLE
  147. rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
  148. #endif
  149. #ifdef RT_USING_HEAP
  150. #if defined(RT_USING_SDRAM) && defined(RT_USING_MEMHEAP_AS_HEAP)
  151. rt_kprintf("sdram heap, begin: 0x%p, end: 0x%p\n", SDRAM_BEGIN, SDRAM_END);
  152. rt_system_heap_init((void *)SDRAM_BEGIN, (void *)SDRAM_END);
  153. rt_kprintf("sram heap, begin: 0x%p, end: 0x%p\n", HEAP_BEGIN, HEAP_END);
  154. rt_memheap_init(&system_heap, "sram", (void *)HEAP_BEGIN, HEAP_SIZE);
  155. #else
  156. rt_kprintf("sram heap, begin: 0x%p, end: 0x%p\n", HEAP_BEGIN, HEAP_END);
  157. rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);
  158. #endif
  159. #endif
  160. }
  161. /*@}*/