Răsfoiți Sursa

update usb test mode

Signed-off-by: Zhihong Chen <zhihong.chen@hpmicro.com>
Zhihong Chen 1 an în urmă
părinte
comite
bba4b46fa4
2 a modificat fișierele cu 19 adăugiri și 14 ștergeri
  1. 9 0
      common/usb_dc.h
  2. 10 14
      core/usbd_core.c

+ 9 - 0
common/usb_dc.h

@@ -178,6 +178,15 @@ void usbd_event_ep_in_complete_handler(uint8_t busid, uint8_t ep, uint32_t nbyte
  */
 void usbd_event_ep_out_complete_handler(uint8_t busid, uint8_t ep, uint32_t nbytes);
 
+#ifdef CONFIG_USBDEV_TEST_MODE
+/**
+ * @brief Usb execute test mode
+ * @param[in]  busid     device busid
+ * @param[in]  test_mode usb test mode
+ */
+void usbd_execute_test_mode(uint8_t busid, uint8_t test_mode);
+#endif
+
 #ifdef __cplusplus
 }
 #endif

+ 10 - 14
core/usbd_core.c

@@ -51,7 +51,7 @@ USB_NOCACHE_RAM_SECTION struct usbd_core_priv {
     uint8_t configuration;
     uint8_t speed;
 #ifdef CONFIG_USBDEV_TEST_MODE
-    bool test_mode;
+    bool test_req;
 #endif
     struct usbd_interface *intf[8];
     uint8_t intf_offset;
@@ -498,8 +498,7 @@ static bool usbd_std_device_req_handler(uint8_t busid, struct usb_setup_packet *
                 }
             } else if (value == USB_FEATURE_TEST_MODE) {
 #ifdef CONFIG_USBDEV_TEST_MODE
-                g_usbd_core[busid].test_mode = true;
-                usbd_execute_test_mode(busid, setup);
+                g_usbd_core[busid].test_req = true;
 #endif
             }
             *len = 0;
@@ -973,10 +972,6 @@ void usbd_event_reset_handler(uint8_t busid)
 {
     usbd_set_address(busid, 0);
     g_usbd_core[busid].configuration = 0;
-
-#ifdef CONFIG_USBDEV_TEST_MODE
-    g_usbd_core[busid].test_mode = false;
-#endif
     struct usb_endpoint_descriptor ep0;
 
     ep0.bLength = 7;
@@ -1027,13 +1022,7 @@ void usbd_event_ep0_setup_complete_handler(uint8_t busid, uint8_t *psetup)
         usbd_ep_set_stall(busid, USB_CONTROL_IN_EP0);
         return;
     }
-#ifdef CONFIG_USBDEV_TEST_MODE
-    /* send status in test mode, so do not execute downward, just return */
-    if (g_usbd_core[busid].test_mode) {
-        g_usbd_core[busid].test_mode = false;
-        return;
-    }
-#endif
+
     /* Send smallest of requested and offered length */
     g_usbd_core[busid].ep0_data_buf_residue = MIN(g_usbd_core[busid].ep0_data_buf_len, setup->wLength);
     if (g_usbd_core[busid].ep0_data_buf_residue > CONFIG_USBDEV_REQUEST_BUFFER_LEN) {
@@ -1082,6 +1071,13 @@ void usbd_event_ep0_in_complete_handler(uint8_t busid, uint8_t ep, uint32_t nbyt
                 /* if all data has sent completely, start reading out status */
                 usbd_ep_start_read(busid, USB_CONTROL_OUT_EP0, NULL, 0);
             }
+
+#ifdef CONFIG_USBDEV_TEST_MODE
+            if (g_usbd_core[busid].test_req) {
+                usbd_execute_test_mode(busid, HI_BYTE(setup->wIndex));
+                g_usbd_core[busid].test_req = false;
+            }
+#endif
         }
     }
 }