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