Android Accessory Protocol - FTF2014

Post on 16-Apr-2022

2 views 1 download

Transcript of Android Accessory Protocol - FTF2014

Android Accessory ProtocolFTF2014

04/10/2014

Gary Bisson

Embedded Software Engineer

SESSION OVERVIEW

1. Introduction

2. Protocol Specifications

3. Accessory Development Kit

4. Software Implementation

5. Demonstrations

6. Conclusion

ABOUT THE PRESENTER

• Embedded Software Engineer at Adeneo Embedded

(Bellevue, WA)

I Linux / Android

♦ BSP Adaptation

♦ Driver Development

♦ System Integration

I Partners with Freescale

Introduction

Android Accessory Protocol Introduction

INTRODUCTION TO AOA

• Allows USB hardware to interact with an Android-powered

device

I No need for the Android device to act as USB Host

I Standard API

• Introduced in Android 3.1 (API level 12)

I Backported to Android 2.3.4 (API level 10)

• Version 2.0 released with Android 4.1

5

Android Accessory Protocol Introduction

INTRODUCTION TO AOA

6

Protocol Specifications

Android Accessory Protocol Protocol Specifications

AOA 1.0 PROTOCOL

• Android Open Accessory 1.0 is a protocol that allows an

Android device to interact with an Android USB

Accessory in a special accessory mode.

• Basically there are four steps to initiate the

communication.

8

Android Accessory Protocol Protocol Specifications

AOA 1.0 PROTOCOL

1. Wait for and detect connected devices

9

Android Accessory Protocol Protocol Specifications

AOA 1.0 PROTOCOL

2. Determine the device’s accessory mode support

10

Android Accessory Protocol Protocol Specifications

AOA 1.0 PROTOCOL

• The accessory must check the Vendor & Product ID’s of

the connected device

I Possibility to target some devices

I Detection of devices already in Accessory mode

• If it is already in accessory mode then:

I Vendor ID = 0x18D1 (Google)

I Product ID = 0x2D00 || 0x2D01

11

Android Accessory Protocol Protocol Specifications

AOA 1.0 PROTOCOL

• Accessory mode product IDs

I 0x2D00 – Supports Accessory Mode

♦ 1 interface with 2 bulk endpoints

I 0x2D01 – Supports Accessory Mode + ADB

♦ 2 interfaces with 2 bulk endpoints each

• If it is not in accessory mode then Accessory mode support

can be asked:

I Send a “Get Protocol” request (51) on endpoint 0

♦ AOA Version (1.0 or 2.0) is returned by Android

device

12

Android Accessory Protocol Protocol Specifications

AOA 1.0 PROTOCOL

3. Attempt to start the device in accessory mode

13

Android Accessory Protocol Protocol Specifications

AOA 1.0 PROTOCOL

• If the AOA Version # is okay, then send string’s identifying

our ADK to the device

I Send “Identity” request (52) for each identifier:

♦ Manufacturer

♦ Model Name

♦ Description

♦ Version

♦ URL

♦ Serial Number

I Send “Start Accessory” request (53) to request the

Android device re-introduce itself on the bus in

accessory mode

14

Android Accessory Protocol Protocol Specifications

AOA 1.0 PROTOCOL

4. Establish communications

15

Android Accessory Protocol Protocol Specifications

AOA 1.0 PROTOCOL

• The accessory must obtain the Bulk endpoints and be

prepared to initiate communication with the device

From this point the communication is defined by the ADK

Developer

16

Android Accessory Protocol Protocol Specifications

AOA 2.0 PROTOCOL

• AOA 2.0 was released at Google I/O end of June 2012

alongside Jelly Bean

• Two new features:

I Audio Output

I Accessory as HID

17

Android Accessory Protocol Protocol Specifications

AOA 2.0 PROTOCOL

• Audio output:

I From an Android device to an accessory

I Standard USB audio class interface (ISO)

I Only supports 2 Channel, 16-bit PCM @ 44100KHz

• To enable the audio support, the accessory must send a

new USB control request:

I “Audio Support” request (58)

18

Android Accessory Protocol Protocol Specifications

AOA 2.0 PROTOCOL

• HID support:

I Registers one or more USB HID with to the Android

device.

I Reverses the direction of communication for typical

USB HID (Host <-> Device).

I Uses USB control requests:

♦ ACCESSORY_REGISTER_HID

