« S6A7JTAGWツールを更新しました | トップページ | XILINXのIP Catalogの割り算器を使ってみた »

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を使うどのようなシステムにも書き込みできるはずです。

 

|

« S6A7JTAGWツールを更新しました | トップページ | XILINXのIP Catalogの割り算器を使ってみた »

コメント

コメントを書く



(ウェブ上には掲載しません)




« S6A7JTAGWツールを更新しました | トップページ | XILINXのIP Catalogの割り算器を使ってみた »