xref: /freebsd/share/man/man9/usbdi.9 (revision 0a9a8c2efa2d9fd61a61dd0dc118f445dd8054d2)
10a9a8c2eSIan Dowse.\"
20a9a8c2eSIan Dowse.\" Copyright (c) 2005 Ian Dowse <iedowse@FreeBSD.org>
30a9a8c2eSIan Dowse.\" All rights reserved.
40a9a8c2eSIan Dowse.\"
50a9a8c2eSIan Dowse.\" Redistribution and use in source and binary forms, with or without
60a9a8c2eSIan Dowse.\" modification, are permitted provided that the following conditions
70a9a8c2eSIan Dowse.\" are met:
80a9a8c2eSIan Dowse.\" 1. Redistributions of source code must retain the above copyright
90a9a8c2eSIan Dowse.\"    notice, this list of conditions and the following disclaimer.
100a9a8c2eSIan Dowse.\" 2. Redistributions in binary form must reproduce the above copyright
110a9a8c2eSIan Dowse.\"    notice, this list of conditions and the following disclaimer in the
120a9a8c2eSIan Dowse.\"    documentation and/or other materials provided with the distribution.
130a9a8c2eSIan Dowse.\"
140a9a8c2eSIan Dowse.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
150a9a8c2eSIan Dowse.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
160a9a8c2eSIan Dowse.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
170a9a8c2eSIan Dowse.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
180a9a8c2eSIan Dowse.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
190a9a8c2eSIan Dowse.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
200a9a8c2eSIan Dowse.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
210a9a8c2eSIan Dowse.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
220a9a8c2eSIan Dowse.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
230a9a8c2eSIan Dowse.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
240a9a8c2eSIan Dowse.\" SUCH DAMAGE.
250a9a8c2eSIan Dowse.\"
260a9a8c2eSIan Dowse.\"	$FreeBSD$
270a9a8c2eSIan Dowse.Dd December 30, 2005
280a9a8c2eSIan Dowse.Os
290a9a8c2eSIan Dowse.Dt USBDI 9
300a9a8c2eSIan Dowse.Sh NAME
310a9a8c2eSIan Dowse.Nm usb_detach_wait ,
320a9a8c2eSIan Dowse.Nm usb_detach_wakeup ,
330a9a8c2eSIan Dowse.Nm usb_find_desc ,
340a9a8c2eSIan Dowse.Nm usbd_abort_default_pipe ,
350a9a8c2eSIan Dowse.Nm usbd_abort_pipe ,
360a9a8c2eSIan Dowse.Nm usbd_alloc_buffer ,
370a9a8c2eSIan Dowse.Nm usbd_alloc_xfer ,
380a9a8c2eSIan Dowse.Nm usbd_bulk_transfer ,
390a9a8c2eSIan Dowse.Nm usbd_clear_endpoint_stall ,
400a9a8c2eSIan Dowse.Nm usbd_clear_endpoint_stall_async ,
410a9a8c2eSIan Dowse.Nm usbd_clear_endpoint_toggle ,
420a9a8c2eSIan Dowse.Nm usbd_close_pipe ,
430a9a8c2eSIan Dowse.Nm usbd_device2interface_handle ,
440a9a8c2eSIan Dowse.Nm usbd_devinfo ,
450a9a8c2eSIan Dowse.Nm usbd_do_request ,
460a9a8c2eSIan Dowse.Nm usbd_do_request_async ,
470a9a8c2eSIan Dowse.Nm usbd_do_request_flags ,
480a9a8c2eSIan Dowse.Nm usbd_do_request_flags_pipe ,
490a9a8c2eSIan Dowse.Nm usbd_dopoll ,
500a9a8c2eSIan Dowse.Nm usbd_endpoint_count ,
510a9a8c2eSIan Dowse.Nm usbd_errstr ,
520a9a8c2eSIan Dowse.Nm usbd_fill_deviceinfo ,
530a9a8c2eSIan Dowse.Nm usbd_find_edesc ,
540a9a8c2eSIan Dowse.Nm usbd_find_idesc ,
550a9a8c2eSIan Dowse.Nm usbd_free_buffer ,
560a9a8c2eSIan Dowse.Nm usbd_free_xfer ,
570a9a8c2eSIan Dowse.Nm usbd_get_buffer ,
580a9a8c2eSIan Dowse.Nm usbd_get_config ,
590a9a8c2eSIan Dowse.Nm usbd_get_config_desc ,
600a9a8c2eSIan Dowse.Nm usbd_get_config_desc_full ,
610a9a8c2eSIan Dowse.Nm usbd_get_config_descriptor ,
620a9a8c2eSIan Dowse.Nm usbd_get_device_descriptor ,
630a9a8c2eSIan Dowse.Nm usbd_get_endpoint_descriptor ,
640a9a8c2eSIan Dowse.Nm usbd_get_interface_altindex ,
650a9a8c2eSIan Dowse.Nm usbd_get_interface_descriptor ,
660a9a8c2eSIan Dowse.Nm usbd_get_no_alts ,
670a9a8c2eSIan Dowse.Nm usbd_get_quirks ,
680a9a8c2eSIan Dowse.Nm usbd_get_speed ,
690a9a8c2eSIan Dowse.Nm usbd_get_string ,
700a9a8c2eSIan Dowse.Nm usbd_get_string_desc ,
710a9a8c2eSIan Dowse.Nm usbd_get_xfer_status ,
720a9a8c2eSIan Dowse.Nm usbd_interface2device_handle ,
730a9a8c2eSIan Dowse.Nm usbd_interface2endpoint_descriptor ,
740a9a8c2eSIan Dowse.Nm usbd_interface_count ,
750a9a8c2eSIan Dowse.Nm usbd_intr_transfer ,
760a9a8c2eSIan Dowse.Nm usbd_open_pipe ,
770a9a8c2eSIan Dowse.Nm usbd_open_pipe_intr ,
780a9a8c2eSIan Dowse.Nm usbd_pipe2device_handle ,
790a9a8c2eSIan Dowse.Nm usbd_ratecheck ,
800a9a8c2eSIan Dowse.Nm usbd_set_config_index ,
810a9a8c2eSIan Dowse.Nm usbd_set_config_no ,
820a9a8c2eSIan Dowse.Nm usbd_set_interface ,
830a9a8c2eSIan Dowse.Nm usbd_set_polling ,
840a9a8c2eSIan Dowse.Nm usbd_setup_default_xfer ,
850a9a8c2eSIan Dowse.Nm usbd_setup_isoc_xfer ,
860a9a8c2eSIan Dowse.Nm usbd_setup_xfer ,
870a9a8c2eSIan Dowse.Nm usbd_sync_transfer ,
880a9a8c2eSIan Dowse.Nm usbd_transfer
890a9a8c2eSIan Dowse.Nd Universal Serial Bus driver programming interface
900a9a8c2eSIan Dowse.Sh SYNOPSIS
910a9a8c2eSIan Dowse.In dev/usb/usb.h
920a9a8c2eSIan Dowse.In dev/usb/usbdi.h
930a9a8c2eSIan Dowse.In dev/usb/usbdi_util.h
940a9a8c2eSIan Dowse.Pp
950a9a8c2eSIan Dowse.Ft void
960a9a8c2eSIan Dowse.Fn usb_detach_wait "device_ptr_t dv"
970a9a8c2eSIan Dowse.Ft void
980a9a8c2eSIan Dowse.Fn usb_detach_wakeup "device_ptr_t dv"
990a9a8c2eSIan Dowse.Ft "const usb_descriptor_t *"
1000a9a8c2eSIan Dowse.Fn usb_find_desc "usbd_device_handle dev" "int type" "int subtype"
1010a9a8c2eSIan Dowse.Ft usbd_status
1020a9a8c2eSIan Dowse.Fn usbd_abort_default_pipe "usbd_device_handle dev"
1030a9a8c2eSIan Dowse.Ft usbd_status
1040a9a8c2eSIan Dowse.Fn usbd_abort_pipe "usbd_pipe_handle pipe"
1050a9a8c2eSIan Dowse.Ft "void *"
1060a9a8c2eSIan Dowse.Fn usbd_alloc_buffer "usbd_xfer_handle xfer" "u_int32_t size"
1070a9a8c2eSIan Dowse.Ft usbd_xfer_handle
1080a9a8c2eSIan Dowse.Fn usbd_alloc_xfer "usbd_device_handle dev"
1090a9a8c2eSIan Dowse.Ft usbd_status
1100a9a8c2eSIan Dowse.Fo usbd_bulk_transfer
1110a9a8c2eSIan Dowse.Fa "usbd_xfer_handle xfer"
1120a9a8c2eSIan Dowse.Fa "usbd_pipe_handle pipe"
1130a9a8c2eSIan Dowse.Fa "u_int16_t flags"
1140a9a8c2eSIan Dowse.Fa "u_int32_t timeout"
1150a9a8c2eSIan Dowse.Fa "void *buf"
1160a9a8c2eSIan Dowse.Fa "u_int32_t *size"
1170a9a8c2eSIan Dowse.Fa "char *lbl"
1180a9a8c2eSIan Dowse.Fc
1190a9a8c2eSIan Dowse.Ft usbd_status
1200a9a8c2eSIan Dowse.Fn usbd_clear_endpoint_stall "usbd_pipe_handle pipe"
1210a9a8c2eSIan Dowse.Ft usbd_status
1220a9a8c2eSIan Dowse.Fn usbd_clear_endpoint_stall_async "usbd_pipe_handle"
1230a9a8c2eSIan Dowse.Ft void
1240a9a8c2eSIan Dowse.Fn usbd_clear_endpoint_toggle "usbd_pipe_handle pipe"
1250a9a8c2eSIan Dowse.Ft usbd_status
1260a9a8c2eSIan Dowse.Fn usbd_close_pipe "usbd_pipe_handle pipe"
1270a9a8c2eSIan Dowse.Ft usbd_status
1280a9a8c2eSIan Dowse.Fo usbd_device2interface_handle
1290a9a8c2eSIan Dowse.Fa "usbd_device_handle dev"
1300a9a8c2eSIan Dowse.Fa "u_int8_t ifaceno"
1310a9a8c2eSIan Dowse.Fa "usbd_interface_handle *iface"
1320a9a8c2eSIan Dowse.Fc
1330a9a8c2eSIan Dowse.Ft void
1340a9a8c2eSIan Dowse.Fn usbd_devinfo "usbd_device_handle dev" "int showclass" "char *cp"
1350a9a8c2eSIan Dowse.Ft usbd_status
1360a9a8c2eSIan Dowse.Fo usbd_do_request
1370a9a8c2eSIan Dowse.Fa "usbd_device_handle dev"
1380a9a8c2eSIan Dowse.Fa "usb_device_request_t *req"
1390a9a8c2eSIan Dowse.Fa "void *data"
1400a9a8c2eSIan Dowse.Fc
1410a9a8c2eSIan Dowse.Ft usbd_status
1420a9a8c2eSIan Dowse.Fo usbd_do_request_async
1430a9a8c2eSIan Dowse.Fa "usbd_device_handle dev"
1440a9a8c2eSIan Dowse.Fa "usb_device_request_t *req"
1450a9a8c2eSIan Dowse.Fa "void *data"
1460a9a8c2eSIan Dowse.Fc
1470a9a8c2eSIan Dowse.Ft usbd_status
1480a9a8c2eSIan Dowse.Fo usbd_do_request_flags
1490a9a8c2eSIan Dowse.Fa "usbd_device_handle dev"
1500a9a8c2eSIan Dowse.Fa "usb_device_request_t *req"
1510a9a8c2eSIan Dowse.Fa "void *data"
1520a9a8c2eSIan Dowse.Fa "u_int16_t flags"
1530a9a8c2eSIan Dowse.Fa "int *actlen"
1540a9a8c2eSIan Dowse.Fa "u_int32_t timo"
1550a9a8c2eSIan Dowse.Fc
1560a9a8c2eSIan Dowse.Ft usbd_status
1570a9a8c2eSIan Dowse.Fo usbd_do_request_flags_pipe
1580a9a8c2eSIan Dowse.Fa "usbd_device_handle dev"
1590a9a8c2eSIan Dowse.Fa "usbd_pipe_handle pipe"
1600a9a8c2eSIan Dowse.Fa "usb_device_request_t *req"
1610a9a8c2eSIan Dowse.Fa "void *data"
1620a9a8c2eSIan Dowse.Fa "u_int16_t flags"
1630a9a8c2eSIan Dowse.Fa "int *actlen"
1640a9a8c2eSIan Dowse.Fa "u_int32_t timeout"
1650a9a8c2eSIan Dowse.Fc
1660a9a8c2eSIan Dowse.Ft void
1670a9a8c2eSIan Dowse.Fn usbd_dopoll "usbd_interface_handle iface"
1680a9a8c2eSIan Dowse.Ft usbd_status
1690a9a8c2eSIan Dowse.Fn usbd_endpoint_count "usbd_interface_handle iface" "u_int8_t *count"
1700a9a8c2eSIan Dowse.Ft "const char *"
1710a9a8c2eSIan Dowse.Fn usbd_errstr "usbd_status err"
1720a9a8c2eSIan Dowse.Ft void
1730a9a8c2eSIan Dowse.Fo usbd_fill_deviceinfo
1740a9a8c2eSIan Dowse.Fa "usbd_device_handle dev"
1750a9a8c2eSIan Dowse.Fa "struct usb_device_info *di"
1760a9a8c2eSIan Dowse.Fa "int usedev"
1770a9a8c2eSIan Dowse.Fc
1780a9a8c2eSIan Dowse.Ft "usb_endpoint_descriptor_t *"
1790a9a8c2eSIan Dowse.Fo usbd_find_edesc
1800a9a8c2eSIan Dowse.Fa "usb_config_descriptor_t *cd"
1810a9a8c2eSIan Dowse.Fa "int ifaceidx"
1820a9a8c2eSIan Dowse.Fa "int altidx"
1830a9a8c2eSIan Dowse.Fa "int endptidx"
1840a9a8c2eSIan Dowse.Fc
1850a9a8c2eSIan Dowse.Ft "usb_interface_descriptor_t *"
1860a9a8c2eSIan Dowse.Fn usbd_find_idesc "usb_config_descriptor_t *cd" "int ifaceidx" "int altidx"
1870a9a8c2eSIan Dowse.Ft void
1880a9a8c2eSIan Dowse.Fn usbd_free_buffer "usbd_xfer_handle xfer"
1890a9a8c2eSIan Dowse.Ft usbd_status
1900a9a8c2eSIan Dowse.Fn usbd_free_xfer "usbd_xfer_handle xfer"
1910a9a8c2eSIan Dowse.Ft "void *"
1920a9a8c2eSIan Dowse.Fn usbd_get_buffer "usbd_xfer_handle xfer"
1930a9a8c2eSIan Dowse.Ft usbd_status
1940a9a8c2eSIan Dowse.Fn usbd_get_config "usbd_device_handle dev" "u_int8_t *conf"
1950a9a8c2eSIan Dowse.Ft usbd_status
1960a9a8c2eSIan Dowse.Fo usbd_get_config_desc
1970a9a8c2eSIan Dowse.Fa "usbd_device_handle dev"
1980a9a8c2eSIan Dowse.Fa "int confidx"
1990a9a8c2eSIan Dowse.Fa "usb_config_descriptor_t *d"
2000a9a8c2eSIan Dowse.Fc
2010a9a8c2eSIan Dowse.Ft usbd_status
2020a9a8c2eSIan Dowse.Fo usbd_get_config_desc_full
2030a9a8c2eSIan Dowse.Fa "usbd_device_handle dev"
2040a9a8c2eSIan Dowse.Fa "int conf"
2050a9a8c2eSIan Dowse.Fa "void *d"
2060a9a8c2eSIan Dowse.Fa "int size"
2070a9a8c2eSIan Dowse.Fc
2080a9a8c2eSIan Dowse.Ft "usb_config_descriptor_t *"
2090a9a8c2eSIan Dowse.Fn usbd_get_config_descriptor "usbd_device_handle dev"
2100a9a8c2eSIan Dowse.Ft "usb_device_descriptor_t *"
2110a9a8c2eSIan Dowse.Fn usbd_get_device_descriptor "usbd_device_handle dev"
2120a9a8c2eSIan Dowse.Ft "usb_endpoint_descriptor_t *"
2130a9a8c2eSIan Dowse.Fo usbd_get_endpoint_descriptor
2140a9a8c2eSIan Dowse.Fa "usbd_interface_handle iface"
2150a9a8c2eSIan Dowse.Fa "u_int8_t address"
2160a9a8c2eSIan Dowse.Fc
2170a9a8c2eSIan Dowse.Ft int
2180a9a8c2eSIan Dowse.Fn usbd_get_interface_altindex "usbd_interface_handle iface"
2190a9a8c2eSIan Dowse.Ft "usb_interface_descriptor_t *"
2200a9a8c2eSIan Dowse.Fn usbd_get_interface_descriptor "usbd_interface_handle iface"
2210a9a8c2eSIan Dowse.Ft int
2220a9a8c2eSIan Dowse.Fn usbd_get_no_alts "usb_config_descriptor_t *cdesc" "int ifaceno"
2230a9a8c2eSIan Dowse.Ft "const struct usbd_quirks *"
2240a9a8c2eSIan Dowse.Fn usbd_get_quirks "usbd_device_handle dev"
2250a9a8c2eSIan Dowse.Ft int
2260a9a8c2eSIan Dowse.Fn usbd_get_speed "usbd_device_handle dev"
2270a9a8c2eSIan Dowse.Ft usbd_status
2280a9a8c2eSIan Dowse.Fn usbd_get_string "usbd_device_handle dev" "int si" "char *buf"
2290a9a8c2eSIan Dowse.Ft usbd_status
2300a9a8c2eSIan Dowse.Fo usbd_get_string_desc
2310a9a8c2eSIan Dowse.Fa "usbd_device_handle dev"
2320a9a8c2eSIan Dowse.Fa "int sindex"
2330a9a8c2eSIan Dowse.Fa "int langid"
2340a9a8c2eSIan Dowse.Fa "usb_string_descriptor_t *sdesc"
2350a9a8c2eSIan Dowse.Fa "int *sizep"
2360a9a8c2eSIan Dowse.Fc
2370a9a8c2eSIan Dowse.Ft void
2380a9a8c2eSIan Dowse.Fo usbd_get_xfer_status
2390a9a8c2eSIan Dowse.Fa "usbd_xfer_handle xfer"
2400a9a8c2eSIan Dowse.Fa "usbd_private_handle *priv"
2410a9a8c2eSIan Dowse.Fa "void **buffer"
2420a9a8c2eSIan Dowse.Fa "u_int32_t *count"
2430a9a8c2eSIan Dowse.Fa "usbd_status *status"
2440a9a8c2eSIan Dowse.Fc
2450a9a8c2eSIan Dowse.Ft void
2460a9a8c2eSIan Dowse.Fo usbd_interface2device_handle
2470a9a8c2eSIan Dowse.Fa "usbd_interface_handle iface"
2480a9a8c2eSIan Dowse.Fa "usbd_device_handle *dev"
2490a9a8c2eSIan Dowse.Fc
2500a9a8c2eSIan Dowse.Ft "usb_endpoint_descriptor_t *"
2510a9a8c2eSIan Dowse.Fo usbd_interface2endpoint_descriptor
2520a9a8c2eSIan Dowse.Fa "usbd_interface_handle iface"
2530a9a8c2eSIan Dowse.Fa "u_int8_t index"
2540a9a8c2eSIan Dowse.Fc
2550a9a8c2eSIan Dowse.Ft usbd_status
2560a9a8c2eSIan Dowse.Fn usbd_interface_count "usbd_device_handle dev" "u_int8_t *count"
2570a9a8c2eSIan Dowse.Ft usbd_status
2580a9a8c2eSIan Dowse.Fo usbd_intr_transfer
2590a9a8c2eSIan Dowse.Fa "usbd_xfer_handle xfer"
2600a9a8c2eSIan Dowse.Fa "usbd_pipe_handle pipe"
2610a9a8c2eSIan Dowse.Fa "u_int16_t flags"
2620a9a8c2eSIan Dowse.Fa "u_int32_t timeout"
2630a9a8c2eSIan Dowse.Fa "void *buf"
2640a9a8c2eSIan Dowse.Fa "u_int32_t *size"
2650a9a8c2eSIan Dowse.Fa "char *lbl"
2660a9a8c2eSIan Dowse.Fc
2670a9a8c2eSIan Dowse.Ft usbd_status
2680a9a8c2eSIan Dowse.Fo usbd_open_pipe
2690a9a8c2eSIan Dowse.Fa "usbd_interface_handle iface"
2700a9a8c2eSIan Dowse.Fa "u_int8_t address"
2710a9a8c2eSIan Dowse.Fa "u_int8_t flags"
2720a9a8c2eSIan Dowse.Fa "usbd_pipe_handle *pipe"
2730a9a8c2eSIan Dowse.Fc
2740a9a8c2eSIan Dowse.Ft usbd_status
2750a9a8c2eSIan Dowse.Fo usbd_open_pipe_intr
2760a9a8c2eSIan Dowse.Fa "usbd_interface_handle iface"
2770a9a8c2eSIan Dowse.Fa "u_int8_t address"
2780a9a8c2eSIan Dowse.Fa "u_int8_t flags"
2790a9a8c2eSIan Dowse.Fa "usbd_pipe_handle *pipe"
2800a9a8c2eSIan Dowse.Fa "usbd_private_handle priv"
2810a9a8c2eSIan Dowse.Fa "void *buffer"
2820a9a8c2eSIan Dowse.Fa "u_int32_t len"
2830a9a8c2eSIan Dowse.Fa "usbd_callback cb"
2840a9a8c2eSIan Dowse.Fa "int ival"
2850a9a8c2eSIan Dowse.Fc
2860a9a8c2eSIan Dowse.Ft usbd_device_handle
2870a9a8c2eSIan Dowse.Fn usbd_pipe2device_handle "usbd_pipe_handle pipe"
2880a9a8c2eSIan Dowse.Ft int
2890a9a8c2eSIan Dowse.Fn usbd_ratecheck "struct timeval *last"
2900a9a8c2eSIan Dowse.Ft usbd_status
2910a9a8c2eSIan Dowse.Fn usbd_set_config_index "usbd_device_handle dev" "int index" "int msg"
2920a9a8c2eSIan Dowse.Ft usbd_status
2930a9a8c2eSIan Dowse.Fn usbd_set_config_no "usbd_device_handle dev" "int no" "int msg"
2940a9a8c2eSIan Dowse.Ft usbd_status
2950a9a8c2eSIan Dowse.Fn usbd_set_interface "usbd_interface_handle iface" "int altidx"
2960a9a8c2eSIan Dowse.Ft void
2970a9a8c2eSIan Dowse.Fn usbd_set_polling "usbd_device_handle dev" "int on"
2980a9a8c2eSIan Dowse.Ft void
2990a9a8c2eSIan Dowse.Fo usbd_setup_default_xfer
3000a9a8c2eSIan Dowse.Fa "usbd_xfer_handle xfer"
3010a9a8c2eSIan Dowse.Fa "usbd_device_handle dev"
3020a9a8c2eSIan Dowse.Fa "usbd_private_handle priv"
3030a9a8c2eSIan Dowse.Fa "u_int32_t timeout"
3040a9a8c2eSIan Dowse.Fa "usb_device_request_t *req"
3050a9a8c2eSIan Dowse.Fa "void *buffer"
3060a9a8c2eSIan Dowse.Fa "u_int32_t length"
3070a9a8c2eSIan Dowse.Fa "u_int16_t flags"
3080a9a8c2eSIan Dowse.Fa "usbd_callback callback"
3090a9a8c2eSIan Dowse.Fc
3100a9a8c2eSIan Dowse.Ft void
3110a9a8c2eSIan Dowse.Fo usbd_setup_isoc_xfer
3120a9a8c2eSIan Dowse.Fa "usbd_xfer_handle xfer"
3130a9a8c2eSIan Dowse.Fa "usbd_pipe_handle pipe"
3140a9a8c2eSIan Dowse.Fa "usbd_private_handle priv"
3150a9a8c2eSIan Dowse.Fa "u_int16_t *frlengths"
3160a9a8c2eSIan Dowse.Fa "u_int32_t nframes"
3170a9a8c2eSIan Dowse.Fa "u_int16_t flags"
3180a9a8c2eSIan Dowse.Fa "usbd_callback callback"
3190a9a8c2eSIan Dowse.Fc
3200a9a8c2eSIan Dowse.Ft void
3210a9a8c2eSIan Dowse.Fo usbd_setup_xfer
3220a9a8c2eSIan Dowse.Fa "usbd_xfer_handle xfer"
3230a9a8c2eSIan Dowse.Fa "usbd_pipe_handle pipe"
3240a9a8c2eSIan Dowse.Fa "usbd_private_handle priv"
3250a9a8c2eSIan Dowse.Fa "void *buffer"
3260a9a8c2eSIan Dowse.Fa "u_int32_t length"
3270a9a8c2eSIan Dowse.Fa "u_int16_t flags"
3280a9a8c2eSIan Dowse.Fa "u_int32_t timeout"
3290a9a8c2eSIan Dowse.Fa "usbd_callback callback"
3300a9a8c2eSIan Dowse.Fc
3310a9a8c2eSIan Dowse.Ft usbd_status
3320a9a8c2eSIan Dowse.Fn usbd_sync_transfer "usbd_xfer_handle xfer"
3330a9a8c2eSIan Dowse.Ft usbd_status
3340a9a8c2eSIan Dowse.Fn usbd_transfer "usbd_xfer_handle xfer"
3350a9a8c2eSIan Dowse.Sh DESCRIPTION
3360a9a8c2eSIan DowseThe Universal Serial Bus (USB) driver programming interface provides
3370a9a8c2eSIan DowseUSB peripheral drivers with a host controller independent API for
3380a9a8c2eSIan Dowsecontrolling and communicating with USB peripherals.
3390a9a8c2eSIan Dowse.Pp
3400a9a8c2eSIan DowseTypically, drivers will first use some combination of the functions
3410a9a8c2eSIan Dowse.Fn usbd_set_config_no ,
3420a9a8c2eSIan Dowse.Fn usbd_get_config_descriptor ,
3430a9a8c2eSIan Dowse.Fn usbd_set_interface ,
3440a9a8c2eSIan Dowse.Fn usbd_get_interface_descriptor ,
3450a9a8c2eSIan Dowse.Fn usbd_device2interface_handle ,
3460a9a8c2eSIan Dowse.Fn usbd_endpoint_count
3470a9a8c2eSIan Dowseand
3480a9a8c2eSIan Dowse.Fn usbd_interface2endpoint_descriptor
3490a9a8c2eSIan Dowseto query the device's properties and prepare it for use.
3500a9a8c2eSIan DowseDrivers can then perform requests on the USB control pipe using
3510a9a8c2eSIan Dowse.Fn usbd_do_request ,
3520a9a8c2eSIan Dowsethey can open pipes using the functions
3530a9a8c2eSIan Dowse.Fn usbd_open_pipe
3540a9a8c2eSIan Dowseand
3550a9a8c2eSIan Dowse.Fn usbd_open_pipe_intr ,
3560a9a8c2eSIan Dowseand perform transfers over these pipes using
3570a9a8c2eSIan Dowse.Fn usbd_alloc_xfer ,
3580a9a8c2eSIan Dowse.Fn usbd_setup_xfer
3590a9a8c2eSIan Dowseand
3600a9a8c2eSIan Dowse.Fn usbd_transfer .
3610a9a8c2eSIan DowseFinally, the functions
3620a9a8c2eSIan Dowse.Fn usbd_abort_pipe ,
3630a9a8c2eSIan Dowse.Fn usbd_close_pipe
3640a9a8c2eSIan Dowseand
3650a9a8c2eSIan Dowse.Fn usbd_free_xfer
3660a9a8c2eSIan Dowseare used to cancel outstanding transfers, close open pipes and deallocate
3670a9a8c2eSIan Dowsetransfer structures.
3680a9a8c2eSIan Dowse.Pp
3690a9a8c2eSIan DowseThe
3700a9a8c2eSIan Dowse.Fn usbd_get_device_descriptor
3710a9a8c2eSIan Dowsefunction returns a pointer to the USB device descriptor for
3720a9a8c2eSIan Dowse.Fa dev .
3730a9a8c2eSIan DowseSee
3740a9a8c2eSIan Dowse.Sx "USB Descriptors"
3750a9a8c2eSIan Dowsebelow for information about the USB device descriptor.
3760a9a8c2eSIan Dowse.Pp
3770a9a8c2eSIan DowseThe
3780a9a8c2eSIan Dowse.Fn usbd_get_config_desc
3790a9a8c2eSIan Dowsefunction retrieves the specified configuration descriptor from the device.
3800a9a8c2eSIan DowseThe
3810a9a8c2eSIan Dowse.Fa confidx
3820a9a8c2eSIan Dowseparameter specifies the configuration descriptor index, which must be less
3830a9a8c2eSIan Dowsethan the
3840a9a8c2eSIan Dowse.Fa bNumConfigurations
3850a9a8c2eSIan Dowsevalue in the device descriptor.
3860a9a8c2eSIan DowseThe function
3870a9a8c2eSIan Dowse.Fn usbd_get_config_desc_full
3880a9a8c2eSIan Dowseretrieves a full configuration descriptor, which has all related interface
3890a9a8c2eSIan Dowseand endpoint descriptors appended to a normal configuration descriptor.
3900a9a8c2eSIan DowseThe parameter
3910a9a8c2eSIan Dowse.Fa d
3920a9a8c2eSIan Dowseshould point to memory that is at least
3930a9a8c2eSIan Dowse.Fa size
3940a9a8c2eSIan Dowsebytes in length, and this should be at least as long as the
3950a9a8c2eSIan Dowse.Fa wTotalLength
3960a9a8c2eSIan Dowsevalue from the configuration descriptor.
3970a9a8c2eSIan DowseSee
3980a9a8c2eSIan Dowse.Sx "USB Descriptors"
3990a9a8c2eSIan Dowsebelow for information about the USB configuration descriptor.
4000a9a8c2eSIan Dowse.Pp
4010a9a8c2eSIan DowseThe
4020a9a8c2eSIan Dowse.Fn usbd_get_config
4030a9a8c2eSIan Dowsefunction retrieves the current configuration number from the device, i.e.\&
4040a9a8c2eSIan Dowsethe
4050a9a8c2eSIan Dowse.Fa bConfigurationValue
4060a9a8c2eSIan Dowsevalue from the configuration that is active.
4070a9a8c2eSIan DowseIf the device is unconfigured then
4080a9a8c2eSIan Dowse.Dv USB_UNCONFIG_NO
4090a9a8c2eSIan Dowseis returned.
4100a9a8c2eSIan DowseThe current configuration can be changed by calling either
4110a9a8c2eSIan Dowse.Fn usbd_set_config_index
4120a9a8c2eSIan Dowseor
4130a9a8c2eSIan Dowse.Fn usbd_set_config_no .
4140a9a8c2eSIan DowseThe difference between these functions is that
4150a9a8c2eSIan Dowse.Fn usbd_set_config_index
4160a9a8c2eSIan Dowseaccepts a configuration index number that is less than the
4170a9a8c2eSIan Dowse.Fa bNumConfigurations
4180a9a8c2eSIan Dowsevalue from the device descriptor, whereas
4190a9a8c2eSIan Dowse.Fn usbd_set_config_no
4200a9a8c2eSIan Dowserequires the
4210a9a8c2eSIan Dowse.Fa bConfigurationValue
4220a9a8c2eSIan Dowsevalue of the desired configuration to be provided instead.
4230a9a8c2eSIan DowseTo unconfigure the device, supply a configuration index of
4240a9a8c2eSIan Dowse.Dv USB_UNCONFIG_INDEX
4250a9a8c2eSIan Dowseto
4260a9a8c2eSIan Dowse.Fn usbd_set_config_index ,
4270a9a8c2eSIan Dowseor else specify a configuration number of
4280a9a8c2eSIan Dowse.Dv USB_UNCONFIG_NO
4290a9a8c2eSIan Dowseto
4300a9a8c2eSIan Dowse.Fn usbd_set_config_no .
4310a9a8c2eSIan Dowse.Pp
4320a9a8c2eSIan DowseThe
4330a9a8c2eSIan Dowse.Fn usbd_get_config_descriptor
4340a9a8c2eSIan Dowsefunction returns a pointer to an in-memory copy of the full configuration
4350a9a8c2eSIan Dowsedescriptor of the configuration that is currently active.
4360a9a8c2eSIan DowseThe returned pointer remains valid until the device configuration
4370a9a8c2eSIan Dowseis changed using
4380a9a8c2eSIan Dowse.Fn usbd_set_config_index
4390a9a8c2eSIan Dowseor
4400a9a8c2eSIan Dowse.Fn usbd_set_config_no .
4410a9a8c2eSIan DowseIf the device is unconfigured then
4420a9a8c2eSIan Dowse.Dv NULL
4430a9a8c2eSIan Dowseis returned instead.
4440a9a8c2eSIan Dowse.Pp
4450a9a8c2eSIan DowseThe function
4460a9a8c2eSIan Dowse.Fn usbd_interface_count
4470a9a8c2eSIan Dowsereturns the number of interfaces available in the current device
4480a9a8c2eSIan Dowseconfiguration.
4490a9a8c2eSIan DowseThe
4500a9a8c2eSIan Dowse.Fn usbd_get_no_alts
4510a9a8c2eSIan Dowsefunction determines the number of alternate interfaces in a full
4520a9a8c2eSIan Dowseconfiguration descriptor by counting the interface descriptors with
4530a9a8c2eSIan Dowse.Fa bInterfaceNumber
4540a9a8c2eSIan Dowseequal to
4550a9a8c2eSIan Dowse.Fa ifaceno
4560a9a8c2eSIan Dowse(the count includes alternate index zero).
4570a9a8c2eSIan DowseThe
4580a9a8c2eSIan Dowse.Fn usbd_find_idesc
4590a9a8c2eSIan Dowsefunction locates an interface descriptor within a full configuration
4600a9a8c2eSIan Dowsedescriptor.
4610a9a8c2eSIan DowseThe
4620a9a8c2eSIan Dowse.Fa ifaceidx
4630a9a8c2eSIan Dowseparameter specifies the interface index number, which should be less than
4640a9a8c2eSIan Dowsethe number of interfaces in the configuration descriptor (i.e.\& the value
4650a9a8c2eSIan Dowsereturned by
4660a9a8c2eSIan Dowse.Fn usbd_interface_count
4670a9a8c2eSIan Dowseor the
4680a9a8c2eSIan Dowse.Fa bNumInterface
4690a9a8c2eSIan Dowsefield from the configuration descriptor).
4700a9a8c2eSIan DowseAn alternate interface can be specified using a non-zero
4710a9a8c2eSIan Dowse.Fa altidx ,
4720a9a8c2eSIan Dowsewhich should be less than the value returned by
4730a9a8c2eSIan Dowse.Fn usbd_get_no_alts .
4740a9a8c2eSIan DowseThe return value is a pointer to the requested interface descriptor
4750a9a8c2eSIan Dowsewithin the full configuration descriptor, or
4760a9a8c2eSIan Dowse.Dv NULL
4770a9a8c2eSIan Dowseif the specified interface descriptor does not exist.
4780a9a8c2eSIan DowseNote that the
4790a9a8c2eSIan Dowse.Fa altidx
4800a9a8c2eSIan Dowseparameter specifies the alternate setting by index number starting
4810a9a8c2eSIan Dowseat zero; it is not the alternate setting number defined in the
4820a9a8c2eSIan Dowseinterface descriptor.
4830a9a8c2eSIan Dowse.Pp
4840a9a8c2eSIan DowseThe function
4850a9a8c2eSIan Dowse.Fn usbd_find_edesc
4860a9a8c2eSIan Dowselocates an endpoint descriptor within a full configuration descriptor.
4870a9a8c2eSIan DowseThe
4880a9a8c2eSIan Dowse.Fa ifaceidx
4890a9a8c2eSIan Dowseand
4900a9a8c2eSIan Dowse.Fa altidx
4910a9a8c2eSIan Dowseparameters are the same as described for
4920a9a8c2eSIan Dowse.Fn usbd_find_idesc ,
4930a9a8c2eSIan Dowseand the
4940a9a8c2eSIan Dowse.Fa endptidx
4950a9a8c2eSIan Dowseparameter is an endpoint index number that should be less than the
4960a9a8c2eSIan Dowse.Fa bNumEndpoints
4970a9a8c2eSIan Dowsefield in the interface descriptor.
4980a9a8c2eSIan DowseThe return value is a pointer to the requested endpoint descriptor
4990a9a8c2eSIan Dowsewithin the full configuration descriptor, or
5000a9a8c2eSIan Dowse.Dv NULL
5010a9a8c2eSIan Dowseif the specified endpoint descriptor does not exist.
5020a9a8c2eSIan DowseNote that the
5030a9a8c2eSIan Dowse.Fa altidx
5040a9a8c2eSIan Dowseand
5050a9a8c2eSIan Dowse.Fa endptidx
5060a9a8c2eSIan Dowseparameters are index numbers starting at zero; they are not the
5070a9a8c2eSIan Dowsealternate setting and endpoint address defined in the descriptors.
5080a9a8c2eSIan Dowse.Pp
5090a9a8c2eSIan DowseThe
5100a9a8c2eSIan Dowse.Fn usbd_get_speed
5110a9a8c2eSIan Dowsefunction returns the device speed.
5120a9a8c2eSIan DowseThis can be
5130a9a8c2eSIan Dowse.Dv USB_SPEED_LOW ,
5140a9a8c2eSIan Dowse.Dv USB_SPEED_FULL
5150a9a8c2eSIan Dowseor
5160a9a8c2eSIan Dowse.Dv USB_SPEED_HIGH .
5170a9a8c2eSIan Dowse.Pp
5180a9a8c2eSIan DowseUSB devices optionally support string descriptors, which can be
5190a9a8c2eSIan Dowseretrieved using the
5200a9a8c2eSIan Dowse.Fn usbd_get_string
5210a9a8c2eSIan Dowseor
5220a9a8c2eSIan Dowse.Fn usbd_get_string_desc
5230a9a8c2eSIan Dowsefunctions.
5240a9a8c2eSIan DowseDevice, configuration and interface descriptors reference strings by
5250a9a8c2eSIan Dowsean index number that can be supplied to these functions.
5260a9a8c2eSIan DowseThe
5270a9a8c2eSIan Dowse.Fn usbd_get_string
5280a9a8c2eSIan Dowsefunction should be used unless a non-default language is required.
5290a9a8c2eSIan DowseIt requires that
5300a9a8c2eSIan Dowse.Fa buf
5310a9a8c2eSIan Dowsepoints to a buffer of at least
5320a9a8c2eSIan Dowse.Dv USB_MAX_STRING_LEN
5330a9a8c2eSIan Dowsebytes in size.
5340a9a8c2eSIan DowseThe
5350a9a8c2eSIan Dowse.Fa si
5360a9a8c2eSIan Dowseparameter specified which string to retrieve.
5370a9a8c2eSIan Dowse.Pp
5380a9a8c2eSIan DowseThe
5390a9a8c2eSIan Dowse.Fn usb_find_desc
5400a9a8c2eSIan Dowsefunction searches through the in-memory full configuration descriptor
5410a9a8c2eSIan Dowsefor the active configuration and finds the first descriptor that has a
5420a9a8c2eSIan Dowse.Fa bDescriptorType
5430a9a8c2eSIan Dowseequal to
5440a9a8c2eSIan Dowse.Fa type ,
5450a9a8c2eSIan Dowseand if
5460a9a8c2eSIan Dowse.Fa subtype
5470a9a8c2eSIan Dowseis not equal to
5480a9a8c2eSIan Dowse.Dv USBD_SUBTYPE_ANY ,
5490a9a8c2eSIan Dowsethe descriptor must also have a
5500a9a8c2eSIan Dowse.Fa bDescriptorSubtype
5510a9a8c2eSIan Dowseequal to
5520a9a8c2eSIan Dowse.Fa subtype .
5530a9a8c2eSIan DowseIf found, then a pointer to the descriptor is returned.
5540a9a8c2eSIan DowseOtherwise,
5550a9a8c2eSIan Dowse.Fn usb_find_desc
5560a9a8c2eSIan Dowsereturns
5570a9a8c2eSIan Dowse.Dv NULL .
5580a9a8c2eSIan DowseThe returned pointer is valid until the device configuration is changed using
5590a9a8c2eSIan Dowse.Fn usbd_set_config_index
5600a9a8c2eSIan Dowseor
5610a9a8c2eSIan Dowse.Fn usbd_set_config_no .
5620a9a8c2eSIan Dowse.Pp
5630a9a8c2eSIan DowseThe USB driver interface uses opaque interface handles to refer to
5640a9a8c2eSIan Dowseconfiguration interfaces.
5650a9a8c2eSIan DowseThese handles remain valid until the device configuration is changed using
5660a9a8c2eSIan Dowse.Fn usbd_set_config_index
5670a9a8c2eSIan Dowseor
5680a9a8c2eSIan Dowse.Fn usbd_set_config_no .
5690a9a8c2eSIan DowseThe
5700a9a8c2eSIan Dowse.Fn usbd_device2interface_handle
5710a9a8c2eSIan Dowsefunction retrieves an interface handle.
5720a9a8c2eSIan DowseThe
5730a9a8c2eSIan Dowse.Fa ifaceno
5740a9a8c2eSIan Dowseparameter is an interface index number starting at zero.
5750a9a8c2eSIan DowseIf the device is configured and the specified interface exists, then
5760a9a8c2eSIan Dowse.Dv USBD_NORMAL_COMPLETION
5770a9a8c2eSIan Dowseis returned and the interface handle is stored in
5780a9a8c2eSIan Dowse.Fa *iface .
5790a9a8c2eSIan DowseOtherwise an error code is returned and
5800a9a8c2eSIan Dowse.Fa *iface
5810a9a8c2eSIan Dowseis not changed.
5820a9a8c2eSIan DowseThe
5830a9a8c2eSIan Dowse.Fn usbd_interface2device_handle
5840a9a8c2eSIan Dowsefunction retrieves the device handle from an interface handle.
5850a9a8c2eSIan DowseThis is just for convenience to save passing around the device
5860a9a8c2eSIan Dowsehandle as well as the interface handle.
5870a9a8c2eSIan DowseThe
5880a9a8c2eSIan Dowse.Fn usbd_set_interface
5890a9a8c2eSIan Dowsefunction changes the alternate setting number for an interface to
5900a9a8c2eSIan Dowsethe alternate setting identified by the zero-based index number
5910a9a8c2eSIan Dowse.Fa altidx .
5920a9a8c2eSIan DowseThis operation invalidates any existing endpoints on this
5930a9a8c2eSIan Dowseinterface and their descriptors.
5940a9a8c2eSIan DowseThe
5950a9a8c2eSIan Dowse.Fn usbd_get_interface_altindex
5960a9a8c2eSIan Dowsefunction returns the current alternative setting index as was
5970a9a8c2eSIan Dowsespecified when calling
5980a9a8c2eSIan Dowse.Fn usbd_set_interface .
5990a9a8c2eSIan DowseThe
6000a9a8c2eSIan Dowse.Fn usbd_endpoint_count
6010a9a8c2eSIan Dowsefunction retrieves the number of endpoints associated with the
6020a9a8c2eSIan Dowsespecified interface.
6030a9a8c2eSIan DowseThe
6040a9a8c2eSIan Dowse.Fn usbd_interface2endpoint_descriptor
6050a9a8c2eSIan Dowsefunction returns a pointer to an in-memory endpoint descriptor for
6060a9a8c2eSIan Dowsethe endpoint that has an index number of
6070a9a8c2eSIan Dowse.Fa index .
6080a9a8c2eSIan DowseThis pointer remains valid until the configuration or alternate setting
6090a9a8c2eSIan Dowsenumber are changed.
6100a9a8c2eSIan DowseThe function
6110a9a8c2eSIan Dowse.Fn usbd_get_endpoint_descriptor
6120a9a8c2eSIan Dowseis like
6130a9a8c2eSIan Dowse.Fn usbd_interface2endpoint_descriptor
6140a9a8c2eSIan Dowsebut it accepts a
6150a9a8c2eSIan Dowse.Fa bEndpointAddress
6160a9a8c2eSIan Dowseaddress value instead of an index.
6170a9a8c2eSIan Dowse.Pp
6180a9a8c2eSIan DowseThe
6190a9a8c2eSIan Dowse.Fn usbd_fill_deviceinfo
6200a9a8c2eSIan Dowsefunction fills out a
6210a9a8c2eSIan Dowse.Vt usb_device_info
6220a9a8c2eSIan Dowsestructure with information about the device.
6230a9a8c2eSIan DowseThe vendor and product names come from the device itself, falling back to
6240a9a8c2eSIan Dowsea table lookup or just providing the IDs in hexadecimal.
6250a9a8c2eSIan DowseIf
6260a9a8c2eSIan Dowse.Fa usedev
6270a9a8c2eSIan Dowseis zero then
6280a9a8c2eSIan Dowse.Fn usbd_fill_deviceinfo
6290a9a8c2eSIan Dowsewill not attempt to retrieve the vendor and product names from the
6300a9a8c2eSIan Dowsedevice.
6310a9a8c2eSIan DowseThe usb_device_info structure is defined in
6320a9a8c2eSIan Dowse.In dev/usb/usb.h
6330a9a8c2eSIan Dowseas follows:
6340a9a8c2eSIan Dowse.Bd -literal
6350a9a8c2eSIan Dowsestruct usb_device_info {
6360a9a8c2eSIan Dowse	u_int8_t	udi_bus;
6370a9a8c2eSIan Dowse	u_int8_t	udi_addr;	/* device address */
6380a9a8c2eSIan Dowse	usb_event_cookie_t udi_cookie;
6390a9a8c2eSIan Dowse	char		udi_product[USB_MAX_STRING_LEN];
6400a9a8c2eSIan Dowse	char		udi_vendor[USB_MAX_STRING_LEN];
6410a9a8c2eSIan Dowse	char		udi_release[8];
6420a9a8c2eSIan Dowse	u_int16_t	udi_productNo;
6430a9a8c2eSIan Dowse	u_int16_t	udi_vendorNo;
6440a9a8c2eSIan Dowse	u_int16_t	udi_releaseNo;
6450a9a8c2eSIan Dowse	u_int8_t	udi_class;
6460a9a8c2eSIan Dowse	u_int8_t	udi_subclass;
6470a9a8c2eSIan Dowse	u_int8_t	udi_protocol;
6480a9a8c2eSIan Dowse	u_int8_t	udi_config;
6490a9a8c2eSIan Dowse	u_int8_t	udi_speed;
6500a9a8c2eSIan Dowse#define USB_SPEED_LOW  1
6510a9a8c2eSIan Dowse#define USB_SPEED_FULL 2
6520a9a8c2eSIan Dowse#define USB_SPEED_HIGH 3
6530a9a8c2eSIan Dowse	int		udi_power;	/* power consumption in mA */
6540a9a8c2eSIan Dowse	int		udi_nports;
6550a9a8c2eSIan Dowse	char		udi_devnames[USB_MAX_DEVNAMES][USB_MAX_DEVNAMELEN];
6560a9a8c2eSIan Dowse	/* hub only: addresses of devices on ports */
6570a9a8c2eSIan Dowse	u_int8_t	udi_ports[16];
6580a9a8c2eSIan Dowse#define USB_PORT_ENABLED 0xff
6590a9a8c2eSIan Dowse#define USB_PORT_SUSPENDED 0xfe
6600a9a8c2eSIan Dowse#define USB_PORT_POWERED 0xfd
6610a9a8c2eSIan Dowse}
6620a9a8c2eSIan Dowse.Ed
6630a9a8c2eSIan Dowse.Pp
6640a9a8c2eSIan DowseThe
6650a9a8c2eSIan Dowse.Fn usbd_devinfo
6660a9a8c2eSIan Dowsefunction generates a string description of the USB device.
6670a9a8c2eSIan DowseThe
6680a9a8c2eSIan Dowse.Fa cp
6690a9a8c2eSIan Dowseargument should point to a 1024-byte buffer (XXX the maximum length
6700a9a8c2eSIan Dowseis approx 320 chars, but there is no sanity checking and everything uses
6710a9a8c2eSIan Dowse1024-character buffers).
6720a9a8c2eSIan DowseDevice class information is included if the
6730a9a8c2eSIan Dowse.Fa showclass
6740a9a8c2eSIan Dowseparameter is non-zero.
6750a9a8c2eSIan Dowse.Pp
6760a9a8c2eSIan DowseThe
6770a9a8c2eSIan Dowse.Fn usbd_get_quirks
6780a9a8c2eSIan Dowsefunction returns information from a table of devices that require
6790a9a8c2eSIan Dowsespecial workarounds in order to function correctly.
6800a9a8c2eSIan DowseThe returned structure is defined in
6810a9a8c2eSIan Dowse.In dev/usb/usb_quirks.h
6820a9a8c2eSIan Dowseas follows:
6830a9a8c2eSIan Dowse.Bd -literal
6840a9a8c2eSIan Dowsestruct usbd_quirks {
6850a9a8c2eSIan Dowse	u_int32_t uq_flags;	/* Device problems */
6860a9a8c2eSIan Dowse};
6870a9a8c2eSIan Dowse.Ed
6880a9a8c2eSIan Dowse.Pp
6890a9a8c2eSIan DowseSee
6900a9a8c2eSIan Dowse.In dev/usb/usb_quirks.h
6910a9a8c2eSIan Dowsefor a list of all currently defined quirks.
6920a9a8c2eSIan Dowse.Pp
6930a9a8c2eSIan DowseUSB control requests are performed via
6940a9a8c2eSIan Dowse.Vt usb_device_request_t
6950a9a8c2eSIan Dowsestructures, defined in
6960a9a8c2eSIan Dowse.In dev/usb/usb.h
6970a9a8c2eSIan Dowseas follows:
6980a9a8c2eSIan Dowse.Bd -literal
6990a9a8c2eSIan Dowsetypedef struct {
7000a9a8c2eSIan Dowse	uByte		bmRequestType;
7010a9a8c2eSIan Dowse	uByte		bRequest;
7020a9a8c2eSIan Dowse	uWord		wValue;
7030a9a8c2eSIan Dowse	uWord		wIndex;
7040a9a8c2eSIan Dowse	uWord		wLength;
7050a9a8c2eSIan Dowse} UPACKED usb_device_request_t;
7060a9a8c2eSIan Dowse.Ed
7070a9a8c2eSIan Dowse.Pp
7080a9a8c2eSIan DowseThe
7090a9a8c2eSIan Dowse.Fn usbd_do_request
7100a9a8c2eSIan Dowsefunction performs a single request synchronously.
7110a9a8c2eSIan DowseThe
7120a9a8c2eSIan Dowse.Fa req
7130a9a8c2eSIan Dowseparameter should point to a properly initialized
7140a9a8c2eSIan Dowse.Vt usb_device_request_t ,
7150a9a8c2eSIan Dowseand when the
7160a9a8c2eSIan Dowse.Fa wLength
7170a9a8c2eSIan Dowsefield is non-zero,
7180a9a8c2eSIan Dowse.Fa data
7190a9a8c2eSIan Dowseshould point at a buffer that is at least
7200a9a8c2eSIan Dowse.Fa wLength
7210a9a8c2eSIan Dowsebytes in length.
7220a9a8c2eSIan DowseThe request timeout is set to 5 seconds, so the operation will fail
7230a9a8c2eSIan Dowsewith
7240a9a8c2eSIan Dowse.Er USBD_TIMEOUT
7250a9a8c2eSIan Dowseif the device does not respond within that time.
7260a9a8c2eSIan DowseThe
7270a9a8c2eSIan Dowse.Fn usbd_do_request_async
7280a9a8c2eSIan Dowsefunction is like
7290a9a8c2eSIan Dowse.Fn usbd_do_request ,
7300a9a8c2eSIan Dowsebut it does not wait for the request to complete before returning.
7310a9a8c2eSIan DowseThis routine does not block so it can be used from contexts where
7320a9a8c2eSIan Dowsesleeping is not allowed.
7330a9a8c2eSIan DowseNote that there is no notification mechanism to report when the
7340a9a8c2eSIan Dowseoperation completed nor is there a way to determine whether the
7350a9a8c2eSIan Dowserequest succeeded, so this function is of limited use.
7360a9a8c2eSIan DowseSee
7370a9a8c2eSIan Dowse.Fn usbd_setup_default_xfer
7380a9a8c2eSIan Dowseand
7390a9a8c2eSIan Dowse.Fn usbd_transfer
7400a9a8c2eSIan Dowsefor a way to invoke an asynchronous callback upon completion of
7410a9a8c2eSIan Dowsea control request.
7420a9a8c2eSIan DowseThe
7430a9a8c2eSIan Dowse.Fn usbd_do_request_flags
7440a9a8c2eSIan Dowsefunction is like
7450a9a8c2eSIan Dowse.Fn usbd_do_request ,
7460a9a8c2eSIan Dowsebut additional flags can be specified, the timeout is configurable,
7470a9a8c2eSIan Dowseand the actual number of bytes transferred is made available to the
7480a9a8c2eSIan Dowsecaller.
7490a9a8c2eSIan DowseThe
7500a9a8c2eSIan Dowse.Fn usbd_do_request_flags_pipe
7510a9a8c2eSIan Dowsefunction uses a specified pipe instead of the default pipe.
7520a9a8c2eSIan Dowse.Pp
7530a9a8c2eSIan DowseThe function
7540a9a8c2eSIan Dowse.Fn usbd_open_pipe
7550a9a8c2eSIan Dowsecreates a pipe connected to a specified endpoint on a specified interface.
7560a9a8c2eSIan DowseThe parameter
7570a9a8c2eSIan Dowse.Fa address
7580a9a8c2eSIan Dowseshould be the
7590a9a8c2eSIan Dowse.Fa bEndpointAddress
7600a9a8c2eSIan Dowsevalue from one of this interface's endpoint descriptors.
7610a9a8c2eSIan DowseIf
7620a9a8c2eSIan Dowse.Fa flags
7630a9a8c2eSIan Dowsecontains
7640a9a8c2eSIan Dowse.Dv USBD_EXCLUSIVE_USE
7650a9a8c2eSIan Dowsethen the operation will only succeed if there are no open pipes
7660a9a8c2eSIan Dowsealready connected to the specified endpoint.
7670a9a8c2eSIan DowseThe
7680a9a8c2eSIan Dowse.Fn usbd_open_pipe_intr
7690a9a8c2eSIan Dowsefunction creates an interrupt pipe connected to the specified endpoint.
7700a9a8c2eSIan DowseThe parameter
7710a9a8c2eSIan Dowse.Fa address
7720a9a8c2eSIan Dowseshould be the
7730a9a8c2eSIan Dowse.Fa bEndpointAddress
7740a9a8c2eSIan Dowsevalue from one of this interface's endpoint descriptors.
7750a9a8c2eSIan DowseThe
7760a9a8c2eSIan Dowse.Fa flags
7770a9a8c2eSIan Dowseparameter is passed to
7780a9a8c2eSIan Dowse.Fn usbd_setup_xfer .
7790a9a8c2eSIan DowseThe
7800a9a8c2eSIan Dowse.Fa buffer
7810a9a8c2eSIan Dowseand
7820a9a8c2eSIan Dowse.Fa len
7830a9a8c2eSIan Dowseparameters define a buffer that is to be used for the interrupt transfers.
7840a9a8c2eSIan DowseThe callback to be invoked each time a transfer completes is specified by
7850a9a8c2eSIan Dowse.Fa cb ,
7860a9a8c2eSIan Dowseand
7870a9a8c2eSIan Dowse.Fa priv
7880a9a8c2eSIan Dowseis an argument to be passed to the callback function.
7890a9a8c2eSIan DowseThe
7900a9a8c2eSIan Dowse.Fa ival
7910a9a8c2eSIan Dowseparameter specifies the maximum acceptable interval between transfers;
7920a9a8c2eSIan Dowsein practice the transfers may occur more frequently.
7930a9a8c2eSIan DowseThe function
7940a9a8c2eSIan Dowse.Fn usbd_pipe2device_handle
7950a9a8c2eSIan Dowsereturns the device associated with the specified
7960a9a8c2eSIan Dowse.Fa pipe .
7970a9a8c2eSIan Dowse.Pp
7980a9a8c2eSIan DowseThe
7990a9a8c2eSIan Dowse.Fn usbd_abort_pipe
8000a9a8c2eSIan Dowsefunction aborts all active or waiting transfers on the specified pipe.
8010a9a8c2eSIan DowseEach transfer is aborted with a
8020a9a8c2eSIan Dowse.Dv USBD_CANCELLED
8030a9a8c2eSIan Dowsestatus; callback routines must detect this error code to ensure that
8040a9a8c2eSIan Dowsethey do not attempt to initiate a new transfer in response to one being
8050a9a8c2eSIan Dowseaborted.
8060a9a8c2eSIan DowseThis routine blocks while it is waiting for the hardware to complete
8070a9a8c2eSIan Dowseprocessing of aborted transfers, so it is only safe to call it in
8080a9a8c2eSIan Dowsecontexts where sleeping is allowed.
8090a9a8c2eSIan DowseThe function
8100a9a8c2eSIan Dowse.Fn usbd_abort_default_pipe
8110a9a8c2eSIan Dowseaborts all active or waiting transfers on the default pipe.
8120a9a8c2eSIan DowseLike
8130a9a8c2eSIan Dowse.Fn usbd_abort_pipe ,
8140a9a8c2eSIan Dowseit blocks waiting for the hardware processing to complete.
8150a9a8c2eSIan Dowse.Pp
8160a9a8c2eSIan DowseWhen a pipe has no active or waiting transfers, the pipe may be closed
8170a9a8c2eSIan Dowseusing the
8180a9a8c2eSIan Dowse.Fn usbd_close_pipe
8190a9a8c2eSIan Dowsefunction.
8200a9a8c2eSIan DowseOnce a pipe is closed, its pipe handle becomes invalid and may no longer
8210a9a8c2eSIan Dowsebe used.
8220a9a8c2eSIan Dowse.Pp
8230a9a8c2eSIan DowseUSB transfer handles are allocated using the function
8240a9a8c2eSIan Dowse.Fn usbd_alloc_xfer
8250a9a8c2eSIan Dowseand may be freed using
8260a9a8c2eSIan Dowse.Fn usbd_free_xfer .
8270a9a8c2eSIan Dowse.Pp
8280a9a8c2eSIan DowseThe function
8290a9a8c2eSIan Dowse.Fn usbd_setup_xfer
8300a9a8c2eSIan Dowseinitializes a transfer handle with the details of a transfer to or from
8310a9a8c2eSIan Dowsea USB device.
8320a9a8c2eSIan DowseThe
8330a9a8c2eSIan Dowse.Fa xfer
8340a9a8c2eSIan Dowseparameter specifies the transfer handle to initialize,
8350a9a8c2eSIan Dowse.Fa pipe
8360a9a8c2eSIan Dowsespecifies the pipe on which the transfer is to take place, and
8370a9a8c2eSIan Dowse.Fa priv
8380a9a8c2eSIan Dowseis an argument that will be passed to callback function.
8390a9a8c2eSIan DowseThe arguments
8400a9a8c2eSIan Dowse.Fa buffer
8410a9a8c2eSIan Dowseand
8420a9a8c2eSIan Dowse.Fa length
8430a9a8c2eSIan Dowsedefine the data buffer for the transfer.
8440a9a8c2eSIan DowseIf
8450a9a8c2eSIan Dowse.Fa length
8460a9a8c2eSIan Dowseis zero then the
8470a9a8c2eSIan Dowse.Fa buffer
8480a9a8c2eSIan Dowsemay be
8490a9a8c2eSIan Dowse.Dv NULL .
8500a9a8c2eSIan DowseThe
8510a9a8c2eSIan Dowse.Fa flags
8520a9a8c2eSIan Dowseparameter may contain the following flags:
8530a9a8c2eSIan Dowse.Bl -tag -width ".Dv USBD_FORCE_SHORT_XFER"
8540a9a8c2eSIan Dowse.It Dv USBD_NO_COPY
8550a9a8c2eSIan DowseThis is used in association with
8560a9a8c2eSIan Dowse.Fn usbd_alloc_buffer
8570a9a8c2eSIan Dowseand
8580a9a8c2eSIan Dowse.Fn usbd_free_buffer
8590a9a8c2eSIan Dowseto use a dedicated DMA-capable buffer for the transfer.
8600a9a8c2eSIan Dowse.It Dv USBD_SYNCHRONOUS
8610a9a8c2eSIan DowseWait for the transfer to compete in
8620a9a8c2eSIan Dowse.Fn usbd_transfer .
8630a9a8c2eSIan Dowse.It Dv USBD_SHORT_XFER_OK
8640a9a8c2eSIan DowsePermit transfers shorter than the requested data length.
8650a9a8c2eSIan Dowse.It Dv USBD_FORCE_SHORT_XFER
8660a9a8c2eSIan DowseForce a short transfer at the end of a write operation to let the
8670a9a8c2eSIan Dowsedevice know that the transfer has ended.
8680a9a8c2eSIan Dowse.El
8690a9a8c2eSIan Dowse.Pp
8700a9a8c2eSIan DowseThe
8710a9a8c2eSIan Dowse.Fa timeout
8720a9a8c2eSIan Dowseparameter specifies a timeout for the transfer in milliseconds.
8730a9a8c2eSIan DowseA value of
8740a9a8c2eSIan Dowse.Dv USBD_NO_TIMEOUT
8750a9a8c2eSIan Dowseindicates that no timeout should be configured.
8760a9a8c2eSIan DowseThe parameter
8770a9a8c2eSIan Dowse.Fa callback
8780a9a8c2eSIan Dowsespecifies the function to call when the transfer completes.
8790a9a8c2eSIan DowseNote that
8800a9a8c2eSIan Dowse.Fn usbd_setup_xfer
8810a9a8c2eSIan Dowsedoes not actually initiate the transfer.
8820a9a8c2eSIan DowseThe
8830a9a8c2eSIan Dowse.Fn usbd_setup_default_xfer
8840a9a8c2eSIan Dowseinitializes a control transfer for the default pipe.
8850a9a8c2eSIan DowseThe
8860a9a8c2eSIan Dowse.Fa req
8870a9a8c2eSIan Dowseparameter should point at a completed
8880a9a8c2eSIan Dowse.Vt usb_device_request_t
8890a9a8c2eSIan Dowsestructure.
8900a9a8c2eSIan DowseThe function
8910a9a8c2eSIan Dowse.Fa usbd_setup_isoc_xfer
8920a9a8c2eSIan Dowseinitializes a transfer for an isochronous pipe.
8930a9a8c2eSIan Dowse.Pp
8940a9a8c2eSIan DowseThe function
8950a9a8c2eSIan Dowse.Fn usbd_transfer
8960a9a8c2eSIan Dowseinitiates a transfer.
8970a9a8c2eSIan DowseNormally it returns
8980a9a8c2eSIan Dowse.Dv USBD_IN_PROGRESS
8990a9a8c2eSIan Dowseto indicate that the transfer has been queued.
9000a9a8c2eSIan DowseIf the USB stack is operating in polling mode, or if the transfer
9010a9a8c2eSIan Dowseis synchronous, then
9020a9a8c2eSIan Dowse.Dv USBD_NORMAL_COMPLETION
9030a9a8c2eSIan Dowsemay be returned.
9040a9a8c2eSIan DowseOther return values indicate that the transfer could not be
9050a9a8c2eSIan Dowseinitiated due to an error.
9060a9a8c2eSIan DowseThe
9070a9a8c2eSIan Dowse.Fn usbd_sync_transfer
9080a9a8c2eSIan Dowsefunction executes a transfer synchronously.
9090a9a8c2eSIan DowseIt will sleep waiting for the transfer to complete and then return
9100a9a8c2eSIan Dowsethe transfer status.
9110a9a8c2eSIan DowseNote that if the transfer has a callback routine, this will be
9120a9a8c2eSIan Dowseinvoked before
9130a9a8c2eSIan Dowse.Fn usbd_sync_transfer
9140a9a8c2eSIan Dowsereturns.
9150a9a8c2eSIan Dowse.Pp
9160a9a8c2eSIan DowseThe
9170a9a8c2eSIan Dowse.Fn usbd_intr_transfer
9180a9a8c2eSIan Dowseand
9190a9a8c2eSIan Dowse.Fn usbd_bulk_transfer
9200a9a8c2eSIan Dowsefunctions set up a transfer and wait synchronously for it to complete
9210a9a8c2eSIan Dowsebut they allows signals to interrupt the wait.
9220a9a8c2eSIan DowseThey returns
9230a9a8c2eSIan Dowse.Dv USBD_INTERRUPTED
9240a9a8c2eSIan Dowseif the transfer was interrupted by a signal.
9250a9a8c2eSIan DowseXXX these two functions are identical apart from their names.
9260a9a8c2eSIan Dowse.Pp
9270a9a8c2eSIan DowseThe function
9280a9a8c2eSIan Dowse.Fn usbd_get_xfer_status
9290a9a8c2eSIan Dowseretrieves various information from a completed transfer.
9300a9a8c2eSIan DowseIf the
9310a9a8c2eSIan Dowse.Fa priv
9320a9a8c2eSIan Dowseparameter is not NULL then the callback private argument is
9330a9a8c2eSIan Dowsestored in
9340a9a8c2eSIan Dowse.Fa *priv .
9350a9a8c2eSIan DowseIf
9360a9a8c2eSIan Dowse.Fa buffer
9370a9a8c2eSIan Dowseis not NULL then the transfer buffer pointer is stored in
9380a9a8c2eSIan Dowse.Fa *buffer .
9390a9a8c2eSIan DowseThe actual number of bytes transferred is stored in
9400a9a8c2eSIan Dowse.Fa *count
9410a9a8c2eSIan Dowseif
9420a9a8c2eSIan Dowse.Fa count is not NULL.
9430a9a8c2eSIan DowseFinally, the transfer status is stored in
9440a9a8c2eSIan Dowse.Fa *status
9450a9a8c2eSIan Dowseif
9460a9a8c2eSIan Dowse.Fa status
9470a9a8c2eSIan Dowseis not NULL.
9480a9a8c2eSIan Dowse.Pp
9490a9a8c2eSIan DowseThe
9500a9a8c2eSIan Dowse.Fn usbd_clear_endpoint_stall
9510a9a8c2eSIan Dowsefunction clears an endpoint stall condition synchronously, i.e.\&
9520a9a8c2eSIan Dowseit sleeps waiting for the stall clear request to complete.
9530a9a8c2eSIan DowseThe function
9540a9a8c2eSIan Dowse.Fn usbd_clear_endpoint_stall_async
9550a9a8c2eSIan Dowseperforms the same function asynchronously, but it provides no
9560a9a8c2eSIan Dowseway to determine when the request completed, or whether it was
9570a9a8c2eSIan Dowsesuccessful.
9580a9a8c2eSIan DowseThe
9590a9a8c2eSIan Dowse.Fn usbd_clear_endpoint_toggle
9600a9a8c2eSIan Dowsefunction instructs the host controller driver to reset the toggle bit
9610a9a8c2eSIan Dowseon a pipe.
9620a9a8c2eSIan DowseThis is used when manually clearing an endpoint stall using a
9630a9a8c2eSIan Dowsecontrol pipe request, in order to ensure that the host controller
9640a9a8c2eSIan Dowsedriver and the USB device restart with the same toggle value.
9650a9a8c2eSIan Dowse.Pp
9660a9a8c2eSIan DowseNormally the USB subsystem maps and copies data to and from
9670a9a8c2eSIan DowseDMA-capable memory each time a transfer is performed.
9680a9a8c2eSIan DowseThe function
9690a9a8c2eSIan Dowse.Fn usbd_alloc_buffer
9700a9a8c2eSIan Dowseallocates a permanent DMA-capable buffer associated with the
9710a9a8c2eSIan Dowsetransfer to avoid this overhead.
9720a9a8c2eSIan DowseThe return value is the virtual address of the buffer.
9730a9a8c2eSIan DowseAny time that
9740a9a8c2eSIan Dowse.Fn usbd_setup_xfer
9750a9a8c2eSIan Dowseis called on the transfer with the
9760a9a8c2eSIan Dowse.Dv USBD_NO_COPY
9770a9a8c2eSIan Dowseflag enabled, the allocated buffer will be used directly and
9780a9a8c2eSIan Dowsethe
9790a9a8c2eSIan Dowse.Fa buffer
9800a9a8c2eSIan Dowseargument passed to
9810a9a8c2eSIan Dowse.Fn usbd_setup_xfer
9820a9a8c2eSIan Dowsewill be ignored.
9830a9a8c2eSIan DowseThe
9840a9a8c2eSIan Dowse.Fn usbd_get_buffer
9850a9a8c2eSIan Dowsefunction returns a pointer to the virtual address of a buffer previously
9860a9a8c2eSIan Dowseallocated by
9870a9a8c2eSIan Dowse.Fn usbd_alloc_buffer .
9880a9a8c2eSIan DowseFinally,
9890a9a8c2eSIan Dowse.Fn usbd_free_buffer
9900a9a8c2eSIan Dowsedeallocates the buffer.
9910a9a8c2eSIan Dowse.Pp
9920a9a8c2eSIan DowseThe
9930a9a8c2eSIan Dowse.Fn usbd_errstr
9940a9a8c2eSIan Dowsefunction converts a status code into a string for display.
9950a9a8c2eSIan Dowse.Pp
9960a9a8c2eSIan DowseThe function
9970a9a8c2eSIan Dowse.Fn usbd_set_polling
9980a9a8c2eSIan Dowseenables or disables polling mode.
9990a9a8c2eSIan DowseIn polling mode, all operations will busy-wait for the device to
10000a9a8c2eSIan Dowserespond, so its use is effectively limited to boot time and kernel
10010a9a8c2eSIan Dowsedebuggers.
10020a9a8c2eSIan DowseIt is important to match up calls that enable and disable polling
10030a9a8c2eSIan Dowsemode, because the implementation just increments a polling reference
10040a9a8c2eSIan Dowsecount when
10050a9a8c2eSIan Dowse.Fa on
10060a9a8c2eSIan Dowseis non-zero and decrements it when
10070a9a8c2eSIan Dowse.Fa on
10080a9a8c2eSIan Dowseis zero.
10090a9a8c2eSIan DowseThe
10100a9a8c2eSIan Dowse.Fn usbd_dopoll
10110a9a8c2eSIan Dowsecauses the host controller driver to poll for any activity.
10120a9a8c2eSIan DowseThis should only be used when polling mode is enabled.
10130a9a8c2eSIan Dowse.Pp
10140a9a8c2eSIan DowseThe
10150a9a8c2eSIan Dowse.Fn usbd_ratecheck
10160a9a8c2eSIan Dowsefunction is used to limit the rate at which error messages are
10170a9a8c2eSIan Dowseprinted to approximately once per second.
10180a9a8c2eSIan DowseThe
10190a9a8c2eSIan Dowse.Fa last
10200a9a8c2eSIan Dowseargument should point at a persistent
10210a9a8c2eSIan Dowse.Vt "struct timeval" .
10220a9a8c2eSIan DowseA value of 1 will be returned if a message should be printed, but if
10230a9a8c2eSIan Dowse.Fn usbd_ratecheck
10240a9a8c2eSIan Dowsehas already been called with the same
10250a9a8c2eSIan Dowse.Vt "struct timeval"
10260a9a8c2eSIan Dowseparameter in the last second then 0 is returned and the error message
10270a9a8c2eSIan Dowseshould be suppressed.
10280a9a8c2eSIan Dowse.Pp
10290a9a8c2eSIan DowseThe functions
10300a9a8c2eSIan Dowse.Fn usb_detach_wait
10310a9a8c2eSIan Dowseand
10320a9a8c2eSIan Dowse.Fn usb_detach_wakeup
10330a9a8c2eSIan Dowseare used to wait for references to drain before completing the
10340a9a8c2eSIan Dowsedetachment of a device.
10350a9a8c2eSIan DowseThe
10360a9a8c2eSIan Dowse.Fn usb_detach_wait
10370a9a8c2eSIan Dowsefunction will wait up to 60 seconds to receive a signal from
10380a9a8c2eSIan Dowse.Fn usb_detach_wait .
10390a9a8c2eSIan Dowse.Ss "USB Descriptors"
10400a9a8c2eSIan DowseThe USB specification defines a number of standard descriptors by
10410a9a8c2eSIan Dowsewhich USB devices report their attributes.
10420a9a8c2eSIan DowseThese descriptors are fixed-format structures that all USB devices
10430a9a8c2eSIan Dowsemake available through USB control pipe requests.
10440a9a8c2eSIan Dowse.Pp
10450a9a8c2eSIan DowseEvery USB device has exactly one USB device descriptor.
10460a9a8c2eSIan DowseThe USB subsystem retrieves this automatically when a device is
10470a9a8c2eSIan Dowseattached, and a copy of the descriptor is kept in memory.
10480a9a8c2eSIan DowseThe
10490a9a8c2eSIan Dowse.Fn usbd_get_device_descriptor
10500a9a8c2eSIan Dowsefunction returns a pointer to the descriptor.
10510a9a8c2eSIan DowseThe device descriptor structure is defined in
10520a9a8c2eSIan Dowse.In dev/usb/usb.h
10530a9a8c2eSIan Dowseas follows:
10540a9a8c2eSIan Dowse.Bd -literal
10550a9a8c2eSIan Dowsetypedef struct {
10560a9a8c2eSIan Dowse	uByte		bLength;
10570a9a8c2eSIan Dowse	uByte		bDescriptorType;
10580a9a8c2eSIan Dowse	uWord		bcdUSB;
10590a9a8c2eSIan Dowse#define UD_USB_2_0		0x0200
10600a9a8c2eSIan Dowse#define UD_IS_USB2(d) (UGETW((d)->bcdUSB) >= UD_USB_2_0)
10610a9a8c2eSIan Dowse	uByte		bDeviceClass;
10620a9a8c2eSIan Dowse	uByte		bDeviceSubClass;
10630a9a8c2eSIan Dowse	uByte		bDeviceProtocol;
10640a9a8c2eSIan Dowse	uByte		bMaxPacketSize;
10650a9a8c2eSIan Dowse	/* The fields below are not part of the initial descriptor. */
10660a9a8c2eSIan Dowse	uWord		idVendor;
10670a9a8c2eSIan Dowse	uWord		idProduct;
10680a9a8c2eSIan Dowse	uWord		bcdDevice;
10690a9a8c2eSIan Dowse	uByte		iManufacturer;
10700a9a8c2eSIan Dowse	uByte		iProduct;
10710a9a8c2eSIan Dowse	uByte		iSerialNumber;
10720a9a8c2eSIan Dowse	uByte		bNumConfigurations;
10730a9a8c2eSIan Dowse} UPACKED usb_device_descriptor_t;
10740a9a8c2eSIan Dowse#define USB_DEVICE_DESCRIPTOR_SIZE 18
10750a9a8c2eSIan Dowse.Ed
10760a9a8c2eSIan Dowse.Pp
10770a9a8c2eSIan DowseUSB devices have at least one configuration descriptor.
10780a9a8c2eSIan DowseThe
10790a9a8c2eSIan Dowse.Fa bNumConfigurations
10800a9a8c2eSIan Dowsefield of the device descriptor specifies the number of configuration
10810a9a8c2eSIan Dowsedescriptors that a device supports.
10820a9a8c2eSIan DowseThe
10830a9a8c2eSIan Dowse.Fn usbd_get_config_desc
10840a9a8c2eSIan Dowsefunction retrieves a particular configuration descriptor from the device
10850a9a8c2eSIan Dowseand the
10860a9a8c2eSIan Dowse.Fn usbd_get_config_desc_full
10870a9a8c2eSIan Dowsefunction retrieves a full
10880a9a8c2eSIan Dowse.Fa wTotalLength
10890a9a8c2eSIan Dowselength configuration descriptor, which includes all related interface
10900a9a8c2eSIan Dowseand endpoint descriptors.
10910a9a8c2eSIan DowseOnly one configuration may be active at a time.
10920a9a8c2eSIan DowseThe
10930a9a8c2eSIan Dowse.Fn usbd_set_config_index
10940a9a8c2eSIan Dowsefunction activates a specified configuration.
10950a9a8c2eSIan DowseThe configuration descriptor structure is defined in
10960a9a8c2eSIan Dowse.In dev/usb/usb.h
10970a9a8c2eSIan Dowseas follows:
10980a9a8c2eSIan Dowse.Bd -literal
10990a9a8c2eSIan Dowsetypedef struct {
11000a9a8c2eSIan Dowse	uByte		bLength;
11010a9a8c2eSIan Dowse	uByte		bDescriptorType;
11020a9a8c2eSIan Dowse	uWord		wTotalLength;
11030a9a8c2eSIan Dowse	uByte		bNumInterface;
11040a9a8c2eSIan Dowse	uByte		bConfigurationValue;
11050a9a8c2eSIan Dowse	uByte		iConfiguration;
11060a9a8c2eSIan Dowse	uByte		bmAttributes;
11070a9a8c2eSIan Dowse#define UC_BUS_POWERED		0x80
11080a9a8c2eSIan Dowse#define UC_SELF_POWERED		0x40
11090a9a8c2eSIan Dowse#define UC_REMOTE_WAKEUP	0x20
11100a9a8c2eSIan Dowse	uByte		bMaxPower; /* max current in 2 mA units */
11110a9a8c2eSIan Dowse#define UC_POWER_FACTOR 2
11120a9a8c2eSIan Dowse} UPACKED usb_config_descriptor_t;
11130a9a8c2eSIan Dowse#define USB_CONFIG_DESCRIPTOR_SIZE 9
11140a9a8c2eSIan Dowse.Ed
11150a9a8c2eSIan Dowse.Pp
11160a9a8c2eSIan DowseEach device configuration provides one or more interfaces.
11170a9a8c2eSIan DowseThe
11180a9a8c2eSIan Dowse.Fa bNumInterface
11190a9a8c2eSIan Dowsefield of the configuration descriptor specifies the number of
11200a9a8c2eSIan Dowseinterfaces associated with a device configuration.
11210a9a8c2eSIan DowseInterfaces are described by an interface descriptor, which is defined in
11220a9a8c2eSIan Dowse.In dev/usb/usb.h
11230a9a8c2eSIan Dowseas follows:
11240a9a8c2eSIan Dowse.Bd -literal
11250a9a8c2eSIan Dowsetypedef struct {
11260a9a8c2eSIan Dowse	uByte		bLength;
11270a9a8c2eSIan Dowse	uByte		bDescriptorType;
11280a9a8c2eSIan Dowse	uByte		bInterfaceNumber;
11290a9a8c2eSIan Dowse	uByte		bAlternateSetting;
11300a9a8c2eSIan Dowse	uByte		bNumEndpoints;
11310a9a8c2eSIan Dowse	uByte		bInterfaceClass;
11320a9a8c2eSIan Dowse	uByte		bInterfaceSubClass;
11330a9a8c2eSIan Dowse	uByte		bInterfaceProtocol;
11340a9a8c2eSIan Dowse	uByte		iInterface;
11350a9a8c2eSIan Dowse} UPACKED usb_interface_descriptor_t;
11360a9a8c2eSIan Dowse#define USB_INTERFACE_DESCRIPTOR_SIZE 9
11370a9a8c2eSIan Dowse.Ed
11380a9a8c2eSIan Dowse.Pp
11390a9a8c2eSIan DowseConfigurations may also have alternate interfaces with the same
11400a9a8c2eSIan Dowse.Fa bInterfaceNumber
11410a9a8c2eSIan Dowsebut different
11420a9a8c2eSIan Dowse.Fa bAlternateSetting
11430a9a8c2eSIan Dowsevalues.
11440a9a8c2eSIan DowseThese alternate interface settings may be selected by passing a
11450a9a8c2eSIan Dowsenon-zero
11460a9a8c2eSIan Dowse.Fa altidx
11470a9a8c2eSIan Dowseparameter to
11480a9a8c2eSIan Dowse.Fn usbd_set_interface .
11490a9a8c2eSIan Dowse.Pp
11500a9a8c2eSIan DowseInterfaces have zero or more endpoints, and each endpoint has an
11510a9a8c2eSIan Dowseendpoint descriptor.
11520a9a8c2eSIan DowseNote that endpoint zero, which is always present, does not have an
11530a9a8c2eSIan Dowseendpoint descriptor, and it is never included in the
11540a9a8c2eSIan Dowse.Fa bNumEndpoints
11550a9a8c2eSIan Dowsecount of endpoints.
11560a9a8c2eSIan DowseThe endpoint descriptor is defined in
11570a9a8c2eSIan Dowse.In dev/usb/usb.h
11580a9a8c2eSIan Dowseas follows:
11590a9a8c2eSIan Dowse.Bd -literal
11600a9a8c2eSIan Dowsetypedef struct {
11610a9a8c2eSIan Dowse	uByte		bLength;
11620a9a8c2eSIan Dowse	uByte		bDescriptorType;
11630a9a8c2eSIan Dowse	uByte		bEndpointAddress;
11640a9a8c2eSIan Dowse#define UE_GET_DIR(a)	((a) & 0x80)
11650a9a8c2eSIan Dowse#define UE_SET_DIR(a,d) ((a) | (((d)&1) << 7))
11660a9a8c2eSIan Dowse#define UE_DIR_IN	0x80
11670a9a8c2eSIan Dowse#define UE_DIR_OUT	0x00
11680a9a8c2eSIan Dowse#define UE_ADDR		0x0f
11690a9a8c2eSIan Dowse#define UE_GET_ADDR(a)	((a) & UE_ADDR)
11700a9a8c2eSIan Dowse	uByte		bmAttributes;
11710a9a8c2eSIan Dowse#define UE_XFERTYPE	0x03
11720a9a8c2eSIan Dowse#define	 UE_CONTROL	0x00
11730a9a8c2eSIan Dowse#define	 UE_ISOCHRONOUS 0x01
11740a9a8c2eSIan Dowse#define	 UE_BULK	0x02
11750a9a8c2eSIan Dowse#define	 UE_INTERRUPT	0x03
11760a9a8c2eSIan Dowse#define UE_GET_XFERTYPE(a)	((a) & UE_XFERTYPE)
11770a9a8c2eSIan Dowse#define UE_ISO_TYPE	0x0c
11780a9a8c2eSIan Dowse#define	 UE_ISO_ASYNC	0x04
11790a9a8c2eSIan Dowse#define	 UE_ISO_ADAPT	0x08
11800a9a8c2eSIan Dowse#define	 UE_ISO_SYNC	0x0c
11810a9a8c2eSIan Dowse#define UE_GET_ISO_TYPE(a)	((a) & UE_ISO_TYPE)
11820a9a8c2eSIan Dowse	uWord		wMaxPacketSize;
11830a9a8c2eSIan Dowse	uByte		bInterval;
11840a9a8c2eSIan Dowse} UPACKED usb_endpoint_descriptor_t;
11850a9a8c2eSIan Dowse#define USB_ENDPOINT_DESCRIPTOR_SIZE 7
11860a9a8c2eSIan Dowse.Ed
11870a9a8c2eSIan Dowse.Sh RETURN VALUES
11880a9a8c2eSIan DowseMany functions return a
11890a9a8c2eSIan Dowse.Vt usbd_status
11900a9a8c2eSIan Dowsetype to indicate the outcome of the operation.
11910a9a8c2eSIan DowseIf the operation completed successfully then
11920a9a8c2eSIan Dowse.Dv USBD_NORMAL_COMPLETION
11930a9a8c2eSIan Dowseis returned.
11940a9a8c2eSIan DowseOperations that have been started but not yet completed will return
11950a9a8c2eSIan Dowse.Dv USBD_IN_PROGRESS .
11960a9a8c2eSIan DowseOther errors usually indicate a problem.
11970a9a8c2eSIan DowseError codes can be converted to strings using
11980a9a8c2eSIan Dowse.Fn usbd_errstr .
11990a9a8c2eSIan Dowse.Sh ERRORS
12000a9a8c2eSIan Dowse.Bl -tag -width ".Er USBD_PENDING_REQUESTS"
12010a9a8c2eSIan Dowse.It Bq Er USBD_PENDING_REQUESTS
12020a9a8c2eSIan DowseA pipe could not be closed because there are active requests.
12030a9a8c2eSIan Dowse.It Bq Er USBD_NOT_STARTED
12040a9a8c2eSIan DowseThe transfer has not yet been started.
12050a9a8c2eSIan Dowse.It Bq Er USBD_INVAL
12060a9a8c2eSIan DowseAn invalid value was supplied.
12070a9a8c2eSIan Dowse.It Bq Er USBD_NOMEM
12080a9a8c2eSIan DowseAn attempt to allocate memory failed.
12090a9a8c2eSIan Dowse.It Bq Er USBD_CANCELLED
12100a9a8c2eSIan DowseThe transfer was aborted.
12110a9a8c2eSIan Dowse.It Bq Er USBD_BAD_ADDRESS
12120a9a8c2eSIan DowseThe specified endpoint address was not found.
12130a9a8c2eSIan Dowse.It Bq Er USBD_IN_USE
12140a9a8c2eSIan DowseThe endpoint is already in use, or the configuration cannot be changed
12150a9a8c2eSIan Dowsebecause some of its endpoints are in use.
12160a9a8c2eSIan Dowse.It Bq Er USBD_NO_ADDR
12170a9a8c2eSIan DowseNo free USB devices addresses were found to assign to the device.
12180a9a8c2eSIan Dowse.It Bq Er USBD_SET_ADDR_FAILED
12190a9a8c2eSIan DowseThe device address could not be set.
12200a9a8c2eSIan Dowse.It Bq Er USBD_NO_POWER
12210a9a8c2eSIan DowseInsufficient power was available for the device.
12220a9a8c2eSIan Dowse.It Bq Er USBD_TOO_DEEP
12230a9a8c2eSIan DowseToo many levels of chained hubs were found.
12240a9a8c2eSIan Dowse.It Bq Er USBD_IOERROR
12250a9a8c2eSIan DowseThere was an error communicating with the device.
12260a9a8c2eSIan Dowse.It Bq Er USBD_NOT_CONFIGURED
12270a9a8c2eSIan DowseAn operation that requires an active configuration was attempted while
12280a9a8c2eSIan Dowsethe device was in an unconfigured state.
12290a9a8c2eSIan Dowse.It Bq Er USBD_TIMEOUT
12300a9a8c2eSIan DowseA transfer timed out.
12310a9a8c2eSIan Dowse.It Bq Er USBD_SHORT_XFER
12320a9a8c2eSIan DowseA transfer that disallowed short data lengths completed with less than
12330a9a8c2eSIan Dowsethe requested length transferred.
12340a9a8c2eSIan Dowse.It Bq Er USBD_STALLED
12350a9a8c2eSIan DowseA transfer failed because the pipe is stalled.
12360a9a8c2eSIan Dowse.It Bq Er USBD_INTERRUPTED
12370a9a8c2eSIan DowseAn interruptible operation caught a signal.
12380a9a8c2eSIan Dowse.El
12390a9a8c2eSIan Dowse.Sh SEE ALSO
12400a9a8c2eSIan Dowse.Xr usb 4
12410a9a8c2eSIan Dowse.Sh HISTORY
12420a9a8c2eSIan DowseThe USB driver interface first appeared in
12430a9a8c2eSIan Dowse.Fx 3.0 .
12440a9a8c2eSIan Dowse.Sh AUTHORS
12450a9a8c2eSIan DowseThe USB driver was written by
12460a9a8c2eSIan Dowse.An Lennart Augustsson
12470a9a8c2eSIan Dowsefor the
12480a9a8c2eSIan Dowse.Nx
12490a9a8c2eSIan Dowseproject.
12500a9a8c2eSIan Dowse.Pp
12510a9a8c2eSIan Dowse.An -nosplit
12520a9a8c2eSIan DowseThis manual page was written by
12530a9a8c2eSIan Dowse.An Ian Dowse Aq iedowse@FreeBSD.org .
1254