From bbed36d99709f2bd248f2f9cce30a0c4cc312dd0 Mon Sep 17 00:00:00 2001 From: muzkr Date: Sat, 8 Nov 2025 07:24:27 +0800 Subject: [PATCH] VCP RX --- App/driver/vcp.c | 11 ++++++++++- App/driver/vcp.h | 3 +++ App/usb/usb_config.h | 9 ++++++++- App/usb/usbd_cdc_if.c | 35 ++++++++++++++++++++++++++++++++--- 4 files changed, 53 insertions(+), 5 deletions(-) diff --git a/App/driver/vcp.c b/App/driver/vcp.c index 519f465e..f6d7fec8 100644 --- a/App/driver/vcp.c +++ b/App/driver/vcp.c @@ -18,12 +18,21 @@ #include "usb_config.h" #include "py32f071_ll_bus.h" +uint8_t VCP_RxBuf[256]; +uint32_t VCP_RxBufPointer = 0; + void VCP_Init() { // LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_SYSCFG); LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA); // PA12:11 LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_USBD); - cdc_acm_init(); + cdc_acm_rx_buf_t rx_buf = { + .buf = VCP_RxBuf, + .size = sizeof(VCP_RxBuf), + .write_pointer = &VCP_RxBufPointer, + }; + cdc_acm_init(rx_buf); + NVIC_EnableIRQ(USBD_IRQn); } diff --git a/App/driver/vcp.h b/App/driver/vcp.h index 722359bc..80bc0b45 100644 --- a/App/driver/vcp.h +++ b/App/driver/vcp.h @@ -21,6 +21,9 @@ #include #include "usb_config.h" +extern uint8_t VCP_RxBuf[256]; +extern uint32_t VCP_RxBufPointer; + void VCP_Init(); static inline void VCP_Send(const uint8_t *Buf, uint32_t Size) diff --git a/App/usb/usb_config.h b/App/usb/usb_config.h index 21b90275..bb316eae 100644 --- a/App/usb/usb_config.h +++ b/App/usb/usb_config.h @@ -86,7 +86,14 @@ #define USBD_IRQHandler USB_IRQHandler -void cdc_acm_init(void); +typedef struct +{ + uint8_t *buf; + uint32_t size; + uint32_t *write_pointer; +} cdc_acm_rx_buf_t; + +void cdc_acm_init(cdc_acm_rx_buf_t rx_buf); void cdc_acm_data_send_with_dtr(const uint8_t *buf, uint32_t size); diff --git a/App/usb/usbd_cdc_if.c b/App/usb/usbd_cdc_if.c index 97566079..aedf716a 100644 --- a/App/usb/usbd_cdc_if.c +++ b/App/usb/usbd_cdc_if.c @@ -89,6 +89,8 @@ static const uint8_t cdc_descriptor[] = { USB_MEM_ALIGNX uint8_t read_buffer[128]; USB_MEM_ALIGNX uint8_t write_buffer[4]; +static cdc_acm_rx_buf_t client_rx_buf = {0}; + volatile bool ep_tx_busy_flag = false; #ifdef CONFIG_USB_HS @@ -100,13 +102,37 @@ volatile bool ep_tx_busy_flag = false; void usbd_configure_done_callback(void) { /* setup first out ep read transfer */ - usbd_ep_start_read(CDC_OUT_EP, read_buffer, 128); + usbd_ep_start_read(CDC_OUT_EP, read_buffer, sizeof(read_buffer)); } void usbd_cdc_acm_bulk_out(uint8_t ep, uint32_t nbytes) { + cdc_acm_rx_buf_t *rx_buf = &client_rx_buf; + if (nbytes && rx_buf->buf) + { + const uint8_t *buf = read_buffer; + uint32_t pointer = *rx_buf->write_pointer; + while (nbytes) + { + const uint32_t rem = rx_buf->size - pointer; + if (0 == rem) + { + pointer = 0; + continue; + } + + uint32_t size = rem < nbytes ? rem : nbytes; + memcpy(rx_buf->buf + pointer, buf, size); + buf += size; + nbytes -= size; + pointer += size; + } + + *rx_buf->write_pointer = pointer; + } + /* setup next out ep read transfer */ - usbd_ep_start_read(CDC_OUT_EP, read_buffer, 128); + usbd_ep_start_read(CDC_OUT_EP, read_buffer, sizeof(read_buffer)); } void usbd_cdc_acm_bulk_in(uint8_t ep, uint32_t nbytes) @@ -133,8 +159,11 @@ struct usbd_endpoint cdc_in_ep = { struct usbd_interface intf0; struct usbd_interface intf1; -void cdc_acm_init(void) +void cdc_acm_init(cdc_acm_rx_buf_t rx_buf) { + client_rx_buf = rx_buf; + *client_rx_buf.write_pointer = 0; + usbd_desc_register(cdc_descriptor); usbd_add_interface(usbd_cdc_acm_init_intf(&intf0)); usbd_add_interface(usbd_cdc_acm_init_intf(&intf1));