« 2020年12月 | トップページ | 2021年2月 »

2021.01.30

EZ-USB FX2LPのブランクなEEPROMにWindows10 x64から書き込む方法

特電では様々な製品でEZ-USB FX2(LP)デバイスを使ってきました。EZ-USB FX2は外付けのEEPROMにファームウェアを書き込んで動作させるのですが、Windows 10の環境になってから難しくなってきたという事情があります。

その前にまず、昔はどうだったのかということから説明します。

EZ-USB FX2は、確か2000年ごろに登場しました。詳しい経緯はわかりませんがデバイスドライバにANCHORという名前が頻繁に登場していたので、アンカー社というところの製品かIPを買収して開発したのだと思います。

当時のデバイスドライバはezusb.sysという名前でした。ezusb.sysはソースコードが公開されていて、CreateFileで\\.\Ez-USB0のようなデバイスを開くことで、デバイスドライバをオープンすることができていました。EEPROMがMissningな状態でのファームウェアにダウンロードするにはベンダリクエストを発行するという状況でした。

その後、CypressはCYUSBというデバイスドライバを開発しました。CYUSBはよくできたクラスライブラリです。

ちなみに、FX2LPのLPはローパワーのことで、従前のFX2はめっちゃ熱いデバイスでした。ヒートシンクが必要なくらい熱かった記憶があります。

世の中的にはEZ-USB FX2のドライバとして、ezusb.sysとCyUSBの2つが併存していたのですが、ezusb.sysはCypressからもメンテナンスされず忘れ去られていきます。それにezusb.sysはもともと64bitに対応していなかったので、世の中のWindowsが64bit化するのにともない完全に忘れ去られていきました。

問題は書き込みツールをどうするかです。

ezusb.sysが動いている場合、

status = DeviceIoControl ( cypress_handle,IOCTL_Ezusb_ANCHOR_DOWNLOAD,
buffer, lastaddr, NULL, 0, &bytes, NULL);

でファームウェアが書き込めたのですが、64bitのWindows環境ではezusb.sysは基本的に動きません。(無理やり移植したのはある)

それどころか、Cypressから提供されているNO EEPROM FX2用のドライバは、デフォルトでcyusbが入るようになっていますので、この方法はもう使えません。おそらく、「ブランクのEEPROMに書き込むなら、EZ-USB FX2LP開発キットに含まれているCyControl.exeを使え」という立場なのだと思います。CyControlというのは下の図のアプリです。

Cycontrol

それならばcyusbにはEEPROMに書き込むための関数があるんじゃないか、と思うかもしれませんが、そのものずばりはなかなか見つかりません。その関数は隠されているのです。

 

もう少し詳しく説明すると、CyUSBには、C#から呼び出す用のCyUSBとC++から呼び出す用の2種類のライブラリがあります。

前者は

C:\Cypress\USB\CY3684_EZ-USB_FX2LP_DVK\1.1\Windows Applications\library\c_sharp\lib\CyUSB.dll

で、後者は

C:\Cypress\USB\CY3684_EZ-USB_FX2LP_DVK\1.1\Windows Applications\library\cpp\lib\x64\CyAPI.lib

です。なんと、C++用のCyAPI.libにはLoadEEPROM関数がないのです!
だから慣れないけどC#で書かないといけません。

試行錯誤の末、FX2のファームウェアに書き込むための最小限のコードは以下の通りであることがわかりました。

using CyUSB;
・・・
puclic bool WriteFirmware(string Filename) {
byte DeviceMask = CyConst.DEVICES_CYUSB; // CYUSBタイプのデバイスを見つける
USBDeviceList usbDevices = new USBDeviceList(DeviceMask); // デバイスを探してリストを作る
USBDevice dev = usbDevices[0]; // 最初のデバイスを選択
if((dev.VendorID == 0x4b4) && (dev.ProductID == 0x8613)) { // VID PIDチェック
CyFX2Device fx2 = dev as CyFX2Device; // 見つけたデバイスをFX2として扱う
return fx2.LoadEEPROM(Filename); // 指定されたファイル名のファームウェアを書き込む
}
return false;
}

