Skip to content

Commit c9521e6

Browse files
committed
usb: device_next: support BOS descriptor with vendor request code
Platform capability descriptors such as MSOSv2 or WebUSB BOS have a vendor request code that is used by the host to perform vendor-specific requests. Add a convenient way to define and register a platform capability descriptor with a vendor request node. Signed-off-by: Johann Fischer <[email protected]>
1 parent b00b5ca commit c9521e6

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

include/zephyr/usb/usbd.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ enum usbd_str_desc_utype {
7474

7575
enum usbd_bos_desc_utype {
7676
USBD_DUT_BOS_NONE,
77+
USBD_DUT_BOS_VREQ,
7778
};
7879
/** @endcond */
7980

@@ -145,6 +146,9 @@ struct usbd_vreq_node {
145146
struct usbd_bos_desc_data {
146147
/** Descriptor usage type (not bDescriptorType) */
147148
enum usbd_bos_desc_utype utype : 8;
149+
union {
150+
struct usbd_vreq_node *const vreq_nd;
151+
};
148152
};
149153

150154
/**
@@ -662,6 +666,34 @@ static inline void *usbd_class_get_private(const struct usbd_class_data *const c
662666
.to_dev = vto_dev, \
663667
}
664668

669+
/**
670+
* @brief Define BOS Device Capability descriptor node with vendor request
671+
*
672+
* This macro defines a BOS descriptor, usually a platform capability, with a
673+
* vendor request node.
674+
*
675+
* USBD_DESC_BOS_VREQ_DEFINE(bos_vreq_webusb, sizeof(bos_cap_webusb), &bos_cap_webusb,
676+
* SAMPLE_WEBUSB_VENDOR_CODE, webusb_to_host_cb, NULL);
677+
*
678+
* @param name Descriptor node identifier
679+
* @param len Device Capability descriptor length
680+
* @param subset Pointer to a Device Capability descriptor
681+
* @param vcode Vendor request code
682+
* @param vto_host Vendor callback for to-host direction request
683+
* @param vto_dev Vendor callback for to-device direction request
684+
*/
685+
#define USBD_DESC_BOS_VREQ_DEFINE(name, len, subset, vcode, vto_host, vto_dev) \
686+
USBD_VREQUEST_DEFINE(vreq_nd_##name, vcode, vto_host, vto_dev); \
687+
static struct usbd_desc_node name = { \
688+
.bos = { \
689+
.utype = USBD_DUT_BOS_VREQ, \
690+
.vreq_nd = &vreq_nd_##name, \
691+
}, \
692+
.ptr = subset, \
693+
.bLength = len, \
694+
.bDescriptorType = USB_DESC_BOS, \
695+
}
696+
665697
/**
666698
* @brief Define USB device support class data
667699
*

subsys/usb/device_next/usbd_desc.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,13 @@ int usbd_add_descriptor(struct usbd_context *const uds_ctx,
142142
}
143143

144144
if (desc_nd->bDescriptorType == USB_DESC_BOS) {
145+
if (desc_nd->bos.utype == USBD_DUT_BOS_VREQ) {
146+
ret = usbd_device_register_vreq(uds_ctx, desc_nd->bos.vreq_nd);
147+
if (ret) {
148+
goto add_descriptor_error;
149+
}
150+
}
151+
145152
sys_dlist_append(&uds_ctx->descriptors, &desc_nd->node);
146153
}
147154

0 commit comments

Comments
 (0)