3      Copyright (C) Dean Camera, 2018. 
   5   dean [at] fourwalledcubicle [dot] com 
  10   Copyright 2018  Dean Camera (dean [at] fourwalledcubicle [dot] com) 
  12   Permission to use, copy, modify, distribute, and sell this 
  13   software and its documentation for any purpose is hereby granted 
  14   without fee, provided that the above copyright notice appear in 
  15   all copies and that both that the copyright notice and this 
  16   permission notice and warranty disclaimer appear in supporting 
  17   documentation, and that the name of the author not be used in 
  18   advertising or publicity pertaining to distribution of the 
  19   software without specific, written prior permission. 
  21   The author disclaims all warranties with regard to this 
  22   software, including all implied warranties of merchantability 
  23   and fitness.  In no event shall the author be liable for any 
  24   special, indirect or consequential damages or any damages 
  25   whatsoever resulting from loss of use, data or profits, whether 
  26   in an action of contract, negligence or other tortious action, 
  27   arising out of or in connection with the use or performance of 
  32  *  \brief Common definitions and declarations for the library USB CDC Class driver. 
  34  *  Common definitions and declarations for the library USB CDC Class driver. 
  36  *  \note This file should not be included directly. It is automatically included as needed by the USB module driver 
  37  *        dispatch header located in LUFA/Drivers/USB.h. 
  40 /** \ingroup Group_USBClassCDC 
  41  *  \defgroup Group_USBClassCDCCommon  Common Class Definitions 
  43  *  \section Sec_USBClassCDCCommon_ModDescription Module Description 
  44  *  Constants, Types and Enum definitions that are common to both Device and Host modes for the USB 
  50 #ifndef _CDC_CLASS_COMMON_H_ 
  51 #define _CDC_CLASS_COMMON_H_ 
  54                 #include "../../Core/StdDescriptors.h" 
  56         /* Enable C linkage for C++ Compilers: */ 
  57                 #if defined(__cplusplus) 
  61         /* Preprocessor Checks: */ 
  62                 #if !defined(__INCLUDE_FROM_CDC_DRIVER) 
  63                         #error Do not include this file directly. Include LUFA/Drivers/USB.h instead. 
  67                 /** \name Virtual Control Line Masks */ 
  69                 /** Mask for the DTR handshake line for use with the \ref CDC_REQ_SetControlLineState class-specific request 
  70                  *  from the host, to indicate that the DTR line state should be high. 
  72                 #define CDC_CONTROL_LINE_OUT_DTR         (1 << 0) 
  74                 /** Mask for the RTS handshake line for use with the \ref CDC_REQ_SetControlLineState class-specific request 
  75                  *  from the host, to indicate that the RTS line state should be high. 
  77                 #define CDC_CONTROL_LINE_OUT_RTS         (1 << 1) 
  79                 /** Mask for the DCD handshake line for use with the \ref CDC_NOTIF_SerialState class-specific notification 
  80                  *  from the device to the host, to indicate that the DCD line state is currently high. 
  82                 #define CDC_CONTROL_LINE_IN_DCD          (1 << 0) 
  84                 /** Mask for the DSR handshake line for use with the \ref CDC_NOTIF_SerialState class-specific notification 
  85                  *  from the device to the host, to indicate that the DSR line state is currently high. 
  87                 #define CDC_CONTROL_LINE_IN_DSR          (1 << 1) 
  89                 /** Mask for the BREAK handshake line for use with the \ref CDC_NOTIF_SerialState class-specific notification 
  90                  *  from the device to the host, to indicate that the BREAK line state is currently high. 
  92                 #define CDC_CONTROL_LINE_IN_BREAK        (1 << 2) 
  94                 /** Mask for the RING handshake line for use with the \ref CDC_NOTIF_SerialState class-specific notification 
  95                  *  from the device to the host, to indicate that the RING line state is currently high. 
  97                 #define CDC_CONTROL_LINE_IN_RING         (1 << 3) 
  99                 /** Mask for use with the \ref CDC_NOTIF_SerialState class-specific notification from the device to the host, 
 100                  *  to indicate that a framing error has occurred on the virtual serial port. 
 102                 #define CDC_CONTROL_LINE_IN_FRAMEERROR   (1 << 4) 
 104                 /** Mask for use with the \ref CDC_NOTIF_SerialState class-specific notification from the device to the host, 
 105                  *  to indicate that a parity error has occurred on the virtual serial port. 
 107                 #define CDC_CONTROL_LINE_IN_PARITYERROR  (1 << 5) 
 109                 /** Mask for use with the \ref CDC_NOTIF_SerialState class-specific notification from the device to the host, 
 110                  *  to indicate that a data overrun error has occurred on the virtual serial port. 
 112                 #define CDC_CONTROL_LINE_IN_OVERRUNERROR (1 << 6) 
 116                 /** Enum for possible Class, Subclass and Protocol values of device and interface descriptors relating to the CDC 
 119                 enum CDC_Descriptor_ClassSubclassProtocol_t
 
 121                         CDC_CSCP_CDCClass               
= 0x02, /**< Descriptor Class value indicating that the device or interface 
 122                                                                  *   belongs to the CDC class. 
 124                         CDC_CSCP_NoSpecificSubclass     
= 0x00, /**< Descriptor Subclass value indicating that the device or interface 
 125                                                                  *   belongs to no specific subclass of the CDC class. 
 127                         CDC_CSCP_ACMSubclass            
= 0x02, /**< Descriptor Subclass value indicating that the device or interface 
 128                                                                  *   belongs to the Abstract Control Model CDC subclass. 
 130                         CDC_CSCP_ATCommandProtocol      
= 0x01, /**< Descriptor Protocol value indicating that the device or interface 
 131                                                                  *   belongs to the AT Command protocol of the CDC class. 
 133                         CDC_CSCP_NoSpecificProtocol     
= 0x00, /**< Descriptor Protocol value indicating that the device or interface 
 134                                                                  *   belongs to no specific protocol of the CDC class. 
 136                         CDC_CSCP_VendorSpecificProtocol 
= 0xFF, /**< Descriptor Protocol value indicating that the device or interface 
 137                                                                  *   belongs to a vendor-specific protocol of the CDC class. 
 139                         CDC_CSCP_CDCDataClass           
= 0x0A, /**< Descriptor Class value indicating that the device or interface 
 140                                                                  *   belongs to the CDC Data class. 
 142                         CDC_CSCP_NoDataSubclass         
= 0x00, /**< Descriptor Subclass value indicating that the device or interface 
 143                                                                  *   belongs to no specific subclass of the CDC data class. 
 145                         CDC_CSCP_NoDataProtocol         
= 0x00, /**< Descriptor Protocol value indicating that the device or interface 
 146                                                                  *   belongs to no specific protocol of the CDC data class. 
 150                 /** Enum for the CDC class specific control requests that can be issued by the USB bus host. */ 
 151                 enum CDC_ClassRequests_t
 
 153                         CDC_REQ_SendEncapsulatedCommand 
