xref: /dflybsd-src/share/man/man9/usbdi.9 (revision b619b7c5115644516206637f7ae49387cd31205f)
1f963a040SHasso Tepper.\"
2f963a040SHasso Tepper.\" Copyright (c) 2005 Ian Dowse <iedowse@FreeBSD.org>
3f963a040SHasso Tepper.\" All rights reserved.
4f963a040SHasso Tepper.\"
5f963a040SHasso Tepper.\" Redistribution and use in source and binary forms, with or without
6f963a040SHasso Tepper.\" modification, are permitted provided that the following conditions
7f963a040SHasso Tepper.\" are met:
8f963a040SHasso Tepper.\" 1. Redistributions of source code must retain the above copyright
9f963a040SHasso Tepper.\"    notice, this list of conditions and the following disclaimer.
10f963a040SHasso Tepper.\" 2. Redistributions in binary form must reproduce the above copyright
11f963a040SHasso Tepper.\"    notice, this list of conditions and the following disclaimer in the
12f963a040SHasso Tepper.\"    documentation and/or other materials provided with the distribution.
13f963a040SHasso Tepper.\"
14f963a040SHasso Tepper.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15f963a040SHasso Tepper.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16f963a040SHasso Tepper.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17f963a040SHasso Tepper.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18f963a040SHasso Tepper.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19f963a040SHasso Tepper.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20f963a040SHasso Tepper.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21f963a040SHasso Tepper.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22f963a040SHasso Tepper.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23f963a040SHasso Tepper.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24f963a040SHasso Tepper.\" SUCH DAMAGE.
25f963a040SHasso Tepper.\"
268096034fSSascha Wildner.\"	$FreeBSD: head/share/man/man9/usbdi.9 235693 2012-05-20 16:43:47Z gjb $
278096034fSSascha Wildner.Dd June 24, 2009
28f963a040SHasso Tepper.Dt USBDI 9
29fb5b3747SSascha Wildner.Os
30f963a040SHasso Tepper.Sh NAME
318096034fSSascha Wildner.Nm usb_fifo_alloc_buffer ,
328096034fSSascha Wildner.Nm usb_fifo_attach ,
338096034fSSascha Wildner.Nm usb_fifo_detach ,
348096034fSSascha Wildner.Nm usb_fifo_free_buffer ,
358096034fSSascha Wildner.Nm usb_fifo_get_data ,
368096034fSSascha Wildner.Nm usb_fifo_get_data_buffer ,
378096034fSSascha Wildner.Nm usb_fifo_get_data_error ,
388096034fSSascha Wildner.Nm usb_fifo_get_data_linear ,
398096034fSSascha Wildner.Nm usb_fifo_put_bytes_max ,
408096034fSSascha Wildner.Nm usb_fifo_put_data ,
418096034fSSascha Wildner.Nm usb_fifo_put_data_buffer ,
428096034fSSascha Wildner.Nm usb_fifo_put_data_error ,
438096034fSSascha Wildner.Nm usb_fifo_put_data_linear ,
448096034fSSascha Wildner.Nm usb_fifo_reset ,
458096034fSSascha Wildner.Nm usb_fifo_softc ,
468096034fSSascha Wildner.Nm usb_fifo_wakeup ,
47f963a040SHasso Tepper.Nm usbd_do_request ,
48f963a040SHasso Tepper.Nm usbd_do_request_flags ,
49f963a040SHasso Tepper.Nm usbd_errstr ,
508096034fSSascha Wildner.Nm usbd_lookup_id_by_info ,
518096034fSSascha Wildner.Nm usbd_lookup_id_by_uaa ,
528096034fSSascha Wildner.Nm usbd_transfer_clear_stall ,
538096034fSSascha Wildner.Nm usbd_transfer_drain ,
548096034fSSascha Wildner.Nm usbd_transfer_pending ,
558096034fSSascha Wildner.Nm usbd_transfer_poll ,
568096034fSSascha Wildner.Nm usbd_transfer_setup ,
578096034fSSascha Wildner.Nm usbd_transfer_start ,
588096034fSSascha Wildner.Nm usbd_transfer_stop ,
598096034fSSascha Wildner.Nm usbd_transfer_submit ,
608096034fSSascha Wildner.Nm usbd_transfer_unsetup ,
618096034fSSascha Wildner.Nm usbd_xfer_clr_flag ,
628096034fSSascha Wildner.Nm usbd_xfer_frame_data ,
638096034fSSascha Wildner.Nm usbd_xfer_frame_len ,
648096034fSSascha Wildner.Nm usbd_xfer_get_frame ,
658096034fSSascha Wildner.Nm usbd_xfer_get_priv ,
668096034fSSascha Wildner.Nm usbd_xfer_is_stalled ,
678096034fSSascha Wildner.Nm usbd_xfer_max_framelen ,
688096034fSSascha Wildner.Nm usbd_xfer_max_frames ,
698096034fSSascha Wildner.Nm usbd_xfer_max_len ,
708096034fSSascha Wildner.Nm usbd_xfer_set_flag ,
718096034fSSascha Wildner.Nm usbd_xfer_set_frame_data ,
728096034fSSascha Wildner.Nm usbd_xfer_set_frame_len ,
738096034fSSascha Wildner.Nm usbd_xfer_set_frame_offset ,
748096034fSSascha Wildner.Nm usbd_xfer_set_frames ,
758096034fSSascha Wildner.Nm usbd_xfer_set_interval ,
768096034fSSascha Wildner.Nm usbd_xfer_set_priv ,
778096034fSSascha Wildner.Nm usbd_xfer_set_stall ,
788096034fSSascha Wildner.Nm usbd_xfer_set_timeout ,
798096034fSSascha Wildner.Nm usbd_xfer_softc ,
808096034fSSascha Wildner.Nm usbd_xfer_state ,
818096034fSSascha Wildner.Nm usbd_xfer_status
82f963a040SHasso Tepper.Nd Universal Serial Bus driver programming interface
83f963a040SHasso Tepper.Sh SYNOPSIS
848096034fSSascha Wildner.In bus/u4b/usb.h
858096034fSSascha Wildner.In bus/u4b/usbdi.h
868096034fSSascha Wildner.In bus/u4b/usbdi_util.h
87f963a040SHasso Tepper.Sh DESCRIPTION
88f963a040SHasso TepperThe Universal Serial Bus (USB) driver programming interface provides
89f963a040SHasso TepperUSB peripheral drivers with a host controller independent API for
90f963a040SHasso Teppercontrolling and communicating with USB peripherals.
918096034fSSascha WildnerThe
928096034fSSascha Wildner.Nm usb
938096034fSSascha Wildnermodule supports both USB Host and USB Device side mode.
948096034fSSascha Wildner.
958096034fSSascha Wildner.Sh USB KERNEL PROGRAMMING
968096034fSSascha WildnerHere is a list of commonly used functions:
97f963a040SHasso Tepper.Pp
988096034fSSascha Wildner.
998096034fSSascha Wildner.Ft "usb_error_t"
1008096034fSSascha Wildner.Fo "usbd_transfer_setup"
1018096034fSSascha Wildner.Fa "udev"
1028096034fSSascha Wildner.Fa "ifaces"
1038096034fSSascha Wildner.Fa "pxfer"
1048096034fSSascha Wildner.Fa "setup_start"
1058096034fSSascha Wildner.Fa "n_setup"
1068096034fSSascha Wildner.Fa "priv_sc"
1078096034fSSascha Wildner.Fa "priv_mtx"
1088096034fSSascha Wildner.Fc
1098096034fSSascha Wildner.
110f963a040SHasso Tepper.Pp
1118096034fSSascha Wildner.
1128096034fSSascha Wildner.Ft "void"
1138096034fSSascha Wildner.Fo "usbd_transfer_unsetup"
1148096034fSSascha Wildner.Fa "pxfer"
1158096034fSSascha Wildner.Fa "n_setup"
1168096034fSSascha Wildner.Fc
1178096034fSSascha Wildner.
118f963a040SHasso Tepper.Pp
1198096034fSSascha Wildner.
1208096034fSSascha Wildner.Ft "void"
1218096034fSSascha Wildner.Fo "usbd_transfer_start"
1228096034fSSascha Wildner.Fa "xfer"
1238096034fSSascha Wildner.Fc
1248096034fSSascha Wildner.
125f963a040SHasso Tepper.Pp
1268096034fSSascha Wildner.
1278096034fSSascha Wildner.Ft "void"
1288096034fSSascha Wildner.Fo "usbd_transfer_stop"
1298096034fSSascha Wildner.Fa "xfer"
1308096034fSSascha Wildner.Fc
1318096034fSSascha Wildner.
132f963a040SHasso Tepper.Pp
1338096034fSSascha Wildner.
1348096034fSSascha Wildner.Ft "void"
1358096034fSSascha Wildner.Fo "usbd_transfer_drain"
1368096034fSSascha Wildner.Fa "xfer"
1378096034fSSascha Wildner.Fc
1388096034fSSascha Wildner.
1398096034fSSascha Wildner.
1408096034fSSascha Wildner.
1418096034fSSascha Wildner.Sh USB TRANSFER MANAGEMENT FUNCTIONS
1428096034fSSascha WildnerThe USB standard defines four types of USB transfers.
1438096034fSSascha Wildner.
1448096034fSSascha WildnerControl transfers, Bulk transfers, Interrupt transfers and Isochronous
1458096034fSSascha Wildnertransfers.
1468096034fSSascha Wildner.
1478096034fSSascha WildnerAll the transfer types are managed using the following five functions:
1488096034fSSascha Wildner.
149f963a040SHasso Tepper.Pp
1508096034fSSascha Wildner.
1518096034fSSascha Wildner.Fn usbd_transfer_setup
1528096034fSSascha WildnerThis function will allocate memory for and initialise an array of USB
1538096034fSSascha Wildnertransfers and all required DMA memory.
1548096034fSSascha Wildner.
1558096034fSSascha WildnerThis function can sleep or block waiting for resources to become
1568096034fSSascha Wildneravailable.
1578096034fSSascha Wildner.Fa udev
1588096034fSSascha Wildneris a pointer to "struct usb_device".
1598096034fSSascha Wildner.Fa ifaces
1608096034fSSascha Wildneris an array of interface index numbers to use
1618096034fSSascha WildnerSee "if_index".
1628096034fSSascha Wildner.Fa pxfer
1638096034fSSascha Wildneris a pointer to an array of USB transfer pointers that are initialized
1648096034fSSascha Wildnerto NULL, and then pointed to allocated USB transfers.
1658096034fSSascha Wildner.Fa setup_start
1668096034fSSascha Wildneris a pointer to an array of USB config structures.
1678096034fSSascha Wildner.Fa n_setup
1688096034fSSascha Wildneris a number telling the USB system how many USB transfers should be
1698096034fSSascha Wildnersetup.
1708096034fSSascha Wildner.Fa priv_sc
1718096034fSSascha Wildneris the private softc pointer, which will be used to initialize
1728096034fSSascha Wildner"xfer->priv_sc".
1738096034fSSascha Wildner.Fa priv_mtx
1748096034fSSascha Wildneris the private mutex protecting the transfer structure and the
1758096034fSSascha Wildnersoftc.
1768096034fSSascha WildnerThis pointer is used to initialize "xfer->priv_mtx".
1778096034fSSascha WildnerThis function returns
1788096034fSSascha Wildnerzero upon success.
1798096034fSSascha WildnerA non-zero return value indicates failure.
1808096034fSSascha Wildner.
181f963a040SHasso Tepper.Pp
1828096034fSSascha Wildner.
1838096034fSSascha Wildner.Fn usbd_transfer_unsetup
1848096034fSSascha WildnerThis function will release the given USB transfers and all allocated
1858096034fSSascha Wildnerresources associated with these USB transfers.
1868096034fSSascha Wildner.Fa pxfer
1878096034fSSascha Wildneris a pointer to an array of USB transfer pointers, that may be NULL,
1888096034fSSascha Wildnerthat should be freed by the USB system.
1898096034fSSascha Wildner.Fa n_setup
1908096034fSSascha Wildneris a number telling the USB system how many USB transfers should be
1918096034fSSascha Wildnerunsetup.
1928096034fSSascha Wildner.
1938096034fSSascha WildnerThis function can sleep waiting for USB transfers to complete.
1948096034fSSascha Wildner.
1958096034fSSascha WildnerThis function is NULL safe with regard to the USB transfer structure
1968096034fSSascha Wildnerpointer.
1978096034fSSascha Wildner.
1988096034fSSascha WildnerIt is not allowed to call this function from the USB transfer
1998096034fSSascha Wildnercallback.
2008096034fSSascha Wildner.
201f963a040SHasso Tepper.Pp
2028096034fSSascha Wildner.
2038096034fSSascha Wildner.Fn usbd_transfer_start
2048096034fSSascha WildnerThis function will start the USB transfer pointed to by
2058096034fSSascha Wildner.Fa xfer ,
2068096034fSSascha Wildnerif not already started.
2078096034fSSascha Wildner.
2088096034fSSascha WildnerThis function is always non-blocking and must be called with the
2098096034fSSascha Wildnerso-called private USB mutex locked.
2108096034fSSascha Wildner.
2118096034fSSascha WildnerThis function is NULL safe with regard to the USB transfer structure
2128096034fSSascha Wildnerpointer.
2138096034fSSascha Wildner.
214f963a040SHasso Tepper.Pp
2158096034fSSascha Wildner.
2168096034fSSascha Wildner.Fn usbd_transfer_stop
2178096034fSSascha WildnerThis function will stop the USB transfer pointed to by
2188096034fSSascha Wildner.Fa xfer ,
2198096034fSSascha Wildnerif not already stopped.
2208096034fSSascha Wildner.
2218096034fSSascha WildnerThis function is always non-blocking and must be called with the
2228096034fSSascha Wildnerso-called private USB mutex locked.
2238096034fSSascha Wildner.
2248096034fSSascha WildnerThis function can return before the USB callback has been called.
2258096034fSSascha Wildner.
2268096034fSSascha WildnerThis function is NULL safe with regard to the USB transfer structure
2278096034fSSascha Wildnerpointer.
2288096034fSSascha Wildner.
2298096034fSSascha WildnerIf the transfer was in progress, the callback will called with
230*b619b7c5SSascha Wildner.Dv USB_ST_ERROR
231*b619b7c5SSascha Wildnerand
232*b619b7c5SSascha Wildner.Dq error = Dv USB_ERR_CANCELLED .
2338096034fSSascha Wildner.
234f963a040SHasso Tepper.Pp
2358096034fSSascha Wildner.
2368096034fSSascha Wildner.Fn usbd_transfer_drain
2378096034fSSascha WildnerThis function will stop an USB transfer, if not already stopped and
2388096034fSSascha Wildnerwait for any additional USB hardware operations to complete.
2398096034fSSascha Wildner.
2408096034fSSascha WildnerBuffers that are loaded into DMA using "usbd_xfer_set_frame_data()" can
2418096034fSSascha Wildnersafely be freed after that this function has returned.
2428096034fSSascha Wildner.
2438096034fSSascha WildnerThis function can block the caller and will not return before the USB
2448096034fSSascha Wildnercallback has been called.
2458096034fSSascha Wildner.
2468096034fSSascha WildnerThis function is NULL safe with regard to the USB transfer structure
2478096034fSSascha Wildnerpointer.
2488096034fSSascha Wildner.
2498096034fSSascha Wildner.Sh USB TRANSFER CALLBACK
2508096034fSSascha Wildner.
2518096034fSSascha WildnerThe USB callback has three states.
2528096034fSSascha Wildner.
253*b619b7c5SSascha Wildner.Dv USB_ST_SETUP ,
254*b619b7c5SSascha Wildner.Dv USB_ST_TRANSFERRED
255*b619b7c5SSascha Wildnerand
256*b619b7c5SSascha Wildner.Dv USB_ST_ERROR .
257*b619b7c5SSascha Wildner.Dv USB_ST_SETUP
258*b619b7c5SSascha Wildneris the initial state.
2598096034fSSascha Wildner.
2608096034fSSascha WildnerAfter the callback has been called with this state it will always be
2618096034fSSascha Wildnercalled back at a later stage in one of the other two states.
2628096034fSSascha Wildner.
2638096034fSSascha WildnerThe USB callback should not restart the USB transfer in case the error
2648096034fSSascha Wildnercause is USB_ERR_CANCELLED.
2658096034fSSascha Wildner.
2668096034fSSascha WildnerThe USB callback is protected from recursion.
2678096034fSSascha Wildner.
2688096034fSSascha WildnerThat means one can start and stop whatever transfer from the callback
2698096034fSSascha Wildnerof another transfer one desires.
2708096034fSSascha Wildner.
2718096034fSSascha WildnerAlso the transfer that is currently called back.
2728096034fSSascha Wildner.
2738096034fSSascha WildnerRecursion is handled like this that when the callback that wants to
2748096034fSSascha Wildnerrecurse returns it is called one more time.
2758096034fSSascha Wildner.
2768096034fSSascha Wildner.
277f963a040SHasso Tepper.Pp
2788096034fSSascha Wildner.
2798096034fSSascha Wildner.Fn usbd_transfer_submit
2808096034fSSascha WildnerThis function should only be called from within the USB callback and
2818096034fSSascha Wildneris used to start the USB hardware.
2828096034fSSascha Wildner.
2838096034fSSascha WildnerAn USB transfer can have multiple frames consisting of one or more USB
2848096034fSSascha Wildnerpackets making up an I/O vector for all USB transfer types.
2858096034fSSascha Wildner.
2868096034fSSascha Wildner.Bd -literal -offset indent
2878096034fSSascha Wildnervoid
2888096034fSSascha Wildnerusb_default_callback(struct usb_xfer *xfer, usb_error_t error)
2898096034fSSascha Wildner{
2908096034fSSascha Wildner	int actlen;
2918096034fSSascha Wildner
2928096034fSSascha Wildner	usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
2938096034fSSascha Wildner
2948096034fSSascha Wildner	switch (USB_GET_STATE(xfer)) {
2958096034fSSascha Wildner	case USB_ST_SETUP:
2968096034fSSascha Wildner		/*
2978096034fSSascha Wildner		 * Setup xfer frame lengths/count and data
2988096034fSSascha Wildner		 */
2998096034fSSascha Wildner		usbd_transfer_submit(xfer);
3008096034fSSascha Wildner		break;
3018096034fSSascha Wildner
3028096034fSSascha Wildner	case USB_ST_TRANSFERRED:
3038096034fSSascha Wildner		/*
3048096034fSSascha Wildner		 * Read	usb frame data, if any.
3058096034fSSascha Wildner		 * "actlen" has the total length for all frames
3068096034fSSascha Wildner		 * transferred.
3078096034fSSascha Wildner		 */
3088096034fSSascha Wildner		break;
3098096034fSSascha Wildner
3108096034fSSascha Wildner	default: /* Error */
3118096034fSSascha Wildner		/*
3128096034fSSascha Wildner		 * Print error message and clear stall
3138096034fSSascha Wildner		 * for example.
3148096034fSSascha Wildner		 */
3158096034fSSascha Wildner		break;
3168096034fSSascha Wildner	}
3178096034fSSascha Wildner	/*
3188096034fSSascha Wildner	 * Here it is safe to do something without the private
3198096034fSSascha Wildner	 * USB mutex locked.
3208096034fSSascha Wildner	 */
3218096034fSSascha Wildner	return;
322f963a040SHasso Tepper}
323f963a040SHasso Tepper.Ed
3248096034fSSascha Wildner.
3258096034fSSascha Wildner.Sh USB CONTROL TRANSFERS
3268096034fSSascha WildnerAn USB control transfer has three parts.
3278096034fSSascha Wildner.
3288096034fSSascha WildnerFirst the SETUP packet, then DATA packet(s) and then a STATUS
3298096034fSSascha Wildnerpacket.
3308096034fSSascha Wildner.
3318096034fSSascha WildnerThe SETUP packet is always pointed to by frame 0 and the
3328096034fSSascha Wildnerlength is set by
3338096034fSSascha Wildner.Fn usbd_xfer_frame_len
3348096034fSSascha Wildneralso if there should not be
3358096034fSSascha Wildnersent any SETUP packet! If an USB control transfer has no DATA stage,
3368096034fSSascha Wildnerthen the number of frames should be set to 1.
3378096034fSSascha Wildner.
3388096034fSSascha WildnerElse the default number of frames is 2.
3398096034fSSascha Wildner.
3408096034fSSascha Wildner.Bd -literal -offset indent
3418096034fSSascha Wildner
3428096034fSSascha WildnerExample1: SETUP + STATUS
3438096034fSSascha Wildner usbd_xfer_set_frames(xfer, 1);
3448096034fSSascha Wildner usbd_xfer_set_frame_len(xfer, 0, 8);
3458096034fSSascha Wildner usbd_transfer_submit(xfer);
3468096034fSSascha Wildner
3478096034fSSascha WildnerExample2: SETUP + DATA + STATUS
3488096034fSSascha Wildner usbd_xfer_set_frames(xfer, 2);
3498096034fSSascha Wildner usbd_xfer_set_frame_len(xfer, 0, 8);
3508096034fSSascha Wildner usbd_xfer_set_frame_len(xfer, 1, 1);
3518096034fSSascha Wildner usbd_transfer_submit(xfer);
3528096034fSSascha Wildner
3538096034fSSascha WildnerExample3: SETUP + DATA + STATUS - split
3548096034fSSascha Wildner1st callback:
3558096034fSSascha Wildner usbd_xfer_set_frames(xfer, 1);
3568096034fSSascha Wildner usbd_xfer_set_frame_len(xfer, 0, 8);
3578096034fSSascha Wildner usbd_transfer_submit(xfer);
3588096034fSSascha Wildner
3598096034fSSascha Wildner2nd callback:
3608096034fSSascha Wildner /* IMPORTANT: frbuffers[0] must still point at the setup packet! */
3618096034fSSascha Wildner usbd_xfer_set_frames(xfer, 2);
3628096034fSSascha Wildner usbd_xfer_set_frame_len(xfer, 0, 0);
3638096034fSSascha Wildner usbd_xfer_set_frame_len(xfer, 1, 1);
3648096034fSSascha Wildner usbd_transfer_submit(xfer);
3658096034fSSascha Wildner
3668096034fSSascha WildnerExample4: SETUP + STATUS - split
3678096034fSSascha Wildner1st callback:
3688096034fSSascha Wildner usbd_xfer_set_frames(xfer, 1);
3698096034fSSascha Wildner usbd_xfer_set_frame_len(xfer, 0, 8);
3708096034fSSascha Wildner usbd_xfer_set_flag(xfer, USB_MANUAL_STATUS);
3718096034fSSascha Wildner usbd_transfer_submit(xfer);
3728096034fSSascha Wildner
3738096034fSSascha Wildner2nd callback:
3748096034fSSascha Wildner usbd_xfer_set_frames(xfer, 1);
3758096034fSSascha Wildner usbd_xfer_set_frame_len(xfer, 0, 0);
3768096034fSSascha Wildner usbd_xfer_clr_flag(xfer, USB_MANUAL_STATUS);
3778096034fSSascha Wildner usbd_transfer_submit(xfer);
3788096034fSSascha Wildner
3798096034fSSascha Wildner.Ed
3808096034fSSascha Wildner.Sh USB TRANSFER CONFIG
3818096034fSSascha WildnerTo simply the search for endpoints the
3828096034fSSascha Wildner.Nm usb
3838096034fSSascha Wildnermodule defines a USB config structure where it is possible to specify
3848096034fSSascha Wildnerthe characteristics of the wanted endpoint.
3858096034fSSascha Wildner.Bd -literal -offset indent
3868096034fSSascha Wildner
3878096034fSSascha Wildnerstruct usb_config {
3888096034fSSascha Wildner	bufsize,
3898096034fSSascha Wildner	callback
3908096034fSSascha Wildner	direction,
3918096034fSSascha Wildner	endpoint,
3928096034fSSascha Wildner	frames,
3938096034fSSascha Wildner	index flags,
3948096034fSSascha Wildner	interval,
3958096034fSSascha Wildner	timeout,
3968096034fSSascha Wildner	type,
397f963a040SHasso Tepper};
3988096034fSSascha Wildner
399f963a040SHasso Tepper.Ed
4008096034fSSascha Wildner.
401f963a040SHasso Tepper.Pp
4028096034fSSascha Wildner.Fa type
4038096034fSSascha Wildnerfield selects the USB pipe type.
4048096034fSSascha Wildner.
405*b619b7c5SSascha WildnerValid values are:
406*b619b7c5SSascha Wildner.Dv UE_INTERRUPT ,
407*b619b7c5SSascha Wildner.Dv UE_CONTROL ,
408*b619b7c5SSascha Wildner.Dv UE_BULK ,
409*b619b7c5SSascha Wildner.Dv UE_ISOCHRONOUS .
4108096034fSSascha Wildner.
411*b619b7c5SSascha WildnerThe special value
412*b619b7c5SSascha Wildner.Dv UE_BULK_INTR
413*b619b7c5SSascha Wildnerwill select BULK and INTERRUPT pipes.
4148096034fSSascha Wildner.
4158096034fSSascha WildnerThis field is mandatory.
4168096034fSSascha Wildner.
417f963a040SHasso Tepper.Pp
4188096034fSSascha Wildner.Fa endpoint
4198096034fSSascha Wildnerfield selects the USB endpoint number.
4208096034fSSascha Wildner.
421*b619b7c5SSascha WildnerA value of 0xFF, "-1" or
422*b619b7c5SSascha Wildner.Dv UE_ADDR_ANY
423*b619b7c5SSascha Wildnerwill select the first matching endpoint.
4248096034fSSascha Wildner.
4258096034fSSascha WildnerThis field is mandatory.
4268096034fSSascha Wildner.
427f963a040SHasso Tepper.Pp
4288096034fSSascha Wildner.Fa direction
4298096034fSSascha Wildnerfield selects the USB endpoint direction.
4308096034fSSascha Wildner.
431*b619b7c5SSascha WildnerA value of
432*b619b7c5SSascha Wildner.Dv UE_DIR_ANY
433*b619b7c5SSascha Wildnerwill select the first matching endpoint.
4348096034fSSascha Wildner.
435*b619b7c5SSascha WildnerElse valid values are:
436*b619b7c5SSascha Wildner.Dv UE_DIR_IN
437*b619b7c5SSascha Wildnerand
438*b619b7c5SSascha Wildner.Dv UE_DIR_OUT .
4398096034fSSascha Wildner.
440*b619b7c5SSascha Wildner.Dv UE_DIR_IN
441*b619b7c5SSascha Wildnerand
442*b619b7c5SSascha Wildner.Dv UE_DIR_OUT
443*b619b7c5SSascha Wildnercan be binary OR'ed by
444*b619b7c5SSascha Wildner.Dv UE_DIR_SID
445*b619b7c5SSascha Wildnerwhich means that the direction will be swapped in case of
446*b619b7c5SSascha Wildner.Dv USB_MODE_DEVICE .
4478096034fSSascha Wildner.
448*b619b7c5SSascha WildnerNote that
449*b619b7c5SSascha Wildner.Dv UE_DIR_IN
450*b619b7c5SSascha Wildnerrefers to the data transfer direction of the "IN" tokens and
451*b619b7c5SSascha Wildner.Dv UE_DIR_OUT
452*b619b7c5SSascha Wildnerrefers to the data transfer direction of the "OUT" tokens.
4538096034fSSascha Wildner.
4548096034fSSascha WildnerThis field is mandatory.
4558096034fSSascha Wildner.
456f963a040SHasso Tepper.Pp
4578096034fSSascha Wildner.Fa interval
4588096034fSSascha Wildnerfield selects the interrupt interval.
4598096034fSSascha Wildner.
4608096034fSSascha WildnerThe value of this field is given in milliseconds and is independent of
4618096034fSSascha Wildnerdevice speed.
4628096034fSSascha Wildner.
4638096034fSSascha WildnerDepending on the endpoint type, this field has different meaning:
464*b619b7c5SSascha Wildner.Bl -tag -width ".Dv UE_ISOCHRONOUS"
465*b619b7c5SSascha Wildner.It Dv UE_INTERRUPT
4668096034fSSascha Wildner"0" use the default interrupt interval based on endpoint descriptor.
4678096034fSSascha Wildner"Else" use the given value for polling rate.
468*b619b7c5SSascha Wildner.It Dv UE_ISOCHRONOUS
4698096034fSSascha Wildner"0" use default.
4708096034fSSascha Wildner"Else" the value is ignored.
471*b619b7c5SSascha Wildner.It Dv UE_BULK
472*b619b7c5SSascha Wildner.It Dv UE_CONTROL
4738096034fSSascha Wildner"0" no transfer pre-delay.
4748096034fSSascha Wildner"Else" a delay as given by this field in
4758096034fSSascha Wildnermilliseconds is inserted before the hardware is started when
4768096034fSSascha Wildner"usbd_transfer_submit()" is called.
477f963a040SHasso Tepper.Pp
4788096034fSSascha WildnerNOTE: The transfer timeout, if any, is started after that the
4798096034fSSascha Wildnerpre-delay has elapsed!
480f963a040SHasso Tepper.El
4818096034fSSascha Wildner.
482f963a040SHasso Tepper.Pp
483f963a040SHasso Tepper.Fa timeout
4848096034fSSascha Wildnerfield, if non-zero, will set the transfer timeout in milliseconds.
4858096034fSSascha WildnerIf the "timeout" field is zero and the transfer type is ISOCHRONOUS a
4868096034fSSascha Wildnertimeout of 250ms will be used.
4878096034fSSascha Wildner.
488f963a040SHasso Tepper.Pp
4898096034fSSascha Wildner.Fa frames
4908096034fSSascha Wildnerfield sets the maximum number of frames.
4918096034fSSascha WildnerIf zero is specified it will yield the following results:
492*b619b7c5SSascha Wildner.Bl -tag -width ".Dv UE_INTERRUPT"
493*b619b7c5SSascha Wildner.It Dv UE_BULK
4948096034fSSascha Wildnerxfer->nframes = 1;
495*b619b7c5SSascha Wildner.It Dv UE_INTERRUPT
4968096034fSSascha Wildnerxfer->nframes = 1;
497*b619b7c5SSascha Wildner.It Dv UE_CONTROL
4988096034fSSascha Wildnerxfer->nframes = 2;
499*b619b7c5SSascha Wildner.It Dv UE_ISOCHRONOUS
5008096034fSSascha WildnerNot allowed.
5018096034fSSascha WildnerWill cause an error.
502f963a040SHasso Tepper.El
5038096034fSSascha Wildner.
504f963a040SHasso Tepper.Pp
5058096034fSSascha Wildner.Fa ep_index
5068096034fSSascha Wildnerfield allows you to give a number, in case more endpoints match the
5078096034fSSascha Wildnerdescription, that selects which matching "ep_index" should be used.
5088096034fSSascha Wildner.
5098096034fSSascha Wildner.Pp
5108096034fSSascha Wildner.Fa if_index
5118096034fSSascha Wildnerfield allows you to select which of the interface numbers in the
5128096034fSSascha Wildner"ifaces" array parameter passed to "usbd_transfer_setup" that should
5138096034fSSascha Wildnerbe used when setting up the given USB transfer.
5148096034fSSascha Wildner.
5158096034fSSascha Wildner.Pp
5168096034fSSascha Wildner.Fa flags
5178096034fSSascha Wildnerfield has type "struct usb_xfer_flags" and allows one to set initial
5188096034fSSascha Wildnerflags an USB transfer.
5198096034fSSascha WildnerValid flags are:
5208096034fSSascha Wildner.Bl -tag -width "force_short_xfer"
5218096034fSSascha Wildner.It force_short_xfer
5228096034fSSascha WildnerThis flag forces the last transmitted USB packet to be short.
5238096034fSSascha WildnerA short packet has a length of less than "xfer->max_packet_size", which
5248096034fSSascha Wildnerderives from "wMaxPacketSize".
5258096034fSSascha WildnerThis flag can be changed during operation.
5268096034fSSascha Wildner.It short_xfer_ok
5278096034fSSascha WildnerThis flag allows the received transfer length, "xfer->actlen" to be
5288096034fSSascha Wildnerless than "xfer->sumlen" upon completion of a transfer.
5298096034fSSascha WildnerThis flag can be changed during operation.
5308096034fSSascha Wildner.It short_frames_ok
5318096034fSSascha WildnerThis flag allows the reception of multiple short USB frames.
5328096034fSSascha WildnerThis flag only has effect for BULK and INTERRUPT endpoints
5338096034fSSascha Wildnerand if the number of frames received is greater than 1.
5348096034fSSascha WildnerThis flag can be changed during operation.
5358096034fSSascha Wildner.It pipe_bof
5368096034fSSascha WildnerThis flag causes a failing USB transfer to remain first in the PIPE
5378096034fSSascha Wildnerqueue except in the case of "xfer->error" equal to
5388096034fSSascha Wildner"USB_ERR_CANCELLED".
5398096034fSSascha WildnerNo other USB transfers in the affected PIPE queue
5408096034fSSascha Wildnerwill be started until either:
54108c7e327SSascha Wildner.Bl -tag -width "X"
5428096034fSSascha Wildner.It 1
5438096034fSSascha WildnerThe failing USB transfer is stopped using "usbd_transfer_stop()".
5448096034fSSascha Wildner.It 2
5458096034fSSascha WildnerThe failing USB transfer performs a successful transfer.
5468096034fSSascha Wildner.El
54708c7e327SSascha Wildner.Pp
5488096034fSSascha WildnerThe purpose of this flag is to avoid races when multiple transfers are
5498096034fSSascha Wildnerqueued for execution on an USB endpoint, and the first executing
5508096034fSSascha Wildnertransfer fails leading to the need for clearing of stall for
5518096034fSSascha Wildnerexample.
5528096034fSSascha Wildner.
5538096034fSSascha WildnerIn this case this flag is used to prevent the following USB transfers
5548096034fSSascha Wildnerfrom being executed at the same time the clear-stall command is
5558096034fSSascha Wildnerexecuted on the USB control endpoint.
5568096034fSSascha Wildner.
5578096034fSSascha WildnerThis flag can be changed during operation.
5588096034fSSascha Wildner.Pp
5598096034fSSascha Wildner"BOF" is short for "Block On Failure".
5608096034fSSascha Wildner.Pp
5618096034fSSascha WildnerNOTE: This flag should be set on all BULK and INTERRUPT USB transfers
5628096034fSSascha Wildnerwhich use an endpoint that can be shared between userland and kernel.
5638096034fSSascha Wildner.
5648096034fSSascha Wildner.
5658096034fSSascha Wildner.It proxy_buffer
5668096034fSSascha WildnerSetting this flag will cause that the total buffer size will be
5678096034fSSascha Wildnerrounded up to the nearest atomic hardware transfer size.
5688096034fSSascha Wildner.
5698096034fSSascha WildnerThe maximum data length of any USB transfer is always stored in the
5708096034fSSascha Wildner"xfer->max_data_length".
5718096034fSSascha Wildner.
5728096034fSSascha WildnerFor control transfers the USB kernel will allocate additional space
5738096034fSSascha Wildnerfor the 8-bytes of SETUP header.
5748096034fSSascha Wildner.
5758096034fSSascha WildnerThese 8-bytes are not counted by the "xfer->max_data_length"
5768096034fSSascha Wildnervariable.
5778096034fSSascha Wildner.
5788096034fSSascha WildnerThis flag can not be changed during operation.
5798096034fSSascha Wildner.
5808096034fSSascha Wildner.
5818096034fSSascha Wildner.It ext_buffer
5828096034fSSascha WildnerSetting this flag will cause that no data buffer will be
5838096034fSSascha Wildnerallocated.
5848096034fSSascha Wildner.
5858096034fSSascha WildnerInstead the USB client must supply a data buffer.
5868096034fSSascha Wildner.
5878096034fSSascha WildnerThis flag can not be changed during operation.
5888096034fSSascha Wildner.
5898096034fSSascha Wildner.
5908096034fSSascha Wildner.It manual_status
5918096034fSSascha WildnerSetting this flag prevents an USB STATUS stage to be appended to the
5928096034fSSascha Wildnerend of the USB control transfer.
5938096034fSSascha Wildner.
5948096034fSSascha WildnerIf no control data is transferred this flag must be cleared.
5958096034fSSascha Wildner.
5968096034fSSascha WildnerElse an error will be returned to the USB callback.
5978096034fSSascha Wildner.
5988096034fSSascha WildnerThis flag is mostly useful for the USB device side.
5998096034fSSascha Wildner.
6008096034fSSascha WildnerThis flag can be changed during operation.
6018096034fSSascha Wildner.
6028096034fSSascha Wildner.
6038096034fSSascha Wildner.It no_pipe_ok
6048096034fSSascha WildnerSetting this flag causes the USB_ERR_NO_PIPE error to be ignored.
6058096034fSSascha WildnerThis flag can not be changed during operation.
6068096034fSSascha Wildner.
6078096034fSSascha Wildner.
6088096034fSSascha Wildner.It stall_pipe
6098096034fSSascha Wildner.Bl -tag -width "Device Side Mode"
6108096034fSSascha Wildner.It Device Side Mode
6118096034fSSascha WildnerSetting this flag will cause STALL pids to be sent to the endpoint
6128096034fSSascha Wildnerbelonging to this transfer before the transfer is started.
6138096034fSSascha Wildner.
6148096034fSSascha WildnerThe transfer is started at the moment the host issues a clear-stall
6158096034fSSascha Wildnercommand on the STALL'ed endpoint.
6168096034fSSascha Wildner.
6178096034fSSascha WildnerThis flag can be changed during operation.
6188096034fSSascha Wildner.It Host Side Mode
6198096034fSSascha WildnerSetting this flag will cause a clear-stall control request to be
6208096034fSSascha Wildnerexecuted on the endpoint before the USB transfer is started.
6218096034fSSascha Wildner.El
6228096034fSSascha Wildner.Pp
6238096034fSSascha WildnerIf this flag is changed outside the USB callback function you have to
6248096034fSSascha Wildneruse the "usbd_xfer_set_stall()" and "usbd_transfer_clear_stall()"
6258096034fSSascha Wildnerfunctions! This flag is automatically cleared after that the stall or
6268096034fSSascha Wildnerclear stall has been executed.
6278096034fSSascha Wildner.
6288096034fSSascha Wildner.It pre_scale_frames
6298096034fSSascha WildnerIf this flag is set the number of frames specified is assumed to give the buffering time in milliseconds instead of frames.
6308096034fSSascha WildnerDuring transfer setup the frames field is pre scaled with the corresponding value for the endpoint and rounded to the nearest number of frames greater than zero.
6318096034fSSascha WildnerThis option only has effect for ISOCHRONOUS transfers.
6328096034fSSascha Wildner.El
6338096034fSSascha Wildner.Pp
6348096034fSSascha Wildner.Fa bufsize
6358096034fSSascha Wildnerfield sets the total buffer size in bytes.
6368096034fSSascha Wildner.
6378096034fSSascha WildnerIf this field is zero, "wMaxPacketSize" will be used, multiplied by
6388096034fSSascha Wildnerthe "frames" field if the transfer type is ISOCHRONOUS.
6398096034fSSascha Wildner.
6408096034fSSascha WildnerThis is useful for setting up interrupt pipes.
6418096034fSSascha Wildner.
6428096034fSSascha WildnerThis field is mandatory.
6438096034fSSascha Wildner.Pp
6448096034fSSascha WildnerNOTE: For control transfers "bufsize" includes the length of the
6458096034fSSascha Wildnerrequest structure.
6468096034fSSascha Wildner.
6478096034fSSascha Wildner.Pp
6488096034fSSascha Wildner.Fa callback
6498096034fSSascha Wildnerpointer sets the USB callback.
6508096034fSSascha WildnerThis field is mandatory.
6518096034fSSascha Wildner.
6528096034fSSascha Wildner.
6538096034fSSascha Wildner.Sh USB LINUX COMPAT LAYER
6548096034fSSascha WildnerThe
6558096034fSSascha Wildner.Nm usb
6568096034fSSascha Wildnermodule supports the Linux USB API.
6578096034fSSascha Wildner.
6588096034fSSascha Wildner.
6598096034fSSascha Wildner.Sh SEE ALSO
6608096034fSSascha Wildner.Xr libusb 3 ,
6618096034fSSascha Wildner.Xr usb 4 ,
6628096034fSSascha Wildner.Xr usbconfig 8 ,
6638096034fSSascha Wildner.Xr usbdump 8
6648096034fSSascha Wildner.Sh STANDARDS
6658096034fSSascha WildnerThe
6668096034fSSascha Wildner.Nm usb
6678096034fSSascha Wildnermodule complies with the USB 2.0 standard.
6688096034fSSascha Wildner.Sh HISTORY
6698096034fSSascha WildnerThe
6708096034fSSascha Wildner.Nm usb
671222217a1SSascha Wildnermodule has been inspired by the
672222217a1SSascha Wildner.Nx
673222217a1SSascha WildnerUSB stack initially written by Lennart Augustsson.
6748096034fSSascha WildnerThe
6758096034fSSascha Wildner.Nm usb
6768096034fSSascha Wildnermodule was written by
677222217a1SSascha Wildner.An Hans Petter Selasky Aq Mt hselasky@FreeBSD.org .
678