From ea7afdde8f5a591f01458dd97aa28589b13cf24b Mon Sep 17 00:00:00 2001 From: Marcin Szymczyk Date: Wed, 27 Mar 2019 11:53:27 +0100 Subject: [PATCH] usb: cdc_acm: SerialState notification full support Added bBreak, bRingSignal, bFraming, bParity and bOverRun handling in cdc_acm_line_ctrl_set. Reference: Chapter 6.5.4 of Universal Serial Bus Communications Class Subclass Specification for PSTN Devices rev 1.2 Signed-off-by: Marcin Szymczyk --- include/usb/class/usb_cdc.h | 14 +++++++++-- subsys/usb/class/cdc_acm.c | 46 +++++++++++++++++++++++++++++++++---- 2 files changed, 54 insertions(+), 6 deletions(-) diff --git a/include/usb/class/usb_cdc.h b/include/usb/class/usb_cdc.h index 59dfcd9ee4b..1d8a22fb984 100644 --- a/include/usb/class/usb_cdc.h +++ b/include/usb/class/usb_cdc.h @@ -72,11 +72,21 @@ #define SET_CONTROL_LINE_STATE_RTS 0x02 #define SET_CONTROL_LINE_STATE_DTR 0x01 +/** Enhance enum uart_line_ctrl with CDC specific values */ +#define USB_CDC_LINE_CTRL_BAUD_RATE LINE_CTRL_BAUD_RATE +#define USB_CDC_LINE_CTRL_DCD LINE_CTRL_DCD +#define USB_CDC_LINE_CTRL_DSR LINE_CTRL_DSR +#define USB_CDC_LINE_CTRL_BREAK BIT(5) +#define USB_CDC_LINE_CTRL_RING_SIGNAL BIT(6) +#define USB_CDC_LINE_CTRL_FRAMING BIT(7) +#define USB_CDC_LINE_CTRL_PARITY BIT(8) +#define USB_CDC_LINE_CTRL_OVER_RUN BIT(9) + /** UART State Bitmap Values */ -#define SERIAL_STATE_OVERRUN 0x40 +#define SERIAL_STATE_OVER_RUN 0x40 #define SERIAL_STATE_PARITY 0x20 #define SERIAL_STATE_FRAMING 0x10 -#define SERIAL_STATE_RING 0x08 +#define SERIAL_STATE_RING_SIGNAL 0x08 #define SERIAL_STATE_BREAK 0x04 #define SERIAL_STATE_TX_CARRIER 0x02 #define SERIAL_STATE_RX_CARRIER 0x01 diff --git a/subsys/usb/class/cdc_acm.c b/subsys/usb/class/cdc_acm.c index 89d2094c541..7903bc84c0a 100644 --- a/subsys/usb/class/cdc_acm.c +++ b/subsys/usb/class/cdc_acm.c @@ -812,25 +812,63 @@ static int cdc_acm_line_ctrl_set(struct device *dev, struct cdc_acm_dev_data_t * const dev_data = DEV_DATA(dev); switch (ctrl) { - case LINE_CTRL_BAUD_RATE: + case USB_CDC_LINE_CTRL_BAUD_RATE: cdc_acm_baudrate_set(dev, val); return 0; - case LINE_CTRL_DCD: + case USB_CDC_LINE_CTRL_DCD: dev_data->serial_state &= ~SERIAL_STATE_RX_CARRIER; if (val) { dev_data->serial_state |= SERIAL_STATE_RX_CARRIER; } - cdc_acm_send_notification(dev, SERIAL_STATE_RX_CARRIER); return 0; - case LINE_CTRL_DSR: + case USB_CDC_LINE_CTRL_DSR: dev_data->serial_state &= ~SERIAL_STATE_TX_CARRIER; if (val) { dev_data->serial_state |= SERIAL_STATE_TX_CARRIER; } + cdc_acm_send_notification(dev, dev_data->serial_state); + return 0; + case USB_CDC_LINE_CTRL_BREAK: + dev_data->serial_state &= ~SERIAL_STATE_BREAK; + if (val) { + dev_data->serial_state |= SERIAL_STATE_BREAK; + } + cdc_acm_send_notification(dev, dev_data->serial_state); + return 0; + case USB_CDC_LINE_CTRL_RING_SIGNAL: + dev_data->serial_state &= ~SERIAL_STATE_RING_SIGNAL; + + if (val) { + dev_data->serial_state |= SERIAL_STATE_RING_SIGNAL; + } + cdc_acm_send_notification(dev, dev_data->serial_state); + return 0; + case USB_CDC_LINE_CTRL_FRAMING: + dev_data->serial_state &= ~SERIAL_STATE_FRAMING; + + if (val) { + dev_data->serial_state |= SERIAL_STATE_FRAMING; + } + cdc_acm_send_notification(dev, dev_data->serial_state); + return 0; + case USB_CDC_LINE_CTRL_PARITY: + dev_data->serial_state &= ~SERIAL_STATE_PARITY; + + if (val) { + dev_data->serial_state |= SERIAL_STATE_PARITY; + } + cdc_acm_send_notification(dev, dev_data->serial_state); + return 0; + case USB_CDC_LINE_CTRL_OVER_RUN: + dev_data->serial_state &= ~SERIAL_STATE_OVER_RUN; + + if (val) { + dev_data->serial_state |= SERIAL_STATE_OVER_RUN; + } cdc_acm_send_notification(dev, dev_data->serial_state); return 0; default: