text: /**************************************************************************//**
   * @file     descriptors.c
   * @version  V3.00
   * @brief    HSUSBD descriptor.
   *
   * @copyright SPDX-License-Identifier: Apache-2.0
   * @copyright Copyright (C) 2021 Nuvoton Technology Corp. All rights reserved.
   ******************************************************************************/
  /*!<Includes */
  #include "NuMicro.h"
  #include "hid_mousekeyboard.h"
  
  /*!<USB HID Report Descriptor */
  uint8_t HID_MouseReportDescriptor[] =
  {
      0x05, 0x01,     /* Usage Page(Generic Desktop Controls) */
      0x09, 0x02,     /* Usage(Mouse) */
      0xA1, 0x01,     /* Collection(Application) */
      0x09, 0x01,         /* Usage(Pointer) */
      0xA1, 0x00,         /* Collection(Physical) */
      0x05, 0x09,             /* Usage Page(Button) */
      0x19, 0x01,             /* Usage Minimum(0x1) */
      0x29, 0x03,             /* Usage Maximum(0x3) */
      0x15, 0x00,             /* Logical Minimum(0x0) */
      0x25, 0x01,             /* Logical Maximum(0x1) */
      0x75, 0x01,             /* Report Size(0x1) */
      0x95, 0x03,             /* Report Count(0x3) */
      0x81, 0x02,             /* Input(3 button bit) */
      0x75, 0x05,             /* Report Size(0x5) */
      0x95, 0x01,             /* Report Count(0x1) */
      0x81, 0x01,             /* Input(5 bit padding) */
      0x05, 0x01,             /* Usage Page(Generic Desktop Controls) */
      0x09, 0x30,             /* Usage(X) */
      0x09, 0x31,             /* Usage(Y) */
      0x09, 0x38,             /* Usage(Wheel) */
      0x15, 0x81,             /* Logical Minimum(0x81)(-127) */
      0x25, 0x7F,             /* Logical Maximum(0x7F)(127) */
      0x75, 0x08,             /* Report Size(0x8) */
      0x95, 0x03,             /* Report Count(0x3) */
      0x81, 0x06,             /* Input(1 byte wheel) */
      0xC0,               /* End Collection */
      0xC0            /* End Collection */
  };
  
  uint8_t HID_KeyboardReportDescriptor[] =
  {
      0x05, 0x01,     /* Usage Page(Generic Desktop Controls) */
      0x09, 0x06,     /* Usage(Keyboard) */
      0xA1, 0x01,     /* Collection(Application) */
      0x05, 0x07,         /* Usage Page(Keyboard/Keypad) */
      0x19, 0xE0,         /* Usage Minimum(0xE0) */
      0x29, 0xE7,         /* Usage Maximum(0xE7) */
      0x15, 0x00,         /* Logical Minimum(0x0) */
      0x25, 0x01,         /* Logical Maximum(0x1) */
      0x75, 0x01,         /* Report Size(0x1) */
      0x95, 0x08,         /* Report Count(0x8) */
      0x81, 0x02,         /* Input (Data) => Modifier byte */
      0x95, 0x01,         /* Report Count(0x1) */
      0x75, 0x08,         /* Report Size(0x8) */
      0x81, 0x01,         /* Input (Constant) => Reserved byte */
      0x95, 0x05,         /* Report Count(0x5) */
      0x75, 0x01,         /* Report Size(0x1) */
      0x05, 0x08,         /* Usage Page(LEDs) */
      0x19, 0x01,         /* Usage Minimum(0x1) */
      0x29, 0x05,         /* Usage Maximum(0x5) */
      0x91, 0x02,         /* Output (Data) => LED report */
      0x95, 0x01,         /* Report Count(0x1) */
      0x75, 0x03,         /* Report Size(0x3) */
      0x91, 0x01,         /* Output (Constant) => LED report padding */
      0x95, 0x06,         /* Report Count(0x6) */
      0x75, 0x08,         /* Report Size(0x8) */
      0x15, 0x00,         /* Logical Minimum(0x0) */
      0x25, 0x65,         /* Logical Maximum(0x65) */
      0x05, 0x07,         /* Usage Page(Keyboard/Keypad) */
      0x19, 0x00,         /* Usage Minimum(0x0) */
      0x29, 0x65,         /* Usage Maximum(0x65) */
      0x81, 0x00,         /* Input (Data) */
      0xC0            /* End Collection */
  };
  
  /*----------------------------------------------------------------------------*/
  /*!<USB Device Descriptor */
  uint8_t gu8DeviceDescriptor[] =
  {
      LEN_DEVICE,     /* bLength */
      DESC_DEVICE,    /* bDescriptorType */
      0x00, 0x02,     /* bcdUSB */
      0x00,           /* bDeviceClass */
      0x00,           /* bDeviceSubClass */
      0x00,           /* bDeviceProtocol */
      CEP_MAX_PKT_SIZE,   /* bMaxPacketSize0 */
      /* idVendor */
      USBD_VID & 0x00FF,
      ((USBD_VID & 0xFF00) >> 8),
      /* idProduct */
      USBD_PID & 0x00FF,
      ((USBD_PID & 0xFF00) >> 8),
      0x00, 0x00,     /* bcdDevice */
      0x01,           /* iManufacture */
      0x02,           /* iProduct */
      0x00,           /* iSerialNumber - no serial */
      0x01            /* bNumConfigurations */
  };
  
  /*!<USB Qualifier Descriptor */
  uint8_t gu8QualifierDescriptor[] =
  {
      LEN_QUALIFIER,  /* bLength */
      DESC_QUALIFIER, /* bDescriptorType */
      0x10, 0x02,     /* bcdUSB */
      0x00,           /* bDeviceClass */
      0x00,           /* bDeviceSubClass */
      0x00,           /* bDeviceProtocol */
      CEP_OTHER_MAX_PKT_SIZE, /* bMaxPacketSize0 */
      0x01,           /* bNumConfigurations */
      0x00
  };
  
  /*!<USB Configure Descriptor */
  uint8_t gu8ConfigDescriptor[] =
  {
      LEN_CONFIG,     /* bLength */
      DESC_CONFIG,    /* bDescriptorType */
      /* wTotalLength */
      LEN_CONFIG_AND_SUBORDINATE & 0x00FF,
      ((LEN_CONFIG_AND_SUBORDINATE & 0xFF00) >> 8),
      0x02,           /* bNumInterfaces */
      0x01,           /* bConfigurationValue */
      0x00,           /* iConfiguration */
      0x80 | (USBD_SELF_POWERED << 6) | (USBD_REMOTE_WAKEUP << 5),/* bmAttributes */
      USBD_MAX_POWER,         /* MaxPower */
  
      /* I/F descr: HID - Mouse */
      LEN_INTERFACE,  /* bLength */
      DESC_INTERFACE, /* bDescriptorType */
      0x00,           /* bInterfaceNumber */
      0x00,           /* bAlternateSetting */
      0x01,           /* bNumEndpoints */
      0x03,           /* bInterfaceClass */
      0x01,           /* bInterfaceSubClass */
      HID_MOUSE,      /* 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_MouseReportDescriptor) & 0x00FF,
      ((sizeof(HID_MouseReportDescriptor) & 0xFF00) >> 8),
  
      /* EP Descriptor: interrupt in. */
      LEN_ENDPOINT,   /* bLength */
      DESC_ENDPOINT,  /* bDescriptorType */
      (INT_IN_EP_NUM | EP_INPUT), /* bEndpointAddress */
      EP_INT,         /* bmAttributes */
      /* wMaxPacketSize */
      EPA_MAX_PKT_SIZE & 0x00FF,
      ((EPA_MAX_PKT_SIZE & 0xFF00) >> 8),
      HID_DEFAULT_INT_IN_INTERVAL,     /* bInterval */
  
      /* I/F descr: HID - Keyboard */
      LEN_INTERFACE,  /* bLength */
      DESC_INTERFACE, /* bDescriptorType */
      0x01,           /* bInterfaceNumber */
      0x00,           /* bAlternateSetting */
      0x01,           /* bNumEndpoints */
      0x03,           /* bInterfaceClass */
      0x01,           /* bInterfaceSubClass */
      HID_KEYBOARD,   /* 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_KeyboardReportDescriptor) & 0x00FF,
      ((sizeof(HID_KeyboardReportDescriptor) & 0xFF00) >> 8),
  
      /* EP Descriptor: interrupt in. */
      LEN_ENDPOINT,   /* bLength */
      DESC_ENDPOINT,  /* bDescriptorType */
      (INT_IN_EP_NUM_KB | EP_INPUT), /* bEndpointAddress */
      EP_INT,         /* bmAttributes */
      /* wMaxPacketSize */
      EPB_MAX_PKT_SIZE & 0x00FF,
      ((EPB_MAX_PKT_SIZE & 0xFF00) >> 8),
      HID_DEFAULT_INT_IN_INTERVAL_KB     /* bInterval */
  };
  
  /*!<USB Other Speed Configure Descriptor */
  uint8_t gu8OtherConfigDescriptorHS[] =
  {
      LEN_CONFIG,     /* bLength */
      DESC_OTHERSPEED,    /* bDescriptorType */
      /* wTotalLength */
      LEN_CONFIG_AND_SUBORDINATE & 0x00FF,
      ((LEN_CONFIG_AND_SUBORDINATE & 0xFF00) >> 8),
      0x02,           /* bNumInterfaces */
      0x01,           /* bConfigurationValue */
      0x00,           /* iConfiguration */
      0x80 | (USBD_SELF_POWERED << 6) | (USBD_REMOTE_WAKEUP << 5),/* bmAttributes */
      USBD_MAX_POWER,         /* MaxPower */
  
      /* I/F descr: HID - Mouse */
      LEN_INTERFACE,  /* bLength */
      DESC_INTERFACE, /* bDescriptorType */
      0x00,           /* bInterfaceNumber */
      0x00,           /* bAlternateSetting */
      0x01,           /* bNumEndpoints */
      0x03,           /* bInterfaceClass */
      0x01,           /* bInterfaceSubClass */
      HID_MOUSE,      /* 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_MouseReportDescriptor) & 0x00FF,
      ((sizeof(HID_MouseReportDescriptor) & 0xFF00) >> 8),
  
      /* EP Descriptor: interrupt in. */
      LEN_ENDPOINT,   /* bLength */
      DESC_ENDPOINT,  /* bDescriptorType */
      (INT_IN_EP_NUM | EP_INPUT), /* bEndpointAddress */
      EP_INT,         /* bmAttributes */
      /* wMaxPacketSize */
      EPA_OTHER_MAX_PKT_SIZE & 0x00FF,
      ((EPA_OTHER_MAX_PKT_SIZE & 0xFF00) >> 8),
      HID_DEFAULT_INT_IN_INTERVAL,     /* bInterval */
  
      /* I/F descr: HID - Keyboard */
      LEN_INTERFACE,  /* bLength */
      DESC_INTERFACE, /* bDescriptorType */
      0x01,           /* bInterfaceNumber */
      0x00,           /* bAlternateSetting */
      0x01,           /* bNumEndpoints */
      0x03,           /* bInterfaceClass */
      0x01,           /* bInterfaceSubClass */
      HID_KEYBOARD,   /* 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_KeyboardReportDescriptor) & 0x00FF,
      ((sizeof(HID_KeyboardReportDescriptor) & 0xFF00) >> 8),
  
      /* EP Descriptor: interrupt in. */
      LEN_ENDPOINT,   /* bLength */
      DESC_ENDPOINT,  /* bDescriptorType */
      (INT_IN_EP_NUM_KB | EP_INPUT), /* bEndpointAddress */
      EP_INT,         /* bmAttributes */
      /* wMaxPacketSize */
      EPB_OTHER_MAX_PKT_SIZE & 0x00FF,
      ((EPB_OTHER_MAX_PKT_SIZE & 0xFF00) >> 8),
      HID_DEFAULT_INT_IN_INTERVAL_KB     /* bInterval */
  };
  
  /*!<USB Configure Descriptor */
  uint8_t gu8ConfigDescriptorFS[] =
  {
      LEN_CONFIG,     /* bLength */
      DESC_CONFIG,    /* bDescriptorType */
      /* wTotalLength */
      LEN_CONFIG_AND_SUBORDINATE & 0x00FF,
      ((LEN_CONFIG_AND_SUBORDINATE & 0xFF00) >> 8),
      0x02,           /* bNumInterfaces */
      0x01,           /* bConfigurationValue */
      0x00,           /* iConfiguration */
      0x80 | (USBD_SELF_POWERED << 6) | (USBD_REMOTE_WAKEUP << 5),/* bmAttributes */
      USBD_MAX_POWER,         /* MaxPower */
  
      /* I/F descr: HID - Mouse */
      LEN_INTERFACE,  /* bLength */
      DESC_INTERFACE, /* bDescriptorType */
      0x00,           /* bInterfaceNumber */
      0x00,           /* bAlternateSetting */
      0x01,           /* bNumEndpoints */
      0x03,           /* bInterfaceClass */
      0x01,           /* bInterfaceSubClass */
      HID_MOUSE,      /* 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_MouseReportDescriptor) & 0x00FF,
      ((sizeof(HID_MouseReportDescriptor) & 0xFF00) >> 8),
  
      /* EP Descriptor: interrupt in. */
      LEN_ENDPOINT,   /* bLength */
      DESC_ENDPOINT,  /* bDescriptorType */
      (INT_IN_EP_NUM | EP_INPUT), /* bEndpointAddress */
      EP_INT,         /* bmAttributes */
      /* wMaxPacketSize */
      EPA_OTHER_MAX_PKT_SIZE & 0x00FF,
      ((EPA_OTHER_MAX_PKT_SIZE & 0xFF00) >> 8),
      HID_DEFAULT_INT_IN_INTERVAL,     /* bInterval */
  
      /* I/F descr: HID - Keyboard */
      LEN_INTERFACE,  /* bLength */
      DESC_INTERFACE, /* bDescriptorType */
      0x01,           /* bInterfaceNumber */
      0x00,           /* bAlternateSetting */
      0x01,           /* bNumEndpoints */
      0x03,           /* bInterfaceClass */
      0x01,           /* bInterfaceSubClass */
      HID_KEYBOARD,   /* 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_KeyboardReportDescriptor) & 0x00FF,
      ((sizeof(HID_KeyboardReportDescriptor) & 0xFF00) >> 8),
  
      /* EP Descriptor: interrupt in. */
      LEN_ENDPOINT,   /* bLength */
      DESC_ENDPOINT,  /* bDescriptorType */
      (INT_IN_EP_NUM_KB | EP_INPUT), /* bEndpointAddress */
      EP_INT,         /* bmAttributes */
      /* wMaxPacketSize */
      EPB_OTHER_MAX_PKT_SIZE & 0x00FF,
      ((EPB_OTHER_MAX_PKT_SIZE & 0xFF00) >> 8),
      HID_DEFAULT_INT_IN_INTERVAL_KB     /* bInterval */
  };
  
  /*!<USB Other Speed Configure Descriptor */
  uint8_t gu8OtherConfigDescriptorFS[] =
  {
      LEN_CONFIG,     /* bLength */
      DESC_OTHERSPEED,    /* bDescriptorType */
      /* wTotalLength */
      LEN_CONFIG_AND_SUBORDINATE & 0x00FF,
      ((LEN_CONFIG_AND_SUBORDINATE & 0xFF00) >> 8),
      0x02,           /* bNumInterfaces */
      0x01,           /* bConfigurationValue */
      0x00,           /* iConfiguration */
      0x80 | (USBD_SELF_POWERED << 6) | (USBD_REMOTE_WAKEUP << 5),/* bmAttributes */
      USBD_MAX_POWER,         /* MaxPower */
  
      /* I/F descr: HID - Mouse */
      LEN_INTERFACE,  /* bLength */
      DESC_INTERFACE, /* bDescriptorType */
      0x00,           /* bInterfaceNumber */
      0x00,           /* bAlternateSetting */
      0x01,           /* bNumEndpoints */
      0x03,           /* bInterfaceClass */
      0x01,           /* bInterfaceSubClass */
      HID_MOUSE,      /* 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_MouseReportDescriptor) & 0x00FF,
      ((sizeof(HID_MouseReportDescriptor) & 0xFF00) >> 8),
  
      /* EP Descriptor: interrupt in. */
      LEN_ENDPOINT,   /* bLength */
      DESC_ENDPOINT,  /* bDescriptorType */
      (INT_IN_EP_NUM | EP_INPUT), /* bEndpointAddress */
      EP_INT,         /* bmAttributes */
      /* wMaxPacketSize */
      EPA_MAX_PKT_SIZE & 0x00FF,
      ((EPA_MAX_PKT_SIZE & 0xFF00) >> 8),
      HID_DEFAULT_INT_IN_INTERVAL,     /* bInterval */
  
      /* I/F descr: HID - Keyboard */
      LEN_INTERFACE,  /* bLength */
      DESC_INTERFACE, /* bDescriptorType */
      0x01,           /* bInterfaceNumber */
      0x00,           /* bAlternateSetting */
      0x01,           /* bNumEndpoints */
      0x03,           /* bInterfaceClass */
      0x01,           /* bInterfaceSubClass */
      HID_KEYBOARD,   /* 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_KeyboardReportDescriptor) & 0x00FF,
      ((sizeof(HID_KeyboardReportDescriptor) & 0xFF00) >> 8),
  
      /* EP Descriptor: interrupt in. */
      LEN_ENDPOINT,   /* bLength */
      DESC_ENDPOINT,  /* bDescriptorType */
      (INT_IN_EP_NUM_KB | EP_INPUT), /* bEndpointAddress */
      EP_INT,         /* bmAttributes */
      /* wMaxPacketSize */
      EPB_MAX_PKT_SIZE & 0x00FF,
      ((EPB_MAX_PKT_SIZE & 0xFF00) >> 8),
      HID_DEFAULT_INT_IN_INTERVAL_KB     /* 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,
      DESC_STRING,
      'H', 0, 'I', 0, 'D', 0, ' ', 0, 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, 'e', 0
  };
  
  uint8_t *gpu8UsbString[4] =
  {
      gu8StringLang,
      gu8VendorStringDesc,
      gu8ProductStringDesc,
      NULL
  };
  
  uint8_t *gu8UsbHidReport[3] =
  {
      HID_MouseReportDescriptor,
      HID_KeyboardReportDescriptor,
      NULL
  };
  
  uint32_t gu32UsbHidReportLen[3] =
  {
      sizeof(HID_MouseReportDescriptor),
      sizeof(HID_KeyboardReportDescriptor),
      0
  };
  
  uint32_t gu32ConfigHidDescIdx[3] =
  {
      (LEN_CONFIG + LEN_INTERFACE),
      (sizeof(gu8ConfigDescriptor) - LEN_HID - LEN_ENDPOINT),
      0
  };
  
  S_HSUSBD_INFO_T gsHSInfo =
  {
      gu8DeviceDescriptor,
      gu8ConfigDescriptor,
      gpu8UsbString,
      gu8QualifierDescriptor,
      gu8ConfigDescriptorFS,
      gu8OtherConfigDescriptorHS,
      gu8OtherConfigDescriptorFS,
      NULL,
      gu8UsbHidReport,
      gu32UsbHidReportLen,
      gu32ConfigHidDescIdx
  };
  