// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#pragma once
// clang-format off
__BEGIN_CDECLS;
// Hub request types
#define USB_RECIP_HUB (USB_TYPE_CLASS | USB_RECIP_DEVICE)
#define USB_RECIP_PORT (USB_TYPE_CLASS | USB_RECIP_OTHER)
// Hub requests
#define USB_HUB_SET_DEPTH 12
// Hub descriptor types
#define USB_HUB_DESC_TYPE 0x29
#define USB_HUB_DESC_TYPE_SS 0x2A // for superspeed hubs
// Hub Class Feature Selectors (USB 2.0 spec Table 11.17)
#define USB_FEATURE_C_HUB_LOCAL_POWER 0
#define USB_FEATURE_C_HUB_OVER_CURRENT 1
#define USB_FEATURE_PORT_CONNECTION 0
#define USB_FEATURE_PORT_ENABLE 1
#define USB_FEATURE_PORT_SUSPEND 2
#define USB_FEATURE_PORT_OVER_CURRENT 3
#define USB_FEATURE_PORT_RESET 4
#define USB_FEATURE_PORT_LINK_STATE 5
#define USB_FEATURE_PORT_POWER 8
#define USB_FEATURE_PORT_LOW_SPEED 9
#define USB_FEATURE_C_PORT_CONNECTION 16
#define USB_FEATURE_C_PORT_ENABLE 17
#define USB_FEATURE_C_PORT_SUSPEND 18
#define USB_FEATURE_C_PORT_OVER_CURRENT 19
#define USB_FEATURE_C_PORT_RESET 20
#define USB_FEATURE_PORT_TEST 21
#define USB_FEATURE_PORT_INDICATOR 22
#define USB_FEATURE_PORT_INDICATOR 22
#define USB_FEATURE_PORT_U1_TIMEOUT 23
#define USB_FEATURE_PORT_U2_TIMEOUT 24
#define USB_FEATURE_C_PORT_LINK_STATE 25
#define USB_FEATURE_C_PORT_CONFIG_ERROR 26
#define USB_FEATURE_PORT_REMOTE_WAKE_MASK 27
#define USB_FEATURE_BH_PORT_RESET 28
#define USB_FEATURE_C_BH_PORT_RESET 29
#define USB_FEATURE_FORCE_LINKPM_ACCEPT 30
typedef struct {
uint8_t bDescLength;
uint8_t bDescriptorType;
uint8_t bNbrPorts;
uint16_t wHubCharacteristics;
uint8_t bPowerOn2PwrGood;
uint8_t bHubContrCurrent;
union {
// USB 2.0
struct {
// variable length depending on number of ports
uint8_t DeviceRemovable[4];
uint8_t PortPwrCtrlMask[4];
} __attribute__ ((packed)) hs;
// USB 3.0
struct {
uint8_t bHubHdrDecLat;
uint16_t wHubDelay;
uint16_t DeviceRemovable;
} __attribute__ ((packed)) ss;
} __attribute__ ((packed));
} __attribute__ ((packed)) usb_hub_descriptor_t;
typedef struct {
uint16_t wHubStatus;
uint16_t wHubChange;
} __attribute__ ((packed)) usb_hub_status_t;
// wHubStatus bits
#define USB_HUB_LOCAL_POWER (1 << 0)
#define USB_HUB_OVER_CURRENT (1 << 1)
typedef struct {
uint16_t wPortStatus;
uint16_t wPortChange;
} __attribute__ ((packed)) usb_port_status_t;
// Port Status bits
#define USB_PORT_CONNECTION (1 << 0)
#define USB_PORT_ENABLE (1 << 1)
#define USB_PORT_SUSPEND (1 << 2) // USB 2.0 only
#define USB_PORT_OVER_CURRENT (1 << 3)
#define USB_PORT_RESET (1 << 4)
#define USB_PORT_POWER (1 << 8) // USB 2.0 only
#define USB_PORT_LOW_SPEED (1 << 9) // USB 2.0 only
#define USB_PORT_HIGH_SPEED (1 << 10) // USB 2.0 only
#define USB_PORT_TEST_MODE (1 << 11) // USB 2.0 only
#define USB_PORT_INDICATOR_CONTROL (1 << 12) // USB 2.0 only
// Port Status Changed bits
#define USB_C_PORT_CONNECTION (1 << 0)
#define USB_C_PORT_ENABLE (1 << 1) // USB 2.0 only
#define USB_C_PORT_SUSPEND (1 << 2) // USB 2.0 only
#define USB_C_PORT_OVER_CURRENT (1 << 3)
#define USB_C_PORT_RESET (1 << 4)
#define USB_C_BH_PORT_RESET (1 << 5) // USB 3.0 only
#define USB_C_PORT_LINK_STATE (1 << 6) // USB 3.0 only
#define USB_C_PORT_CONFIG_ERROR (1 << 7) // USB 3.0 only
#define USB_C_PORT_POWER (1 << 8) // USB 2.0 only
#define USB_C_PORT_LOW_SPEED (1 << 9) // USB 2.0 only
#define USB_C_PORT_HIGH_SPEED (1 << 10) // USB 2.0 only
#define USB_C_PORT_TEST_MODE (1 << 11) // USB 2.0 only
#define USB_C_PORT_INDICATOR_CONTROL (1 << 12) // USB 2.0 only
__END_CDECLS;