Просмотр исходного кода

merge class driver control_request & control_complete to control_xfer_cb()

migrated msc_device
hathach 5 лет назад
Родитель
Сommit
3c31d08051

+ 6 - 13
src/class/msc/msc_device.c

@@ -186,10 +186,14 @@ uint16_t mscd_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint1
   return drv_len;
 }
 
-// Handle class control request
+// Invoked when a control transfer occurred on an interface of this class
+// Driver response accordingly to the request and the transfer stage (setup/data/ack)
 // return false to stall control endpoint (e.g unsupported request)
-bool mscd_control_request(uint8_t rhport, tusb_control_request_t const * p_request)
+bool mscd_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * p_request)
 {
+  // nothing to do with DATA & ACK stage
+  if (stage != CONTROL_STAGE_SETUP) return true;
+
   // Handle class request only
   TU_VERIFY(p_request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS);
 
@@ -219,17 +223,6 @@ bool mscd_control_request(uint8_t rhport, tusb_control_request_t const * p_reque
   return true;
 }
 
-// Invoked when class request DATA stage is finished.
-// return false to stall control endpoint (e.g Host send non-sense DATA)
-bool mscd_control_complete(uint8_t rhport, tusb_control_request_t const * request)
-{
-  (void) rhport;
-  (void) request;
-
-  // nothing to do
-  return true;
-}
-
 // return response's length (copied to buffer). Negative if it is not an built-in command or indicate Failed status (CSW)
 // In case of a failed status, sense key must be set for reason of failure
 int32_t proc_builtin_scsi(uint8_t lun, uint8_t const scsi_cmd[16], uint8_t* buffer, uint32_t bufsize)

+ 1 - 2
src/class/msc/msc_device.h

@@ -161,8 +161,7 @@ TU_ATTR_WEAK bool tud_msc_is_writable_cb(uint8_t lun);
 void     mscd_init             (void);
 void     mscd_reset            (uint8_t rhport);
 uint16_t mscd_open             (uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len);
-bool     mscd_control_request  (uint8_t rhport, tusb_control_request_t const * p_request);
-bool     mscd_control_complete (uint8_t rhport, tusb_control_request_t const * p_request);
+bool     mscd_control_xfer_cb  (uint8_t rhport, uint8_t stage, tusb_control_request_t const * p_request);
 bool     mscd_xfer_cb          (uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes);
 
 #ifdef __cplusplus

+ 7 - 0
src/common/tusb_types.h

@@ -250,6 +250,13 @@ typedef enum
   MS_OS_20_FEATURE_VENDOR_REVISION     = 0x08
 } microsoft_os_20_type_t;
 
+enum
+{
+  CONTROL_STAGE_SETUP,
+  CONTROL_STAGE_DATA,
+  CONTROL_STAGE_ACK
+};
+
 //--------------------------------------------------------------------+
 // USB Descriptors
 //--------------------------------------------------------------------+

+ 19 - 20
src/device/usbd.c

@@ -97,7 +97,7 @@ static usbd_class_driver_t const _usbd_driver[] =
       .init             = cdcd_init,
       .reset            = cdcd_reset,
       .open             = cdcd_open,
-      .control_request  = cdcd_control_request,
+      .control_xfer_cb  = cdcd_control_request,
       .control_complete = cdcd_control_complete,
       .xfer_cb          = cdcd_xfer_cb,
       .sof              = NULL
@@ -110,8 +110,7 @@ static usbd_class_driver_t const _usbd_driver[] =
       .init             = mscd_init,
       .reset            = mscd_reset,
       .open             = mscd_open,
-      .control_request  = mscd_control_request,
-      .control_complete = mscd_control_complete,
+      .control_xfer_cb  = mscd_control_xfer_cb,
       .xfer_cb          = mscd_xfer_cb,
       .sof              = NULL
   },
@@ -123,7 +122,7 @@ static usbd_class_driver_t const _usbd_driver[] =
       .init             = hidd_init,
       .reset            = hidd_reset,
       .open             = hidd_open,
-      .control_request  = hidd_control_request,
+      .control_xfer_cb  = hidd_control_request,
       .control_complete = hidd_control_complete,
       .xfer_cb          = hidd_xfer_cb,
       .sof              = NULL
