From 18cab5548c02bd6c52af77be2a737a8a8fd47070 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Wed, 13 Jun 2012 18:32:03 +0000 Subject: [PATCH] git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@4275 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/hal/platforms/STM32/OTGv1/usb_lld.c | 42 +++++++++++++++----------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/os/hal/platforms/STM32/OTGv1/usb_lld.c b/os/hal/platforms/STM32/OTGv1/usb_lld.c index d8e0f138d..1132416ee 100644 --- a/os/hal/platforms/STM32/OTGv1/usb_lld.c +++ b/os/hal/platforms/STM32/OTGv1/usb_lld.c @@ -301,18 +301,22 @@ static void otg_fifo_write_from_queue(usbep_t ep, ntogo = n; while (ntogo > 0) { uint32_t dw, i; - size_t streak, nw = ntogo / 4; - uint32_t nw2end = (oqp->q_top - oqp->q_rdptr) / 4; + size_t nw = ntogo / 4; - ntogo -= (streak = nw <= nw2end ? nw : nw2end) * 4; - oqp->q_rdptr = otg_do_push(fifop, oqp->q_rdptr, streak); - if (oqp->q_rdptr >= oqp->q_top) { - oqp->q_rdptr = oqp->q_buffer; - continue; + if (nw > 0) { + size_t streak; + uint32_t nw2end = (oqp->q_top - oqp->q_rdptr) / 4; + + ntogo -= (streak = nw <= nw2end ? nw : nw2end) * 4; + oqp->q_rdptr = otg_do_push(fifop, oqp->q_rdptr, streak); + if (oqp->q_rdptr >= oqp->q_top) { + oqp->q_rdptr = oqp->q_buffer; + continue; + } } /* If this condition is not satisfied then there is a word lying across - queue circular buffer boundary.*/ + queue circular buffer boundary or there is a residual of data.*/ if (ntogo <= 0) break; @@ -407,18 +411,22 @@ static void otg_fifo_read_to_queue(InputQueue *iqp, size_t n) { ntogo = n; while (ntogo > 0) { uint32_t dw, i; - size_t streak, nw = ntogo / 4; - uint32_t nw2end = (iqp->q_wrptr - iqp->q_wrptr) / 4; + size_t nw = ntogo / 4; - ntogo -= (streak = nw <= nw2end ? nw : nw2end) * 4; - iqp->q_wrptr = otg_do_pop(fifop, iqp->q_wrptr, streak); - if (iqp->q_wrptr >= iqp->q_top) { - iqp->q_wrptr = iqp->q_buffer; - continue; + if (nw > 0) { + size_t streak; + uint32_t nw2end = (iqp->q_wrptr - iqp->q_wrptr) / 4; + + ntogo -= (streak = nw <= nw2end ? nw : nw2end) * 4; + iqp->q_wrptr = otg_do_pop(fifop, iqp->q_wrptr, streak); + if (iqp->q_wrptr >= iqp->q_top) { + iqp->q_wrptr = iqp->q_buffer; + continue; + } } /* If this condition is not satisfied then there is a word lying across - queue circular buffer boundary.*/ + queue circular buffer boundary or there is a residual of data.*/ if (ntogo <= 0) break; @@ -426,7 +434,7 @@ static void otg_fifo_read_to_queue(InputQueue *iqp, size_t n) { dw = *fifop; i = 0; while ((ntogo > 0) && (i < 4)) { - *iqp->q_wrptr++ = (uint8_t)dw >> (i * 8); + *iqp->q_wrptr++ = (uint8_t)(dw >> (i * 8)); if (iqp->q_wrptr >= iqp->q_top) iqp->q_wrptr = iqp->q_buffer; ntogo--;