May 23, 2008

Amontec JTAGkey-Tiny (FT2232) を Xilinx iMPACTから使う

FTDIのFTCJTAG.dllの仕様(リード、ライトが最低2bitsから)にブチ切れつつ、漸く完成しました。FPGAのプログラムをダウンロードする際、これまではパラレルポート+自作JTAGアダプタを使ってきたのですが、あまりの遅さについつい、Xilinx純正のダウンロードソフトであるiMAPCTから、純正以外のJTAGケーブルをコントロールできるようなプロキシソフトをこさえてしまいました。完成した現在では、前に購入したFTDIのFT2232を搭載したAmontec JTAGkey-Tiny経由で、iMAPCTからダウンロードをサクサク行えています。

実は世の中には既に便利なSVF Player(JTAG操作を記述したSVFファイルを様々なJTAGケーブルを通して実行するためのソフト、当然データのダウンロードもできる)があるので、ダウンロードを高速にしたいという要望だけみれば、今回作成したソフトはかなり車輪の再発明です。しかしながら、今回こさえたものはXilinxの純正ツールであるiMPACTから直接使えるので、ダウンロードを行う際にわざわざSVFファイルを書き出し、SVF Playerを起動する必要がこれでなくなりました。快適です。

動作原理ですが、リモートケーブルの概念を利用しています。これは書込みを指示するiMPACTが実行されているPCとJTAGケーブルが接続されているPCが異なる場合、操作の指示をTCP/IPでJTAGケーブル側のPCに転送するので、そのプロトコルさえわかれば純正ケーブル以外のJTAGケーブルにも対応できるというわけです。このプロトコルはsourceforge.netで開発が行われているxilprgのcblsrvで実装例がありましたので、これを下地にJTAGkeyに搭載されているFT2232に対応するよう改造を行いました。

プロトコルの構造は単純だったので、改造ポイントはすぐにわかりましたが、ここで冒頭の問題にはまりました。FT2232でJTAGをコントロールするためのFTDIが提供しているFTCJTAG.dllは制御の単位が最低2bitsであったことです。結局可変長のビット配列クラスlong_bits.hを用意してビット単位の切り貼りを行うことで解決しましたが、この制限が何に由来するものなのかよくわかりません。なおlong_bits.hの使い方はlong_bits_test.cppを参考にどうぞ。

ソースとコンパイル済みのバイナリのセット cblsrv-0.1_ft2232.zipを公開します。実行方法は以下のとおりです。指定したポート番号を、iMPACTの[option]->[Cable Setup]-[Cable Location]でlocalhost:(ポート番号)のように指定してください。

cblsrv.exe -c amontec -p (ポート番号)

動作確認はiMPACTの8.2と10.1で行いましたが、いずれも快適に動作しています。

※以下、修正情報です。
2008/05/26 高橋さんのご指摘があり、JTAGkeyのポート割り当てに関するバグを修正し、ファイルを差し替えました。
2008/05/27 long_bits.hでメモリ割り当てをしくじっているバグがありました。修正済みのものと差し替えました。
2008/06/29 もしTCKが早すぎて対象機器が動作しないようでしたら、ft2232jtag.hの49行目dwClockDivisorの値を大きくしてリビルドしてみてください。

※※いえながさんによると、VC2008がインストールされていない環境では、実行に際して『Microsoft Visual C++ 2008 再頒布可能パッケージ (x86)』が必要とのことです。

※※※(2009/8/8) この記事は意外と需要があるようなので、メンテナンスを行いました。下記コメントで10.1.2で動かなくなる問題を解決してくださったNakagawaさんのコードをマージし、修正版 cblsrv-0.1_ft2232_r3832.zip を新たに上げておきます。修正箇所はnakatomoの文字列で検出できます。またiMPACTのバージョンが古い場合は、IMPACT_VERSIONを、例えば80200のようにdefineするといいです。

