hathach 7 лет назад
Родитель
Сommit
19eb62ebe4

+ 0 - 1
examples/device/nrf52840/src/main.c

@@ -45,7 +45,6 @@
 
 #include "bsp/board.h"
 #include "tusb.h"
-#include "tusb_descriptors.h"
 
 //--------------------------------------------------------------------+
 // MACRO CONSTANT TYPEDEF

+ 7 - 5
examples/device/nrf52840/src/tusb_config.h

@@ -50,23 +50,25 @@
 #define CFG_TUSB_RHPORT0_MODE     OPT_MODE_DEVICE
 
 #define CFG_TUSB_DEBUG            2
+
+/*------------- RTOS -------------*/
 #define CFG_TUSB_OS               OPT_OS_NONE // be passed from IDE/command line for easy project switching
+//#define CFG_TUD_TASK_PRIO         0
+//#define CFG_TUD_TASK_QUEUE_SZ     16
+//#define CFG_TUD_TASK_STACK_SZ     150
 
 //--------------------------------------------------------------------+
 // DEVICE CONFIGURATION
 //--------------------------------------------------------------------+
 
-/*------------- RTOS -------------*/
-//#define CFG_TUD_TASK_QUEUE_SZ     16
-//#define CFG_TUD_TASK_STACK_SZ     150
-//#define CFG_TUD_TASK_PRIO         0
-
 /*------------- Core -------------*/
 #define CFG_TUD_DESC_AUTO         1
 
 // #define CFG_TUD_DESC_VID          0xCAFE
 // #define CFG_TUD_DESC_PID          0x0001
 
+#define CFG_TUD_ENDOINT0_SIZE     64
+
 //------------- CLASS -------------//
 #define CFG_TUD_CDC               1
 #define CFG_TUD_MSC               1

+ 1 - 1
examples/device/nrf52840/src/tusb_descriptors.c

@@ -36,7 +36,7 @@
 */
 /**************************************************************************/
 
-#include "tusb_descriptors.h"
+#include "tusb.h"
 
 //--------------------------------------------------------------------+
 // STRING DESCRIPTORS

+ 0 - 120
examples/device/nrf52840/src/tusb_descriptors.h

@@ -1,120 +0,0 @@
-/**************************************************************************/
-/*!
-    @file     tusb_descriptors.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.
-*/
-/**************************************************************************/
-
-#ifndef _TUSB_DESCRIPTORS_H_
-#define _TUSB_DESCRIPTORS_H_
-
-#include "tusb.h"
-
-//--------------------------------------------------------------------+
-// Descriptors Value (calculated by enabled Classes)
-//--------------------------------------------------------------------+
-#define CFG_VENDORID            0xCAFE
-//#define CFG_PRODUCTID           0x4567 // use auto product id to prevent conflict with pc's driver
-
-// each combination of interfaces need to have a unique productid, as windows will bind & remember device driver after the first plug.
-// Auto ProductID layout's Bitmap: (MSB) MassStorage | Generic | Mouse | Key | CDC (LSB)
-#ifndef CFG_PRODUCTID
-  #define PRODUCTID_BITMAP(interface, n)  ( (CFG_TUD_##interface) << (n) )
-  #define CFG_PRODUCTID                   (0x4000 | ( PRODUCTID_BITMAP(CDC, 0) | PRODUCTID_BITMAP(HID_KEYBOARD, 1) | \
-                                           PRODUCTID_BITMAP(HID_MOUSE, 2) | PRODUCTID_BITMAP(HID_GENERIC, 3) | \
-                                           PRODUCTID_BITMAP(MSC, 4) ) )
-#endif
-
-#define ITF_NUM_CDC    0
-#define ITF_NUM_MSC    2
-
-#define ITF_TOTAL      3 // total number of interfaces
-
-//--------------------------------------------------------------------+
-// Endpoints Address & Max Packet Size
-//--------------------------------------------------------------------+
-#define EDPT_IN(x)    (0x80 | (x))
-#define EDPT_OUT(x)   (x)
-
-#define CDC_EDPT_NOTIF       EDPT_IN (1)
-#define CDC_EDPT_NOTIF_SIZE  8
-
-#define CDC_EDPT_OUT         EDPT_OUT(2)
-#define CDC_EDPT_IN          EDPT_IN (2)
-#define CDC_EDPT_SIZE        64
-
-#define MSC_EDPT_OUT         EDPT_OUT(3)
-#define MSC_EDPT_IN          EDPT_IN(3)
-#define MSC_EDPT_SIZE        64
-
-
-//--------------------------------------------------------------------+
-// CONFIGURATION DESCRIPTOR
-//--------------------------------------------------------------------+
-typedef struct ATTR_PACKED
-{
-  tusb_desc_configuration_t           configuration;
-
-  struct ATTR_PACKED
-  {
-    tusb_desc_interface_assoc_t       iad;
-
-    //CDC Control Interface
-    tusb_desc_interface_t             comm_itf;
-    cdc_desc_func_header_t            header;
-    cdc_desc_func_call_management_t   call;
-    cdc_desc_func_acm_t               acm;
-    cdc_desc_func_union_t             union_func;
-    tusb_desc_endpoint_t              ep_notif;
-
-    //CDC Data Interface
-    tusb_desc_interface_t             data_itf;
-    tusb_desc_endpoint_t              ep_out;
-    tusb_desc_endpoint_t              ep_in;
-  }cdc;
-
-  struct ATTR_PACKED
-  {
-    tusb_desc_interface_t             interface;
-    tusb_desc_endpoint_t              ep_out;
-    tusb_desc_endpoint_t              ep_in;
-  }msc;
-
-} app_descriptor_configuration_t;
-
-
-
-extern tud_desc_set_t usb_desc_init;
-
-#endif

+ 0 - 2
examples/obsolete/device/src/main.c

@@ -46,7 +46,6 @@
 #include "bsp/board.h"
 #include "app_os_prio.h"
 #include "tusb.h"
-#include "tusb_descriptors.h"
 
 #include "msc_device_app.h"
 #include "keyboard_device_app.h"
@@ -88,7 +87,6 @@ int main(void)
   print_greeting();
 
   tusb_init();
-  tud_set_descriptors(&usb_desc_init);
 
   //------------- application task init -------------//
   led_blinking_init();

+ 16 - 10
examples/obsolete/device/src/tusb_config.h

@@ -51,9 +51,24 @@
 #define CFG_TUSB_RHPORT0_MODE  (OPT_MODE_DEVICE)
 //#define CFG_TUSB_RHPORT1_MODE  (OPT_MODE_DEVICE)
 
+#define CFG_TUSB_DEBUG            2
+
+/*------------- RTOS -------------*/
+//#define CFG_TUSB_OS               OPT_OS_NONE // be passed from IDE/command line for easy project switching
+//#define CFG_TUD_TASK_PRIO         0
+//#define CFG_TUD_TASK_QUEUE_SZ     16
+//#define CFG_TUD_TASK_STACK_SZ     150
+
 //--------------------------------------------------------------------+
 // DEVICE CONFIGURATION
 //--------------------------------------------------------------------+
+
+/*------------- Core -------------*/
+#define CFG_TUD_DESC_AUTO         1
+
+// #define CFG_TUD_DESC_VID          0xCAFE
+// #define CFG_TUD_DESC_PID          0x0001
+
 #define CFG_TUD_ENDOINT0_SIZE     64
 
 //------------- CLASS -------------//
