summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2022-07-29 19:54:56 +0800
committersakumisu <[email protected]>2022-07-29 19:54:56 +0800
commit063502c07811efebba8aab1d5966a0b143652c2a (patch)
tree2090072cfc9c878b8f24ea1fddb1e89f00c141e9
parentbed9f0d22d3108f8231a52159f8980febb7e4dba (diff)
add cache support
-rw-r--r--port/hpm/usb_dc_hpm.c39
1 files changed, 30 insertions, 9 deletions
diff --git a/port/hpm/usb_dc_hpm.c b/port/hpm/usb_dc_hpm.c
index a19fb42a..67af43ea 100644
--- a/port/hpm/usb_dc_hpm.c
+++ b/port/hpm/usb_dc_hpm.c
@@ -1,6 +1,6 @@
-#include "board.h"
-#include "hpm_usb_device.h"
#include "usbd_core.h"
+#include "hpm_usb_device.h"
+#include "board.h"
#ifndef USBD_IRQHandler
#define USBD_IRQHandler USBD_IRQHandler // use actual usb irq name instead
@@ -10,6 +10,8 @@
#define USB_NUM_BIDIR_ENDPOINTS USB_SOC_DCD_MAX_ENDPOINT_COUNT
#endif
+#define USB_ALIGN(size, align) (((size) + (align)-1) & ~((align)-1))
+
/* USBSTS, USBINTR */
enum {
intr_usb = HPM_BITSMASK(1, 0),
@@ -23,13 +25,12 @@ enum {
/* Endpoint state */
struct hpm_ep_state {
- /** Endpoint max packet size */
- uint16_t ep_mps;
- /** Endpoint Transfer Type.
- * May be Bulk, Interrupt, Control or Isochronous
- */
- uint8_t ep_type;
- uint8_t ep_stalled; /** Endpoint stall flag */
+ uint16_t ep_mps; /* Endpoint max packet size */
+ uint8_t ep_type; /* Endpoint type */
+ uint8_t ep_stalled; /* Endpoint stall flag */
+ uint8_t *xfer_buf;
+ uint32_t xfer_len;
+ uint32_t actual_xfer_len;
};
/* Driver state */
@@ -146,6 +147,16 @@ int usbd_ep_start_write(const uint8_t ep, const uint8_t *data, uint32_t data_len
return -1;
}
+ g_hpm_udc.in_ep[ep_idx].xfer_buf = (uint8_t *)data;
+ g_hpm_udc.in_ep[ep_idx].xfer_len = data_len;
+ g_hpm_udc.in_ep[ep_idx].actual_xfer_len = 0;
+
+#ifdef CONFIG_USB_DCACHE_ENABLE
+ if (data_len != 0) {
+ uint32_t align_len = USB_ALIGN(data_len, CONFIG_DCACHE_LINE_SIZE);
+ l1c_dc_flush((uint32_t)data, align_len);
+ }
+#endif
usb_device_edpt_xfer(handle, ep, data, data_len);
return 0;
@@ -160,6 +171,10 @@ int usbd_ep_start_read(const uint8_t ep, uint8_t *data, uint32_t data_len)
return -1;
}
+ g_hpm_udc.out_ep[ep_idx].xfer_buf = (uint8_t *)data;
+ g_hpm_udc.out_ep[ep_idx].xfer_len = data_len;
+ g_hpm_udc.out_ep[ep_idx].actual_xfer_len = 0;
+
usb_device_edpt_xfer(handle, ep, data, data_len);
return 0;
@@ -234,6 +249,12 @@ void USBD_IRQHandler(void)
if (ep_addr & 0x80) {
usbd_event_ep_in_complete_handler(ep_addr, transfer_len);
} else {
+#ifdef CONFIG_USB_DCACHE_ENABLE
+ if (transfer_len) {
+ uint32_t align_len = USB_ALIGN(transfer_len, CONFIG_DCACHE_LINE_SIZE);
+ l1c_dc_invalidate((uint32_t)g_hpm_udc.out_ep[ep_idx].xfer_buf, align_len);
+ }
+#endif
usbd_event_ep_out_complete_handler(ep_addr, transfer_len);
}
}