working on suspend and resume
change dcd_init signature
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user