aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2012-06-13 18:32:03 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2012-06-13 18:32:03 +0000
commit18cab5548c02bd6c52af77be2a737a8a8fd47070 (patch)
tree1718224b410ea963bb1f403cb32d13049430a3c2
parent25d731ed0b6a4beb1a3b01c20f8e150dc12a8848 (diff)
downloadChibiOS-18cab5548c02bd6c52af77be2a737a8a8fd47070.tar.gz
ChibiOS-18cab5548c02bd6c52af77be2a737a8a8fd47070.tar.bz2
ChibiOS-18cab5548c02bd6c52af77be2a737a8a8fd47070.zip
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@4275 35acf78f-673a-0410-8e92-d51de3d6d3f4
-rw-r--r--os/hal/platforms/STM32/OTGv1/usb_lld.c46
1 files changed, 27 insertions, 19 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;
-
- 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;
+ size_t nw = ntogo / 4;
+
+ 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;
-
- 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;
+ size_t nw = ntogo / 4;
+
+ 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--;