XILINXのPlatform USBを自分のプログラムからコントロールする
XILINXのPlatform USBはいろいろなところに既にあるし、XILINXの純正評価ボードにも最初から組み込まれています。
これを自分のプログラムから自由にコントロールできたら素晴らしいことです。その方法を探ってきました。
やり方は3つ思いつきます。
- USBプロトコルアナライザで解析し、汎用USBドライバ(libusb)でアクセスする
- XILINXのデバイスドライバを呼び出す方法を探る
- リモート接続を使う
まず、1の方法ですが、この方法だと、INFファイルを新たに作って、PlatformUSBケーブルがつながれたときにXILINXのドライバではなく、libusbが読み込まれるようにしなければなりません。これはユーザの環境を変えてしまうのでNGとします。
2の方法ですが、XILINXのPlatform USB CableはWinDriver6というドライバを使っています。CreateFileとDeviceIoControlとWriteFile、ReadFileで頑張ればできなくはないかもしれません。ですが、不確実性やライセンスの面で懸念が残ります。
そのため、ここでは3の方法を探ってみることにしました。
XILINXのiMPACTは、実は、TCP/IPを持ちいてリモート接続することができます。ISEの環境が設定されたコマンドプロンプトからcse_server.exeを起動すると、ポート50001で待ち受けが始まります。
ここで、iMPACTを起動して、CableのSetupでRemoteを選ぶとTCP/IPで通信が行われ、他のマシンにあるPlatform USBケーブルに接続できるというわけです。
ここで、重要なことがあります。ISE10かISE11の頃に、cse_serverの仕様が変わりました。古いcse_serverはテキストベースで端子の上げ下げを通知していたのですが、新しいcse_serverはバイナリデータ化され、プロトコルは複雑なものに変わりました。
新旧のcse_serverでプロトコルは全く異なります。
Interface誌の2010年で紹介されているcse_serverの記事は古いプロトコルのものなので、まったく役に立ちません。だから、改めて解析しなおす必要があるのです。
そこで、cse_serverを使っているときのTCP/IPのパケットをダンプして、解析しました。
その結果、わかってきたことは、
- ファイルの転送やデバイスプログラミングなど、かなり高レベルなコマンドを与えて、リモート操作している
- 一応、低レベル(TMSやTDIの上げ下げ、SCANの実行)な操作もできる
- 要するに、コマンド体系はJTAGのそれではなく、iMPACTのものである
ということです。
とりあえず、自分で作ったプログラムからSCAN DRコマンドを発行して、Artix-7のIDCODEを読み出すことまではできました。
上の画面に出ている13631093というのが、XC7A100TのIDCODEです。
一応、接続や、初期化、TMSやTDIなどの低レベル操作、SCANの実行まではやり方がわかってきました。もう、自由にJTAGの波形は作り出せます。
まだよくわかっていないのが、TAPの操作方法です。TAPを任意のステートに動かしたり、SCAN_DRやSCAN_IRの終了後にどこに動かすか、という方法が解明できていないでいます。
まぁ、でもあと1週間もあればMITOUJTAGからPlatform USBを操作できるようになっていると思います。
| 固定リンク





コメント