Zephyr Project API  3.3.0
A Scalable Open Source RTOS
udc.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2021-2022 Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
12#ifndef ZEPHYR_INCLUDE_UDC_H
13#define ZEPHYR_INCLUDE_UDC_H
14
15#include <zephyr/kernel.h>
16#include <zephyr/device.h>
17#include <zephyr/net/buf.h>
18#include <zephyr/sys/atomic.h>
19#include <zephyr/usb/usb_ch9.h>
20
29};
30
44 enum udc_mps0 mps0 : 2;
45};
46
59};
60
79};
80
95};
96
106 struct k_fifo fifo;
119};
120
121
145};
146
155struct udc_event {
158 union {
162 struct net_buf *buf;
163 };
167 const struct device *dev;
168};
169
181 unsigned int setup : 1;
183 unsigned int data : 1;
185 unsigned int status : 1;
187 unsigned int zlp : 1;
189 unsigned int claimed : 1;
191 unsigned int queued : 1;
193 void *owner;
194} __packed;
195
209typedef int (*udc_event_cb_t)(const struct device *dev,
210 const struct udc_event *const event);
211
218struct udc_api {
219 enum udc_bus_speed (*device_speed)(const struct device *dev);
220 int (*ep_enqueue)(const struct device *dev,
221 struct udc_ep_config *const cfg,
222 struct net_buf *const buf);
223 int (*ep_dequeue)(const struct device *dev,
224 struct udc_ep_config *const cfg);
225 int (*ep_set_halt)(const struct device *dev,
226 struct udc_ep_config *const cfg);
227 int (*ep_clear_halt)(const struct device *dev,
228 struct udc_ep_config *const cfg);
229 int (*ep_try_config)(const struct device *dev,
230 struct udc_ep_config *const cfg);
231 int (*ep_enable)(const struct device *dev,
232 struct udc_ep_config *const cfg);
233 int (*ep_disable)(const struct device *dev,
234 struct udc_ep_config *const cfg);
235 int (*host_wakeup)(const struct device *dev);
236 int (*set_address)(const struct device *dev,
237 const uint8_t addr);
238 int (*enable)(const struct device *dev);
239 int (*disable)(const struct device *dev);
240 int (*init)(const struct device *dev);
241 int (*shutdown)(const struct device *dev);
242 int (*lock)(const struct device *dev);
243 int (*unlock)(const struct device *dev);
244};
245
250#define UDC_STATUS_INITIALIZED 0
255#define UDC_STATUS_ENABLED 1
257#define UDC_STATUS_SUSPENDED 2
258
265struct udc_data {
277 int stage;
279 struct net_buf *setup;
281 void *priv;
282};
283
298static inline bool udc_is_initialized(const struct device *dev)
299{
300 struct udc_data *data = dev->data;
301
303}
304
312static inline bool udc_is_enabled(const struct device *dev)
313{
314 struct udc_data *data = dev->data;
315
316 return atomic_test_bit(&data->status, UDC_STATUS_ENABLED);
317}
318
326static inline bool udc_is_suspended(const struct device *dev)
327{
328 struct udc_data *data = dev->data;
329
330 return atomic_test_bit(&data->status, UDC_STATUS_SUSPENDED);
331}
332
347int udc_init(const struct device *dev, udc_event_cb_t event_cb);
348
361int udc_enable(const struct device *dev);
362
374int udc_disable(const struct device *dev);
375
387int udc_shutdown(const struct device *dev);
388
399static inline struct udc_device_caps udc_caps(const struct device *dev)
400{
401 struct udc_data *data = dev->data;
402
403 return data->caps;
404}
405
416enum udc_bus_speed udc_device_speed(const struct device *dev);
417
429static inline int udc_set_address(const struct device *dev, const uint8_t addr)
430{
431 const struct udc_api *api = dev->api;
432 int ret;
433
434 if (!udc_is_enabled(dev)) {
435 return -EPERM;
436 }
437
438 api->lock(dev);
439 ret = api->set_address(dev, addr);
440 api->unlock(dev);
441
442 return ret;
443}
444
455static inline int udc_host_wakeup(const struct device *dev)
456{
457 const struct udc_api *api = dev->api;
458 int ret;
459
460 if (!udc_is_enabled(dev)) {
461 return -EPERM;
462 }
463
464 api->lock(dev);
465 ret = api->host_wakeup(dev);
466 api->unlock(dev);
467
468 return ret;
469}
470
492int udc_ep_try_config(const struct device *dev,
493 const uint8_t ep,
494 const uint8_t attributes,
495 uint16_t *const mps,
496 const uint8_t interval);
497
516int udc_ep_enable(const struct device *dev,
517 const uint8_t ep,
518 const uint8_t attributes,
519 const uint16_t mps,
520 const uint8_t interval);
521
536int udc_ep_disable(const struct device *dev, const uint8_t ep);
537
551int udc_ep_set_halt(const struct device *dev, const uint8_t ep);
552
566int udc_ep_clear_halt(const struct device *dev, const uint8_t ep);
567
583int udc_ep_enqueue(const struct device *dev, struct net_buf *const buf);
584
601int udc_ep_dequeue(const struct device *dev, const uint8_t ep);
602
614struct net_buf *udc_ep_buf_alloc(const struct device *dev,
615 const uint8_t ep,
616 const size_t size);
617
628int udc_ep_buf_free(const struct device *dev, struct net_buf *const buf);
629
637static inline void udc_ep_buf_set_zlp(struct net_buf *const buf)
638{
639 struct udc_buf_info *bi;
640
641 __ASSERT_NO_MSG(buf);
642 bi = (struct udc_buf_info *)net_buf_user_data(buf);
643 if (USB_EP_DIR_IS_IN(bi->ep)) {
644 bi->zlp = 1;
645 }
646}
647
655static inline struct udc_buf_info *udc_get_buf_info(const struct net_buf *const buf)
656{
657 __ASSERT_NO_MSG(buf);
658 return (struct udc_buf_info *)net_buf_user_data(buf);
659}
660
665#endif /* ZEPHYR_INCLUDE_UDC_H */
long atomic_t
Definition: atomic.h:22
static bool atomic_test_bit(const atomic_t *target, int bit)
Atomically test a bit.
Definition: atomic.h:131
static void * net_buf_user_data(const struct net_buf *buf)
Get a pointer to the user data of a buffer.
Definition: buf.h:1463
#define EPERM
Definition: errno.h:40
static struct udc_buf_info * udc_get_buf_info(const struct net_buf *const buf)
Get requests metadata.
Definition: udc.h:655
static int udc_host_wakeup(const struct device *dev)
Initiate host wakeup procedure.
Definition: udc.h:455
int udc_ep_set_halt(const struct device *dev, const uint8_t ep)
Halt endpoint.
static bool udc_is_enabled(const struct device *dev)
Checks whether the controller is enabled.
Definition: udc.h:312
static struct udc_device_caps udc_caps(const struct device *dev)
Get USB device controller capabilities.
Definition: udc.h:399
static bool udc_is_initialized(const struct device *dev)
Checks whether the controller is initialized.
Definition: udc.h:298
static void udc_ep_buf_set_zlp(struct net_buf *const buf)
Set ZLP flag in requests metadata.
Definition: udc.h:637
int udc_ep_disable(const struct device *dev, const uint8_t ep)
Disable endpoint.
int udc_shutdown(const struct device *dev)
Poweroff USB device controller.
int udc_ep_dequeue(const struct device *dev, const uint8_t ep)
Remove all USB device controller requests from endpoint queue.
static int udc_set_address(const struct device *dev, const uint8_t addr)
Set USB device address.
Definition: udc.h:429
int udc_ep_try_config(const struct device *dev, const uint8_t ep, const uint8_t attributes, uint16_t *const mps, const uint8_t interval)
Try an endpoint configuration.
static bool udc_is_suspended(const struct device *dev)
Checks whether the controller is suspended.
Definition: udc.h:326
int udc_disable(const struct device *dev)
Disable USB device controller.
int udc_init(const struct device *dev, udc_event_cb_t event_cb)
Initialize USB device controller.
enum udc_bus_speed udc_device_speed(const struct device *dev)
Get actual USB device speed.
int udc_ep_enqueue(const struct device *dev, struct net_buf *const buf)
Queue USB device controller request.
int udc_ep_enable(const struct device *dev, const uint8_t ep, const uint8_t attributes, const uint16_t mps, const uint8_t interval)
Configure and enable endpoint.
struct net_buf * udc_ep_buf_alloc(const struct device *dev, const uint8_t ep, const size_t size)
Allocate UDC request buffer.
int udc_ep_clear_halt(const struct device *dev, const uint8_t ep)
Clear endpoint halt.
int udc_ep_buf_free(const struct device *dev, struct net_buf *const buf)
Free UDC request buffer.
int udc_enable(const struct device *dev)
Enable USB device controller.
Public kernel APIs.
static ZTEST_BMEM volatile int ret
Definition: k_float_disable.c:28
Buffer management.
__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: stat.h:92
UDC driver API This is the mandatory API any USB device controller driver needs to expose with except...
Definition: udc.h:218
int(* init)(const struct device *dev)
Definition: udc.h:240
int(* ep_dequeue)(const struct device *dev, struct udc_ep_config *const cfg)
Definition: udc.h:223
int(* ep_disable)(const struct device *dev, struct udc_ep_config *const cfg)
Definition: udc.h:233
int(* unlock)(const struct device *dev)
Definition: udc.h:243
int(* ep_enable)(const struct device *dev, struct udc_ep_config *const cfg)
Definition: udc.h:231
int(* set_address)(const struct device *dev, const uint8_t addr)
Definition: udc.h:236
int(* ep_try_config)(const struct device *dev, struct udc_ep_config *const cfg)
Definition: udc.h:229
int(* disable)(const struct device *dev)
Definition: udc.h:239
int(* ep_clear_halt)(const struct device *dev, struct udc_ep_config *const cfg)
Definition: udc.h:227
int(* ep_enqueue)(const struct device *dev, struct udc_ep_config *const cfg, struct net_buf *const buf)
Definition: udc.h:220
int(* lock)(const struct device *dev)
Definition: udc.h:242
int(* shutdown)(const struct device *dev)
Definition: udc.h:241
int(* ep_set_halt)(const struct device *dev, struct udc_ep_config *const cfg)
Definition: udc.h:225
enum udc_bus_speed(* device_speed)(const struct device *dev)
Definition: udc.h:219
int(* host_wakeup)(const struct device *dev)
Definition: udc.h:235
int(* enable)(const struct device *dev)
Definition: udc.h:238
Definition: udc.h:177
uint8_t ep
Definition: udc.h:179
void * owner
Definition: udc.h:193
unsigned int queued
Definition: udc.h:191
unsigned int status
Definition: udc.h:185
unsigned int setup
Definition: udc.h:181
unsigned int claimed
Definition: udc.h:189
unsigned int data
Definition: udc.h:183
unsigned int zlp
Definition: udc.h:187
Definition: udc.h:265
struct k_mutex mutex
Definition: udc.h:271
struct net_buf * setup
Definition: udc.h:279
udc_event_cb_t event_cb
Definition: udc.h:273
atomic_t status
Definition: udc.h:275
struct udc_device_caps caps
Definition: udc.h:269
int stage
Definition: udc.h:277
void * priv
Definition: udc.h:281
struct udc_ep_config * ep_lut[32]
Definition: udc.h:267
Definition: udc.h:36
uint32_t out_ack
Definition: udc.h:42
enum udc_mps0 mps0
Definition: udc.h:44
uint32_t rwup
Definition: udc.h:40
uint32_t hs
Definition: udc.h:38
Definition: udc.h:64
uint32_t iso
Definition: udc.h:74
uint32_t in
Definition: udc.h:76
uint32_t mps
Definition: udc.h:66
uint32_t bulk
Definition: udc.h:72
uint32_t interrupt
Definition: udc.h:70
uint32_t control
Definition: udc.h:68
uint32_t out
Definition: udc.h:78
Definition: udc.h:104
uint8_t interval
Definition: udc.h:118
struct udc_ep_caps caps
Definition: udc.h:108
struct k_fifo fifo
Definition: udc.h:106
uint8_t addr
Definition: udc.h:112
uint8_t attributes
Definition: udc.h:114
uint16_t mps
Definition: udc.h:116
Definition: udc.h:84
uint32_t odd
Definition: udc.h:92
uint32_t data1
Definition: udc.h:90
uint32_t enabled
Definition: udc.h:86
uint32_t busy
Definition: udc.h:94
uint32_t halted
Definition: udc.h:88
Definition: udc.h:155
int status
Definition: udc.h:165
enum udc_event_type type
Definition: udc.h:157
const struct device * dev
Definition: udc.h:167
struct net_buf * buf
Definition: udc.h:162
uint32_t value
Definition: udc.h:160
static fdata_t data[2]
Definition: test_fifo_contexts.c:15
int(* udc_event_cb_t)(const struct device *dev, const struct udc_event *const event)
Callback to submit UDC event to higher layer.
Definition: udc.h:209
udc_event_type
USB device controller event types.
Definition: udc.h:125
@ UDC_EVT_VBUS_READY
Definition: udc.h:127
@ UDC_EVT_RESUME
Definition: udc.h:131
@ UDC_EVT_SUSPEND
Definition: udc.h:133
@ UDC_EVT_VBUS_REMOVED
Definition: udc.h:129
@ UDC_EVT_EP_REQUEST
Definition: udc.h:139
@ UDC_EVT_ERROR
Definition: udc.h:144
@ UDC_EVT_RESET
Definition: udc.h:135
@ UDC_EVT_SOF
Definition: udc.h:137
udc_bus_speed
USB device actual speed.
Definition: udc.h:50
@ UDC_BUS_SPEED_SS
Definition: udc.h:58
@ UDC_BUS_SPEED_FS
Definition: udc.h:54
@ UDC_BUS_UNKNOWN
Definition: udc.h:52
@ UDC_BUS_SPEED_HS
Definition: udc.h:56
#define UDC_STATUS_INITIALIZED
Definition: udc.h:250
udc_mps0
Maximum packet size of control endpoint supported by the controller.
Definition: udc.h:24
@ UDC_MPS0_32
Definition: udc.h:27
@ UDC_MPS0_16
Definition: udc.h:26
@ UDC_MPS0_64
Definition: udc.h:28
@ UDC_MPS0_8
Definition: udc.h:25
#define UDC_STATUS_SUSPENDED
Definition: udc.h:257
#define UDC_STATUS_ENABLED
Definition: udc.h:255
USB Chapter 9 structures and definitions.
#define USB_EP_DIR_IS_IN(ep)
Definition: usb_ch9.h:298