blob: c1cda8924ec1213d6c8d8b33204411d1a0435247 [file] [log] [blame]
/*
* Copyright (c) 2016-2019 Intel Corporation
* Copyright (c) 2023-2024 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_INCLUDE_WEBUSB_DESCRIPTOR_H
#define ZEPHYR_INCLUDE_WEBUSB_DESCRIPTOR_H
/*
* WebUSB platform capability and WebUSB URL descriptor.
* See https://wicg.github.io/webusb for reference.
*/
#define WEBUSB_REQ_GET_URL 0x02U
#define WEBUSB_DESC_TYPE_URL 0x03U
#define WEBUSB_URL_PREFIX_HTTP 0x00U
#define WEBUSB_URL_PREFIX_HTTPS 0x01U
#define SAMPLE_WEBUSB_VENDOR_CODE 0x01U
#define SAMPLE_WEBUSB_LANDING_PAGE 0x01U
struct usb_bos_webusb_desc {
struct usb_bos_platform_descriptor platform;
struct usb_bos_capability_webusb cap;
} __packed;
static const struct usb_bos_webusb_desc bos_cap_webusb = {
/* WebUSB Platform Capability Descriptor:
* https://wicg.github.io/webusb/#webusb-platform-capability-descriptor
*/
.platform = {
.bLength = sizeof(struct usb_bos_platform_descriptor)
+ sizeof(struct usb_bos_capability_webusb),
.bDescriptorType = USB_DESC_DEVICE_CAPABILITY,
.bDevCapabilityType = USB_BOS_CAPABILITY_PLATFORM,
.bReserved = 0,
/* WebUSB Platform Capability UUID
* 3408b638-09a9-47a0-8bfd-a0768815b665
*/
.PlatformCapabilityUUID = {
0x38, 0xB6, 0x08, 0x34,
0xA9, 0x09,
0xA0, 0x47,
0x8B, 0xFD,
0xA0, 0x76, 0x88, 0x15, 0xB6, 0x65,
},
},
.cap = {
.bcdVersion = sys_cpu_to_le16(0x0100),
.bVendorCode = SAMPLE_WEBUSB_VENDOR_CODE,
.iLandingPage = SAMPLE_WEBUSB_LANDING_PAGE
}
};
/* WebUSB URL Descriptor, see https://wicg.github.io/webusb/#webusb-descriptors */
static const uint8_t webusb_origin_url[] = {
/* bLength, bDescriptorType, bScheme, UTF-8 encoded URL */
0x24, WEBUSB_DESC_TYPE_URL, WEBUSB_URL_PREFIX_HTTPS,
'w', 'w', 'w', '.',
'z', 'e', 'p', 'h', 'y', 'r', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.',
'o', 'r', 'g', '/',
};
static int webusb_to_host_cb(const struct usbd_context *const ctx,
const struct usb_setup_packet *const setup,
struct net_buf *const buf)
{
LOG_INF("Vendor callback to host");
if (setup->wIndex == WEBUSB_REQ_GET_URL) {
uint8_t index = USB_GET_DESCRIPTOR_INDEX(setup->wValue);
if (index != SAMPLE_WEBUSB_LANDING_PAGE) {
return -ENOTSUP;
}
LOG_INF("Get URL request, index %u", index);
net_buf_add_mem(buf, &webusb_origin_url,
MIN(net_buf_tailroom(buf), sizeof(webusb_origin_url)));
return 0;
}
return -ENOTSUP;
}
USBD_DESC_BOS_VREQ_DEFINE(bos_vreq_webusb, sizeof(bos_cap_webusb), &bos_cap_webusb,
SAMPLE_WEBUSB_VENDOR_CODE, webusb_to_host_cb, NULL);
#endif /* ZEPHYR_INCLUDE_WEBUSB_DESCRIPTOR_H */