diff options
| author | sakimisu <[email protected]> | 2023-08-27 14:19:50 +0800 |
|---|---|---|
| committer | sakumisu <[email protected]> | 2023-08-29 14:40:03 +0800 |
| commit | 14f5dd2dd3dcffa9caa1d4b9382f79be7919243c (patch) | |
| tree | 5a0bf75fcf907adddc45ecc6f33150c9d1538c7e /class | |
| parent | 9029f8c5b19ba6af8132d1808a71ac3f8350c6c1 (diff) | |
implement msc device thread,remove other unused os thread
Diffstat (limited to 'class')
| -rw-r--r-- | class/msc/usbd_msc.c | 64 |
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; } |
