Sim's blog

電子工作はじめてみました

広告

※このエリアは、60日間投稿が無い場合に表示されます。記事を投稿すると、表示されなくなります。

Altera DE0のJTAG通信?

2009-11-01 19:17:06 | FPGA
Altera DE0で使えそうなLCDを探してみましたの続きになります。

Altera DE0がきましたのコメントでnsxさんから、USBを使ってPCアプリと通信できるんでしょうか、というコメントを頂きました。付属CD-ROMにある回路図を見てJTAGしかつながってないから駄目っぽいという返事をしました。でもでも、よく考えてみると付属アプリであるDE0_ControlPanelを使ってPC側からLEDを点けたりVGAの出力を変えるというデモがあります。

これがDE0_ControlPanelの画面です。チェックボタンでLEDを点けたり消すことができます。


DE0_ControlPanelが動作している最中にXPのデバイスマネージャを見てもCOMとかはいません。Altera USB-Blasterがいるだけです。

DE0_ControlPanel.exeのいるフォルダには他に3つのdllがいます。
- TERASIC_DOWNLOAD.dll
- TERASIC_JTAG.dll
- TERASIC_JTAG_DRIVE.dll
このdllが怪しげです。JTAGの通信にまぎれて、アプリ間通信をするような機能がいるような雰囲気です。dumpbin.exeを使って中身を調べてみました。

TERASIC_DOWNLOAD.dllがexportしているAPIです。
    ordinal hint RVA      name
          2    0 00006108 @@Download@Finalize
          1    1 000060F0 @@Download@Initialize
         15    2 000063E4 @@Ftdicontrol@Finalize
         14    3 000063D4 @@Ftdicontrol@Initialize
         10    4 00006350 TERASIC_AsDownload
          3    5 00006120 TERASIC_DownloadEEPROMByByteBlaster
          7    6 00006284 TERASIC_DownloadNios2
          9    7 000062F4 TERASIC_FlashProgrammer
         12    8 000063BC TERASIC_GetQuatusVersion
         11    9 000063A8 TERASIC_IsUsbBlasterDriverReady
          5    A 000061CC TERASIC_JtagDownload
          4    B 00006174 TERASIC_JtagDownloadByteBlaster
          6    C 0000622C TERASIC_JtagDownloadChain
          8    D 000062DC TERASIC_Nios2Terminal
         13    E 000063C4 TERASIC_SetQuartusProgrammerPath
         16    F 0006A0F8 ___CPPdebugHook

いかにもダウンロード用といった感じのAPIが並んでいます。

TERASIC_JTAG.dllがexportしているAPIです。
    ordinal hint RVA      name
          2    0 000018B0 @@Jtagport@Finalize
          1    1 000018A0 @@Jtagport@Initialize
          4    2 00001938 TERASIC_JtagClose
          7    3 000019F0 TERASIC_JtagGetInfo
          3    4 000018C0 TERASIC_JtagOpen
          6    5 000019B8 TERASIC_JtagRead
          5    6 00001980 TERASIC_JtagWrite
          8    7 0000A0F8 ___CPPdebugHook

ReadとかWriteがあって、いかにも通信用って感じです。

TERASIC_JTAG_DRIVE.dllがexportしているAPIです。
    ordinal hint RVA      name
          1    0 00001E94 jtag_atlantic_clearstall
          2    1 00001B9C jtag_atlantic_get_offset
          3    2 00001B70 jtag_atlantic_init
          4    3 00001DEE jtag_atlantic_read
          5    4 00001D56 jtag_atlantic_status
          6    5 00001E39 jtag_atlantic_transfer
          7    6 00001DA3 jtag_atlantic_write
          8    7 00002889 jtag_avalon_address
          9    8 00002773 jtag_avalon_get_offset
         10    9 00002745 jtag_avalon_init
         11    A 000028AC jtag_avalon_mode
         12    B 00002912 jtag_avalon_read
         13    C 0000282A jtag_avalon_status
         14    D 000028CF jtag_avalon_write
         15    E 0000192A jtag_close
         16    F 00001963 jtag_command
         17   10 00001000 jtag_init
         18   11 00002671 jtag_pio_init
         19   12 000026FF jtag_pio_read_outputs
         20   13 00002678 jtag_pio_status
         21   14 00002722 jtag_pio_write_inputs

avalonとかatlanticって何なんでしょう?

デバッガを使ってDE0_ControlPanel.exeを追いかけてみるとTERASIC_JTAG.dllが通信用でした。Openは2つのパラメータ、ReadとWriteは3つのパラメータ、Closeは1つのパラメータを使っています。送っているデータを覗いてみると、次のような形式になっていました。

