2003.5.29 jtag_xfer()追加
2003.4.17 新規

JTAGドライバDLL仕様

概要

 JTAGアクセス部分のみをWindowsのDLLで構築したもので、SPC_ISPとUSB対応版PLAYXSVFから使用されます。
 SPC_ISPはUSBによるSpartanIIのコンフィグレーションが目的でしたが、他のインターフェースが使えるに越したことはありません。
 事実SPC_ISP開発時は、Xilinxの標準仕様であるParallelCableIII互換ドライバと併用使用することで、効率的にデバッグをすすめました。

 JTAGアクセス部のDLL化により、単独プログラムにくらべてファイルの扱いが面倒になり、ソースリストの汎用性を欠きます。
 しかし、インターフェースの追加や変更に伴ない、すべてのアプリケーションを再構築する必要がありません。
 DLLドライバーさえ書いてしまえば、すべての対応アプリケーションで、独自のJTAGインターフェースを使用することができます。

 インターフェースの切り口には、まだまだ不備がありますが、たった5つの関数でJTAGアクセスにおける最低限の機能を持っています。

ドライバー関数仕様

DWORD jtag_version(void)
関数名 ドライバーバージョン取得
引数 なし
戻り値 上位16bit = メジャーバージョン,BCD4桁
下位16bit = リリースコード,BCD4桁
備考なし

int jtag_init(DWORD port_address,DWORD baudrate,char *probe_name)
関数名 JTAGプローブ初期化
引数 port_address = ポート番号(ドライバー依存)
baudrate = ボーレート(ドライバー依存)
probe_name = プローブ名称を格納するポインタ
戻り値 ステータス
0:成功
0以外:失敗
備考probe_nameにドライバー名を設定する。

int DLLAPI jtag_power(void)
関数名 ターゲット電源チェック
引数なし
戻り値 ステータス
0:ON
0以外:OFF又は異常
備考probe_nameにドライバー名を設定する。

※新方式、動作確認が整い次第こちらに切り替わります。
int jtag_xfer(const BYTE *ibuf,BYTE *obuf,DWORD drsize,int tms_s,int tms_e)
関数名 JTAG送受信
引数
ibuf NULLの時、TDIへの送信データは任意
NULL以外の時、TDIから送信するデータのポインタ
送信データは、MSBファーストで送信される。
obuf NULLの時、TDOからの受信処理不要
NULL以外の時、TDOから受信したデータを格納するポインタ
受信データは、MSBファーストで格納される。
drsize 総送信ビット数
tms_s 最終ビット以外のTMS信号レベル,0=LOW,1=HIGH
tms_e 最終ビット送信時のTMS信号レベル,0=LOW,1=HIGH
戻り値 ステータス
0:OK
0以外:エラー
備考SPCISP Ver1.14以降でサポート

※旧方式、いづれ新方式に切り替わります。
int jtag_txrx(const BYTE *ibuf,BYTE *obuf,DWORD drsize,int tms_s,int tms_e)
関数名 JTAG送受信
引数
ibuf NULLの時、TDIへの送信データは任意
NULL以外の時、TDIから送信するデータのポインタ
送信データは、MSBファーストで送信される。
obuf NULLの時、TDOからの受信処理不要
NULL以外の時、TDOから受信したデータを格納するポインタ
受信データは、LSBファーストで格納される。
drsize 総送信ビット数
tms_s 最終ビット以外のTMS信号レベル,0=LOW,1=HIGH
tms_e 最終ビット送信時のTMS信号レベル,0=LOW,1=HIGH
戻り値 ステータス
0:OK
0以外:エラー
備考送信データと、受信データではビット配置が逆になっている。

void jtag_end(void)
関数名 終了
引数なし
戻り値なし
備考 インターフェースのリソース解放などを行う。
jtag_init()を呼び出して成功した時は、プログラム終了前に必ず呼び出す。

JTAGプローブになれそうな方たち

シリアルポート-JTAG
 制御線をレベル変換して直結しても制御可能ですが、速度的に辛いです。
 プロトコルを決め、マイコンで受けるのが汎用的で無難です。
 USB-シリアル変換アダプター経由という手もあります。

Ethernet-JTAGインターフェース
 50Mも引っ張り回したいならEthernetでしょう。
 私も所有していますがPICNICあたりが適当かと。

USB-JTAG その2
 FTDI社のFT232BM/FT245BMのBitBangも、チップ単体で機能しそうな気配です。

問題点

・旧方式では送信データと受信データでは、ビット配置が逆になっている。
 意図はありません。試行錯誤して動いたらこうなってしまいました。
・RESETやターゲット電源制御など、付加ピンの制御ができない。
 RESET等の信号が必要なら、tms_s,tms_eのビット割り当てに追加可能
・TMSピンをスタティックに変更できない。
 JTAGにおいては不要ですが、他のSPIインターフェースとして使用する場合に困ることがあるかもしれません。
・クロックレートや絶対時間管理がない
 今の所は、最高2Mbpsなので問題はないと思いますが、クロックレートについては、いづれ追加する必要があるでしょう。