@@ -63,17 +78,8 @@
 #define CFG_TUD_MSC               1
 #define CFG_TUD_CDC               1
 
-//--------------------------------------------------------------------+
-// COMMON CONFIGURATION
-//--------------------------------------------------------------------+
-#define CFG_TUSB_DEBUG            2
-
-//#define CFG_TUSB_OS                   OPT_OS_NONE // be passed from IDE/command line for easy project switching
-//#define CFG_TUD_TASK_PRIO         0            // be passed from IDE/command line for easy project switching
-
-
 /*------------------------------------------------------------------*/
-/* CLASS
+/* CLASS DRIVER
  *------------------------------------------------------------------*/
 
 // FIFO size of CDC TX and RX

+ 9 - 383
examples/obsolete/device/src/tusb_descriptors.c

@@ -36,375 +36,7 @@
 */
 /**************************************************************************/
 
-#include "tusb_descriptors.h"
-
-//--------------------------------------------------------------------+
-// Keyboard Report Descriptor
-//--------------------------------------------------------------------+
-#if CFG_TUD_HID_KEYBOARD
-uint8_t const desc_keyboard_report[] = {
-  HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP     ),
-  HID_USAGE      ( HID_USAGE_DESKTOP_KEYBOARD ),
-  HID_COLLECTION ( HID_COLLECTION_APPLICATION ),
-    HID_USAGE_PAGE ( HID_USAGE_PAGE_KEYBOARD ),
-      HID_USAGE_MIN    ( 224                                    ),
-      HID_USAGE_MAX    ( 231                                    ),
-      HID_LOGICAL_MIN  ( 0                                      ),
-      HID_LOGICAL_MAX  ( 1                                      ),
-
-      HID_REPORT_SIZE  ( 1                                      ),
-      HID_REPORT_COUNT ( 8                                      ), /* 8 bits */
-      HID_INPUT        ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ), /* maskable modifier key */
-
-      HID_REPORT_SIZE  ( 8                                      ),
-      HID_REPORT_COUNT ( 1                                      ),
-      HID_INPUT        ( HID_CONSTANT                           ), /* reserved */
-
-    HID_USAGE_PAGE  ( HID_USAGE_PAGE_LED                   ),
-      HID_USAGE_MIN    ( 1                                       ),
-      HID_USAGE_MAX    ( 5                                       ),
-      HID_REPORT_COUNT ( 5                                       ),
-      HID_REPORT_SIZE  ( 1                                       ),
-      HID_OUTPUT       ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE  ), /* 5-bit Led report */
-
-      HID_REPORT_SIZE  ( 3                                       ), /* led padding */
-      HID_REPORT_COUNT ( 1                                       ),
-      HID_OUTPUT       ( HID_CONSTANT                            ),
-
-    HID_USAGE_PAGE (HID_USAGE_PAGE_KEYBOARD),
-      HID_USAGE_MIN    ( 0                                   ),
-      HID_USAGE_MAX    ( 101                                 ),
-      HID_LOGICAL_MIN  ( 0                                   ),
-      HID_LOGICAL_MAX  ( 101                                 ),
-
-      HID_REPORT_SIZE  ( 8                                   ),
-      HID_REPORT_COUNT ( 6                                   ),
-      HID_INPUT        ( HID_DATA | HID_ARRAY | HID_ABSOLUTE ), /* keycodes array 6 items */
-  HID_COLLECTION_END
-};
-#endif
-
-//--------------------------------------------------------------------+
-// Mouse Report Descriptor
-//--------------------------------------------------------------------+
-#if CFG_TUD_HID_MOUSE
-uint8_t const desc_mouse_report[] = {
-  HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP     ),
-  HID_USAGE      ( HID_USAGE_DESKTOP_MOUSE    ),
-  HID_COLLECTION ( HID_COLLECTION_APPLICATION ),
-    HID_USAGE      (HID_USAGE_DESKTOP_POINTER),
-
-    HID_COLLECTION ( HID_COLLECTION_PHYSICAL ),
-      HID_USAGE_PAGE  ( HID_USAGE_PAGE_BUTTON ),
-        HID_USAGE_MIN    ( 1                                      ),
-        HID_USAGE_MAX    ( 3                                      ),
-        HID_LOGICAL_MIN  ( 0                                      ),
-        HID_LOGICAL_MAX  ( 1                                      ),
-
-        HID_REPORT_SIZE  ( 1                                      ),
-        HID_REPORT_COUNT ( 3                                      ), /* Left, Right and Middle mouse*/
-        HID_INPUT        ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),
-
-        HID_REPORT_SIZE  ( 5                                      ),
-        HID_REPORT_COUNT ( 1                                      ),
-        HID_INPUT        ( HID_CONSTANT                           ), /* 5 bit padding followed 3 bit buttons */
-
-      HID_USAGE_PAGE  ( HID_USAGE_PAGE_DESKTOP ),
-        HID_USAGE        ( HID_USAGE_DESKTOP_X                    ),
-        HID_USAGE        ( HID_USAGE_DESKTOP_Y                    ),
-        HID_LOGICAL_MIN  ( 0x81                                   ), /* -127 */
-        HID_LOGICAL_MAX  ( 0x7f                                   ), /* 127  */
-
-        HID_REPORT_SIZE  ( 8                                      ),
-        HID_REPORT_COUNT ( 2                                      ), /* X, Y position */
-        HID_INPUT        ( HID_DATA | HID_VARIABLE | HID_RELATIVE ), /* relative values */
-
-        HID_USAGE       ( HID_USAGE_DESKTOP_WHEEL                ), /* mouse scroll */
-        HID_LOGICAL_MIN ( 0x81                                   ), /* -127 */
-        HID_LOGICAL_MAX ( 0x7f                                   ), /* 127  */
-        HID_REPORT_COUNT( 1                                      ),
-        HID_REPORT_SIZE ( 8                                      ), /* 8-bit value */
-        HID_INPUT       ( HID_DATA | HID_VARIABLE | HID_RELATIVE ), /* relative values */
-
-    HID_COLLECTION_END,
-
-  HID_COLLECTION_END
-};
-#endif
-
-//--------------------------------------------------------------------+
-// USB DEVICE DESCRIPTOR
-//--------------------------------------------------------------------+
-tusb_desc_device_t const desc_device =
-{
-    .bLength            = sizeof(tusb_desc_device_t),
-    .bDescriptorType    = TUSB_DESC_DEVICE,
-    .bcdUSB             = 0x0200,
-  #if CFG_TUD_CDC
-    // Use Interface Association Descriptor (IAD) for CDC
-    // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1)
-    .bDeviceClass       = TUSB_CLASS_MISC,
-    .bDeviceSubClass    = MISC_SUBCLASS_COMMON,
-    .bDeviceProtocol    = MISC_PROTOCOL_IAD,
-  #else
-    .bDeviceClass       = 0x00,
-    .bDeviceSubClass    = 0x00,
-    .bDeviceProtocol    = 0x00,
-  #endif
-
-    .bMaxPacketSize0    = CFG_TUD_ENDOINT0_SIZE,
-
-    .idVendor           = CFG_VENDORID,
-    .idProduct          = CFG_PRODUCTID,
-    .bcdDevice          = 0x0100,
-
-    .iManufacturer      = 0x01,
-    .iProduct           = 0x02,
-    .iSerialNumber      = 0x03,
-
-    .bNumConfigurations = 0x01 // TODO multiple configurations
-};
-
-//--------------------------------------------------------------------+
-// USB COFNIGURATION DESCRIPTOR
-//--------------------------------------------------------------------+
-app_descriptor_configuration_t const desc_configuration =
-{
-    .configuration =
-    {
-        .bLength             = sizeof(tusb_desc_configuration_t),
-        .bDescriptorType     = TUSB_DESC_CONFIGURATION,
-
-        .wTotalLength        = sizeof(app_descriptor_configuration_t),
-        .bNumInterfaces      = ITF_TOTAL,
-
-        .bConfigurationValue = 1,
-        .iConfiguration      = 0x00,
-        .bmAttributes        = TUSB_DESC_CONFIG_ATT_BUS_POWER,
-        .bMaxPower           = TUSB_DESC_CONFIG_POWER_MA(500)
-    },
-
-    #if CFG_TUD_CDC
-    // IAD points to CDC Interfaces
-    .cdc_iad =
-    {
-        .bLength           = sizeof(tusb_desc_interface_assoc_t),
-        .bDescriptorType   = TUSB_DESC_INTERFACE_ASSOCIATION,
-
-        .bFirstInterface   = ITF_NUM_CDC,
-        .bInterfaceCount   = 2,
-
-        .bFunctionClass    = TUSB_CLASS_CDC,
-        .bFunctionSubClass = CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL,
-        .bFunctionProtocol = CDC_COMM_PROTOCOL_ATCOMMAND,
-        .iFunction         = 0
-    },
-
-    //------------- CDC Communication Interface -------------//
-    .cdc_comm_interface =
-    {
-        .bLength            = sizeof(tusb_desc_interface_t),
-        .bDescriptorType    = TUSB_DESC_INTERFACE,
-        .bInterfaceNumber   = ITF_NUM_CDC,
-        .bAlternateSetting  = 0,
-        .bNumEndpoints      = 1,
-        .bInterfaceClass    = TUSB_CLASS_CDC,
-        .bInterfaceSubClass = CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL,
-        .bInterfaceProtocol = CDC_COMM_PROTOCOL_ATCOMMAND,
-        .iInterface         = 0x00
-    },
-
-    .cdc_header =
-    {
-        .bLength            = sizeof(cdc_desc_func_header_t),
-        .bDescriptorType    = TUSB_DESC_CLASS_SPECIFIC,
-        .bDescriptorSubType = CDC_FUNC_DESC_HEADER,
-        .bcdCDC             = 0x0120
-    },
-
-    .cdc_call =
-    {
-        .bLength            = sizeof(cdc_desc_func_call_management_t),
-        .bDescriptorType    = TUSB_DESC_CLASS_SPECIFIC,
-        .bDescriptorSubType = CDC_FUNC_DESC_CALL_MANAGEMENT,
-        .bmCapabilities     = { 0 },
-        .bDataInterface     = ITF_NUM_CDC+1,
-    },
-
-    .cdc_acm =
-    {
-        .bLength            = sizeof(cdc_desc_func_acm_t),
-        .bDescriptorType    = TUSB_DESC_CLASS_SPECIFIC,
-        .bDescriptorSubType = CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT,
-        .bmCapabilities     = { // 0x02
-            .support_line_request = 1,
-        }
-    },
-
-    .cdc_union =
-    {
-        .bLength                  = sizeof(cdc_desc_func_union_t), // plus number of
-        .bDescriptorType          = TUSB_DESC_CLASS_SPECIFIC,
-        .bDescriptorSubType       = CDC_FUNC_DESC_UNION,
-        .bControlInterface        = ITF_NUM_CDC,
-        .bSubordinateInterface    = ITF_NUM_CDC+1,
-    },
-
-    .cdc_endpoint_notification =
-    {
-        .bLength          = sizeof(tusb_desc_endpoint_t),
-        .bDescriptorType  = TUSB_DESC_ENDPOINT,
-        .bEndpointAddress = CDC_EDPT_NOTIF,
-        .bmAttributes     = { .xfer = TUSB_XFER_INTERRUPT },
-        .wMaxPacketSize   = { .size = 0x08 },
-        .bInterval        = 0x10
-    },
-
-    //------------- CDC Data Interface -------------//
-    .cdc_data_interface =
-    {
-        .bLength            = sizeof(tusb_desc_interface_t),
-        .bDescriptorType    = TUSB_DESC_INTERFACE,
-        .bInterfaceNumber   = ITF_NUM_CDC+1,
-        .bAlternateSetting  = 0x00,
-        .bNumEndpoints      = 2,
-        .bInterfaceClass    = TUSB_CLASS_CDC_DATA,
-        .bInterfaceSubClass = 0,
-        .bInterfaceProtocol = 0,
-        .iInterface         = 0x04
-    },
-
-    .cdc_endpoint_out =
-    {
-        .bLength          = sizeof(tusb_desc_endpoint_t),
-        .bDescriptorType  = TUSB_DESC_ENDPOINT,
-        .bEndpointAddress = CDC_EDPT_OUT,
-        .bmAttributes     = { .xfer = TUSB_XFER_BULK },
-        .wMaxPacketSize   = { .size = CDC_EDPT_SIZE },
-        .bInterval        = 0
-    },
-
-    .cdc_endpoint_in =
-    {
-        .bLength          = sizeof(tusb_desc_endpoint_t),
-        .bDescriptorType  = TUSB_DESC_ENDPOINT,
-        .bEndpointAddress = CDC_EDPT_IN,
-        .bmAttributes     = { .xfer = TUSB_XFER_BULK },
-        .wMaxPacketSize   = { .size = CDC_EDPT_SIZE },
-        .bInterval        = 0
-    },
-    #endif
-
-    //------------- HID Keyboard -------------//
-    #if CFG_TUD_HID_KEYBOARD
-    .keyboard_interface =
-    {
-        .bLength            = sizeof(tusb_desc_interface_t),
-        .bDescriptorType    = TUSB_DESC_INTERFACE,
-        .bInterfaceNumber   = INTERFACE_NO_HID_KEYBOARD,
-        .bAlternateSetting  = 0x00,
-        .bNumEndpoints      = 1,
-        .bInterfaceClass    = TUSB_CLASS_HID,
-        .bInterfaceSubClass = HID_SUBCLASS_BOOT,
-        .bInterfaceProtocol = HID_PROTOCOL_KEYBOARD,
-        .iInterface         = 0x05
-    },
-
-    .keyboard_hid =
-    {
-        .bLength           = sizeof(tusb_hid_descriptor_hid_t),
-        .bDescriptorType   = HID_DESC_TYPE_HID,
-        .bcdHID            = 0x0111,
-        .bCountryCode      = HID_Local_NotSupported,
-        .bNumDescriptors   = 1,
-        .bReportType       = HID_DESC_TYPE_REPORT,
-        .wReportLength     = sizeof(desc_keyboard_report)
-    },
-
-    .keyboard_endpoint =
-    {
-        .bLength          = sizeof(tusb_desc_endpoint_t),
-        .bDescriptorType  = TUSB_DESC_ENDPOINT,
-        .bEndpointAddress = HID_KEYBOARD_EDPT_ADDR,
-        .bmAttributes     = { .xfer = TUSB_XFER_INTERRUPT },
-        .wMaxPacketSize   = { .size = HID_KEYBOARD_EDPT_PACKETSIZE },
-        .bInterval        = 0x0A
-    },
-    #endif
-
-    //------------- HID Mouse -------------//
-    #if CFG_TUD_HID_MOUSE
-    .mouse_interface =
-    {
-        .bLength            = sizeof(tusb_desc_interface_t),
-        .bDescriptorType    = TUSB_DESC_INTERFACE,
-        .bInterfaceNumber   = INTERFACE_NO_HID_MOUSE,
-        .bAlternateSetting  = 0x00,
-        .bNumEndpoints      = 1,
-        .bInterfaceClass    = TUSB_CLASS_HID,
-        .bInterfaceSubClass = HID_SUBCLASS_BOOT,
-        .bInterfaceProtocol = HID_PROTOCOL_MOUSE,
-        .iInterface         = 0x06
-    },
-
-    .mouse_hid =
-    {
-        .bLength           = sizeof(tusb_hid_descriptor_hid_t),
-        .bDescriptorType   = HID_DESC_TYPE_HID,
-        .bcdHID            = 0x0111,
-        .bCountryCode      = HID_Local_NotSupported,
-        .bNumDescriptors   = 1,
-        .bReportType       = HID_DESC_TYPE_REPORT,
-        .wReportLength     = sizeof(desc_mouse_report)
-    },
-
-    .mouse_endpoint =
-    {
-        .bLength          = sizeof(tusb_desc_endpoint_t),
-        .bDescriptorType  = TUSB_DESC_ENDPOINT,
-        .bEndpointAddress = HID_MOUSE_EDPT_ADDR, // TODO
-        .bmAttributes     = { .xfer = TUSB_XFER_INTERRUPT },
-        .wMaxPacketSize   = { .size = HID_MOUSE_EDPT_PACKETSIZE },
-        .bInterval        = 0x0A
-    },
-    #endif
-
-    //------------- Mass Storage -------------//
-    #if CFG_TUD_MSC
-    .msc_interface =
-    {
-        .bLength            = sizeof(tusb_desc_interface_t),
-        .bDescriptorType    = TUSB_DESC_INTERFACE,
-        .bInterfaceNumber   = ITF_NUM_MSC,
-        .bAlternateSetting  = 0x00,
-        .bNumEndpoints      = 2,
-        .bInterfaceClass    = TUSB_CLASS_MSC,
-        .bInterfaceSubClass = MSC_SUBCLASS_SCSI,
-        .bInterfaceProtocol = MSC_PROTOCOL_BOT,
-        .iInterface         = 0x07
-    },
-
-    .msc_endpoint_in =
-    {
-        .bLength          = sizeof(tusb_desc_endpoint_t),
-        .bDescriptorType  = TUSB_DESC_ENDPOINT,
-        .bEndpointAddress = MSC_EDPT_IN_ADDR,
-        .bmAttributes     = { .xfer = TUSB_XFER_BULK },
-        .wMaxPacketSize   = { .size = MSC_EDPT_PACKETSIZE },
-        .bInterval        = 1
-    },
-
-    .msc_endpoint_out =
-    {
-        .bLength          = sizeof(tusb_desc_endpoint_t),
-        .bDescriptorType  = TUSB_DESC_ENDPOINT,
-        .bEndpointAddress = MSC_EDPT_OUT_ADDR,
-        .bmAttributes     = { .xfer = TUSB_XFER_BULK },
-        .wMaxPacketSize   = { .size = MSC_EDPT_PACKETSIZE },
-        .bInterval        = 1
-    },
-    #endif
-};
+#include "tusb.h"
 
 //--------------------------------------------------------------------+
 // STRING DESCRIPTORS
