「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。
ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ
11月2日号に引き続き今回もUSBについて取り上げたいと思います。
前回は、USBとRS232C・RS422との比較を行いました。今回はUSBの高速/高信頼通信を実現している通信プロトコルについて説明します。
また、実際のWindowsとSH7727との接続の流れについて見てみたいと思います。
USBの実際のプロトコルについて説明します。
USBの接続構成は通信プロトコル上ホストとターゲットとして分けられています。
一般的にはホストはパソコンとなり、ターゲットが周辺機器となります。(ホストがマイコンになることもあります)
USBでは必ずホストが存在しホストを介して制御を行う決まりになっています。
一般的にターゲット側は複雑な バス 管理を行わない分、回路が簡易となりコスト面で優位とされています。反面、ホスト が無ければ ターゲットが使用できない欠点もあります。
が、最近では組み込み機器等で ホスト が無い場合でも ターゲット同士で通信したいという要望が出ており、これを解決するために新たに USB On-The-Go(OTG) という規格やPictBridgeの規格が発表されています。
OTGはホストにもターゲットにもなれるコントローラを内蔵したものを指し、PictBridgeはデジタルカメラとプリンタ間等の画像転送用プロトコルです。
USBの接続は理論上1台のホストと最大127台のターゲットまでを接続できます。
ハブは5段まで階層化でき、スター型の構成となります。
ホスト側からターゲットを見た場合にはプロトコル上ハブの存在を無視して、ホスト対ターゲットは1対多のように仮想的にみることができます。
逆にターゲット側はハブを無視して、ホスト対ターゲットは1対1のように見ることができます。
ただし、実際にはハブ自体もUSBターゲットとして認識されており、このように扱えるのもUSBプロトコルのおかげです。(ここがEthernetのハブとは大きな違いです)
また、USB通信では、ホストとターゲットが通信するために、アドレスとエンドポイントという概念を元に通信を行います。
ホストは1つのシステムの中でユニークなアドレス(1〜127)をターゲットに割り当て、トークンにのせます。また、ターゲット側では各転送(コントロール、バルク、インタラプト、アイソクロナス。転送方式については後述します)に対してバッファ(FIFO)を持つので、バッファに番号をつけます。
このバッファをエンドポイント(0〜15)と呼び、トークンへアドレスと一緒にエンドポイントを指定することでホストとターゲット間の通信が行われます。
また、エンドポイントはそれぞれ、送信用、受信用、送受信用として使用することが可能で、その中のどれで通信できるかを接続時にターゲット側から申告することとなります。
ただし、エンドポイント0はUSB使用上コントロール転送用として予約されています。
個人的には、このアドレスとエンドポイントの関係はTCPやUDPプロトコルでいうIPアドレスとポート番号に似ているところがあると思っています。TCPではIPアドレスはIPプロトコルで、ポート番号はTCPプロトコルと階層化はされていますが、バッファが別であることや使用目的に合わせてエンドポイントを使い分け、それを宛先としているところは同じ考え方だと思います。
更にUSBでは、アドレスとエンドポイントのセットをインターフェイスという単位でまとめて扱えるようになっています。
ただし、このインターフェイスは実際のUSBプロトコルにのるわけではありません。
例えば1つのターゲットが同じエンドポイントを共通で使って複数の機能をもっているとします。
この時インターフェイスという概念があれば、アドレスとエンドポイントのセットではなくインターフェイス番号で機能を選択することが可能となります。
こうすることで、ホストは1つの装置の機能をインターフェイス毎に扱えるためドライバもインターフェイス毎にロードでき、結果、一つの装置で複数の機能を比較的容易に実現することができるようになっています。
USBはバスを共有するため、タイムシェアリングする必要があります。いろいろなターゲットが接続することが想定されるためUSBではバスの利用率と各ターゲットのパフォーマンスを下げないように、ターゲットの特徴に合わせて以下の4つのデータ転送方式を使い分ける必要があります。
名称 | 特徴 | 主な用途 | 転送 優先順位 |
メリット | デメリット |
---|---|---|---|---|---|
コントロール転送 | ターゲットの制御を行うための転送方式 | すべてのターゲット | 3 | 他の転送方式と組み合わせてターゲットの制御が可能 | 転送プロトコルのオーバヘッドが大きい |
バルク転送 | 非周期的に大量のデータを扱う転送方式 | プリンタ スキャナ デジカメ フラッシュメモリー 有線LAN 無線LAN等の画像入出力、ストレージ、ネットワーク系 |
3 | 他の転送方式の空き時間をすべて使用でき、高信頼性のデータ転送が可能 | タイムシェアリングの優先度が低いため遅延が発生する |
インタラブト転送 | 周期的に少量のデータを扱う転送方式 | マウス キーボード等のヒューマンインターフェイス |
2 | 周期的な転送が可能(周期はターゲットから申告) | ホストからのポーリングに対するアンサーでしか転送できない |
アイソクロナス転送 | リアルタイムで大量のデータを扱う転送方式 | 電話 カメラ ビデオキャプチャ等のストリーミングデータ |
1 | 連続的で周期的な転送が可能(ハイスピードでは125μs周期) | 転送プロトコルにリトライがない。ただしUSBは信頼性が高いバスのため実際はほぼ問題ない(データが化けたとしても大きな問題にならないことが前提) |
弊社で主に開発している制御系ソフトウェアでは、時間的な制約が厳しくないものに対しては、空き時間をすべて使用できるバルク転送を使用することが多いです。
USB通信では、ホストとターゲットの接続シーケンスで、ホストはターゲットからコントロール転送によってディスクリプタを取得するような仕組みがあります。
ディスクリプタとはターゲットの特性や属性などの情報を含んだ情報を指します。
ディスクリプタには種類がいくつかあり、以下に簡単にディスクリプタについて説明します。
これらのディスクリプタ情報をホストが取得することではじめて通信を開始することができます。この他にもディスクリプタはいろいろありますが今回は主なものだけを取り上げています。
実際にUSBの接続から通信までの手順をWindowsホストとSH7727ターゲットを例にして簡単に挙げています。
(1).PCにUSB機器を接続
VBus/D+により、ホスト/ターゲットがそれぞれ認識し、ホストがターゲットのアドレスを決定します。
SH7727では、立上がり(接続)/立下り(切断)で割り込みを発生させることが可能です。
(2).コントロール転送開始
ホストからターゲットへディスクリプタを要求し、ターゲットが応答します。
コンフィグディスクリプタが正常に取得できると、Windowsでは「新しいデバイスが見つかりました」が表示されプラグ&プレイでUSBターゲットを認識したことが分かります。
(3).バルク転送、インタラプト転送、アイソクロナス転送開始
WindowsでのUSB認識が完了後、ホスト側アプリケーションでは、ターゲットからインターフェースディスクリプタ、エンドポイントディスクリプタを取得し、各アプリケーションの通信を始めることとなります。
2回に渡りUSB通信の概要についてまとめてみました。とても簡単に説明しましたが、USBは以上のようなプロトコルを実装することで、高速かつ高品質の通信が可能となっています。
USB通信は実際にはまだまだ奥が深く、覚えるべきことがたくさんありますが、USBを使えば、今までのRS232C等のインターフェイスを利用する際に必要だった下位のプロトコルの設計が必要なくなり、アプリケーションレイヤーの設計に集中することができるようになります。
(H.K.)
関連ページへのリンク
関連するソフテックだより