| page.title=Android Open Accessory Protocol 1.0 |
| @jd:body |
| |
| <!-- |
| Copyright 2010 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>An Android USB accessory must adhere to Android Accessory Protocol, which defines how |
| an accessory detects and sets up communication with an Android-powered device. In general, an |
| accessory should carry out the following steps:</p> |
| <ul> |
| <li>Wait for and detect connected devices</li> |
| <li>Determine the device's accessory mode support</li> |
| <li>Attempt to start the device in accessory mode if needed</li> |
| <li>Establish communication with the device if it supports the Android accessory protocol</li> |
| </ul> |
| <p>The following sections explain how to implement these steps.</p> |
| <h2 id="wait-for-and-detect-connected-devices">Wait for and Detect Connected Devices</h2> |
| <p>Your accessory should have logic to continuously check for connected Android-powered devices. |
| When a device is connected, your 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 is connected, it can be in one of three states:</p> |
| <ul> |
| <li>The attached device supports Android accessory mode and is already in accessory mode.</li> |
| <li>The attached device supports Android accessory mode, but it is not in accessory mode.</li> |
| <li>The attached device does not support Android accessory mode.</li> |
| </ul> |
| <p>During the initial connection, the accessory should check the vendor and product IDs of the |
| connected device's USB device descriptor. The vendor ID should match Google's ID (<code>0x18D1</code>) and the |
| product ID should be <code>0x2D00</code> or <code>0x2D01</code> if the device is already in accessory mode (case A). If |
| so, the accessory can now |
| <a href="#establish-communication-with-the-device">establish communication with the device</a> through |
| bulk transfer endpoints with its own communication protocol. There is no need to start the device |
| in accessory mode.</p> |
| <p><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 |
| ADB (Android Debug Bridge) 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 your accessory is |
| implementing a passthrough to ADB on the device.</p> |
| <p>If the vendor and product ID do not match, there is no way to distinguish between states b and c, so |
| the accessory <a href="#attempt-to-start-in-accessory-mode">attempts to start the device in accessory mode</a> |
| to determine if the device is supported.</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 accessory mode and is not in that |
| state, or if the device does not support accessory mode at all. This is because devices that |
| support accessory mode but aren't in it initially report the device's manufacturer vendor ID and |
| product ID, and not the special Android Open Accessory ones. In either case, the accessory should |
| try to start the device into accessory mode to figure out if the device supports it. The following |
| steps explain how to do this:</p> |
| <ul> |
| <li>Send a 51 control request ("Get Protocol") to figure out if the device supports the Android |
| accessory protocol. A non-zero number is returned if the protocol is supported, which |
| represents the version of the protocol that the device supports (currently, only version 1 |
| exists). This request is a control request 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 proper protocol version, send identifying string information to the |
| device. This information allows the device to figure out an appropriate application for this |
| accessory and also present the user with a URL if an appropriate application does not exist. |
| These requests are control requests 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 `\0`).</p> |
| |
| <pre> |
| manufacturer name: 0 |
| model name: 1 |
| description: 2 |
| version: 3 |
| URI: 4 |
| serial number: 5 |
| </pre> |
| </li> |
| <li>When the identifying strings are sent, request the device start up in accessory mode. This |
| request is a control request 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> |
| </ul> |
| |
| <p>After sending the final control request, the connected USB device should re-introduce itself |
| on the bus in accessory mode and the accessory can re-enumerate the connected devices. The |
| algorithm jumps back to |
| <a href="#determine-accessory-mode-support">determining the device's accessory mode support</a> |
| to check for the vendor and product ID. The vendor ID and product ID of the device will be |
| different if the device successfully switched to accessory mode and will now correspond to |
| Google's vendor and product IDs instead of the device manufacturer's IDs. The accessory can now |
| <a href="#establish-communication-with-the-device">establish communication with the device</a>.</p> |
| <p>If at any point these steps fail, the device does not support Android accessory mode and the |
| accessory should wait for the next device to be connected.</p> |
| <h2 id="establish-communication-with-the-device">Establish Communication with the Device</h2> |
| <p>If an Android-powered device in accessory mode is detected, the accessory can query the |
| device's interface and endpoint descriptors to obtain the bulk endpoints to communicate with the |
| device. An Android-powered device that has a product ID of <code>0x2D00</code> has one interface with two bulk |
| endpoints for input and output communication. A device with product ID of <code>0x2D01</code> has two |
| interfaces with two bulk endpoints each for input and output communication. The first interface |
| is for standard communication while the second interface is for ADB communication. To communicate |
| on an interface, all you need to do is find the first bulk input and output endpoints, set the |
| device's configuration to a value of 1 with a <code>SET_CONFIGURATION</code> (<code>0x09</code>) device request, then |
| communicate using the endpoints.</p> |
| |
| |