Răsfoiți Sursa

implement msc device thread,remove other unused os thread

sakimisu 2 ani în urmă
părinte
comite
14f5dd2dd3
3 a modificat fișierele cu 74 adăugiri și 103 ștergeri
  1. 10 21
      cherryusb_config_template.h
  2. 64 0
      class/msc/usbd_msc.c
  3. 0 82
      core/usbd_core.c

+ 10 - 21
cherryusb_config_template.h

@@ -44,27 +44,6 @@
 /* Enable test mode */
 /* Enable test mode */
 // #define CONFIG_USBDEV_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
 #ifndef CONFIG_USBDEV_MSC_BLOCK_SIZE
 #define CONFIG_USBDEV_MSC_BLOCK_SIZE 512
 #define CONFIG_USBDEV_MSC_BLOCK_SIZE 512
 #endif
 #endif
@@ -81,6 +60,16 @@
 #define CONFIG_USBDEV_MSC_VERSION_STRING "0.01"
 #define CONFIG_USBDEV_MSC_VERSION_STRING "0.01"
 #endif
 #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
 #ifndef CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE
 #define CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156
 #define CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156
 #endif
 #endif

+ 64 - 0
class/msc/usbd_msc.c

@@ -6,6 +6,9 @@
 #include "usbd_core.h"
 #include "usbd_core.h"
 #include "usbd_msc.h"
 #include "usbd_msc.h"
 #include "usb_scsi.h"
 #include "usb_scsi.h"
+#if defined(CONFIG_USBDEV_MSC_THREAD)
+#include "usb_osal.h"
+#endif
 
 
 #define MSD_OUT_EP_IDX 0
 #define MSD_OUT_EP_IDX 0
 #define MSD_IN_EP_IDX  1
 #define MSD_IN_EP_IDX  1
@@ -41,6 +44,12 @@ USB_NOCACHE_RAM_SECTION struct usbd_msc_priv {
     uint32_t scsi_blk_nbr;
     uint32_t scsi_blk_nbr;
 
 
     USB_MEM_ALIGNX uint8_t block_buffer[CONFIG_USBDEV_MSC_BLOCK_SIZE];
     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;
 } g_usbd_msc;
 
 
 static void usbd_msc_reset(void)
 static void usbd_msc_reset(void)
@@ -481,7 +490,12 @@ static bool SCSI_read10(uint8_t **data, uint32_t *len)
         return false;
         return false;
     }
     }
     g_usbd_msc.stage = MSC_DATA_IN;
     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();
     return SCSI_processRead();
+#endif
 }
 }
 
 
 static bool SCSI_read12(uint8_t **data, uint32_t *len)
 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;
         return false;
     }
     }
     g_usbd_msc.stage = MSC_DATA_IN;
     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();
     return SCSI_processRead();
+#endif
 }
 }
 
 
 static bool SCSI_write10(uint8_t **data, uint32_t *len)
 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]) {
             switch (g_usbd_msc.cbw.CB[0]) {
                 case SCSI_CMD_WRITE10:
                 case SCSI_CMD_WRITE10:
                 case SCSI_CMD_WRITE12:
                 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) {
                     if (SCSI_processWrite(nbytes) == false) {
                         usbd_msc_send_csw(CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/
                         usbd_msc_send_csw(CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/
                     }
                     }
+#endif
                     break;
                     break;
                 default:
                 default:
                     break;
                     break;
@@ -784,10 +808,14 @@ void mass_storage_bulk_in(uint8_t ep, uint32_t nbytes)
             switch (g_usbd_msc.cbw.CB[0]) {
             switch (g_usbd_msc.cbw.CB[0]) {
                 case SCSI_CMD_READ10:
                 case SCSI_CMD_READ10:
                 case SCSI_CMD_READ12:
                 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) {
                     if (SCSI_processRead() == false) {
                         usbd_msc_send_csw(CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/
                         usbd_msc_send_csw(CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/
                         return;
                         return;
                     }
                     }
+#endif
                     break;
                     break;
                 default:
                 default:
                     break;
                     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)
 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;
     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;
         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;
     return intf;
 }
 }
 
 

+ 0 - 82
core/usbd_core.c

@@ -6,9 +6,6 @@
  * SPDX-License-Identifier: Apache-2.0
  * SPDX-License-Identifier: Apache-2.0
  */
  */
 #include "usbd_core.h"
 #include "usbd_core.h"
-#if defined(CONFIG_USBDEV_TX_THREAD) || defined(CONFIG_USBDEV_RX_THREAD)
-#include "usb_osal.h"
-#endif
 
 
 /* general descriptor field offsets */
 /* general descriptor field offsets */
 #define DESC_bLength         0 /** Length offset */
 #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];
     struct usbd_tx_rx_msg rx_msg[USB_EP_OUT_NUM];
 } g_usbd_core;
 } 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_class_event_notify_handler(uint8_t event, void *arg);
 
 
 static void usbd_print_setup(struct usb_setup_packet *setup)
 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)
 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) {
     if (g_usbd_core.tx_msg[ep & 0x7f].cb) {
         g_usbd_core.tx_msg[ep & 0x7f].cb(ep, nbytes);
         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)
 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) {
     if (g_usbd_core.rx_msg[ep & 0x7f].cb) {
         g_usbd_core.rx_msg[ep & 0x7f].cb(ep, nbytes);
         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
 #ifdef CONFIG_USBDEV_ADVANCE_DESC
 void usbd_desc_register(struct usb_descriptor *desc)
 void usbd_desc_register(struct usb_descriptor *desc)
 {
 {
@@ -1270,26 +1210,6 @@ bool usb_device_is_configured(void)
 
 
 int usbd_initialize(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();
     return usb_dc_init();
 }
 }
 
 
@@ -1297,8 +1217,6 @@ int usbd_deinitialize(void)
 {
 {
     g_usbd_core.intf_offset = 0;
     g_usbd_core.intf_offset = 0;
     usb_dc_deinit();
     usb_dc_deinit();
-#if defined(CONFIG_USBDEV_TX_THREAD) || defined(CONFIG_USBDEV_RX_THREAD)
-#endif
     return 0;
     return 0;
 }
 }