|
8 | 8 | #include <fsl_clock.h>
|
9 | 9 | #include <fsl_spc.h>
|
10 | 10 | #include <soc.h>
|
| 11 | +#if CONFIG_USB_DC_NXP_EHCI |
| 12 | +#include "usb_phy.h" |
| 13 | +#include "usb.h" |
| 14 | + |
| 15 | +/* USB PHY condfiguration */ |
| 16 | +#define BOARD_USB_PHY_D_CAL 0x04U |
| 17 | +#define BOARD_USB_PHY_TXCAL45DP 0x07U |
| 18 | +#define BOARD_USB_PHY_TXCAL45DM 0x07U |
| 19 | +#endif |
11 | 20 |
|
12 | 21 | /* Board xtal frequency in Hz */
|
13 | 22 | #define BOARD_XTAL0_CLK_HZ 24000000U
|
@@ -206,6 +215,49 @@ static int frdm_mcxn236_init(void)
|
206 | 215 | CLOCK_AttachClk(kFRO_HF_to_ADC0);
|
207 | 216 | #endif
|
208 | 217 |
|
| 218 | +#if DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(usb1)) && CONFIG_USB_DC_NXP_EHCI |
| 219 | + usb_phy_config_struct_t usbPhyConfig = { |
| 220 | + BOARD_USB_PHY_D_CAL, BOARD_USB_PHY_TXCAL45DP, BOARD_USB_PHY_TXCAL45DM, |
| 221 | + }; |
| 222 | + |
| 223 | + SPC0->ACTIVE_VDELAY = 0x0500; |
| 224 | + /* Change the power DCDC to 1.8v (By default, DCDC is 1.8V), CORELDO to 1.1v (By default, |
| 225 | + * CORELDO is 1.0V) |
| 226 | + */ |
| 227 | + SPC0->ACTIVE_CFG &= ~SPC_ACTIVE_CFG_CORELDO_VDD_DS_MASK; |
| 228 | + SPC0->ACTIVE_CFG |= SPC_ACTIVE_CFG_DCDC_VDD_LVL(0x3) | SPC_ACTIVE_CFG_CORELDO_VDD_LVL(0x3) | |
| 229 | + SPC_ACTIVE_CFG_SYSLDO_VDD_DS_MASK | SPC_ACTIVE_CFG_DCDC_VDD_DS(0x2u); |
| 230 | + /* Wait until it is done */ |
| 231 | + while (SPC0->SC & SPC_SC_BUSY_MASK) { |
| 232 | + }; |
| 233 | + if ((SCG0->LDOCSR & SCG_LDOCSR_LDOEN_MASK) == 0u) { |
| 234 | + SCG0->TRIM_LOCK = SCG_TRIM_LOCK_TRIM_LOCK_KEY(0x5a5a) | |
| 235 | + SCG_TRIM_LOCK_TRIM_UNLOCK_MASK; |
| 236 | + SCG0->LDOCSR |= SCG_LDOCSR_LDOEN_MASK; |
| 237 | + /* wait LDO ready */ |
| 238 | + while ((SCG0->LDOCSR & SCG_LDOCSR_VOUT_OK_MASK) == 0u) { |
| 239 | + }; |
| 240 | + } |
| 241 | + SYSCON->AHBCLKCTRLSET[2] |= SYSCON_AHBCLKCTRL2_USB_HS_MASK | |
| 242 | + SYSCON_AHBCLKCTRL2_USB_HS_PHY_MASK; |
| 243 | + SCG0->SOSCCFG &= ~(SCG_SOSCCFG_RANGE_MASK | SCG_SOSCCFG_EREFS_MASK); |
| 244 | + /* xtal = 20 ~ 30MHz */ |
| 245 | + SCG0->SOSCCFG = BIT(SCG_SOSCCFG_RANGE_SHIFT) | BIT(SCG_SOSCCFG_EREFS_SHIFT); |
| 246 | + SCG0->SOSCCSR |= SCG_SOSCCSR_SOSCEN_MASK; |
| 247 | + while (1) { |
| 248 | + if (SCG0->SOSCCSR & SCG_SOSCCSR_SOSCVLD_MASK) { |
| 249 | + break; |
| 250 | + } |
| 251 | + } |
| 252 | + SYSCON->CLOCK_CTRL |= SYSCON_CLOCK_CTRL_CLKIN_ENA_MASK | |
| 253 | + SYSCON_CLOCK_CTRL_CLKIN_ENA_FM_USBH_LPT_MASK; |
| 254 | + CLOCK_EnableClock(kCLOCK_UsbHs); |
| 255 | + CLOCK_EnableClock(kCLOCK_UsbHsPhy); |
| 256 | + CLOCK_EnableUsbhsPhyPllClock(kCLOCK_Usbphy480M, BOARD_XTAL0_CLK_HZ); |
| 257 | + CLOCK_EnableUsbhsClock(); |
| 258 | + USB_EhciPhyInit(kUSB_ControllerEhci0, BOARD_XTAL0_CLK_HZ, &usbPhyConfig); |
| 259 | +#endif |
| 260 | + |
209 | 261 | #if DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(lpcmp0))
|
210 | 262 | CLOCK_SetClkDiv(kCLOCK_DivCmp0FClk, 1U);
|
211 | 263 | CLOCK_AttachClk(kFRO12M_to_CMP0F);
|
|
0 commit comments