diff options
| author | hathach <[email protected]> | 2019-10-24 13:17:01 +0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2019-10-24 13:17:01 +0700 |
| commit | 5d975d93139e0ce346372dc07ca34ef9df7b0287 (patch) | |
| tree | 8661248bd0392312a212dd02e07b06f6fa248da8 /src/device/usbd.c | |
| parent | e413c9efa303d70de019a91aa415384fe80ca78f (diff) | |
| parent | 6f952a8e84acfbc962cf3d37ed72bddefebaf58b (diff) | |
Merge pull request #203 from hathach/develop
add log support using uart with CFG_TUSB_DEBUG >= 2, close #200
Diffstat (limited to 'src/device/usbd.c')
| -rw-r--r-- | src/device/usbd.c | 124 |
1 files changed, 103 insertions, 21 deletions
diff --git a/src/device/usbd.c b/src/device/usbd.c index 14e56a9b7..f2becab95 100644 --- a/src/device/usbd.c +++ b/src/device/usbd.c @@ -192,6 +192,66 @@ void usbd_control_reset (uint8_t rhport); bool usbd_control_xfer_cb (uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes);
void usbd_control_set_complete_callback( bool (*fp) (uint8_t, tusb_control_request_t const * ) );
+
+//--------------------------------------------------------------------+
+// Debugging
+//--------------------------------------------------------------------+
+#if CFG_TUSB_DEBUG > 1
+static char const* const _usbd_event_str[DCD_EVENT_COUNT] =
+{
+ "INVALID" ,
+ "BUS_RESET" ,
+ "UNPLUGGED" ,
+ "SOF" ,
+ "SUSPEND" ,
+ "RESUME" ,
+ "SETUP_RECEIVED" ,
+ "XFER_COMPLETE" ,
+ "FUNC_CALL"
+};
+
+// must be same driver order as usbd_class_drivers[]
+static char const* const _usbd_driver_str[USBD_CLASS_DRIVER_COUNT] =
+{
+ #if CFG_TUD_CDC
+ "CDC",
+ #endif
+ #if CFG_TUD_MSC
+ "MSC",
+ #endif
+ #if CFG_TUD_HID
+ "HID",
+ #endif
+ #if CFG_TUD_MIDI
+ "MIDI",
+ #endif
+ #if CFG_TUD_VENDOR
+ "Vendor",
+ #endif
+ #if CFG_TUD_USBTMC
+ "USBTMC"
+ #endif
+};
+
+static char const* const _tusb_std_request_str[] =
+{
+ "Get Status" ,
+ "Clear Feature" ,
+ "Reserved" ,
+ "Set Feature" ,
+ "Reserved" ,
+ "Set Address" ,
+ "Get Descriptor" ,
+ "Set Descriptor" ,
+ "Get Configuration" ,
+ "Set Configuration" ,
+ "Get Interface" ,
+ "Set Interface" ,
+ "Synch Frame"
+};
+
+#endif
+
//--------------------------------------------------------------------+
// Application API
//--------------------------------------------------------------------+
@@ -218,6 +278,8 @@ bool tud_remote_wakeup(void) //--------------------------------------------------------------------+
bool usbd_init (void)
{
+ TU_LOG2("USBD init\r\n");
+
tu_varclr(&_usbd_dev);
// Init device queue & task
@@ -225,7 +287,11 @@ bool usbd_init (void) TU_ASSERT(_usbd_q != NULL);
// Init class drivers
- for (uint8_t i = 0; i < USBD_CLASS_DRIVER_COUNT; i++) usbd_class_drivers[i].init();
+ for (uint8_t i = 0; i < USBD_CLASS_DRIVER_COUNT; i++)
+ {
+ TU_LOG2("%s init\r\n", _usbd_driver_str[i]);
+ usbd_class_drivers[i].init();
+ }
// Init device controller driver
dcd_init(TUD_OPT_RHPORT);
@@ -279,6 +345,8 @@ void tud_task (void) if ( !osal_queue_receive(_usbd_q, &event) ) return;
+ TU_LOG2("USBD: event %s\r\n", event.event_id < DCD_EVENT_COUNT ? _usbd_event_str[event.event_id] : "CORRUPTED");
+
switch ( event.event_id )
{
case DCD_EVENT_BUS_RESET:
@@ -293,6 +361,9 @@ void tud_task (void) break;
case DCD_EVENT_SETUP_RECEIVED:
+ TU_LOG2(" ");
+ TU_LOG2_MEM(&event.setup_received, 1, 8);
+
// 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
_usbd_dev.connected = 1;
@@ -307,29 +378,30 @@ void tud_task (void) break;
case DCD_EVENT_XFER_COMPLETE:
- // Only handle xfer callback in ready state
- // if (_usbd_dev.connected && !_usbd_dev.suspended)
- {
- // Invoke the class callback associated with the endpoint address
- uint8_t const ep_addr = event.xfer_complete.ep_addr;
- uint8_t const epnum = tu_edpt_number(ep_addr);
- uint8_t const ep_dir = tu_edpt_dir(ep_addr);
+ {
+ // Invoke the class callback associated with the endpoint address
+ uint8_t const ep_addr = event.xfer_complete.ep_addr;
+ uint8_t const epnum = tu_edpt_number(ep_addr);
+ uint8_t const ep_dir = tu_edpt_dir(ep_addr);
- _usbd_dev.ep_status[epnum][ep_dir].busy = false;
+ TU_LOG2(" Endpoint: 0x%02X, Bytes: %ld\r\n", ep_addr, event.xfer_complete.len);
- if ( 0 == epnum )
- {
- // control transfer DATA stage callback
- usbd_control_xfer_cb(event.rhport, ep_addr, event.xfer_complete.result, event.xfer_complete.len);
- }
- else
- {
- uint8_t const drv_id = _usbd_dev.ep2drv[epnum][ep_dir];
- TU_ASSERT(drv_id < USBD_CLASS_DRIVER_COUNT,);
+ _usbd_dev.ep_status[epnum][ep_dir].busy = false;
- usbd_class_drivers[drv_id].xfer_cb(event.rhport, ep_addr, event.xfer_complete.result, event.xfer_complete.len);
- }
+ if ( 0 == epnum )
+ {
+ // control transfer DATA stage callback
+ usbd_control_xfer_cb(event.rhport, ep_addr, event.xfer_complete.result, event.xfer_complete.len);
+ }
+ else
+ {
+ uint8_t const drv_id = _usbd_dev.ep2drv[epnum][ep_dir];
+ TU_ASSERT(drv_id < USBD_CLASS_DRIVER_COUNT,);
+
+ TU_LOG2(" %s xfer callback\r\n", _usbd_driver_str[drv_id]);
+ usbd_class_drivers[drv_id].xfer_cb(event.rhport, ep_addr, event.xfer_complete.result, event.xfer_complete.len);
}
+ }
break;
case DCD_EVENT_SUSPEND:
@@ -382,6 +454,13 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const return tud_vendor_control_request_cb(rhport, p_request);
}
+#if CFG_TUSB_DEBUG > 1
+ if (TUSB_REQ_TYPE_STANDARD == p_request->bmRequestType_bit.type && p_request->bRequest <= TUSB_REQ_SYNCH_FRAME)
+ {
+ TU_LOG2(" %s\r\n", _tusb_std_request_str[p_request->bRequest]);
+ }
+#endif
+
switch ( p_request->bmRequestType_bit.recipient )
{
//------------- Device Requests e.g in enumeration -------------//
@@ -494,6 +573,7 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const // GET HID REPORT DESCRIPTOR falls into this case
// stall control endpoint if driver return false
usbd_control_set_complete_callback(usbd_class_drivers[drvid].control_complete);
+ TU_LOG2(" %s control request\r\n", _usbd_driver_str[drvid]);
TU_ASSERT(usbd_class_drivers[drvid].control_request != NULL &&
usbd_class_drivers[drvid].control_request(rhport, p_request));
break;
@@ -503,6 +583,7 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const // forward to class driver: "non-STD request to Interface"
// stall control endpoint if driver return false
usbd_control_set_complete_callback(usbd_class_drivers[drvid].control_complete);
+ TU_LOG2(" %s control request\r\n", _usbd_driver_str[drvid]);
TU_ASSERT(usbd_class_drivers[drvid].control_request != NULL &&
usbd_class_drivers[drvid].control_request(rhport, p_request));
}
@@ -570,7 +651,7 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const // For std-type requests: non-std request codes are already discarded.
// must not call tud_control_status(), and return value will have no effect
// class driver is invoked last, so that EP already has EP stall cleared (in event of clear feature EP halt)
-
+ TU_LOG2(" %s control request\r\n", _usbd_driver_str[drv_id]);
if ( usbd_class_drivers[drv_id].control_request &&
usbd_class_drivers[drv_id].control_request(rhport, p_request))
{
@@ -627,6 +708,7 @@ static bool process_set_config(uint8_t rhport, uint8_t cfg_num) _usbd_dev.itf2drv[desc_itf->bInterfaceNumber] = drv_id;
uint16_t itf_len=0;
+ TU_LOG2(" %s open\r\n", _usbd_driver_str[drv_id]);
TU_ASSERT( usbd_class_drivers[drv_id].open(rhport, desc_itf, &itf_len) );
TU_ASSERT( itf_len >= sizeof(tusb_desc_interface_t) );
|
