GNU Linux-libre 6.9.1-gnu
[releases.git] / include / linux / usb / webusb.h
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * WebUSB descriptors and constants
4  *
5  * Copyright (C) 2023 Jó Ágila Bitsch <jgilab@gmail.com>
6  */
7
8 #ifndef __LINUX_USB_WEBUSB_H
9 #define __LINUX_USB_WEBUSB_H
10
11 #include "uapi/linux/usb/ch9.h"
12
13 /*
14  * Little Endian PlatformCapablityUUID for WebUSB
15  * 3408b638-09a9-47a0-8bfd-a0768815b665
16  * to identify Platform Device Capability descriptors as referring to WebUSB.
17  */
18 #define WEBUSB_UUID \
19         GUID_INIT(0x3408b638, 0x09a9, 0x47a0, 0x8b, 0xfd, 0xa0, 0x76, 0x88, 0x15, 0xb6, 0x65)
20
21 /*
22  * WebUSB Platform Capability data
23  *
24  * A device announces support for the
25  * WebUSB command set by including the following Platform Descriptor Data in its
26  * Binary Object Store associated with the WebUSB_UUID above.
27  * See: https://wicg.github.io/webusb/#webusb-platform-capability-descriptor
28  */
29 struct usb_webusb_cap_data {
30         __le16 bcdVersion;
31 #define WEBUSB_VERSION_1_00     cpu_to_le16(0x0100) /* currently only version 1.00 is defined */
32         u8  bVendorCode;
33         u8  iLandingPage;
34 #define WEBUSB_LANDING_PAGE_NOT_PRESENT 0
35 #define WEBUSB_LANDING_PAGE_PRESENT     1 /* we chose the fixed index 1 for the URL descriptor */
36 } __packed;
37
38 #define USB_WEBUSB_CAP_DATA_SIZE        4
39
40 /*
41  * Get URL Request
42  *
43  * The request to fetch an URL is defined in https://wicg.github.io/webusb/#get-url as:
44  * bmRequestType: (USB_DIR_IN | USB_TYPE_VENDOR) = 11000000B
45  * bRequest: bVendorCode
46  * wValue: iLandingPage
47  * wIndex: GET_URL = 2
48  * wLength: Descriptor Length (typically U8_MAX = 255)
49  * Data: URL Descriptor
50  */
51 #define WEBUSB_GET_URL 2
52
53 /*
54  * This descriptor contains a single URL and is returned by the Get URL request.
55  *
56  * See: https://wicg.github.io/webusb/#url-descriptor
57  */
58 struct webusb_url_descriptor {
59         u8  bLength;
60 #define WEBUSB_URL_DESCRIPTOR_HEADER_LENGTH     3
61         u8  bDescriptorType;
62 #define WEBUSB_URL_DESCRIPTOR_TYPE              3
63         u8  bScheme;
64 #define WEBUSB_URL_SCHEME_HTTP                  0
65 #define WEBUSB_URL_SCHEME_HTTPS                 1
66 #define WEBUSB_URL_SCHEME_NONE                  255
67         u8  URL[U8_MAX - WEBUSB_URL_DESCRIPTOR_HEADER_LENGTH];
68 } __packed;
69
70 /*
71  * Buffer size to hold the longest URL that can be in an URL descriptor
72  *
73  * The descriptor can be U8_MAX  bytes long.
74  * WEBUSB_URL_DESCRIPTOR_HEADER_LENGTH bytes are used for a header.
75  * Since the longest prefix that might be stripped is "https://", we may accommodate an additional
76  * 8 bytes.
77  */
78 #define WEBUSB_URL_RAW_MAX_LENGTH (U8_MAX - WEBUSB_URL_DESCRIPTOR_HEADER_LENGTH + 8)
79
80 #endif /* __LINUX_USB_USBNET_H */