<FX2FWとは?>

(注意:このページは古いCypressの開発キットの情報を元に作成されたものです。新しい開発キットに関するこちらの情報もご参照ください

EZ-USB FX2を使用したアプリケーションを開発するためには、PC(ホスト)アプリケーション、PCのデバイスドライバー、FX2のファームウエアの3つのプログラムを開発する必要があります。

PCのデバイスドライバーに関してはCypressが提供する開発用デバイスドライバを流用することで、独自のデバイスドライバを開発しなくても何とかなります。

問題はFX2のファームウエアです。FX2のファームウエアも一から全てを作る必要はありません。Cypressが提供するサンプルプログラムを修正することで、多くの場合は対応できるはずです。
とは言え、FX2のファームウエアを開発するためにはKEILやSDCCなどのCコンパイラを使用する必要があり、開発環境の習得などにもそれなりの時間が必要になります。これではお手軽にFX2のアプリケーションを開発することが出来ません。

そこで、ユーザ独自のファームウエアを開発しなくても、FX2の機能を引き出すことが出来る汎用的なファームウエアを開発しました。
それが「FX2FW」です。FX2FWはFX2のI/Oポート、GPIF、FIFOをPC側からコマンドを発行することでコントロールすることが出来ます。
データの高速転送が可能なGPIFのバーストモードもサポートしていますので、USB2.0のメリットを生かすことが出来ます。
GPIFで必要なウエーブデータもCypressの提供するGUIツールのGPIFデザイナーを使用することで簡単に作成することが出来ます。FX2FWはUSB2.0専用ではなくUSB1.0でも動作するよことが出来ます。

ファームウエアを転送や、コマンド・データの読み書きについてはカメレオンUSBライブラリを修正したものを使用します。

FX2FWのソース&HEX(KEIL用)はこちらからダウンロードしてください。

<FX2FWの使い方>

ファームウエアを転送や、コマンド・データの読み書きについてはカメレオンUSBライブラリを修正したものを使用します。

とりあえず最も簡単な例としてFX2のI/Oポートを操作するサンプルを例に説明します。

ファイル構成は以下のようになります。
cusb.h USB操作、型宣言ヘッダ
cusb.c USB操作プログラム
fx2fw.h FX2FWヘッダ
fx2fw_prog.h FX2FW転送ファーム
main.c メインプログラム

使用するパイプ
プログラム中での
名前
エンドポイント パイプ番号 用途
CPIPE OUT8 1 コマンド
パラメータ送信用
RFIFO IN6 2 結果受信用


メインプログラム(main.c)を解説します。
  1. #include <windows.h>
  2. #include <stdio.h>

  3. #include "cusb.h"
  4. #include "fx2fw.h"
  5. #include "fx2fw_prog.h"

  6. HANDLE dev_handle;

  7. int main( int argc, char *argv[] ){
  8.   u8 cmd[512];
  9.   s32 i,j;

  10.   if(cusb_init(-1,&dev_handle,fw_bin,"F2FW","V100")){
  11.     printf("Can't found EZ-USB.\n");
  12.     exit(-1);
  13.   }
  14.   i=0;
  15.   cmd[i++]=CMD_MODE; //PIO
  16.   cmd[i++]=MODE_PIO;
  17.   cmd[i++]=CMD_OEB; //PORTB is output
  18.   cmd[i++]=0xff;
  19.   cmd[i++]=CMD_OEA; //PORTA is input
  20.   cmd[i++]=0x00;
  21.   usb_bulk_write(&dev_handle,CPIPE,cmd,i);

  22.   for(j=0;j<0xff;j++){
  23.     i=0;
  24.     cmd[i++]=CMD_OUTB;
  25.     cmd[i++]=j;
  26.     cmd[i++]=CMD_INA;
        
  27.     usb_bulk_write(&dev_handle,CPIPE,cmd,i);
  28.     usb_bulk_read(&dev_handle,RFIFO,cmd,1);
  29.     printf("PORTA=%x\n",cmd[0]);
  30.   }
  31. }
3-4行目 FX2FWに必要なヘッダファイルのインクルードです。

5行目 FX2チップに転送するFWのインクルードで
u8 fw_bin[]={...};
が定義されています。
FWは10行目のcusb_init()関数でFX2チップに転送されます。

10行目 cusb_init()関数でFX2の初期化とFWの転送を行います。
第1引数は何番目に認識されているEZ-USBを使用するかを指定します。-1を指定することで未使用のEZ-USBを選択できます。
第2引数はUSB操作のために必要なハンドルを指定します。
第3引数はFX2に転送するFWのポインタ。
第4引数はFW識別用の文字列で"F2FW"を指定。
第5引数はF2FWのバージョン、第4引数とセットでFWが転送済みかを認識します。

15-16行目 FX2FWの動作モードを設定します。今回はPIOモードということで0を設定しますが、GPIFやFIFOモード、8/16bitの切り替えなどの設定が出来ます。詳しくはfx2fw.hを参照してください。

17-20行目 ポートAを全ビット入力、ポートBを全ビット出力に設定します。

21行目 コマンドをFX2に転送します。コマンド用のCPIPEを使用して、cmd配列をiバイト転送します。コマンドはエンドポイントの長さ(USB2.0で512Byte、USB1.1で64Byte)までまとめて発行することが可能です。

22-30行目 ポートBに0x00〜0xffを出力しつつ、ポートAを読み出しコンソールに表示するプログラムです。

26行目で指定したポートAからの入力データは、28行目のusb_bulk_read()関数によってRFIFOパイプから読み出されます。
読み出すバイト数は今回は1バイトですが、複数のコマンドを組み合わせて発行することで、複数のバイトを読み込む場合もあります。

どうでしょうか?
非常に簡単なプログラムでUSBのI/Oを制御することが出来ます。
面倒なファームウエアや、デバイスドライバなどを全く意識することなくFX2を使用できます。
今回の例は単純にI/Oの制御ですが、FX2FWはUSB2.0の高速転送を活用できるGPIFやFIFOなどもサポートしています。

今回のサンプルコードはこちらからダウンロードしてください。
(VC++6.0のプロジェクトファイルです)