1 // Copyright 2014 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.
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.
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
};
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
};
22 // Returned by |getDevices| to identify a connected USB device.
24 // The id of the USB device. It remains unchanged until the device is
31 // Returned by |openDevice| to be used for USB communication.
32 // Every time a device is opened, a new connection handle is created.
34 // A connection handle represents the underlying data structure that contains
35 // all the data we need to communicate with a USB device, including the status
36 // of interfaces, the pending transfers, the descriptors, and etc. A connectin
37 // handle id is different from a USB device id.
39 // All connection handles can work together if the device allows it.
40 // The connection handle will be automatically closed when the app is reloaded
43 // When a connection handle is closed, all the interfaces it claimed will be
44 // released and all the transfers in progress will be canceled immediately.
45 dictionary ConnectionHandle
{
46 // The id of the USB connection handle.
52 dictionary EndpointDescriptor
{
56 long maximumPacketSize
;
58 // Used for isochronous mode.
59 SynchronizationType? synchronization
;
62 // If this is an interrupt endpoint, this will be 1-255.
63 long? pollingInterval
;
66 dictionary InterfaceDescriptor
{
68 long alternateSetting
;
70 long interfaceSubclass
;
71 long interfaceProtocol
;
72 DOMString? description
;
73 EndpointDescriptor
[] endpoints
;
76 // ControlTransferInfo represents that parameters to a single USB control
78 dictionary ControlTransferInfo
{
79 // The direction of this transfer.
82 // The intended recipient for this transfer.
85 // The type of this request.
86 RequestType requestType
;
92 // If this transfer is an input transfer, then this field must be set to
93 // indicate the expected data length. If this is an output transfer, then
94 // this field is ignored.
97 // The data payload carried by this transfer. If this is an output transfer
98 // then this field must be set.
102 // GenericTransferInfo is used by both bulk and interrupt transfers to
103 // specify the parameters of the transfer.
104 dictionary GenericTransferInfo
{
105 // The direction of this transfer.
110 // If this is an input transfer then this field indicates the size of the
111 // input buffer. If this is an output transfer then this field is ignored.
114 // If this is an output transfer then this field must be populated.
115 // Otherwise, it will be ignored.
119 // IsochronousTransferInfo describes a single multi-packet isochronous
121 dictionary IsochronousTransferInfo
{
122 // All of the normal transfer parameters are encapsulated in the
123 // transferInfo parameters. Note that the data specified in this parameter
124 // block is split along packetLength boundaries to form the individual
125 // packets of the transfer.
126 GenericTransferInfo transferInfo
;
128 // The total number of packets in this transfer.
131 // The length of each of the packets in this transfer.
135 dictionary TransferResultInfo
{
136 // A value of 0 indicates that the transfer was a success. Other values
140 // If the transfer was an input transfer then this field will contain all
141 // of the input data requested.
145 // Describes the properties of devices which are found via |getDevices|.
146 dictionary EnumerateDevicesOptions
{
151 // Describes the properties of devices which are found via |findDevices|.
152 dictionary EnumerateDevicesAndRequestAccessOptions
{
155 // The interface id to request access against.
156 // Only available on ChromeOS. It has no effect on other platforms.
160 callback VoidCallback
= void ();
161 callback GetDevicesCallback
= void (Device
[] devices
);
162 callback RequestAccessCallback
= void (boolean sucess
);
163 callback OpenDeviceCallback
= void (ConnectionHandle
handle);
164 callback FindDevicesCallback
= void (ConnectionHandle
[] handles
);
165 callback ListInterfacesCallback
= void (InterfaceDescriptor
[] descriptors
);
166 callback CloseDeviceCallback
= void ();
167 callback TransferCallback
= void (TransferResultInfo info
);
168 callback ResetDeviceCallback
= void(boolean result
);
170 interface Functions
{
171 // Lists USB devices specified by vendorId/productId/interfaceId tuple.
172 // |options|: The properties to search for on target devices.
173 // |callback|: Invoked with a list of |Device|s on complete.
174 static
void getDevices
(EnumerateDevicesOptions options
,
175 GetDevicesCallback
callback);
177 // This method is ChromeOS specific. Calling this method on other platforms
179 // Requests access from the permission broker to an OS claimed device if the
180 // given interface on the device is not claimed.
182 // |device|: The device to request access to.
184 static
void requestAccess
(Device device
,
186 RequestAccessCallback
callback);
188 // Opens a USB device returned by |getDevices|.
189 // |device|: The device to open.
190 // |callback|: Invoked with the created ConnectionHandle on complete.
191 static
void openDevice
(Device device
, OpenDeviceCallback
callback);
193 // Finds USB devices specified by the vendorId/productId/interfaceId tuple
194 // and, if permissions allow, opens them for use.
196 // On Chrome OS, you can specify the interfaceId. In that case the method
197 // will request access from permission broker in the same way as in
198 // |requestUsbAcess|.
200 // If the access request is rejected, or the device is failed to be opened,
201 // its connection handle will not be created or returned.
203 // Calling this method is equivalent to calling |getDevices| followed by
204 // a series of |requestAccess| (if it is on ChromeOs) and |openDevice|
205 // calls, and returning all the successfully opened connection handles.
207 // |options|: The properties to search for on target devices.
208 // |callback|: Invoked with the opened ConnectionHandle on complete.
209 static
void findDevices
(EnumerateDevicesAndRequestAccessOptions options
,
210 FindDevicesCallback
callback);
212 // Closes a connection handle. Invoking operations on a device after it
213 // has been closed is a safe operation, but causes no action to be taken.
214 // |handle|: The connection handle to close.
215 // |callback|: The callback to invoke once the device is closed.
216 static
void closeDevice
(ConnectionHandle
handle,
217 optional CloseDeviceCallback
callback);
219 // Lists all the interfaces on the USB device.
220 // |handle|: The device from which the interfaces should be listed.
221 // |callback|: The callback to invoke when the interfaces are enumerated.
222 static
void listInterfaces
(ConnectionHandle
handle,
223 ListInterfacesCallback
callback);
225 // Claims an interface on the specified USB device.
226 // Before you can transfer data with endpoints, you must claim their parent
227 // interfaces. Only one connection handle on the same host can claim each
228 // interface. If the interface is already claimed, this call will fail.
230 // You shall call releaseInterface when the interface is not needed anymore.
232 // |handle|: The device on which the interface is to be claimed.
233 // |interface|: The interface number to be claimed.
234 // |callback|: The callback to invoke once the interface is claimed.
235 static
void claimInterface
(ConnectionHandle
handle, long interfaceNumber
,
236 VoidCallback
callback);
238 // Releases a claim to an interface on the provided device.
239 // |handle|: The device on which the interface is to be released.
240 // |interface|: The interface number to be released.
241 // |callback|: The callback to invoke once the interface is released.
242 static
void releaseInterface
(ConnectionHandle
handle, long interfaceNumber
,
243 VoidCallback
callback);
245 // Selects an alternate setting on a previously claimed interface on a
247 // |handle|: The device on which the interface settings are to be set.
248 // |interface|: The interface number to be set.
249 // |alternateSetting|: The alternate setting to set.
250 // |callback|: The callback to invoke once the interface setting is set.
251 static
void setInterfaceAlternateSetting
(ConnectionHandle
handle,
252 long interfaceNumber
,
253 long alternateSetting
,
254 VoidCallback
callback);
256 // Performs a control transfer on the specified device. See the
257 // ControlTransferInfo structure for the parameters required to make a
260 // Conceptually control transfer talks to the device itself. You do not need
261 // to claim interface 0 to perform a control transfer.
263 // |handle|: A connection handle to make the transfer on.
264 // |transferInfo|: The parameters to the transfer. See ControlTransferInfo.
265 // |callback|: Invoked once the transfer has completed.
266 static
void controlTransfer
(ConnectionHandle
handle,
267 ControlTransferInfo transferInfo
,
268 TransferCallback
callback);
270 // Performs a bulk transfer on the specified device.
271 // |handle|: A connection handle to make the transfer on.
272 // |transferInfo|: The parameters to the transfer. See GenericTransferInfo.
273 // |callback|: Invoked once the transfer has completed.
274 static
void bulkTransfer
(ConnectionHandle
handle,
275 GenericTransferInfo transferInfo
,
276 TransferCallback
callback);
278 // Performs an interrupt transfer on the specified device.
279 // |handle|: A connection handle to make the transfer on.
280 // |transferInfo|: The parameters to the transfer. See GenericTransferInfo.
281 // |callback|: Invoked once the transfer has completed.
282 static
void interruptTransfer
(ConnectionHandle
handle,
283 GenericTransferInfo transferInfo
,
284 TransferCallback
callback);
286 // Performs an isochronous transfer on the specific device.
287 // |handle|: A connection handle to make the transfer on.
288 // |transferInfo|: The parameters to the transfer. See
289 // IsochronousTransferInfo.
290 // |callback|: Invoked once the transfer has been completed.
291 static
void isochronousTransfer
(ConnectionHandle
handle,
292 IsochronousTransferInfo transferInfo
,
293 TransferCallback
callback);
295 // Tries to reset the USB device and restores it to the previous status.
296 // If the reset fails, the given connection handle will be closed and the
297 // USB device will appear to be disconnected then reconnected.
298 // In that case you must call |getDevices| or |findDevices| again to acquire
301 // |handle|: A connection handle to reset.
302 // |callback|: Invoked once the device is reset with a boolean indicating
303 // whether the reset is completed successfully.
304 static
void resetDevice
(ConnectionHandle
handle,
305 ResetDeviceCallback
callback);