usb: Groundwork for USB BOS & Billboard class descriptors.

The BOS (Binary Device Object Store) descriptor was added to the USB
specification (3.0) to allow a richer set of device capability
specific descriptors.

The Billboard class is meant to expose (read-only) the status of USB
devices capable of alternate mode functions.  It's required to use the
BOS descriptor type and at a high level looks like:

  - BOS Device Descriptor (5bytes)
    - Container ID Device Capability Descriptor (20bytes)
    - Billboard Device Capability Descriptor (44byte + 4 * numSVIDs)

This CL adds:
1. Ability for Get Descriptor on BOS descriptors.  Note hidden behind
CONFIG_USB_BOS as these descriptors change USB device requirements
to:
   - bcdUSB >= 0201
   - no interface descriptors

2. structures for all BOS, Container & Billboard descriptor elements
complete w/ CamelCase.

BRANCH=none
BUG=chrome-os-partner:32652
TEST=compiles with CONFIG_USB & CONFIG_USB_BOS enabled.

Change-Id: I1b24bc728f2ebba7d91840801d2ebe576e240e7c
Signed-off-by: Todd Broch <tbroch@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/221570
This commit is contained in:
Todd Broch
2014-10-03 17:22:42 -07:00
committed by chrome-internal-fetch
parent 4d81320ed8
commit 44e4f7cfe7
4 changed files with 124 additions and 3 deletions

View File

