Browse Source

update(class/msc/usbh_msc): move msc scsi commands out to prevent blocking enum thread

Signed-off-by: sakumisu <1203593632@qq.com>
sakumisu 11 months ago
parent
commit
c827c2e50b

+ 40 - 33
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,46 @@ 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;
+
+    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;
+    }
+
+    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;

+ 1 - 0
class/msc/usbh_msc.h

@@ -32,6 +32,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);
 

+ 8 - 4
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);

+ 4 - 1
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;
 }
 

+ 3 - 3
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)

+ 7 - 20
platform/rtthread/usbh_dfs.c

@@ -42,6 +42,13 @@ USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t msc_sector[512];
 
 static rt_err_t rt_udisk_init(rt_device_t dev)
 {
+    struct usbh_msc *msc_class = (struct usbh_msc *)dev->user_data;
+
+    if (usbh_msc_scsi_init(msc_class) < 0) {
+        rt_kprintf("scsi_init error,ret:%d\r\n", ret);
+        return -RT_ERROR;
+    }
+
     return RT_EOK;
 }
 
@@ -161,7 +168,6 @@ int udisk_init(struct usbh_msc *msc_class)
 {
     rt_err_t ret = 0;
     rt_uint8_t i;
-    struct dfs_partition part0;
     struct rt_device *dev;
     char name[CONFIG_USBHOST_DEV_NAMELEN];
     char mount_point[CONFIG_USBHOST_DEV_NAMELEN];
@@ -172,25 +178,6 @@ 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_read10(msc_class, 0, msc_sector, 1);
-    if (ret != RT_EOK) {
-        rt_kprintf("usb mass_storage read failed\n");
-        rt_free(dev);
-        return ret;
-    }
-
-    for (i = 0; i < 4; i++) {
-        /* Get the first partition */
-        ret = dfs_filesystem_get_partition(&part0, msc_sector, i);
-        if (ret == RT_EOK) {
-            rt_kprintf("Found partition %d: type = %d, offet=0x%x, size=0x%x\n",
-                       i, part0.type, part0.offset, part0.size);
-            break;
-        } else {
-            break;
-        }
-    }
-
     dev->type = RT_Device_Class_Block;
 #ifdef RT_USING_DEVICE_OPS
     dev->ops = &udisk_device_ops;