これでFX2のEEPROMにファームウェアを転送できます。なお、fx2型にしないとLoadEEPROMという関数にアクセスできません。

このようにして作ったWindows10対応のシンプルなFX2書き込みプログラムをgithubにアップロードしましたので、ブランクなEEPROMに書き込みたいという方はぜひ使ってみてください。

Fx2writer

https://github.com/tokuden/FX2Writer

特電のボードだけではなく、FX2LP汎用に作っているので、FX2を使うどのようなシステムにも書き込みできるはずです。

 

| | コメント (0)

2021.01.29

S6A7JTAGWツールを更新しました

特電のSpartan-6/7ボードや、Artix-7ボードにオンボードのUSB-JTAGで書き込むためのツール「S6A7JTAGW」を更新しました。

下記のURLからダウンロードできます。

https://www.tokudenkairo.co.jp/sp7/s6a7jtagw230.exe

S6a7jtagw

今回の更新では、FPGAのコンフィグROMをSpansionのS25FL128Lに対応させました。

Write_spansion

その経緯としては、今まで特電の製品はWinbondのROMを実装して出荷していたのですが、VivadoがWinbondに対応していないのでVivadoから書き込みができないという問題が起きました。そこでROMをSpansionのS25FLに変えてみたのですが、そうしたら今度はS6A7JTAGWから書き換えができなくなってしまったのです。

そういうわけで、当ツールをS25FLに対応させたというわけです。

 

| | コメント (0)

2021.01.13

XILINXのAXI Video Outの解説(2)

それでは、各IPの設定を見ていきましょう。

 

まずはVDMAから。Basicタブの設定は以下のとおりです。Write Channelをオフにして、Read Channelをオンにします。

Vidout4

  • Frame Buffers・・・これを増やすとDDR3 SDRAMの読み出すアドレスを変えて、ページ切り替えができる
  • Memory Map Data Width・・・AXIインタフェースのデータ幅(MIGへ行くAXI ICへのデータ幅)
  • Read Burst Size・・・AXI読み出しバーストサイズ。増やすとメモリ転送の効率が良くなる。(おすすめは256)
  • Stream Data Width・・・出力するAXI Streamのデータバス幅。メモリが速くてもここが細いとunderflowの原因となる。(おすすめは32)
  • Line Buffer Depth・・・読み出したデータを一時的にためておくFIFOのサイズ。

Advancedタブを開くと主にタイミング同期に関するオプションがありますが、標準的な使い方をする限りでは変更の必要はありません。

Vidout5

 

AXI VDMAにはGUIで設定する項目だけではなく、AXI Liteを通じた内部レジスタの設定もたくさんあります。それを行うのがvdma_settingsで、これは自分で作るコアです。

Vidout6

以下のように、フレームバッファのアドレスやHの幅、ストライド(水平ラインが1増えると、アドレスがどれだけ増えるか)、Vの高さを設定します。

Vidout7

 

次はAXI Subset Converterです。

32bitを24bitに切り捨てるため、一部の設定をマニュアルで設定します。

Vidout8

  

AXI Video Outは以下のように設定します。基本的にほぼデフォルトのままでいいはずです。

Vidout9

 

Video Timing Controllerの設定も、Enable Detectionを有効にしてデフォルトでいけます。

Vidout10

定数は1080pのデフォルトでOKです。

Vidout11

3ページ目のFrame Sync Positionもデフォルトです。

Vidout12

 

最後はRGB2DVIですが、HDMIのクロックの速度に応じて選択するところや、ボード上のTMDS信号のP/N反転に合わせてチェックボックスをオンオフします。ここの設定はコアの中でMMCMの倍率を変えることに関わってきます。

Vidout11_20210304082901

このようにすることで、Video Outを作ることができます。

| | コメント (0)

2021.01.12

XILINXのAXI Video Outの解説(1)

