NetBSD/share/man/man9/usbdi.9

569 lines
18 KiB
Groff
Raw Normal View History

2012-05-13 23:29:59 +04:00
.\" $NetBSD: usbdi.9,v 1.13 2012/05/13 19:29:59 mrg Exp $
.\"
.\" 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.
.\"
.\"
.\" 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
.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
.In dev/usb/usbdi_util.h
.Ss Functions offered by usbdi.h
.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"
.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"
.Ss Utilities from usbdi_util.h
Based on the routines in
.Dv usbdi.h
a number of utility functions have been defined that are accessible
through
.Dv usbdi_util.h .
.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
.Fn usbd_get_string_desc "usbd_device_handle dev" "int sindex" "int langid" \
"usb_string_descriptor_t *sdesc"
.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"
.\" these are very different in usbmp
.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"
.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
.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.
.El
.Sh INITIALISING USB REQUESTS
There are 5 members of a
.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
.Fn USETW
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:
.Bl -tag -width UT_WRITEXX -offset offset -compact
.It Dv UT_WRITE
.It Dv UT_READ
.El
.Pp
with one of:
.Bl -tag -width UT_STANDARDXX -offset offset -compact
.It Dv UT_STANDARD
.It Dv UT_CLASS
.It Dv UT_VENDOR
.El
.Pp
and with one of:
.Bl -tag -width UT_INTERFACEXX -offset offset -compact
.It Dv UT_DEVICE
.It Dv UT_INTERFACE
.It Dv UT_ENDPOINT
.It Dv UT_OTHER
.El
.Pp
These are also in combinations as:
.Bl -tag -width UT_WRITE_VENDOR_INTERFACEXX -offset offset -compact
.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
describes which request is being made.
The available values are:
.Bl -tag -width UR_GET_DESCRIPTORXX -offset offset -compact
.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
.Fn USETW
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:
.Bl -tag -width UDS_REMOTE_WAKEUPXX -offset offset -compact
.It Dv UDS_SELF_POWERED
.It Dv UDS_REMOTE_WAKEUP
.El
.Pp
For endpoint status requests, the
.Fa wStatus
member may have this bit flag set:
.Bl -tag -width UES_HALTXX -offset offset -compact
.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:
.Bl -tag -width UDESC_OTHER_SPEED_CONFIGURATIONXX -offset offset -compact
.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
.It Dv UDESC_HUB
.El
.\".Pp
.\" 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
.Sh SEE ALSO
.Xr usb 4 ,
.Xr usbd_status 9
.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.
The OpenUSBDI specification is now available again, but looks different.
.Sh BUGS
This manual is under development, so its biggest shortcoming is
incompleteness.