C++程序  |  115行  |  4.03 KB

// 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;