USB接続型フラッシュメモリーライター |
この機械の作成目的としては大きく2つあります。まず一つ目が、USBというインターフェイスの理解と、実際のシステム(ハードウェア、およびファームウェア、WindowsのWDMタイプのデバイスドライバ)の試作によるノウハウの取得。もう一つが、今後の開発でROMプログラマとして使えるものを作ろう、というのがあります。
1.設計仕様
書き込みターゲットとしてはNOR型のフラッシュメモリ(AMD系のライトシーケンス互換)です。対応デバイスは4Mビット〜32Mビット単一電源書き込み動作、3.3V/5.0Vデバイス対応、バス幅8ビット、および16ビットのものとしますが、書き込みはすべて8ビットで行うものとします。また、対象デバイスの電圧切り替えはダイナミックに行わず、システム全体の電圧を直接切り替えることにしました(^^;<回路規模が大きくなるので。途中まで回路は考えたのですが・・・。まぁ、頻繁に切り替えるわけでもありませんしね。
2.使用したLSI
今回使用した主要部分のLSIは以下の通り。USBコントローラが入手難なのですが、ちょっとした関係でもらってしまいました(^^;
●USBコントローラ 沖電気 MSM60851B(Bバージョンは虫ありらしいのでなるべくCにしましょう(^^;
このコントローラはマイコンとの接続が大変簡単なUSBコントローラです。なんかMSJにもこれを使ったボードが紹介されているみたいですね(^^; で、主な特徴は以下の通り。
今回は書き込み電圧を直接全体のシステムを切り替えているため、I/O電圧の幅が広いところは都合がよいです。DMAに対応はしていますが、今回はAT90S4414というハーバードアーキテクチュアの8ビットRISC CPUを使用するため、ちょっとDMAを使うにはいろいろと面倒なのと、入れてもその際に必要なバスの調停動作などによりあまり性能が上がりそうにないので止めました(^^;
あと、このコントローラは実際には沖電気としてはバスパワーで使うことが推奨されていない(保証されていない)という話を聞いているので、注意したほうがよいかもしれません。自分が使っている分には特に問題はおきてませんが(^^;
●コントロールCPU ATMEL AT90S4414−8PC
3.ハードウェア構成と作成
回路図についてはこれをみてください。構成としては比較的簡単です。AT90S4414(以下AVRと略します)はSRAMモードで動作でさせるためPA0〜PA7はアドレスA0〜A7とDB0〜DB7のマルチプレクスですので、USBコントローラとは直結し、USBコントローラのADSEL端子をHにプルアップしておき、そのCSはA15(PC7)を使い反転をかけていれます(A8〜15はアクセス中の全ステートできちんと反映されます)。
フラッシュROMにアクセスするには、このままではアドレス線が少なすぎますので、74HC374をアドレスラッチに使用します。ラッチ用のクロックはAVRのALEを使い、選択はアドレスA9,A10,A11を使います。こうすることで、一度に複数のラッチに同一データをラッチできますので、フラッシュメモリにコマンドを発行するのが簡単になります(フラッシュメモリは アドレス AAAA データ55、アドレス5555データAAなどというコマンドパターンとなっている)。
あとはデバッグようにLCDを付けています。これは一般的な日立のHD44780というLCDCを使ったLCDモジュールを付けています。実際に作成するときにはコネクタのVccとVssの位置が逆だったり、全体の接続が逆というのもありますので、そこは注意してください。
種類 | メーカー | 型番 |
---|---|---|
USBコントローラ | 沖電気 | MSM60851 |
CPU | ATMEL | AT90S4414 |
CMOS汎用 | 各社 | 74HC374 |
CMOS汎用 | 各社 | 74HC04 |
CMOS汎用 | 各社 | 74HC125 |
CMOS汎用 | 各社 | 74HC32 |
CMOS汎用 | 各社 | 74HC541 |
CMOS汎用 | 各社 | 74HC00 |
CMOS汎用 | 各社 | 4066 |
レギュレータ(3.3V・150mA) | TOREX | XC62AP3302 |
トランジスタ | ローム | DTC124 |
トランジスタ | ローム | DTA114 |
トランジスタ | 東芝 | 2SA1015-Y |
ダイオード | 東芝 | 1S1588 |
ツェナーダイオード | NEC | NNCD5.6LG |
セラミック発振子 | ムラタ | CSTCW4800CW |
セラミック発振子 | ムラタ | CST6.14MT |
4.ソフトウェアの設計
今回作成するのは3つあって、1つがATMEL側のファームウェアです。これで、パソコンから指令された処理を実行します。基本的には以下のようになります。エンドポイントとはUSBでは転送経路の名称にあたり、今回の機器では以下のように使用するように定義しました。
コントロール転送 : エンドポイント0 = コマンド発行、および現在処理中のもののステータス取得
バルク転送: エンドポイント1 = 書き込みデータの転送(PC→マイコン)
エンドポイント2 = 読み込みデータの転送(マイコン→PC)
USBではコントロール転送は、セットアップ−データ−ステータスの3つのステートに分かれており、少ないデータの送受信を行うことができます。これにより一般的にはターゲットとなる機器の制御を行うことになります。バルク転送は、データをひたすら送受信するものです。バルク転送では、送受信は半二重ですので、きちんと設定をセットアップする際にPC側とすりあわせする必要があります。このような設定の他に、実際に機器がどの程度の電流を使うかなどをPCに知らせるものがあり、これをデバイスデスクリプタといいます。
コントロール転送よりデバイスデスクリプタの要求があると、機器側では自分のデスクリプタを返します。このときにデスクリプタにはベンダIDとプロダクトIDを入れます。このIDにより、どの機器が接続されたかをPC側が認識し、そのIDでデバイスドライバの組み込みを実行します。もし、すでにドライバがあればそれをロードし、なければインストールを要求することになります。右の写真は、はじめてデバイスを差したときに出るものです。一回ドライバをインストールすれば、このようなメッセージを出すことなしに静かにドライバがenableされます。
デバイスデスクリプタを送信すると、次にPC側はその機器のアドレス(SCSIでいうSCSI-IDに当たるもの)を設定し、PC側はコンフィグレーションデスクリプタを要求します。ここで各エンドポイントの送信方向、受信方向、使用・不使用を設定します。これを設定すればセットアップ完了です。あとは、指定されたコマンドを機器側が実行するだけです。
さて、詳細は実際のマイコンのファームウェアを読んでいただくとして、次は機器を動かす為のWDMドライバです。WDMドライバを作るには、MicrosoftからWin98DDKをダウンロードする必要がありますので、まずはそれを行って下さい(あと、コンパイルにVC++が必要です)。
しかし、これを1から作るのは結構しんどいのです。が、幸いなことにWin98DDKの中に豊富なサンプルがあり、今回作るようなものはそのサンプルをちょっと変更するだけで作ることができます(EULAライセンスに従えば、流用は特に問題ありません)。変更部分としては、IOCTLリクエストを解釈する部分と、作成するデバイスドライバのGUIDの値です。GUIDはGENGUID.EXEで作ってincludeファイルを書き直すだけです(^^; これはサンプルを読めばすぐにわかるでしょう。なお、このプログラムで参考にしたのはBULKUSBというものです。これはDelphi側でも参考にしていますので、これと照らし合わせてみて下さい。一応WDMのドライバのソースコードは自分が理解するためにコメントをすべて日本語に翻訳していますので、その点でも役にたつと思います。
最後に実際に書き込みを行うソフトです。こちらはDelphiで書きました。ただし、DelphiにはUSBの制御に必要なAPI定義がまるごと抜けてしまっているため(SetuDi*系のもの)全部定義しなおします(^^; 実際に機器を制御するには製作し組み込んだデバイスドライバに対してDeviceIOControl APIを使用し、IOCTLで制御します。データのフラッシュメモリへの書き込み、読み込みには、CreateFileでパイプを作り、ReadFile,WriteFileを使ってデータの転送を行います。
プログラムアーカイブ(ファームウェア、デバイスドライバ、Delphi用ソースコードセット)
5.実際の能力
実際の書き込み能力です。基本的には純粋な書き込み時間を考えると300Kバイト/秒程度の能力があるようです(右写真:書き込み中の写真)
これでチップイレースすると+1分30秒ぐらいかかるので、、消すよりも書き込みの方が遙かに早いことがわかります。実は会社に富士通謹製のパラレル接続のライターがあるのですが、これが死ぬほど遅くて、1時間とかそういうレベルになってしまうのです(^^;それと比べると遙かによいかなと思います。あと、大きいのが電源。電源レスなのは大きいです。USBバスパワードですので、USBケーブルをつなげるだけで使えるのはよいですね。
上: 書き込みプログラムのウィンドウ
6.製作を終えて。
また、ATMELのフラッシュメモリに対応していないので、完全にできてはいないのですが作った感想としては、USBはそう難しいものではないということでしょうか。特に今回使用したMSM60851では特にそうで、ほとんどのUSBの面倒なプロトコルは考慮しなくてもよいので(無論、基本的な部分は実装しなきゃいけませんが)自作で作るにも楽なものです。ただ、ある程度Windowsアプリケーションも書けなければいけないので、そっち方面の知識も持っていることは前提となりますが(^^; しかしながら、この石は個人で手に入れるのが難しいものですので、秋月などで扱ってくれるとUSBも身近になるんじゃないかとは思います。