/* insert license */


#include "descriptors.h"
#include "libmaple.h"
#include "usb_config.h"

const USB_Descriptor_Device usbVcomDescriptor_Device = {
 bLength:              sizeof(USB_Descriptor_Device), 
 bDescriptorType:      USB_DESCRIPTOR_TYPE_DEVICE,
 bcdUSB:               0x0200,
 bDeviceClass:         USB_DEVICE_CLASS_CDC,
 bDeviceSubClass:      USB_DEVICE_SUBCLASS_CDC,
 bDeviceProtocol:      0x00,
 bMaxPacketSize0:      0x40,
 idVendor:             VCOM_ID_VENDOR,
 idProduct:            VCOM_ID_PRODUCT,
 bcdDevice:            0x0200,
 iManufacturer:        0x01,
 iProduct:             0x02,
 iSerialNumber:        0x00,
 bNumConfigurations:   0x01
};

const USB_Descriptor_Config usbVcomDescriptor_Config = {
 bLength:                   0x09,//sizeof(USB_Descriptor_Config_Header),
 bDescriptorType:           USB_DESCRIPTOR_TYPE_CONFIGURATION,
 wTotalLength:              0x43,//sizeof(USB_Descriptor_Config),
 bNumInterfaces:            0x02,
 bConfigurationValue:       0x01,
 iConfiguration:            0x00,
 bmAttributes:              (USB_CONFIG_ATTR_BUSPOWERED | USB_CONFIG_ATTR_SELF_POWERED),
 bMaxPower:                 USB_CONFIG_MAX_POWER,

 CCI_Interface:
   {
   bLength:                  0x09,//sizeof(USB_Descriptor_Interface),
   bDescriptorType:          USB_DESCRIPTOR_TYPE_INTERFACE,
   bInterfaceNumber:         0x00,
   bAlternateSetting:        0x00,
   bNumEndpoints:            0x01,
   bInterfaceClass:          0x02,
   bInterfaceSubClass:       0x02,
   bInterfaceProtocol:       0x01,
   iInterface:               0x00
   },

 CDC_Functional_IntHeader:
   {
   bLength:                  0x05,//sizeof(CDC_FUNCTIONAL_DESCRIPTOR(2)),
   bDescriptorType:          0x24,
   SubType:                  0x00,
   Data:                     {0x01, 0x10}
   },

 CDC_Functional_CallManagement:
   {
   bLength:                  0x05,//sizeof(CDC_FUNCTIONAL_DESCRIPTOR(2)),
   bDescriptorType:          0x24,
   SubType:                  0x01,
   Data:                     {0x03, 0x01}
   },

 CDC_Functional_ACM:
   {
   bLength:                  0x04,//sizeof(CDC_FUNCTIONAL_DESCRIPTOR(1)),
   bDescriptorType:          0x24,
   SubType:                  0x02,
   Data:                     {0x06}
   },

 CDC_Functional_Union:
   {
   bLength:                  0x05,//sizeof(CDC_FUNCTIONAL_DESCRIPTOR(2)),
   bDescriptorType:          0x24,
   SubType:                  0x06,
   Data:                     {0x00, 0x01}
   },

 // ManagementEndpoint: 
 //  {
 EP1_bLength:                 0x07,//sizeof(USB_Descriptor_Endpoint),
 EP1_bDescriptorType:         USB_DESCRIPTOR_TYPE_ENDPOINT,
 EP1_bEndpointAddress:        (USB_DESCRIPTOR_ENDPOINT_IN | VCOM_NOTIFICATION_EPNUM),
 EP1_bmAttributes:            EP_TYPE_INTERRUPT,
 EP1_wMaxPacketSize0:         VCOM_NOTIFICATION_EPSIZE,
 EP1_wMaxPacketSize1:         0x00,
 EP1_bInterval:               0xFF,
 //  },

 // DCI_Interface:
 //   {
   DCI_bLength:                0x09,//sizeof(USB_Descriptor_Interface),
   DCI_bDescriptorType:        USB_DESCRIPTOR_TYPE_INTERFACE,
   DCI_bInterfaceNumber:       0x01,
   DCI_bAlternateSetting:      0x00,
   DCI_bNumEndpoints:          0x02,
   DCI_bInterfaceClass:        0x0A,
   DCI_bInterfaceSubClass:     0x00,
   DCI_bInterfaceProtocol:     0x00,
   DCI_iInterface:             0x00,
   //   },

 //DataOutEndpoint:
 // {
 //  },
 EP2_bLength:               0x07,//sizeof(USB_Descriptor_Endpoint),
 EP2_bDescriptorType:       USB_DESCRIPTOR_TYPE_ENDPOINT,
 EP2_bEndpointAddress:      (USB_DESCRIPTOR_ENDPOINT_OUT | VCOM_RX_EPNUM),
 EP2_bmAttributes:          EP_TYPE_BULK,
 EP2_wMaxPacketSize0:       VCOM_RX_EPSIZE,
 EP2_wMaxPacketSize1:       0x00,
 EP2_bInterval:             0x00,


 // DataInEndpoint:
 // {
 EP3_bLength:               0x07,//sizeof(USB_Descriptor_Endpoint),
 EP3_bDescriptorType:       USB_DESCRIPTOR_TYPE_ENDPOINT,
 EP3_bEndpointAddress:      (USB_DESCRIPTOR_ENDPOINT_IN | VCOM_TX_EPNUM),
 EP3_bmAttributes:          EP_TYPE_BULK,
 EP3_wMaxPacketSize0:       VCOM_TX_EPSIZE,
 EP3_wMaxPacketSize1:       0x00,
 EP3_bInterval:             0x00

 //  }
};

/* 
   String Identifiers:

   we may choose to specify any or none of the following string
   identifiers:
  
   iManufacturer:    LeafLabs
   iProduct:         Maple R3
   iSerialNumber:    NONE
   iConfiguration:   NONE
   iInterface(CCI):  NONE
   iInterface(DCI):  NONE

   additionally we must provide the unicode language identifier,
   which is 0x0409 for US English
*/

const uint8 usbVcomDescriptor_LangID[USB_DESCRIPTOR_STRING_LEN(1)] = 
{
  USB_DESCRIPTOR_STRING_LEN(1),
  USB_DESCRIPTOR_TYPE_STRING,
  0x09,
  0x04
};

const uint8 usbVcomDescriptor_iManufacturer[USB_DESCRIPTOR_STRING_LEN(8)] = 
{
  USB_DESCRIPTOR_STRING_LEN(8),
  USB_DESCRIPTOR_TYPE_STRING,
  'L', 0, 'e', 0, 'a', 0, 'f', 0, 
  'L', 0, 'a', 0, 'b', 0, 's', 0
};

const uint8 usbVcomDescriptor_iProduct[USB_DESCRIPTOR_STRING_LEN(8)] = 
{
  USB_DESCRIPTOR_STRING_LEN(8),
  USB_DESCRIPTOR_TYPE_STRING,
  'M', 0, 'a', 0, 'p', 0, 'l', 0, 
  'e', 0, ' ', 0, 'R', 0, '3', 0
};
