usb_glue_mcx.c 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. #include "usb_kinetis_reg.h"
  9. #define USB_OTG_DEV ((KINETIS_MCX_TypeDef *)g_usbdev_bus[busid].reg_base)
  10. #if defined(MCXC444_H_)
  11. #define USBD_IRQ USB0_IRQHandler
  12. void USB_ClockInit(void)
  13. {
  14. SystemCoreClockUpdate();
  15. CLOCK_EnableUsbfs0Clock(kCLOCK_UsbSrcIrc48M, 48000000U);
  16. }
  17. #elif defined(MCXA153_H_)
  18. #define USBD_IRQ USB0_IRQHandler
  19. void USB_ClockInit(void)
  20. {
  21. RESET_PeripheralReset(kUSB0_RST_SHIFT_RSTn);
  22. CLOCK_EnableUsbfsClock();
  23. }
  24. #elif defined(MCXN947_CM33_CORE0_H_)
  25. #define USBD_IRQ USB0_FS_IRQHandler
  26. void USB_ClockInit(void)
  27. {
  28. CLOCK_AttachClk(kCLK_48M_to_USB0);
  29. CLOCK_EnableClock(kCLOCK_Usb0Ram);
  30. CLOCK_EnableClock(kCLOCK_Usb0Fs);
  31. CLOCK_EnableUsbfsClock();
  32. }
  33. #elif defined(MCXA156_H_)
  34. #define USBD_IRQ USB0_IRQHandler
  35. void USB_ClockInit(void)
  36. {
  37. RESET_PeripheralReset(kUSB0_RST_SHIFT_RSTn);
  38. CLOCK_EnableUsbfsClock();
  39. }
  40. #else
  41. #error "Unsupported MCU with Kinetis IP"
  42. #endif
  43. void USBD_IRQ(void)
  44. {
  45. extern void USBD_IRQHandler(uint8_t busid);
  46. USBD_IRQHandler(0);
  47. }
  48. void usb_dc_low_level_init(uint8_t busid)
  49. {
  50. USB_ClockInit();
  51. uint8_t irqNumber;
  52. uint8_t usbDeviceKhciIrq[] = USB_IRQS;
  53. irqNumber = usbDeviceKhciIrq[0];
  54. /* Install isr, set priority, and enable IRQ. */
  55. NVIC_SetPriority((IRQn_Type)irqNumber, 3);
  56. EnableIRQ((IRQn_Type)irqNumber);
  57. USB_OTG_DEV->USBTRC0 |= USB_USBTRC0_USBRESET_MASK;
  58. while (USB_OTG_DEV->USBTRC0 & USB_USBTRC0_USBRESET_MASK);
  59. USB_OTG_DEV->USBTRC0 |= USB_USBTRC0_VREGIN_STS(1); /* software must set this bit to 1 */
  60. USB_OTG_DEV->USBCTRL = 0;
  61. USB_OTG_DEV->CONTROL |= USB_CONTROL_DPPULLUPNONOTG_MASK;
  62. }
  63. void usb_dc_low_level_deinit(uint8_t busid)
  64. {
  65. USB_OTG_DEV->CONTROL &= ~USB_CONTROL_DPPULLUPNONOTG_MASK;
  66. #if defined(MCXN947_CM33_CORE0_H_)
  67. DisableIRQ((IRQn_Type)USB0_FS_IRQn);
  68. #else
  69. DisableIRQ((IRQn_Type)USB0_IRQn);
  70. #endif
  71. }
  72. void usbd_kinetis_delay_ms(uint8_t ms)
  73. {
  74. }