/******************************************************************************
*
* Copyright (C) 2006 Vreelin Engineering, Inc.  All Rights Reserved.
* (c) Copyright 2007-2013 Xilinx, Inc. All rights reserved.
*
* This file contains confidential and proprietary information of Xilinx, Inc.
* and is protected under U.S. and international copyright and other
* intellectual property laws.
*
* DISCLAIMER
* This disclaimer is not a license and does not grant any rights to the
* materials distributed herewith. Except as otherwise provided in a valid
* license issued to you by Xilinx, and to the maximum extent permitted by
* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
* and (2) Xilinx shall not be liable (whether in contract or tort, including
* negligence, or under any other theory of liability) for any loss or damage
* of any kind or nature related to, arising under or in connection with these
* materials, including for any direct, or any indirect, special, incidental,
* or consequential loss or damage (including loss of data, profits, goodwill,
* or any type of loss or damage suffered as a result of any action brought by
* a third party) even if such damage or loss was reasonably foreseeable or
* Xilinx had been advised of the possibility of the same.
*
* CRITICAL APPLICATIONS
* Xilinx products are not designed or intended to be fail-safe, or for use in
* any application requiring fail-safe performance, such as life-support or
* safety devices or systems, Class III medical devices, nuclear facilities,
* applications related to the deployment of airbags, or any other applications
* that could lead to death, personal injury, or severe property or
* environmental damage (individually and collectively, "Critical
* Applications"). Customer assumes the sole risk and liability of any use of
* Xilinx products in Critical Applications, subject only to applicable laws
* and regulations governing limitations on product liability.
*
* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
* AT ALL TIMES.
*
*******************************************************************************/
/******************************************************************************/
/**
 * @file xusb_keyboard.h
 *
 * This file contains the constants, type definitions, variables and function
 * prototypes used in the USB keyboard example.
 *
 * @note	None.
 *
 * <pre>
 * MODIFICATION HISTORY:
 *
 * Ver   Who  Date     Changes
 * ----- ---- ------------------------------------------------------------------
 * 1.00a hvm  5/31/07 First release
 * 3.02a hvm  08/16/10 Updated with the little endian support changes.
 * 4.00a hvm  08/11/11 Updated the Message[] variable data to
 *			handle the address alignment issue.
 * 4.02a bss  11/01/11 Number of endpoints changed from 0x00 to 0x01 in
 *			FsUsbConfig to support Full Speed (CR 627573).
 *
 * </pre>
 *****************************************************************************/

#ifndef  XUSB_KEYBOARD_H
#define  XUSB_KEYBOARD_H

