Skip to content

Commit

Permalink
dcd_pic: handle EP0 timeout/stall correctly
Browse files Browse the repository at this point in the history
  • Loading branch information
ReimuNotMoe committed Dec 26, 2024
1 parent 0192b2a commit d70a00f
Showing 1 changed file with 12 additions and 0 deletions.
12 changes: 12 additions & 0 deletions src/portable/microchip/pic/dcd_pic.c
Original file line number Diff line number Diff line change
Expand Up @@ -318,10 +318,22 @@ static void prepare_next_setup_packet(uint8_t rhport)
const unsigned in_odd = _dcd.endpoint[0][1].odd;
TU_ASSERT(0 == _dcd.bdt[0][0][out_odd].own, );

// Abandon any previous control transfers that might have been using EP0.
// Ordinarily, nothing actually needs abandoning, since the previous control
// transfer would have completed successfully prior to the host sending the
// next SETUP packet. However, in a timeout error case, or after an EP0
// STALL event, one or more UOWN bits might still be set. If so, we should
// clear the UOWN bits, so the EP0 IN/OUT endpoints are in a known inactive
// state, ready for re-arming by the `dcd_edpt_xfer' function that will be
// called next.

_dcd.bdt[0][0][out_odd].data = 0;
_dcd.bdt[0][0][out_odd].own = 0;
_dcd.bdt[0][0][out_odd ^ 1].data = 1;
_dcd.bdt[0][1][in_odd].data = 1;
_dcd.bdt[0][1][in_odd].own = 0;
_dcd.bdt[0][1][in_odd ^ 1].data = 0;
_dcd.bdt[0][1][in_odd ^ 1].own = 0;
dcd_edpt_xfer(rhport, tu_edpt_addr(0, TUSB_DIR_OUT),
_dcd.setup_packet, sizeof(_dcd.setup_packet));
}
Expand Down

0 comments on commit d70a00f

Please sign in to comment.