= 0x00, /**< CDC class-specific request to send an encapsulated command to the device. */ 
 154                         CDC_REQ_GetEncapsulatedResponse 
= 0x01, /**< CDC class-specific request to retrieve an encapsulated command response from the device. */ 
 155                         CDC_REQ_SetLineEncoding         
= 0x20, /**< CDC class-specific request to set the current virtual serial port configuration settings. */ 
 156                         CDC_REQ_GetLineEncoding         
= 0x21, /**< CDC class-specific request to get the current virtual serial port configuration settings. */ 
 157                         CDC_REQ_SetControlLineState     
= 0x22, /**< CDC class-specific request to set the current virtual serial port handshake line states. */ 
 158                         CDC_REQ_SendBreak               
= 0x23, /**< CDC class-specific request to send a break to the receiver via the carrier channel. */ 
 161                 /** Enum for the CDC class specific notification requests that can be issued by a CDC device to a host. */ 
 162                 enum CDC_ClassNotifications_t
 
 164                         CDC_NOTIF_SerialState 
= 0x20, /**< Notification type constant for a change in the virtual serial port 
 165                                                        *   handshake line states, for use with a \ref USB_Request_Header_t 
 166                                                        *   notification structure when sent to the host via the CDC notification 
 171                 /** Enum for the CDC class specific descriptor types. */ 
 172                 enum CDC_DescriptorTypes_t
 
 174                         CDC_DTYPE_CSInterface                     
