Fix sending in data that is a multiple of the max packet size.
This commit is contained in:
parent
18adbb523c
commit
96833322de
1 changed files with 32 additions and 25 deletions
61
src/main.c
61
src/main.c
|
|
@ -819,6 +819,7 @@ DECLARE_CALLBACK(get_object);
|
|||
DECLARE_CALLBACK(send_object_info);
|
||||
DECLARE_CALLBACK(send_object_container);
|
||||
DECLARE_CALLBACK(send_object);
|
||||
DECLARE_CALLBACK(zlp_data_in);
|
||||
DECLARE_CALLBACK(final_data_in);
|
||||
DECLARE_CALLBACK(response);
|
||||
DECLARE_CALLBACK(event);
|
||||
|
|
@ -955,33 +956,6 @@ static usb_error_t schedule_ok_response(
|
|||
params, param_count, global);
|
||||
}
|
||||
|
||||
static usb_error_t schedule_data_in_response(
|
||||
usb_endpoint_t endpoint,
|
||||
const void *data,
|
||||
size_t data_size,
|
||||
mtp_global_t *global) {
|
||||
usb_error_t error;
|
||||
global->transaction.container.length.size =
|
||||
sizeof(mtp_container_t) +
|
||||
data_size;
|
||||
global->transaction.container.type =
|
||||
MTP_BT_DATA;
|
||||
error = usb_ScheduleBulkTransfer(
|
||||
endpoint = get_endpoint(
|
||||
endpoint, MTP_EP_DATA_IN),
|
||||
&global->transaction,
|
||||
sizeof(mtp_container_t),
|
||||
NULL,
|
||||
global);
|
||||
if (error) return error;
|
||||
return usb_ScheduleBulkTransfer(
|
||||
endpoint,
|
||||
(void *)data,
|
||||
data_size,
|
||||
final_data_in_complete,
|
||||
global);
|
||||
}
|
||||
|
||||
static usb_error_t schedule_data_in(
|
||||
usb_endpoint_t endpoint,
|
||||
size_t data_size,
|
||||
|
|
@ -1001,6 +975,27 @@ static usb_error_t schedule_data_in(
|
|||
global);
|
||||
}
|
||||
|
||||
static usb_error_t schedule_data_in_response(
|
||||
usb_endpoint_t endpoint,
|
||||
const void *data,
|
||||
size_t data_size,
|
||||
mtp_global_t *global) {
|
||||
usb_error_t error = schedule_data_in(
|
||||
endpoint, data_size, NULL, global);
|
||||
if (error == USB_SUCCESS)
|
||||
error = usb_ScheduleBulkTransfer(
|
||||
get_endpoint(endpoint,
|
||||
MTP_EP_DATA_IN),
|
||||
(void *)data,
|
||||
data_size,
|
||||
data_size &&
|
||||
!(data_size % MTP_MAX_BULK_PKT_SZ)
|
||||
? zlp_data_in_complete
|
||||
: final_data_in_complete,
|
||||
global);
|
||||
return error;
|
||||
}
|
||||
|
||||
static usb_error_t status_error(
|
||||
usb_transfer_status_t status) {
|
||||
printf("transfer status = %02X\n", status);
|
||||
|
|
@ -2144,6 +2139,18 @@ DEFINE_CALLBACK(send_object) {
|
|||
endpoint, response, NULL, 0, global);
|
||||
}
|
||||
|
||||
DEFINE_CALLBACK(zlp_data_in) {
|
||||
(void)transferred;
|
||||
if (status != USB_TRANSFER_COMPLETED)
|
||||
return status_error(status);
|
||||
if (global->reset)
|
||||
return schedule_command(endpoint, global);
|
||||
return usb_ScheduleBulkTransfer(
|
||||
endpoint, NULL, 0,
|
||||
final_data_in_complete,
|
||||
global);
|
||||
}
|
||||
|
||||
DEFINE_CALLBACK(final_data_in) {
|
||||
(void)transferred;
|
||||
if (status != USB_TRANSFER_COMPLETED)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue