+ // Initialize main oscillator
+ if (!(CKGR_MOR_R & CKGR_MOR_MOSCSEL))
+ {
+ CKGR_MOR_R = CKGR_MOR_KEY(0x37) | BOARD_OSC_COUNT | CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCXTEN;
+ timeout = CLOCK_TIMEOUT;
+ while (!(PMC_SR_R & PMC_SR_MOSCXTS) && --timeout);
+ }
+
+ // Switch to external oscillator
+ CKGR_MOR_R = CKGR_MOR_KEY(0x37) | BOARD_OSC_COUNT | CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCXTEN | CKGR_MOR_MOSCSEL;
+ timeout = CLOCK_TIMEOUT;
+ while (!(PMC_SR_R & PMC_SR_MOSCSELS) && --timeout);
+
+ PMC_MCKR_R = (PMC_MCKR_R & ~(uint32_t)PMC_MCKR_CSS_M) | PMC_MCKR_CSS_MAIN_CLK;
+ timeout = CLOCK_TIMEOUT;
+ while (!(PMC_SR_R & PMC_SR_MCKRDY) && --timeout);
+
+ // Initialize and enable PLL clock
+ CKGR_PLLR_R = evaluate_pll() | CKGR_PLLR_STUCKTO1 | CKGR_PLLR_PLLCOUNT(0x1);
+ timeout = CLOCK_TIMEOUT;
+ while (!(PMC_SR_R & PMC_SR_LOCK) && --timeout);
+
+ PMC_MCKR_R = PMC_MCKR_CSS_MAIN_CLK;
+ timeout = CLOCK_TIMEOUT;
+ while (!(PMC_SR_R & PMC_SR_MCKRDY) && --timeout);
+
+ PMC_MCKR_R = PMC_MCKR_CSS_PLL_CLK;
+ timeout = CLOCK_TIMEOUT;
+ while (!(PMC_SR_R & PMC_SR_MCKRDY) && --timeout);