/*****************************************************************************
 * Copyright (c) 2019, Nsing Technologies Pte. Ltd.
 *
 * All rights reserved.
 * ****************************************************************************
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * - Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the disclaimer below.
 *
 * Nations' name may not be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY NATIONS "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
 * DISCLAIMED. IN NO EVENT SHALL NATIONS 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.
 * ****************************************************************************/

/**
 * @file usb_desc.c
 * @author Nations
 * @version v1.0.0
 *
 * @copyright Copyright (c) 2019, Nsing Technologies Pte. Ltd. All rights reserved.
 */
/* Includes ------------------------------------------------------------------*/
#include "usb_lib.h"
#include "usb_desc.h"

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private constants----------------------------------------------------------*/
/* USB Standard Device Descriptor */
const uint8_t Audio_DeviceDescriptor[] =
    {
        AUDIO_SIZ_DEVICE_DESC,      /* bLength */
        USB_DEVICE_DESCRIPTOR_TYPE, /* bDescriptorType */
        0x00, /* 2.00 */            /* bcdUSB */
        0x02,
        0x00, /* bDeviceClass */
        0x00, /* bDeviceSubClass */
        0x00, /* bDeviceProtocol */
        0x40, /* bMaxPacketSize 40 */
        0xF5, /*idVendor (0x19F5)*/
        0x19,
        0x30, /* idProduct  = 0x6030*/
        0x60,
        0x00, /* 2.00 */ /* bcdDevice */
        0x02,
        1,   /* iManufacturer */
        2,   /* iProduct */
        3,   /* iSerialNumber */
        0x01 /* bNumConfigurations */
};

