summaryrefslogtreecommitdiff
path: root/tinyusb/class/msc_host.c
diff options
context:
space:
mode:
authorhathach <[email protected]>2013-09-22 18:44:55 +0700
committerhathach <[email protected]>2013-09-22 18:44:55 +0700
commitcc91a73cdc8c6f46adfcae38e4c36d819a49ab01 (patch)
tree829f83c189fd25b2eb28374ec4392a1860f2d8ca /tinyusb/class/msc_host.c
parent57088638598ccd0ea185debb8ca0fc7cbb404587 (diff)
fix pingstate for highspeed bulk out transfer
temp implementation of msc host --> can issue inquiry command
Diffstat (limited to 'tinyusb/class/msc_host.c')
-rw-r--r--tinyusb/class/msc_host.c66
1 files changed, 65 insertions, 1 deletions
diff --git a/tinyusb/class/msc_host.c b/tinyusb/class/msc_host.c
index f5c4dbd25..f4d72cf9c 100644
--- a/tinyusb/class/msc_host.c
+++ b/tinyusb/class/msc_host.c
@@ -56,8 +56,12 @@ typedef struct {
uint8_t interface_number;
uint8_t max_lun;
+ uint8_t vendor_id[8];
+ uint8_t product_id[16];
+
msc_cmd_block_wrapper_t cbw;
msc_cmd_status_wrapper_t csw;
+ uint8_t buffer[100];
}msch_interface_t;
STATIC_VAR msch_interface_t msch_data[TUSB_CFG_HOST_DEVICE_MAX] TUSB_CFG_ATTR_USBRAM; // TODO to be static
@@ -70,8 +74,24 @@ STATIC_VAR uint8_t msch_buffer[10] TUSB_CFG_ATTR_USBRAM;
//--------------------------------------------------------------------+
//--------------------------------------------------------------------+
-// IMPLEMENTATION
+// PUBLIC API
//--------------------------------------------------------------------+
+bool tusbh_msc_is_mounted(uint8_t dev_addr)
+{
+ return tusbh_device_is_configured(dev_addr) &&
+ pipehandle_is_valid(msch_data[dev_addr-1].bulk_in) &&
+ pipehandle_is_valid(msch_data[dev_addr-1].bulk_out);
+}
+
+uint8_t const * tusbh_msc_get_vendor_name(uint8_t dev_addr)
+{
+ return tusbh_msc_is_mounted(dev_addr) ? msch_data[dev_addr-1].vendor_id : NULL;
+}
+
+uint8_t const * tusbh_msc_get_product_name(uint8_t dev_addr)
+{
+ return tusbh_msc_is_mounted(dev_addr) ? msch_data[dev_addr-1].product_id : NULL;
+}
//--------------------------------------------------------------------+
// CLASS-USBH API (don't require to verify parameters)
@@ -123,7 +143,37 @@ tusb_error_t msch_open_subtask(uint8_t dev_addr, tusb_descriptor_interface_t con
msch_data[dev_addr-1].max_lun = msch_buffer[0];
//------------- SCSI Inquiry -------------//
+ msch_data[dev_addr-1].cbw = (msc_cmd_block_wrapper_t) {
+ .signature = 0x43425355,
+ .tag = 0xCAFECAFE,
+ .xfer_bytes = sizeof(scsi_inquiry_data_t),
+ .flags = TUSB_DIR_DEV_TO_HOST_MASK,
+ .lun = 0,
+ .cmd_len = sizeof(scsi_inquiry_t),
+ };
+ scsi_inquiry_t cmd_inquiry =
+ {
+ .operation_code = SCSI_CMD_INQUIRY,
+ .alloc_length = sizeof(scsi_inquiry_data_t)
+ };
+ memcpy(msch_data[dev_addr-1].cbw.command, &cmd_inquiry, sizeof(scsi_inquiry_t));
+
+ hcd_pipe_xfer(msch_data[dev_addr-1].bulk_out, &msch_data[dev_addr-1].cbw, sizeof(msc_cmd_block_wrapper_t), false);
+ hcd_pipe_xfer(msch_data[dev_addr-1].bulk_in , msch_data[dev_addr-1].buffer, sizeof(scsi_inquiry_data_t), false);
+ hcd_pipe_xfer(msch_data[dev_addr-1].bulk_in , &msch_data[dev_addr-1].csw, sizeof(msc_cmd_status_wrapper_t), true);
+
+ // TODO timeout required, a proper synchronization
+// while( !hcd_pipe_is_idle(msch_data[dev_addr-1].bulk_in) )
+ {
+ osal_task_delay(2);
+ }
+ memcpy(msch_data[dev_addr-1].vendor_id,
+ ((scsi_inquiry_data_t*)msch_data[dev_addr-1].buffer)->vendor_id,
+ 8);
+ memcpy(msch_data[dev_addr-1].product_id,
+ ((scsi_inquiry_data_t*)msch_data[dev_addr-1].buffer)->product_id,
+ 16);
tusbh_msc_mounted_cb(dev_addr);
@@ -145,5 +195,19 @@ void msch_close(uint8_t dev_addr)
memclr_(&msch_data[dev_addr-1], sizeof(msch_interface_t));
}
+//--------------------------------------------------------------------+
+// INTERNAL & HELPER
+//--------------------------------------------------------------------+
+//static tusb_error_t scsi_command_send(msc_cmd_block_wrapper_t const * cbw, uint8_t * buffer, msc_cmd_status_wrapper_t const * csw)
+//{
+// tusb_error_t error;
+//
+// OSAL_SUBTASK_BEGIN
+//
+// hcd_pipe_xfer()
+//
+// OSAL_SUBTASK_END
+//}
+
#endif