mirror of
https://github.com/hathach/tinyusb.git
synced 2025-03-23 13:20:54 +00:00
simplify upload request
This commit is contained in:
parent
5b965a3888
commit
95ded08e3b
@ -95,10 +95,10 @@ typedef enum {
|
||||
DFU_STATUS_ERRSTALLEDPKT = 0x0F,
|
||||
} dfu_device_status_t;
|
||||
|
||||
#define DFU_FUNC_ATTR_CAN_DOWNLOAD_BITMASK (1 << 0)
|
||||
#define DFU_FUNC_ATTR_CAN_UPLOAD_BITMASK (1 << 1)
|
||||
#define DFU_FUNC_ATTR_MANIFESTATION_TOLERANT_BITMASK (1 << 2)
|
||||
#define DFU_FUNC_ATTR_WILL_DETACH_BITMASK (1 << 3)
|
||||
#define DFU_FUNC_ATTR_CAN_DOWNLOAD_BITMASK (1u << 0)
|
||||
#define DFU_FUNC_ATTR_CAN_UPLOAD_BITMASK (1u << 1)
|
||||
#define DFU_FUNC_ATTR_MANIFESTATION_TOLERANT_BITMASK (1u << 2)
|
||||
#define DFU_FUNC_ATTR_WILL_DETACH_BITMASK (1u << 3)
|
||||
|
||||
// DFU Status Request Payload
|
||||
typedef struct TU_ATTR_PACKED
|
||||
|
@ -58,7 +58,6 @@ CFG_TUSB_MEM_SECTION static dfu_state_ctx_t _dfu_ctx;
|
||||
|
||||
static void dfu_req_dnload_setup(uint8_t rhport, tusb_control_request_t const * request);
|
||||
static void dfu_req_getstatus_reply(uint8_t rhport, tusb_control_request_t const * request);
|
||||
static uint16_t dfu_req_upload(uint8_t rhport, tusb_control_request_t const * request, uint16_t block_num, uint16_t wLength);
|
||||
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);
|
||||
|
||||
@ -218,37 +217,60 @@ bool dfu_moded_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_reque
|
||||
if ( request->bmRequestType_bit.type == TUSB_REQ_TYPE_STANDARD )
|
||||
{
|
||||
// Standard request include GET/SET_INTERFACE
|
||||
switch (request->bRequest )
|
||||
switch ( request->bRequest )
|
||||
{
|
||||
case TUSB_REQ_SET_INTERFACE:
|
||||
// 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;
|
||||
if ( stage == CONTROL_STAGE_SETUP )
|
||||
{
|
||||
// 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;
|
||||
|
||||
return tud_control_status(rhport, request);
|
||||
return tud_control_status(rhport, request);
|
||||
}
|
||||
break;
|
||||
|
||||
case TUSB_REQ_GET_INTERFACE:
|
||||
return tud_control_xfer(rhport, request, &_dfu_ctx.alt_num, 1);
|
||||
if(stage == CONTROL_STAGE_SETUP)
|
||||
{
|
||||
return tud_control_xfer(rhport, request, &_dfu_ctx.alt_num, 1);
|
||||
}
|
||||
break;
|
||||
|
||||
// unsupported request
|
||||
default: return false;
|
||||
}
|
||||
}
|
||||
else if (request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS)
|
||||
else if ( request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS )
|
||||
{
|
||||
// Class request
|
||||
switch (request->bRequest)
|
||||
switch ( request->bRequest )
|
||||
{
|
||||
case DFU_REQUEST_DETACH:
|
||||
{
|
||||
tud_control_status(rhport, request);
|
||||
if (tud_dfu_detach_cb) tud_dfu_detach_cb();
|
||||
break;
|
||||
}
|
||||
if ( stage == CONTROL_STAGE_SETUP )
|
||||
{
|
||||
tud_control_status(rhport, request);
|
||||
}
|
||||
else if ( stage == CONTROL_STAGE_ACK )
|
||||
{
|
||||
if (tud_dfu_detach_cb) tud_dfu_detach_cb();
|
||||
}
|
||||
break;
|
||||
|
||||
case DFU_REQUEST_UPLOAD:
|
||||
if ( stage == CONTROL_STAGE_SETUP )
|
||||
{
|
||||
TU_VERIFY(_dfu_ctx.attrs & DFU_FUNC_ATTR_CAN_UPLOAD_BITMASK);
|
||||
TU_VERIFY(tud_dfu_upload_cb);
|
||||
TU_VERIFY(request->wLength <= CFG_TUD_DFU_TRANSFER_BUFFER_SIZE);
|
||||
|
||||
uint16_t const xfer_len = tud_dfu_upload_cb(_dfu_ctx.alt_num, request->wValue, _dfu_ctx.transfer_buf, request->wLength);
|
||||
|
||||
tud_control_xfer(rhport, request, _dfu_ctx.transfer_buf, xfer_len);
|
||||
}
|
||||
break;
|
||||
|
||||
case DFU_REQUEST_DNLOAD:
|
||||
{
|
||||
@ -262,7 +284,6 @@ bool dfu_moded_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_reque
|
||||
}
|
||||
}
|
||||
// fallthrough
|
||||
case DFU_REQUEST_UPLOAD:
|
||||
case DFU_REQUEST_GETSTATUS:
|
||||
case DFU_REQUEST_CLRSTATUS:
|
||||
case DFU_REQUEST_GETSTATE:
|
||||
@ -290,18 +311,6 @@ bool dfu_moded_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_reque
|
||||
return true;
|
||||
}
|
||||
|
||||
static uint16_t dfu_req_upload(uint8_t rhport, tusb_control_request_t const * request, uint16_t block_num, uint16_t wLength)
|
||||
{
|
||||
TU_VERIFY( wLength <= CFG_TUD_DFU_TRANSFER_BUFFER_SIZE, 0);
|
||||
uint16_t retval = 0;
|
||||
if (tud_dfu_upload_cb)
|
||||
{
|
||||
tud_dfu_upload_cb(_dfu_ctx.alt_num, block_num, (uint8_t *)_dfu_ctx.transfer_buf, wLength);
|
||||
}
|
||||
tud_control_xfer(rhport, request, _dfu_ctx.transfer_buf, retval);
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void dfu_req_getstatus_reply(uint8_t rhport, tusb_control_request_t const * request)
|
||||
{
|
||||
uint32_t timeout = 0;
|
||||
@ -382,18 +391,6 @@ static bool dfu_state_machine(uint8_t rhport, tusb_control_request_t const * req
|
||||
}
|
||||
break;
|
||||
|
||||
case DFU_REQUEST_UPLOAD:
|
||||
{
|
||||
if( ((_dfu_ctx.attrs & DFU_FUNC_ATTR_CAN_UPLOAD_BITMASK) != 0) )
|
||||
{
|
||||
_dfu_ctx.state = DFU_UPLOAD_IDLE;
|
||||
dfu_req_upload(rhport, request, request->wValue, request->wLength);
|
||||
} else {
|
||||
_dfu_ctx.state = DFU_ERROR;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case DFU_REQUEST_GETSTATUS:
|
||||
dfu_req_getstatus_reply(rhport, request);
|
||||
break;
|
||||
@ -567,15 +564,6 @@ static bool dfu_state_machine(uint8_t rhport, tusb_control_request_t const * req
|
||||
{
|
||||
switch (request->bRequest)
|
||||
{
|
||||
case DFU_REQUEST_UPLOAD:
|
||||
{
|
||||
if (dfu_req_upload(rhport, request, request->wValue, request->wLength) != request->wLength)
|
||||
{
|
||||
_dfu_ctx.state = DFU_IDLE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case DFU_REQUEST_GETSTATUS:
|
||||
dfu_req_getstatus_reply(rhport, request);
|
||||
break;
|
||||
|
@ -449,7 +449,7 @@ typedef struct TU_ATTR_PACKED
|
||||
/*------------------------------------------------------------------*/
|
||||
/* Types
|
||||
*------------------------------------------------------------------*/
|
||||
typedef struct TU_ATTR_PACKED{
|
||||
typedef struct TU_ATTR_PACKED TU_ATTR_ALIGNED(4) {
|
||||
union {
|
||||
struct TU_ATTR_PACKED {
|
||||
uint8_t recipient : 5; ///< Recipient type tusb_request_recipient_t.
|
||||
|
Loading…
x
Reference in New Issue
Block a user