usb.h revision 188878
11573Srgrimes/* $FreeBSD: head/sys/dev/usb2/include/usb2_standard.h 188878 2009-02-21 01:14:49Z thompsa $ */
21573Srgrimes/*-
31573Srgrimes * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
41573Srgrimes * Copyright (c) 1998 The NetBSD Foundation, Inc. All rights reserved.
51573Srgrimes * Copyright (c) 1998 Lennart Augustsson. All rights reserved.
61573Srgrimes *
71573Srgrimes * Redistribution and use in source and binary forms, with or without
8235785Stheraven * modification, are permitted provided that the following conditions
9235785Stheraven * are met:
10235785Stheraven * 1. Redistributions of source code must retain the above copyright
11235785Stheraven *    notice, this list of conditions and the following disclaimer.
12235785Stheraven * 2. Redistributions in binary form must reproduce the above copyright
131573Srgrimes *    notice, this list of conditions and the following disclaimer in the
141573Srgrimes *    documentation and/or other materials provided with the distribution.
151573Srgrimes *
161573Srgrimes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
171573Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
181573Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
191573Srgrimes * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
201573Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
211573Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
221573Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
231573Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
241573Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
251573Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
261573Srgrimes * SUCH DAMAGE.
271573Srgrimes */
281573Srgrimes
291573Srgrimes/*
301573Srgrimes * This file contains standard definitions for the following USB
311573Srgrimes * protocol versions:
321573Srgrimes *
331573Srgrimes * USB v1.0
341573Srgrimes * USB v1.1
351573Srgrimes * USB v2.0
361573Srgrimes * USB v3.0
371573Srgrimes */
381573Srgrimes
391573Srgrimes#ifndef _USB2_STANDARD_H_
401573Srgrimes#define	_USB2_STANDARD_H_
4192986Sobrien
4292986Sobrien#include <dev/usb2/include/usb2_endian.h>
431573Srgrimes
441573Srgrimes/*
451573Srgrimes * Minimum time a device needs to be powered down to go through a
461573Srgrimes * power cycle. These values are not in the USB specification.
471573Srgrimes */
481573Srgrimes#define	USB_POWER_DOWN_TIME	200	/* ms */
491573Srgrimes#define	USB_PORT_POWER_DOWN_TIME	100	/* ms */
5071579Sdeischen
511573Srgrimes/* Definition of software USB power modes */
521573Srgrimes#define	USB_POWER_MODE_OFF 0		/* turn off device */
5387113Sfenner#define	USB_POWER_MODE_ON 1		/* always on */
541573Srgrimes#define	USB_POWER_MODE_SAVE 2		/* automatic suspend and resume */
5587490Sphantom#define	USB_POWER_MODE_SUSPEND 3	/* force suspend */
5687113Sfenner#define	USB_POWER_MODE_RESUME 4		/* force resume */
5787113Sfenner
581573Srgrimes#if 0
591573Srgrimes/* These are the values from the USB specification. */
601573Srgrimes#define	USB_PORT_RESET_DELAY	10	/* ms */
61103633Stjr#define	USB_PORT_ROOT_RESET_DELAY 50	/* ms */
62153486Sphk#define	USB_PORT_RESET_RECOVERY	10	/* ms */
631573Srgrimes#define	USB_PORT_POWERUP_DELAY	100	/* ms */
641573Srgrimes#define	USB_PORT_RESUME_DELAY	20	/* ms */
65235785Stheraven#define	USB_SET_ADDRESS_SETTLE	2	/* ms */
6671579Sdeischen#define	USB_RESUME_DELAY	(20*5)	/* ms */
671573Srgrimes#define	USB_RESUME_WAIT		10	/* ms */
6871579Sdeischen#define	USB_RESUME_RECOVERY	10	/* ms */
691573Srgrimes#define	USB_EXTRA_POWER_UP_TIME	0	/* ms */
701573Srgrimes#else
71180104Sdas/* Allow for marginal and non-conforming devices. */
721573Srgrimes#define	USB_PORT_RESET_DELAY	50	/* ms */
73235785Stheraven#define	USB_PORT_ROOT_RESET_DELAY 250	/* ms */
74235785Stheraven#define	USB_PORT_RESET_RECOVERY	250	/* ms */
75187369Sdas#define	USB_PORT_POWERUP_DELAY	300	/* ms */
76103633Stjr#define	USB_PORT_RESUME_DELAY	(20*2)	/* ms */
7716586Sjraynard#define	USB_SET_ADDRESS_SETTLE	10	/* ms */
78187277Sdas#define	USB_RESUME_DELAY	(50*5)	/* ms */
79187277Sdas#define	USB_RESUME_WAIT		50	/* ms */
80187277Sdas#define	USB_RESUME_RECOVERY	50	/* ms */
81187582Sdas#define	USB_EXTRA_POWER_UP_TIME	20	/* ms */
82187582Sdas#endif
83187582Sdas
84187582Sdas#define	USB_MIN_POWER		100	/* mA */
85187582Sdas#define	USB_MAX_POWER		500	/* mA */
86187582Sdas
87187582Sdas#define	USB_BUS_RESET_DELAY	100	/* ms */
88187582Sdas
89187582Sdas/*
901573Srgrimes * USB record layout in memory:
91187582Sdas *
92187582Sdas * - USB config 0
93187582Sdas *   - USB interfaces
94187582Sdas *     - USB alternative interfaces
95187582Sdas *       - USB pipes
96235785Stheraven *
97187582Sdas * - USB config 1
98187582Sdas *   - USB interfaces
99187582Sdas *     - USB alternative interfaces
100235785Stheraven *       - USB pipes
101187582Sdas */
102187582Sdas
103187582Sdas/* Declaration of USB records */
104187582Sdas
105187582Sdasstruct usb2_device_request {
106187582Sdas	uByte	bmRequestType;
107187582Sdas	uByte	bRequest;
108187582Sdas	uWord	wValue;
109187582Sdas	uWord	wIndex;
110187582Sdas	uWord	wLength;
111187582Sdas} __packed;
112187582Sdastypedef struct usb2_device_request usb_device_request_t;
113187582Sdas
114187582Sdas#define	UT_WRITE		0x00
115187582Sdas#define	UT_READ			0x80
116187582Sdas#define	UT_STANDARD		0x00
117187582Sdas#define	UT_CLASS		0x20
118187582Sdas#define	UT_VENDOR		0x40
119187582Sdas#define	UT_DEVICE		0x00
120187582Sdas#define	UT_INTERFACE		0x01
121187582Sdas#define	UT_ENDPOINT		0x02
122187582Sdas#define	UT_OTHER		0x03
123187582Sdas
124187582Sdas#define	UT_READ_DEVICE		(UT_READ  | UT_STANDARD | UT_DEVICE)
125235785Stheraven#define	UT_READ_INTERFACE	(UT_READ  | UT_STANDARD | UT_INTERFACE)
126187582Sdas#define	UT_READ_ENDPOINT	(UT_READ  | UT_STANDARD | UT_ENDPOINT)
127187582Sdas#define	UT_WRITE_DEVICE		(UT_WRITE | UT_STANDARD | UT_DEVICE)
128187582Sdas#define	UT_WRITE_INTERFACE	(UT_WRITE | UT_STANDARD | UT_INTERFACE)
129235785Stheraven#define	UT_WRITE_ENDPOINT	(UT_WRITE | UT_STANDARD | UT_ENDPOINT)
130187582Sdas#define	UT_READ_CLASS_DEVICE	(UT_READ  | UT_CLASS | UT_DEVICE)
131187582Sdas#define	UT_READ_CLASS_INTERFACE	(UT_READ  | UT_CLASS | UT_INTERFACE)
132187582Sdas#define	UT_READ_CLASS_OTHER	(UT_READ  | UT_CLASS | UT_OTHER)
133187582Sdas#define	UT_READ_CLASS_ENDPOINT	(UT_READ  | UT_CLASS | UT_ENDPOINT)
134187582Sdas#define	UT_WRITE_CLASS_DEVICE	(UT_WRITE | UT_CLASS | UT_DEVICE)
135187582Sdas#define	UT_WRITE_CLASS_INTERFACE (UT_WRITE | UT_CLASS | UT_INTERFACE)
136187582Sdas#define	UT_WRITE_CLASS_OTHER	(UT_WRITE | UT_CLASS | UT_OTHER)
137187582Sdas#define	UT_WRITE_CLASS_ENDPOINT	(UT_WRITE | UT_CLASS | UT_ENDPOINT)
138187582Sdas#define	UT_READ_VENDOR_DEVICE	(UT_READ  | UT_VENDOR | UT_DEVICE)
139235785Stheraven#define	UT_READ_VENDOR_INTERFACE (UT_READ  | UT_VENDOR | UT_INTERFACE)
140187582Sdas#define	UT_READ_VENDOR_OTHER	(UT_READ  | UT_VENDOR | UT_OTHER)
141235785Stheraven#define	UT_READ_VENDOR_ENDPOINT	(UT_READ  | UT_VENDOR | UT_ENDPOINT)
142187582Sdas#define	UT_WRITE_VENDOR_DEVICE	(UT_WRITE | UT_VENDOR | UT_DEVICE)
143187582Sdas#define	UT_WRITE_VENDOR_INTERFACE (UT_WRITE | UT_VENDOR | UT_INTERFACE)
144187582Sdas#define	UT_WRITE_VENDOR_OTHER	(UT_WRITE | UT_VENDOR | UT_OTHER)
145187582Sdas#define	UT_WRITE_VENDOR_ENDPOINT (UT_WRITE | UT_VENDOR | UT_ENDPOINT)
146187582Sdas
147187582Sdas/* Requests */
148187582Sdas#define	UR_GET_STATUS		0x00
149187582Sdas#define	UR_CLEAR_FEATURE	0x01
150187582Sdas#define	UR_SET_FEATURE		0x03
1511573Srgrimes#define	UR_SET_ADDRESS		0x05
1521573Srgrimes#define	UR_GET_DESCRIPTOR	0x06
1531573Srgrimes#define	UDESC_DEVICE		0x01
1541573Srgrimes#define	UDESC_CONFIG		0x02
155235785Stheraven#define	UDESC_STRING		0x03
1561573Srgrimes#define	USB_LANGUAGE_TABLE	0x00	/* language ID string index */
15771579Sdeischen#define	UDESC_INTERFACE		0x04
1581573Srgrimes#define	UDESC_ENDPOINT		0x05
1591573Srgrimes#define	UDESC_DEVICE_QUALIFIER	0x06
1601573Srgrimes#define	UDESC_OTHER_SPEED_CONFIGURATION 0x07
1611573Srgrimes#define	UDESC_INTERFACE_POWER	0x08
1621573Srgrimes#define	UDESC_OTG		0x09
1631573Srgrimes#define	UDESC_DEBUG		0x0A
1641573Srgrimes#define	UDESC_IFACE_ASSOC	0x0B	/* interface association */
1651573Srgrimes#define	UDESC_BOS		0x0F	/* binary object store */
1661573Srgrimes#define	UDESC_DEVICE_CAPABILITY	0x10
1671573Srgrimes#define	UDESC_CS_DEVICE		0x21	/* class specific */
1681573Srgrimes#define	UDESC_CS_CONFIG		0x22
1691573Srgrimes#define	UDESC_CS_STRING		0x23
1701573Srgrimes#define	UDESC_CS_INTERFACE	0x24
1711573Srgrimes#define	UDESC_CS_ENDPOINT	0x25
1721573Srgrimes#define	UDESC_HUB		0x29
1731573Srgrimes#define	UDESC_ENDPOINT_SS_COMP	0x30	/* super speed */
1741573Srgrimes#define	UR_SET_DESCRIPTOR	0x07
175235785Stheraven#define	UR_GET_CONFIG		0x08
1761573Srgrimes#define	UR_SET_CONFIG		0x09
1771573Srgrimes#define	UR_GET_INTERFACE	0x0a
178205021Sjhb#define	UR_SET_INTERFACE	0x0b
1791573Srgrimes#define	UR_SYNCH_FRAME		0x0c
1801573Srgrimes#define	UR_SET_SEL		0x30
181187369Sdas#define	UR_ISOCH_DELAY		0x31
182187369Sdas
183187369Sdas/* HUB specific request */
184187369Sdas#define	UR_GET_BUS_STATE	0x02
1851573Srgrimes#define	UR_CLEAR_TT_BUFFER	0x08
1861573Srgrimes#define	UR_RESET_TT		0x09
1871573Srgrimes#define	UR_GET_TT_STATE		0x0a
1881573Srgrimes#define	UR_STOP_TT		0x0b
1891573Srgrimes#define	UR_SET_HUB_DEPTH	0x0c
190178287Sjhb#define	UR_GET_PORT_ERR_COUNT	0x0d
191178287Sjhb
1921573Srgrimes/* Feature numbers */
1931573Srgrimes#define	UF_ENDPOINT_HALT	0
1941573Srgrimes#define	UF_DEVICE_REMOTE_WAKEUP	1
1951573Srgrimes#define	UF_TEST_MODE		2
1961573Srgrimes#define	UF_U1_ENABLE		0x30
1971573Srgrimes#define	UF_U2_ENABLE		0x31
1981573Srgrimes#define	UF_LTM_ENABLE		0x32
199235785Stheraven
20071579Sdeischen/* HUB specific features */
2011573Srgrimes#define	UHF_C_HUB_LOCAL_POWER	0
2021573Srgrimes#define	UHF_C_HUB_OVER_CURRENT	1
2031573Srgrimes#define	UHF_PORT_CONNECTION	0
2041573Srgrimes#define	UHF_PORT_ENABLE		1
2051573Srgrimes#define	UHF_PORT_SUSPEND	2
2061573Srgrimes#define	UHF_PORT_OVER_CURRENT	3
2071573Srgrimes#define	UHF_PORT_RESET		4
208103633Stjr#define	UHF_PORT_LINK_STATE	5
209148363Stjr#define	UHF_PORT_POWER		8
210148363Stjr#define	UHF_PORT_LOW_SPEED	9
211148363Stjr#define	UHF_C_PORT_CONNECTION	16
212103633Stjr#define	UHF_C_PORT_ENABLE	17
213103633Stjr#define	UHF_C_PORT_SUSPEND	18
214103633Stjr#define	UHF_C_PORT_OVER_CURRENT	19
215103633Stjr#define	UHF_C_PORT_RESET	20
216128002Stjr#define	UHF_PORT_TEST		21
217128002Stjr#define	UHF_PORT_INDICATOR	22
218103633Stjr
219103633Stjr/* SuperSpeed HUB specific features */
220148363Stjr#define	UHF_PORT_U1_TIMEOUT	23
221103633Stjr#define	UHF_PORT_U2_TIMEOUT	24
222103633Stjr#define	UHF_C_PORT_LINK_STATE	25
223148363Stjr#define	UHF_C_PORT_CONFIG_ERROR	26
224148363Stjr#define	UHF_PORT_REMOTE_WAKE_MASK	27
225103633Stjr#define	UHF_BH_PORT_RESET	28
226128002Stjr#define	UHF_C_BH_PORT_RESET	29
227128002Stjr#define	UHF_FORCE_LINKPM_ACCEPT	30
228103633Stjr
229103633Stjrstruct usb2_descriptor {
230148363Stjr	uByte	bLength;
231148363Stjr	uByte	bDescriptorType;
232148363Stjr	uByte	bDescriptorSubtype;
233148363Stjr} __packed;
234148363Stjrtypedef struct usb2_descriptor usb_descriptor_t;
235148363Stjr
236148363Stjrstruct usb2_device_descriptor {
237148363Stjr	uByte	bLength;
238148363Stjr	uByte	bDescriptorType;
239148363Stjr	uWord	bcdUSB;
240148363Stjr#define	UD_USB_2_0		0x0200
241148363Stjr#define	UD_USB_3_0		0x0300
242148363Stjr#define	UD_IS_USB2(d) ((d)->bcdUSB[1] == 0x02)
243148363Stjr#define	UD_IS_USB3(d) ((d)->bcdUSB[1] == 0x03)
244148363Stjr	uByte	bDeviceClass;
245148363Stjr	uByte	bDeviceSubClass;
246148363Stjr	uByte	bDeviceProtocol;
247148363Stjr	uByte	bMaxPacketSize;
248148363Stjr	/* The fields below are not part of the initial descriptor. */
249148363Stjr	uWord	idVendor;
250103633Stjr	uWord	idProduct;
251103633Stjr	uWord	bcdDevice;
252103633Stjr	uByte	iManufacturer;
253103633Stjr	uByte	iProduct;
254148363Stjr	uByte	iSerialNumber;
255103633Stjr	uByte	bNumConfigurations;
256128002Stjr} __packed;
257148363Stjrtypedef struct usb2_device_descriptor usb_device_descriptor_t;
258148363Stjr
259113196Sache/* Binary Device Object Store (BOS) */
260113196Sachestruct usb2_bos_descriptor {
261113196Sache	uByte	bLength;
262148363Stjr	uByte	bDescriptorType;
263103633Stjr	uWord	wTotalLength;
264103633Stjr	uByte	bNumDeviceCaps;
265103633Stjr} __packed;
266103633Stjrtypedef struct usb2_bos_descriptor usb_bos_descriptor_t;
26771579Sdeischen
26871579Sdeischen/* Binary Device Object Store Capability */
26971579Sdeischenstruct usb2_bos_cap_descriptor {
270235785Stheraven	uByte	bLength;
271235785Stheraven	uByte	bDescriptorType;
27271579Sdeischen	uByte	bDevCapabilityType;
27371579Sdeischen#define	USB_DEVCAP_RESERVED	0x00
274235785Stheraven#define	USB_DEVCAP_WUSB		0x01
27571579Sdeischen#define	USB_DEVCAP_USB2EXT	0x02
27671579Sdeischen#define	USB_DEVCAP_SUPER_SPEED	0x03
277187369Sdas#define	USB_DEVCAP_CONTAINER_ID	0x04
278187369Sdas	/* data ... */
279187369Sdas} __packed;
280235785Stheraventypedef struct usb2_bos_cap_descriptor usb_bos_cap_descriptor_t;
281187369Sdas
282235785Stheravenstruct usb2_devcap_usb2ext_descriptor {
28371579Sdeischen	uByte	bLength;
28471579Sdeischen	uByte	bDescriptorType;
28571579Sdeischen	uByte	bDevCapabilityType;
286235785Stheraven	uByte	bmAttributes;
287235785Stheraven#define	USB_V2EXT_LPM 0x02
288235785Stheraven} __packed;
289235785Stheraventypedef struct usb2_devcap_usb2ext_descriptor usb_devcap_usb2ext_descriptor_t;
290235785Stheraven
29171579Sdeischenstruct usb2_devcap_ss_descriptor {
292113142Sdas	uByte	bLength;
293113142Sdas	uByte	bDescriptorType;
294187582Sdas	uByte	bDevCapabilityType;
295187582Sdas	uByte	bmAttributes;
296113142Sdas	uWord	wSpeedsSupported;
297187582Sdas	uByte	bFunctionaltySupport;
298187582Sdas	uByte	bU1DevExitLat;
299187582Sdas	uByte	bU2DevExitLat;
300187582Sdas} __packed;
301187582Sdastypedef struct usb2_devcap_ss_descriptor usb_devcap_ss_descriptor_t;
3021573Srgrimes
3031573Srgrimesstruct usb2_devcap_container_id_descriptor {
30471579Sdeischen	uByte	bLength;
30571579Sdeischen	uByte	bDescriptorType;
3061573Srgrimes	uByte	bDevCapabilityType;
307235785Stheraven	uByte	bReserved;
3081573Srgrimes	uByte	ContainerID;
30971579Sdeischen} __packed;
31071579Sdeischentypedef struct usb2_devcap_container_id_descriptor
31171579Sdeischen		usb_devcap_container_id_descriptor_t;
31271579Sdeischen
31371579Sdeischen/* Device class codes */
3141573Srgrimes#define	UDCLASS_IN_INTERFACE	0x00
3151573Srgrimes#define	UDCLASS_COMM		0x02
316113146Sdas#define	UDCLASS_HUB		0x09
3171573Srgrimes#define	UDSUBCLASS_HUB		0x00
318187582Sdas#define	UDPROTO_FSHUB		0x00
319187277Sdas#define	UDPROTO_HSHUBSTT	0x01
320128819Sdas#define	UDPROTO_HSHUBMTT	0x02
321113146Sdas#define	UDCLASS_DIAGNOSTIC	0xdc
322113146Sdas#define	UDCLASS_WIRELESS	0xe0
323113146Sdas#define	UDSUBCLASS_RF		0x01
324113146Sdas#define	UDPROTO_BLUETOOTH	0x01
325113146Sdas#define	UDCLASS_VENDOR		0xff
326113146Sdas
327113146Sdasstruct usb2_config_descriptor {
328113146Sdas	uByte	bLength;
329113146Sdas	uByte	bDescriptorType;
330113146Sdas	uWord	wTotalLength;
331113146Sdas	uByte	bNumInterface;
332113146Sdas	uByte	bConfigurationValue;
333113146Sdas#define	USB_UNCONFIG_NO 0
334113146Sdas	uByte	iConfiguration;
33587490Sphantom	uByte	bmAttributes;
336187421Sdas#define	UC_BUS_POWERED		0x80
337113146Sdas#define	UC_SELF_POWERED		0x40
338113146Sdas#define	UC_REMOTE_WAKEUP	0x20
339113146Sdas	uByte	bMaxPower;		/* max current in 2 mA units */
340113146Sdas#define	UC_POWER_FACTOR 2
341113146Sdas} __packed;
3421573Srgrimestypedef struct usb2_config_descriptor usb_config_descriptor_t;
343113146Sdas
344113146Sdasstruct usb2_interface_descriptor {
3451573Srgrimes	uByte	bLength;
346113146Sdas	uByte	bDescriptorType;
347113146Sdas	uByte	bInterfaceNumber;
34872523Stegge	uByte	bAlternateSetting;
3491573Srgrimes	uByte	bNumEndpoints;
3501573Srgrimes	uByte	bInterfaceClass;
35187113Sfenner	uByte	bInterfaceSubClass;
3521573Srgrimes	uByte	bInterfaceProtocol;
3531573Srgrimes	uByte	iInterface;
35414727Sfenner} __packed;
3551573Srgrimestypedef struct usb2_interface_descriptor usb_interface_descriptor_t;
35631983Sache
357113146Sdasstruct usb2_interface_assoc_descriptor {
358187277Sdas	uByte	bLength;
359113142Sdas	uByte	bDescriptorType;
360113146Sdas	uByte	bFirstInterface;
361103399Stjr	uByte	bInterfaceCount;
362103399Stjr	uByte	bFunctionClass;
363103399Stjr	uByte	bFunctionSubClass;
364103399Stjr	uByte	bFunctionProtocol;
365103633Stjr	uByte	iFunction;
3661573Srgrimes} __packed;
367165742Sdastypedef struct usb2_interface_assoc_descriptor usb_interface_assoc_descriptor_t;
368165742Sdas
369113146Sdas/* Interface class codes */
370187277Sdas#define	UICLASS_UNSPEC		0x00
3711573Srgrimes#define	UICLASS_AUDIO		0x01	/* audio */
372235785Stheraven#define	UISUBCLASS_AUDIOCONTROL	1
373187277Sdas#define	UISUBCLASS_AUDIOSTREAM		2
3741573Srgrimes#define	UISUBCLASS_MIDISTREAM		3
3751573Srgrimes
376235785Stheraven#define	UICLASS_CDC		0x02	/* communication */
377187277Sdas#define	UISUBCLASS_DIRECT_LINE_CONTROL_MODEL	1
3781573Srgrimes#define	UISUBCLASS_ABSTRACT_CONTROL_MODEL	2
379187277Sdas#define	UISUBCLASS_TELEPHONE_CONTROL_MODEL	3
380235785Stheraven#define	UISUBCLASS_MULTICHANNEL_CONTROL_MODEL	4
381187277Sdas#define	UISUBCLASS_CAPI_CONTROLMODEL		5
382187277Sdas#define	UISUBCLASS_ETHERNET_NETWORKING_CONTROL_MODEL 6
3831573Srgrimes#define	UISUBCLASS_ATM_NETWORKING_CONTROL_MODEL 7
384235785Stheraven#define	UISUBCLASS_WIRELESS_HANDSET_CM 8
3851573Srgrimes#define	UISUBCLASS_DEVICE_MGMT 9
3861573Srgrimes#define	UISUBCLASS_MOBILE_DIRECT_LINE_MODEL 10
3871573Srgrimes#define	UISUBCLASS_OBEX 11
388103399Stjr#define	UISUBCLASS_ETHERNET_EMULATION_MODEL 12
389103399Stjr
390103399Stjr#define	UIPROTO_CDC_AT			1
391103399Stjr#define	UIPROTO_CDC_ETH_512X4 0x76	/* FreeBSD specific */
392103399Stjr
39321674Sjkh#define	UICLASS_HID		0x03
394103399Stjr#define	UISUBCLASS_BOOT		1
395103399Stjr#define	UIPROTO_BOOT_KEYBOARD	1
39621674Sjkh#define	UIPROTO_MOUSE		2
3971573Srgrimes
3981573Srgrimes#define	UICLASS_PHYSICAL	0x05
3991573Srgrimes#define	UICLASS_IMAGE		0x06
4001573Srgrimes#define	UISUBCLASS_SIC		1	/* still image class */
4011573Srgrimes#define	UICLASS_PRINTER		0x07
40221674Sjkh#define	UISUBCLASS_PRINTER	1
40321674Sjkh#define	UIPROTO_PRINTER_UNI	1
40487113Sfenner#define	UIPROTO_PRINTER_BI	2
40521674Sjkh#define	UIPROTO_PRINTER_1284	3
4061573Srgrimes
40721674Sjkh#define	UICLASS_MASS		0x08
40821674Sjkh#define	UISUBCLASS_RBC		1
40987113Sfenner#define	UISUBCLASS_SFF8020I	2
41021674Sjkh#define	UISUBCLASS_QIC157	3
41187113Sfenner#define	UISUBCLASS_UFI		4
41287113Sfenner#define	UISUBCLASS_SFF8070I	5
41387113Sfenner#define	UISUBCLASS_SCSI		6
414189131Sdas#define	UIPROTO_MASS_CBI_I	0
41587113Sfenner#define	UIPROTO_MASS_CBI	1
41687113Sfenner#define	UIPROTO_MASS_BBB_OLD	2	/* Not in the spec anymore */
41787113Sfenner#define	UIPROTO_MASS_BBB	80	/* 'P' for the Iomega Zip drive */
41887113Sfenner
41987113Sfenner#define	UICLASS_HUB		0x09
42087113Sfenner#define	UISUBCLASS_HUB		0
42187113Sfenner#define	UIPROTO_FSHUB		0
4221573Srgrimes#define	UIPROTO_HSHUBSTT	0	/* Yes, same as previous */
423103399Stjr#define	UIPROTO_HSHUBMTT	1
424103399Stjr
425103399Stjr#define	UICLASS_CDC_DATA	0x0a
426103399Stjr#define	UISUBCLASS_DATA		0
42721674Sjkh#define	UIPROTO_DATA_ISDNBRI		0x30	/* Physical iface */
428103399Stjr#define	UIPROTO_DATA_HDLC		0x31	/* HDLC */
429103399Stjr#define	UIPROTO_DATA_TRANSPARENT	0x32	/* Transparent */
430103399Stjr#define	UIPROTO_DATA_Q921M		0x50	/* Management for Q921 */
431103399Stjr#define	UIPROTO_DATA_Q921		0x51	/* Data for Q921 */
432103399Stjr#define	UIPROTO_DATA_Q921TM		0x52	/* TEI multiplexer for Q921 */
433103399Stjr#define	UIPROTO_DATA_V42BIS		0x90	/* Data compression */
434103399Stjr#define	UIPROTO_DATA_Q931		0x91	/* Euro-ISDN */
435103399Stjr#define	UIPROTO_DATA_V120		0x92	/* V.24 rate adaption */
436103399Stjr#define	UIPROTO_DATA_CAPI		0x93	/* CAPI 2.0 commands */
437103399Stjr#define	UIPROTO_DATA_HOST_BASED		0xfd	/* Host based driver */
438180106Sdas#define	UIPROTO_DATA_PUF		0xfe	/* see Prot. Unit Func. Desc. */
439180106Sdas#define	UIPROTO_DATA_VENDOR		0xff	/* Vendor specific */
440180106Sdas
441180106Sdas#define	UICLASS_SMARTCARD	0x0b
442103399Stjr#define	UICLASS_FIRM_UPD	0x0c
443103399Stjr#define	UICLASS_SECURITY	0x0d
44421674Sjkh#define	UICLASS_DIAGNOSTIC	0xdc
445103399Stjr#define	UICLASS_WIRELESS	0xe0
446103399Stjr#define	UISUBCLASS_RF			0x01
447103399Stjr#define	UIPROTO_BLUETOOTH		0x01
448103399Stjr
449103399Stjr#define	UICLASS_APPL_SPEC	0xfe
45087815Sphantom#define	UISUBCLASS_FIRMWARE_DOWNLOAD	1
451185825Sdas#define	UISUBCLASS_IRDA			2
452185825Sdas#define	UIPROTO_IRDA			0
453185825Sdas
454185825Sdas#define	UICLASS_VENDOR		0xff
45588057Sphantom#define	UISUBCLASS_XBOX360_CONTROLLER	0x5d
4561573Srgrimes#define	UIPROTO_XBOX360_GAMEPAD	0x01
457130231Sdas
4581573Srgrimesstruct usb2_endpoint_descriptor {
4591573Srgrimes	uByte	bLength;
460185904Sdas	uByte	bDescriptorType;
4611573Srgrimes	uByte	bEndpointAddress;
462103399Stjr#define	UE_GET_DIR(a)	((a) & 0x80)
463103399Stjr#define	UE_SET_DIR(a,d)	((a) | (((d)&1) << 7))
464103876Stjr#define	UE_DIR_IN	0x80
465187277Sdas#define	UE_DIR_OUT	0x00
4661573Srgrimes#define	UE_DIR_ANY	0xff		/* for internal use only! */
467185904Sdas#define	UE_ADDR		0x0f
468185904Sdas#define	UE_ADDR_ANY	0xff		/* for internal use only! */
469235785Stheraven#define	UE_GET_ADDR(a)	((a) & UE_ADDR)
470187421Sdas	uByte	bmAttributes;
471187421Sdas#define	UE_XFERTYPE	0x03
472185904Sdas#define	UE_CONTROL	0x00
4731573Srgrimes#define	UE_ISOCHRONOUS	0x01
4741573Srgrimes#define	UE_BULK	0x02
4751573Srgrimes#define	UE_INTERRUPT	0x03
4761573Srgrimes#define	UE_BULK_INTR	0xfe		/* for internal use only! */
4771573Srgrimes#define	UE_TYPE_ANY	0xff		/* for internal use only! */
4781573Srgrimes#define	UE_GET_XFERTYPE(a)	((a) & UE_XFERTYPE)
4791573Srgrimes#define	UE_ISO_TYPE	0x0c
4801573Srgrimes#define	UE_ISO_ASYNC	0x04
48132253Sache#define	UE_ISO_ADAPT	0x08
48231983Sache#define	UE_ISO_SYNC	0x0c
48331983Sache#define	UE_GET_ISO_TYPE(a)	((a) & UE_ISO_TYPE)
48431983Sache	uWord	wMaxPacketSize;
4851573Srgrimes#define	UE_ZERO_MPS 0xFFFF		/* for internal use only */
4861573Srgrimes	uByte	bInterval;
4871573Srgrimes} __packed;
4881573Srgrimestypedef struct usb2_endpoint_descriptor usb_endpoint_descriptor_t;
4891573Srgrimes
4901573Srgrimesstruct usb2_endpoint_ss_comp_descriptor {
4911573Srgrimes	uByte	bLength;
4921573Srgrimes	uByte	bDescriptorType;
4931573Srgrimes	uWord	bMaxBurst;
4941573Srgrimes	uByte	bmAttributes;
4951573Srgrimes	uWord	wBytesPerInterval;
496187582Sdas} __packed;
4971573Srgrimestypedef struct usb2_endpoint_ss_comp_descriptor
498113146Sdas		usb_endpoint_ss_comp_descriptor_t;
4991573Srgrimes
5001573Srgrimesstruct usb2_string_descriptor {
5011573Srgrimes	uByte	bLength;
5021573Srgrimes	uByte	bDescriptorType;
50388057Sphantom	uWord	bString[126];
5041573Srgrimes	uByte	bUnused;
5051573Srgrimes} __packed;
5061573Srgrimestypedef struct usb2_string_descriptor usb_string_descriptor_t;
5071573Srgrimes
5081573Srgrimes#define	USB_MAKE_STRING_DESC(m,name)	\
5091573Srgrimesstruct name {				\
5101573Srgrimes  uByte bLength;			\
5111573Srgrimes  uByte bDescriptorType;		\
5121573Srgrimes  uByte bData[sizeof((uint8_t []){m})];	\
5131573Srgrimes} __packed;				\
5141573Srgrimesstatic const struct name name = {	\
51588057Sphantom  .bLength = sizeof(struct name),	\
5161573Srgrimes  .bDescriptorType = UDESC_STRING,	\
5171573Srgrimes  .bData = { m },			\
5181573Srgrimes}
5191573Srgrimes
5201573Srgrimesstruct usb2_hub_descriptor {
52121674Sjkh	uByte	bDescLength;
52221674Sjkh	uByte	bDescriptorType;
5231573Srgrimes	uByte	bNbrPorts;
5241573Srgrimes	uWord	wHubCharacteristics;
5251573Srgrimes#define	UHD_PWR			0x0003
5261573Srgrimes#define	UHD_PWR_GANGED		0x0000
5271573Srgrimes#define	UHD_PWR_INDIVIDUAL	0x0001
5281573Srgrimes#define	UHD_PWR_NO_SWITCH	0x0002
5291573Srgrimes#define	UHD_COMPOUND		0x0004
5301573Srgrimes#define	UHD_OC			0x0018
5311573Srgrimes#define	UHD_OC_GLOBAL		0x0000
53287113Sfenner#define	UHD_OC_INDIVIDUAL	0x0008
53387815Sphantom#define	UHD_OC_NONE		0x0010
53487113Sfenner#define	UHD_TT_THINK		0x0060
5351573Srgrimes#define	UHD_TT_THINK_8		0x0000
5361573Srgrimes#define	UHD_TT_THINK_16		0x0020
537113191Sdas#define	UHD_TT_THINK_24		0x0040
5381573Srgrimes#define	UHD_TT_THINK_32		0x0060
5391573Srgrimes#define	UHD_PORT_IND		0x0080
540113191Sdas	uByte	bPwrOn2PwrGood;		/* delay in 2 ms units */
5411573Srgrimes#define	UHD_PWRON_FACTOR 2
542113191Sdas	uByte	bHubContrCurrent;
5431573Srgrimes	uByte	DeviceRemovable[32];	/* max 255 ports */
5441573Srgrimes#define	UHD_NOT_REMOV(desc, i) \
5451573Srgrimes    (((desc)->DeviceRemovable[(i)/8] >> ((i) % 8)) & 1)
5461573Srgrimes	uByte	PortPowerCtrlMask[1];	/* deprecated */
54788057Sphantom} __packed;
5481573Srgrimestypedef struct usb2_hub_descriptor usb_hub_descriptor_t;
5491573Srgrimes
5501573Srgrimesstruct usb2_hub_ss_descriptor {
5511573Srgrimes	uByte	bDescLength;
5521573Srgrimes	uByte	bDescriptorType;
5531573Srgrimes	uByte	bNbrPorts;		/* max 15 */
5541573Srgrimes	uWord	wHubCharacteristics;
5551573Srgrimes	uByte	bPwrOn2PwrGood;		/* delay in 2 ms units */
5561573Srgrimes	uByte	bHubContrCurrent;
5571573Srgrimes	uByte	bHubHdrDecLat;
5581573Srgrimes	uWord	wHubDelay;
5591573Srgrimes	uByte	DeviceRemovable[2];	/* max 15 ports */
5601573Srgrimes} __packed;
56121674Sjkhtypedef struct usb2_hub_ss_descriptor usb_hub_ss_descriptor_t;
56221674Sjkh
563103399Stjr/* minimum HUB descriptor (8-ports maximum) */
564103399Stjrstruct usb2_hub_descriptor_min {
565180106Sdas	uByte	bDescLength;
566180106Sdas	uByte	bDescriptorType;
567180106Sdas	uByte	bNbrPorts;
568180106Sdas	uWord	wHubCharacteristics;
569180106Sdas	uByte	bPwrOn2PwrGood;
57021674Sjkh	uByte	bHubContrCurrent;
57121674Sjkh	uByte	DeviceRemovable[1];
572103399Stjr	uByte	PortPowerCtrlMask[1];
5731573Srgrimes} __packed;
5741573Srgrimestypedef struct usb2_hub_descriptor_min usb_hub_descriptor_min_t;
575128819Sdas
5761573Srgrimesstruct usb2_device_qualifier {
5771573Srgrimes	uByte	bLength;
5781573Srgrimes	uByte	bDescriptorType;
5791573Srgrimes	uWord	bcdUSB;
5801573Srgrimes	uByte	bDeviceClass;
58187113Sfenner	uByte	bDeviceSubClass;
58287113Sfenner	uByte	bDeviceProtocol;
58387113Sfenner	uByte	bMaxPacketSize0;
58487113Sfenner	uByte	bNumConfigurations;
58587113Sfenner	uByte	bReserved;
5861573Srgrimes} __packed;
58787113Sfennertypedef struct usb2_device_qualifier usb_device_qualifier_t;
58887113Sfenner
58987113Sfennerstruct usb2_otg_descriptor {
5901573Srgrimes	uByte	bLength;
59187113Sfenner	uByte	bDescriptorType;
59287113Sfenner	uByte	bmAttributes;
59387113Sfenner#define	UOTG_SRP	0x01
59487113Sfenner#define	UOTG_HNP	0x02
59544674Sdfr} __packed;
5961573Srgrimestypedef struct usb2_otg_descriptor usb_otg_descriptor_t;
5971573Srgrimes
59887113Sfenner/* OTG feature selectors */
5991573Srgrimes#define	UOTG_B_HNP_ENABLE	3
60087113Sfenner#define	UOTG_A_HNP_SUPPORT	4
60187113Sfenner#define	UOTG_A_ALT_HNP_SUPPORT	5
60287113Sfenner
60387113Sfennerstruct usb2_status {
60487113Sfenner	uWord	wStatus;
60587113Sfenner/* Device status flags */
606105204Stjr#define	UDS_SELF_POWERED		0x0001
607105204Stjr#define	UDS_REMOTE_WAKEUP		0x0002
608105204Stjr/* Endpoint status flags */
6091573Srgrimes#define	UES_HALT			0x0001
610103633Stjr} __packed;
611128002Stjrtypedef struct usb2_status usb_status_t;
612128002Stjr
613103633Stjrstruct usb2_hub_status {
614103633Stjr	uWord	wHubStatus;
615128002Stjr#define	UHS_LOCAL_POWER			0x0001
616103633Stjr#define	UHS_OVER_CURRENT		0x0002
617128002Stjr	uWord	wHubChange;
618105234Stjr} __packed;
619105234Stjrtypedef struct usb2_hub_status usb_hub_status_t;
620103633Stjr
621105234Stjrstruct usb2_port_status {
622103633Stjr	uWord	wPortStatus;
623103633Stjr#define	UPS_CURRENT_CONNECT_STATUS	0x0001
624103633Stjr#define	UPS_PORT_ENABLED		0x0002
625103633Stjr#define	UPS_SUSPEND			0x0004
626103633Stjr#define	UPS_OVERCURRENT_INDICATOR	0x0008
6271573Srgrimes#define	UPS_RESET			0x0010
6281573Srgrimes#define	UPS_PORT_POWER			0x0100
6291573Srgrimes#define	UPS_LOW_SPEED			0x0200
6301573Srgrimes#define	UPS_HIGH_SPEED			0x0400
6311573Srgrimes#define	UPS_PORT_TEST			0x0800
6321573Srgrimes#define	UPS_PORT_INDICATOR		0x1000
6331573Srgrimes#define	UPS_PORT_MODE_DEVICE		0x8000	/* currently FreeBSD specific */
63487113Sfenner	uWord	wPortChange;
63587113Sfenner#define	UPS_C_CONNECT_STATUS		0x0001
63687113Sfenner#define	UPS_C_PORT_ENABLED		0x0002
63787113Sfenner#define	UPS_C_SUSPEND			0x0004
6381573Srgrimes#define	UPS_C_OVERCURRENT_INDICATOR	0x0008
6391573Srgrimes#define	UPS_C_PORT_RESET		0x0010
6401573Srgrimes} __packed;
6411573Srgrimestypedef struct usb2_port_status usb_port_status_t;
6421573Srgrimes
6431573Srgrimes#endif					/* _USB2_STANDARD_H_ */
6441573Srgrimes