From a499c18072e9ea3d0f882d6353f28f15ac9819d6 Mon Sep 17 00:00:00 2001 From: ChunfengMu Date: Tue, 6 Feb 2018 01:49:59 +0800 Subject: [PATCH] =?UTF-8?q?[Components][Drivers][USB]vcom=20dma=5Ftx?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E4=B8=8B=E6=A0=B9=E6=8D=AEbulk=20in=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E8=83=BD=E5=8A=9B=E9=99=90=E5=88=B6tx=5Fringbuffer?= =?UTF-8?q?=E7=9A=84=E5=A1=AB=E5=85=85=E9=95=BF=E5=BA=A6,=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E5=AF=B9=E4=B8=8B=E6=AC=A1bulk=20in=E4=BC=A0=E8=BE=93?= =?UTF-8?q?=E9=80=A0=E6=88=90=E5=BD=B1=E5=93=8D.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../drivers/usb/usbdevice/class/cdc_vcom.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/components/drivers/usb/usbdevice/class/cdc_vcom.c b/components/drivers/usb/usbdevice/class/cdc_vcom.c index e1549e49a7..60ed85d9f3 100644 --- a/components/drivers/usb/usbdevice/class/cdc_vcom.c +++ b/components/drivers/usb/usbdevice/class/cdc_vcom.c @@ -69,6 +69,7 @@ static struct rt_thread vcom_thread; static struct ucdc_line_coding line_coding; #define CDC_TX_BUFSIZE 1024 +#define CDC_BULKIN_MAXSIZE (CDC_TX_BUFSIZE / 8) #define CDC_TX_HAS_DATE 0x01 @@ -255,12 +256,14 @@ static void _vcom_reset_state(ufunction_t func) static rt_err_t _ep_in_handler(ufunction_t func, rt_size_t size) { struct vcom *data; + rt_size_t request_size; RT_ASSERT(func != RT_NULL); - RT_DEBUG_LOG(RT_DEBUG_USB, ("_ep_in_handler %d\n", size)); data = (struct vcom*)func->user_data; - if ((size != 0) && ((size % EP_MAXPACKET(data->ep_in)) == 0)) + request_size = data->ep_in->request.size; + RT_DEBUG_LOG(RT_DEBUG_USB, ("_ep_in_handler %d\n", request_size)); + if ((request_size != 0) && ((request_size % EP_MAXPACKET(data->ep_in)) == 0)) { /* don't have data right now. Send a zero-length-packet to * terminate the transaction. @@ -677,7 +680,7 @@ static rt_size_t _vcom_tx(struct rt_serial_device *serial, rt_uint8_t *buf, rt_s struct ufunction *func; struct vcom *data; - rt_uint32_t baksize = size; + rt_uint32_t baksize; rt_size_t ptr = 0; int empty = 0; rt_uint8_t crlf[2] = {'\r', '\n',}; @@ -685,6 +688,9 @@ static rt_size_t _vcom_tx(struct rt_serial_device *serial, rt_uint8_t *buf, rt_s func = (struct ufunction*)serial->parent.user_data; data = (struct vcom*)func->user_data; + size = (size >= CDC_BULKIN_MAXSIZE) ? CDC_BULKIN_MAXSIZE : size; + baksize = size; + RT_ASSERT(serial != RT_NULL); RT_ASSERT(buf != RT_NULL); @@ -805,7 +811,7 @@ static void vcom_tx_thread_entry(void* parameter) rt_uint32_t res; struct ufunction *func = (struct ufunction *)parameter; struct vcom *data = (struct vcom*)func->user_data; - rt_uint8_t ch[64]; + rt_uint8_t ch[CDC_BULKIN_MAXSIZE]; while (1) { @@ -826,7 +832,7 @@ static void vcom_tx_thread_entry(void* parameter) while(rt_ringbuffer_data_len(&data->tx_ringbuffer)) { level = rt_hw_interrupt_disable(); - res = rt_ringbuffer_get(&data->tx_ringbuffer, ch, 64); + res = rt_ringbuffer_get(&data->tx_ringbuffer, ch, CDC_BULKIN_MAXSIZE); rt_hw_interrupt_enable(level); if(!res)