source: rtems/bsps/arm/lpc32xx/start/bspstarthooks.c @ ba619b7f

Last change on this file since ba619b7f was ba619b7f, checked in by Joel Sherrill <joel@…>, on 03/01/22 at 21:38:20

bsps/arm/: Scripted embedded brains header file clean up

Updates #4625.

  • Property mode set to 100644
File size: 6.2 KB
Line 
1/**
2 * @file
3 *
4 * @ingroup RTEMSBSPsARMLPC32XX
5 *
6 * @brief Startup code.
7 */
8
9/*
10 * Copyright (c) 2009-2013 embedded brains GmbH.  All rights reserved.
11 *
12 * The license and distribution terms for this file may be
13 * found in the file LICENSE in this distribution or at
14 * http://www.rtems.org/license/LICENSE.
15 */
16
17#define ARM_CP15_TEXT_SECTION BSP_START_TEXT_SECTION
18
19#include <bsp.h>
20#include <bsp/start.h>
21#include <bsp/lpc32xx.h>
22#include <bsp/mmu.h>
23#include <bsp/arm-cp15-start.h>
24#include <bsp/linker-symbols.h>
25#include <bsp/uart-output-char.h>
26
27#ifdef LPC32XX_DISABLE_READ_WRITE_DATA_CACHE
28  #define LPC32XX_MMU_READ_WRITE_DATA LPC32XX_MMU_READ_WRITE
29#else
30  #define LPC32XX_MMU_READ_WRITE_DATA LPC32XX_MMU_READ_WRITE_CACHED
31#endif
32
33#ifdef LPC32XX_DISABLE_READ_ONLY_PROTECTION
34  #define LPC32XX_MMU_READ_ONLY_DATA LPC32XX_MMU_READ_WRITE_CACHED
35  #define LPC32XX_MMU_CODE LPC32XX_MMU_READ_WRITE_CACHED
36#else
37  #define LPC32XX_MMU_READ_ONLY_DATA LPC32XX_MMU_READ_ONLY_CACHED
38  #define LPC32XX_MMU_CODE LPC32XX_MMU_READ_ONLY_CACHED
39#endif
40
41#ifndef LPC32XX_DISABLE_MMU
42  static const BSP_START_DATA_SECTION arm_cp15_start_section_config
43    lpc32xx_mmu_config_table [] = {
44    {
45      .begin = (uint32_t) bsp_section_fast_text_begin,
46      .end = (uint32_t) bsp_section_fast_text_end,
47      .flags = LPC32XX_MMU_CODE
48    }, {
49      .begin = (uint32_t) bsp_section_fast_data_begin,
50      .end = (uint32_t) bsp_section_fast_data_end,
51      .flags = LPC32XX_MMU_READ_WRITE_DATA
52#ifdef LPC32XX_SCRATCH_AREA_SIZE
53    }, {
54      .begin = (uint32_t) &lpc32xx_scratch_area [0],
55      .end = (uint32_t) &lpc32xx_scratch_area [LPC32XX_SCRATCH_AREA_SIZE],
56      .flags = LPC32XX_MMU_READ_ONLY_DATA
57#endif
58    }, {
59      .begin = (uint32_t) bsp_section_start_begin,
60      .end = (uint32_t) bsp_section_start_end,
61      .flags = LPC32XX_MMU_CODE
62    }, {
63      .begin = (uint32_t) bsp_section_vector_begin,
64      .end = (uint32_t) bsp_section_vector_end,
65      .flags = LPC32XX_MMU_READ_WRITE_CACHED
66    }, {
67      .begin = (uint32_t) bsp_section_text_begin,
68      .end = (uint32_t) bsp_section_text_end,
69      .flags = LPC32XX_MMU_CODE
70    }, {
71      .begin = (uint32_t) bsp_section_rodata_begin,
72      .end = (uint32_t) bsp_section_rodata_end,
73      .flags = LPC32XX_MMU_READ_ONLY_DATA
74    }, {
75      .begin = (uint32_t) bsp_section_data_begin,
76      .end = (uint32_t) bsp_section_data_end,
77      .flags = LPC32XX_MMU_READ_WRITE_DATA
78    }, {
79      .begin = (uint32_t) bsp_section_bss_begin,
80      .end = (uint32_t) bsp_section_bss_end,
81      .flags = LPC32XX_MMU_READ_WRITE_DATA
82    }, {
83      .begin = (uint32_t) bsp_section_work_begin,
84      .end = (uint32_t) bsp_section_work_end,
85      .flags = LPC32XX_MMU_READ_WRITE_DATA
86    }, {
87      .begin = (uint32_t) bsp_section_stack_begin,
88      .end = (uint32_t) bsp_section_stack_end,
89      .flags = LPC32XX_MMU_READ_WRITE_DATA
90    }, {
91      .begin = 0x0U,
92      .end = 0x100000U,
93      .flags = LPC32XX_MMU_READ_ONLY_CACHED
94    }, {
95      .begin = 0x20000000U,
96      .end = 0x200c0000U,
97      .flags = LPC32XX_MMU_READ_WRITE
98    }, {
99      .begin = 0x30000000U,
100      .end = 0x32000000U,
101      .flags = LPC32XX_MMU_READ_WRITE
102    }, {
103      .begin = 0x40000000U,
104      .end = 0x40100000U,
105      .flags = LPC32XX_MMU_READ_WRITE
106    }, {
107      .begin = (uint32_t) lpc32xx_magic_zero_begin,
108      .end = (uint32_t) lpc32xx_magic_zero_end,
109      .flags = LPC32XX_MMU_READ_WRITE_DATA
110    }
111  };
112#endif
113
114static BSP_START_TEXT_SECTION void setup_mmu_and_cache(void)
115{
116  uint32_t ctrl = arm_cp15_start_setup_mmu_and_cache(
117    ARM_CP15_CTRL_I | ARM_CP15_CTRL_R | ARM_CP15_CTRL_C
118      | ARM_CP15_CTRL_V | ARM_CP15_CTRL_M,
119    ARM_CP15_CTRL_S | ARM_CP15_CTRL_A
120  );
121
122  arm_cp15_cache_invalidate();
123
124  #ifndef LPC32XX_DISABLE_MMU
125    arm_cp15_start_setup_translation_table_and_enable_mmu_and_cache(
126      ctrl,
127      (uint32_t *) bsp_translation_table_base,
128      LPC32XX_MMU_CLIENT_DOMAIN,
129      &lpc32xx_mmu_config_table [0],
130      RTEMS_ARRAY_SIZE(lpc32xx_mmu_config_table)
131    );
132  #endif
133}
134
135BSP_START_TEXT_SECTION bool lpc32xx_start_pll_setup(
136  uint32_t hclkpll_ctrl,
137  uint32_t hclkdiv_ctrl,
138  bool force
139)
140{
141  uint32_t pwr_ctrl = LPC32XX_PWR_CTRL;
142  bool settings_ok =
143    ((LPC32XX_HCLKPLL_CTRL ^ hclkpll_ctrl) & BSP_MSK32(1, 16)) == 0
144      && ((LPC32XX_HCLKDIV_CTRL ^ hclkdiv_ctrl) & BSP_MSK32(0, 8)) == 0;
145
146  if ((pwr_ctrl & PWR_NORMAL_RUN_MODE) == 0 || (!settings_ok && force)) {
147    /* Disable HCLK PLL output */
148    LPC32XX_PWR_CTRL = pwr_ctrl & ~PWR_NORMAL_RUN_MODE;
149
150    /* Configure HCLK PLL */
151    LPC32XX_HCLKPLL_CTRL = hclkpll_ctrl;
152    while ((LPC32XX_HCLKPLL_CTRL & HCLK_PLL_LOCK) == 0) {
153      /* Wait */
154    }
155
156    /* Setup HCLK divider */
157    LPC32XX_HCLKDIV_CTRL = hclkdiv_ctrl;
158
159    /* Enable HCLK PLL output */
160    LPC32XX_PWR_CTRL = pwr_ctrl | PWR_NORMAL_RUN_MODE;
161  }
162
163  return settings_ok;
164}
165
166#if LPC32XX_OSCILLATOR_MAIN != 13000000U
167  #error "unexpected main oscillator frequency"
168#endif
169
170static BSP_START_TEXT_SECTION void setup_pll(void)
171{
172  uint32_t hclkpll_ctrl = LPC32XX_HCLKPLL_CTRL_INIT_VALUE;
173  uint32_t hclkdiv_ctrl = LPC32XX_HCLKDIV_CTRL_INIT_VALUE;
174
175  lpc32xx_start_pll_setup(hclkpll_ctrl, hclkdiv_ctrl, false);
176}
177
178BSP_START_TEXT_SECTION void bsp_start_hook_0(void)
179{
180  setup_pll();
181}
182
183static BSP_START_TEXT_SECTION void stop_dma_activities(void)
184{
185  #ifdef LPC32XX_STOP_GPDMA
186    LPC32XX_DO_STOP_GPDMA;
187  #endif
188
189  #ifdef LPC32XX_STOP_ETHERNET
190    LPC32XX_DO_STOP_ETHERNET;
191  #endif
192
193  #ifdef LPC32XX_STOP_USB
194    LPC32XX_DO_STOP_USB;
195  #endif
196}
197
198static BSP_START_TEXT_SECTION void setup_uarts(void)
199{
200  LPC32XX_UART_CTRL = 0x0;
201  LPC32XX_UART_LOOP = 0x0;
202
203  #ifdef LPC32XX_UART_5_BAUD
204    LPC32XX_UARTCLK_CTRL |= 1U << 2;
205    LPC32XX_U5CLK = LPC32XX_CONFIG_U5CLK;
206    LPC32XX_UART_CLKMODE = BSP_FLD32SET(LPC32XX_UART_CLKMODE, 0x2, 8, 9);
207    BSP_CONSOLE_UART_INIT(0x01);
208  #endif
209}
210
211static BSP_START_TEXT_SECTION void setup_timer(void)
212{
213  volatile lpc_timer *timer = LPC32XX_STANDARD_TIMER;
214
215  LPC32XX_TIMCLK_CTRL1 = (1U << 2) | (1U << 3);
216
217  timer->tcr = LPC_TIMER_TCR_RST;
218  timer->ctcr = 0x0;
219  timer->pr = 0x0;
220  timer->ir = 0xff;
221  timer->mcr = 0x0;
222  timer->ccr = 0x0;
223  timer->tcr = LPC_TIMER_TCR_EN;
224}
225
226BSP_START_TEXT_SECTION void bsp_start_hook_1(void)
227{
228  stop_dma_activities();
229  bsp_start_copy_sections();
230  setup_mmu_and_cache();
231  setup_uarts();
232  setup_timer();
233  bsp_start_clear_bss();
234}
Note: See TracBrowser for help on using the repository browser.