From 063502c07811efebba8aab1d5966a0b143652c2a Mon Sep 17 00:00:00 2001 From: sakumisu <1203593632@qq.com> Date: Fri, 29 Jul 2022 19:54:56 +0800 Subject: [PATCH] add cache support --- port/hpm/usb_dc_hpm.c | 39 ++++++++++++++++++++++++++++++--------- 1 file 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); } }