♦ ACCESSORY_UNREGISTER_HID

♦ ACCESSORY_SET_HID_REPORT_DESC

♦ ACCESSORY_SEND_HID_EVENT

19

Android Accessory Protocol Protocol Specifications

AOA 2.0 PROTOCOL

• Compatible with original AOA 1.0 protocol

• Also adds Bluetooth support

I Not the focus of this presentation...

I Example available in ADK source code

20

Android Accessory Protocol Protocol Specifications

AOA 2.0 PROTOCOL

• New Product ID’s

I 0x2D02 – Supports Audio

♦ 2 Audio interfaces (control + streaming)

I 0x2D03 – Supports Audio + ADB

♦ 3 interfaces: 2 Audio + 1 Bulk

I 0x2D04 – Supports AOA 1.0 + Audio

♦ 3 interfaces: 2 Audio + 1 Bulk

I 0x2D05 – Supports AOA 1.0 + Audio + ADB

♦ 4 interfaces: 2 Audio + 2 Bulk

21

Accessory Development Kit

Android Accessory Protocol Accessory Development Kit

GOOGLE ADK

• Hardware for ADK 2011 is based on a Arduino Mega2560

• Hardware for the ADK 2012 is based on an ARM

Cortex-M3

• ADK 2012 Guide

23

Android Accessory Protocol Accessory Development Kit

WHAT PART OF AOA DO YOU CONTROL?

• ADK HW

I Schematics provided for the alarm clock

24

Android Accessory Protocol Accessory Development Kit

WHAT PART OF AOA DO YOU CONTROL?

• Other solutions?

I Any USB Host capable device that can provide power

to the Android device.

I This is what makes it easy to port the ADK SW to any

ARM-based board

♦ e.g. i.MX SoCs,Kinetis MCU

♦ Brings more capabilities (video control...)

25

Android Accessory Protocol Accessory Development Kit

WHAT PART OF AOA DO YOU CONTROL?

• ADK SW

I Developer controls what runs on the ADK HW and

what runs on the Android device

• Google provides sample software:

I Source code repo:

♦ android.googlesource.com/accessories/manifest

I Android device application can apply on any device

with API level > 10

♦ Android Application presents UI for control, and

communication

26

Android Accessory Protocol Accessory Development Kit

ADK SOFTWARE

• Accessory side:

I Full-featured:

♦ Accessory

I Basic controls (LEDs, GPIOs)

♦ Audio

♦ Bluetooth

I Code is Arduino-specific

♦ For other solutions, need for a “portable”

Accessory sample code

27

Android Accessory Protocol Accessory Development Kit

ADK SOFTWARE

• Android device side:

I Hardware control

28

Software Implementation

Android Accessory Protocol Software Implementation

SOFTWARE IMPLEMENTATION

1. Software on the ADK HW

I Handles communication with Android device

I Controls sensors, displays, etc. on the ADK HW

2. Software on the Android device

I Can be installed automatically via pop-up URL on

connection

I Handles communication with ADK HW

I Presents a GUI for control, data input/output from ADK

30

Android Accessory Protocol Software Implementation

SOFTWARE INSTALLATION

In case the software is not already installed:

31

Android Accessory Protocol Software Implementation

FIRST USE

Otherwise the user must authorize the execution of the

Accessory app:

32

Android Accessory Protocol Software Implementation

ANDROID APPLICATION

• Must discover the accessory when it is attached

• Communicate with the accessory via ADK Developer

defined commands over USB

• Utilizes the USB API in Android

33

Android Accessory Protocol Software Implementation

ANDROID APPLICATION

• Android contains two different packages to support AOA

protocol:

I android.hardware.usb

♦ Works with no add-on library for Android 3.1 or

higher

I com.android.future.usb♦ From Google API add-on library for Android 2.3.4

or higher

♦ Wrapper around android.hardware.usb

♦ Better choice to support the widest range of

devices

34

Android Accessory Protocol Software Implementation

ANDROID APPLICATION

• First add an intent-filter to the application’s manifest

(manifest.xml)

1 <intent-filter >2 <action android:name="android.intent.action.MAIN" />3 <category android:name="android.intent.category.LAUNCHER" />4 <action

android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"/>5 </intent-filter>6 <meta-data

android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"7 android:resource="@xml/device_filter" />

35

Android Accessory Protocol Software Implementation

ANDROID APPLICATION

