| /** |
| * \file |
| * |
| * \brief USB Communication Device Class (CDC) protocol definitions |
| * |
| * Copyright (c) 2015-2018 Microchip Technology Inc. and its subsidiaries. |
| * |
| * \asf_license_start |
| * |
| * \page License |
| * |
| * Subject to your compliance with these terms, you may use Microchip |
| * software and any derivatives exclusively with Microchip products. |
| * It is your responsibility to comply with third party license terms applicable |
| * to your use of third party software (including open source software) that |
| * may accompany Microchip software. |
| * |
| * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, |
| * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, |
| * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, |
| * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE |
| * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL |
| * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE |
| * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE |
| * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT |
| * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY |
| * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, |
| * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. |
| * |
| * \asf_license_stop |
| * |
| */ |
| /* |
| * Support and FAQ: visit <a href="https://www.microchip.com/support/">Microchip Support</a> |
| */ |
| #ifndef _USB_PROTOCOL_CDC_H_ |
| #define _USB_PROTOCOL_CDC_H_ |
| |
| #include "usb_includes.h" |
| |
| /** |
| * \ingroup usb_protocol_group |
| * \defgroup cdc_protocol_group Communication Device Class Definitions |
| * @{ |
| */ |
| |
| /** |
| * \name Possible values of class |
| */ |
| //@{ |
| #define CDC_CLASS_DEVICE 0x02 //!< USB Communication Device Class |
| #define CDC_CLASS_COMM 0x02 //!< CDC Communication Class Interface |
| #define CDC_CLASS_DATA 0x0A //!< CDC Data Class Interface |
| //@} |
| |
| //! \name USB CDC Subclass IDs |
| //@{ |
| #define CDC_SUBCLASS_DLCM 0x01 //!< Direct Line Control Model |
| #define CDC_SUBCLASS_ACM 0x02 //!< Abstract Control Model |
| #define CDC_SUBCLASS_TCM 0x03 //!< Telephone Control Model |
| #define CDC_SUBCLASS_MCCM 0x04 //!< Multi-Channel Control Model |
| #define CDC_SUBCLASS_CCM 0x05 //!< CAPI Control Model |
| #define CDC_SUBCLASS_ETH 0x06 //!< Ethernet Networking Control Model |
| #define CDC_SUBCLASS_ATM 0x07 //!< ATM Networking Control Model |
| //@} |
| |
| //! \name USB CDC Communication Interface Protocol IDs |
| //@{ |
| #define CDC_PROTOCOL_V25TER 0x01 //!< Common AT commands |
| //@} |
| |
| //! \name USB CDC Data Interface Protocol IDs |
| //@{ |
| #define CDC_PROTOCOL_I430 0x30 //!< ISDN BRI |
| #define CDC_PROTOCOL_HDLC 0x31 //!< HDLC |
| #define CDC_PROTOCOL_TRANS 0x32 //!< Transparent |
| #define CDC_PROTOCOL_Q921M 0x50 //!< Q.921 management protocol |
| #define CDC_PROTOCOL_Q921 0x51 //!< Q.931 [sic] Data link protocol |
| #define CDC_PROTOCOL_Q921TM 0x52 //!< Q.921 TEI-multiplexor |
| #define CDC_PROTOCOL_V42BIS 0x90 //!< Data compression procedures |
| #define CDC_PROTOCOL_Q931 0x91 //!< Euro-ISDN protocol control |
| #define CDC_PROTOCOL_V120 0x92 //!< V.24 rate adaption to ISDN |
| #define CDC_PROTOCOL_CAPI20 0x93 //!< CAPI Commands |
| #define CDC_PROTOCOL_HOST 0xFD //!< Host based driver |
| /** |
| * \brief Describes the Protocol Unit Functional Descriptors [sic] |
| * on Communication Class Interface |
| */ |
| #define CDC_PROTOCOL_PUFD 0xFE |
| //@} |
| |
| //! \name USB CDC Functional Descriptor Types |
| //@{ |
| #define CDC_CS_INTERFACE 0x24 //!< Interface Functional Descriptor |
| #define CDC_CS_ENDPOINT 0x25 //!< Endpoint Functional Descriptor |
| //@} |
| |
| //! \name USB CDC Functional Descriptor Subtypes |
| //@{ |
| #define CDC_SCS_HEADER 0x00 //!< Header Functional Descriptor |
| #define CDC_SCS_CALL_MGMT 0x01 //!< Call Management |
| #define CDC_SCS_ACM 0x02 //!< Abstract Control Management |
| #define CDC_SCS_UNION 0x06 //!< Union Functional Descriptor |
| //@} |
| |
| //! \name USB CDC Request IDs |
| //@{ |
| #define USB_REQ_CDC_SEND_ENCAPSULATED_COMMAND 0x00 |
| #define USB_REQ_CDC_GET_ENCAPSULATED_RESPONSE 0x01 |
| #define USB_REQ_CDC_SET_COMM_FEATURE 0x02 |
| #define USB_REQ_CDC_GET_COMM_FEATURE 0x03 |
| #define USB_REQ_CDC_CLEAR_COMM_FEATURE 0x04 |
| #define USB_REQ_CDC_SET_AUX_LINE_STATE 0x10 |
| #define USB_REQ_CDC_SET_HOOK_STATE 0x11 |
| #define USB_REQ_CDC_PULSE_SETUP 0x12 |
| #define USB_REQ_CDC_SEND_PULSE 0x13 |
| #define USB_REQ_CDC_SET_PULSE_TIME 0x14 |
| #define USB_REQ_CDC_RING_AUX_JACK 0x15 |
| #define USB_REQ_CDC_SET_LINE_CODING 0x20 |
| #define USB_REQ_CDC_GET_LINE_CODING 0x21 |
| #define USB_REQ_CDC_SET_CONTROL_LINE_STATE 0x22 |
| #define USB_REQ_CDC_SEND_BREAK 0x23 |
| #define USB_REQ_CDC_SET_RINGER_PARMS 0x30 |
| #define USB_REQ_CDC_GET_RINGER_PARMS 0x31 |
| #define USB_REQ_CDC_SET_OPERATION_PARMS 0x32 |
| #define USB_REQ_CDC_GET_OPERATION_PARMS 0x33 |
| #define USB_REQ_CDC_SET_LINE_PARMS 0x34 |
| #define USB_REQ_CDC_GET_LINE_PARMS 0x35 |
| #define USB_REQ_CDC_DIAL_DIGITS 0x36 |
| #define USB_REQ_CDC_SET_UNIT_PARAMETER 0x37 |
| #define USB_REQ_CDC_GET_UNIT_PARAMETER 0x38 |
| #define USB_REQ_CDC_CLEAR_UNIT_PARAMETER 0x39 |
| #define USB_REQ_CDC_GET_PROFILE 0x3A |
| #define USB_REQ_CDC_SET_ETHERNET_MULTICAST_FILTERS 0x40 |
| #define USB_REQ_CDC_SET_ETHERNET_POWER_MANAGEMENT_PATTERNFILTER 0x41 |
| #define USB_REQ_CDC_GET_ETHERNET_POWER_MANAGEMENT_PATTERNFILTER 0x42 |
| #define USB_REQ_CDC_SET_ETHERNET_PACKET_FILTER 0x43 |
| #define USB_REQ_CDC_GET_ETHERNET_STATISTIC 0x44 |
| #define USB_REQ_CDC_SET_ATM_DATA_FORMAT 0x50 |
| #define USB_REQ_CDC_GET_ATM_DEVICE_STATISTICS 0x51 |
| #define USB_REQ_CDC_SET_ATM_DEFAULT_VC 0x52 |
| #define USB_REQ_CDC_GET_ATM_VC_STATISTICS 0x53 |
| // Added bNotification codes according cdc spec 1.1 chapter 6.3 |
| #define USB_REQ_CDC_NOTIFY_RING_DETECT 0x09 |
| #define USB_REQ_CDC_NOTIFY_SERIAL_STATE 0x20 |
| #define USB_REQ_CDC_NOTIFY_CALL_STATE_CHANGE 0x28 |
| #define USB_REQ_CDC_NOTIFY_LINE_STATE_CHANGE 0x29 |
| //@} |
| |
| /* |
| * Need to pack structures tightly, or the compiler might insert padding |
| * and violate the spec-mandated layout. |
| */ |
| COMPILER_PACK_SET(1) |
| |
| //! \name USB CDC Descriptors |
| //@{ |
| |
| //! CDC Header Functional Descriptor |
| typedef struct usb_cdc_hdr_desc { |
| uint8_t bFunctionLength; |
| uint8_t bDescriptorType; |
| uint8_t bDescriptorSubtype; |
| le16_t bcdCDC; |
| } usb_cdc_hdr_desc_t; |
| |
| #define USB_CDC_HDR_DESC_LEN 5 |
| #define USB_CDC_HDR_DESC_BYTES(bcdCDC) \ |
| USB_CDC_HDR_DESC_LEN, /* bFunctionLength */ \ |
| CDC_CS_INTERFACE, /* bDescriptorType */ \ |
| CDC_SCS_HEADER, /* bDescriptorSubtype */ \ |
| LE_BYTE0(bcdCDC), LE_BYTE1(bcdCDC) /* bcdCDC */ |
| |
| //! CDC Call Management Functional Descriptor |
| typedef struct usb_cdc_call_mgmt_desc { |
| uint8_t bFunctionLength; |
| uint8_t bDescriptorType; |
| uint8_t bDescriptorSubtype; |
| uint8_t bmCapabilities; |
| uint8_t bDataInterface; |
| } usb_cdc_call_mgmt_desc_t; |
| |
| #define USB_CDC_CALL_MGMT_DESC_LEN 5 |
| #define USB_CDC_CALL_MGMT_DESC_BYTES(bmCapabilities, bDataInterface) \ |
| USB_CDC_CALL_MGMT_DESC_LEN, /* bFunctionLength */ \ |
| CDC_CS_INTERFACE, /* bDescriptorType */ \ |
| CDC_SCS_CALL_MGMT, /* bDescriptorSubtype */ \ |
| bmCapabilities, bDataInterface |
| |
| //! CDC ACM Functional Descriptor |
| typedef struct usb_cdc_acm_desc { |
| uint8_t bFunctionLength; |
| uint8_t bDescriptorType; |
| uint8_t bDescriptorSubtype; |
| uint8_t bmCapabilities; |
| } usb_cdc_acm_desc_t; |
| |
| #define USB_CDC_ACM_DESC_LEN 4 |
| #define USB_CDC_ACM_DESC_BYTES(bmCapabilities) \ |
| USB_CDC_ACM_DESC_LEN, /* bFunctionLength */ \ |
| CDC_CS_INTERFACE, /* bDescriptorType */ \ |
| CDC_SCS_ACM, /* bDescriptorSubType */ \ |
| bmCapabilities |
| |
| //! CDC Union Functional Descriptor |
| typedef struct usb_cdc_union_desc { |
| uint8_t bFunctionLength; |
| uint8_t bDescriptorType; |
| uint8_t bDescriptorSubtype; |
| uint8_t bMasterInterface; |
| uint8_t bSlaveInterface0; |
| } usb_cdc_union_desc_t; |
| |
| #define USB_CDC_UNION_DESC_LEN 5 |
| #define USB_CDC_UNION_DESC_BYTES(bMasterInterface, bSlaveInterface) \ |
| USB_CDC_UNION_DESC_LEN, CDC_CS_INTERFACE, CDC_SCS_UNION, bMasterInterface, bSlaveInterface |
| |
| //! \name USB CDC Call Management Capabilities |
| //@{ |
| //! Device handles call management itself |
| #define CDC_CALL_MGMT_SUPPORTED (1 << 0) |
| //! Device can send/receive call management info over a Data Class interface |
| #define CDC_CALL_MGMT_OVER_DCI (1 << 1) |
| //@} |
| |
| //! \name USB CDC ACM Capabilities |
| //@{ |
| //! Device supports the request combination of |
| //! Set_Comm_Feature, Clear_Comm_Feature, and Get_Comm_Feature. |
| #define CDC_ACM_SUPPORT_FEATURE_REQUESTS (1 << 0) |
| //! Device supports the request combination of |
| //! Set_Line_Coding, Set_Control_Line_State, Get_Line_Coding, |
| //! and the notification Serial_State. |
| #define CDC_ACM_SUPPORT_LINE_REQUESTS (1 << 1) |
| //! Device supports the request Send_Break |
| #define CDC_ACM_SUPPORT_SENDBREAK_REQUESTS (1 << 2) |
| //! Device supports the notification Network_Connection. |
| #define CDC_ACM_SUPPORT_NOTIFY_REQUESTS (1 << 3) |
| //@} |
| //@} |
| |
| //! \name USB CDC line control |
| //@{ |
| |
| //! \name USB CDC line coding |
| //@{ |
| |
| //! Line Coding structure |
| typedef struct usb_cdc_line_coding { |
| le32_t dwDTERate; //!< Data rate, bits per second |
| uint8_t bCharFormat; //!< 0-1 Stop bit,1-1.5 Stop bits,2-2 Stop bits |
| uint8_t bParityType; //!< 0-None,1-Odd,2-Even,3-Mark,4-Space |
| uint8_t bDataBits; //!< 5,6,7,8 or 16 |
| } usb_cdc_line_coding_t; |
| |
| //! Possible values of bCharFormat |
| enum cdc_char_format { |
| CDC_STOP_BITS_1 = 0, //!< 1 stop bit |
| CDC_STOP_BITS_1_5 = 1, //!< 1.5 stop bits |
| CDC_STOP_BITS_2 = 2 //!< 2 stop bits |
| }; |
| |
| //! Possible values of bParityType |
| enum cdc_parity { |
| CDC_PAR_NONE = 0, //!< No parity |
| CDC_PAR_ODD = 1, //!< Odd parity |
| CDC_PAR_EVEN = 2, //!< Even parity |
| CDC_PAR_MARK = 3, //!< Parity forced to 1 (mark) |
| CDC_PAR_SPACE = 4 //!< Parity forced to 0 (space) |
| }; |
| //@} |
| |
| //! \name USB CDC control signals |
| //! spec 1.1 chapter 6.2.14 |
| //@{ |
| |
| //! Control signal structure |
| typedef struct usb_cdc_control_signal { |
| union { |
| le16_t value; |
| struct { |
| uint8_t dte_present; |
| uint8_t carrier_ctrl; |
| } modem; |
| struct { |
| uint8_t DTR : 1; //!< Data Terminal Ready |
| uint8_t RTS : 1; //!< Request To Send |
| } rs232; |
| struct { |
| uint8_t s108_2 : 1; //!< V.24 signal 108/2 |
| uint8_t s105 : 1; //!< V.24 signal 105 |
| } v24; |
| }; |
| } usb_cdc_control_signal_t; |
| |
| //! \name Possible values in usb_cdc_control_signal_t |
| //@{ |
| //! Carrier control for half duplex modems. |
| //! This signal corresponds to V.24 signal 105 and RS-232 signal RTS. |
| //! The device ignores the value of this bit |
| //! when operating in full duplex mode. |
| #define CDC_CTRL_SIGNAL_ACTIVATE_CARRIER (1 << 1) |
| //! Indicates to DCE if DTE is present or not. |
| //! This signal corresponds to V.24 signal 108/2 and RS-232 signal DTR. |
| #define CDC_CTRL_SIGNAL_DTE_PRESENT (1 << 0) |
| //@} |
| //@} |
| |
| //! \name USB CDC notification message |
| //@{ |
| |
| typedef struct usb_cdc_notify_msg { |
| uint8_t bmRequestType; |
| uint8_t bNotification; |
| union { |
| le16_t wValue; |
| struct { |
| uint8_t low; |
| uint8_t high; |
| } wValueBytes; |
| }; |
| union { |
| le16_t wIndex; |
| struct { |
| uint8_t low; |
| uint8_t high; |
| } wIndexBytes; |
| }; |
| union { |
| le16_t wLength; |
| struct { |
| uint8_t low; |
| uint8_t high; |
| } wLengthBytes; |
| }; |
| } usb_cdc_notify_msg_t; |
| |
| //! \name USB CDC serial state |
| //@{* |
| |
| //! UART State Bitmap (cdc spec 1.1 chapter 6.3.5) |
| typedef union usb_cdc_uart_state { |
| le16_t value; |
| struct { |
| uint8_t bRxCarrier : 1; |
| uint8_t bTxCarrier : 1; |
| uint8_t bBreak : 1; |
| uint8_t bRingSignal : 1; |
| uint8_t bFraming : 1; |
| uint8_t bParity : 1; |
| uint8_t bOverRun; |
| } bitmap; |
| struct { |
| uint8_t bDCD : 1; |
| uint8_t bDSR : 1; |
| uint8_t bBreak : 1; |
| uint8_t bRingSignal : 1; |
| uint8_t bFraming : 1; |
| uint8_t bParity : 1; |
| uint8_t bOverRun; |
| } rs232; |
| struct { |
| uint8_t bS109 : 1; //!< V.24 signal 109 |
| uint8_t bS106 : 1; //!< V.24 signal 106 |
| uint8_t bBreak : 1; |
| uint8_t bRingSignal : 1; |
| uint8_t bFraming : 1; |
| uint8_t bParity : 1; |
| uint8_t bOverRun; |
| } v24; |
| } usb_cdc_uart_state_t; |
| |
| //! Hardware handshake support (cdc spec 1.1 chapter 6.3.5) |
| typedef struct usb_cdc_notify_serial_state { |
| usb_cdc_notify_msg_t header; |
| union usb_cdc_uart_state state; |
| } usb_cdc_notify_serial_state_t; |
| |
| //! \name Possible values in usb_cdc_notify_serial_state_t |
| //@{ |
| #define CDC_SERIAL_STATE_DCD CPU_TO_LE16((1 << 0)) |
| #define CDC_SERIAL_STATE_DSR CPU_TO_LE16((1 << 1)) |
| #define CDC_SERIAL_STATE_BREAK CPU_TO_LE16((1 << 2)) |
| #define CDC_SERIAL_STATE_RING CPU_TO_LE16((1 << 3)) |
| #define CDC_SERIAL_STATE_FRAMING CPU_TO_LE16((1 << 4)) |
| #define CDC_SERIAL_STATE_PARITY CPU_TO_LE16((1 << 5)) |
| #define CDC_SERIAL_STATE_OVERRUN CPU_TO_LE16((1 << 6)) |
| //@} |
| //! @} |
| |
| //! @} |
| |
| COMPILER_PACK_RESET() |
| |
| //! @} |
| |
| /** |
| * \brief Fill a CDC SetLineCoding request |
| * \param[out] req Pointer to the request to fill |
| * \param[in] iface Interface Number |
| */ |
| static inline void usb_fill_SetLineCoding_req(struct usb_req *req, uint8_t iface) |
| { |
| req->bmRequestType = 0x21; |
| req->bRequest = USB_REQ_CDC_SET_LINE_CODING; |
| req->wValue = 0; |
| req->wIndex = iface; |
| req->wLength = sizeof(usb_cdc_line_coding_t); |
| } |
| |
| /** |
| * \brief Fill a CDC SetControlLineState request |
| * \param[out] req Pointer to the request to fill |
| * \param[in] iface Interface Number |
| * \param[in] ctrl Control Signal Bitmap |
| */ |
| static inline void usb_fill_SetControlLineState_req(struct usb_req *req, uint8_t iface, uint16_t ctrl) |
| { |
| req->bmRequestType = 0x21; |
| req->bRequest = USB_REQ_CDC_SET_CONTROL_LINE_STATE; |
| req->wValue = ctrl; |
| req->wIndex = iface; |
| req->wLength = 0; |
| } |
| |
| #endif // _USB_PROTOCOL_CDC_H_ |