refractor hcd API to allow queue xfer without actually transferring data
This commit is contained in:
parent
a8a10e8650
commit
85f3ad9d3b
|
@ -175,8 +175,8 @@ static tusb_error_t scsi_command_send(msch_interface_t * p_msch, scsi_cmd_type_t
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT_STATUS( hcd_pipe_xfer(p_msch->bulk_out, (uint8_t*) &p_msch->cbw, sizeof(msc_cmd_block_wrapper_t), false) );
|
ASSERT_STATUS( hcd_pipe_xfer(p_msch->bulk_out, (uint8_t*) &p_msch->cbw, sizeof(msc_cmd_block_wrapper_t), false) );
|
||||||
ASSERT_STATUS( hcd_pipe_xfer(p_msch->bulk_in , p_msch->buffer, p_msch->cbw.xfer_bytes, false) );
|
ASSERT_STATUS( hcd_pipe_queue_xfer(p_msch->bulk_in , p_msch->buffer, p_msch->cbw.xfer_bytes) );
|
||||||
//ASSERT_STATUS( hcd_pipe_xfer(p_msch->bulk_in , &p_msch->csw, sizeof(msc_cmd_status_wrapper_t), true) );
|
ASSERT_STATUS( hcd_pipe_xfer(p_msch->bulk_in , &p_msch->csw, sizeof(msc_cmd_status_wrapper_t), true) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void msch_init(void)
|
void msch_init(void)
|
||||||
|
@ -241,10 +241,7 @@ tusb_error_t msch_open_subtask(uint8_t dev_addr, tusb_descriptor_interface_t con
|
||||||
|
|
||||||
//------------- SCSI Inquiry -------------//
|
//------------- SCSI Inquiry -------------//
|
||||||
scsi_command_send(&msch_data[dev_addr-1], SCSI_CMD_INQUIRY, 0);
|
scsi_command_send(&msch_data[dev_addr-1], SCSI_CMD_INQUIRY, 0);
|
||||||
osal_task_delay(5);
|
osal_task_delay(2);
|
||||||
ASSERT_STATUS( hcd_pipe_xfer(msch_data[dev_addr-1].bulk_in , (uint8_t*) &msch_data[dev_addr-1].csw, sizeof(msc_cmd_status_wrapper_t), true) );
|
|
||||||
osal_task_delay(5);
|
|
||||||
// check csw
|
|
||||||
|
|
||||||
memcpy(msch_data[dev_addr-1].vendor_id,
|
memcpy(msch_data[dev_addr-1].vendor_id,
|
||||||
((scsi_inquiry_data_t*)msch_data[dev_addr-1].buffer)->vendor_id,
|
((scsi_inquiry_data_t*)msch_data[dev_addr-1].buffer)->vendor_id,
|
||||||
|
@ -256,17 +253,12 @@ tusb_error_t msch_open_subtask(uint8_t dev_addr, tusb_descriptor_interface_t con
|
||||||
#if 0
|
#if 0
|
||||||
//------------- SCSI Request Sense -------------//
|
//------------- SCSI Request Sense -------------//
|
||||||
scsi_command_send(&msch_data[dev_addr-1], SCSI_CMD_REQUEST_SENSE, 0);
|
scsi_command_send(&msch_data[dev_addr-1], SCSI_CMD_REQUEST_SENSE, 0);
|
||||||
osal_task_delay(5);
|
osal_task_delay(2);
|
||||||
ASSERT_STATUS( hcd_pipe_xfer(msch_data[dev_addr-1].bulk_in , (uint8_t*) &msch_data[dev_addr-1].csw, sizeof(msc_cmd_status_wrapper_t), true) );
|
|
||||||
osal_task_delay(5);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//------------- SCSI Read Capacity 10 -------------//
|
//------------- SCSI Read Capacity 10 -------------//
|
||||||
scsi_command_send(&msch_data[dev_addr-1], SCSI_CMD_READ_CAPACITY_10, 0);
|
scsi_command_send(&msch_data[dev_addr-1], SCSI_CMD_READ_CAPACITY_10, 0);
|
||||||
osal_task_delay(5);
|
osal_task_delay(2);
|
||||||
ASSERT_STATUS( hcd_pipe_xfer(msch_data[dev_addr-1].bulk_in , (uint8_t*) &msch_data[dev_addr-1].csw, sizeof(msc_cmd_status_wrapper_t), true) );
|
|
||||||
osal_task_delay(5);
|
|
||||||
// check csw
|
|
||||||
|
|
||||||
msch_data[dev_addr-1].last_lba = __be2le( ((scsi_read_capacity10_data_t*)msch_data[dev_addr-1].buffer)->last_lba );
|
msch_data[dev_addr-1].last_lba = __be2le( ((scsi_read_capacity10_data_t*)msch_data[dev_addr-1].buffer)->last_lba );
|
||||||
msch_data[dev_addr-1].block_size = (uint16_t) __be2le( ((scsi_read_capacity10_data_t*)msch_data[dev_addr-1].buffer)->block_size );
|
msch_data[dev_addr-1].block_size = (uint16_t) __be2le( ((scsi_read_capacity10_data_t*)msch_data[dev_addr-1].buffer)->block_size );
|
||||||
|
|
|
@ -402,7 +402,7 @@ pipe_handle_t hcd_pipe_open(uint8_t dev_addr, tusb_descriptor_endpoint_t const *
|
||||||
return (pipe_handle_t) { .dev_addr = dev_addr, .xfer_type = p_endpoint_desc->bmAttributes.xfer, .index = qhd_get_index(p_qhd) };
|
return (pipe_handle_t) { .dev_addr = dev_addr, .xfer_type = p_endpoint_desc->bmAttributes.xfer, .index = qhd_get_index(p_qhd) };
|
||||||
}
|
}
|
||||||
|
|
||||||
tusb_error_t hcd_pipe_xfer(pipe_handle_t pipe_hdl, uint8_t buffer[], uint16_t total_bytes, bool int_on_complete)
|
tusb_error_t hcd_pipe_queue_xfer(pipe_handle_t pipe_hdl, uint8_t buffer[], uint16_t total_bytes)
|
||||||
{
|
{
|
||||||
//------------- TODO pipe handle validate -------------//
|
//------------- TODO pipe handle validate -------------//
|
||||||
|
|
||||||
|
@ -414,7 +414,6 @@ tusb_error_t hcd_pipe_xfer(pipe_handle_t pipe_hdl, uint8_t buffer[], uint16_t t
|
||||||
|
|
||||||
qtd_init(p_qtd, (uint32_t) buffer, total_bytes);
|
qtd_init(p_qtd, (uint32_t) buffer, total_bytes);
|
||||||
p_qtd->pid = p_qhd->pid_non_control;
|
p_qtd->pid = p_qhd->pid_non_control;
|
||||||
p_qtd->int_on_complete = int_on_complete ? 1 : 0;
|
|
||||||
|
|
||||||
//------------- insert TD to TD list -------------//
|
//------------- insert TD to TD list -------------//
|
||||||
qtd_insert_to_qhd(p_qhd, p_qtd);
|
qtd_insert_to_qhd(p_qhd, p_qtd);
|
||||||
|
@ -422,6 +421,21 @@ tusb_error_t hcd_pipe_xfer(pipe_handle_t pipe_hdl, uint8_t buffer[], uint16_t t
|
||||||
return TUSB_ERROR_NONE;
|
return TUSB_ERROR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tusb_error_t hcd_pipe_xfer(pipe_handle_t pipe_hdl, uint8_t buffer[], uint16_t total_bytes, bool int_on_complete)
|
||||||
|
{
|
||||||
|
hcd_pipe_queue_xfer(pipe_hdl, buffer, total_bytes);
|
||||||
|
|
||||||
|
ehci_qhd_t *p_qhd = qhd_get_from_pipe_handle(pipe_hdl);
|
||||||
|
|
||||||
|
if ( int_on_complete )
|
||||||
|
{ // the just added qtd is pointed by list_tail
|
||||||
|
p_qhd->p_qtd_list_tail->int_on_complete = 1;
|
||||||
|
}
|
||||||
|
p_qhd->qtd_overlay.next.address = (uint32_t) p_qhd->p_qtd_list_head; // attach to queue head to start transferring
|
||||||
|
|
||||||
|
return TUSB_ERROR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
/// pipe_close should only be called as a part of unmount/safe-remove process
|
/// pipe_close should only be called as a part of unmount/safe-remove process
|
||||||
tusb_error_t hcd_pipe_close(pipe_handle_t pipe_hdl)
|
tusb_error_t hcd_pipe_close(pipe_handle_t pipe_hdl)
|
||||||
{
|
{
|
||||||
|
@ -882,7 +896,6 @@ static inline void qtd_insert_to_qhd(ehci_qhd_t *p_qhd, ehci_qtd_t *p_qtd_new)
|
||||||
if (p_qhd->p_qtd_list_head == NULL) // empty list
|
if (p_qhd->p_qtd_list_head == NULL) // empty list
|
||||||
{
|
{
|
||||||
p_qhd->p_qtd_list_head = p_qhd->p_qtd_list_tail = p_qtd_new;
|
p_qhd->p_qtd_list_head = p_qhd->p_qtd_list_tail = p_qtd_new;
|
||||||
p_qhd->qtd_overlay.next.address = (uint32_t) p_qtd_new;
|
|
||||||
}else
|
}else
|
||||||
{
|
{
|
||||||
p_qhd->p_qtd_list_tail->next.address = (uint32_t) p_qtd_new;
|
p_qhd->p_qtd_list_tail->next.address = (uint32_t) p_qtd_new;
|
||||||
|
|
|
@ -95,6 +95,7 @@ tusb_error_t hcd_pipe_control_xfer(uint8_t dev_addr, tusb_control_request_t con
|
||||||
tusb_error_t hcd_pipe_control_close(uint8_t dev_addr) ATTR_WARN_UNUSED_RESULT;
|
tusb_error_t hcd_pipe_control_close(uint8_t dev_addr) ATTR_WARN_UNUSED_RESULT;
|
||||||
|
|
||||||
pipe_handle_t hcd_pipe_open(uint8_t dev_addr, tusb_descriptor_endpoint_t const * endpoint_desc, uint8_t class_code) ATTR_WARN_UNUSED_RESULT;
|
pipe_handle_t hcd_pipe_open(uint8_t dev_addr, tusb_descriptor_endpoint_t const * endpoint_desc, uint8_t class_code) ATTR_WARN_UNUSED_RESULT;
|
||||||
|
tusb_error_t hcd_pipe_queue_xfer(pipe_handle_t pipe_hdl, uint8_t buffer[], uint16_t total_bytes) ATTR_WARN_UNUSED_RESULT; // only queue, not transferring yet
|
||||||
tusb_error_t hcd_pipe_xfer(pipe_handle_t pipe_hdl, uint8_t buffer[], uint16_t total_bytes, bool int_on_complete) ATTR_WARN_UNUSED_RESULT;
|
tusb_error_t hcd_pipe_xfer(pipe_handle_t pipe_hdl, uint8_t buffer[], uint16_t total_bytes, bool int_on_complete) ATTR_WARN_UNUSED_RESULT;
|
||||||
tusb_error_t hcd_pipe_close(pipe_handle_t pipe_hdl) /*ATTR_WARN_UNUSED_RESULT*/;
|
tusb_error_t hcd_pipe_close(pipe_handle_t pipe_hdl) /*ATTR_WARN_UNUSED_RESULT*/;
|
||||||
bool hcd_pipe_is_idle(pipe_handle_t pipe_hdl);
|
bool hcd_pipe_is_idle(pipe_handle_t pipe_hdl);
|
||||||
|
|
Loading…
Reference in New Issue