From 8eb99bcbb5132714833e2e1da830240d72cef70c Mon Sep 17 00:00:00 2001 From: Johann Fischer Date: Wed, 8 Jul 2020 22:38:58 +0200 Subject: [PATCH] usb: cdc_acm: re-trigger transfer for OUT endpoint on resume Transfers are cancelled on suspend event, OUT transfers needs to be re-trigger on resume. Rework event handling to filter out spurious resume events and re-trigger transfer if previous event was a suspend event. Signed-off-by: Johann Fischer --- subsys/usb/class/cdc_acm.c | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/subsys/usb/class/cdc_acm.c b/subsys/usb/class/cdc_acm.c index 54ebcc6bd93..0f5f2ff50c6 100644 --- a/subsys/usb/class/cdc_acm.c +++ b/subsys/usb/class/cdc_acm.c @@ -402,22 +402,18 @@ static void cdc_acm_do_cb(struct cdc_acm_dev_data_t *dev_data, struct device *dev = dev_data->common.dev; struct usb_cfg_data *cfg = (void *)dev->config_info; - /* Store the new status */ - if (!(status == USB_DC_SOF || status == USB_DC_INTERFACE)) { - dev_data->usb_status = status; - } - /* Check the USB status and do needed action if required */ switch (status) { case USB_DC_ERROR: - LOG_DBG("USB device error"); + LOG_DBG("Device error"); break; case USB_DC_RESET: - LOG_DBG("USB device reset detected"); + LOG_DBG("Device reset detected"); cdc_acm_reset_port(dev_data); + dev_data->usb_status = status; break; case USB_DC_CONNECTED: - LOG_DBG("USB device connected"); + LOG_DBG("Device connected"); break; case USB_DC_CONFIGURED: cdc_acm_read_cb(cfg->endpoint[ACM_OUT_EP_IDX].ep_addr, 0, @@ -425,25 +421,34 @@ static void cdc_acm_do_cb(struct cdc_acm_dev_data_t *dev_data, dev_data->tx_ready = true; dev_data->tx_irq_ena = true; dev_data->rx_irq_ena = true; - LOG_INF("USB device configured"); + dev_data->usb_status = status; + LOG_INF("Device configured"); break; case USB_DC_DISCONNECTED: - LOG_INF("USB device disconnected"); + LOG_INF("Device disconnected"); cdc_acm_reset_port(dev_data); + dev_data->usb_status = status; break; case USB_DC_SUSPEND: - LOG_INF("USB device suspended"); + LOG_INF("Device suspended"); + dev_data->usb_status = status; break; case USB_DC_RESUME: - dev_data->usb_status = USB_DC_CONFIGURED; - LOG_INF("USB device resumed"); + if (dev_data->usb_status == USB_DC_SUSPEND) { + cdc_acm_read_cb(cfg->endpoint[ACM_OUT_EP_IDX].ep_addr, + 0, dev_data); + dev_data->usb_status = USB_DC_CONFIGURED; + LOG_INF("Define resumed"); + } else { + LOG_DBG("Spurious resume event"); + } break; case USB_DC_SOF: case USB_DC_INTERFACE: break; case USB_DC_UNKNOWN: default: - LOG_DBG("USB unknown state"); + LOG_DBG("Unknown event"); break; } }