// Copyright 2018 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.
@available(added=7)
library fuchsia.hardware.usb;

using fuchsia.hardware.usb.descriptor;
using fuchsia.hardware.usb.request;
using zx;

@transport("Banjo")
@banjo_layout("ddk-protocol")
protocol Usb {
    // Initiates a control transfer with the device in the OUT direction.
    ControlOut(struct {
        request_type uint8;
        request uint8;
        value uint16;
        index uint16;
        timeout zx.time;
        @buffer
        write vector<uint8>:MAX;
    }) -> (struct {
        status zx.status;
    });

    // Initiates a control transfer with the device in the IN direction.
    ControlIn(struct {
        request_type uint8;
        request uint8;
        value uint16;
        index uint16;
        timeout zx.time;
    }) -> (struct {
        status zx.status;
        @buffer
        read vector<uint8>:MAX;
    });

    /// Queues a USB request.
    RequestQueue(resource struct {
        @in_out
        usb_request fuchsia.hardware.usb.request.UsbRequest;
        @in_out
        complete_cb client_end:fuchsia.hardware.usb.request.UsbRequestCompleteCallback;
    }) -> ();

    /// Returns the speed of the device.
    GetSpeed() -> (struct {
        s fuchsia.hardware.usb.descriptor.UsbSpeed;
    });

    /// Selects an alternate setting for a USB interface.
    SetInterface(struct {
        interface_number uint8;
        alt_setting uint8;
    }) -> (struct {
        s zx.status;
    });

    /// Returns the currently selected configuration for the device.
    GetConfiguration() -> (struct {
        configuration uint8;
    });

    /// Selects the configuration for the device.
    SetConfiguration(struct {
        configuration uint8;
    }) -> (struct {
        s zx.status;
    });

    /// Enables a USB endpoint, configuring it as specified by the provided descriptors.
    EnableEndpoint(struct {
        ep_desc fuchsia.hardware.usb.descriptor.UsbEndpointDescriptor;
        ss_com_desc fuchsia.hardware.usb.descriptor.UsbSsEpCompDescriptor;
        enable bool;
    }) -> (struct {
        s zx.status;
    });

    /// Resets an endpoint that is in a halted or error state.
    /// Endpoints will be halted if the device returns a STALL in response to a USB transaction.
    /// When that occurs, the transaction will fail with ERR_IO_REFUSED.
    /// usb_reset_endpoint() the endpoint to normal running state.
    ResetEndpoint(struct {
        ep_address uint8;
    }) -> (struct {
        s zx.status;
    });

    /// Resets the device and restores the prior configuration.
    /// Returns ZX_ERR_BAD_STATE if the device is already being reset.
    ResetDevice() -> (struct {
        s zx.status;
    });

    /// Returns the maximum amount of data that can be transferred on an endpoint in a single
    /// transaction.
    GetMaxTransferSize(struct {
        ep_address uint8;
    }) -> (struct {
        s uint64;
    });

    /// Returns the device ID for the device.
    /// This ID is generated by and used internally by the USB HCI controller driver.
    GetDeviceId() -> (struct {
        dev_id uint32;
    });

    /// Returns the device's device descriptor.
    GetDeviceDescriptor() -> (struct {
        desc fuchsia.hardware.usb.descriptor.UsbDeviceDescriptor;
    });

    /// Returns the length of the configuration descriptor for the specified configuration.
    GetConfigurationDescriptorLength(struct {
        configuration uint8;
    }) -> (struct {
        s zx.status;
        length uint64;
    });

    /// Returns the configuration descriptor for the specified configuration.
    GetConfigurationDescriptor(struct {
        configuration uint8;
    }) -> (struct {
        s zx.status;
        @buffer
        desc vector<uint8>:MAX;
    });

    /// Returns the length of the USB descriptors for the USB device or interface.
    GetDescriptorsLength() -> (struct {
        length uint64;
    });

    /// returns the USB descriptors for the USB device or interface.
    GetDescriptors() -> (struct {
        @buffer
        descs vector<uint8>:MAX;
    });

    /// Fetch the descriptor using the provided descriptor ID and language ID.  If
    /// the language ID requested is not available, the first entry of the language
    /// ID table will be used instead and be provided in the updated version of the
    /// parameter.
    ///
    /// The string will be encoded using UTF-8, and will be truncated to fit the
    /// space provided by the buflen parameter.  buflen will be updated to indicate
    /// the amount of space needed to hold the actual UTF-8 encoded string lenth, and
    /// may be larger than the original value passed.  Embedded nulls may be present
    /// in the string, and the result may not be null terminated if the string
    /// occupies the entire provided buffer.
    GetStringDescriptor(struct {
        desc_id uint8;
        lang_id uint16;
    }) -> (struct {
        s zx.status;
        lang_id uint16;
        @buffer
        string vector<uint8>:MAX;
    });
    /// Cancels all transactions currently queued on the specified endpoint.
    CancelAll(struct {
        ep_address uint8;
    }) -> (struct {
        s zx.status;
    });

    /// Returns the current frame (in milliseconds), used for isochronous transfers.
    GetCurrentFrame() -> (struct {
        frame uint64;
    });

    /// Returns the size needed for a |usb_request_t|, including private storage needed by
    /// all layers of the USB stack.
    GetRequestSize() -> (struct {
        size uint64;
    });
};
