Skip to main content

UsbFunctionProxy

Struct UsbFunctionProxy 

Source
pub struct UsbFunctionProxy { /* private fields */ }

Implementations§

Source§

impl UsbFunctionProxy

Source

pub fn new(channel: AsyncChannel) -> Self

Create a new Proxy for fuchsia.hardware.usb.function/UsbFunction.

Source

pub fn take_event_stream(&self) -> UsbFunctionEventStream

Get a Stream of events from the remote end of the protocol.

§Panics

Panics if the event stream was already taken.

Source

pub fn connect_to_endpoint( &self, ep_addr: u8, ep: ServerEnd<EndpointMarker>, ) -> QueryResponseFut<UsbFunctionConnectToEndpointResult, DefaultFuchsiaResourceDialect> ⓘ

Connect to an allocated endpoint.

This must be called after the endpoint has been allocated via [AllocResources]. If the endpoint channel was not provided during AllocResources, this method must be called to establish the endpoint channel before any data transfers can occur on the endpoint.

If the endpoint channels were not provided in AllocResources and this is never called, the protocol client cannot communicate with the endpoint (no channel is established). This does not prevent control-plane callbacks (like SetConfigured) from being made.

The endpoint connection persists across Configure and Deconfigure calls. If the protocol server closes the connection (server end closes), it indicates that the endpoint is no longer available (e.g. device disconnected or function removed). The protocol client should clean up by closing its client end of the channel, cancelling any pending I/O operations, and stopping any tasks using the endpoint. The protocol client is not required to call DisableEndpoint or Deconfigure in this case (and such calls may fail if the interface is being torn down).

  • error:
    • ZX_ERR_NOT_FOUND if endpoint address does not exist (e.g. not allocated).
    • ZX_ERR_ALREADY_BOUND if the endpoint is already bound to an active channel. To connect a new channel, the existing channel must be closed first. Note that channel closure detection is asynchronous; if the protocol client closes the existing channel and immediately calls ConnectToEndpoint, it may still fail with ZX_ERR_ALREADY_BOUND if the protocol server has not yet processed the closure.
Source

pub fn configure( &self, configuration: &[u8], iface: ClientEnd<UsbFunctionInterfaceMarker>, ) -> QueryResponseFut<UsbFunctionConfigureResult, DefaultFuchsiaResourceDialect> ⓘ

Configure the function with the given descriptors.

Ordering: This must be called after AllocResources has been called to allocate all interfaces, endpoints, and strings referenced in the descriptors. Calling this when already configured returns ZX_ERR_ALREADY_BOUND.

This binds the [UsbFunctionInterface] callback channel (where the protocol client acts as the server).

configuration is a vector of concatenated USB descriptors in standard USB wire format (Interface -> Endpoint -> Class/Vendor descriptors). A raw byte vector is used to allow arbitrary class-specific and vendor-specific descriptors that cannot be statically defined in FIDL.

This byte vector is expected to contain one or more interface descriptors following the USB specification.

This descriptor block is cached by the peripheral controller and sent as-is to the host in response to standard host GET_DESCRIPTOR (Configuration) requests.

Structure and Validation:

  • Must begin with an Interface or Interface Association descriptor.
  • Standard descriptors (Interface, Endpoint) embedded in the vector must follow the standard USB specification descriptor layouts.
  • All interface numbers and endpoint addresses must match the resources allocated in [AllocResources].
  • The peripheral controller parses this vector linearly using descriptor length fields. Mismatched resource IDs or malformed layouts return ZX_ERR_INVALID_ARGS.

iface is the client end of [UsbFunctionInterface] which the protocol server uses to send events to the protocol client.

The function remains configured until Deconfigure is called or the iface channel is closed. If iface is closed, the function is automatically deconfigured, which stops the peripheral controller and disconnects the device from the host.

  • error:
    • ZX_ERR_INVALID_ARGS if the configuration is invalid or references unallocated resources.
    • ZX_ERR_ALREADY_BOUND if the function interface is already bound.
    • ZX_ERR_NO_MEMORY if the protocol server fails to allocate memory to store the descriptors.
    • ZX_ERR_BAD_STATE if the peripheral device is stopping or tearing down.
Source

pub fn deconfigure( &self, ) -> QueryResponseFut<UsbFunctionDeconfigureResult, DefaultFuchsiaResourceDialect> ⓘ

Deconfigure the function.

Ordering: Can be called at any time. If the function is not configured, it trivially succeeds.

This is the opposite of Configure. The protocol server disables all physical endpoints for this function, clears its stored descriptors, and unbinds the iface channel. If the function was active, the peripheral controller may trigger a USB re-enumeration to reflect the updated function configuration.

This does not close the endpoint channels (they remain connected and can be reused if the function is re-configured).

  • error:
    • ZX_ERR_UNAVAILABLE if a deconfiguration is already in progress.
Source