※※※※(2010/2/4) さらに10.1.3, 11.1でも動くよう改修しました(cblsrv-0.1_ft2232_r4740.zip)。このバージョンはコードを修正することなく8.2でも使えることが確認できています。
改修内容は主にlong_bits.hのバグ(ビットシフトで問題があった)を取ったのと、WRITE_SHIFT(0x20)やWRITE_SHIFT_LAST(0x30)といったJTAG TAPのステートマシーンをPAUSEで維持しなければならないコマンドへの対応をしてあります。また現状認識している問題としては、11.1で動かないこと(解消しました)、FPGA本体へのbitファイルダウンロードがうまくいかないことがある(PROMへのダウンロードは問題なし)ことの21点です。

※※※※※(2010/3/3) FTCJTAGのDllバージョンによって問題が発生することを認識しました。FTCJTAGのバージョンは1.9(現時点で最新は2.0ですので少し古い)を使ってください。Dllのバージョンチェックを行うようにしたもの、また1.9を添付したもの(cblsrv-0.1_ft2232_r4788.zip)をリリースします。

※※※※※※(2010/3/19) FTCJTAGのバグ(詳細はこちら)を解消しました。修正されたdllを添付し、さらにFT2232H/4232Hに対応したcblsrv-0.1_ft2232_r4804.zipをリリースします。PROMだけでなく、FPGAへのダウンロードも成功する確率が飛躍的に高くなりました。

※※※※※※(2010/4/27) Alpha Projectさんの製品であるUSBマルチJTAGアダプタHJ-LINK/USB と組み合わせて使う方法が紹介されています。

14:08 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/641
コメント

SPI用DLLも、妙な制限があるんです。仕方が無いので、MPSSEでしたっけ、あれのマイクロコードのスペックを読んで自分でライブラリを作りました。

Posted by: 酔漢 : May 25, 2008 10:25 PM

monamourさんのところで知りましたが、UrJTAGというものがあるそうです。
http://d.hatena.ne.jp/monamour555/20080525/1211690673

Posted by: 酔漢 : May 26, 2008 07:45 AM

はじめまして。高橋と申します。

すばらしいものを公開してくさりありがとうございます。
まさに私が欲しかったものです。感謝と尊敬の念で一杯です。

早速ですが、ft2232jtag.h を拝見させていただきました。
コードの内容もよくわからずにコメントさせていただき恐縮ですが、
以下の定義が入れ替わっているように思うのですが。

JTAG_OE_N 19 => GPIOL1
VREF_N_IN 20 => GPIOL0

自分で動かしても見ないうちに大変失礼ですが気になったもので。

Posted by: 高橋 : May 27, 2008 12:01 AM

fenrirです。

>酔漢さん
やはりそうされていましたか。FTCJTAGで検索をかけると酔漢さんのasagaoが引っかかったのですが、『どうしているんだろーな』と横目で眺めつつ、軟弱にライブラリの制約にしたがっている自分がいました(笑) UrJTAG教えてくださりありがとうございます。ドキュメントをさらっと読んだくらいですが、開発が止まってしまっているjtagtoolの後継という位置づけだそうで、期待しております。

>高橋さん
ご指摘ありがとうございます。おっしゃる通りでしたので、zipも含めて修正させていただきました。jtag_oe_nにプルダウンがあり修正前の状態でも動作していたため、全く気づきませんでした。

Posted by: fenrir : May 27, 2008 01:07 AM

はじめまして.いえながと申します.

公開していただいているcblsrvを実行しようとすると.
「このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。アプリケーションを再度インストールすることにより問題が解決する場合があります。」と出てしまい,実行することができません.

解決方法等ございましたら,ご教授くださいm(_ _)m

Posted by: いえなが : June 17, 2008 09:23 PM

>いえながさん
大変申し訳ありませんが、このエラーメッセージ出くわしたことがありません。しかしdllが見つからない類のエラーではないかと考えられます。実行にはFTCJTAG.dllが見えている必要がありますので、DOS窓で(FTCJTAG.dllがある)cblsrv-0.1_ft2232/build/win32/Releaseに移動した後、実行していただくと解決する可能性があります。

Posted by: fenrir : June 17, 2008 11:57 PM

回答ありがとうございます.

