Zephyr Project API  3.3.0
A Scalable Open Source RTOS
uhc.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2022 Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
12#ifndef ZEPHYR_INCLUDE_UHC_H
13#define ZEPHYR_INCLUDE_UHC_H
14
15#include <zephyr/kernel.h>
16#include <zephyr/device.h>
17#include <zephyr/net/buf.h>
18#include <zephyr/usb/usb_ch9.h>
19#include <zephyr/sys/dlist.h>
20
42 struct k_fifo queue;
44 struct k_fifo done;
56 unsigned int claimed : 1;
58 unsigned int queued : 1;
60 unsigned int setup : 1;
62 void *owner;
63};
64
92};
93
102struct uhc_event {
107 union {
112 };
116 const struct device *dev;
117};
118
130typedef int (*uhc_event_cb_t)(const struct device *dev,
131 const struct uhc_event *const event);
132
141};
142
146#define UHC_STATUS_INITIALIZED 0
150#define UHC_STATUS_ENABLED 1
151
158struct uhc_data {
172 void *priv;
173};
174
182static inline bool uhc_is_initialized(const struct device *dev)
183{
184 struct uhc_data *data = dev->data;
185
187}
188
196static inline bool uhc_is_enabled(const struct device *dev)
197{
198 struct uhc_data *data = dev->data;
199
200 return atomic_test_bit(&data->status, UHC_STATUS_ENABLED);
201}
202
206struct uhc_api {
207 int (*lock)(const struct device *dev);
208 int (*unlock)(const struct device *dev);
209
210 int (*init)(const struct device *dev);
211 int (*enable)(const struct device *dev);
212 int (*disable)(const struct device *dev);
213 int (*shutdown)(const struct device *dev);
214
215 int (*bus_reset)(const struct device *dev);
216 int (*sof_enable)(const struct device *dev);
217 int (*bus_suspend)(const struct device *dev);
218 int (*bus_resume)(const struct device *dev);
219
220 int (*ep_enqueue)(const struct device *dev,
221 struct uhc_transfer *const xfer);
222 int (*ep_dequeue)(const struct device *dev,
223 struct uhc_transfer *const xfer);
224};
240static inline int uhc_bus_reset(const struct device *dev)
241{
242 const struct uhc_api *api = dev->api;
243 int ret;
244
245 api->lock(dev);
246 ret = api->bus_reset(dev);
247 api->unlock(dev);
248
249 return ret;
250}
251
262static inline int uhc_sof_enable(const struct device *dev)
263{
264 const struct uhc_api *api = dev->api;
265 int ret;
266
267 api->lock(dev);
268 ret = api->sof_enable(dev);
269 api->unlock(dev);
270
271 return ret;
272}
273
285static inline int uhc_bus_suspend(const struct device *dev)
286{
287 const struct uhc_api *api = dev->api;
288 int ret;
289
290 api->lock(dev);
291 ret = api->bus_suspend(dev);
292 api->unlock(dev);
293
294 return ret;
295}
296
308static inline int uhc_bus_resume(const struct device *dev)
309{
310 const struct uhc_api *api = dev->api;
311 int ret;
312
313 api->lock(dev);
314 ret = api->bus_resume(dev);
315 api->unlock(dev);
316
317 return ret;
318}
319
337struct uhc_transfer *uhc_xfer_alloc(const struct device *dev,
338 const uint8_t addr,
339 const uint8_t ep,
340 const uint8_t attrib,
341 const uint16_t mps,
342 const uint16_t timeout,
343 void *const owner);
344
355int uhc_xfer_free(const struct device *dev,
356 struct uhc_transfer *const xfer);
357
370struct net_buf *uhc_xfer_buf_alloc(const struct device *dev,
371 struct uhc_transfer *const xfer,
372 const size_t size);
373
384int uhc_xfer_buf_free(const struct device *dev, struct net_buf *const buf);
385
398int uhc_ep_enqueue(const struct device *dev, struct uhc_transfer *const xfer);
399
411int uhc_ep_dequeue(const struct device *dev, struct uhc_transfer *const xfer);
412
425int uhc_init(const struct device *dev, uhc_event_cb_t event_cb);
426
439int uhc_enable(const struct device *dev);
440
451int uhc_disable(const struct device *dev);
452
464int uhc_shutdown(const struct device *dev);
465
476static inline struct uhc_device_caps uhc_caps(const struct device *dev)
477{
478 struct uhc_data *data = dev->data;
479
480 return data->caps;
481}
482
487#endif /* ZEPHYR_INCLUDE_UHC_H */
long atomic_t
Definition: atomic.h:22
ZTEST_BMEM int timeout
Definition: main.c:31
Doubly-linked list implementation.
static bool atomic_test_bit(const atomic_t *target, int bit)
Atomically test a bit.
Definition: atomic.h:131
static int shutdown(int sock, int how)
Definition: socket.h:707
struct _dnode sys_dnode_t
Definition: dlist.h:49
struct _dnode sys_dlist_t
Definition: dlist.h:48
#define UHC_STATUS_INITIALIZED
Definition: uhc.h:146
static bool uhc_is_enabled(const struct device *dev)
Checks whether the controller is enabled.
Definition: uhc.h:196
#define UHC_STATUS_ENABLED
Definition: uhc.h:150
static bool uhc_is_initialized(const struct device *dev)
Checks whether the controller is initialized.
Definition: uhc.h:182
struct uhc_transfer * uhc_xfer_alloc(const struct device *dev, const uint8_t addr, const uint8_t ep, const uint8_t attrib, const uint16_t mps, const uint16_t timeout, void *const owner)
Allocate UHC transfer.
static int uhc_bus_reset(const struct device *dev)
Reset USB bus.
Definition: uhc.h:240
int(* uhc_event_cb_t)(const struct device *dev, const struct uhc_event *const event)
Callback to submit UHC event to higher layer.
Definition: uhc.h:130
static int uhc_bus_resume(const struct device *dev)
Resume USB bus.
Definition: uhc.h:308
int uhc_xfer_buf_free(const struct device *dev, struct net_buf *const buf)
Free UHC request buffer.
int uhc_ep_enqueue(const struct device *dev, struct uhc_transfer *const xfer)
Queue USB host controller transfer.
int uhc_ep_dequeue(const struct device *dev, struct uhc_transfer *const xfer)
Remove a USB host controller transfers from queue.
static struct uhc_device_caps uhc_caps(const struct device *dev)
Get USB host controller capabilities.
Definition: uhc.h:476
static int uhc_bus_suspend(const struct device *dev)
Suspend USB bus.
Definition: uhc.h:285
int uhc_disable(const struct device *dev)
Disable USB host controller.
int uhc_xfer_free(const struct device *dev, struct uhc_transfer *const xfer)
Free UHC transfer and any buffers.
uhc_event_type
USB host controller event types.
Definition: uhc.h:68
struct net_buf * uhc_xfer_buf_alloc(const struct device *dev, struct uhc_transfer *const xfer, const size_t size)
Allocate UHC transfer buffer.
int uhc_init(const struct device *dev, uhc_event_cb_t event_cb)
Initialize USB host controller.
int uhc_shutdown(const struct device *dev)
Poweroff USB host controller.
static int uhc_sof_enable(const struct device *dev)
Enable Start of Frame generator.
Definition: uhc.h:262
int uhc_enable(const struct device *dev)
Enable USB host controller.
@ UHC_EVT_EP_REQUEST
Definition: uhc.h:86
@ UHC_EVT_DEV_CONNECTED_HS
Definition: uhc.h:74
@ UHC_EVT_DEV_CONNECTED_FS
Definition: uhc.h:72
@ UHC_EVT_RWUP
Definition: uhc.h:84
@ UHC_EVT_SUSPENDED
Definition: uhc.h:80
@ UHC_EVT_DEV_REMOVED
Definition: uhc.h:76
@ UHC_EVT_RESUMED
Definition: uhc.h:82
@ UHC_EVT_DEV_CONNECTED_LS
Definition: uhc.h:70
@ UHC_EVT_ERROR
Definition: uhc.h:91
@ UHC_EVT_RESETED
Definition: uhc.h:78
Public kernel APIs.
static ZTEST_BMEM volatile int ret
Definition: k_float_disable.c:28
Buffer management.
struct _snode sys_snode_t
Definition: slist.h:33
static struct k_spinlock lock
Definition: spinlock_error_case.c:13
__UINT32_TYPE__ uint32_t
Definition: stdint.h:90
__UINT8_TYPE__ uint8_t
Definition: stdint.h:88
__UINT16_TYPE__ uint16_t
Definition: stdint.h:89
Runtime device structure (in ROM) per driver instance.
Definition: device.h:378
void * data
Definition: device.h:388
const void * api
Definition: device.h:384
Definition: kernel.h:2252
Definition: kernel.h:2764
Network buffer representation.
Definition: buf.h:905
uint16_t size
Definition: buf.h:937
Definition: uhc.h:158
struct k_mutex mutex
Definition: uhc.h:162
atomic_t status
Definition: uhc.h:170
void * priv
Definition: uhc.h:172
sys_dlist_t ctrl_xfers
Definition: uhc.h:164
struct uhc_device_caps caps
Definition: uhc.h:160
sys_dlist_t bulk_xfers
Definition: uhc.h:166
uhc_event_cb_t event_cb
Definition: uhc.h:168
Definition: uhc.h:138
uint32_t hs
Definition: uhc.h:140
Definition: uhc.h:102
struct uhc_transfer * xfer
Definition: uhc.h:111
const struct device * dev
Definition: uhc.h:116
uint32_t value
Definition: uhc.h:109
enum uhc_event_type type
Definition: uhc.h:106
int status
Definition: uhc.h:114
sys_snode_t node
Definition: uhc.h:104
Definition: uhc.h:38
unsigned int claimed
Definition: uhc.h:56
void * owner
Definition: uhc.h:62
uint8_t addr
Definition: uhc.h:46
uint16_t mps
Definition: uhc.h:52
uint16_t timeout
Definition: uhc.h:54
unsigned int setup
Definition: uhc.h:60
uint8_t ep
Definition: uhc.h:48
struct k_fifo done
Definition: uhc.h:44
struct k_fifo queue
Definition: uhc.h:42
unsigned int queued
Definition: uhc.h:58
uint8_t attrib
Definition: uhc.h:50
sys_dnode_t node
Definition: uhc.h:40
static fdata_t data[2]
Definition: test_fifo_contexts.c:15
USB Chapter 9 structures and definitions.