/*
This work is licensed under the Creative Commons Attribution 3.0 Unported License.
To view a copy of this license, visit http://creativecommons.org/licenses/by/3.0/
or send a letter to
        Creative Commons,
        171 Second Street,
        Suite 300,
        San Francisco,
        California,
        94105,
        USA.
*/

#ifndef __DESCRIPTORS_H__
#define __DESCRIPTORS_H__

// JTR v0.2a

/* String identifiers */
#define USB_iManufacturer               1u
#define USB_iProduct                    2u
#define USB_iSerialNum                  3u
#define USB_NUM_STRINGS                 4u

ROMPTR const unsigned char cdc_device_descriptor[] = {
        0x12,                                           // bLength
        USB_DEVICE_DESCRIPTOR_TYPE,                     // bDescriptorType
        0x00,                                           // bcdUSB (low byte)
        0x02,                                           // bcdUSB (high byte)
        0x02,                                           // bDeviceClass
        0x00,                                           // bDeviceSubClass
        0x00,                                           // bDeviceProtocol
        USB_EP0_BUFFER_SIZE,                            // bMaxPacketSize

        LOWB(USB_VID),                                  // idVendor (low byte)
        HIGHB(USB_VID),                                 // idVendor (high byte)
        LOWB(USB_PID),                                  // idProduct (low byte)
        HIGHB(USB_PID),                                 // idProduct (high byte)
        LOWB(USB_DEV),                                  // bcdDevice (low byte)
        HIGHB(USB_DEV),                                 // bcdDevice (high byte)
        USB_iManufacturer,                              // iManufacturer
        USB_iProduct,                                   // iProduct
        USB_iSerialNum,                                 // iSerialNumber (none)
        USB_NUM_CONFIGURATIONS                          // bNumConfigurations 
};

