diff --git a/tinyusb/class/cdc.h b/tinyusb/class/cdc.h index 7a4080047..cd1341e25 100644 --- a/tinyusb/class/cdc.h +++ b/tinyusb/class/cdc.h @@ -52,66 +52,263 @@ #ifndef _TUSB_CDC_H__ #define _TUSB_CDC_H__ -// todo refractor later #include "common/common.h" -#include "device/dcd.h" -#define CDC_BUFFER_SIZE (2*CDC_DATA_EP_MAXPACKET_SIZE) +#ifdef __cplusplus + extern "C" { +#endif -/** \brief send a character to host - * - * \param[in] para1 - * \param[out] para2 - * \return Error Code of the \ref TUSB_ERROR enum - * \note - */ -bool tusb_cdc_putc(uint8_t c); +//--------------------------------------------------------------------+ +// 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 +}; -/** \brief get a character from host - * - * \param[in] para1 - * \param[out] para2 - * \return Error Code of the \ref TUSB_ERROR enum - * \note - */ -bool tusb_cdc_getc(uint8_t *c); +enum { + CDC_COMM_PROTOCOL_ATCOMMAND_ITU_V250 = 0x01 , // ITU-T V2.50 + 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 +}; -/** \brief send a number of characters to host - * - * \param[in] para1 - * \param[out] para2 - * \return Error Code of the \ref TUSB_ERROR enum - * \note - */ -uint16_t tusb_cdc_send(uint8_t* buffer, uint16_t count); +//------------- 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 +}; -/** \brief get a number of characters from host - * - * \param[in] para1 - * \param[out] para2 - * \return Error Code of the \ref TUSB_ERROR enum - * \note - */ -uint16_t tusb_cdc_recv(uint8_t* buffer, uint16_t max); +//--------------------------------------------------------------------+ +// CDC DATA INTERFACE CLASS +//--------------------------------------------------------------------+ -#ifdef DEVICE_ROMDRIVER -/** \brief initialize cdc driver - * - * \param[in] para1 - * \param[out] para2 - * \return Error Code of the \ref TUSB_ERROR enum - * \note - */ -tusb_error_t tusb_cdc_init(USBD_HANDLE_T hUsb, USB_INTERFACE_DESCRIPTOR const *const pControlIntfDesc, USB_INTERFACE_DESCRIPTOR const *const pDataIntfDesc, uint32_t* mem_base, uint32_t* mem_size); +// SUBCLASS code of Data Interface is not used and should/must be zero -/** \brief notify cdc driver that usb is configured - * - * \param[in] para1 - * \param[out] para2 - * \return Error Code of the \ref TUSB_ERROR enum - * \note - */ -tusb_error_t tusb_cdc_configured(USBD_HANDLE_T hUsb); +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_ + uint8_t bcdCDC ; ///< CDC release number in Binary-Coded Decimal +}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_ + uint8_t bControlInterface ; ///< Interface number of Data Interface (zero-based) + uint8_t bSubordinateInterface[0] ; ///< Variable length array +}tusb_cdc_func_union_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 iCountryCodeRelDate ; ///< Index of a string giving the release date for the implemented ISO 3166 Country Codes. + uint16_t wCountryCode[0] ; ///< Country code in the format as defined in [ISO3166], release date as specified inoffset 3 for the first supported country. +}tusb_cdc_func_country_selection_t; + +//--------------------------------------------------------------------+ +// 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; + +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 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; + } bmCapabilities; +}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 { + 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 notificatio + uint32_t : 0; + } bmCapabilities; +}tusb_cdc_func_telephone_call_state_reporting_capabilities_t; + + +#ifdef __cplusplus + } #endif #endif diff --git a/tinyusb/core/std_request.h b/tinyusb/core/std_request.h index 15b34e66a..041adb7c8 100644 --- a/tinyusb/core/std_request.h +++ b/tinyusb/core/std_request.h @@ -56,8 +56,8 @@ extern "C" { #endif -typedef ATTR_PREPACKED struct ATTR_PACKED { - ATTR_PREPACKED struct ATTR_PACKED { +typedef ATTR_PACKED_STRUCT(struct){ + ATTR_PACKED_STRUCT(struct) { uint8_t recipient : 5; /**< Recipient type tusb_std_request_recipient_t. */ uint8_t type : 2; /**< Request type tusb_std_request_type_t. */ uint8_t direction : 1; /**< Direction type. tusb_direction_t */