AOA (Android Open Accessory) 프로그래밍

codedrawer·2021년 11월 5일
0

Android

목록 보기
1/1

AOA (Android Open Accessory) 모드란 Android 장치가 USB Device 모드로 동작하는 것을 말한다. USB Device 장치인 Android 장치로 USB로 연결된 USB Host HW를 제어하기 위해서 만들어졌다. 일반적으로 Android 장치는 USB Host 모드로 동작 하는데 Android 어플리케이션 프로그램을 (APP 앱) 통해 USB Device 장치 모드로 전환하게 한다.

Hardware Requirement

Android 장치를 USB Device 모드로 전환을 하더라도 USB 포트의 Hardware 설정이 정확해야 한다. 이를 위해서 아래와 같이 USB Cable과 USB Port 확인이 필요하다. 이 설정이 맞지 않으면 아무리해도 동작하지 않는다.

구글 넥서스5 폰만 연결이 되었다. 삼성 폰에서는 인식이 되지 않았다. 아마도 USB 포트가 Host로 고정이 되지 않았나 한다. AOA 관련 API에서는 지원이 된다고는 했는데 연결이 되지 않았다.(Receiver가 동작하지 않음)

PackageManager pm;
pm = getPackageManager();
boolean isUSBAccessory = pm.hasSystemFeature(PackageManager.FEATURE_USB_ACCESSORY);

USB Cable

위 그림과 같이 4 핀 케이블 USB ID 핀에 해당하는 핀에 아무것도 연결되지 않아야 한다. 아직 USB-C 타입은 해보지 않았지만 ..

USB Host Port 와 USB Device Port

왼쪽은 USB Host 쪽 포트이고 오른쪽은 USB Device 쪽이다. Host 쪽은 USB ID 핀에 해당하는 핀이 GND와 연결되어 있고 USB Device 쪽은 연결되어 있지 않다.

Software Requirements

AndroidMenifest.xml

  1. Android Application이 Accessory 모드로 동작하는 것을 설정한다.
<uses-feature android:name="android.hardware.usb.accessory" />
<uses-library android:name="com.android.future.usb.accessory" />
  1. USB Cable이 연결이 되어 USB Host에서 Enumeration 동작 시 응답을 해야 하므로 아래와 같이 설정한다. 실제 동작은 Android OS에서 담당한다.
<intent-filter >
   <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
</intent-filter>

위 intent-filter는 Android Broadcast Receiver 루틴에서 동작하는데 필요하다.

  1. USB Host와 일반적인 Enumeration 동작 후에 AOA 프로토콜에 따라 Manufacturer, Model, Version 정보를 알려준다. Manufacturer, Model 정보가 틀리면 USB Host를 제어할 수 없다.
<meta-data
   android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
   android:resource="@xml/accessory_filter" />

accessory_filter.xml 파일에 위 정보를 기입한다.

위 설정한 정보가 올바르게 동작 한다면 Android Application이 설치된 후 USB 케이블이 연결되면 자동으로 Application이 동작한다.

참조한 코드는 아래와 같다.
https://github.com/devunwired/accessory-samples/tree/master/AccessoryController

AOA Protocol

AoA 프로토콜이 동작하는 순서는 아래와 같다.

  1. USB Cable을 연결하면 USB Host에 Interrupt가 발생하고 일반적인 Enumeration 과정을 거친다. 이 부분은 Android OS가 담당한다.

  2. USB Host는 Version이 1.0 인지 2.0 인지를 물어본다.

  3. 앞에서 언급한 accessory_filter.xml 파일의 Version 정보를 전달한다. 이 부분도 Android OS가 담당

  4. USB Host 장치 즉, USB Accessory 장치에서 Manufacturer, Model 정보를 보내면 Android는 이 정보와 일치하는 Application이 실행된다.

  5. USB Host에서 Android 장치에게 Application 실행 명령을 보낸다. 이 부분까지도 사용자가 특별히 할 일은 없다. Android 장치에서 자동으로 Application이 실행된다.

profile
Embedded SW

0개의 댓글