blob: f2a448f9891601dad16ccef6d4808d1e022b8e49 [file] [log] [blame]
#ifndef __LINUX_USB_CH9_H
#define __LINUX_USB_CH9_H
/**
* @file usb_ch9.h
* @brief This file holds USB constants and structures that are needed for USB
* device APIs. These are used by the USB device model, which is defined
* in chapter 9 of the USB 2.0 specification. Linux has several APIs in C
* that need these:
*
* - the master/host side Linux-USB kernel driver API;
* - the "usbfs" user space API; and
* - the Linux "gadget" slave/device/peripheral side driver API.
*
* USB 2.0 adds an additional "On The Go" (OTG) mode, which lets systems
* act either as a USB master/host or as a USB slave/device. That means
* the master and slave side APIs benefit from working well together.
*
* There's also "Wireless USB", using low power short range radios for
* peripheral interconnection but otherwise building on the USB framework.
*
* @addtogroup usb_core
*/
/*@{*/
//#include <stdint.h>
/*******************************************************
* CONTROL REQUEST SUPPORT
********************************************************/
/// USB directions, to device
/// This bit flag is used in endpoint descriptors' bEndpointAddress field.
/// It's also one of three fields in control requests bRequestType.
#define USB_DIR_OUT 0
/// USB directions, to host
/// This bit flag is used in endpoint descriptors' bEndpointAddress field.
/// It's also one of three fields in control requests bRequestType.
#define USB_DIR_IN 0x80
/// USB types, the second of three bRequestType fields
#define USB_TYPE_MASK (0x03 << 5)
/// USB types, the second of three bRequestType fields
#define USB_TYPE_STANDARD (0x00 << 5)
/// USB types, the second of three bRequestType fields
#define USB_TYPE_CLASS (0x01 << 5)
/// USB types, the second of three bRequestType fields
#define USB_TYPE_VENDOR (0x02 << 5)
/// USB types, the second of three bRequestType fields
#define USB_TYPE_RESERVED (0x03 << 5)
/// USB recipients, the third of three bRequestType fields
#define USB_RECIP_MASK 0x1f
/// USB recipients, the third of three bRequestType fields
#define USB_RECIP_DEVICE 0x00
/// USB recipients, the third of three bRequestType fields
#define USB_RECIP_INTERFACE 0x01
/// USB recipients, the third of three bRequestType fields
#define USB_RECIP_ENDPOINT 0x02
/// USB recipients, the third of three bRequestType fields
#define USB_RECIP_OTHER 0x03
/*
* Standard requests, for the bRequest field of a SETUP packet.
*
* These are qualified by the bRequestType field, so that for example
* TYPE_CLASS or TYPE_VENDOR specific feature flags could be retrieved
* by a GET_STATUS request.
*/
#define USB_REQ_GET_STATUS 0x00
#define USB_REQ_CLEAR_FEATURE 0x01
#define USB_REQ_SET_FEATURE 0x03
#define USB_REQ_SET_ADDRESS 0x05
#define USB_REQ_GET_DESCRIPTOR 0x06
#define USB_REQ_SET_DESCRIPTOR 0x07
#define USB_REQ_GET_CONFIGURATION 0x08
#define USB_REQ_SET_CONFIGURATION 0x09
#define USB_REQ_GET_INTERFACE 0x0A
#define USB_REQ_SET_INTERFACE 0x0B
#define USB_REQ_SYNCH_FRAME 0x0C
/// Wireless USB
#define USB_REQ_SET_ENCRYPTION 0x0D/
#define USB_REQ_GET_ENCRYPTION 0x0E
#define USB_REQ_SET_HANDSHAKE 0x0F
#define USB_REQ_GET_HANDSHAKE 0x10
#define USB_REQ_SET_CONNECTION 0x11
#define USB_REQ_SET_SECURITY_DATA 0x12
#define USB_REQ_GET_SECURITY_DATA 0x13
#define USB_REQ_SET_WUSB_DATA 0x14
#define USB_REQ_LOOPBACK_DATA_WRITE 0x15
#define USB_REQ_LOOPBACK_DATA_READ 0x16
#define USB_REQ_SET_INTERFACE_DS 0x17
/*
* USB feature flags are written using USB_REQ_{CLEAR,SET}_FEATURE, and
* are read as a bit array returned by USB_REQ_GET_STATUS. (So there
* are at most sixteen features of each type.)
*/
/// (read only)
#define USB_DEVICE_SELF_POWERED 0
/// dev may initiate wakeup
#define USB_DEVICE_REMOTE_WAKEUP 1
/// (wired high speed only)
#define USB_DEVICE_TEST_MODE 2
/// (wireless)
#define USB_DEVICE_BATTERY 2
/// (otg) dev may initiate HNP
#define USB_DEVICE_B_HNP_ENABLE 3
/// (wireless
#define USB_DEVICE_WUSB_DEVICE 3
/// (otg) RH port supports HNP
#define USB_DEVICE_A_HNP_SUPPORT 4
/// (otg) other RH port does
#define USB_DEVICE_A_ALT_HNP_SUPPORT 5
/// (special devices only)
#define USB_DEVICE_DEBUG_MODE 6
/// IN/OUT will STALL
#define USB_ENDPOINT_HALT 0
#define USB_SETUP_PACKET_SIZE 8
/**
* SETUP data for a USB device control request
*
* This structure is used to send control requests to a USB device. It matches
* the different fields of the USB 2.0 Spec section 9.3, table 9-2. See the
* USB spec for a fuller description of the different fields, and what they are
* used for.
*
* Note that the driver for any interface can issue control requests.
* For most devices, interfaces don't coordinate with each other, so
* such requests may be made at any time.
*/
struct usb_ctrlrequest {
/// matches the USB bmRequestType field
__u8 bRequestType;
/// matches the USB bRequest field
__u8 bRequest;
/// matches the USB wValue field (le16 byte order)
__u16 wValue;
/// matches the USB wIndex field (le16 byte order)
__u16 wIndex;
/// matches the USB wLength field (le16 byte order)
__u16 wLength;
} __attribute__ ((packed));
typedef struct usb_ctrlrequest usb_ctrlrequest_t;
/*
* STANDARD DESCRIPTORS ... as returned by GET_DESCRIPTOR, or
* (rarely) accepted by SET_DESCRIPTOR.
*
* Note that all multi-byte values here are encoded in little endian
* byte order "on the wire". But when exposed through Linux-USB APIs,
* they've been converted to cpu byte order.
*/
/*
* Descriptor types ... USB 2.0 spec table 9.5
*/
#define USB_DT_DEVICE 0x01
#define USB_DT_CONFIG 0x02
#define USB_DT_STRING 0x03
#define USB_DT_INTERFACE 0x04
#define USB_DT_ENDPOINT 0x05
#define USB_DT_DEVICE_QUALIFIER 0x06
#define USB_DT_OTHER_SPEED_CONFIG 0x07
#define USB_DT_INTERFACE_POWER 0x08
/* these are from a minor usb 2.0 revision (ECN) */
#define USB_DT_OTG 0x09
#define USB_DT_DEBUG 0x0a
#define USB_DT_INTERFACE_ASSOCIATION 0x0b
/* these are from the Wireless USB spec */
#define USB_DT_SECURITY 0x0c
#define USB_DT_KEY 0x0d
#define USB_DT_ENCRYPTION_TYPE 0x0e
#define USB_DT_BOS 0x0f
#define USB_DT_DEVICE_CAPABILITY 0x10
#define USB_DT_WIRELESS_ENDPOINT_COMP 0x11
/// conventional codes for class-specific descriptors
#define USB_DT_CS_DEVICE 0x21
/// conventional codes for class-specific descriptors
#define USB_DT_CS_CONFIG 0x22
/// conventional codes for class-specific descriptors
#define USB_DT_CS_STRING 0x23
/// conventional codes for class-specific descriptors
#define USB_DT_CS_INTERFACE 0x24
/// conventional codes for class-specific descriptors
#define USB_DT_CS_ENDPOINT 0x25
/** All standard descriptors have these 2 fields at the beginning */
struct usb_descriptor_header {
__u8 bLength;
__u8 bDescriptorType;
} __attribute__ ((packed));
typedef struct usb_descriptor_header usb_descriptor_header_t;
/** USB_DT_DEVICE: Device descriptor */
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;
} __attribute__ ((packed));
typedef struct usb_device_descriptor usb_device_descriptor_t;
#define USB_DT_DEVICE_SIZE 18
/*
* Device and/or Interface Class codes
* as found in bDeviceClass or bInterfaceClass
* and defined by www.usb.org documents
*/
/// for DeviceClass
#define USB_CLASS_PER_INTERFACE 0
#define USB_CLASS_AUDIO 1
#define USB_CLASS_COMM 2
#define USB_CLASS_HID 3
#define USB_CLASS_PHYSICAL 5
#define USB_CLASS_STILL_IMAGE 6
#define USB_CLASS_PRINTER 7
#define USB_CLASS_MASS_STORAGE 8
#define USB_CLASS_HUB 9
#define USB_CLASS_CDC_DATA 0x0a
/// chip+ smart card
#define USB_CLASS_CSCID 0x0b
/// content security
#define USB_CLASS_CONTENT_SEC 0x0d
#define USB_CLASS_VIDEO 0x0e
#define USB_CLASS_WIRELESS_CONTROLLER 0xe0
#define USB_CLASS_MISC 0xef
#define USB_CLASS_APP_SPEC 0xfe
#define USB_CLASS_VENDOR_SPEC 0xff
/**
* USB_DT_CONFIG: Configuration descriptor information.
*
* USB_DT_OTHER_SPEED_CONFIG is the same descriptor, except that the
* descriptor type is different. Highspeed-capable devices can look
* different depending on what speed they're currently running. Only
* devices with a USB_DT_DEVICE_QUALIFIER have any OTHER_SPEED_CONFIG
* descriptors.
*/
struct usb_config_descriptor {
__u8 bLength;
__u8 bDescriptorType;
__u16 wTotalLength;
__u8 bNumInterfaces;
__u8 bConfigurationValue;
__u8 iConfiguration;
__u8 bmAttributes;
__u8 bMaxPower;
struct usb_interface *interface;
/// Extra descriptors
unsigned char *extra;
int extralen;
} __attribute__ ((packed));
typedef struct usb_config_descriptor usb_config_descriptor_t;
#define USB_DT_CONFIG_SIZE 9
/* from config descriptor bmAttributes */
/// from config descriptor bmAttributes: must be set
#define USB_CONFIG_ATT_ONE (1 << 7)
/// from config descriptor bmAttributes: self powered
#define USB_CONFIG_ATT_SELFPOWER (1 << 6)
/// from config descriptor bmAttributes: can wakeup
#define USB_CONFIG_ATT_WAKEUP (1 << 5)
/// from config descriptor bmAttributes: battery powered
#define USB_CONFIG_ATT_BATTERY (1 << 4)
/** USB_DT_STRING: String descriptor */
struct usb_string_descriptor {
__u8 bLength;
__u8 bDescriptorType;
/// UTF-16LE encoded
__u16 wData[1];
} __attribute__ ((packed));
typedef struct usb_string_descriptor usb_string_descriptor_t;
/*
* note that "string" zero is special, it holds language codes that
* the device supports, not Unicode characters.
*/
/** USB_DT_INTERFACE: Interface descriptor */
struct usb_interface_descriptor {
__u8 bLength;
__u8 bDescriptorType;
__u8 bInterfaceNumber;
__u8 bAlternateSetting;
__u8 bNumEndpoints;
__u8 bInterfaceClass;
__u8 bInterfaceSubClass;
__u8 bInterfaceProtocol;
__u8 iInterface;
struct usb_endpoint_descriptor *endpoint;
/// Extra descriptors
unsigned char *extra;
int extralen;
} __attribute__ ((packed));
typedef struct usb_interface_descriptor usb_interface_descriptor_t;
#if 0
typedef struct usb_interface {
struct usb_interface_descriptor *altsetting;
int act_altsetting; /* active alternate setting */
int num_altsetting; /* number of alternate settings */
int max_altsetting; /* total memory allocated */
void *private_data;
} usb_interface_t;
#endif
#define USB_DT_INTERFACE_SIZE 9
/** USB_DT_ENDPOINT: Endpoint descriptor */
struct usb_endpoint_descriptor {
__u8 bLength;
__u8 bDescriptorType;
__u8 bEndpointAddress;
__u8 bmAttributes;
__u16 wMaxPacketSize;
__u8 bInterval;
/// NOTE: these two are _only_ in audio endpoints.
/// use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof.
__u8 bRefresh;
__u8 bSynchAddress;
/// Extra descriptors
unsigned char *extra;
int extralen;
} __attribute__ ((packed));
typedef struct usb_endpoint_descriptor usb_endpoint_descriptor_t;
#define USB_DT_ENDPOINT_SIZE 7
/// Audio extension
#define USB_DT_ENDPOINT_AUDIO_SIZE 9
/*
* Endpoints Macro
*/
/// in bEndpointAddress
#define USB_ENDPOINT_NUMBER_MASK 0x0f
#define USB_ENDPOINT_DIR_MASK 0x80
/// in bmAttributes
#define USB_ENDPOINT_XFERTYPE_MASK 0x03
#define USB_ENDPOINT_XFER_CONTROL 0
#define USB_ENDPOINT_XFER_ISOC 1
#define USB_ENDPOINT_XFER_BULK 2
#define USB_ENDPOINT_XFER_INT 3
#define USB_ENDPOINT_MAX_ADJUSTABLE 0x80
/** USB_DT_DEVICE_QUALIFIER: Device Qualifier descriptor */
struct usb_qualifier_descriptor {
__u8 bLength;
__u8 bDescriptorType;
__le16 bcdUSB;
__u8 bDeviceClass;
__u8 bDeviceSubClass;
__u8 bDeviceProtocol;
__u8 bMaxPacketSize0;
__u8 bNumConfigurations;
__u8 bRESERVED;
} __attribute__ ((packed));
/** USB_DT_OTG (from OTG 1.0a supplement) */
struct usb_otg_descriptor {
__u8 bLength;
__u8 bDescriptorType;
/// support for HNP, SRP, etc
__u8 bmAttributes;
} __attribute__ ((packed));
/// from usb_otg_descriptor.bmAttributes
#define USB_OTG_SRP (1 << 0)
/// swap host/device roles
#define USB_OTG_HNP (1 << 1)
/** USB_DT_DEBUG: for special highspeed devices, replacing serial console */
struct usb_debug_descriptor {
__u8 bLength;
__u8 bDescriptorType;
/// bulk endpoints with 8 byte maxpacket
__u8 bDebugInEndpoint;
__u8 bDebugOutEndpoint;
};
/** USB_DT_INTERFACE_ASSOCIATION: groups interfaces */
struct usb_interface_assoc_descriptor {
__u8 bLength;
__u8 bDescriptorType;
__u8 bFirstInterface;
__u8 bInterfaceCount;
__u8 bFunctionClass;
__u8 bFunctionSubClass;
__u8 bFunctionProtocol;
__u8 iFunction;
};
/**
* USB_DT_SECURITY: group of wireless security descriptors, including
* encryption types available for setting up a CC/association.
*/
struct usb_security_descriptor {
__u8 bLength;
__u8 bDescriptorType;
__le16 wTotalLength;
__u8 bNumEncryptionTypes;
};
/**
* USB_DT_KEY: used with {GET,SET}_SECURITY_DATA; only public keys
* may be retrieved.
*/
struct usb_key_descriptor {
__u8 bLength;
__u8 bDescriptorType;
__u8 tTKID[3];
__u8 bReserved;
__u8 bKeyData[0];
};
/** USB_DT_ENCRYPTION_TYPE: bundled in DT_SECURITY groups */
struct usb_encryption_descriptor {
__u8 bLength;
__u8 bDescriptorType;
__u8 bEncryptionType;
#define USB_ENC_TYPE_UNSECURE 0
/// non-wireless mode
#define USB_ENC_TYPE_WIRED 1
/// aes128/cbc session
#define USB_ENC_TYPE_CCM_1 2
/// rsa3072/sha1 auth
#define USB_ENC_TYPE_RSA_1 3
/// use in SET_ENCRYPTION
__u8 bEncryptionValue;
__u8 bAuthKeyIndex;
};
/** USB_DT_BOS: group of wireless capabilities */
struct usb_bos_descriptor {
__u8 bLength;
__u8 bDescriptorType;
__le16 wTotalLength;
__u8 bNumDeviceCaps;
};
/** USB_DT_DEVICE_CAPABILITY: grouped with BOS */
struct usb_dev_cap_header {
__u8 bLength;
__u8 bDescriptorType;
__u8 bDevCapabilityType;
};
#define USB_CAP_TYPE_WIRELESS_USB 1
/** Ultra Wide Band */
struct usb_wireless_cap_descriptor {
__u8 bLength;
__u8 bDescriptorType;
__u8 bDevCapabilityType;
__u8 bmAttributes;
#define USB_WIRELESS_P2P_DRD (1 << 1)
#define USB_WIRELESS_BEACON_MASK (3 << 2)
#define USB_WIRELESS_BEACON_SELF (1 << 2)
#define USB_WIRELESS_BEACON_DIRECTED (2 << 2)
#define USB_WIRELESS_BEACON_NONE (3 << 2)
/// bit rates, Mbps
__le16 wPHYRates;
/// always set
#define USB_WIRELESS_PHY_53 (1 << 0)
#define USB_WIRELESS_PHY_80 (1 << 1)
/// always set
#define USB_WIRELESS_PHY_107 (1 << 2)
#define USB_WIRELESS_PHY_160 (1 << 3)
/// always set
#define USB_WIRELESS_PHY_200 (1 << 4)
#define USB_WIRELESS_PHY_320 (1 << 5)
#define USB_WIRELESS_PHY_400 (1 << 6)
#define USB_WIRELESS_PHY_480 (1 << 7)
/// TFI power levels
__u8 bmTFITXPowerInfo;
/// FFI power levels
__u8 bmFFITXPowerInfo;
__le16 bmBandGroup;
__u8 bReserved;
};
/**
* USB_DT_WIRELESS_ENDPOINT_COMP: companion descriptor associated with
* each endpoint descriptor for a wireless device
*/
struct usb_wireless_ep_comp_descriptor {
__u8 bLength;
__u8 bDescriptorType;
__u8 bMaxBurst;
__u8 bMaxSequence;
__le16 wMaxStreamDelay;
__le16 wOverTheAirPacketSize;
__u8 bOverTheAirInterval;
__u8 bmCompAttributes;
/// in bmCompAttributes
#define USB_ENDPOINT_SWITCH_MASK 0x03
#define USB_ENDPOINT_SWITCH_NO 0
#define USB_ENDPOINT_SWITCH_SWITCH 1
#define USB_ENDPOINT_SWITCH_SCALE 2
};
/**
* USB_REQ_SET_HANDSHAKE is a four-way handshake used between a wireless
* host and a device for connection set up, mutual authentication, and
* exchanging short lived session keys. The handshake depends on a CC.
*/
struct usb_handshake {
__u8 bMessageNumber;
__u8 bStatus;
__u8 tTKID[3];
__u8 bReserved;
__u8 CDID[16];
__u8 nonce[16];
__u8 MIC[8];
};
/**
* USB_REQ_SET_CONNECTION modifies or revokes a connection context (CC).
* A CC may also be set up using non-wireless secure channels (including
* wired USB!), and some devices may support CCs with multiple hosts.
*/
struct usb_connection_context {
/// persistent host id
__u8 CHID[16];
/// device id (unique w/in host context)
__u8 CDID[16];
/// connection key
__u8 CK[16];
};
/** USB 2.0 defines three speeds, here's how Linux identifies them */
enum usb_device_speed {
USB_SPEED_UNKNOWN = 0, /** enumerating */
USB_SPEED_LOW, USB_SPEED_FULL, /** usb 1.1 */
USB_SPEED_HIGH, /** usb 2.0 */
USB_SPEED_VARIABLE, /** wireless (usb 2.5) */
};
/**
* USB device state
*/
enum usb_device_state {
/** NOTATTACHED isn't in the USB spec, and this state acts
* the same as ATTACHED ... but it's clearer this way.
*/
USB_STATE_NOTATTACHED = 0,
/** the chapter 9 device states */
USB_STATE_ATTACHED,
USB_STATE_POWERED,
USB_STATE_DEFAULT, /** limited function */
USB_STATE_ADDRESS,
USB_STATE_CONFIGURED, /** most functions */
USB_STATE_SUSPENDED /** Note: there are actually four different SUSPENDED
states, returning to POWERED, DEFAULT, ADDRESS, or
CONFIGURED respectively when SOF tokens flow again.
*/
};
/*@}*/
#endif /* __LINUX_USB_CH9_H */