ユークエスト株式会社
佐々木 哲(ささき さとし)
![]()
マスストレージクラス(MSCとします)を使用して実際に動かしてみます。
一般的にUSBメモリなどMSCのデバイスは、MSCの上位にファイルシステムを実装してファイルの読み書きを行いますが、この章ではMatrixQuestUSB/lite のMSCのインターフェースを直接呼び出して、USBメモリの内容を他方のUSBメモリにコピーする処理を行います。
先述のとおり、MatrixQuestUSB/lite上のアプリケーションになりますので、全く同じプログラムがSH2A基板でもRX62N基板でも稼働します。どちらもポートがひとつしかありませんので外部HUBを介して接続します。写真では使用していませんが、2つのUSBメモリとHUBを接続しますのでHUBは外部電源が取れるセルフパワータイプを使用することをお勧めします。(写真1)

写真1. USBHUBに2つのUSBメモリをつないだ様子
リアルタイムOSとしてミスポのNORTiProfessionalを使用しています。コピープログラム、USBホストドライバ、NORTiProfessionalの関係は図3の様になります。なお、SH7262を使用する場合はHighSpeedで接続できますが、RX62Nで使用する場合はFullSpeedでの接続となります。また、SH7262の場合は、大容量の内蔵メモリを活用できますが、RX62Nの場合、今回の構成ではコピー用のワークメモリを4kbytes確保するのが精いっぱいになり、パフォーマンスに大きな差が出ます。

・usblMscInit()
usbホストドライバとハブクラス、マスストレージクラスを初期化します。
引数はエニュメレーション処理を行う管理タスクの優先順位、接続コールバック関数と切断コールバック関数のそれぞれポインタです。
・usblMscInsert()
MSCデバイス接続時のコールバック関数です。管理タスクのコンテキストで実行されます。論理的なデバイスを生成し、接続を検出した順に論理デバイス情報をusblDeviceManage配列に保存します。3つ以上接続した場合は無視されます。なお、サンプル提供したUSBホストドライバも最大接続デバイス数をハブを含めて3に制限していますので、この関数の上限を増やしても接続できません。
・usblMscRemove()
MSCデバイス切断時のコールバック関数です管理タスクのコンテキストで実行されます。。本来は、論理デバイスの解放処理などを実装しますが、このサンプルではメッセージを出力するほかは何もしません。
・usblMscCopy()
コピーを行います。USBメモリが2つ接続されるまで待ってコピーを開始します。全体のフローを図4に示します。
メモリ内の全ての内容をコピーすると実行に長時間要しますので先頭から0x40000セクタ(128MBytes)分だけコピーして終了します。コピー元のUSBメモリとしてフォーマットした直後に128MBytesより十分小さいファイルしか書いていないものを用いれば、コピー後のUSBメモリをWindows等に接続してみると、あたかもコピーできた様に見えます。
なお、本サンプルプログラムでは切断処理に対応していないため、一度実行するとリセットしなければ再度実行できません。
また、ホストドライバはサンプルとなっているため、およそ一時間で通信が停止する仕様になっています。コピーサイズを増やす場合は留意してください。
サンプルプログラムの具体的な使用方法はプロジェクト内のreadme.txtを参照してください。
- MatrixQuestUSB/host
- USB1.1/2.0対応ホストドライバ プロトコルスタック
- MatrixQuestUSB/lite
- 組込みコントローラ用USBホストドライバプロトコルスタック
- MatrixQuestUSB/ex
- マスストレージ機能専用USBホストドライバ
