summaryrefslogtreecommitdiff
path: root/tools/src/usb_types.h
diff options
context:
space:
mode:
Diffstat (limited to 'tools/src/usb_types.h')
-rw-r--r--tools/src/usb_types.h209
1 files changed, 209 insertions, 0 deletions
diff --git a/tools/src/usb_types.h b/tools/src/usb_types.h
new file mode 100644
index 0000000..2571a1a
--- /dev/null
+++ b/tools/src/usb_types.h
@@ -0,0 +1,209 @@
+/* SPDX-License-Identifier: MIT */
+
+#ifndef USB_TYPES_H
+#define USB_TYPES_H
+
+#include "types.h"
+
+#define USB_REQUEST_TYPE_DIRECTION_SHIFT 7
+#define USB_REQUEST_TYPE_DIRECTION(d) ((d) << USB_REQUEST_TYPE_DIRECTION_SHIFT)
+#define USB_REQUEST_TYPE_DIRECTION_HOST2DEVICE 0
+#define USB_REQUEST_TYPE_DIRECTION_DEVICE2HOST 1
+
+#define USB_REQUEST_TYPE_SHIFT 5
+#define USB_REQUEST_TYPE(t) ((t) << USB_REQUEST_TYPE_SHIFT)
+#define USB_REQUEST_TYPE_STANDARD USB_REQUEST_TYPE(0b00)
+#define USB_REQUEST_TYPE_CLASS USB_REQUEST_TYPE(0b01)
+#define USB_REQUEST_TYPE_VENDOR USB_REQUEST_TYPE(0b10)
+#define USB_REQUEST_TYPE_MASK USB_REQUEST_TYPE(0b11)
+
+#define USB_REQUEST_TYPE_RECIPIENT_DEVICE 0
+#define USB_REQUEST_TYPE_RECIPIENT_INTERFACE 1
+#define USB_REQUEST_TYPE_RECIPIENT_ENDPOINT 2
+#define USB_REQUEST_TYPE_RECIPIENT_OTHER 3
+#define USB_REQUEST_TYPE_RECIPIENT_MASK 0b11
+
+#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_EP_REQUEST_CLEAR_FEATURE 0x01
+#define USB_EP_REQUEST_SET_FEATURE 0x03
+
+#define USB_FEATURE_ENDPOINT_HALT 0x00
+
+#define USB_REQUEST_CDC_SET_LINE_CODING 0x20
+#define USB_REQUEST_CDC_GET_LINE_CODING 0x21
+#define USB_REQUEST_CDC_SET_CTRL_LINE_STATE 0x22
+
+struct usb_setup_packet_raw {
+ u8 bmRequestType;
+ u8 bRequest;
+ u16 wValue;
+ u16 wIndex;
+ u16 wLength;
+} PACKED;
+
+struct usb_setup_packet_get_descriptor {
+ u8 bmRequestType;
+ u8 bRequest;
+ u8 index;
+ u8 type;
+ u16 language;
+ u16 wLength;
+} PACKED;
+
+struct usb_set_packet_set_address {
+ u8 bmRequestType;
+ u8 bRequest;
+ u16 address;
+ u16 zero0;
+ u16 zero1;
+} PACKED;
+
+struct usb_set_packet_set_configuration {
+ u8 bmRequestType;
+ u8 bRequest;
+ u16 configuration;
+ u16 zero0;
+ u16 zero1;
+} PACKED;
+
+struct usb_setup_packet_feature {
+ u8 bmRequestType;
+ u8 bRequest;
+ u16 wFeatureSelector;
+ u16 wEndpoint;
+ u16 wLength;
+} PACKED;
+
+union usb_setup_packet {
+ struct usb_setup_packet_raw raw;
+ struct usb_setup_packet_get_descriptor get_descriptor;
+ struct usb_set_packet_set_address set_address;
+ struct usb_set_packet_set_configuration set_configuration;
+ struct usb_setup_packet_feature feature;
+};
+
+#define USB_DEVICE_DESCRIPTOR 0x01
+#define USB_CONFIGURATION_DESCRIPTOR 0x02
+#define USB_STRING_DESCRIPTOR 0x03
+#define USB_INTERFACE_DESCRIPTOR 0x04
+#define USB_ENDPOINT_DESCRIPTOR 0x05
+#define USB_DEVICE_QUALIFIER_DESCRIPTOR 0x06
+#define USB_OTHER_SPEED_CONFIGURATION_DESCRIPTOR 0x07
+
+#define USB_CDC_INTERFACE_FUNCTIONAL_DESCRIPTOR 0x24
+#define USB_CDC_UNION_SUBTYPE 0x06
+
+#define USB_CONFIGURATION_SELF_POWERED 0x40
+#define USB_CONFIGURATION_ATTRIBUTE_RES1 0x80
+
+#define USB_ENDPOINT_ADDR_IN(ep) (0x80 | (ep))
+#define USB_ENDPOINT_ADDR_OUT(ep) (0x00 | (ep))
+
+#define USB_ENDPOINT_ATTR_TYPE_CONTROL 0b00
+#define USB_ENDPOINT_ATTR_TYPE_ISOCHRONOUS 0b01
+#define USB_ENDPOINT_ATTR_TYPE_BULK 0b10
+#define USB_ENDPOINT_ATTR_TYPE_INTERRUPT 0b11
+
+#define USB_LANGID_EN_US 0x0409
+
+struct usb_device_descriptor {
+ u8 bLength;
+ u8 bDescriptorType;
+ u16 bcdUSB;
+ u8 bDeviceClass;
+ u8 bDeviceSubClass;
+ u8 bDeviceProtocol;
+ u8 bMaxPacketSize0;
+ u16 idVendor;
+ u16 idProduct;
+ u16 bcdDevice;
+ u8 iManufacturer;
+ u8 iProduct;
+ u8 iSerialNumber;
+ u8 bNumConfigurations;
+} PACKED;
+
+struct usb_configuration_descriptor {
+ u8 bLength;
+ u8 bDescriptorType;
+ u16 wTotalLength;
+ u8 bNumInterfaces;
+ u8 bConfigurationValue;
+ u8 iConfiguration;
+ u8 bmAttributes;
+ u8 bMaxPower;
+} PACKED;
+
+struct usb_interface_descriptor {
+ u8 bLength;
+ u8 bDescriptorType;
+ u8 bInterfaceNumber;
+ u8 bAlternateSetting;
+ u8 bNumEndpoints;
+ u8 bInterfaceClass;
+ u8 bInterfaceSubClass;
+ u8 bInterfaceProtocol;
+ u8 iInterface;
+} PACKED;
+
+struct usb_endpoint_descriptor {
+ u8 bLength;
+ u8 bDescriptorType;
+ u8 bEndpointAddress;
+ u8 bmAttributes;
+ u16 wMaxPacketSize;
+ u8 bInterval;
+} PACKED;
+
+struct usb_string_descriptor {
+ u8 bLength;
+ u8 bDescriptorType;
+ u16 bString[];
+} PACKED;
+
+struct usb_string_descriptor_languages {
+ u8 bLength;
+ u8 bDescriptorType;
+ u16 wLANGID[];
+} PACKED;
+
+struct cdc_union_functional_descriptor {
+ u8 bFunctionLength;
+ u8 bDescriptorType;
+ u8 bDescriptorSubtype;
+ u8 bControlInterface;
+ u8 bDataInterface;
+} PACKED;
+
+struct usb_device_qualifier_descriptor {
+ u8 bLength;
+ u8 bDescriptorType;
+ u16 bcdUSB;
+ u8 bDeviceClass;
+ u8 bDeviceSubClass;
+ u8 bDeviceProtocol;
+ u8 bMaxPacketSize0;
+ u8 bNumConfigurations;
+ u8 bReserved;
+} PACKED;
+
+/*
+ * this macro is required because we need to convert any string literals
+ * to UTF16 and because we need to calculate the correct total size of the
+ * string descriptor.
+ */
+#define make_usb_string_descriptor(str) \
+ { \
+ .bLength = sizeof(struct usb_string_descriptor) + sizeof(u##str), \
+ .bDescriptorType = USB_STRING_DESCRIPTOR, .bString = u##str \
+ }
+
+#endif