/** * \brief Enable UPLL clock. */ void pmc_enable_upll_clock(void) { PMC->CKGR_UCKR = CKGR_UCKR_UPLLCOUNT(3) | CKGR_UCKR_UPLLEN; /* Wait UTMI PLL Lock Status */ while (!(PMC->PMC_SR & PMC_SR_LOCKU)); }
/** * Configure USBHS settings for USB device */ static void _ConfigureUotghs(void) { /* UTMI parallel mode, High/Full/Low Speed */ /* UUSBCK not used in this configuration (High Speed) */ PMC->PMC_SCDR = PMC_SCDR_USBCLK; /* USB clock register: USB Clock Input is UTMI PLL */ PMC->PMC_USB = PMC_USB_USBS; /* Enable peripheral clock for USBHS */ PMC_EnablePeripheral(ID_USBHS); USBHS->USBHS_CTRL = USBHS_CTRL_UIMOD_DEVICE; /* Enable PLL 480 MHz */ PMC->CKGR_UCKR = CKGR_UCKR_UPLLEN | CKGR_UCKR_UPLLCOUNT(0xF); /* Wait that PLL is considered locked by the PMC */ while( !(PMC->PMC_SR & PMC_SR_LOCKU) ); /* IRQ */ NVIC_EnableIRQ(USBHS_IRQn) ; }
/** * \brief UOTGHS Library Example Application entry point. * * \return 42 Fatal error. */ extern int main( void ) { /* Disable watchdog */ WDT_Disable( WDT ) ; /* UTMI parallel mode, High/Full/Low Speed */ /* UOTGCK not used in this configuration (High Speed) */ PMC->PMC_SCDR = PMC_SCDR_UOTGCK; /* USB clock register: USB Clock Input is UTMI PLL */ PMC->PMC_USB = PMC_USB_USBS; /* USBS: USB Input Clock Selection: USB Clock Input is PLLA */ /* Enable peripheral clock for UOTGHS */ PMC_EnablePeripheral(UOTGHS_IRQn); UOTGHS->UOTGHS_CTRL = 0x0; /* Enable PLL 480 MHz */ PMC->CKGR_UCKR = CKGR_UCKR_UPLLEN | CKGR_UCKR_UPLLCOUNT(0xF); /* Wait that PLL is considered locked by the PMC */ while( !(PMC->PMC_SR & PMC_SR_LOCKU) ); /* Enable peripheral clock for UOTGHS */ PMC_EnablePeripheral(UOTGHS_IRQn); /* Output example information */ printf( "-- UOTGHS Library Example %s --\n\r", SOFTPACK_VERSION ) ; printf( "-- %s\n\r", BOARD_NAME ) ; printf( "-- Compiled: %s %s --\n\r", __DATE__, __TIME__ ) ; /* UOTGHS pins */ PIO_PinConfigure( pUOTGHSPins, PIO_LISTSIZE( pUOTGHSPins ) ); if ( PIO_PinGet(&pUOTGHS_Fault) == 0 ) { TRACE_OTG("UOTGHS_Fault = 0 (active low ERROR FLAG !\r\n"); TRACE_OTG("Undervoltage, Soft Start, Overcurrent, or Overtemperature\r\n"); while(1); } /* Enable interrupt */ NVIC_EnableIRQ(UOTGHS_IRQn); /* Initialize USB task */ usb_task_init(); #if USB_DEVICE_FEATURE == ENABLED device_template_task_init(); #endif #if USB_HOST_FEATURE == ENABLED host_template_task_init(); #endif #ifdef FREERTOS_USED /* Start OS scheduler */ vTaskStartScheduler(); TRACE_OTG("FreeRTOS returned\n\r"); return 42; #else /* No OS here. Need to call each task in round-robin mode. */ while (TRUE) { usb_task(); #if USB_DEVICE_FEATURE == ENABLED device_template_task(); #endif #if USB_HOST_FEATURE == ENABLED host_template_task(); #endif } #endif /* FREERTOS_USED */ }
/** * \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 dwTimeout ; /* Set 2 WS for Embedded Flash Access */ EFC0->EEFC_FMR = EEFC_FMR_FWS( 4 ) ; EFC1->EEFC_FMR = EEFC_FMR_FWS( 4 ) ; /* Initialize main oscillator */ if ( !(PMC->CKGR_MOR & CKGR_MOR_MOSCSEL) ) /* Main Oscillator Selection */ { // 48MHz PMC->CKGR_MOR = CKGR_MOR_KEY(0x37) | CKGR_MOR_MOSCXTST(0x8) /* Main Crystal Oscillator Start-up Time: 1.4ms(datasheet) */ | CKGR_MOR_MOSCRCEN /* Main On-Chip RC Oscillator Enable */ | CKGR_MOR_MOSCXTEN; /* Main Crystal Oscillator Enable */ /* The Main On-Chip RC Oscillator is selected */ dwTimeout = 0 ; while ( !(PMC->PMC_SR & PMC_SR_MOSCXTS) && (dwTimeout++ < CLOCK_TIMEOUT) ) ; } /* Switch to 3-20MHz Xtal oscillator */ PMC->CKGR_MOR = CKGR_MOR_KEY(0x37) | CKGR_MOR_MOSCXTST(0x8) /* Main Crystal Oscillator Start-up Time: 1.4ms(datasheet) */ | CKGR_MOR_MOSCRCEN /* Main On-Chip RC Oscillator Enable */ | CKGR_MOR_MOSCXTEN /* Main Crystal Oscillator Enable */ | CKGR_MOR_MOSCSEL; /* The Main Crystal Oscillator is selected */ dwTimeout = 0; /* Wait Main Oscillator Selection Status */ while (!(PMC->PMC_SR & PMC_SR_MOSCSELS) && (dwTimeout++ < CLOCK_TIMEOUT)); PMC->PMC_MCKR = (PMC->PMC_MCKR & ~ (0x7UL << 0)/*AT91C_PMC_CSS*/) | PMC_MCKR_CSS_MAIN_CLK; /* Main Clock is selected */ dwTimeout = 0; /* Wait Master Clock Status */ while (!(PMC->PMC_SR & PMC_SR_MCKRDY) && (dwTimeout++ < CLOCK_TIMEOUT)); /* Initialize PLLA */ PMC->CKGR_PLLAR = CKGR_PLLAR_STUCKTO1 | CKGR_PLLAR_MULA(13) /* PLLA Multiplier */ | CKGR_PLLAR_PLLACOUNT(2) /* PLLA Counter 200µs(datasheet) */ | CKGR_PLLAR_DIVA(1); /* Divider */ dwTimeout = 0; /* Wait PLL A Lock Status */ while (!(PMC->PMC_SR & PMC_SR_LOCKA) && (dwTimeout++ < CLOCK_TIMEOUT)); /* Initialize UTMI for USB usage, can be disabled if not using USB for the sake of saving power*/ PMC->CKGR_UCKR |= CKGR_UCKR_UPLLCOUNT(3) /* UTMI PLL Start-up Time */ | CKGR_UCKR_UPLLEN; /* UTMI PLL Enable */ dwTimeout = 0; /* Wait UTMI PLL Lock Status */ while (!(PMC->PMC_SR & PMC_SR_LOCKU) && (dwTimeout++ < CLOCK_TIMEOUT)); /* Switch to PLLA*/ PMC->PMC_MCKR = ((PMC_MCKR_PRES_CLK_2 | PMC_MCKR_CSS_PLLA_CLK) & ~(0x7UL << 0)/*AT91C_PMC_CSS*/) | PMC_MCKR_CSS_MAIN_CLK; /* Main Clock is selected */ dwTimeout = 0; /* Wait Master Clock Status */ while (!(PMC->PMC_SR & PMC_SR_MCKRDY) && (dwTimeout++ < CLOCK_TIMEOUT)); PMC->PMC_MCKR = PMC_MCKR_PRES_CLK_2 /* Selected clock divided by 2 */ | PMC_MCKR_CSS_PLLA_CLK; /* PLLA Clock is selected */ dwTimeout = 0; /* Wait Master Clock Status */ while (!(PMC->PMC_SR & PMC_SR_MCKRDY) && (dwTimeout++ < CLOCK_TIMEOUT)); }