= 0x24, /**< CDC class specific Interface functional descriptor. */ 
 175                         CDC_DTYPE_CSEndpoint                      
= 0x25, /**< CDC class specific Endpoint functional descriptor. */ 
 178                 /** Enum for the CDC class specific interface descriptor subtypes. */ 
 179                 enum CDC_DescriptorSubtypes_t
 
 181                         CDC_DSUBTYPE_CSInterface_Header           
= 0x00, /**< CDC class specific Header functional descriptor. */ 
 182                         CDC_DSUBTYPE_CSInterface_CallManagement   
= 0x01, /**< CDC class specific Call Management functional descriptor. */ 
 183                         CDC_DSUBTYPE_CSInterface_ACM              
= 0x02, /**< CDC class specific Abstract Control Model functional descriptor. */ 
 184                         CDC_DSUBTYPE_CSInterface_DirectLine       
= 0x03, /**< CDC class specific Direct Line functional descriptor. */ 
 185                         CDC_DSUBTYPE_CSInterface_TelephoneRinger  
= 0x04, /**< CDC class specific Telephone Ringer functional descriptor. */ 
 186                         CDC_DSUBTYPE_CSInterface_TelephoneCall    
= 0x05, /**< CDC class specific Telephone Call functional descriptor. */ 
 187                         CDC_DSUBTYPE_CSInterface_Union            
= 0x06, /**< CDC class specific Union functional descriptor. */ 
 188                         CDC_DSUBTYPE_CSInterface_CountrySelection 
= 0x07, /**< CDC class specific Country Selection functional descriptor. */ 
 189                         CDC_DSUBTYPE_CSInterface_TelephoneOpModes 
= 0x08, /**< CDC class specific Telephone Operation Modes functional descriptor. */ 
 190                         CDC_DSUBTYPE_CSInterface_USBTerminal      
= 0x09, /**< CDC class specific USB Terminal functional descriptor. */ 
 191                         CDC_DSUBTYPE_CSInterface_NetworkChannel   
= 0x0A, /**< CDC class specific Network Channel functional descriptor. */ 
 192                         CDC_DSUBTYPE_CSInterface_ProtocolUnit     
= 0x0B, /**< CDC class specific Protocol Unit functional descriptor. */ 
 193                         CDC_DSUBTYPE_CSInterface_ExtensionUnit    
= 0x0C, /**< CDC class specific Extension Unit functional descriptor. */ 
 194                         CDC_DSUBTYPE_CSInterface_MultiChannel     
= 0x0D, /**< CDC class specific Multi-Channel Management functional descriptor. */ 
 195                         CDC_DSUBTYPE_CSInterface_CAPI             
= 0x0E, /**< CDC class specific Common ISDN API functional descriptor. */ 
 196                         CDC_DSUBTYPE_CSInterface_Ethernet         
= 0x0F, /**< CDC class specific Ethernet functional descriptor. */ 
 197                         CDC_DSUBTYPE_CSInterface_ATM              
= 0x10, /**< CDC class specific Asynchronous Transfer Mode functional descriptor. */ 
 200                 /** Enum for the possible line encoding formats of a virtual serial port. */ 
 201                 enum CDC_LineEncodingFormats_t
 
 203                         CDC_LINEENCODING_OneStopBit          
= 0, /**< Each frame contains one stop bit. */ 
 204                         CDC_LINEENCODING_OneAndAHalfStopBits 
= 1, /**< Each frame contains one and a half stop bits. */ 
 205                         CDC_LINEENCODING_TwoStopBits         
= 2, /**< Each frame contains two stop bits. */ 
 208                 /** Enum for the possible line encoding parity settings of a virtual serial port. */ 
 209                 enum CDC_LineEncodingParity_t
 
 211                         CDC_PARITY_None  
= 0, /**< No parity bit mode on each frame. */ 
 212                         CDC_PARITY_Odd   
= 1, /**< Odd parity bit mode on each frame. */ 
 213                         CDC_PARITY_Even  
= 2, /**< Even parity bit mode on each frame. */ 
 214                         CDC_PARITY_Mark  
= 3, /**< Mark parity bit mode on each frame. */ 
 215                         CDC_PARITY_Space 
