add cache support

This commit is contained in:
sakumisu
2022-07-29 19:54:56 +08:00
parent bed9f0d22d
commit 063502c078

View File

@@ -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);
}
}