FlashAirのGPIOモードでJTAGを操作する
最近、FlashAirというWiFi対応SDカードから、GPIOが出せるとかなんとかいうことで、人気のようです。そこで、特電は特電らしく、FlashAirをWiFi-JTAG化できないかと思い、試してみることにしました。
つまり、FlashAirを単体で、無線LAN経由のJTAGアダプタにしてしまおうというわけです。
![]()
FlashAirのチュートリアルはこちらにあります。
https://flashair-developers.com/ja/documents/tutorials/arduino/1/
知りたい点は2つです。
- JTAG化したときに、どのくらいの速さが出るのか?
- 1bitごとに1パケット送るのか?バルク転送みたいなものが存在しないか?
早速、FlashAirを入手し、ピッチ変換基板と万能機版で治具を作りますした。そして、適当な評価ボード(ここではXILINXのSpartan-3A評価ボード)のJTAG端子に、FlashAirのGPIOとなった各端子を接続します。
![]()
GPIO機能を使うためには、IFMODE=1かつ「ホスト側からの初期化がない」場合だそうです。その時、CMDとD1~4がGPIOになるようです。よって、端子の割り当ては、
SDカード端子名 ビット JTAG機能割当てピン CMD/SDI 0x01 TCK D0/SDO 0x02 TDO D1 0x04 TMS D2 0x08 - D3/CS 0x10 TDI
としました。
IFMODEに関しては、/SD_WLAN/CONFIGというファイルに書き込んで設定します。
FlashAirのCONFIGファイルはこんな感じです。
[Vendor] CIPATH=/DCIM/100__TSB/FA000001.JPG APPMODE=6 APPNETWORKKEY=******** VERSION=F19BAW3AW2.00.03 CID=●●●●●●●●●●●●●●●●● PRODUCT=FlashAir VENDOR=TOSHIBA BRGSSID=●●●●●●●●●●● BRGNETWORKKEY=****************** IFMODE=1 MASTERCODE=●●●●●●●●●● LOCK=1 APPSSID=flashair_●●●●●●●●●● FORMATSETMODE=1
固有情報やSSIDなどは●で隠していますのでご了承ください。
![]()
転送速度ですが、
「Maker Faire Tokyo 2014:メイカーは「リレカチ」がお好き (2/2) - MONOist(モノイスト) 」http://monoist.atmarkit.co.jp/mn/articles/1412/01/news068_2.html
を見ると、約1.8bpsと書いてある。遅いですね…
FlashAirのファームウェアの更新に期待します。簡単なプログラムが使えるようになるか、バルク転送のようなものができるといいのですが・・
FlashAirのGPIOにアクセスするには、HTTPのGETやPOSTでデータを送るようです。つまり、
http://flashair/command.cgi?op=190&CTRL=0x1f&DATA=0x05
のようにしてアクセスすると、0x05に対応した値にGPIOが変化するというわけです。
気が遠くなりそうな話ですね・・
![]()
ちょっと気になった点は、FlashAirのI/Oの出力駆動能力があまり高くないかもしれないということです。
実際にSDカードの端子5つに100Ωを介して赤色LED(Vf≒2V)を接続したところ、GPIO出力が3.28V→2.8Vまで電圧降下した。8mA程度までしか流せないのかもしれません。
![]()
さて、いよいよJTAGの信号を出してみることにします。
まずはターゲットICのIDCODEを調べましょう。
JTAGのIDCODEを調べるためには、
- TMS='1'にしたあとTCKを5cycle、のちTMS='0'
- TMS='0'でTCKを1cycle
- TMS='1'にしたあと、TCKを1cycle
- TMS='0'にしたあと、TCKを2cycle
- 以後、TMS='0'のままTCKをたくさん与える
TCKの立ち下がりで、TDOに1bitずつ、LSBからIDCODEから出力される。
実際に、URLを全部手打ちでGPIOを操作し、受信してみました。
command.cgiに、?op=190&CTRL=0x1f&DATA=0x05 のように引数を付けるとGPIOからその値が出力され、ブラウザの画面にGPIOを読んだ値が表示されます。
いわゆるJSON形式なのでしょう、
{"STATUS":"OK","CTRL":"0x1f","DATA":"0x1f"}
のように表示されます。
FlashAirに対し、ベタに何度も何度もアクセスします。
URLに投げたGETリクエストは、以下のようなもの http://flashair/command.cgi?op=190&CTRL=0x1f&DATA=0x00 // clear http://flashair/command.cgi?op=190&CTRL=0x1f&DATA=0x04 // TMS up // TMS = 1, 5cycle http://flashair/command.cgi?op=190&CTRL=0x1f&DATA=0x05 // TCK raise http://flashair/command.cgi?op=190&CTRL=0x1f&DATA=0x04 // TCK fall http://flashair/command.cgi?op=190&CTRL=0x1f&DATA=0x05 http://flashair/command.cgi?op=190&CTRL=0x1f&DATA=0x04 http://flashair/command.cgi?op=190&CTRL=0x1f&DATA=0x05 http://flashair/command.cgi?op=190&CTRL=0x1f&DATA=0x04 http://flashair/command.cgi?op=190&CTRL=0x1f&DATA=0x05 http://flashair/command.cgi?op=190&CTRL=0x1f&DATA=0x04 http://flashair/command.cgi?op=190&CTRL=0x1f&DATA=0x05 http://flashair/command.cgi?op=190&CTRL=0x1f&DATA=0x04 http://flashair/command.cgi?op=190&CTRL=0x1f&DATA=0x00 // clear // TMS = 0, 1cycle http://flashair/command.cgi?op=190&CTRL=0x1f&DATA=0x01 // TCK raise http://flashair/command.cgi?op=190&CTRL=0x1f&DATA=0x00 // TCK fall // TMS = 1, 1cycle http://flashair/command.cgi?op=190&CTRL=0x1f&DATA=0x04 // TMS up http://flashair/command.cgi?op=190&CTRL=0x1f&DATA=0x05 // TCK raise http://flashair/command.cgi?op=190&CTRL=0x1f&DATA=0x04 // TCK fall http://flashair/command.cgi?op=190&CTRL=0x1f&DATA=0x00 // clear // TMS = 0, 1cycle http://flashair/command.cgi?op=190&CTRL=0x1f&DATA=0x01 // TCK raise http://flashair/command.cgi?op=190&CTRL=0x1f&DATA=0x00 // TCK fall // TMS = 0, 1cycle http://flashair/command.cgi?op=190&CTRL=0x1f&DATA=0x01 // TCK raise http://flashair/command.cgi?op=190&CTRL=0x1f&DATA=0x00 // TCK fall // now we can read TDI @ 32cycles... http://flashair/command.cgi?op=190&CTRL=0x0D&DATA=0x01 // TCK raise http://flashair/command.cgi?op=190&CTRL=0x0D&DATA=0x00 // TCK fall // read TDI http://flashair/command.cgi?op=190&CTRL=0x0D&DATA=0x01 // TCK raise http://flashair/command.cgi?op=190&CTRL=0x0D&DATA=0x00 // TCK fall // read TDI ※以下、上の0x01、0x00を繰り返し、[7..0]中の[1](TDI)を読み出す。
すると、
LSB(最初に受信した方) MSB 1100100100000110001000001010111110010 3 9 0 6 8 0 5 F B 0
正解のIDは22628093ですから、
MSB LSB 00100010011000101000000010010011 2 2 6 2 8 0 9 3
こうなるはずです。近いような値だけど、微妙に違っているので、やはりFlashAirの出すJTAG信号はFPGAが正常に認識できていないようです。その原因としてTCKの波形の鈍りが疑わしいので、次回はバッファを入れて試してみることにします。
| 固定リンク




コメント