Zephyr API Documentation 4.4.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
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
11
12#ifndef ZEPHYR_INCLUDE_UDC_H
13#define ZEPHYR_INCLUDE_UDC_H
14
15#include <zephyr/kernel.h>
16#include <zephyr/device.h>
18#include <zephyr/sys/atomic.h>
19#include <zephyr/usb/usb_ch9.h>
20
30
54
68
90
106
130
131
156
165struct udc_event {
168 union {
174 struct net_buf *buf;
175 };
177 const struct device *dev;
178};
179
191 unsigned int setup : 1;
193 unsigned int data : 1;
195 unsigned int status : 1;
197 unsigned int zlp : 1;
199 unsigned int claimed : 1;
201 unsigned int queued : 1;
203 void *owner;
205 int err;
206} __packed;
207
220typedef int (*udc_event_cb_t)(const struct device *dev,
221 const struct udc_event *const event);
222
229struct udc_api {
230 enum udc_bus_speed (*device_speed)(const struct device *dev);
231 int (*ep_enqueue)(const struct device *dev,
232 struct udc_ep_config *const cfg,
233 struct net_buf *const buf);
234 int (*ep_dequeue)(const struct device *dev,
235 struct udc_ep_config *const cfg);
236 int (*ep_set_halt)(const struct device *dev,
237 struct udc_ep_config *const cfg);
238 int (*ep_clear_halt)(const struct device *dev,
239 struct udc_ep_config *const cfg);
240 int (*ep_try_config)(const struct device *dev,
241 struct udc_ep_config *const cfg);
242 int (*ep_enable)(const struct device *dev,
243 struct udc_ep_config *const cfg);
244 int (*ep_disable)(const struct device *dev,
245 struct udc_ep_config *const cfg);
246 int (*host_wakeup)(const struct device *dev);
247 int (*set_address)(const struct device *dev,
248 const uint8_t addr);
249 int (*test_mode)(const struct device *dev,
250 const uint8_t mode, const bool dryrun);
251 int (*enable)(const struct device *dev);
252 int (*disable)(const struct device *dev);
253 int (*init)(const struct device *dev);
254 int (*shutdown)(const struct device *dev);
255 void (*lock)(const struct device *dev);
256 void (*unlock)(const struct device *dev);
257};
258
263#define UDC_STATUS_INITIALIZED 0
268#define UDC_STATUS_ENABLED 1
270#define UDC_STATUS_SUSPENDED 2
271
300
309
317static inline bool udc_is_initialized(const struct device *dev)
318{
319 struct udc_data *data = (struct udc_data *)dev->data;
320
322}
323
331static inline bool udc_is_enabled(const struct device *dev)
332{
333 struct udc_data *data = (struct udc_data *)dev->data;
334
336}
337
345static inline bool udc_is_suspended(const struct device *dev)
346{
347 struct udc_data *data = (struct udc_data *)dev->data;
348
350}
351
367int udc_init(const struct device *dev,
368 udc_event_cb_t event_cb, const void *const event_ctx);
369
383int udc_enable(const struct device *dev);
384
396int udc_disable(const struct device *dev);
397
409int udc_shutdown(const struct device *dev);
410
421static inline struct udc_device_caps udc_caps(const struct device *dev)
422{
423 struct udc_data *data = (struct udc_data *)dev->data;
424
425 return data->caps;
426}
427
438enum udc_bus_speed udc_device_speed(const struct device *dev);
439
451static inline int udc_set_address(const struct device *dev, const uint8_t addr)
452{
453 const struct udc_api *api = (const struct udc_api *)dev->api;
454 int ret;
455
456 if (!udc_is_enabled(dev)) {
457 return -EPERM;
458 }
459
460 api->lock(dev);
461 ret = api->set_address(dev, addr);
462 api->unlock(dev);
463
464 return ret;
465}
466
482static inline int udc_test_mode(const struct device *dev,
483 const uint8_t mode, const bool dryrun)
484{
485 const struct udc_api *api = (const struct udc_api *)dev->api;
486 int ret;
487
488 if (!udc_is_enabled(dev)) {
489 return -EPERM;
490 }
491
492 if (api->test_mode != NULL) {
493 api->lock(dev);
494 ret = api->test_mode(dev, mode, dryrun);
495 api->unlock(dev);
496 } else {
497 ret = -ENOTSUP;
498 }
499
500 return ret;
501}
502
513static inline int udc_host_wakeup(const struct device *dev)
514{
515 const struct udc_api *api = (const struct udc_api *)dev->api;
516 int ret;
517
518 if (!udc_is_enabled(dev)) {
519 return -EPERM;
520 }
521
522 api->lock(dev);
523 ret = api->host_wakeup(dev);
524 api->unlock(dev);
525
526 return ret;
527}
528
550int udc_ep_try_config(const struct device *dev,
551 const uint8_t ep,
552 const uint8_t attributes,
553 uint16_t *const mps,
554 const uint8_t interval);
555
574int udc_ep_enable(const struct device *dev,
575 const uint8_t ep,
576 const uint8_t attributes,
577 const uint16_t mps,
578 const uint8_t interval);
579
594int udc_ep_disable(const struct device *dev, const uint8_t ep);
595
609int udc_ep_set_halt(const struct device *dev, const uint8_t ep);
610
624int udc_ep_clear_halt(const struct device *dev, const uint8_t ep);
625
641int udc_ep_enqueue(const struct device *dev, struct net_buf *const buf);
642
651int udc_purge_queues(const struct device *dev);
652
661bool udc_ep_queue_is_empty(const struct device *dev, const uint8_t ep);
662
679int udc_ep_dequeue(const struct device *dev, const uint8_t ep);
680
692struct net_buf *udc_ep_buf_alloc(const struct device *dev,
693 const uint8_t ep,
694 const size_t size);
695
705struct net_buf *udc_ctrl_setup_alloc(const struct device *dev);
706
718struct net_buf *udc_ctrl_data_alloc(const struct device *dev,
719 const uint8_t ep,
720 const size_t size);
721
732struct net_buf *udc_ctrl_status_alloc(const struct device *dev,
733 const uint8_t ep);
734
745int udc_ep_buf_free(const struct device *dev, struct net_buf *const buf);
746
754static inline void udc_ep_buf_set_zlp(struct net_buf *const buf)
755{
756 struct udc_buf_info *bi;
757
758 __ASSERT_NO_MSG(buf);
759 bi = (struct udc_buf_info *)net_buf_user_data(buf);
760 if (USB_EP_DIR_IS_IN(bi->ep)) {
761 bi->zlp = 1;
762 }
763}
764
772static inline struct udc_buf_info *udc_get_buf_info(const struct net_buf *const buf)
773{
774 __ASSERT_NO_MSG(buf);
775 return (struct udc_buf_info *)net_buf_user_data(buf);
776}
777
778
789static inline const void *udc_get_event_ctx(const struct device *dev)
790{
791 struct udc_data *data = (struct udc_data *)dev->data;
792
793 return data->event_ctx;
794}
795
803static inline uint16_t udc_mps_ep_size(const struct udc_ep_config *const cfg)
804{
805 return USB_MPS_EP_SIZE(cfg->mps);
806}
807
811
812#endif /* ZEPHYR_INCLUDE_UDC_H */
long atomic_t
Definition atomic_types.h:15
static _Bool atomic_test_bit(const atomic_t *target, int bit)
Atomically get and test a bit.
Definition atomic.h:129
static void * net_buf_user_data(const struct net_buf *buf)
Get a pointer to the user data of a buffer.
Definition net_buf.h:1684
#define ENOTSUP
Unsupported value.
Definition errno.h:114
#define EPERM
Not owner.
Definition errno.h:39
int udc_init(const struct device *dev, udc_event_cb_t event_cb, const void *const event_ctx)
Initialize USB device controller.
static struct udc_buf_info * udc_get_buf_info(const struct net_buf *const buf)
Get requests metadata.
Definition udc.h:772
static int udc_host_wakeup(const struct device *dev)
Initiate host wakeup procedure.
Definition udc.h:513
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:331
static const void * udc_get_event_ctx(const struct device *dev)
Get pointer to higher layer context.
Definition udc.h:789
bool udc_ep_queue_is_empty(const struct device *dev, const uint8_t ep)
Determines if endpoint queue is empty.
static struct udc_device_caps udc_caps(const struct device *dev)
Get USB device controller capabilities.
Definition udc.h:421
int udc_purge_queues(const struct device *dev)
Purges control endpoint queues after controller shutdown.
static bool udc_is_initialized(const struct device *dev)
Checks whether the controller is initialized.
Definition udc.h:317
static void udc_ep_buf_set_zlp(struct net_buf *const buf)
Set ZLP flag in requests metadata.
Definition udc.h:754
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.
struct net_buf * udc_ctrl_data_alloc(const struct device *dev, const uint8_t ep, const size_t size)
Allocate UDC control transfer data stage buffer.
static uint16_t udc_mps_ep_size(const struct udc_ep_config *const cfg)
Get endpoint size from UDC endpoint configuration.
Definition udc.h:803
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:451
static int udc_test_mode(const struct device *dev, const uint8_t mode, const bool dryrun)
Enable Test Mode.
Definition udc.h:482
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:345
int udc_disable(const struct device *dev)
Disable USB device controller.
struct net_buf * udc_ctrl_setup_alloc(const struct device *dev)
Allocate UDC control transfer SETUP buffer.
enum udc_bus_speed udc_device_speed(const struct device *dev)
Get actual USB device speed.
struct net_buf * udc_ctrl_status_alloc(const struct device *dev, const uint8_t ep)
Allocate UDC control transfer status stage buffer.
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.
#define NULL
Definition iar_missing_defs.h:20
Public kernel APIs.
__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:513
void * data
Address of the device instance private data.
Definition device.h:523
const void * api
Address of the API structure exposed by the device instance.
Definition device.h:519
Kernel FIFO structure.
Definition kernel.h:2895
Kernel mutex structure.
Definition kernel.h:3437
Network buffer representation.
Definition net_buf.h:1015
uint16_t size
Amount of data that this buffer can store.
Definition net_buf.h:1110
UDC driver API This is the mandatory API any USB device controller driver needs to expose with except...
Definition udc.h:229
int(* init)(const struct device *dev)
Definition udc.h:253
int(* ep_dequeue)(const struct device *dev, struct udc_ep_config *const cfg)
Definition udc.h:234
int(* ep_disable)(const struct device *dev, struct udc_ep_config *const cfg)
Definition udc.h:244
void(* lock)(const struct device *dev)
Definition udc.h:255
int(* ep_enable)(const struct device *dev, struct udc_ep_config *const cfg)
Definition udc.h:242
void(* unlock)(const struct device *dev)
Definition udc.h:256
int(* set_address)(const struct device *dev, const uint8_t addr)
Definition udc.h:247
int(* ep_try_config)(const struct device *dev, struct udc_ep_config *const cfg)
Definition udc.h:240
int(* disable)(const struct device *dev)
Definition udc.h:252
int(* ep_clear_halt)(const struct device *dev, struct udc_ep_config *const cfg)
Definition udc.h:238
int(* ep_enqueue)(const struct device *dev, struct udc_ep_config *const cfg, struct net_buf *const buf)
Definition udc.h:231
int(* test_mode)(const struct device *dev, const uint8_t mode, const bool dryrun)
Definition udc.h:249
int(* shutdown)(const struct device *dev)
Definition udc.h:254
int(* ep_set_halt)(const struct device *dev, struct udc_ep_config *const cfg)
Definition udc.h:236
enum udc_bus_speed(* device_speed)(const struct device *dev)
Definition udc.h:230
int(* host_wakeup)(const struct device *dev)
Definition udc.h:246
int(* enable)(const struct device *dev)
Definition udc.h:251
UDC endpoint buffer info.
Definition udc.h:187
uint8_t ep
Endpoint to which request is associated.
Definition udc.h:189
void * owner
Transfer owner (usually pointer to a class instance).
Definition udc.h:203
unsigned int queued
Flag marks request buffer is queued (TBD).
Definition udc.h:201
unsigned int status
Flag marks status stage of setup transfer.
Definition udc.h:195
unsigned int setup
Flag marks setup transfer.
Definition udc.h:191
unsigned int claimed
Flag marks request buffer claimed by the controller (TBD).
Definition udc.h:199
unsigned int data
Flag marks data stage of setup transfer.
Definition udc.h:193
int err
Transfer result, 0 on success, other values on error.
Definition udc.h:205
unsigned int zlp
Flag marks ZLP at the end of a transfer.
Definition udc.h:197
Common UDC driver data structure.
Definition udc.h:278
struct k_mutex mutex
Driver access mutex.
Definition udc.h:284
bool setup_valid
Last cached setup data is valid (8 bytes, CRC OK).
Definition udc.h:298
bool setup_pending
Cached setup data is waiting for USB stack.
Definition udc.h:296
udc_event_cb_t event_cb
Callback to submit an UDC event to higher layer.
Definition udc.h:286
atomic_t status
USB device controller status.
Definition udc.h:290
struct udc_device_caps caps
Controller capabilities.
Definition udc.h:282
const void * event_ctx
Opaque pointer to store higher layer context.
Definition udc.h:288
void * priv
Driver private data.
Definition udc.h:292
struct udc_ep_config * ep_lut[32]
LUT for endpoint management.
Definition udc.h:280
uint8_t setup[8]
Last cached setup data (not necessarily last received setup data).
Definition udc.h:294
USB device controller capabilities.
Definition udc.h:36
uint32_t out_ack
Controller performs Status OUT stage automatically after Data IN.
Definition udc.h:46
enum udc_mps0 mps0
Maximum packet size for control endpoint.
Definition udc.h:52
uint32_t can_detect_vbus
Controller can detect the state change of USB supply VBUS.
Definition udc.h:50
uint32_t rwup
Controller supports USB remote wakeup.
Definition udc.h:40
uint32_t hs
USB high speed capable controller.
Definition udc.h:38
uint32_t addr_before_status
Controller expects device address to be set before status stage.
Definition udc.h:48
USB device controller endpoint capabilities.
Definition udc.h:72
uint32_t iso
ISO transfer capable endpoint.
Definition udc.h:82
uint32_t in
IN transfer capable endpoint.
Definition udc.h:86
uint32_t mps
Maximum packet size of the endpoint buffer.
Definition udc.h:74
uint32_t bulk
Bulk transfer capable endpoint.
Definition udc.h:80
uint32_t interrupt
Interrupt transfer capable endpoint.
Definition udc.h:78
uint32_t control
Control transfer capable endpoint (for completeness).
Definition udc.h:76
uint32_t high_bandwidth
High-Bandwidth (interrupt or iso) capable endpoint.
Definition udc.h:84
uint32_t out
OUT transfer capable endpoint.
Definition udc.h:88
USB device controller endpoint configuration.
Definition udc.h:114
uint8_t interval
Polling interval.
Definition udc.h:128
struct udc_ep_caps caps
Endpoint capabilities.
Definition udc.h:118
struct k_fifo fifo
Endpoint requests FIFO.
Definition udc.h:116
uint8_t addr
Endpoint address.
Definition udc.h:122
uint8_t attributes
Endpoint attributes.
Definition udc.h:124
struct udc_ep_stat stat
Endpoint status.
Definition udc.h:120
uint16_t mps
Maximum packet size.
Definition udc.h:126
USB device controller endpoint status.
Definition udc.h:94
uint32_t odd
If double buffering is supported, last used buffer is odd.
Definition udc.h:102
uint32_t data1
Last submitted PID is DATA1.
Definition udc.h:100
uint32_t enabled
Endpoint is enabled.
Definition udc.h:96
uint32_t busy
Endpoint is busy.
Definition udc.h:104
uint32_t halted
Endpoint is halted (returning STALL PID).
Definition udc.h:98
USB device controller event.
Definition udc.h:165
int status
Event status value, if any.
Definition udc.h:172
enum udc_event_type type
Event type.
Definition udc.h:167
const struct device * dev
Pointer to device struct.
Definition udc.h:177
struct net_buf * buf
Pointer to request used only for UDC_EVT_EP_REQUEST.
Definition udc.h:174
uint32_t value
Event value.
Definition udc.h:170
udc_event_type
USB device controller event types.
Definition udc.h:135
@ UDC_EVT_VBUS_READY
VBUS ready event.
Definition udc.h:137
@ UDC_EVT_RESUME
Device resume event.
Definition udc.h:141
@ UDC_EVT_SUSPEND
Device suspended event.
Definition udc.h:143
@ UDC_EVT_VBUS_REMOVED
VBUS removed event.
Definition udc.h:139
@ UDC_EVT_EP_REQUEST
Endpoint request result event.
Definition udc.h:149
@ UDC_EVT_ERROR
Non-correctable error event, requires attention from higher levels or application.
Definition udc.h:154
@ UDC_EVT_RESET
Port reset detected.
Definition udc.h:145
@ UDC_EVT_SOF
Start of Frame event.
Definition udc.h:147
udc_bus_speed
USB device actual speed.
Definition udc.h:58
@ UDC_BUS_SPEED_SS
Device is connected to a super speed bus.
Definition udc.h:66
@ UDC_BUS_SPEED_FS
Device is connected to a full speed bus.
Definition udc.h:62
@ UDC_BUS_UNKNOWN
Device is probably not connected.
Definition udc.h:60
@ UDC_BUS_SPEED_HS
Device is connected to a high speed bus.
Definition udc.h:64
#define UDC_STATUS_INITIALIZED
Controller is initialized by udc_init() and can generate the VBUS events, if capable,...
Definition udc.h:263
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:220
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
Controller is suspended by the host.
Definition udc.h:270
#define UDC_STATUS_ENABLED
Controller is enabled and all API functions are available, controller is recognizable by host.
Definition udc.h:268
Buffers for USB device support.
USB Chapter 9 structures and definitions.
#define USB_EP_DIR_IS_IN(ep)
Determine if an endpoint address refers to an IN endpoint.
Definition usb_ch9.h:628
#define USB_MPS_EP_SIZE(mps)
Get endpoint size field from Max Packet Size value.
Definition usb_ch9.h:705