« MITOUJTAG活用セミナーを開催します | トップページ | MITOUJTAGに基板接続検査機能を開発中 »

2014.12.03

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となった各端子を接続します。

Fa_jtag_1

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が変化するというわけです。

Fa_jtag_2

気が遠くなりそうな話ですね・・

ちょっと気になった点は、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の波形の鈍りが疑わしいので、次回はバッファを入れて試してみることにします。

|

« MITOUJTAG活用セミナーを開催します | トップページ | MITOUJTAGに基板接続検査機能を開発中 »

コメント

コメントを書く



(ウェブ上には掲載しません)




« MITOUJTAG活用セミナーを開催します | トップページ | MITOUJTAGに基板接続検査機能を開発中 »