/*FUNCTION********************************************************************** * * Function Name : CLOCK_SYS_GetLpuartFreq * Description : Gets the clock frequency for LPUART module. * This function gets the clock frequency for LPUART moudle. * *END**************************************************************************/ uint32_t CLOCK_SYS_GetLpuartFreq(uint32_t instance) { clock_lpuart_src_t src; uint32_t freq; src = CLOCK_HAL_GetLpuartSrc(SIM, instance); switch (src) { case kClockLpuartSrcPllFllSel: freq = CLOCK_SYS_GetPllFllClockFreq(); break; case kClockLpuartSrcOsc0erClk: freq = CLOCK_SYS_GetOsc0ExternalRefClockFreq(); break; case kClockLpuartSrcMcgIrClk: freq = CLOCK_HAL_GetInternalRefClk(MCG); break; default: freq = 0U; break; } return freq; }
/*FUNCTION*------------------------------------------------------------------- * * Function Name : usb_otg_soc_clock_config * Returned Value : none * Comments : * This function sets the selection of the high frequency clock for various USB clock options * *END*----------------------------------------------------------------------*/ static usb_status usb_otg_soc_clock_config(uint8_t controller_id, usb_otg_clock_sel_t setting) { usb_status ret = USB_OK; if (USB_CONTROLLER_KHCI_0 == controller_id) { uint32_t freq; clock_usbfs_src_t src; uint8_t instance = controller_id - USB_CONTROLLER_KHCI_0; switch(setting) { case USB_OTG_EXTERNAL_CLKIN: CLOCK_SYS_DisableUsbfsClock(instance); ret = USBERR_BAD_STATUS; break; case USB_OTG_IRC_CLK48M: CLOCK_SYS_DisableUsbfsClock(instance); /* USB clock divider */ CLOCK_SYS_SetUsbfsDiv(instance, 0U, 0U); /* PLL/FLL selected as CLK source */ CLOCK_SYS_SetUsbfsSrc(instance, kClockUsbfsSrcPllFllSel); CLOCK_SYS_SetPllfllSel (kClockPllFllSelIrc48M); /* USB Clock Gating */ CLOCK_SYS_EnableUsbfsClock(instance); /* Enable IRC 48MHz for USB module */ USB_CLK_RECOVER_IRC_EN = 0x03; break; case USB_OTG_PLLFLL_CLK: CLOCK_SYS_DisableUsbfsClock(instance); /* PLL/FLL selected as CLK source */ CLOCK_SYS_SetPllfllSel (kClockPllFllSelPll); CLOCK_SYS_SetUsbfsSrc(instance, kClockUsbfsSrcPllFllSel); /* USB clock divider */ src = CLOCK_SYS_GetUsbfsSrc(instance); switch(src) { case kClockUsbfsSrcExt: ret = USBERR_BAD_STATUS; break; case kClockUsbfsSrcPllFllSel: freq = CLOCK_SYS_GetPllFllClockFreq(); switch(freq) { case 120000000U: CLOCK_SYS_SetUsbfsDiv(instance, 4, 1); break; case 96000000U: CLOCK_SYS_SetUsbfsDiv(instance, 1, 0); break; case 72000000U: CLOCK_SYS_SetUsbfsDiv(instance, 2, 1); break; case 48000000U: CLOCK_SYS_SetUsbfsDiv(instance, 0, 0); break; default: ret = USBERR_BAD_STATUS; break; } break; default: ret = USBERR_BAD_STATUS; break; } /* Confirm the USB souce frequency is 48MHz */ if (48000000U != CLOCK_SYS_GetUsbfsFreq(instance)) { ret = USBERR_BAD_STATUS; } /* USB Clock Gating */ CLOCK_SYS_EnableUsbfsClock(instance); break; default: ret = USBERR_BAD_STATUS; break; } } else { ret = USBERR_BAD_STATUS; } return ret; }
/*FUNCTION*------------------------------------------------------------------- * * Function Name : usb_dev_soc_init * Returned Value : USB status * Comments : * This function performs BSP-specific I/O initialization related to USB * *END*----------------------------------------------------------------------*/ usb_status usb_dev_soc_init ( uint8_t controller_id ) { usb_status ret = USB_OK; MPU_CESR=0; if (USB_CONTROLLER_KHCI_0 == controller_id) { #if !USBCFG_DEV_USE_IRC48M uint32_t freq; clock_usbfs_src_t src; #endif uint8_t instance = controller_id - USB_CONTROLLER_KHCI_0; uint32_t base_address = soc_get_usb_base_address(controller_id); #if USBCFG_DEV_USE_IRC48M /* USB clock divider */ CLOCK_SYS_SetUsbfsDiv(instance, 0U, 0U); /* PLL/FLL selected as CLK source */ CLOCK_SYS_SetUsbfsSrc(instance, kClockUsbfsSrcPllFllSel); CLOCK_SYS_SetPllfllSel(kClockPllFllSelIrc48M); /* USB Clock Gating */ CLOCK_SYS_EnableUsbfsClock(instance); /* Enable IRC 48MHz for USB module */ usb_hal_khci_ungate_irc48m(base_address); usb_hal_khci_enable_irc48m_recovery_block(base_address); #else /* PLL/FLL selected as CLK source */ CLOCK_SYS_SetPllfllSel(kClockPllFllSelPll); CLOCK_SYS_SetUsbfsSrc(instance, kClockUsbfsSrcPllFllSel); /* USB clock divider */ src = CLOCK_SYS_GetUsbfsSrc(instance); switch(src) { case kClockUsbfsSrcExt: ret = USBERR_BAD_STATUS; break; case kClockUsbfsSrcPllFllSel: freq = CLOCK_SYS_GetPllFllClockFreq(); switch(freq) { case 120000000U: CLOCK_SYS_SetUsbfsDiv(instance, 4, 1); break; case 96000000U: CLOCK_SYS_SetUsbfsDiv(instance, 1, 0); break; case 72000000U: CLOCK_SYS_SetUsbfsDiv(instance, 2, 1); break; case 48000000U: CLOCK_SYS_SetUsbfsDiv(instance, 0, 0); break; default: ret = USBERR_BAD_STATUS; break; } break; default: ret = USBERR_BAD_STATUS; break; } /* Confirm the USB souce frequency is 48MHz */ if(48000000U != CLOCK_SYS_GetUsbfsFreq(instance)) { ret = USBERR_BAD_STATUS; } /* USB Clock Gating */ CLOCK_SYS_EnableUsbfsClock(instance); #endif /* Configure enable USB regulator for device */ SIM_HAL_SetUsbVoltRegulatorWriteCmd((SIM_Type*)(SIM_BASE), TRUE); SIM_HAL_SetUsbVoltRegulatorCmd((SIM_Type*)(SIM_BASE), TRUE); } else { ret = USBERR_BAD_STATUS; //unknown controller } return ret; }
/*FUNCTION*------------------------------------------------------------------- * * Function Name : usb_host_soc_init * Returned Value : USB status * Comments : * This function performs BSP-specific I/O initialization related to USB * *END*----------------------------------------------------------------------*/ usb_status usb_host_soc_init ( uint8_t controller_id ) { usb_status ret = 0; if (USB_CONTROLLER_KHCI_0 == controller_id) { uint32_t freq; clock_usbfs_src_t src; uint8_t instance = controller_id - USB_CONTROLLER_KHCI_0; uint32_t base_address = soc_get_usb_base_address(controller_id); /* PLL/FLL selected as CLK source */ CLOCK_SYS_SetPllfllSel(kClockPllFllSelPll); CLOCK_SYS_SetUsbfsSrc(instance, kClockUsbfsSrcPllFllSel); /* USB clock divider */ src = CLOCK_SYS_GetUsbfsSrc(instance); switch(src) { case kClockUsbfsSrcExt: ret = USBERR_BAD_STATUS; break; case kClockUsbfsSrcPllFllSel: freq = CLOCK_SYS_GetPllFllClockFreq(); switch(freq) { case 120000000U: CLOCK_SYS_SetUsbfsDiv(instance, 4, 1); break; case 96000000U: CLOCK_SYS_SetUsbfsDiv(instance, 1, 0); break; case 72000000U: CLOCK_SYS_SetUsbfsDiv(instance, 2, 1); break; case 48000000U: CLOCK_SYS_SetUsbfsDiv(instance, 0, 0); break; default: ret = USBERR_BAD_STATUS; break; } break; default: ret = USBERR_BAD_STATUS; break; } /* Confirm the USB souce frequency is 48MHz */ if(48000000U != CLOCK_SYS_GetUsbfsFreq(instance)) { ret = USBERR_BAD_STATUS; } /* USB Clock Gating */ CLOCK_SYS_EnableUsbfsClock(instance); } else { ret = USBERR_BAD_STATUS; //unknown controller } return ret; }