From ba930408f6760b57564141fc3955f4361b6facb8 Mon Sep 17 00:00:00 2001 From: schneider Date: Sun, 11 Dec 2011 00:20:38 +0100 Subject: [PATCH] usbcdc: i don't trust these ring buffers... --- firmware/usbcdc/cdcuser.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/firmware/usbcdc/cdcuser.c b/firmware/usbcdc/cdcuser.c index 222dae2..5f5d436 100644 --- a/firmware/usbcdc/cdcuser.c +++ b/firmware/usbcdc/cdcuser.c @@ -25,6 +25,8 @@ #include "usbcore.h" #include "cdc.h" #include "cdcuser.h" +#include "usbreg.h" + unsigned char BulkBufIn [64]; // Buffer to store USB IN packet unsigned char BulkBufOut [64]; // Buffer to store USB OUT packet @@ -149,19 +151,23 @@ int CDC_WrInBuf (const char *buffer, int *length) bytesToWrite = *length; bytesWritten = bytesToWrite; - //Just block if we can't write all at once - while( CDC_BUF_SIZE - CDC_BUF_COUNT(CDC_InBuf) < bytesToWrite ); + // Just block if we can't write all at once + // These ringbuffers smell buggy, so +1 + while( CDC_BUF_SIZE - CDC_BUF_COUNT(CDC_InBuf) < bytesToWrite+1 ); //uint8_t flush = CDC_DepInEmpty; + + USB_DEVINTEN = 0; while (bytesToWrite--) { CDC_BUF_WR(CDC_InBuf, *buffer++); // Copy Data to buffer } //if( flush == 1 ){ - if( CDC_DepInEmpty && CDC_BUF_COUNT(CDC_InBuf) ){ + //if( CDC_DepInEmpty && CDC_BUF_COUNT(CDC_InBuf) ){ + if( CDC_DepInEmpty ){ CDC_DepInEmpty = 0; - gpioSetValue (RB_LED2, 0); - CDC_BulkIn(); + CDC_BulkIn(); } + USB_DEVINTEN = DEV_STAT_INT | (0xFF<<1) | (USB_SOF_EVENT ? FRAME_INT : 0); return (bytesWritten); } @@ -327,7 +333,6 @@ uint32_t CDC_SendBreak (unsigned short wDurationOfBreak) { return (TRUE); } - /*---------------------------------------------------------------------------- CDC_BulkIn call on DataIn Request Parameters: none