XILINXのFPGAでHDMI出力をするためのIPコアにAXI Video Outなどの一群があります。これらのコアを使うとDDR3 SDRAMに格納されたビットマップ画像をHDMIから出力できるのですが、その動作は気絶するほど難解です。

今回はこれらの使い方を解説したいと思います。

まず、HDMI出力回路の全体構成図を示します。

Vidout1_20210304062901

使っているIPは、

  • AXI Video Direct Memory Access(XILINX)
  • AXI-4 Stream Subset Converter(XILINX)
  • AXI4-Steram to Video Out(XILINX)
  • Video Timing Controller(XLINX)
  • RGB2DVI(Digilent)

です。

これらのコアによってHDMI出力がなされるのですが、順番に役割をみていきましょう。

まず、AXI Video Direct Memory Access(VDMA)が、フルAXIなメモリマップのリードトランザクションを発生させます。AXIの先はInterconnectを通じてMIGにつながっており、DDR3メモリにつながっています。DDR3から読み出されたデータがVDMAによってAXI Streamとなり、Subset Converterに送られます。

Subset Converterというのは32bitのデータの上位8bitを切り捨てて24bitにするものです。メモリは32bit単位ですがRGBデータは24bitなのでどこかでつじつまを合わせなければなりません。

なお、XILINX Video Outの場合、データの並びはRGBではなくRBG、すなわち

  • 23:16 RED
  • 15:8 BLUE
  • 7:0 GREEN

です。

24bitになったAXI StreamはAXIS to Video Outに送られタイミングを整形されたのちRGBデータとして出力されます。 AXI Streamのデータはtreadyが上がったり下がったりしたバースト的なデータですが、Video Outを通すと滑らかな等間隔のデータとして整形され、ブランキング期間が付与されます。

Vidout3

RGB2DVIはTMDSのエンコードをして出力するものです。DVI/HDMIでは8b/10b変換みたいなことをしているのですが、詳しくは見ていませんがその変換コードはPCI ExperssやSATAのものとは違うような気がします。処理はかなり複雑なのでDigilentのRGB2DVIコアを使うのがベストです。

Timing Controllerは、文字通り水平・垂直のタイミングを作り出すものです。

 

一連の画像データの流れはVDMAによるAXIリードで始まりますが、そのタイミングはどのようにして決まるのでしょうか?

答えは、AXI Video Outの出力にあるAXI StreamのTREADYによって、VDMAがデータ送出先に空きがあることを知って開始されます。

Subset Converterはデータを通すだけなのでタイミング的にはなにもしていません。Video Outの中身は単なるAXI Streamの非同期FIFOで、Video Timng Controllerが決めたタイミングに従ってFIFOからデータを読み出すのですが、間に合わないとoverflow、FIFOがEMPTYだとunderflowを出します。

下の図はドキュメント pg044 に描かれているAXI Video Outの中身です。

Vidout2

このとおり、ただのFIFOです。

 

全体のタイミングを決めているのはあくまでもVideo Timing Controllerです。v_tcのタイミングがVideo Outの中にある非同期FIFOのReadタイミングとなり、AXI StreamのTREADYを通じてバックプレッシャーがかかって、最終的にVDMAがv_tcのタイミングに合わせてMemory Readを発行するようになるという仕組みです。

ここがややこしいところであります。v_tcで走っているタイミングにDDR3メモリのリードを同期させているメカニズムがバックプレッシャーなのです。

 

回路を作っていて画像が出ない場合はunderflowのフラグを見てみてください。

もし、VDMAが間に合わないとVideo Outの中のFIFOがEMPTYになってunderflowを起こしますが、これは比較的よく起こります。

DDR3メモリはもちろんHDMI 1080pの速度よりもずっと高速なのですが、何も考えずに作るとVDMAの出力であるAXI Streamは32bitになるので、クロック周波数が100MHzとか150MHzだと、HDMIのクロック(148MHz)でデータを出すのが間に合わなくなってunderflowを起こすことになります。

