summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhathach <[email protected]>2021-07-14 17:03:20 +0700
committerhathach <[email protected]>2021-07-14 17:03:20 +0700
commitb4fde90b5518c4e92750af2e27eae598267ad8cf (patch)
tree67462ee9c4e98271116a2fa654eb7201b7c5c2a7 /src
parent6a68fc699724fb216b745dbf48fdae32305f1d35 (diff)
update clear status and get state
Diffstat (limited to 'src')
-rw-r--r--src/class/dfu/dfu_device.c66
1 files changed, 24 insertions, 42 deletions
diff --git a/src/class/dfu/dfu_device.c b/src/class/dfu/dfu_device.c
index ed36178f1..686d9b023 100644
--- a/src/class/dfu/dfu_device.c
+++ b/src/class/dfu/dfu_device.c
@@ -61,6 +61,13 @@ static void dfu_req_getstatus_reply(uint8_t rhport, tusb_control_request_t c
static void dfu_req_dnload_reply(uint8_t rhport, tusb_control_request_t const * request);
static bool dfu_state_machine(uint8_t rhport, tusb_control_request_t const * request);
+static void reset_state(void)
+{
+ _dfu_ctx.state = DFU_IDLE;
+ _dfu_ctx.status = DFU_STATUS_OK;
+ _dfu_ctx.blk_transfer_in_proc = false;
+}
+
//--------------------------------------------------------------------+
// Debug
//--------------------------------------------------------------------+
@@ -224,10 +231,7 @@ bool dfu_moded_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_reque
{
// Switch Alt interface and Re-initalize state machine
_dfu_ctx.alt_num = (uint8_t) request->wValue;
- _dfu_ctx.state = DFU_IDLE;
- _dfu_ctx.status = DFU_STATUS_OK;
- _dfu_ctx.blk_transfer_in_proc = false;
-
+ reset_state();
return tud_control_status(rhport, request);
}
break;
@@ -264,14 +268,26 @@ bool dfu_moded_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_reque
{
if (tud_dfu_abort_cb) tud_dfu_abort_cb(_dfu_ctx.alt_num);
- _dfu_ctx.state = DFU_IDLE;
- _dfu_ctx.status = DFU_STATUS_OK;
- _dfu_ctx.blk_transfer_in_proc = false;
+ reset_state();
+ tud_control_status(rhport, request);
+ }
+ break;
+ case DFU_REQUEST_CLRSTATUS:
+ if ( stage == CONTROL_STAGE_SETUP )
+ {
+ reset_state();
tud_control_status(rhport, request);
}
break;
+ case DFU_REQUEST_GETSTATE:
+ if ( stage == CONTROL_STAGE_SETUP )
+ {
+ tud_control_xfer(rhport, request, &_dfu_ctx.state, 1);
+ }
+ break;
+
case DFU_REQUEST_UPLOAD:
if ( stage == CONTROL_STAGE_SETUP )
{
@@ -298,8 +314,7 @@ bool dfu_moded_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_reque
}
// fallthrough
case DFU_REQUEST_GETSTATUS:
- case DFU_REQUEST_CLRSTATUS:
- case DFU_REQUEST_GETSTATE:
+
{
if(stage == CONTROL_STAGE_SETUP)
{
@@ -339,11 +354,6 @@ static void dfu_req_getstatus_reply(uint8_t rhport, tusb_control_request_t const
tud_control_xfer(rhport, request, &resp, sizeof(dfu_status_req_payload_t));
}
-static void dfu_req_getstate_reply(uint8_t rhport, tusb_control_request_t const * request)
-{
- tud_control_xfer(rhport, request, &_dfu_ctx.state, 1);
-}
-
static void dfu_req_dnload_setup(uint8_t rhport, tusb_control_request_t const * request)
{
// TODO: add "zero" copy mode so the buffer we read into can be provided by the user
@@ -404,10 +414,6 @@ static bool dfu_state_machine(uint8_t rhport, tusb_control_request_t const * req
dfu_req_getstatus_reply(rhport, request);
break;
- case DFU_REQUEST_GETSTATE:
- dfu_req_getstate_reply(rhport, request);
- break;
-
default:
_dfu_ctx.state = DFU_ERROR;
return false; // stall on all other requests
@@ -434,10 +440,6 @@ static bool dfu_state_machine(uint8_t rhport, tusb_control_request_t const * req
}
break;
- case DFU_REQUEST_GETSTATE:
- dfu_req_getstate_reply(rhport, request);
- break;
-
default:
_dfu_ctx.state = DFU_ERROR;
return false; // stall on all other requests
@@ -487,10 +489,6 @@ static bool dfu_state_machine(uint8_t rhport, tusb_control_request_t const * req
dfu_req_getstatus_reply(rhport, request);
break;
- case DFU_REQUEST_GETSTATE:
- dfu_req_getstate_reply(rhport, request);
- break;
-
default:
_dfu_ctx.state = DFU_ERROR;
return false; // stall on all other requests
@@ -520,10 +518,6 @@ static bool dfu_state_machine(uint8_t rhport, tusb_control_request_t const * req
}
break;
- case DFU_REQUEST_GETSTATE:
- dfu_req_getstate_reply(rhport, request);
- break;
-
default:
_dfu_ctx.state = DFU_ERROR;
return false; // stall on all other requests
@@ -565,10 +559,6 @@ static bool dfu_state_machine(uint8_t rhport, tusb_control_request_t const * req
dfu_req_getstatus_reply(rhport, request);
break;
- case DFU_REQUEST_GETSTATE:
- dfu_req_getstate_reply(rhport, request);
- break;
-
default:
return false; // stall on all other requests
break;
@@ -584,14 +574,6 @@ static bool dfu_state_machine(uint8_t rhport, tusb_control_request_t const * req
dfu_req_getstatus_reply(rhport, request);
break;
- case DFU_REQUEST_CLRSTATUS:
- _dfu_ctx.state = DFU_IDLE;
- break;
-
- case DFU_REQUEST_GETSTATE:
- dfu_req_getstate_reply(rhport, request);
- break;
-
default:
return false; // stall on all other requests
break;