usb.h revision 196493
1184610Salfred/* $FreeBSD: head/sys/dev/usb/usb.h 196493 2009-08-24 05:01:06Z alfred $ */
2184610Salfred/*-
3184610Salfred * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
4184610Salfred * Copyright (c) 1998 The NetBSD Foundation, Inc. All rights reserved.
5184610Salfred * Copyright (c) 1998 Lennart Augustsson. All rights reserved.
6184610Salfred *
7184610Salfred * Redistribution and use in source and binary forms, with or without
8184610Salfred * modification, are permitted provided that the following conditions
9184610Salfred * are met:
10184610Salfred * 1. Redistributions of source code must retain the above copyright
11184610Salfred *    notice, this list of conditions and the following disclaimer.
12184610Salfred * 2. Redistributions in binary form must reproduce the above copyright
13184610Salfred *    notice, this list of conditions and the following disclaimer in the
14184610Salfred *    documentation and/or other materials provided with the distribution.
15184610Salfred *
16184610Salfred * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17184610Salfred * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18184610Salfred * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19184610Salfred * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20184610Salfred * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21184610Salfred * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22184610Salfred * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23184610Salfred * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24184610Salfred * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25184610Salfred * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26184610Salfred * SUCH DAMAGE.
27184610Salfred */
28184610Salfred
29185290Salfred/*
30185290Salfred * This file contains standard definitions for the following USB
31185290Salfred * protocol versions:
32185290Salfred *
33185290Salfred * USB v1.0
34185290Salfred * USB v1.1
35185290Salfred * USB v2.0
36185290Salfred * USB v3.0
37185290Salfred */
38185290Salfred
39194230Sthompsa#ifndef _USB_STANDARD_H_
40194230Sthompsa#define	_USB_STANDARD_H_
41184610Salfred
42194677Sthompsa#if defined(_KERNEL)
43194677Sthompsa#include "opt_usb.h"
44194677Sthompsa
45194677Sthompsa/* Declare parent SYSCTL USB node. */
46194677Sthompsa#ifdef SYSCTL_DECL
47194677SthompsaSYSCTL_DECL(_hw_usb);
48194677Sthompsa#endif
49194677Sthompsa
50194677Sthompsa#include <sys/malloc.h>
51194677Sthompsa
52194677SthompsaMALLOC_DECLARE(M_USB);
53194677SthompsaMALLOC_DECLARE(M_USBDEV);
54194677SthompsaMALLOC_DECLARE(M_USBHC);
55194677Sthompsa#endif /* _KERNEL */
56194677Sthompsa
57188942Sthompsa#include <dev/usb/usb_endian.h>
58194677Sthompsa#include <dev/usb/usb_freebsd.h>
59184610Salfred
60194677Sthompsa#define	USB_STACK_VERSION 2000		/* 2.0 */
61194677Sthompsa
62194677Sthompsa/* Definition of some hardcoded USB constants. */
63194677Sthompsa
64194677Sthompsa#define	USB_MAX_IPACKET		8	/* initial USB packet size */
65194677Sthompsa#define	USB_EP_MAX (2*16)		/* hardcoded */
66194677Sthompsa#define	USB_ROOT_HUB_ADDR 1		/* index */
67194677Sthompsa#define	USB_MIN_DEVICES 2		/* unused + root HUB */
68194677Sthompsa#define	USB_UNCONFIG_INDEX 0xFF		/* internal use only */
69194677Sthompsa#define	USB_IFACE_INDEX_ANY 0xFF	/* internal use only */
70194677Sthompsa#define	USB_START_ADDR 0		/* default USB device BUS address
71194677Sthompsa					 * after USB bus reset */
72194677Sthompsa#define	USB_CONTROL_ENDPOINT 0		/* default control endpoint */
73194677Sthompsa
74194677Sthompsa#define	USB_FRAMES_PER_SECOND_FS 1000	/* full speed */
75194677Sthompsa#define	USB_FRAMES_PER_SECOND_HS 8000	/* high speed */
76194677Sthompsa
77194677Sthompsa#define	USB_FS_BYTES_PER_HS_UFRAME 188	/* bytes */
78194677Sthompsa#define	USB_HS_MICRO_FRAMES_MAX 8	/* units */
79194677Sthompsa
80194677Sthompsa#define	USB_ISOC_TIME_MAX 128		/* ms */
81194677Sthompsa
82184610Salfred/*
83184610Salfred * Minimum time a device needs to be powered down to go through a
84184610Salfred * power cycle. These values are not in the USB specification.
85184610Salfred */
86184610Salfred#define	USB_POWER_DOWN_TIME	200	/* ms */
87184610Salfred#define	USB_PORT_POWER_DOWN_TIME	100	/* ms */
88184610Salfred
89186730Salfred/* Definition of software USB power modes */
90186730Salfred#define	USB_POWER_MODE_OFF 0		/* turn off device */
91186730Salfred#define	USB_POWER_MODE_ON 1		/* always on */
92186730Salfred#define	USB_POWER_MODE_SAVE 2		/* automatic suspend and resume */
93186730Salfred#define	USB_POWER_MODE_SUSPEND 3	/* force suspend */
94186730Salfred#define	USB_POWER_MODE_RESUME 4		/* force resume */
95186730Salfred
96184610Salfred#if 0
97184610Salfred/* These are the values from the USB specification. */
98184610Salfred#define	USB_PORT_RESET_DELAY	10	/* ms */
99184610Salfred#define	USB_PORT_ROOT_RESET_DELAY 50	/* ms */
100184610Salfred#define	USB_PORT_RESET_RECOVERY	10	/* ms */
101184610Salfred#define	USB_PORT_POWERUP_DELAY	100	/* ms */
102186730Salfred#define	USB_PORT_RESUME_DELAY	20	/* ms */
103184610Salfred#define	USB_SET_ADDRESS_SETTLE	2	/* ms */
104184610Salfred#define	USB_RESUME_DELAY	(20*5)	/* ms */
105184610Salfred#define	USB_RESUME_WAIT		10	/* ms */
106184610Salfred#define	USB_RESUME_RECOVERY	10	/* ms */
107184610Salfred#define	USB_EXTRA_POWER_UP_TIME	0	/* ms */
108184610Salfred#else
109184610Salfred/* Allow for marginal and non-conforming devices. */
110184610Salfred#define	USB_PORT_RESET_DELAY	50	/* ms */
111184610Salfred#define	USB_PORT_ROOT_RESET_DELAY 250	/* ms */
112184610Salfred#define	USB_PORT_RESET_RECOVERY	250	/* ms */
113184610Salfred#define	USB_PORT_POWERUP_DELAY	300	/* ms */
114186730Salfred#define	USB_PORT_RESUME_DELAY	(20*2)	/* ms */
115184610Salfred#define	USB_SET_ADDRESS_SETTLE	10	/* ms */
116184610Salfred#define	USB_RESUME_DELAY	(50*5)	/* ms */
117184610Salfred#define	USB_RESUME_WAIT		50	/* ms */
118184610Salfred#define	USB_RESUME_RECOVERY	50	/* ms */
119184610Salfred#define	USB_EXTRA_POWER_UP_TIME	20	/* ms */
120184610Salfred#endif
121184610Salfred
122184610Salfred#define	USB_MIN_POWER		100	/* mA */
123184610Salfred#define	USB_MAX_POWER		500	/* mA */
124184610Salfred
125184610Salfred#define	USB_BUS_RESET_DELAY	100	/* ms */
126184610Salfred
127184610Salfred/*
128184610Salfred * USB record layout in memory:
129184610Salfred *
130184610Salfred * - USB config 0
131184610Salfred *   - USB interfaces
132184610Salfred *     - USB alternative interfaces
133193644Sthompsa *       - USB endpoints
134184610Salfred *
135184610Salfred * - USB config 1
136184610Salfred *   - USB interfaces
137184610Salfred *     - USB alternative interfaces
138193644Sthompsa *       - USB endpoints
139184610Salfred */
140184610Salfred
141184610Salfred/* Declaration of USB records */
142184610Salfred
143192984Sthompsastruct usb_device_request {
144184610Salfred	uByte	bmRequestType;
145184610Salfred	uByte	bRequest;
146184610Salfred	uWord	wValue;
147184610Salfred	uWord	wIndex;
148184610Salfred	uWord	wLength;
149184610Salfred} __packed;
150192984Sthompsatypedef struct usb_device_request usb_device_request_t;
151184610Salfred
152184610Salfred#define	UT_WRITE		0x00
153184610Salfred#define	UT_READ			0x80
154184610Salfred#define	UT_STANDARD		0x00
155184610Salfred#define	UT_CLASS		0x20
156184610Salfred#define	UT_VENDOR		0x40
157184610Salfred#define	UT_DEVICE		0x00
158184610Salfred#define	UT_INTERFACE		0x01
159184610Salfred#define	UT_ENDPOINT		0x02
160184610Salfred#define	UT_OTHER		0x03
161184610Salfred
162184610Salfred#define	UT_READ_DEVICE		(UT_READ  | UT_STANDARD | UT_DEVICE)
163184610Salfred#define	UT_READ_INTERFACE	(UT_READ  | UT_STANDARD | UT_INTERFACE)
164184610Salfred#define	UT_READ_ENDPOINT	(UT_READ  | UT_STANDARD | UT_ENDPOINT)
165184610Salfred#define	UT_WRITE_DEVICE		(UT_WRITE | UT_STANDARD | UT_DEVICE)
166184610Salfred#define	UT_WRITE_INTERFACE	(UT_WRITE | UT_STANDARD | UT_INTERFACE)
167184610Salfred#define	UT_WRITE_ENDPOINT	(UT_WRITE | UT_STANDARD | UT_ENDPOINT)
168184610Salfred#define	UT_READ_CLASS_DEVICE	(UT_READ  | UT_CLASS | UT_DEVICE)
169184610Salfred#define	UT_READ_CLASS_INTERFACE	(UT_READ  | UT_CLASS | UT_INTERFACE)
170184610Salfred#define	UT_READ_CLASS_OTHER	(UT_READ  | UT_CLASS | UT_OTHER)
171184610Salfred#define	UT_READ_CLASS_ENDPOINT	(UT_READ  | UT_CLASS | UT_ENDPOINT)
172184610Salfred#define	UT_WRITE_CLASS_DEVICE	(UT_WRITE | UT_CLASS | UT_DEVICE)
173184610Salfred#define	UT_WRITE_CLASS_INTERFACE (UT_WRITE | UT_CLASS | UT_INTERFACE)
174184610Salfred#define	UT_WRITE_CLASS_OTHER	(UT_WRITE | UT_CLASS | UT_OTHER)
175184610Salfred#define	UT_WRITE_CLASS_ENDPOINT	(UT_WRITE | UT_CLASS | UT_ENDPOINT)
176184610Salfred#define	UT_READ_VENDOR_DEVICE	(UT_READ  | UT_VENDOR | UT_DEVICE)
177184610Salfred#define	UT_READ_VENDOR_INTERFACE (UT_READ  | UT_VENDOR | UT_INTERFACE)
178184610Salfred#define	UT_READ_VENDOR_OTHER	(UT_READ  | UT_VENDOR | UT_OTHER)
179184610Salfred#define	UT_READ_VENDOR_ENDPOINT	(UT_READ  | UT_VENDOR | UT_ENDPOINT)
180184610Salfred#define	UT_WRITE_VENDOR_DEVICE	(UT_WRITE | UT_VENDOR | UT_DEVICE)
181184610Salfred#define	UT_WRITE_VENDOR_INTERFACE (UT_WRITE | UT_VENDOR | UT_INTERFACE)
182184610Salfred#define	UT_WRITE_VENDOR_OTHER	(UT_WRITE | UT_VENDOR | UT_OTHER)
183184610Salfred#define	UT_WRITE_VENDOR_ENDPOINT (UT_WRITE | UT_VENDOR | UT_ENDPOINT)
184184610Salfred
185184610Salfred/* Requests */
186184610Salfred#define	UR_GET_STATUS		0x00
187184610Salfred#define	UR_CLEAR_FEATURE	0x01
188184610Salfred#define	UR_SET_FEATURE		0x03
189184610Salfred#define	UR_SET_ADDRESS		0x05
190184610Salfred#define	UR_GET_DESCRIPTOR	0x06
191184610Salfred#define	UDESC_DEVICE		0x01
192184610Salfred#define	UDESC_CONFIG		0x02
193184610Salfred#define	UDESC_STRING		0x03
194185290Salfred#define	USB_LANGUAGE_TABLE	0x00	/* language ID string index */
195185290Salfred#define	UDESC_INTERFACE		0x04
196184610Salfred#define	UDESC_ENDPOINT		0x05
197184610Salfred#define	UDESC_DEVICE_QUALIFIER	0x06
198184610Salfred#define	UDESC_OTHER_SPEED_CONFIGURATION 0x07
199184610Salfred#define	UDESC_INTERFACE_POWER	0x08
200184610Salfred#define	UDESC_OTG		0x09
201185290Salfred#define	UDESC_DEBUG		0x0A
202185290Salfred#define	UDESC_IFACE_ASSOC	0x0B	/* interface association */
203185290Salfred#define	UDESC_BOS		0x0F	/* binary object store */
204185290Salfred#define	UDESC_DEVICE_CAPABILITY	0x10
205185290Salfred#define	UDESC_CS_DEVICE		0x21	/* class specific */
206185290Salfred#define	UDESC_CS_CONFIG		0x22
207185290Salfred#define	UDESC_CS_STRING		0x23
208184610Salfred#define	UDESC_CS_INTERFACE	0x24
209184610Salfred#define	UDESC_CS_ENDPOINT	0x25
210184610Salfred#define	UDESC_HUB		0x29
211185290Salfred#define	UDESC_ENDPOINT_SS_COMP	0x30	/* super speed */
212184610Salfred#define	UR_SET_DESCRIPTOR	0x07
213184610Salfred#define	UR_GET_CONFIG		0x08
214184610Salfred#define	UR_SET_CONFIG		0x09
215184610Salfred#define	UR_GET_INTERFACE	0x0a
216184610Salfred#define	UR_SET_INTERFACE	0x0b
217184610Salfred#define	UR_SYNCH_FRAME		0x0c
218185290Salfred#define	UR_SET_SEL		0x30
219185290Salfred#define	UR_ISOCH_DELAY		0x31
220184610Salfred
221184610Salfred/* HUB specific request */
222184610Salfred#define	UR_GET_BUS_STATE	0x02
223184610Salfred#define	UR_CLEAR_TT_BUFFER	0x08
224184610Salfred#define	UR_RESET_TT		0x09
225184610Salfred#define	UR_GET_TT_STATE		0x0a
226184610Salfred#define	UR_STOP_TT		0x0b
227185290Salfred#define	UR_SET_HUB_DEPTH	0x0c
228185290Salfred#define	UR_GET_PORT_ERR_COUNT	0x0d
229184610Salfred
230184610Salfred/* Feature numbers */
231184610Salfred#define	UF_ENDPOINT_HALT	0
232184610Salfred#define	UF_DEVICE_REMOTE_WAKEUP	1
233184610Salfred#define	UF_TEST_MODE		2
234185290Salfred#define	UF_U1_ENABLE		0x30
235185290Salfred#define	UF_U2_ENABLE		0x31
236185290Salfred#define	UF_LTM_ENABLE		0x32
237184610Salfred
238184610Salfred/* HUB specific features */
239184610Salfred#define	UHF_C_HUB_LOCAL_POWER	0
240184610Salfred#define	UHF_C_HUB_OVER_CURRENT	1
241184610Salfred#define	UHF_PORT_CONNECTION	0
242184610Salfred#define	UHF_PORT_ENABLE		1
243184610Salfred#define	UHF_PORT_SUSPEND	2
244184610Salfred#define	UHF_PORT_OVER_CURRENT	3
245184610Salfred#define	UHF_PORT_RESET		4
246185290Salfred#define	UHF_PORT_LINK_STATE	5
247184610Salfred#define	UHF_PORT_POWER		8
248184610Salfred#define	UHF_PORT_LOW_SPEED	9
249184610Salfred#define	UHF_C_PORT_CONNECTION	16
250184610Salfred#define	UHF_C_PORT_ENABLE	17
251184610Salfred#define	UHF_C_PORT_SUSPEND	18
252184610Salfred#define	UHF_C_PORT_OVER_CURRENT	19
253184610Salfred#define	UHF_C_PORT_RESET	20
254184610Salfred#define	UHF_PORT_TEST		21
255184610Salfred#define	UHF_PORT_INDICATOR	22
256184610Salfred
257185290Salfred/* SuperSpeed HUB specific features */
258185290Salfred#define	UHF_PORT_U1_TIMEOUT	23
259185290Salfred#define	UHF_PORT_U2_TIMEOUT	24
260185290Salfred#define	UHF_C_PORT_LINK_STATE	25
261185290Salfred#define	UHF_C_PORT_CONFIG_ERROR	26
262185290Salfred#define	UHF_PORT_REMOTE_WAKE_MASK	27
263185290Salfred#define	UHF_BH_PORT_RESET	28
264185290Salfred#define	UHF_C_BH_PORT_RESET	29
265185290Salfred#define	UHF_FORCE_LINKPM_ACCEPT	30
266185290Salfred
267192984Sthompsastruct usb_descriptor {
268184610Salfred	uByte	bLength;
269184610Salfred	uByte	bDescriptorType;
270184610Salfred	uByte	bDescriptorSubtype;
271184610Salfred} __packed;
272192984Sthompsatypedef struct usb_descriptor usb_descriptor_t;
273184610Salfred
274192984Sthompsastruct usb_device_descriptor {
275184610Salfred	uByte	bLength;
276184610Salfred	uByte	bDescriptorType;
277184610Salfred	uWord	bcdUSB;
278184610Salfred#define	UD_USB_2_0		0x0200
279185290Salfred#define	UD_USB_3_0		0x0300
280185290Salfred#define	UD_IS_USB2(d) ((d)->bcdUSB[1] == 0x02)
281185290Salfred#define	UD_IS_USB3(d) ((d)->bcdUSB[1] == 0x03)
282184610Salfred	uByte	bDeviceClass;
283184610Salfred	uByte	bDeviceSubClass;
284184610Salfred	uByte	bDeviceProtocol;
285184610Salfred	uByte	bMaxPacketSize;
286184610Salfred	/* The fields below are not part of the initial descriptor. */
287184610Salfred	uWord	idVendor;
288184610Salfred	uWord	idProduct;
289184610Salfred	uWord	bcdDevice;
290184610Salfred	uByte	iManufacturer;
291184610Salfred	uByte	iProduct;
292184610Salfred	uByte	iSerialNumber;
293184610Salfred	uByte	bNumConfigurations;
294184610Salfred} __packed;
295192984Sthompsatypedef struct usb_device_descriptor usb_device_descriptor_t;
296184610Salfred
297185290Salfred/* Binary Device Object Store (BOS) */
298192984Sthompsastruct usb_bos_descriptor {
299185290Salfred	uByte	bLength;
300185290Salfred	uByte	bDescriptorType;
301185290Salfred	uWord	wTotalLength;
302185290Salfred	uByte	bNumDeviceCaps;
303185290Salfred} __packed;
304192984Sthompsatypedef struct usb_bos_descriptor usb_bos_descriptor_t;
305185290Salfred
306185290Salfred/* Binary Device Object Store Capability */
307192984Sthompsastruct usb_bos_cap_descriptor {
308185290Salfred	uByte	bLength;
309185290Salfred	uByte	bDescriptorType;
310185290Salfred	uByte	bDevCapabilityType;
311185290Salfred#define	USB_DEVCAP_RESERVED	0x00
312185290Salfred#define	USB_DEVCAP_WUSB		0x01
313185290Salfred#define	USB_DEVCAP_USB2EXT	0x02
314185290Salfred#define	USB_DEVCAP_SUPER_SPEED	0x03
315185290Salfred#define	USB_DEVCAP_CONTAINER_ID	0x04
316185290Salfred	/* data ... */
317185290Salfred} __packed;
318192984Sthompsatypedef struct usb_bos_cap_descriptor usb_bos_cap_descriptor_t;
319185290Salfred
320192984Sthompsastruct usb_devcap_usb2ext_descriptor {
321185290Salfred	uByte	bLength;
322185290Salfred	uByte	bDescriptorType;
323185290Salfred	uByte	bDevCapabilityType;
324185290Salfred	uByte	bmAttributes;
325185290Salfred#define	USB_V2EXT_LPM 0x02
326185290Salfred} __packed;
327192984Sthompsatypedef struct usb_devcap_usb2ext_descriptor usb_devcap_usb2ext_descriptor_t;
328185290Salfred
329192984Sthompsastruct usb_devcap_ss_descriptor {
330185290Salfred	uByte	bLength;
331185290Salfred	uByte	bDescriptorType;
332185290Salfred	uByte	bDevCapabilityType;
333185290Salfred	uByte	bmAttributes;
334185290Salfred	uWord	wSpeedsSupported;
335185290Salfred	uByte	bFunctionaltySupport;
336185290Salfred	uByte	bU1DevExitLat;
337185290Salfred	uByte	bU2DevExitLat;
338185290Salfred} __packed;
339192984Sthompsatypedef struct usb_devcap_ss_descriptor usb_devcap_ss_descriptor_t;
340185290Salfred
341192984Sthompsastruct usb_devcap_container_id_descriptor {
342185290Salfred	uByte	bLength;
343185290Salfred	uByte	bDescriptorType;
344185290Salfred	uByte	bDevCapabilityType;
345185290Salfred	uByte	bReserved;
346185290Salfred	uByte	ContainerID;
347185290Salfred} __packed;
348192984Sthompsatypedef struct usb_devcap_container_id_descriptor
349188947Sthompsa		usb_devcap_container_id_descriptor_t;
350185290Salfred
351184610Salfred/* Device class codes */
352184610Salfred#define	UDCLASS_IN_INTERFACE	0x00
353184610Salfred#define	UDCLASS_COMM		0x02
354184610Salfred#define	UDCLASS_HUB		0x09
355184610Salfred#define	UDSUBCLASS_HUB		0x00
356184610Salfred#define	UDPROTO_FSHUB		0x00
357184610Salfred#define	UDPROTO_HSHUBSTT	0x01
358184610Salfred#define	UDPROTO_HSHUBMTT	0x02
359184610Salfred#define	UDCLASS_DIAGNOSTIC	0xdc
360184610Salfred#define	UDCLASS_WIRELESS	0xe0
361184610Salfred#define	UDSUBCLASS_RF		0x01
362184610Salfred#define	UDPROTO_BLUETOOTH	0x01
363184610Salfred#define	UDCLASS_VENDOR		0xff
364184610Salfred
365192984Sthompsastruct usb_config_descriptor {
366184610Salfred	uByte	bLength;
367184610Salfred	uByte	bDescriptorType;
368184610Salfred	uWord	wTotalLength;
369184610Salfred	uByte	bNumInterface;
370184610Salfred	uByte	bConfigurationValue;
371184610Salfred#define	USB_UNCONFIG_NO 0
372184610Salfred	uByte	iConfiguration;
373184610Salfred	uByte	bmAttributes;
374184610Salfred#define	UC_BUS_POWERED		0x80
375184610Salfred#define	UC_SELF_POWERED		0x40
376184610Salfred#define	UC_REMOTE_WAKEUP	0x20
377184610Salfred	uByte	bMaxPower;		/* max current in 2 mA units */
378184610Salfred#define	UC_POWER_FACTOR 2
379184610Salfred} __packed;
380192984Sthompsatypedef struct usb_config_descriptor usb_config_descriptor_t;
381184610Salfred
382192984Sthompsastruct usb_interface_descriptor {
383184610Salfred	uByte	bLength;
384184610Salfred	uByte	bDescriptorType;
385184610Salfred	uByte	bInterfaceNumber;
386184610Salfred	uByte	bAlternateSetting;
387184610Salfred	uByte	bNumEndpoints;
388184610Salfred	uByte	bInterfaceClass;
389184610Salfred	uByte	bInterfaceSubClass;
390184610Salfred	uByte	bInterfaceProtocol;
391184610Salfred	uByte	iInterface;
392184610Salfred} __packed;
393192984Sthompsatypedef struct usb_interface_descriptor usb_interface_descriptor_t;
394184610Salfred
395192984Sthompsastruct usb_interface_assoc_descriptor {
396185290Salfred	uByte	bLength;
397185290Salfred	uByte	bDescriptorType;
398185290Salfred	uByte	bFirstInterface;
399185290Salfred	uByte	bInterfaceCount;
400185290Salfred	uByte	bFunctionClass;
401185290Salfred	uByte	bFunctionSubClass;
402185290Salfred	uByte	bFunctionProtocol;
403185290Salfred	uByte	iFunction;
404185290Salfred} __packed;
405192984Sthompsatypedef struct usb_interface_assoc_descriptor usb_interface_assoc_descriptor_t;
406185290Salfred
407184610Salfred/* Interface class codes */
408184610Salfred#define	UICLASS_UNSPEC		0x00
409184610Salfred#define	UICLASS_AUDIO		0x01	/* audio */
410184610Salfred#define	UISUBCLASS_AUDIOCONTROL	1
411184610Salfred#define	UISUBCLASS_AUDIOSTREAM		2
412184610Salfred#define	UISUBCLASS_MIDISTREAM		3
413184610Salfred
414184610Salfred#define	UICLASS_CDC		0x02	/* communication */
415184610Salfred#define	UISUBCLASS_DIRECT_LINE_CONTROL_MODEL	1
416184610Salfred#define	UISUBCLASS_ABSTRACT_CONTROL_MODEL	2
417184610Salfred#define	UISUBCLASS_TELEPHONE_CONTROL_MODEL	3
418184610Salfred#define	UISUBCLASS_MULTICHANNEL_CONTROL_MODEL	4
419184610Salfred#define	UISUBCLASS_CAPI_CONTROLMODEL		5
420184610Salfred#define	UISUBCLASS_ETHERNET_NETWORKING_CONTROL_MODEL 6
421184610Salfred#define	UISUBCLASS_ATM_NETWORKING_CONTROL_MODEL 7
422184610Salfred#define	UISUBCLASS_WIRELESS_HANDSET_CM 8
423184610Salfred#define	UISUBCLASS_DEVICE_MGMT 9
424184610Salfred#define	UISUBCLASS_MOBILE_DIRECT_LINE_MODEL 10
425184610Salfred#define	UISUBCLASS_OBEX 11
426184610Salfred#define	UISUBCLASS_ETHERNET_EMULATION_MODEL 12
427184610Salfred
428184610Salfred#define	UIPROTO_CDC_AT			1
429184610Salfred#define	UIPROTO_CDC_ETH_512X4 0x76	/* FreeBSD specific */
430184610Salfred
431184610Salfred#define	UICLASS_HID		0x03
432184610Salfred#define	UISUBCLASS_BOOT		1
433184610Salfred#define	UIPROTO_BOOT_KEYBOARD	1
434184610Salfred#define	UIPROTO_MOUSE		2
435184610Salfred
436184610Salfred#define	UICLASS_PHYSICAL	0x05
437184610Salfred#define	UICLASS_IMAGE		0x06
438184610Salfred#define	UISUBCLASS_SIC		1	/* still image class */
439184610Salfred#define	UICLASS_PRINTER		0x07
440184610Salfred#define	UISUBCLASS_PRINTER	1
441184610Salfred#define	UIPROTO_PRINTER_UNI	1
442184610Salfred#define	UIPROTO_PRINTER_BI	2
443184610Salfred#define	UIPROTO_PRINTER_1284	3
444184610Salfred
445184610Salfred#define	UICLASS_MASS		0x08
446184610Salfred#define	UISUBCLASS_RBC		1
447184610Salfred#define	UISUBCLASS_SFF8020I	2
448184610Salfred#define	UISUBCLASS_QIC157	3
449184610Salfred#define	UISUBCLASS_UFI		4
450184610Salfred#define	UISUBCLASS_SFF8070I	5
451184610Salfred#define	UISUBCLASS_SCSI		6
452184610Salfred#define	UIPROTO_MASS_CBI_I	0
453184610Salfred#define	UIPROTO_MASS_CBI	1
454184610Salfred#define	UIPROTO_MASS_BBB_OLD	2	/* Not in the spec anymore */
455184610Salfred#define	UIPROTO_MASS_BBB	80	/* 'P' for the Iomega Zip drive */
456184610Salfred
457184610Salfred#define	UICLASS_HUB		0x09
458184610Salfred#define	UISUBCLASS_HUB		0
459184610Salfred#define	UIPROTO_FSHUB		0
460184610Salfred#define	UIPROTO_HSHUBSTT	0	/* Yes, same as previous */
461184610Salfred#define	UIPROTO_HSHUBMTT	1
462184610Salfred
463184610Salfred#define	UICLASS_CDC_DATA	0x0a
464184610Salfred#define	UISUBCLASS_DATA		0
465184610Salfred#define	UIPROTO_DATA_ISDNBRI		0x30	/* Physical iface */
466184610Salfred#define	UIPROTO_DATA_HDLC		0x31	/* HDLC */
467184610Salfred#define	UIPROTO_DATA_TRANSPARENT	0x32	/* Transparent */
468184610Salfred#define	UIPROTO_DATA_Q921M		0x50	/* Management for Q921 */
469184610Salfred#define	UIPROTO_DATA_Q921		0x51	/* Data for Q921 */
470184610Salfred#define	UIPROTO_DATA_Q921TM		0x52	/* TEI multiplexer for Q921 */
471184610Salfred#define	UIPROTO_DATA_V42BIS		0x90	/* Data compression */
472184610Salfred#define	UIPROTO_DATA_Q931		0x91	/* Euro-ISDN */
473184610Salfred#define	UIPROTO_DATA_V120		0x92	/* V.24 rate adaption */
474184610Salfred#define	UIPROTO_DATA_CAPI		0x93	/* CAPI 2.0 commands */
475184610Salfred#define	UIPROTO_DATA_HOST_BASED		0xfd	/* Host based driver */
476184610Salfred#define	UIPROTO_DATA_PUF		0xfe	/* see Prot. Unit Func. Desc. */
477184610Salfred#define	UIPROTO_DATA_VENDOR		0xff	/* Vendor specific */
478184610Salfred
479184610Salfred#define	UICLASS_SMARTCARD	0x0b
480184610Salfred#define	UICLASS_FIRM_UPD	0x0c
481184610Salfred#define	UICLASS_SECURITY	0x0d
482184610Salfred#define	UICLASS_DIAGNOSTIC	0xdc
483184610Salfred#define	UICLASS_WIRELESS	0xe0
484184610Salfred#define	UISUBCLASS_RF			0x01
485184610Salfred#define	UIPROTO_BLUETOOTH		0x01
486184610Salfred
487196493Salfred#define	UICLASS_IAD		0xEF	/* Interface Association Descriptor */
488196493Salfred
489184610Salfred#define	UICLASS_APPL_SPEC	0xfe
490184610Salfred#define	UISUBCLASS_FIRMWARE_DOWNLOAD	1
491184610Salfred#define	UISUBCLASS_IRDA			2
492184610Salfred#define	UIPROTO_IRDA			0
493184610Salfred
494184610Salfred#define	UICLASS_VENDOR		0xff
495184610Salfred#define	UISUBCLASS_XBOX360_CONTROLLER	0x5d
496184610Salfred#define	UIPROTO_XBOX360_GAMEPAD	0x01
497184610Salfred
498192984Sthompsastruct usb_endpoint_descriptor {
499184610Salfred	uByte	bLength;
500184610Salfred	uByte	bDescriptorType;
501184610Salfred	uByte	bEndpointAddress;
502184610Salfred#define	UE_GET_DIR(a)	((a) & 0x80)
503184610Salfred#define	UE_SET_DIR(a,d)	((a) | (((d)&1) << 7))
504190732Sthompsa#define	UE_DIR_IN	0x80		/* IN-token endpoint, fixed */
505190732Sthompsa#define	UE_DIR_OUT	0x00		/* OUT-token endpoint, fixed */
506190732Sthompsa#define	UE_DIR_RX	0xfd		/* for internal use only! */
507190732Sthompsa#define	UE_DIR_TX	0xfe		/* for internal use only! */
508184610Salfred#define	UE_DIR_ANY	0xff		/* for internal use only! */
509184610Salfred#define	UE_ADDR		0x0f
510184610Salfred#define	UE_ADDR_ANY	0xff		/* for internal use only! */
511184610Salfred#define	UE_GET_ADDR(a)	((a) & UE_ADDR)
512184610Salfred	uByte	bmAttributes;
513184610Salfred#define	UE_XFERTYPE	0x03
514184610Salfred#define	UE_CONTROL	0x00
515184610Salfred#define	UE_ISOCHRONOUS	0x01
516184610Salfred#define	UE_BULK	0x02
517184610Salfred#define	UE_INTERRUPT	0x03
518184610Salfred#define	UE_BULK_INTR	0xfe		/* for internal use only! */
519184610Salfred#define	UE_TYPE_ANY	0xff		/* for internal use only! */
520184610Salfred#define	UE_GET_XFERTYPE(a)	((a) & UE_XFERTYPE)
521184610Salfred#define	UE_ISO_TYPE	0x0c
522184610Salfred#define	UE_ISO_ASYNC	0x04
523184610Salfred#define	UE_ISO_ADAPT	0x08
524184610Salfred#define	UE_ISO_SYNC	0x0c
525184610Salfred#define	UE_GET_ISO_TYPE(a)	((a) & UE_ISO_TYPE)
526184610Salfred	uWord	wMaxPacketSize;
527184610Salfred#define	UE_ZERO_MPS 0xFFFF		/* for internal use only */
528184610Salfred	uByte	bInterval;
529184610Salfred} __packed;
530192984Sthompsatypedef struct usb_endpoint_descriptor usb_endpoint_descriptor_t;
531184610Salfred
532192984Sthompsastruct usb_endpoint_ss_comp_descriptor {
533185290Salfred	uByte	bLength;
534185290Salfred	uByte	bDescriptorType;
535185290Salfred	uWord	bMaxBurst;
536185290Salfred	uByte	bmAttributes;
537185290Salfred	uWord	wBytesPerInterval;
538185290Salfred} __packed;
539192984Sthompsatypedef struct usb_endpoint_ss_comp_descriptor
540188947Sthompsa		usb_endpoint_ss_comp_descriptor_t;
541185290Salfred
542192984Sthompsastruct usb_string_descriptor {
543184610Salfred	uByte	bLength;
544184610Salfred	uByte	bDescriptorType;
545184610Salfred	uWord	bString[126];
546184610Salfred	uByte	bUnused;
547184610Salfred} __packed;
548192984Sthompsatypedef struct usb_string_descriptor usb_string_descriptor_t;
549184610Salfred
550184610Salfred#define	USB_MAKE_STRING_DESC(m,name)	\
551184610Salfredstruct name {				\
552184610Salfred  uByte bLength;			\
553184610Salfred  uByte bDescriptorType;		\
554184610Salfred  uByte bData[sizeof((uint8_t []){m})];	\
555184610Salfred} __packed;				\
556184610Salfredstatic const struct name name = {	\
557184610Salfred  .bLength = sizeof(struct name),	\
558184610Salfred  .bDescriptorType = UDESC_STRING,	\
559184610Salfred  .bData = { m },			\
560184610Salfred}
561184610Salfred
562192984Sthompsastruct usb_hub_descriptor {
563184610Salfred	uByte	bDescLength;
564184610Salfred	uByte	bDescriptorType;
565184610Salfred	uByte	bNbrPorts;
566184610Salfred	uWord	wHubCharacteristics;
567184610Salfred#define	UHD_PWR			0x0003
568184610Salfred#define	UHD_PWR_GANGED		0x0000
569184610Salfred#define	UHD_PWR_INDIVIDUAL	0x0001
570184610Salfred#define	UHD_PWR_NO_SWITCH	0x0002
571184610Salfred#define	UHD_COMPOUND		0x0004
572184610Salfred#define	UHD_OC			0x0018
573184610Salfred#define	UHD_OC_GLOBAL		0x0000
574184610Salfred#define	UHD_OC_INDIVIDUAL	0x0008
575184610Salfred#define	UHD_OC_NONE		0x0010
576184610Salfred#define	UHD_TT_THINK		0x0060
577184610Salfred#define	UHD_TT_THINK_8		0x0000
578184610Salfred#define	UHD_TT_THINK_16		0x0020
579184610Salfred#define	UHD_TT_THINK_24		0x0040
580184610Salfred#define	UHD_TT_THINK_32		0x0060
581184610Salfred#define	UHD_PORT_IND		0x0080
582184610Salfred	uByte	bPwrOn2PwrGood;		/* delay in 2 ms units */
583184610Salfred#define	UHD_PWRON_FACTOR 2
584184610Salfred	uByte	bHubContrCurrent;
585184610Salfred	uByte	DeviceRemovable[32];	/* max 255 ports */
586184610Salfred#define	UHD_NOT_REMOV(desc, i) \
587184610Salfred    (((desc)->DeviceRemovable[(i)/8] >> ((i) % 8)) & 1)
588185290Salfred	uByte	PortPowerCtrlMask[1];	/* deprecated */
589184610Salfred} __packed;
590192984Sthompsatypedef struct usb_hub_descriptor usb_hub_descriptor_t;
591184610Salfred
592192984Sthompsastruct usb_hub_ss_descriptor {
593185290Salfred	uByte	bDescLength;
594185290Salfred	uByte	bDescriptorType;
595185290Salfred	uByte	bNbrPorts;		/* max 15 */
596185290Salfred	uWord	wHubCharacteristics;
597185290Salfred	uByte	bPwrOn2PwrGood;		/* delay in 2 ms units */
598185290Salfred	uByte	bHubContrCurrent;
599185290Salfred	uByte	bHubHdrDecLat;
600185290Salfred	uWord	wHubDelay;
601185290Salfred	uByte	DeviceRemovable[2];	/* max 15 ports */
602185290Salfred} __packed;
603192984Sthompsatypedef struct usb_hub_ss_descriptor usb_hub_ss_descriptor_t;
604185290Salfred
605184610Salfred/* minimum HUB descriptor (8-ports maximum) */
606192984Sthompsastruct usb_hub_descriptor_min {
607184610Salfred	uByte	bDescLength;
608184610Salfred	uByte	bDescriptorType;
609184610Salfred	uByte	bNbrPorts;
610184610Salfred	uWord	wHubCharacteristics;
611184610Salfred	uByte	bPwrOn2PwrGood;
612184610Salfred	uByte	bHubContrCurrent;
613184610Salfred	uByte	DeviceRemovable[1];
614184610Salfred	uByte	PortPowerCtrlMask[1];
615184610Salfred} __packed;
616192984Sthompsatypedef struct usb_hub_descriptor_min usb_hub_descriptor_min_t;
617184610Salfred
618192984Sthompsastruct usb_device_qualifier {
619184610Salfred	uByte	bLength;
620184610Salfred	uByte	bDescriptorType;
621184610Salfred	uWord	bcdUSB;
622184610Salfred	uByte	bDeviceClass;
623184610Salfred	uByte	bDeviceSubClass;
624184610Salfred	uByte	bDeviceProtocol;
625184610Salfred	uByte	bMaxPacketSize0;
626184610Salfred	uByte	bNumConfigurations;
627184610Salfred	uByte	bReserved;
628184610Salfred} __packed;
629192984Sthompsatypedef struct usb_device_qualifier usb_device_qualifier_t;
630184610Salfred
631192984Sthompsastruct usb_otg_descriptor {
632184610Salfred	uByte	bLength;
633184610Salfred	uByte	bDescriptorType;
634184610Salfred	uByte	bmAttributes;
635184610Salfred#define	UOTG_SRP	0x01
636184610Salfred#define	UOTG_HNP	0x02
637184610Salfred} __packed;
638192984Sthompsatypedef struct usb_otg_descriptor usb_otg_descriptor_t;
639184610Salfred
640184610Salfred/* OTG feature selectors */
641184610Salfred#define	UOTG_B_HNP_ENABLE	3
642184610Salfred#define	UOTG_A_HNP_SUPPORT	4
643184610Salfred#define	UOTG_A_ALT_HNP_SUPPORT	5
644184610Salfred
645192984Sthompsastruct usb_status {
646184610Salfred	uWord	wStatus;
647184610Salfred/* Device status flags */
648184610Salfred#define	UDS_SELF_POWERED		0x0001
649184610Salfred#define	UDS_REMOTE_WAKEUP		0x0002
650184610Salfred/* Endpoint status flags */
651184610Salfred#define	UES_HALT			0x0001
652184610Salfred} __packed;
653192984Sthompsatypedef struct usb_status usb_status_t;
654184610Salfred
655192984Sthompsastruct usb_hub_status {
656184610Salfred	uWord	wHubStatus;
657184610Salfred#define	UHS_LOCAL_POWER			0x0001
658184610Salfred#define	UHS_OVER_CURRENT		0x0002
659184610Salfred	uWord	wHubChange;
660184610Salfred} __packed;
661192984Sthompsatypedef struct usb_hub_status usb_hub_status_t;
662184610Salfred
663192984Sthompsastruct usb_port_status {
664184610Salfred	uWord	wPortStatus;
665184610Salfred#define	UPS_CURRENT_CONNECT_STATUS	0x0001
666184610Salfred#define	UPS_PORT_ENABLED		0x0002
667184610Salfred#define	UPS_SUSPEND			0x0004
668184610Salfred#define	UPS_OVERCURRENT_INDICATOR	0x0008
669184610Salfred#define	UPS_RESET			0x0010
670184610Salfred#define	UPS_PORT_POWER			0x0100
671184610Salfred#define	UPS_LOW_SPEED			0x0200
672184610Salfred#define	UPS_HIGH_SPEED			0x0400
673184610Salfred#define	UPS_PORT_TEST			0x0800
674184610Salfred#define	UPS_PORT_INDICATOR		0x1000
675187180Sthompsa#define	UPS_PORT_MODE_DEVICE		0x8000	/* currently FreeBSD specific */
676184610Salfred	uWord	wPortChange;
677184610Salfred#define	UPS_C_CONNECT_STATUS		0x0001
678184610Salfred#define	UPS_C_PORT_ENABLED		0x0002
679184610Salfred#define	UPS_C_SUSPEND			0x0004
680184610Salfred#define	UPS_C_OVERCURRENT_INDICATOR	0x0008
681184610Salfred#define	UPS_C_PORT_RESET		0x0010
682184610Salfred} __packed;
683192984Sthompsatypedef struct usb_port_status usb_port_status_t;
684184610Salfred
685194677Sthompsa/*
686194677Sthompsa * The "USB_SPEED" macros defines all the supported USB speeds.
687194677Sthompsa */
688194677Sthompsaenum usb_dev_speed {
689194677Sthompsa	USB_SPEED_VARIABLE,
690194677Sthompsa	USB_SPEED_LOW,
691194677Sthompsa	USB_SPEED_FULL,
692194677Sthompsa	USB_SPEED_HIGH,
693194677Sthompsa	USB_SPEED_SUPER,
694194677Sthompsa};
695194677Sthompsa#define	USB_SPEED_MAX	(USB_SPEED_SUPER+1)
696194677Sthompsa
697194677Sthompsa/*
698194677Sthompsa * The "USB_REV" macros defines all the supported USB revisions.
699194677Sthompsa */
700194677Sthompsaenum usb_revision {
701194677Sthompsa	USB_REV_UNKNOWN,
702194677Sthompsa	USB_REV_PRE_1_0,
703194677Sthompsa	USB_REV_1_0,
704194677Sthompsa	USB_REV_1_1,
705194677Sthompsa	USB_REV_2_0,
706194677Sthompsa	USB_REV_2_5,
707194677Sthompsa	USB_REV_3_0
708194677Sthompsa};
709194677Sthompsa#define	USB_REV_MAX	(USB_REV_3_0+1)
710194677Sthompsa
711194677Sthompsa/*
712194677Sthompsa * Supported host contoller modes.
713194677Sthompsa */
714194677Sthompsaenum usb_hc_mode {
715194677Sthompsa	USB_MODE_HOST,		/* initiates transfers */
716194677Sthompsa	USB_MODE_DEVICE,	/* bus transfer target */
717194677Sthompsa	USB_MODE_DUAL		/* can be host or device */
718194677Sthompsa};
719194677Sthompsa#define	USB_MODE_MAX	(USB_MODE_DUAL+1)
720194677Sthompsa
721194677Sthompsa/*
722194677Sthompsa * The "USB_MODE" macros defines all the supported device states.
723194677Sthompsa */
724194677Sthompsaenum usb_dev_state {
725194677Sthompsa	USB_STATE_DETACHED,
726194677Sthompsa	USB_STATE_ATTACHED,
727194677Sthompsa	USB_STATE_POWERED,
728194677Sthompsa	USB_STATE_ADDRESSED,
729194677Sthompsa	USB_STATE_CONFIGURED,
730194677Sthompsa};
731194677Sthompsa#define	USB_STATE_MAX	(USB_STATE_CONFIGURED+1)
732194230Sthompsa#endif					/* _USB_STANDARD_H_ */
733