Home | History | Annotate | Download | only in api
      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   // Returned by |getDevices| to identify a connected USB device.
     23   dictionary Device {
     24     // The id of the USB device. It remains unchanged until the device is
     25     // unplugged.
     26     long device;
     27     long vendorId;
     28     long productId;
     29   };
     30 
     31   // Returned by |openDevice| to be used for USB communication.
     32   // Every time a device is opened, a new connection handle is created.
     33   //
     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.
     38   //
     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
     41   // or suspended.
     42   //
     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.
     47     long handle;
     48     long vendorId;
     49     long productId;
     50   };
     51 
     52   dictionary EndpointDescriptor {
     53     long address;
     54     TransferType type;
     55     Direction direction;
     56     long maximumPacketSize;
     57 
     58     // Used for isochronous mode.
     59     SynchronizationType? synchronization;
     60     UsageType? usage;
     61 
     62     // If this is an interrupt endpoint, this will be 1-255.
     63     long? pollingInterval;
     64   };
     65 
     66   dictionary InterfaceDescriptor {
     67     long interfaceNumber;
     68     long alternateSetting;
     69     long interfaceClass;
     70     long interfaceSubclass;
     71     long interfaceProtocol;
     72     DOMString? description;
     73     EndpointDescriptor[] endpoints;
     74   };
     75 
     76   // ControlTransferInfo represents that parameters to a single USB control
     77   // transfer.
     78   dictionary ControlTransferInfo {
     79     // The direction of this transfer.
     80     Direction direction;
     81 
     82     // The intended recipient for this transfer.
     83     Recipient recipient;
     84 
     85     // The type of this request.
     86     RequestType requestType;
     87 
     88     long request;
     89     long value;
     90     long index;
     91 
     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.
     95     long? length;
     96 
     97     // The data payload carried by this transfer. If this is an output transfer
     98     // then this field must be set.
     99     ArrayBuffer? data;
    100   };
    101 
    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.
    106     Direction direction;
    107 
    108     long endpoint;
    109 
    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.
    112     long? length;
    113 
    114     // If this is an output transfer then this field must be populated.
    115     // Otherwise, it will be ignored.
    116     ArrayBuffer? data;
    117   };
    118 
    119   // IsochronousTransferInfo describes a single multi-packet isochronous
    120   // transfer.
    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;
    127 
    128     // The total number of packets in this transfer.
    129     long packets;
    130 
    131     // The length of each of the packets in this transfer.
    132     long packetLength;
    133   };
    134 
    135   dictionary TransferResultInfo {
    136     // A value of 0 indicates that the transfer was a success. Other values
    137     // indicate failure.
    138     long? resultCode;
    139 
    140     // If the transfer was an input transfer then this field will contain all
    141     // of the input data requested.
    142     ArrayBuffer? data;
    143   };
    144 
    145   // Describes the properties of devices which are found via |getDevices|.
    146   dictionary EnumerateDevicesOptions {
    147     long vendorId;
    148     long productId;
    149   };
    150   
    151   // Describes the properties of devices which are found via |findDevices|.
    152   dictionary EnumerateDevicesAndRequestAccessOptions {
    153     long vendorId;
    154     long productId;
    155     // The interface id to request access against.
    156     // Only available on ChromeOS. It has no effect on other platforms.
    157     long? interfaceId;
    158   };
    159 
    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);
    169 
    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);
    176 
    177     // This method is ChromeOS specific. Calling this method on other platforms
    178     // will fail.
    179     // Requests access from the permission broker to an OS claimed device if the
    180     // given interface on the device is not claimed.
    181     //
    182     // |device|: The device to request access to.
    183     // |interfaceId|: 
    184     static void requestAccess(Device device,
    185                               long interfaceId,
    186                               RequestAccessCallback callback);
    187 
    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);
    192 
    193     // Finds USB devices specified by the vendorId/productId/interfaceId tuple
    194     // and, if permissions allow, opens them for use.
    195     //
    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|.
    199     //
    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.
    202     //
    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.
    206     //
    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);
    211 
    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);
    218 
    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);
    224 
    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.
    229     //
    230     // You shall call releaseInterface when the interface is not needed anymore.
    231     //
    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);
    237 
    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);
    244 
    245     // Selects an alternate setting on a previously claimed interface on a
    246     // device.
    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);
    255 
    256     // Performs a control transfer on the specified device. See the
    257     // ControlTransferInfo structure for the parameters required to make a
    258     // transfer.
    259     //
    260     // Conceptually control transfer talks to the device itself. You do not need
    261     // to claim interface 0 to perform a control transfer.
    262     //
    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);
    269 
    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);
    277 
    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);
    285 
    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);
    294 
    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
    299     // the device.
    300     //
    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);
    306   };
    307 };
    308