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
13 typedef 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 
28 extern usb_protocol_ops_t usb_device_protocol;
29 extern usb_composite_protocol_ops_t usb_composite_device_protocol;
30 extern zx_protocol_device_t usb_interface_proto;
31 
32 bool usb_interface_contains_interface(usb_interface_t* intf, uint8_t interface_id);
33 
34 zx_status_t usb_interface_set_alt_setting(usb_interface_t* intf, uint8_t interface_id,
35                                           uint8_t alt_setting);
36 
37 zx_status_t usb_interface_configure_endpoints(usb_interface_t* intf, uint8_t interface_id,
38                                               uint8_t alt_setting);
39