@@ -134,9 +133,9 @@ static usbd_class_driver_t const _usbd_driver[] =
 {
 	DRIVER_NAME("AUDIO")
     .init             = audiod_init,
-	.reset            = audiod_reset,
+    .reset            = audiod_reset,
     .open             = audiod_open,
-    .control_request  = audiod_control_request,
+    .control_xfer_cb  = audiod_control_request,
     .control_complete = audiod_control_complete,
     .xfer_cb          = audiod_xfer_cb,
     .sof              = NULL
@@ -149,7 +148,7 @@ static usbd_class_driver_t const _usbd_driver[] =
       .init             = midid_init,
       .open             = midid_open,
       .reset            = midid_reset,
-      .control_request  = midid_control_request,
+      .control_xfer_cb  = midid_control_request,
       .control_complete = midid_control_complete,
       .xfer_cb          = midid_xfer_cb,
       .sof              = NULL
@@ -162,7 +161,7 @@ static usbd_class_driver_t const _usbd_driver[] =
       .init             = vendord_init,
       .reset            = vendord_reset,
       .open             = vendord_open,
-      .control_request  = tud_vendor_control_request_cb,
+      .control_xfer_cb  = tud_vendor_control_request_cb,
       .control_complete = tud_vendor_control_complete_cb,
       .xfer_cb          = vendord_xfer_cb,
       .sof              = NULL
@@ -175,7 +174,7 @@ static usbd_class_driver_t const _usbd_driver[] =
       .init             = usbtmcd_init_cb,
       .reset            = usbtmcd_reset_cb,
       .open             = usbtmcd_open_cb,
-      .control_request  = usbtmcd_control_request_cb,
+      .control_xfer_cb  = usbtmcd_control_request_cb,
       .control_complete = usbtmcd_control_complete_cb,
       .xfer_cb          = usbtmcd_xfer_cb,
       .sof              = NULL
@@ -188,7 +187,7 @@ static usbd_class_driver_t const _usbd_driver[] =
       .init             = dfu_rtd_init,
       .reset            = dfu_rtd_reset,
       .open             = dfu_rtd_open,
-      .control_request  = dfu_rtd_control_request,
+      .control_xfer_cb  = dfu_rtd_control_request,
       .control_complete = dfu_rtd_control_complete,
       .xfer_cb          = dfu_rtd_xfer_cb,
       .sof              = NULL
@@ -201,7 +200,7 @@ static usbd_class_driver_t const _usbd_driver[] =
       .init             = netd_init,
       .reset            = netd_reset,
       .open             = netd_open,
-      .control_request  = netd_control_request,
+      .control_xfer_cb  = netd_control_request,
       .control_complete = netd_control_complete,
       .xfer_cb          = netd_xfer_cb,
       .sof              = NULL,
@@ -214,7 +213,7 @@ static usbd_class_driver_t const _usbd_driver[] =
       .init             = btd_init,
       .reset            = btd_reset,
       .open             = btd_open,
-      .control_request  = btd_control_request,
+      .control_xfer_cb  = btd_control_request,
       .control_complete = btd_control_complete,
       .xfer_cb          = btd_xfer_cb,
       .sof              = NULL
@@ -274,7 +273,7 @@ static bool process_get_descriptor(uint8_t rhport, tusb_control_request_t const
 // from usbd_control.c
 void usbd_control_reset(void);
 void usbd_control_set_request(tusb_control_request_t const *request);
-void usbd_control_set_complete_callback( bool (*fp) (uint8_t, tusb_control_request_t const * ) );
+void usbd_control_set_complete_callback( usbd_control_xfer_cb_t fp );
 bool usbd_control_xfer_cb (uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes);
 
 
@@ -313,12 +312,12 @@ static char const* const _tusb_std_request_str[] =
 };
 
 // for usbd_control to print the name of control complete driver
-void usbd_driver_print_control_complete_name(bool (*control_complete) (uint8_t, tusb_control_request_t const * ))
+void usbd_driver_print_control_complete_name(usbd_control_xfer_cb_t callback)
 {
   for (uint8_t i = 0; i < TOTAL_DRIVER_COUNT; i++)
   {
     usbd_class_driver_t const * driver = get_driver(i);
-    if ( driver->control_complete == control_complete )
+    if ( driver->control_xfer_cb == callback )
     {
       TU_LOG2("  %s control complete\r\n", driver->name);
       return;
@@ -565,9 +564,9 @@ void tud_task (void)
 // Helper to invoke class driver control request handler
 static bool invoke_class_control(uint8_t rhport, usbd_class_driver_t const * driver, tusb_control_request_t const * request)
 {
-  usbd_control_set_complete_callback(driver->control_complete);
+  usbd_control_set_complete_callback(driver->control_xfer_cb);
   TU_LOG2("  %s control request\r\n", driver->name);
-  return driver->control_request(rhport, request);
+  return driver->control_xfer_cb(rhport, CONTROL_STAGE_SETUP, request);
 }
 
 // This handles the actual request and its response.
@@ -581,10 +580,10 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const
   // Vendor request
   if ( p_request->bmRequestType_bit.type == TUSB_REQ_TYPE_VENDOR )
   {
-    TU_VERIFY(tud_vendor_control_request_cb);
+    TU_VERIFY(tud_vendor_control_xfer_cb);
 
-    if (tud_vendor_control_complete_cb) usbd_control_set_complete_callback(tud_vendor_control_complete_cb);
-    return tud_vendor_control_request_cb(rhport, p_request);
+    usbd_control_set_complete_callback(tud_vendor_control_xfer_cb);
+    return tud_vendor_control_xfer_cb(rhport, CONTROL_STAGE_SETUP, p_request);
   }
 
 #if CFG_TUSB_DEBUG >= 2

+ 1 - 1
src/device/usbd.h

@@ -125,7 +125,7 @@ TU_ATTR_WEAK void tud_suspend_cb(bool remote_wakeup_en);
 TU_ATTR_WEAK void tud_resume_cb(void);
 
 // Invoked when received control request with VENDOR TYPE
-TU_ATTR_WEAK bool tud_vendor_control_request_cb(uint8_t rhport, tusb_control_request_t const * request);
+TU_ATTR_WEAK bool tud_vendor_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);
 
 // Invoked when vendor control request is complete
 TU_ATTR_WEAK bool tud_vendor_control_complete_cb(uint8_t rhport, tusb_control_request_t const * request);

+ 4 - 4
src/device/usbd_control.c

@@ -33,7 +33,7 @@
 #include "dcd.h"
 
 #if CFG_TUSB_DEBUG >= 2
-extern void usbd_driver_print_control_complete_name(bool (*control_complete) (uint8_t, tusb_control_request_t const *));
+extern void usbd_driver_print_control_complete_name(usbd_control_xfer_cb_t callback);
 #endif
 
 enum
@@ -50,7 +50,7 @@ typedef struct
   uint16_t data_len;
   uint16_t total_xferred;
 
-  bool (*complete_cb) (uint8_t, tusb_control_request_t const *);
+  usbd_control_xfer_cb_t complete_cb;
 } usbd_control_xfer_t;
 
 static usbd_control_xfer_t _ctrl_xfer;
@@ -146,7 +146,7 @@ void usbd_control_reset(void)
 }
 
 // TODO may find a better way
-void usbd_control_set_complete_callback( bool (*fp) (uint8_t, tusb_control_request_t const * ) )
+void usbd_control_set_complete_callback( usbd_control_xfer_cb_t fp )
 {
   _ctrl_xfer.complete_cb = fp;
 }
@@ -199,7 +199,7 @@ bool usbd_control_xfer_cb (uint8_t rhport, uint8_t ep_addr, xfer_result_t result
       usbd_driver_print_control_complete_name(_ctrl_xfer.complete_cb);
       #endif
 
-      is_ok = _ctrl_xfer.complete_cb(rhport, &_ctrl_xfer.request);
+      is_ok = _ctrl_xfer.complete_cb(rhport, CONTROL_STAGE_DATA, &_ctrl_xfer.request);
     }
 
     if ( is_ok )

+ 4 - 1
src/device/usbd_pvt.h

@@ -46,7 +46,7 @@ typedef struct
   void     (* init             ) (void);
   void     (* reset            ) (uint8_t rhport);
   uint16_t (* open             ) (uint8_t rhport, tusb_desc_interface_t const * desc_intf, uint16_t max_len);
-  bool     (* control_request  ) (uint8_t rhport, tusb_control_request_t const * request);
+  bool     (* control_xfer_cb  ) (uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);
   bool     (* control_complete ) (uint8_t rhport, tusb_control_request_t const * request);
   bool     (* xfer_cb          ) (uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes);
   void     (* sof              ) (uint8_t rhport); /* optional */
@@ -57,6 +57,9 @@ typedef struct
 // Note: The drivers array must be accessible at all time when stack is active
 usbd_class_driver_t const* usbd_app_driver_get_cb(uint8_t* driver_count) TU_ATTR_WEAK;
 
+
+typedef bool (*usbd_control_xfer_cb_t)(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);
+
 //--------------------------------------------------------------------+
 // USBD Endpoint API
 //--------------------------------------------------------------------+