mirror of
https://github.com/sakumisu/CherryUSB.git
synced 2025-05-08 16:18:44 +08:00
update(class/msc/usbh_msc): move msc scsi commands out to prevent blocking enum thread
Signed-off-by: sakumisu <1203593632@qq.com>
This commit is contained in:
parent
49d9775a1b
commit
c827c2e50b
@ -267,7 +267,6 @@ static int usbh_msc_connect(struct usbh_hubport *hport, uint8_t intf)
|
|||||||
struct usb_endpoint_descriptor *ep_desc;
|
struct usb_endpoint_descriptor *ep_desc;
|
||||||
struct usbh_msc_modeswitch_config *config;
|
struct usbh_msc_modeswitch_config *config;
|
||||||
int ret;
|
int ret;
|
||||||
int cnt;
|
|
||||||
|
|
||||||
struct usbh_msc *msc_class = usbh_msc_class_alloc();
|
struct usbh_msc *msc_class = usbh_msc_class_alloc();
|
||||||
if (msc_class == NULL) {
|
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);
|
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);
|
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;
|
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)
|
int usbh_msc_scsi_write10(struct usbh_msc *msc_class, uint32_t start_sector, const uint8_t *buffer, uint32_t nsectors)
|
||||||
{
|
{
|
||||||
struct CBW *cbw;
|
struct CBW *cbw;
|
||||||
|
@ -32,6 +32,7 @@ struct usbh_msc_modeswitch_config {
|
|||||||
};
|
};
|
||||||
|
|
||||||
void usbh_msc_modeswitch_enable(struct usbh_msc_modeswitch_config *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_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);
|
int usbh_msc_scsi_read10(struct usbh_msc *msc_class, uint32_t start_sector, const uint8_t *buffer, uint32_t nsectors);
|
||||||
|
|
||||||
|
@ -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;
|
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 */
|
/* 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 */
|
/* get the partition table */
|
||||||
ret = usbh_msc_scsi_read10(msc_class, 0, partition_table, 1);
|
ret = usbh_msc_scsi_read10(msc_class, 0, partition_table, 1);
|
||||||
if (ret < 0) {
|
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("%02x ", partition_table[i]);
|
||||||
}
|
}
|
||||||
USB_LOG_RAW("\r\n");
|
USB_LOG_RAW("\r\n");
|
||||||
#endif
|
#else
|
||||||
|
|
||||||
#if TEST_USBH_MSC_FATFS
|
|
||||||
usb_msc_fatfs_test();
|
usb_msc_fatfs_test();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
delete:
|
delete:
|
||||||
usb_osal_thread_delete(NULL);
|
usb_osal_thread_delete(NULL);
|
||||||
|
@ -12,7 +12,7 @@ struct usbh_msc *active_msc_class;
|
|||||||
|
|
||||||
int USB_disk_status(void)
|
int USB_disk_status(void)
|
||||||
{
|
{
|
||||||
return 0;
|
return RES_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int USB_disk_initialize(void)
|
int USB_disk_initialize(void)
|
||||||
@ -22,6 +22,9 @@ int USB_disk_initialize(void)
|
|||||||
printf("do not find /dev/sda\r\n");
|
printf("do not find /dev/sda\r\n");
|
||||||
return RES_NOTRDY;
|
return RES_NOTRDY;
|
||||||
}
|
}
|
||||||
|
if (usbh_msc_scsi_init(active_msc_class) < 0) {
|
||||||
|
return RES_NOTRDY;
|
||||||
|
}
|
||||||
return RES_OK;
|
return RES_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,11 +101,11 @@ static int usbhost_open(FAR struct inode *inode)
|
|||||||
DEBUGASSERT(inode->i_private);
|
DEBUGASSERT(inode->i_private);
|
||||||
msc_class = (struct usbh_msc *)inode->i_private;
|
msc_class = (struct usbh_msc *)inode->i_private;
|
||||||
|
|
||||||
if (msc_class->hport && msc_class->hport->connected) {
|
if (usbh_msc_scsi_init(msc_class) < 0) {
|
||||||
return OK;
|
|
||||||
} else {
|
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int usbhost_close(FAR struct inode *inode)
|
static int usbhost_close(FAR struct inode *inode)
|
||||||
|
@ -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)
|
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;
|
return RT_EOK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -161,7 +168,6 @@ int udisk_init(struct usbh_msc *msc_class)
|
|||||||
{
|
{
|
||||||
rt_err_t ret = 0;
|
rt_err_t ret = 0;
|
||||||
rt_uint8_t i;
|
rt_uint8_t i;
|
||||||
struct dfs_partition part0;
|
|
||||||
struct rt_device *dev;
|
struct rt_device *dev;
|
||||||
char name[CONFIG_USBHOST_DEV_NAMELEN];
|
char name[CONFIG_USBHOST_DEV_NAMELEN];
|
||||||
char mount_point[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(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);
|
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;
|
dev->type = RT_Device_Class_Block;
|
||||||
#ifdef RT_USING_DEVICE_OPS
|
#ifdef RT_USING_DEVICE_OPS
|
||||||
dev->ops = &udisk_device_ops;
|
dev->ops = &udisk_device_ops;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user