14#ifndef ZEPHYR_INCLUDE_USBD_H_
15#define ZEPHYR_INCLUDE_USBD_H_
48#define USB_BSTRING_LENGTH(s) (sizeof(s) * 2 - 2)
60#define USB_STRING_DESCRIPTOR_LENGTH(s) (sizeof(s) * 2)
65enum usbd_str_desc_utype {
67 USBD_DUT_STRING_MANUFACTURER,
68 USBD_DUT_STRING_PRODUCT,
69 USBD_DUT_STRING_SERIAL_NUMBER,
70 USBD_DUT_STRING_CONFIG,
71 USBD_DUT_STRING_INTERFACE,
74enum usbd_bos_desc_utype {
86 enum usbd_str_desc_utype
utype : 8;
98 enum usbd_bos_desc_utype
utype : 8;
142#define USBD_NUMOF_INTERFACES_MAX 16U
263#define USBD_CCTX_REGISTERED 0
282 const struct net_buf *
const buf);
343struct usbd_class_node {
414#define USBD_DEVICE_DEFINE(device_name, udc_dev, vid, pid) \
415 static struct usb_device_descriptor \
416 fs_desc_##device_name = { \
417 .bLength = sizeof(struct usb_device_descriptor), \
418 .bDescriptorType = USB_DESC_DEVICE, \
419 .bcdUSB = sys_cpu_to_le16(USB_SRN_2_0), \
420 .bDeviceClass = USB_BCC_MISCELLANEOUS, \
421 .bDeviceSubClass = 2, \
422 .bDeviceProtocol = 1, \
423 .bMaxPacketSize0 = USB_CONTROL_EP_MPS, \
426 .bcdDevice = sys_cpu_to_le16(USB_BCD_DRN), \
427 .iManufacturer = 0, \
429 .iSerialNumber = 0, \
430 .bNumConfigurations = 0, \
432 static struct usb_device_descriptor \
433 hs_desc_##device_name = { \
434 .bLength = sizeof(struct usb_device_descriptor), \
435 .bDescriptorType = USB_DESC_DEVICE, \
436 .bcdUSB = sys_cpu_to_le16(USB_SRN_2_0), \
437 .bDeviceClass = USB_BCC_MISCELLANEOUS, \
438 .bDeviceSubClass = 2, \
439 .bDeviceProtocol = 1, \
440 .bMaxPacketSize0 = 64, \
443 .bcdDevice = sys_cpu_to_le16(USB_BCD_DRN), \
444 .iManufacturer = 0, \
446 .iSerialNumber = 0, \
447 .bNumConfigurations = 0, \
449 static STRUCT_SECTION_ITERABLE(usbd_context, device_name) = { \
450 .name = STRINGIFY(device_name), \
452 .fs_desc = &fs_desc_##device_name, \
453 .hs_desc = &hs_desc_##device_name, \
473#define USBD_CONFIGURATION_DEFINE(name, attrib, power, desc_nd) \
474 static struct usb_cfg_descriptor \
475 cfg_desc_##name = { \
476 .bLength = sizeof(struct usb_cfg_descriptor), \
477 .bDescriptorType = USB_DESC_CONFIGURATION, \
479 .bNumInterfaces = 0, \
480 .bConfigurationValue = 1, \
481 .iConfiguration = 0, \
482 .bmAttributes = USB_SCD_RESERVED | (attrib), \
483 .bMaxPower = (power), \
485 BUILD_ASSERT((power) < 256, "Too much power"); \
486 static struct usbd_config_node name = { \
487 .desc = &cfg_desc_##name, \
488 .str_desc_nd = desc_nd, \
504#define USBD_DESC_LANG_DEFINE(name) \
505 static uint16_t langid_##name = sys_cpu_to_le16(0x0409); \
506 static struct usbd_desc_node name = { \
509 .utype = USBD_DUT_STRING_LANG, \
511 .ptr = &langid_##name, \
512 .bLength = sizeof(struct usb_string_descriptor), \
513 .bDescriptorType = USB_DESC_STRING, \
527#define USBD_DESC_STRING_DEFINE(d_name, d_string, d_utype) \
528 static uint8_t ascii_##d_name[USB_BSTRING_LENGTH(d_string)] = d_string; \
529 static struct usbd_desc_node d_name = { \
534 .ptr = &ascii_##d_name, \
535 .bLength = USB_STRING_DESCRIPTOR_LENGTH(d_string), \
536 .bDescriptorType = USB_DESC_STRING, \
550#define USBD_DESC_MANUFACTURER_DEFINE(d_name, d_string) \
551 USBD_DESC_STRING_DEFINE(d_name, d_string, USBD_DUT_STRING_MANUFACTURER)
564#define USBD_DESC_PRODUCT_DEFINE(d_name, d_string) \
565 USBD_DESC_STRING_DEFINE(d_name, d_string, USBD_DUT_STRING_PRODUCT)
577#define USBD_DESC_SERIAL_NUMBER_DEFINE(d_name) \
578 static struct usbd_desc_node d_name = { \
580 .utype = USBD_DUT_STRING_SERIAL_NUMBER, \
582 .use_hwinfo = true, \
584 .bDescriptorType = USB_DESC_STRING, \
596#define USBD_DESC_CONFIG_DEFINE(d_name, d_string) \
597 USBD_DESC_STRING_DEFINE(d_name, d_string, USBD_DUT_STRING_CONFIG)
609#define USBD_DESC_BOS_DEFINE(name, len, subset) \
610 static struct usbd_desc_node name = { \
612 .utype = USBD_DUT_BOS_NONE, \
616 .bDescriptorType = USB_DESC_BOS, \
630#define USBD_DEFINE_CLASS(class_name, class_api, class_priv, class_v_reqs) \
631 static struct usbd_class_data class_name = { \
632 .name = STRINGIFY(class_name), \
634 .v_reqs = class_v_reqs, \
635 .priv = class_priv, \
637 static STRUCT_SECTION_ITERABLE_ALTERNATE( \
638 usbd_class_fs, usbd_class_node, class_name##_fs) = { \
639 .c_data = &class_name, \
641 static STRUCT_SECTION_ITERABLE_ALTERNATE( \
642 usbd_class_hs, usbd_class_node, class_name##_hs) = { \
643 .c_data = &class_name, \
651#define VENDOR_REQ_DEFINE(_reqs, _len) \
653 .reqs = (const uint8_t *)(_reqs), \
661#define USBD_VENDOR_REQ(_reqs...) \
662 VENDOR_REQ_DEFINE(((uint8_t []) { _reqs }), \
663 sizeof((uint8_t []) { _reqs }))
1045 const uint8_t cfg,
const bool enable);
1059 const uint8_t cfg,
const bool enable);
long atomic_t
Definition atomic_types.h:15
struct _dnode sys_dnode_t
Doubly-linked list node structure.
Definition dlist.h:54
struct _dnode sys_dlist_t
Doubly-linked list structure.
Definition dlist.h:50
struct _slist sys_slist_t
Single-linked list structure.
Definition slist.h:49
struct _snode sys_snode_t
Single-linked list node structure.
Definition slist.h:39
int usbd_ep_clear_halt(struct usbd_context *uds_ctx, uint8_t ep)
Clear endpoint halt.
int usbd_device_set_vid(struct usbd_context *const uds_ctx, const uint16_t vid)
Set USB device descriptor value idVendor.
int usbd_ep_dequeue(struct usbd_context *uds_ctx, const uint8_t ep)
Remove all USB device controller requests from endpoint queue.
int usbd_ep_set_halt(struct usbd_context *uds_ctx, uint8_t ep)
Halt endpoint.
int usbd_enable(struct usbd_context *uds_ctx)
Enable the USB device support and registered class instances.
int usbd_unregister_class(struct usbd_context *uds_ctx, const char *name, const enum usbd_speed speed, uint8_t cfg)
Unregister an USB class instance.
int usbd_unregister_all_classes(struct usbd_context *uds_ctx, const enum usbd_speed speed, uint8_t cfg)
Unregister all available USB class instances.
int usbd_config_attrib_rwup(struct usbd_context *const uds_ctx, const enum usbd_speed speed, const uint8_t cfg, const bool enable)
Setup USB device configuration attribute Remote Wakeup.
void(* usbd_msg_cb_t)(struct usbd_context *const ctx, const struct usbd_msg *const msg)
Callback type definition for USB device message delivery.
Definition usbd.h:218
static void * usbd_class_get_private(const struct usbd_class_data *const c_data)
Get class implementation private data.
Definition usbd.h:389
int usbd_msg_register_cb(struct usbd_context *const uds_ctx, const usbd_msg_cb_t cb)
Register USB notification message callback.
usbd_speed
USB device speed.
Definition usbd.h:180
void usbd_remove_descriptor(struct usbd_desc_node *const desc_nd)
Remove USB string descriptor.
int usbd_add_descriptor(struct usbd_context *uds_ctx, struct usbd_desc_node *dn)
Add common USB descriptor.
int usbd_wakeup_request(struct usbd_context *uds_ctx)
Initiate the USB remote wakeup (TBD)
int usbd_shutdown(struct usbd_context *const uds_ctx)
Shutdown the USB device support.
int usbd_register_all_classes(struct usbd_context *uds_ctx, const enum usbd_speed speed, uint8_t cfg)
Register all available USB class instances.
int usbd_device_set_pid(struct usbd_context *const uds_ctx, const uint16_t pid)
Set USB device descriptor value idProduct.
int usbd_register_class(struct usbd_context *uds_ctx, const char *name, const enum usbd_speed speed, uint8_t cfg)
Register an USB class instance.
int usbd_config_maxpower(struct usbd_context *const uds_ctx, const enum usbd_speed speed, const uint8_t cfg, const uint8_t power)
Setup USB device configuration power consumption.
bool usbd_can_detect_vbus(struct usbd_context *const uds_ctx)
Check that the controller can detect the VBUS state change.
int usbd_add_configuration(struct usbd_context *uds_ctx, const enum usbd_speed speed, struct usbd_config_node *cd)
Add a USB device configuration.
bool usbd_is_suspended(struct usbd_context *uds_ctx)
Checks whether the USB device controller is suspended.
struct net_buf * usbd_ep_buf_alloc(const struct usbd_class_data *const c_data, const uint8_t ep, const size_t size)
Allocate buffer for USB device request.
int usbd_init(struct usbd_context *uds_ctx)
Initialize USB device.
int usbd_device_set_code_triple(struct usbd_context *const uds_ctx, const enum usbd_speed speed, const uint8_t base_class, const uint8_t subclass, const uint8_t protocol)
Set USB device descriptor code triple Base Class, SubClass, and Protocol.
int usbd_ep_buf_free(struct usbd_context *uds_ctx, struct net_buf *buf)
Free USB device request buffer.
int usbd_config_attrib_self(struct usbd_context *const uds_ctx, const enum usbd_speed speed, const uint8_t cfg, const bool enable)
Setup USB device configuration attribute Self-powered.
bool usbd_ep_is_halted(struct usbd_context *uds_ctx, uint8_t ep)
Checks whether the endpoint is halted.
usbd_ch9_state
USB device support middle layer runtime state.
Definition usbd.h:150
int usbd_ep_ctrl_enqueue(struct usbd_context *const uds_ctx, struct net_buf *const buf)
Queue USB device control request.
int usbd_disable(struct usbd_context *uds_ctx)
Disable the USB device support.
enum usbd_speed usbd_caps_speed(const struct usbd_context *const uds_ctx)
Get highest speed supported by the controller.
int usbd_ep_enqueue(const struct usbd_class_data *const c_data, struct net_buf *const buf)
Queue USB device request.
uint8_t usbd_str_desc_get_idx(const struct usbd_desc_node *const desc_nd)
Get USB string descriptor index from descriptor node.
enum usbd_speed usbd_bus_speed(const struct usbd_context *const uds_ctx)
Get actual device speed.
int usbd_device_set_bcd_usb(struct usbd_context *const uds_ctx, const enum usbd_speed speed, const uint16_t bcd)
Set USB device descriptor value bcdUSB.
#define USBD_NUMOF_INTERFACES_MAX
Definition usbd.h:142
static struct usbd_context * usbd_class_get_ctx(const struct usbd_class_data *const c_data)
Get the USB device runtime context under which the class is registered.
Definition usbd.h:374
int usbd_device_set_bcd_device(struct usbd_context *const uds_ctx, const uint16_t bcd)
Set USB device descriptor value bcdDevice.
@ USBD_SPEED_SS
Device supports or is connected to a super speed bus.
Definition usbd.h:186
@ USBD_SPEED_FS
Device supports or is connected to a full speed bus.
Definition usbd.h:182
@ USBD_SPEED_HS
Device supports or is connected to a high speed bus
Definition usbd.h:184
@ USBD_STATE_CONFIGURED
Definition usbd.h:153
@ USBD_STATE_DEFAULT
Definition usbd.h:151
@ USBD_STATE_ADDRESS
Definition usbd.h:152
state
Definition parser_state.h:29
__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:403
Mutex Structure.
Definition kernel.h:2994
Network buffer representation.
Definition net_buf.h:1006
uint16_t size
Amount of data that this buffer can store.
Definition net_buf.h:1038
USB Setup Data packet defined in spec.
Definition usb_ch9.h:40
USBD BOS Device Capability descriptor data.
Definition usbd.h:96
enum usbd_bos_desc_utype utype
Descriptor usage type (not bDescriptorType)
Definition usbd.h:98
Vendor Requests Table.
Definition usbd.h:255
const uint8_t * reqs
Array of vendor requests supported by the class.
Definition usbd.h:257
uint8_t len
Length of the array.
Definition usbd.h:259
USB device support middle layer runtime data.
Definition usbd.h:160
int ctrl_type
Control type, internally used for stage verification.
Definition usbd.h:164
uint8_t configuration
USB device stack selected configuration.
Definition usbd.h:170
uint32_t ep_halt
Halted endpoints bitmap.
Definition usbd.h:168
bool post_status
Post status stage work required, e.g.
Definition usbd.h:172
enum usbd_ch9_state state
Protocol state of the USB device stack.
Definition usbd.h:166
struct usb_setup_packet setup
Setup packet, up-to-date for the respective control request.
Definition usbd.h:162
uint8_t alternate[16U]
Array to track interfaces alternate settings.
Definition usbd.h:174
USB device support class instance API.
Definition usbd.h:270
void(* feature_halt)(struct usbd_class_data *const c_data, uint8_t ep, bool halted)
Feature halt state update handler.
Definition usbd.h:272
void(* update)(struct usbd_class_data *const c_data, uint8_t iface, uint8_t alternate)
Configuration update handler.
Definition usbd.h:276
void(* sof)(struct usbd_class_data *const c_data)
Start of Frame.
Definition usbd.h:300
void(* suspended)(struct usbd_class_data *const c_data)
USB power management handler suspended.
Definition usbd.h:294
void(* shutdown)(struct usbd_class_data *const c_data)
Shutdown of the class implementation.
Definition usbd.h:312
int(* request)(struct usbd_class_data *const c_data, struct net_buf *buf, int err)
Endpoint request completion event handler.
Definition usbd.h:290
int(* init)(struct usbd_class_data *const c_data)
Initialization of the class implementation.
Definition usbd.h:309
int(* control_to_dev)(struct usbd_class_data *const c_data, const struct usb_setup_packet *const setup, const struct net_buf *const buf)
USB control request handler to device.
Definition usbd.h:280
void(* enable)(struct usbd_class_data *const c_data)
Class associated configuration is selected.
Definition usbd.h:303
int(* control_to_host)(struct usbd_class_data *const c_data, const struct usb_setup_packet *const setup, struct net_buf *const buf)
USB control request handler to host.
Definition usbd.h:285
void(* resumed)(struct usbd_class_data *const c_data)
USB power management handler resumed.
Definition usbd.h:297
void(* disable)(struct usbd_class_data *const c_data)
Class associated configuration is disabled.
Definition usbd.h:306
USB device support class data.
Definition usbd.h:322
void * priv
Pointer to private data.
Definition usbd.h:332
struct usbd_context * uds_ctx
Pointer to USB device stack context structure.
Definition usbd.h:326
const struct usbd_cctx_vendor_req * v_reqs
Supported vendor request table, can be NULL.
Definition usbd.h:330
const struct usbd_class_api * api
Pointer to device support class API.
Definition usbd.h:328
const char * name
Name of the USB device class instance.
Definition usbd.h:324
Device configuration node.
Definition usbd.h:130
sys_snode_t node
slist node struct
Definition usbd.h:132
sys_slist_t class_list
List of registered classes (functions)
Definition usbd.h:138
struct usbd_desc_node * str_desc_nd
Optional pointer to string descriptor node.
Definition usbd.h:136
void * desc
Pointer to configuration descriptor.
Definition usbd.h:134
USB device support runtime context.
Definition usbd.h:227
void * fs_desc
Pointer to Full-Speed device descriptor.
Definition usbd.h:247
void * hs_desc
Pointer to High-Speed device descriptor.
Definition usbd.h:249
usbd_msg_cb_t msg_cb
Notification message recipient callback.
Definition usbd.h:235
struct usbd_status status
Status of the USB device support.
Definition usbd.h:245
sys_slist_t hs_configs
slist to manage High-Speed device configurations
Definition usbd.h:243
struct usbd_ch9_data ch9_data
Middle layer runtime data.
Definition usbd.h:237
const struct device * dev
Pointer to UDC device.
Definition usbd.h:233
sys_slist_t fs_configs
slist to manage Full-Speed device configurations
Definition usbd.h:241
struct k_mutex mutex
Access mutex.
Definition usbd.h:231
const char * name
Name of the USB device.
Definition usbd.h:229
sys_dlist_t descriptors
slist to manage descriptors like string, BOS
Definition usbd.h:239
Descriptor node.
Definition usbd.h:107
uint8_t bDescriptorType
Descriptor type.
Definition usbd.h:119
sys_dnode_t node
slist node struct
Definition usbd.h:109
const void *const ptr
Opaque pointer to a descriptor payload.
Definition usbd.h:115
uint8_t bLength
Descriptor size in bytes.
Definition usbd.h:117
struct usbd_str_desc_data str
Definition usbd.h:111
struct usbd_bos_desc_data bos
Definition usbd.h:112
USB device message.
Definition usbd_msg.h:80
USB device support status.
Definition usbd.h:192
unsigned int rwup
USB remote wake-up feature is enabled.
Definition usbd.h:200
unsigned int enabled
USB device support is enabled.
Definition usbd.h:196
enum usbd_speed speed
USB device speed.
Definition usbd.h:202
unsigned int initialized
USB device support is initialized.
Definition usbd.h:194
unsigned int suspended
USB device is suspended.
Definition usbd.h:198
Used internally to keep descriptors in order.
Definition usbd.h:82
uint8_t idx
Descriptor index, required for string descriptors.
Definition usbd.h:84
enum usbd_str_desc_utype utype
Descriptor usage type (not bDescriptorType)
Definition usbd.h:86
unsigned int use_hwinfo
Device stack obtains SerialNumber using the HWINFO API.
Definition usbd.h:90
unsigned int ascii7
The string descriptor is in ASCII7 format.
Definition usbd.h:88
Buffers for USB device support.
USB Chapter 9 structures and definitions.
USB support message types and structure.