もし、underflowを起こしているようならばVDMAの動作周波数を200MHzくらいにするのが最も簡単で確実な解決方法ですが、消費電力を増やしたくないなどの理由でクロックを上げたくない場合はVDMAのStreamのデータ幅を64bitにして1クロックで2ピクセル送るようにするのがよいでしょう。その場合、データはAXIS Subset Converterは使えなくなるので「- R1 B1 G1 - R2 B2 G2」という64bitデータを「R2B2G2 R1B1G1」という48bitにカットする回路を自分で作ることになります。

(続く)

 

| | コメント (0)

2021.01.07

Cosmo-K DVIの修理成功

Kintex-7のHDMI入出力ボード「Cosmo-K DVI」で2018年のロットのうち4台で不具合が出ていました。原因を究明した結果、BGAのレジストがすこしずれているため実装時にショートしたのではないかと考えていましたが、この予想が正解だったようです。

信頼できる実装屋さんに頼んでBGAのFPGAを新品に貼り替えてもらいました。

Cskdvirepaired

USB FX3とDDR3メモリの両方がショートしていたボードで、Kintex-7を新品に貼り替えたところ、見事にUSB3-AXI-DDR3のサンプルが動くようになりました。メモリに乱数を読んで書いてというテストを行っていますが、まったく問題なく読み書きできました。

Cskddrtest

MITOUJTAGのオープンショートテスト機能で見ても、ショートは解消されていました。

Mjshorttest

明日、会社に行ったらHDMIの入出力テストをしてみようと思いますが、おそらく大丈夫でしょう。

 

実は、今回のFPGAを新品に貼り替える前に、基板が原因だからFPGAは問題ないと思い、外したFPGAをリボールしてもらったのですが、リボールした際にFPGA内部がショートしてしまいました。リボールという作業はなかなかは難しいのかもしれません。コストはかかってしまいますがFPGAの再実装は新品に換えたほうがいいのでしょう。

 

| | コメント (0)

Cosmo-Z MiniのDACから任意波形の出力

Cosmo-Z MiniのDACから任意波形の出力する機能の開発を行っています。

Cosmozminiandosc

Cosmo-Z Miniには2chの125MHz 14bit DACがついていますが、いままでは正弦波やパルスなどの単純な波形しか出せませんでした。

そこで、FPGAの中にあるBlock RAMに入れたデータを波形として出力する機能を作りました。

Bd

とりあえずBRAMは64kByte確保しているので、16384ステップ内の波形であればどんな波形でも出せます。

下の図は適当につくった波形です。綺麗に出ています。

Cosmozminifg

いまは繰り返し波形をだすようになっていますが、本格的に実用的にするには、

  • 外部トリガでの駆動(しかもディレイもつけて)
  • 外部トリガを駆動
  • 任意回数の繰り返し
  • N倍にしたりオフセットを加えたり

など、いろいろとパラメータで設定できなければならないことが多いなと感じます。

 

| | コメント (0)

2021.01.01

あけましておめでとうございます

あけましておめでとうございます。

2018年に本郷の事務所を撤退してから2年間、技術的宿題をコツコツと片づけていました。昨年には、DACからきれいな波形を出す方法や、2入力2出力DVIのボードなどいくつかの大きな問題を片づけることができました。

2021年には、1Gbpsの高速ADCの安定動作など、残してきた課題をすべて解決し、新製品をいくつか出したいと思っています。

  • Spartan-7ボードのサンプルデザインを作成し、量産開始
  • Cosmo-K DVIの量産開始
  • Cosmo-ZのFPGAデザインの大幅な更新と、ユーザフレンドリなUIの開発
  • Trenz商品紹介サイトの高度化
  • HyperFADCのサンプルデザインの開発と販売開始

ここまでのことを3月までに片づけて、その上で、これからの会社の方向性をあらためて考えなおしたいと思っています。

 

| | コメント (0)

« 2020年12月 | トップページ | 2021年2月 »