blob: de7bd5fb148e87d44187f6becd8dd4a356c42e1a [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
module device.usb;
enum OpenDeviceError {
// Opening the device succeeded.
OK,
// The operating system denied access to the device.
ACCESS_DENIED,
// The device is already open.
ALREADY_OPEN,
};
enum TransferDirection {
INBOUND,
OUTBOUND,
};
enum ControlTransferType {
STANDARD,
CLASS,
VENDOR,
RESERVED
};
enum ControlTransferRecipient {
DEVICE,
INTERFACE,
ENDPOINT,
OTHER
};
enum EndpointType {
BULK,
INTERRUPT,
ISOCHRONOUS,
};
struct EndpointInfo {
uint8 endpoint_number;
TransferDirection direction;
EndpointType type;
uint32 packet_size;
};
struct AlternateInterfaceInfo {
uint8 alternate_setting;
uint8 class_code;
uint8 subclass_code;
uint8 protocol_code;
string? interface_name;
array<EndpointInfo> endpoints;
};
struct InterfaceInfo {
uint8 interface_number;
array<AlternateInterfaceInfo> alternates;
};
struct ConfigurationInfo {
uint8 configuration_value;
string? configuration_name;
array<InterfaceInfo> interfaces;
};
struct WebUsbFunctionSubset {
uint8 first_interface;
array<string> origins;
};
struct WebUsbConfigurationSubset {
uint8 configuration_value;
array<string> origins;
array<WebUsbFunctionSubset> functions;
};
struct WebUsbDescriptorSet {
array<string> origins;
array<WebUsbConfigurationSubset> configurations;
};
struct DeviceInfo {
string guid;
uint8 usb_version_major;
uint8 usb_version_minor;
uint8 usb_version_subminor;
uint8 class_code;
uint8 subclass_code;
uint8 protocol_code;
uint16 vendor_id;
uint16 product_id;
uint8 device_version_major;
uint8 device_version_minor;
uint8 device_version_subminor;
string? manufacturer_name;
string? product_name;
string? serial_number;
array<ConfigurationInfo> configurations;
WebUsbDescriptorSet? webusb_allowed_origins;
};
struct ControlTransferParams {
ControlTransferType type;
ControlTransferRecipient recipient;
uint8 request;
uint16 value;
uint16 index;
};
enum TransferStatus {
// The transfer completed successfully.
COMPLETED,
// The transfer failed due to a non-specific error.
TRANSFER_ERROR,
// The transfer was not allowed.
PERMISSION_DENIED,
// The transfer timed out.
TIMEOUT,
// The transfer was cancelled.
CANCELLED,
// The transfer stalled.
STALLED,
// The transfer failed because the device was disconnected from the host.
DISCONNECT,
// The transfer succeeded, but the device sent more data than was requested.
// This applies only to inbound transfers.
BABBLE,
// The transfer succeeded, but the device sent less data than was requested.
// This applies only to inbound transfers.
SHORT_PACKET,
};
struct IsochronousPacket {
uint32 length;
uint32 transferred_length;
TransferStatus status;
};
interface Device {
// Retrieve a DeviceInfo struct containing metadata about the device,
// including the set of all available device configurations.
GetDeviceInfo() => (DeviceInfo? info);
// Retrieves the |configuration_value| of the device's currently active
// configuration. Will return 0 if the device is unconfigured.
GetConfiguration() => (uint8 value);
// Opens the device. Methods below require the device be opened first.
Open() => (OpenDeviceError error);
// Closes the device.
Close() => ();
// Initiates a device control transfer to set the device's configuration to
// one with the configuration value |value|.
SetConfiguration(uint8 value) => (bool success);
// Claims a single interface in the current device configuration.
ClaimInterface(uint8 interface_number) => (bool success);
// Releases a claimed interface in the current device configuration.
ReleaseInterface(uint8 interface_number) => (bool success);
// Selects an alternate setting for a given claimed interface.
SetInterfaceAlternateSetting(uint8 interface_number, uint8 alternate_setting)
=> (bool success);
// Resets the device.
Reset() => (bool success);
// Clear the halt/stall condition for an endpoint.
ClearHalt(uint8 endpoint) => (bool success);
// Initiates an inbound control transfer request. |params| determine the
// details of the request. Transfers to recipients other than DEVICE require a
// corresponding interface to be claimed.
//
// |length| specifies the expected number of bytes to receive for this
// transfer. The size of |data| will never exceed |length|, and |data| will be
// null if |status| is neither COMPLETED, BABBLE, or SHORT_PACKET.
//
// |timeout| specifies the request timeout in milliseconds. A timeout of 0
// indicates no timeout: the request will remain pending indefinitely until
// completed or otherwise terminated.
ControlTransferIn(ControlTransferParams params, uint32 length, uint32 timeout)
=> (TransferStatus status, array<uint8>? data);
// Initiates an inbound control transfer request. |params| determine the
// details of the request. Transfers to recipients other than DEVICE require a
// corresponding interface to be claimed.
//
// |data| specifies the bytes to send the device in the body of the request.
//
// |timeout| specifies the request timeout in milliseconds. A timeout of 0
// indicates no timeout: the request will remain pending indefinitely until
// completed or otherwise terminated.
ControlTransferOut(ControlTransferParams params,
array<uint8> data,
uint32 timeout)
=> (TransferStatus status);
// Initiates an inbound generic transfer request on a specific endpoint. The
// interface to which |endpoint_number| belongs must be claimed, and the
// appropriate alternate setting must be set on that interface before
// transfers can be initiated on the endpoint. The endpoint must be of type
// BULK or INTERRUPT.
//
// |length| specifies the expected number of bytes to receive for this
// transfer. The size of |data| will never exceed |length|, and |data| will be
// null if |status| is neither COMPLETED, BABBLE, or SHORT_PACKET.
//
// |timeout| specifies the request timeout in milliseconds. A timeout of 0
// indicates no timeout: the request will remain pending indefinitely until
// completed or otherwise terminated.
GenericTransferIn(uint8 endpoint_number, uint32 length, uint32 timeout)
=> (TransferStatus status, array<uint8>? data);
// Initiates an outbound generic transfer request on a specific endpoint. The
// interface to which |endpoint_number| belongs must be claimed, and the
// appropriate alternate setting must be set on that interface before
// transfers can be initiated on the endpoint. The endpoint must be of type
// BULK or INTERRUPT.
//
// |data| specifies the bytes to send the device in the body of the request.
//
// |timeout| specifies the request timeout in milliseconds. A timeout of 0
// indicates no timeout: the request will remain pending indefinitely until
// completed or otherwise terminated.
GenericTransferOut(uint8 endpoint_number, array<uint8> data, uint32 timeout)
=> (TransferStatus status);
// Initiates an inbound isochronous transfer request on a specific endpoint.
// The interface to which |endpoint_number| belongs must be claimed, and the
// appropriate alternate setting must be set on that interface before
// transfers can be initiated on the endpoint. The endpoint must be of type
// ISOCHRONOUS.
//
// |packet_lengths| specifies the maximum expected number of bytes to receive
// for each packet in this transfer.
//
// |timeout| specifies the request timeout in milliseconds. A timeout of 0
// indicates no timeout: the request will remain pending indefinitely until
// completed or otherwise terminated.
//
// |data| contains the data received from the device, if any. |packets|
// contains the status of each packet received from the device, in order. The
// length of the packet indicates its position in |data| while it's
// transferred length gives the amount of data actually received from the
// device.
IsochronousTransferIn(uint8 endpoint_number,
array<uint32> packet_lengths,
uint32 timeout)
=> (array<uint8>? data, array<IsochronousPacket> packets);
// Initiates an outbound isochronous transfer request on a specific endpoint.
// The interface to which |endpoint_number| belongs must be claimed, and the
// appropriate alternate setting must be set on that interface before
// transfers can be initiated on the endpoint. The endpoint must be of type
// ISOCHRONOUS.
//
// |data| specifies the bytes to send to the device.
//
// |packet_lengths| specifies how |data| should be separated into packets when
// it is sent to the device.
//
// |timeout| specifies the request timeout in milliseconds. A timeout of 0
// indicates no timeout: the request will remain pending indefinitely until
// completed or otherwise terminated.
// |packets| contains the status of each packet sent to the device, in order.
IsochronousTransferOut(uint8 endpoint_number,
array<uint8> data,
array<uint32> packet_lengths,
uint32 timeout)
=> (array<IsochronousPacket> packets);
};