| page.title=Accessory Development Kit 2012 Guide |
| page.tags=adk |
| @jd:body |
| |
| <div id="qv-wrapper"> |
| <div id="qv"> |
| <h2>In this document</h2> |
| <ol> |
| <li><a href="#components">Components</a></li> |
| <li><a href="#clock">Using the Alarm Clock</a></li> |
| <li><a href="#play-audio">Playing Audio</a></li> |
| <li><a href="#dev">Developing Accessories with ADK 2012</a> |
| <ol> |
| <li><a href="#src-download">Downloading the ADK Source</a></li> |
| <li><a href="#dev-setup">Setting Up the Development Environment</a></li> |
| <li><a href="#alt-build">Using the ADK Alternative Build System</a></li> |
| </ol> |
| </li> |
| <li><a href="#adk-conn">How the ADK Connects with Android Devices</a> |
| <ol> |
| <li><a href="#adk-conn-bt">ADK Connection over Bluetooth</a></li> |
| <li><a href="#adk-conn-usb">ADK Connection over USB</a></li> |
| </ol> |
| </li> |
| <li><a href="#audio-dock">USB Audio Dock Implementation</a></li> |
| </ol> |
| |
| <h2>See also</h2> |
| <ol> |
| <li><a href="https://developers.google.com/events/io/sessions/gooio2012/128/"> |
| Google I/O Session Video</a></li> |
| <li><a href="http://source.android.com/tech/accessories/aoap/aoa.html"> |
| Android Open Accessory Protocol</a></li> |
| <li><a href="http://source.android.com/tech/accessories/aoap/aoa2.html"> |
| Android Open Accessory Protocol 2.0</a></li> |
| <li><a href="{@docRoot}guide/topics/connectivity/usb/accessory.html"> |
| USB Accessory Dev Guide</a></li> |
| </ol> |
| </div> |
| </div> |
| |
| <p>The Android Accessory Development Kit (ADK) for 2012 is the latest reference implementation of an |
| <a href="http://source.android.com/tech/accessories/index.html">Android Open Accessory</a> device, |
| designed to help Android hardware accessory builders and software developers create accessories |
| for Android. The ADK 2012 is based on the <a href="http://arduino.cc">Arduino</a> open source |
| electronics prototyping platform, with some hardware and software extensions that allow it to |
| communicate with Android devices.</p> |
| |
| <p>A limited number of these kits were produced and distributed at the Google I/O 2012 developer |
| conference. If you did not receive one of these kits, fear not! The specifications and design files |
| for the hardware were also released for use by manufacturers and hobbyists. You should expect to see |
| kits with similar features available for purchase, or you can build one yourself!</p> |
| |
| <p>One of the important new features demonstrated by this ADK is the ability to play audio over a |
| USB connection. Be sure to check out the <a href="#audio-dock">reference implementation</a> of a USB |
| audio dock in this ADK if you are interested in making audio-related USB accessories for |
| Android.</p> |
| |
| <h2 id="components">Components</h2> |
| |
| <p>The ADK 2012 is based on the Arduino open source electronics prototyping platform and is an open |
| hardware design. The hardware design files and firmware source code are included with the ADK |
| software download. The ADK contains two main physical hardware components:</p> |
| |
| <ol> |
| <li>Main processing board containing the microprocessor, USB connections, power connector and |
| input/output pins. This board can be removed and used separately from the rest of the hardware.</li> |
| <li>Shield containing sensors, LEDs, input controls, audio amplifier and speaker output, contained |
| in a custom, polygon box enclosure.</li> |
| </ol> |
| |
| <p>The main hardware features of the ADK are as follows:</p> |
| |
| <ul> |
| <li>An ARM 32-bit Cortex M3 micro-processor</li> |
| <li>Separate USB connections for an Android device and computer connection for programming and |
| debugging</li> |
| <li>Sensors for light, color, proximity, temperature, humidity, barometric pressure, and |
| acceleration</li> |
| <li>Micro SD Card slot</li> |
| <li>Bluetooth support</li> |
| </ul> |
| |
| <p>The ADK comes preloaded with an alarm clock firmware program that you can use immediately. A |
| companion Android application, <a |
| href="https://play.google.com/store/apps/details?id=com.google.android.apps.adk2">ADK 2012</a>, is |
| available on Google Play. The source code for both the Android application and the ADK firmware (an |
| Arduino sketch) can be downloaded from this page.</p> |
| |
| <p>The ADK 2012 also comes with additional parts to help you develop accessories with it, |
| including:</p> |
| |
| <ul> |
| <li>AC power adapter</li> |
| <li>USB A to Micro USB B connector cable</li> |
| <li>Micro USB B to Micro USB AB connector (small, rectangular plug)</li> |
| <li>Micro SD Card, preinstalled in the ADK SD Card socket</li> |
| </ul> |
| |
| <h2 id="clock">Using the Alarm Clock</h2> |
| |
| <p>An alarm clock program comes preloaded on the ADK. This firmware program allows you to use the |
| ADK as an alarm clock.</p> |
| |
| <p>To use the ADK as an alarm clock:</p> |
| |
| <ol> |
| <li>Open up the ADK by gently squeezing the two widest faces of the enclosure.</li> |
| <li>Attach the provided AC power adapter (round connector) to the main ADK board, or attach a USB |
| cable to the port marked <strong>Computer</strong> and a USB port on your computer.</li> |
| <li>Place and hold your fingertip over the clock symbol on the control face. |
| <p class="note"><strong>Note:</strong> You may need to hold your finger in place for 1-2 |
| seconds.</p> |
| </li> |
| <li>Use the plus (+) and minus (-) symbols inside the clock digits to set the correct time.</li> |
| <li>Place your fingertip over the alarm clock symbol to activate alarm setting.</li> |
| <li>Use the plus (+) and minus (-) symbols inside the clock digits to set the alarm time.</li> |
| <li>Use the plus (+) and minus (-) symbols inside the last two clock digits to turn the alarm on |
| ({@code on}) or off ({@code oF}).</li> |
| <li>To set the alarm tone, place and hold your fingertip over the alarm clock symbol, then tap the |
| slider control on top of the enclosure.</li> |
| </ol> |
| |
| <p>To use the <strong>ADK 2012</strong> companion application for the alarm clock:</p> |
| |
| <ol> |
| <li>Load the companion application on your Android device running Android 3.1 (API Level 12) or |
| higher: |
| <ul> |
| <li>Using an NFC-enabled Android device, unlock and hold the device against the left side of |
| the ADK enclosure. Follow the prompts to install the app. |
| <br>- or -</li> |
| <li>Start Google Play on your device, search for the <strong>ADK 2012</strong> application and |
| install it. If you cannot find the app, your device is not compatible. Try installing on another |
| device.</li> |
| </ul> |
| </li> |
| <li>Connect your Android device to the ADK using one of the following methods: |
| <ul> |
| <li id="conn-bt">To connect using Bluetooth: |
| <ol> |
| <li>Plug the AC power adapter into the ADK.</li> |
| <li>On your Android device, turn Bluetooth On (<strong>Settings > |
| Bluetooth</strong>).</li> |
| <li>In the <strong>Settings</strong> page, press the <strong>Bluetooth</strong> option to |
| view paired devices.</li> |
| <li>Select <strong>Search for Devices</strong> to locate the ADK 2012 accessory and follow |
| the on screen instructions to connect.</li> |
| <li>After pairing is complete, start the <strong>ADK 2012</strong> app on your Android |
| device.</li> |
| <li>On the start screen, select the <strong>Use Bluetooth</strong> button.</li> |
| <li>In the list of paired devices, select the <strong>ADK 2012</strong> device.</li> |
| <li>The <strong>ADK 2012</strong> app should switch to the menu screen and you can start |
| interacting with the ADK accessory.</li> |
| </ol> |
| </li> |
| |
| <li id="conn-usb">To connect using USB: |
| <ol> |
| <li>Plug the AC power adapter into the ADK.</li> |
| <li>Connect the Micro USB AB connector (small, rectangular plug) to the port labeled |
| <strong>Phone</strong> on the ADK board.</li> |
| <li>Unlock your Android device and connect the Micro USB B connector to your device. |
| <p class="note"><strong>Note:</strong> Your device must support Android USB accessory |
| mode. Devices that support this mode include Google Nexus devices.</p> |
| </li> |
| <li>On the Android device, you should see a prompt to connect to the <strong>ADK DemoKit |
| 2012</strong>, select <strong>OK</strong>.</li> |
| <li>The <strong>ADK 2012</strong> app should start automatically and you can start |
| interacting with the ADK.</li> |
| </ol> |
| </li> |
| </ul> |
| </li> |
| </ol> |
| |
| <p class="note"><strong>Note:</strong> When using the ADK with a USB connection to an Android |
| device, make sure the AC power adapter is plugged in. A USB connection to a computer does not |
| provide sufficient voltage to power both the ADK and a USB connection to a device.</p> |
| |
| |
| <h2 id="play-audio">Playing Audio</h2> |
| |
| <p>The ADK 2012 comes with audio output capabilities, including an amplifier and speaker. You can |
| use it to play audio from your Android device using either a Bluetooth or USB connection.</p> |
| |
| <p>To play audio over Bluetooth:</p> |
| |
| <ol> |
| <li>Follow the instructions in the <a href="#conn-bt">previous section</a> to connect your Android |
| device to the ADK over Bluetooth.</li> |
| <li>On your Android device, navigate to the <strong>Settings > Bluetooth</strong> page to view the |
| list of paired devices, and make sure the ADK is connected.</li> |
| <li>Select the settings icon next to the <strong>ADK 2012</strong> item.</li> |
| <li>Make sure the <strong>Media Audio</strong> option is enabled.</li> |
| <li>Navigate to an application that plays music or other audio.</li> |
| <li>Play a song or sound and listen to it on the ADK speaker!</li> |
| </ol> |
| |
| <p>To play audio over USB, you must use a device running Android 4.1 (API Level 16) or higher:</p> |
| |
| <ol> |
| <li>Plug the AC power adapter into the ADK.</li> |
| <li>Connect the Micro USB AB connector (small, rectangular plug) to the Phone port on the ADK |
| board.</li> |
| <li>Unlock your Android device and connect the Micro USB B connector to your device. |
| <p class="note"><strong>Note:</strong> Your device must support Android USB accessory |
| mode. Devices that support this mode include Google Nexus devices.</p> |
| </li> |
| <li>On the Android device, you should see a prompt to connect to the <strong>ADK DemoKit |
| 2012</strong>, select <strong>Cancel</strong> and allow the ADK to connect as a media device |
| only.</li> |
| <li>Navigate to an application that plays music or other audio.</li> |
| <li>Play a song or sound and listen to it on the ADK speaker!</li> |
| </ol> |
| |
| <p class="note"><strong>Note:</strong> When using the ADK with a USB connection to an Android |
| device, make sure the AC power adapter is plugged in. A USB connection to a computer does not |
| provide sufficient voltage to power both the ADK and a USB connection to a device.</p> |
| |
| |
| <h2 id="dev">Developing Accessories with ADK 2012</h2> |
| |
| <p>The ADK 2012 is a hardware platform and a set of software libraries for prototyping Android |
| accessories. This section discusses how to set up a development environment for programming the ADK |
| to make it do what you want and to test software for building your own Android accessories.</p> |
| |
| <h3 id="src-download">Downloading the ADK Source</h3> |
| |
| <p>The support software and hardware specifications for the ADK 2012 are available from the Android |
| source repository. Follow the instructions below to obtain the source material for the ADK.</p> |
| |
| <p>To download the ADK 2012 software, source code and hardware design specifications.</p> |
| |
| <ol> |
| <li>Download and install <a href="http://git-scm.com/download">Git</a> for your development |
| system.</li> |
| <li>Download and setup the {@code repo} tool, as described on the <a |
| href="http://source.android.com/source/downloading.html#installing-repo">Android open source |
| project</a> site. |
| <p class="note"><strong>Note:</strong> Developers using Windows must use a Linux compatibility |
| package, such as <a href="http://www.cygwin.com/">cygwin</a>, to install and run {@code repo}. |
| Within your compatibility environment, you must install {@code curl}, {@code git} and {@code |
| python} to be able to download and use the {@code repo} tool.</p> |
| </li> |
| <li>In a terminal window, create a new directory for the downloaded source files, initialize and |
| synchronize a local repository: |
| <pre> |
| $> mkdir android-accessories |
| $> cd android-accessories |
| $> repo init -u https://android.googlesource.com/accessories/manifest |
| $> repo sync |
| </pre> |
| </li> |
| </ol> |
| |
| <p>After successfully completing this process, you should have the source code and tools for |
| working with the ADK 2012:</p> |
| |
| <ul> |
| <li>{@code adk2012/board} - Source code and hardware design files for the ADK 2012</li> |
| <li>{@code adk2012/app} - Source code for the ADK 2012 Android companion application</li> |
| <li>{@code external/ide} - Source code for the ADK 2012 Integrated Development Environment |
| (IDE)</li> |
| <li>{@code external/toolchain} - The toolchain used by the ADK 2012 IDE</li> |
| </ul> |
| |
| |
| <h3 id="dev-setup">Setting Up the Development Environment</h3> |
| |
| <p>The ADK 2012 comes with an integrated development environment (IDE) that you use to develop |
| software and program the ADK 2012 accessory. The following instructions explain how to setup and run |
| the ADK 2012 IDE.</p> |
| |
| <p>To set up and run the ADK 2012 IDE:</p> |
| |
| <ol> |
| <li>Download and install the Java Development Kit 6 or higher from <a |
| href="http://java.oracle.com">java.oracle.com</a>.</li> |
| <li>Download the ADK 2012 IDE for your development platform: |
| <ul> |
| <li><a href="https://dl-ssl.google.com/android/adk/adk2012_ide-win32-20120629.zip"> |
| Windows</a></li> |
| <li><a href="https://dl-ssl.google.com/android/adk/adk2012_ide-macosx-20120626.zip"> |
| Mac</a></li> |
| <li>Linux |
| <a href="https://dl-ssl.google.com/android/adk/adk2012_ide-linux32-20120626.tgz">32bit</a>, |
| <a href="https://dl-ssl.google.com/android/adk/adk2012_ide-linux64-20120626.tgz">64bit</a> |
| </li> |
| </ul> |
| </li> |
| <li>Unpack the downloaded archive.</li> |
| <li>Run the application by navigating to the unpacked {@code ADK2012_IDE/} folder and execute |
| the {@code arduino} file.</li> |
| </ol> |
| |
| <p>After you have successfully installed and run the ADK 2012 IDE, you must configure it to use |
| the ADK 2012 library.</p> |
| |
| <p>To configure the ADK 2012 IDE for use with the ADK libraries:</p> |
| |
| <ol> |
| <li>Start the ADK 2012 IDE and choose <strong>File > Preferences</strong>.</li> |
| <li>In the <strong>Preferences</strong> dialog, make a note of the <strong>Sketchbook |
| location</strong> directory.</li> |
| <li>Copy the {@code <adk-source-download>/adk2012/board/library/ADK2} directory and its |
| contents into your {@code sketchbook/libraries/} directory, so that you create a {@code |
| sketchbook/libraries/ADK2} directory.</li> |
| <li>Stop and restart the <strong>ADK 2012 IDE</strong>.</li> |
| <li>In the IDE, choose <strong>File > Examples > ADK2</strong> and then choose one of the example |
| sketches: |
| <ul> |
| <li><strong>clock</strong> - The sketch that is preloaded onto the ADK 2012.</li> |
| <li><strong>BluetoothScan</strong> - An example sketch demonstrating code that connects an |
| accessory to an Android device over Bluetooth.</li> |
| <li><strong>usbaccessory</strong> - An example sketch demonstrating code that connects an |
| accessory to an Android device through a USB cable.</li> |
| </ul> |
| </li> |
| <li>Connect a Micro USB cable from the <strong>Computer</strong> port on the ADK board to your |
| development computer.</li> |
| <li>In the <strong>ADK 2012 IDE</strong>, establish a serial port connection with the ADK by |
| selecting <strong>Tools > Serial Port</strong> and selecting the serial port for the ADK.</li> |
| <li>In the <strong>ADK 2012 IDE</strong>, choose the ADK by selecting<strong>Tools > Board > |
| Google ADK2</strong>.</li> |
| <li>Modify an example sketch or create your own.</li> |
| <li>Upload the sketch to the ADK by choosing <strong>File > Upload</strong>. When the <strong>ADK |
| 2012 IDE</strong> reports <strong>Done uploading</strong>, the sketch is uploaded and the ADK is |
| ready to communicate with your Android device.</li> |
| </ol> |
| |
| <h3 id="alt-build">Using the ADK Alternative Build System</h3> |
| |
| <p>An alternative, make file-based build and upload system is also available for the ADK 2012. This |
| system is command line based and intended for production environments where using an IDE environment |
| to load software onto accessory hardware may be inconvenient or undesirable.</p> |
| |
| <p>To setup the environment:</p> |
| <ol> |
| <li><a href="#src-download">Download</a> the ADK 2012 source code files.</li> |
| <li>In a terminal window, navigate to {@code |
| <adk-source-download>/adk2012/board/MakefileBasedBuild}.</li> |
| <li>Execute the following command and follow the instructions: |
| <pre>$> ./setup</pre> |
| </li> |
| </ol> |
| |
| <p>To build a program for your accessory:</p> |
| <ol> |
| <li>Place your accessory code in the {@code MakefileBasedBuild/app} directory, including all |
| required library files. See the {@code app/main.c} file for an example of the program format.</li> |
| <li>Execute the following command and follow the instructions: |
| <pre>$> ./build</pre> |
| </li> |
| </ol> |
| |
| <p>To load the program on your accessory hardware:</p> |
| <ol> |
| <li>Run the build process above and make sure your program compiled successfully.</li> |
| <li>Attach the accessory via USB cable to your development computer.</li> |
| <li>Check which port the accessory is attached to and modify the {@code UART} variable in the |
| {@code flash} script to the correct port address. On linux machines, the port address is typically |
| {@code /dev/ttyUSB0}.</li> |
| <li>Execute the following command to load the program on the accessory: |
| <pre>$> ./flash</pre></li> |
| </ol> |
| |
| <h2 id="adk-conn">How the ADK Connects with Android Devices</h2> |
| |
| <p>The essential feature of any Android accessory is its ability to connect and communicate with an |
| Android device. Creating a fast and reliable connection between your accessory and Android devices |
| is the first order of business when building software for an accessory. This section describes the |
| connection and communication essentials used in the ADK 2012 so that you can apply them to |
| developing your own Android accessories.</p> |
| |
| <h3 id="adk-conn-bt">ADK Connection over Bluetooth</h3> |
| |
| <p>The ADK 2012 app and hardware accessory use a Bluetooth Serial Port Profile (SPP) connection to |
| communicate. This connection allows two way communication between the ADK accessory and Android |
| devices.</p> |
| |
| <p class="note"><strong>Note:</strong> The implementation of the ADK hardware allows the use of |
| other profiles and multiple connections. However, the basic communication between the ADK 2012 |
| accessory and the Android application uses SPP.</p> |
| |
| <h4 id="acc-bt-code">Accessory Bluetooth Code</h4> |
| |
| <p>In order to enable Bluetooth communications, the {@code clock.ino} sketch for the ADK 2012 |
| accessory calls a {@code btStart()} method during the {@code setup()} method to enable radio |
| frequency communications and start listening for Bluetooth connections:</p> |
| |
| <pre> |
| ADK L; |
| void setup() { |
| L.adkInit(); |
| L.btStart(); |
| } |
| ... |
| void btStart(){ |
| uint8_t i, dlci; |
| int f; |
| |
| L.btEnable(adkBtConnectionRequest, adkBtLinkKeyRequest, adkBtLinkKeyCreated, |
| adkBtPinRequest, NULL); |
| |
| dlci = L.btRfcommReserveDlci(RFCOMM_DLCI_NEED_EVEN); |
| |
| if(!dlci) dbgPrintf("BTADK: failed to allocate DLCI\n"); |
| else{ |
| |
| //change descriptor to be valid... |
| for(i = 0, f = -1; i < sizeof(sdpDescrADK); i++){ |
| |
| if(sdpDescrADK[i] == MAGIX){ |
| if(f == -1) f = i; |
| else break; |
| } |
| } |
| |
| if(i != sizeof(sdpDescrADK) || f == -1){ |
| |
| dbgPrintf("BTADK: failed to find a single marker in descriptor\n"); |
| L.btRfcommReleaseDlci(dlci); |
| return; |
| } |
| |
| sdpDescrADK[f] = dlci >> 1; |
| |
| dbgPrintf("BTADK has DLCI %u\n", dlci); |
| |
| L.btRfcommRegisterPort(dlci, btAdkPortOpen, btAdkPortClose, btAdkPortRx); |
| L.btSdpServiceDescriptorAdd(sdpDescrADK, sizeof(sdpDescrADK)); |
| } |
| } |
| </pre> |
| |
| <p>Notice that the {@code sdpDescrADK} object contains a Universally Unique Identifier (UUID) in the |
| variable {@code BT_ADK_UUID}. This identifier <em>must match</em> the device UUID provided in the |
| {@link android.bluetooth.BluetoothSocket} connection request in the Android application code.</p> |
| |
| <p>Once Bluetooth is enabled with the code shown above, the accessory listens for connection |
| requests. The ADK library handles listening and connection details, so the accessory calls |
| {@code ADK::adkEventProcess()} once during each loop execution:</p> |
| |
| <pre> |
| void loop(void) |
| { |
| ... |
| L.adkEventProcess(); //let the adk framework do its thing |
| ... |
| } |
| </pre> |
| |
| <p>If a Bluetooth connection has been established, any commands are routed to the |
| {@code btAdkPortRx()} callback method (which was registered with the ADK library as part of the |
| {@code btStart()} method) and processed accordingly. The ADK accessory sends messages back through |
| the Bluetooth connection using the {@code ADK::btRfcommPortTx()} method. |
| For more details, review the implementations of these methods in the {@code clock.ino} sketch.</p> |
| |
| <h4 id="app-bt-code">Android App Bluetooth Code</h4> |
| |
| <p>In the ADK 2012 Android app, the code for handling Bluetooth connections is encapsulated in in a |
| {@code BTConnection} class. In this class, the application requests access to the Bluetooth adapter |
| and negotiates a connection with the ADK 2012 accessory. Here is a summary of the relevant code:</p> |
| |
| <pre> |
| mAdapter = BluetoothAdapter.getDefaultAdapter(); |
| BluetoothDevice device = mAdapter.getRemoteDevice(address); |
| mSocket = device.createInsecureRfcommSocketToServiceRecord(ADK_UUID); |
| mSocket.connect(); |
| </pre> |
| |
| <p>Note the {@code ADK_UUID} parameter in the second line. This identifier must match the identifier |
| output by the accessory (the {@code BT_ADK_UUID} variable mentioned earlier), otherwise the protocol |
| negotiation fails and the {@link android.bluetooth.BluetoothSocket} is not created. Once a |
| connection is established, you obtain {@link java.io.InputStream} and {@link java.io.OutputStream} |
| objects from the socket to communicate with the accessory:</p> |
| |
| <pre> |
| mInStream = mSocket.getInputStream(); |
| mOutStream = mSocket.getOutputStream(); |
| </pre> |
| |
| <p>Review the {@code BTConnection.java} file provided in the ADK 2012 software download for more |
| implementation details.</p> |
| |
| <h3 id="adk-conn-usb">ADK Connection over USB</h3> |
| |
| <p>The ADK 2012 app and hardware accessory can also use a USB connection to communicate, similar to |
| the original ADK.</p> |
| |
| <h4 id="acc-usb-code">Accessory USB Code</h4> |
| |
| <p>The ADK library takes care of most of the implementation details for a USB connection, the |
| accessory code must make a few calls to initialize USB connectivity, including setting the accessory |
| identification strings:</p> |
| |
| <pre> |
| ADK L; |
| void setup() { |
| L.adkInit(); |
| L.usbSetAccessoryStringVendor(...); |
| L.usbSetAccessoryStringName(...); |
| L.usbSetAccessoryStringLongname(...); |
| L.usbSetAccessoryStringVersion(...); |
| L.usbSetAccessoryStringUrl(...); |
| L.usbSetAccessoryStringSerial(...); |
| |
| L.usbStart(); |
| } |
| </pre> |
| |
| <p class="note"><strong>Note:</strong> The identification strings must match the USB accessory |
| filter settings specified in the connecting Android application,otherwise the application cannot |
| connect with the accessory.</p> |
| |
| <p>Once USB is enabled with code shown above, the accessory listens for connection requests. The ADK |
| library handles listening and connection details, so the accessory calls {@code |
| ADK::adkEventProcess()} once during each loop execution:</p> |
| |
| <pre> |
| void loop(void) |
| { |
| ... |
| L.adkEventProcess(); //let the adk framework do its thing |
| ... |
| } |
| </pre> |
| |
| <p>The accessory must then check for a live USB connection to process commands and send |
| messages. Here is a summary of the relevant code:</p> |
| |
| <pre> |
| void loop() { |
| if (L.accessoryConnected()) { |
| int recvLen = L.accessoryReceive(msg, sizeof(msg)); |
| if (recvLen > 0) { |
| ... // process message |
| } |
| |
| L.accessorySend(outmsg, outmsgLen); |
| } |
| L.adkEventProcess(); |
| } |
| </pre> |
| |
| <p>For more details, review the implementations of these methods in the {@code clock.ino} |
| sketch.</p> |
| |
| <h4 id="app-usb-code">Android App USB Code</h4> |
| |
| <p>In the ADK 2012 Android app, the code for handling USB connections is encapsulated in a |
| {@code UsbConnection} class. This class sets up a {@link android.content.BroadcastReceiver} to |
| listen for USB events and then attempts to connect when a matching connection event is received. |
| Here is a summary of the relevant code:</p> |
| |
| <pre> |
| import com.android.future.usb.UsbAccessory; |
| import com.android.future.usb.UsbManager; |
| |
| mUSBManager = UsbManager.getInstance(this); |
| UsbAccessory acc = mUSBManager.getAccessoryList()[0]; |
| |
| if (!mUSBManager.hasPermission(acc)) return; |
| </pre> |
| |
| <p>The ADK 2012 app uses the support library to implement the USB accessory connections, in order to |
| support devices running Android 2.3.4 (API Level 10). If you only need to support Android |
| 3.1 (API Level 12) and higher devices, you can replace the first 4 lines the following code:</p> |
| |
| <pre> |
| import android.hardware.usb.UsbAccessory |
| import android.hardware.usb.UsbManager |
| |
| mUSBManager = (UsbManager) getSystemService(Context.USB_SERVICE); |
| UsbAccessory acc = (UsbAccessory) |
| intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY); |
| </pre> |
| |
| <p>Note that the app only receives events when the USB accessory identification information matches |
| the information in the {@code res/xml/usb_accessory_filter.xml} file, referenced by the |
| application’s manifest statement:</p> |
| |
| <pre> |
| <meta-data |
| android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" |
| android:resource="@xml/usb_accessory_filter" /> |
| </pre> |
| |
| <p>Connections from other USB devices are not received by the ADK 2012 accessory.</p> |
| |
| <p>Once the connection is established, the app can communicate with the accessory through file input |
| and output streams, as shown in the following example code:</p> |
| |
| <pre> |
| ParcelFileDescriptor mFD = mUSBManager.openAccessory(acc); |
| if (mFD != null) { |
| FileDescripter fd = mFD.getFileDescriptor(); |
| mIS = new FileInputStream(fd); // use this to receive messages |
| mOS = new FileOutputStream(fd); // use this to send commands |
| } |
| </pre> |
| |
| <p>Review the {@code UsbConnection.java} file provided in the ADK 2012 source code for more |
| implementation details.</p> |
| |
| <h2 id="audio-dock">USB Audio Dock Implementation</h2> |
| |
| <p>One of the important new features introduced with the ADK 2012 is the ability to play audio over |
| a USB connection. This innovation was introduced as an update to Android Open Accessory (AOA) |
| <a href="http://source.android.com/tech/accessories/aoap/aoa2.html">protocol 2.0</a> and is |
| available on devices running Android 4.1 (API Level 16) and higher.</p> |
| |
| <p>The ADK 2012 provides a reference implementation of this functionality for accessory developers. |
| No software application is required to be installed on the connected Android device, accessory |
| developers only need to support AOA v2. This implementation demonstrates audio output of 16bit, |
| 44.1kHz stereo PCM source data compressed into a single channel due to the audio hardware available |
| on the accessory.</p> |
| |
| <p>Using the audio output features provided by the ADK library requires only a few function calls. |
| The first few calls are in the accessory {@code setup()} routine, which prepare the accessory for |
| USB connections and audio output, as summarized in the code example below:</p> |
| |
| <pre> |
| ADK L; |
| void setup() { |
| L.audioInit(); |
| L.usbh_init() |
| L.usbStart(); |
| } |
| </pre> |
| |
| <p>For more information about the {@code ADK::audioInit()} function, see the {@code |
| libraries/ADK/Audio.c} library file. For more information about the {@code ADK::usbh_init()} |
| function, see the {@code libraries/ADK/Usbh.c} library file.</p> |
| |
| <p>After completing this setup, the {@code loop()} function calls {@code ADK::adkEventProcess()} to |
| handle audio output and other ADK functions:</p> |
| |
| <pre> |
| void loop(void) |
| { |
| ... |
| L.adkEventProcess(); //let the adk framework do its thing |
| ... |
| } |
| </pre> |
| |
| <p>This call executes task queuing for the ADK and as part of the execution process, the task queue |
| executes {@code usbh_work()} in {@code libraries/ADK/Usbh.c}, which handles audio output requests. |
| Review the implementation of this function for details. For additional implementation details on |
| audio output, see the {@code libraries/ADK/accessory.c} library file.</p> |