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というのは下の図のアプリです。
それならば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に書き込みたいという方はぜひ使ってみてください。
https://github.com/tokuden/FX2Writer
特電のボードだけではなく、FX2LP汎用に作っているので、FX2を使うどのようなシステムにも書き込みできるはずです。
最近のコメント