Zephyr API Documentation 4.5.0-rc1
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
usbd.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
13
14#ifndef ZEPHYR_INCLUDE_USBD_H_
15#define ZEPHYR_INCLUDE_USBD_H_
16
17#include <zephyr/device.h>
18#include <zephyr/usb/bos.h>
19#include <zephyr/usb/usb_ch9.h>
20#include <zephyr/usb/usbd_msg.h>
23#include <zephyr/sys/slist.h>
24#include <zephyr/logging/log.h>
26
27#ifdef __cplusplus
28extern "C" {
29#endif
30
39
40/* 1 if USB device stack is compiled with High-Speed support */
41#define USBD_SUPPORTS_HIGH_SPEED IS_EQ(CONFIG_USBD_MAX_SPEED, 1)
42
43/* Maximum bulk max packet size the stack supports */
44#define USBD_MAX_BULK_MPS COND_CODE_1(USBD_SUPPORTS_HIGH_SPEED, (512), (64))
45
46/*
47 * The length of the string descriptor (bLength) is calculated from the
48 * size of the two octets bLength and bDescriptorType plus the
49 * length of the UTF16LE string:
50 *
51 * bLength = 2 + bString_length
52 * bLength = 2 + sizeof(initializer_string) * 2 - 2
53 * bLength = sizeof(initializer_string) * 2
54 * Use this macro to determine the bLength of the string descriptor.
55 */
56#define USB_STRING_DESCRIPTOR_LENGTH(s) (sizeof(s) * 2)
57
58struct usbd_context;
59
63enum usbd_str_desc_utype {
64 USBD_DUT_STRING_LANG,
65 USBD_DUT_STRING_MANUFACTURER,
66 USBD_DUT_STRING_PRODUCT,
67 USBD_DUT_STRING_SERIAL_NUMBER,
68 USBD_DUT_STRING_CONFIG,
69 USBD_DUT_STRING_INTERFACE,
70};
71
72enum usbd_bos_desc_utype {
73 USBD_DUT_BOS_NONE,
74 USBD_DUT_BOS_VREQ,
75};
77
85 enum usbd_str_desc_utype utype : 8;
87 unsigned int ascii7 : 1;
89 unsigned int use_hwinfo : 1;
90};
91
137 struct net_buf *(*to_host)(const struct usbd_context *const ctx,
138 const struct usb_setup_packet *const setup);
150 int (*to_dev)(const struct usbd_context *const ctx,
151 const struct usb_setup_packet *const setup,
152 const struct net_buf *const buf);
153};
154
160 enum usbd_bos_desc_utype utype : 8;
161 union {
162 struct usbd_vreq_node *const vreq_nd;
163 };
164};
165
186
205
206/* TODO: Kconfig option USBD_NUMOF_INTERFACES_MAX? */
207#define USBD_NUMOF_INTERFACES_MAX 16U
208
220
221
239
251
257 unsigned int initialized : 1;
259 unsigned int enabled : 1;
261 unsigned int suspended : 1;
263 unsigned int rwup : 1;
265 unsigned int self_powered : 1;
268};
269
285typedef void (*usbd_msg_cb_t)(struct usbd_context *const ctx,
286 const struct usbd_msg *const msg);
287
326
336
338#define USBD_CCTX_REGISTERED 0
339
340struct usbd_class_data;
341
347 void (*feature_halt)(struct usbd_class_data *const c_data,
348 uint8_t ep, bool halted);
349
351 void (*update)(struct usbd_class_data *const c_data,
352 uint8_t iface, uint8_t alternate);
353
355 int (*control_to_dev)(struct usbd_class_data *const c_data,
356 const struct usb_setup_packet *const setup,
357 const struct net_buf *const buf);
358
360 struct net_buf *(*control_to_host)(struct usbd_class_data *const c_data,
361 const struct usb_setup_packet *const setup);
362
364 int (*request)(struct usbd_class_data *const c_data,
365 struct net_buf *buf, int err);
366
368 void (*suspended)(struct usbd_class_data *const c_data);
369
371 void (*resumed)(struct usbd_class_data *const c_data);
372
374 void (*sof)(struct usbd_class_data *const c_data);
375
377 void (*enable)(struct usbd_class_data *const c_data);
378
380 void (*disable)(struct usbd_class_data *const c_data);
381
383 int (*init)(struct usbd_class_data *const c_data);
384
386 void (*shutdown)(struct usbd_class_data *const c_data);
387
389 const void *(*get_desc)(struct usbd_class_data *const c_data,
390 const enum usbd_speed speed);
391};
392
398 const char *name;
402 const struct usbd_class_api *api;
406 void *priv;
407};
408
417struct usbd_class_node {
419 sys_snode_t node;
421 struct usbd_class_data *const c_data;
425 uint32_t ep_assigned;
429 uint32_t ep_active;
431 uint32_t iface_bm;
434};
435
437
448static inline struct usbd_context *usbd_class_get_ctx(const struct usbd_class_data *const c_data)
449{
450 return c_data->uds_ctx;
451}
452
463static inline void *usbd_class_get_private(const struct usbd_class_data *const c_data)
464{
465 return c_data->priv;
466}
467
488#define USBD_DEVICE_DEFINE(device_name, udc_dev, vid, pid) \
489 static struct usb_device_descriptor \
490 fs_desc_##device_name = { \
491 .bLength = sizeof(struct usb_device_descriptor), \
492 .bDescriptorType = USB_DESC_DEVICE, \
493 .bcdUSB = sys_cpu_to_le16(USB_SRN_2_0), \
494 .bDeviceClass = USB_BCC_MISCELLANEOUS, \
495 .bDeviceSubClass = 2, \
496 .bDeviceProtocol = 1, \
497 .bMaxPacketSize0 = USB_CONTROL_EP_MPS, \
498 .idVendor = vid, \
499 .idProduct = pid, \
500 .bcdDevice = sys_cpu_to_le16(USB_BCD_DRN), \
501 .iManufacturer = 0, \
502 .iProduct = 0, \
503 .iSerialNumber = 0, \
504 .bNumConfigurations = 0, \
505 }; \
506 IF_ENABLED(USBD_SUPPORTS_HIGH_SPEED, ( \
507 static struct usb_device_descriptor \
508 hs_desc_##device_name = { \
509 .bLength = sizeof(struct usb_device_descriptor), \
510 .bDescriptorType = USB_DESC_DEVICE, \
511 .bcdUSB = sys_cpu_to_le16(USB_SRN_2_0), \
512 .bDeviceClass = USB_BCC_MISCELLANEOUS, \
513 .bDeviceSubClass = 2, \
514 .bDeviceProtocol = 1, \
515 .bMaxPacketSize0 = 64, \
516 .idVendor = vid, \
517 .idProduct = pid, \
518 .bcdDevice = sys_cpu_to_le16(USB_BCD_DRN), \
519 .iManufacturer = 0, \
520 .iProduct = 0, \
521 .iSerialNumber = 0, \
522 .bNumConfigurations = 0, \
523 }; \
524 )) \
525 static STRUCT_SECTION_ITERABLE(usbd_context, device_name) = { \
526 .name = STRINGIFY(device_name), \
527 .mutex = Z_MUTEX_INITIALIZER(device_name.mutex), \
528 .dev = udc_dev, \
529 .fs_desc = &fs_desc_##device_name, \
530 IF_ENABLED(USBD_SUPPORTS_HIGH_SPEED, ( \
531 .hs_desc = &hs_desc_##device_name, \
532 )) \
533 }
534
552#define USBD_CONFIGURATION_DEFINE(name, attrib, power, desc_nd) \
553 static struct usb_cfg_descriptor \
554 cfg_desc_##name = { \
555 .bLength = sizeof(struct usb_cfg_descriptor), \
556 .bDescriptorType = USB_DESC_CONFIGURATION, \
557 .wTotalLength = 0, \
558 .bNumInterfaces = 0, \
559 .bConfigurationValue = 1, \
560 .iConfiguration = 0, \
561 .bmAttributes = USB_SCD_RESERVED | (attrib), \
562 .bMaxPower = (power), \
563 }; \
564 BUILD_ASSERT((power) < 256, "Too much power"); \
565 static struct usbd_config_node name = { \
566 .desc = &cfg_desc_##name, \
567 .str_desc_nd = desc_nd, \
568 }
569
583#define USBD_DESC_LANG_DEFINE(name) \
584 static const uint16_t langid_##name = sys_cpu_to_le16(0x0409); \
585 static struct usbd_desc_node name = { \
586 .str = { \
587 .idx = 0, \
588 .utype = USBD_DUT_STRING_LANG, \
589 }, \
590 .ptr = &langid_##name, \
591 .bLength = sizeof(struct usb_string_descriptor), \
592 .bDescriptorType = USB_DESC_STRING, \
593 }
594
606#define USBD_DESC_STRING_DEFINE(d_name, d_string, d_utype) \
607 static const uint8_t ascii_##d_name[sizeof(d_string)] = d_string; \
608 static struct usbd_desc_node d_name = { \
609 .str = { \
610 .utype = d_utype, \
611 .ascii7 = true, \
612 }, \
613 .ptr = &ascii_##d_name, \
614 .bLength = USB_STRING_DESCRIPTOR_LENGTH(d_string), \
615 .bDescriptorType = USB_DESC_STRING, \
616 }
617
629#define USBD_DESC_MANUFACTURER_DEFINE(d_name, d_string) \
630 USBD_DESC_STRING_DEFINE(d_name, d_string, USBD_DUT_STRING_MANUFACTURER)
631
643#define USBD_DESC_PRODUCT_DEFINE(d_name, d_string) \
644 USBD_DESC_STRING_DEFINE(d_name, d_string, USBD_DUT_STRING_PRODUCT)
645
659#define USBD_DESC_SERIAL_NUMBER_DEFINE(d_name) \
660 BUILD_ASSERT(IS_ENABLED(CONFIG_HWINFO), "HWINFO not enabled"); \
661 static struct usbd_desc_node d_name = { \
662 .str = { \
663 .utype = USBD_DUT_STRING_SERIAL_NUMBER, \
664 .ascii7 = true, \
665 .use_hwinfo = true, \
666 }, \
667 .bDescriptorType = USB_DESC_STRING, \
668 }
669
679#define USBD_DESC_CONFIG_DEFINE(d_name, d_string) \
680 USBD_DESC_STRING_DEFINE(d_name, d_string, USBD_DUT_STRING_CONFIG)
681
694#define USBD_DESC_BOS_DEFINE(name, len, subset) \
695 BUILD_ASSERT(IS_ENABLED(CONFIG_USBD_BOS_SUPPORT), \
696 "USB device BOS support is disabled"); \
697 static struct usbd_desc_node name = { \
698 .bos = { \
699 .utype = USBD_DUT_BOS_NONE, \
700 }, \
701 .ptr = subset, \
702 .bLength = len, \
703 .bDescriptorType = USB_DESC_BOS, \
704 }
705
716#define USBD_VREQUEST_DEFINE(name, vcode, vto_host, vto_dev) \
717 BUILD_ASSERT(IS_ENABLED(CONFIG_USBD_VREQ_SUPPORT), \
718 "USB device vendor request support is disabled"); \
719 static struct usbd_vreq_node name = { \
720 .code = vcode, \
721 .to_host = vto_host, \
722 .to_dev = vto_dev, \
723 }
724
744#define USBD_DESC_BOS_VREQ_DEFINE(name, len, subset, vcode, vto_host, vto_dev) \
745 BUILD_ASSERT(IS_ENABLED(CONFIG_USBD_BOS_SUPPORT), \
746 "USB device BOS support is disabled"); \
747 USBD_VREQUEST_DEFINE(vreq_nd_##name, vcode, vto_host, vto_dev); \
748 static struct usbd_desc_node name = { \
749 .bos = { \
750 .utype = USBD_DUT_BOS_VREQ, \
751 .vreq_nd = &vreq_nd_##name, \
752 }, \
753 .ptr = subset, \
754 .bLength = len, \
755 .bDescriptorType = USB_DESC_BOS, \
756 }
757
769#define USBD_DEFINE_CLASS(class_name, class_api, class_priv, class_v_reqs) \
770 static struct usbd_class_data class_name = { \
771 .name = STRINGIFY(class_name), \
772 .api = class_api, \
773 .v_reqs = class_v_reqs, \
774 .priv = class_priv, \
775 }; \
776 static STRUCT_SECTION_ITERABLE_ALTERNATE( \
777 usbd_class_fs, usbd_class_node, class_name##_fs) = { \
778 .c_data = &class_name, \
779 }; \
780 IF_ENABLED(USBD_SUPPORTS_HIGH_SPEED, ( \
781 static STRUCT_SECTION_ITERABLE_ALTERNATE( \
782 usbd_class_hs, usbd_class_node, class_name##_hs) = { \
783 .c_data = &class_name, \
784 } \
785 ))
786
792#define VENDOR_REQ_DEFINE(_reqs, _len) \
793 { \
794 .reqs = (const uint8_t *)(_reqs), \
795 .len = (_len), \
796 }
797
802#define USBD_VENDOR_REQ(_reqs...) \
803 VENDOR_REQ_DEFINE(((const uint8_t []) { _reqs }), \
804 sizeof((const uint8_t []) { _reqs }))
805
806
818 struct usbd_desc_node *dn);
819
827uint8_t usbd_str_desc_get_idx(const struct usbd_desc_node *const desc_nd);
828
836void usbd_remove_descriptor(struct usbd_desc_node *const desc_nd);
837
848 const enum usbd_speed speed,
849 struct usbd_config_node *cd);
850
873 const char *name,
874 const enum usbd_speed speed, uint8_t cfg);
875
908 const enum usbd_speed speed, uint8_t cfg,
909 const char *const blocklist[]);
910
926 const char *name,
927 const enum usbd_speed speed, uint8_t cfg);
928
942 const enum usbd_speed speed, uint8_t cfg);
943
952int usbd_msg_register_cb(struct usbd_context *const uds_ctx,
953 const usbd_msg_cb_t cb);
954
968int usbd_init(struct usbd_context *uds_ctx);
969
979int usbd_enable(struct usbd_context *uds_ctx);
980
990int usbd_disable(struct usbd_context *uds_ctx);
991
1001int usbd_shutdown(struct usbd_context *const uds_ctx);
1002
1011int usbd_ep_set_halt(struct usbd_context *uds_ctx, uint8_t ep);
1012
1021int usbd_ep_clear_halt(struct usbd_context *uds_ctx, uint8_t ep);
1022
1031bool usbd_ep_is_halted(struct usbd_context *uds_ctx, uint8_t ep);
1032
1044struct net_buf *usbd_ep_buf_alloc(const struct usbd_class_data *const c_data,
1045 const uint8_t ep, const size_t size);
1046
1057struct net_buf *usbd_ep_ctrl_data_in_alloc(const struct usbd_context *const uds_ctx,
1058 const size_t size);
1059
1070int usbd_ep_ctrl_enqueue(struct usbd_context *const uds_ctx,
1071 struct net_buf *const buf);
1072
1083int usbd_ep_enqueue(const struct usbd_class_data *const c_data,
1084 struct net_buf *const buf);
1085
1094int usbd_ep_dequeue(struct usbd_context *uds_ctx, const uint8_t ep);
1095
1106int usbd_ep_buf_free(struct usbd_context *uds_ctx, struct net_buf *buf);
1107
1115bool usbd_is_suspended(struct usbd_context *uds_ctx);
1116
1125
1135void usbd_self_powered(struct usbd_context *uds_ctx, const bool status);
1136
1144enum usbd_speed usbd_bus_speed(const struct usbd_context *const uds_ctx);
1145
1153enum usbd_speed usbd_caps_speed(const struct usbd_context *const uds_ctx);
1154
1164int usbd_device_set_bcd_usb(struct usbd_context *const uds_ctx,
1165 const enum usbd_speed speed, const uint16_t bcd);
1166
1175int usbd_device_set_vid(struct usbd_context *const uds_ctx,
1176 const uint16_t vid);
1177
1186int usbd_device_set_pid(struct usbd_context *const uds_ctx,
1187 const uint16_t pid);
1188
1198 const uint16_t bcd);
1199
1212 const enum usbd_speed speed,
1213 const uint8_t base_class,
1214 const uint8_t subclass, const uint8_t protocol);
1215
1226int usbd_config_attrib_rwup(struct usbd_context *const uds_ctx,
1227 const enum usbd_speed speed,
1228 const uint8_t cfg, const bool enable);
1229
1240int usbd_config_attrib_self(struct usbd_context *const uds_ctx,
1241 const enum usbd_speed speed,
1242 const uint8_t cfg, const bool enable);
1243
1254int usbd_config_maxpower(struct usbd_context *const uds_ctx,
1255 const enum usbd_speed speed,
1256 const uint8_t cfg, const uint8_t power);
1257
1270bool usbd_can_detect_vbus(struct usbd_context *const uds_ctx);
1271
1283int usbd_device_register_vreq(struct usbd_context *const uds_ctx,
1284 struct usbd_vreq_node *const vreq_nd);
1285
1289
1290#ifdef __cplusplus
1291}
1292#endif
1293
1294#endif /* ZEPHYR_INCLUDE_USBD_H_ */
USB Binary Device Object Store support.
APIs and macros for the Zephyr device model.
long atomic_t
Atomic integer variable.
Definition atomic_types.h:34
struct _dnode sys_dnode_t
Doubly-linked list node structure.
Definition dlist.h:59
struct _dnode sys_dlist_t
Doubly-linked list structure.
Definition dlist.h:55
struct _slist sys_slist_t
Single-linked list structure.
Definition slist.h:54
struct _snode sys_snode_t
Single-linked list node structure.
Definition slist.h:44
int usbd_ep_clear_halt(struct usbd_context *uds_ctx, uint8_t ep)
Clear endpoint halt.
int usbd_register_all_classes(struct usbd_context *uds_ctx, const enum usbd_speed speed, uint8_t cfg, const char *const blocklist[])
Register all available USB class instances.
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.
struct net_buf * usbd_ep_ctrl_data_in_alloc(const struct usbd_context *const uds_ctx, const size_t size)
Allocate buffer for USB control transfer data stage.
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:285
static void * usbd_class_get_private(const struct usbd_class_data *const c_data)
Get class implementation private data.
Definition usbd.h:463
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:243
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_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.
void usbd_self_powered(struct usbd_context *uds_ctx, const bool status)
Set the self-powered status of the USB device.
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:215
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.
int usbd_device_register_vreq(struct usbd_context *const uds_ctx, struct usbd_vreq_node *const vreq_nd)
Register an USB vendor request with recipient device.
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:207
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:448
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:249
@ USBD_SPEED_FS
Device supports or is connected to a full speed bus.
Definition usbd.h:245
@ USBD_SPEED_HS
Device supports or is connected to a high speed bus.
Definition usbd.h:247
@ USBD_STATE_CONFIGURED
Definition usbd.h:218
@ USBD_STATE_DEFAULT
Definition usbd.h:216
@ USBD_STATE_ADDRESS
Definition usbd.h:217
Header file for the logging subsystem.
state
Definition parser_state.h:29
Header file for the single-linked list API.
__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:543
Kernel mutex structure.
Definition kernel.h:3500
Kernel Spin Lock.
Definition spinlock.h:45
Network buffer representation.
Definition net_buf.h:1054
uint16_t size
Amount of data that this buffer can store.
Definition net_buf.h:1149
USB Setup Data packet.
Definition usb_ch9.h:49
USBD BOS Device Capability descriptor data.
Definition usbd.h:158
enum usbd_bos_desc_utype utype
Descriptor usage type (not bDescriptorType).
Definition usbd.h:160
struct usbd_vreq_node *const vreq_nd
Definition usbd.h:162
Vendor Requests Table.
Definition usbd.h:330
const uint8_t * reqs
Array of vendor requests supported by the class.
Definition usbd.h:332
uint8_t len
Length of the array.
Definition usbd.h:334
USB device support middle layer runtime data.
Definition usbd.h:225
uint8_t configuration
USB device stack selected configuration.
Definition usbd.h:233
uint32_t ep_halt
Halted endpoints bitmap.
Definition usbd.h:231
bool post_status
Post status stage work required, e.g.
Definition usbd.h:235
enum usbd_ch9_state state
Protocol state of the USB device stack.
Definition usbd.h:229
struct usb_setup_packet setup
Setup packet, up-to-date for the respective control request.
Definition usbd.h:227
uint8_t alternate[16U]
Array to track interfaces alternate settings.
Definition usbd.h:237
USB device support class instance API.
Definition usbd.h:345
void(* feature_halt)(struct usbd_class_data *const c_data, uint8_t ep, bool halted)
Feature halt state update handler.
Definition usbd.h:347
void(* update)(struct usbd_class_data *const c_data, uint8_t iface, uint8_t alternate)
Configuration update handler.
Definition usbd.h:351
void(* sof)(struct usbd_class_data *const c_data)
Start of Frame.
Definition usbd.h:374
void(* suspended)(struct usbd_class_data *const c_data)
USB power management handler suspended.
Definition usbd.h:368
void(* shutdown)(struct usbd_class_data *const c_data)
Shutdown of the class implementation.
Definition usbd.h:386
int(* request)(struct usbd_class_data *const c_data, struct net_buf *buf, int err)
Endpoint request completion event handler.
Definition usbd.h:364
int(* init)(struct usbd_class_data *const c_data)
Initialization of the class implementation.
Definition usbd.h:383
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:355
void(* enable)(struct usbd_class_data *const c_data)
Class associated configuration is selected.
Definition usbd.h:377
void(* resumed)(struct usbd_class_data *const c_data)
USB power management handler resumed.
Definition usbd.h:371
void(* disable)(struct usbd_class_data *const c_data)
Class associated configuration is disabled.
Definition usbd.h:380
USB device support class data.
Definition usbd.h:396
void * priv
Pointer to private data.
Definition usbd.h:406
struct usbd_context * uds_ctx
Pointer to USB device stack context structure.
Definition usbd.h:400
const struct usbd_cctx_vendor_req * v_reqs
Supported vendor request table, can be NULL.
Definition usbd.h:404
const struct usbd_class_api * api
Pointer to device support class API.
Definition usbd.h:402
const char * name
Name of the USB device class instance.
Definition usbd.h:398
Device configuration node.
Definition usbd.h:195
sys_snode_t node
slist node struct
Definition usbd.h:197
sys_slist_t class_list
List of registered classes (functions).
Definition usbd.h:203
struct usbd_desc_node * str_desc_nd
Optional pointer to string descriptor node.
Definition usbd.h:201
void * desc
Pointer to configuration descriptor.
Definition usbd.h:199
USB device support runtime context.
Definition usbd.h:294
void * fs_desc
Pointer to Full-Speed device descriptor.
Definition usbd.h:320
void * hs_desc
Pointer to High-Speed device descriptor.
Definition usbd.h:322
usbd_msg_cb_t msg_cb
Notification message recipient callback.
Definition usbd.h:302
struct usbd_status status
Status of the USB device support.
Definition usbd.h:318
sys_slist_t hs_configs
slist to manage High-Speed device configurations
Definition usbd.h:314
struct usbd_ch9_data ch9_data
Middle layer runtime data.
Definition usbd.h:308
const struct device * dev
Pointer to UDC device.
Definition usbd.h:300
sys_dlist_t vreqs
dlist to manage vendor requests with recipient device
Definition usbd.h:316
sys_slist_t ep_events
slist to keep endpoint events
Definition usbd.h:304
sys_slist_t fs_configs
slist to manage Full-Speed device configurations
Definition usbd.h:312
struct k_mutex mutex
Access mutex.
Definition usbd.h:298
const char * name
Name of the USB device.
Definition usbd.h:296
sys_dlist_t descriptors
slist to manage descriptors like string, BOS
Definition usbd.h:310
struct k_spinlock ep_event_lock
Endpoint event list spinlock.
Definition usbd.h:306
struct net_buf * setup_buf
Pre-allocated buffer for control transfer SETUP stage.
Definition usbd.h:324
Descriptor node.
Definition usbd.h:172
uint8_t bDescriptorType
Descriptor type.
Definition usbd.h:184
sys_dnode_t node
slist node struct
Definition usbd.h:174
const void *const ptr
Opaque pointer to a descriptor payload.
Definition usbd.h:180
uint8_t bLength
Descriptor size in bytes.
Definition usbd.h:182
struct usbd_str_desc_data str
Definition usbd.h:176
struct usbd_bos_desc_data bos
Definition usbd.h:177
USB device message.
Definition usbd_msg.h:88
USB device support status.
Definition usbd.h:255
unsigned int rwup
USB remote wake-up feature is enabled.
Definition usbd.h:263
unsigned int enabled
USB device support is enabled.
Definition usbd.h:259
enum usbd_speed speed
USB device speed.
Definition usbd.h:267
unsigned int initialized
USB device support is initialized.
Definition usbd.h:257
unsigned int self_powered
USB device is self-powered.
Definition usbd.h:265
unsigned int suspended
USB device is suspended.
Definition usbd.h:261
Used internally to keep descriptors in order.
Definition usbd.h:81
uint8_t idx
Descriptor index, required for string descriptors.
Definition usbd.h:83
enum usbd_str_desc_utype utype
Descriptor usage type (not bDescriptorType).
Definition usbd.h:85
unsigned int use_hwinfo
Device stack obtains SerialNumber using the HWINFO API.
Definition usbd.h:89
unsigned int ascii7
The string descriptor is in ASCII7 format.
Definition usbd.h:87
USBD vendor request node.
Definition usbd.h:131
sys_dnode_t node
Node information for the dlist.
Definition usbd.h:133
const uint8_t code
Vendor code (bRequest value).
Definition usbd.h:135
int(* to_dev)(const struct usbd_context *const ctx, const struct usb_setup_packet *const setup, const struct net_buf *const buf)
Vendor request callback for host-to-device direction.
Definition usbd.h:150
Byte order helpers.
Iterable sections helpers.
Buffers for USB device support.
USB Chapter 9 structures and definitions.
USB support message types and structure.