source: mainline/uspace/lib/usbhost/include/usb/host/bus.h@ 32fb6bce

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

usbhost: refactoring

This commit moves interrupt, status and schedule to bus
operations. Then the purpose of hcd_t is better defined, and split into
hc_driver_t and hc_device_t. hc_driver_t is used to wrap driver
implementation by the library (similar to how usb_driver_t is used to
wrap usb device drivers). hc_device_t is used as a parent for hc_t
inside drivers, and is allocated inside the DDF device node.

To support these changes, some local identifiers were renamed, some
functions were moved and/or renamed and their arguments changed. The
most notable one being hcd_send_batch → bus_device_send_batch.

  • Property mode set to 100644
File size: 5.7 KB
Line 
1/*
2 * Copyright (c) 2017 Ondrej Hlavaty <aearsis@eideo.cz>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28/** @addtogroup libusbhost
29 * @{
30 */
31/** @file
32 * Virtual base for usb bus implementations.
33 *
34 * The purpose of this structure is to keep information about connected devices
35 * and endpoints, manage available bandwidth and the toggle bit flipping.
36 *
37 * The generic implementation is provided for USB 1 and 2 in usb2_bus.c. Some
38 * details in [OUE]HCI are solved through overriding some functions. XHCI does
39 * not need the bookkeeping functionality, because addresses are managed by HC
40 * itself.
41 */
42#ifndef LIBUSBHOST_HOST_BUS_H
43#define LIBUSBHOST_HOST_BUS_H
44
45#include <assert.h>
46#include <fibril_synch.h>
47#include <stdbool.h>
48#include <usb/host/hcd.h>
49#include <usb/request.h>
50#include <usb/usb.h>
51#include <usbhc_iface.h>
52
53typedef struct hcd hcd_t;
54typedef struct endpoint endpoint_t;
55typedef struct bus bus_t;
56typedef struct ddf_fun ddf_fun_t;
57typedef struct usb_transfer_batch usb_transfer_batch_t;
58
59typedef struct device {
60 /* Device tree keeping */
61 link_t link;
62 list_t devices;
63 fibril_mutex_t guard;
64
65 /* Associated DDF function, if any */
66 ddf_fun_t *fun;
67
68 /* Invalid for the roothub device */
69 unsigned port;
70 struct device *hub;
71
72 /* Transaction translator */
73 usb_tt_address_t tt;
74
75 /* The following are not set by the library */
76 usb_speed_t speed;
77 usb_address_t address;
78
79 /* Managing bus */
80 bus_t *bus;
81
82 /* This structure is meant to be extended by overriding. */
83} device_t;
84
85typedef struct bus_ops bus_ops_t;
86
87/**
88 * Operations structure serving as an interface of hc driver for the library
89 * (and the rest of the system).
90 */
91struct bus_ops {
92 /* Undefined operations will be delegated to parent ops */
93 const bus_ops_t *parent;
94
95 /* Global operations on the bus */
96 void (*interrupt)(bus_t *, uint32_t);
97 int (*status)(bus_t *, uint32_t *);
98 int (*reserve_default_address)(bus_t *, usb_speed_t);
99 int (*release_default_address)(bus_t *);
100 int (*reset_toggle)(bus_t *, usb_target_t, toggle_reset_mode_t);
101
102 /* Operations on device */
103 int (*device_enumerate)(device_t *);
104 int (*device_remove)(device_t *);
105 int (*device_online)(device_t *); /**< Optional */
106 int (*device_offline)(device_t *); /**< Optional */
107 endpoint_t *(*device_find_endpoint)(device_t*, usb_target_t, usb_direction_t);
108 endpoint_t *(*endpoint_create)(device_t *, const usb_endpoint_desc_t *);
109
110 /* Operations on endpoint */
111 int (*endpoint_register)(endpoint_t *);
112 int (*endpoint_unregister)(endpoint_t *);
113 void (*endpoint_destroy)(endpoint_t *); /**< Optional */
114 bool (*endpoint_get_toggle)(endpoint_t *); /**< Optional */
115 void (*endpoint_set_toggle)(endpoint_t *, bool); /**< Optional */
116 ssize_t (*endpoint_count_bw) (endpoint_t *, size_t);
117 usb_transfer_batch_t *(*batch_create)(endpoint_t *); /**< Optional */
118
119 /* Operations on batch */
120 void (*batch_destroy)(usb_transfer_batch_t *); /**< Optional */
121 int (*batch_schedule)(usb_transfer_batch_t *);
122};
123
124/**
125 * Use this macro to lookup virtual function.
126 */
127#define BUS_OPS_LOOKUP(start, fn) ({ bus_ops_t const * ops = (start); while (ops && ops->fn == NULL) ops = ops->parent; ops; })
128
129/** Endpoint management structure */
130typedef struct bus {
131 /* Synchronization of ops */
132 fibril_mutex_t guard;
133
134 /* Size of the device_t extended structure */
135 size_t device_size;
136
137 /* Do not call directly, ops are synchronized. */
138 const bus_ops_t *ops;
139
140 /* This structure is meant to be extended by overriding. */
141} bus_t;
142
143void bus_init(bus_t *, size_t);
144int bus_device_init(device_t *, bus_t *);
145
146int bus_device_set_default_name(device_t *);
147
148int bus_device_enumerate(device_t *);
149int bus_device_remove(device_t *);
150
151int bus_device_online(device_t *);
152int bus_device_offline(device_t *);
153
154int bus_device_send_batch(device_t *, usb_target_t,
155 usb_direction_t direction, char *, size_t, uint64_t,
156 usbhc_iface_transfer_callback_t, void *, const char *);
157
158ssize_t bus_device_send_batch_sync(device_t *, usb_target_t,
159 usb_direction_t direction, char *, size_t, uint64_t,
160 const char *);
161
162int bus_endpoint_add(device_t *, const usb_endpoint_desc_t *, endpoint_t **);
163endpoint_t *bus_find_endpoint(device_t *, usb_target_t, usb_direction_t);
164int bus_endpoint_remove(endpoint_t *);
165
166int bus_reserve_default_address(bus_t *, usb_speed_t);
167int bus_release_default_address(bus_t *);
168
169int bus_reset_toggle(bus_t *, usb_target_t, bool);
170
171#endif
172/**
173 * @}
174 */
Note: See TracBrowser for help on using the repository browser.