DOS窓でcblsrv-0.1_ft2232/build/win32/Releaseに移動して実行してみましたが,指定されたプログラムは実行できませんと出てしまいます(T_T)

Posted by: いえなが : June 18, 2008 05:44 PM

>いえながさん
お役に立てなかってようで、申し訳ありません。現象がこちらでも再現するようにできましたら、何らかのコメントをつけさせていただきます。

Posted by: fenrir : June 19, 2008 10:27 PM

自己解決しました!

自分の環境にVisual C++ 2008のライブラリが無いため実行できなかったようです.
Microsoft Visual C++ 2008 再頒布可能パッケージをインストールしたところ,問題なく使用できるようになりました.

どうもお騒がせしましたm(_ _)m

Posted by: いえなが : June 22, 2008 11:20 PM

>いえながさん
fenrirです。問題解決されたようで、なによりです。また、情報ありがとうございます。

Posted by: fenrir : June 23, 2008 02:51 PM

 お久しぶりです。以前この次のエントリーでコメントさせていただいた中田です。前回は素早い対応、誠にありがとうございました。

 最近になってようやくまとまった時間が取れるようになり、CPLDの動作テストを試みているのですが、iMPACTからCPLDに接続する事ができず途方に暮れております。

 具体的には、公開していただいたcblsrv.exeコンソール上では

 Cable is '(JTAGデバイス名)'

というふうにJTAGデバイスを認識するのですが、iMPACTのCable SetupでCPLDに接続しようとするとiMPACTのConsole上に以下のようなメッセージが表示されてしまうのです。

Enumerating cables. Please wait.
PROGRESS_START - Starting Operation.
Connecting to cable (Usb Port - USB21).
Checking cable driver.
Source driver files not found.
The Platform Cable USB is not detected. Please connect a cable.If a cable is connected, please disconnect
and reconnect to the usb port, follow the instructions in the 'Found New Hardware Wizard', then retry
the Cable Setup operation.
Cable connection failed.
PROGRESS_END - End Operation.
Elapsed time = 0 sec.
// *** BATCH CMD : setCable -port lpt1
Server Name = localhost, Port = 2000.
recv() failed: 10053

また、このメッセージ表示と同時にSRST_N_INに接続されたLEDが約1秒間隔で点滅します。

 JTAGデバイス自体は手持ちのARMマイコンを正常にコンフィグできていることから、動作そのものに問題はないと思われます。また、パラレルポート経由だと正常に書き込めることからCPLD周辺回路の不具合とも考えられません。

 こちらで指定するポートを変更したり、dwClockDivisorの値を50程度まで大きくしたりとできる限り手を尽くしたのですが、どうしてもCPLDに接続する事ができなかったため、もしこのようなトラブルの原因としてお心当たりがあればぜひご教授いただきたく、今回投稿させていただいた次第です。

 なお、開発環境は
《platform》 ISE10.1.02
《OS》 Windows XP Professional SP2
《target device》 XC9536 10PC44C
《language》 Verilog-HDL
となっております。

 素人質問で大変恐縮ですが、どうぞご指導よろしくお願いいたします。

Posted by: 中田 : August 6, 2008 11:19 PM

>中田さん
fenrirです。iMPACTと自作したソフトの通信がうまくいっていないような印象を受けております。
基本的なことをいくつか確認していただきたいのですが、貼り付けてくださったログのポート番号(2000)とこちらの自作ソフトを起動する際に-pで指定したポート番号は同じでしょうか?
ファイアウォール系のソフト(ノートン先生等)が邪魔をしているということはないでしょうか? これらを一時的にきって試していただくとどうでしょうか?
最後にハード的な問題は皆無だと思いますが、念のため、JTAGKeyを接続した際に[マイコンピュータ]-(右クリック)-[システムのプロパティ]-[ハードウェア:デバイスマネージャ]で表示されるUSBの項目にFT2232の2ch分が認識されていますでしょうか? またそのドライバはFTD2XXを使用していますでしょうか?
今のところ僕の方で思いついたのはこれくらいです。うまくいけばよいのですが、もしそうでなければ力不足です、すいません。

