33
33
#include "LPC43xx.h"
34
34
35
35
#define COUNT_OF (a ) (sizeof(a)/sizeof(a[0]))
36
- #define PLL1_MSEL (MAX_CLOCK_FREQ / CRYSTAL_MAIN_FREQ_IN)
37
36
38
37
/* Clock variables */
39
38
#if (CLOCK_SETUP )
@@ -49,34 +48,31 @@ typedef struct {
49
48
uint16_t mode ; /* SCU pin mode and function */
50
49
} PINMUX_GRP_T ;
51
50
52
- #if (SPIFI_INIT )
53
- /* SCU configuration for SPIFI pins */
54
- static const PINMUX_GRP_T spifi_pinmux [] = {
51
+ /* Pins to initialize before clocks are configured */
52
+ static const PINMUX_GRP_T pre_clock_mux [] = {
55
53
/* SPIFI pins */
56
- {SCU_REG (0x3 , 3 ), (SCU_PINIO_FAST | 0x3 )}, /* P3_3 SPIFI CLK */
57
- {SCU_REG (0x3 , 4 ), (SCU_PINIO_FAST | 0x3 )}, /* P3_4 SPIFI D3 */
58
- {SCU_REG (0x3 , 5 ), (SCU_PINIO_FAST | 0x3 )}, /* P3_5 SPIFI D2 */
59
- {SCU_REG (0x3 , 6 ), (SCU_PINIO_FAST | 0x3 )}, /* P3_6 SPIFI D1 */
60
- {SCU_REG (0x3 , 7 ), (SCU_PINIO_FAST | 0x3 )}, /* P3_7 SPIFI D0 */
61
- {SCU_REG (0x3 , 8 ), (SCU_PINIO_FAST | 0x3 )} /* P3_8 SPIFI CS/SSEL */
54
+ {SCU_REG (0x3 , 3 ), (SCU_PINIO_FAST | 0x3 )}, /* P3_3 SPIFI CLK */
55
+ {SCU_REG (0x3 , 4 ), (SCU_PINIO_FAST | 0x3 )}, /* P3_4 SPIFI D3 */
56
+ {SCU_REG (0x3 , 5 ), (SCU_PINIO_FAST | 0x3 )}, /* P3_5 SPIFI D2 */
57
+ {SCU_REG (0x3 , 6 ), (SCU_PINIO_FAST | 0x3 )}, /* P3_6 SPIFI D1 */
58
+ {SCU_REG (0x3 , 7 ), (SCU_PINIO_FAST | 0x3 )}, /* P3_7 SPIFI D0 */
59
+ {SCU_REG (0x3 , 8 ), (SCU_PINIO_FAST | 0x3 )} /* P3_8 SPIFI CS/SSEL */
62
60
};
63
- #endif
64
61
65
- /* SCU configuration for board pins */
66
- static const PINMUX_GRP_T board_pinmux [] = {
62
+ /* Pins to initialize after clocks are configured */
63
+ static const PINMUX_GRP_T post_clock_mux [] = {
67
64
/* Boot pins */
68
- {SCU_REG (0x1 , 1 ), (SCU_PINIO_FAST | 0x0 )}, /* P1_1 BOOT0 */
69
- {SCU_REG (0x1 , 2 ), (SCU_PINIO_FAST | 0x0 )}, /* P1_2 BOOT1 */
70
- {SCU_REG (0x2 , 8 ), (SCU_PINIO_FAST | 0x0 )}, /* P2_8 BOOT2 */
71
- {SCU_REG (0x2 , 9 ), (SCU_PINIO_FAST | 0x0 )}, /* P2_9 BOOT3 */
65
+ {SCU_REG (0x1 , 1 ), (SCU_PINIO_FAST | 0x0 )}, /* P1_1 BOOT0 */
66
+ {SCU_REG (0x1 , 2 ), (SCU_PINIO_FAST | 0x0 )}, /* P1_2 BOOT1 */
67
+ {SCU_REG (0x2 , 8 ), (SCU_PINIO_FAST | 0x0 )}, /* P2_8 BOOT2 */
68
+ {SCU_REG (0x2 , 9 ), (SCU_PINIO_FAST | 0x0 )}, /* P2_9 BOOT3 */
72
69
/* Micromint Bambino 200/210 */
73
70
{SCU_REG (0x6 , 11 ), (SCU_PINIO_FAST | 0x0 )}, /* P6_11 LED1 */
74
- {SCU_REG (0x2 , 5 ), (SCU_PINIO_FAST | 0x0 )}, /* P2_5 LED2 */
75
- {SCU_REG (0x2 , 7 ), (SCU_PINIO_FAST | 0x0 )}, /* P2_7 BTN1 */
71
+ {SCU_REG (0x2 , 5 ), (SCU_PINIO_FAST | 0x0 )}, /* P2_5 LED2 */
72
+ {SCU_REG (0x2 , 7 ), (SCU_PINIO_FAST | 0x0 )}, /* P2_7 BTN1 */
76
73
/* Micromint Bambino 210 */
77
- {SCU_REG (0x6 , 1 ), (SCU_PINIO_FAST | 0x0 )}, /* P6_1 LED3 */
78
- {SCU_REG (0x6 , 2 ), (SCU_PINIO_FAST | 0x0 )}, /* P6_2 LED4 */
79
- {SCU_REG (0xF , 4 ), (SCU_PINIO_FAST | 0x0 )}, /* PF_4 SSP1_CLK */
74
+ {SCU_REG (0x6 , 1 ), (SCU_PINIO_FAST | 0x0 )}, /* P6_1 LED3 */
75
+ {SCU_REG (0x6 , 2 ), (SCU_PINIO_FAST | 0x0 )}, /* P6_2 LED4 */
80
76
};
81
77
82
78
#if (CLOCK_SETUP )
@@ -87,47 +83,42 @@ struct CLK_BASE_STATES {
87
83
uint8_t powerdn ; /* Set to 1 if base clock is initially powered down */
88
84
};
89
85
90
- /* Base clocks - sources and states ( mostly ON) */
86
+ /* Initial base clock states are mostly on */
91
87
static const struct CLK_BASE_STATES clock_states [] = {
92
- {CLK_BASE_SAFE , CLKIN_IRC , 0 },
93
- {CLK_BASE_APB1 , CLKIN_MAINPLL , 0 },
94
- {CLK_BASE_APB3 , CLKIN_MAINPLL , 0 },
95
- {CLK_BASE_USB0 , CLKIN_USBPLL , 1 },
96
- #if defined(CHIP_LPC43XX )
88
+ {CLK_BASE_SAFE , CLKIN_IRC , 0 },
89
+ {CLK_BASE_APB1 , CLKIN_MAINPLL , 0 },
90
+ {CLK_BASE_APB3 , CLKIN_MAINPLL , 0 },
91
+ {CLK_BASE_USB0 , CLKIN_USBPLL , 1 },
97
92
{CLK_BASE_PERIPH , CLKIN_MAINPLL , 0 },
98
- {CLK_BASE_SPI , CLKIN_MAINPLL , 0 },
99
- {CLK_BASE_ADCHS , CLKIN_MAINPLL , 1 },
100
- #endif
101
- {CLK_BASE_SDIO , CLKIN_MAINPLL , 0 },
102
- {CLK_BASE_SSP0 , CLKIN_MAINPLL , 0 },
103
- {CLK_BASE_SSP1 , CLKIN_MAINPLL , 0 },
104
- {CLK_BASE_UART0 , CLKIN_MAINPLL , 0 },
105
- {CLK_BASE_UART1 , CLKIN_MAINPLL , 0 },
106
- {CLK_BASE_UART2 , CLKIN_MAINPLL , 0 },
107
- {CLK_BASE_UART3 , CLKIN_MAINPLL , 0 },
108
- {CLK_BASE_OUT , CLKINPUT_PD , 0 },
109
- {CLK_BASE_APLL , CLKINPUT_PD , 0 },
110
- {CLK_BASE_CGU_OUT0 , CLKINPUT_PD , 0 },
111
- {CLK_BASE_CGU_OUT1 , CLKINPUT_PD , 0 },
112
-
113
- /* Ethernet clocks */
93
+ {CLK_BASE_SPI , CLKIN_MAINPLL , 0 },
114
94
{CLK_BASE_PHY_TX , CLKIN_ENET_TX , 0 },
115
95
#if defined(USE_RMII )
116
96
{CLK_BASE_PHY_RX , CLKIN_ENET_TX , 0 },
117
97
#else
118
98
{CLK_BASE_PHY_RX , CLKIN_ENET_RX , 0 },
119
99
#endif
100
+ {CLK_BASE_SDIO , CLKIN_MAINPLL , 0 },
101
+ {CLK_BASE_SSP0 , CLKIN_IDIVC , 0 },
102
+ {CLK_BASE_SSP1 , CLKIN_IDIVC , 0 },
103
+ {CLK_BASE_UART0 , CLKIN_MAINPLL , 0 },
104
+ {CLK_BASE_UART1 , CLKIN_MAINPLL , 0 },
105
+ {CLK_BASE_UART2 , CLKIN_MAINPLL , 0 },
106
+ {CLK_BASE_UART3 , CLKIN_MAINPLL , 0 },
107
+ {CLK_BASE_OUT , CLKINPUT_PD , 0 },
108
+ {CLK_BASE_APLL , CLKINPUT_PD , 0 },
109
+ {CLK_BASE_CGU_OUT0 , CLKINPUT_PD , 0 },
110
+ {CLK_BASE_CGU_OUT1 , CLKINPUT_PD , 0 },
120
111
121
112
/* Clocks derived from dividers */
122
- {CLK_BASE_LCD , CLKIN_IDIVC , 0 },
123
- {CLK_BASE_USB1 , CLKIN_IDIVD , 1 }
113
+ {CLK_BASE_LCD , CLKIN_IDIVC , 0 },
114
+ {CLK_BASE_USB1 , CLKIN_IDIVD , 1 }
124
115
};
125
116
#endif /* defined(CLOCK_SETUP) */
126
117
127
118
/* Local functions */
128
119
static uint32_t SystemGetMainPLLHz (void );
129
- static void SystemSetupPins (void );
130
120
static void SystemSetupClock (void );
121
+ static void SystemSetupPins (const PINMUX_GRP_T * mux , uint32_t n );
131
122
static void SystemSetupMemory (void );
132
123
static void WaitUs (uint32_t us );
133
124
@@ -164,8 +155,9 @@ void SystemInit(void)
164
155
fpuInit ();
165
156
#endif
166
157
167
- SystemSetupPins (); /* Configure MCU pins */
158
+ SystemSetupPins (pre_clock_mux , COUNT_OF ( pre_clock_mux )); /* Configure pins */
168
159
SystemSetupClock (); /* Configure processor and peripheral clocks */
160
+ SystemSetupPins (post_clock_mux , COUNT_OF (post_clock_mux )); /* Configure pins */
169
161
SystemSetupMemory (); /* Configure external memory */
170
162
#endif /* !defined(CORE_M0) */
171
163
@@ -222,37 +214,6 @@ uint32_t SystemGetMainPLLHz(void)
222
214
}
223
215
224
216
#if !defined(CORE_M0 )
225
- /*
226
- * SystemSetupPins() - Configure MCU pins
227
- */
228
- void SystemSetupPins (void )
229
- {
230
- #if (PIN_SETUP )
231
- uint32_t i ;
232
-
233
- /* Reset peripherals */
234
- LPC_RGU -> RESET_CTRL0 = 0x105F0000 ;
235
- LPC_RGU -> RESET_CTRL1 = 0x01DFF7FF ;
236
-
237
- /* Configure board pins */
238
- for (i = 0 ; i < COUNT_OF (board_pinmux ); i ++ ) {
239
- * (board_pinmux [i ].reg ) = board_pinmux [i ].mode ;
240
- }
241
-
242
- /* Configure dedicated clock pins */
243
- for (i = 0 ; i < 3 ; i ++ ) {
244
- LPC_SCU -> SFSCLK [i ] = SCU_PINIO_FAST ;
245
- }
246
-
247
- #if (SPIFI_INIT )
248
- /* Configure SPIFI pins */
249
- for (i = 0 ; i < COUNT_OF (spifi_pinmux ); i ++ ) {
250
- * (spifi_pinmux [i ].reg ) = spifi_pinmux [i ].mode ;
251
- }
252
- #endif
253
- #endif /* PIN_SETUP */
254
- }
255
-
256
217
/*
257
218
* SystemSetupClock() - Set processor and peripheral clocks
258
219
*
@@ -272,51 +233,44 @@ void SystemSetupClock(void)
272
233
#if (CLOCK_SETUP )
273
234
uint32_t i ;
274
235
275
- #if (FLASH_INIT )
276
- /* Setup flash acceleration for MCUs with internal flash */
277
- i = MAX_CLOCK_FREQ / 21510000 ;
278
- LPC_CREG -> FLASHCFGA = (LPC_CREG -> FLASHCFGA & (~(0xF << 12 ))) | (i << 12 );
279
- LPC_CREG -> FLASHCFGB = (LPC_CREG -> FLASHCFGB & (~(0xF << 12 ))) | (i << 12 );
280
- #endif
236
+ /* Switch main clock to Internal RC (IRC) while setting up PLL1 */
237
+ LPC_CGU -> BASE_CLK [CLK_BASE_MX ] = (1 << 11 ) | (CLKIN_IRC << 24 );
238
+ /* Set prescaler/divider on SSP1 assuming 204 MHz clock */
239
+ LPC_SSP1 -> CR1 &= ~(1 << 1 );
240
+ LPC_SSP1 -> CPSR = 0x0002 ;
241
+ LPC_SSP1 -> CR0 = 0x00006507 ;
242
+ LPC_SSP1 -> CR1 |= (1 << 1 );
281
243
282
- /* Clear bypass, enable crystal oscillator and wait 100 us */
283
- LPC_CGU -> XTAL_OSC_CTRL &= (~2 );
284
- LPC_CGU -> XTAL_OSC_CTRL &= (~1 );
244
+ /* Enable the oscillator and wait 100 us */
245
+ LPC_CGU -> XTAL_OSC_CTRL = 0 ;
285
246
WaitUs (100 );
286
247
287
- /* Switch main clock to crystal while setting up PLL1 */
288
- LPC_CGU -> BASE_CLK [CLK_BASE_MX ] = (1 << 11 ) | (CLKIN_CRYSTAL << 24 );
289
-
290
- /* Configure PLL1 (MAINPLL) for main clock */
291
- /* Change PLL1 to 108 Mhz (psel=1, nsel=1, msel=9 for 12 MHz*9=108 MHz) */
292
- LPC_CGU -> PLL1_CTRL = (1 << 6 ) | (0 << 7 ) | (0 << 8 ) | (1 << 11 ) | (0 << 12 )
293
- | (8 << 16 ) | (CLKIN_CRYSTAL << 24 );
294
- while (!(LPC_CGU -> PLL1_STAT & 1 )); /* Wait for PLL1 to lock */
295
- WaitUs (50 );
296
-
297
- /* Connect main clock to PLL1 */
298
- LPC_CGU -> BASE_CLK [CLK_BASE_MX ] = (1 << 11 ) | (CLKIN_MAINPLL << 24 );
299
-
300
- /* Change PLL1 to MAX_CLOCK_FREQ */
301
- /* PLL1_MSEL=17 for 12 MHz*17=204 MHz, PLL1_MSEL=15 for 12 MHz*15=180 MHz */
302
- LPC_CGU -> PLL1_CTRL = (1 << 6 ) | (1 << 7 ) |(0 << 8 ) | (1 << 11 ) | (0 << 12 )
303
- | ((PLL1_MSEL - 1 ) << 16 ) | (CLKIN_CRYSTAL << 24 );
304
- while (!(LPC_CGU -> PLL1_STAT & 1 )); /* Wait for PLL1 to lock */
305
-
306
- /* Reset and enable 32Khz oscillator */
307
- LPC_CREG -> CREG0 &= ~((1 << 3 ) | (1 << 2 ));
308
- LPC_CREG -> CREG0 |= (1 << 1 ) | (1 << 0 );
309
-
310
248
#if (SPIFI_INIT )
311
249
/* Setup SPIFI control register and no-opcode mode */
312
250
LPC_SPIFI -> CTRL = (0x100 << 0 ) | (1 << 16 ) | (1 << 29 ) | (1 << 30 );
313
251
LPC_SPIFI -> IDATA = 0xA5 ;
314
-
315
252
/* Switch IDIVE clock to IRC and connect to SPIFI clock */
316
253
LPC_CGU -> IDIV_CTRL [CLK_IDIV_E ] = ((1 << 11 ) | (CLKIN_IRC << 24 ));
317
254
LPC_CGU -> BASE_CLK [CLK_BASE_SPIFI ] = ((1 << 11 ) | (CLKIN_IDIVE << 24 ));
318
255
#endif /* SPIFI_INIT */
319
256
257
+ /* Configure PLL1 (MAINPLL) for main clock */
258
+ LPC_CGU -> PLL1_CTRL |= 1 ; /* Power down PLL1 */
259
+
260
+ /* Change PLL1 to 108 Mhz (msel=9, 12 MHz*9=108 MHz) */
261
+ LPC_CGU -> PLL1_CTRL = (1 << 7 ) | (0 << 8 ) | (1 << 11 ) | (0 << 12 ) | (8 << 16 )
262
+ | (CLKIN_MAINPLL << 24 );
263
+ while (!(LPC_CGU -> PLL1_STAT & 1 )); /* Wait for PLL1 to lock */
264
+ WaitUs (100 );
265
+
266
+ /* Change PLL1 to 204 Mhz (msel=17, 12 MHz*17=204 MHz) */
267
+ LPC_CGU -> PLL1_CTRL = (1 << 7 ) | (0 << 8 ) | (1 << 11 ) | (0 << 12 ) | (16 << 16 )
268
+ | (CLKIN_MAINPLL << 24 );
269
+ while (!(LPC_CGU -> PLL1_STAT & 1 )); /* Wait for PLL1 to lock */
270
+
271
+ /* Connect main clock to PLL1 */
272
+ LPC_CGU -> BASE_CLK [CLK_BASE_MX ] = (1 << 11 ) | (CLKIN_MAINPLL << 24 );
273
+
320
274
/* Set USB PLL dividers for 480 MHz (for USB0) */
321
275
LPC_CGU -> PLL [CGU_USB_PLL ].PLL_MDIV = 0x06167FFA ;
322
276
LPC_CGU -> PLL [CGU_USB_PLL ].PLL_NP_DIV = 0x00302062 ;
@@ -340,6 +294,21 @@ void SystemSetupClock(void)
340
294
| (1 << 11 ) | (clock_states [i ].clkin << 24 );
341
295
}
342
296
#endif /* CLOCK_SETUP */
297
+ /* Reset peripherals */
298
+ LPC_RGU -> RESET_CTRL0 = 0x105F0000 ;
299
+ LPC_RGU -> RESET_CTRL1 = 0x01DFF7FF ;
300
+ }
301
+
302
+ /*
303
+ * SystemSetupPins() - Configure MCU pins
304
+ */
305
+ void SystemSetupPins (const PINMUX_GRP_T * mux , uint32_t n )
306
+ {
307
+ uint32_t i ;
308
+
309
+ for (i = 0 ; i < n ; i ++ ) {
310
+ * (mux [i ].reg ) = mux [i ].mode ;
311
+ }
343
312
}
344
313
345
314
/*
@@ -348,7 +317,7 @@ void SystemSetupClock(void)
348
317
void SystemSetupMemory (void )
349
318
{
350
319
#if (MEMORY_SETUP )
351
- /* Todo: EMC setup for boards with external memory */
320
+ /* None required for boards without external memory */
352
321
#endif /* MEMORY_SETUP */
353
322
}
354
323
0 commit comments