/******************** (C) COPYRIGHT 2010 STMicroelectronics ********************
* File Name          : usb_desc.c
* Author             : MCD Application Team
* Version            : V3.2.1
* Date               : 07/05/2010
* Description        : Descriptors for Custom HID Demo
********************************************************************************
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*******************************************************************************/

#include "usb_lib.h"
#include "pios_usb.h"
#include "pios_usb_hid.h"
#include "pios_usb_hid_desc.h"

// *************************************************
// USB Standard Device Descriptor

const uint8_t PIOS_HID_DeviceDescriptor[PIOS_HID_SIZ_DEVICE_DESC] =
  {
    0x12,                       // bLength
    USB_DEVICE_DESCRIPTOR_TYPE, // bDescriptorType
    0x00,                       // bcdUSB
    0x02,
    0x00,                       // bDeviceClass
    0x00,                       // bDeviceSubClass
    0x00,                       // bDeviceProtocol
    0x40,                       // bMaxPacketSize40
    (uint8_t)((PIOS_USB_VENDOR_ID) & 0xff),   // idVendor
    (uint8_t)((PIOS_USB_VENDOR_ID) >> 8),
    (uint8_t)((PIOS_USB_PRODUCT_ID) & 0xff),  // idProduct
    (uint8_t)((PIOS_USB_PRODUCT_ID) >> 8),
    (uint8_t)((PIOS_USB_VERSION_ID) & 0xff),  // bcdDevice
    (uint8_t)((PIOS_USB_VERSION_ID) >> 8),
    0x01,                        // Index of string descriptor describing manufacturer
    0x02,                        // Index of string descriptor describing product
    0x03,                        // Index of string descriptor describing the device serial number
    0x01                         // bNumConfigurations
  };

// *************************************************
// USB Configuration Descriptor
//   All Descriptors (Configuration, Interface, Endpoint, Class, Vendor

const uint8_t PIOS_HID_ConfigDescriptor[PIOS_HID_SIZ_CONFIG_DESC] =
  {
    0x09,         // bLength: Configuation Descriptor size
    USB_CONFIGURATION_DESCRIPTOR_TYPE, // bDescriptorType: Configuration
    PIOS_HID_SIZ_CONFIG_DESC,
    // wTotalLength: Bytes returned
    0x00,
    0x01,         // bNumInterfaces: 1 interface
    0x01,         // bConfigurationValue: Configuration value
    0x00,         // iConfiguration: Index of string descriptor describing the configuration
    0xC0,         // bmAttributes: Bus powered
    0x7D,         // MaxPower 250 mA - needed to power the RF transmitter

    // ************** Descriptor of Custom HID interface ****************
    // 09
    0x09,         // bLength: Interface Descriptor size
    USB_INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType: Interface descriptor type
    0x00,         // bInterfaceNumber: Number of Interface
    0x00,         // bAlternateSetting: Alternate setting
    0x02,         // bNumEndpoints
    0x03,         // bInterfaceClass: HID
    0x00,         // bInterfaceSubClass : 1=BOOT, 0=no boot
    0x00,         // nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse
    0,            // iInterface: Index of string descriptor

    // ******************** Descriptor of Custom HID HID ********************
    // 18
    0x09,         // bLength: HID Descriptor size
    HID_DESCRIPTOR_TYPE, // bDescriptorType: HID
    0x10,         // bcdHID: HID Class Spec release number
    0x01,
    0x00,         // bCountryCode: Hardware target country
    0x01,         // bNumDescriptors: Number of HID class descriptors to follow
    0x22,         // bDescriptorType
    PIOS_HID_SIZ_REPORT_DESC, // wItemLength: Total length of Report descriptor
    0x00,

    // ******************** Descriptor of Custom HID endpoints ******************
    // 27
    0x07,          // bLength: Endpoint Descriptor size
    USB_ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType:

    0x81,          // bEndpointAddress: Endpoint Address (IN)
    0x03,          // bmAttributes: Interrupt endpoint
    0x40,          // wMaxPacketSize: 2 Bytes max
    0x00,
    0x04,          // bInterval: Polling Interval in ms
    // 34
    	
    0x07,	// bLength: Endpoint Descriptor size
    USB_ENDPOINT_DESCRIPTOR_TYPE,	// bDescriptorType:
			// Endpoint descriptor type
    0x01,	// bEndpointAddress:
			//	Endpoint Address (OUT)
    0x03,	// bmAttributes: Interrupt endpoint
    0x40,	// wMaxPacketSize: 2 Bytes max
    0x00,
    0x04,	// bInterval: Polling Interval in ms
    // 41
  };

