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