merge class driver control_request & control_complete to control_xfer_cb()
migrated msc_device
This commit is contained in:
parent
589dfdb0e5
commit
3c31d08051
|
@ -186,10 +186,14 @@ uint16_t mscd_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint1
|
||||||
return drv_len;
|
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)
|
// 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
|
// Handle class request only
|
||||||
TU_VERIFY(p_request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS);
|
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;
|
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)
|
// 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
|
// 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)
|
int32_t proc_builtin_scsi(uint8_t lun, uint8_t const scsi_cmd[16], uint8_t* buffer, uint32_t bufsize)
|
||||||
|
|
|
@ -161,8 +161,7 @@ TU_ATTR_WEAK bool tud_msc_is_writable_cb(uint8_t lun);
|
||||||
void mscd_init (void);
|
void mscd_init (void);
|
||||||
void mscd_reset (uint8_t rhport);
|
void mscd_reset (uint8_t rhport);
|
||||||
uint16_t mscd_open (uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len);
|
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_xfer_cb (uint8_t rhport, uint8_t stage, tusb_control_request_t const * p_request);
|
||||||
bool mscd_control_complete (uint8_t rhport, 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);
|
bool mscd_xfer_cb (uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -250,6 +250,13 @@ typedef enum
|
||||||
MS_OS_20_FEATURE_VENDOR_REVISION = 0x08
|
MS_OS_20_FEATURE_VENDOR_REVISION = 0x08
|
||||||
} microsoft_os_20_type_t;
|
} microsoft_os_20_type_t;
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
CONTROL_STAGE_SETUP,
|
||||||
|
CONTROL_STAGE_DATA,
|
||||||
|
CONTROL_STAGE_ACK
|
||||||
|
};
|
||||||
|
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
// USB Descriptors
|
// USB Descriptors
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
|
|
|
@ -97,7 +97,7 @@ static usbd_class_driver_t const _usbd_driver[] =
|
||||||
.init = cdcd_init,
|
.init = cdcd_init,
|
||||||
.reset = cdcd_reset,
|
.reset = cdcd_reset,
|
||||||
.open = cdcd_open,
|
.open = cdcd_open,
|
||||||
.control_request = cdcd_control_request,
|
.control_xfer_cb = cdcd_control_request,
|
||||||
.control_complete = cdcd_control_complete,
|
.control_complete = cdcd_control_complete,
|
||||||
.xfer_cb = cdcd_xfer_cb,
|
.xfer_cb = cdcd_xfer_cb,
|
||||||
.sof = NULL
|
.sof = NULL
|
||||||
|
@ -110,8 +110,7 @@ static usbd_class_driver_t const _usbd_driver[] =
|
||||||
.init = mscd_init,
|
.init = mscd_init,
|
||||||
.reset = mscd_reset,
|
.reset = mscd_reset,
|
||||||
.open = mscd_open,
|
.open = mscd_open,
|
||||||
.control_request = mscd_control_request,
|
.control_xfer_cb = mscd_control_xfer_cb,
|
||||||
.control_complete = mscd_control_complete,
|
|
||||||
.xfer_cb = mscd_xfer_cb,
|
.xfer_cb = mscd_xfer_cb,
|
||||||
.sof = NULL
|
.sof = NULL
|
||||||
},
|
},
|
||||||
|
@ -123,7 +122,7 @@ static usbd_class_driver_t const _usbd_driver[] =
|
||||||
.init = hidd_init,
|
.init = hidd_init,
|
||||||
.reset = hidd_reset,
|
.reset = hidd_reset,
|
||||||
.open = hidd_open,
|
.open = hidd_open,
|
||||||
.control_request = hidd_control_request,
|
.control_xfer_cb = hidd_control_request,
|
||||||
.control_complete = hidd_control_complete,
|
.control_complete = hidd_control_complete,
|
||||||
.xfer_cb = hidd_xfer_cb,
|
.xfer_cb = hidd_xfer_cb,
|
||||||
.sof = NULL
|
.sof = NULL
|
||||||
|
@ -134,9 +133,9 @@ static usbd_class_driver_t const _usbd_driver[] =
|
||||||
{
|
{
|
||||||
DRIVER_NAME("AUDIO")
|
DRIVER_NAME("AUDIO")
|
||||||
.init = audiod_init,
|
.init = audiod_init,
|
||||||
.reset = audiod_reset,
|
.reset = audiod_reset,
|
||||||
.open = audiod_open,
|
.open = audiod_open,
|
||||||
.control_request = audiod_control_request,
|
.control_xfer_cb = audiod_control_request,
|
||||||
.control_complete = audiod_control_complete,
|
.control_complete = audiod_control_complete,
|
||||||
.xfer_cb = audiod_xfer_cb,
|
.xfer_cb = audiod_xfer_cb,
|
||||||
.sof = NULL
|
.sof = NULL
|
||||||
|
@ -149,7 +148,7 @@ static usbd_class_driver_t const _usbd_driver[] =
|
||||||
.init = midid_init,
|
.init = midid_init,
|
||||||
.open = midid_open,
|
.open = midid_open,
|
||||||
.reset = midid_reset,
|
.reset = midid_reset,
|
||||||
.control_request = midid_control_request,
|
.control_xfer_cb = midid_control_request,
|
||||||
.control_complete = midid_control_complete,
|
.control_complete = midid_control_complete,
|
||||||
.xfer_cb = midid_xfer_cb,
|
.xfer_cb = midid_xfer_cb,
|
||||||
.sof = NULL
|
.sof = NULL
|
||||||
|
@ -162,7 +161,7 @@ static usbd_class_driver_t const _usbd_driver[] =
|
||||||
.init = vendord_init,
|
.init = vendord_init,
|
||||||
.reset = vendord_reset,
|
.reset = vendord_reset,
|
||||||
.open = vendord_open,
|
.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,
|
.control_complete = tud_vendor_control_complete_cb,
|
||||||
.xfer_cb = vendord_xfer_cb,
|
.xfer_cb = vendord_xfer_cb,
|
||||||
.sof = NULL
|
.sof = NULL
|
||||||
|
@ -175,7 +174,7 @@ static usbd_class_driver_t const _usbd_driver[] =
|
||||||
.init = usbtmcd_init_cb,
|
.init = usbtmcd_init_cb,
|
||||||
.reset = usbtmcd_reset_cb,
|
.reset = usbtmcd_reset_cb,
|
||||||
.open = usbtmcd_open_cb,
|
.open = usbtmcd_open_cb,
|
||||||
.control_request = usbtmcd_control_request_cb,
|
.control_xfer_cb = usbtmcd_control_request_cb,
|
||||||
.control_complete = usbtmcd_control_complete_cb,
|
.control_complete = usbtmcd_control_complete_cb,
|
||||||
.xfer_cb = usbtmcd_xfer_cb,
|
.xfer_cb = usbtmcd_xfer_cb,
|
||||||
.sof = NULL
|
.sof = NULL
|
||||||
|
@ -188,7 +187,7 @@ static usbd_class_driver_t const _usbd_driver[] =
|
||||||
.init = dfu_rtd_init,
|
.init = dfu_rtd_init,
|
||||||
.reset = dfu_rtd_reset,
|
.reset = dfu_rtd_reset,
|
||||||
.open = dfu_rtd_open,
|
.open = dfu_rtd_open,
|
||||||
.control_request = dfu_rtd_control_request,
|
.control_xfer_cb = dfu_rtd_control_request,
|
||||||
.control_complete = dfu_rtd_control_complete,
|
.control_complete = dfu_rtd_control_complete,
|
||||||
.xfer_cb = dfu_rtd_xfer_cb,
|
.xfer_cb = dfu_rtd_xfer_cb,
|
||||||
.sof = NULL
|
.sof = NULL
|
||||||
|
@ -201,7 +200,7 @@ static usbd_class_driver_t const _usbd_driver[] =
|
||||||
.init = netd_init,
|
.init = netd_init,
|
||||||
.reset = netd_reset,
|
.reset = netd_reset,
|
||||||
.open = netd_open,
|
.open = netd_open,
|
||||||
.control_request = netd_control_request,
|
.control_xfer_cb = netd_control_request,
|
||||||
.control_complete = netd_control_complete,
|
.control_complete = netd_control_complete,
|
||||||
.xfer_cb = netd_xfer_cb,
|
.xfer_cb = netd_xfer_cb,
|
||||||
.sof = NULL,
|
.sof = NULL,
|
||||||
|
@ -214,7 +213,7 @@ static usbd_class_driver_t const _usbd_driver[] =
|
||||||
.init = btd_init,
|
.init = btd_init,
|
||||||
.reset = btd_reset,
|
.reset = btd_reset,
|
||||||
.open = btd_open,
|
.open = btd_open,
|
||||||
.control_request = btd_control_request,
|
.control_xfer_cb = btd_control_request,
|
||||||
.control_complete = btd_control_complete,
|
.control_complete = btd_control_complete,
|
||||||
.xfer_cb = btd_xfer_cb,
|
.xfer_cb = btd_xfer_cb,
|
||||||
.sof = NULL
|
.sof = NULL
|
||||||
|
@ -274,7 +273,7 @@ static bool process_get_descriptor(uint8_t rhport, tusb_control_request_t const
|
||||||
// from usbd_control.c
|
// from usbd_control.c
|
||||||
void usbd_control_reset(void);
|
void usbd_control_reset(void);
|
||||||
void usbd_control_set_request(tusb_control_request_t const *request);
|
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);
|
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
|
// 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++)
|
for (uint8_t i = 0; i < TOTAL_DRIVER_COUNT; i++)
|
||||||
{
|
{
|
||||||
usbd_class_driver_t const * driver = get_driver(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);
|
TU_LOG2(" %s control complete\r\n", driver->name);
|
||||||
return;
|
return;
|
||||||
|
@ -565,9 +564,9 @@ void tud_task (void)
|
||||||
// Helper to invoke class driver control request handler
|
// 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)
|
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);
|
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.
|
// 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
|
// Vendor request
|
||||||
if ( p_request->bmRequestType_bit.type == TUSB_REQ_TYPE_VENDOR )
|
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);
|
usbd_control_set_complete_callback(tud_vendor_control_xfer_cb);
|
||||||
return tud_vendor_control_request_cb(rhport, p_request);
|
return tud_vendor_control_xfer_cb(rhport, CONTROL_STAGE_SETUP, p_request);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CFG_TUSB_DEBUG >= 2
|
#if CFG_TUSB_DEBUG >= 2
|
||||||
|
|
|
@ -125,7 +125,7 @@ TU_ATTR_WEAK void tud_suspend_cb(bool remote_wakeup_en);
|
||||||
TU_ATTR_WEAK void tud_resume_cb(void);
|
TU_ATTR_WEAK void tud_resume_cb(void);
|
||||||
|
|
||||||
// Invoked when received control request with VENDOR TYPE
|
// 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
|
// 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);
|
TU_ATTR_WEAK bool tud_vendor_control_complete_cb(uint8_t rhport, tusb_control_request_t const * request);
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
#include "dcd.h"
|
#include "dcd.h"
|
||||||
|
|
||||||
#if CFG_TUSB_DEBUG >= 2
|
#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
|
#endif
|
||||||
|
|
||||||
enum
|
enum
|
||||||
|
@ -50,7 +50,7 @@ typedef struct
|
||||||
uint16_t data_len;
|
uint16_t data_len;
|
||||||
uint16_t total_xferred;
|
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;
|
} usbd_control_xfer_t;
|
||||||
|
|
||||||
static usbd_control_xfer_t _ctrl_xfer;
|
static usbd_control_xfer_t _ctrl_xfer;
|
||||||
|
@ -146,7 +146,7 @@ void usbd_control_reset(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO may find a better way
|
// 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;
|
_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);
|
usbd_driver_print_control_complete_name(_ctrl_xfer.complete_cb);
|
||||||
#endif
|
#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 )
|
if ( is_ok )
|
||||||
|
|
|
@ -46,7 +46,7 @@ typedef struct
|
||||||
void (* init ) (void);
|
void (* init ) (void);
|
||||||
void (* reset ) (uint8_t rhport);
|
void (* reset ) (uint8_t rhport);
|
||||||
uint16_t (* open ) (uint8_t rhport, tusb_desc_interface_t const * desc_intf, uint16_t max_len);
|
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 (* 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);
|
bool (* xfer_cb ) (uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes);
|
||||||
void (* sof ) (uint8_t rhport); /* optional */
|
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
|
// 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;
|
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
|
// USBD Endpoint API
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
|
|
Loading…
Reference in New Issue