2022年2月9日水曜日

【Android USB oscilloscope】(15) AOA --- Linux host側のsample program

余っているAndroidスマホをオシロにしよう!

スマホでこんなUSB接続をしたい.
     Linux(host) ----> スマホ(device)

Android open Accessory(AOA) libraryを使ってhostと接続する仕組みがgoogleから提供されている.AOAについての公式情報はリンクが切れていたりして鮮度が落ちてる.それでもAOAについて読むならばここかな.
このAOAをgoogleがアピールしていたのは2011年や2012年ごろであって、現在のAndroid11でも通用するものなのかどうかという不安はある.

当連載の前回で、スマホをUSB deviceとしてPC hostに繋ぐには、AOAに仕込まれたちょいとめんどくさい手順があるらしいよと書いた.PC側のプログラムとスマホ側のプログラムがネゴシエーションする仕組みなのだが、一度USB接続してから再度USB接続するという2stepを要する仕組みだ.

step1
スマホの最初の顔はデバッグモードである.例えばVID/PID=18D1/4EE7
ホストPCは、VID/PIDでスマホを検出し、処理を始める.
ホストPCは、スマホに対してAOA対応機かどうかを問い合わせる.
AOA対応機だったなら、ホストはスマホへAccessoryの顔で再起動せよと命じる.

step2
スマホは別のVID/PID=18D1/2D00または18D1/2D01に化けて再起動し、改めてUSBに接続する.
ホストPCは、スマホにmanufacture="xxxx"、product="yyyy"ですか?と問いかける.
スマホは"xxxx""yyyy"で待ち受けているので門戸を開く.

ーーーー
そこで今回は手始めに、PC側のネゴシエーションプログラムを動かしてみる.スマホ側はなにもしない.

参考にしたというかモロパクリしたのは、
これにリンクされているpc-usb.cというsource.

sourceを少し変更する必要がある.
手持ちのスマホ、Android One S5のUSB descriptorを解析して、USB debug modeにおけるVID/PID=18D1/4EE7と判っているので、pc-usb.cのはじめの方をそれに書き換える.これは必須.読者のスマホでは違う番号かもしれない.
   #define VID 0x18D1
   #define PID 0x4EE7
source変更はこれだけ.

コンパイルにはlibusb-1.0を使うので、インストする.わたしのLinux環境はちと古いのでaptのリンクが切れまくっていて復旧に苦労したが、最終的に次のコマンドのいずれかでインストできたようだ.
   apt-get install libusb-1.0
   apt-get install libusb-1.0-0-dev
   aptitude reinstall libusb-1.0-0-dev

コンパイルは、
   gcc -lusb-1.0 pc-usb.c -o pc-usb

動かしてみる.
1)スマホAndroid One S5をUSB debug modeにしてからLinuxマシンにUSB接続
2)Linuxからpc-usbを動かす
3)表示が出る、errで停まる

% pc-usb
Device is not USB Accessory Mode ①
Verion Code Device: 2
Accessory Identification sent ②
Attempted to put device into accessory mode ③
connect to new PID... ④
claim usb accessory I/O interface ⑤
Interface claimed, ready to transfer data ⑥
start main Phase
Error: unkown error ⑦
Error during main phase

最終的にerrで停まるのだが、いまはこれでいい.
動作状況はこうだ.
①スマホがUSB debug modeで接続されており、Accessory modeではない
②スマホがAOA対応機かどうかを問い合わせる →スマホから返答あり
③スマホへAccessory modeで再起動せよと命じる
④スマホがAccessory modeで起動したのを確認.PIDが新しくなった
⑤スマホへEP番号などを問い合わせている
⑥転送できるようになった
----ここまではスマホのOSのAOA機能が働いてくれたのだろう
⑦errorで停まった.スマホにアプリを何もインストしてないので当然だ

というわけで、AOAのめんどくさいstepでUSB接続を確立するところまでは成功したようだ.ゆえにAndroid11でもAOAは生きていると確認できた.

今宵はこれまでにしとうございます.

次回はスマホ側のプログラムを動かしてみよう.

14へ                 16へ

かしこ

0 件のコメント:

コメントを投稿