先頭の1バイト 0xaa 固定
2バイト目 コマンド (LED関連は0x02、VGA関連は0x0d等)
3バイト目 送信するデータのバイト数をnとすると n - 6
4バイト目 0x00 固定 (用途不明)
5バイト目から 送信データ
...
n-1バイト目 チェックサム (2バイト目からn-2バイト目までの総和 mod 256)
nバイト目 0x55固定

LED点灯コマンドのときは5バイト目がLED7~LED0、6バイト目がLED9,LED8の点灯パターンを送っています。全部点灯するときは5バイト目が0xff、6バイト目が0x03になります。全点灯するときに送信するデータです。
aa 02 02 00 ff 03 06 55
初期化のときに送っているデータです。
aa 00 00 00 55
VGAのパターンを選択するときに送っているデータです。
aa 0d 01 00 00 0e 55
受信するデータも同じ形式です。内部処理では最初に先頭の4バイトを読み込みます。続きの長さが分かるので、続きを読むという感じで2回に分けて可変長のデータを受信しています。

ソースとかドキュメントといった情報が全然見つかっていないので、無理矢理リバースエンジニアリングしてしまいました。JTAGラインを使ってデータを送受信していることくらいまでは分かりましたが、そこから先はさっぱりです。そもそもFPGA側にどんな回路を作ればいいのかも分かりません。Terasicが情報を公開しないかぎりは、これ以上は難しそうです。


なんてことを↑で書きましたが、NIOS IIとかAvaronでぐぐってみると、Avaron BUSとかJTAG UARTみたいなキーになりそうな言葉がひっかかってきます。自分で使うときはTERASIC_JTAG_DRIVE.DLLを直接叩くのかもしれません。

コメント (6)   この記事についてブログを書く
« トランジスタティーセット2巻 | トップ | Cyclone IV »
最近の画像もっと見る

6 コメント

コメント日が  古い順  |   新しい順
Unknown (marsee)
2009-11-02 04:37:47
そういえば、SOPC BuilderでJTAG UARTを組み込むと、NIOS2プロセッサとUSB Blasterだけでやり取りができました。
http://marsee101.blog19.fc2.com/blog-entry-1205.html
Unknown (nsx)
2009-11-02 11:04:37
新スレッドまで展開して頂きまして情報ありがとうございます。
デバッガまで使いこなしますか、Simさんもスキルの奥が深いですね。
推測ですが、つまりは、FPGAの中を見る機能でALTERAならシグナルタップがありますが、そのリソースを利用しているのだと思います。
この会社はベンダー系なのでしょう。ALTERAのロゴ使っているし。
ライブラリを公開していないのは、その機能はベンダー独占のものだからだと思います。
従って、その添付アプリに限って利用できますが、自作用に使用できないのだと思います。
Simさんのように解析して使うことは可能でしょうが、正規に公開されて無いものは大変でしょうね。でもそのかんじだと解析も完成しそうですか。
marseeさん紹介NiosⅡボードは、同様な構造になっているらしく関数が公開されていてビルド環境もあるようですね。

JTAG方式は、信号線数が少ないし、方式も確立しているので、作りやすかったため採用されたのではないでしょうか。
JTAG通信はスループットが遅いのが難点です。良くて数百Kbyte/Sでしょう(たぶん)。
自作アプリではJTAGライブラリを使えたとしてもここがネックになると思います。
re:Unknown (Sim)
2009-11-02 22:25:46
こんにちは、marseeさん
情報ありがとうございます。明日は休みなのでまとめサイトをまとめて勉強させていただきますm(_ _)m
re:Unknown (Sim)
2009-11-02 22:30:31
こんにちは、nsxさん
JTAGだけで、これだけ色々できるようにしてるのはすごいです。Quartus Handbookの5巻に色々載っているみたいです。
http://www.altera.co.jp/literature/lit-qts.jsp
今度は逆に情報が多すぎて、オーバーフロー気味です。せっかく始めたので、通信できるくらいまではやってみたいです。

Unknown (とおるすがり)
2009-11-19 09:45:01
http://www.fpga.co.jp/cbbs/cbbs.cgi?mode=al2&namber=5929&rev=&no=0

+0:0xaa ヘッダ
+1:デバイスID HUBに接続されているデバイスのID(00はHUB?)
+3:転送長 送信データの長さn
+4:00 ?(デバイスへのコマンド)
+5~n:データ デバイスに送られるデータn
+6+n:チェックサム
+7+n:0x55 フッター

>aa 00 00 00 55
HUBが入っているか確認用かな

デバッガ使ってWindows側から調べることもできるのですね。
参考になりました。
re:Unknown (Sim)
2009-11-20 23:18:51
とおるすがりさん
色々情報をありがとうございます。
このあたりは奥が深そうですね。

コメントを投稿

FPGA」カテゴリの最新記事