USB周辺機器製作に関する情報

トップページへ

2010/7追記:
このページの情報はずいぶん古くなってしまいました。新しいページ(2010年〜版)を書きかけです。

USBチップ

現在、個人で入手可能な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言語)を元に、手作業でアセンブラに変換し、必要な場所を書き換えただけです。

マイコンの書き込み

ChaN氏の作成された書き込みソフトを使用しました。詳しくは下の情報集を見てください。

デバイスドライバの作成

バルク転送のデバイスドライバはWindows98DDK(Device Driver Development Kit)のサンプルを使用しました。
デバイスドライバのコンパイルはちょっと敷居が高いと思うので、簡単に説明します。分かってしまえば簡単です。
  1. MicrosoftのホームページからWindows98DDKをダウンロードします。詳しくは下の情報集参照。
  2. DDKをインストールします。c:\98ddkにインストールするものとします。
  3. コンパイル環境の設定をします。これから先の作業はMS-DOSプロンプトで行います。
    まず、MS-DOSプロンプトのプロパティ(MS-DOSプロンプトのウィンドウのアイコンをクリックします)で、環境変数のサイズを4096に設定してください。
    c:\98ddk\bin\ディレクトリで
    setenv c:\98ddk free
    と実行します。
  4. c:\98ddk\src\usb\bulkusb\sysディレクトリで
    build
    を実行します。エラーが出ていないことを確認します。
    以上でデバイスドライバは完成です。
    同様に、バルク転送テストプログラムはc:\98ddk\src\usb\bulkusb\exeディレクトリでbuildを実行すると作成できます。
    作成されたファイルはc:\98ddk\lib\i386\freeディレクトリに置かれます。
ドライバのインストール手順は以下の通りです。
  1. 製作したUSB機器を接続する
  2. infファイルを要求してきたらc:\98ddk\src\usb\bulkusb\sys\bulkusb.infを指定する
  3. sysファイルを要求してきたらc:\98ddk\lib\i386\free\bulkusb.sysを指定します。

本来なら、GUIDを設定して、上記デバイスドライバの名前を変更するべきでしょう(.infと.sysファイルはwindowsディレクトリにコピーされるので)。ただし、GUIDを作成するにはMicrosoft Visual C++に付属しているGUIDGEN.EXEが必要です。まあ、個人的な使用なら問題ないでしょう。
このバルク転送のサンプルは、同時に2つのパイプを使用できないなど、いろいろ制約・問題があると柏野氏のホームページでは書かれています。柏野氏の作成された汎用USBデバイスドライバを使用されると良いかもしれません(私はまだ試していません)。ソースファイルもダウンロードできるので、参考にされると良いと思います。

ベンダIDの問題

USB機器にはすべて、16ビットのベンダIDというメーカー毎にユニークな番号が割り振られており、デバイスドライバを検索したりするのに使用されます。
ベンダIDを取得するにはwww.usb.orgに2万円程度を支払う必要があるようなので、そこまではやっていません。
今回作った機器ではとりあえず0xFFFFを使用していますが、これは正しい方法ではなく、またIDが重なった場合には誤動作する可能性があります。
ベンダIDはさらに16ビットのプロダクトIDで細分化して使用することができるので、どこかにベンダIDを安く切り売りしてくれる所があるといいのですが。あるいは、希望者が集まれば、僕がとりまとめてもいいかなあと考えています。


USB製作・デバッグのヒント

まず、マウスやキーボードなどの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が取り上げられていますが、(プロでなくて)自作愛好者レベルが理解するための適当な解説というのはまだ無いような気がします。いつか、そのような解説記事を書くことができたらいいなあと考えています。


ダウンロード

ソースファイル付きです。 ・テストボード回路図 (準備中)
・USB-XMiNTキーボード回路図 (準備中)
・ファームウェア 全プロジェクト(テストボード(キーボード,マウス,バルク),USB-XMiNTキーボード)で共通のファイルセットです。必要なところだけコメントアウトを外す必要があります。
・デバイスドライバ
・DOSアプリケーション
・Windowsアプリケーション

注意:ここに書いてある通り、ベンダIDを正規に取得していません。本プログラムをこのまま使用する場合は個人的な使用にとどめてください。
お約束:本ページに掲載されている回路図・ソフトウェア等を使用した結果については一切責任を負いません。商用利用は一応禁止としておきます。

製作に必要な情報集

今回の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 DDKUSBデバイスドライバを作成するには必須です。
ChaN氏のAVRライタこれがあったからAVRマイコンを使うことができました。感謝。トランジスタ技術???年?月号・?月号に関連記事が掲載されています。
高村氏キーボード本体に関する部分はここを参考にしました(というか一緒に作業をしました)。
Toms氏のAVRアセンブラXMiNTキーボード用のソースをアセンブルするにはここのtavrasmを使って下さい。基本的にはAtmelのものと同じ仕様ですが、マクロや定数の仕様が拡張されています。

その他USB情報集

USB関連の記事・ホームページはたくさんあります。今回の製作に際して、参考にさせていたいたものもあります。
USB OrganizationUSB規格の元締め。規格書はここからダウンロードできます。会議室でのやりとりも盛んです。
Philipsサンプルコードをちょっと参考にしました。
Cypressサンプルコードをちょっと参考にしました(でも改訂中でダウンロードできないものが多いのは何とかして欲しい。2000/6現在。)
Jan AxelsonHIDのサンプルをちょっと参考にしました。
USB Designer LinksUSBチップ情報満載。
もろぼし☆らむさん沖電気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解析ソフトのシェアウェアなど。かなりすごい人と思われる。

Last update: 2000/6