#define USB_CONFIG_DESC_TOT_LENGTH (9U+9+5+4+5+5+7+9+7+7)
ROMPTR const unsigned char cdc_config_descriptor[] = {
        0x09,                                           // bLength
        USB_CONFIGURATION_DESCRIPTOR_TYPE,              // bDescriptorType
        LOWB(USB_CONFIG_DESC_TOT_LENGTH),               // wTotalLength (low byte)
        HIGHB(USB_CONFIG_DESC_TOT_LENGTH),              // wTotalLength (high byte)
        USB_NUM_INTERFACES,                             // bNumInterfaces
        0x01,                                           // bConfigurationValue
        0x00,                                           // iConfiguration (0=none)
        0x80,                                           // bmAttributes (0x80 = bus powered)
        0x64,                                           // bMaxPower (in 2 mA units, 50=100 mA)
              //Interface0 descriptor starts here
        0x09,                                           // bLength (Interface0 descriptor starts here)
        USB_INTERFACE_DESCRIPTOR_TYPE,                  // bDescriptorType
        0x00,                                           // bInterfaceNumber
        0x00,                                           // bAlternateSetting
        0x01,                                           // bNumEndpoints (excluding EP0)  
        0x02,                                           // bInterfaceClass 0x02=com interface 
        0x02,                                           // bInterfaceSubClass 0x02=ACM 
        0x01,                                           // bInterfaceProtocol 0x01=AT modem
        0x00,                                           // iInterface (none)
              // CDC header descriptor
        0x05,                                           // bFunctionLength
        0x24,                                           // bDescriptorType
        0x00,                                           // bDescriptorSubtype (CDC header descriptor)
        0x10,                                           // bcdCDC (low byte)
        0x01,                                           // bcdCDC (high byte)
              // CDC abstract control management descriptor 
        0x04,                                           // bFunctionLength
        0x24,                                           // bDescriptorType
        0x02,                                           // bDescriptorSubtype (CDC abstract control management descriptor)
        0x02,                                           // bmCapabilities
              // CDC union descriptor
        0x05,                                           // bFunctionLength
        0x24,                                           // bDescriptorType
        0x06,                                           // bDescriptorSubtype (CDC union descriptor)
        0x00,                                           // bControlInterface
        0x01,                                           // bSubordinateInterface0
              // Call management descriptor
        0x05,                                           // bFunctionLength
        0x24,                                           // bDescriptorType
        0x01,                                           // bDescriptorSubtype (Call management descriptor)
        0x01,                                           // bmCapabilities
        0x01,                                           // bInterfaceNum
             // CDC Endpoint 1 IN descriptor (INTERRUPT, Not used)
        0x07,                                           // bLength (Endpoint1 descriptor)
        USB_ENDPOINT_DESCRIPTOR_TYPE,                   // bDescriptorType
        0x81,                                           // bEndpointAddress
        0x03,                                           // bmAttributes (0x03=intr)
        LOWB(CDC_NOTICE_BUFFER_SIZE),                   // wMaxPacketSize (low byte)
        HIGHB(CDC_NOTICE_BUFFER_SIZE),                  // wMaxPacketSize (high byte)
        0x40,                                           // bInterval
                //Interface1 descriptor
        0x09,                                           // bLength (Interface1 descriptor)
        USB_INTERFACE_DESCRIPTOR_TYPE,                  // bDescriptorType
        0x01,                                           // bInterfaceNumber
        0x00,                                           // bAlternateSetting
        0x02,                                           // bNumEndpoints
        0x0A,                                           // datainterface type                                            
        0x00,                                           // bInterfaceSubClass
        0x00,                                           // bInterfaceProtocol (0x00=no protocol, 0xFE=functional unit, 0xFF=vendor specific)
        0x00,                                           // iInterface
             // CDC Endpoint 2 OUT descriptor (BULK)
        0x07,                                           // bLength (Enpoint2 descriptor)
        USB_ENDPOINT_DESCRIPTOR_TYPE,                   // bDescriptorType
        0x02,                                           // bEndpointAddress
        0x02,                                           // bmAttributes (0x02=bulk)
        LOWB(CDC_BUFFER_SIZE),                          // wMaxPacketSize (low byte)
        HIGHB(CDC_BUFFER_SIZE),                         // wMaxPacketSize (high byte)
        0x00,                                           // bInterval
             // CDC Endpoint 2 IN descriptor (BULK)
        0x07,                                           // bLength
        USB_ENDPOINT_DESCRIPTOR_TYPE,                   // bDescriptorType
        0x82,                                           // bEndpointAddress
        0x02,                                           // bmAttributes (0x02=bulk)
        LOWB(CDC_BUFFER_SIZE),                          // wMaxPacketSize (low byte)
        HIGHB(CDC_BUFFER_SIZE),                         // wMaxPacketSize (high byte)
        0x00                                            // bInterval
};


ROM const unsigned char cdc_str_descs[] = {
        /* 0 */                  4, USB_STRING_DESCRIPTOR_TYPE, LOWB(USB_LANGID_English_United_States), HIGHB(USB_LANGID_English_United_States),
        /* USB_iManufacturer */ 42, USB_STRING_DESCRIPTOR_TYPE, 'D',0,'a',0,'n',0,'g',0,'e',0,'r',0,'o',0,'u',0,'s',0,' ',0,'P',0,'r',0,'o',0,'t',0,'o',0,'t',0,'y',0,'p',0,'e',0,'s',0,
        /* USB_iProduct */      25, USB_STRING_DESCRIPTOR_TYPE, 'F',0,'r',0,'a',0,'i',0,'s',0,'e',0,'M',0,'a',0,'s',0,'t',0,'e',0,'r',
        /* USB_iSerialNum */    18, USB_STRING_DESCRIPTOR_TYPE, '0',0,'0',0,'0',0,'0',0,'0',0,'0',0,'0',0,'1',0
};

/* TODO: Develop prebuild script for generating all complex structures */

#endif//__DESCRIPTORS_H__