From 1c2beba85c223bcf401f877b0c29025490fcdaa4 Mon Sep 17 00:00:00 2001 From: hathach Date: Fri, 29 Mar 2019 16:23:00 +0700 Subject: working on suspend and resume change dcd_init signature --- src/device/dcd.h | 9 +++++++-- src/device/usbd.c | 42 +++++++++++++++++++++++++++++------------- src/device/usbd.h | 11 ++++++++--- 3 files changed, 44 insertions(+), 18 deletions(-) (limited to 'src/device') diff --git a/src/device/dcd.h b/src/device/dcd.h index 9abebc2af..f47c3714a 100644 --- a/src/device/dcd.h +++ b/src/device/dcd.h @@ -80,7 +80,9 @@ TU_VERIFY_STATIC(sizeof(dcd_event_t) <= 12, "size is not correct"); /*------------------------------------------------------------------*/ /* Device API *------------------------------------------------------------------*/ -bool dcd_init (uint8_t rhport); + +// Initialize controller to device mode +void dcd_init (uint8_t rhport); // Enable device interrupt void dcd_int_enable (uint8_t rhport); @@ -91,9 +93,12 @@ void dcd_int_disable(uint8_t rhport); // Receive Set Address request, mcu port must also include status IN response void dcd_set_address(uint8_t rhport, uint8_t dev_addr); -// Receive Set Config request +// Receive Set Configure request void dcd_set_config (uint8_t rhport, uint8_t config_num); +// Wake up host +void dcd_remote_wakeup(uint8_t rhport); + /*------------------------------------------------------------------*/ /* Endpoint API * - open : Configure endpoint's registers diff --git a/src/device/usbd.c b/src/device/usbd.c index 933e0f846..5127cfaab 100644 --- a/src/device/usbd.c +++ b/src/device/usbd.c @@ -40,12 +40,13 @@ // Device Data //--------------------------------------------------------------------+ typedef struct { - volatile uint8_t config_num; // 0 is non-configure ~ disconnect + volatile uint8_t config_num; // 0 is non-configured ~ disconnect + bool remote_wakeup_en; uint8_t itf2drv[16]; // map interface number to driver (0xff is invalid) uint8_t ep2drv[8][2]; // map endpoint to driver ( 0xff is invalid ) - uint8_t ep_busy_mask[2]; // bit mask for busy endpoint +// uint8_t ep_busy_mask[2]; // bit mask for busy endpoint uint8_t ep_stall_mask[2]; // bit mask for stalled endpoint }usbd_device_t; @@ -186,7 +187,7 @@ bool usbd_init (void) for (uint8_t i = 0; i < USBD_CLASS_DRIVER_COUNT; i++) usbd_class_drivers[i].init(); // Init device controller driver - TU_ASSERT(dcd_init(TUD_OPT_RHPORT)); + dcd_init(TUD_OPT_RHPORT); dcd_int_enable(TUD_OPT_RHPORT); return true; @@ -352,6 +353,20 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const if ( data_buf == NULL || data_len == 0 ) return false; break; + case TUSB_REQ_SET_FEATURE: + if ( TUSB_REQ_FEATURE_REMOTE_WAKEUP == p_request->wValue ) + { + // Host enable remote wake up before suspending especially HID device + } + break; + + case TUSB_REQ_CLEAR_FEATURE: + if ( TUSB_REQ_FEATURE_REMOTE_WAKEUP == p_request->wValue ) + { + // Host disable remote wake up after resuming + } + break; + default: TU_BREAKPOINT(); return false; @@ -386,15 +401,19 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const break; case TUSB_REQ_CLEAR_FEATURE: - // only endpoint feature is halted/stalled - dcd_edpt_clear_stall(rhport, tu_u16_low(p_request->wIndex)); - usbd_control_status(rhport, p_request); + if ( TUSB_REQ_FEATURE_EDPT_HALT == p_request->wValue ) + { + dcd_edpt_clear_stall(rhport, tu_u16_low(p_request->wIndex)); + usbd_control_status(rhport, p_request); + } break; case TUSB_REQ_SET_FEATURE: - // only endpoint feature is halted/stalled - usbd_edpt_stall(rhport, tu_u16_low(p_request->wIndex)); - usbd_control_status(rhport, p_request); + if ( TUSB_REQ_FEATURE_EDPT_HALT == p_request->wValue ) + { + usbd_edpt_stall(rhport, tu_u16_low(p_request->wIndex)); + usbd_control_status(rhport, p_request); + } break; default: @@ -556,11 +575,8 @@ void dcd_event_handler(dcd_event_t const * event, bool in_isr) break; case DCD_EVENT_SUSPEND: - // TODO support suspended - break; - case DCD_EVENT_RESUME: - // TODO support resume + osal_queue_send(_usbd_q, event, in_isr); break; case DCD_EVENT_SETUP_RECEIVED: diff --git a/src/device/usbd.h b/src/device/usbd.h index 614b4f311..6bf7eca02 100644 --- a/src/device/usbd.h +++ b/src/device/usbd.h @@ -60,7 +60,6 @@ typedef struct { }tud_desc_set_t; - // Must be defined by application extern tud_desc_set_t tud_desc_set; @@ -70,6 +69,8 @@ extern tud_desc_set_t tud_desc_set; bool tud_mounted(void); void tud_task (void); +bool tud_remote_wakeup(void); + //--------------------------------------------------------------------+ // APPLICATION CALLBACK (WEAK is optional) //--------------------------------------------------------------------+ @@ -77,10 +78,14 @@ void tud_task (void); // Callback invoked when device is mounted (configured) ATTR_WEAK void tud_mount_cb(void); -// Callback invoked when device is unmounted (bus reset/unplugged) +// Callback invoked when device is unmounted ATTR_WEAK void tud_umount_cb(void); -//void tud_device_suspended_cb(void); +// Callback invoked when device is suspended +ATTR_WEAK void tud_suspend_cb(bool remote_wakeup_en); + +// Callback invoked when device is resumed +ATTR_WEAK void tud_resume_cb(void); #ifdef __cplusplus } -- cgit v1.3.1