source: rtems/c/src/lib/libbsp/arm/lpc32xx/startup/bspstarthooks.c @ c499856

4.115
Last change on this file since c499856 was c499856, checked in by Chris Johns <chrisj@…>, on 03/20/14 at 21:10:47

Change all references of rtems.com to rtems.org.

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