スパイス  組み込み制御装置の受注製作

USBから複数シリアルポートを
平成26年 5月 22日

 ディスクリプタの検討
 ここから先は試行錯誤の連続になります。どこまで上手くいくか分からないのですが、後から「何を考えながら作業してきたか」をトレースできるのは多少なりとも意味があるだろうと考えて、作業する前の検討状況を書いておきます。

 USBに関しての知識を持たない人がいきなり読んで分かるように説明するのは非常に困難です。多少なりとも他のHPなどでUSBの内部動作を知る努力も必要になります。出来るだけ丁寧に書いていくつもりですが、この文書だけでは理解できないものだとの前提で読んでください。

 まず、USBのケーブルを接続した段階からの動作を順番にトレースすると、最初PCはデバイスディスクリプタを読み出します。
これはケーブルで接続された装置全体(デバイスと呼ぶらしい)の情報を示しています。ここで重要なのはデバイスのVID, PID, クラスコードでしょうか。VID, PIDはデバイスとPC側で読み込む.infファイルの対応が正しいかどうかを確認するために使用します。.infファイルの中にも自分が対応するデバイスのリストが含まれており、その中にこのデバイスのVID, PIDが含まれる必要があります。
 クラスコードはUSBで規定されたデバイスクラスを示しています。単独のシリアルポートではCDCクラスになります。ではポート数を2CHに増やしたらどうなるか?
 これが良く分からないのです。 可能性としてはCDCクラスのままで良いかIADクラスになるかのいずれかであろうとは思うのですが。
この説明にはCDCクラスとIADクラスの説明が必要になります。

  CDCクラス
 CDCクラスは内部的には2本の通信ポートで構成されています。最初は制御コードを送る(送る向きは後日確認)一方向の通信ポート。残りはデータを送受信する双方向ポート。

  IADクラス
 IADクラスはクラスというより、通信ポートのグループ化およびクラスとの対応を行うための宣言です。例えばIADでポート1〜2をグループ・CDCクラスと宣言した場合他に複数のクラスが存在しても、その内ポート1と2は必ずCDCクラスになります。一つのデバイスに複数のクラスが存在しても、ポートとクラスの対応を常に一対一に保つためのクラスです。

 ここでの疑問はIADが複合(複数ではない)クラスと呼ばれている点です。ネット上でのサンプルは常に異なるクラス、例えばCDCクラスとMSCクラスをセットにしています。同じく(複数のポートを持つ)クラスが複数ある場合でも同様にIADクラスとして宣言すべきなのかどうか? IADクラスはUSB2.0で後から追加導入された経緯もあり、それ以前の記述方法があっても不思議ではない気がします。
 可能性としては、
  ・IADクラスとして宣言が必要
  ・従来記述をn回繰り返せばOK
  ・どちらでもOK
  ・どちらもNG(誤り)
ですが、よく分かりません。

 同じようにPC側での.infファイルの記述方法にも疑問が多く、正しい動作に辿り着くのは簡単ではなさそうです。

目次へ  前へ  次へ