diff options
Diffstat (limited to 'tools/src/usb_types.h')
| -rw-r--r-- | tools/src/usb_types.h | 209 |
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 |
