FS01BU + 格安 SIM + Zynq で IoT が最終目標
USB のホスト機能を Zynq の Standalone で実現できつつある(中途半端)。最終的には格安 SIM とつなげて IoT なことをしてみたいのだが、その前段階として FS01BU と USB のプロトコルのやり取りをしてみた。
ボードはなぜか TB-7Z-020-EMC。
TB-7Z-02-EMC の特殊事情
なぜか最初に USB HC のリセットをしないといけない。なぜだ~~。USB デバイスへの VBUS の供給は ULPI 経由。回路図を見ると(というかUMに書いてある) JP1 と JP2 もつなぐ必要がある。ULPI の OTG のレジスタに 0x67 を書き込む。(0x20 が VBUS 供給の指示)
FS01BU との通信
FS01BU と USB のプロトコルに従い通信してみる
まずはスピード
ポートが Enable になると Zynq の USB ホストは自動的に USB のスピードを判断してくれる(通常の EHCI にはない便利な機能)。Linux のドライバでは chipidea が使われれているので Zynq というより chipidea の機能かな?
PORTSC1 の PSPD が 0 になったので、FS01BU は Full Speed(12Mbps) と USB2.0 だけど High Speed(480Mbps) を使ってないことがわかる。
GET DESCRIPTOR (DEVICE)
DEVICE の情報を取得する。この段階ではまだアドレスは 0 のまま。
12
01
00 02
00
00
00
40
9e 1c (Vendor ID = 0x1c9e)
ff 98 (Product ID = 0x98ff)
00 00
03
02
04
01
ベンダー ID が 0x1c9e でプロダクト ID が 0x98ff であることがわかる。
SET ADDRESS
とりあえず 2 番を付与する。以降、この USB デバイスのアドレスは2。
SET CONFIGURATION
本当は CONFIGURATION を GET DESCRIPTOR して番号を確認しなきゃならないんだろうけど、通常は1個しかサポートしないので、1を設定。そのあと念のために GET CONFIGURATION をして 1 になったことを確認
GET DESCRIPTOR (CONFIGURATION)
ここはあまり自信がない。FS01BU は 1 番のインデックスの CONFIGURATION を取得しようとするとエラーになる(みたい?)。自分の理解では SET CONFIGURATION した番号を GET DESCRIPTOR でも設定すると思っていたのだが、、、もう一度 USB の仕様を確認した方がよい。とにかく FS01BU は 0 番のインデックスに”のみ”反応する。
ロングバージョンの結果は次の通り
9
02
20 00
01
01
01
e0
fa
09
04
00
00
02 (End Point 数)
08 (クラス:Mass Storage)
06 (サブクラス)
50 (プロトコル)
00
07
05
01
02
00
02
00
07
05
81
02
00
02
00
FS01BU は Mass Storage (USB メモリ) だった
ということで、購入したばかりの FS01BU は Mass Storage になっています。この時の Product ID は 0x98ff です。代替インタフェースもないようなので、おそらくベンダー固有のコマンドで USB シリアルに切り替えるのだと思います。
FS01BU のマニュアルにも最初は「ゼロインストール機能により、、、」と書いてあるので Mass Storage で起動して自動インストールをしてアクティベーション(?)することでモデムとして(USB Serial として) 使えるようになるのでしょう。