ナヒテックさんから NP1003C (完成品、 50MHz 版) を買った。 動機顛末についてはそのうち。いまのところそういう段階でない。
最初から FPGA OS が載っており、USB ケーブルで繋ぐと linux 側から USB serial として認識 (kernel module としては ftdi_sio が使われる) し、minicom などで入ることができる。
バスパワーで動くので先日作ったばっかの電源にお世話になることもなく、FPGA 部分の動作確認は一瞬で終わった。 SDRAM のテストはまだだけど、そのまえに JTAG からの読みだし/書き込みテストである。 アクセスコード書かないことには SDRAM に手が届かん。
naxjp 0.7.9 を拾ってきて make.
ちなみに gcc 3.2 では make が素直に通らなかった。ヤマほどひっかかったのでとりあえず 2.95 を使った。
3.2 で動かすとかいった作業はともかく JTAG からの書き込みテストが無事すんでから。
ともあれ、ケーブルは自前で作らざるをえない(すくなくとも NP1003 側コネクタは)。 いちばん簡単なのはナヒテックさん家に載ってる ケーブル。 文字通り直結。
naxjp を拾って来て make, 動かすとこうなる:
# ./naxjp -port ports.txt -getid XC2S100 NAXJP Ver 0.7.9 beta for Linux (C)Copyright 2003 Nahitafu Device Chain 0. Command 'getid'. Device 'XC2S100'. File 'XC2S100' Device error:Device 1 TDO value is not equal, expected:01, actual:03 Device error:JTAG device is not connected correctly. Please check cable connection and power supply. Note:Terminating procedure by occuring errors... (bypass-first) Sorry, ISPEXIT routine has not completed yet.-port 指定でピン入れ換えてあるが、ケーブルのピン配列を XILINX の ISP404 のやつ準拠にして iMPACT からでも使えるようにするため ... だが実はそのまんまのケーブルでも iMPACT から使えるのか? ピン配列見比べるとぜんぶ違うんだけど。
DEBUG_LEVEL=2 として make しなおし (READMEJ.txt にあるように make naxjpd1 しても debug option 付きのは作成されない。 念のため)、ポートの動きを眺めると、 TCK のかわりに TDI が上がったり下がったりしている。なんだ簡単なハナシじゃん、と思ったのだが単に debug コードが XILINX のケーブルを仮定しているだけだった。ま、そんなにうまい話はないわな ...。prnprt.cpp の該当個所:
//Byte output for Linux
void outp(unsigned short addr,unsigned char data){
#if (DEBUG_LEVEL==2)
bool tdi,tck,tms;
tdi = data & 0x01;
tck = data & 0x02;
tms = data & 0x04;
printm(".write port (%04X<=%02X) TDI=%d TCK=%d TMS=%d (In the case of a XILINX genuin cable)\n",addr,data,
tdi,tck,tms);
fflush(stdout);
#endif /* DEBUG_LEVEL == 2 */
TDI, TCK, TMS がプリンタポートの D0, D1, D2 にアサインされていることを仮定していて、-port の指定を反映してない。
本題にもどる。デバッグオプションを付けると多少メッセージが変化する。 メッセージはけっこうな量になるが、要所はおそらく次の 2 行:
'A' って '1010' やね ...。クロストークかなんかで読み出すたびに TDO のビットが上がったり下がったりしてるだけの様子が目に浮かぶ。 それとも JTAG のステートマシンがヘンなとこに入り込んでしまってるか。Error:Device 1 TDO value is not equal, expected:00614093, actual:0AAAAAAB Device error:JTAG device ID is incorrect.
port read のタイミングで読んだ値が安定するまで待つとか、 あるいは書き込みから十分長い時間 (1ms くらい) 待つなどとしても結果は変わらなかった。 てことは TCK のヒゲかなんか?
また、何度やっても同じ結果なので外来ノイズということはない。
とりあえず直結ケーブルのプリンタ側を切って 100ohm を挟む。結果は変わらず。
ただ、このケーブルは各信号線が GND と撚ってある ── か少なくとも互い違いになっていることを想定してるようなので、 GND を各信号線に抱かせてみた。 具体的には
Error:Device 1 TDO value is not equal, expected:00614093, actual:09249249 Device error:JTAG device ID is incorrect.
分かったような分からんよーな変化だが、ともかく変化。
ここまでテストしたケーブルは何れも全長 20cm 内外である。それでたかが GND と撚ったくらいで結果が変わるというのが ... いったいどんな信号が流れてんだか。
やっぱオシロ調達すべきかねぇ。正規の JTAG ケーブルとかも。 オシロ調達がめんどーだから NP1003 完成品買ったんだけどな。
... なんだが結果はビタ一文かわんなかった。メモのみ。
「ノイズが気になるときにはTCKとGNDに100pFのコンデンサを入れると良い!」とある。このコンデンサ、プリンタポート端に入れるのか、JTAG ピン側に入れるのか ...。 いや、分かってて書いてる訳だが。
ためしに NP1003 ボードの JTAG ピンの TCK 〜 GND 間にコンデンサ入れたらデータがまるで読めなくなった。 プリンタポート端に入れたからといって元々からなにかが改善されるということはなかったのだけど、 みごとなもんである (どこがや)。
もちろん XILINX の本来のケーブルもプリンタポート側(つーか、バッファ端) にコンデンサが入ってる。
テストする時はカーネルモジュールの parport_pc ごと外してあるのでシステムが悪さしてる訳ではない。 とすると BIOS の設定 (確か ECP/EPP モードにしてあった) かね。このマシン、reboot する訳にはいかないので、 こちらではこれ以上テストできず。
なお、Thinkpad 240 のほうでは、uni-directional/bi-directonal, ECP, EPP と 4 つの BIOS 設定があるが、 このうち前 3 つでは結果は変わらなかった。EPP については未テスト (でも EPP にしたことによって動くようになる、とは思えないのでテストする気なし)。
なんかな〜 Thinkpad の printer port が簡易ケーブルに耐えられない、というオチがつきそうなのでどーにか調べたいんだがな。