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 <Marcin.Szymczyk@nordicsemi.no>
This commit is contained in:
Marcin Szymczyk 2019-03-27 11:53:27 +01:00 committed by Kumar Gala
commit ea7afdde8f
2 changed files with 54 additions and 6 deletions

View file

@ -72,11 +72,21 @@
#define SET_CONTROL_LINE_STATE_RTS 0x02 #define SET_CONTROL_LINE_STATE_RTS 0x02
#define SET_CONTROL_LINE_STATE_DTR 0x01 #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 */ /** UART State Bitmap Values */
#define SERIAL_STATE_OVERRUN 0x40 #define SERIAL_STATE_OVER_RUN 0x40
#define SERIAL_STATE_PARITY 0x20 #define SERIAL_STATE_PARITY 0x20
#define SERIAL_STATE_FRAMING 0x10 #define SERIAL_STATE_FRAMING 0x10
#define SERIAL_STATE_RING 0x08 #define SERIAL_STATE_RING_SIGNAL 0x08
#define SERIAL_STATE_BREAK 0x04 #define SERIAL_STATE_BREAK 0x04
#define SERIAL_STATE_TX_CARRIER 0x02 #define SERIAL_STATE_TX_CARRIER 0x02
#define SERIAL_STATE_RX_CARRIER 0x01 #define SERIAL_STATE_RX_CARRIER 0x01

View file

@ -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); struct cdc_acm_dev_data_t * const dev_data = DEV_DATA(dev);
switch (ctrl) { switch (ctrl) {
case LINE_CTRL_BAUD_RATE: case USB_CDC_LINE_CTRL_BAUD_RATE:
cdc_acm_baudrate_set(dev, val); cdc_acm_baudrate_set(dev, val);
return 0; return 0;
case LINE_CTRL_DCD: case USB_CDC_LINE_CTRL_DCD:
dev_data->serial_state &= ~SERIAL_STATE_RX_CARRIER; dev_data->serial_state &= ~SERIAL_STATE_RX_CARRIER;
if (val) { if (val) {
dev_data->serial_state |= SERIAL_STATE_RX_CARRIER; dev_data->serial_state |= SERIAL_STATE_RX_CARRIER;
} }
cdc_acm_send_notification(dev, SERIAL_STATE_RX_CARRIER); cdc_acm_send_notification(dev, SERIAL_STATE_RX_CARRIER);
return 0; return 0;
case LINE_CTRL_DSR: case USB_CDC_LINE_CTRL_DSR:
dev_data->serial_state &= ~SERIAL_STATE_TX_CARRIER; dev_data->serial_state &= ~SERIAL_STATE_TX_CARRIER;
if (val) { if (val) {
dev_data->serial_state |= SERIAL_STATE_TX_CARRIER; 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); cdc_acm_send_notification(dev, dev_data->serial_state);
return 0; return 0;
default: default: