summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2025-03-29 15:37:03 +0800
committersakumisu <[email protected]>2025-03-29 15:37:03 +0800
commit6f25f797ed5a1532f24b0053e5b442b16afdc227 (patch)
tree7be2b2d24c3cb773acfe6a1d9d50c21dacd7c169
parent9a26c5090098d0ab8a59ce98418e28322d1bba73 (diff)
feat(port/kinetis): add mm32f5 support
Signed-off-by: sakumisu <[email protected]>
-rw-r--r--port/kinetis/usb_dc_kinetis.c13
-rw-r--r--port/kinetis/usb_glue_mm32.c36
2 files changed, 47 insertions, 2 deletions
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 <stdio.h>
+#include <string.h>
+
+#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);
+}