source: mainline/uspace/lib/drv/include/usbhc_iface.h@ 5595841

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 5595841 was 5595841, checked in by Ondřej Hlavatý <aearsis@…>, 7 years ago

libdrv: usbhc_iface now shares memory instead of sending data

Two more things that come along:
1) The two callbacks (read, write) were joined. As they were joined in

the only implementation (ddf_helpers) anyway, and now the code is
almost the same, we took the opportunity and joined them. The bad
thing about it is that there are not enough IPC arguments to
transfer the direction, so we still have to use two "interface IPC
methods".

2) The copying is still done by the former methods (usbhc_read and

usbhc_write) to ensure the page alignment, so this method just
moves the burden of copying from kernel to the caller (which is why
this is actually a performance regression).

But, the two sides can now resolve their issues separately. The caller
can prepare the memory area in advance, and HC can use the memory
directly if it can.

  • Property mode set to 100644
File size: 5.5 KB
Line 
1/*
2 * Copyright (c) 2010 Vojtech Horky
3 * Copyright (c) 2017 Ondrej Hlavaty
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * - Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * - The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30/** @addtogroup libdrv
31 * @addtogroup usb
32 * @{
33 */
34/** @file
35 * @brief USB host controler interface definition. This is the interface of
36 * USB host controller function, which can be used by usb device drivers.
37 */
38
39#ifndef LIBDRV_USBHC_IFACE_H_
40#define LIBDRV_USBHC_IFACE_H_
41
42#include "ddf/driver.h"
43#include <async.h>
44
45/** USB speeds. */
46typedef enum {
47 /** USB 1.1 low speed (1.5Mbits/s). */
48 USB_SPEED_LOW,
49 /** USB 1.1 full speed (12Mbits/s). */
50 USB_SPEED_FULL,
51 /** USB 2.0 high speed (480Mbits/s). */
52 USB_SPEED_HIGH,
53 /** USB 3.0 super speed (5Gbits/s). */
54 USB_SPEED_SUPER,
55 /** Psuedo-speed serving as a boundary. */
56 USB_SPEED_MAX
57} usb_speed_t;
58
59/** USB endpoint number type.
60 * Negative values could be used to indicate error.
61 */
62typedef uint16_t usb_endpoint_t;
63
64/** USB address type.
65 * Negative values could be used to indicate error.
66 */
67typedef uint16_t usb_address_t;
68
69/**
70 * USB Stream ID type.
71 */
72typedef uint16_t usb_stream_t;
73
74/** USB transfer type. */
75typedef enum {
76 USB_TRANSFER_CONTROL = 0,
77 USB_TRANSFER_ISOCHRONOUS = 1,
78 USB_TRANSFER_BULK = 2,
79 USB_TRANSFER_INTERRUPT = 3,
80} usb_transfer_type_t;
81
82#define USB_TRANSFER_COUNT (USB_TRANSFER_INTERRUPT + 1)
83
84/** USB data transfer direction. */
85typedef enum {
86 USB_DIRECTION_IN,
87 USB_DIRECTION_OUT,
88 USB_DIRECTION_BOTH,
89} usb_direction_t;
90
91#define USB_DIRECTION_COUNT (USB_DIRECTION_BOTH + 1)
92
93/** USB complete address type.
94 * Pair address + endpoint is identification of transaction recipient.
95 */
96typedef union {
97 struct {
98 usb_address_t address;
99 usb_endpoint_t endpoint;
100 usb_stream_t stream;
101 } __attribute__((packed));
102 uint64_t packed;
103} usb_target_t;
104
105typedef struct usb_pipe_desc {
106 /** Endpoint number. */
107 usb_endpoint_t endpoint_no;
108
109 /** Endpoint transfer type. */
110 usb_transfer_type_t transfer_type;
111
112 /** Endpoint direction. */
113 usb_direction_t direction;
114
115 /** Maximum size of one transfer */
116 size_t max_transfer_size;
117} usb_pipe_desc_t;
118
119/** This structure follows standard endpoint descriptor + superspeed companion
120 * descriptor, and exists to avoid dependency of libdrv on libusb. Keep the
121 * internal fields named exactly like their source (because we want to use the
122 * same macros to access them).
123 * Callers shall fill it with bare contents of respective descriptors (in usb endianity).
124 */
125typedef struct usb_endpoint_descriptors {
126 struct {
127 uint8_t endpoint_address;
128 uint8_t attributes;
129 uint16_t max_packet_size;
130 uint8_t poll_interval;
131 } endpoint;
132
133 /* Superspeed companion descriptor */
134 struct companion_desc_t {
135 uint8_t max_burst;
136 uint8_t attributes;
137 uint16_t bytes_per_interval;
138 } companion;
139} usb_endpoint_descriptors_t;
140
141extern errno_t usbhc_reserve_default_address(async_exch_t *);
142extern errno_t usbhc_release_default_address(async_exch_t *);
143
144extern errno_t usbhc_device_enumerate(async_exch_t *, unsigned, usb_speed_t);
145extern errno_t usbhc_device_remove(async_exch_t *, unsigned);
146
147extern errno_t usbhc_register_endpoint(async_exch_t *, usb_pipe_desc_t *, const usb_endpoint_descriptors_t *);
148extern errno_t usbhc_unregister_endpoint(async_exch_t *, const usb_pipe_desc_t *);
149
150extern errno_t usbhc_transfer(async_exch_t *, usb_endpoint_t, usb_direction_t,
151 uint64_t, void *, size_t, size_t *);
152extern errno_t usbhc_read(async_exch_t *, usb_endpoint_t, uint64_t, void *, size_t,
153 size_t *);
154extern errno_t usbhc_write(async_exch_t *, usb_endpoint_t, uint64_t, const void *,
155 size_t);
156
157/** Callback for outgoing transfer */
158typedef errno_t (*usbhc_iface_transfer_callback_t)(void *, int, size_t);
159
160/** USB device communication interface. */
161typedef struct {
162 int (*default_address_reservation)(ddf_fun_t *, bool);
163
164 int (*device_enumerate)(ddf_fun_t *, unsigned, usb_speed_t);
165 int (*device_remove)(ddf_fun_t *, unsigned);
166
167 int (*register_endpoint)(ddf_fun_t *, usb_pipe_desc_t *, const usb_endpoint_descriptors_t *);
168 int (*unregister_endpoint)(ddf_fun_t *, const usb_pipe_desc_t *);
169
170 errno_t (*transfer)(ddf_fun_t *, usb_target_t,
171 usb_direction_t, uint64_t, char *, size_t,
172 usbhc_iface_transfer_callback_t, void *);
173} usbhc_iface_t;
174
175#endif
176/**
177 * @}
178 */
Note: See TracBrowser for help on using the repository browser.