usb_glue_mcx.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /*
  2. * Copyright (c) 2024, sakumisu
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include "usbd_core.h"
  7. #include "fsl_common.h"
  8. /*! @brief USB controller ID */
  9. typedef enum _usb_controller_index {
  10. kUSB_ControllerKhci0 = 0U, /*!< KHCI 0U */
  11. kUSB_ControllerKhci1 = 1U, /*!< KHCI 1U, Currently, there are no platforms which have two KHCI IPs, this is reserved
  12. to be used in the future. */
  13. kUSB_ControllerEhci0 = 2U, /*!< EHCI 0U */
  14. kUSB_ControllerEhci1 = 3U, /*!< EHCI 1U */
  15. } usb_controller_index_t;
  16. #define USB_DEVICE_CONFIG_EHCI 1
  17. /* USB PHY condfiguration */
  18. #define BOARD_USB_PHY_D_CAL (0x04U)
  19. #define BOARD_USB_PHY_TXCAL45DP (0x07U)
  20. #define BOARD_USB_PHY_TXCAL45DM (0x07U)
  21. #define BOARD_XTAL0_CLK_HZ 24000000U /*!< Board xtal0 frequency in Hz */
  22. #if ((defined FSL_FEATURE_SOC_USBPHY_COUNT) && (FSL_FEATURE_SOC_USBPHY_COUNT > 0U))
  23. #include "usb_phy.h"
  24. #endif
  25. #if (defined(USB_DEVICE_CONFIG_EHCI) && (USB_DEVICE_CONFIG_EHCI > 0U))
  26. void USB1_HS_IRQHandler(void)
  27. {
  28. extern void USBD_IRQHandler(uint8_t busid);
  29. USBD_IRQHandler(0);
  30. }
  31. #endif
  32. void USB_ClockInit(void)
  33. {
  34. #if defined(USB_DEVICE_CONFIG_EHCI) && (USB_DEVICE_CONFIG_EHCI > 0U)
  35. usb_phy_config_struct_t phyConfig = {
  36. BOARD_USB_PHY_D_CAL,
  37. BOARD_USB_PHY_TXCAL45DP,
  38. BOARD_USB_PHY_TXCAL45DM,
  39. };
  40. #endif
  41. #if defined(USB_DEVICE_CONFIG_EHCI) && (USB_DEVICE_CONFIG_EHCI > 0U)
  42. SPC0->ACTIVE_VDELAY = 0x0500;
  43. /* Change the power DCDC to 1.8v (By deafult, DCDC is 1.8V), CORELDO to 1.1v (By deafult, CORELDO is 1.0V) */
  44. SPC0->ACTIVE_CFG &= ~SPC_ACTIVE_CFG_CORELDO_VDD_DS_MASK;
  45. SPC0->ACTIVE_CFG |= SPC_ACTIVE_CFG_DCDC_VDD_LVL(0x3) | SPC_ACTIVE_CFG_CORELDO_VDD_LVL(0x3) |
  46. SPC_ACTIVE_CFG_SYSLDO_VDD_DS_MASK | SPC_ACTIVE_CFG_DCDC_VDD_DS(0x2u);
  47. /* Wait until it is done */
  48. while (SPC0->SC & SPC_SC_BUSY_MASK)
  49. ;
  50. if (0u == (SCG0->LDOCSR & SCG_LDOCSR_LDOEN_MASK)) {
  51. SCG0->TRIM_LOCK = 0x5a5a0001U;
  52. SCG0->LDOCSR |= SCG_LDOCSR_LDOEN_MASK;
  53. /* wait LDO ready */
  54. while (0U == (SCG0->LDOCSR & SCG_LDOCSR_VOUT_OK_MASK))
  55. ;
  56. }
  57. SYSCON->AHBCLKCTRLSET[2] |= SYSCON_AHBCLKCTRL2_USB_HS_MASK | SYSCON_AHBCLKCTRL2_USB_HS_PHY_MASK;
  58. SCG0->SOSCCFG &= ~(SCG_SOSCCFG_RANGE_MASK | SCG_SOSCCFG_EREFS_MASK);
  59. /* xtal = 20 ~ 30MHz */
  60. SCG0->SOSCCFG = (1U << SCG_SOSCCFG_RANGE_SHIFT) | (1U << SCG_SOSCCFG_EREFS_SHIFT);
  61. SCG0->SOSCCSR |= SCG_SOSCCSR_SOSCEN_MASK;
  62. while (1) {
  63. if (SCG0->SOSCCSR & SCG_SOSCCSR_SOSCVLD_MASK) {
  64. break;
  65. }
  66. }
  67. SYSCON->CLOCK_CTRL |= SYSCON_CLOCK_CTRL_CLKIN_ENA_MASK | SYSCON_CLOCK_CTRL_CLKIN_ENA_FM_USBH_LPT_MASK;
  68. CLOCK_EnableClock(kCLOCK_UsbHs);
  69. CLOCK_EnableClock(kCLOCK_UsbHsPhy);
  70. CLOCK_EnableUsbhsPhyPllClock(kCLOCK_Usbphy480M, 24000000U);
  71. CLOCK_EnableUsbhsClock();
  72. USB_EhciPhyInit(kUSB_ControllerEhci0, BOARD_XTAL0_CLK_HZ, &phyConfig);
  73. #endif
  74. #if defined(USB_DEVICE_CONFIG_KHCI) && (USB_DEVICE_CONFIG_KHCI > 0U)
  75. CLOCK_AttachClk(kCLK_48M_to_USB0);
  76. CLOCK_EnableClock(kCLOCK_Usb0Ram);
  77. CLOCK_EnableClock(kCLOCK_Usb0Fs);
  78. CLOCK_EnableUsbfsClock();
  79. #endif
  80. }
  81. void usb_dc_low_level_init(uint8_t busid)
  82. {
  83. USB_ClockInit();
  84. /* Install isr, set priority, and enable IRQ. */
  85. NVIC_SetPriority((IRQn_Type)USB1_HS_IRQn, 3);
  86. EnableIRQ((IRQn_Type)USB1_HS_IRQn);
  87. }
  88. void usb_dc_low_level_deinit(uint8_t busid)
  89. {
  90. DisableIRQ((IRQn_Type)USB1_HS_IRQn);
  91. }