/* * Copyright (c) 2018 Intel Corporation * Copyright (c) 2023 Nordic Semiconductor ASA * * SPDX-License-Identifier: Apache-2.0 */ #ifndef ZEPHYR_INCLUDE_USB_BOS_H_ #define ZEPHYR_INCLUDE_USB_BOS_H_ #include /** * @brief USB Binary Device Object Store support * @defgroup usb_bos USB BOS support * @ingroup usb * @{ */ /** * @brief Helper macro to place the BOS compatibility descriptor * in the right memory section. */ #define USB_DEVICE_BOS_DESC_DEFINE_CAP \ static __in_section(usb, bos_desc_area, 1) __aligned(1) __used /** Device capability type codes */ enum usb_bos_capability_types { USB_BOS_CAPABILITY_EXTENSION = 0x02, USB_BOS_CAPABILITY_PLATFORM = 0x05, }; /** BOS USB 2.0 extension capability descriptor */ struct usb_bos_capability_lpm { uint8_t bLength; uint8_t bDescriptorType; uint8_t bDevCapabilityType; uint32_t bmAttributes; } __packed; /** BOS platform capability descriptor */ struct usb_bos_platform_descriptor { uint8_t bLength; uint8_t bDescriptorType; uint8_t bDevCapabilityType; uint8_t bReserved; uint8_t PlatformCapabilityUUID[16]; } __packed; /** WebUSB specific part of platform capability descriptor */ struct usb_bos_capability_webusb { uint16_t bcdVersion; uint8_t bVendorCode; uint8_t iLandingPage; } __packed; /** Microsoft OS 2.0 descriptor specific part of platform capability descriptor */ struct usb_bos_capability_msos { uint32_t dwWindowsVersion; uint16_t wMSOSDescriptorSetTotalLength; uint8_t bMS_VendorCode; uint8_t bAltEnumCode; } __packed; /** * @brief Register BOS capability descriptor * * This function should be used by the application to register BOS capability * descriptors before the USB device stack is enabled. * * @param[in] hdr Pointer to BOS capability descriptor */ void usb_bos_register_cap(struct usb_bos_platform_descriptor *hdr); /** * @cond INTERNAL_HIDDEN * Internally used functions */ /* BOS Descriptor (root descriptor) */ struct usb_bos_descriptor { uint8_t bLength; uint8_t bDescriptorType; uint16_t wTotalLength; uint8_t bNumDeviceCaps; } __packed; #define USB_DEVICE_BOS_DESC_DEFINE_HDR \ static __in_section(usb, bos_desc_area, 0) __aligned(1) __used size_t usb_bos_get_length(void); void usb_bos_fix_total_length(void); const void *usb_bos_get_header(void); #if defined(CONFIG_USB_DEVICE_BOS) int usb_handle_bos(struct usb_setup_packet *setup, int32_t *len, uint8_t **data); #else #define usb_handle_bos(x, y, z) -ENOTSUP #endif /** @endcond */ /** * @} */ #endif /* ZEPHYR_INCLUDE_USB_BOS_H_ */