usb.h revision 233771
1184610Salfred/* $FreeBSD: head/sys/dev/usb/usb.h 233771 2012-04-02 07:51:30Z hselasky $ */
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
211213427Shselasky#define	UDESC_SS_HUB		0x2A	/* super speed */
212185290Salfred#define	UDESC_ENDPOINT_SS_COMP	0x30	/* super speed */
213184610Salfred#define	UR_SET_DESCRIPTOR	0x07
214184610Salfred#define	UR_GET_CONFIG		0x08
215184610Salfred#define	UR_SET_CONFIG		0x09
216184610Salfred#define	UR_GET_INTERFACE	0x0a
217184610Salfred#define	UR_SET_INTERFACE	0x0b
218184610Salfred#define	UR_SYNCH_FRAME		0x0c
219185290Salfred#define	UR_SET_SEL		0x30
220185290Salfred#define	UR_ISOCH_DELAY		0x31
221184610Salfred
222184610Salfred/* HUB specific request */
223184610Salfred#define	UR_GET_BUS_STATE	0x02
224184610Salfred#define	UR_CLEAR_TT_BUFFER	0x08
225184610Salfred#define	UR_RESET_TT		0x09
226184610Salfred#define	UR_GET_TT_STATE		0x0a
227184610Salfred#define	UR_STOP_TT		0x0b
228233771Shselasky#define	UR_SET_AND_TEST		0x0c	/* USB 2.0 only */
229233771Shselasky#define	UR_SET_HUB_DEPTH	0x0c	/* USB 3.0 only */
230213427Shselasky#define	USB_SS_HUB_DEPTH_MAX	5
231185290Salfred#define	UR_GET_PORT_ERR_COUNT	0x0d
232184610Salfred
233184610Salfred/* Feature numbers */
234184610Salfred#define	UF_ENDPOINT_HALT	0
235184610Salfred#define	UF_DEVICE_REMOTE_WAKEUP	1
236184610Salfred#define	UF_TEST_MODE		2
237185290Salfred#define	UF_U1_ENABLE		0x30
238185290Salfred#define	UF_U2_ENABLE		0x31
239185290Salfred#define	UF_LTM_ENABLE		0x32
240184610Salfred
241184610Salfred/* HUB specific features */
242184610Salfred#define	UHF_C_HUB_LOCAL_POWER	0
243184610Salfred#define	UHF_C_HUB_OVER_CURRENT	1
244184610Salfred#define	UHF_PORT_CONNECTION	0
245184610Salfred#define	UHF_PORT_ENABLE		1
246184610Salfred#define	UHF_PORT_SUSPEND	2
247184610Salfred#define	UHF_PORT_OVER_CURRENT	3
248184610Salfred#define	UHF_PORT_RESET		4
249185290Salfred#define	UHF_PORT_LINK_STATE	5
250184610Salfred#define	UHF_PORT_POWER		8
251184610Salfred#define	UHF_PORT_LOW_SPEED	9
252233771Shselasky#define	UHF_PORT_L1		10
253184610Salfred#define	UHF_C_PORT_CONNECTION	16
254184610Salfred#define	UHF_C_PORT_ENABLE	17
255184610Salfred#define	UHF_C_PORT_SUSPEND	18
256184610Salfred#define	UHF_C_PORT_OVER_CURRENT	19
257184610Salfred#define	UHF_C_PORT_RESET	20
258184610Salfred#define	UHF_PORT_TEST		21
259184610Salfred#define	UHF_PORT_INDICATOR	22
260233771Shselasky#define	UHF_C_PORT_L1		23
261184610Salfred
262185290Salfred/* SuperSpeed HUB specific features */
263185290Salfred#define	UHF_PORT_U1_TIMEOUT	23
264185290Salfred#define	UHF_PORT_U2_TIMEOUT	24
265185290Salfred#define	UHF_C_PORT_LINK_STATE	25
266185290Salfred#define	UHF_C_PORT_CONFIG_ERROR	26
267185290Salfred#define	UHF_PORT_REMOTE_WAKE_MASK	27
268185290Salfred#define	UHF_BH_PORT_RESET	28
269185290Salfred#define	UHF_C_BH_PORT_RESET	29
270185290Salfred#define	UHF_FORCE_LINKPM_ACCEPT	30
271185290Salfred
272192984Sthompsastruct usb_descriptor {
273184610Salfred	uByte	bLength;
274184610Salfred	uByte	bDescriptorType;
275184610Salfred	uByte	bDescriptorSubtype;
276184610Salfred} __packed;
277192984Sthompsatypedef struct usb_descriptor usb_descriptor_t;
278184610Salfred
279192984Sthompsastruct usb_device_descriptor {
280184610Salfred	uByte	bLength;
281184610Salfred	uByte	bDescriptorType;
282184610Salfred	uWord	bcdUSB;
283184610Salfred#define	UD_USB_2_0		0x0200
284185290Salfred#define	UD_USB_3_0		0x0300
285185290Salfred#define	UD_IS_USB2(d) ((d)->bcdUSB[1] == 0x02)
286185290Salfred#define	UD_IS_USB3(d) ((d)->bcdUSB[1] == 0x03)
287184610Salfred	uByte	bDeviceClass;
288184610Salfred	uByte	bDeviceSubClass;
289184610Salfred	uByte	bDeviceProtocol;
290184610Salfred	uByte	bMaxPacketSize;
291184610Salfred	/* The fields below are not part of the initial descriptor. */
292184610Salfred	uWord	idVendor;
293184610Salfred	uWord	idProduct;
294184610Salfred	uWord	bcdDevice;
295184610Salfred	uByte	iManufacturer;
296184610Salfred	uByte	iProduct;
297184610Salfred	uByte	iSerialNumber;
298184610Salfred	uByte	bNumConfigurations;
299184610Salfred} __packed;
300192984Sthompsatypedef struct usb_device_descriptor usb_device_descriptor_t;
301184610Salfred
302185290Salfred/* Binary Device Object Store (BOS) */
303192984Sthompsastruct usb_bos_descriptor {
304185290Salfred	uByte	bLength;
305185290Salfred	uByte	bDescriptorType;
306185290Salfred	uWord	wTotalLength;
307185290Salfred	uByte	bNumDeviceCaps;
308185290Salfred} __packed;
309192984Sthompsatypedef struct usb_bos_descriptor usb_bos_descriptor_t;
310185290Salfred
311185290Salfred/* Binary Device Object Store Capability */
312192984Sthompsastruct usb_bos_cap_descriptor {
313185290Salfred	uByte	bLength;
314185290Salfred	uByte	bDescriptorType;
315185290Salfred	uByte	bDevCapabilityType;
316185290Salfred#define	USB_DEVCAP_RESERVED	0x00
317185290Salfred#define	USB_DEVCAP_WUSB		0x01
318185290Salfred#define	USB_DEVCAP_USB2EXT	0x02
319185290Salfred#define	USB_DEVCAP_SUPER_SPEED	0x03
320185290Salfred#define	USB_DEVCAP_CONTAINER_ID	0x04
321185290Salfred	/* data ... */
322185290Salfred} __packed;
323192984Sthompsatypedef struct usb_bos_cap_descriptor usb_bos_cap_descriptor_t;
324185290Salfred
325192984Sthompsastruct usb_devcap_usb2ext_descriptor {
326185290Salfred	uByte	bLength;
327185290Salfred	uByte	bDescriptorType;
328185290Salfred	uByte	bDevCapabilityType;
329227401Shselasky	uDWord	bmAttributes;
330233771Shselasky#define	USB_V2EXT_LPM (1U << 1)
331233771Shselasky#define	USB_V2EXT_BESL_SUPPORTED (1U << 2)
332233771Shselasky#define	USB_V2EXT_BESL_BASELINE_VALID (1U << 3)
333233771Shselasky#define	USB_V2EXT_BESL_DEEP_VALID (1U << 4)
334233771Shselasky#define	USB_V2EXT_BESL_BASELINE_GET(x) (((x) >> 8) & 0xF)
335233771Shselasky#define	USB_V2EXT_BESL_DEEP_GET(x) (((x) >> 12) & 0xF)
336185290Salfred} __packed;
337192984Sthompsatypedef struct usb_devcap_usb2ext_descriptor usb_devcap_usb2ext_descriptor_t;
338185290Salfred
339192984Sthompsastruct usb_devcap_ss_descriptor {
340185290Salfred	uByte	bLength;
341185290Salfred	uByte	bDescriptorType;
342185290Salfred	uByte	bDevCapabilityType;
343185290Salfred	uByte	bmAttributes;
344185290Salfred	uWord	wSpeedsSupported;
345213427Shselasky	uByte	bFunctionalitySupport;
346185290Salfred	uByte	bU1DevExitLat;
347227396Shselasky	uWord	wU2DevExitLat;
348185290Salfred} __packed;
349192984Sthompsatypedef struct usb_devcap_ss_descriptor usb_devcap_ss_descriptor_t;
350185290Salfred
351192984Sthompsastruct usb_devcap_container_id_descriptor {
352185290Salfred	uByte	bLength;
353185290Salfred	uByte	bDescriptorType;
354185290Salfred	uByte	bDevCapabilityType;
355185290Salfred	uByte	bReserved;
356213427Shselasky	uByte	bContainerID;
357185290Salfred} __packed;
358192984Sthompsatypedef struct usb_devcap_container_id_descriptor
359188947Sthompsa		usb_devcap_container_id_descriptor_t;
360185290Salfred
361184610Salfred/* Device class codes */
362184610Salfred#define	UDCLASS_IN_INTERFACE	0x00
363184610Salfred#define	UDCLASS_COMM		0x02
364184610Salfred#define	UDCLASS_HUB		0x09
365184610Salfred#define	UDSUBCLASS_HUB		0x00
366184610Salfred#define	UDPROTO_FSHUB		0x00
367184610Salfred#define	UDPROTO_HSHUBSTT	0x01
368184610Salfred#define	UDPROTO_HSHUBMTT	0x02
369213427Shselasky#define	UDPROTO_SSHUB		0x03
370184610Salfred#define	UDCLASS_DIAGNOSTIC	0xdc
371184610Salfred#define	UDCLASS_WIRELESS	0xe0
372184610Salfred#define	UDSUBCLASS_RF		0x01
373184610Salfred#define	UDPROTO_BLUETOOTH	0x01
374184610Salfred#define	UDCLASS_VENDOR		0xff
375184610Salfred
376192984Sthompsastruct usb_config_descriptor {
377184610Salfred	uByte	bLength;
378184610Salfred	uByte	bDescriptorType;
379184610Salfred	uWord	wTotalLength;
380184610Salfred	uByte	bNumInterface;
381184610Salfred	uByte	bConfigurationValue;
382184610Salfred#define	USB_UNCONFIG_NO 0
383184610Salfred	uByte	iConfiguration;
384184610Salfred	uByte	bmAttributes;
385184610Salfred#define	UC_BUS_POWERED		0x80
386184610Salfred#define	UC_SELF_POWERED		0x40
387184610Salfred#define	UC_REMOTE_WAKEUP	0x20
388184610Salfred	uByte	bMaxPower;		/* max current in 2 mA units */
389184610Salfred#define	UC_POWER_FACTOR 2
390184610Salfred} __packed;
391192984Sthompsatypedef struct usb_config_descriptor usb_config_descriptor_t;
392184610Salfred
393192984Sthompsastruct usb_interface_descriptor {
394184610Salfred	uByte	bLength;
395184610Salfred	uByte	bDescriptorType;
396184610Salfred	uByte	bInterfaceNumber;
397184610Salfred	uByte	bAlternateSetting;
398184610Salfred	uByte	bNumEndpoints;
399184610Salfred	uByte	bInterfaceClass;
400184610Salfred	uByte	bInterfaceSubClass;
401184610Salfred	uByte	bInterfaceProtocol;
402184610Salfred	uByte	iInterface;
403184610Salfred} __packed;
404192984Sthompsatypedef struct usb_interface_descriptor usb_interface_descriptor_t;
405184610Salfred
406192984Sthompsastruct usb_interface_assoc_descriptor {
407185290Salfred	uByte	bLength;
408185290Salfred	uByte	bDescriptorType;
409185290Salfred	uByte	bFirstInterface;
410185290Salfred	uByte	bInterfaceCount;
411185290Salfred	uByte	bFunctionClass;
412185290Salfred	uByte	bFunctionSubClass;
413185290Salfred	uByte	bFunctionProtocol;
414185290Salfred	uByte	iFunction;
415185290Salfred} __packed;
416192984Sthompsatypedef struct usb_interface_assoc_descriptor usb_interface_assoc_descriptor_t;
417185290Salfred
418184610Salfred/* Interface class codes */
419184610Salfred#define	UICLASS_UNSPEC		0x00
420184610Salfred#define	UICLASS_AUDIO		0x01	/* audio */
421184610Salfred#define	UISUBCLASS_AUDIOCONTROL	1
422184610Salfred#define	UISUBCLASS_AUDIOSTREAM		2
423184610Salfred#define	UISUBCLASS_MIDISTREAM		3
424184610Salfred
425184610Salfred#define	UICLASS_CDC		0x02	/* communication */
426184610Salfred#define	UISUBCLASS_DIRECT_LINE_CONTROL_MODEL	1
427184610Salfred#define	UISUBCLASS_ABSTRACT_CONTROL_MODEL	2
428184610Salfred#define	UISUBCLASS_TELEPHONE_CONTROL_MODEL	3
429184610Salfred#define	UISUBCLASS_MULTICHANNEL_CONTROL_MODEL	4
430184610Salfred#define	UISUBCLASS_CAPI_CONTROLMODEL		5
431184610Salfred#define	UISUBCLASS_ETHERNET_NETWORKING_CONTROL_MODEL 6
432184610Salfred#define	UISUBCLASS_ATM_NETWORKING_CONTROL_MODEL 7
433184610Salfred#define	UISUBCLASS_WIRELESS_HANDSET_CM 8
434184610Salfred#define	UISUBCLASS_DEVICE_MGMT 9
435184610Salfred#define	UISUBCLASS_MOBILE_DIRECT_LINE_MODEL 10
436184610Salfred#define	UISUBCLASS_OBEX 11
437184610Salfred#define	UISUBCLASS_ETHERNET_EMULATION_MODEL 12
438197563Sthompsa#define	UISUBCLASS_NETWORK_CONTROL_MODEL 13
439184610Salfred
440184610Salfred#define	UIPROTO_CDC_AT			1
441184610Salfred
442184610Salfred#define	UICLASS_HID		0x03
443184610Salfred#define	UISUBCLASS_BOOT		1
444184610Salfred#define	UIPROTO_BOOT_KEYBOARD	1
445184610Salfred#define	UIPROTO_MOUSE		2
446184610Salfred
447184610Salfred#define	UICLASS_PHYSICAL	0x05
448184610Salfred#define	UICLASS_IMAGE		0x06
449184610Salfred#define	UISUBCLASS_SIC		1	/* still image class */
450184610Salfred#define	UICLASS_PRINTER		0x07
451184610Salfred#define	UISUBCLASS_PRINTER	1
452184610Salfred#define	UIPROTO_PRINTER_UNI	1
453184610Salfred#define	UIPROTO_PRINTER_BI	2
454184610Salfred#define	UIPROTO_PRINTER_1284	3
455184610Salfred
456184610Salfred#define	UICLASS_MASS		0x08
457184610Salfred#define	UISUBCLASS_RBC		1
458184610Salfred#define	UISUBCLASS_SFF8020I	2
459184610Salfred#define	UISUBCLASS_QIC157	3
460184610Salfred#define	UISUBCLASS_UFI		4
461184610Salfred#define	UISUBCLASS_SFF8070I	5
462184610Salfred#define	UISUBCLASS_SCSI		6
463184610Salfred#define	UIPROTO_MASS_CBI_I	0
464184610Salfred#define	UIPROTO_MASS_CBI	1
465184610Salfred#define	UIPROTO_MASS_BBB_OLD	2	/* Not in the spec anymore */
466184610Salfred#define	UIPROTO_MASS_BBB	80	/* 'P' for the Iomega Zip drive */
467184610Salfred
468184610Salfred#define	UICLASS_HUB		0x09
469184610Salfred#define	UISUBCLASS_HUB		0
470184610Salfred#define	UIPROTO_FSHUB		0
471184610Salfred#define	UIPROTO_HSHUBSTT	0	/* Yes, same as previous */
472184610Salfred#define	UIPROTO_HSHUBMTT	1
473184610Salfred
474184610Salfred#define	UICLASS_CDC_DATA	0x0a
475197563Sthompsa#define	UISUBCLASS_DATA		0x00
476184610Salfred#define	UIPROTO_DATA_ISDNBRI		0x30	/* Physical iface */
477184610Salfred#define	UIPROTO_DATA_HDLC		0x31	/* HDLC */
478184610Salfred#define	UIPROTO_DATA_TRANSPARENT	0x32	/* Transparent */
479184610Salfred#define	UIPROTO_DATA_Q921M		0x50	/* Management for Q921 */
480184610Salfred#define	UIPROTO_DATA_Q921		0x51	/* Data for Q921 */
481184610Salfred#define	UIPROTO_DATA_Q921TM		0x52	/* TEI multiplexer for Q921 */
482184610Salfred#define	UIPROTO_DATA_V42BIS		0x90	/* Data compression */
483184610Salfred#define	UIPROTO_DATA_Q931		0x91	/* Euro-ISDN */
484184610Salfred#define	UIPROTO_DATA_V120		0x92	/* V.24 rate adaption */
485184610Salfred#define	UIPROTO_DATA_CAPI		0x93	/* CAPI 2.0 commands */
486184610Salfred#define	UIPROTO_DATA_HOST_BASED		0xfd	/* Host based driver */
487184610Salfred#define	UIPROTO_DATA_PUF		0xfe	/* see Prot. Unit Func. Desc. */
488184610Salfred#define	UIPROTO_DATA_VENDOR		0xff	/* Vendor specific */
489197563Sthompsa#define	UIPROTO_DATA_NCM		0x01	/* Network Control Model */
490184610Salfred
491184610Salfred#define	UICLASS_SMARTCARD	0x0b
492184610Salfred#define	UICLASS_FIRM_UPD	0x0c
493184610Salfred#define	UICLASS_SECURITY	0x0d
494184610Salfred#define	UICLASS_DIAGNOSTIC	0xdc
495184610Salfred#define	UICLASS_WIRELESS	0xe0
496184610Salfred#define	UISUBCLASS_RF			0x01
497184610Salfred#define	UIPROTO_BLUETOOTH		0x01
498184610Salfred
499196493Salfred#define	UICLASS_IAD		0xEF	/* Interface Association Descriptor */
500196493Salfred
501184610Salfred#define	UICLASS_APPL_SPEC	0xfe
502184610Salfred#define	UISUBCLASS_FIRMWARE_DOWNLOAD	1
503184610Salfred#define	UISUBCLASS_IRDA			2
504184610Salfred#define	UIPROTO_IRDA			0
505184610Salfred
506184610Salfred#define	UICLASS_VENDOR		0xff
507184610Salfred#define	UISUBCLASS_XBOX360_CONTROLLER	0x5d
508184610Salfred#define	UIPROTO_XBOX360_GAMEPAD	0x01
509184610Salfred
510192984Sthompsastruct usb_endpoint_descriptor {
511184610Salfred	uByte	bLength;
512184610Salfred	uByte	bDescriptorType;
513184610Salfred	uByte	bEndpointAddress;
514184610Salfred#define	UE_GET_DIR(a)	((a) & 0x80)
515184610Salfred#define	UE_SET_DIR(a,d)	((a) | (((d)&1) << 7))
516190732Sthompsa#define	UE_DIR_IN	0x80		/* IN-token endpoint, fixed */
517190732Sthompsa#define	UE_DIR_OUT	0x00		/* OUT-token endpoint, fixed */
518190732Sthompsa#define	UE_DIR_RX	0xfd		/* for internal use only! */
519190732Sthompsa#define	UE_DIR_TX	0xfe		/* for internal use only! */
520184610Salfred#define	UE_DIR_ANY	0xff		/* for internal use only! */
521184610Salfred#define	UE_ADDR		0x0f
522184610Salfred#define	UE_ADDR_ANY	0xff		/* for internal use only! */
523184610Salfred#define	UE_GET_ADDR(a)	((a) & UE_ADDR)
524184610Salfred	uByte	bmAttributes;
525184610Salfred#define	UE_XFERTYPE	0x03
526184610Salfred#define	UE_CONTROL	0x00
527184610Salfred#define	UE_ISOCHRONOUS	0x01
528184610Salfred#define	UE_BULK	0x02
529184610Salfred#define	UE_INTERRUPT	0x03
530184610Salfred#define	UE_BULK_INTR	0xfe		/* for internal use only! */
531184610Salfred#define	UE_TYPE_ANY	0xff		/* for internal use only! */
532184610Salfred#define	UE_GET_XFERTYPE(a)	((a) & UE_XFERTYPE)
533184610Salfred#define	UE_ISO_TYPE	0x0c
534184610Salfred#define	UE_ISO_ASYNC	0x04
535184610Salfred#define	UE_ISO_ADAPT	0x08
536184610Salfred#define	UE_ISO_SYNC	0x0c
537184610Salfred#define	UE_GET_ISO_TYPE(a)	((a) & UE_ISO_TYPE)
538184610Salfred	uWord	wMaxPacketSize;
539184610Salfred#define	UE_ZERO_MPS 0xFFFF		/* for internal use only */
540184610Salfred	uByte	bInterval;
541184610Salfred} __packed;
542192984Sthompsatypedef struct usb_endpoint_descriptor usb_endpoint_descriptor_t;
543184610Salfred
544192984Sthompsastruct usb_endpoint_ss_comp_descriptor {
545185290Salfred	uByte	bLength;
546185290Salfred	uByte	bDescriptorType;
547213427Shselasky	uByte	bMaxBurst;
548185290Salfred	uByte	bmAttributes;
549185290Salfred	uWord	wBytesPerInterval;
550185290Salfred} __packed;
551192984Sthompsatypedef struct usb_endpoint_ss_comp_descriptor
552188947Sthompsa		usb_endpoint_ss_comp_descriptor_t;
553185290Salfred
554192984Sthompsastruct usb_string_descriptor {
555184610Salfred	uByte	bLength;
556184610Salfred	uByte	bDescriptorType;
557184610Salfred	uWord	bString[126];
558184610Salfred	uByte	bUnused;
559184610Salfred} __packed;
560192984Sthompsatypedef struct usb_string_descriptor usb_string_descriptor_t;
561184610Salfred
562184610Salfred#define	USB_MAKE_STRING_DESC(m,name)	\
563184610Salfredstruct name {				\
564184610Salfred  uByte bLength;			\
565184610Salfred  uByte bDescriptorType;		\
566184610Salfred  uByte bData[sizeof((uint8_t []){m})];	\
567184610Salfred} __packed;				\
568184610Salfredstatic const struct name name = {	\
569184610Salfred  .bLength = sizeof(struct name),	\
570184610Salfred  .bDescriptorType = UDESC_STRING,	\
571184610Salfred  .bData = { m },			\
572184610Salfred}
573184610Salfred
574192984Sthompsastruct usb_hub_descriptor {
575184610Salfred	uByte	bDescLength;
576184610Salfred	uByte	bDescriptorType;
577184610Salfred	uByte	bNbrPorts;
578184610Salfred	uWord	wHubCharacteristics;
579184610Salfred#define	UHD_PWR			0x0003
580184610Salfred#define	UHD_PWR_GANGED		0x0000
581184610Salfred#define	UHD_PWR_INDIVIDUAL	0x0001
582184610Salfred#define	UHD_PWR_NO_SWITCH	0x0002
583184610Salfred#define	UHD_COMPOUND		0x0004
584184610Salfred#define	UHD_OC			0x0018
585184610Salfred#define	UHD_OC_GLOBAL		0x0000
586184610Salfred#define	UHD_OC_INDIVIDUAL	0x0008
587184610Salfred#define	UHD_OC_NONE		0x0010
588184610Salfred#define	UHD_TT_THINK		0x0060
589184610Salfred#define	UHD_TT_THINK_8		0x0000
590184610Salfred#define	UHD_TT_THINK_16		0x0020
591184610Salfred#define	UHD_TT_THINK_24		0x0040
592184610Salfred#define	UHD_TT_THINK_32		0x0060
593184610Salfred#define	UHD_PORT_IND		0x0080
594184610Salfred	uByte	bPwrOn2PwrGood;		/* delay in 2 ms units */
595184610Salfred#define	UHD_PWRON_FACTOR 2
596184610Salfred	uByte	bHubContrCurrent;
597184610Salfred	uByte	DeviceRemovable[32];	/* max 255 ports */
598184610Salfred#define	UHD_NOT_REMOV(desc, i) \
599184610Salfred    (((desc)->DeviceRemovable[(i)/8] >> ((i) % 8)) & 1)
600185290Salfred	uByte	PortPowerCtrlMask[1];	/* deprecated */
601184610Salfred} __packed;
602192984Sthompsatypedef struct usb_hub_descriptor usb_hub_descriptor_t;
603184610Salfred
604192984Sthompsastruct usb_hub_ss_descriptor {
605213427Shselasky	uByte	bLength;
606185290Salfred	uByte	bDescriptorType;
607213427Shselasky	uByte	bNbrPorts;
608185290Salfred	uWord	wHubCharacteristics;
609185290Salfred	uByte	bPwrOn2PwrGood;		/* delay in 2 ms units */
610185290Salfred	uByte	bHubContrCurrent;
611185290Salfred	uByte	bHubHdrDecLat;
612185290Salfred	uWord	wHubDelay;
613213427Shselasky	uByte	DeviceRemovable[32];	/* max 255 ports */
614185290Salfred} __packed;
615192984Sthompsatypedef struct usb_hub_ss_descriptor usb_hub_ss_descriptor_t;
616185290Salfred
617184610Salfred/* minimum HUB descriptor (8-ports maximum) */
618192984Sthompsastruct usb_hub_descriptor_min {
619184610Salfred	uByte	bDescLength;
620184610Salfred	uByte	bDescriptorType;
621184610Salfred	uByte	bNbrPorts;
622184610Salfred	uWord	wHubCharacteristics;
623184610Salfred	uByte	bPwrOn2PwrGood;
624184610Salfred	uByte	bHubContrCurrent;
625184610Salfred	uByte	DeviceRemovable[1];
626184610Salfred	uByte	PortPowerCtrlMask[1];
627184610Salfred} __packed;
628192984Sthompsatypedef struct usb_hub_descriptor_min usb_hub_descriptor_min_t;
629184610Salfred
630192984Sthompsastruct usb_device_qualifier {
631184610Salfred	uByte	bLength;
632184610Salfred	uByte	bDescriptorType;
633184610Salfred	uWord	bcdUSB;
634184610Salfred	uByte	bDeviceClass;
635184610Salfred	uByte	bDeviceSubClass;
636184610Salfred	uByte	bDeviceProtocol;
637184610Salfred	uByte	bMaxPacketSize0;
638184610Salfred	uByte	bNumConfigurations;
639184610Salfred	uByte	bReserved;
640184610Salfred} __packed;
641192984Sthompsatypedef struct usb_device_qualifier usb_device_qualifier_t;
642184610Salfred
643192984Sthompsastruct usb_otg_descriptor {
644184610Salfred	uByte	bLength;
645184610Salfred	uByte	bDescriptorType;
646184610Salfred	uByte	bmAttributes;
647184610Salfred#define	UOTG_SRP	0x01
648184610Salfred#define	UOTG_HNP	0x02
649184610Salfred} __packed;
650192984Sthompsatypedef struct usb_otg_descriptor usb_otg_descriptor_t;
651184610Salfred
652184610Salfred/* OTG feature selectors */
653184610Salfred#define	UOTG_B_HNP_ENABLE	3
654184610Salfred#define	UOTG_A_HNP_SUPPORT	4
655184610Salfred#define	UOTG_A_ALT_HNP_SUPPORT	5
656184610Salfred
657192984Sthompsastruct usb_status {
658184610Salfred	uWord	wStatus;
659184610Salfred/* Device status flags */
660184610Salfred#define	UDS_SELF_POWERED		0x0001
661184610Salfred#define	UDS_REMOTE_WAKEUP		0x0002
662184610Salfred/* Endpoint status flags */
663184610Salfred#define	UES_HALT			0x0001
664184610Salfred} __packed;
665192984Sthompsatypedef struct usb_status usb_status_t;
666184610Salfred
667192984Sthompsastruct usb_hub_status {
668184610Salfred	uWord	wHubStatus;
669184610Salfred#define	UHS_LOCAL_POWER			0x0001
670184610Salfred#define	UHS_OVER_CURRENT		0x0002
671184610Salfred	uWord	wHubChange;
672184610Salfred} __packed;
673192984Sthompsatypedef struct usb_hub_status usb_hub_status_t;
674184610Salfred
675192984Sthompsastruct usb_port_status {
676184610Salfred	uWord	wPortStatus;
677184610Salfred#define	UPS_CURRENT_CONNECT_STATUS	0x0001
678184610Salfred#define	UPS_PORT_ENABLED		0x0002
679184610Salfred#define	UPS_SUSPEND			0x0004
680184610Salfred#define	UPS_OVERCURRENT_INDICATOR	0x0008
681184610Salfred#define	UPS_RESET			0x0010
682233771Shselasky#define	UPS_PORT_L1			0x0020	/* USB 2.0 only */
683213427Shselasky/* The link-state bits are valid for Super-Speed USB HUBs */
684213427Shselasky#define	UPS_PORT_LINK_STATE_GET(x)	(((x) >> 5) & 0xF)
685213427Shselasky#define	UPS_PORT_LINK_STATE_SET(x)	(((x) & 0xF) << 5)
686213427Shselasky#define	UPS_PORT_LS_U0		0x00
687213427Shselasky#define	UPS_PORT_LS_U1		0x01
688213427Shselasky#define	UPS_PORT_LS_U2		0x02
689213427Shselasky#define	UPS_PORT_LS_U3		0x03
690213427Shselasky#define	UPS_PORT_LS_SS_DIS	0x04
691213427Shselasky#define	UPS_PORT_LS_RX_DET	0x05
692213427Shselasky#define	UPS_PORT_LS_SS_INA	0x06
693213427Shselasky#define	UPS_PORT_LS_POLL	0x07
694213427Shselasky#define	UPS_PORT_LS_RECOVER	0x08
695213427Shselasky#define	UPS_PORT_LS_HOT_RST	0x09
696213427Shselasky#define	UPS_PORT_LS_COMP_MODE	0x0A
697213427Shselasky#define	UPS_PORT_LS_LOOPBACK	0x0B
698226803Shselasky#define	UPS_PORT_LS_RESUME	0x0F
699184610Salfred#define	UPS_PORT_POWER			0x0100
700230032Shselasky#define	UPS_PORT_POWER_SS		0x0200	/* super-speed only */
701184610Salfred#define	UPS_LOW_SPEED			0x0200
702184610Salfred#define	UPS_HIGH_SPEED			0x0400
703213427Shselasky#define	UPS_OTHER_SPEED			0x0600	/* currently FreeBSD specific */
704184610Salfred#define	UPS_PORT_TEST			0x0800
705184610Salfred#define	UPS_PORT_INDICATOR		0x1000
706187180Sthompsa#define	UPS_PORT_MODE_DEVICE		0x8000	/* currently FreeBSD specific */
707184610Salfred	uWord	wPortChange;
708184610Salfred#define	UPS_C_CONNECT_STATUS		0x0001
709184610Salfred#define	UPS_C_PORT_ENABLED		0x0002
710184610Salfred#define	UPS_C_SUSPEND			0x0004
711184610Salfred#define	UPS_C_OVERCURRENT_INDICATOR	0x0008
712184610Salfred#define	UPS_C_PORT_RESET		0x0010
713233771Shselasky#define	UPS_C_PORT_L1			0x0020	/* USB 2.0 only */
714233771Shselasky#define	UPS_C_BH_PORT_RESET		0x0020	/* USB 3.0 only */
715213427Shselasky#define	UPS_C_PORT_LINK_STATE		0x0040
716213427Shselasky#define	UPS_C_PORT_CONFIG_ERROR		0x0080
717184610Salfred} __packed;
718192984Sthompsatypedef struct usb_port_status usb_port_status_t;
719184610Salfred
720194677Sthompsa/*
721194677Sthompsa * The "USB_SPEED" macros defines all the supported USB speeds.
722194677Sthompsa */
723194677Sthompsaenum usb_dev_speed {
724194677Sthompsa	USB_SPEED_VARIABLE,
725194677Sthompsa	USB_SPEED_LOW,
726194677Sthompsa	USB_SPEED_FULL,
727194677Sthompsa	USB_SPEED_HIGH,
728194677Sthompsa	USB_SPEED_SUPER,
729194677Sthompsa};
730194677Sthompsa#define	USB_SPEED_MAX	(USB_SPEED_SUPER+1)
731194677Sthompsa
732194677Sthompsa/*
733194677Sthompsa * The "USB_REV" macros defines all the supported USB revisions.
734194677Sthompsa */
735194677Sthompsaenum usb_revision {
736194677Sthompsa	USB_REV_UNKNOWN,
737194677Sthompsa	USB_REV_PRE_1_0,
738194677Sthompsa	USB_REV_1_0,
739194677Sthompsa	USB_REV_1_1,
740194677Sthompsa	USB_REV_2_0,
741194677Sthompsa	USB_REV_2_5,
742194677Sthompsa	USB_REV_3_0
743194677Sthompsa};
744194677Sthompsa#define	USB_REV_MAX	(USB_REV_3_0+1)
745194677Sthompsa
746194677Sthompsa/*
747194677Sthompsa * Supported host contoller modes.
748194677Sthompsa */
749194677Sthompsaenum usb_hc_mode {
750194677Sthompsa	USB_MODE_HOST,		/* initiates transfers */
751194677Sthompsa	USB_MODE_DEVICE,	/* bus transfer target */
752194677Sthompsa	USB_MODE_DUAL		/* can be host or device */
753194677Sthompsa};
754194677Sthompsa#define	USB_MODE_MAX	(USB_MODE_DUAL+1)
755194677Sthompsa
756194677Sthompsa/*
757194677Sthompsa * The "USB_MODE" macros defines all the supported device states.
758194677Sthompsa */
759194677Sthompsaenum usb_dev_state {
760194677Sthompsa	USB_STATE_DETACHED,
761194677Sthompsa	USB_STATE_ATTACHED,
762194677Sthompsa	USB_STATE_POWERED,
763194677Sthompsa	USB_STATE_ADDRESSED,
764194677Sthompsa	USB_STATE_CONFIGURED,
765194677Sthompsa};
766194677Sthompsa#define	USB_STATE_MAX	(USB_STATE_CONFIGURED+1)
767194230Sthompsa#endif					/* _USB_STANDARD_H_ */
768