You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
427 lines
14 KiB
C
427 lines
14 KiB
C
/**
|
|
* \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_
|