汎用ファームウエア(以下FW)を使用すればカメレオンUSBを簡単に使いこなすことが出来ます。汎用FWはバルク転送のみをサポートします。アイソクロナス転送はサポートしません。(CypressのサンプルFW
bulktestをベースにしています。)
汎用FWはAN2135SC+CPLD(XC95144)の組み合わせににおいて、十分なパフォーマンス(1Mbyte/Sec程度)を発揮することが出来ますので、ほとんどの場合アプリケーション製作者が自分でFWを開発しなくても済むはずです。また、新たにFWを開発する場合でも汎用FWをベースにすれば楽に開発が出来るはずです。(ロジックアナライザで使用しているFWは、汎用ファームウエアを少し修正したものです)
EZ-USBでは、高速にUSBデータの転送を行うためにいろいろな工夫がされています。高速にデータを転送するためには、EZ-USBの外部回路から、いかに効率よくデータを取得してEZ-USBのエンドポイントバッファに格納するかが重要です。汎用FWで使用している高速化の手法を紹介します。
・オートポインター
EZ-USBのCPUは組み込み用に使用される、シンプルなCPUです。CPUの機能として、データ転送と同時にポインタのインクリメントなどはサポートされていません。そこでEZ-USBではオートポインターというレジスタが用意されています。使い方はまず、アドレス(AUTOPTRL,AUTPTRH)をセットして、データレジスタ(AUTODATA)をアクセスします。これでデータの読み出し(書き込み)と同時にポインタのインクリメントが行われます。
・高速転送(Fast Transfers)
この仕組みはEZ-USB内部のエンドポイントバッファからEZ-USBの外部回路に高速にデータを転送する仕組みです。EZ-USBのデータバスを使用しますのでEZ-USBファミリの中でもデータバスを持つもの(AN2131QC,AN2135SCなど)で使用できます。EZ-USBに内蔵されるCPU(8051)はメモリーにあるデータの転送にDPTRを使用します。通常ですと、外部回路からエンドポイントまでデータを転送しようとすると
1、DPTRに外部回路のポートアドレスをセット
2、DPTRを介して外部回路のデータをAレジスタに読み込む
3、DPTRにエンドポイントのバッファアドレスを格納
4、AレジスタからDPTRを介してデータを書き込む
5、次回の書き込みに備えてエンドポインタのバッファアドレスをインクリメント
このようにかなりの命令数とクロック数を要してしまいます。
バルク転送の場合高速転送の仕組みは、上記のオートポインターと組み合わせて使用されます。予めオートポインタにエンドポイントのバッファアドレスを格納しておきます。そしてDPTRレジスタにオートポインタのデータレジスタ(AUTODATA)をセットしておきます。
この状態でDPTRを介してエンドポインタに書き込み動作(movx @dptr,a)を行うと、自動的にEZ-USBのデータバスからFRD信号をストローブ信号にしてデータを読み込み、エンドポインタに書き込みます。同時にオートポインタのインクリメントも行われます。
DPTRを介してエンドポインタに読み込み動作(movx a,@dptr)を行うと、EZ-USBのデータバスからFWR信号をストローブ信号にしてデータを書き込みます。
この機能を使用することによりかなりの高速化が図れます。(詳しくはEZ-USBテクニカルリファレンスマニュアルの8.6章に記述されています。)
・エンドポイントのダブルバッファリング
エンドポイントをダブルバッファとして使用することにより、USB転送中に別のバッファにCPUがデータをセットすることが出来ます。
汎用FWではEP2INとEP3IN、EP2OUTとEP3OUTをダブルバッファリングして使用しています。
回路図のページでも述べていますが、カメレオンUSBではユーザが自由に使えるEZ-USBのI/Oは4本です。(18本のうちデータバス8本、FRD,FWR 2本、CPLDプログラム4本)
汎用FWは、この4本のI/Oの制御と、CPLDと接続されるデータバスを介したデータのやり取りをコントロールするのが主な役割となります。
汎用FWでは全てのコントロールを3本のパイプに対するバルク転送で行っています。
パイプ番号 | ヘッダ定義 | 方向 | 内容 |
0 | GPFW_CPIPE | PC->Target | コマンド列をFWに与える(64byte以下) |
1 | GPFW_WPIPE | PC->Target | PCからターゲットへのデータ用 |
8 | GPFW_RPIPE | PC<-Target | ターゲットからPCへのデータ用 |
コマンド形式は、8bitのうちの上位4bitがコマンド識別用で、下位4bitはパラメータです。パラメータはEZ-USBの4本のI/Oポートに対するものが多いです。コマンドによって全体の長さ(バイト数)が変化します。複数のコマンドを一度の転送(最大64byte)で送ることが出来ますが、バーストコマンドを含む場合は、後続のコマンドは使用できません。
コマンド | ヘッダ定義 | 長さ | コマンドの内容 |
0x00+bbbb | GPFW_DIR | 1 | 4本のポートの入出・出力を設定する。bbbbの各ビットが0:入力、1:出力になる。 |
0x10+bbbb | GPFW_SET | 1 | ポートに値(bbbb)を書き込みます。入力ポートに設定されているポートは特に変化が起きません。 |
0x20 | GPFW_GET | 1 | ポートの値を読み込みます。読み込んだデータはパイプ8を使ってターゲットから読み出せます。 |
0x30+bbbb | GPFW_WRITE | 2 | ポートに値(bbbb)を書き込みます。その後後続の1byteをデータバスを使ってCPLDに書きます。 |
0x40+bbbb | GPFW_READ | 1 | ポートに値(bbbb)を書き込みます。その後CPLDからデータバスを使って値を読み込みます。読み込んだデータはパイプ8を使ってターゲットから読み出せます。 |
0x50+bbbb | GPFW_BWRITE | 4 | ポートに値(bbbb)を書き込みます。その後 (次の1byte & 0x3f)+((次の次の1byte)<<6)+ ((次の次の次の1byte)<<14)のデータをパイプ1から読み込み、データバスに書き出します。 |
0x60+bbbb | GPFW_BREAD | 4 | ポートに値(bbbb)を書き込みます。その後 (次の1byte & 0x3f)+((次の次の1byte)<<6)+ ((次の次の次の1byte)<<14)のデータをデータバスから読み出しパイプ8に書き出します。 |
0xf0+bbbb | GPFW_BUS | 2 | bbbbが0ならEZ-USB(8051)のstrechを000にセット、0以外なら001に設定。後続の1byteをEZ-USBのFASTXFRにセットします。(上位2bitはFWがコントロール) このコマンドはEZ-USBのデータバス(FRD,FWRを含む)の動作を変更させます。 |
汎用FWの使用例には、汎用IOの解説の中で登場しますのでそちらを参考にして下さい。
ダウンロード
gpfw.h(汎用FW用定義ヘッダファイル)
gpfw.c(汎用FWバイナリイメージ)
gpfw.lzh(KEIL用プロジェクト+ソースファイル) 汎用FWをコンパイルする場合に必要
WinUSB関連