diff --git a/class/msc/usbh_msc.c b/class/msc/usbh_msc.c index 664177ec..e60185fc 100644 --- a/class/msc/usbh_msc.c +++ b/class/msc/usbh_msc.c @@ -267,7 +267,6 @@ static int usbh_msc_connect(struct usbh_hubport *hport, uint8_t intf) struct usb_endpoint_descriptor *ep_desc; struct usbh_msc_modeswitch_config *config; int ret; - int cnt; struct usbh_msc *msc_class = usbh_msc_class_alloc(); if (msc_class == NULL) { @@ -319,38 +318,6 @@ static int usbh_msc_connect(struct usbh_hubport *hport, uint8_t intf) } } - cnt = 0; - while (usbh_msc_scsi_testunitready(msc_class) < 0) { - USB_LOG_WRN("Device not ready, try again...\r\n"); - ret = usbh_msc_scsi_requestsense(msc_class); - if (ret < 0) { - USB_LOG_ERR("Fail to scsi_testunitready\r\n"); - } - cnt++; - if (cnt > CONFIG_USBHOST_MSC_READY_CHECK_TIMES) { - return -USB_ERR_BUSY; - } - } - - ret = usbh_msc_scsi_inquiry(msc_class); - if (ret < 0) { - USB_LOG_ERR("Fail to scsi_inquiry\r\n"); - return ret; - } - ret = usbh_msc_scsi_readcapacity10(msc_class); - if (ret < 0) { - USB_LOG_ERR("Fail to scsi_readcapacity10\r\n"); - return ret; - } - - if (msc_class->blocksize > 0) { - USB_LOG_INFO("Capacity info:\r\n"); - USB_LOG_INFO("Block num:%d,block size:%d\r\n", (unsigned int)msc_class->blocknum, (unsigned int)msc_class->blocksize); - } else { - USB_LOG_ERR("Invalid block size\r\n"); - return -USB_ERR_RANGE; - } - snprintf(hport->config.intf[intf].devname, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT, msc_class->sdchar); USB_LOG_INFO("Register MSC Class:%s\r\n", hport->config.intf[intf].devname); @@ -385,6 +352,50 @@ static int usbh_msc_disconnect(struct usbh_hubport *hport, uint8_t intf) return ret; } +int usbh_msc_scsi_init(struct usbh_msc *msc_class) +{ + int ret; + uint16_t cnt; + + if (msc_class->is_ready) { + return 0; + } + + cnt = 0; + while (usbh_msc_scsi_testunitready(msc_class) < 0) { + USB_LOG_WRN("Device not ready, try again...\r\n"); + ret = usbh_msc_scsi_requestsense(msc_class); + if (ret < 0) { + USB_LOG_ERR("Fail to scsi_testunitready\r\n"); + } + cnt++; + if (cnt > CONFIG_USBHOST_MSC_READY_CHECK_TIMES) { + return -USB_ERR_NODEV; + } + } + ret = usbh_msc_scsi_inquiry(msc_class); + if (ret < 0) { + USB_LOG_ERR("Fail to scsi_inquiry\r\n"); + return ret; + } + + ret = usbh_msc_scsi_readcapacity10(msc_class); + if (ret < 0) { + USB_LOG_ERR("Fail to scsi_readcapacity10\r\n"); + return ret; + } + + if (msc_class->blocksize > 0) { + USB_LOG_INFO("Capacity info:\r\n"); + USB_LOG_INFO("Block num:%d,block size:%d\r\n", (unsigned int)msc_class->blocknum, (unsigned int)msc_class->blocksize); + } else { + USB_LOG_ERR("Invalid block size\r\n"); + return -USB_ERR_RANGE; + } + msc_class->is_ready = true; + return 0; +} + int usbh_msc_scsi_write10(struct usbh_msc *msc_class, uint32_t start_sector, const uint8_t *buffer, uint32_t nsectors) { struct CBW *cbw; diff --git a/class/msc/usbh_msc.h b/class/msc/usbh_msc.h index 50a61a9c..d194f2d8 100644 --- a/class/msc/usbh_msc.h +++ b/class/msc/usbh_msc.h @@ -20,6 +20,7 @@ struct usbh_msc { uint8_t sdchar; uint32_t blocknum; /* Number of blocks on the USB mass storage device */ uint16_t blocksize; /* Block size of USB mass storage device */ + bool is_ready; void *user_data; }; @@ -32,6 +33,7 @@ struct usbh_msc_modeswitch_config { }; void usbh_msc_modeswitch_enable(struct usbh_msc_modeswitch_config *config); +int usbh_msc_scsi_init(struct usbh_msc *msc_class); int usbh_msc_scsi_write10(struct usbh_msc *msc_class, uint32_t start_sector, const uint8_t *buffer, uint32_t nsectors); int usbh_msc_scsi_read10(struct usbh_msc *msc_class, uint32_t start_sector, const uint8_t *buffer, uint32_t nsectors); diff --git a/demo/usb_host.c b/demo/usb_host.c index 400d9889..c891d67a 100644 --- a/demo/usb_host.c +++ b/demo/usb_host.c @@ -228,7 +228,12 @@ static void usbh_msc_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV) struct usbh_msc *msc_class = (struct usbh_msc *)CONFIG_USB_OSAL_THREAD_GET_ARGV; /* test with only one buffer, if you have more msc class, modify by yourself */ -#if 1 +#if TEST_USBH_MSC_FATFS == 0 + ret = usbh_msc_scsi_init(msc_class); + if (ret < 0) { + USB_LOG_RAW("scsi_init error,ret:%d\r\n", ret); + goto delete; + } /* get the partition table */ ret = usbh_msc_scsi_read10(msc_class, 0, partition_table, 1); if (ret < 0) { @@ -242,11 +247,10 @@ static void usbh_msc_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV) USB_LOG_RAW("%02x ", partition_table[i]); } USB_LOG_RAW("\r\n"); -#endif - -#if TEST_USBH_MSC_FATFS +#else usb_msc_fatfs_test(); #endif + // clang-format off delete: usb_osal_thread_delete(NULL); diff --git a/platform/none/usbh_fatfs.c b/platform/none/usbh_fatfs.c index ba76c12c..5e164a7b 100644 --- a/platform/none/usbh_fatfs.c +++ b/platform/none/usbh_fatfs.c @@ -12,7 +12,7 @@ struct usbh_msc *active_msc_class; int USB_disk_status(void) { - return 0; + return RES_OK; } int USB_disk_initialize(void) @@ -22,6 +22,9 @@ int USB_disk_initialize(void) printf("do not find /dev/sda\r\n"); return RES_NOTRDY; } + if (usbh_msc_scsi_init(active_msc_class) < 0) { + return RES_NOTRDY; + } return RES_OK; } diff --git a/platform/nuttx/usbh_fs.c b/platform/nuttx/usbh_fs.c index 9f0e2b19..bd5afc67 100644 --- a/platform/nuttx/usbh_fs.c +++ b/platform/nuttx/usbh_fs.c @@ -101,11 +101,11 @@ static int usbhost_open(FAR struct inode *inode) DEBUGASSERT(inode->i_private); msc_class = (struct usbh_msc *)inode->i_private; - if (msc_class->hport && msc_class->hport->connected) { - return OK; - } else { + if (usbh_msc_scsi_init(msc_class) < 0) { return -ENODEV; } + + return OK; } static int usbhost_close(FAR struct inode *inode) diff --git a/platform/rtthread/usbh_dfs.c b/platform/rtthread/usbh_dfs.c index 073d52ea..2bee9cf3 100644 --- a/platform/rtthread/usbh_dfs.c +++ b/platform/rtthread/usbh_dfs.c @@ -172,6 +172,12 @@ int udisk_init(struct usbh_msc *msc_class) snprintf(name, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT, msc_class->sdchar); snprintf(mount_point, CONFIG_USBHOST_DEV_NAMELEN, CONFIG_USB_DFS_MOUNT_POINT, msc_class->sdchar); + ret = usbh_msc_scsi_init(msc_class); + if (ret < 0) { + rt_kprintf("scsi_init error,ret:%d\r\n", ret); + rt_free(dev); + return ret; + } ret = usbh_msc_scsi_read10(msc_class, 0, msc_sector, 1); if (ret != RT_EOK) { rt_kprintf("usb mass_storage read failed\n");