Loading...
Searching...
No Matches
usbdev.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2018 Koen Zandberg <koen@bergzand.net>
3 * SPDX-License-Identifier: LGPL-2.1-only
4 */
5
6#pragma once
7
74
75#include <stdbool.h>
76#include <stdint.h>
77#include <stddef.h>
78
79#include "assert.h"
80#include "periph_conf.h"
81#include "usb.h"
82#include "usb/usbopt.h"
83
84#ifdef __cplusplus
85extern "C" {
86#endif
87
91typedef struct usbdev usbdev_t;
92
96typedef struct usbdev_ep usbdev_ep_t;
97
103#ifndef USBDEV_CPU_DMA_REQUIREMENTS
104#define USBDEV_CPU_DMA_REQUIREMENTS
105#endif
106
123#define usbdev_ep_buf_t USBDEV_CPU_DMA_REQUIREMENTS uint8_t
124
135#ifndef USBDEV_CPU_SET_ADDR_AFTER_STATUS
136#define USBDEV_CPU_SET_ADDR_AFTER_STATUS 1
137#endif
138
145#ifndef USBDEV_NUM_ENDPOINTS
146#define USBDEV_NUM_ENDPOINTS 8
147#endif
148
223
231
240
252
263
270typedef struct usbdev_driver {
271
280
295 usbdev_ep_t *(*new_ep)(usbdev_t *dev, usb_ep_type_t type, usb_ep_dir_t dir, size_t size);
296
309 void *value, size_t max_len);
310
323 const void *value, size_t value_len);
324
333 void (*esr)(usbdev_t *dev);
334
343
352 void (*ep_init)(usbdev_ep_t *ep);
353
368 void (*ep_stall)(usbdev_ep_t *ep, bool enable);
369
382 void *value, size_t max_len);
383
396 const void *value, size_t value_len);
397
406 void (*ep_esr)(usbdev_ep_t *ep);
407
424 int (*xmit)(usbdev_ep_t *ep, uint8_t *buf, size_t len);
426
433
442
452static inline void usbdev_init(usbdev_t *dev)
453{
454 assert(dev);
455 dev->driver->init(dev);
456}
457
474 usb_ep_dir_t dir, size_t size)
475{
476 assert(dev);
477 return dev->driver->new_ep(dev, type, dir, size);
478}
479
495static inline int usbdev_get(usbdev_t *dev, usbopt_t opt,
496 void *value, size_t max_len)
497{
498 assert(dev);
499 return dev->driver->get(dev, opt, value, max_len);
500}
501
517static inline int usbdev_set(usbdev_t *dev, usbopt_t opt,
518 const void *value, size_t value_len)
519{
520 assert(dev);
521 return dev->driver->set(dev, opt, value, value_len);
522}
523
533static inline void usbdev_esr(usbdev_t *dev)
534{
535 assert(dev);
536 dev->driver->esr(dev);
537}
538
552static inline void usbdev_ep0_stall(usbdev_t *dev)
553{
554 assert(dev);
555 dev->driver->ep0_stall(dev);
556}
557
568static inline void usbdev_ep_init(usbdev_ep_t *ep)
569{
570 assert(ep);
571 assert(ep->dev);
572 ep->dev->driver->ep_init(ep);
573}
574
588static inline void usbdev_ep_stall(usbdev_ep_t *ep, bool enable)
589{
590 assert(ep);
591 assert(ep->dev);
592 ep->dev->driver->ep_stall(ep, enable);
593}
594
611static inline int usbdev_ep_get(usbdev_ep_t *ep, usbopt_ep_t opt,
612 void *value, size_t max_len)
613{
614 assert(ep);
615 assert(ep->dev);
616 return ep->dev->driver->ep_get(ep, opt, value, max_len);
617}
618
635static inline int usbdev_ep_set(usbdev_ep_t *ep, usbopt_ep_t opt,
636 const void *value, size_t value_len)
637{
638 assert(ep);
639 assert(ep->dev);
640 return ep->dev->driver->ep_set(ep, opt, value, value_len);
641}
642
653static inline void usbdev_ep_esr(usbdev_ep_t *ep)
654{
655 assert(ep);
656 assert(ep->dev);
657 ep->dev->driver->ep_esr(ep);
658}
659
676static inline int usbdev_ep_xmit(usbdev_ep_t *ep, uint8_t *buf, size_t len)
677{
678 assert(ep);
679 assert(ep->dev);
680 return ep->dev->driver->xmit(ep, buf, len);
681}
682
683#ifdef __cplusplus
684}
685#endif
686
POSIX.1-2008 compliant version of the assert macro.
#define assert(cond)
abort the program if assertion is false
Definition assert.h:143
void usbdev_init_lowlevel(void)
Low level USB peripheral driver initialization.
static int usbdev_ep_set(usbdev_ep_t *ep, usbopt_ep_t opt, const void *value, size_t value_len)
Set an option value for a given usb device endpoint.
Definition usbdev.h:635
static usbdev_ep_t * usbdev_new_ep(usbdev_t *dev, usb_ep_type_t type, usb_ep_dir_t dir, size_t size)
Retrieve an USB endpoint of the specified type.
Definition usbdev.h:473
static void usbdev_init(usbdev_t *dev)
Initialize the USB peripheral device.
Definition usbdev.h:452
struct usbdev_ep usbdev_ep_t
usbdev_ep_t forward declaration
Definition usbdev.h:96
usbdev_event_t
List of event types that can be send from the device driver to the upper layer.
Definition usbdev.h:153
static int usbdev_ep_get(usbdev_ep_t *ep, usbopt_ep_t opt, void *value, size_t max_len)
Get an option value from a given usb device endpoint.
Definition usbdev.h:611
static void usbdev_ep_init(usbdev_ep_t *ep)
Initialize the USB endpoint.
Definition usbdev.h:568
static int usbdev_set(usbdev_t *dev, usbopt_t opt, const void *value, size_t value_len)
Set an option value for a given usb device.
Definition usbdev.h:517
static int usbdev_get(usbdev_t *dev, usbopt_t opt, void *value, size_t max_len)
Get an option value from a given usb device.
Definition usbdev.h:495
static void usbdev_ep0_stall(usbdev_t *dev)
Stall both OUT and IN packets on endpoint 0 until a setup packet is received.
Definition usbdev.h:552
usbdev_t * usbdev_get_ctx(unsigned num)
Retrieve usbdev context from the peripheral.
static void usbdev_ep_stall(usbdev_ep_t *ep, bool enable)
Enable or disable the stall condition on the USB endpoint.
Definition usbdev.h:588
void(* usbdev_ep_event_cb_t)(usbdev_ep_t *ep, usbdev_event_t event)
Event callback for signaling endpoint events to upper layers.
Definition usbdev.h:238
void(* usbdev_event_cb_t)(usbdev_t *usbdev, usbdev_event_t event)
Event callback for signaling usbdev event to upper layers.
Definition usbdev.h:230
struct usbdev usbdev_t
usbdev_t forward declaration
Definition usbdev.h:91
static void usbdev_esr(usbdev_t *dev)
a driver's user-space event service handler
Definition usbdev.h:533
static int usbdev_ep_xmit(usbdev_ep_t *ep, uint8_t *buf, size_t len)
Submit a buffer for a USB endpoint transmission.
Definition usbdev.h:676
struct usbdev_driver usbdev_driver_t
usbdev driver functions
static void usbdev_ep_esr(usbdev_ep_t *ep)
an endpoint's user-space event handler
Definition usbdev.h:653
@ USBDEV_EVENT_SUSPEND
USB suspend condition active.
Definition usbdev.h:197
@ USBDEV_EVENT_TR_STALL
Transaction stall event.
Definition usbdev.h:219
@ USBDEV_EVENT_ESR
Driver needs it's ESR (event service routine) handled.
Definition usbdev.h:157
@ USBDEV_EVENT_HOST_DISCONNECT
Host disconnected from the device.
Definition usbdev.h:173
@ USBDEV_EVENT_RESUME
USB suspend condition no longer active.
Definition usbdev.h:202
@ USBDEV_EVENT_HOST_CONNECT
Host connection detected.
Definition usbdev.h:165
@ USBDEV_EVENT_TR_COMPLETE
Transaction completed event.
Definition usbdev.h:211
@ USBDEV_EVENT_RESET
Line reset occurred.
Definition usbdev.h:185
@ USBDEV_EVENT_SOF
Start of Frame received.
Definition usbdev.h:192
usbopt_t
List of configuration settings for USB peripherals.
Definition usbopt.h:37
usbopt_ep_t
List of configuration settings for USB peripheral endpoints.
Definition usbopt.h:91
usb_ep_dir_t
USB endpoint directions.
Definition usb.h:245
usb_ep_type_t
USB endpoint types.
Definition usb.h:234
event structure
Definition event.h:145
usbdev driver functions
Definition usbdev.h:270
int(* set)(usbdev_t *usbdev, usbopt_t opt, const void *value, size_t value_len)
Set an option value for a given usb device.
Definition usbdev.h:322
int(* ep_set)(usbdev_ep_t *ep, usbopt_ep_t opt, const void *value, size_t value_len)
Set an option value for a given usb device endpoint.
Definition usbdev.h:395
void(* ep_init)(usbdev_ep_t *ep)
Initialize the USB endpoint.
Definition usbdev.h:352
void(* ep_stall)(usbdev_ep_t *ep, bool enable)
Enable or disable the stall condition on the USB endpoint.
Definition usbdev.h:368
int(* xmit)(usbdev_ep_t *ep, uint8_t *buf, size_t len)
Transmit a data buffer.
Definition usbdev.h:424
void(* init)(usbdev_t *usbdev)
Initialize the USB peripheral device.
Definition usbdev.h:279
void(* esr)(usbdev_t *dev)
a driver's user-space event service handler
Definition usbdev.h:333
void(* ep_esr)(usbdev_ep_t *ep)
an endpoint's user-space event handler
Definition usbdev.h:406
void(* ep0_stall)(usbdev_t *usbdev)
Stall both OUT and IN packets on endpoint 0 until a setup packet is received.
Definition usbdev.h:342
int(* ep_get)(usbdev_ep_t *ep, usbopt_ep_t opt, void *value, size_t max_len)
Get an option value from a given usb device endpoint.
Definition usbdev.h:381
int(* get)(usbdev_t *usbdev, usbopt_t opt, void *value, size_t max_len)
Get an option value from a given usb device.
Definition usbdev.h:308
usbdev endpoint descriptor
Definition usbdev.h:256
usbdev_t * dev
USB device this endpoint belongs to.
Definition usbdev.h:257
uint8_t num
Endpoint number.
Definition usbdev.h:261
size_t len
Endpoint configured max transfer size in bytes.
Definition usbdev.h:258
usb_ep_dir_t dir
Endpoint direction.
Definition usbdev.h:259
usb_ep_type_t type
Endpoint type.
Definition usbdev.h:260
usbdev device descriptor
Definition usbdev.h:244
usbdev_ep_event_cb_t epcb
Endpoint event callback for upper layer.
Definition usbdev.h:248
void * context
Ptr to the thread context.
Definition usbdev.h:250
usbdev_event_cb_t cb
Event callback supplied by upper layer.
Definition usbdev.h:246
const struct usbdev_driver * driver
usbdev driver struct
Definition usbdev.h:245
Definition of global compile time configuration options.
Definition of global USB peripheral and USB peripheral endpoint configuration options.