2022年5月2日月曜日

【Android USB oscilloscope】(27) STM32でAOA 重箱の隅

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

STM32をUSB hostにする取り組みで悩んでいましたが、少し前進しました.
なお、今回は重箱の隅ですので重箱の隅を覗きたい人だけ下へ進みましょう.

【いきさつ】
こんなブロックでスマホの画面をオシロ画面として活用したいというのが最終目標.
開発要素はこの3つ.
・ハードウエア(STM32)  ←入手難で絶賛死亡中
・STM32のfirmware(STM32CubeIDE C言語)
・スマホアプリ(Kotlin)
今はSTM32 firmwareをやってるところ.
firmwareのひな型としてこの画面のMiddleWareを利用しています.
スマホに外部からUSB dataを流し込むには、AOAという聞きなれないUSBプロトコルを使います.AOAについては過去投稿を参照してください.ひな形firmwareにAOAは実装されてません.
【Android USB oscilloscope】(16) AOA --- Android~Linux hostとのUSB BULK通信 (化物)

AOAは曲者です.AOAこんな手順でUSB接続します.
・スマホにUSBを挿すと、、、
・最初はMass Storage接続だったりするのは誰もが見る光景なのだが、、、 ①
・裏でUSB hostが特殊コマンドを送信すると、、、
・スマホがUSB接続を一旦切断し、別のVID/PIDで再接続してくる
・再接続したスマホはAOA接続になっている   ②

①はUSB classなので型にはまっていて使いづらい.②はclassではないのでユーザーが好き勝手出来るのでわたしにとってはAOA接続の方が便利.それがAOAを使う理由です.

本シリーズの過去投稿で、PC(Linux)でAOA接続の動作確認はできています.
なので現在取り組んでいるのは、同じものをSTM32 USB hostに移植すること.

だけどなかなか上手く動かなかったんだよね.数日間悩んでた.

【動かないってどこが?】
・Linux hostなら動くけれど、STM32 hostだと動きません
・AOAの特徴である、接続断→再接続のときに死にます
・codeを眺めていてもおかしな点はない
・USBプロトコルアナライザ(wireshark)でおかしなpacketは飛んでない
・接続断処理が正常に完了してないので再接続が滞っているのではないか?
・接続断処理に要する時間をオシロで観測したら1秒ぐらいかかっている  ③
接続断→再接続の間隔を実測したら250mSecしかない  ④
・③>④なので死んでいる

【USBの原則とAOA】
一般にCPUが外界の事象にコミットするには割り込みを使わないと上手くいきません.USBでも同様で、USBの様々なイベントに即応するべく割り込み(callback関数)がたくさん用意されています.

ただし「callback多数」はUSB deviceの場合に限ります.USB hostはほとんど割り込みを使いません.それはSTM32CubeIDEが吐き出すsample codeを眺めると分かります.USB hostではcallback関数が3つしかないんです.
 1)USB disconnect callback
 2)USB connect callback
 3)SOF callback
これはUSB deviceに比べたら鬼のように少ないです.てか割り込み処理しようという気が基本的に無い設計思想といえます.

後日訂正:setupに割込みは少ないですが、data転送にはIRQが盛んに発生しているようです.調査中.

どうしてこんな仕組みになっているのか?
USBではデータの流れを全てhostが握っています.hostはdeviceに「しゃべっていいぞ」と命じ、deviceは返答します.
deviceが勝手にイベントを発生させる場面は「基本的に」ありません.

「基本的に」というからには例外があるものでして、hostのcallback関数にも見られる通りこの2場面では「deviceがイベント発生」させてもOKOK.人力でケーブル引っこ抜くのに時間制限なんかないですからね.
 1)deviceが落ちるとき
 2)deviceが接続するとき

なので、AOAが接続断→再接続するのはスマホが好き勝手にやります.わたしがdebugに使っているHuweiのスマホでは接続断→再接続の間隔はたったの250mSecです.1秒程度の余裕があってもいいんじゃね? これだから接続断→再接続ってあまり関わりたくないです.

【余談】
USB機器には、USBメモリのような高速応答の物もあれば、プリンタのような応答速度が数秒かかる物もあります.

LinuxのUSBの挙動をプロトコルアナライザを見ているとこんな場面が多々あります.
 プリンタへ要求
  ↓
 USBメモリへ要求
  ↓
 USBメモリが応答
  ↓
 プリンタが応答   ←順序おかしい
つまり、hostは要求を乱れ撃ちします.結果としてdeviceからの応答も因果関係無視の乱れ撃ちになります.driverがキューを参照して対応関係を並び替えしてるんでしょう.

