summaryrefslogtreecommitdiff
path: root/class
diff options
context:
space:
mode:
authorsakimisu <[email protected]>2023-08-27 14:19:50 +0800
committersakumisu <[email protected]>2023-08-29 14:40:03 +0800
commit14f5dd2dd3dcffa9caa1d4b9382f79be7919243c (patch)
tree5a0bf75fcf907adddc45ecc6f33150c9d1538c7e /class
parent9029f8c5b19ba6af8132d1808a71ac3f8350c6c1 (diff)
implement msc device thread,remove other unused os thread
Diffstat (limited to 'class')
-rw-r--r--class/msc/usbd_msc.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/class/msc/usbd_msc.c b/class/msc/usbd_msc.c
index eec6218c..d6955219 100644
--- a/class/msc/usbd_msc.c
+++ b/class/msc/usbd_msc.c
@@ -6,6 +6,9 @@
#include "usbd_core.h"
#include "usbd_msc.h"
#include "usb_scsi.h"
+#if defined(CONFIG_USBDEV_MSC_THREAD)
+#include "usb_osal.h"
+#endif
#define MSD_OUT_EP_IDX 0
#define MSD_IN_EP_IDX 1
@@ -41,6 +44,12 @@ USB_NOCACHE_RAM_SECTION struct usbd_msc_priv {
uint32_t scsi_blk_nbr;
USB_MEM_ALIGNX uint8_t block_buffer[CONFIG_USBDEV_MSC_BLOCK_SIZE];
+
+#if defined(CONFIG_USBDEV_MSC_THREAD)
+ usb_osal_mq_t usbd_msc_mq;
+ usb_osal_thread_t usbd_msc_thread;
+ uint32_t nbytes;
+#endif
} g_usbd_msc;
static void usbd_msc_reset(void)
@@ -481,7 +490,12 @@ static bool SCSI_read10(uint8_t **data, uint32_t *len)
return false;
}
g_usbd_msc.stage = MSC_DATA_IN;
+#ifdef CONFIG_USBDEV_MSC_THREAD
+ usb_osal_mq_send(g_usbd_msc.usbd_msc_mq, MSC_DATA_IN);
+ return true;
+#else
return SCSI_processRead();
+#endif
}
static bool SCSI_read12(uint8_t **data, uint32_t *len)
@@ -508,7 +522,12 @@ static bool SCSI_read12(uint8_t **data, uint32_t *len)
return false;
}
g_usbd_msc.stage = MSC_DATA_IN;
+#ifdef CONFIG_USBDEV_MSC_THREAD
+ usb_osal_mq_send(g_usbd_msc.usbd_msc_mq, MSC_DATA_IN);
+ return true;
+#else
return SCSI_processRead();
+#endif
}
static bool SCSI_write10(uint8_t **data, uint32_t *len)
@@ -764,9 +783,14 @@ void mass_storage_bulk_out(uint8_t ep, uint32_t nbytes)
switch (g_usbd_msc.cbw.CB[0]) {
case SCSI_CMD_WRITE10:
case SCSI_CMD_WRITE12:
+#ifdef CONFIG_USBDEV_MSC_THREAD
+ g_usbd_msc.nbytes = nbytes;
+ usb_osal_mq_send(g_usbd_msc.usbd_msc_mq, MSC_DATA_OUT);
+#else
if (SCSI_processWrite(nbytes) == false) {
usbd_msc_send_csw(CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/
}
+#endif
break;
default:
break;
@@ -784,10 +808,14 @@ void mass_storage_bulk_in(uint8_t ep, uint32_t nbytes)
switch (g_usbd_msc.cbw.CB[0]) {
case SCSI_CMD_READ10:
case SCSI_CMD_READ12:
+#ifdef CONFIG_USBDEV_MSC_THREAD
+ usb_osal_mq_send(g_usbd_msc.usbd_msc_mq, MSC_DATA_IN);
+#else
if (SCSI_processRead() == false) {
usbd_msc_send_csw(CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/
return;
}
+#endif
break;
default:
break;
@@ -810,6 +838,32 @@ void mass_storage_bulk_in(uint8_t ep, uint32_t nbytes)
}
}
+#ifdef CONFIG_USBDEV_MSC_THREAD
+static void usbdev_msc_thread(void *argument)
+{
+ uintptr_t event;
+ int ret;
+
+ while (1) {
+ ret = usb_osal_mq_recv(g_usbd_msc.usbd_msc_mq, (uintptr_t *)&event, 0xffffffff);
+ if (ret < 0) {
+ continue;
+ }
+ USB_LOG_DBG("%d\r\n", event);
+ if (event == MSC_DATA_OUT) {
+ if (SCSI_processWrite(g_usbd_msc.nbytes) == false) {
+ usbd_msc_send_csw(CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/
+ }
+ } else if (event == MSC_DATA_IN) {
+ if (SCSI_processRead() == false) {
+ usbd_msc_send_csw(CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/
+ }
+ } else {
+ }
+ }
+}
+#endif
+
struct usbd_interface *usbd_msc_init_intf(struct usbd_interface *intf, const uint8_t out_ep, const uint8_t in_ep)
{
intf->class_interface_handler = msc_storage_class_interface_request_handler;
@@ -834,6 +888,16 @@ struct usbd_interface *usbd_msc_init_intf(struct usbd_interface *intf, const uin
return NULL;
}
+#ifdef CONFIG_USBDEV_MSC_THREAD
+ g_usbd_msc.usbd_msc_mq = usb_osal_mq_create(1);
+ if (g_usbd_msc.usbd_msc_mq == NULL) {
+ return NULL;
+ }
+ g_usbd_msc.usbd_msc_thread = usb_osal_thread_create("usbd_msc", CONFIG_USBDEV_MSC_STACKSIZE, CONFIG_USBDEV_MSC_PRIO, usbdev_msc_thread, NULL);
+ if (g_usbd_msc.usbd_msc_thread == NULL) {
+ return NULL;
+ }
+#endif
return intf;
}