@@ -719,22 +719,21 @@ static void channel_xfer_in_retry(dwc2_regs_t* dwc2, uint8_t ch_id, uint32_t hci
719
719
}
720
720
}
721
721
722
- // immediately retry if bInterval is 1 - otherwise we'd waste a microframe before retrying
723
- if ((hcint & HCINT_HALTED ) && (edpt -> uframe_interval == 1 )) {
724
- edpt -> hcchar_bm .odd_frame = 1 - (dwc2 -> hfnum & 1 ); // transfer on next frame
725
- channel -> hcchar = (edpt -> hcchar & ~HCCHAR_CHENA );
726
- channel_send_in_token (dwc2 , channel );
727
- return ;
728
- }
729
-
730
- // for periodic, de-allocate channel, enable SOF set frame counter for later transfer
731
- edpt -> next_pid = channel -> hctsiz_bm .pid ; // save PID
732
- edpt -> uframe_countdown = edpt -> uframe_interval ;
733
- dwc2 -> gintmsk |= GINTSTS_SOF ;
734
-
735
722
if (hcint & HCINT_HALTED ) {
736
- // already halted, de-allocate channel (called from DMA isr)
737
- channel_dealloc (dwc2 , ch_id );
723
+ const uint32_t ucount = (hprt_speed_get (dwc2 ) == TUSB_SPEED_HIGH ? 1 : 8 );
724
+ if (edpt -> uframe_interval == ucount ) {
725
+ // immediately retry if bInterval is 1
726
+ edpt -> hcchar_bm .odd_frame = 1 - (dwc2 -> hfnum & 1 ); // transfer on next frame
727
+ channel -> hcchar = (edpt -> hcchar & ~HCCHAR_CHENA );
728
+ channel_send_in_token (dwc2 , channel );
729
+ } else {
730
+ // otherwise, de-allocate channel, enable SOF set frame counter for later transfer
731
+ edpt -> next_pid = channel -> hctsiz_bm .pid ; // save PID
732
+ edpt -> uframe_countdown = edpt -> uframe_interval - ucount ;
733
+ dwc2 -> gintmsk |= GINTSTS_SOF ;
734
+ // already halted, de-allocate channel (called from DMA isr)
735
+ channel_dealloc (dwc2 , ch_id );
736
+ }
738
737
} else {
739
738
// disable channel first if not halted (called slave isr)
740
739
xfer -> halted_sof_schedule = 1 ;
0 commit comments