#include "descriptors.h"
#include <contiki-conf.h>
#include <cdc.h>
#include <usb-arch.h>

const struct usb_st_device_descriptor device_descriptor =
  {
    sizeof(struct usb_st_device_descriptor),
    DEVICE,
    0x0210,
    CDC,
    0,
    0,
    CTRL_EP_SIZE,
    0xffff,
    0xffff,
    0x0030,
    2,
    1,
    3,
    1
  };

const struct configuration_st {
  struct usb_st_configuration_descriptor configuration;
  struct usb_st_interface_descriptor comm;
  struct usb_cdc_header_func_descriptor header;
  struct usb_cdc_abstract_ctrl_mgmnt_func_descriptor abstract_ctrl;
  struct usb_cdc_union_func_descriptor union_descr;
  struct usb_cdc_call_mgmnt_func_descriptor call_mgmt;
#if 1
  struct usb_st_endpoint_descriptor ep_notification;
#endif
  struct usb_st_interface_descriptor data;
  struct usb_st_endpoint_descriptor ep_in;
  struct usb_st_endpoint_descriptor ep_out;
} BYTE_ALIGNED configuration_block =
  {
    /* Configuration */
    {
      sizeof(configuration_block.configuration),
      CONFIGURATION,
      sizeof(configuration_block),
      2,
      1,
      0,
      0x80,
      50
    },
    {
      sizeof(configuration_block.comm),
      INTERFACE,
      0,
      0,
      1,
      CDC,
      ABSTRACT_CONTROL_MODEL,
      V_25TER_PROTOCOL,
      0
    },
    {
      sizeof(configuration_block.header),
      CS_INTERFACE,
      CDC_FUNC_DESCR_HEADER,
      0x0110
    },
    {
      sizeof(configuration_block.abstract_ctrl),
      CS_INTERFACE,
      CDC_FUNC_DESCR_ABSTRACT_CTRL_MGMNT,
      0
    },
    {
      sizeof(configuration_block.union_descr),
      CS_INTERFACE,
      CDC_FUNC_DESCR_UNION,
      0, /* Master */
      {1}  /* Slave */
    },
    {
      sizeof(configuration_block.call_mgmt),
      CS_INTERFACE,
      CDC_FUNC_DESCR_CALL_MGMNT,
      0x02,
      1 /* data interface */
    },
    {
      sizeof(configuration_block.ep_notification),
      ENDPOINT,
      0x83,
      0x03,
      USB_EP3_SIZE,
      100
    },
    {
      sizeof(configuration_block.data),
      INTERFACE,
      1,
      0,
      2,
      CDC_DATA,
      0,
      TRANSPARENT_PROTOCOL,
      0
    },
    {
      sizeof(configuration_block.ep_in),
      ENDPOINT,
      0x81,
      0x02,
      USB_EP1_SIZE,
      0
    },
    {
      sizeof(configuration_block.ep_out),
      ENDPOINT,
      0x02,
      0x02,
      USB_EP2_SIZE,
      0
    }
          
  };

const struct usb_st_configuration_descriptor const *configuration_head =
(struct usb_st_configuration_descriptor const*)&configuration_block;