mirror of
https://github.com/sakumisu/CherryUSB.git
synced 2025-05-08 07:59:31 +08:00
522 lines
22 KiB
C
522 lines
22 KiB
C
#ifndef USB_REQUEST_H
|
|
#define USB_REQUEST_H
|
|
|
|
/* Useful define */
|
|
#define USB_1_1 0x0110
|
|
#define USB_2_0 0x0200
|
|
/* Set USB version to 2.1 so that the host will request the BOS descriptor */
|
|
#define USB_2_1 0x0210
|
|
|
|
// USB Speed
|
|
#define USB_SPEED_LOW 0U
|
|
#define USB_SPEED_FULL 1U
|
|
#define USB_SPEED_HIGH 2U
|
|
|
|
// USB PID Types
|
|
#define USB_PID_RESERVED 0U
|
|
#define USB_PID_OUT 1U
|
|
#define USB_PID_ACK 2U
|
|
#define USB_PID_DATA0 3U
|
|
#define USB_PID_PING 4U
|
|
#define USB_PID_SOF 5U
|
|
#define USB_PID_DATA2 7U
|
|
#define USB_PID_NYET 6U
|
|
#define USB_PID_SPLIT 8U
|
|
#define USB_PID_IN 9U
|
|
#define USB_PID_NAK 10U
|
|
#define USB_PID_DATA1 11U
|
|
#define USB_PID_PRE 12U
|
|
#define USB_PID_ERR 12U
|
|
#define USB_PID_SETUP 13U
|
|
#define USB_PID_STALL 14U
|
|
#define USB_PID_MDATA 15U
|
|
|
|
// bmRequestType.Dir
|
|
#define USB_REQUEST_HOST_TO_DEVICE 0U
|
|
#define USB_REQUEST_DEVICE_TO_HOST 1U
|
|
|
|
// bmRequestType.Type
|
|
#define USB_REQUEST_STANDARD 0U
|
|
#define USB_REQUEST_CLASS 1U
|
|
#define USB_REQUEST_VENDOR 2U
|
|
#define USB_REQUEST_RESERVED 3U
|
|
|
|
// bmRequestType.Recipient
|
|
#define USB_REQUEST_TO_DEVICE 0U
|
|
#define USB_REQUEST_TO_INTERFACE 1U
|
|
#define USB_REQUEST_TO_ENDPOINT 2U
|
|
#define USB_REQUEST_TO_OTHER 3U
|
|
|
|
/* 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 GET_STATUS Bit Values */
|
|
#define USB_GETSTATUS_SELF_POWERED 0x01
|
|
#define USB_GETSTATUS_REMOTE_WAKEUP 0x02
|
|
#define USB_GETSTATUS_ENDPOINT_STALL 0x01
|
|
|
|
/* USB Standard Feature selectors */
|
|
#define USB_FEATURE_ENDPOINT_STALL 0
|
|
#define USB_FEATURE_REMOTE_WAKEUP 1
|
|
#define USB_FEATURE_TEST_MODE 2
|
|
|
|
/* Descriptor size in bytes */
|
|
#define USB_DEVICE_DESC_SIZE 0x12
|
|
#define USB_CONFIGURATION_DESC_SIZE 0x09
|
|
#define USB_INTERFACE_DESC_SIZE 0x09
|
|
#define USB_ENDPOINT_DESC_SIZE 0x07
|
|
#define USB_LANGID_STRING_DESC_SIZE 0x04
|
|
#define USB_OTHER_SPEED_DESC_SIZE 0x09
|
|
#define USB_DEVICE_QUAL_DESC_SIZE 0x0A
|
|
#define USB_INTERFACE_ASSOC_DESC_SIZE 0x08
|
|
#define USB_FUNCTION_DESC_SIZE 0x03
|
|
#define USB_OTG_DESC_SIZE 0x03
|
|
|
|
/* USB Descriptor Types */
|
|
#define USB_DESCRIPTOR_TYPE_DEVICE 0x01U
|
|
#define USB_DESCRIPTOR_TYPE_CONFIGURATION 0x02U
|
|
#define USB_DESCRIPTOR_TYPE_STRING 0x03U
|
|
#define USB_DESCRIPTOR_TYPE_INTERFACE 0x04U
|
|
#define USB_DESCRIPTOR_TYPE_ENDPOINT 0x05U
|
|
#define USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER 0x06U
|
|
#define USB_DESCRIPTOR_TYPE_OTHER_SPEED 0x07U
|
|
#define USB_DESCRIPTOR_TYPE_INTERFACE_POWER 0x08U
|
|
#define USB_DESCRIPTOR_TYPE_OTG 0x09U
|
|
#define USB_DESCRIPTOR_TYPE_DEBUG 0x0AU
|
|
#define USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION 0x0BU
|
|
#define USB_DESCRIPTOR_TYPE_BINARY_OBJECT_STORE 0x0FU
|
|
#define USB_DESCRIPTOR_TYPE_DEVICE_CAPABILITY 0x10U
|
|
|
|
#define USB_DESCRIPTOR_TYPE_FUNCTIONAL 0x21U
|
|
|
|
// Class Specific Descriptor
|
|
#define USB_CS_DESCRIPTOR_TYPE_DEVICE 0x21U
|
|
#define USB_CS_DESCRIPTOR_TYPE_CONFIGURATION 0x22U
|
|
#define USB_CS_DESCRIPTOR_TYPE_STRING 0x23U
|
|
#define USB_CS_DESCRIPTOR_TYPE_INTERFACE 0x24U
|
|
#define USB_CS_DESCRIPTOR_TYPE_ENDPOINT 0x25U
|
|
|
|
#define USB_DESCRIPTOR_TYPE_SUPERSPEED_ENDPOINT_COMPANION 0x30U
|
|
#define USB_DESCRIPTOR_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_POWERED_MASK 0x40
|
|
#define USB_CONFIG_BUS_POWERED 0x80
|
|
#define USB_CONFIG_SELF_POWERED 0xC0
|
|
#define USB_CONFIG_REMOTE_WAKEUP 0x20
|
|
|
|
/* bMaxPower in Configuration Descriptor */
|
|
#define USB_CONFIG_POWER_MA(mA) ((mA) / 2)
|
|
|
|
/* bEndpointAddress in Endpoint Descriptor */
|
|
#define USB_ENDPOINT_DIRECTION_MASK 0x80
|
|
#define USB_ENDPOINT_OUT(addr) ((addr) | 0x00)
|
|
#define USB_ENDPOINT_IN(addr) ((addr) | 0x80)
|
|
|
|
/* bmAttributes in Endpoint Descriptor */
|
|
#define USB_ENDPOINT_TYPE_MASK 0x03
|
|
#define USB_ENDPOINT_TYPE_CONTROL 0x00
|
|
#define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01
|
|
#define USB_ENDPOINT_TYPE_BULK 0x02
|
|
#define USB_ENDPOINT_TYPE_INTERRUPT 0x03
|
|
#define USB_ENDPOINT_SYNC_MASK 0x0C
|
|
#define USB_ENDPOINT_SYNC_NO_SYNCHRONIZATION 0x00
|
|
#define USB_ENDPOINT_SYNC_ASYNCHRONOUS 0x04
|
|
#define USB_ENDPOINT_SYNC_ADAPTIVE 0x08
|
|
#define USB_ENDPOINT_SYNC_SYNCHRONOUS 0x0C
|
|
#define USB_ENDPOINT_USAGE_MASK 0x30
|
|
#define USB_ENDPOINT_USAGE_DATA 0x00
|
|
#define USB_ENDPOINT_USAGE_FEEDBACK 0x10
|
|
#define USB_ENDPOINT_USAGE_IMPLICIT_FEEDBACK 0x20
|
|
#define USB_ENDPOINT_USAGE_RESERVED 0x30
|
|
|
|
/* bDevCapabilityType in Device Capability Descriptor */
|
|
#define USB_DEVICE_CAPABILITY_WIRELESS_USB 1
|
|
#define USB_DEVICE_CAPABILITY_USB_2_0_EXTENSION 2
|
|
#define USB_DEVICE_CAPABILITY_SUPERSPEED_USB 3
|
|
#define USB_DEVICE_CAPABILITY_CONTAINER_ID 4
|
|
#define USB_DEVICE_CAPABILITY_PLATFORM 5
|
|
#define USB_DEVICE_CAPABILITY_POWER_DELIVERY_CAPABILITY 6
|
|
#define USB_DEVICE_CAPABILITY_BATTERY_INFO_CAPABILITY 7
|
|
#define USB_DEVICE_CAPABILITY_PD_CONSUMER_PORT_CAPABILITY 8
|
|
#define USB_DEVICE_CAPABILITY_PD_PROVIDER_PORT_CAPABILITY 9
|
|
#define USB_DEVICE_CAPABILITY_SUPERSPEED_PLUS 10
|
|
#define USB_DEVICE_CAPABILITY_PRECISION_TIME_MEASUREMENT 11
|
|
#define USB_DEVICE_CAPABILITY_WIRELESS_USB_EXT 12
|
|
|
|
#define USB_BOS_CAPABILITY_EXTENSION 0x02
|
|
#define USB_BOS_CAPABILITY_PLATFORM 0x05
|
|
|
|
/* Setup packet definition used to read raw data from USB line */
|
|
struct usb_setup_packet {
|
|
__packed union {
|
|
uint8_t bmRequestType; /* bmRequestType */
|
|
struct
|
|
{
|
|
uint8_t Recipient : 5; /* D4..0: Recipient */
|
|
uint8_t Type : 2; /* D6..5: Type */
|
|
uint8_t Dir : 1; /* D7: Data Phase Txsfer Direction */
|
|
} bmRequestType_b;
|
|
};
|
|
uint8_t bRequest;
|
|
__packed union {
|
|
uint16_t wValue; /* wValue */
|
|
struct
|
|
{
|
|
uint8_t wValueL;
|
|
uint8_t wValueH;
|
|
};
|
|
};
|
|
__packed union {
|
|
uint16_t wIndex; /* wIndex */
|
|
struct
|
|
{
|
|
uint8_t wIndexL;
|
|
uint8_t wIndexH;
|
|
};
|
|
};
|
|
uint16_t wLength;
|
|
} __packed;
|
|
|
|
/** 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;
|
|
|
|
/** 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;
|
|
|
|
/** 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;
|
|
|
|
/** 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;
|
|
|
|
/** 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;
|
|
|
|
/** Unicode (UTF16LE) String Descriptor */
|
|
struct usb_string_descriptor {
|
|
uint8_t bLength;
|
|
uint8_t bDescriptorType;
|
|
uint16_t bString;
|
|
} __packed;
|
|
|
|
/* 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;
|
|
|
|
/* 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_property_create(x) \
|
|
struct usb_msosv1_comp_id_property { \
|
|
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_property_header_descriptor {
|
|
uint32_t dwLength;
|
|
uint16_t bcdVersion;
|
|
uint16_t wIndex;
|
|
uint8_t bCount;
|
|
} __packed;
|
|
|
|
/* WinUSB Microsoft OS 2.0 descriptor set header */
|
|
struct winusb_header_descriptor {
|
|
uint16_t wLength;
|
|
uint16_t wDescriptorType;
|
|
uint32_t dwWindowsVersion;
|
|
uint16_t wDescriptorSetTotalLength;
|
|
} __packed;
|
|
|
|
/* WinUSB Microsoft OS 2.0 subset function descriptor */
|
|
struct winusb_subset_function_descriptor {
|
|
uint16_t wLength;
|
|
uint16_t wDescriptorType;
|
|
uint8_t bFirstInterface;
|
|
uint8_t bReserved;
|
|
uint16_t wSubsetLength;
|
|
} __packed;
|
|
|
|
/* MS OS 2.0 Function Section */
|
|
struct usb_msosv2_comp_id_function_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_proerty_descriptor {
|
|
uint16_t wLength;
|
|
uint16_t wDescriptorType;
|
|
uint32_t dwPropertyDataType;
|
|
uint16_t wPropertyNameLength;
|
|
const char *bPropertyName;
|
|
uint32_t dwPropertyDataLength;
|
|
const char *bPropertyData;
|
|
};
|
|
|
|
struct usb_msosv2_descriptor {
|
|
uint8_t *compat_id;
|
|
uint16_t compat_id_len;
|
|
};
|
|
|
|
/* BOS Descriptor */
|
|
struct usb_bos_header_descriptor {
|
|
uint8_t bLength;
|
|
uint8_t bDescriptorType;
|
|
uint16_t wTotalLength;
|
|
uint8_t bNumDeviceCaps;
|
|
} __packed;
|
|
|
|
/* BOS Capability Descriptor */
|
|
struct usb_bos_capability_descriptor {
|
|
uint8_t bLength;
|
|
uint8_t bDescriptorType;
|
|
uint8_t bDevCapabilityType;
|
|
uint8_t bReserved;
|
|
uint8_t PlatformCapabilityUUID[16];
|
|
} __packed;
|
|
|
|
struct usb_bos_capability_lpm {
|
|
uint8_t bLength;
|
|
uint8_t bDescriptorType;
|
|
uint8_t bDevCapabilityType;
|
|
uint32_t bmAttributes;
|
|
} __packed;
|
|
|
|
struct usb_bos_descriptor {
|
|
uint8_t *bos_id;
|
|
uint8_t bos_id_len;
|
|
};
|
|
|
|
/* USB Device Capability Descriptor */
|
|
struct usb_device_capability__descriptor {
|
|
uint8_t bLength;
|
|
uint8_t bDescriptorType;
|
|
uint8_t bDevCapabilityType;
|
|
} __packed;
|
|
|
|
/** USB descriptor header */
|
|
struct usb_desc_header {
|
|
uint8_t bLength; /**< descriptor length */
|
|
uint8_t bDescriptorType; /**< descriptor type */
|
|
};
|
|
|
|
#define USB_DEVICE_DESCRIPTOR_INIT(bcdUSB, bDeviceClass, bDeviceSubClass, bDeviceProtocol, idVendor, idProduct, bcdDevice, bNumConfigurations) \
|
|
0x12, /* bLength */ \
|
|
USB_DESCRIPTOR_TYPE_DEVICE, /* bDescriptorType */ \
|
|
WBVAL(bcdUSB), /* bcdUSB */ \
|
|
bDeviceClass, /* bDeviceClass */ \
|
|
bDeviceSubClass, /* bDeviceSubClass */ \
|
|
bDeviceProtocol, /* bDeviceProtocol */ \
|
|
0x40, /* bMaxPacketSize */ \
|
|
WBVAL(idVendor), /* idVendor */ \
|
|
WBVAL(idProduct), /* idProduct */ \
|
|
WBVAL(bcdDevice), /* bcdDevice */ \
|
|
USB_STRING_MFC_INDEX, /* iManufacturer */ \
|
|
USB_STRING_PRODUCT_INDEX, /* iProduct */ \
|
|
USB_STRING_SERIAL_INDEX, /* iSerial */ \
|
|
bNumConfigurations /* bNumConfigurations */
|
|
|
|
#define USB_CONFIG_DESCRIPTOR_INIT(wTotalLength, bNumInterfaces, bConfigurationValue, bmAttributes, bMaxPower) \
|
|
0x09, /* bLength */ \
|
|
USB_DESCRIPTOR_TYPE_CONFIGURATION, /* bDescriptorType */ \
|
|
WBVAL(wTotalLength), /* wTotalLength */ \
|
|
bNumInterfaces, /* bNumInterfaces */ \
|
|
bConfigurationValue, /* bConfigurationValue */ \
|
|
0x00, /* iConfiguration */ \
|
|
bmAttributes, /* bmAttributes */ \
|
|
USB_CONFIG_POWER_MA(bMaxPower) /* bMaxPower */
|
|
|
|
#define USB_INTERFACE_DESCRIPTOR_INIT(bInterfaceNumber, bAlternateSetting, bNumEndpoints, \
|
|
bInterfaceClass, bInterfaceSubClass, bInterfaceProtocol, iInterface) \
|
|
0x09, /* bLength */ \
|
|
USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \
|
|
bInterfaceNumber, /* bInterfaceNumber */ \
|
|
bAlternateSetting, /* bAlternateSetting */ \
|
|
bNumEndpoints, /* bNumEndpoints */ \
|
|
bInterfaceClass, /* bInterfaceClass */ \
|
|
bInterfaceSubClass, /* bInterfaceSubClass */ \
|
|
bInterfaceProtocol, /* bInterfaceProtocol */ \
|
|
iInterface /* iInterface */
|
|
|
|
#define USB_ENDPOINT_DESCRIPTOR_INIT(bEndpointAddress, bmAttributes, wMaxPacketSize, bInterval) \
|
|
0x07, /* bLength */ \
|
|
USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \
|
|
bEndpointAddress, /* bEndpointAddress */ \
|
|
bmAttributes, /* bmAttributes */ \
|
|
WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \
|
|
bInterval /* bInterval */
|
|
|
|
#define USB_IAD_INIT(bFirstInterface, bInterfaceCount, bFunctionClass, bFunctionSubClass, bFunctionProtocol) \
|
|
0x08, /* bLength */ \
|
|
USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION, /* bDescriptorType */ \
|
|
bFirstInterface, /* bFirstInterface */ \
|
|
bInterfaceCount, /* bInterfaceCount */ \
|
|
bFunctionClass, /* bFunctionClass */ \
|
|
bFunctionSubClass, /* bFunctionSubClass */ \
|
|
bFunctionProtocol, /* bFunctionProtocol */ \
|
|
0x00 /* iFunction */
|
|
|
|
#define USB_LANGID_INIT(id) \
|
|
0x04, /* bLength */ \
|
|
USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ \
|
|
WBVAL(id) /* wLangID0 */
|
|
|
|
#endif |