usb_glue_mcx.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. #else
  34. #error "Unsupported MCU with Kinetis IP"
  35. #endif
  36. void USBD_IRQ(void)
  37. {
  38. extern void USBD_IRQHandler(uint8_t busid);
  39. USBD_IRQHandler(0);
  40. }
  41. void usb_dc_low_level_init(uint8_t busid)
  42. {
  43. USB_ClockInit();
  44. uint8_t irqNumber;
  45. uint8_t usbDeviceKhciIrq[] = USB_IRQS;
  46. irqNumber = usbDeviceKhciIrq[0];
  47. /* Install isr, set priority, and enable IRQ. */
  48. NVIC_SetPriority((IRQn_Type)irqNumber, 3);
  49. EnableIRQ((IRQn_Type)irqNumber);
  50. USB_OTG_DEV->USBTRC0 |= USB_USBTRC0_USBRESET_MASK;
  51. while (USB_OTG_DEV->USBTRC0 & USB_USBTRC0_USBRESET_MASK)
  52. ;
  53. USB_OTG_DEV->USBTRC0 |= USB_USBTRC0_VREGIN_STS(1); /* software must set this bit to 1 */
  54. USB_OTG_DEV->USBCTRL = 0;
  55. USB_OTG_DEV->CONTROL |= USB_CONTROL_DPPULLUPNONOTG_MASK;
  56. }
  57. void usb_dc_low_level_deinit(uint8_t busid)
  58. {
  59. USB_OTG_DEV->CONTROL &= ~USB_CONTROL_DPPULLUPNONOTG_MASK;
  60. DisableIRQ((IRQn_Type)USB0_FS_IRQn);
  61. }
  62. void usbd_kinetis_delay_ms(uint8_t ms)
  63. {
  64. }