diff options
| author | hathach <[email protected]> | 2025-09-16 22:23:57 +0700 |
|---|---|---|
| committer | hathach <[email protected]> | 2025-09-16 22:23:57 +0700 |
| commit | 541c62ceaee39bc5896f16c0f71251863adb7bc4 (patch) | |
| tree | 81e12c7255fed34ef6135d4efb4a3d232c4e796b /src/class | |
| parent | 10298f0b275971db349c68049454994b15eabf46 (diff) | |
refactor mtp xfer callback
Diffstat (limited to 'src/class')
| -rw-r--r-- | src/class/mtp/mtp.h | 12 | ||||
| -rw-r--r-- | src/class/mtp/mtp_device.c | 211 |
2 files changed, 186 insertions, 37 deletions
diff --git a/src/class/mtp/mtp.h b/src/class/mtp/mtp.h index f697193d2..c9d2b27a9 100644 --- a/src/class/mtp/mtp.h +++ b/src/class/mtp/mtp.h @@ -60,9 +60,11 @@ typedef enum { typedef enum { MTP_PHASE_IDLE = 0, MTP_PHASE_COMMAND, + MTP_PHASE_DATA, MTP_PHASE_DATA_IN, MTP_PHASE_DATA_OUT, MTP_PHASE_RESPONSE, + MTP_PHASE_RESPONSE_QUEUED, MTP_PHASE_ERROR, MTP_PHASE_NONE, } mtp_phase_type_t; @@ -685,9 +687,17 @@ tu_static const uint16_t mtp_playback_formats[] = { // Data structures //--------------------------------------------------------------------+ -#define MTP_GENERIC_DATA_BLOCK_LENGTH 12 +#define MTP_CONTAINER_HEADER_LENGTH 12 #define MTP_MAX_PACKET_SIZE 512 +typedef struct TU_ATTR_PACKED { + uint32_t len; + uint16_t type; + uint16_t code; + uint32_t transaction_id; +} mtp_container_header_t; +TU_VERIFY_STATIC(sizeof(mtp_container_header_t) == 12, "size is not correct"); + // PTP/MTP Generic container typedef struct TU_ATTR_PACKED { uint32_t len; diff --git a/src/class/mtp/mtp_device.c b/src/class/mtp/mtp_device.c index 5aa2bf1f1..6b37f50c2 100644 --- a/src/class/mtp/mtp_device.c +++ b/src/class/mtp/mtp_device.c @@ -45,6 +45,8 @@ #define TU_LOG_DRV(...) TU_LOG(CFG_TUD_MTP_LOG_LEVEL, __VA_ARGS__) +#define BULK_PACKET_SIZE (TUD_OPT_HIGH_SPEED ? 512 : 64) + //--------------------------------------------------------------------+ // STRUCT //--------------------------------------------------------------------+ @@ -68,6 +70,8 @@ typedef struct uint32_t session_id; uint32_t transaction_id; } context; + + mtp_container_header_t cmd_header; } mtpd_interface_t; typedef struct { @@ -113,6 +117,17 @@ CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN static uint32_t _mtpd_get_object_handle; CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN static mtp_basic_object_info_t _mtpd_soi; CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN static char _mtp_datestr[20]; + +//--------------------------------------------------------------------+ +// Helper +//--------------------------------------------------------------------+ + +static bool prepare_new_command(uint8_t rhport, mtpd_interface_t* p_mtp) { + p_mtp->phase = MTP_PHASE_IDLE; + return usbd_edpt_xfer(rhport, p_mtp->ep_out, (uint8_t *)(&_mtpd_epbuf.container), sizeof(mtp_generic_container_t)); +} + + //--------------------------------------------------------------------+ // USBD Driver API //--------------------------------------------------------------------+ @@ -157,8 +172,7 @@ uint16_t mtpd_open(uint8_t rhport, tusb_desc_interface_t const* itf_desc, uint16 // Open endpoint pair TU_ASSERT(usbd_open_edpt_pair(rhport, tu_desc_next(ep_desc), 2, TUSB_XFER_BULK, &p_mtp->ep_out, &p_mtp->ep_in), 0); - // Prepare rx on bulk out EP - TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_out, (uint8_t *)(&_mtpd_epbuf.container), CFG_MTP_EP_SIZE), 0); + TU_ASSERT(prepare_new_command(rhport, p_mtp), 0); return mtpd_itf_size; } @@ -185,7 +199,7 @@ bool mtpd_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t TU_LOG_DRV(" MTP request: MTP_REQ_RESET\n"); tud_mtp_storage_reset(); // Prepare for a new command - TU_ASSERT(usbd_edpt_xfer(rhport, _mtpd_itf.ep_out, (uint8_t *)(&_mtpd_epbuf.container), CFG_MTP_EP_SIZE)); + TU_ASSERT(usbd_edpt_xfer(rhport, _mtpd_itf.ep_out, (uint8_t *)(&_mtpd_epbuf.container), sizeof(mtp_generic_container_t))); break; case MTP_REQ_GET_DEVICE_STATUS: { @@ -218,28 +232,152 @@ bool mtpd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t mtpd_interface_t* p_mtp = &_mtpd_itf; mtp_generic_container_t* p_container = &_mtpd_epbuf.container; + switch (p_mtp->phase) { + case MTP_PHASE_IDLE: + // received new command + TU_VERIFY(ep_addr == p_mtp->ep_out && p_container->type == MTP_CONTAINER_TYPE_COMMAND_BLOCK); + p_mtp->phase = MTP_PHASE_COMMAND; + TU_ATTR_FALLTHROUGH; // handle in the next case + + case MTP_PHASE_COMMAND: + // Handle command block + memcpy(&p_mtp->cmd_header, p_container, sizeof(mtp_container_header_t)); + p_mtp->phase = mtpd_handle_cmd(); + if (p_mtp->phase == MTP_PHASE_DATA_IN) { + TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_in, (uint8_t*) p_container, (uint16_t)p_mtp->queued_len)); + p_mtp->total_len = p_container->len; + p_mtp->xferred_len = 0; + p_mtp->handled_len = 0; + p_mtp->xfer_completed = false; + } else if (p_mtp->phase == MTP_PHASE_DATA_OUT) { + p_mtp->xferred_len = 0; + p_mtp->handled_len = 0; + p_mtp->xfer_completed = false; + TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_out, (uint8_t*) p_container, sizeof(mtp_generic_container_t)), 0); + } + break; + + case MTP_PHASE_DATA_IN: + p_mtp->xferred_len += xferred_bytes; + p_mtp->handled_len = p_mtp->xferred_len; + + // Check if transfer completed TODO check ZLP with FS/HS bulk size + if (p_mtp->xferred_len >= p_mtp->total_len && (xferred_bytes == 0 || (xferred_bytes % CFG_MTP_EP_SIZE) != 0)) { + p_mtp->phase = MTP_PHASE_RESPONSE; + p_container->type = MTP_CONTAINER_TYPE_RESPONSE_BLOCK; + p_container->code = MTP_RESP_OK; + p_container->len = MTP_CONTAINER_HEADER_LENGTH; + p_container->transaction_id = p_mtp->context.transaction_id; + if (p_mtp->context.session_id != 0) { // is this needed ? + p_container->data[0] = p_mtp->context.session_id; + p_container->len += sizeof(uint32_t); + } + } else { + // Send next block of DATA + if (p_mtp->xferred_len == p_mtp->total_len) { + // send Zero-Length Packet + TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_in, NULL, 0 )); + } else { + p_mtp->phase = mtpd_handle_data(); + if (p_mtp->phase == MTP_PHASE_DATA_IN) { + TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_in, ((uint8_t *)(&p_container->data)), (uint16_t)p_mtp->queued_len)); + } + } + } + break; + + case MTP_PHASE_DATA_OUT: + // First block of data + if (p_mtp->xferred_len == 0) { + p_mtp->total_len = p_container->len; + p_mtp->handled_len = 0; + p_mtp->xfer_completed = false; + TU_ASSERT(p_container->type == MTP_CONTAINER_TYPE_DATA_BLOCK); + } + p_mtp->xferred_len += xferred_bytes; + + // A zero-length or a short packet termination + if (xferred_bytes < CFG_MTP_EP_SIZE) { + p_mtp->xfer_completed = true; + // Handle data block + p_mtp->phase = mtpd_handle_data(); + if (p_mtp->phase == MTP_PHASE_DATA_OUT) { + TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_out, (uint8_t*) p_container, sizeof(mtp_generic_container_t)), 0); + p_mtp->xferred_len = 0; + p_mtp->xfer_completed = false; + } + } else { + // Handle data block when container is full + if (p_mtp->xferred_len - p_mtp->handled_len >= MTP_MAX_PACKET_SIZE - CFG_MTP_EP_SIZE) { + p_mtp->phase = mtpd_handle_data(); + p_mtp->handled_len = p_mtp->xferred_len; + } + // Transfer completed: wait for zero-length packet + // Some platforms may not respect EP size and xferred_bytes may be more than CFG_MTP_EP_SIZE if + // the OUT EP is waiting for more data. Ensure we are not waiting for more than CFG_MTP_EP_SIZE. + if (p_mtp->total_len == p_mtp->xferred_len) { + TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_out, ((uint8_t *)(&p_container->data)), CFG_MTP_EP_SIZE), 0); + } else if (p_mtp->handled_len == 0) { + // First data block includes container header + container data + TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_out, + (uint8_t*) p_container + p_mtp->xferred_len, + (uint16_t)TU_MIN(p_mtp->total_len - p_mtp->xferred_len, CFG_MTP_EP_SIZE))); + } else { + // Successive data block includes only container data + TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_out, + ((uint8_t *)(&p_container->data)) + p_mtp->xferred_len - p_mtp->handled_len, + (uint16_t)TU_MIN(p_mtp->total_len - p_mtp->xferred_len, CFG_MTP_EP_SIZE))); + } + } + break; + + case MTP_PHASE_RESPONSE_QUEUED: + // response phase is complete -> prepare for new command + TU_ASSERT(ep_addr == p_mtp->ep_in); + prepare_new_command(rhport, p_mtp); + break; + + case MTP_PHASE_RESPONSE: + case MTP_PHASE_ERROR: + // processed immediately after this switch, supposedly to be empty + break; + default: return false; + } + + if (p_mtp->phase == MTP_PHASE_RESPONSE) { + p_mtp->phase = MTP_PHASE_RESPONSE_QUEUED; + p_container->type = MTP_CONTAINER_TYPE_RESPONSE_BLOCK; + p_container->transaction_id = p_mtp->context.transaction_id; + TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_in, (uint8_t*) p_container, (uint16_t)p_container->len), 0); + } else if (p_mtp->phase == MTP_PHASE_ERROR) { + // stall both IN & OUT endpoints + usbd_edpt_stall(rhport, p_mtp->ep_out); + usbd_edpt_stall(rhport, p_mtp->ep_in); + } + +#if 0 // IN transfer completed if (ep_addr == p_mtp->ep_in) { if (p_mtp->phase == MTP_PHASE_RESPONSE) { // IN transfer completed, prepare for a new command - TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_out, (uint8_t*) &_mtpd_epbuf.container, CFG_MTP_EP_SIZE), 0); + TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_out, (uint8_t*) p_container, CFG_MTP_EP_SIZE), 0); p_mtp->phase = MTP_PHASE_IDLE; } else if (p_mtp->phase == MTP_PHASE_DATA_IN) { p_mtp->xferred_len += xferred_bytes; p_mtp->handled_len = p_mtp->xferred_len; - // Check if transfer completed + // Check if transfer completed. if (p_mtp->xferred_len >= p_mtp->total_len && (xferred_bytes == 0 || (xferred_bytes % CFG_MTP_EP_SIZE) != 0)) { p_mtp->phase = MTP_PHASE_RESPONSE; p_container->type = MTP_CONTAINER_TYPE_RESPONSE_BLOCK; p_container->code = MTP_RESP_OK; - p_container->len = MTP_GENERIC_DATA_BLOCK_LENGTH; + p_container->len = MTP_CONTAINER_HEADER_LENGTH; p_container->transaction_id = p_mtp->context.transaction_id; if (p_mtp->context.session_id != 0) { p_container->data[0] = p_mtp->context.session_id; p_container->len += sizeof(uint32_t); } - TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_in, (uint8_t*) &_mtpd_epbuf.container, (uint16_t)p_container->len), 0); + TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_in, (uint8_t*) p_container, (uint16_t)p_container->len), 0); } else { // Send next block of DATA // Send Zero-Length Packet @@ -248,7 +386,7 @@ bool mtpd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t } else { p_mtp->phase = mtpd_handle_data(); if (p_mtp->phase == MTP_PHASE_RESPONSE) { - TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_in, (uint8_t*) &_mtpd_epbuf.container, (uint16_t)p_container->len)); + TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_in, (uint8_t*) p_container, (uint16_t)p_container->len)); } else { TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_in, ((uint8_t *)(&p_container->data)), (uint16_t)p_mtp->queued_len)); } @@ -278,20 +416,20 @@ bool mtpd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t if (p_mtp->phase == MTP_PHASE_COMMAND) { // A zero-length or a short packet termination is expected if (xferred_bytes == CFG_MTP_EP_SIZE || (p_mtp->total_len - p_mtp->xferred_len) > 0) { - TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_out, (uint8_t*) &_mtpd_epbuf.container + p_mtp->xferred_len, (uint16_t)(p_mtp->total_len - p_mtp->xferred_len))); + TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_out, (uint8_t*) p_container + p_mtp->xferred_len, (uint16_t)(p_mtp->total_len - p_mtp->xferred_len))); } else { // Handle command block p_mtp->phase = mtpd_handle_cmd(); if (p_mtp->phase == MTP_PHASE_RESPONSE) { - TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_in, (uint8_t*) &_mtpd_epbuf.container, (uint16_t)p_container->len)); + TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_in, (uint8_t*) p_container, (uint16_t)p_container->len)); } else if (p_mtp->phase == MTP_PHASE_DATA_IN) { - TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_in, (uint8_t*) &_mtpd_epbuf.container, (uint16_t)p_mtp->queued_len)); + TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_in, (uint8_t*) p_container, (uint16_t)p_mtp->queued_len)); p_mtp->total_len = p_container->len; p_mtp->xferred_len = 0; p_mtp->handled_len = 0; p_mtp->xfer_completed = false; } else if (p_mtp->phase == MTP_PHASE_DATA_OUT) { - TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_out, (uint8_t*) &_mtpd_epbuf.container, CFG_MTP_EP_SIZE), 0); + TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_out, (uint8_t*) p_container, sizeof(mtp_generic_container_t)), 0); p_mtp->xferred_len = 0; p_mtp->handled_len = 0; p_mtp->xfer_completed = false; @@ -320,9 +458,9 @@ bool mtpd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t // Handle data block p_mtp->phase = mtpd_handle_data(); if (p_mtp->phase == MTP_PHASE_DATA_IN || p_mtp->phase == MTP_PHASE_RESPONSE) { - TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_in, (uint8_t*) &_mtpd_epbuf.container, (uint16_t)p_container->len)); + TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_in, (uint8_t*) p_container, (uint16_t)p_container->len)); } else if (p_mtp->phase == MTP_PHASE_DATA_OUT) { - TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_out, (uint8_t*) &_mtpd_epbuf.container, CFG_MTP_EP_SIZE), 0); + TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_out, (uint8_t*) p_container, sizeof(mtp_generic_container_t)), 0); p_mtp->xferred_len = 0; p_mtp->xfer_completed = false; } else { @@ -342,7 +480,7 @@ bool mtpd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_out, ((uint8_t *)(&p_container->data)), CFG_MTP_EP_SIZE), 0); } else if (p_mtp->handled_len == 0) { // First data block includes container header + container data - TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_out, (uint8_t*) &_mtpd_epbuf.container + p_mtp->xferred_len, (uint16_t)TU_MIN(p_mtp->total_len - p_mtp->xferred_len, CFG_MTP_EP_SIZE))); + TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_out, (uint8_t*) p_container + p_mtp->xferred_len, (uint16_t)TU_MIN(p_mtp->total_len - p_mtp->xferred_len, CFG_MTP_EP_SIZE))); } else { // Successive data block includes only container data TU_ASSERT(usbd_edpt_xfer(rhport, p_mtp->ep_out, ((uint8_t *)(&p_container->data)) + p_mtp->xferred_len - p_mtp->handled_len, (uint16_t)TU_MIN(p_mtp->total_len - p_mtp->xferred_len, CFG_MTP_EP_SIZE))); @@ -350,6 +488,7 @@ bool mtpd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t } } } +#endif return true; } @@ -446,7 +585,7 @@ mtp_phase_type_t mtpd_handle_cmd_get_device_info(void) TU_VERIFY_STATIC(sizeof(mtp_device_info_t) < MTP_MAX_PACKET_SIZE, "mtp_device_info_t shall fit in MTP_MAX_PACKET_SIZE"); mtp_generic_container_t* p_container = &_mtpd_epbuf.container; - p_container->len = MTP_GENERIC_DATA_BLOCK_LENGTH + sizeof(mtp_device_info_t); + p_container->len = MTP_CONTAINER_HEADER_LENGTH + sizeof(mtp_device_info_t); p_container->type = MTP_CONTAINER_TYPE_DATA_BLOCK; p_container->code = MTP_OP_GET_DEVICE_INFO; mtp_device_info_t *d = (mtp_device_info_t *)p_container->data; @@ -483,7 +622,7 @@ mtp_phase_type_t mtpd_handle_cmd_open_session(void) mtp_response_t res = tud_mtp_storage_open_session(&session_id); if (res == MTP_RESP_SESSION_ALREADY_OPEN) { - p_container->len = MTP_GENERIC_DATA_BLOCK_LENGTH; + p_container->len = MTP_CONTAINER_HEADER_LENGTH; p_container->type = MTP_CONTAINER_TYPE_RESPONSE_BLOCK; p_container->code = res; p_container->len += sizeof(p_container->data[0]); @@ -497,7 +636,7 @@ mtp_phase_type_t mtpd_handle_cmd_open_session(void) _mtpd_itf.context.session_id = session_id; - p_container->len = MTP_GENERIC_DATA_BLOCK_LENGTH; + p_container->len = MTP_CONTAINER_HEADER_LENGTH; p_container->type = MTP_CONTAINER_TYPE_RESPONSE_BLOCK; p_container->code = MTP_RESP_OK; @@ -513,7 +652,7 @@ mtp_phase_type_t mtpd_handle_cmd_close_session(void) _mtpd_itf.context.session_id = session_id; - p_container->len = MTP_GENERIC_DATA_BLOCK_LENGTH; + p_container->len = MTP_CONTAINER_HEADER_LENGTH; p_container->type = MTP_CONTAINER_TYPE_RESPONSE_BLOCK; p_container->code = res; @@ -530,7 +669,7 @@ mtp_phase_type_t mtpd_handle_cmd_get_storage_ids(void) mtp_phase_type_t phase; if ((phase = mtpd_chk_generic(__func__, (res != MTP_RESP_OK), res, "")) != MTP_PHASE_NONE) return phase; - p_container->len = MTP_GENERIC_DATA_BLOCK_LENGTH + sizeof(mtp_storage_ids_t); + p_container->len = MTP_CONTAINER_HEADER_LENGTH + sizeof(mtp_storage_ids_t); p_container->type = MTP_CONTAINER_TYPE_DATA_BLOCK; p_container->code = MTP_OP_GET_STORAGE_IDS; mtp_storage_ids_t *d = (mtp_storage_ids_t *)p_container->data; @@ -556,7 +695,7 @@ mtp_phase_type_t mtpd_handle_cmd_get_storage_info(void) mtp_generic_container_t* p_container = &_mtpd_epbuf.container; uint32_t storage_id = p_container->data[0]; - p_container->len = MTP_GENERIC_DATA_BLOCK_LENGTH + sizeof(mtp_storage_info_t); + p_container->len = MTP_CONTAINER_HEADER_LENGTH + sizeof(mtp_storage_info_t); p_container->type = MTP_CONTAINER_TYPE_DATA_BLOCK; p_container->code = MTP_OP_GET_STORAGE_INFO; @@ -575,7 +714,7 @@ mtp_phase_type_t mtpd_handle_cmd_get_object_handles(void) uint32_t object_format_code = p_container->data[1]; // optional, not managed uint32_t parent_object_handle = p_container->data[2]; // folder specification, 0xffffffff=objects with no parent - p_container->len = MTP_GENERIC_DATA_BLOCK_LENGTH + sizeof(uint32_t); + p_container->len = MTP_CONTAINER_HEADER_LENGTH + sizeof(uint32_t); p_container->type = MTP_CONTAINER_TYPE_DATA_BLOCK; p_container->code = MTP_OP_GET_OBJECT_HANDLES; p_container->data[0] = 0; @@ -607,7 +746,7 @@ mtp_phase_type_t mtpd_handle_cmd_get_object_info(void) mtp_generic_container_t* p_container = &_mtpd_epbuf.container; uint32_t object_handle = p_container->data[0]; - p_container->len = MTP_GENERIC_DATA_BLOCK_LENGTH + sizeof(mtp_object_info_t); + p_container->len = MTP_CONTAINER_HEADER_LENGTH + sizeof(mtp_object_info_t); p_container->type = MTP_CONTAINER_TYPE_DATA_BLOCK; p_container->code = MTP_OP_GET_OBJECT_INFO; mtp_response_t res = tud_mtp_storage_object_read_info(object_handle, (mtp_object_info_t *)p_container->data); @@ -635,7 +774,7 @@ mtp_phase_type_t mtpd_handle_dti_get_object(void) mtp_generic_container_t* p_container = &_mtpd_epbuf.container; res = tud_mtp_storage_object_size(_mtpd_get_object_handle, &file_size); if ((phase = mtpd_chk_generic(__func__, (res != MTP_RESP_OK), res, "")) != MTP_PHASE_NONE) return phase; - p_container->len = MTP_GENERIC_DATA_BLOCK_LENGTH + file_size; + p_container->len = MTP_CONTAINER_HEADER_LENGTH + file_size; p_container->type = MTP_CONTAINER_TYPE_DATA_BLOCK; p_container->code = MTP_OP_GET_OBJECT; @@ -645,10 +784,10 @@ mtp_phase_type_t mtpd_handle_dti_get_object(void) if (_mtpd_itf.handled_len == 0) { // First data block: include container header - buffer_size = ((MTP_MAX_PACKET_SIZE + MTP_GENERIC_DATA_BLOCK_LENGTH) / CFG_MTP_EP_SIZE) * CFG_MTP_EP_SIZE - MTP_GENERIC_DATA_BLOCK_LENGTH; + buffer_size = ((MTP_MAX_PACKET_SIZE + MTP_CONTAINER_HEADER_LENGTH) / CFG_MTP_EP_SIZE) * CFG_MTP_EP_SIZE - MTP_CONTAINER_HEADER_LENGTH; res = tud_mtp_storage_object_read(_mtpd_get_object_handle, (void *)&p_container->data, buffer_size, &read_count); if ((phase = mtpd_chk_generic(__func__, (res != MTP_RESP_OK), res, "")) != MTP_PHASE_NONE) return phase; - _mtpd_itf.queued_len = MTP_GENERIC_DATA_BLOCK_LENGTH + read_count; + _mtpd_itf.queued_len = MTP_CONTAINER_HEADER_LENGTH + read_count; } else { @@ -681,7 +820,7 @@ mtp_phase_type_t mtpd_handle_cmd_delete_object(void) p_container->type = MTP_CONTAINER_TYPE_RESPONSE_BLOCK; p_container->code = MTP_RESP_OK; - p_container->len = MTP_GENERIC_DATA_BLOCK_LENGTH; + p_container->len = MTP_CONTAINER_HEADER_LENGTH; return MTP_PHASE_RESPONSE; } @@ -700,7 +839,7 @@ mtp_phase_type_t mtpd_handle_cmd_get_device_prop_desc(void) TU_VERIFY_STATIC(sizeof(mtp_device_prop_desc_t) < MTP_MAX_PACKET_SIZE, "mtp_device_info_t shall fit in MTP_MAX_PACKET_SIZE"); p_container->type = MTP_CONTAINER_TYPE_DATA_BLOCK; p_container->code = MTP_OP_GET_DEVICE_PROP_DESC; - p_container->len = MTP_GENERIC_DATA_BLOCK_LENGTH + sizeof(mtp_device_prop_desc_t); + p_container->len = MTP_CONTAINER_HEADER_LENGTH + sizeof(mtp_device_prop_desc_t); mtp_device_prop_desc_t *d = (mtp_device_prop_desc_t *)p_container->data; d->device_property_code = (uint16_t)(device_prop_code); d->datatype = MTP_TYPE_STR; @@ -717,7 +856,7 @@ mtp_phase_type_t mtpd_handle_cmd_get_device_prop_desc(void) p_container->type = MTP_CONTAINER_TYPE_RESPONSE_BLOCK; p_container->code = MTP_RESP_PARAMETER_NOT_SUPPORTED; - p_container->len = MTP_GENERIC_DATA_BLOCK_LENGTH; + p_container->len = MTP_CONTAINER_HEADER_LENGTH; return MTP_PHASE_RESPONSE; } @@ -729,7 +868,7 @@ mtp_phase_type_t mtpd_handle_cmd_get_device_prop_value(void) mtp_phase_type_t rt; if ((rt = mtpd_chk_session_open(__func__)) != MTP_PHASE_NONE) return rt; - p_container->len = MTP_GENERIC_DATA_BLOCK_LENGTH; + p_container->len = MTP_CONTAINER_HEADER_LENGTH; p_container->type = MTP_CONTAINER_TYPE_DATA_BLOCK; p_container->code = MTP_OP_GET_DEVICE_PROP_VALUE; @@ -769,7 +908,7 @@ mtp_phase_type_t mtpd_handle_dto_send_object_info(void) _mtpd_soi.object_handle = new_object_handle; // Response - p_container->len = MTP_GENERIC_DATA_BLOCK_LENGTH + 3 * sizeof(uint32_t); + p_container->len = MTP_CONTAINER_HEADER_LENGTH + 3 * sizeof(uint32_t); p_container->type = MTP_CONTAINER_TYPE_RESPONSE_BLOCK; p_container->code = MTP_RESP_OK; p_container->data[0] = _mtpd_soi.storage_id; @@ -792,7 +931,7 @@ mtp_phase_type_t mtpd_handle_dto_send_object(void) // First block of DATA if (_mtpd_itf.handled_len == 0) { - buffer_size -= MTP_GENERIC_DATA_BLOCK_LENGTH; + buffer_size -= MTP_CONTAINER_HEADER_LENGTH; } if (buffer_size > 0) @@ -811,7 +950,7 @@ mtp_phase_type_t mtpd_handle_dto_send_object(void) // Send completed tud_mtp_storage_object_done(); - p_container->len = MTP_GENERIC_DATA_BLOCK_LENGTH; + p_container->len = MTP_CONTAINER_HEADER_LENGTH; p_container->type = MTP_CONTAINER_TYPE_RESPONSE_BLOCK; p_container->code = MTP_RESP_OK; return MTP_PHASE_RESPONSE; @@ -828,7 +967,7 @@ mtp_phase_type_t mtpd_handle_cmd_format_store(void) p_container->type = MTP_CONTAINER_TYPE_RESPONSE_BLOCK; p_container->code = res; - p_container->len = MTP_GENERIC_DATA_BLOCK_LENGTH; + p_container->len = MTP_CONTAINER_HEADER_LENGTH; return MTP_PHASE_RESPONSE; } @@ -844,7 +983,7 @@ mtp_phase_type_t mtpd_chk_session_open(const char *func_name) TU_LOG_DRV(" MTP error: %s session not open\n", func_name); p_container->type = MTP_CONTAINER_TYPE_RESPONSE_BLOCK; p_container->code = MTP_RESP_SESSION_NOT_OPEN; - p_container->len = MTP_GENERIC_DATA_BLOCK_LENGTH; + p_container->len = MTP_CONTAINER_HEADER_LENGTH; return MTP_PHASE_RESPONSE; } return MTP_PHASE_NONE; @@ -860,7 +999,7 @@ mtp_phase_type_t mtpd_chk_generic(const char *func_name, const bool err_cd, cons TU_LOG_DRV(" MTP error in %s: (%x) %s\n", func_name, ret_code, message); p_container->type = MTP_CONTAINER_TYPE_RESPONSE_BLOCK; p_container->code = ret_code; - p_container->len = MTP_GENERIC_DATA_BLOCK_LENGTH; + p_container->len = MTP_CONTAINER_HEADER_LENGTH; return MTP_PHASE_RESPONSE; } return MTP_PHASE_NONE; |