pub fn alloc_resources( &self, interface_count: u8, endpoints: Vec<EndpointResource>, strings: &[String], ) -> QueryResponseFut<UsbFunctionAllocResourcesResult, DefaultFuchsiaResourceDialect> ⓘ

Allocate resources for the function.

This method is atomic. If any resource allocation fails, all allocations made during this call are rolled back.

This must be called during driver initialization before Configure. Calling this after the function has been configured returns ZX_ERR_BAD_STATE.

interface_count informs how many interfaces to create. interface_nums returns a vector of length interface_count containing the allocated interface numbers.

endpoints is a vector of endpoints to allocate. The direction and endpoint server end are provided. The protocol client can optionally provide endpoint channels in endpoints to connect them immediately. If an endpoint channel is not provided, the protocol client must call [ConnectToEndpoint] later to use it. endpoint_addrs returns a vector of the same size containing the allocated endpoint addresses, where element i corresponds 1:1 to element i of endpoints. All endpoint channels provided here or connected later via [ConnectToEndpoint] persist across [Configure] and [Deconfigure] calls.

strings is a vector of strings to allocate. string_indices returns a vector of the same size containing the allocated string indices, where element i corresponds 1:1 to element i of strings.

Returns the interface ids, endpoint ids, and string ids that were allocated. On error, no resources are allocated.

The allocated resource numbers and addresses remain allocated for the lifetime of the connection to UsbFunction. They are not freed on Deconfigure.

  • error:
    • ZX_ERR_BAD_STATE if the function has already been configured.
    • ZX_ERR_NO_RESOURCES if any resource namespace numbers are exhausted.
    • ZX_ERR_INVALID_ARGS if the endpoint configuration contains invalid arguments.
Source

pub fn endpoint_set_stall( &self, endpoint_address: u8, ) -> QueryResponseFut<UsbFunctionEndpointSetStallResult, DefaultFuchsiaResourceDialect> ⓘ

Stall the endpoint.

The endpoint must have been allocated and configured.

This method returns after the hardware confirms the stall condition is active. All pending transfers queued on the endpoint are cancelled and completed with ZX_ERR_IO_REFUSED via OnCompletion. While the endpoint is stalled, any new requests submitted via QueueRequests must immediately fail and complete with ZX_ERR_IO_REFUSED.

  • error:
    • ZX_ERR_BAD_STATE if the function is not configured.
    • ZX_ERR_IO_NOT_PRESENT if the device is not running, disconnected, or inactive.
    • ZX_ERR_NOT_FOUND if the endpoint address does not exist (not allocated).
Source

pub fn endpoint_clear_stall( &self, endpoint_address: u8, ) -> QueryResponseFut<UsbFunctionEndpointClearStallResult, DefaultFuchsiaResourceDialect> ⓘ

Clear the endpoint’s stalled state.

The endpoint must have been allocated and configured.

This method returns after the hardware confirms the stall has been cleared. As required by USB 2.0 Section 9.4.5, clearing the halt feature also resets the endpoint’s data toggle bit to DATA0 in hardware. The client must resubmit any cancelled transfers once the endpoint is cleared. Any requests queued after this method returns are processed normally.

  • error:
    • ZX_ERR_BAD_STATE if the function is not configured.
    • ZX_ERR_IO_NOT_PRESENT if the device is not running, disconnected, or inactive.
    • ZX_ERR_NOT_FOUND if the endpoint address does not exist (not allocated).
Source

pub fn configure_endpoint( &self, endpoint_address: u8, endpoint_configuration: &EndpointConfiguration, ) -> QueryResponseFut<UsbFunctionConfigureEndpointResult, DefaultFuchsiaResourceDialect> ⓘ

Configure and enable an endpoint with the given configuration.

Called by the function driver in response to SetConfigured (when configured == true) or SetInterface requests to enable physical transfers on the endpoint. Calling this before the function has been configured via Configure returns ZX_ERR_BAD_STATE. Clients should wait for the SetConfigured or SetInterface request before configuring endpoints to ensure the host is ready.

The endpoint must have been allocated via AllocResources.

Returns only after the physical endpoint has been configured by the DCI driver.

See USB 2.0 Specification Section 9.6.6 (Endpoint Descriptor) for details on the standard endpoint configuration fields mapped in EndpointConfiguration.

  • error:
    • ZX_ERR_BAD_STATE if the function is not configured.
    • ZX_ERR_IO_NOT_PRESENT if the device is not running, disconnected, or inactive.
    • ZX_ERR_NOT_FOUND if the endpoint address does not exist (not allocated).
    • ZX_ERR_INVALID_ARGS if the configuration is invalid.
Source

pub fn disable_endpoint( &self, endpoint_address: u8, ) -> QueryResponseFut<UsbFunctionDisableEndpointResult, DefaultFuchsiaResourceDialect> ⓘ

Disable an endpoint.

