2013-05-06 15:09:06 +02:00
/**************************************************************************/
/*!
@ file cdc . h
@ author hathach ( tinyusb . org )
2012-11-29 11:52:57 +01:00
2013-05-06 15:09:06 +02:00
@ section LICENSE
Software License Agreement ( BSD License )
Copyright ( c ) 2013 , hathach ( tinyusb . org )
All rights reserved .
Redistribution and use in source and binary forms , with or without
modification , are permitted provided that the following conditions are met :
1. Redistributions of source code must retain the above copyright
notice , this list of conditions and the following disclaimer .
2. Redistributions in binary form must reproduce the above copyright
notice , this list of conditions and the following disclaimer in the
documentation and / or other materials provided with the distribution .
3. Neither the name of the copyright holders nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission .
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ' ' AS IS ' ' AND ANY
EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES
INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ;
LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
This file is part of the tinyusb stack .
*/
/**************************************************************************/
2012-11-29 11:52:57 +01:00
/** \file
* \ brief CDC Class Driver
*
* \ note TBD
*/
2012-12-03 10:51:14 +01:00
/**
2012-11-29 11:52:57 +01:00
* \ addtogroup Group_ClassDriver Class Driver
* @ {
* \ defgroup Group_CDC Communication Device Class
* @ {
*/
# ifndef _TUSB_CDC_H__
# define _TUSB_CDC_H__
# include "common/common.h"
2013-06-29 10:56:32 +02:00
# ifdef __cplusplus
extern " C " {
# endif
2012-11-29 11:52:57 +01:00
2013-06-29 10:56:32 +02:00
//--------------------------------------------------------------------+
// CDC COMMUNICATION INTERFACE CLASS
//--------------------------------------------------------------------+
enum {
CDC_COMM_SUBCLASS_DIRECT_LINE_CONTROL_MODEL = 0x01 ,
CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL ,
CDC_COMM_SUBCLASS_TELEPHONE_CONTROL_MODEL ,
CDC_COMM_SUBCLASS_MULTICHANNEL_CONTROL_MODEL ,
CDC_COMM_SUBCLASS_CAPI_CONTROL_MODEL ,
CDC_COMM_SUBCLASS_ETHERNET_NETWORKING_CONTROL_MODEL ,
CDC_COMM_SUBCLASS_ATM_NETWORKING_CONTROL_MODEL ,
CDC_COMM_SUBCLASS_WIRELESS_HANDSET_CONTROL_MODEL ,
CDC_COMM_SUBCLASS_DEVICE_MANAGEMENT ,
CDC_COMM_SUBCLASS_MOBILE_DIRECT_LINE_MODEL ,
CDC_COMM_SUBCLASS_OBEX ,
CDC_COMM_SUBCLASS_ETHERNET_EMULATION_MODEL
} ;
2012-11-29 11:52:57 +01:00
2013-06-29 10:56:32 +02:00
enum {
2013-06-29 16:00:33 +02:00
CDC_COMM_PROTOCOL_ATCOMMAND = 0x01 , // ITU-T V2.50
2013-06-29 10:56:32 +02:00
CDC_COMM_PROTOCOL_ATCOMMAND_PCCA_101 ,
CDC_COMM_PROTOCOL_ATCOMMAND_PCCA_101_AND_ANNEXO ,
CDC_COMM_PROTOCOL_ATCOMMAND_GSM_707 ,
CDC_COMM_PROTOCOL_ATCOMMAND_3GPP_27007 ,
CDC_COMM_PROTOCOL_ATCOMMAND_CDMA , // defined by TIA
CDC_COMM_PROTOCOL_ETHERNET_EMULATION_MODEL
} ;
2012-11-29 11:52:57 +01:00
2013-06-29 10:56:32 +02:00
//------------- SubType Descriptor in COMM Functional Descriptor -------------//
enum {
CDC_FUNC_DESC_HEADER = 0x00 ,
CDC_FUNC_DESC_CALL_MANAGEMENT = 0x01 ,
CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT = 0x02 ,
CDC_FUNC_DESC_DIRECT_LINE_MANAGEMENT = 0x03 ,
CDC_FUNC_DESC_TELEPHONE_RINGER = 0x04 ,
CDC_FUNC_DESC_TELEPHONE_CALL_AND_LINE_STATE_REPORTING_CAPACITY = 0x05 ,
CDC_FUNC_DESC_UNION = 0x06 ,
CDC_FUNC_DESC_COUNTRY_SELECTION = 0x07 ,
CDC_FUNC_DESC_TELEPHONE_OPERATIONAL_MODES = 0x08 ,
CDC_FUNC_DESC_USB_TERMINAL = 0x09 ,
CDC_FUNC_DESC_NETWORK_CHANNEL_TERMINAL = 0x0A ,
CDC_FUNC_DESC_PROTOCOL_UNIT = 0x0B ,
CDC_FUNC_DESC_EXTENSION_UNIT = 0x0C ,
CDC_FUNC_DESC_MULTICHANEL_MANAGEMENT = 0x0D ,
CDC_FUNC_DESC_CAPI_CONTROL_MANAGEMENT = 0x0E ,
CDC_FUNC_DESC_ETHERNET_NETWORKING = 0x0F ,
CDC_FUNC_DESC_ATM_NETWORKING = 0x10 ,
CDC_FUNC_DESC_WIRELESS_HANDSET_CONTROL_MODEL = 0x11 ,
CDC_FUNC_DESC_MOBILE_DIRECT_LINE_MODEL = 0x12 ,
CDC_FUNC_DESC_MOBILE_DIRECT_LINE_MODEL_DETAIL = 0x13 ,
CDC_FUNC_DESC_DEVICE_MANAGEMENT_MODEL = 0x14 ,
CDC_FUNC_DESC_OBEX = 0x15 ,
CDC_FUNC_DESC_COMMAND_SET = 0x16 ,
CDC_FUNC_DESC_COMMAND_SET_DETAIL = 0x17 ,
CDC_FUNC_DESC_TELEPHONE_CONTROL_MODEL = 0x18 ,
CDC_FUNC_DESC_OBEX_SERVICE_IDENTIFIER = 0x19
} ;
2012-11-29 11:52:57 +01:00
2013-06-29 10:56:32 +02:00
//--------------------------------------------------------------------+
// CDC DATA INTERFACE CLASS
//--------------------------------------------------------------------+
2012-11-29 11:52:57 +01:00
2013-06-29 10:56:32 +02:00
// SUBCLASS code of Data Interface is not used and should/must be zero
2012-11-29 11:52:57 +01:00
2013-06-29 10:56:32 +02:00
enum {
CDC_DATA_PROTOCOL_ISDN_BRI = 0x30 ,
CDC_DATA_PROTOCOL_HDLC = 0x31 ,
CDC_DATA_PROTOCOL_TRANSPARENT = 0x32 ,
CDC_DATA_PROTOCOL_Q921_MANAGEMENT = 0x50 ,
CDC_DATA_PROTOCOL_Q921_DATA_LINK = 0x51 ,
CDC_DATA_PROTOCOL_Q921_TEI_MULTIPLEXOR = 0x52 ,
CDC_DATA_PROTOCOL_V42BIS_DATA_COMPRESSION = 0x90 ,
CDC_DATA_PROTOCOL_EURO_ISDN = 0x91 ,
CDC_DATA_PROTOCOL_V24_RATE_ADAPTION_TO_ISDN = 0x92 ,
CDC_DATA_PROTOCOL_CAPI_COMMAND = 0x93 ,
CDC_DATA_PROTOCOL_HOST_BASED_DRIVER = 0xFD ,
CDC_DATA_PROTOCOL_IN_PROTOCOL_UNIT_FUNCTIONAL_DESCRIPTOR = 0xFE
} ;
//--------------------------------------------------------------------+
// MANAGEMENT ELEMENT REQUEST (CONTROL ENDPOINT)
//--------------------------------------------------------------------+
typedef enum {
SEND_ENCAPSULATED_COMMAND = 0x00 ,
GET_ENCAPSULATED_RESPONSE = 0x01 ,
SET_COMM_FEATURE = 0x02 ,
GET_COMM_FEATURE = 0x03 ,
CLEAR_COMM_FEATURE = 0x04 ,
SET_AUX_LINE_STATE = 0x10 ,
SET_HOOK_STATE = 0x11 ,
PULSE_SETUP = 0x12 ,
SEND_PULSE = 0x13 ,
SET_PULSE_TIME = 0x14 ,
RING_AUX_JACK = 0x15 ,
SET_LINE_CODING = 0x20 ,
GET_LINE_CODING = 0x21 ,
SET_CONTROL_LINE_STATE = 0x22 ,
SEND_BREAK = 0x23 ,
SET_RINGER_PARMS = 0x30 ,
GET_RINGER_PARMS = 0x31 ,
SET_OPERATION_PARMS = 0x32 ,
GET_OPERATION_PARMS = 0x33 ,
SET_LINE_PARMS = 0x34 ,
GET_LINE_PARMS = 0x35 ,
DIAL_DIGITS = 0x36 ,
SET_UNIT_PARAMETER = 0x37 ,
GET_UNIT_PARAMETER = 0x38 ,
CLEAR_UNIT_PARAMETER = 0x39 ,
GET_PROFILE = 0x3A ,
SET_ETHERNET_MULTICAST_FILTERS = 0x40 ,
SET_ETHERNET_POWER_MANAGEMENT_PATTERN_FILTER = 0x41 ,
GET_ETHERNET_POWER_MANAGEMENT_PATTERN_FILTER = 0x42 ,
SET_ETHERNET_PACKET_FILTER = 0x43 ,
GET_ETHERNET_STATISTIC = 0x44 ,
SET_ATM_DATA_FORMAT = 0x50 ,
GET_ATM_DEVICE_STATISTICS = 0x51 ,
SET_ATM_DEFAULT_VC = 0x52 ,
GET_ATM_VC_STATISTICS = 0x53 ,
MDLM_SEMANTIC_MODEL = 0x60 ,
} tusb_cdc_management_request_t ;
//--------------------------------------------------------------------+
// MANAGEMENT ELEMENENT NOTIFICATION (NOTIFICATION ENDPOINT)
//--------------------------------------------------------------------+
typedef enum {
NETWORK_CONNECTION = 0x00 ,
RESPONSE_AVAILABLE = 0x01 ,
AUX_JACK_HOOK_STATE = 0x08 ,
RING_DETECT = 0x09 ,
SERIAL_STATE = 0x20 ,
CALL_STATE_CHANGE = 0x28 ,
LINE_STATE_CHANGE = 0x29 ,
CONNECTION_SPEED_CHANGE = 0x2A ,
MDLM_SEMANTIC_MODEL_NOTIFICATION = 0x40 ,
} tusb_cdc_notification_t ;
//--------------------------------------------------------------------+
// FUNCTIONAL DESCRIPTOR
//--------------------------------------------------------------------+
typedef ATTR_PACKED_STRUCT ( struct ) {
uint8_t bLength ; ///< Size of this descriptor in bytes.
uint8_t bDescriptorType ; ///< Descriptor Type, must be Class-Specific
uint8_t bDescriptorSubType ; ///< Descriptor SubType one of above CDC_FUCN_DESC_
2013-07-01 05:35:37 +02:00
uint16_t bcdCDC ; ///< CDC release number in Binary-Coded Decimal
2013-06-29 10:56:32 +02:00
} tusb_cdc_func_header_t ;
typedef ATTR_PACKED_STRUCT ( struct ) {
uint8_t bLength ; ///< Size of this descriptor in bytes.
uint8_t bDescriptorType ; ///< Descriptor Type, must be Class-Specific
uint8_t bDescriptorSubType ; ///< Descriptor SubType one of above CDC_FUCN_DESC_
2013-06-29 16:00:33 +02:00
uint8_t bControlInterface ; ///< Interface number of Communication Interface
2013-07-01 05:35:37 +02:00
uint8_t bSubordinateInterface ; ///< Array of Interface number of Data Interface
2013-06-29 10:56:32 +02:00
} tusb_cdc_func_union_t ;
2013-07-01 05:35:37 +02:00
# define tusb_cdc_func_union_n_t(no_slave)\
ATTR_PACKED_STRUCT ( struct ) { \
uint8_t bLength ; \
uint8_t bDescriptorType ; \
uint8_t bDescriptorSubType ; \
uint8_t bControlInterface ; \
uint8_t bSubordinateInterface [ no_slave ] ; \
}
2013-06-29 10:56:32 +02:00
typedef ATTR_PACKED_STRUCT ( struct ) {
uint8_t bLength ; ///< Size of this descriptor in bytes.
uint8_t bDescriptorType ; ///< Descriptor Type, must be Class-Specific
uint8_t bDescriptorSubType ; ///< Descriptor SubType one of above CDC_FUCN_DESC_
uint8_t iCountryCodeRelDate ; ///< Index of a string giving the release date for the implemented ISO 3166 Country Codes.
2013-07-01 05:35:37 +02:00
uint16_t wCountryCode [ ] ; ///< Country code in the format as defined in [ISO3166], release date as specified inoffset 3 for the first supported country.
2013-06-29 10:56:32 +02:00
} tusb_cdc_func_country_selection_t ;
2013-07-01 05:35:37 +02:00
# define tusb_cdc_func_country_selection_n_t(no_country) \
ATTR_PACKED_STRUCT ( struct ) { \
uint8_t bLength ; \
uint8_t bDescriptorType ; \
uint8_t bDescriptorSubType ; \
uint8_t iCountryCodeRelDate ; \
uint16_t wCountryCode [ no_country ] ; \
}
2013-06-29 10:56:32 +02:00
//--------------------------------------------------------------------+
// PUBLIC SWITCHED TELEPHONE NETWORK (PSTN) SUBCLASS
//--------------------------------------------------------------------+
typedef ATTR_PACKED_STRUCT ( struct ) {
uint8_t bLength ; ///< Size of this descriptor in bytes.
uint8_t bDescriptorType ; ///< Descriptor Type, must be Class-Specific
uint8_t bDescriptorSubType ; ///< Descriptor SubType one of above CDC_FUCN_DESC_
struct {
uint8_t handle_call : 1 ; ///< 0 - Device sends/receives call management information only over the Communications Class interface. 1 - Device can send/receive call management information over a Data Class interface.
uint8_t send_recv_call : 1 ; ///< 0 - Device does not handle call management itself. 1 - Device handles call management itself.
uint8_t : 0 ;
} bmCapabilities ;
uint8_t bDataInterface ;
} tusb_cdc_func_call_management_t ;
2013-07-01 06:29:23 +02:00
typedef struct {
uint8_t support_comm_request : 1 ; ///< Device supports the request combination of Set_Comm_Feature, Clear_Comm_Feature, and Get_Comm_Feature.
uint8_t support_line_request : 1 ; ///< Device supports the request combination of Set_Line_Coding, Set_Control_Line_State, Get_Line_Coding, and the notification Serial_State.
uint8_t support_send_break : 1 ; ///< Device supports the request Send_Break
uint8_t support_notification_network_connection : 1 ; ///< Device supports the notification Network_Connection.
uint8_t : 0 ;
} cdc_fun_acm_capability_t ;
STATIC_ASSERT ( sizeof ( cdc_fun_acm_capability_t ) = = 1 , " mostly problem with compiler " ) ;
2013-06-29 10:56:32 +02:00
typedef ATTR_PACKED_STRUCT ( struct ) {
2013-07-01 06:29:23 +02:00
uint8_t bLength ; ///< Size of this descriptor in bytes.
uint8_t bDescriptorType ; ///< Descriptor Type, must be Class-Specific
uint8_t bDescriptorSubType ; ///< Descriptor SubType one of above CDC_FUCN_DESC_
cdc_fun_acm_capability_t bmCapabilities ;
2013-06-29 10:56:32 +02:00
} tusb_cdc_func_abstract_control_management_t ;
typedef ATTR_PACKED_STRUCT ( struct ) {
uint8_t bLength ; ///< Size of this descriptor in bytes.
uint8_t bDescriptorType ; ///< Descriptor Type, must be Class-Specific
uint8_t bDescriptorSubType ; ///< Descriptor SubType one of above CDC_FUCN_DESC_
struct {
uint8_t require_pulse_setup : 1 ; ///< Device requires extra Pulse_Setup request during pulse dialing sequence to disengage holding circuit.
uint8_t support_aux_request : 1 ; ///< Device supports the request combination of Set_Aux_Line_State, Ring_Aux_Jack, and notification Aux_Jack_Hook_State.
uint8_t support_pulse_request : 1 ; ///< Device supports the request combination of Pulse_Setup, Send_Pulse, and Set_Pulse_Time.
uint8_t : 0 ;
} bmCapabilities ;
} tusb_cdc_func_direct_line_management_t ;
typedef ATTR_PACKED_STRUCT ( struct ) {
uint8_t bLength ; ///< Size of this descriptor in bytes.
uint8_t bDescriptorType ; ///< Descriptor Type, must be Class-Specific
uint8_t bDescriptorSubType ; ///< Descriptor SubType one of above CDC_FUCN_DESC_
uint8_t bRingerVolSteps ;
uint8_t bNumRingerPatterns ;
} tusb_cdc_func_telephone_ringer_t ;
typedef ATTR_PACKED_STRUCT ( struct ) {
uint8_t bLength ; ///< Size of this descriptor in bytes.
uint8_t bDescriptorType ; ///< Descriptor Type, must be Class-Specific
uint8_t bDescriptorSubType ; ///< Descriptor SubType one of above CDC_FUCN_DESC_
struct {
uint8_t simple_mode : 1 ;
uint8_t standalone_mode : 1 ;
uint8_t computer_centric_mode : 1 ;
uint8_t : 0 ;
} bmCapabilities ;
} tusb_cdc_func_telephone_operational_modes_t ;
typedef ATTR_PACKED_STRUCT ( struct ) {
uint8_t bLength ; ///< Size of this descriptor in bytes.
uint8_t bDescriptorType ; ///< Descriptor Type, must be Class-Specific
uint8_t bDescriptorSubType ; ///< Descriptor SubType one of above CDC_FUCN_DESC_
struct {
2013-07-01 06:29:23 +02:00
uint32_t interrupted_dialtone : 1 ; ///< 0 : Reports only dialtone (does not differentiate between normal and interrupted dialtone). 1 : Reports interrupted dialtone in addition to normal dialtone
uint32_t ringback_busy_fastbusy : 1 ; ///< 0 : Reports only dialing state. 1 : Reports ringback, busy, and fast busy states.
uint32_t caller_id : 1 ; ///< 0 : Does not report caller ID. 1 : Reports caller ID information.
uint32_t incoming_distinctive : 1 ; ///< 0 : Reports only incoming ringing. 1 : Reports incoming distinctive ringing patterns.
uint32_t dual_tone_multi_freq : 1 ; ///< 0 : Cannot report dual tone multi-frequency (DTMF) digits input remotely over the telephone line. 1 : Can report DTMF digits input remotely over the telephone line.
uint32_t line_state_change : 1 ; ///< 0 : Does not support line state change notification. 1 : Does support line state change notification
2013-06-29 10:56:32 +02:00
uint32_t : 0 ;
} bmCapabilities ;
} tusb_cdc_func_telephone_call_state_reporting_capabilities_t ;
2013-07-01 06:29:23 +02:00
static inline uint8_t functional_desc_typeof ( uint8_t const * p_desc ) ATTR_PURE ATTR_ALWAYS_INLINE ;
static inline uint8_t functional_desc_typeof ( uint8_t const * p_desc )
{
return p_desc [ 2 ] ;
}
2013-06-29 10:56:32 +02:00
# ifdef __cplusplus
}
2012-11-29 11:52:57 +01:00
# endif
2012-12-04 08:12:48 +01:00
# endif