@@ -959,6 +959,10 @@ static bool handle_channel_out_slave(dwc2_regs_t* dwc2, uint8_t ch_id, uint32_t
959
959
is_done = true;
960
960
xfer -> result = XFER_RESULT_SUCCESS ;
961
961
channel -> hcintmsk &= ~HCINT_ACK ;
962
+ if (hcint & HCINT_NYET ) {
963
+ // complete transfer with NYET, do ping next time
964
+ edpt -> next_do_ping = 1 ;
965
+ }
962
966
} else if (hcint & HCINT_STALL ) {
963
967
xfer -> result = XFER_RESULT_STALLED ;
964
968
channel_disable (dwc2 , channel );
@@ -1002,16 +1006,16 @@ static bool handle_channel_out_slave(dwc2_regs_t* dwc2, uint8_t ch_id, uint32_t
1002
1006
channel -> hcintmsk &= ~HCINT_ACK ;
1003
1007
if (hcsplt .split_en ) {
1004
1008
if (!hcsplt .split_compl ) {
1005
- // start split is ACK --> do complete split
1009
+ // ACK for start split --> do complete split
1006
1010
hcsplt .split_compl = 1 ;
1007
1011
channel -> hcsplt = hcsplt .value ;
1008
1012
channel -> hcchar |= HCCHAR_CHENA ;
1009
1013
}
1010
1014
} else {
1011
- // Device is ready, resume transfer
1012
- edpt -> next_do_ping = 0 ;
1013
- xfer -> err_count = 0 ;
1014
- TU_ASSERT ( channel_xfer_start ( dwc2 , ch_id )) ;
1015
+ // ACK interrupt is only enabled for Split and PING
1016
+ // ACK for PING, which mean device is ready to receive data
1017
+ channel -> hctsiz &= ~ HCTSIZ_DOPING ; // HC already cleared PING bit, but we clear anyway
1018
+ channel -> hcchar |= HCCHAR_CHENA ;
1015
1019
}
1016
1020
}
1017
1021
0 commit comments