| page.title=Android Open Accessory Protocol 1.0 |
| @jd:body |
| |
| <!-- |
| Copyright 2015 The Android Open Source Project |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| <p>Android USB accessories must adhere to the Android Open Accessory (AOA) |
| protocol, which defines how an accessory detects and sets up communication with |
| an Android-powered device. Accessories should carry out the following steps:</p> |
| |
| <ol> |
| <li>Wait for and detect a connected device.</li> |
| <li>Determine the device's accessory mode support.</li> |
| <li>Attempt to start the device in accessory mode (if needed).</li> |
| <li>If the device supports AOA, establish communication with the device.</li> |
| </ol> |
| |
| <p>The following sections explain how to implement these steps.</p> |
| |
| <p class="note"><strong>Note:</strong> When developing a new accessory that |
| connects to an Android device over USB, use |
| <a href="aoa2.html">AOAv2</a>.</p> |
| |
| <h2 id="wait-for-and-detect-connected-devices">Wait for and detect connected |
| devices</h2> |
| |
| <p>Accessories should continuously check for connected Android-powered devices. |
| When a device is connected, the accessory should determine if the device |
| supports accessory mode.</p> |
| |
| <h2 id="determine-accessory-mode-support">Determine accessory mode support</h2> |
| |
| <p>When an Android-powered device connects, it can be in one of three states: |
| </p> |
| |
| <ul> |
| <li>Supports Android accessory mode and is already in accessory mode.</li> |
| <li>Supports Android accessory mode but it is not in accessory mode.</li> |
| <li>Does not support Android accessory mode.</li> |
| </ul> |
| |
| <p>During the initial connection, the accessory should check the vendor ID and |
| product ID of the connected device's USB device descriptor. The vendor ID |
| should match Google's ID (<code>0x18D1</code>). If the device is already in |
| accessory mode, the product ID should be <code>0x2D00</code> or |
| <code>0x2D01</code> and the accessory can |
| <a href="#establish-communication-with-the-device">establish communication with |
| the device</a> through bulk transfer endpoints using its own communication |
| protocol (the device does not need to be started in accessory mode).</p> |
| |
| <p class="note"><strong>Note:</strong> <code>0x2D00</code> is reserved for |
| Android-powered devices that support accessory mode. <code>0x2D01</code> is |
| reserved for devices that support accessory mode as well as the Android Debug |
| Bridge (ADB) protocol, which exposes a second interface with two bulk endpoints |
| for ADB. You can use these endpoints for debugging the accessory application if |
| you are simulating the accessory on a computer. In general, do not use this |
| interface unless the accessory implements a passthrough to ADB on the device. |
| </p> |
| |
| <p>If the vendor ID or the product ID found in USB device descriptor do not |
| match expected values, the accessory cannot determine if the device supports |
| Android accessory mode. The accessory should attempt to start the device in |
| accessory mode (detailed below) to determine device support.</p> |
| |
| <h2 id="attempt-to-start-in-accessory-mode">Attempt to start in accessory |
| mode</h2> |
| |
| <p>If the vendor and product IDs do not correspond to an Android-powered device |
| in accessory mode, the accessory cannot discern whether the device supports (but |
| is not in) accessory mode or if the device does not support accessory mode. This |
| can occur because devices that support accessory mode (but are not in accessory |
| mode) initially report the <em>device</em> manufacturer vendor and product IDs |
| instead of the <em>AOA</em> vendor and product IDs.</p> |
| |
| <p>The accessory should try to start the device in accessory mode to determine |
| if the device supports that mode:</p> |
| |
| <ol> |
| <li>Send a 51 control request ("Get Protocol") to determine if the device |
| supports the Android accessory protocol. If the device supports the protocol, |
| it returns a non-zero number that represents the supported protocol version. |
| The control request is on endpoint 0 with the following characteristics: |
| |
| <pre> |
| requestType: USB_DIR_IN | USB_TYPE_VENDOR |
| request: 51 |
| value: 0 |
| index: 0 |
| data: protocol version number (16 bits little endian sent from the |
| device to the accessory) |
| </pre> |
| </li> |
| |
| <li>If the device returns a supported protocol version, send a control request |
| with identifying string information to the device. This information allows the |
| device to determine an appropriate application for the accessory (or present a |
| URL to the user if an appropriate application does not exist). The control |
| request is on endpoint 0 (for each string ID) with the following |
| characteristics: |
| |
| <pre> |
| requestType: USB_DIR_OUT | USB_TYPE_VENDOR |
| request: 52 |
| value: 0 |
| index: string ID |
| data zero terminated UTF8 string sent from accessory to device |
| </pre> |
| |
| <p>The following string IDs are supported, with a maximum size of 256 bytes |
| for each string (must be zero-terminated with <code>\0</code>).</p> |
| |
| <pre> |
| manufacturer name: 0 |
| model name: 1 |
| description: 2 |
| version: 3 |
| URI: 4 |
| serial number: 5 |
| </pre> |
| </li> |
| |
| <li>Send a control request to ask the device to start in accessory mode. The |
| control request is on endpoint 0 with the following characteristics: |
| |
| <pre> |
| requestType: USB_DIR_OUT | USB_TYPE_VENDOR |
| request: 53 |
| value: 0 |
| index: 0 |
| data: none |
| </pre> |
| </li> |
| </ol> |
| |
| <p>After completing these steps, the accessory should wait for the connected USB |
| device to re-introduce itself on the bus in accessory mode, then re-enumerate |
| connected devices. The algorithm |
| <a href="#determine-accessory-mode-support">determines accessory mode support</a> |
| by checking the vendor and product IDs, which should be correct (e.g. correspond |
| to Google's vendor and product IDs instead of the device manufacturer's IDs) if |
| the device successfully switched to accessory mode. If IDs are correct, the |
| accessory moves to <a href="#establish-communication-with-the-device">establish |
| communication with the device</a>.</p> |
| |
| <p class="note"><strong>Note:</strong> AOA does not currently support |
| simultaneous AOA and MTP connections. To switch from AOA to MTP, the accessory |
| must first disconnect the USB device (either physically or in an electrically |
| equivalent way) then reconnect using MTP.</p> |
| |
| <p>If any step fails, the accessory determines the device does not support |
| Android accessory mode and waits for the next device to connect.</p> |
| |
| |
| <h2 id="establish-communication-with-the-device">Establish communication with |
| the device</h2> |
| |
| <p>If the accessory detects an Android-powered device in accessory mode, the |
| accessory can query the device interface and endpoint descriptors to obtain the |
| bulk endpoints for communicating with the device.</p> |
| |
| <p>The number of interfaces and bulk endpoints depends on the product ID. An |
| Android-powered device with a product ID of:</p> |
| |
| <ul> |
| <li><code>0x2D00</code> has one interface with two bulk endpoints for input and |
| output communication.</li> |
| <li><code>0x2D01</code> has two interfaces with two bulk endpoints each for |
| input and output communication. The first interface handles standard |
| communication and the second interface handles ADB communication. To use an |
| interface, locate the first bulk input and output endpoints, set the |
| device configuration to a value of 1 with a <code>SET_CONFIGURATION</code> |
| (<code>0x09</code>) device request, then communicate using the endpoints.</li> |
| </ul> |