= 4, /**< Space parity bit mode on each frame. */ 
 219                 /** \brief CDC class-specific Functional Header Descriptor (LUFA naming conventions). 
 221                  *  Type define for a CDC class-specific functional header descriptor. This indicates to the host that the device 
 222                  *  contains one or more CDC functional data descriptors, which give the CDC interface's capabilities and configuration. 
 223                  *  See the CDC class specification for more details. 
 225                  *  \see \ref USB_CDC_StdDescriptor_FunctionalHeader_t for the version of this type with standard element names. 
 227                  *  \note Regardless of CPU architecture, these values should be stored as little endian. 
 231                         USB_Descriptor_Header_t Header
; /**< Regular descriptor header containing the descriptor's type and length. */ 
 232                         uint8_t                 Subtype
; /**< Sub type value used to distinguish between CDC class-specific descriptors, 
 233                                                           *   must be \ref CDC_DSUBTYPE_CSInterface_Header. 
 235                         uint16_t                CDCSpecification
; /**< Version number of the CDC specification implemented by the device, 
 236                                                                    *   encoded in BCD format. 
 238                                                                    *   \see \ref VERSION_BCD() utility macro. 
 240                 } ATTR_PACKED USB_CDC_Descriptor_FunctionalHeader_t
; 
 242                 /** \brief CDC class-specific Functional Header Descriptor (USB-IF naming conventions). 
 244                  *  Type define for a CDC class-specific functional header descriptor. This indicates to the host that the device 
 245                  *  contains one or more CDC functional data descriptors, which give the CDC interface's capabilities and configuration. 
 246                  *  See the CDC class specification for more details. 
 248                  *  \see \ref USB_CDC_Descriptor_FunctionalHeader_t for the version of this type with non-standard LUFA specific 
 251                  *  \note Regardless of CPU architecture, these values should be stored as little endian. 
 255                         uint8_t  bFunctionLength
; /**< Size of the descriptor, in bytes. */ 
 256                         uint8_t  bDescriptorType
; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value 
 257                                                    *   given by the specific class. 
 259                         uint8_t  bDescriptorSubType
; /**< Sub type value used to distinguish between CDC class-specific descriptors, 
 260                                                       *   must be \ref CDC_DSUBTYPE_CSInterface_Header. 
 262                         uint16_t bcdCDC
; /**< Version number of the CDC specification implemented by the device, encoded in BCD format. 
 264                                           *   \see \ref VERSION_BCD() utility macro. 
 266                 } ATTR_PACKED USB_CDC_StdDescriptor_FunctionalHeader_t
; 
 268                 /** \brief CDC class-specific Functional ACM Descriptor (LUFA naming conventions). 
 270                  *  Type define for a CDC class-specific functional ACM descriptor. This indicates to the host that the CDC interface 
 271                  *  supports the CDC ACM subclass of the CDC specification. See the CDC class specification for more details. 
 273                  *  \see \ref USB_CDC_StdDescriptor_FunctionalACM_t for the version of this type with standard element names. 
 275                  *  \note Regardless of CPU architecture, these values should be stored as little endian. 
 279                         USB_Descriptor_Header_t Header
; /**< Regular descriptor header containing the descriptor's type and length. */ 
 280                         uint8_t                 Subtype
; /**< Sub type value used to distinguish between CDC class-specific descriptors, 
 281                                                           *   must be \ref CDC_DSUBTYPE_CSInterface_ACM. 
 283                         uint8_t                 Capabilities
; /**< Capabilities of the ACM interface, given as a bit mask. For most devices, 
 284                                                                *   this should be set to a fixed value of \c 0x06 - for other capabilities, refer 
 285                                                                *   to the CDC ACM specification. 
 287                 } ATTR_PACKED USB_CDC_Descriptor_FunctionalACM_t
; 
 289                 /** \brief CDC class-specific Functional ACM Descriptor (USB-IF naming conventions). 
 291                  *  Type define for a CDC class-specific functional ACM descriptor. This indicates to the host that the CDC interface 
 292                  *  supports the CDC ACM subclass of the CDC specification. See the CDC class specification for more details. 
 294                  *  \see \ref USB_CDC_Descriptor_FunctionalACM_t for the version of this type with non-standard LUFA specific 
 297                  *  \note Regardless of CPU architecture, these values should be stored as little endian. 
 301                         uint8_t bFunctionLength
; /**< Size of the descriptor, in bytes. */ 
 302                         uint8_t bDescriptorType
; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value 
 303                                                   *   given by the specific class. 
 305                         uint8_t bDescriptorSubType
; /**< Sub type value used to distinguish between CDC class-specific descriptors, 
 306                                                      *   must be \ref CDC_DSUBTYPE_CSInterface_ACM. 
 308                         uint8_t bmCapabilities
; /**< Capabilities of the ACM interface, given as a bit mask. For most devices, 
 309                                                  *   this should be set to a fixed value of 0x06 - for other capabilities, refer 
 310                                                  *   to the CDC ACM specification. 
 312                 } ATTR_PACKED USB_CDC_StdDescriptor_FunctionalACM_t
; 
 314                 /** \brief CDC class-specific Functional Union Descriptor (LUFA naming conventions). 
 316                  *  Type define for a CDC class-specific functional Union descriptor. This indicates to the host that specific 
 317                  *  CDC control and data interfaces are related. See the CDC class specification for more details. 
 319                  *  \see \ref USB_CDC_StdDescriptor_FunctionalUnion_t for the version of this type with standard element names. 
 321                  *  \note Regardless of CPU architecture, these values should be stored as little endian. 
 325                         USB_Descriptor_Header_t Header
; /**< Regular descriptor header containing the descriptor's type and length. */ 
 326                         uint8_t                 Subtype
; /**< Sub type value used to distinguish between CDC class-specific descriptors, 
 327                                                           *   must be \ref CDC_DSUBTYPE_CSInterface_Union. 
 329                         uint8_t                 MasterInterfaceNumber
; /**< Interface number of the CDC Control interface. */ 
 330                         uint8_t                 SlaveInterfaceNumber
; /**< Interface number of the CDC Data interface. */ 
 331                 } ATTR_PACKED USB_CDC_Descriptor_FunctionalUnion_t
; 
 333                 /** \brief CDC class-specific Functional Union Descriptor (USB-IF naming conventions). 
 335                  *  Type define for a CDC class-specific functional Union descriptor. This indicates to the host that specific 
 336                  *  CDC control and data interfaces are related. See the CDC class specification for more details. 
 338                  *  \see \ref USB_CDC_Descriptor_FunctionalUnion_t for the version of this type with non-standard LUFA specific 
 341                  *  \note Regardless of CPU architecture, these values should be stored as little endian. 
 345                         uint8_t bFunctionLength
; /**< Size of the descriptor, in bytes. */ 
 346                         uint8_t bDescriptorType
; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value 
 347                                                   *   given by the specific class. 
 349                         uint8_t bDescriptorSubType
; /**< Sub type value used to distinguish between CDC class-specific descriptors, 
 350                                                      *   must be \ref CDC_DSUBTYPE_CSInterface_Union. 
 352                         uint8_t bMasterInterface
; /**< Interface number of the CDC Control interface. */ 
 353                         uint8_t bSlaveInterface0
; /**< Interface number of the CDC Data interface. */ 
 354                 } ATTR_PACKED USB_CDC_StdDescriptor_FunctionalUnion_t
; 
 356                 /** \brief CDC Virtual Serial Port Line Encoding Settings Structure. 
 358                  *  Type define for a CDC Line Encoding structure, used to hold the various encoding parameters for a virtual 
 361                  *  \note Regardless of CPU architecture, these values should be stored as little endian. 
 365                         uint32_t BaudRateBPS
; /**< Baud rate of the virtual serial port, in bits per second. */ 
 366                         uint8_t  CharFormat
; /**< Character format of the virtual serial port, a value from the 
 367                                                                   *   \ref CDC_LineEncodingFormats_t enum. 
 369                         uint8_t  ParityType
; /**< Parity setting of the virtual serial port, a value from the 
 370                                                                   *   \ref CDC_LineEncodingParity_t enum. 
 372                         uint8_t  DataBits
; /**< Bits of data per character of the virtual serial port. */ 
 373                 } ATTR_PACKED CDC_LineEncoding_t
; 
 375         /* Disable C linkage for C++ Compilers: */ 
 376                 #if defined(__cplusplus)