385 lines
11 KiB
C
385 lines
11 KiB
C
|
/*
|
||
|
* 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
|
||
|
* - (eventually) a Linux "gadget" slave/device 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 will benefit from working well together.
|
||
|
*/
|
||
|
|
||
|
#ifndef __LINUX_USB_CH9_H
|
||
|
#define __LINUX_USB_CH9_H
|
||
|
|
||
|
#include <asm/types.h> /* __u8 etc */
|
||
|
|
||
|
/*-------------------------------------------------------------------------*/
|
||
|
|
||
|
/* CONTROL REQUEST SUPPORT */
|
||
|
|
||
|
/*
|
||
|
* USB directions
|
||
|
*
|
||
|
* 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 /* to device */
|
||
|
#define USB_DIR_IN 0x80 /* to host */
|
||
|
|
||
|
/*
|
||
|
* USB types, the second of three bRequestType fields
|
||
|
*/
|
||
|
#define USB_TYPE_MASK (0x03 << 5)
|
||
|
#define USB_TYPE_STANDARD (0x00 << 5)
|
||
|
#define USB_TYPE_CLASS (0x01 << 5)
|
||
|
#define USB_TYPE_VENDOR (0x02 << 5)
|
||
|
#define USB_TYPE_RESERVED (0x03 << 5)
|
||
|
|
||
|
/*
|
||
|
* USB recipients, the third of three bRequestType fields
|
||
|
*/
|
||
|
#define USB_RECIP_MASK 0x1f
|
||
|
#define USB_RECIP_DEVICE 0x00
|
||
|
#define USB_RECIP_INTERFACE 0x01
|
||
|
#define USB_RECIP_ENDPOINT 0x02
|
||
|
#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
|
||
|
|
||
|
/*
|
||
|
* 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.)
|
||
|
*/
|
||
|
#define USB_DEVICE_SELF_POWERED 0 /* (read only) */
|
||
|
#define USB_DEVICE_REMOTE_WAKEUP 1 /* dev may initiate wakeup */
|
||
|
#define USB_DEVICE_TEST_MODE 2 /* (high speed only) */
|
||
|
#define USB_DEVICE_B_HNP_ENABLE 3 /* dev may initiate HNP */
|
||
|
#define USB_DEVICE_A_HNP_SUPPORT 4 /* RH port supports HNP */
|
||
|
#define USB_DEVICE_A_ALT_HNP_SUPPORT 5 /* other RH port does */
|
||
|
#define USB_DEVICE_DEBUG_MODE 6 /* (special devices only) */
|
||
|
|
||
|
#define USB_ENDPOINT_HALT 0 /* IN/OUT will STALL */
|
||
|
|
||
|
|
||
|
/**
|
||
|
* struct usb_ctrlrequest - SETUP data for a USB device control request
|
||
|
* @bRequestType: matches the USB bmRequestType field
|
||
|
* @bRequest: matches the USB bRequest field
|
||
|
* @wValue: matches the USB wValue field (le16 byte order)
|
||
|
* @wIndex: matches the USB wIndex field (le16 byte order)
|
||
|
* @wLength: matches the USB wLength field (le16 byte order)
|
||
|
*
|
||
|
* 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 {
|
||
|
__u8 bRequestType;
|
||
|
__u8 bRequest;
|
||
|
__le16 wValue;
|
||
|
__le16 wIndex;
|
||
|
__le16 wLength;
|
||
|
} __attribute__ ((packed));
|
||
|
|
||
|
/*-------------------------------------------------------------------------*/
|
||
|
|
||
|
/*
|
||
|
* 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
|
||
|
|
||
|
/* conventional codes for class-specific descriptors */
|
||
|
#define USB_DT_CS_DEVICE 0x21
|
||
|
#define USB_DT_CS_CONFIG 0x22
|
||
|
#define USB_DT_CS_STRING 0x23
|
||
|
#define USB_DT_CS_INTERFACE 0x24
|
||
|
#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));
|
||
|
|
||
|
|
||
|
/*-------------------------------------------------------------------------*/
|
||
|
|
||
|
/* USB_DT_DEVICE: Device descriptor */
|
||
|
struct usb_device_descriptor {
|
||
|
__u8 bLength;
|
||
|
__u8 bDescriptorType;
|
||
|
|
||
|
__le16 bcdUSB;
|
||
|
__u8 bDeviceClass;
|
||
|
__u8 bDeviceSubClass;
|
||
|
__u8 bDeviceProtocol;
|
||
|
__u8 bMaxPacketSize0;
|
||
|
__le16 idVendor;
|
||
|
__le16 idProduct;
|
||
|
__le16 bcdDevice;
|
||
|
__u8 iManufacturer;
|
||
|
__u8 iProduct;
|
||
|
__u8 iSerialNumber;
|
||
|
__u8 bNumConfigurations;
|
||
|
} __attribute__ ((packed));
|
||
|
|
||
|
#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
|
||
|
*/
|
||
|
#define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */
|
||
|
#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
|
||
|
#define USB_CLASS_CSCID 0x0b /* chip+ smart card */
|
||
|
#define USB_CLASS_CONTENT_SEC 0x0d /* content security */
|
||
|
#define USB_CLASS_VIDEO 0x0e
|
||
|
#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;
|
||
|
|
||
|
__le16 wTotalLength;
|
||
|
__u8 bNumInterfaces;
|
||
|
__u8 bConfigurationValue;
|
||
|
__u8 iConfiguration;
|
||
|
__u8 bmAttributes;
|
||
|
__u8 bMaxPower;
|
||
|
} __attribute__ ((packed));
|
||
|
|
||
|
#define USB_DT_CONFIG_SIZE 9
|
||
|
|
||
|
/* from config descriptor bmAttributes */
|
||
|
#define USB_CONFIG_ATT_ONE (1 << 7) /* must be set */
|
||
|
#define USB_CONFIG_ATT_SELFPOWER (1 << 6) /* self powered */
|
||
|
#define USB_CONFIG_ATT_WAKEUP (1 << 5) /* can wakeup */
|
||
|
|
||
|
/*-------------------------------------------------------------------------*/
|
||
|
|
||
|
/* USB_DT_STRING: String descriptor */
|
||
|
struct usb_string_descriptor {
|
||
|
__u8 bLength;
|
||
|
__u8 bDescriptorType;
|
||
|
|
||
|
__le16 wData[1]; /* UTF-16LE encoded */
|
||
|
} __attribute__ ((packed));
|
||
|
|
||
|
/* 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;
|
||
|
} __attribute__ ((packed));
|
||
|
|
||
|
#define USB_DT_INTERFACE_SIZE 9
|
||
|
|
||
|
/*-------------------------------------------------------------------------*/
|
||
|
|
||
|
/* USB_DT_ENDPOINT: Endpoint descriptor */
|
||
|
struct usb_endpoint_descriptor {
|
||
|
__u8 bLength;
|
||
|
__u8 bDescriptorType;
|
||
|
|
||
|
__u8 bEndpointAddress;
|
||
|
__u8 bmAttributes;
|
||
|
__le16 wMaxPacketSize;
|
||
|
__u8 bInterval;
|
||
|
|
||
|
// NOTE: these two are _only_ in audio endpoints.
|
||
|
// use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof.
|
||
|
__u8 bRefresh;
|
||
|
__u8 bSynchAddress;
|
||
|
} __attribute__ ((packed));
|
||
|
|
||
|
#define USB_DT_ENDPOINT_SIZE 7
|
||
|
#define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Endpoints
|
||
|
*/
|
||
|
#define USB_ENDPOINT_NUMBER_MASK 0x0f /* in bEndpointAddress */
|
||
|
#define USB_ENDPOINT_DIR_MASK 0x80
|
||
|
|
||
|
#define USB_ENDPOINT_XFERTYPE_MASK 0x03 /* in bmAttributes */
|
||
|
#define USB_ENDPOINT_XFER_CONTROL 0
|
||
|
#define USB_ENDPOINT_XFER_ISOC 1
|
||
|
#define USB_ENDPOINT_XFER_BULK 2
|
||
|
#define USB_ENDPOINT_XFER_INT 3
|
||
|
|
||
|
|
||
|
/*-------------------------------------------------------------------------*/
|
||
|
|
||
|
/* 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;
|
||
|
|
||
|
__u8 bmAttributes; /* support for HNP, SRP, etc */
|
||
|
} __attribute__ ((packed));
|
||
|
|
||
|
/* from usb_otg_descriptor.bmAttributes */
|
||
|
#define USB_OTG_SRP (1 << 0)
|
||
|
#define USB_OTG_HNP (1 << 1) /* swap host/device roles */
|
||
|
|
||
|
/*-------------------------------------------------------------------------*/
|
||
|
|
||
|
/* 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;
|
||
|
} __attribute__ ((packed));
|
||
|
|
||
|
|
||
|
/*-------------------------------------------------------------------------*/
|
||
|
|
||
|
/* 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 */
|
||
|
};
|
||
|
|
||
|
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 */
|