• Then define a resource file that details which USB

Accessory this Application communicates with

(accessory_filter.xml)

1 <?xml version="1.0" encoding="utf-8"?>2 <resources>3 <usb-accessory4 manufacturer="Google, Inc."5 model="DemoKit"6 version="2.0" />7 </resources>

36

Android Accessory Protocol Software Implementation

COMMUNICATION WITH THE ACCESSORY

• Grab the UsbAccessory handle from the Intent received

• Open up input/output file streams with the Accessory

1 if (UsbManager.ACTION_USB_ACCESSORY_ATTACHED.equals(action)) {2 UsbAccessory accessory = UsbManager.getAccessory(intent);3 if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED

, false)) {4 mAccessory = accessory;5 fd = UsbManager.getInstance(getApplicationContext()).

openAccessory(accessory).getFileDescriptor();6 mFout = new FileOutputStream(fd);7 mFin = new FileInputStream(fd);8 }9 }

37

Android Accessory Protocol Software Implementation

ACCESSORY APPLICATION

• Control transfers for initialization

• Bulk transfers for custom com

MCU sample code:

1 res = usbh_check_transfer(outpipe);2 if (res != PIPE_RESULT_NOT_QUEUED)3 return -1;4 usbh_queue_transfer(outpipe, buf, len);

Linux sample code:

1 ret = libusb_bulk_transfer(acc->handle,2 AOA_ACCESSORY_EP_IN, acc_buf,3 sizeof(acc_buf), &transferred,4 200);

38

Android Accessory Protocol Software Implementation

ACCESSORY APPLICATION

• Audio streaming

I Arduino ADK or MCU:

♦ DMA to DAC

♦ Simple solution

I Linux implementation:

♦ ALSA sound card

♦ Custom ISO implementation

39

Android Accessory Protocol Software Implementation

ACCESSORY APPLICATION

40

Android Accessory Protocol Software Implementation

ACCESSORY APPLICATION

• HID support:

I 4-step process

♦ Register HID device

♦ Set HID report (defines capabilities)

♦ Send HID reports

♦ Unregister HID device

41

Android Accessory Protocol Software Implementation

ACCESSORY APPLICATION

• Tool to create your HID report structure:

I HID Descriptor Tool

42

Demonstrations

Android Accessory Protocol Demonstrations

HARDWARE SELECTION

• Android Device

I Stock Nexus 7 Tablet running Android KitKat (v4.4.2)

• Custom ARM-based accessory

I i.MX6 SabreLite

I GNU/Linux

44

Android Accessory Protocol Demonstrations

HARDWARE SELECTION

• Why were these particular platforms chosen?

I i.MX6: powerful & famous nowadays

I Show ease of using libusb-based code

I Nexus 7: stock device that needs no modification

♦ Any Android device would work the same

45

Android Accessory Protocol Demonstrations

DEMONSTRATION #1

• Create an accessory device that:

I Displays pictures

I Allows control of the slideshow from Android

• Shows AOA v1.0 capabilities

46

Android Accessory Protocol Demonstrations

DEMONSTRATION #2

• Create an accessory device that:

I Get ADK app data

I Plays audio

• Shows AOA v2.0 capabilities

I Audio streaming

47

Android Accessory Protocol Demonstrations

DEMONSTRATION #3

• Create an accessory device that:

I Requires no app

I Plays audio

I Send HID events

• Shows AOA v2.0 capabilities

I HID device

48

Android Accessory Protocol Demonstrations

MUSIC

• Moby - Innocents

I Open-source tracks

I Available on SoundCloud

I More on mobygratis

• Blend.io

I GitHub for Music

I Pull entire project

I Ableton / Logic /

GarageBand

49

Conclusion

Android Accessory Protocol Conclusion

CONCLUSION

• Interesting standard

I Great flexibility

I Can overcome HW access issues

I Compatibility v2.0 / v1.0

• Limitations

• Code source of Linux ADK available:

https://github.com/gibsson/linux-adk

51

Android Accessory Protocol Conclusion

QUESTIONS?

52

Android Accessory Protocol Conclusion

REFERENCES

• Di Cerbo, Manuel: “Turn your Linux computer into a huge

Android USB Accessory”

http://android.serverbox.ch/?p=262

• libusb: http://www.libusb.org/

• Android Developers:

http://developer.android.com/index.html

• Jesse Dannenbring: AOA presentation

53