/******************************************************************************
 * The MIT License
 *
 * Copyright (c) 2010 LeafLabs LLC.
 *
 * Permission is hereby granted, free of charge, to any person
 * obtaining a copy of this software and associated documentation
 * files (the "Software"), to deal in the Software without
 * restriction, including without limitation the rights to use, copy,
 * modify, merge, publish, distribute, sublicense, and/or sell copies
 * of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 *****************************************************************************/

#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

 //  }
};

/*****************************************************************************
 *****************************************************************************
 ***
 *** FIXME FIXME FIXME NOT THE RIGHT THING! MOVE ALL THIS INTO TO WIRISH!
 ***
 *****************************************************************************
 *****************************************************************************/

const uint8 usbVcomDescriptor_LangID[USB_DESCRIPTOR_STRING_LEN(1)] = {
    USB_DESCRIPTOR_STRING_LEN(1),
    USB_DESCRIPTOR_TYPE_STRING,
    0x09,
    0x04
};
#if 0
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
};

/*
  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_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, ' ', 0, ' ', 0
};
#endif
#if 1
const uint8 usbVcomDescriptor_iManufacturer[USB_DESCRIPTOR_STRING_LEN(18)] =
{
  USB_DESCRIPTOR_STRING_LEN(18),
  USB_DESCRIPTOR_TYPE_STRING,
    /* Manufacturer: "STMicroelectronics" */
    'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0,
    'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0,
    'c', 0, 's', 0	
};

const uint8 usbVcomDescriptor_iProduct[USB_DESCRIPTOR_STRING_LEN(24)] =
{
  USB_DESCRIPTOR_STRING_LEN(24),
  USB_DESCRIPTOR_TYPE_STRING,
    /* Product name: "STM32 Virtual COM Port" */
    'S', 0, 'T', 0, 'M', 0, '3', 0, '2', 0, ' ', 0, 'V', 0, 'i', 0,
    'r', 0, 't', 0, 'u', 0, 'a', 0, 'l', 0, ' ', 0, 'C', 0, 'O', 0,
    'M', 0, ' ', 0, 'P', 0, 'o', 0, 'r', 0, 't', 0, ' ', 0, ' ', 0	
};

#endif
/*****************************************************************************
 *****************************************************************************/
