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:
parent
3c82d233e3
commit
ea7afdde8f
2 changed files with 54 additions and 6 deletions
|
@ -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
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue