diff --git a/class/cdc/usbd_cdc.c b/class/cdc/usbd_cdc.c index dfeea6b5..b7b4441a 100644 --- a/class/cdc/usbd_cdc.c +++ b/class/cdc/usbd_cdc.c @@ -29,7 +29,7 @@ const char *parity_name[] = { "N", "O", "E", "M", "S" }; /* Device data structure */ struct cdc_acm_cfg_priv { /* CDC ACM line coding properties. LE order */ - USB_MEM_ALIGN32 struct cdc_line_coding line_coding; + struct cdc_line_coding line_coding; /* CDC ACM line state bitmap, DTE side */ uint8_t line_state; /* CDC ACM serial state bitmap, DCE side */ diff --git a/core/usbd_core.c b/core/usbd_core.c index dca22910..10dbe57b 100644 --- a/core/usbd_core.c +++ b/core/usbd_core.c @@ -1054,6 +1054,14 @@ static void usbd_ep0_setup_handler(void) /* Send smallest of requested and offered length */ usbd_core_cfg.ep0_data_buf_residue = MIN(usbd_core_cfg.ep0_data_buf_len, setup->wLength); +#ifdef CONFIG_USB_DCACHE_ENABLE + /* check if the data buf addr uses usbd_core_cfg.req_data */ + if (((uint32_t)usbd_core_cfg.ep0_data_buf) != ((uint32_t)usbd_core_cfg.req_data)) { + /*copy data buf from misalign32 addr to align32 addr*/ + memcpy(usbd_core_cfg.req_data, usbd_core_cfg.ep0_data_buf, usbd_core_cfg.ep0_data_buf_residue); + usbd_core_cfg.ep0_data_buf = usbd_core_cfg.req_data; + } +#endif /*Send data or status to host*/ usbd_send_to_host(setup->wLength); }