2012-05-13 23:29:59 +04:00
|
|
|
.\" $NetBSD: usbdi.9,v 1.13 2012/05/13 19:29:59 mrg Exp $
|
2012-05-13 13:00:51 +04:00
|
|
|
.\"
|
|
|
|
.\" Copyright (c) 2012 Matthew R. Green
|
|
|
|
.\" All rights reserved.
|
|
|
|
.\"
|
|
|
|
.\" Redistribution and use in source and binary forms, with or without
|
|
|
|
.\" modification, are permitted provided that the following conditions
|
|
|
|
.\" are met:
|
|
|
|
.\" 1. Redistributions of source code must retain the above copyright
|
|
|
|
.\" notice, this list of conditions and the following disclaimer.
|
|
|
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
.\" notice, this list of conditions and the following disclaimer in the
|
|
|
|
.\" documentation and/or other materials provided with the distribution.
|
|
|
|
.\" 3. The name of the author may not be used to endorse or promote products
|
|
|
|
.\" derived from this software without specific prior written permission.
|
|
|
|
.\"
|
|
|
|
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
|
|
.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
|
|
.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
|
|
.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
|
|
.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
|
|
.\" BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
|
|
.\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
|
|
|
.\" AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
|
|
.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
.\" SUCH DAMAGE.
|
|
|
|
.\"
|
1999-12-15 14:27:34 +03:00
|
|
|
.\"
|
|
|
|
.\" Copyright (c) 1999 The NetBSD Foundation, Inc.
|
|
|
|
.\" All rights reserved.
|
|
|
|
.\"
|
|
|
|
.\" This code is derived from software contributed to The NetBSD Foundation
|
|
|
|
.\" by Lennart Augustsson.
|
|
|
|
.\"
|
|
|
|
.\" Redistribution and use in source and binary forms, with or without
|
|
|
|
.\" modification, are permitted provided that the following conditions
|
|
|
|
.\" are met:
|
|
|
|
.\" 1. Redistributions of source code must retain the above copyright
|
|
|
|
.\" notice, this list of conditions and the following disclaimer.
|
|
|
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
.\" notice, this list of conditions and the following disclaimer in the
|
|
|
|
.\" documentation and/or other materials provided with the distribution.
|
|
|
|
.\"
|
|
|
|
.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
|
|
|
.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
|
|
|
.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
|
|
.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
|
|
|
.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
|
|
.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
|
|
.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
|
|
.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
|
|
.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
|
|
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
|
|
.\" POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
.\"
|
2012-05-13 23:29:59 +04:00
|
|
|
.Dd May 13, 2012
|
1999-12-15 14:27:34 +03:00
|
|
|
.Dt USBDI 9
|
|
|
|
.Os
|
|
|
|
.Sh NAME
|
|
|
|
.Nm usbdi
|
|
|
|
.Nd USB device drivers interface
|
|
|
|
.Sh SYNOPSIS
|
2011-10-20 16:14:12 +04:00
|
|
|
.In dev/usb/usb.h
|
|
|
|
.In dev/usb/usbdi.h
|
2012-05-13 13:00:51 +04:00
|
|
|
.In dev/usb/usbdi_util.h
|
|
|
|
.Ss Functions offered by usbdi.h
|
2012-05-13 14:57:09 +04:00
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_open_pipe "usbd_interface_handle iface" "uint8_t address" \
|
|
|
|
"uint8_t flags" "usbd_pipe_handle *pipe"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_close_pipe "usbd_pipe_handle pipe"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_transfer "usbd_xfer_handle req"
|
|
|
|
.Ft usbd_xfer_handle
|
|
|
|
.Fn usbd_alloc_xfer "usbd_device_handle dev"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_free_xfer "usbd_xfer_handle xfer"
|
|
|
|
.Ft void
|
|
|
|
.Fn usbd_setup_xfer "usbd_xfer_handle xfer" "usbd_pipe_handle pipe" \
|
|
|
|
"usbd_private_handle priv" "void *buffer" "uint32_t length" \
|
|
|
|
"uint16_t flags" "uint32_t timeout" "usbd_callback"
|
|
|
|
.Ft void
|
|
|
|
.Fn usbd_setup_default_xfer "usbd_xfer_handle xfer" \
|
|
|
|
"usbd_device_handle dev" "usbd_private_handle priv" \
|
|
|
|
"uint32_t timeout" "usb_device_request_t *req" " void *buffer" \
|
|
|
|
"uint32_t length" "uint16_t flags" "usbd_callback"
|
|
|
|
.Ft void
|
|
|
|
.Fn usbd_setup_isoc_xfer "usbd_xfer_handle xfer" "usbd_pipe_handle pipe" \
|
|
|
|
"usbd_private_handle priv" "uint16_t *frlengths" \
|
|
|
|
"uint32_t nframes" "uint16_t flags" "usbd_callback"
|
|
|
|
.Ft void
|
|
|
|
.Fn usbd_get_xfer_status "usbd_xfer_handle xfer" "usbd_private_handle *priv" \
|
|
|
|
"void **buffer" "uint32_t *count" "usbd_status *status"
|
|
|
|
.Ft usb_endpoint_descriptor_t *
|
|
|
|
.Fn usbd_interface2endpoint_descriptor "usbd_interface_handle iface" \
|
|
|
|
"uint8_t address"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_abort_pipe "usbd_pipe_handle pipe"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_abort_default_pipe "usbd_device_handle dev"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_clear_endpoint_stall "usbd_pipe_handle pipe"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_clear_endpoint_stall_async "usbd_pipe_handle pipe"
|
|
|
|
.Ft void
|
|
|
|
.Fn usbd_clear_endpoint_toggle "usbd_pipe_handle pipe"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_endpoint_count "usbd_interface_handle dev" "uint8_t *count"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_interface_count "usbd_device_handle dev" "uint8_t *count"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_interface2device_handle "usbd_interface_handle iface" "usbd_device_handle *dev"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_device2interface_handle "usbd_device_handle dev" "uint8_t ifaceno" "usbd_interface_handle *iface"
|
|
|
|
.Pp
|
|
|
|
.Ft usbd_device_handle
|
|
|
|
.Fn usbd_pipe2device_handle "usbd_pipe_handle pipe"
|
|
|
|
.Ft void *
|
|
|
|
.Fn usbd_alloc_buffer "usbd_xfer_handle req" "uint32_t size"
|
|
|
|
.Ft void
|
|
|
|
.Fn usbd_free_buffer "usbd_xfer_handle req"
|
2012-05-13 16:10:18 +04:00
|
|
|
.Ft void *
|
|
|
|
.Fn usbd_get_buffer "usbd_xfer_handle xfer"
|
2012-05-13 14:57:09 +04:00
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_sync_transfer "usbd_xfer_handle req"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_open_pipe_intr "usbd_interface_handle iface" "uint8_t address" \
|
|
|
|
"uint8_t flags" "usbd_pipe_handle *pipe" \
|
|
|
|
"usbd_private_handle priv" "void *buffer" \
|
|
|
|
"uint32_t length" "usbd_callback"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_do_request "usbd_device_handle dev" "usb_device_request_t *req" \
|
|
|
|
"void *data"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_do_request_flags "usbd_device_handle dev" \
|
|
|
|
"usb_device_request_t *req" "void *data" "uint16_t flags" "int *actlen" \
|
|
|
|
"u_int32_t timo"
|
|
|
|
.\" usbd_do_request_async() not used outside of usbdi*
|
|
|
|
.Ft usb_interface_descriptor_t *
|
|
|
|
.Fn usbd_get_interface_descriptor "usbd_interface_handle iface"
|
|
|
|
.Ft usb_config_descriptor_t *
|
|
|
|
.Fn usbd_get_config_descriptor "usbd_device_handle dev"
|
|
|
|
.Ft usb_device_descriptor_t *
|
|
|
|
.Fn usbd_get_device_descriptor "usbd_device_handle dev"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_set_interface "usbd_interface_handle iface" "int altidx"
|
|
|
|
.Ft int
|
|
|
|
.Fn usbd_get_no_alts "usb_config_descriptor_t *iface" "int ifaceno"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_get_interface "usbd_interface_handle iface" "uint8_t *aiface"
|
|
|
|
.Ft void
|
|
|
|
.Fn usbd_fill_deviceinfo "usbd_device_handle dev" "struct usb_device_info *di"
|
|
|
|
.Ft int
|
|
|
|
.Fn usbd_get_interface_altindex "usbd_interface_handle iface"
|
|
|
|
.Ft usb_interface_descriptor_t *
|
|
|
|
.Fn usbd_find_idesc "usb_config_descriptor_t *cd" "int iindex" "int ano"
|
|
|
|
.Ft usb_endpoint_descriptor_t *
|
|
|
|
.Fn usbd_find_edesc "usb_config_descriptor_t *cd" "int ifaceidx" "int altidx" \
|
|
|
|
"int endptidx"
|
|
|
|
.Ft void
|
|
|
|
.Fn usbd_dopoll "usbd_interface_handle iface"
|
|
|
|
.Ft void
|
|
|
|
.Fn usbd_set_polling" usbd_device_handle iface" "int val"
|
|
|
|
.Ft const char *
|
|
|
|
.Fn usbd_errstr "usbd_status err"
|
|
|
|
.Ft void
|
|
|
|
.Fn usbd_add_dev_event "int type" "usbd_device_handle iface"
|
|
|
|
.Ft void
|
|
|
|
.Fn usbd_add_drv_event "int type" "usbd_device_handle iface" "device_t dv"
|
|
|
|
.Ft char *
|
|
|
|
.Fn usbd_devinfo_alloc "usbd_device_handle iface" "int showclass"
|
|
|
|
.Ft void
|
|
|
|
.Fn usbd_devinfo_free "char *str"
|
|
|
|
.Ft const struct usbd_quirks *
|
|
|
|
.Fn usbd_get_quirks "usbd_device_handle iface"
|
|
|
|
.Ft usb_endpoint_descriptor_t *
|
|
|
|
.Fn usbd_get_endpoint_descriptor "usbd_interface_handle dev" \
|
|
|
|
"u_int8_t address"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_reload_device_desc "usbd_device_handle iface"
|
|
|
|
.Ft int
|
|
|
|
.Fn usbd_ratecheck "struct timeval *tv"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_get_string "usbd_device_handle iface" "int si" "char *buf"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_get_string0 "usbd_device_handle iface" "int" si "char *buf" \
|
|
|
|
"int unicode"
|
|
|
|
.Ft void
|
|
|
|
.Fn usb_desc_iter_init "usbd_device_handle iface" "usbd_desc_iter_t *iter"
|
|
|
|
.Ft const usb_descriptor_t *
|
|
|
|
.Fn usb_desc_iter_next "usbd_desc_iter_t *iter"
|
|
|
|
.Ft void
|
|
|
|
.Fn usb_add_task "usbd_device_handle iface" "struct usb_task *task" \
|
|
|
|
"int queue"
|
|
|
|
.Ft void
|
|
|
|
.Fn usb_rem_task "usbd_device_handle iface" "struct usb_task *task"
|
|
|
|
.Ft void
|
|
|
|
.Fn usb_init_task "struct usb_task *task" "void (*func)(void *)" \
|
|
|
|
"void *arg"
|
|
|
|
.Ft const struct usb_devno *
|
|
|
|
.Fn usb_lookup "const struct usb_devno *tbl" \
|
|
|
|
"u_int16_t vendor" "u_int16_t product"
|
1999-12-15 14:27:34 +03:00
|
|
|
.Ss Utilities from usbdi_util.h
|
|
|
|
Based on the routines in
|
2012-05-13 15:57:39 +04:00
|
|
|
.Dv usbdi.h
|
1999-12-15 14:27:34 +03:00
|
|
|
a number of utility functions have been defined that are accessible
|
|
|
|
through
|
2012-05-13 15:57:39 +04:00
|
|
|
.Dv usbdi_util.h .
|
2012-05-13 14:57:09 +04:00
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_get_desc "usbd_device_handle dev" "int type" "int index" \
|
|
|
|
"int len" "void *desc"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_get_config_desc "usbd_device_handle dev" "int confidx" \
|
|
|
|
"usb_config_descriptor_t *d"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_get_config_desc_full "usbd_device_handle" "int dev" "void *d" "int size"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_get_device_desc "usbd_device_handle dev" \
|
|
|
|
"usb_device_descriptor_t *d"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_set_address "usbd_device_handle dev" "int addr"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_get_port_status "usbd_device_handle dev" "intp ort" "usb_port_status_t *ps"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_set_hub_feature "usbd_device_handle dev" "int sel"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_clear_hub_feature "usbd_device_handle dev" "int sel"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_set_port_feature "usbd_device_handle dev" "int port" "int sel"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_clear_port_feature "usbd_device_handle dev" "int port" "int sel"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_get_device_status "usbd_device_handle dev" "usb_status_t *st"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_get_hub_status "usbd_device_handle dev" "usb_hub_status_t *st"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_set_protocol "usbd_interface_handle dev" "int report"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_get_report_descriptor "usbd_device_handle dev" "int ifcno" "int repid" "int size" "void *d"
|
|
|
|
.Ft struct usb_hid_descriptor *
|
|
|
|
.Fn usbd_get_hid_descriptor "usbd_interface_handle ifc"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_set_report "usbd_interface_handle iface" "nt type" "int id" "void *data" "int len"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_set_report_async "usbd_interface_handle iface" "int type" "int id" "void *data" "int len"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_get_report "usbd_interface_handle iface" "int type" "int id" "void *data" "int len"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_set_idle "usbd_interface_handle iface" "int duration" "int id"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_alloc_report_desc "usbd_interface_handle ifc" "void **descp" \
|
|
|
|
"int *sizep" "int mem"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_get_config "usbd_device_handle dev" "uint8_t *conf"
|
|
|
|
.Ft usbd_status
|
2012-05-13 15:57:39 +04:00
|
|
|
.Fn usbd_get_string_desc "usbd_device_handle dev" "int sindex" "int langid" \
|
|
|
|
"usb_string_descriptor_t *sdesc"
|
2012-05-13 14:57:09 +04:00
|
|
|
.Ft void
|
|
|
|
.Fn usbd_delay_ms "usbd_device_handle dev" "u_int ms"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_set_config_no "usbd_device_handle dev" "int no" "int msg"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_set_config_index "usbd_device_handle dev" "int index" "int msg"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_bulk_transfer "usbd_xfer_handle xfer" "usbd_pipe_handle pipe" \
|
|
|
|
"uint16_t flags" "uint32_t timeout" "void *buf" "uint32_t *size" "char *lbl"
|
|
|
|
.Ft usbd_status
|
|
|
|
.Fn usbd_intr_transfer "usbd_xfer_handle xfer" "usbd_pipe_handle pipe" \
|
|
|
|
"uint16_t flags" "uint32_t timeout" "void *buf" "uint32_t *size" "char *lbl"
|
2012-05-13 13:00:51 +04:00
|
|
|
.\" these are very different in usbmp
|
2012-05-13 14:57:09 +04:00
|
|
|
.Ft void
|
|
|
|
.Fn usb_detach_waitold "device_t dv"
|
|
|
|
.Ft void
|
|
|
|
.Fn usb_detach_wakeupold "device_t dv"
|
|
|
|
.\" .Ft void
|
|
|
|
.\" .Fn usb_detach_wait "device_t dv" "kcondvar_t *cv" "kmutex_t *lk"
|
|
|
|
.\" .Ft void
|
|
|
|
.\" .Fn usb_detach_broadcast "device_t dv" "kcondvar_t *cv"
|
2012-05-13 15:57:39 +04:00
|
|
|
.Sh DESCRIPTION
|
|
|
|
Device driver access to the USB bus centers around transfers.
|
|
|
|
A transfer describes a communication with a USB device.
|
|
|
|
A transfer is an abstract concept that can result in several
|
|
|
|
physical packets being transferred to or from a device.
|
|
|
|
.Pp
|
|
|
|
A transfer is described by a
|
|
|
|
.Va usbd_xfer_handle ,
|
|
|
|
a largely opaque cookie.
|
|
|
|
Allocated and deallocate are performed with
|
|
|
|
.Fn usbd_alloc_xfer
|
|
|
|
and
|
|
|
|
.Fn usbd_free_xfer .
|
|
|
|
The data describing the transfer is filled by either
|
|
|
|
.Fn usbd_setup_default_xfer
|
|
|
|
for control pipe transfers, by
|
|
|
|
.Fn usbd_setup_xfer
|
|
|
|
for bulk and interrupt transfers, and by
|
|
|
|
.Fn usbd_setup_isoc_xfer
|
|
|
|
for isochronous transfers.
|
|
|
|
.Pp
|
|
|
|
A pipe is a logical connection to a USB device.
|
|
|
|
Pipes are created and destroyed by using the
|
|
|
|
.Fn usbd_open_pipe ,
|
|
|
|
.Fn usbd_open_pipe_intr
|
|
|
|
and
|
|
|
|
.Fn usbd_close_pipe
|
|
|
|
functions.
|
|
|
|
It is common to have more than one pipe per device.
|
2012-05-13 23:29:59 +04:00
|
|
|
Transfers are associated with a pipe at their creation time.
|
|
|
|
Transfers are aborted via this pipe with
|
2012-05-13 15:57:39 +04:00
|
|
|
.Fn usbd_abort_pipe .
|
|
|
|
The
|
|
|
|
.Fn usbd_clear_endpoint_stall
|
|
|
|
and
|
|
|
|
.Fn usbd_clear_endpoint_stall_async
|
|
|
|
functions are used to clear endpoint halt in either a synchronous
|
|
|
|
or asynchronous fashion.
|
|
|
|
The
|
|
|
|
.Fn usbd_bulk_transfer
|
|
|
|
and
|
|
|
|
.Fn usbd_intr_transfer
|
|
|
|
functions are used to transfer data in either an interrupt or
|
|
|
|
bulk fashion.
|
|
|
|
.Pp
|
|
|
|
A request is described by a
|
|
|
|
.Va usb_device_request_t
|
|
|
|
which must be initialised as necessary before calling either
|
|
|
|
.Fn usbd_do_request
|
|
|
|
or
|
|
|
|
.Fn usbd_do_request_flags
|
|
|
|
to submit the request.
|
|
|
|
See the
|
|
|
|
.Sx INITIALISING USB REQUESTS
|
|
|
|
section for more details.
|
|
|
|
.Pp
|
|
|
|
Error handling and other return values are described in
|
|
|
|
.Xr usbd_status 9 .
|
|
|
|
.Pp
|
|
|
|
Comments on particular functions:
|
|
|
|
.Bl -tag -width 10n
|
|
|
|
.It Fn usbd_errstr err
|
|
|
|
Return the string associated with
|
|
|
|
.Fa err .
|
|
|
|
.It Fn usbd_add_dev_event type iface
|
|
|
|
The
|
|
|
|
.Ar type
|
|
|
|
must be one of
|
|
|
|
.Dv USB_EVENT_CTRLR_ATTACH ,
|
|
|
|
.Dv USB_EVENT_CTRLR_DETACH ,
|
|
|
|
.Dv USB_EVENT_DEVICE_ATTACH
|
|
|
|
and
|
|
|
|
.Dv USB_EVENT_DEVICE_DETACH .
|
|
|
|
.It Fn usbd_add_drv_event type iface dv
|
|
|
|
The
|
|
|
|
.Fa type
|
|
|
|
must be one of
|
|
|
|
.Dv USB_EVENT_DRIVER_ATTACH
|
|
|
|
and
|
|
|
|
.Dv USB_EVENT_DRIVER_DETACH .
|
|
|
|
.It Fn usb_lookup tbl vendor product
|
|
|
|
The
|
|
|
|
.Dv USB_PRODUCT_ANY
|
|
|
|
macro can be used to match any USB product.
|
2012-05-13 13:00:51 +04:00
|
|
|
.El
|
|
|
|
.Sh INITIALISING USB REQUESTS
|
2012-05-13 15:57:39 +04:00
|
|
|
There are 5 members of a
|
2012-05-13 13:00:51 +04:00
|
|
|
.Va usb_device_request_t
|
|
|
|
that must be initialised:
|
|
|
|
.Pp
|
|
|
|
.Bl -item -offset offset -compact
|
|
|
|
.It
|
|
|
|
.Vt uByte bmRequestType ;
|
|
|
|
.It
|
|
|
|
.Vt uByte bRequest ;
|
|
|
|
.It
|
|
|
|
.Vt uWord wValue ;
|
|
|
|
.It
|
|
|
|
.Vt uWord wIndex ;
|
|
|
|
.It
|
|
|
|
.Vt uWord wLength ;
|
|
|
|
.El
|
|
|
|
.Pp
|
|
|
|
The first two are normal byte values that may be simply assigned,
|
|
|
|
but the last three must be initialised with the
|
2012-05-13 15:57:39 +04:00
|
|
|
.Fn USETW
|
2012-05-13 13:00:51 +04:00
|
|
|
macro.
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fa bmRequestType
|
|
|
|
holds the request type of this USB request, which describes the
|
|
|
|
indended recipient of the request.
|
|
|
|
.Pp
|
|
|
|
This may be one of:
|
2012-05-13 15:57:39 +04:00
|
|
|
.Bl -tag -width UT_WRITEXX -offset offset -compact
|
2012-05-13 13:00:51 +04:00
|
|
|
.It Dv UT_WRITE
|
|
|
|
.It Dv UT_READ
|
|
|
|
.El
|
|
|
|
.Pp
|
|
|
|
with one of:
|
2012-05-13 15:57:39 +04:00
|
|
|
.Bl -tag -width UT_STANDARDXX -offset offset -compact
|
2012-05-13 13:00:51 +04:00
|
|
|
.It Dv UT_STANDARD
|
|
|
|
.It Dv UT_CLASS
|
|
|
|
.It Dv UT_VENDOR
|
|
|
|
.El
|
|
|
|
.Pp
|
|
|
|
and with one of:
|
2012-05-13 15:57:39 +04:00
|
|
|
.Bl -tag -width UT_INTERFACEXX -offset offset -compact
|
2012-05-13 13:00:51 +04:00
|
|
|
.It Dv UT_DEVICE
|
|
|
|
.It Dv UT_INTERFACE
|
|
|
|
.It Dv UT_ENDPOINT
|
|
|
|
.It Dv UT_OTHER
|
|
|
|
.El
|
|
|
|
.Pp
|
|
|
|
These are also in combinations as:
|
2012-05-13 15:57:39 +04:00
|
|
|
.Bl -tag -width UT_WRITE_VENDOR_INTERFACEXX -offset offset -compact
|
2012-05-13 13:00:51 +04:00
|
|
|
.It Dv UT_READ_DEVICE
|
|
|
|
.It Dv UT_READ_INTERFACE
|
|
|
|
.It Dv UT_READ_ENDPOINT
|
|
|
|
.It Dv UT_WRITE_DEVICE
|
|
|
|
.It Dv UT_WRITE_INTERFACE
|
|
|
|
.It Dv UT_WRITE_ENDPOINT
|
|
|
|
.It Dv UT_READ_CLASS_DEVICE
|
|
|
|
.It Dv UT_READ_CLASS_INTERFACE
|
|
|
|
.It Dv UT_READ_CLASS_OTHER
|
|
|
|
.It Dv UT_READ_CLASS_ENDPOINT
|
|
|
|
.It Dv UT_WRITE_CLASS_DEVICE
|
|
|
|
.It Dv UT_WRITE_CLASS_INTERFACE
|
|
|
|
.It Dv UT_WRITE_CLASS_OTHER
|
|
|
|
.It Dv UT_WRITE_CLASS_ENDPOINT
|
|
|
|
.It Dv UT_READ_VENDOR_DEVICE
|
|
|
|
.It Dv UT_READ_VENDOR_INTERFACE
|
|
|
|
.It Dv UT_READ_VENDOR_OTHER
|
|
|
|
.It Dv UT_READ_VENDOR_ENDPOINT
|
|
|
|
.It Dv UT_WRITE_VENDOR_DEVICE
|
|
|
|
.It Dv UT_WRITE_VENDOR_INTERFACE
|
|
|
|
.It Dv UT_WRITE_VENDOR_OTHER
|
|
|
|
.It Dv UT_WRITE_VENDOR_ENDPOINT
|
|
|
|
.El
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fa bRequest
|
2012-05-13 15:57:39 +04:00
|
|
|
describes which request is being made.
|
|
|
|
The available values are:
|
|
|
|
.Bl -tag -width UR_GET_DESCRIPTORXX -offset offset -compact
|
2012-05-13 13:00:51 +04:00
|
|
|
.It Dv UR_GET_STATUS
|
|
|
|
.It Dv UR_CLEAR_FEATURE
|
|
|
|
.It Dv UR_SET_FEATURE
|
|
|
|
.It Dv UR_SET_ADDRESS
|
|
|
|
.It Dv UR_GET_DESCRIPTOR
|
|
|
|
.It Dv UR_SET_DESCRIPTOR
|
|
|
|
.It Dv UR_GET_CONFIG
|
|
|
|
.It Dv UR_SET_CONFIG
|
|
|
|
.It Dv UR_GET_INTERFACE
|
|
|
|
.It Dv UR_SET_INTERFACE
|
|
|
|
.It Dv UR_SYNCH_FRAME
|
|
|
|
.El
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fa wValue ,
|
|
|
|
.Fa wIndex
|
|
|
|
and
|
|
|
|
.Fa wLength
|
|
|
|
are device-specific values and must be initialised with the
|
2012-05-13 15:57:39 +04:00
|
|
|
.Fn USETW
|
2012-05-13 13:00:51 +04:00
|
|
|
macro.
|
|
|
|
.Sh USB REQUEST TYPES AND STRUCTURES
|
|
|
|
The
|
|
|
|
.Dv UR_GET_STATUS
|
|
|
|
request operates on a
|
|
|
|
.Va usb_status_t
|
|
|
|
structure, which has this member:
|
|
|
|
.Bl -item -offset offset -compact
|
|
|
|
.It
|
|
|
|
.Vt uWord wStatus ;
|
|
|
|
.El
|
|
|
|
.Pp
|
|
|
|
For device status requests, the
|
|
|
|
.Fa wStatus
|
|
|
|
member may have either of these bit flags set:
|
2012-05-13 15:57:39 +04:00
|
|
|
.Bl -tag -width UDS_REMOTE_WAKEUPXX -offset offset -compact
|
2012-05-13 13:00:51 +04:00
|
|
|
.It Dv UDS_SELF_POWERED
|
|
|
|
.It Dv UDS_REMOTE_WAKEUP
|
1999-12-15 14:27:34 +03:00
|
|
|
.El
|
2012-05-13 13:00:51 +04:00
|
|
|
.Pp
|
|
|
|
For endpoint status requests, the
|
|
|
|
.Fa wStatus
|
|
|
|
member may have this bit flag set:
|
2012-05-13 15:57:39 +04:00
|
|
|
.Bl -tag -width UES_HALTXX -offset offset -compact
|
2012-05-13 13:00:51 +04:00
|
|
|
.It Dv UES_HALT
|
|
|
|
.El
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Dv UR_CLEAR_FEATURE
|
|
|
|
and
|
|
|
|
.Dv UR_SET_FEATURE
|
|
|
|
requests clear or set special features on USB devices.
|
|
|
|
The values for
|
|
|
|
.Va wValue ,
|
|
|
|
.Va wIndex
|
|
|
|
and
|
|
|
|
.Va wLength
|
|
|
|
depend upon the device and device type.
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Dv UR_SET_ADDRESS
|
|
|
|
request sets the virtual USB address of a port using the
|
|
|
|
.Va wValue .
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Dv UR_GET_DESCRIPTOR
|
|
|
|
and
|
|
|
|
.Dv UR_SET_DESCRIPTOR
|
|
|
|
requests operate on a
|
|
|
|
.Va usb_descriptor_t
|
|
|
|
structure, which has these members:
|
|
|
|
.Bl -item -offset offset -compact
|
|
|
|
.It
|
|
|
|
.Vt uByte bLength ;
|
|
|
|
.It
|
|
|
|
.Vt uByte bDescriptorType ;
|
|
|
|
.El
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fa bDescriptorType
|
|
|
|
member may be one of the following values:
|
2012-05-13 15:57:39 +04:00
|
|
|
.Bl -tag -width UDESC_OTHER_SPEED_CONFIGURATIONXX -offset offset -compact
|
2012-05-13 13:00:51 +04:00
|
|
|
.It Dv UDESC_DEVICE
|
|
|
|
.It Dv UDESC_CONFIG
|
|
|
|
.It Dv UDESC_STRING
|
|
|
|
.It Dv UDESC_INTERFACE
|
|
|
|
.It Dv UDESC_ENDPOINT
|
|
|
|
.It Dv UDESC_DEVICE_QUALIFIER
|
|
|
|
.It Dv UDESC_OTHER_SPEED_CONFIGURATION
|
|
|
|
.It Dv UDESC_INTERFACE_POWER
|
|
|
|
.It Dv UDESC_OTG
|
|
|
|
.It Dv UDESC_DEBUG
|
|
|
|
.It Dv UDESC_INTERFACE_ASSOC
|
|
|
|
.It Dv UDESC_CS_DEVICE
|
|
|
|
.It Dv UDESC_CS_CONFIG
|
|
|
|
.It Dv UDESC_CS_STRING
|
|
|
|
.It Dv UDESC_CS_INTERFACE
|
|
|
|
.It Dv UDESC_CS_ENDPOINT
|
2012-05-13 15:57:39 +04:00
|
|
|
.It Dv UDESC_HUB
|
2012-05-13 13:00:51 +04:00
|
|
|
.El
|
2012-05-13 15:57:39 +04:00
|
|
|
.\".Pp
|
2012-05-13 13:00:51 +04:00
|
|
|
.\" these have API front ends
|
|
|
|
.\" .It Dv UR_GET_CONFIG
|
|
|
|
.\" .It Dv UR_SET_CONFIG
|
|
|
|
.\" .It Dv UR_GET_INTERFACE
|
|
|
|
.\" .It Dv UR_SET_INTERFACE
|
|
|
|
.\" this isn't supported
|
|
|
|
.\" .It Dv UR_SYNCH_FRAME
|
1999-12-15 14:27:34 +03:00
|
|
|
.Sh SEE ALSO
|
2012-05-13 13:00:51 +04:00
|
|
|
.Xr usb 4 ,
|
|
|
|
.Xr usbd_status 9
|
1999-12-15 14:27:34 +03:00
|
|
|
.Sh HISTORY
|
|
|
|
This
|
|
|
|
.Nm
|
|
|
|
interface first appeared in
|
|
|
|
.Nx 1.4 .
|
|
|
|
The interface is based on an early definition from the OpenUSBDI group
|
2002-10-14 17:43:14 +04:00
|
|
|
within the USB organisation.
|
|
|
|
Right after this definition the OpenUSBDI development got closed for open
|
|
|
|
source developers, so this interface has not followed the further changes.
|
1999-12-15 14:27:34 +03:00
|
|
|
The OpenUSBDI specification is now available again, but looks different.
|
2001-12-26 04:08:56 +03:00
|
|
|
.Sh BUGS
|
2012-05-13 13:00:51 +04:00
|
|
|
This manual is under development, so its biggest shortcoming is
|
2001-12-26 04:08:56 +03:00
|
|
|
incompleteness.
|