Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for TUSB_REQ_FEATURE_TEST_MODE #2413

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/device/dcd.h
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,8 @@ void dcd_disconnect(uint8_t rhport) TU_ATTR_WEAK;
// Enable/Disable Start-of-frame interrupt. Default is disabled
void dcd_sof_enable(uint8_t rhport, bool en);

// Transition device to test mode
void dcd_set_test_mode(uint16_t test_mode) TU_ATTR_WEAK;
//--------------------------------------------------------------------+
// Endpoint API
//--------------------------------------------------------------------+
Expand Down
39 changes: 34 additions & 5 deletions src/device/usbd.c
Original file line number Diff line number Diff line change
Expand Up @@ -719,13 +719,34 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const

case TUSB_REQ_SET_FEATURE:
// Only support remote wakeup for device feature
TU_VERIFY(TUSB_REQ_FEATURE_REMOTE_WAKEUP == p_request->wValue);
if(p_request->wValue == TUSB_REQ_FEATURE_REMOTE_WAKEUP)
{
TU_LOG(USBD_DBG, " Enable Remote Wakeup\r\n");

TU_LOG_USBD(" Enable Remote Wakeup\r\n");
// Host may enable remote wake up before suspending especially HID device
_usbd_dev.remote_wakeup_en = true;
tud_control_status(rhport, p_request);
}
else if((p_request->wValue == TUSB_REQ_FEATURE_TEST_MODE) && (p_request->wLength == 0))
{
/* Inspect for Test Selector (high byte of wIndex, lower byte must be zero) */
switch(p_request->wIndex)
{
case TUSB_USB_WINDEX_TEST_J:
case TUSB_USB_WINDEX_TEST_K:
case TUSB_USB_WINDEX_TEST_SE0_NAK:
case TUSB_USB_WINDEX_TEST_PACKET:
{
tud_control_status(rhport, p_request);
if(tud_test_mode_req_status_xfer_cb)
{
usbd_control_set_complete_callback(tud_test_mode_req_status_xfer_cb);
}
}
break;
}

// Host may enable remote wake up before suspending especially HID device
_usbd_dev.remote_wakeup_en = true;
tud_control_status(rhport, p_request);
}
break;

case TUSB_REQ_CLEAR_FEATURE:
Expand Down Expand Up @@ -1403,4 +1424,12 @@ bool usbd_edpt_iso_activate(uint8_t rhport, tusb_desc_endpoint_t const * desc_ep
return dcd_edpt_iso_activate(rhport, desc_ep);
}

// Set device in test mode in response to TUSB_REQ_FEATURE_TEST_MODE
bool usbd_set_test_mode(uint16_t test_mode)
{
TU_VERIFY(dcd_set_test_mode);
dcd_set_test_mode(test_mode);
return true;
}

#endif
11 changes: 11 additions & 0 deletions src/device/usbd.h
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,9 @@ void tud_event_hook_cb(uint8_t rhport, uint32_t eventid, bool in_isr);
// Invoked when received control request with VENDOR TYPE
TU_ATTR_WEAK bool tud_vendor_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);

// Invoked when ZLP xfer stage of TUSB_REQ_FEATURE_TEST_MODE request completes
TU_ATTR_WEAK bool tud_test_mode_req_status_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);

//--------------------------------------------------------------------+
// Binary Device Object Store (BOS) Descriptor Templates
//--------------------------------------------------------------------+
Expand Down Expand Up @@ -855,6 +858,14 @@ TU_ATTR_WEAK bool tud_vendor_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb
/* Endpoint Out */\
7, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0

// Test selector defines for Test mode
#define TUSB_USB_WINDEX_TEST_J (0x1<<8)
#define TUSB_USB_WINDEX_TEST_K (0x2<<8)
#define TUSB_USB_WINDEX_TEST_SE0_NAK (0x3<<8)
#define TUSB_USB_WINDEX_TEST_PACKET (0x4<<8)
#define TUSB_USB_WINDEX_TEST_FORCE_ENABLE (0x5<<8)


#ifdef __cplusplus
}
#endif
Expand Down
3 changes: 3 additions & 0 deletions src/device/usbd_pvt.h
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,9 @@ bool usbd_edpt_ready(uint8_t rhport, uint8_t ep_addr) {
// Enable SOF interrupt
void usbd_sof_enable(uint8_t rhport, bool en);

// Set device in test mode in response to TUSB_REQ_FEATURE_TEST_MODE
bool usbd_set_test_mode(uint16_t test_mode);

/*------------------------------------------------------------------*/
/* Helper
*------------------------------------------------------------------*/
Expand Down