// *************************************************

 const uint8_t PIOS_HID_ReportDescriptor[PIOS_HID_SIZ_REPORT_DESC] =
  {                    
    0x06, 0x9c, 0xff,      // USAGE_PAGE (Vendor Page: 0xFF00)
    0x09, 0x01,            // USAGE (Demo Kit)
    0xa1, 0x01,            // COLLECTION (Application)
    // 6
    
    // Data 1
    0x85, 0x01,            //     REPORT_ID (1)
    0x09, 0x02,            //     USAGE (LED 1)
    0x15, 0x00,            //     LOGICAL_MINIMUM (0)
    0x25, 0xff,            //     LOGICAL_MAXIMUM (255)
    0x75, 0x08,            //     REPORT_SIZE (8)
    0x95, PIOS_USB_HID_DATA_LENGTH+1,            //     REPORT_COUNT (1)
    0x81, 0x83,            //     INPUT (Const,Var,Array)
    // 20
	  
    // Data 1
    0x85, 0x02,            //     REPORT_ID (2)
    0x09, 0x03,            //     USAGE (LED 1)
    0x15, 0x00,            //     LOGICAL_MINIMUM (0)
    0x25, 0xff,            //     LOGICAL_MAXIMUM (255)
    0x75, 0x08,            //     REPORT_SIZE (8)
    0x95, PIOS_USB_HID_DATA_LENGTH+1,            //     REPORT_COUNT (1)
    0x91, 0x82,            //     OUTPUT (Data,Var,Abs,Vol)
    // 34
	  
    0xc0 	          //     END_COLLECTION
  };

// *************************************************
// USB String Descriptors (optional)

const uint8_t PIOS_HID_StringLangID[PIOS_HID_SIZ_STRING_LANGID] =
  {
    PIOS_HID_SIZ_STRING_LANGID,
    USB_STRING_DESCRIPTOR_TYPE,
    0x09, 0x08			// LangID = 0x0809: UK. English
//    0x09, 0x04			// LangID = 0x0409: U.S. English
  };

const uint8_t PIOS_HID_StringVendor[PIOS_HID_SIZ_STRING_VENDOR] =
  {
    PIOS_HID_SIZ_STRING_VENDOR, // Size of Vendor string
    USB_STRING_DESCRIPTOR_TYPE,  // bDescriptorType
    // Manufacturer: "STMicroelectronics"
    'o', 0,
    'p', 0,
    'e', 0,
    'n', 0,
    'p', 0,
    'i', 0,
    'l', 0,
    'o', 0,
    't', 0,
    '.', 0,
    'o', 0,
    'r', 0,
    'g', 0
  };

const uint8_t PIOS_HID_StringProduct[PIOS_HID_SIZ_STRING_PRODUCT] =
  {
    PIOS_HID_SIZ_STRING_PRODUCT,       // bLength
    USB_STRING_DESCRIPTOR_TYPE,        // bDescriptorType
    'P', 0,
    'i', 0,
    'p', 0,
    'X', 0,
    't', 0,
    'r', 0,
    'e', 0,
    'm', 0,
    'e', 0
  };

uint8_t PIOS_HID_StringSerial[PIOS_HID_SIZ_STRING_SERIAL] =
  {
    PIOS_HID_SIZ_STRING_SERIAL,        // bLength
    USB_STRING_DESCRIPTOR_TYPE,        // bDescriptorType
    0, 0,
    0, 0,
    0, 0,
    0, 0,
    0, 0,
    0, 0,
    0, 0,
    0, 0,
    0, 0,
    0, 0,
    0, 0,
    0, 0,
    0, 0,
    0, 0,
    0, 0,
    0, 0,
    0, 0,
    0, 0,
    0, 0,
    0, 0,
    0, 0,
    0, 0,
    0, 0,
    0, 0,
    0, 0
  };

// *************************************************