Skip to content

Commit 6ee1358

Browse files
jfischer-nonashif
authored andcommitted
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 34f42d6 commit 6ee1358

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
@@ -77,6 +77,7 @@ enum usbd_str_desc_utype {
7777

7878
enum usbd_bos_desc_utype {
7979
USBD_DUT_BOS_NONE,
80+
USBD_DUT_BOS_VREQ,
8081
};
8182
/** @endcond */
8283

@@ -148,6 +149,9 @@ struct usbd_vreq_node {
148149
struct usbd_bos_desc_data {
149150
/** Descriptor usage type (not bDescriptorType) */
150151
enum usbd_bos_desc_utype utype : 8;
152+
union {
153+
struct usbd_vreq_node *const vreq_nd;
154+
};
151155
};
152156

153157
/**
@@ -683,6 +687,34 @@ static inline void *usbd_class_get_private(const struct usbd_class_data *const c
683687
.to_dev = vto_dev, \
684688
}
685689

690+
/**
691+
* @brief Define BOS Device Capability descriptor node with vendor request
692+
*
693+
* This macro defines a BOS descriptor, usually a platform capability, with a
694+
* vendor request node.
695+
*
696+
* USBD_DESC_BOS_VREQ_DEFINE(bos_vreq_webusb, sizeof(bos_cap_webusb), &bos_cap_webusb,
697+
* SAMPLE_WEBUSB_VENDOR_CODE, webusb_to_host_cb, NULL);
698+
*
699+
* @param name Descriptor node identifier
700+
* @param len Device Capability descriptor length
701+
* @param subset Pointer to a Device Capability descriptor
702+
* @param vcode Vendor request code
703+
* @param vto_host Vendor callback for to-host direction request
704+
* @param vto_dev Vendor callback for to-device direction request
705+
*/
706+
#define USBD_DESC_BOS_VREQ_DEFINE(name, len, subset, vcode, vto_host, vto_dev) \
707+
USBD_VREQUEST_DEFINE(vreq_nd_##name, vcode, vto_host, vto_dev); \
708+
static struct usbd_desc_node name = { \
709+
.bos = { \
710+
.utype = USBD_DUT_BOS_VREQ, \
711+
.vreq_nd = &vreq_nd_##name, \
712+
}, \
713+
.ptr = subset, \
714+
.bLength = len, \
715+
.bDescriptorType = USB_DESC_BOS, \
716+
}
717+
686718
/**
687719
* @brief Define USB device support class data
688720
*

subsys/usb/device_next/usbd_desc.c

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

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

0 commit comments

Comments
 (0)