Skip to content

Commit

Permalink
update(class/msc/usbh_msc): move msc scsi commands out to prevent blo…
Browse files Browse the repository at this point in the history
…cking enum thread

Signed-off-by: sakumisu <1203593632@qq.com>
  • Loading branch information
sakumisu committed Jan 25, 2025
1 parent 49d9775 commit b6ec680
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 41 deletions.
77 changes: 44 additions & 33 deletions class/msc/usbh_msc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions class/msc/usbh_msc.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};
Expand All @@ -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);

Expand Down
12 changes: 8 additions & 4 deletions demo/usb_host.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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);
Expand Down
5 changes: 4 additions & 1 deletion platform/none/usbh_fatfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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;
}

Expand Down
6 changes: 3 additions & 3 deletions platform/nuttx/usbh_fs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
6 changes: 6 additions & 0 deletions platform/rtthread/usbh_dfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down

0 comments on commit b6ec680

Please sign in to comment.