blob: e714584b466a272c47920fccbfbe2fa75058ec9a [file] [log] [blame]
// 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.
library ddk.protocol.usb.device;
using zircon.hw.usb;
using zx;
[Layout="ddk-callback"]
interface UsbRequestComplete {
Callback(UsbRequest2? req) -> ();
};
[Layout="ddk-callback"]
interface UsbRequestRelease {
Callback(UsbRequest2? req) -> ();
};
/// Should be set by the requestor.
struct UsbHeader2 {
/// Frame number for scheduling isochronous transfers.
uint64 frame;
uint32 device_id;
/// bEndpointAddress from endpoint descriptor.
uint8 ep_address;
/// Number of bytes to transfer.
zx.off length;
/// Send zero length packet if length is multiple of max packet size.
bool send_zlp;
};
/// Response data.
/// (Filled in by processor before |UsbRequestComplete()| is called)
struct UsbResponse2 {
/// Status of transaction.
zx.status status;
/// Number of bytes actually transferred (on success).
zx.off actual;
};
struct UsbRequest2 {
UsbHeader2 header;
/// For control transactions.
zircon.hw.usb.UsbSetup setup;
/// VMO handle for payload.
handle<vmo> vmo_handle;
handle<bti> bti_handle;
usize size;
/// Offset of the start of data from first page address of the vmo.
zx.off offset;
/// Mapped address of the first page of the vmo.
/// Add offset to get actual data.
vector<voidptr> virt;
handle pmt;
/// Phys addresses of the payload.
vector<zx.paddr> phys_list;
/// The |complete.callback()| callback is set by the requestor and is
/// invoked by the 'complete' ops method when it is called by
/// the processor upon completion of the usb request.
/// The saved_complete_cb field can be used to temporarily save
/// the original callback and overwrite it with the desired intermediate
/// callback.
UsbRequestComplete? complete;
/// Set by the requestor for opting out of the complete_cb()
/// callback for successfully completed requests. The callback
/// will still be invoked if an error is encountered.
/// This is useful for isochronous requests, where the requestor
/// may not care about most callbacks. They will still have to request
/// callbacks at a regular interval to queue more data, and free or
/// reuse previously silently completed requests.
bool cb_on_error_only;
/// The current 'owner' of the usb request may save the original
/// complete callback and cookie, allowing them to insert an
/// intermediate callback.
UsbRequestComplete? saved_complete;
UsbResponse2 response;
vector<voidptr> context;
/// The release.callback() callback is set by the allocator and is
/// invoked by the 'usb_request_release' method when it is called
/// by the requestor.
UsbRequestRelease? release;
};
[Layout="ddk-protocol"]
interface Usb {
Control(uint8 request_type, uint8 @request, uint16 value, uint16 index,
vector<voidptr> data, zx.time timeout) -> (zx.status s, usize length);
/// queues a USB request
RequestQueue(UsbRequest2? req) -> ();
GetSpeed() -> (zircon.hw.usb.UsbSpeed s);
SetInterface(int64 interface_number, uint8 alt_setting) -> (zx.status s);
SetConfiguration(uint8 configuration) -> (zx.status s);
GetConfiguration() -> (uint8 configuration);
EnableEndpoint(zircon.hw.usb.UsbEndpointDescriptor ep_desc,
zircon.hw.usb.UsbSsEpCompDescriptor ss_com_desc,
bool enable) -> (zx.status s);
/// 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(uint8 ep_address) -> (zx.status s);
/// returns the maximum amount of data that can be transferred on an endpoint in a single
/// transaction.
GetMaxTransferSize(uint8 ep_address) -> (usize s);
GetDeviceId() -> (uint32 dev_id);
GetDeviceDescriptor() -> (zircon.hw.usb.UsbDeviceDescriptor desc);
GetConfigurationDescriptor(uint8 configuration)
-> (vector<zircon.hw.usb.UsbConfigurationDescriptor>? desc);
/// returns the USB descriptors for the USB device or interface
/// the returned value is de-allocated with free()
GetDescriptorList() -> (vector<voidptr> descriptors);
/// 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(uint8 desc_id, uint16 lang_id) -> (zx.status s, uint16 lang_id,
vector<voidptr> buf);
CancelAll(uint8 ep_address) -> (zx.status s);
GetCurrentFrame() -> (uint64 frame);
};