USBホストシステムの試作


 最近はUSBデバイス製作記事というのは珍しくなくなりましたが、今回は一般のスレーブ側のUSBデバイスではなく、ホスト、つまりPC側の役割を行うデバイスの製作を行ってみました。といっても、PCのように様々なデバイスをサポートするわけにもいきませんので、一般的なHIDデバイスの中でもUSBマウスとUSBキーボードの制御を行うものとし、アクアプラスで発売中の携帯ゲーム機であるP/ECEのデバイスプロキシ的な機能も織り込んでみることにしました。

 

1.設計仕様

 仕様は冒頭にあるように、HIDデバイスとUSBハブに対応します。当たり前のことながら、USBの特徴であるプラグ&プレイに対応し、ダイナミックなデバイスの挿抜に対応できるようにします。

 また、デバイスプロキシをサポートするということは、必然的にUSBデバイスを2つ以上つなげることを意味します。このため、HIDデバイスだけでなくUSBハブの制御機能も実装し、1ハブ、4デバイスまでをサポートするシステムとします。これにより、小規模ではありますが基本的な機能をほぼ含んだUSBホストシステムとなります。

 

2.使用したコントローラ

 今回使用したコントローラはある方よりの頂き物なのです(^^; 実際のところ、かなり入手が難しいのでアレなんですが・・・。

 ●USBホスト/スレーブコントローラ  ScanLogic SL811HST (silicon rev1.2)

 このコントローラには以下のような特徴があります。

 特にソフトウェアレベルではSOFパケットが自動生成されることで、比較的小規模のマイコンでもUSBホストを構成することが可能になっています。また、5Vインターフェイスに直結可能ですので、いろいろなマイコンで使用可能です。今回は、コントローラを制御するAVRマイコンを5V動作させています。

 ●コントロールCPU  ATMEL  AT90S8515−8PC

 相変わらずこれです。まぁお手軽ですし。最近はこのCPUをgccを使ってCで設計するのがトレンドですが、今回はメモリの使用の仕方がシビアなので、すべてホスト側のソフトウェアはアセンブラで記述しています。PICのような変態インストラクションと違ってAVRマイコンはインストラクションが素直ですので、この手の結構規模の大きなものでもアセンブラで十分設計が可能です(^^)


3.ハードウェアの構成

 あんまり解説することもないのですが(^^; 単にコントローラとCPUをつなげて、USBトランシーバの入出力に一般的なUSBホストインターフェイスを構成しているだけです(^^; USBトランシーバの入出力には、普通のまともな機器であればフィルタがついているものですが、まぁ今回は趣味で作っただけですので(^^; 

 ●USBホストシステム回路図(GIFファイル)

主要部品表
種類 メーカー 型番
USBホストコントローラ ScanLogic SL811HST
CPU ATMEL AT90S8515-8PC
CMOS汎用 各社 74HC14
RS232Cレベルシフタ AnalogDevices ADM232A
MOS-FET NEC 2SJ325
トランジスタ ローム DTC124XSA
5.0Vレギュレータ NS LM3940CT
3.3Vレギュレータ NS LM2940CT
セラミック振動子 ローム CST4.912MT
水晶振動子 12.000MHz
ダイオード 東芝 1S1588

 


4.ソフトウェアの構造

 ファームウェアは先に説明したようにすべてアセンブラで記述されています。基本的な動作としては、HIDデバイスをタイマ割り込みで監視し、デバイスで要求されたインターバルでデバイスからデータを取得します。もし有効であれば、このデータをRS232C側にモニタとして出力します。

 さらに、動作中はデータ線の状態を監視し、デバイスの挿入、または削除を検出すると、USBポートを初期化、デバイス列挙動作を行います。ハブが接続さえている場合には、ハブのポート状態を監視し、ポート状態に変更があれば、そのポートに接続されているデバイスの検出削除処理を行います。

 このとき、接続されたデバイスがP/ECEであれば、内部デバイス管理変数にそのポートを登録して、他にHIDデバイスが存在すれば、そのデバイスから有効なデータが取得されたときに、同時にP/ECEに対してもそのデータを投げるというような処理を行っています。

 これらの処理はすべて割り込みを使わず、ポーリングで実現しています。タイマ割り込みは、内部のデバイスごとに割り振られているカウンタ変数を減算する処理のみを行うようになっており、プログラムのメインループでは、カウンタ値が0になったかどうかをチェックして、0になったときに該当するデバイスの処理を行います。

※エラッタに関する注意(重要)
今回使用したホストコントローラのリビジョン1.3以下のバージョンには、USBハブの下にあるLSデバイス(1.5Mbps)から受信処理を行うとプリアンブルパケットを正常に処理できず、まともに制御できない状態になります。一応、ScanLogic社の出している回避策である程度は直りますが、たまにこけます(^^; そんなわけで、実際にまともに商品に使うのであれば、ハブをサポートしないか、あるいはリビジョン1.4以上のバージョンを使用する必要があります。

 ●USBホスト動作フロー図

 ●USBホスト回路図、ファームウェア、P/ECEソースコード

 ●P/ECE側PROXY経由HIDデバイス接続での動作フロー



5.P/ECEのUSBスレーブデバイスPROXYデモ

 単にHIDデバイスをつなぐだけではつまらないので、こんなものを作ってみました。
 これは、USBホストがスレーブデバイスのPROXYとして動作し、2つのスレーブデバイス間の通信を行うデモです。具体的には、AquaPlusで発売中の携帯ゲーム機「P/ECE」のUSBポートとハブを経由してUSBキーボードやUSBマウスを接続し、それらのデバイスからP/ECEを制御するというものです。
 デモ内容としては、1つがP/ECE上に表示したキャラクタをUSBキーボードのキーを押すことで、上下左右に動くものと、マウスを操作することで、キャラクタが動くというものです。
 2つめがキーボードで入力された文字を表示する簡単なエディタのデモです。CAPSやシフトキーなどにも対応します。
USBバス内部のデータの流れ
コミケ61でのデモの風景
(P/ECE−USBハブ-USBキーボード&マウス)

6.製作を終えて。

 USB機器の作成は、ネタとしてはすでに手垢が付きすぎているものですが(^^;、ホストに関するネタはいままでほとんどありませんでしたので、比較的楽しめるのではないかと思います。結構、スレーブデバイスを使っているだけではわからないこともいろいろ勉強できたのがよかったかな(^^;

 携帯機器などでUSBを使うために新しい規格もできたようですが、従来資産を生かす上ではこのような小規模のUSBホストも使う場面もあるかと思いますので、そのときにこの記事が参考になれば幸いです。




もくじに戻る