ソフト面から見たカメレオンUSBの仕組みについてまず説明します。
EZ-USB(AN2135SC)というチップはROMを内蔵していません。プログラムをダウンロード出来るSRAMを内蔵しているだけです。
通常はEZ-USBにEEPROM(24LC64など)を接続して、電源の立ち上げと同時にこのプログラムをEZ-USBに読み込ませ、このROMに内蔵されるベンダーIDとプロダクトIDを使用して動作します。WindowsはこのベンダIDとプロダクトIDに一致するデバイスドライバを探し出し(見つからなければインストール要求の画面を出します)使用します。
カメレオンUSBではEEPROMを実装していません。この場合EZ-USBはCypressのベンダーIDとEZ-USBのプロダクトIDをWindowsに返します(この間CPUは完全に止まったままです)。WindowsはCypressのEZ-USB用のドライバを使用します。このドライバはCypressのHPからダウンロードして、インストールしたソフトウエアに含まれるものです。
この状態でUSBを経由してEZ-USBのCPUにプログラムを転送することが出来、更に新しいベンダIDとプロダクトIDでEZ-USBをPCに再認識させることが出来ます。この機能がEZ-USB最大の売りで、他のUSB内蔵マイコンでは出来ません。
カメレオンUSBでは、カメレオンUSBのアプリケーションが使用したいプログラム(ファームウエアと呼びます)を、EZ-USBにダウンロードして実行させます。しかしプロダクトIDとベンダIDは引き続き同じ物(Cypress)を使用します。このため、新しいアプリケーション用のデバイスドライバを開発したり、PCにインストールする手間が省けます。
つまり、カメレオンUSBをPCから見ると、常にCypressのドライバを使用しているデバイスであり、Cypressのデバイスドライバを使いこなすことが出来れば全て事足りることになります。
カメレオンUSBライブラリはCypressのデバイスドライバを、カメレオンUSB用に使いやすくするだけのインターフェイスライブラリです。
個々のカメレオンUSB用アプリケーション開発者が、直接Cypressのデバイスドライバをコントロールしないで済むようにしており、ファームウエアのダウンロードなどを間単に行うことが出来ます。カメレオンUSBライブラリは非常に簡単で、初期化・終了関数とバルク転送の関数のみを理解して頂ければ十分です。
(現在カメレオンUSBライブラリはアイソクロナス転送をサポートしておりませんので、アイソクロナス転送を行う場合は直接Cypressのデバイスドライバをコントロールする必要があります。もちろんカメレオンUSBライブラリとの共存も出来ます。)
それではカメレオンUSBライブラリを使用したプログラムを見ていきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#include <windows.h> #include "cusb.h" extern u8 fw_bin[]; HANDLE dh; int main(int argc, char *argv[]){ u8 buf[10]; if(cusb_init(0,&dh,fw_bin,"XXFW","V001")){ printf("Can't open Chameleon USB.\n"); exit(-1); } usb_bulk_write(&dh,0,(u8 *)"send test",10); usb_bulk_read(&dh,7,buf,10); usb_close(&dh); } |
2行目はカメレオンUSBライブラリの定義ファイルをインクルードしています。cusb.hでは関数のプロトタイプ宣言や、タイプの宣言を行っています。
4行目はファームウエアの外部宣言です。ファームウエアは4Kバイトのバイナリイメージです。ファームウエアの作成に関しては別のドキュメントで詳しく説明しています。
5行目はカメレオンUSBが使用するハンドルの宣言です。
9行目がカメレオンUSBの初期化関数です。現在ロードされているファームウエアの持つストリング情報をXXFWとV001で比較して、異なる場合はファームウエアのダウンロードが行われます。
10行目からは初期化に失敗した場合の処理で、カメレオンUSBが接続されていないことが考えられます。
13行目はバルク転送書き込みで、PCからデバイスにパイプ番号0を使って10バイト転送します。
14行目はバルク転送読み込みで、デバイスからPCにパイ部番号7を使って10バイト転送します。
どうですか?非常に簡単でしょう?たったこれだけでPCとUSBデバイスが通信できます。
より詳しい情報はこれ以降の関数リファレンスと、ヘッダファイルを参照してください。
パイプ番号とエンドポイントの対応はEZ-USBのファームウエアで記述されます。
カメレオンUSBで使用しているファームウエアは、Cypressの開発キットに付属している、bulktestをベースに開発しており、
下記の表のようになっています。
パイプ番号 | エンドポイント |
0 | Ep1out |
1 | Ep2out |
2 | Ep3out |
3 | Ep4out |
4 | Ep5out |
5 | Ep6out |
6 | Ep7out |
7 | Ep1in |
8 | Ep2in |
9 | Ep3in |
10 | Ep4in |
11 | Ep5in |
12 | Ep6in |
13 | Ep7in |
s32 cusb_init(s32 n,HANDLE *h,u8 *fw,s8 *str1,s8 *str2)
引数 | 内容 |
s32 n | デバイス番号 1台目のEZ-USBが0 2台目のEZ-USBが1 |
HANDLE *h | ハンドル 初期化したデバイスのハンドルが返される。 |
u8 *fw | ファームウエアへのポインタ |
s8 str1 | ファームウエアの名前文字列 |
s8 str2 | ファームウエアのバージョン文字列 |
戻り値:
正常終了(0)、エラー時(-1)
処理内容:
指定したデバイス番号のカメレオンUSBを初期化する。現在EZ-USBにロードされているファームウエアの名前文字列とバージョン文字列をstr1とstr2でそれぞれ比較し、異なればfwで与えられる新しいファームウエア(4Kbyte(0x1000))をロードする。ファームウエアのロードを行う場合は処理時間に数秒を要する。
s32 usb_close(HANDLE *h)
引数 | 内容 |
HANDLE *h | オープンしたハンドルへのポインタ |
戻り値:
正常終了(0)、エラー時(-1)
処理内容:
初期化時にオープンしたハンドルをクローズする。
s32 usb_bulk_read(HANDLE *h,s32 pipe,u8 *buf,s32 len)
引数 | 内容 |
HANDLE *h | オープンしたハンドルへのポインタ |
s32 pipe | 使用するパイプ番号 |
u8 *buf | 読み込むバッファ |
s32 len | 読み込む長さ |
戻り値:
正常終了(0)、エラー時(-1)
処理内容:
指定したデバイス、パイプを使用してターゲットからPCへデータを読み込む。
s32 usb_bulk_write(HANDLE *h,s32 pipe,u8 *buf,s32 len)
引数 | 内容 |
HANDLE *h | オープンしたハンドルへのポインタ |
s32 pipe | 使用するパイプ番号 |
u8 *buf | 書き込むバッファ |
s32 len | 書き込む長さ |
戻り値:
正常終了(0)、エラー時(-1)
処理内容:
指定したデバイス、パイプを使用してPCからターゲットにデータを書き込む。
組み込み用ファームウエアの作成について
EZ-USBで使用するファームウエアは、CypressのEZ-USB開発キットに付属するkeil-Cコンパイラを使用します。
このコンパイラは統合環境になっており、内蔵の8051エミュレータを使ってデバッグも出来ます。
このコンパイラでビルドすると.hexと.bixというファイルが作成されます。
.hexはCypressのコントロールパネルを使ってカメレオンUSBにダウンロードすることが可能です。
.bixファイルはバイナリイメージです。
FWのデバッグ中は、直接プログラムから.bixを読み込んで、cusb_init()関数に渡します。
デバッグが完了したら、C言語のデータ形式にコンバートしてアプリに組みます。
私は.bixファイルをbin2c.exe(Cypressのツールにも似たようなのがあった気もするが)でコンバートして、4Kバイト分を切り出し組み込んで使用しています。
(bin2c.exeの使い方は、DOS窓で"bin2c bulktest.bix > fw.c"のように使用します。)
ダウンロード
Down Load cusb.c
Down Load cusb.h