From 14f5dd2dd3dcffa9caa1d4b9382f79be7919243c Mon Sep 17 00:00:00 2001 From: sakimisu <1203593632@qq.com> Date: Sun, 27 Aug 2023 14:19:50 +0800 Subject: [PATCH] implement msc device thread,remove other unused os thread --- cherryusb_config_template.h | 31 +++++--------- class/msc/usbd_msc.c | 64 +++++++++++++++++++++++++++++ core/usbd_core.c | 82 ------------------------------------- 3 files changed, 74 insertions(+), 103 deletions(-) diff --git a/cherryusb_config_template.h b/cherryusb_config_template.h index 2228e2a0..2f31bdd0 100644 --- a/cherryusb_config_template.h +++ b/cherryusb_config_template.h @@ -44,27 +44,6 @@ /* Enable test mode */ // #define CONFIG_USBDEV_TEST_MODE -//#define CONFIG_USBDEV_TX_THREAD -//#define CONFIG_USBDEV_RX_THREAD - -#ifdef CONFIG_USBDEV_TX_THREAD -#ifndef CONFIG_USBDEV_TX_PRIO -#define CONFIG_USBDEV_TX_PRIO 4 -#endif -#ifndef CONFIG_USBDEV_TX_STACKSIZE -#define CONFIG_USBDEV_TX_STACKSIZE 2048 -#endif -#endif - -#ifdef CONFIG_USBDEV_RX_THREAD -#ifndef CONFIG_USBDEV_RX_PRIO -#define CONFIG_USBDEV_RX_PRIO 4 -#endif -#ifndef CONFIG_USBDEV_RX_STACKSIZE -#define CONFIG_USBDEV_RX_STACKSIZE 2048 -#endif -#endif - #ifndef CONFIG_USBDEV_MSC_BLOCK_SIZE #define CONFIG_USBDEV_MSC_BLOCK_SIZE 512 #endif @@ -81,6 +60,16 @@ #define CONFIG_USBDEV_MSC_VERSION_STRING "0.01" #endif +// #define CONFIG_USBDEV_MSC_THREAD + +#ifndef CONFIG_USBDEV_MSC_PRIO +#define CONFIG_USBDEV_MSC_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_MSC_STACKSIZE +#define CONFIG_USBDEV_MSC_STACKSIZE 2048 +#endif + #ifndef CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE #define CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156 #endif 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; } diff --git a/core/usbd_core.c b/core/usbd_core.c index 9e8d00aa..b30c8070 100644 --- a/core/usbd_core.c +++ b/core/usbd_core.c @@ -6,9 +6,6 @@ * SPDX-License-Identifier: Apache-2.0 */ #include "usbd_core.h" -#if defined(CONFIG_USBDEV_TX_THREAD) || defined(CONFIG_USBDEV_RX_THREAD) -#include "usb_osal.h" -#endif /* general descriptor field offsets */ #define DESC_bLength 0 /** Length offset */ @@ -68,15 +65,6 @@ USB_NOCACHE_RAM_SECTION struct usbd_core_priv { struct usbd_tx_rx_msg rx_msg[USB_EP_OUT_NUM]; } g_usbd_core; -#if defined(CONFIG_USBDEV_TX_THREAD) -usb_osal_mq_t usbd_tx_mq; -usb_osal_thread_t usbd_tx_thread; -#endif -#if defined(CONFIG_USBDEV_RX_THREAD) -usb_osal_mq_t usbd_rx_mq; -usb_osal_thread_t usbd_rx_thread; -#endif - static void usbd_class_event_notify_handler(uint8_t event, void *arg); static void usbd_print_setup(struct usb_setup_packet *setup) @@ -1140,66 +1128,18 @@ void usbd_event_ep0_out_complete_handler(uint8_t ep, uint32_t nbytes) void usbd_event_ep_in_complete_handler(uint8_t ep, uint32_t nbytes) { -#ifndef CONFIG_USBDEV_TX_THREAD if (g_usbd_core.tx_msg[ep & 0x7f].cb) { g_usbd_core.tx_msg[ep & 0x7f].cb(ep, nbytes); } -#else - g_usbd_core.tx_msg[ep & 0x7f].nbytes = nbytes; - usb_osal_mq_send(usbd_tx_mq, (uintptr_t)&g_usbd_core.tx_msg[ep & 0x7f]); -#endif } void usbd_event_ep_out_complete_handler(uint8_t ep, uint32_t nbytes) { -#ifndef CONFIG_USBDEV_RX_THREAD if (g_usbd_core.rx_msg[ep & 0x7f].cb) { g_usbd_core.rx_msg[ep & 0x7f].cb(ep, nbytes); } -#else - g_usbd_core.rx_msg[ep & 0x7f].nbytes = nbytes; - usb_osal_mq_send(usbd_rx_mq, (uintptr_t)&g_usbd_core.rx_msg[ep & 0x7f]); -#endif } -#ifdef CONFIG_USBDEV_TX_THREAD -static void usbdev_tx_thread(void *argument) -{ - struct usbd_tx_rx_msg *msg; - int ret; - - while (1) { - ret = usb_osal_mq_recv(usbd_tx_mq, (uintptr_t *)&msg, 0xffffffff); - if (ret < 0) { - continue; - } - - if (msg->cb) { - msg->cb(msg->ep, msg->nbytes); - } - } -} -#endif - -#ifdef CONFIG_USBDEV_RX_THREAD -static void usbdev_rx_thread(void *argument) -{ - struct usbd_tx_rx_msg *msg; - int ret; - - while (1) { - ret = usb_osal_mq_recv(usbd_rx_mq, (uintptr_t *)&msg, 0xffffffff); - if (ret < 0) { - continue; - } - - if (msg->cb) { - msg->cb(msg->ep, msg->nbytes); - } - } -} -#endif - #ifdef CONFIG_USBDEV_ADVANCE_DESC void usbd_desc_register(struct usb_descriptor *desc) { @@ -1270,26 +1210,6 @@ bool usb_device_is_configured(void) int usbd_initialize(void) { -#ifdef CONFIG_USBDEV_TX_THREAD - usbd_tx_mq = usb_osal_mq_create(16); - if (usbd_tx_mq == NULL) { - return -1; - } - usbd_tx_thread = usb_osal_thread_create("usbd_tx", CONFIG_USBDEV_TX_STACKSIZE, CONFIG_USBDEV_TX_PRIO, usbdev_tx_thread, NULL); - if (usbd_tx_thread == NULL) { - return -1; - } -#endif -#ifdef CONFIG_USBDEV_RX_THREAD - usbd_rx_mq = usb_osal_mq_create(16); - if (usbd_rx_mq == NULL) { - return -1; - } - usbd_rx_thread = usb_osal_thread_create("usbd_rx", CONFIG_USBDEV_RX_STACKSIZE, CONFIG_USBDEV_RX_PRIO, usbdev_rx_thread, NULL); - if (usbd_rx_thread == NULL) { - return -1; - } -#endif return usb_dc_init(); } @@ -1297,8 +1217,6 @@ int usbd_deinitialize(void) { g_usbd_core.intf_offset = 0; usb_dc_deinit(); -#if defined(CONFIG_USBDEV_TX_THREAD) || defined(CONFIG_USBDEV_RX_THREAD) -#endif return 0; }