/** * @file usb.h * @brief Common USB (usb:*) service IPC header. * @author SciresM, yellows8 * @copyright libnx Authors */ #pragma once #include "../types.h" /// Names starting with "libusb" were changed to "usb" to avoid collision with actual libusb if it's ever used. /// Imported from libusb with changed names. /* Descriptor sizes per descriptor type */ #define USB_DT_INTERFACE_SIZE 9 #define USB_DT_ENDPOINT_SIZE 7 #define USB_DT_DEVICE_SIZE 0x12 #define USB_DT_SS_ENDPOINT_COMPANION_SIZE 6 #define USB_ENDPOINT_ADDRESS_MASK 0x0f /* in bEndpointAddress */ #define USB_ENDPOINT_DIR_MASK 0x80 #define USB_TRANSFER_TYPE_MASK 0x03 /* in bmAttributes */ /// Imported from libusb, with some adjustments. struct usb_endpoint_descriptor { uint8_t bLength; uint8_t bDescriptorType; ///< Must match USB_DT_ENDPOINT. uint8_t bEndpointAddress; ///< Should be one of the usb_endpoint_direction values, the endpoint-number is automatically allocated. uint8_t bmAttributes; uint16_t wMaxPacketSize; uint8_t bInterval; } PACKED; /// Imported from libusb, with some adjustments. struct usb_interface_descriptor { uint8_t bLength; uint8_t bDescriptorType; ///< Must match USB_DT_INTERFACE. uint8_t bInterfaceNumber; ///< See also USBDS_DEFAULT_InterfaceNumber. uint8_t bAlternateSetting; ///< Must match 0. uint8_t bNumEndpoints; uint8_t bInterfaceClass; uint8_t bInterfaceSubClass; uint8_t bInterfaceProtocol; uint8_t iInterface; ///< Ignored. }; /// Imported from libusb, with some adjustments. struct usb_device_descriptor { uint8_t bLength; uint8_t bDescriptorType; ///< Must match USB_DT_Device. uint16_t bcdUSB; uint8_t bDeviceClass; uint8_t bDeviceSubClass; uint8_t bDeviceProtocol; uint8_t bMaxPacketSize0; uint16_t idVendor; uint16_t idProduct; uint16_t bcdDevice; uint8_t iManufacturer; uint8_t iProduct; uint8_t iSerialNumber; uint8_t bNumConfigurations; }; /// Imported from libusb, with some adjustments. struct usb_config_descriptor { uint8_t bLength; uint8_t bDescriptorType; uint16_t wTotalLength; uint8_t bNumInterfaces; uint8_t bConfigurationValue; uint8_t iConfiguration; uint8_t bmAttributes; uint8_t MaxPower; } PACKED; /// Imported from libusb, with some adjustments. struct usb_ss_endpoint_companion_descriptor { uint8_t bLength; uint8_t bDescriptorType; ///< Must match USB_DT_SS_ENDPOINT_COMPANION. uint8_t bMaxBurst; uint8_t bmAttributes; uint16_t wBytesPerInterval; }; /// Imported from libusb, with some adjustments. struct usb_string_descriptor { uint8_t bLength; uint8_t bDescriptorType; ///< Must match USB_DT_STRING. uint16_t wData[0x40]; }; /// Imported from libusb, with changed names. enum usb_class_code { USB_CLASS_PER_INTERFACE = 0, USB_CLASS_AUDIO = 1, USB_CLASS_COMM = 2, USB_CLASS_HID = 3, USB_CLASS_PHYSICAL = 5, USB_CLASS_PRINTER = 7, USB_CLASS_PTP = 6, /* legacy name from libusb-0.1 usb.h */ USB_CLASS_IMAGE = 6, USB_CLASS_MASS_STORAGE = 8, USB_CLASS_HUB = 9, USB_CLASS_DATA = 10, USB_CLASS_SMART_CARD = 0x0b, USB_CLASS_CONTENT_SECURITY = 0x0d, USB_CLASS_VIDEO = 0x0e, USB_CLASS_PERSONAL_HEALTHCARE = 0x0f, USB_CLASS_DIAGNOSTIC_DEVICE = 0xdc, USB_CLASS_WIRELESS = 0xe0, USB_CLASS_APPLICATION = 0xfe, USB_CLASS_VENDOR_SPEC = 0xff }; /// Imported from libusb, with changed names. enum usb_descriptor_type { USB_DT_DEVICE = 0x01, USB_DT_CONFIG = 0x02, USB_DT_STRING = 0x03, USB_DT_INTERFACE = 0x04, USB_DT_ENDPOINT = 0x05, USB_DT_BOS = 0x0f, USB_DT_DEVICE_CAPABILITY = 0x10, USB_DT_HID = 0x21, USB_DT_REPORT = 0x22, USB_DT_PHYSICAL = 0x23, USB_DT_HUB = 0x29, USB_DT_SUPERSPEED_HUB = 0x2a, USB_DT_SS_ENDPOINT_COMPANION = 0x30 }; /// Imported from libusb, with changed names. enum usb_endpoint_direction { USB_ENDPOINT_IN = 0x80, USB_ENDPOINT_OUT = 0x00 }; /// Imported from libusb, with changed names. enum usb_transfer_type { USB_TRANSFER_TYPE_CONTROL = 0, USB_TRANSFER_TYPE_ISOCHRONOUS = 1, USB_TRANSFER_TYPE_BULK = 2, USB_TRANSFER_TYPE_INTERRUPT = 3, USB_TRANSFER_TYPE_BULK_STREAM = 4, }; /// Imported from libusb, with changed names. enum usb_standard_request { /** Request status of the specific recipient */ USB_REQUEST_GET_STATUS = 0x00, /** Clear or disable a specific feature */ USB_REQUEST_CLEAR_FEATURE = 0x01, /* 0x02 is reserved */ /** Set or enable a specific feature */ USB_REQUEST_SET_FEATURE = 0x03, /* 0x04 is reserved */ /** Set device address for all future accesses */ USB_REQUEST_SET_ADDRESS = 0x05, /** Get the specified descriptor */ USB_REQUEST_GET_DESCRIPTOR = 0x06, /** Used to update existing descriptors or add new descriptors */ USB_REQUEST_SET_DESCRIPTOR = 0x07, /** Get the current device configuration value */ USB_REQUEST_GET_CONFIGURATION = 0x08, /** Set device configuration */ USB_REQUEST_SET_CONFIGURATION = 0x09, /** Return the selected alternate setting for the specified interface */ USB_REQUEST_GET_INTERFACE = 0x0A, /** Select an alternate interface for the specified interface */ USB_REQUEST_SET_INTERFACE = 0x0B, /** Set then report an endpoint's synchronization frame */ USB_REQUEST_SYNCH_FRAME = 0x0C, /** Sets both the U1 and U2 Exit Latency */ USB_REQUEST_SET_SEL = 0x30, /** Delay from the time a host transmits a packet to the time it is * received by the device. */ USB_SET_ISOCH_DELAY = 0x31, }; /// Imported from libusb, with changed names. enum usb_iso_sync_type { USB_ISO_SYNC_TYPE_NONE = 0, USB_ISO_SYNC_TYPE_ASYNC = 1, USB_ISO_SYNC_TYPE_ADAPTIVE = 2, USB_ISO_SYNC_TYPE_SYNC = 3 }; /// Imported from libusb, with changed names. enum usb_iso_usage_type { USB_ISO_USAGE_TYPE_DATA = 0, USB_ISO_USAGE_TYPE_FEEDBACK = 1, USB_ISO_USAGE_TYPE_IMPLICIT = 2, }; /// USB Device States, per USB 2.0 spec typedef enum { UsbState_Detached = 0, ///< Device is not attached to USB. UsbState_Attached = 1, ///< Device is attached, but is not powered. UsbState_Powered = 2, ///< Device is attached and powered, but has not been reset. UsbState_Default = 3, ///< Device is attached, powered, and has been reset, but does not have an address. UsbState_Address = 4, ///< Device is attached, powered, has been reset, has an address, but is not configured. UsbState_Configured = 5, ///< Device is attached, powered, has been reset, has an address, configured, and may be used. UsbState_Suspended = 6, ///< Device is attached and powered, but has not seen bus activity for 3ms. Device is suspended and cannot be used. } UsbState;