Posted by: fenrir : August 7, 2008 10:05 PM

 中田です。お返事が遅れてしまい申し訳ありません。

 まずご指摘いただいた点について再度確認してみましたが、ポート番号は正しく指定しており(ポート番号をわざと異なるものに変更すると別のエラーが出る)、またファイヤウォールやウイルスソフトもオフにして実行してみましたが、残念ながら結果は変わりませんでした。

 ハード面でもデバイスマネージャ上でUSB Serial Converter A,Bとも認識されており、またドライバの一覧にftd2xx.dllが含まれていることから、こちらも問題ないと思われます。

 そもそもJTAGデバイスが某オークションで落札したユーズド品であることが問題かとも考え、DesignWave Magazine 2008.6月号にたまたま載っていたJTAGkey互換の回路というものを組んで実験してみたのですが、やはり同様の症状が出てしまいました(「互換」なのであまり参考にならないとは思いますが…)。

 今後何か進展がありましたらまた報告させていただきたいと思います。ありがとうございました。

Posted by: 中田 : August 12, 2008 02:54 PM

Linux版作りました。FTCJTAGないのでMPSSE直書きです。

それと、うちでは Windows版でXC18V01Sの旧リビジョンに書けてないんですが、こちらでは書けてますでしょうか?

Posted by: かみき : October 19, 2008 11:39 AM

>かみきさん
fenrirです。
Linux版お疲れ様です。こちらはMPSSEを直接叩くことに挫折して、FTCJTAGでお茶を濁してきたわけですが、どなたかがそこの部分を解消してくれればいいなぁ、なんて思っていたところでしたので、大変ありがたいです。
なお、こちらのフラッシュのテストデバイスはXCF01とXCF02を試したのみです。もっと様々なデバイスで試験をする必要があるとは思っているのですが、何分手持ちのデバイスがあまりないものなので、有益な情報を提供できず申し訳ない限りです。

Posted by: fenrir : October 20, 2008 08:15 PM

はじめまして。
横レスですが、うちの環境@ISE10.1.03/XP SP3でもcblsrvが動きませんでした。
症状は中田さんのものと全く同じです。

そこで、デバッグして修正しましたので、お知らせします。
http://naknet.jpn.ph/blog/log/eid319.html

Posted by: T.Nakagawa : February 8, 2009 03:07 PM

>T.Nakagawaさん
fenrirです。修正してくださりありがとうございます。ざっとソースを眺めさせていただいたのですが、想定していないメッセージタイプ(0x06)への追加があったりと、かなり大変な作業だったのではないかとお見受けします。
こちらの公開しているソースにも、よろしければNakagawaさんの修正結果をマージしてもよいでしょうか? それにしてもなぜこちらの修正前のソースで10.1で問題なく動いてしまったのか不思議です。

Posted by: fenrir : February 9, 2009 09:07 AM

MESSAGE 0x06についてはOKをACKするだけでよさそうでした。何もしない場合、iMPACTにエラーログは出ますが、特に大きな問題にはならなかったようです。

私の環境で動かなかった直接の原因は、どうやら二つありました。

一つ目は、Cableの名前として"Parallel III"などを返したり、speedを設定するとiMPACTが無限ループに突入するというもので、これはそれらを設定しないことで回避しました。

二つ目は、DeviceIDが取得できなかったことでした。fixでは、ここをあらゆる場合にJTAG_WriteRead()するのではなく、結果をverifyしないときにはJTAG_Write()のみを発行することで回避しました。

特に一つ目の現象などは、私としても「良く分からない」という感じです。もしかしたら別の環境では動かないことがあるかもしれないので、mergeされるのはOKですが、そこら辺を明記して頂けるとありがたいかもです。

Posted by: T.Nakagawa : February 19, 2009 10:26 PM

はじめまして、横溝と申します。
cblsrvを利用させていただきました。
大変素晴らしいもので感激しています。
PROSME2010と言うイベントでFPGAの開発環境の話をするので
紹介させていただきた思っています。
もし、不都合がありましたらお知らせください。

