917 lines
35 KiB
C
917 lines
35 KiB
C
/**
|
|
****************************************************************************************
|
|
*
|
|
* @file usb_def.h
|
|
*
|
|
* @brief Header file of USB Definitions(types and macros and structs)
|
|
*
|
|
****************************************************************************************
|
|
*/
|
|
|
|
#ifndef _USB_DEF_H
|
|
#define _USB_DEF_H
|
|
|
|
#include <stdint.h>
|
|
|
|
|
|
/*******************************************************************************
|
|
* CMSIS Util definitions
|
|
******************************************************************************/
|
|
|
|
#if defined(__CC_ARM)
|
|
#ifndef __USED
|
|
#define __USED __attribute__((used))
|
|
#endif
|
|
#ifndef __WEAK
|
|
#define __WEAK __attribute__((weak))
|
|
#endif
|
|
#ifndef __PACKED
|
|
#define __PACKED __attribute__((packed))
|
|
#endif
|
|
#ifndef __PACKED_STRUCT
|
|
#define __PACKED_STRUCT __packed struct
|
|
#endif
|
|
#ifndef __PACKED_UNION
|
|
#define __PACKED_UNION __packed union
|
|
#endif
|
|
#ifndef __ALIGNED
|
|
#define __ALIGNED(x) __attribute__((aligned(x)))
|
|
#endif
|
|
#elif defined(__GNUC__)
|
|
#ifndef __USED
|
|
#define __USED __attribute__((used))
|
|
#endif
|
|
#ifndef __WEAK
|
|
#define __WEAK __attribute__((weak))
|
|
#endif
|
|
#ifndef __PACKED
|
|
#define __PACKED __attribute__((packed, aligned(1)))
|
|
#endif
|
|
#ifndef __PACKED_STRUCT
|
|
#define __PACKED_STRUCT struct __attribute__((packed, aligned(1)))
|
|
#endif
|
|
#ifndef __PACKED_UNION
|
|
#define __PACKED_UNION union __attribute__((packed, aligned(1)))
|
|
#endif
|
|
#ifndef __ALIGNED
|
|
#define __ALIGNED(x) __attribute__((aligned(x)))
|
|
#endif
|
|
#elif defined(__ICCARM__)
|
|
#ifndef __USED
|
|
#if __ICCARM_V8
|
|
#define __USED __attribute__((used))
|
|
#else
|
|
#define __USED _Pragma("__root")
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef __WEAK
|
|
#if __ICCARM_V8
|
|
#define __WEAK __attribute__((weak))
|
|
#else
|
|
#define __WEAK _Pragma("__weak")
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef __PACKED
|
|
#if __ICCARM_V8
|
|
#define __PACKED __attribute__((packed, aligned(1)))
|
|
#else
|
|
#define __PACKED __packed /* Needs IAR language extensions */
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef __PACKED_STRUCT
|
|
#if __ICCARM_V8
|
|
#define __PACKED_STRUCT struct __attribute__((packed, aligned(1)))
|
|
#else
|
|
#define __PACKED_STRUCT __packed struct /* Needs IAR language extensions */
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef __PACKED_UNION
|
|
#if __ICCARM_V8
|
|
#define __PACKED_UNION union __attribute__((packed, aligned(1)))
|
|
#else
|
|
#define __PACKED_UNION __packed union /* Needs IAR language extensions */
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef __ALIGNED
|
|
#if __ICCARM_V8
|
|
#define __ALIGNED(x) __attribute__((aligned(x)))
|
|
#elif (__VER__ >= 7080000)
|
|
#define __ALIGNED(x) __attribute__((aligned(x))) /* Needs IAR language extensions */
|
|
#else
|
|
#warning No compiler specific solution for __ALIGNED.__ALIGNED is ignored.
|
|
#define __ALIGNED(x)
|
|
#endif
|
|
#endif
|
|
|
|
#endif
|
|
|
|
#ifndef __ALIGN_BEGIN
|
|
#define __ALIGN_BEGIN
|
|
#endif
|
|
#ifndef __ALIGN_END
|
|
#define __ALIGN_END __attribute__((aligned(4)))
|
|
#endif
|
|
|
|
#define __USBIRQ __attribute__((section("usb_irq")))
|
|
#define __USBDESC __attribute__((section("usb_desc"))) __USED __ALIGNED(1)
|
|
|
|
// The unused argument @p x.
|
|
#ifndef ARG_UNUSED
|
|
#define ARG_UNUSED(x) (void)(x)
|
|
#endif
|
|
// The low byte of 16bits @p x.
|
|
#ifndef LO_BYTE
|
|
#define LO_BYTE(x) ((uint8_t)(x & 0x00FF))
|
|
#endif
|
|
// The high byte of 16bits @p x.
|
|
#ifndef HI_BYTE
|
|
#define HI_BYTE(x) ((uint8_t)((x & 0xFF00) >> 8))
|
|
#endif
|
|
// The larger value between @p a and @p b.
|
|
#ifndef MAX
|
|
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
|
|
#endif
|
|
// The smaller value between @p a and @p b.
|
|
#ifndef MIN
|
|
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
|
|
#endif
|
|
// The Binary-Coded Decimal @p x.
|
|
#ifndef BCD
|
|
#define BCD(x) ((((x) / 10) << 4) | ((x) % 10))
|
|
#endif
|
|
// The bit of left-shift @p n.
|
|
#ifndef BIT
|
|
#define BIT(n) (1UL << (n))
|
|
#endif
|
|
// The elements count in @p array.
|
|
#ifndef ARRAY_SIZE
|
|
#define ARRAY_SIZE(array) ((sizeof(array) / sizeof((array)[0])))
|
|
#endif
|
|
// Bytes swap @p u16.
|
|
#ifndef BSWAP16
|
|
#define BSWAP16(u16) (__builtin_bswap16(u16))
|
|
#endif
|
|
// Bytes swap @p u32.
|
|
#ifndef BSWAP32
|
|
#define BSWAP32(u32) (__builtin_bswap32(u32))
|
|
#endif
|
|
|
|
// Get or Set BigEndian value
|
|
#define GET_BE16(field) \
|
|
(((uint16_t)(field)[0] << 8) | ((uint16_t)(field)[1]))
|
|
|
|
#define GET_BE32(field) \
|
|
(((uint32_t)(field)[0] << 24) | ((uint32_t)(field)[1] << 16) | ((uint32_t)(field)[2] << 8) | ((uint32_t)(field)[3] << 0))
|
|
|
|
#define SET_BE16(field, value) \
|
|
do { \
|
|
(field)[0] = (uint8_t)((value) >> 8); \
|
|
(field)[1] = (uint8_t)((value) >> 0); \
|
|
} while (0)
|
|
|
|
#define SET_BE24(field, value) \
|
|
do { \
|
|
(field)[0] = (uint8_t)((value) >> 16); \
|
|
(field)[1] = (uint8_t)((value) >> 8); \
|
|
(field)[2] = (uint8_t)((value) >> 0); \
|
|
} while (0)
|
|
|
|
#define SET_BE32(field, value) \
|
|
do { \
|
|
(field)[0] = (uint8_t)((value) >> 24); \
|
|
(field)[1] = (uint8_t)((value) >> 16); \
|
|
(field)[2] = (uint8_t)((value) >> 8); \
|
|
(field)[3] = (uint8_t)((value) >> 0); \
|
|
} while (0)
|
|
|
|
// Convert value to byte elements.
|
|
#define WCHAR(c) (c & 0xFF), ((c >> 8) & 0xFF)
|
|
#define WBVAL(x) (x & 0xFF), ((x >> 8) & 0xFF)
|
|
#define DBVAL(x) (x & 0xFF), ((x >> 8) & 0xFF), ((x >> 16) & 0xFF), ((x >> 24) & 0xFF)
|
|
|
|
// Type and index of the descriptor
|
|
#define GET_DESC_TYPE(x) (((x) >> 8) & 0xFF)
|
|
#define GET_DESC_INDEX(x) ((x) & 0xFF)
|
|
|
|
// The Number of arguments, max 63.
|
|
#define PP_NARG(...) \
|
|
PP_NARG_(__VA_ARGS__, PP_RSEQ_N())
|
|
#define PP_NARG_(...) \
|
|
PP_ARG_N(__VA_ARGS__)
|
|
#define PP_ARG_N( \
|
|
_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, \
|
|
_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, \
|
|
_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, \
|
|
_31, _32, _33, _34, _35, _36, _37, _38, _39, _40, \
|
|
_41, _42, _43, _44, _45, _46, _47, _48, _49, _50, \
|
|
_51, _52, _53, _54, _55, _56, _57, _58, _59, _60, \
|
|
_61, _62, _63, N, ...) N
|
|
#define PP_RSEQ_N() \
|
|
63, 62, 61, 60, \
|
|
59, 58, 57, 56, 55, 54, 53, 52, 51, 50, \
|
|
49, 48, 47, 46, 45, 44, 43, 42, 41, 40, \
|
|
39, 38, 37, 36, 35, 34, 33, 32, 31, 30, \
|
|
29, 28, 27, 26, 25, 24, 23, 22, 21, 20, \
|
|
19, 18, 17, 16, 15, 14, 13, 12, 11, 10, \
|
|
9, 8, 7, 6, 5, 4, 3, 2, 1, 0
|
|
|
|
|
|
/*******************************************************************************
|
|
* USB Core definitions
|
|
******************************************************************************/
|
|
|
|
/**< maximum packet size (MPS) for EP 0~NUM */
|
|
#ifndef USB_EP0_MPS
|
|
#define USB_EP0_MPS 64
|
|
#endif
|
|
|
|
#ifndef USB_EP_MPS
|
|
#define USB_EP_MPS 64
|
|
#endif
|
|
|
|
/* Version define */
|
|
#define USB_1_1 0x0110
|
|
#define USB_2_0 0x0200
|
|
#define USB_2_1 0x0210
|
|
|
|
/* Device speeds */
|
|
#define USB_SPEED_UNKNOWN 0 /* Transfer rate not yet set */
|
|
#define USB_SPEED_LOW 1 /* USB 1.1 */
|
|
#define USB_SPEED_FULL 2 /* USB 1.1 */
|
|
#define USB_SPEED_HIGH 3 /* USB 2.0 */
|
|
#define USB_SPEED_VARIABLE 4 /* Wireless USB 2.5 */
|
|
|
|
// USB PID Types
|
|
#define USB_PID_OUT (0x01) /* Tokens */
|
|
#define USB_PID_IN (0x09)
|
|
#define USB_PID_SOF (0x05)
|
|
#define USB_PID_SETUP (0x0d)
|
|
|
|
#define USB_PID_DATA0 (0x03) /* Data */
|
|
#define USB_PID_DATA1 (0x0b)
|
|
#define USB_PID_DATA2 (0x07)
|
|
#define USB_PID_MDATA (0x0f)
|
|
|
|
#define USB_PID_ACK (0x02) /* Handshake */
|
|
#define USB_PID_NAK (0x0a)
|
|
#define USB_PID_STALL (0x0e)
|
|
#define USB_PID_NYET (0x06)
|
|
|
|
#define USB_PID_PRE (0x0c) /* Special */
|
|
#define USB_PID_ERR (0x0c)
|
|
#define USB_PID_SPLIT (0x08)
|
|
#define USB_PID_PING (0x04)
|
|
#define USB_PID_RESERVED (0x00)
|
|
|
|
#define USB_REQUEST_DIR_LSB 7U /* Bits 7: Request dir */
|
|
#define USB_REQUEST_DIR_OUT (0U << USB_REQUEST_DIR_LSB) /* Bit 7=0: Host-to-device */
|
|
#define USB_REQUEST_DIR_IN (1U << USB_REQUEST_DIR_LSB) /* Bit 7=1: Device-to-host */
|
|
#define USB_REQUEST_DIR_MASK (1U << USB_REQUEST_DIR_LSB) /* Bit 7=1: Direction bit */
|
|
|
|
#define USB_REQUEST_TYPE_LSB 5U /* Bits 5:6: Request type */
|
|
#define USB_REQUEST_STANDARD (0U << USB_REQUEST_TYPE_LSB)
|
|
#define USB_REQUEST_CLASS (1U << USB_REQUEST_TYPE_LSB)
|
|
#define USB_REQUEST_VENDOR (2U << USB_REQUEST_TYPE_LSB)
|
|
#define USB_REQUEST_RESERVED (3U << USB_REQUEST_TYPE_LSB)
|
|
#define USB_REQUEST_TYPE_MASK (3U << USB_REQUEST_TYPE_LSB)
|
|
|
|
#define USB_REQUEST_RECIP_LSB 0U /* Bits 0:4: Recipient */
|
|
#define USB_REQUEST_RECIP_DEVICE (0U << USB_REQUEST_RECIP_LSB)
|
|
#define USB_REQUEST_RECIP_INTERFACE (1U << USB_REQUEST_RECIP_LSB)
|
|
#define USB_REQUEST_RECIP_ENDPOINT (2U << USB_REQUEST_RECIP_LSB)
|
|
#define USB_REQUEST_RECIP_OTHER (3U << USB_REQUEST_RECIP_LSB)
|
|
#define USB_REQUEST_RECIP_MASK (3U << USB_REQUEST_RECIP_LSB)
|
|
|
|
/* USB Standard Request Codes */
|
|
#define USB_REQUEST_GET_STATUS 0x00
|
|
#define USB_REQUEST_CLEAR_FEATURE 0x01
|
|
#define USB_REQUEST_SET_FEATURE 0x03
|
|
#define USB_REQUEST_SET_ADDRESS 0x05
|
|
#define USB_REQUEST_GET_DESCRIPTOR 0x06
|
|
#define USB_REQUEST_SET_DESCRIPTOR 0x07
|
|
#define USB_REQUEST_GET_CONFIGURATION 0x08
|
|
#define USB_REQUEST_SET_CONFIGURATION 0x09
|
|
#define USB_REQUEST_GET_INTERFACE 0x0A
|
|
#define USB_REQUEST_SET_INTERFACE 0x0B
|
|
#define USB_REQUEST_SYNCH_FRAME 0x0C
|
|
#define USB_REQUEST_SET_ENCRYPTION 0x0D
|
|
#define USB_REQUEST_GET_ENCRYPTION 0x0E
|
|
#define USB_REQUEST_RPIPE_ABORT 0x0E
|
|
#define USB_REQUEST_SET_HANDSHAKE 0x0F
|
|
#define USB_REQUEST_RPIPE_RESET 0x0F
|
|
#define USB_REQUEST_GET_HANDSHAKE 0x10
|
|
#define USB_REQUEST_SET_CONNECTION 0x11
|
|
#define USB_REQUEST_SET_SECURITY_DATA 0x12
|
|
#define USB_REQUEST_GET_SECURITY_DATA 0x13
|
|
#define USB_REQUEST_SET_WUSB_DATA 0x14
|
|
#define USB_REQUEST_LOOPBACK_DATA_WRITE 0x15
|
|
#define USB_REQUEST_LOOPBACK_DATA_READ 0x16
|
|
#define USB_REQUEST_SET_INTERFACE_DS 0x17
|
|
|
|
/* USB Standard Feature selectors */
|
|
#define USB_FEATURE_ENDPOINT_HALT 0
|
|
#define USB_FEATURE_SELF_POWERED 0
|
|
#define USB_FEATURE_REMOTE_WAKEUP 1
|
|
#define USB_FEATURE_TEST_MODE 2
|
|
#define USB_FEATURE_BATTERY 2
|
|
#define USB_FEATURE_BHNPENABLE 3
|
|
#define USB_FEATURE_WUSBDEVICE 3
|
|
#define USB_FEATURE_AHNPSUPPORT 4
|
|
#define USB_FEATURE_AALTHNPSUPPORT 5
|
|
#define USB_FEATURE_DEBUGMODE 6
|
|
|
|
/* USB GET_STATUS Bit Values */
|
|
#define USB_GETSTATUS_ENDPOINT_HALT 0x01
|
|
#define USB_GETSTATUS_SELF_POWERED 0x01
|
|
#define USB_GETSTATUS_REMOTE_WAKEUP 0x02
|
|
|
|
/* USB Descriptor Types */
|
|
#define USB_DESC_TYPE_DEVICE 0x01U
|
|
#define USB_DESC_TYPE_CONFIGURATION 0x02U
|
|
#define USB_DESC_TYPE_STRING 0x03U
|
|
#define USB_DESC_TYPE_INTERFACE 0x04U
|
|
#define USB_DESC_TYPE_ENDPOINT 0x05U
|
|
#define USB_DESC_TYPE_DEVICE_QUALIFIER 0x06U
|
|
#define USB_DESC_TYPE_OTHER_SPEED 0x07U
|
|
#define USB_DESC_TYPE_INTERFACE_POWER 0x08U
|
|
#define USB_DESC_TYPE_OTG 0x09U
|
|
#define USB_DESC_TYPE_DEBUG 0x0AU
|
|
#define USB_DESC_TYPE_INTERFACE_ASSOCIATION 0x0BU
|
|
#define USB_DESC_TYPE_BINARY_OBJECT_STORE 0x0FU
|
|
#define USB_DESC_TYPE_DEVICE_CAPABILITY 0x10U
|
|
#define USB_DESC_TYPE_WIRELESS_ENDPOINTCOMP 0x11U
|
|
|
|
/* Class Specific Descriptor */
|
|
#define USB_CLASS_DESC_TYPE_DEVICE 0x21U
|
|
#define USB_CLASS_DESC_TYPE_CONFIGURATION 0x22U
|
|
#define USB_CLASS_DESC_TYPE_STRING 0x23U
|
|
#define USB_CLASS_DESC_TYPE_INTERFACE 0x24U
|
|
#define USB_CLASS_DESC_TYPE_ENDPOINT 0x25U
|
|
|
|
#define USB_DESC_TYPE_SUPERSPEED_ENDPOINT_COMPANION 0x30U
|
|
#define USB_DESC_TYPE_SUPERSPEED_ISO_ENDPOINT_COMPANION 0x31U
|
|
|
|
/* USB Device Classes */
|
|
#define USB_DEVICE_CLASS_RESERVED 0x00
|
|
#define USB_DEVICE_CLASS_AUDIO 0x01
|
|
#define USB_DEVICE_CLASS_CDC 0x02
|
|
#define USB_DEVICE_CLASS_HID 0x03
|
|
#define USB_DEVICE_CLASS_MONITOR 0x04
|
|
#define USB_DEVICE_CLASS_PHYSICAL 0x05
|
|
#define USB_DEVICE_CLASS_IMAGE 0x06
|
|
#define USB_DEVICE_CLASS_PRINTER 0x07
|
|
#define USB_DEVICE_CLASS_MASS_STORAGE 0x08
|
|
#define USB_DEVICE_CLASS_HUB 0x09
|
|
#define USB_DEVICE_CLASS_CDC_DATA 0x0a
|
|
#define USB_DEVICE_CLASS_SMART_CARD 0x0b
|
|
#define USB_DEVICE_CLASS_SECURITY 0x0d
|
|
#define USB_DEVICE_CLASS_VIDEO 0x0e
|
|
#define USB_DEVICE_CLASS_HEALTHCARE 0x0f
|
|
#define USB_DEVICE_CLASS_DIAG_DEVICE 0xdc
|
|
#define USB_DEVICE_CLASS_WIRELESS 0xe0
|
|
#define USB_DEVICE_CLASS_MISC 0xef
|
|
#define USB_DEVICE_CLASS_APP_SPECIFIC 0xfe
|
|
#define USB_DEVICE_CLASS_VEND_SPECIFIC 0xff
|
|
|
|
/* usb string index define */
|
|
#define USB_STRING_LANGID_INDEX 0x00
|
|
#define USB_STRING_MFC_INDEX 0x01
|
|
#define USB_STRING_PRODUCT_INDEX 0x02
|
|
#define USB_STRING_SERIAL_INDEX 0x03
|
|
#define USB_STRING_CONFIG_INDEX 0x04
|
|
#define USB_STRING_INTERFACE_INDEX 0x05
|
|
#define USB_STRING_OS_INDEX 0x06
|
|
#define USB_STRING_MAX USB_STRING_OS_INDEX
|
|
/*
|
|
* Devices supporting Microsoft OS Descriptors store special string
|
|
* descriptor at fixed index (0xEE). It is read when a new device is
|
|
* attached to a computer for the first time.
|
|
*/
|
|
#define USB_OSDESC_STRING_DESC_INDEX 0xEE
|
|
|
|
/* bmAttributes in Configuration Descriptor */
|
|
#define USB_CONFIG_REMOTE_WAKEUP 0x20
|
|
#define USB_CONFIG_POWERED_MASK 0x40
|
|
#define USB_CONFIG_BUS_POWERED 0x80
|
|
#define USB_CONFIG_SELF_POWERED 0xC0
|
|
|
|
/* bMaxPower in Configuration Descriptor */
|
|
#define USB_CONFIG_POWER_MA(mA) ((mA) / 2)
|
|
|
|
/* bEndpointAddress in Endpoint Descriptor */
|
|
#define USB_EP_DIR_MASK 0x80
|
|
#define USB_EP_DIR_IN 0x80
|
|
#define USB_EP_DIR_OUT 0x00
|
|
#define USB_EP_OUT(idx) ((idx) | USB_EP_DIR_OUT)
|
|
#define USB_EP_IN(idx) ((idx) | USB_EP_DIR_IN)
|
|
|
|
/**
|
|
* USB endpoint direction and number.
|
|
*/
|
|
/** Get endpoint index (number) from endpoint address */
|
|
#define USB_EP_GET_IDX(ep) ((ep) & ~USB_EP_DIR_MASK)
|
|
/** Get direction from endpoint address */
|
|
#define USB_EP_GET_DIR(ep) ((ep) & USB_EP_DIR_MASK)
|
|
/** Get endpoint address from endpoint index and direction */
|
|
#define USB_EP_GET_ADDR(idx, dir) ((idx) | ((dir) & USB_EP_DIR_MASK))
|
|
/** True if the endpoint is an IN endpoint */
|
|
#define USB_EP_DIR_IS_IN(ep) (USB_EP_GET_DIR(ep) == USB_EP_DIR_IN)
|
|
/** True if the endpoint is an OUT endpoint */
|
|
#define USB_EP_DIR_IS_OUT(ep) (USB_EP_GET_DIR(ep) == USB_EP_DIR_OUT)
|
|
|
|
/* bmAttributes in Endpoint Descriptor */
|
|
#define USB_EP_TYPE_LSB 0
|
|
#define USB_EP_TYPE_CONTROL (0 << USB_EP_TYPE_LSB)
|
|
#define USB_EP_TYPE_ISOCHRONOUS (1 << USB_EP_TYPE_LSB)
|
|
#define USB_EP_TYPE_BULK (2 << USB_EP_TYPE_LSB)
|
|
#define USB_EP_TYPE_INTERRUPT (3 << USB_EP_TYPE_LSB)
|
|
#define USB_EP_TYPE_MASK (3 << USB_EP_TYPE_LSB)
|
|
|
|
#define USB_EP_SYNC_LSB 2
|
|
#define USB_EP_SYNC_NO_SYNCHRONIZATION (0 << USB_EP_SYNC_LSB)
|
|
#define USB_EP_SYNC_ASYNCHRONOUS (1 << USB_EP_SYNC_LSB)
|
|
#define USB_EP_SYNC_ADAPTIVE (2 << USB_EP_SYNC_LSB)
|
|
#define USB_EP_SYNC_SYNCHRONOUS (3 << USB_EP_SYNC_LSB)
|
|
#define USB_EP_SYNC_MASK (3 << USB_EP_SYNC_LSB)
|
|
|
|
#define USB_EP_USAGE_LSB 4
|
|
#define USB_EP_USAGE_DATA (0 << USB_EP_USAGE_LSB)
|
|
#define USB_EP_USAGE_FEEDBACK (1 << USB_EP_USAGE_LSB)
|
|
#define USB_EP_USAGE_IMPLICIT_FEEDBACK (2 << USB_EP_USAGE_LSB)
|
|
#define USB_EP_USAGE_MASK (3 << USB_EP_USAGE_LSB)
|
|
|
|
#define USB_EP_MAX_ADJUSTABLE (1 << 7)
|
|
|
|
/* wMaxPacketSize in Endpoint Descriptor */
|
|
#define USB_MAXPACKETSIZE_LSB 0
|
|
#define USB_MAXPACKETSIZE_MASK (0x7ff << USB_MAXPACKETSIZE_LSB)
|
|
#define USB_MAXPACKETSIZE_EXTRA_TRANSCATION_LSB 11
|
|
#define USB_MAXPACKETSIZE_EXTRA_TRANSCATION_NONE (0 << USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_LSB)
|
|
#define USB_MAXPACKETSIZE_EXTRA_TRANSCATION_ONE (1 << USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_LSB)
|
|
#define USB_MAXPACKETSIZE_EXTRA_TRANSCATION_TWO (2 << USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_LSB)
|
|
#define USB_MAXPACKETSIZE_EXTRA_TRANSCATION_MASK (3 << USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_LSB)
|
|
|
|
/* bDevCapabilityType in Device Capability Descriptor */
|
|
#define USB_DEVICE_CAP_WIRELESS_USB 1
|
|
#define USB_DEVICE_CAP_USB_2_0_EXTENSION 2
|
|
#define USB_DEVICE_CAP_SUPERSPEED_USB 3
|
|
#define USB_DEVICE_CAP_CONTAINER_ID 4
|
|
#define USB_DEVICE_CAP_PLATFORM 5
|
|
#define USB_DEVICE_CAP_POWER_DELIVERY_CAPABILITY 6
|
|
#define USB_DEVICE_CAP_BATTERY_INFO_CAPABILITY 7
|
|
#define USB_DEVICE_CAP_PD_CONSUMER_PORT_CAPABILITY 8
|
|
#define USB_DEVICE_CAP_PD_PROVIDER_PORT_CAPABILITY 9
|
|
#define USB_DEVICE_CAP_SUPERSPEED_PLUS 10
|
|
#define USB_DEVICE_CAP_PRECISION_TIME_MEASUREMENT 11
|
|
#define USB_DEVICE_CAP_WIRELESS_USB_EXT 12
|
|
|
|
#define USB_BOS_CAP_EXTENSION 0x02
|
|
#define USB_BOS_CAP_PLATFORM 0x05
|
|
|
|
/* OTG SET FEATURE Constants */
|
|
#define USB_OTG_FEATURE_B_HNP_ENABLE 3 /* Enable B device to perform HNP */
|
|
#define USB_OTG_FEATURE_A_HNP_SUPPORT 4 /* A device supports HNP */
|
|
#define USB_OTG_FEATURE_A_ALT_HNP_SUPPORT 5 /* Another port on the A device supports HNP */
|
|
|
|
/* WinUSB Microsoft OS 2.0 descriptor request codes */
|
|
#define WINUSB_REQUEST_GET_DESCRIPTOR_SET 0x07
|
|
#define WINUSB_REQUEST_SET_ALT_ENUM 0x08
|
|
|
|
/* WinUSB Microsoft OS 2.0 descriptor sizes */
|
|
#define WINUSB_DESCRIPTOR_SET_HEADER_SIZE 10
|
|
#define WINUSB_FUNCTION_SUBSET_HEADER_SIZE 8
|
|
#define WINUSB_FEATURE_COMPATIBLE_ID_SIZE 20
|
|
|
|
/* WinUSB Microsoft OS 2.0 Descriptor Types */
|
|
#define WINUSB_SET_HEADER_DESCRIPTOR_TYPE 0x00
|
|
#define WINUSB_SUBSET_HEADER_CONFIGURATION_TYPE 0x01
|
|
#define WINUSB_SUBSET_HEADER_FUNCTION_TYPE 0x02
|
|
#define WINUSB_FEATURE_COMPATIBLE_ID_TYPE 0x03
|
|
#define WINUSB_FEATURE_REG_PROPERTY_TYPE 0x04
|
|
#define WINUSB_FEATURE_MIN_RESUME_TIME_TYPE 0x05
|
|
#define WINUSB_FEATURE_MODEL_ID_TYPE 0x06
|
|
#define WINUSB_FEATURE_CCGP_DEVICE_TYPE 0x07
|
|
|
|
#define WINUSB_PROP_DATA_TYPE_REG_SZ 0x01
|
|
#define WINUSB_PROP_DATA_TYPE_REG_MULTI_SZ 0x07
|
|
|
|
/* WebUSB Descriptor Types */
|
|
#define WEBUSB_DESCRIPTOR_SET_HEADER_TYPE 0x00
|
|
#define WEBUSB_CONFIGURATION_SUBSET_HEADER_TYPE 0x01
|
|
#define WEBUSB_FUNCTION_SUBSET_HEADER_TYPE 0x02
|
|
#define WEBUSB_URL_TYPE 0x03
|
|
|
|
/* WebUSB Request Codes */
|
|
#define WEBUSB_REQUEST_GET_URL 0x02
|
|
|
|
/* bScheme in URL descriptor */
|
|
#define WEBUSB_URL_SCHEME_HTTP 0x00
|
|
#define WEBUSB_URL_SCHEME_HTTPS 0x01
|
|
|
|
/* WebUSB Descriptor sizes */
|
|
#define WEBUSB_DESCRIPTOR_SET_HEADER_SIZE 5
|
|
#define WEBUSB_CONFIGURATION_SUBSET_HEADER_SIZE 4
|
|
#define WEBUSB_FUNCTION_SUBSET_HEADER_SIZE 3
|
|
|
|
|
|
/* Setup packet definition used to read raw data from USB line */
|
|
struct usb_setup_packet {
|
|
/** Request type. Bits 0:4 determine recipient, see
|
|
* \ref usb_request_recipient. Bits 5:6 determine type, see
|
|
* \ref usb_request_type. Bit 7 determines data transfer direction, see
|
|
* \ref usb_endpoint_direction.
|
|
*/
|
|
uint8_t bmRequestType;
|
|
|
|
/** Request. If the type bits of bmRequestType are equal to
|
|
* \ref usb_request_type::LIBUSB_REQUEST_TYPE_STANDARD
|
|
* "USB_REQUEST_TYPE_STANDARD" then this field refers to
|
|
* \ref usb_standard_request. For other cases, use of this field is
|
|
* application-specific. */
|
|
uint8_t bRequest;
|
|
|
|
/** Value. Varies according to request */
|
|
uint16_t wValue;
|
|
|
|
/** Index. Varies according to request, typically used to pass an index
|
|
* or offset */
|
|
uint16_t wIndex;
|
|
|
|
/** Number of bytes to transfer */
|
|
uint16_t wLength;
|
|
} __PACKED;
|
|
|
|
#define USB_SETUP_PACKET_SIZE 8
|
|
|
|
/** USB descriptor header */
|
|
struct usb_desc_header {
|
|
uint8_t bLength; /* descriptor length */
|
|
uint8_t bDescriptorType; /* descriptor type */
|
|
};
|
|
|
|
/** Standard Device Descriptor */
|
|
struct usb_device_descriptor {
|
|
uint8_t bLength; /* Descriptor size in bytes = 18 */
|
|
uint8_t bDescriptorType; /* DEVICE descriptor type = 1 */
|
|
uint16_t bcdUSB; /* USB spec in BCD, e.g. 0x0200 */
|
|
uint8_t bDeviceClass; /* Class code, if 0 see interface */
|
|
uint8_t bDeviceSubClass; /* Sub-Class code, 0 if class = 0 */
|
|
uint8_t bDeviceProtocol; /* Protocol, if 0 see interface */
|
|
uint8_t bMaxPacketSize0; /* Endpoint 0 max. size */
|
|
uint16_t idVendor; /* Vendor ID per USB-IF */
|
|
uint16_t idProduct; /* Product ID per manufacturer */
|
|
uint16_t bcdDevice; /* Device release # in BCD */
|
|
uint8_t iManufacturer; /* Index to manufacturer string */
|
|
uint8_t iProduct; /* Index to product string */
|
|
uint8_t iSerialNumber; /* Index to serial number string */
|
|
uint8_t bNumConfigurations; /* Number of possible configurations */
|
|
} __PACKED;
|
|
|
|
#define USB_DEVICE_DESC_SIZE 18
|
|
|
|
/** Standard Configuration Descriptor */
|
|
struct usb_configuration_descriptor {
|
|
uint8_t bLength; /* Descriptor size in bytes = 9 */
|
|
uint8_t bDescriptorType; /* CONFIGURATION type = 2 or 7 */
|
|
uint16_t wTotalLength; /* Length of concatenated descriptors */
|
|
uint8_t bNumInterfaces; /* Number of interfaces, this config. */
|
|
uint8_t bConfigurationValue; /* Value to set this config. */
|
|
uint8_t iConfiguration; /* Index to configuration string */
|
|
uint8_t bmAttributes; /* Config. characteristics */
|
|
uint8_t bMaxPower; /* Max.power from bus, 2mA units */
|
|
} __PACKED;
|
|
|
|
#define USB_CONFIG_DESC_SIZE 9
|
|
|
|
/** Standard Interface Descriptor */
|
|
struct usb_interface_descriptor {
|
|
uint8_t bLength; /* Descriptor size in bytes = 9 */
|
|
uint8_t bDescriptorType; /* INTERFACE descriptor type = 4 */
|
|
uint8_t bInterfaceNumber; /* Interface no.*/
|
|
uint8_t bAlternateSetting; /* Value to select this IF */
|
|
uint8_t bNumEndpoints; /* Number of endpoints excluding 0 */
|
|
uint8_t bInterfaceClass; /* Class code, 0xFF = vendor */
|
|
uint8_t bInterfaceSubClass; /* Sub-Class code, 0 if class = 0 */
|
|
uint8_t bInterfaceProtocol; /* Protocol, 0xFF = vendor */
|
|
uint8_t iInterface; /* Index to interface string */
|
|
} __PACKED;
|
|
|
|
#define USB_INTERFACE_DESC_SIZE 9
|
|
|
|
/** Standard Endpoint Descriptor */
|
|
struct usb_endpoint_descriptor {
|
|
uint8_t bLength; /* Descriptor size in bytes = 7 */
|
|
uint8_t bDescriptorType; /* ENDPOINT descriptor type = 5 */
|
|
uint8_t bEndpointAddress; /* Endpoint # 0 - 15 | IN/OUT */
|
|
uint8_t bmAttributes; /* Transfer type */
|
|
uint16_t wMaxPacketSize; /* Bits 10:0 = max. packet size */
|
|
uint8_t bInterval; /* Polling interval in (micro) frames */
|
|
} __PACKED;
|
|
|
|
#define USB_ENDPOINT_DESC_SIZE 7
|
|
|
|
/** Unicode (UTF16LE) String Descriptor */
|
|
struct usb_string_descriptor {
|
|
uint8_t bLength;
|
|
uint8_t bDescriptorType;
|
|
uint16_t bString;
|
|
} __PACKED;
|
|
|
|
#define USB_STRING_LANGID_DESC_SIZE 4
|
|
|
|
/* USB Interface Association Descriptor */
|
|
struct usb_interface_association_descriptor {
|
|
uint8_t bLength;
|
|
uint8_t bDescriptorType;
|
|
uint8_t bFirstInterface;
|
|
uint8_t bInterfaceCount;
|
|
uint8_t bFunctionClass;
|
|
uint8_t bFunctionSubClass;
|
|
uint8_t bFunctionProtocol;
|
|
uint8_t iFunction;
|
|
} __PACKED;
|
|
|
|
#define USB_IAD_DESC_SIZE 8
|
|
|
|
/** USB device_qualifier descriptor */
|
|
struct usb_device_qualifier_descriptor {
|
|
uint8_t bLength; /* Descriptor size in bytes = 10 */
|
|
uint8_t bDescriptorType; /* DEVICE QUALIFIER type = 6 */
|
|
uint16_t bcdUSB; /* USB spec in BCD, e.g. 0x0200 */
|
|
uint8_t bDeviceClass; /* Class code, if 0 see interface */
|
|
uint8_t bDeviceSubClass; /* Sub-Class code, 0 if class = 0 */
|
|
uint8_t bDeviceProtocol; /* Protocol, if 0 see interface */
|
|
uint8_t bMaxPacketSize; /* Endpoint 0 max. size */
|
|
uint8_t bNumConfigurations; /* Number of possible configurations */
|
|
uint8_t bReserved; /* Reserved = 0 */
|
|
} __PACKED;
|
|
|
|
#define USB_DEVICE_QUALIFIER_DESC_SIZE 10
|
|
|
|
/* Microsoft OS function descriptor.
|
|
* This can be used to request a specific driver (such as WINUSB) to be
|
|
* loaded on Windows. Unlike other descriptors, it is requested by a special
|
|
* request USB_REQ_GETMSFTOSDESCRIPTOR.
|
|
* More details:
|
|
* https://msdn.microsoft.com/en-us/windows/hardware/gg463179
|
|
*
|
|
* The device will have exactly one "Extended Compat ID Feature Descriptor",
|
|
* which may contain multiple "Function Descriptors" associated with
|
|
* different interfaces.
|
|
*/
|
|
|
|
/* MS OS 1.0 string descriptor */
|
|
struct usb_msosv1_string_descriptor {
|
|
uint8_t bLength;
|
|
uint8_t bDescriptorType;
|
|
uint8_t bString[14];
|
|
uint8_t bMS_VendorCode; /* Vendor Code, used for a control request */
|
|
uint8_t bPad; /* Padding byte for VendorCode look as UTF16 */
|
|
} __PACKED;
|
|
|
|
/* MS OS 1.0 Header descriptor */
|
|
struct usb_msosv1_compat_id_header_descriptor {
|
|
uint32_t dwLength;
|
|
uint16_t bcdVersion;
|
|
uint16_t wIndex;
|
|
uint8_t bCount;
|
|
uint8_t reserved[7];
|
|
} __PACKED;
|
|
|
|
/* MS OS 1.0 Function descriptor */
|
|
struct usb_msosv1_comp_id_function_descriptor {
|
|
uint8_t bFirstInterfaceNumber;
|
|
uint8_t reserved1;
|
|
uint8_t compatibleID[8];
|
|
uint8_t subCompatibleID[8];
|
|
uint8_t reserved2[6];
|
|
} __PACKED;
|
|
|
|
#define usb_msosv1_comp_id_create(x) \
|
|
struct usb_msosv1_comp_id { \
|
|
struct usb_msosv1_compat_id_header_descriptor compat_id_header; \
|
|
struct usb_msosv1_comp_id_function_descriptor compat_id_function[x]; \
|
|
};
|
|
|
|
struct usb_msosv1_descriptor {
|
|
uint8_t *string;
|
|
uint8_t string_len;
|
|
uint8_t vendor_code;
|
|
uint8_t *compat_id;
|
|
uint16_t compat_id_len;
|
|
uint8_t *comp_id_property;
|
|
uint16_t comp_id_property_len;
|
|
};
|
|
|
|
/* MS OS 2.0 Header descriptor */
|
|
struct usb_msosv2_header_descriptor {
|
|
uint32_t dwLength;
|
|
uint16_t bcdVersion;
|
|
uint16_t wIndex;
|
|
uint8_t bCount;
|
|
} __PACKED;
|
|
|
|
/*Microsoft OS 2.0 set header descriptor*/
|
|
struct usb_msosv2_set_header_descriptor {
|
|
uint16_t wLength;
|
|
uint16_t wDescriptorType;
|
|
uint32_t dwWindowsVersion;
|
|
uint16_t wDescriptorSetTotalLength;
|
|
} __PACKED;
|
|
|
|
/* Microsoft OS 2.0 compatibleID descriptor*/
|
|
struct usb_msosv2_comp_id_descriptor {
|
|
uint16_t wLength;
|
|
uint16_t wDescriptorType;
|
|
uint8_t compatibleID[8];
|
|
uint8_t subCompatibleID[8];
|
|
} __PACKED;
|
|
|
|
/* MS OS 2.0 property descriptor */
|
|
struct usb_msosv2_property_descriptor {
|
|
uint16_t wLength;
|
|
uint16_t wDescriptorType;
|
|
uint32_t dwPropertyDataType;
|
|
uint16_t wPropertyNameLength;
|
|
const char *bPropertyName;
|
|
uint32_t dwPropertyDataLength;
|
|
const char *bPropertyData;
|
|
};
|
|
|
|
/* Microsoft OS 2.0 subset function descriptor */
|
|
struct usb_msosv2_subset_function_descriptor {
|
|
uint16_t wLength;
|
|
uint16_t wDescriptorType;
|
|
uint8_t bFirstInterface;
|
|
uint8_t bReserved;
|
|
uint16_t wSubsetLength;
|
|
} __PACKED;
|
|
|
|
struct usb_msosv2_descriptor {
|
|
uint8_t *compat_id;
|
|
uint16_t compat_id_len;
|
|
uint8_t vendor_code;
|
|
};
|
|
|
|
/* BOS header Descriptor */
|
|
struct usb_bos_header_descriptor {
|
|
uint8_t bLength;
|
|
uint8_t bDescriptorType;
|
|
uint16_t wTotalLength;
|
|
uint8_t bNumDeviceCaps;
|
|
} __PACKED;
|
|
|
|
/* BOS Capability platform Descriptor */
|
|
struct usb_bos_capability_platform_descriptor {
|
|
uint8_t bLength;
|
|
uint8_t bDescriptorType;
|
|
uint8_t bDevCapabilityType;
|
|
uint8_t bReserved;
|
|
uint8_t PlatformCapabilityUUID[16];
|
|
} __PACKED;
|
|
|
|
/* BOS Capability MS OS Descriptors version 2 */
|
|
struct usb_bos_capability_msosv2_descriptor {
|
|
uint32_t dwWindowsVersion;
|
|
uint16_t wMSOSDescriptorSetTotalLength;
|
|
uint8_t bVendorCode;
|
|
uint8_t bAltEnumCode;
|
|
} __PACKED;
|
|
|
|
/* BOS Capability webusb */
|
|
struct usb_bos_capability_webusb_descriptor {
|
|
uint16_t bcdVersion;
|
|
uint8_t bVendorCode;
|
|
uint8_t iLandingPage;
|
|
} __PACKED;
|
|
|
|
/* BOS Capability extension Descriptor*/
|
|
struct usb_bos_capability_extension_descriptor {
|
|
uint8_t bLength;
|
|
uint8_t bDescriptorType;
|
|
uint8_t bDevCapabilityType;
|
|
uint32_t bmAttributes;
|
|
} __PACKED;
|
|
|
|
/* Microsoft OS 2.0 Platform Capability Descriptor */
|
|
struct usb_bos_capability_platform_msosv2_descriptor {
|
|
struct usb_bos_capability_platform_descriptor platform_msos;
|
|
struct usb_bos_capability_msosv2_descriptor data_msosv2;
|
|
} __PACKED;
|
|
|
|
/* WebUSB Platform Capability Descriptor */
|
|
struct usb_bos_capability_platform_webusb_descriptor {
|
|
struct usb_bos_capability_platform_descriptor platform_webusb;
|
|
struct usb_bos_capability_webusb_descriptor data_webusb;
|
|
} __PACKED;
|
|
|
|
struct usb_webusb_url_descriptor {
|
|
uint8_t bLength;
|
|
uint8_t bDescriptorType;
|
|
uint8_t bScheme;
|
|
char URL[];
|
|
} __PACKED;
|
|
|
|
struct usb_bos_descriptor {
|
|
uint8_t *string;
|
|
uint16_t string_len;
|
|
};
|
|
|
|
/* USB Device Capability Descriptor */
|
|
struct usb_device_capability_descriptor {
|
|
uint8_t bLength;
|
|
uint8_t bDescriptorType;
|
|
uint8_t bDevCapabilityType;
|
|
} __PACKED;
|
|
|
|
|
|
/* Macro for USB Device Descriptor */
|
|
/* same iSerial problem.
|
|
* https://blog.csdn.net/asmxpl/article/details/21243913
|
|
*/
|
|
#define USB_DEVICE_DESCRIPTOR_INIT(bcdUSB, bDeviceClass, bDeviceSubClass, bDeviceProtocol, idVendor, idProduct, bcdDevice, bNumConfigurations) \
|
|
0x12, /* bLength */ \
|
|
USB_DESC_TYPE_DEVICE, /* bDescriptorType */ \
|
|
WBVAL(bcdUSB), /* bcdUSB */ \
|
|
bDeviceClass, /* bDeviceClass */ \
|
|
bDeviceSubClass, /* bDeviceSubClass */ \
|
|
bDeviceProtocol, /* bDeviceProtocol */ \
|
|
USB_EP0_MPS, /* bMaxPacketSize */ \
|
|
WBVAL(idVendor), /* idVendor */ \
|
|
WBVAL(idProduct), /* idProduct */ \
|
|
WBVAL(bcdDevice), /* bcdDevice */ \
|
|
USB_STRING_MFC_INDEX, /* iManufacturer */ \
|
|
USB_STRING_PRODUCT_INDEX, /* iProduct */ \
|
|
0/*USB_STRING_SERIAL_INDEX*/, /* iSerial */ \
|
|
bNumConfigurations /* bNumConfigurations */
|
|
|
|
/* Macro for USB Configuration Descriptor */
|
|
#define USB_CONFIG_DESCRIPTOR_INIT(wTotalLength, bNumInterfaces, bConfigurationValue, bmAttributes, bMaxPower) \
|
|
0x09, /* bLength */ \
|
|
USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType */ \
|
|
WBVAL(wTotalLength), /* wTotalLength */ \
|
|
bNumInterfaces, /* bNumInterfaces */ \
|
|
bConfigurationValue, /* bConfigurationValue */ \
|
|
0x00, /* iConfiguration */ \
|
|
bmAttributes, /* bmAttributes */ \
|
|
USB_CONFIG_POWER_MA(bMaxPower) /* bMaxPower */
|
|
|
|
/* Macro for USB Interface Descriptor */
|
|
#define USB_INTERFACE_DESCRIPTOR_INIT(bInterfaceNumber, bAlternateSetting, bNumEndpoints, \
|
|
bInterfaceClass, bInterfaceSubClass, bInterfaceProtocol, iInterface) \
|
|
0x09, /* bLength */ \
|
|
USB_DESC_TYPE_INTERFACE, /* bDescriptorType */ \
|
|
bInterfaceNumber, /* bInterfaceNumber */ \
|
|
bAlternateSetting, /* bAlternateSetting */ \
|
|
bNumEndpoints, /* bNumEndpoints */ \
|
|
bInterfaceClass, /* bInterfaceClass */ \
|
|
bInterfaceSubClass, /* bInterfaceSubClass */ \
|
|
bInterfaceProtocol, /* bInterfaceProtocol */ \
|
|
iInterface /* iInterface */
|
|
|
|
/* Macro for USB Endpoint Descriptor */
|
|
#define USB_EP_DESCRIPTOR_INIT(bEndpointAddress, bmAttributes, wMaxPacketSize, bInterval) \
|
|
0x07, /* bLength */ \
|
|
USB_DESC_TYPE_ENDPOINT, /* bDescriptorType */ \
|
|
bEndpointAddress, /* bEndpointAddress */ \
|
|
bmAttributes, /* bmAttributes */ \
|
|
WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \
|
|
bInterval /* bInterval */
|
|
|
|
/* Macro for USB Interface Association Descriptor */
|
|
#define USB_IAD_INIT(bFirstInterface, bInterfaceCount, bFunctionClass, bFunctionSubClass, bFunctionProtocol) \
|
|
0x08, /* bLength */ \
|
|
USB_DESC_TYPE_INTERFACE_ASSOCIATION, /* bDescriptorType */ \
|
|
bFirstInterface, /* bFirstInterface */ \
|
|
bInterfaceCount, /* bInterfaceCount */ \
|
|
bFunctionClass, /* bFunctionClass */ \
|
|
bFunctionSubClass, /* bFunctionSubClass */ \
|
|
bFunctionProtocol, /* bFunctionProtocol */ \
|
|
0x00 /* iFunction */
|
|
|
|
/* Macro for USB LangID Descriptor */
|
|
#define USB_LANGID_INIT(id) \
|
|
0x04, /* bLength */ \
|
|
USB_DESC_TYPE_STRING, /* bDescriptorType */ \
|
|
WBVAL(id) /* wLangID0 */
|
|
|
|
/* Macro for USB Device Qualifier Descriptor(usb2.0) */
|
|
#define USB_QUALIFIER_INIT(bNumConfigurations) \
|
|
0x0A, /* bLength */ \
|
|
USB_DESC_TYPE_DEVICE_QUALIFIER, /* bDescriptorType */ \
|
|
0x00, 0x02, /* bcdUSB */ \
|
|
0x00, /* bDeviceClass */ \
|
|
0x00, /* bDeviceSubClass */ \
|
|
0x00, /* bDeviceProtocol */ \
|
|
USB_EP0_MPS, /* bMaxPacketSize */ \
|
|
bNumConfigurations, /* bNumConfigurations */ \
|
|
0 /* bReserved */
|
|
|
|
|
|
#endif // _USB_DEF_H
|