2010/7追記:
このページの情報はずいぶん古くなってしまいました。新しいページ(2010年〜版)を書きかけです。
現在、個人で入手可能なUSBチップには以下のようなものがあるようです。
National Semiconductor USBN9602 |
ナショセミのホームページなどで購入可能。 |
Philips PDIUSBD11 |
Philipsのホームページなどで購入可能 |
今回はナショセミのUSBN9602を採用しました。ただし、これにはバグがいくつかあり、現在ではUSBN9603に置き換えられています。
2000/6現在、ナショセミでは海外発送しなくなってしまったようです。がーん!!。入手可能なチップで自作するというコンセプトだったのに、これではまずい!!希望者が集まればとりまとめて何とかどこかから入手してもいいかなーなんて思ってます(約束はしません)。欲しい方は連絡下さい。
2000/6/26追記:若松通商(秋葉原ラジオ会館4F)でUSBN9602(SOP28)を1個1,200円で販売しています。
7/4追記:秋月電子通商で1個600円で売っているそうです(竹澤さん情報ありがとうございます)。
USBチップがやってくれるのはUSBプロトコルの下層の方だけで、上層はマイコンなどで実装する必要があります。
今回はキーボードで使用しているマイコンとの互換性などを考えて、AtmelのAVRマイコンを使用しました。入手性・価格対性能比・アーキテクチャなどを考えても、良いマイコンだと思います。
特に注意することはなかったと思います。
USBチップ以外は秋葉原の秋月電子通商や千石で購入できると思います。USBN9602の発振回路のインダクタ470nHはラジオデパートで探して購入しました。
LCDは大昔に買ったLM16257(HD44780使用)を使っていますが、最近秋月で売っているSC1602も使えることを確認しています。ただし、電源ピンの位置が異なるので注意してください。それ以外のピンは同じで、インターフェース仕様も上位互換らしいのに、電源ピンのみ何とプラス・マイナスが逆です!!
アセンブラはAtmel純正(DOS版,avrasm.exe)を使用しました。
ただしXMiNTキーボード用のソースはToms氏のtavrasmを使って下さい(下の情報集参照)。
基本的にはナショナルセミコンダクターのサンプル(C言語)を元に、手作業でアセンブラに変換し、必要な場所を書き換えただけです。
本来なら、GUIDを設定して、上記デバイスドライバの名前を変更するべきでしょう(.infと.sysファイルはwindowsディレクトリにコピーされるので)。ただし、GUIDを作成するにはMicrosoft Visual C++に付属しているGUIDGEN.EXEが必要です。まあ、個人的な使用なら問題ないでしょう。
このバルク転送のサンプルは、同時に2つのパイプを使用できないなど、いろいろ制約・問題があると柏野氏のホームページでは書かれています。柏野氏の作成された汎用USBデバイスドライバを使用されると良いかもしれません(私はまだ試していません)。ソースファイルもダウンロードできるので、参考にされると良いと思います。
USB機器にはすべて、16ビットのベンダIDというメーカー毎にユニークな番号が割り振られており、デバイスドライバを検索したりするのに使用されます。
ベンダIDを取得するにはwww.usb.orgに2万円程度を支払う必要があるようなので、そこまではやっていません。
今回作った機器ではとりあえず0xFFFFを使用していますが、これは正しい方法ではなく、またIDが重なった場合には誤動作する可能性があります。
ベンダIDはさらに16ビットのプロダクトIDで細分化して使用することができるので、どこかにベンダIDを安く切り売りしてくれる所があるといいのですが。あるいは、希望者が集まれば、僕がとりまとめてもいいかなあと考えています。
まず、マウスやキーボードなどのHID(Human Interface Device)から始めることをおすすめします。理由は、WindowsにはHID用の汎用デバイスドライバがあらかじめWindowsに組み込まれており、自分で作ってデバッグする必要がないからです。
次に、ハードウェア・ファームウェアを作成して、壁にぶつかったらMicrosoftから無料でダウンロードできるHIDVIEW.EXE, USBCHECK.EXEなどを使用して手がかりを見つけることです。これらのツールはWindows側からみたUSB機器の動作(応答)を表示してくれます。
また、デバッグ用にUSB機器側の状態を表示する手段を用意するといいでしょう。僕の場合は16文字x2行のLCDを用意して、各種ステータスを表示するのに使用しました。ただし、RS-232Cを使ってPCにデバッグ情報を表示するのは役に立たないかもしれません。USBに比べて通信速度が非常に遅いので、USB側の処理がおろそかになって、別の問題が発生する可能性があります。
また、仮にオシロスコープを持っていたとしても、USB信号線の波形をみて解析することは非常に困難だと思います。USBの通信速度が12Mbpsと高速なのに対してパケット転送周期は1msecと長いので、両者を同時に観測することは難しいからです。
また、USB全体を理解しようとする場合、物理層から順に上に向かって、細かく追っていくのは得策ではありません。USB規格自体が非常に階層化されていて複雑で、上の方まで理解するまでに疲れ果ててしまいます(僕はそうでした)。また、下の方はUSBチップが受け持ってくれるため自分で製作するわけではないし、USBアナライザなしには解析することも困難です。トランザクションレベルから始めるのが近道だと思います。C言語で書かれたサンプルコード・USBチップの仕様書・USB仕様書などを見比べながら、どういうトランザクションを処理すればいいかというあたりから追っていくといいのではないでしょうか。
USB理解のためのポイントはControl Transfer(=Control SETUP Transaction)にあります。これはUSBが接続されたときにPCとの間でデバイスの仕様の問い合わせ・選択・イネーブルなどの処理を実行するものです。1つのTransferは複数のTransactionから構成されおり、複雑です。Control Transferによってデバイスが有効になると、あとはBulk, Isochronous, InterruptなどのTransactionを使用して実際にデータのやりとりができるようになります。
すでに様々な雑誌やホームページでUSBが取り上げられていますが、(プロでなくて)自作愛好者レベルが理解するための適当な解説というのはまだ無いような気がします。いつか、そのような解説記事を書くことができたらいいなあと考えています。
ナショナルセミコンダクター USBN9602関連 | 本ファームウェアはサンプルをベースに作成しました(C言語のサンプルコードをAVRのアセンブラに書き直しています)。USBのプロトコル層の動作を理解するためには、このコード(C言語の方)を隅々まで追っていくことをおすすめします。 仕様書はもちろん、Errata(誤記訂正)も必須です。発振回路のインダクタの値に誤記があって、はまりました。 |
USB関連 | ・USB1.1Spec ・Device Class Definition for HID 1.1 ・HID Usage Tables 1.1 などを参考にしました。ただし非常に難解なため、これを読んでゼロからファームウェアを起こすことはほとんど不可能だと思われます。ナショセミのサンプルコードを読んでいく際に、この仕様書の内容と照らし合わせる程度でOKだと思います。 診断ツールのHIDVIEWとUSBCHECKは作成したUSB機器を解析・デバッグするのに非常に役に立ちました。必須と言えるでしょう。DDKにも含まれていますが、最新版はこちら。Windows98SEでないと動作しません。 |
ATMEL AT90S8515関連 | ・ハードウェア仕様書 ・Instruction Set ・ATMEL純正アセンブラ などを参考にしました。 |
インターフェース誌 2000年3月号 | 柏野氏の汎用USBドライバは良いかもしれません(まだ試していません)。ソースコードもCQ出版社や柏野氏のホームーページからダウンロード可能です。 |
トランジスタ技術 2000年6月号 | 特集:作るオリジナルUSBアダプタ この特集は製作記事が多く、非常に役に立ちました。ソースコードはCQ出版社からダウンロード可能です。 |
Window98 DDK | USBデバイスドライバを作成するには必須です。 |
ChaN氏のAVRライタ | これがあったからAVRマイコンを使うことができました。感謝。トランジスタ技術???年?月号・?月号に関連記事が掲載されています。 |
高村氏 | キーボード本体に関する部分はここを参考にしました(というか一緒に作業をしました)。 |
Toms氏のAVRアセンブラ | XMiNTキーボード用のソースをアセンブルするにはここのtavrasmを使って下さい。基本的にはAtmelのものと同じ仕様ですが、マクロや定数の仕様が拡張されています。 |
USB Organization | USB規格の元締め。規格書はここからダウンロードできます。会議室でのやりとりも盛んです。 |
Philips | サンプルコードをちょっと参考にしました。 |
Cypress | サンプルコードをちょっと参考にしました(でも改訂中でダウンロードできないものが多いのは何とかして欲しい。2000/6現在。) |
Jan Axelson | HIDのサンプルをちょっと参考にしました。 |
USB Designer Links | USBチップ情報満載。 |
もろぼし☆らむさん | 沖電気MSM60851BとATMEL AT90S4414を使用したフラッシュメモリーライター |
ポリポリさん | NiftyのFDEVICEへの書き込みによると、ポリポリさんはH8/3048F+MSM60851でUSBデバイスを作成されたそうです。2000/1現在、まだ公開はされていないようです。 |
トランジスタ技術 1997年7月号 | 特集:最新シリアル・データ電送技術 USBの概要,サイプレスのICを使った例 |
Interface誌1998年11月号 | 特集:USB機器&デバイスドライバの作成法 概論に終始していたり、入手困難なチップ(沖電気)のサンプルだったりで、自作にはほとんど役に立ちません。 |
USB Hardware&Software日本語版 | インフォ・クリエイツ翻訳/発行。OADGで買うことができますが、3万円もするわりにはたいしたことないです。USB仕様書よりちょっと分かりやすいという程度。 |
松川竜彦のホームページ | USBラインモニタ・USB解析ソフトのシェアウェアなど。かなりすごい人と思われる。 |