@@ -19,12 +19,23 @@
/* Console output macro */
#define CPRINTF(format, args...) cprintf(CC_USB, format, ## args)
#ifdef CONFIG_USB_BOS
/* v2.01 (vs 2.00) BOS Descriptor provided */
#define USB_DEV_BCDUSB 0x0201
#else
#define USB_DEV_BCDUSB 0x0200
#endif
#ifndef USB_DEV_CLASS
#define USB_DEV_CLASS USB_CLASS_PER_INTERFACE
#endif
/* USB Standard Device Descriptor */
static const struct usb_device_descriptor dev_desc = {
.bLength = USB_DT_DEVICE_SIZE,
.bDescriptorType = USB_DT_DEVICE,
.bcdUSB = 0x0200, /* v2.00 */
.bDeviceClass = USB_CLASS_PER_INTERFACE,
.bcdUSB = USB_DEV_BCDUSB,
.bDeviceClass = USB_DEV_CLASS,
.bDeviceSubClass = 0x00,
.bDeviceProtocol = 0x00,
.bMaxPacketSize0 = USB_MAX_PACKET_SIZE,
@@ -100,6 +111,12 @@ static void ep0_rx(void)
desc = __usb_desc;
len = USB_DESC_SIZE;
break;
#ifdef CONFIG_USB_BOS
case USB_DT_BOS: /* Setup : Get BOS descriptor */
desc = bos_ctx.descp;
len = bos_ctx.size;
break;
#endif
case USB_DT_STRING: /* Setup : Get string descriptor */
if (idx >= USB_STR_COUNT)
/* The string does not exist : STALL */

View File

@@ -1041,6 +1041,12 @@
/* Support for USB type-c superspeed mux */
#undef CONFIG_USBC_SS_MUX
/* Support for USB type-c vconn. Not needed for captive cables. */
#undef CONFIG_USBC_VCONN
/* USB Binary device Object Store support */
#undef CONFIG_USB_BOS
/*****************************************************************************/
/* USB interfaces config */

View File

@@ -24,6 +24,8 @@
#define USB_DT_OTHER_SPEED_CONFIG 0x07
#define USB_DT_INTERFACE_POWER 0x08
#define USB_DT_DEBUG 0x0a
#define USB_DT_BOS 0x0f
#define USB_DT_DEVICE_CAPABILITY 0x10
/* USB Device Descriptor */
struct usb_device_descriptor {
@@ -44,6 +46,46 @@ struct usb_device_descriptor {
} __packed;
#define USB_DT_DEVICE_SIZE 18
/* BOS Descriptor ( USB3.1 rev1 Section 9.6.2 ) */
struct bos_context {
void *descp;
int size;
};
struct usb_bos_hdr_descriptor {
uint8_t bLength;
uint8_t bDescriptorType; /* USB_DT_BOS */
uint16_t wTotalLength; /* Total length of of hdr + all dev caps */
uint8_t bNumDeviceCaps; /* Container ID Descriptor + others */
} __packed;
#define USB_DT_BOS_SIZE 5
/* Container ID Descriptor */
struct usb_contid_caps_descriptor {
uint8_t bLength;
uint8_t bDescriptorType; /* USB_DT_DEVICE_CAPABILITY */
uint8_t bDevCapabilityType; /* USB_DC_DTYPE_xxx */
uint8_t bReserved; /* SBZ */
uint8_t ContainerID[16]; /* UUID */
} __packed;
#define USB_DT_CONTID_SIZE 20
/* Device Cap Type Codes ( offset 2 of Device Capability Descriptor */
#define USB_DC_DTYPE_WIRELESS 0x01
#define USB_DC_DTYPE_USB20EXT 0x02
#define USB_DC_DTYPE_USBSS 0x03
#define USB_DC_DTYPE_CONTID 0x04
#define USB_DC_DTYPE_PLATFORM 0x05
#define USB_DC_DTYPE_PD 0x06
#define USB_DC_DTYPE_BATTINFO 0x07
#define USB_DC_DTYPE_CONSUMER 0x08
#define USB_DC_DTYPE_PRODUCER 0x09
#define USB_DC_DTYPE_USBSSP 0x0a
#define USB_DC_DTYPE_PCSTIME 0x0b
#define USB_DC_DTYPE_WUSBEXT 0x0c
#define USB_DC_DTYPE_BILLBOARD 0x0d
/* RESERVED 0x00, 0xOe - 0xff */
/* Configuration Descriptor */
struct usb_config_descriptor {
uint8_t bLength;
@@ -103,6 +145,7 @@ struct usb_endpoint_descriptor {
#define USB_CLASS_CSCID 0x0b
#define USB_CLASS_CONTENT_SEC 0x0d
#define USB_CLASS_VIDEO 0x0e
#define USB_CLASS_BILLBOARD 0x11
#define USB_CLASS_WIRELESS_CONTROLLER 0xe0
#define USB_CLASS_MISC 0xef
#define USB_CLASS_APP_SPEC 0xfe
@@ -211,9 +254,10 @@ static inline void memcpy_usbram(usb_uint *ebuf, const uint8_t *src, int size)
(((uint32_t)(x) - (uint32_t)__usb_ram_start) \
/ (sizeof(usb_uint)/sizeof(uint16_t)))
/* String descriptors are defined in the board code */
/* These descriptors defined in board code */
extern const void * const usb_strings[];
extern const uint8_t usb_string_desc[];
extern struct bos_context bos_ctx;
/* Helpers for endpoint declaration */

54
include/usb_bb.h Normal file
View File

@@ -0,0 +1,54 @@
/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*
* USB billboard definitions.
*/
#ifndef USB_BB_H
#define USB_BB_H
/* per Billboard Device Class Spec Revision 1.0 */
/* device descriptor fields */
#define USB_BB_BCDUSB_MIN 0x0201 /* v2.01 minimum */
#define USB_BB_SUBCLASS 0x00
#define USB_BB_PROTOCOL 0x00
#define USB_BB_EP0_PACKET_SIZE 8
#define USB_BB_CAP_DESC_TYPE 0x0d
#define USB_BB_CAPS_SVID_SIZE 4
struct usb_bb_caps_svid_descriptor {
uint16_t wSVID;
uint8_t bAlternateMode;
uint8_t iAlternateModeString;
} __packed;
#define USB_BB_CAPS_BASE_SIZE 44
struct usb_bb_caps_base_descriptor {
uint8_t bLength;
uint8_t bDescriptorType;
uint8_t bDevCapabilityType;
uint8_t iAdditionalInfoURL;
uint8_t bNumberOfAlternateModes;
uint8_t bPreferredAlternateMode;
uint16_t VconnPower;
uint8_t bmConfigured[32]; /* 2b per SVID w/ 128 SVIDs allowed. */
uint32_t bReserved; /* SBZ */
} __packed;
#define USB_BB_VCONN_PWRON(x) (x << 15)
#define USB_BB_VCONN_PWR_1W 0
#define USB_BB_VCONN_PWR_1p5W 1
#define USB_BB_VCONN_PWR_2W 2
#define USB_BB_VCONN_PWR_3W 3
#define USB_BB_VCONN_PWR_4W 4
#define USB_BB_VCONN_PWR_5W 5
#define USB_BB_VCONN_PWR_6W 6
/* Note, 7W (111b) is reserved */
#endif /* USB_BB_H */