#ifndef _USB_DESCRIPTORS_H
#define _USB_DESCRIPTORS_H

#include <usb_ch9.h>
#include <usb_hid.h>
#include <sys/types.h>
#include <openpcd.h>
#include <dfu/dfu.h>

#include "../config.h"

/* The USB descriptor set for emulating a HID device */

const struct usb_device_descriptor dev_descriptor = {
	.bLength = USB_DT_DEVICE_SIZE,
	.bDescriptorType = USB_DT_DEVICE,
	.bcdUSB = 0x0100,
	.bDeviceClass = 0x00,
	.bDeviceSubClass = 0x00,
	.bDeviceProtocol = 0x00,
	.bMaxPacketSize0 = 0x08,
	.idVendor = USB_VENDOR_ID,
	.idProduct = USB_PRODUCT_ID,
	.bcdDevice = 0x0030,	/* Version 0.3 */
#ifdef CONFIG_USB_STRING
	.iManufacturer = 3,
	.iProduct = 4,
	.iSerialNumber = 0,
#else
	.iManufacturer = 0,
	.iProduct = 0,
	.iSerialNumber = 0,
#endif
	.bNumConfigurations = 0x01,
};

struct _desc {
	struct usb_config_descriptor ucfg;
	struct usb_interface_descriptor uif;
	struct usb_hid_descriptor hid;
	struct usb_endpoint_descriptor ep[1];
#ifdef CONFIG_DFU
	struct usb_interface_descriptor uif_dfu[2];
#endif
};

const struct _desc cfg_descriptor = {
	.ucfg = {
		 .bLength = USB_DT_CONFIG_SIZE,
		 .bDescriptorType = USB_DT_CONFIG,
		 .wTotalLength = USB_DT_CONFIG_SIZE +
#ifdef CONFIG_DFU
		 		 3 * USB_DT_INTERFACE_SIZE + 
				 1 * USB_DT_ENDPOINT_SIZE,
		 .bNumInterfaces = 3,
#else
		 		 1 * USB_DT_INTERFACE_SIZE + 
				 1 * USB_DT_ENDPOINT_SIZE,
		 .bNumInterfaces = 1,
#endif
		 .bConfigurationValue = 1,
#ifdef CONFIG_USB_STRING
		 .iConfiguration = 5,
#else
		 .iConfiguration = 0,
#endif
		 .bmAttributes = USB_CONFIG_ATT_ONE,
		 .bMaxPower = 250,	/* 500mA */
		 },
	.uif = {
		.bLength = USB_DT_INTERFACE_SIZE,
		.bDescriptorType = USB_DT_INTERFACE,
		.bInterfaceNumber = 0,
		.bAlternateSetting = 0,
		.bNumEndpoints = 1,
		.bInterfaceClass = USB_CLASS_HID,
		.bInterfaceSubClass = 0,
		.bInterfaceProtocol = 0x01,
#ifdef CONFIG_USB_STRING
		.iInterface = 6,
#else
		.iInterface = 0,
#endif
		},
	.hid = {
		.bLength = 0x09,
		.bDescriptorType = HID_DT_HID,
		.bcdHID = 0x0111,
		.bCountryCode = 0,
		.bNumDescriptors = 1,
		.desc[0] = {
			.bDescriptorType = HID_DT_REPORT,
			.bLength = FIXME,
		},
	},
	.ep = {
		{
			  .bLength = USB_DT_ENDPOINT_SIZE,
			  .bDescriptorType = USB_DT_ENDPOINT,
			  .bEndpointAddress = OPENPCD_IRQ_EP,
			  .bmAttributes = USB_ENDPOINT_XFER_INT,
			  .wMaxPacketSize = AT91C_EP_IN_SIZE,
			  .bInterval = 0x0a,	/* FIXME */
		},
	},

#ifdef CONFIG_DFU
	.uif_dfu = DFU_RT_IF_DESC,
#endif
};

#endif /* _USB_DESCRIPTORS_H */