summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSimon Kueppers <[email protected]>2022-10-27 19:09:48 +0200
committerMengsk <[email protected]>2022-12-29 12:13:56 +0100
commitd584b07e2c8068a51c89421be2ddc116f4fc9d3e (patch)
tree71d69a9b930d4aaa8e16d05e75309e52565c6d14 /src
parent510720b396eaa610e6ae688d5f46198de4aaee29 (diff)
Fixed problem where the transmit byte count was written into the wrong register on ISOCHRONOUS endpoints
Diffstat (limited to 'src')
-rw-r--r--src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c b/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c
index 9ec8ef592..36548975e 100644
--- a/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c
+++ b/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c
@@ -899,19 +899,26 @@ static void dcd_transmit_packet(xfer_ctl_t * xfer, uint16_t ep_ix)
len = xfer->max_packet_size;
}
- uint16_t oldAddr = *pcd_ep_tx_address_ptr(USB,ep_ix);
+ uint16_t ep_reg = pcd_get_endpoint(USB, ep_ix);
+ uint16_t addr_ptr = *pcd_ep_tx_address_ptr(USB,ep_ix);
if (xfer->ff)
{
- dcd_write_packet_memory_ff(xfer->ff, oldAddr, len);
+ dcd_write_packet_memory_ff(xfer->ff, addr_ptr, len);
}
else
{
- dcd_write_packet_memory(oldAddr, &(xfer->buffer[xfer->queued_len]), len);
+ dcd_write_packet_memory(addr_ptr, &(xfer->buffer[xfer->queued_len]), len);
}
xfer->queued_len = (uint16_t)(xfer->queued_len + len);
- pcd_set_ep_tx_cnt(USB,ep_ix,len);
+ /* Write into correct register when ISOCHRONOUS (double buffered) */
+ if ( (ep_reg & USB_EP_DTOG_TX) && ( (ep_reg & USB_EP_TYPE_MASK) == USB_EP_ISOCHRONOUS) ) {
+ pcd_set_ep_rx_cnt(USB, ep_ix, len);
+ } else {
+ pcd_set_ep_tx_cnt(USB, ep_ix, len);
+ }
+
pcd_set_ep_tx_status(USB, ep_ix, USB_EP_TX_VALID);
}