@@ -413,7 +45,7 @@ app_descriptor_configuration_t const desc_configuration =
 #define ENDIAN_BE16_FROM( high, low) ENDIAN_BE16(high << 8 | low)
 
 // array of pointer to string descriptors
-uint16_t const * const string_descriptor_arr [] =
+uint16_t const * const string_desc_arr [] =
 {
     [0] = (uint16_t []) { // supported language
         ENDIAN_BE16_FROM( STRING_LEN_UNICODE(1), TUSB_DESC_STRING ),
@@ -457,18 +89,12 @@ uint16_t const * const string_descriptor_arr [] =
 };
 
 
-/*------------- Variable used by tud_set_descriptors -------------*/
-tud_desc_init_t usb_desc_init =
+// tud_desc_set is required by tinyusb stack
+// since CFG_TUD_DESC_AUTO is enabled, we only need to set string_arr
+tud_desc_set_t tud_desc_set =
 {
-    .device              = (uint8_t const * ) &desc_device,
-    .configuration       = (uint8_t const * ) &desc_configuration,
-    .string_arr          = (uint8_t const **) string_descriptor_arr,
-
-    #if CFG_TUD_HID_KEYBOARD
-    .p_hid_keyboard_report = (uint8_t const *) desc_keyboard_report,
-    #endif
-
-    #if CFG_TUD_HID_MOUSE
-    .p_hid_mouse_report    = (uint8_t const *)  desc_mouse_report,
-    #endif
+    .device     = NULL,
+    .config     = NULL,
+    .string_arr = (uint8_t const **) string_desc_arr,
+    .hid_report = NULL
 };

+ 0 - 182
examples/obsolete/device/src/tusb_descriptors.h

@@ -1,182 +0,0 @@
-/**************************************************************************/
-/*!
-    @file     tusb_descriptors.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.
-*/
-/**************************************************************************/
-
-#ifndef _TUSB_DESCRIPTORS_H_
-#define _TUSB_DESCRIPTORS_H_
-
-#include "tusb.h"
-
-//--------------------------------------------------------------------+
-// Descriptors Value (calculated by enabled Classes)
-//--------------------------------------------------------------------+
-#define CFG_VENDORID            0xCAFE
-//#define CFG_PRODUCTID           0x4567 // use auto product id to prevent conflict with pc's driver
-
-// each combination of interfaces need to have a unique productid, as windows will bind & remember device driver after the first plug.
-// Auto ProductID layout's Bitmap: (MSB) MassStorage | Generic | Mouse | Key | CDC (LSB)
-#ifndef CFG_PRODUCTID
-  #define PRODUCTID_BITMAP(interface, n)  ( (CFG_TUD_##interface) << (n) )
-  #define CFG_PRODUCTID                   (0x4000 | ( PRODUCTID_BITMAP(CDC, 0) | PRODUCTID_BITMAP(HID_KEYBOARD, 1) | \
-                                           PRODUCTID_BITMAP(HID_MOUSE, 2) | PRODUCTID_BITMAP(HID_GENERIC, 3) | \
-                                           PRODUCTID_BITMAP(MSC, 4) ) )
-#endif
-
-#define ITF_NUM_CDC           0
-#define INTERFACE_NO_HID_KEYBOARD (ITF_NUM_CDC          + 2*(CFG_TUD_CDC ? 1 : 0) )
-#define INTERFACE_NO_HID_MOUSE    (INTERFACE_NO_HID_KEYBOARD + CFG_TUD_HID_KEYBOARD    )
-#define INTERFACE_NO_HID_GENERIC  (INTERFACE_NO_HID_MOUSE    + CFG_TUD_HID_MOUSE       )
-#define ITF_NUM_MSC          (INTERFACE_NO_HID_GENERIC  + CFG_TUD_HID_GENERIC     )
-
-#define ITF_TOTAL           (2*CFG_TUD_CDC + CFG_TUD_HID_KEYBOARD + CFG_TUD_HID_MOUSE + \
-                                   CFG_TUD_HID_GENERIC + CFG_TUD_MSC)
-
-#if (CFG_TUSB_MCU == OPT_MCU_LPC11UXX || CFG_TUSB_MCU == OPT_MCU_LPC13UXX) && (ITF_TOTAL > 4)
-  #error These MCUs do not have enough number of endpoints for the current configuration
-#endif
-
-//--------------------------------------------------------------------+
-// Endpoints Address & Max Packet Size
-//--------------------------------------------------------------------+
-#define EDPT_IN(x)    (0x80 | (x))
-#define EDPT_OUT(x)   (x)
-
-#if CFG_TUSB_MCU == OPT_MCU_LPC175X_6X // MCUs's endpoint number has a fixed type
-
-  //------------- CDC -------------//
-  #define CDC_EDPT_NOTIF            EDPT_IN (1)
-  #define CDC_EDPT_NOTIFICATION_PACKETSIZE      64
-
-  #define CDC_EDPT_OUT                EDPT_OUT(2)
-  #define CDC_EDPT_IN                 EDPT_IN (2)
-  #define CDC_EDPT_SIZE              64
-
-  //------------- HID Keyboard -------------//
-  #define HID_KEYBOARD_EDPT_ADDR                EDPT_IN (4)
-  #define HID_KEYBOARD_EDPT_PACKETSIZE          8
-
-  //------------- HID Mouse -------------//
-  #define HID_MOUSE_EDPT_ADDR                   EDPT_IN (7)
-  #define HID_MOUSE_EDPT_PACKETSIZE             8
-
-  //------------- HID Generic -------------//
-
-  //------------- Mass Storage -------------//
-  #define MSC_EDPT_OUT_ADDR                     EDPT_OUT(5)
-  #define MSC_EDPT_IN_ADDR                      EDPT_IN (5)
-
-#else
-
-  //------------- CDC -------------//
-  #define CDC_EDPT_NOTIF            EDPT_IN (ITF_NUM_CDC+1)
-  #define CDC_EDPT_NOTIFICATION_PACKETSIZE      64
-
-  #define CDC_EDPT_OUT                EDPT_OUT(ITF_NUM_CDC+2)
-  #define CDC_EDPT_IN                 EDPT_IN (ITF_NUM_CDC+2)
-  #define CDC_EDPT_SIZE              64
-
-  //------------- HID Keyboard -------------//
-  #define HID_KEYBOARD_EDPT_ADDR                EDPT_IN (INTERFACE_NO_HID_KEYBOARD+1)
-  #define HID_KEYBOARD_EDPT_PACKETSIZE          8
-
-  //------------- HID Mouse -------------//
-  #define HID_MOUSE_EDPT_ADDR                   EDPT_IN (INTERFACE_NO_HID_MOUSE+1)
-  #define HID_MOUSE_EDPT_PACKETSIZE             8
-
-  //------------- HID Generic -------------//
-
-  //------------- Mass Storage -------------//
-  #define MSC_EDPT_OUT_ADDR                     EDPT_OUT(ITF_NUM_MSC+1)
-  #define MSC_EDPT_IN_ADDR                      EDPT_IN (ITF_NUM_MSC+1)
-
-#endif
-
-#define MSC_EDPT_PACKETSIZE                   (CFG_TUSB_MCU == OPT_MCU_LPC43XX ? 512 : 64)
-
-//--------------------------------------------------------------------+
-// CONFIGURATION DESCRIPTOR
-//--------------------------------------------------------------------+
-typedef struct ATTR_PACKED
-{
-  tusb_desc_configuration_t              configuration;
-
-  //------------- CDC -------------//
-#if CFG_TUD_CDC
-  tusb_desc_interface_assoc_t      cdc_iad;
-
-  //CDC Control Interface
-  tusb_desc_interface_t                  cdc_comm_interface;
-  cdc_desc_func_header_t                       cdc_header;
-  cdc_desc_func_call_management_t              cdc_call;
-  cdc_desc_func_acm_t  cdc_acm;
-  cdc_desc_func_union_t                        cdc_union;
-  tusb_desc_endpoint_t                   cdc_endpoint_notification;
-
-  //CDC Data Interface
-  tusb_desc_interface_t                  cdc_data_interface;
-  tusb_desc_endpoint_t                   cdc_endpoint_out;
-  tusb_desc_endpoint_t                   cdc_endpoint_in;
-#endif
-
-  //------------- HID Keyboard -------------//
-#if CFG_TUD_HID_KEYBOARD
-  tusb_desc_interface_t                    keyboard_interface;
-  tusb_hid_descriptor_hid_t                      keyboard_hid;
-  tusb_desc_endpoint_t                     keyboard_endpoint;
-#endif
-
-//------------- HID Mouse -------------//
-#if CFG_TUD_HID_MOUSE
-  tusb_desc_interface_t                    mouse_interface;
-  tusb_hid_descriptor_hid_t                      mouse_hid;
-  tusb_desc_endpoint_t                     mouse_endpoint;
-#endif
-
-//------------- Mass Storage -------------//
-#if CFG_TUD_MSC
-  tusb_desc_interface_t                    msc_interface;
-  tusb_desc_endpoint_t                     msc_endpoint_in;
-  tusb_desc_endpoint_t                     msc_endpoint_out;
-#endif
-
-} app_descriptor_configuration_t;
-
-
-
-extern tud_desc_set_t usb_desc_init;
-
-#endif

