@carlos_o hi, just to show the register value is not changing even after setting with config tools and visible in clockconfig.c generated file -
System Booting...
Core clock = 96000000 Hz
After BOARD_InitBootClocks:
USB PLL freq = 0 Hz
Clock enable returned: 1
USB PLL freq = 0 Hz
USB1CLK freq = 0 Hz
USB PORTMODE = 0x00050000
USBHSH->PORTSC1 = 0x00001000
USBHSH->USBSTS = 0x00000000
USBHSH->USBCMD = 0x00000501
--- USB CLOCK DIAGNOSTICS ---
USBPLLCTRL : 0x00000D3F
USBPLLSTAT : 0x00000001
USB1CLKSEL : 0x00000002
USB1CLKDIV : 0x00000000
PDRUNCFG : 0x40000610
--- END USB CLOCK DIAGNOSTICS ---
USB_HostInit failed with status 3
look we can see that, even though the clockconfig.c states USB1CLK is set to MAINCLKSELA -
it is not actually changing the register value -
void BOARD_BootClockRUN(void)
{
/*!< Set up the clock sources */
/*!< Set up FRO */
POWER_DisablePD(kPDRUNCFG_PD_FRO_EN); /*!< Ensure FRO is on */
CLOCK_AttachClk(kFRO12M_to_MAIN_CLK); /*!< Switch to FRO 12MHz first to ensure we can change voltage without accidentally
being below the voltage for current speed */
POWER_DisablePD(kPDRUNCFG_PD_SYS_OSC); /*!< Enable System Oscillator Power */
SYSCON->SYSOSCCTRL = ((SYSCON->SYSOSCCTRL & ~SYSCON_SYSOSCCTRL_FREQRANGE_MASK) | SYSCON_SYSOSCCTRL_FREQRANGE(1U)); /*!< Set system oscillator range */
/*!< Need to make sure ROM and OTP has power(PDRUNCFG0[17,29]= 0U)
before calling this API since this API is implemented in ROM code */
CLOCK_SetupFROClocking(12000000U); /*!< Set up FRO to the 12 MHz, just for sure */
POWER_SetVoltageForFreq(96000000U); /*!< Set voltage for the one of the fastest clock outputs: System clock output */
CLOCK_SetFLASHAccessCyclesForFreq(96000000U); /*!< Set FLASH wait states for core */
/*!< Set up SYS PLL */
const pll_setup_t pllSetup = {
.pllctrl = SYSCON_SYSPLLCTRL_SELI(16U) | SYSCON_SYSPLLCTRL_SELP(8U) | SYSCON_SYSPLLCTRL_SELR(0U),
.pllmdec = (SYSCON_SYSPLLMDEC_MDEC(8191U)),
.pllndec = (SYSCON_SYSPLLNDEC_NDEC(770U)),
.pllpdec = (SYSCON_SYSPLLPDEC_PDEC(98U)),
.pllRate = 180000000U,
.flags = PLL_SETUPFLAG_WAITLOCK | PLL_SETUPFLAG_POWERUP
};
CLOCK_AttachClk(kEXT_CLK_to_SYS_PLL); /*!< Set sys pll clock source*/
CLOCK_SetPLLFreq(&pllSetup); /*!< Configure PLL to the desired value */
/*!< Set up AUDIO PLL */
const pll_setup_t audio_pllSetup = {
.pllctrl = SYSCON_AUDPLLCTRL_SELI(59U) | SYSCON_AUDPLLCTRL_SELP(31U) | SYSCON_AUDPLLCTRL_SELR(0U),
.pllmdec = (SYSCON_AUDPLLMDEC_MDEC(30583U)),
.pllndec = (SYSCON_AUDPLLNDEC_NDEC(1U)),
.pllpdec = (SYSCON_AUDPLLPDEC_PDEC(5U)),
.pllRate = 48000000U,
.flags = PLL_SETUPFLAG_WAITLOCK | PLL_SETUPFLAG_POWERUP
};
CLOCK_AttachClk(kEXT_CLK_to_AUDIO_PLL); /*!< Set audio pll clock source*/
CLOCK_SetAudioPLLFreq(&audio_pllSetup); /*!< Configure PLL to the desired value */
/*!< Set up USB PLL */
const usb_pll_setup_t usb_pllSetup = {
.msel = 95U,
.nsel = 3U,
.psel = 0U,
.direct = true,
.bypass = false,
.fbsel = false,
.inputRate = 12000000U,
};
CLOCK_SetUsbPLLFreq(&usb_pllSetup); /*!< Configure PLL to the desired value */
/*!< Need to make sure ROM and OTP has power(PDRUNCFG0[17,29]= 0U)
before calling this API since this API is implemented in ROM code */
CLOCK_SetupFROClocking(96000000U); /*!< Set up high frequency FRO output to selected frequency */
/*!< Set up dividers */
CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false); /*!< Reset divider counter and set divider to value 1 */
CLOCK_SetClkDiv(kCLOCK_DivUsb0Clk, 0U, true); /*!< Reset USB0CLKDIV divider counter and halt it */
CLOCK_SetClkDiv(kCLOCK_DivUsb0Clk, 6U, false); /*!< Set USB0CLKDIV divider to value 6 */
CLOCK_SetClkDiv(kCLOCK_DivUsb1Clk, 0U, true); /*!< Reset USB1CLKDIV divider counter and halt it */
CLOCK_SetClkDiv(kCLOCK_DivUsb1Clk, 2U, false); /*!< Set USB1CLKDIV divider to value 2 */
CLOCK_SetClkDiv(kCLOCK_DivSctClk, 0U, true); /*!< Reset SCTCLKDIV divider counter and halt it */
CLOCK_SetClkDiv(kCLOCK_DivSctClk, 48U, false); /*!< Set SCTCLKDIV divider to value 48 */
/*!< Set up clock selectors - Attach clocks to the peripheries */
CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK); /*!< Switch MAIN_CLK to FRO_HF */
SYSCON->ASYNCAPBCTRL = SYSCON_ASYNCAPBCTRL_ENABLE_MASK; /*!< Enable ASYNC APB subsystem */
CLOCK_AttachClk(kMAIN_CLK_to_ASYNC_APB); /*!< Switch ASYNC_APB to MAIN_CLK */
CLOCK_AttachClk(kUSB_PLL_to_USB0_CLK); /*!< Switch USB0_CLK to USB_PLL */
CLOCK_AttachClk(kFRO_HF_to_USB1_CLK); /*!< Switch USB1_CLK to MAIN_CLK */
CLOCK_AttachClk(kAUDIO_PLL_to_FLEXCOMM2); /*!< Switch FLEXCOMM2 to AUDIO_PLL */
CLOCK_AttachClk(kAUDIO_PLL_to_FLEXCOMM3); /*!< Switch FLEXCOMM3 to AUDIO_PLL */
CLOCK_AttachClk(kAUDIO_PLL_to_FLEXCOMM5); /*!< Switch FLEXCOMM5 to AUDIO_PLL */
CLOCK_AttachClk(kAUDIO_PLL_to_FLEXCOMM7); /*!< Switch FLEXCOMM7 to AUDIO_PLL */
CLOCK_AttachClk(kAUDIO_PLL_to_SCT_CLK); /*!< Switch SCT_CLK to AUDIO_PLL */
/*!< Set SystemCoreClock variable. */
SystemCoreClock = BOARD_BOOTCLOCKRUN_CORE_CLOCK;
}
(from main shown here)
int main(void)
{
vPortDefineHeapRegions(xHeapRegions);
BOARD_InitBootPins();
BOARD_InitBootClocks();
BOARD_InitBootPeripherals();
SEGGER_RTT_Init();
PRINTF("System Booting...\r\n");
PRINTF("Core clock = %lu Hz\r\n", CLOCK_GetFreq(kCLOCK_CoreSysClk));
PRINTF("After BOARD_InitBootClocks:\n");
PRINTF("USB PLL freq = %lu Hz\r\n", CLOCK_GetFreq(kCLOCK_UsbPll));
/* === Recommended Power-up Order === */
POWER_DisablePD(kPDRUNCFG_PD_VD2_ANA); // Crystal analog domain - FIRST
POWER_DisablePD(kPDRUNCFG_PD_VD3); // PLL domain
POWER_DisablePD(kPDRUNCFG_PD_VD5); // PHY domain
POWER_DisablePD(kPDRUNCFG_PD_USB_PLL);
POWER_DisablePD(kPDRUNCFG_PD_USB1_PHY);
SDK_DelayAtLeastUs(15000, SystemCoreClock); // 15ms — give crystal time to stabilize
/* Force crystal oscillator */
SYSCON->SYSOSCCTRL = 0x00000000;
// CLOCK_EnableClock(kCLOCK_Usbh1);
status_t clkStatus = CLOCK_EnableUsbhs0HostClock(kCLOCK_UsbSrcUsbPll, 48000000U);
PRINTF("Clock enable returned: %d\r\n", clkStatus);
PRINTF("USB PLL freq = %lu Hz\r\n", CLOCK_GetFreq(kCLOCK_UsbPll));
PRINTF("USB1CLK freq = %lu Hz\r\n", CLOCK_GetFreq(kCLOCK_UsbClk));
/* Force Host mode - bit 16 */
USBHSH->PORTMODE &= ~(1UL << 16);
USBHSH->PORTMODE |= (1UL << 16);
PRINTF("USB PORTMODE = 0x%08lX\r\n", USBHSH->PORTMODE);
PRINTF("USBHSH->PORTSC1 = 0x%08lX\r\n", USBHSH->PORTSC1);
PRINTF("USBHSH->USBSTS = 0x%08lX\r\n", USBHSH->USBSTS);
PRINTF("USBHSH->USBCMD = 0x%08lX\r\n", USBHSH->USBCMD);
PRINTF("\r\n--- USB CLOCK DIAGNOSTICS ---\r\n");
/* USB PLL state */
PRINTF("USBPLLCTRL : 0x%08lX\r\n", SYSCON->USBPLLCTRL);
PRINTF("USBPLLSTAT : 0x%08lX\r\n", SYSCON->USBPLLSTAT);
/* USB1 clock mux + divider */
PRINTF("USB1CLKSEL : 0x%08lX\r\n", SYSCON->USB1CLKSEL);
PRINTF("USB1CLKDIV : 0x%08lX\r\n", SYSCON->USB1CLKDIV);
/* Power gating snapshot */
PRINTF("PDRUNCFG : 0x%08lX\r\n", SYSCON->PDRUNCFG);
/* Optional SDK-level view (if available) */
// PRINTF("USB1CLK freq: %lu\r\n", CLOCK_GetFreq(kCLOCK_UsbPll));
PRINTF("--- END USB CLOCK DIAGNOSTICS ---\r\n\r\n");
/* Init stack */
usb_status_t status = USB_HostInit(CONTROLLER_ID, &g_HostHandle, USB_HostEvent);
if (status != kStatus_USB_Success) {
PRINTF("USB_HostInit failed with status %d\r\n", status);
}