summaryrefslogtreecommitdiff
path: root/tinyusb/class
diff options
context:
space:
mode:
authorhathach <[email protected]>2018-03-15 13:22:28 +0700
committerhathach <[email protected]>2018-03-15 13:22:28 +0700
commitb0ec6124e014178601d6090bb251757c92c8adbf (patch)
tree70dc145c1568bb6a6a34609edd9a58d7bdf6ff65 /tinyusb/class
parent49a7f8c363c030cb346099a27fdb849aa8f0718d (diff)
nrf52 control transfer work reliably
Diffstat (limited to 'tinyusb/class')
-rw-r--r--tinyusb/class/cdc/cdc_device.c74
1 files changed, 38 insertions, 36 deletions
diff --git a/tinyusb/class/cdc/cdc_device.c b/tinyusb/class/cdc/cdc_device.c
index 957026d79..837f4e8eb 100644
--- a/tinyusb/class/cdc/cdc_device.c
+++ b/tinyusb/class/cdc/cdc_device.c
@@ -212,52 +212,54 @@ void cdcd_close(uint8_t port)
tusb_error_t cdcd_control_request_subtask(uint8_t port, tusb_control_request_t const * p_request)
{
+ OSAL_SUBTASK_BEGIN
+
+ tusb_error_t err;
+
//------------- Class Specific Request -------------//
if (p_request->bmRequestType_bit.type != TUSB_REQ_TYPE_CLASS) return TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT;
- switch(p_request->bRequest)
+ if (CDC_REQUEST_GET_LINE_CODING == p_request->bRequest)
+ {
+ OSAL_SUBTASK_INVOKED( usbd_control_xfer_substak(port, (tusb_dir_t) p_request->bmRequestType_bit.direction,
+ (uint8_t*) &cdcd_line_coding[port], min16_of(sizeof(cdc_line_coding_t), p_request->wLength)), err );
+ }
+ else if (CDC_REQUEST_SET_LINE_CODING == p_request->bRequest)
+ {
+ OSAL_SUBTASK_INVOKED( usbd_control_xfer_substak(port, (tusb_dir_t) p_request->bmRequestType_bit.direction,
+ (uint8_t*) &cdcd_line_coding[port], min16_of(sizeof(cdc_line_coding_t), p_request->wLength)), err );
+ // TODO notify application on xfer completea
+ }
+ else if (CDC_REQUEST_SET_CONTROL_LINE_STATE == p_request->bRequest )
{
- case CDC_REQUEST_GET_LINE_CODING:
- tusb_dcd_control_xfer(port, (tusb_dir_t) p_request->bmRequestType_bit.direction,
- (uint8_t*) &cdcd_line_coding[port], min16_of(sizeof(cdc_line_coding_t), p_request->wLength), false );
- break;
+ enum {
+ ACTIVE_DTE_PRESENT = 0x0003,
+ ACTIVE_DTE_NOT_PRESENT = 0x0002
+ };
- case CDC_REQUEST_SET_LINE_CODING:
- tusb_dcd_control_xfer(port, (tusb_dir_t) p_request->bmRequestType_bit.direction,
- (uint8_t*) &cdcd_line_coding[port], min16_of(sizeof(cdc_line_coding_t), p_request->wLength), false );
- // TODO notify application on xfer completea
- break;
+ cdcd_data_t * p_cdc = &cdcd_data[port];
- case CDC_REQUEST_SET_CONTROL_LINE_STATE: // TODO extract DTE present
+ if (p_request->wValue == ACTIVE_DTE_PRESENT)
{
- enum {
- ACTIVE_DTE_PRESENT = 0x0003,
- ACTIVE_DTE_NOT_PRESENT = 0x0002
- };
-
- cdcd_data_t * p_cdc = &cdcd_data[port];
-
- if (p_request->wValue == ACTIVE_DTE_PRESENT)
- {
- // terminal connected
- p_cdc->connected = true;
- }
- else if (p_request->wValue == ACTIVE_DTE_NOT_PRESENT)
- {
- // terminal disconnected
- p_cdc->connected = false;
- }else
- {
- // De-active --> disconnected
- p_cdc->connected = false;
- }
+ // terminal connected
+ p_cdc->connected = true;
+ }
+ else if (p_request->wValue == ACTIVE_DTE_NOT_PRESENT)
+ {
+ // terminal disconnected
+ p_cdc->connected = false;
+ }else
+ {
+ // De-active --> disconnected
+ p_cdc->connected = false;
}
- break;
-
- default: return TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT;
+ }
+ else
+ {
+ SUBTASK_RETURN(TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT);
}
- return TUSB_ERROR_NONE;
+ OSAL_SUBTASK_END
}
tusb_error_t cdcd_xfer_cb(uint8_t port, uint8_t edpt_addr, tusb_event_t event, uint32_t xferred_bytes)