//------------------------------------------------------------------------------ /// Performs the low-level initialization of the chip. This includes EFC, master /// clock, AIC & watchdog configuration, as well as memory remapping. //------------------------------------------------------------------------------ void LowLevelInit( void ) { unsigned char i; /* Set flash wait states in the EFC **********************************/ /* 48MHz = 1 wait state */ AT91C_BASE_EFC0->EFC_FMR = AT91C_MC_FWS_1FWS; AT91C_BASE_EFC1->EFC_FMR = AT91C_MC_FWS_1FWS; /* Initialize main oscillator ****************************/ AT91C_BASE_PMC->PMC_MOR = BOARD_OSCOUNT | AT91C_CKGR_MOSCEN; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS)); /* Initialize PLL at 96MHz and USB clock to 48MHz */ AT91C_BASE_PMC->PMC_PLLR = BOARD_USBDIV | BOARD_CKGR_PLL | BOARD_PLLCOUNT | BOARD_MUL | BOARD_DIV; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK)); /* Wait for the master clock if it was already initialized */ while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); /* Switch to fast clock **********************/ /* Switch to slow clock + prescaler */ AT91C_BASE_PMC->PMC_MCKR = BOARD_PRESCALER; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); /* Switch to fast clock + prescaler */ AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); /* Initialize AIC ****************/ AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF; AT91C_BASE_AIC->AIC_SVR[0] = (unsigned int) defaultFiqHandler; for (i = 1; i < 31; i++) { AT91C_BASE_AIC->AIC_SVR[i] = (unsigned int) defaultIrqHandler; } AT91C_BASE_AIC->AIC_SPU = (unsigned int) defaultSpuriousHandler; // Unstack nested interrupts for (i = 0; i < 8 ; i++) { AT91C_BASE_AIC->AIC_EOICR = 0; } // Enable Debug mode AT91C_BASE_AIC->AIC_DCR = AT91C_AIC_DCR_PROT; /* Watchdog initialization *************************/ AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; /* Remap *******/ BOARD_RemapRam(); }
//------------------------------------------------------------------------------ /// Performs the low-level initialization of the chip. This includes EFC, master /// clock, AIC & watchdog configuration, as well as memory remapping. //------------------------------------------------------------------------------ void LowLevelInit(void) { volatile unsigned int i; // Set flash wait states in the EFC // 48MHz = 1 wait state #if defined(at91sam7l64) || defined(at91sam7l128) AT91C_BASE_MC->MC_FMR = AT91C_MC_FWS_3FWS; #else #error No chip definition ? #endif // Enable external oscillator (on first boot only, after that command does nothing) gLowLevelInitSupcStatus = AT91C_BASE_SUPC->SUPC_SR; if ((gLowLevelInitSupcStatus & AT91C_SUPC_OSCSEL) != AT91C_SUPC_OSCSEL) { AT91C_BASE_SUPC->SUPC_CR = (0xA5 << 24) | AT91C_SUPC_XTALSEL; while ((AT91C_BASE_SUPC->SUPC_SR & AT91C_SUPC_OSCSEL) != AT91C_SUPC_OSCSEL); } // Switch to slow clock if necessary (so PLL frequency can be changed) if ((AT91C_BASE_PMC->PMC_MCKR & AT91C_PMC_CSS) == AT91C_PMC_CSS_PLL_CLK) { AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_CSS_SLOW_CLK; while ((AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) != AT91C_PMC_MCKRDY); } // Initialize PLL at 30MHz AT91C_BASE_PMC->PMC_PLLR = BOARD_CKGR_PLL | BOARD_PLLCOUNT | BOARD_MUL | BOARD_DIV; while ((AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK) == 0); // Switch to PLL AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_CSS_PLL_CLK; while ((AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) == 0); // Initialize AIC AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF; AT91C_BASE_AIC->AIC_SVR[0] = (unsigned int) defaultFiqHandler; for (i = 1; i < 31; i++) { AT91C_BASE_AIC->AIC_SVR[i] = (unsigned int) defaultIrqHandler; } AT91C_BASE_AIC->AIC_SPU = (unsigned int) defaultSpuriousHandler; // Unstack nested interrupts for (i = 0; i < 8 ; i++) { AT91C_BASE_AIC->AIC_EOICR = 0; } // Enable Debug mode AT91C_BASE_AIC->AIC_DCR = AT91C_AIC_DCR_PROT; // Watchdog initialization AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; // Remap the internal SRAM at 0x0 BOARD_RemapRam(); }
//------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Performs the low-level initialization of the chip. This includes EFC, master /// clock, AIC & watchdog configuration, as well as memory remapping. //------------------------------------------------------------------------------ void LowLevelInit( void ) { unsigned char i; // Set flash wait states in the EFC // 48MHz = 1 wait state AT91C_BASE_MC->MC_FMR = AT91C_MC_FWS_1FWS; // Initialize main oscillator AT91C_BASE_PMC->PMC_MOR = BOARD_OSCOUNT | AT91C_CKGR_MOSCEN; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS)); // Initialize PLL at 96MHz (96.109) and USB clock to 48MHz AT91C_BASE_PMC->PMC_PLLR = BOARD_USBDIV | BOARD_CKGR_PLL | BOARD_PLLCOUNT | BOARD_MUL | BOARD_DIV; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK)); // Wait for the master clock if it was already initialized while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); // Switch to slow clock + prescaler AT91C_BASE_PMC->PMC_MCKR = BOARD_PRESCALER; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); // Switch to fast clock + prescaler AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); // Initialize AIC AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF; AT91C_BASE_AIC->AIC_SVR[0] = (unsigned int) defaultFiqHandler; for (i = 1; i < 31; i++) { AT91C_BASE_AIC->AIC_SVR[i] = (unsigned int) defaultIrqHandler; } AT91C_BASE_AIC->AIC_SPU = (unsigned int) defaultSpuriousHandler; // Unstack nested interrupts for (i = 0; i < 8 ; i++) { AT91C_BASE_AIC->AIC_EOICR = 0; } // Enable Debug mode AT91C_BASE_AIC->AIC_DCR = AT91C_AIC_DCR_PROT; // Watchdog initialization AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; // Remap the internal SRAM at 0x0 BOARD_RemapRam(); // Disable RTT and PIT interrupts (potential problem when program A // configures RTT, then program B wants to use PIT only, interrupts // from the RTT will still occur since they both use AT91C_ID_SYS) AT91C_BASE_RTTC->RTTC_RTMR &= ~(AT91C_RTTC_ALMIEN | AT91C_RTTC_RTTINCIEN); AT91C_BASE_PITC->PITC_PIMR &= ~AT91C_PITC_PITIEN; }
//------------------------------------------------------------------------------ /// Performs the low-level initialization of the chip. //------------------------------------------------------------------------------ void LowLevelInit(unsigned int clockConfigEnable) { unsigned char i; pllConfiguration pll; mckrConfiguration mckr; if (clockConfigEnable) { // Switch MCK to Slow clock PMC_SwitchMck2SlowClock(); // enable Main oscillator PMC_EnableMainOsc(); // Then, cofigure PLLA and switch clock // MCK = 18.432MHz * 73 / 14 / 1 / 2 = 48MHz -> 0x10483F0E pll.mul = 0x49; pll.div = 0x0E; pll.usbdiv = 0; pll.pllout = 0; mckr.prescaler = AT91C_PMC_PRES_CLK; mckr.mdiv = AT91C_PMC_MDIV_2; mckr.plldiv2 = 0; PMC_ConfigureMckWithPlla(&pll, &mckr); } /* Initialize AIC */ AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF; AT91C_BASE_AIC->AIC_SVR[0] = (unsigned int) defaultFiqHandler; for (i = 1; i < 31; i++) { AT91C_BASE_AIC->AIC_SVR[i] = (unsigned int) defaultIrqHandler; } AT91C_BASE_AIC->AIC_SPU = (unsigned int) defaultSpuriousHandler; // Unstack nested interrupts for (i = 0; i < 8 ; i++) { AT91C_BASE_AIC->AIC_EOICR = 0; } // Enable Debug mode //AT91C_BASE_AIC->AIC_DCR = AT91C_AIC_DCR_PROT; /* Watchdog initialization *************************/ AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; /* Remap *******/ BOARD_RemapRam(); // Disable RTT and PIT interrupts (potential problem when program A // configures RTT, then program B wants to use PIT only, interrupts // from the RTT will still occur since they both use AT91C_ID_SYS) AT91C_BASE_RTTC->RTTC_RTMR &= ~(AT91C_RTTC_ALMIEN | AT91C_RTTC_RTTINCIEN); AT91C_BASE_PITC->PITC_PIMR &= ~AT91C_PITC_PITIEN; #if defined(norflash) BOARD_ConfigureNorFlash(BOARD_NORFLASH_DFT_BUS_SIZE); #endif }
//------------------------------------------------------------------------------ /// Performs the low-level initialization of the chip. //------------------------------------------------------------------------------ void LowLevelInit(unsigned int clockConfigEnable) { unsigned char i; if (clockConfigEnable) { // Initialize main oscillator AT91C_BASE_PMC->PMC_MOR = BOARD_OSCOUNT | AT91C_CKGR_MOSCEN; // Wait the main oscillator stabilization while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS)); // Initialize PLLA at 200MHz AT91C_BASE_PMC->PMC_PLLAR = BOARD_CKGR_PLLA | BOARD_PLLACOUNT | BOARD_MULA | BOARD_DIVA; // Wait the PLLA locking while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKA)); // Wait for the master clock if it was already initialized while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); // Set Master Clock Division only (before select the clock) // Processor clock = PLLA (200 MHz) // Master clock = PLLA / 2 (100 MHz) AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_CSS_SLOW_CLK | AT91C_PMC_PRES_CLK | AT91C_PMC_MDIV_2; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); // Select PLLA AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_CSS_PLLA_CLK | AT91C_PMC_PRES_CLK | AT91C_PMC_MDIV_2; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); } /* Initialize AIC ****************/ AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF; AT91C_BASE_AIC->AIC_SVR[0] = (unsigned int) defaultFiqHandler; for (i = 1; i < 31; i++) { AT91C_BASE_AIC->AIC_SVR[i] = (unsigned int) defaultIrqHandler; } AT91C_BASE_AIC->AIC_SPU = (unsigned int) defaultSpuriousHandler; // Unstack nested interrupts for (i = 0; i < 8 ; i++) { AT91C_BASE_AIC->AIC_EOICR = 0; } /* Watchdog initialization *************************/ AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; /* Remap *******/ BOARD_RemapRam(); configure_AT73C224(); }
//------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Performs the low-level initialization of the chip. Initialisation depends /// on where the application is executed: /// - in sdram: it means that sdram has previously been initialized. No further /// initialization is required. /// - in sram: PLL shall be initialized in LowLevelInit. Other initializations /// can be done later by the application. /// - in norflash: LowLevelInit can't be executed in norflash because SMC /// settings can't be changed while executing in external flash. /// LowLevelInit shall be executed in internal sram. It initializes /// PLL and SMC. /// This function also reset the AIC and disable RTT and PIT interrupts //------------------------------------------------------------------------------ void LowLevelInit(unsigned int clockConfigEnable) { unsigned char i; pllConfiguration pll; mckrConfiguration mckr; if (clockConfigEnable) { // Switch MCK to Slow clock PMC_SwitchMck2SlowClock(); // enable Main oscillator PMC_EnableMainOsc(); // Then, cofigure PLLA and switch clock // MCK = 18.432MHz * 73 / 14 / 1 / 2 = 48MHz -> 0x10483F0E pll.mul = 0x49; pll.div = 0x0E; pll.usbdiv = 0; pll.pllout = 0; mckr.prescaler = AT91C_PMC_PRES_CLK; mckr.mdiv = AT91C_PMC_MDIV_2; mckr.plldiv2 = 0; PMC_ConfigureMckWithPlla(&pll, &mckr); } /* Initialize AIC ****************/ AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF; AT91C_BASE_AIC->AIC_SVR[0] = (unsigned int) defaultFiqHandler; for (i = 1; i < 31; i++) { AT91C_BASE_AIC->AIC_SVR[i] = (unsigned int) defaultIrqHandler; } AT91C_BASE_AIC->AIC_SPU = (unsigned int) defaultSpuriousHandler; // Unstack nested interrupts for (i = 0; i < 8 ; i++) { AT91C_BASE_AIC->AIC_EOICR = 0; } /* Watchdog initialization *************************/ AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; /* Remap *******/ BOARD_RemapRam(); #if defined(norflash) BOARD_ConfigureNorFlash(BOARD_NORFLASH_DFT_BUS_SIZE); #endif }
//------------------------------------------------------------------------------ /// Performs the low-level initialization of the chip. //------------------------------------------------------------------------------ void LowLevelInit(unsigned int clockConfigEnable) { unsigned char i; if (clockConfigEnable) { // Initialize main oscillator AT91C_BASE_PMC->PMC_MOR = BOARD_OSCOUNT | AT91C_CKGR_MOSCEN; // Wait the main oscillator stabilization while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS)); // Initialize PLLA at 200MHz AT91C_BASE_PMC->PMC_PLLAR = BOARD_CKGR_PLLA | BOARD_PLLACOUNT | BOARD_MULA | BOARD_DIVA; // Wait the PLLA locking while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKA)); // Wait for the master clock if it was already initialized while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); // Set Master Clock Division only (before select the clock) // Processor clock = PLLA (200 MHz) // Master clock = PLLA / 2 (100 MHz) AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_CSS_SLOW_CLK | AT91C_PMC_PRES_CLK | AT91C_PMC_MDIV_2; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); // Select PLLA AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_CSS_PLLA_CLK | AT91C_PMC_PRES_CLK | AT91C_PMC_MDIV_2; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); } /* Initialize AIC ****************/ AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF; AT91C_BASE_AIC->AIC_SVR[0] = (unsigned int) defaultFiqHandler; for (i = 1; i < 31; i++) { AT91C_BASE_AIC->AIC_SVR[i] = (unsigned int) defaultIrqHandler; } AT91C_BASE_AIC->AIC_SPU = (unsigned int) defaultSpuriousHandler; // Unstack nested interrupts for (i = 0; i < 8 ; i++) { AT91C_BASE_AIC->AIC_EOICR = 0; } /* Watchdog initialization *************************/ AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; /* Remap *******/ BOARD_RemapRam(); // Disable RTT and PIT interrupts (potential problem when program A // configures RTT, then program B wants to use PIT only, interrupts // from the RTT will still occur since they both use AT91C_ID_SYS) AT91C_BASE_RTTC->RTTC_RTMR &= ~(AT91C_RTTC_ALMIEN | AT91C_RTTC_RTTINCIEN); AT91C_BASE_PITC->PITC_PIMR &= ~AT91C_PITC_PITIEN; configure_AT73C224(); }
/** * \brief Performs the low-level initialization of the chip. * This includes EFC and master clock configuration. * It also enable a low level on the pin NRST triggers a user reset. */ extern WEAK void LowLevelInit( void ) { uint8_t i; uint32_t _dwTimeout = 0; volatile uint32_t read = 0; if ((uint32_t)LowLevelInit < EBI_CS0_ADDR) /* Code not in external mem */ { /* Switch to PLL + prescaler */ read = PMC->PMC_MCKR; read &= ~(PMC_MCKR_CSS_Msk); read |= PMC_MCKR_CSS_MAIN_CLK; PMC->PMC_MCKR = read; while (!(PMC->PMC_SR & PMC_SR_MCKRDY)); PMC->CKGR_MOR = CKGR_MOR_KEY(0x37) | CKGR_MOR_MOSCXTST(64) | CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCXTEN | CKGR_MOR_MOSCSEL; _dwTimeout = 0; while (!(PMC->PMC_SR & PMC_SR_MOSCXTS) && (_dwTimeout++ < CLOCK_TIMEOUT)); PMC->CKGR_PLLAR = 0; /* Initialize PLLA */ PMC->CKGR_PLLAR = CKGR_PLLAR_STUCKTO1 | CKGR_PLLAR_MULA(199) | CKGR_PLLAR_OUTA(0) | CKGR_PLLAR_PLLACOUNT(63) | CKGR_PLLAR_DIVA(3); _dwTimeout = 0; while (!(PMC->PMC_SR & PMC_SR_LOCKA) && (_dwTimeout++ < CLOCK_TIMEOUT)); /* Wait for the master clock if it was already initialized */ for ( _dwTimeout = 0; !(PMC->PMC_SR & PMC_SR_MCKRDY) && (_dwTimeout++ < CLOCK_TIMEOUT) ; ); /* Switch to fast clock **********************/ /* Switch to main oscillator + prescaler */ read = PMC->PMC_MCKR; read &= ~(PMC_MCKR_MDIV_Msk); read |= (PMC_MCKR_MDIV_PCK_DIV3 | PMC_MCKR_PLLADIV2_DIV2); PMC->PMC_MCKR = read; /* Wait for the master clock if it was already initialized */ for ( _dwTimeout = 0; !(PMC->PMC_SR & PMC_SR_MCKRDY) && (_dwTimeout++ < CLOCK_TIMEOUT) ; ); /* Switch to main oscillator + prescaler */ read = PMC->PMC_MCKR; read &= ~(PMC_MCKR_PRES_Msk); read |= PMC_MCKR_PRES_CLOCK; PMC->PMC_MCKR = read; /* Wait for the master clock if it was already initialized */ for ( _dwTimeout = 0; !(PMC->PMC_SR & PMC_SR_MCKRDY) && (_dwTimeout++ < CLOCK_TIMEOUT) ; ); /* Switch to PLL + prescaler */ read = PMC->PMC_MCKR; read &= ~(PMC_MCKR_CSS_Msk); read |= PMC_MCKR_CSS_PLLA_CLK; PMC->PMC_MCKR = read; /* Wait for the master clock if it was already initialized */ for ( _dwTimeout = 0; !(PMC->PMC_SR & PMC_SR_MCKRDY) && (_dwTimeout++ < CLOCK_TIMEOUT) ; ); } /* Initialize AIC */ AIC->AIC_IDCR = 0xFFFFFFFF; AIC->AIC_SVR[0] = (unsigned int) defaultFiqHandler; for (i = 1; i < 31; i++) { AIC->AIC_SVR[i] = (unsigned int) defaultIrqHandler; } AIC->AIC_SPU = (unsigned int) defaultSpuriousHandler; /* Unstack nested interrupts */ for (i = 0; i < 8 ; i++) { AIC->AIC_EOICR = 0; } /* Remap */ BOARD_RemapRam(); BOARD_ConfigureDdram(); }
//------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Performs the low-level initialization of the chip. Initialisation depends /// on where the application is executed: /// - in sdram: it means that sdram has previously been initialized. No further /// initialization is required. /// - in sram: PLL shall be initialized in LowLevelInit. Other initializations /// can be done later by the application. /// - in norflash: LowLevelInit can't be executed in norflash because SMC /// settings can't be changed while executing in external flash. /// LowLevelInit shall be executed in internal sram. It initializes /// PLL and SMC. /// This function also reset the AIC and disable RTT and PIT interrupts //------------------------------------------------------------------------------ void LowLevelInit( void ) { unsigned char i; // If already running in external ram, PLL settings have already been done #if !defined(sdram) && !defined(ddram) && !defined(bcram) /* Initialize main oscillator ****************************/ AT91C_BASE_PMC->PMC_MOR = BOARD_OSCOUNT | AT91C_CKGR_MOSCEN; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS)); // Initialize PLLA at 200MHz AT91C_BASE_PMC->PMC_PLLAR = BOARD_CKGR_PLLA | BOARD_PLLACOUNT | BOARD_MULA | BOARD_DIVA; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKA)); // Initialize PLLB for USB usage (if not already locked) if (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKB)) { AT91C_BASE_PMC->PMC_PLLBR = BOARD_USBDIV | BOARD_CKGR_PLLB | BOARD_PLLBCOUNT | BOARD_MULB | BOARD_DIVB; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKB)); } /* Switch to fast clock **********************/ /* Wait for the master clock if it was already initialized */ while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); /* Switch to main oscillator + prescaler */ AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_CSS_SLOW_CLK | AT91C_PMC_PRES_CLK | AT91C_PMC_MDIV_2; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); // Select PLLA AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_CSS_PLLA_CLK | AT91C_PMC_PRES_CLK | AT91C_PMC_MDIV_2; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); #endif //#if !defined(sdram) && !defined(ddram) && !defined(bcram) /* Initialize AIC ****************/ AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF; AT91C_BASE_AIC->AIC_SVR[0] = (unsigned int) defaultFiqHandler; for (i = 1; i < 31; i++) { AT91C_BASE_AIC->AIC_SVR[i] = (unsigned int) defaultIrqHandler; } AT91C_BASE_AIC->AIC_SPU = (unsigned int) defaultSpuriousHandler; // Unstack nested interrupts for (i = 0; i < 8 ; i++) { AT91C_BASE_AIC->AIC_EOICR = 0; } /* Watchdog initialization *************************/ AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; /* Remap *******/ BOARD_RemapRam(); /* User reset is deleted (workaround Issue 5387) */ AT91C_BASE_RSTC->RSTC_RMR = 0xA5000000; // Disable RTT and PIT interrupts (potential problem when program A // configures RTT, then program B wants to use PIT only, interrupts // from the RTT will still occur since they both use AT91C_ID_SYS) AT91C_BASE_RTTC->RTTC_RTMR &= ~(AT91C_RTTC_ALMIEN | AT91C_RTTC_RTTINCIEN); AT91C_BASE_PITC->PITC_PIMR &= ~AT91C_PITC_PITIEN; #if defined(norflash) BOARD_ConfigureNorFlash(BOARD_NORFLASH_DFT_BUS_SIZE); #endif }
//------------------------------------------------------------------------------ /// Performs the low-level initialization of the chip. //------------------------------------------------------------------------------ void LowLevelInit( void ) { unsigned char i; #if !defined(sdram) /* Initialize main oscillator ****************************/ AT91C_BASE_PMC->PMC_MOR = BOARD_OSCOUNT | AT91C_CKGR_MOSCEN; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS)); /* Initialize PLLA at 200MHz (198.656) */ AT91C_BASE_PMC->PMC_PLLAR = BOARD_CKGR_PLLA | BOARD_PLLACOUNT | BOARD_MULA | BOARD_DIVA; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKA)); /* Wait for the master clock if it was already initialized */ while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); /* Switch to fast clock **********************/ /* Switch to main oscillator + prescaler */ AT91C_BASE_PMC->PMC_MCKR = BOARD_PRESCALER; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); /* Switch to PLL + prescaler */ AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLLA_CLK; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); #endif //#if !defined(sdram) /* Initialize AIC ****************/ AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF; AT91C_BASE_AIC->AIC_SVR[0] = (unsigned int) defaultFiqHandler; for (i = 1; i < 31; i++) { AT91C_BASE_AIC->AIC_SVR[i] = (unsigned int) defaultIrqHandler; } AT91C_BASE_AIC->AIC_SPU = (unsigned int) defaultSpuriousHandler; // Unstack nested interrupts for (i = 0; i < 8 ; i++) { AT91C_BASE_AIC->AIC_EOICR = 0; } // Enable Debug mode //AT91C_BASE_AIC->AIC_DCR = AT91C_AIC_DCR_PROT; /* Watchdog initialization *************************/ AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; /* Remap *******/ BOARD_RemapRam(); // Disable RTT and PIT interrupts (potential problem when program A // configures RTT, then program B wants to use PIT only, interrupts // from the RTT will still occur since they both use AT91C_ID_SYS) AT91C_BASE_RTTC->RTTC_RTMR &= ~(AT91C_RTTC_ALMIEN | AT91C_RTTC_RTTINCIEN); AT91C_BASE_PITC->PITC_PIMR &= ~AT91C_PITC_PITIEN; }
//------------------------------------------------------------------------------ /// Performs the low-level initialization of the chip. //------------------------------------------------------------------------------ void LowLevelInit(void) { unsigned char i; // Set flash wait states //---------------------- AT91C_BASE_EFC->EFC_FMR = 6 << 8; #if !defined(sdram) // Initialize main oscillator //--------------------------- AT91C_BASE_PMC->PMC_MOR = BOARD_OSCOUNT | AT91C_CKGR_MOSCEN; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS)); // Initialize PLLA at 200MHz (198.656) AT91C_BASE_PMC->PMC_PLLAR = BOARD_CKGR_PLLA | BOARD_PLLACOUNT | BOARD_MULA | BOARD_DIVA; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKA)); // Initialize PLLB for USB usage (if not already locked) if (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKB)) { AT91C_BASE_PMC->PMC_PLLBR = BOARD_USBDIV | BOARD_CKGR_PLLB | BOARD_PLLBCOUNT | BOARD_MULB | BOARD_DIVB; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKB)); } // Wait for the master clock if it was already initialized while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); // Switch to fast clock //--------------------- // Switch to main oscillator + prescaler AT91C_BASE_PMC->PMC_MCKR = BOARD_PRESCALER; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); // Switch to PLL + prescaler AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLLA_CLK; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); #endif //#if !defined(sdram) // Initialize AIC //--------------- AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF; AT91C_BASE_AIC->AIC_SVR[0] = (unsigned int) DefaultFiqHandler; for (i = 1; i < 31; i++) { AT91C_BASE_AIC->AIC_SVR[i] = (unsigned int) DefaultIrqHandler; } AT91C_BASE_AIC->AIC_SPU = (unsigned int) DefaultSpuriousHandler; // Unstack nested interrupts for (i = 0; i < 8 ; i++) { AT91C_BASE_AIC->AIC_EOICR = 0; } // Watchdog initialization //------------------------ AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; // Remap //------ BOARD_RemapRam(); // Disable RTT and PIT interrupts (potential problem when program A // configures RTT, then program B wants to use PIT only, interrupts // from the RTT will still occur since they both use AT91C_ID_SYS) AT91C_BASE_RTTC->RTTC_RTMR &= ~(AT91C_RTTC_ALMIEN | AT91C_RTTC_RTTINCIEN); AT91C_BASE_PITC->PITC_PIMR &= ~AT91C_PITC_PITIEN; }
/** * \brief Performs the low-level initialization of the chip. * This includes EFC and master clock configuration. * It also enable a low level on the pin NRST triggers a user reset. */ extern WEAK void LowLevelInit( void ) { uint32_t i; if ((uint32_t)LowLevelInit < DDR_CS_ADDR) /* Code not in external mem */ { PMC_SelectExt12M_Osc(); PMC_SwitchMck2Main(); PMC_SetPllA( CKGR_PLLAR_STUCKTO1 | CKGR_PLLAR_PLLACOUNT(0x3F) | CKGR_PLLAR_OUTA(0x0) | CKGR_PLLAR_MULA(65) | CKGR_PLLAR_DIVA(1), 0x3u << 8); PMC_SetMckPllaDiv(PMC_MCKR_PLLADIV2_DIV2); PMC_SetMckPrescaler(PMC_MCKR_PRES_CLOCK); PMC_SetMckDivider(PMC_MCKR_MDIV_PCK_DIV3); PMC_SwitchMck2Pll(); } #if 0 uint32_t abcdsr; /* Configure PCK1 to measure MCK */ PIOD->PIO_IDR = (1<<31); abcdsr = PIOD->PIO_ABCDSR[0]; PIOD->PIO_ABCDSR[0] = ((1<<31) | abcdsr); abcdsr = PIOD->PIO_ABCDSR[1]; PIOD->PIO_ABCDSR[1] &= (~(1<<31) & abcdsr); PIOD->PIO_PDR = (1<<31); /* Disable programmable clock 1 output */ REG_PMC_SCDR = PMC_SCER_PCK1; /* Enable the DAC master clock */ PMC->PMC_PCK[1] = PMC_PCK_CSS_MCK_CLK | PMC_PCK_PRES_CLOCK; /* Enable programmable clock 1 output */ REG_PMC_SCER = PMC_SCER_PCK1; /* Wait for the PCKRDY1 bit to be set in the PMC_SR register*/ while ((REG_PMC_SR & PMC_SR_PCKRDY1) == 0); #endif /* select FIQ */ AIC->AIC_SSR = 0; AIC->AIC_SVR = (unsigned int) defaultFiqHandler; for (i = 1; i < 31; i++) { AIC->AIC_SSR = i; AIC->AIC_SVR = (unsigned int) defaultIrqHandler; } AIC->AIC_SPU = (unsigned int) defaultSpuriousHandler; /* Disable all interrupts */ for (i = 1; i < 31; i++) { AIC->AIC_SSR = i; AIC->AIC_IDCR = 1 ; } /* Clear All pending interrupts flags */ for (i = 1; i < 31; i++) { AIC->AIC_SSR = i; AIC->AIC_ICCR = 1 ; } /* Perform 8 IT acknoledge (write any value in EOICR) */ for (i = 0; i < 8 ; i++) { AIC->AIC_EOICR = 0; } /* Remap */ BOARD_RemapRam(); }
void LowLevelInit( void ) { unsigned char i; #if !defined (sdram) // Initialize main oscillator AT91C_BASE_PMC->PMC_MOR = BOARD_OSCOUNT | AT91C_CKGR_MOSCEN; // Wait for the main oscillator to stabilize while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS)); // Initialize PLLA at 96MHz AT91C_BASE_PMC->PMC_PLLAR = BOARD_CKGR_PLLA | BOARD_PLLACOUNT | BOARD_MULA | BOARD_DIVA ; // Wait for the PLLA to lock while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKA)); // Initialize PLLB for USB usage (if not already locked) if (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKB)) { AT91C_BASE_PMC->PMC_PLLBR = BOARD_USBDIV | BOARD_CKGR_PLLB | BOARD_PLLBCOUNT | BOARD_MULB | BOARD_DIVB; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKB)); } // Select PLLA AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_CSS_PLLA_CLK | AT91C_PMC_PRES_CLK_2; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); #endif //#if !defined (sdram) /* Initialize AIC ****************/ AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF; AT91C_BASE_AIC->AIC_SVR[0] = (unsigned int) defaultFiqHandler; for (i = 1; i < 31; i++) { AT91C_BASE_AIC->AIC_SVR[i] = (unsigned int) defaultIrqHandler; } AT91C_BASE_AIC->AIC_SPU = (unsigned int) defaultSpuriousHandler; // Unstack nested interrupts for (i = 0; i < 8 ; i++) { AT91C_BASE_AIC->AIC_EOICR = 0; } // Enable Debug mode AT91C_BASE_AIC->AIC_DCR = AT91C_AIC_DCR_PROT; /* Watchdog initialization *************************/ AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_KEY | AT91C_WDTC_WDDIS; /* Remap *******/ BOARD_RemapRam(); // Disable RTT and PIT interrupts (potential problem when program A // configures RTT, then program B wants to use PIT only, interrupts // from the RTT will still occur since they both use AT91C_ID_SYS) AT91C_BASE_RTTC->RTTC_RTMR &= ~(AT91C_RTTC_ALMIEN | AT91C_RTTC_RTTINCIEN); AT91C_BASE_PITC->PITC_PIMR &= ~AT91C_PITC_PITIEN; }
//------------------------------------------------------------------------------ /// Performs the low-level initialization of the chip. This includes EFC, master /// clock, AIC & watchdog configuration, as well as memory remapping. //------------------------------------------------------------------------------ void lowLevelInit( void ) { unsigned char i; volatile unsigned int j; AT91C_BASE_RSTC->RSTC_RCR = AT91C_RSTC_KEY_A5 | AT91C_RSTC_PERRST; BOARD_ConfigureFlash48MHz(); //#if !defined(sdram) /* Initialize main oscillator ****************************/ AT91C_BASE_PMC->PMC_MOR = BOARD_OSCOUNT | AT91C_CKGR_MOSCEN; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS)); /* Initialize PLL at 96MHz (96.109) and USB clock to 48MHz */ AT91C_BASE_PMC->PMC_PLLR = BOARD_USBDIV | BOARD_CKGR_PLL | BOARD_PLLCOUNT | BOARD_MUL | BOARD_DIV; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK)); /* Wait for the master clock if it was already initialized */ while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); /* Switch to fast clock **********************/ /* Switch to slow clock + prescaler */ AT91C_BASE_PMC->PMC_MCKR = BOARD_PRESCALER; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); /* Switch to fast clock + prescaler */ AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); //#endif //#if !defined(sdram) /* Initialize AIC ****************/ AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF; AT91C_BASE_AIC->AIC_SVR[0] = (unsigned int) defaultFiqHandler; for (i = 1; i < 31; i++) { AT91C_BASE_AIC->AIC_SVR[i] = (unsigned int) defaultIrqHandler; } AT91C_BASE_AIC->AIC_SPU = (unsigned int) defaultSpuriousHandler; // Unstack nested interrupts for (i = 0; i < 8; i++) { AT91C_BASE_AIC->AIC_EOICR = 0; } // Enable Debug mode AT91C_BASE_AIC->AIC_DCR = AT91C_AIC_DCR_PROT; /* Watchdog initialization *************************/ AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; //BOARD_ConfigureSdram(16); //Enable external RST pin AT91C_BASE_RSTC->RSTC_RMR = AT91C_RSTC_KEY_A5 | AT91C_RSTC_URSTEN; //SDRAM initialization /// sdramInit(); /* Remap *******/ BOARD_RemapRam(); //IO configuration ioInit(); /*for(i = 0; i < 10; i++) { setLed(AT91B_LED1); clearLed(AT91B_LED2); for(j = 0; j < 100000; j++); clearLed(AT91B_LED1); setLed(AT91B_LED2); for(j = 0; j < 100000; j++); }*/ //Disable RTT and PIT interrupts (potential problem when program A //configures RTT, then program B wants to use PIT only, interrupts //from the RTT will still occur since they both use AT91C_ID_SYS) AT91C_BASE_RTTC->RTTC_RTMR &= ~(AT91C_RTTC_ALMIEN | AT91C_RTTC_RTTINCIEN); AT91C_BASE_PITC->PITC_PIMR &= ~AT91C_PITC_PITIEN; }