ところが、STM32のsample programは乱れ撃ち非対応です.ゆえにやたら応答が遅いdeviceが在ったらhostの処理が滞ります.(RTOSを実装したら違うかもだけど)

【余談2】
STM32 sample programにおいては、hostはdevice応答をいつまでも待ち続けると書きました.また、hostは割り込みをほとんど使わないと書きました.

では.hostはどこで待っているんでしょうか?
大雑把にいえばmain loopです.ここでpollingしまくってます.なんか懐かしい感じw
main() {
    while(1) {
        polling()  ←ここでフラグをチェックしつつ待つ
    }
}


以下はcodeの説明などをするつもりですがそれは後ほど追記します.project folder詰め合わせもDLできるようにします.

追記: BULK転送まで一気に実装してsource codeを公開しようと思ったのですが、BULK転送が全然動かないわSTM32がhung-upするわで挫折.今宵はここまでにしとう御座います.

26へ    28へ

かしこ

11 件のコメント:

  1. うーん、main()でポーリングですか。なんか知ろうとっぽいというかヘボい感じですね。テキトーに実装したのか、あれこれやって万策尽きてこうなったのか。
    murasaki

    返信削除
    返信
    1. hostにはfreedomがあるというお考えのようです.It's cool.

      削除
    2. ぶっちゃけ言うと、Windowsも「3.xまで」は、こういう作りです。
      マシンパワーがないCPUで、「マルチタスクもどき」をやろうとすると、こうなっちゃいますね。
      (スライシング(割り込み使って、強制的にタスクを切り替える)の時間さえ惜しいほどマシンパワーがないと、こうするしかないのでしょう。
      あと、「ホストには、応答の義務」があるので処理最優先の意味もあるかもしれません。)
      ※こうなると、「処理の順番」とかが問題になったりして、プログラミングの難易度が格段に上がりますね・・・

      削除
    3. あ、でも、「こういうUSB HOSTの作り方」があるんなら、
      「Windows 3.1」にも、USB実装できますね。
      (個別ドライバは必要だけど。Mass Strage Class とかは、実装できそう。)

      削除
    4. win3.xはボロかったので使いませんでした.その頃はMAC使ってました.95が出てwindowsを使い始めました.

      むかしむかし、「闘うプログラマー」という本があって、win-NT開発の実録記でしたかねあれは.windowsはNTで技術的に進歩したように思ってるんですけど合ってますかね?
      そんでNTをホームユースに横展開したのはwin2000だったよな.

      削除
    5. >win3.xはボロかったので使いませんでした
      ユーザーとしては、それが「正解」ですね。ちなみに私は、そのころから既にWindowsは使ってましたが。VisualBasic1.0とか、使ってました。まぁ、でも、
      やっぱり「パソコン」は、おもちゃ扱いだった気がします。
      ちゃんとした業務ソフトは、もっぱら「AS/400」で、開発してたし。

      >「闘うプログラマー」
      デビッド・カトラーのやつですね。私もこの本持ってた気がしたのですが行方不明。
      >windowsはNTで技術的に進歩した
      デビッド・カトラーは、VMS(Virtual Memory System、今は亡き、Digital Equipment Corporation のOS)の開発者の一人で、そこで使われていた技術を、Windows NT の開発に活用しました。

      >NTをホームユースに横展開した
      実際に、個人で「Windows 2000」使ってた人は少数派なので、
      「Microsoftは、そうしたかった」くらいが、妥当な評価でしょう。
      ※なので、Microsoftは業を煮やして、Win9.x系の開発は打ち切って、無理やり「Windows XP」をリリースしたのです。もはや、今は昔の話ですが。

      削除
    6. そうそう、カトラーという人が主人公?でした.

      そういや某所で未だにwin2000が動いてるところを見ました.
      XPは長く使っていました.MEは使ってませーん.

      削除
    7. 今日は匿名でー2022年5月3日 20:23

      あまり有名にならなかった機能ですが、Windows NTのコールバック機能で会社のマシンから折り返し自宅に電話をかけさせて(NTが自動的にやってくれる)、会社のネットワークに入って仕事してました。音声モデム通信時代のお話です。1MBのファイル転送で1時間かかりました。えええ?それセキュリちいホールですって?そんなコトバ知らなかったですもん。

      削除
    8. それはVPNですね.ちがうけどw

      削除
    9. >それはVPNですね
      a kind of VPN ではありますね。「会社のネットワークに入って」なので。
      (「会社のネットワーク」と「家庭のネットワーク(PC1台でも、一応「ネットワーク」にはなる)」をつないでるという意味では。)
      まぁ、昨今は、こういうのは全部「リモートアクセス」って言っちゃいますが。

      削除
    10. 家では専らtelnetでリモートログインしてます、sshじゃなく

      削除