Sazanami Online

カメレオンUSB ファームウェア開発

[その1] [その2] [その3] [その4] Index に戻る
ファームウェアについて
カメレオンUSBに搭載されているUSBチップAN2135SCは、8051互換のCPUでRAMが内蔵されています。数年前に携帯電話接続アダプタを汎用USBに改造するのが一時流行しましたが、それらの姉妹品です。
カメレオンUSBでは12MHzのオシレータが付けられており、ほとんどの命令は1/4クロックで動作するので、1命令3MHzとPICマイコンより遅いくらいです。
まだよくわからないので、汎用ファームウェアを改造しながら進めてゆきます〜
CプログラムなのでCPUを深く理解していなくてもなんとかなりそうです。
SFR(スペシャル・ファンクション・レジスタ)やUSB関係の拡張レジスタを直接操作するのでデータシートが必要です。


いきなりわからない!
まずは、頻繁に登場する19Bitアドレスのポート出力を簡略化しようと、ファームのコマンド部分を見るとこんなコードが書いてありました。

        case GPFW_WRITE:
            OUTC=OUT1BUF[i++] & 0x0f;
            AUTOPTRL=0x40+i;
            AUTOPTRH=0x7e;
            t=AUTODATA;
	break;

いきなりわかりません(滝汗

USBのパイプ1で受信するバッファOUT1BUFのアドレスが0x7E40で、これをオートポインタの上位バイトと下位にセットしているらしい、直値で指定されていたので下のように書き直しました。

        case GPFW_WRITE:
            OUTC=OUT1BUF[i++] & 0x0f;
            AUTOPTRH = (u8)((u16)&OUT1BUF[i] >> 8);
            AUTOPTRL = ((u16)&OUT1BUF[i] & 0xff);
            t=AUTODATA;
	break;

最後のAUTODATAから値を読み出している部分には意味が無くて、RQ,WQ線をトリガにしてCPLDがデータバスを読み取り動作するようです。このあたりはCPLD編に入ってからもっと詳しくお勉強したいと思います。
ファームだけの改造では、連続して同じポートに出力する事はまず無いので、折角のオートポインタが活用できなくて非常に残念な感じです。使えるとすればFLASH-ROMの CE,OE,WE の制御線だけを連続して切り替えるとかそのへんだけですね〜

MULTIPLE CALL TO SEGMENT?
ポート出力の方法が判ったので、LCDに1文字出力してストローブをON-OFFするコマンドを追加しました。ストローブ操作は配列で準備しておいてオートポインタで連続出力です。なんだかまどろっこしいです。もっといい方法があるかも知れません。
LCD出力後に少し空ループで時間を稼いでこれを関数化し、16進表示などどんどん追加していったのですが、割り込み処理とTD_pollで同じ関数を呼ぶと(L15)MULTIPLE CALL TO SEGMENTの警告が、要するにスレッドセーフな感じになってないということですね。
同じ動作の関数を2つ用意すれば解決しましたけど、なんか宣言で解決できるのかも

コンパイルの限界
バッファサイズやアドレスをLCDに表示する関数とか量産していると、ついに来ちゃいました。。。
開発環境 Keil はお試し版なので、いろいろやっているとすぐに4kの限界が来てコンパイル放棄されます(涙)
本格的にやるなら、LinuxでSDCCの環境整えたほうがいいのかも...
ここからは不要部分を削りながら非常にストレスの溜まる作業になってしまいました。

バルク転送で高速化
少しわかってきたので、ブロック読み取りコマンドを実装してみました。
コマンドとROMアドレスを送信するとアドレスをイクリメントしながら16kByteの連続データを返すコマンドです。
コマンドパケットでアドレスを指定していたのに比べて、格段にスピードアップです。なんと2MBitの読み取り67秒が3.8秒になりました!!
よく考えると 67kB/s(526kb/s)しか出ていませんがファームだけだとこんなもんですね。

やっとFLASHに書けた!
最初にぼんやりと考えていた方法でなんとか1MのFLASHに書き込みを行う事ができました。

以下のロジックで行いました。
1.USBの受信バッファ(エンドポイント)は64バイトで、これがフローすると割り込みが発生
2.割り込み処理で、自前で用意したFLASH書き込み用のデータバッファ256Byteにこれを転送
3.データバッファが一杯になると書き込みスタートフラグを立てる
4.TD_poll(IDOL処理)で1ページ分をゆっくり書き込み
5.書き込み完了したら、スタートフラグをクリア
6.スタートフラグの状態を返すコマンドを追加、書き込み動作中がPCから判る

実はまだDQ7〜5の判定をしていないので実装しないと不安なのですが、1Mbit-Flashに書き込んで一旦電源OFFにして読み出してバイナリ一致したのは確認しました;^_^


SDCC+CygwinとSDCCwin32版をインストールしてみる
Keilお試し版ではもう無理(物理的にも精神的にも)なので、SDCCの開発環境に移行すべくとりあえずインストールだけやってみました。

以下、メモです。雑なのです

cygwin.comでsetupをDownloadして起動、cygwin1.dllのバージョンは1.5.12
非常に雑にALLをInstallすると99%あたりで必ずコケます。
Defultだとすぐに完了。でもbashが使えるだけでgccがインストールされないので、しかたなく1つずつ選択しました。
とりあえず最低限必要と思うパッケージは more,less,tcsh,vim,unzip,zip,gcc,gdb,gdbm これを選択してDownload後にインストール
次にSDCCからsdcc-src-20041212.tar.gzをダウンロードして解凍
	$ gzip -dc sdcc-src-20041212.tar.gz | tar xvf - 
	$ cd sdcc
	$ ./configer
configerでlex無いと言われて停止
flexをインストールして通過

	$ make	
makeでエラー yacc not found
bisonをインストールして通過

	$ make install
/usr/local/bin に sdcc.exe がインストールされました!!

SDCCにはWin32版もあるので、こっちもインストールしてみました。
Win32版はコンパイル速度がどんどん遅くなって動作が変になったと書いてあるページを見つけました、随分バージョンも上がっているし今はそんな事は無いのかも知れません、トラ技2003/7月号のコードはWin32版のような気がしますが、cygwinでもコンパイル通ったしなんとも言えないです〜
とにかくコンパイルすると .ihx を吐き出す。
これをCypressの\USB\Bin\hex2bix.exeでbixファイルにするのが吉のようです。

オリジナルのbixファイルと、Win32版でコンパイルしたもの、cygwin版でコンパイルしたもの全部違うんだけど。。

なんとなくコンパイルできていそうなだけで、まだ実行できるのかも確認してません〜

つづきやがる ですぅ
↑PageTop

E-mail : saza00@mail.goo.ne.jp [その1] [その2] [その3] [その4] Index に戻る