/* USB Configuration Descriptor */
/*   All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */
const uint8_t Audio_ConfigDescriptor[] =
    {
        /* Configuration 1 */
        0x09,                              /* bLength */
        USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType */
        AUDIO_SIZ_CONFIG_DESC,             /* wTotalLength  109 bytes*/
        0x00,
        0x02, /* bNumInterfaces */
        0x01, /* bConfigurationValue */
        0x00, /* iConfiguration */
        0xC0, /* bmAttributes Self Powred*/
        0x32, /* bMaxPower = 100 mA*/
        /* 09 byte*/

        /* USB Audio Standard interface descriptor */
        AUDIO_SIZ_INTERFACE_DESC_SIZE, /* bLength */
        USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
        0x00,                          /* bInterfaceNumber */
        0x00,                          /* bAlternateSetting */
        0x00,                          /* bNumEndpoints */
        USB_DEVICE_CLASS_AUDIO,        /* bInterfaceClass */
        AUDIO_SUBCLASS_AUDIOCONTROL,   /* bInterfaceSubClass */
        AUDIO_PROTOCOL_UNDEFINED,      /* bInterfaceProtocol */
        0x00,                          /* iInterface */
        /* 18 byte */

        /* USB Audio Class-specific AC Interface Descriptor */
        AUDIO_SIZ_INTERFACE_DESC_SIZE,   /* bLength */
        AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
        AUDIO_CONTROL_HEADER,            /* bDescriptorSubtype */
        0x00, /* 1.00 */                 /* bcdADC */
        0x01,
        0x27, /* wTotalLength = 39*/
        0x00,
        0x01, /* bInCollection */
        0x01, /* baInterfaceNr */
        /* 27 byte */

        /* USB Audio Input Terminal Descriptor */
        AUDIO_INPUT_TERMINAL_DESC_SIZE,  /* bLength */
        AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
        AUDIO_CONTROL_INPUT_TERMINAL,    /* bDescriptorSubtype */
        0x01,                            /* bTerminalID */
        0x01,                            /* wTerminalType AUDIO_TERMINAL_USB_STREAMING   0x0201 */
        0x02,
        0x00, /* bAssocTerminal */
        0x01, /* bNrChannels */
        0x00, /* wChannelConfig 0x0000  Mono */
        0x00,
        0x00, /* iChannelNames */
        0x00, /* iTerminal */
        /* 39 byte*/

        /* USB Audio Feature Unit Descriptor */
        0x09,                            /* bLength */
        AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
        AUDIO_CONTROL_FEATURE_UNIT,      /* bDescriptorSubtype */
        0x02,                            /* bUnitID */
        0x01,                            /* bSourceID */
        0x01,                            /* bControlSize */
        AUDIO_CONTROL_MUTE,              /* bmaControls(0) */
        0x00,                            /* bmaControls(1) */
        0x00,                            /* iTerminal */
        /* 48 byte*/

        /*USB Audio Output Terminal Descriptor */
        0x09,                            /* bLength */
        AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
        AUDIO_CONTROL_OUTPUT_TERMINAL,   /* bDescriptorSubtype */
        0x03,                            /* bTerminalID */
        0x01,                            /* wTerminalType  0x0101*/
        0x01,
        0x00, /* bAssocTerminal */
        0x02, /* bSourceID */
        0x00, /* iTerminal */
        /* 57 byte*/

        /* USB Audio Standard AS Interface Descriptor - Audio Streaming Zero Bandwith */
        /* Interface 1, Alternate Setting 0                                             */
        AUDIO_SIZ_INTERFACE_DESC_SIZE, /* bLength */
        USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
        0x01,                          /* bInterfaceNumber */
        0x00,                          /* bAlternateSetting */
        0x00,                          /* bNumEndpoints */
        USB_DEVICE_CLASS_AUDIO,        /* bInterfaceClass */
        AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */
        AUDIO_PROTOCOL_UNDEFINED,      /* bInterfaceProtocol */
        0x00,                          /* iInterface */
        /* 66 byte*/

        /* USB Audio Standard AS Interface Descriptor - Audio Streaming Operational */
        /* Interface 1, Alternate Setting 1                                           */
        AUDIO_SIZ_INTERFACE_DESC_SIZE, /* bLength */
        USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
        0x01,                          /* bInterfaceNumber */
        0x01,                          /* bAlternateSetting */
        0x01,                          /* bNumEndpoints */
        USB_DEVICE_CLASS_AUDIO,        /* bInterfaceClass */
        AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */
        AUDIO_PROTOCOL_UNDEFINED,      /* bInterfaceProtocol */
        0x00,                          /* iInterface */
        /* 75 byte*/

        /* USB Audio Streaming Interface Descriptor */
        AUDIO_STREAMING_INTERFACE_DESC_SIZE, /* bLength */
        AUDIO_INTERFACE_DESCRIPTOR_TYPE,     /* bDescriptorType */
        AUDIO_STREAMING_GENERAL,             /* bDescriptorSubtype */
        0x03, /* bTerminalLink */            // TerminalLink 0x03 connect out ID
        0x01,                                /* bDelay */
        0x01,                                /* wFormatTag AUDIO_FORMAT_PCM  0x0001 */
        0x00,
        /* 82 byte*/

        /* USB Audio Type I Format Interface Descriptor */
        0x0B,                            /* bLength */
        AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
        AUDIO_STREAMING_FORMAT_TYPE,     /* bDescriptorSubtype */
        AUDIO_FORMAT_TYPE_I,             /* bFormatType */
        0x01,                            /* bNrChannels */
        0x02,                            /* bSubFrameSize */
        16,                              /* bBitResolution 16bit*/
        0x01,                            /* bSamFreqType */
        0x80,                            /* tSamFreq 16000 = 0x3E80 */
        0x3E,
        0x00,
        /* 93 byte*/

        /* Endpoint 1 - Standard Descriptor */
        AUDIO_STANDARD_ENDPOINT_DESC_SIZE, /* bLength */
        USB_ENDPOINT_DESCRIPTOR_TYPE,      /* bDescriptorType */
        0x81,                              /* bEndpointAddress 1 in endpoint*/
        USB_ENDPOINT_TYPE_ISOCHRONOUS,     /* bmAttributes */
        0x20,                              /* wMaxPacketSize 16 bytes*/
        0x00,
        0x01, /* bInterval */
        0x00, /* bRefresh */
        0x00, /* bSynchAddress */
        /* 102 byte*/

        /* Endpoint - Audio Streaming Descriptor*/
        AUDIO_STREAMING_ENDPOINT_DESC_SIZE, /* bLength */
        AUDIO_ENDPOINT_DESCRIPTOR_TYPE,     /* bDescriptorType */
        AUDIO_ENDPOINT_GENERAL,             /* bDescriptor */
        0x00,                               /* bmAttributes */
        0x00,                               /* bLockDelayUnits */
        0x00,                               /* wLockDelay */
        0x00,
        /* 109 byte*/
};

/* USB String Descriptor (optional) */
const uint8_t Audio_StringLangID[AUDIO_SIZ_STRING_LANGID] =
    {
        0x04,
        0x03,
        0x09,
        0x04}; /* LangID = 0x0409: U.S. English */

const uint8_t Audio_StringVendor[AUDIO_SIZ_STRING_VENDOR] =
    {
        AUDIO_SIZ_STRING_VENDOR,    /* Size of manufacturer string */
        USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType*/
        /* Manufacturer: "NATIONS" */
        'N', 0, 'A', 0, 'T', 0, 'I', 0, 'O', 0, 'N', 0, 'S', 0};

const uint8_t Audio_StringProduct[AUDIO_SIZ_STRING_PRODUCT] =
    {
        AUDIO_SIZ_STRING_PRODUCT,   /* bLength */
        USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */
        'N', 0, '3', 0, '2', 0, 'G', 0, '4', 0, '5', 0, 'x', 0, ' ', 0,
        'M', 0, 'i', 0, 'c', 0};

uint8_t Audio_StringSerial[AUDIO_SIZ_STRING_SERIAL] =
    {
        AUDIO_SIZ_STRING_SERIAL,    /* bLength */
        USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */
        'N', 0, '3', 0, '2', 0, 'G', 0, '4', 0, '5', 0, 'x', 0};
/* Extern variables ----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Extern function prototypes ------------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
