<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)を解説します。
- #include <windows.h>
- #include <stdio.h>
- #include "cusb.h"
- #include "fx2fw.h"
- #include "fx2fw_prog.h"
- HANDLE dev_handle;
- int main( int argc, char *argv[] ){
- u8 cmd[512];
- s32 i,j;
- if(cusb_init(-1,&dev_handle,fw_bin,"F2FW","V100")){
- printf("Can't found EZ-USB.\n");
- exit(-1);
- }
- i=0;
- cmd[i++]=CMD_MODE; //PIO
- cmd[i++]=MODE_PIO;
- cmd[i++]=CMD_OEB; //PORTB is output
- cmd[i++]=0xff;
- cmd[i++]=CMD_OEA; //PORTA is input
- cmd[i++]=0x00;
- usb_bulk_write(&dev_handle,CPIPE,cmd,i);
- for(j=0;j<0xff;j++){
- i=0;
- cmd[i++]=CMD_OUTB;
- cmd[i++]=j;
- cmd[i++]=CMD_INA;
- usb_bulk_write(&dev_handle,CPIPE,cmd,i);
- usb_bulk_read(&dev_handle,RFIFO,cmd,1);
- printf("PORTA=%x\n",cmd[0]);
- }
- }
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のプロジェクトファイルです)