board_base.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. /*
  2. * Copyright (c) 2021 Rockchip Electronics Co., Ltd.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-10-12 Steven Liu first implementation
  9. */
  10. #include <rthw.h>
  11. #include <rtthread.h>
  12. #include "board.h"
  13. #include "hal_base.h"
  14. #include "hal_bsp.h"
  15. #include "drv_cache.h"
  16. #include "drv_heap.h"
  17. #ifdef RT_USING_CRU
  18. #include "drv_clock.h"
  19. #endif
  20. #ifdef RT_USING_PIN
  21. #include "iomux.h"
  22. #endif
  23. #ifdef RT_USING_UART
  24. #include "drv_uart.h"
  25. #endif
  26. #ifdef RT_USING_MODULE
  27. #define DATA_EXEC_FLAG 0U
  28. #else
  29. #define DATA_EXEC_FLAG 1U
  30. #endif
  31. #ifdef RT_USING_CRU
  32. rt_weak const struct clk_init clk_inits[] =
  33. {
  34. INIT_CLK("SCLK_SHRM", SCLK_SHRM, 10 * MHZ),
  35. INIT_CLK("PCLK_SHRM", PCLK_SHRM, 10 * MHZ),
  36. INIT_CLK("PCLK_ALIVE", PCLK_ALIVE, 10 * MHZ),
  37. INIT_CLK("HCLK_ALIVE", HCLK_ALIVE, 10 * MHZ),
  38. INIT_CLK("HCLK_M4", HCLK_M4, 10 * MHZ),
  39. INIT_CLK("ACLK_LOGIC", ACLK_LOGIC, 10 * MHZ),
  40. INIT_CLK("HCLK_LOGIC", HCLK_LOGIC, 10 * MHZ),
  41. INIT_CLK("PCLK_LOGIC", PCLK_LOGIC, 10 * MHZ),
  42. INIT_CLK("SCLK_SFC_SRC", SCLK_SFC_SRC, 5 * MHZ),
  43. INIT_CLK("SCLK_SFC1_SRC", SCLK_SFC1_SRC, 5 * MHZ),
  44. INIT_CLK("PLL_GPLL", PLL_GPLL, 1188 * MHZ),
  45. INIT_CLK("PLL_CPLL", PLL_CPLL, 1188 * MHZ),
  46. INIT_CLK("SCLK_SFC_SRC", SCLK_SFC_SRC, 50 * MHZ),
  47. INIT_CLK("HCLK_M4", HCLK_M4, 300 * MHZ),
  48. INIT_CLK("ACLK_DSP", ACLK_DSP, 400 * MHZ),
  49. INIT_CLK("ACLK_LOGIC", ACLK_LOGIC, 300 * MHZ),
  50. INIT_CLK("HCLK_LOGIC", HCLK_LOGIC, 150 * MHZ),
  51. INIT_CLK("PCLK_LOGIC", PCLK_LOGIC, 150 * MHZ),
  52. INIT_CLK("SCLK_SHRM", SCLK_SHRM, 300 * MHZ),
  53. INIT_CLK("PCLK_SHRM", PCLK_SHRM, 100 * MHZ),
  54. INIT_CLK("PCLK_ALIVE", PCLK_ALIVE, 100 * MHZ),
  55. INIT_CLK("HCLK_ALIVE", HCLK_ALIVE, 100 * MHZ),
  56. { /* sentinel */ },
  57. };
  58. rt_weak const struct clk_unused clks_unused[] =
  59. {
  60. {0, 0, 0x00030003},
  61. {0, 5, 0x00ee00ee},
  62. {0, 6, 0x048d048d},
  63. {0, 7, 0x00110011},
  64. {0, 11, 0x40e040e0},
  65. {0, 12, 0x90709070},
  66. {0, 13, 0xe203e203},
  67. {0, 14, 0xa6e1a6e1},
  68. { /* sentinel */ },
  69. };
  70. #endif
  71. #if defined(RT_USING_UART0)
  72. rt_weak const struct uart_board g_uart0_board =
  73. {
  74. .baud_rate = ROCKCHIP_UART_BAUD_RATE_DEFAULT,
  75. .dev_flag = ROCKCHIP_UART_SUPPORT_FLAG_DEFAULT,
  76. .bufer_size = RT_SERIAL_RB_BUFSZ,
  77. .name = "uart0",
  78. };
  79. #endif /* RT_USING_UART0 */
  80. #if defined(RT_USING_UART1)
  81. rt_weak const struct uart_board g_uart1_board =
  82. {
  83. .baud_rate = ROCKCHIP_UART_BAUD_RATE_DEFAULT,
  84. .dev_flag = ROCKCHIP_UART_SUPPORT_FLAG_DEFAULT,
  85. .bufer_size = RT_SERIAL_RB_BUFSZ,
  86. .name = "uart1",
  87. };
  88. #endif /* RT_USING_UART1 */
  89. #if defined(RT_USING_UART2)
  90. rt_weak const struct uart_board g_uart2_board =
  91. {
  92. .baud_rate = ROCKCHIP_UART_BAUD_RATE_DEFAULT,
  93. .dev_flag = ROCKCHIP_UART_SUPPORT_FLAG_DEFAULT,
  94. .bufer_size = RT_SERIAL_RB_BUFSZ,
  95. .name = "uart2",
  96. };
  97. #endif /* RT_USING_UART2 */
  98. extern void SysTick_Handler(void);
  99. rt_weak void tick_isr(int vector, void *param)
  100. {
  101. /* enter interrupt */
  102. rt_interrupt_enter();
  103. HAL_IncTick();
  104. rt_tick_increase();
  105. #ifdef TICK_TIMER
  106. HAL_TIMER_ClrInt(TICK_TIMER);
  107. #endif
  108. /* leave interrupt */
  109. rt_interrupt_leave();
  110. }
  111. void BSP_MPU_Init(void)
  112. {
  113. static const ARM_MPU_Region_t table[] =
  114. {
  115. {
  116. .RBAR = ARM_MPU_RBAR(0U, 0x04000000U),
  117. .RASR = ARM_MPU_RASR(0U, ARM_MPU_AP_FULL, 0U, 0U, 1U, 0U, 0U, ARM_MPU_REGION_SIZE_1MB)
  118. },
  119. {
  120. .RBAR = ARM_MPU_RBAR(1U, 0x18000000U),
  121. .RASR = ARM_MPU_RASR(0U, ARM_MPU_AP_FULL, 0U, 0U, 1U, 0U, 0U, ARM_MPU_REGION_SIZE_32MB)
  122. },
  123. {
  124. .RBAR = ARM_MPU_RBAR(2U, 0x20000000U),
  125. .RASR = ARM_MPU_RASR(DATA_EXEC_FLAG, ARM_MPU_AP_FULL, 0U, 0U, 1U, 1U, 0U, ARM_MPU_REGION_SIZE_1MB)
  126. },
  127. {
  128. .RBAR = ARM_MPU_RBAR(3U, 0x40000000U),
  129. .RASR = ARM_MPU_RASR(1U, ARM_MPU_AP_FULL, 0U, 0U, 0U, 0U, 0U, ARM_MPU_REGION_SIZE_256MB)
  130. },
  131. {
  132. .RBAR = ARM_MPU_RBAR(4U, 0x60000000U),
  133. .RASR = ARM_MPU_RASR(1U, ARM_MPU_AP_FULL, 0U, 0U, 1U, 1U, 0U, ARM_MPU_REGION_SIZE_256MB)
  134. },
  135. };
  136. ARM_MPU_Load(&(table[0]), 5U);
  137. #ifdef RT_USING_UNCACHE_HEAP
  138. ARM_MPU_Region_t uncache_region;
  139. uncache_region.RBAR = ARM_MPU_RBAR(5U, RK_UNCACHE_HEAP_START);
  140. uncache_region.RASR = ARM_MPU_RASR(1U, ARM_MPU_AP_FULL, 0U, 0U, 0U, 0U, 0U, RT_UNCACHE_HEAP_ORDER);
  141. ARM_MPU_SetRegionEx(5, uncache_region.RBAR, uncache_region.RASR);
  142. #endif
  143. ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk);
  144. }
  145. /**
  146. * Initialize the Hardware related stuffs. Called from rtthread_startup()
  147. * after interrupt disabled.
  148. */
  149. void rt_hw_board_init(void)
  150. {
  151. /* HAL_Init */
  152. HAL_Init();
  153. /* hal bsp init */
  154. BSP_Init();
  155. /* tick init */
  156. HAL_SetTickFreq(1000 / RT_TICK_PER_SECOND);
  157. rt_hw_interrupt_install(TICK_IRQn, tick_isr, RT_NULL, "tick");
  158. rt_hw_interrupt_umask(TICK_IRQn);
  159. HAL_NVIC_SetPriority(TICK_IRQn, NVIC_PERIPH_PRIO_LOWEST, NVIC_PERIPH_SUB_PRIO_LOWEST);
  160. #ifdef RT_USING_SYSTICK
  161. HAL_SYSTICK_CLKSourceConfig(HAL_SYSTICK_CLKSRC_EXT);
  162. HAL_SYSTICK_Config((PLL_INPUT_OSC_RATE / RT_TICK_PER_SECOND) - 1);
  163. HAL_SYSTICK_Enable();
  164. #else
  165. HAL_TIMER_Init(TICK_TIMER, TIMER_FREE_RUNNING);
  166. HAL_TIMER_SetCount(TICK_TIMER, (PLL_INPUT_OSC_RATE / RT_TICK_PER_SECOND) - 1);
  167. HAL_TIMER_Start_IT(TICK_TIMER);
  168. #endif
  169. rt_hw_cpu_cache_init();
  170. #ifdef RT_USING_PIN
  171. #ifdef RK_BSP_TEMP
  172. rt_hw_iomux_config();
  173. #endif
  174. #endif
  175. #ifdef RT_USING_CRU
  176. #ifdef RK_BSP_TEMP
  177. clk_init(clk_inits, false);
  178. /* disable some clks when init, and enabled by device when needed */
  179. clk_disable_unused(clks_unused);
  180. if (RT_CONSOLE_DEVICE_UART(0))
  181. CRU->CRU_CLKGATE_CON[2] = 0x08860886;
  182. else if (RT_CONSOLE_DEVICE_UART(1))
  183. CRU->CRU_CLKGATE_CON[2] = 0x080d080d;
  184. else if (RT_CONSOLE_DEVICE_UART(2))
  185. CRU->CRU_CLKGATE_CON[2] = 0x008b008b;
  186. else
  187. CRU->CRU_CLKGATE_CON[2] = 0x088f088f;
  188. #endif
  189. #endif
  190. #ifdef RT_USING_UART
  191. rt_hw_usart_init();
  192. #endif
  193. #ifdef RT_USING_CONSOLE
  194. rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
  195. #endif
  196. #ifdef RT_USING_HEAP
  197. /* initialize memory system */
  198. rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
  199. #endif
  200. #ifdef RT_USING_COMPONENTS_INIT
  201. rt_components_board_init();
  202. #endif
  203. }