summaryrefslogtreecommitdiff
path: root/tinyusb/class
diff options
context:
space:
mode:
authorhathach <[email protected]>2013-11-08 12:03:32 +0700
committerhathach <[email protected]>2013-11-08 12:03:32 +0700
commit15d3a418bd0d109d926ea95c3be1bbc83757734b (patch)
treece38570975a7009624c80075101cb8cc84083c2e /tinyusb/class
parent3945869cc267214a24fae94fe530fc3197348607 (diff)
add windows driver for cdc
add simple echo cdc serial demo add cdc device send/receive API refractor descriptor refractor cdc.h add usbd driver function - init - bus_reset
Diffstat (limited to 'tinyusb/class')
-rw-r--r--tinyusb/class/WinCDCdriver.inf105
-rw-r--r--tinyusb/class/cdc.h103
-rw-r--r--tinyusb/class/cdc_device.c239
-rw-r--r--tinyusb/class/cdc_device.h89
-rw-r--r--tinyusb/class/cdc_host.c7
-rw-r--r--tinyusb/class/cdc_host.h7
-rw-r--r--tinyusb/class/cdc_rndis_host.c4
7 files changed, 398 insertions, 156 deletions
diff --git a/tinyusb/class/WinCDCdriver.inf b/tinyusb/class/WinCDCdriver.inf
deleted file mode 100644
index 392016b13..000000000
--- a/tinyusb/class/WinCDCdriver.inf
+++ /dev/null
@@ -1,105 +0,0 @@
-;************************************************************
-; Windows USB CDC ACM Setup File
-; Copyright (c) 2000 Microsoft Corporation
-
-
-[Version]
-Signature="$Windows NT$"
-Class=Ports
-ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318}
-Provider=%MFGNAME%
-LayoutFile=layout.inf
-CatalogFile=%MFGFILENAME%.cat
-DriverVer=11/15/2007,5.1.2600.0
-
-[Manufacturer]
-%MFGNAME%=DeviceList, NTamd64
-
-[DestinationDirs]
-DefaultDestDir=12
-
-
-;------------------------------------------------------------------------------
-; Windows 2000/XP/Vista-32bit Sections
-;------------------------------------------------------------------------------
-
-[DriverInstall.nt]
-include=mdmcpq.inf
-CopyFiles=DriverCopyFiles.nt
-AddReg=DriverInstall.nt.AddReg
-
-[DriverCopyFiles.nt]
-usbser.sys,,,0x20
-
-[DriverInstall.nt.AddReg]
-HKR,,DevLoader,,*ntkern
-HKR,,NTMPDriver,,%DRIVERFILENAME%.sys
-HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"
-
-[DriverInstall.nt.Services]
-AddService=usbser, 0x00000002, DriverService.nt
-
-[DriverService.nt]
-DisplayName=%SERVICE%
-ServiceType=1
-StartType=3
-ErrorControl=1
-ServiceBinary=%12%\%DRIVERFILENAME%.sys
-
-;------------------------------------------------------------------------------
-; Vista-64bit Sections
-;------------------------------------------------------------------------------
-
-[DriverInstall.NTamd64]
-include=mdmcpq.inf
-CopyFiles=DriverCopyFiles.NTamd64
-AddReg=DriverInstall.NTamd64.AddReg
-
-[DriverCopyFiles.NTamd64]
-%DRIVERFILENAME%.sys,,,0x20
-
-[DriverInstall.NTamd64.AddReg]
-HKR,,DevLoader,,*ntkern
-HKR,,NTMPDriver,,%DRIVERFILENAME%.sys
-HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"
-
-[DriverInstall.NTamd64.Services]
-AddService=usbser, 0x00000002, DriverService.NTamd64
-
-[DriverService.NTamd64]
-DisplayName=%SERVICE%
-ServiceType=1
-StartType=3
-ErrorControl=1
-ServiceBinary=%12%\%DRIVERFILENAME%.sys
-
-
-;------------------------------------------------------------------------------
-; Vendor and Product ID Definitions
-;------------------------------------------------------------------------------
-; When developing your USB device, the VID and PID used in the PC side
-; application program and the firmware on the microcontroller must match.
-; Modify the below line to use your VID and PID. Use the format as shown below.
-; Note: One INF file can be used for multiple devices with different VID and PIDs.
-; For each supported device, append ",USB\VID_xxxx&PID_yyyy" to the end of the line.
-;------------------------------------------------------------------------------
-[SourceDisksFiles]
-[SourceDisksNames]
-[DeviceList]
-%DESCRIPTION%=DriverInstall, USB\VID_1FC9&PID_2001, USB\VID_1FC9&PID_2003&MI_00, USB\VID_1FC9&PID_2005&MI_00, USB\VID_1FC9&PID_2007&MI_00
-
-[DeviceList.NTamd64]
-%DESCRIPTION%=DriverInstall, USB\VID_1FC9&PID_2001, USB\VID_1FC9&PID_2003&MI_00, USB\VID_1FC9&PID_2005&MI_00, USB\VID_1FC9&PID_2007&MI_00
-
-;------------------------------------------------------------------------------
-; String Definitions
-;------------------------------------------------------------------------------
-;Modify these strings to customize your device
-;------------------------------------------------------------------------------
-[Strings]
-MFGFILENAME="CDC_vista"
-DRIVERFILENAME ="usbser"
-MFGNAME="tinyusb.org"
-INSTDISK="tinyUSB CDC driver"
-DESCRIPTION="Communications Port"
-SERVICE="USB RS-232 Emulation Driver" \ No newline at end of file
diff --git a/tinyusb/class/cdc.h b/tinyusb/class/cdc.h
index 56b02dc70..11c989d0d 100644
--- a/tinyusb/class/cdc.h
+++ b/tinyusb/class/cdc.h
@@ -56,6 +56,15 @@
/** \defgroup ClassDriver_CDC_Common Common Definitions
* @{ */
+
+/// CDC Pipe ID, used to indicate which pipe the API is addressing to (Notification, Out, In)
+typedef enum {
+ CDC_PIPE_NOTIFICATION , ///< Notification pipe
+ CDC_PIPE_DATA_IN , ///< Data in pipe
+ CDC_PIPE_DATA_OUT , ///< Data out pipe
+ CDC_PIPE_ERROR , ///< Invalid Pipe ID
+}cdc_pipeid_t;
+
//--------------------------------------------------------------------+
// CDC COMMUNICATION INTERFACE CLASS
//--------------------------------------------------------------------+
@@ -143,49 +152,49 @@ typedef enum{
//--------------------------------------------------------------------+
/// Communication Interface Management Element Request Codes
typedef enum {
- SEND_ENCAPSULATED_COMMAND = 0x00, ///< is used to issue a command in the format of the supported control protocol of the Communications Class interface
- GET_ENCAPSULATED_RESPONSE = 0x01, ///< is used to request a response in the format of the supported control protocol of the Communications Class interface.
+ CDC_REQUEST_SEND_ENCAPSULATED_COMMAND = 0x00, ///< is used to issue a command in the format of the supported control protocol of the Communications Class interface
+ CDC_REQUEST_GET_ENCAPSULATED_RESPONSE = 0x01, ///< is used to request a response in the format of the supported control protocol of the Communications Class interface.
- SET_COMM_FEATURE = 0x02,
- GET_COMM_FEATURE = 0x03,
- CLEAR_COMM_FEATURE = 0x04,
+ CDC_REQUEST_SET_COMM_FEATURE = 0x02,
+ CDC_REQUEST_GET_COMM_FEATURE = 0x03,
+ CDC_REQUEST_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,
+ CDC_REQUEST_SET_AUX_LINE_STATE = 0x10,
+ CDC_REQUEST_SET_HOOK_STATE = 0x11,
+ CDC_REQUEST_PULSE_SETUP = 0x12,
+ CDC_REQUEST_SEND_PULSE = 0x13,
+ CDC_REQUEST_SET_PULSE_TIME = 0x14,
+ CDC_REQUEST_RING_AUX_JACK = 0x15,
- SET_LINE_CODING = 0x20,
- GET_LINE_CODING = 0x21,
- SET_CONTROL_LINE_STATE = 0x22,
- SEND_BREAK = 0x23,
+ CDC_REQUEST_SET_LINE_CODING = 0x20,
+ CDC_REQUEST_GET_LINE_CODING = 0x21,
+ CDC_REQUEST_SET_CONTROL_LINE_STATE = 0x22,
+ CDC_REQUEST_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,
+ CDC_REQUEST_SET_RINGER_PARMS = 0x30,
+ CDC_REQUEST_GET_RINGER_PARMS = 0x31,
+ CDC_REQUEST_SET_OPERATION_PARMS = 0x32,
+ CDC_REQUEST_GET_OPERATION_PARMS = 0x33,
+ CDC_REQUEST_SET_LINE_PARMS = 0x34,
+ CDC_REQUEST_GET_LINE_PARMS = 0x35,
+ CDC_REQUEST_DIAL_DIGITS = 0x36,
+ CDC_REQUEST_SET_UNIT_PARAMETER = 0x37,
+ CDC_REQUEST_GET_UNIT_PARAMETER = 0x38,
+ CDC_REQUEST_CLEAR_UNIT_PARAMETER = 0x39,
+ CDC_REQUEST_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,
+ CDC_REQUEST_SET_ETHERNET_MULTICAST_FILTERS = 0x40,
+ CDC_REQUEST_SET_ETHERNET_POWER_MANAGEMENT_PATTERN_FILTER = 0x41,
+ CDC_REQUEST_GET_ETHERNET_POWER_MANAGEMENT_PATTERN_FILTER = 0x42,
+ CDC_REQUEST_SET_ETHERNET_PACKET_FILTER = 0x43,
+ CDC_REQUEST_GET_ETHERNET_STATISTIC = 0x44,
- SET_ATM_DATA_FORMAT = 0x50,
- GET_ATM_DEVICE_STATISTICS = 0x51,
- SET_ATM_DEFAULT_VC = 0x52,
- GET_ATM_VC_STATISTICS = 0x53,
+ CDC_REQUEST_SET_ATM_DATA_FORMAT = 0x50,
+ CDC_REQUEST_GET_ATM_DEVICE_STATISTICS = 0x51,
+ CDC_REQUEST_SET_ATM_DEFAULT_VC = 0x52,
+ CDC_REQUEST_GET_ATM_VC_STATISTICS = 0x53,
- MDLM_SEMANTIC_MODEL = 0x60,
+ CDC_REQUEST_MDLM_SEMANTIC_MODEL = 0x60,
}cdc_management_request_t;
//--------------------------------------------------------------------+
@@ -194,7 +203,7 @@ typedef enum {
/// Communication Interface Management Element Notification Codes
typedef enum {
NETWORK_CONNECTION = 0x00, ///< This notification allows the device to notify the host about network connection status.
- RESPONSE_AVAILABLE = 0x01, ///< This notification allows the device to notify the hostthat a response is available. This response can be retrieved with a subsequent \ref GET_ENCAPSULATED_RESPONSE request.
+ RESPONSE_AVAILABLE = 0x01, ///< This notification allows the device to notify the hostthat a response is available. This response can be retrieved with a subsequent \ref CDC_REQUEST_GET_ENCAPSULATED_RESPONSE request.
AUX_JACK_HOOK_STATE = 0x08,
RING_DETECT = 0x09,
@@ -358,6 +367,26 @@ static inline uint8_t cdc_functional_desc_typeof(uint8_t const * p_desc)
return p_desc[2];
}
+//--------------------------------------------------------------------+
+// Requests
+//--------------------------------------------------------------------+
+typedef ATTR_PACKED_STRUCT(struct) {
+ uint32_t bit_rate;
+ uint8_t stop_bits; ///< 0: 1 stop bit - 1: 1.5 stop bits - 2: 2 stop bits
+ uint8_t parity; ///< 0: None - 1: Odd - 2: Even - 3: Mark - 4: Space
+ uint8_t data_bits; ///< can be 5, 6, 7, 8 or 16
+} cdc_line_coding_t;
+
+STATIC_ASSERT(sizeof(cdc_line_coding_t) == 7, "size is not correct");
+
+typedef ATTR_PACKED_STRUCT(struct) {
+ uint16_t dte_is_present : 1; ///< Indicates to DCE if DTE is presentor not. This signal corresponds to V.24 signal 108/2 and RS-232 signal DTR.
+ uint16_t half_duplex_carrier_control : 1;
+ uint16_t : 14;
+} cdc_line_control_state_t;
+
+STATIC_ASSERT(sizeof(cdc_line_control_state_t) == 2, "size is not correct");
+
/** @} */
#ifdef __cplusplus
diff --git a/tinyusb/class/cdc_device.c b/tinyusb/class/cdc_device.c
new file mode 100644
index 000000000..18f52d1c0
--- /dev/null
+++ b/tinyusb/class/cdc_device.c
@@ -0,0 +1,239 @@
+/**************************************************************************/
+/*!
+ @file cdc_device.c
+ @author hathach (tinyusb.org)
+
+ @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.
+*/
+/**************************************************************************/
+
+#include "tusb_option.h"
+
+#if (MODE_DEVICE_SUPPORTED && TUSB_CFG_DEVICE_CDC)
+
+#define _TINY_USB_SOURCE_FILE_
+//--------------------------------------------------------------------+
+// INCLUDE
+//--------------------------------------------------------------------+
+#include "common/common.h"
+#include "cdc_device.h"
+
+//--------------------------------------------------------------------+
+// MACRO CONSTANT TYPEDEF
+//--------------------------------------------------------------------+
+enum {
+ INTERFACE_INVALID_NUMBER = UINT8_MAX
+};
+
+static cdc_line_coding_t cdcd_line_coding[CONTROLLER_DEVICE_NUMBER] TUSB_CFG_ATTR_USBRAM;
+
+typedef struct {
+ uint8_t interface_number;
+ cdc_acm_capability_t acm_capability;
+
+ endpoint_handle_t edpt_hdl[3]; // notification, data in, data out
+}cdcd_data_t;
+
+//--------------------------------------------------------------------+
+// INTERNAL OBJECT & FUNCTION DECLARATION
+//--------------------------------------------------------------------+
+cdcd_data_t cdcd_data[CONTROLLER_DEVICE_NUMBER];
+
+static inline bool cdcd_is_configured(uint8_t coreid) ATTR_PURE ATTR_ALWAYS_INLINE;
+static inline bool cdcd_is_configured(uint8_t coreid)
+{
+ return cdcd_data[coreid].interface_number != INTERFACE_INVALID_NUMBER;
+}
+
+tusb_error_t cdcd_xfer(uint8_t coreid, cdc_pipeid_t pipeid, void * p_buffer, uint32_t length, bool is_notify)
+{
+ ASSERT(cdcd_is_configured(coreid), TUSB_ERROR_USBD_INTERFACE_NOT_CONFIGURED);
+
+ cdcd_data_t* p_cdc = &cdcd_data[coreid];
+
+ ASSERT_FALSE( dcd_pipe_is_busy(p_cdc->edpt_hdl[pipeid]), TUSB_ERROR_INTERFACE_IS_BUSY);
+
+ ASSERT_STATUS( dcd_pipe_xfer(p_cdc->edpt_hdl[pipeid], p_buffer, length, is_notify) );
+
+ return TUSB_ERROR_NONE;
+}
+
+//--------------------------------------------------------------------+
+// APPLICATION API
+//--------------------------------------------------------------------+
+bool tusbd_cdc_is_configured(uint8_t coreid)
+{
+ return cdcd_is_configured(coreid);
+}
+
+tusb_error_t tusbd_cdc_receive(uint8_t coreid, void * p_buffer, uint32_t length, bool is_notify)
+{
+ return cdcd_xfer(coreid, CDC_PIPE_DATA_OUT, p_buffer, length, is_notify);
+}
+
+tusb_error_t tusbd_cdc_send(uint8_t coreid, void * p_data, uint32_t length, bool is_notify)
+{
+ return cdcd_xfer(coreid, CDC_PIPE_DATA_IN, p_data, length, is_notify);
+}
+
+//--------------------------------------------------------------------+
+// USBD-CLASS API
+//--------------------------------------------------------------------+
+void cdcd_init(void)
+{
+ memclr_(cdcd_data, sizeof(cdcd_data_t)*CONTROLLER_DEVICE_NUMBER);
+
+ // default line coding is : stop bit = 1, parity = none, data bits = 8
+ memclr_(cdcd_line_coding, sizeof(cdc_line_coding_t)*CONTROLLER_DEVICE_NUMBER);
+ for(uint8_t i=0; i<CONTROLLER_DEVICE_NUMBER; i++) cdcd_line_coding[i].data_bits = 8;
+}
+
+tusb_error_t cdcd_open(uint8_t coreid, tusb_descriptor_interface_t const * p_interface_desc, uint16_t *p_length)
+{
+ if ( CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL != p_interface_desc->bInterfaceSubClass) return TUSB_ERROR_CDC_UNSUPPORTED_SUBCLASS;
+
+ if ( !(is_in_range(CDC_COMM_PROTOCOL_ATCOMMAND, p_interface_desc->bInterfaceProtocol, CDC_COMM_PROTOCOL_ATCOMMAND_CDMA) ||
+ 0xff == p_interface_desc->bInterfaceProtocol) )
+ {
+ return TUSB_ERROR_CDC_UNSUPPORTED_PROTOCOL;
+ }
+
+ uint8_t const * p_desc = descriptor_next ( (uint8_t const *) p_interface_desc );
+ cdcd_data_t * p_cdc = &cdcd_data[coreid];
+
+ //------------- Communication Interface -------------//
+ (*p_length) = sizeof(tusb_descriptor_interface_t);
+
+ while( TUSB_DESC_TYPE_INTERFACE_CLASS_SPECIFIC == p_desc[DESCRIPTOR_OFFSET_TYPE] )
+ { // Communication Functional Descriptors
+ if ( CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT == cdc_functional_desc_typeof(p_desc) )
+ { // save ACM bmCapabilities
+ p_cdc->acm_capability = ((cdc_desc_func_abstract_control_management_t const *) p_desc)->bmCapabilities;
+ }
+
+ (*p_length) += p_desc[DESCRIPTOR_OFFSET_LENGTH];
+ p_desc = descriptor_next(p_desc);
+ }
+
+ if ( TUSB_DESC_TYPE_ENDPOINT == p_desc[DESCRIPTOR_OFFSET_TYPE])
+ { // notification endpoint if any
+ p_cdc->edpt_hdl[CDC_PIPE_NOTIFICATION] = dcd_pipe_open(coreid, (tusb_descriptor_endpoint_t const *) p_desc, TUSB_CLASS_CDC);
+
+ (*p_length) += p_desc[DESCRIPTOR_OFFSET_LENGTH];
+ p_desc = descriptor_next(p_desc);
+
+ ASSERT(endpointhandle_is_valid(p_cdc->edpt_hdl[CDC_PIPE_NOTIFICATION]), TUSB_ERROR_DCD_OPEN_PIPE_FAILED);
+ }
+
+ //------------- Data Interface (if any) -------------//
+ if ( (TUSB_DESC_TYPE_INTERFACE == p_desc[DESCRIPTOR_OFFSET_TYPE]) &&
+ (TUSB_CLASS_CDC_DATA == ((tusb_descriptor_interface_t const *) p_desc)->bInterfaceClass) )
+ {
+ (*p_length) += p_desc[DESCRIPTOR_OFFSET_LENGTH];
+ p_desc = descriptor_next(p_desc);
+
+ // data endpoints expected to be in pairs
+ for(uint32_t i=0; i<2; i++)
+ {
+ tusb_descriptor_endpoint_t const *p_endpoint = (tusb_descriptor_endpoint_t const *) p_desc;
+ ASSERT_INT(TUSB_DESC_TYPE_ENDPOINT, p_endpoint->bDescriptorType, TUSB_ERROR_DESCRIPTOR_CORRUPTED);
+ ASSERT_INT(TUSB_XFER_BULK, p_endpoint->bmAttributes.xfer, TUSB_ERROR_DESCRIPTOR_CORRUPTED);
+
+ endpoint_handle_t * p_edpt_hdl = ( p_endpoint->bEndpointAddress & TUSB_DIR_DEV_TO_HOST_MASK ) ?
+ &p_cdc->edpt_hdl[CDC_PIPE_DATA_IN] : &p_cdc->edpt_hdl[CDC_PIPE_DATA_OUT] ;
+
+ (*p_edpt_hdl) = dcd_pipe_open(coreid, p_endpoint, TUSB_CLASS_CDC);
+ ASSERT ( endpointhandle_is_valid(*p_edpt_hdl), TUSB_ERROR_DCD_OPEN_PIPE_FAILED );
+
+ (*p_length) += p_desc[DESCRIPTOR_OFFSET_LENGTH];
+ p_desc = descriptor_next( p_desc );
+ }
+ }
+
+ p_cdc->interface_number = p_interface_desc->bInterfaceNumber;
+
+ tusbd_cdc_mounted_cb(coreid);
+
+ return TUSB_ERROR_NONE;
+}
+
+void cdcd_bus_reset(uint8_t coreid)
+{
+ // no need to close opened pipe, dcd bus reset will put controller's endpoints to default state
+ memclr_(&cdcd_data[coreid], sizeof(cdcd_data_t));
+ cdcd_data[coreid].interface_number = INTERFACE_INVALID_NUMBER;
+}
+
+tusb_error_t cdcd_control_request(uint8_t coreid, tusb_control_request_t const * p_request)
+{
+ //------------- Class Specific Request -------------//
+ if (p_request->bmRequestType_bit.type != TUSB_REQUEST_TYPE_CLASS) return TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT;
+
+ switch(p_request->bRequest)
+ {
+ case CDC_REQUEST_GET_LINE_CODING:
+ dcd_pipe_control_xfer(coreid, p_request->bmRequestType_bit.direction,
+ &cdcd_line_coding[coreid], min16_of(sizeof(cdc_line_coding_t), p_request->wLength) );
+ break;
+
+ case CDC_REQUEST_SET_LINE_CODING:
+ dcd_pipe_control_xfer(coreid, p_request->bmRequestType_bit.direction,
+ &cdcd_line_coding[coreid], min16_of(sizeof(cdc_line_coding_t), p_request->wLength) );
+ // TODO notify application
+ break;
+
+ case CDC_REQUEST_SET_CONTROL_LINE_STATE: // TODO extract DTE present
+ dcd_pipe_control_xfer(coreid, p_request->bmRequestType_bit.direction, NULL, 0);
+ break;
+
+
+ default: return TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT;
+ }
+
+ return TUSB_ERROR_NONE;
+}
+
+void cdcd_isr(endpoint_handle_t edpt_hdl, tusb_event_t event, uint32_t xferred_bytes)
+{
+ cdcd_data_t const * p_cdc = &cdcd_data[edpt_hdl.coreid];
+
+ for(cdc_pipeid_t pipeid=CDC_PIPE_NOTIFICATION; pipeid < CDC_PIPE_ERROR; pipeid++ )
+ {
+ if ( endpointhandle_is_equal(edpt_hdl, p_cdc->edpt_hdl[pipeid]) )
+ {
+ tusbd_cdc_xfer_isr(edpt_hdl.coreid, event, pipeid, xferred_bytes);
+ return;
+ }
+ }
+}
+
+#endif
diff --git a/tinyusb/class/cdc_device.h b/tinyusb/class/cdc_device.h
new file mode 100644
index 000000000..a0e8d5bde
--- /dev/null
+++ b/tinyusb/class/cdc_device.h
@@ -0,0 +1,89 @@
+/**************************************************************************/
+/*!
+ @file cdc_device.h
+ @author hathach (tinyusb.org)
+
+ @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.
+*/
+/**************************************************************************/
+
+/** \ingroup TBD
+ * \defgroup TBD
+ * \brief TBD
+ *
+ * @{
+ */
+
+#ifndef _TUSB_CDC_DEVICE_H_
+#define _TUSB_CDC_DEVICE_H_
+
+#include "common/common.h"
+#include "device/usbd.h"
+#include "cdc.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+//--------------------------------------------------------------------+
+// APPLICATION API
+//--------------------------------------------------------------------+
+bool tusbd_cdc_is_configured(uint8_t coreid);
+
+tusb_error_t tusbd_cdc_send(uint8_t coreid, void * p_data, uint32_t length, bool is_notify);
+tusb_error_t tusbd_cdc_receive(uint8_t coreid, void * p_buffer, uint32_t length, bool is_notify);
+
+//------------- Callback -------------//
+void tusbd_cdc_mounted_cb(uint8_t coreid);
+void tusbd_cdc_unmounted_cb(uint8_t coreid);
+void tusbd_cdc_xfer_isr(uint8_t coreid, tusb_event_t event, cdc_pipeid_t pipe_id, uint32_t xferred_bytes);
+
+//--------------------------------------------------------------------+
+// USBD-CLASS DRIVER API
+//--------------------------------------------------------------------+
+#ifdef _TINY_USB_SOURCE_FILE_
+
+void cdcd_init(void);
+tusb_error_t cdcd_open(uint8_t coreid, tusb_descriptor_interface_t const * p_interface_desc, uint16_t *p_length);
+void cdcd_bus_reset(uint8_t coreid);
+tusb_error_t cdcd_control_request(uint8_t coreid, tusb_control_request_t const * p_request);
+void cdcd_isr(endpoint_handle_t edpt_hdl, tusb_event_t event, uint32_t xferred_bytes);
+
+#endif
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_CDC_DEVICE_H_ */
+
+/** @} */
diff --git a/tinyusb/class/cdc_host.c b/tinyusb/class/cdc_host.c
index a802807d0..a71982ca7 100644
--- a/tinyusb/class/cdc_host.c
+++ b/tinyusb/class/cdc_host.c
@@ -165,15 +165,12 @@ tusb_error_t cdch_open_subtask(uint8_t dev_addr, tusb_descriptor_interface_t con
OSAL_SUBTASK_BEGIN
- if ( CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL != p_interface_desc->bInterfaceSubClass)
- {
- return TUSB_ERROR_CDCH_UNSUPPORTED_SUBCLASS;
- }
+ if ( CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL != p_interface_desc->bInterfaceSubClass) return TUSB_ERROR_CDC_UNSUPPORTED_SUBCLASS;
if ( !(is_in_range(CDC_COMM_PROTOCOL_ATCOMMAND, p_interface_desc->bInterfaceProtocol, CDC_COMM_PROTOCOL_ATCOMMAND_CDMA) ||
0xff == p_interface_desc->bInterfaceProtocol) )
{
- return TUSB_ERROR_CDCH_UNSUPPORTED_PROTOCOL;
+ return TUSB_ERROR_CDC_UNSUPPORTED_PROTOCOL;
}
uint8_t const * p_desc = descriptor_next ( (uint8_t const *) p_interface_desc );
diff --git a/tinyusb/class/cdc_host.h b/tinyusb/class/cdc_host.h
index 9a32cc896..6a33c9d85 100644
--- a/tinyusb/class/cdc_host.h
+++ b/tinyusb/class/cdc_host.h
@@ -50,13 +50,6 @@
extern "C" {
#endif
-/// CDC Pipe ID, used to indicate which pipe the API is addressing to (Notification, Out, In)
-typedef enum {
- CDC_PIPE_ERROR = 0 , ///< Invalid Pipe ID
- CDC_PIPE_NOTIFICATION , ///< Notificaiton pipe
- CDC_PIPE_DATA_IN , ///< Data in pipe
- CDC_PIPE_DATA_OUT ///< Data out pipe
-}cdc_pipeid_t;
//--------------------------------------------------------------------+
// APPLICATION PUBLIC API
diff --git a/tinyusb/class/cdc_rndis_host.c b/tinyusb/class/cdc_rndis_host.c
index c9f5a3f8f..106f2095c 100644
--- a/tinyusb/class/cdc_rndis_host.c
+++ b/tinyusb/class/cdc_rndis_host.c
@@ -248,7 +248,7 @@ static tusb_error_t send_message_get_response_subtask( uint8_t dev_addr, cdch_da
//------------- Send RNDIS Control Message -------------//
OSAL_SUBTASK_INVOKED_AND_WAIT(
usbh_control_xfer_subtask( dev_addr, bm_request_type(TUSB_DIR_HOST_TO_DEV, TUSB_REQUEST_TYPE_CLASS, TUSB_REQUEST_RECIPIENT_INTERFACE),
- SEND_ENCAPSULATED_COMMAND, 0, p_cdc->interface_number,
+ CDC_REQUEST_SEND_ENCAPSULATED_COMMAND, 0, p_cdc->interface_number,
mess_length, p_mess),
error
);
@@ -263,7 +263,7 @@ static tusb_error_t send_message_get_response_subtask( uint8_t dev_addr, cdch_da
//------------- Get RNDIS Message Initialize Complete -------------//
OSAL_SUBTASK_INVOKED_AND_WAIT(
usbh_control_xfer_subtask( dev_addr, bm_request_type(TUSB_DIR_DEV_TO_HOST, TUSB_REQUEST_TYPE_CLASS, TUSB_REQUEST_RECIPIENT_INTERFACE),
- GET_ENCAPSULATED_RESPONSE, 0, p_cdc->interface_number,
+ CDC_REQUEST_GET_ENCAPSULATED_RESPONSE, 0, p_cdc->interface_number,
RNDIS_MSG_PAYLOAD_MAX, p_response),
error
);