+ 1 - 1
hw/bsp/pca10056/board_pca10056.c

@@ -91,7 +91,7 @@ void board_init(void)
   {
       .handler = (nrf_drv_power_usb_event_handler_t) tusb_hal_nrf_power_event
   };
-  TU_ASSERT( NRF_SUCCESS == nrf_drv_power_usbevt_init(&config) );
+  TU_ASSERT( NRF_SUCCESS == nrf_drv_power_usbevt_init(&config), );
 #endif
 
   // Tick init

+ 571 - 0
src/device/usbd_desc.c

@@ -0,0 +1,571 @@
+/**************************************************************************/
+/*!
+    @file     usbd_desc.c
+    @author   hathach (tinyusb.org)
+
+    @section LICENSE
+
+    Software License Agreement (BSD License)
+
+    Copyright (c) 2018, Adafruit Industries (adafruit.com)
+    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.
+*/
+/**************************************************************************/
+
+#include "tusb_option.h"
+
+#if MODE_DEVICE_SUPPORTED
+
+#define _TINY_USB_SOURCE_FILE_
+
+#include "tusb.h"
+
+
+#if CFG_TUD_DESC_AUTO
+
+/*------------- VID/PID -------------*/
+#ifndef CFG_TUD_DESC_VID
+#define CFG_TUD_DESC_VID          0xCAFE
+#endif
+
+#ifndef CFG_TUD_DESC_PID
+
+/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.
+ * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.
+ *
+ * Auto ProductID layout's Bitmap:
+ *   [MSB]       HID | MSC | CDC          [LSB]
+ */
+#define _PID_MAP(itf, n)    ( (CFG_TUD_##itf) << (n) )
+#define CFG_TUD_DESC_PID    (0x8000 | _PID_MAP(CDC, 0) | _PID_MAP(MSC, 1) | \
+                             _PID_MAP(HID_KEYBOARD, 2) | _PID_MAP(HID_MOUSE, 3) | _PID_MAP(HID_GENERIC, 4) )
+#endif
+
+/*------------- Interface Numbering -------------*/
+/* The order as follows: CDC, MSC, HID
+ * If a interface is not enabled, the later will take its place
+ */
+
+#define ITF_NUM_CDC           0
+#define ITF_NUM_MSC          (ITF_NUM_CDC + 2*CFG_TUD_CDC)
+
+#define ITF_NUM_HID_KEYBOARD (ITF_NUM_MSC + CFG_TUD_MSC )
+#define ITF_NUM_HID_MOUSE    (ITF_NUM_HID_KEYBOARD + CFG_TUD_HID_KEYBOARD )
+#define ITF_NUM_HID_GENERIC  (ITF_NUM_HID_MOUSE    + CFG_TUD_HID_MOUSE    )
+
+#define ITF_TOTAL            (CFG_TUD_HID_GENERIC + CFG_TUD_HID_GENERIC)
+
+
+/*------------- Endpoint Numbering & Size -------------*/
+#define _EP_IN(x)           (0x80 | (x))
+#define _EP_OUT(x)          (x)
+
+// CDC
+#define EP_CDC_NOTIF        _EP_IN (ITF_NUM_CDC+1)
+#define EP_CDC_NOTIF_SIZE   8
+
+#define EP_CDC_OUT          _EP_OUT(ITF_NUM_CDC+2)
+#define EP_CDC_IN           _EP_IN (ITF_NUM_CDC+2)
+#define EP_CDC_SIZE         64
+
+// Mass Storage
+#define EP_MSC_OUT          _EP_OUT(ITF_NUM_MSC+1)
+#define EP_MSC_IN           _EP_IN (ITF_NUM_MSC+1)
+#define EP_MSC_SIZE         64    // TODO usb highspeed is 512
+
+#if 0
+// HID Keyboard
+#define EP_HID_KBD          _EP_IN (INTERFACE_NO_HID_KEYBOARD+1)
+#define EP_HID_KBD_SZIE     8
+
+// HID Mouse
+#define EP_HID_MSE          _EP_IN (INTERFACE_NO_HID_MOUSE+1)
+#define EP_HID_MSE_SIZE     8
+
+// HID Generic
+#endif
+
+
+
+/*------------------------------------------------------------------*/
+/* Auto generate descriptor
+ *------------------------------------------------------------------*/
+
+// For highspeed device but currently in full speed mode
+//tusb_desc_device_qualifier_t _device_qual =
+//{
+//    .bLength = sizeof(tusb_desc_device_qualifier_t),
+//    .bDescriptorType = TUSB_DESC_DEVICE_QUALIFIER,
+//    .bcdUSB = 0x0200,
+//    .bDeviceClass =
+//};
+
+/*------------- Device Descriptor -------------*/
+tusb_desc_device_t const _desc_auto_device =
+{
+    .bLength            = sizeof(tusb_desc_device_t),
+    .bDescriptorType    = TUSB_DESC_DEVICE,
+    .bcdUSB             = 0x0200,
+
+  #if CFG_TUD_CDC
+    // Use Interface Association Descriptor (IAD) for CDC
+    // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1)
+    .bDeviceClass       = TUSB_CLASS_MISC,
+    .bDeviceSubClass    = MISC_SUBCLASS_COMMON,
+    .bDeviceProtocol    = MISC_PROTOCOL_IAD,
+  #else
+    .bDeviceClass       = 0x00,
+    .bDeviceSubClass    = 0x00,
+    .bDeviceProtocol    = 0x00,
+  #endif
+
+    .bMaxPacketSize0    = CFG_TUD_ENDOINT0_SIZE,
+
+    .idVendor           = CFG_TUD_DESC_VID,
+    .idProduct          = CFG_TUD_DESC_PID,
+    .bcdDevice          = 0x0100,
+
+    .iManufacturer      = 0x01,
+    .iProduct           = 0x02,
+    .iSerialNumber      = 0x03,
+
+    .bNumConfigurations = 0x01 // TODO multiple configurations
+};
+
+
+/*------------- Configuration Descriptor -------------*/
+typedef struct ATTR_PACKED
+{
+  tusb_desc_configuration_t           config;
+
+  //------------- CDC -------------//
+#if CFG_TUD_CDC
+  struct ATTR_PACKED
+  {
+    tusb_desc_interface_assoc_t       iad;
+
+    //CDC Control Interface
+    tusb_desc_interface_t             comm_itf;
+    cdc_desc_func_header_t            header;
+    cdc_desc_func_call_management_t   call;
+    cdc_desc_func_acm_t               acm;
+    cdc_desc_func_union_t             union_func;
+    tusb_desc_endpoint_t              ep_notif;
+
+    //CDC Data Interface
+    tusb_desc_interface_t             data_itf;
+    tusb_desc_endpoint_t              ep_out;
+    tusb_desc_endpoint_t              ep_in;
+  }cdc;
+#endif
+
+//------------- Mass Storage -------------//
+#if CFG_TUD_MSC
+  struct ATTR_PACKED
+  {
+    tusb_desc_interface_t             itf;
+    tusb_desc_endpoint_t              ep_out;
+    tusb_desc_endpoint_t              ep_in;
+  }msc;
+#endif
+
+#if 0
+  //------------- HID Keyboard -------------//
+#if CFG_TUD_HID_KEYBOARD
+  tusb_desc_interface_t                    keyboard_interface;
+  tusb_hid_descriptor_hid_t                      keyboard_hid;
+  tusb_desc_endpoint_t                     keyboard_endpoint;
+#endif
+
+//------------- HID Mouse -------------//
+#if CFG_TUD_HID_MOUSE
+  tusb_desc_interface_t                    mouse_interface;
+  tusb_hid_descriptor_hid_t                      mouse_hid;
+  tusb_desc_endpoint_t                     mouse_endpoint;
+#endif
+#endif
+
+} desc_auto_cfg_t;
+
+desc_auto_cfg_t const _desc_auto_config_struct =
+{
+    .config =
+    {
+        .bLength             = sizeof(tusb_desc_configuration_t),
+        .bDescriptorType     = TUSB_DESC_CONFIGURATION,
+
+        .wTotalLength        = sizeof(desc_auto_cfg_t),
+        .bNumInterfaces      = ITF_TOTAL,
+
+        .bConfigurationValue = 1,
+        .iConfiguration      = 0x00,
+        .bmAttributes        = TUSB_DESC_CONFIG_ATT_BUS_POWER,
+        .bMaxPower           = TUSB_DESC_CONFIG_POWER_MA(100)
+    },
+
+#if CFG_TUD_CDC
+    // IAD points to CDC Interfaces
+    .cdc =
+    {
+      .iad =
+      {
+          .bLength           = sizeof(tusb_desc_interface_assoc_t),
+          .bDescriptorType   = TUSB_DESC_INTERFACE_ASSOCIATION,
+
+          .bFirstInterface   = ITF_NUM_CDC,
+          .bInterfaceCount   = 2,
+
+          .bFunctionClass    = TUSB_CLASS_CDC,
+          .bFunctionSubClass = CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL,
+          .bFunctionProtocol = CDC_COMM_PROTOCOL_ATCOMMAND,
+          .iFunction         = 0
+      },
+
+      //------------- CDC Communication Interface -------------//
+      .comm_itf =
+      {
+          .bLength            = sizeof(tusb_desc_interface_t),
+          .bDescriptorType    = TUSB_DESC_INTERFACE,
+          .bInterfaceNumber   = ITF_NUM_CDC,
+          .bAlternateSetting  = 0,
+          .bNumEndpoints      = 1,
+          .bInterfaceClass    = TUSB_CLASS_CDC,
+          .bInterfaceSubClass = CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL,
+          .bInterfaceProtocol = CDC_COMM_PROTOCOL_ATCOMMAND,
+          .iInterface         = 0x04
+      },
+
+      .header =
+      {
+          .bLength            = sizeof(cdc_desc_func_header_t),
+          .bDescriptorType    = TUSB_DESC_CLASS_SPECIFIC,
+          .bDescriptorSubType = CDC_FUNC_DESC_HEADER,
+          .bcdCDC             = 0x0120
+      },
+
+      .call =
+      {
+          .bLength            = sizeof(cdc_desc_func_call_management_t),
+          .bDescriptorType    = TUSB_DESC_CLASS_SPECIFIC,
+          .bDescriptorSubType = CDC_FUNC_DESC_CALL_MANAGEMENT,
+          .bmCapabilities     = { 0 },
+          .bDataInterface     = ITF_NUM_CDC+1,
+      },
+
+      .acm =
+      {
+          .bLength            = sizeof(cdc_desc_func_acm_t),
+          .bDescriptorType    = TUSB_DESC_CLASS_SPECIFIC,
+          .bDescriptorSubType = CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT,
+          .bmCapabilities     = { // 0x02
+              .support_line_request = 1,
+          }
+      },
+
+      .union_func =
+      {
+          .bLength                  = sizeof(cdc_desc_func_union_t), // plus number of
+          .bDescriptorType          = TUSB_DESC_CLASS_SPECIFIC,
+          .bDescriptorSubType       = CDC_FUNC_DESC_UNION,
+          .bControlInterface        = ITF_NUM_CDC,
+          .bSubordinateInterface    = ITF_NUM_CDC+1,
+      },
+
+      .ep_notif =
+      {
+          .bLength          = sizeof(tusb_desc_endpoint_t),
+          .bDescriptorType  = TUSB_DESC_ENDPOINT,
+          .bEndpointAddress = EP_CDC_NOTIF,
+          .bmAttributes     = { .xfer = TUSB_XFER_INTERRUPT },
+          .wMaxPacketSize   = { .size = EP_CDC_NOTIF_SIZE },
+          .bInterval        = 0x10
+      },
+
+      //------------- CDC Data Interface -------------//
+      .data_itf =
+      {
+          .bLength            = sizeof(tusb_desc_interface_t),
+          .bDescriptorType    = TUSB_DESC_INTERFACE,
+          .bInterfaceNumber   = ITF_NUM_CDC+1,
+          .bAlternateSetting  = 0x00,
+          .bNumEndpoints      = 2,
+          .bInterfaceClass    = TUSB_CLASS_CDC_DATA,
+          .bInterfaceSubClass = 0,
+          .bInterfaceProtocol = 0,
+          .iInterface         = 0x00
+      },
+
+      .ep_out =
+      {
+          .bLength          = sizeof(tusb_desc_endpoint_t),
+          .bDescriptorType  = TUSB_DESC_ENDPOINT,
+          .bEndpointAddress = EP_CDC_OUT,
+          .bmAttributes     = { .xfer = TUSB_XFER_BULK },
+          .wMaxPacketSize   = { .size = EP_CDC_SIZE },
+      .bInterval        = 0
+      },
+
+      .ep_in =
+      {
+          .bLength          = sizeof(tusb_desc_endpoint_t),
+          .bDescriptorType  = TUSB_DESC_ENDPOINT,
+          .bEndpointAddress = EP_CDC_IN,
+          .bmAttributes     = { .xfer = TUSB_XFER_BULK },
+          .wMaxPacketSize   = { .size = EP_CDC_SIZE },
+          .bInterval        = 0
+      },
+    },
+#endif
+
+#if CFG_TUD_MSC
+    .msc =
+    {
+      .itf =
+      {
+          .bLength            = sizeof(tusb_desc_interface_t),
+          .bDescriptorType    = TUSB_DESC_INTERFACE,
+          .bInterfaceNumber   = ITF_NUM_MSC,
+          .bAlternateSetting  = 0x00,
+          .bNumEndpoints      = 2,
+          .bInterfaceClass    = TUSB_CLASS_MSC,
+          .bInterfaceSubClass = MSC_SUBCLASS_SCSI,
+          .bInterfaceProtocol = MSC_PROTOCOL_BOT,
+          .iInterface         = 0x05
+      },
+
+      .ep_out =
+      {
+          .bLength          = sizeof(tusb_desc_endpoint_t),
+          .bDescriptorType  = TUSB_DESC_ENDPOINT,
+          .bEndpointAddress = EP_MSC_OUT,
+          .bmAttributes     = { .xfer = TUSB_XFER_BULK },
+          .wMaxPacketSize   = { .size = EP_MSC_SIZE},
+          .bInterval        = 1
+      },
+
+      .ep_in =
+      {
+          .bLength          = sizeof(tusb_desc_endpoint_t),
+          .bDescriptorType  = TUSB_DESC_ENDPOINT,
+          .bEndpointAddress = EP_MSC_IN,
+          .bmAttributes     = { .xfer = TUSB_XFER_BULK },
+          .wMaxPacketSize   = { .size = EP_MSC_SIZE},
+          .bInterval        = 1
+      }
+    },
+#endif
+
+#if 0
+    //------------- HID Keyboard -------------//
+    #if CFG_TUD_HID_KEYBOARD
+    .keyboard_interface =
+    {
+        .bLength            = sizeof(tusb_desc_interface_t),
+        .bDescriptorType    = TUSB_DESC_INTERFACE,
+        .bInterfaceNumber   = ITF_NUM_HID_KEYBOARD,
+        .bAlternateSetting  = 0x00,
+        .bNumEndpoints      = 1,
+        .bInterfaceClass    = TUSB_CLASS_HID,
+        .bInterfaceSubClass = HID_SUBCLASS_BOOT,
+        .bInterfaceProtocol = HID_PROTOCOL_KEYBOARD,
+        .iInterface         = 0x05
+    },
+
+    .keyboard_hid =
+    {
+        .bLength           = sizeof(tusb_hid_descriptor_hid_t),
+        .bDescriptorType   = HID_DESC_TYPE_HID,
+        .bcdHID            = 0x0111,
+        .bCountryCode      = HID_Local_NotSupported,
+        .bNumDescriptors   = 1,
+        .bReportType       = HID_DESC_TYPE_REPORT,
+        .wReportLength     = sizeof(desc_keyboard_report)
+    },
+
+    .keyboard_endpoint =
+    {
+        .bLength          = sizeof(tusb_desc_endpoint_t),
+        .bDescriptorType  = TUSB_DESC_ENDPOINT,
+        .bEndpointAddress = EP_HID_KBD,
+        .bmAttributes     = { .xfer = TUSB_XFER_INTERRUPT },
+        .wMaxPacketSize   = { .size = EP_HID_KBD_SZIE },
+        .bInterval        = 0x0A
+    },
+    #endif
+
+    //------------- HID Mouse -------------//
+    #if CFG_TUD_HID_MOUSE
+    .mouse_interface =
+    {
+        .bLength            = sizeof(tusb_desc_interface_t),
+        .bDescriptorType    = TUSB_DESC_INTERFACE,
+        .bInterfaceNumber   = ITF_NUM_HID_MOUSE,
+        .bAlternateSetting  = 0x00,
+        .bNumEndpoints      = 1,
+        .bInterfaceClass    = TUSB_CLASS_HID,
+        .bInterfaceSubClass = HID_SUBCLASS_BOOT,
+        .bInterfaceProtocol = HID_PROTOCOL_MOUSE,
+        .iInterface         = 0x06
+    },
+
+    .mouse_hid =
+    {
+        .bLength           = sizeof(tusb_hid_descriptor_hid_t),
+        .bDescriptorType   = HID_DESC_TYPE_HID,
+        .bcdHID            = 0x0111,
+        .bCountryCode      = HID_Local_NotSupported,
+        .bNumDescriptors   = 1,
+        .bReportType       = HID_DESC_TYPE_REPORT,
+        .wReportLength     = sizeof(desc_mouse_report)
+    },
+
+    .mouse_endpoint =
+    {
+        .bLength          = sizeof(tusb_desc_endpoint_t),
+        .bDescriptorType  = TUSB_DESC_ENDPOINT,
+        .bEndpointAddress = EP_HID_MSE, // TODO
+        .bmAttributes     = { .xfer = TUSB_XFER_INTERRUPT },
+        .wMaxPacketSize   = { .size = EP_HID_MSE_SIZE },
+        .bInterval        = 0x0A
+    },
+    #endif
+#endif
+};
+
+uint8_t const * const _desc_auto_config = (uint8_t const*) &_desc_auto_config_struct;
+
+
+//--------------------------------------------------------------------+
+// Keyboard Report Descriptor
+//--------------------------------------------------------------------+
+#if CFG_TUD_HID_KEYBOARD
+uint8_t const desc_keyboard_report[] = {
+  HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP     ),
+  HID_USAGE      ( HID_USAGE_DESKTOP_KEYBOARD ),
+  HID_COLLECTION ( HID_COLLECTION_APPLICATION ),
+    HID_USAGE_PAGE ( HID_USAGE_PAGE_KEYBOARD ),
+      HID_USAGE_MIN    ( 224                                    ),
+      HID_USAGE_MAX    ( 231                                    ),
+      HID_LOGICAL_MIN  ( 0                                      ),
+      HID_LOGICAL_MAX  ( 1                                      ),
+
+      HID_REPORT_SIZE  ( 1                                      ),
+      HID_REPORT_COUNT ( 8                                      ), /* 8 bits */
+      HID_INPUT        ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ), /* maskable modifier key */
+
+      HID_REPORT_SIZE  ( 8                                      ),
+      HID_REPORT_COUNT ( 1                                      ),
+      HID_INPUT        ( HID_CONSTANT                           ), /* reserved */
+
+    HID_USAGE_PAGE  ( HID_USAGE_PAGE_LED                   ),
+      HID_USAGE_MIN    ( 1                                       ),
+      HID_USAGE_MAX    ( 5                                       ),
+      HID_REPORT_COUNT ( 5                                       ),
+      HID_REPORT_SIZE  ( 1                                       ),
+      HID_OUTPUT       ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE  ), /* 5-bit Led report */
+
+      HID_REPORT_SIZE  ( 3                                       ), /* led padding */
+      HID_REPORT_COUNT ( 1                                       ),
+      HID_OUTPUT       ( HID_CONSTANT                            ),
+
+    HID_USAGE_PAGE (HID_USAGE_PAGE_KEYBOARD),
+      HID_USAGE_MIN    ( 0                                   ),
+      HID_USAGE_MAX    ( 101                                 ),
+      HID_LOGICAL_MIN  ( 0                                   ),
+      HID_LOGICAL_MAX  ( 101                                 ),
+
+      HID_REPORT_SIZE  ( 8                                   ),
+      HID_REPORT_COUNT ( 6                                   ),
+      HID_INPUT        ( HID_DATA | HID_ARRAY | HID_ABSOLUTE ), /* keycodes array 6 items */
+  HID_COLLECTION_END
+};
+#endif
+
+//--------------------------------------------------------------------+
+// Mouse Report Descriptor
+//--------------------------------------------------------------------+
+#if CFG_TUD_HID_MOUSE
+uint8_t const desc_mouse_report[] = {
+  HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP     ),
+  HID_USAGE      ( HID_USAGE_DESKTOP_MOUSE    ),
+  HID_COLLECTION ( HID_COLLECTION_APPLICATION ),
+    HID_USAGE      (HID_USAGE_DESKTOP_POINTER),
+
+    HID_COLLECTION ( HID_COLLECTION_PHYSICAL ),
+      HID_USAGE_PAGE  ( HID_USAGE_PAGE_BUTTON ),
+        HID_USAGE_MIN    ( 1                                      ),
+        HID_USAGE_MAX    ( 3                                      ),
+        HID_LOGICAL_MIN  ( 0                                      ),
+        HID_LOGICAL_MAX  ( 1                                      ),
+
+        HID_REPORT_SIZE  ( 1                                      ),
+        HID_REPORT_COUNT ( 3                                      ), /* Left, Right and Middle mouse*/
+        HID_INPUT        ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),
+
+        HID_REPORT_SIZE  ( 5                                      ),
+        HID_REPORT_COUNT ( 1                                      ),
+        HID_INPUT        ( HID_CONSTANT                           ), /* 5 bit padding followed 3 bit buttons */
+
+      HID_USAGE_PAGE  ( HID_USAGE_PAGE_DESKTOP ),
+        HID_USAGE        ( HID_USAGE_DESKTOP_X                    ),
+        HID_USAGE        ( HID_USAGE_DESKTOP_Y                    ),
+        HID_LOGICAL_MIN  ( 0x81                                   ), /* -127 */
+        HID_LOGICAL_MAX  ( 0x7f                                   ), /* 127  */
+
+        HID_REPORT_SIZE  ( 8                                      ),
+        HID_REPORT_COUNT ( 2                                      ), /* X, Y position */
+        HID_INPUT        ( HID_DATA | HID_VARIABLE | HID_RELATIVE ), /* relative values */
+
+        HID_USAGE       ( HID_USAGE_DESKTOP_WHEEL                ), /* mouse scroll */
+        HID_LOGICAL_MIN ( 0x81                                   ), /* -127 */
+        HID_LOGICAL_MAX ( 0x7f                                   ), /* 127  */
+        HID_REPORT_COUNT( 1                                      ),
+        HID_REPORT_SIZE ( 8                                      ), /* 8-bit value */
+        HID_INPUT       ( HID_DATA | HID_VARIABLE | HID_RELATIVE ), /* relative values */
+
+    HID_COLLECTION_END,
+
+  HID_COLLECTION_END
+};
+#endif
+
+#endif
+
+/*------------------------------------------------------------------*/
+/* MACRO TYPEDEF CONSTANT ENUM
+ *------------------------------------------------------------------*/
+
+/*------------------------------------------------------------------*/
+/* VARIABLE DECLARATION
+ *------------------------------------------------------------------*/
+
+/*------------------------------------------------------------------*/
+/* FUNCTION DECLARATION
+ *------------------------------------------------------------------*/
+
+
+
+
+#endif

+ 4 - 0
src/tusb_option.h

@@ -159,6 +159,10 @@
     #define CFG_TUD_ENUM_BUFFER_SIZE 256
   #endif
 
+  #ifndef CFG_TUD_DESC_AUTO
+    #define CFG_TUD_DESC_AUTO 0
+  #endif
+
 #endif // MODE_DEVICE_SUPPORTED
 
 //--------------------------------------------------------------------+