diff --git a/port/kinetis/usb_dc_kinetis.c b/port/kinetis/usb_dc_kinetis.c index bd2b2876..dd4e4f98 100644 --- a/port/kinetis/usb_dc_kinetis.c +++ b/port/kinetis/usb_dc_kinetis.c @@ -108,6 +108,15 @@ int usb_dc_init(uint8_t busid) int usb_dc_deinit(uint8_t busid) { + USB_OTG_DEV->INTEN = 0; + USB_OTG_DEV->CTL &= ~USB_CTL_USBENSOFEN_MASK; + + memset(&g_kinetis_udc[busid], 0, sizeof(g_kinetis_udc[busid])); + + USB_OTG_DEV->BDTPAGE1 = (uint8_t)((uintptr_t)&g_kinetis_bdt[busid] >> 8); + USB_OTG_DEV->BDTPAGE2 = (uint8_t)((uintptr_t)&g_kinetis_bdt[busid] >> 16); + USB_OTG_DEV->BDTPAGE3 = (uint8_t)((uintptr_t)&g_kinetis_bdt[busid] >> 24); + usb_dc_low_level_deinit(busid); return 0; } @@ -421,7 +430,7 @@ void USBD_IRQHandler(uint8_t busid) usbd_event_ep_in_complete_handler(busid, ep_idx | 0x80, g_kinetis_udc[busid].in_ep[ep_idx].actual_xfer_len); } else { kinetis_start_transfer(busid, ep_idx | 0x80, g_kinetis_udc[busid].in_ep[ep_idx].xfer_buf, - MIN(g_kinetis_udc[busid].in_ep[ep_idx].xfer_len, g_kinetis_udc[busid].in_ep[ep_idx].ep_mps)); + MIN(g_kinetis_udc[busid].in_ep[ep_idx].xfer_len, g_kinetis_udc[busid].in_ep[ep_idx].ep_mps)); } } else { g_kinetis_udc[busid].out_ep[ep_idx].xfer_buf += bc; @@ -432,7 +441,7 @@ void USBD_IRQHandler(uint8_t busid) usbd_event_ep_out_complete_handler(busid, ep_idx, g_kinetis_udc[busid].out_ep[ep_idx].actual_xfer_len); } else { kinetis_start_transfer(busid, ep_idx, g_kinetis_udc[busid].out_ep[ep_idx].xfer_buf, - MIN(g_kinetis_udc[busid].out_ep[ep_idx].xfer_len, g_kinetis_udc[busid].out_ep[ep_idx].ep_mps)); + MIN(g_kinetis_udc[busid].out_ep[ep_idx].xfer_len, g_kinetis_udc[busid].out_ep[ep_idx].ep_mps)); } } diff --git a/port/kinetis/usb_glue_mm32.c b/port/kinetis/usb_glue_mm32.c new file mode 100644 index 00000000..75e722c4 --- /dev/null +++ b/port/kinetis/usb_glue_mm32.c @@ -0,0 +1,36 @@ +#include +#include + +#include "mm32_device.h" +#include "hal_rcc.h" +#include "usbd_core.h" + +void usb_dc_low_level_init(uint8_t busid) +{ + /* Select USBCLK source */ + // RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_Div1); + RCC->CFGR &= ~(0x3 << 22); + RCC->CFGR |= (0x1 << 22); + + /* Enable USB clock */ + RCC->AHB2ENR |= 0x1 << 7; + +#define USB_DEVICE_INTERRUPT_PRIORITY (7U) + NVIC_SetPriority((IRQn_Type)USB_OTGFS_IRQn, USB_DEVICE_INTERRUPT_PRIORITY); + NVIC_EnableIRQ(USB_OTGFS_IRQn); +} + +void usb_dc_low_level_deinit(uint8_t busid) +{ + RCC->AHB2ENR &= ~(0x1 << 7); +} + +void USB_OTGFS_IRQHandler(void) +{ + USBD_IRQHandler(0); +} + +void usbd_kinetis_delay_ms(uint8_t ms) +{ + //delay_ms(ms); +}