USBN960x用 基本デバイスプログラム
   (アセンブラベース)


【デバイスプログラム】

デバイス側にあって、ホストからのUSB通信での各コマンドに応答するのが
デバイスプログラムです。
デバイスのコンフィギュレーションを実行したあとは、各デバイスのパイプを
通じてホストと通信し、ホストからの指示に従った動作をします。

この動作を実現するデバイスプログラムは、共通的な部分が多く、毎回新規に
作成する必要が無いものです。そこで、この共通部分を取り出してまとめたもの
が、ここで紹介する 「基本デバイスプログラム」です。
この基本デバイスプログラムはアセンブラ言語で記述されています。

この基本デバイスプログラムをベースにすれば、デバイスの機能動作部分だけ
を、ユーザー部分として追加するだけで、多くのデバイスを完成させることが可
能となります。

基本デバイスプログラムは下記をダウンロードして解凍すれば、MPLABでアセ
ンブル可能なソースファイル群となります。

    ★ 基本デバイスプログラム ソースファイル

(10/13)
上記基本デバイスプログラムを改良し、USB制御の部分を独立のヘッダーファイル
としました。これで、ユーザ処理部分だけ独立に作成することが可能となりました。

    ★ 改良版 基本デバイスプログラム(アセンブラ)(10/13 VerUp)


この基本デバイスプログラムは、下記を参考にさせて頂きました。

    ★ トランジスタ技術 2000年6月号の渡辺明禎氏のプログラム


【全体構成】

この基本デバイスプログラムの全体構成は、下図のようになっています。
全体は5つのモジュールから構成され、ていますが、メインプログラムで
ある usbdvc1.asm 以外は定義だけですので、これはすべてのプログラムで
共通に使われます。

メインプログラムの中に実際の処理プログラムが全て含まれていて、実際に
デバイスを開発するときには、この中にある「ユーザー処理追加部」に各パイ
プの「機能」を果たす部分を追加し、必要があれば、「ディスクリプタデータ」を
変更します。







この基本デバイスプログラムには、液晶表示器の制御が組み込まれており、
実際にデバイスの機能で使うこともできますし、デバッグ用のメッセージ表示
器として使うことも可能です。
 デバッグに便利なように、デバッグ用の表示出力命令が組み込まれていて、
コメントアウトしてあるので、このコメントの行頭のセミコロンを削除すれば
デバッグ用の表示として活用することが出来ます。


【エンドポイントの定義】

基本デバイスプログラムとして定義されているエンドポイントは下表のように
なっています。
USBN9603が、コントロール+IN3個+OUT3個の合計7個のエンドポイント
が構成出来るようになっていますので、全部を使えるように定義しています。
この定義は、ディスクリプタデータで行っていますので、これを変更するとき
には、ディスクリプタデータを修正する必要があります。
またエンドポイントはNo0以外は全て片方向となっていますので、使うときに
は注意が必要です。

パイプNo エンドポイント IN/OUT 転送サイズ ユーザー処理追加部
無し IN/OUT 8バイト 無し
バルクIN 8バイト DO_TX1
バルクOUT 8バイト DO_RX1
バルクIN 8バイト DO_TX2
バルクOUT 8バイト DO_RX2
バルクIN 16バイト DO_TX3
バルクOUT 16バイト DO_RX3

上表のように、エンドポイントはすべてバルク転送モードとして使うように設定
しています。
そしてパイプ番号も順番に付けていますが、エンドポイント0が異なり、番号が
ずれていますので使うときに間違えないよう注意が必要です。


【概略フロー】

本基本デバイスプログラムの概略の流れは下図のフロー図のようになってい
ます。




 まずメインプログラムで初期化したあと、
単純に割込み待ちループとして
USBの割り込みを待ちます。




あとはUSBの割込み要因によりそれぞれの処理に分岐しています。
コンフィギュレーションが完了してしまえば、後は、ホストからのポーリングに応
答するだけなので簡単なフローになります。
 特に、基本となる通信プロトコルは大部分USBN9603のデバイスコントローラ
が自動で処理してくれるので、デバイスのプログラムとしては、受信あるいは送
信が完了した割込みで動作を開始するだけになります。
また送受信処理に時間がかかるときには、USBN9603が自動的にNAK応答を
返してホストを待たせてくれるので、一定時間以内に応答しなければならないと
いうことも無く、安心して処理を実行することが出来ます。









一番複雑なのは、ホストとなるパソコンに接続した時のプラグ&プレイによる
コンフィギュレーションが完成するまでの手続きです。この時の通信はエンド
ポイント0番で実行されますので、この処理の流れだけが、他のエンドポイント
の処理と異なっています。SETUPのトランザクションの流れがこのコンフィギュ
レーションに関わる処理です。ディスクリプタの要求には多くの種類があるため
それぞれに対応した処理があります。
他の3つの汎用エンドポイントはパイプとしてコンフィギュレーションで定義され
ます。そしてそれぞれにユーザ処理部を追加できるようにしています。
このユーザ処理部はサブルーチンとして追加できるようにしています。
(DO_RX1、DO_RX2、DO_RX3というサブルーチン名にしてあります)







TX割込みに対する処理は比較的簡単で、エンドポイント0番に関する処理も、
ディスクリプタの残りの送信ブロックがあれば、連続して送信を実行します。
他の3つの汎用エンドポイントの処理部分にはユーザ処理部を追加できるように
しています。
このユーザ処理部は、サブルーチンとして作成し追加します。
(DO_TX1、DO_TX2、DO_TX3というサブルーチン名にしてあります)







【デバイスディスクリプタ】

この基本デバイスプログラムで定義しているデバイスディスクリプタは下記の
ようになっています。
まずテーブルで検索できるように開始番地を「xx00H」番地とします。下記では
700H番地としています。
そして順番に3つのDeescriptorを定義しています。この基本デバイスでは
HIDクラスのデバイスは扱わないので、HID Deescriptorはありません。

  Device Descriptor
  Configuration Descriptor
  Inteface Descriptor
  







次がエンドポイントの定義部分です。6個のエンドポイントを定義していて
全部バルクモードとしています。
USBN9603の内蔵FIFOはエンドポイント0以外は全て64バイトの大きさ
がありますので、そのようにパケットサイズを定義します。








 目次に戻る