1 // Copyright (c) 2012 The Chromium 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 // Use the <code>chrome.usb</code> API to interact with connected USB 6 // devices. This API provides access to USB operations from within the context 7 // of an app. Using this API, apps can function as drivers for hardware devices. 8 namespace usb { 9 10 // Direction, Recipient, RequestType, and TransferType all map to their 11 // namesakes within the USB specification. 12 enum Direction {in, out}; 13 enum Recipient {device, _interface, endpoint, other}; 14 enum RequestType {standard, class, vendor, reserved}; 15 enum TransferType {control, interrupt, isochronous, bulk}; 16 17 // For isochronous mode, SynchronizationType and UsageType map to their 18 // namesakes within the USB specification. 19 enum SynchronizationType {asynchronous, adaptive, synchronous}; 20 enum UsageType {data, feedback, explicitFeedback}; 21 22 // A Device encapsulates everything that is needed to communicate with a USB 23 // device. They are returned by findDevice calls and have all of their 24 // fields populated before being returned. 25 dictionary Device { 26 long handle; 27 long vendorId; 28 long productId; 29 }; 30 31 dictionary EndpointDescriptor { 32 long address; 33 TransferType type; 34 Direction direction; 35 long maximumPacketSize; 36 37 // Used for isochronous mode. 38 SynchronizationType? synchronization; 39 UsageType? usage; 40 41 // If this is an interrupt endpoint, this will be 1-255 42 long? pollingInterval; 43 }; 44 45 dictionary InterfaceDescriptor { 46 long interfaceNumber; 47 long alternateSetting; 48 long interfaceClass; 49 long interfaceSubclass; 50 long interfaceProtocol; 51 DOMString? description; 52 EndpointDescriptor[] endpoints; 53 }; 54 55 // ControlTransferInfo represents that parameters to a single USB control 56 // transfer. 57 dictionary ControlTransferInfo { 58 // The direction of this transfer. 59 Direction direction; 60 61 // The intended recipient for this transfer. 62 Recipient recipient; 63 64 // The type of this request. 65 RequestType requestType; 66 67 long request; 68 long value; 69 long index; 70 71 // If this transfer is an input transfer, then this field must be set to 72 // indicate the expected data length. If this is an output transfer, then 73 // this field is ignored. 74 long? length; 75 76 // The data payload carried by this transfer. If this is an output tranfer 77 // then this field must be set. 78 ArrayBuffer? data; 79 }; 80 81 // GenericTransferInfo is used by both bulk and interrupt transfers to 82 // specify the parameters of the transfer. 83 dictionary GenericTransferInfo { 84 // The direction of this transfer. 85 Direction direction; 86 87 long endpoint; 88 89 // If this is an input transfer then this field indicates the size of the 90 // input buffer. If this is an output transfer then this field is ignored. 91 long? length; 92 93 // If this is an output transfer then this field must be populated. 94 // Otherwise, it will be ignored. 95 ArrayBuffer? data; 96 }; 97 98 // IsochronousTransferInfo describes a single multi-packet isochronous 99 // transfer. 100 dictionary IsochronousTransferInfo { 101 // All of the normal transfer parameters are encapsulated in the 102 // transferInfo parameters. Note that the data specified in this parameter 103 // block is split along packetLength boundaries to form the individual 104 // packets of the transfer. 105 GenericTransferInfo transferInfo; 106 107 // The total number of packets in this transfer. 108 long packets; 109 110 // The length of each of the packets in this transfer. 111 long packetLength; 112 }; 113 114 dictionary TransferResultInfo { 115 // A value of 0 indicates that the transfer was a success. Other values 116 // indicate failure. 117 long? resultCode; 118 119 // If the transfer was an input transfer then this field will contain all 120 // of the input data requested. 121 ArrayBuffer? data; 122 }; 123 124 // FindDevicesOptions describes the properties of devices which are found and 125 // opened via findDevices. 126 dictionary FindDevicesOptions { 127 long vendorId; 128 long productId; 129 long? interfaceId; 130 }; 131 132 callback VoidCallback = void (); 133 callback FindDevicesCallback = void (Device[] device); 134 callback ListInterfacesCallback = void (InterfaceDescriptor[] descriptors); 135 callback CloseDeviceCallback = void (); 136 callback TransferCallback = void (TransferResultInfo info); 137 callback ResetDeviceCallback = void(boolean result); 138 139 interface Functions { 140 // Finds the first instance of the USB device specified by the vendorId/ 141 // productId pair and, if permissions allow, opens it for use. 142 // Upon successfully opening a device the callback is invoked with a 143 // populated Device object. On failure, the callback is invoked with null. 144 // |options|: The properties to search for on target devices. 145 // |callback|: Invoked with the opened Device on success. 146 static void findDevices(FindDevicesOptions options, 147 FindDevicesCallback callback); 148 149 // Closes an open device instance. Invoking operations on a device after it 150 // has been closed is a safe operation, but causes no action to be taken. 151 // |device|: The device to close. 152 // |callback|: The callback to invoke once the device is closed. 153 static void closeDevice(Device device, 154 optional CloseDeviceCallback callback); 155 156 // Lists all the interfaces on the USB device. 157 // |device|: The device from which the interfaces should be listed. 158 // |callback|: The callback to invoke when the interfaces are enumerated. 159 static void listInterfaces(Device device, 160 ListInterfacesCallback callback); 161 162 // Claims an interface on the specified USB device. 163 // |device|: The device on which the interface is to be claimed. 164 // |interface|: The interface number to be claimed. 165 // |callback|: The callback to invoke once the interface is claimed. 166 static void claimInterface(Device device, long interfaceNumber, 167 VoidCallback callback); 168 169 // Releases a claim to an interface on the provided device. 170 // |device|: The device on which the interface is to be released. 171 // |interface|: The interface number to be released. 172 // |callback|: The callback to invoke once the interface is released. 173 static void releaseInterface(Device device, long interfaceNumber, 174 VoidCallback callback); 175 176 // Selects an alternate setting on a previously claimed interface on a 177 // device. 178 // |device|: The device on which the interface settings are to be set. 179 // |interface|: The interface number to be set. 180 // |alternateSetting|: The alternate setting to set. 181 // |callback|: The callback to invoke once the interface setting is set. 182 static void setInterfaceAlternateSetting(Device device, 183 long interfaceNumber, long alternateSetting, VoidCallback callback); 184 185 // Performs a control transfer on the specified device. See the 186 // ControlTransferInfo structure for the parameters required to make a 187 // transfer. 188 // |device|: An open device to make the transfer on. 189 // |transferInfo|: The parameters to the transfer. See ControlTransferInfo. 190 // |callback|: Invoked once the transfer has completed. 191 static void controlTransfer(Device device, 192 ControlTransferInfo transferInfo, TransferCallback callback); 193 194 // Performs a bulk transfer on the specified device. 195 // |device|: An open device to make the transfer on. 196 // |transferInfo|: The paramters to the transfer. See GenericTransferInfo. 197 // |callback|: Invoked once the transfer has completed. 198 static void bulkTransfer(Device device, GenericTransferInfo transferInfo, 199 TransferCallback callback); 200 201 // Performs an interrupt transfer on the specified device. 202 // |device|: An open device to make the transfer on. 203 // |transferInfo|: The paramters to the transfer. See GenericTransferInfo. 204 // |callback|: Invoked once the transfer has completed. 205 static void interruptTransfer(Device device, 206 GenericTransferInfo transferInfo, TransferCallback callback); 207 208 // Performs an isochronous transfer on the specific device. 209 // |device|: An open device to make the transfer on. 210 // |transferInfo|: The parameters to the transfer. See 211 // IsochronousTransferInfo. 212 // |callback|: Invoked once the transfer has been completed. 213 static void isochronousTransfer(Device device, 214 IsochronousTransferInfo transferInfo, 215 TransferCallback callback); 216 217 // Try to reset the USB device and restore the previous status. 218 // 219 // If the reset fails, the given device will be closed and the USB device 220 // will appear to be disconected and reconnected. 221 // You must call <code>findDevice</code> again to acquire the device. 222 // 223 // |device|: An opened device to reset. 224 // |callback|: Invoked once the device is reset with a boolean indicating 225 // whether the reset is completed successfully. 226 static void resetDevice(Device device, 227 ResetDeviceCallback callback); 228 }; 229 }; 230