Called by the function driver in response to SetConfigured (when configured == false) or SetInterface requests to disable physical transfers on the endpoint. Calling this when the endpoint is already disabled is a no-op and returns ZX_OK. If called before the function has been configured via Configure, it also trivially succeeds (ZX_OK), as the endpoint is already unconfigured and disabled.

The endpoint must have been allocated via AllocResources.

Returns only after the physical endpoint has been disabled by the DCI driver.

  • error:
    • ZX_ERR_IO_NOT_PRESENT if the device is not running, disconnected, or inactive.
    • ZX_ERR_NOT_FOUND if the endpoint address does not exist (not allocated).

Trait Implementations§

Source§

impl Clone for UsbFunctionProxy

Source§

fn clone(&self) -> UsbFunctionProxy

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for UsbFunctionProxy

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Proxy for UsbFunctionProxy

Source§

type Protocol = UsbFunctionMarker

The protocol which this Proxy controls.
Source§

fn from_channel(inner: AsyncChannel) -> Self

Create a proxy over the given channel.
Source§

fn into_channel(self) -> Result<AsyncChannel, Self>

Attempt to convert the proxy back into a channel. Read more
Source§

fn as_channel(&self) -> &AsyncChannel

Get a reference to the proxy’s underlying channel. Read more
Source§

fn into_client_end(self) -> Result<ClientEnd<Self::Protocol>, Self>

Attempt to convert the proxy back into a client end. Read more
Source§

fn is_closed(&self) -> bool

Returns true if the proxy has received the PEER_CLOSED signal.
Source§

fn on_closed(&self) -> OnSignals<'_, Unowned<'_, NullableHandle>> ⓘ

Returns a future that completes when the proxy receives the PEER_CLOSED signal.
Source§

impl UsbFunctionProxyInterface for UsbFunctionProxy

Source§

type ConnectToEndpointResponseFut = QueryResponseFut<Result<(), i32>>

Source§

type ConfigureResponseFut = QueryResponseFut<Result<(), i32>>

Source§

type DeconfigureResponseFut = QueryResponseFut<Result<(), i32>>

Source§

type AllocResourcesResponseFut = QueryResponseFut<Result<(Vec<u8>, Vec<u8>, Vec<u8>), i32>>

Source§

type EndpointSetStallResponseFut = QueryResponseFut<Result<(), i32>>

Source§

type EndpointClearStallResponseFut = QueryResponseFut<Result<(), i32>>

Source§

type ConfigureEndpointResponseFut = QueryResponseFut<Result<(), i32>>

Source§

type DisableEndpointResponseFut = QueryResponseFut<Result<(), i32>>

Source§

fn connect_to_endpoint( &self, ep_addr: u8, ep: ServerEnd<EndpointMarker>, ) -> Self::ConnectToEndpointResponseFut

Source§

fn configure( &self, configuration: &[u8], iface: ClientEnd<UsbFunctionInterfaceMarker>, ) -> Self::ConfigureResponseFut

Source§

fn deconfigure(&self) -> Self::DeconfigureResponseFut

Source§

fn alloc_resources( &self, interface_count: u8, endpoints: Vec<EndpointResource>, strings: &[String], ) -> Self::AllocResourcesResponseFut

Source§

fn endpoint_set_stall( &self, endpoint_address: u8, ) -> Self::EndpointSetStallResponseFut

Source§

fn endpoint_clear_stall( &self, endpoint_address: u8, ) -> Self::EndpointClearStallResponseFut

Source§

fn configure_endpoint( &self, endpoint_address: u8, endpoint_configuration: &EndpointConfiguration, ) -> Self::ConfigureEndpointResponseFut

Source§

fn disable_endpoint( &self, endpoint_address: u8, ) -> Self::DisableEndpointResponseFut

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T, D> Encode<Ambiguous1, D> for T
where D: ResourceDialect,

Source§

unsafe fn encode( self, _encoder: &mut Encoder<'_, D>, _offset: usize, _depth: Depth, ) -> Result<(), Error>

Encodes the object into the encoder’s buffers. Any handles stored in the object are swapped for Handle::INVALID. Read more
Source§

impl<T, D> Encode<Ambiguous2, D> for T
where D: ResourceDialect,

Source§

unsafe fn encode( self, _encoder: &mut Encoder<'_, D>, _offset: usize, _depth: Depth, ) -> Result<(), Error>

Encodes the object into the encoder’s buffers. Any handles stored in the object are swapped for Handle::INVALID. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromClient for T
where T: Proxy,

Source§

type Protocol = <T as Proxy>::Protocol

The protocol.
Source§

fn from_client(value: ClientEnd<<T as FromClient>::Protocol>) -> T

Converts from a client.
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> ProxyHasDomain for T
where T: Proxy,

Source§

fn domain(&self) -> ZirconClient

Get a “client” for this proxy. This is just an object which has methods for a few common handle creation operations.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.