/******************************************************************************
* @file descriptors.c
* @version V1.00
* $Revision: 6 $
* $Date: 18/04/13 3:44p $
* @brief M031 series USBD driver source file
*
* @note
* Copyright (C) 2018 Nuvoton Technology Corp. All rights reserved.
*****************************************************************************/
/*!<Includes */
#include "NuMicro.h"
#include "micro_printer_and_hid_transfer.h"
/*----------------------------------------------------------------------------*/
/*!<USB Device Descriptor */
uint8_t gu8DeviceDescriptor[] =
{
LEN_DEVICE, /* bLength */
DESC_DEVICE, /* bDescriptorType */
0x10, 0x01, /* bcdUSB */
0x00, /* bDeviceClass */
0x00, /* bDeviceSubClass */
0x00, /* bDeviceProtocol */
EP0_MAX_PKT_SIZE, /* bMaxPacketSize0 */
/* idVendor */
USBD_VID & 0x00FF,
((USBD_VID & 0xFF00) >> 8),
/* idProduct */
USBD_PID & 0x00FF,
((USBD_PID & 0xFF00) >> 8),
0x00, 0x03, /* bcdDevice */
0x01, /* iManufacture */
0x02, /* iProduct */
0x00, /* iSerialNumber - no serial */
0x01 /* bNumConfigurations */
};
/*!<USB HID Report Descriptor */
uint8_t HID_DeviceReportDescriptor[] =
{
0x06, 0x00, 0xFF, // Usage Page = 0xFF00 (Vendor Defined Page 1)
0x09, 0x01, // Usage (Vendor Usage 1)
0xA1, 0x01, // Collection (Application)
0x19, 0x01, // Usage Minimum
0x29, 0x40, // Usage Maximum //64 input usages total (0x01 to 0x40)
0x15, 0x00, // Logical Minimum (data bytes in the report may have minimum value = 0x00)
0x26, 0xFF, 0x00, // Logical Maximum (data bytes in the report may have maximum value = 0x00FF = unsigned 255)
0x75, 0x08, // Report Size: 8-bit field size
0x95, 0x40, // Report Count: Make sixty-four 8-bit fields (the next time the parser hits
// an "Input", "Output", or "Feature" item)
0x81, 0x00, // Input (Data, Array, Abs): Instantiates input packet fields based on the
// above report size, count, logical min/max, and usage.
0x19, 0x01, // Usage Minimum
0x29, 0x40, // Usage Maximum //64 output usages total (0x01 to 0x40)
0x91, 0x00, // Output (Data, Array, Abs): Instantiates output packet fields. Uses same
// report size and count as "Input" fields, since nothing new/different was
// specified to the parser since the "Input" item.
0xC0 // End Collection
};
/*!<USB Configure Descriptor */
uint8_t gu8ConfigDescriptor[] =
{
LEN_CONFIG, /* bLength */
DESC_CONFIG, /* bDescriptorType */
0x6E, 0x00, /* wTotalLength */
0x02, /* bNumInterfaces */
0x01, /* bConfigurationValue */
0x00, /* iConfiguration */
0xC0, /* bmAttributes */
0x32, /* MaxPower */
/* INTERFACE descriptor */
LEN_INTERFACE, /* bLength */
DESC_INTERFACE, /* bDescriptorType */
0x00, /* bInterfaceNumber */
0x00, /* bAlternateSetting */
0x01, /* bNumEndpoints */
0x07, /* bInterfaceClass: printer class */
0x01, /* bInterfaceSubClass */
0x01, /* bInterfaceProtocol */
0x00, /* iInterface */
/* ENDPOINT descriptor */
LEN_ENDPOINT, /* bLength */
DESC_ENDPOINT, /* bDescriptorType */
(EP_OUTPUT | BULK_OUT_EP_NUM), /* bEndpointAddress */
EP_BULK, /* bmAttributes */
EP3_MAX_PKT_SIZE, 0x00, /* wMaxPacketSize */
0x00, /* bInterval */
/* INTERFACE descriptor */
LEN_INTERFACE, /* bLength */
DESC_INTERFACE, /* bDescriptorType */
0x00, /* bInterfaceNumber */
0x01, /* bAlternateSetting */
0x02, /* bNumEndpoints */
0x07, /* bInterfaceClass: printer class */
0x01, /* bInterfaceSubClass */
0x02, /* bInterfaceProtocol */
0x00, /* iInterface */
/* ENDPOINT descriptor */
LEN_ENDPOINT, /* bLength */
DESC_ENDPOINT, /* bDescriptorType */
(EP_OUTPUT | BULK_OUT_EP_NUM), /* bEndpointAddress */
EP_BULK, /* bmAttributes */
EP3_MAX_PKT_SIZE, 0x00, /* wMaxPacketSize */
0x00, /* bInterval */
/* ENDPOINT descriptor */
LEN_ENDPOINT, /* bLength */
DESC_ENDPOINT, /* bDescriptorType */
(EP_INPUT | BULK_IN_EP_NUM), /* bEndpointAddress */
EP_BULK, /* bmAttributes */
EP2_MAX_PKT_SIZE, 0x00, /* wMaxPacketSize */
0x00, /* bInterval */
/* INTERFACE descriptor */
LEN_INTERFACE, /* bLength */
DESC_INTERFACE, /* bDescriptorType */
0x00, /* bInterfaceNumber */
0x02, /* bAlternateSetting */
0x03, /* bNumEndpoints */
0xFF, /* bInterfaceClass */
0x00, /* bInterfaceSubClass */
0xFF, /* bInterfaceProtocol */
0x00, /* iInterface */
/* ENDPOINT descriptor */
LEN_ENDPOINT, /* bLength */
DESC_ENDPOINT, /* bDescriptorType */
(EP_OUTPUT | BULK_OUT_EP_NUM), /* bEndpointAddress */
EP_BULK, /* bmAttributes */
EP3_MAX_PKT_SIZE, 0x00, /* wMaxPacketSize */
0x00, /* bInterval */
/* ENDPOINT descriptor */
LEN_ENDPOINT, /* bLength */
DESC_ENDPOINT, /* bDescriptorType */
(EP_INPUT | BULK_IN_EP_NUM), /* bEndpointAddress */
EP_BULK, /* bmAttributes */
EP2_MAX_PKT_SIZE, 0x00, /* wMaxPacketSize */
0x00, /* bInterval */
/* ENDPOINT descriptor */
LEN_ENDPOINT, /* bLength */
DESC_ENDPOINT, /* bDescriptorType */
(EP_INPUT | INT_IN_EP_NUM), /* bEndpointAddress */
EP_INT, /* bmAttributes */
EP4_MAX_PKT_SIZE, 0x00, /* wMaxPacketSize */
0x01, /* bInterval */
/* I/F descr: HID Transfer */
LEN_INTERFACE, /* bLength */
DESC_INTERFACE, /* bDescriptorType */
0x01, /* bInterfaceNumber */
0x00, /* bAlternateSetting */
0x02, /* bNumEndpoints */
0x03, /* bInterfaceClass */
0x00, /* bInterfaceSubClass */
0x00, /* bInterfaceProtocol */
0x00, /* iInterface */
/* HID Descriptor */
LEN_HID, /* Size of this descriptor in UINT8s. */
DESC_HID, /* HID descriptor type. */
0x10, 0x01, /* HID Class Spec. release number. */
0x00, /* H/W target country. */
0x01, /* Number of HID class descriptors to follow. */
DESC_HID_RPT, /* Descriptor type. */
/* Total length of report descriptor. */
sizeof(HID_DeviceReportDescriptor) & 0x00FF,
((sizeof(HID_DeviceReportDescriptor) & 0xFF00) >> 8),
/* EP Descriptor: interrupt in. */
LEN_ENDPOINT, /* bLength */
DESC_ENDPOINT, /* bDescriptorType */
(INT_IN_EP_NUM_1 | EP_INPUT), /* bEndpointAddress */
EP_INT, /* bmAttributes */
/* wMaxPacketSize */
EP5_MAX_PKT_SIZE & 0x00FF,
((EP5_MAX_PKT_SIZE & 0xFF00) >> 8),
HID_DEFAULT_INT_IN_INTERVAL, /* bInterval */
/* EP Descriptor: interrupt out. */
LEN_ENDPOINT, /* bLength */
DESC_ENDPOINT, /* bDescriptorType */
(INT_OUT_EP_NUM | EP_OUTPUT), /* bEndpointAddress */
EP_INT, /* bmAttributes */
/* wMaxPacketSize */
EP6_MAX_PKT_SIZE & 0x00FF,
((EP6_MAX_PKT_SIZE & 0xFF00) >> 8),
HID_DEFAULT_INT_IN_INTERVAL, /* bInterval */
};
/*!<USB Language String Descriptor */
uint8_t gu8StringLang[4] =
{
4, /* bLength */
DESC_STRING, /* bDescriptorType */
0x09, 0x04
};
/*!<USB Vendor String Descriptor */
uint8_t gu8VendorStringDesc[] =
{
16,
DESC_STRING,
'N', 0, 'u', 0, 'v', 0, 'o', 0, 't', 0, 'o', 0, 'n', 0
};
/*!<USB Product String Descriptor */
uint8_t gu8ProductStringDesc[] =
{
22, /* bLength */
DESC_STRING, /* bDescriptorType */
'U', 0, 'S', 0, 'B', 0, ' ', 0, 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, 'e', 0
};
/*!<USB BOS Descriptor */
const uint8_t gu8BOSDescriptor[] =
{
LEN_BOS, /* bLength */
DESC_BOS, /* bDescriptorType */
/* wTotalLength */
0x0C & 0x00FF,
((0x0C & 0xFF00) >> 8),
0x01, /* bNumDeviceCaps */
/* Device Capability */
0x7, /* bLength */
DESC_CAPABILITY,/* bDescriptorType */
CAP_USB20_EXT, /* bDevCapabilityType */
0x02, 0x00, 0x00, 0x00 /* bmAttributes */
};
uint8_t *gpu8UsbString[4] =
{
gu8StringLang,
gu8VendorStringDesc,
gu8ProductStringDesc,
0,
};
uint8_t *gu8UsbHidReport[3] =
{
0,
HID_DeviceReportDescriptor,
0,
};
uint32_t gu32UsbHidReportLen[3] =
{
0,
sizeof(HID_DeviceReportDescriptor),
0,
};
uint32_t gu32ConfigHidDescIdx[3] =
{
0,
(sizeof(gu8ConfigDescriptor) - LEN_HID - (2*LEN_ENDPOINT)),
0,
};
const S_USBD_INFO_T gsInfo =
{
(uint8_t *)gu8DeviceDescriptor,
(uint8_t *)gu8ConfigDescriptor,
(uint8_t **)gpu8UsbString,
(uint8_t **)gu8UsbHidReport,
(uint8_t *)gu8BOSDescriptor,
(uint32_t *)gu32UsbHidReportLen,
(uint32_t *)gu32ConfigHidDescIdx
};