Posted by: よこみぞ : August 6, 2010 03:09 PM

>横溝さん
コメントありがとうございます。うまく動作しているようでほっとしております。
PROSUME2010、でるかどうしようか迷ったのですが、諸事情で今回は辞退しました。しかも出張で参加もできなくなってしまいました。そこでご紹介くださるということ、ありがとうございます、また特に不都合はございません。

Posted by: fenrir : August 6, 2010 09:09 PM

ご快諾いただきありがとうございます。
紹介させていただきます。
ベンダー製のダウンロードケーブは高価なので、
これからFPGAでの開発にトライしたい方にはありがたいと思います。
では、失礼します。

Posted by: よこみぞ : August 7, 2010 08:13 AM

お世話になります。

CQ出版の記事を見てこれは良いと思い、早速
 cblsrv-0.1_ft2232_r4804(fenrirさん)
 +ISE9.2i(Xilinx/WebPack)
 +HJ-LINK/USB(アルファさん)
環境にて、Spartan-3デバイスへのダウンロードを試して
みましたが、iMPACT接続時に後述のケーブル関連エラーが出ます。

fenrirさんページのやり取りを見させていただき、
・cblsrvポート番号指定とiMPACT指定の一致確認
・ドライバーのインストール確認(2ch分)
等々行い、また
・ファイアウォール系ソフトをはずす
等試してみましたが状況は変わらない模様です。

尚、別途ARM7デバイスへのアクセスができていますので、
HJ-LINK/USBのハードウェアには問題ないものと思われます。

初歩的な質問ですいませんが、何か気づくことがありましたら
ご教授お願いいたします。

●メッセージ
Process "Configure Device (iMPACT)" completed successfully
// *** BATCH CMD : setMode -bs
// *** BATCH CMD : setMode -bs
GUI --- Auto connect to cable...
// *** BATCH CMD : setCable -port auto
AutoDetecting cable. Please wait.
PROGRESS_START - Starting Operation.
Connecting to cable (Parallel Port - LPT1).
Checking cable driver.
Driver windrvr6.sys version = 8.1.1.0. WinDriver v8.11 Jungo (c)
1997 - 2006 Build Date: Oct 16 2006 X86 32bit SYS 12:35:07, version = 811.
LPT base address = 0378h.
ECP base address = 0778h.
Cable connection failed.
 (LPT2)(LPT3)(LPT4)もほぼ同様
Connecting to cable (Usb Port - USB21).
Checking cable driver.
Driver version: 1027 (1027).
Driver windrvr6.sys version = 8.1.1.0. WinDriver v8.11 Jungo (c)
1997 - 2006 Build Date: Oct 16 2006 X86 32bit SYS 12:35:07, version = 811.
Cable connection failed.
PROGRESS_END - End Operation.
Elapsed time = 5 sec.
Cable autodetection failed.
WARNING:iMPACT:923 - Can not find cable, check cable setup !

Posted by: おき : January 23, 2011 12:10 AM

>おきさん
コメントありがとうございます。JTAGケーブルの自動認識(Cable Auto Connect)を試みておられるのだと思いますが、それではうまくいきません。手動(Cable Setup)で接続を試みてください。

Posted by: fenrir : January 23, 2011 10:01 AM

>手動(Cable Setup)で接続
iMPACTの基本的操作を再確認のうえ(要Initialize Chainですね。)やり直したところ、無事接続・ダウンロードができました。

初歩的な質問、しかもいMPACTの話で申し訳ありませんでしたが、迅速かつ適切に教えていただき誠にありがとうございました。

Posted by: おき : January 23, 2011 01:32 PM
コメントする









名前、アドレスを登録しますか?
(次回以降コメント入力が楽になります)
  • 匿名でのコメントは受け付けておりません。
  • 名前(ハンドル名可)とメールアドレスは必ず入力してください。
  • メールアドレスを表示されたくないときはURLも必ず記入してください。
  • コメント欄でHTMLタグは使用できません。
  • コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
  • コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。