1// Copyright 2016 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#pragma once
6
7#include <ddk/device.h>
8#include <zircon/hw/usb.h>
9
10#include "usb-composite.h"
11
12// Represents an interface within a composite device
13typedef struct {
14    zx_device_t* zxdev;
15    usb_composite_t* comp;
16
17    // ID of the last interface in the descriptor list.
18    uint8_t last_interface_id;
19    usb_descriptor_header_t* descriptor;
20    size_t descriptor_length;
21    // descriptors for currently active endpoints
22    usb_endpoint_descriptor_t* active_endpoints[USB_MAX_EPS];
23
24    // node for usb_composite_t "children" list
25    list_node_t node;
26} usb_interface_t;
27
28extern usb_protocol_ops_t usb_device_protocol;
29extern usb_composite_protocol_ops_t usb_composite_device_protocol;
30extern zx_protocol_device_t usb_interface_proto;
31
32bool usb_interface_contains_interface(usb_interface_t* intf, uint8_t interface_id);
33
34zx_status_t usb_interface_set_alt_setting(usb_interface_t* intf, uint8_t interface_id,
35                                          uint8_t alt_setting);
36
37zx_status_t usb_interface_configure_endpoints(usb_interface_t* intf, uint8_t interface_id,
38                                              uint8_t alt_setting);
39