#ifdef __cplusplus
extern "C" {
#endif

/***************************** Include Files **********************************/

#include "xusb_cp9.h"

/************************** Constant Definitions ******************************/

/************************** Variable Definitions ******************************/

/*
 * Flags used to abort read and write command loops.
 */
extern u16 MaxControlSize;

USB_STD_DEV_DESC DeviceDescriptor __attribute__ ((aligned(4))) = {
	sizeof(USB_STD_DEV_DESC),	/* Descriptor Size 18 bytes */
		DEVICE_DESCR,	/* This is a device descriptor */
#ifdef __LITTLE_ENDIAN__
		0x0200,		/* USB version */
#else
		0x02,		/* USB version */
#endif
		0,		/* Vendor Specific */
		00,		/* Unused */
		00,		/* Unused */
		0x40,		/* Ep0 Max Pkt Size 64 bytes */


#ifdef __LITTLE_ENDIAN__
		0x03FD,		/* Vendor Id */
		0x0200,		/* Product Id */
		0x0100,		/* BCD device */
#else
		0xFD03,		/* Vendor Id */
		0x0002,		/* Product Id */
		0x01,		/* BCD device */
#endif
		01,		/* String Index of manufacturer */
		02,		/* String Index of product */
		03,		/* String Index of serial number */
		01		/* Number of configurations */
};

USB_STD_QUAL_DESC QualifierDescriptor __attribute__ ((aligned(4))) = {
sizeof(USB_STD_QUAL_DESC),
		QUALIFIER_DESCR, 00, 02, 0, 00, 00, 0x40, 01, 0};

FPGA1_CONFIGURATION __attribute__ ((aligned(4))) HsUsbConfig = {

	{
		/*
		 * Configuration descriptor.
		 */
		sizeof(USB_STD_CFG_DESC),/* Size of config descriptor 9
						bytes */
			CONFIG_DESCR,	/* This is a conifig descriptor */
			sizeof(HsUsbConfig),	/* Total size of configuration
			LS */
			0x00,	/* Total size of configuration MS */
			0x01,	/* No. Of interfaces 1 */
			CONFIGURATION_ONE,	/* No of configuration values */
			0x00,	/* Configuration string */
			0xC0,	/* Self Powered */
			0x01	/* Uses 2mA from the USB bus */
	}
	,
	{
		/*
		 * FPGA1 Class interface.
		 */
		sizeof(USB_STD_IF_DESC),	/* Interface Descriptor size 9
							bytes */
			INTERFACE_DESCR,	/* This is an interface
						descriptor */
			0x00,			/* Interface number 0 */
			0x00,			/* Alternate set 0 */
			0x01,			/* Number of end points 1 */
			USB_CLASS_HID,		/* Vendor specific */
			0x00,			/* Interface sub class */
			0x00,			/* Interface protocol  */
			0x00			/* Interface unused */
	},
	{
		/*
		 * HID Descriptor
		 */
		sizeof(USB_STD_HID_DESC),	/* bLength */
			0x21,			/* bDescriptorType = HID */
			0x10,			/* bcdHID L */
			0x01,			/* bcdHID H Rev 1.1 */
			0x00,			/* bCountryCode (none) */
			0x01,			/* bNumDescriptors
						(one report descriptor) */
			0x22,			/* bDescriptorType (report)*/
			0x2b,			/* wDescriptorLength
						(L/H) (report descriptor size
						is 43 bytes) */
			0x00
	},
	{
		/*
		 * End_point 1 RX descriptor  from device to host.
		 */
		sizeof(USB_STD_EP_DESC),	/* End point descriptor size */
			ENDPOINT_DESCR,	/* This is an end point descriptor */
			0x81,		/* End point one */
			EP_INTERRUPT,	/* End point type */
			0x40,	/* Maximum packet  size 64 bytes LS */
			0x00,	/* Maximum packetsize MS */
			0x10	/* Nak rate */
	}

};

FPGA1_CONFIGURATION __attribute__ ((aligned(4))) FsUsbConfig = {

	{
		/*
		 * Configuration descriptor.
		 */
		sizeof(USB_STD_CFG_DESC),	/* Size of config descriptor 9
		bytes */
			CONFIG_DESCR,	/* This is a conifig descriptor */
			sizeof(FsUsbConfig),	/* Total size of configuration
			LS */
			0x00,	/* Total size of configuration MS */
			0x01,	/* No. Of interfaces 1 */
			CONFIGURATION_ONE,	/* No of configuration values */
			0x00,	/* Configuration string */
			0xC0,	/* Self Powered */
			0x01	/* Uses 2mA from the USB bus */
	},
	{
		/*
		 * FPGA1 Class interface.
		 */
		sizeof(USB_STD_IF_DESC),	/* Interface Descriptor size 9
							bytes */
			INTERFACE_DESCR,	/* This is an interface
						descriptor */
			0x00,			/* Interface number 0 */
			0x00,			/* Alternate set 0 */
			0x01,			/* Number of end points 1 */
			USB_CLASS_HID,		/* Vendor specific */
			0x00,			/* Interface sub class */
			0x00,			/* Interface protocol  */
			0x00			/* Interface unused */
	},
	{
		/*
		 * HID Descriptor
		 */
		sizeof(USB_STD_HID_DESC),	/* bLength */
			0x21,			/* bDescriptorType = HID */
			0x10,			/* bcdHID L */
			0x01,			/* bcdHID H Rev 1.1 */
			0x00,			/* bCountryCode (none) */
			0x01,			/* bNumDescriptors
						(one report descriptor) */
			0x22,			/* bDescriptorType (report)*/
			0x2b,			/* wDescriptorLength
						(L/H) (report descriptor size
						is 43 bytes) */
			0x00
	},
	{
		/*
		 * End_point  1 descriptor  from device to host.
		 */
		sizeof(USB_STD_EP_DESC),	/* End point descriptor size */
			ENDPOINT_DESCR,	/* This is an end point descriptor */
			0x81,		/* End point one */
			EP_INTERRUPT,	/* End point type */
			0x40,	/* Maximum packet  size 64 bytes LS */
			0x00,	/* Maximum packetsize MS */
			0x10	/* Nak rate */
	}

};



USB_STD_STRING_DESC LangId __attribute__ ((aligned(4))) = {
	/*
	 * Language ID codes.
	 */
	4, STRING_DESCR, {
	0x0904}
};

USB_STD_STRING_MAN_DESC Manufacturer __attribute__ ((aligned(4))) = {
	/*
	 * Manufacturer String.
	 */
	sizeof(USB_STD_STRING_MAN_DESC), STRING_DESCR, {
	'X', 0, 'I', 0, 'L', 0, 'I', 0, 'N', 0, 'X', 0, ' ', 0}
};

USB_STD_STRING_PS_DESC ProductString __attribute__ ((aligned(4))) = {
	/*
	 * Product ID String.
	 */
	sizeof(USB_STD_STRING_PS_DESC), STRING_DESCR, {
	'F', 0, 'P', 0, 'G', 0, 'A', 0, '2', 0}
};

USB_STD_STRING_SN_DESC SerialNumber __attribute__ ((aligned(4))) = {
	/*
	 * Product ID String.
	 */
	sizeof(USB_STD_STRING_SN_DESC), STRING_DESCR, {
	'0', 0, '0', 0, '0', 0, '0', 0, '0', 0, '0', 0, '0', 0, '1', 0,
			'7', 0, '1', 0, '5', 0, '0', 0, '4', 0, '2', 0,
			'6', 0, '2', 0, '0', 0, '0', 0, '5', 0, '7', 0, '6', 0}
};

USB_STD_HID_DESC HidDescriptor __attribute__ ((aligned(4))) = {
		sizeof(USB_STD_HID_DESC),	/* bLength */
			0x21,			/* bDescriptorType = HID */
			0x10,			/* bcdHID L */
			0x01,			/* bcdHID H Rev 1.1 */
			0x00,			/* bCountryCode (none) */
			0x01,			/* bNumDescriptors
						(one report descriptor) */
			0x22,			/* bDescriptorType (report)*/
			0x2b,			/* wDescriptorLength
						(L/H) (report descriptor size
						is 43 bytes) */
			0x00
};

/*Xilinx specific message*/
unsigned char Message[] __attribute__ ((aligned(4)))= {
	0x00,0x00,0x28,0x00,		// (cr)
	0x02,0x00,0x1B,0x00,		// X
	0x02,0x00,0x0C,0x00,		// I
	0x02,0x00,0x0F,0x00,		// L
	0x02,0x00,0x0C,0x00,		// I
	0x02,0x00,0x11,0x00,		// N
	0x02,0x00,0x1B,0x00,		// X
	0x00,0x00,0x2C,0x00,		// (sp)
	0x02,0x00,0x18,0x00,		// U
	0x02,0x00,0x16,0x00,		// S
	0x02,0x00,0x05,0x00,		// B
	0x00,0x00,0x2C,0x00,		// (sp)
	0x02,0x00,0x0E,0x00,		// K
	0x02,0x00,0x08,0x00,		// E
	0x02,0x00,0x1C,0x00,		// Y
	0x02,0x00,0x05,0x00,		// B
	0x02,0x00,0x12,0x00,		// O
	0x02,0x00,0x04,0x00,		// A
	0x02,0x00,0x15,0x00,		// R
	0x02,0x00,0x07,0x00,		// D
	0x00,0x00,0x2C,0x00,		// (sp)
	0x02,0x00,0x07,0x00,		// D
	0x02,0x00,0x08,0x00,		// E
	0x02,0x00,0x10,0x00,		// M
	0x02,0x00,0x12,0x00,		// O
	0x00,0x00,0x28,0x00};	//(cr)


/************************** Function Prototypes *******************************/

void InitUsbInterface(XUsb * InstancePtr);
void UsbIfIntrHandler(void *CallBackRef, u32 IntrStatus);
void Ep0IntrHandler(void *CallBackRef, u8 EpNum, u32 IntrStatus);
void Ep1IntrHandler(void *CallBackRef, u8 EpNum, u32 IntrStatus);

#ifdef __cplusplus
}
#endif

#endif /* XUSB_KEYBOARD_H */