|
|
@@ -28,12 +28,12 @@
|
|
|
|
|
|
#if CFG_TUD_ENABLED
|
|
|
|
|
|
+#include "device/dcd.h"
|
|
|
#include "tusb.h"
|
|
|
#include "common/tusb_private.h"
|
|
|
|
|
|
#include "device/usbd.h"
|
|
|
#include "device/usbd_pvt.h"
|
|
|
-#include "device/dcd.h"
|
|
|
|
|
|
//--------------------------------------------------------------------+
|
|
|
// USBD Configuration
|
|
|
@@ -318,7 +318,7 @@ void usbd_driver_print_control_complete_name(usbd_control_xfer_cb_t callback)
|
|
|
usbd_class_driver_t const * driver = get_driver(i);
|
|
|
if ( driver->control_xfer_cb == callback )
|
|
|
{
|
|
|
- TU_LOG2(" %s control complete\r\n", driver->name);
|
|
|
+ TU_LOG(USBD_DBG, " %s control complete\r\n", driver->name);
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
@@ -384,8 +384,8 @@ bool tud_init (uint8_t rhport)
|
|
|
// skip if already initialized
|
|
|
if ( tud_inited() ) return true;
|
|
|
|
|
|
- TU_LOG2("USBD init on controller %u\r\n", rhport);
|
|
|
- TU_LOG2_INT(sizeof(usbd_device_t));
|
|
|
+ TU_LOG(USBD_DBG, "USBD init on controller %u\r\n", rhport);
|
|
|
+ TU_LOG_INT(USBD_DBG, sizeof(usbd_device_t));
|
|
|
|
|
|
tu_varclr(&_usbd_dev);
|
|
|
|
|
|
@@ -409,7 +409,8 @@ bool tud_init (uint8_t rhport)
|
|
|
for (uint8_t i = 0; i < TOTAL_DRIVER_COUNT; i++)
|
|
|
{
|
|
|
usbd_class_driver_t const * driver = get_driver(i);
|
|
|
- TU_LOG2("%s init\r\n", driver->name);
|
|
|
+ TU_ASSERT(driver);
|
|
|
+ TU_LOG(USBD_DBG, "%s init\r\n", driver->name);
|
|
|
driver->init();
|
|
|
}
|
|
|
|
|
|
@@ -426,7 +427,9 @@ static void configuration_reset(uint8_t rhport)
|
|
|
{
|
|
|
for ( uint8_t i = 0; i < TOTAL_DRIVER_COUNT; i++ )
|
|
|
{
|
|
|
- get_driver(i)->reset(rhport);
|
|
|
+ usbd_class_driver_t const * driver = get_driver(i);
|
|
|
+ TU_ASSERT(driver, );
|
|
|
+ driver->reset(rhport);
|
|
|
}
|
|
|
|
|
|
tu_varclr(&_usbd_dev);
|
|
|
@@ -480,20 +483,20 @@ void tud_task_ext(uint32_t timeout_ms, bool in_isr)
|
|
|
if ( !osal_queue_receive(_usbd_q, &event, timeout_ms) ) return;
|
|
|
|
|
|
#if CFG_TUSB_DEBUG >= 2
|
|
|
- if (event.event_id == DCD_EVENT_SETUP_RECEIVED) TU_LOG2("\r\n"); // extra line for setup
|
|
|
- TU_LOG2("USBD %s ", event.event_id < DCD_EVENT_COUNT ? _usbd_event_str[event.event_id] : "CORRUPTED");
|
|
|
+ if (event.event_id == DCD_EVENT_SETUP_RECEIVED) TU_LOG(USBD_DBG, "\r\n"); // extra line for setup
|
|
|
+ TU_LOG(USBD_DBG, "USBD %s ", event.event_id < DCD_EVENT_COUNT ? _usbd_event_str[event.event_id] : "CORRUPTED");
|
|
|
#endif
|
|
|
|
|
|
switch ( event.event_id )
|
|
|
{
|
|
|
case DCD_EVENT_BUS_RESET:
|
|
|
- TU_LOG2(": %s Speed\r\n", tu_str_speed[event.bus_reset.speed]);
|
|
|
+ TU_LOG(USBD_DBG, ": %s Speed\r\n", tu_str_speed[event.bus_reset.speed]);
|
|
|
usbd_reset(event.rhport);
|
|
|
_usbd_dev.speed = event.bus_reset.speed;
|
|
|
break;
|
|
|
|
|
|
case DCD_EVENT_UNPLUGGED:
|
|
|
- TU_LOG2("\r\n");
|
|
|
+ TU_LOG(USBD_DBG, "\r\n");
|
|
|
usbd_reset(event.rhport);
|
|
|
|
|
|
// invoke callback
|
|
|
@@ -501,8 +504,8 @@ void tud_task_ext(uint32_t timeout_ms, bool in_isr)
|
|
|
break;
|
|
|
|
|
|
case DCD_EVENT_SETUP_RECEIVED:
|
|
|
- TU_LOG2_VAR(&event.setup_received);
|
|
|
- TU_LOG2("\r\n");
|
|
|
+ TU_LOG_VAR(USBD_DBG, &event.setup_received);
|
|
|
+ TU_LOG(USBD_DBG, "\r\n");
|
|
|
|
|
|
// Mark as connected after receiving 1st setup packet.
|
|
|
// But it is easier to set it every time instead of wasting time to check then set
|
|
|
@@ -517,7 +520,7 @@ void tud_task_ext(uint32_t timeout_ms, bool in_isr)
|
|
|
// Process control request
|
|
|
if ( !process_control_request(event.rhport, &event.setup_received) )
|
|
|
{
|
|
|
- TU_LOG2(" Stall EP0\r\n");
|
|
|
+ TU_LOG(USBD_DBG, " Stall EP0\r\n");
|
|
|
// Failed -> stall both control endpoint IN and OUT
|
|
|
dcd_edpt_stall(event.rhport, 0);
|
|
|
dcd_edpt_stall(event.rhport, 0 | TUSB_DIR_IN_MASK);
|
|
|
@@ -531,7 +534,7 @@ void tud_task_ext(uint32_t timeout_ms, bool in_isr)
|
|
|
uint8_t const epnum = tu_edpt_number(ep_addr);
|
|
|
uint8_t const ep_dir = tu_edpt_dir(ep_addr);
|
|
|
|
|
|
- TU_LOG2("on EP %02X with %u bytes\r\n", ep_addr, (unsigned int) event.xfer_complete.len);
|
|
|
+ TU_LOG(USBD_DBG, "on EP %02X with %u bytes\r\n", ep_addr, (unsigned int) event.xfer_complete.len);
|
|
|
|
|
|
_usbd_dev.ep_status[epnum][ep_dir].busy = false;
|
|
|
_usbd_dev.ep_status[epnum][ep_dir].claimed = 0;
|
|
|
@@ -545,7 +548,7 @@ void tud_task_ext(uint32_t timeout_ms, bool in_isr)
|
|
|
usbd_class_driver_t const * driver = get_driver( _usbd_dev.ep2drv[epnum][ep_dir] );
|
|
|
TU_ASSERT(driver, );
|
|
|
|
|
|
- TU_LOG2(" %s xfer callback\r\n", driver->name);
|
|
|
+ TU_LOG(USBD_DBG, " %s xfer callback\r\n", driver->name);
|
|
|
driver->xfer_cb(event.rhport, ep_addr, (xfer_result_t)event.xfer_complete.result, event.xfer_complete.len);
|
|
|
}
|
|
|
}
|
|
|
@@ -557,27 +560,27 @@ void tud_task_ext(uint32_t timeout_ms, bool in_isr)
|
|
|
// e.g suspend -> resume -> unplug/plug. Skip suspend/resume if not connected
|
|
|
if ( _usbd_dev.connected )
|
|
|
{
|
|
|
- TU_LOG2(": Remote Wakeup = %u\r\n", _usbd_dev.remote_wakeup_en);
|
|
|
+ TU_LOG(USBD_DBG, ": Remote Wakeup = %u\r\n", _usbd_dev.remote_wakeup_en);
|
|
|
if (tud_suspend_cb) tud_suspend_cb(_usbd_dev.remote_wakeup_en);
|
|
|
}else
|
|
|
{
|
|
|
- TU_LOG2(" Skipped\r\n");
|
|
|
+ TU_LOG(USBD_DBG, " Skipped\r\n");
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case DCD_EVENT_RESUME:
|
|
|
if ( _usbd_dev.connected )
|
|
|
{
|
|
|
- TU_LOG2("\r\n");
|
|
|
+ TU_LOG(USBD_DBG, "\r\n");
|
|
|
if (tud_resume_cb) tud_resume_cb();
|
|
|
}else
|
|
|
{
|
|
|
- TU_LOG2(" Skipped\r\n");
|
|
|
+ TU_LOG(USBD_DBG, " Skipped\r\n");
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case USBD_EVENT_FUNC_CALL:
|
|
|
- TU_LOG2("\r\n");
|
|
|
+ TU_LOG(USBD_DBG, "\r\n");
|
|
|
if ( event.func_call.func ) event.func_call.func(event.func_call.param);
|
|
|
break;
|
|
|
|
|
|
@@ -602,7 +605,7 @@ void tud_task_ext(uint32_t timeout_ms, bool in_isr)
|
|
|
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_xfer_cb);
|
|
|
- TU_LOG2(" %s control request\r\n", driver->name);
|
|
|
+ TU_LOG(USBD_DBG, " %s control request\r\n", driver->name);
|
|
|
return driver->control_xfer_cb(rhport, CONTROL_STAGE_SETUP, request);
|
|
|
}
|
|
|
|
|
|
@@ -626,8 +629,8 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const
|
|
|
#if CFG_TUSB_DEBUG >= 2
|
|
|
if (TUSB_REQ_TYPE_STANDARD == p_request->bmRequestType_bit.type && p_request->bRequest <= TUSB_REQ_SYNCH_FRAME)
|
|
|
{
|
|
|
- TU_LOG2(" %s", tu_str_std_request[p_request->bRequest]);
|
|
|
- if (TUSB_REQ_GET_DESCRIPTOR != p_request->bRequest) TU_LOG2("\r\n");
|
|
|
+ TU_LOG(USBD_DBG, " %s", tu_str_std_request[p_request->bRequest]);
|
|
|
+ if (TUSB_REQ_GET_DESCRIPTOR != p_request->bRequest) TU_LOG(USBD_DBG, "\r\n");
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
@@ -735,7 +738,7 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const
|
|
|
// Device status bit mask
|
|
|
// - Bit 0: Self Powered
|
|
|
// - Bit 1: Remote Wakeup enabled
|
|
|
- uint16_t status = (_usbd_dev.self_powered ? 1 : 0) | (_usbd_dev.remote_wakeup_en ? 2 : 0);
|
|
|
+ uint16_t status = (uint16_t) ((_usbd_dev.self_powered ? 1u : 0u) | (_usbd_dev.remote_wakeup_en ? 2u : 0u));
|
|
|
tud_control_xfer(rhport, p_request, &status, 2);
|
|
|
}
|
|
|
break;
|
|
|
@@ -867,8 +870,8 @@ static bool process_set_config(uint8_t rhport, uint8_t cfg_num)
|
|
|
TU_ASSERT(desc_cfg != NULL && desc_cfg->bDescriptorType == TUSB_DESC_CONFIGURATION);
|
|
|
|
|
|
// Parse configuration descriptor
|
|
|
- _usbd_dev.remote_wakeup_support = (desc_cfg->bmAttributes & TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP) ? 1 : 0;
|
|
|
- _usbd_dev.self_powered = (desc_cfg->bmAttributes & TUSB_DESC_CONFIG_ATT_SELF_POWERED ) ? 1 : 0;
|
|
|
+ _usbd_dev.remote_wakeup_support = (desc_cfg->bmAttributes & TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP) ? 1u : 0u;
|
|
|
+ _usbd_dev.self_powered = (desc_cfg->bmAttributes & TUSB_DESC_CONFIG_ATT_SELF_POWERED ) ? 1u : 0u;
|
|
|
|
|
|
// Parse interface descriptor
|
|
|
uint8_t const * p_desc = ((uint8_t const*) desc_cfg) + sizeof(tusb_desc_configuration_t);
|
|
|
@@ -895,17 +898,18 @@ static bool process_set_config(uint8_t rhport, uint8_t cfg_num)
|
|
|
tusb_desc_interface_t const * desc_itf = (tusb_desc_interface_t const*) p_desc;
|
|
|
|
|
|
// Find driver for this interface
|
|
|
- uint16_t const remaining_len = desc_end-p_desc;
|
|
|
+ uint16_t const remaining_len = (uint16_t) (desc_end-p_desc);
|
|
|
uint8_t drv_id;
|
|
|
for (drv_id = 0; drv_id < TOTAL_DRIVER_COUNT; drv_id++)
|
|
|
{
|
|
|
usbd_class_driver_t const *driver = get_driver(drv_id);
|
|
|
+ TU_ASSERT(driver);
|
|
|
uint16_t const drv_len = driver->open(rhport, desc_itf, remaining_len);
|
|
|
|
|
|
if ( (sizeof(tusb_desc_interface_t) <= drv_len) && (drv_len <= remaining_len) )
|
|
|
{
|
|
|
// Open successfully
|
|
|
- TU_LOG2(" %s opened\r\n", driver->name);
|
|
|
+ TU_LOG(USBD_DBG, " %s opened\r\n", driver->name);
|
|
|
|
|
|
// Some drivers use 2 or more interfaces but may not have IAD e.g MIDI (always) or
|
|
|
// BTH (even CDC) with class in device descriptor (single interface)
|
|
|
@@ -964,7 +968,7 @@ static bool process_get_descriptor(uint8_t rhport, tusb_control_request_t const
|
|
|
{
|
|
|
case TUSB_DESC_DEVICE:
|
|
|
{
|
|
|
- TU_LOG2(" Device\r\n");
|
|
|
+ TU_LOG(USBD_DBG, " Device\r\n");
|
|
|
|
|
|
void* desc_device = (void*) (uintptr_t) tud_descriptor_device_cb();
|
|
|
|
|
|
@@ -988,7 +992,7 @@ static bool process_get_descriptor(uint8_t rhport, tusb_control_request_t const
|
|
|
|
|
|
case TUSB_DESC_BOS:
|
|
|
{
|
|
|
- TU_LOG2(" BOS\r\n");
|
|
|
+ TU_LOG(USBD_DBG, " BOS\r\n");
|
|
|
|
|
|
// requested by host if USB > 2.0 ( i.e 2.1 or 3.x )
|
|
|
if (!tud_descriptor_bos_cb) return false;
|
|
|
@@ -1010,12 +1014,12 @@ static bool process_get_descriptor(uint8_t rhport, tusb_control_request_t const
|
|
|
|
|
|
if ( desc_type == TUSB_DESC_CONFIGURATION )
|
|
|
{
|
|
|
- TU_LOG2(" Configuration[%u]\r\n", desc_index);
|
|
|
+ TU_LOG(USBD_DBG, " Configuration[%u]\r\n", desc_index);
|
|
|
desc_config = (uintptr_t) tud_descriptor_configuration_cb(desc_index);
|
|
|
}else
|
|
|
{
|
|
|
// Host only request this after getting Device Qualifier descriptor
|
|
|
- TU_LOG2(" Other Speed Configuration\r\n");
|
|
|
+ TU_LOG(USBD_DBG, " Other Speed Configuration\r\n");
|
|
|
TU_VERIFY( tud_descriptor_other_speed_configuration_cb );
|
|
|
desc_config = (uintptr_t) tud_descriptor_other_speed_configuration_cb(desc_index);
|
|
|
}
|
|
|
@@ -1031,7 +1035,7 @@ static bool process_get_descriptor(uint8_t rhport, tusb_control_request_t const
|
|
|
|
|
|
case TUSB_DESC_STRING:
|
|
|
{
|
|
|
- TU_LOG2(" String[%u]\r\n", desc_index);
|
|
|
+ TU_LOG(USBD_DBG, " String[%u]\r\n", desc_index);
|
|
|
|
|
|
// String Descriptor always uses the desc set from user
|
|
|
uint8_t const* desc_str = (uint8_t const*) tud_descriptor_string_cb(desc_index, tu_le16toh(p_request->wIndex));
|
|
|
@@ -1044,7 +1048,7 @@ static bool process_get_descriptor(uint8_t rhport, tusb_control_request_t const
|
|
|
|
|
|
case TUSB_DESC_DEVICE_QUALIFIER:
|
|
|
{
|
|
|
- TU_LOG2(" Device Qualifier\r\n");
|
|
|
+ TU_LOG(USBD_DBG, " Device Qualifier\r\n");
|
|
|
|
|
|
TU_VERIFY( tud_descriptor_device_qualifier_cb );
|
|
|
|
|
|
@@ -1101,7 +1105,7 @@ TU_ATTR_FAST_FUNC void dcd_event_handler(dcd_event_t const * event, bool in_isr)
|
|
|
for (uint8_t i = 0; i < TOTAL_DRIVER_COUNT; i++)
|
|
|
{
|
|
|
usbd_class_driver_t const * driver = get_driver(i);
|
|
|
- if (driver->sof)
|
|
|
+ if (driver && driver->sof)
|
|
|
{
|
|
|
driver->sof(event->rhport, event->sof.frame_count);
|
|
|
}
|
|
|
@@ -1237,7 +1241,7 @@ bool usbd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t
|
|
|
// TODO skip ready() check for now since enumeration also use this API
|
|
|
// TU_VERIFY(tud_ready());
|
|
|
|
|
|
- TU_LOG2(" Queue EP %02X with %u bytes ...\r\n", ep_addr, total_bytes);
|
|
|
+ TU_LOG(USBD_DBG, " Queue EP %02X with %u bytes ...\r\n", ep_addr, total_bytes);
|
|
|
|
|
|
// Attempt to transfer on a busy endpoint, sound like an race condition !
|
|
|
TU_ASSERT(_usbd_dev.ep_status[epnum][dir].busy == 0);
|
|
|
@@ -1254,7 +1258,7 @@ bool usbd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t
|
|
|
// DCD error, mark endpoint as ready to allow next transfer
|
|
|
_usbd_dev.ep_status[epnum][dir].busy = false;
|
|
|
_usbd_dev.ep_status[epnum][dir].claimed = 0;
|
|
|
- TU_LOG2("FAILED\r\n");
|
|
|
+ TU_LOG(USBD_DBG, "FAILED\r\n");
|
|
|
TU_BREAKPOINT();
|
|
|
return false;
|
|
|
}
|
|
|
@@ -1271,7 +1275,7 @@ bool usbd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t * ff, uint16
|
|
|
uint8_t const epnum = tu_edpt_number(ep_addr);
|
|
|
uint8_t const dir = tu_edpt_dir(ep_addr);
|
|
|
|
|
|
- TU_LOG2(" Queue ISO EP %02X with %u bytes ... ", ep_addr, total_bytes);
|
|
|
+ TU_LOG(USBD_DBG, " Queue ISO EP %02X with %u bytes ... ", ep_addr, total_bytes);
|
|
|
|
|
|
// Attempt to transfer on a busy endpoint, sound like an race condition !
|
|
|
TU_ASSERT(_usbd_dev.ep_status[epnum][dir].busy == 0);
|
|
|
@@ -1282,14 +1286,14 @@ bool usbd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t * ff, uint16
|
|
|
|
|
|
if (dcd_edpt_xfer_fifo(rhport, ep_addr, ff, total_bytes))
|
|
|
{
|
|
|
- TU_LOG2("OK\r\n");
|
|
|
+ TU_LOG(USBD_DBG, "OK\r\n");
|
|
|
return true;
|
|
|
}else
|
|
|
{
|
|
|
// DCD error, mark endpoint as ready to allow next transfer
|
|
|
_usbd_dev.ep_status[epnum][dir].busy = false;
|
|
|
_usbd_dev.ep_status[epnum][dir].claimed = 0;
|
|
|
- TU_LOG2("failed\r\n");
|
|
|
+ TU_LOG(USBD_DBG, "failed\r\n");
|
|
|
TU_BREAKPOINT();
|
|
|
return false;
|
|
|
}
|
|
|
@@ -1360,7 +1364,7 @@ void usbd_edpt_close(uint8_t rhport, uint8_t ep_addr)
|
|
|
rhport = _usbd_rhport;
|
|
|
|
|
|
TU_ASSERT(dcd_edpt_close, /**/);
|
|
|
- TU_LOG2(" CLOSING Endpoint: 0x%02X\r\n", ep_addr);
|
|
|
+ TU_LOG(USBD_DBG, " CLOSING Endpoint: 0x%02X\r\n", ep_addr);
|
|
|
|
|
|
uint8_t const epnum = tu_edpt_number(ep_addr);
|
|
|
uint8_t const dir = tu_edpt_dir(ep_addr);
|