• 検索結果がありません。

注意 : この日本語版文書は参考資料としてご利用ください 最新情報は必ずオリジナルの英語版をご参照願います USB 組み込みホストスタック AN1140 Author: はじめに USB は 各種の機器を PC に接続するための標準的な通信方式として普及しました フラッシュドライブやマウス等の汎用機

N/A
N/A
Protected

Academic year: 2021

シェア "注意 : この日本語版文書は参考資料としてご利用ください 最新情報は必ずオリジナルの英語版をご参照願います USB 組み込みホストスタック AN1140 Author: はじめに USB は 各種の機器を PC に接続するための標準的な通信方式として普及しました フラッシュドライブやマウス等の汎用機"

Copied!
20
0
0

読み込み中.... (全文を見る)

全文

(1)

AN1140

はじめに

USB は、各種の機器を PC に接続するための標準的な 通信方式として普及しました。フラッシュ ドライブや マウス等の汎用機器から特定アプリケーション向けの 専用機器まで、他のシリアル通信プロトコルはほぼ完 全に USB 規格に取って代わられました。 USB 規格では、USB デバイス同士は直接通信できま せん。USB デバイスは USB ホストとのみ通信でき、 USB ホストは 1 つまたは複数の USB デバイスが接続 されたバスを制御します。最も一般的な USB ホスト は PC です。USB On-The-Go (OTG) モジュールを内 蔵した Microchip 社製マイクロコントローラの導入に より、組み込みアプリケーションで各種の USB 機器 を USB 組み込みホストとして使う事が可能になりま した。

USB の概要

USB 動作の詳細を記載した参考資料は、USB 2.0 仕様 書以外にも多数存在します。以下では、本書で使う用 語またはスタック動作を理解するために必要な用語に ついて簡単に説明します。

USB ホストとペリフェラル デバイス

標準的な USB システムは、1 つのホストと 1 つまたは 複数のペリフェラル デバイス ( 多くの場合、単に「デ バイス」と呼ぶ ) によって構成されます。各デバイス はホストとのみ通信でき、デバイス同士が直接通信す る事はできません。バス上の全ての通信は、ホストに よって開始されます。デバイスは、ホストから要求さ れた時にのみデータをホストに向けて送信でき、ホス トから送信されたデータを受信する必要があります。 デバイスは通常 Type-B レセプタクルを使うか、キャプ ティブ ケーブルを備えています。 ほとんどの USB ペリフェラル デバイスは、いずれか のカテゴリ ( クラスと呼ぶ ) に分類されます。クラス ごとに通信フォーマットに関する要件が異なります。 ホストはデバイスのクラスを識別し、そのクラスの要 件を満たす必要があります。この要件を満たせない場 合、ホストはデバイスと通信できません。クラスには、 マウス等に使われる HID (Human Interface Device) ク ラスや、フラッシュドライブに使われるマスストレー ジ クラス等があります。クライアント ドライバは、こ れらのクラスに対してアプリケーション レベルのサ ポートを提供します。USB ペリフェラル デバイスに よっては、ベンダー固有の仕様を持ち、既存のどのク ラスにも分類されない物もあります。それらのデバイ スに対しては、クライアント ドライバのコードを専用 に書く必要があります。 ホストに接続可能なデバイスの数は、ハブを使う事で 増やせます。USB は階層式スター型ネットワークです。 通常、ハブを使う事で 1 つのポートに 4 個または 7 個 のデバイスを接続できます。ハブは、最大で 5 個まで デイジーチェーン接続できます ( 最大で 5 層を形成 )。 バスには最大で 127 個のデバイス ( ハブを含む ) を接続 できます。 完全な USB ホストは、Type-A レセプタクルを使って 全てのデバイスと通信できる必要があります。このサ ポートを提供するために、専用ドライバを使う事がで きます。専用ドライバはデバイスを接続する前にホス トにインストールしておく必要があります。また、ハ ブをサポートする必要があり、各ポートは 100 mA 以 上を供給可能である事が必要です。

ホストと組み込みホスト

USB 組み込みホストと通常の USB ホストの間には、 小さいながらも重要な相違点がいくつかあります。 USB 組み込みホストは以下の点で通常の組み込みホ ストと異なります。 • 特定ペリフェラル デバイスおよび / または特定クラ スのデバイスのみをサポートする。 • サポートするデバイスが要求する転送タイプのみを サポートする。 • ハブのサポートは必須ではない。 • 電源要件は軽減される。

Author: Kim Otten

Microchip Technology Inc.

(2)

ホストモードの動作

USB システムでは、ホストがバス上の全てのトラ フィックを制御し、デバイスはホストからの要求に応 答する事しかできません ( デバイスからデータ転送を 開始する事はできません )。USB OTG モジュールは、 ホストおよびデバイスのどちらのモードでも使えま す。正確な動作方法は 2 つのモード間で異なります。 USB 転送は複数のトランザクションで構成でき、トラ ンザクションは複数のパケットで構成できます。さら に、単一の転送は複数のデータステージ トランザク ションを含む事ができます。図 1 に、単一 USB 転送 の一般的フォーマットを示します。 図 1: 一般的な転送の構造

(3)

多くの場合、コントロール転送には 3 種類のトランザ クションの全てが必要です。8 個のデータバイトを読 み出すコントロール転送の構造を図 2 に示します。

(4)

バルク、インタラプト、アイソクロナス転送はセット アップ ステージとステータス ステージのトランザク ションを使いません。バルク転送の場合、1 つのデータ ステージ トランザクションで最大64バイトを転送でき ます。128 個のデータバイトを書き込むバルク転送に は、2 つのデータステージ トランザクションが必要で す。この転送の構造を図 3 に示します。 図 3: バルク転送の構造 USB組み込みホストスタックは、ホストモードのUSB OTG モジュールとパケットレベルで連携します ( 例 外として、ACK パケットはモジュールによって自動的 に処理される )。組み込みホストが図 3 のバルク転送 を開始する場合、2 個の OUT パケットと 2 個の DATA0/ 1 パケットを転送するための命令を明示的に発行する 必要があります。組み込みホストが図 2 のコントロー ル転送を開始する場合、SETUP、DATA0/1、IN、OUT パケットの全て ( 全部で 6 個のパケット ) を送信する ための命令を明示的に発行する必要があります。

(5)

USB 組み込みホスト

TPL (Targeted Peripheral List)

TPL (Targeted Peripheral List) は、USB 組み込みホス トがサポートするペリフェラル デバイスのリストで す。TPL 内の各エントリは、特定の製品 ( 製品の VID

と PID を指定 ) または特定のクラス ( クラス、サブク ラス、プロトコルを指定 ) を参照します。例として、 USB フラッシュ ドライブと Microchip 社の PICDEM™ FS USB デモボードをサポートする組み込みホストの TPL を表 1 に示します。 表 1: 組み込みホストの TPL

デュアルロール デバイスと On-The-Go

デバイスは、2 つのレセプタクルを使って組み込みホス トと USB デバイスの両方の機能をサポートする事で、 デュアルロール デバイスとして機能できます。例えば デジタルカメラは、画像を PC へダウンロードする時に ペリフェラル デバイスとして動作し、画像をプリンタ へ転送する時に組み込みホストとして動作できます。 カメラは、接続されたケーブルに応じて、デバイスま たはホストどちらかのロールで動作します。Type-A レ セプタクルにケーブルを接続した場合、カメラはホス トとして動作します。Type-B レセプタクルにケーブル を接続した場合、カメラはデバイスとして動作します。 常にどちらか一方のレセプタクルにのみアクセス可能 な構造ではない限り、Type-A および Type-B レセプタク ルは同時に動作する必要があります。 USB On-The-Go デバイスとは、ケーブルを差し換え ずにロールを組み込みホストからペリフェラル デバ イスへ動的に変更できるデバイスです。OTG デバイス は micro-AB レセプタクルを使います。初期のロール はケーブルの向きによって決まります。ケーブルの micro-A プラグが挿入されたデバイスは、組み込みホ ストとして動作するよう初期設定されます。ケーブル の micro-B プラグが挿入されたデバイスは、ペリフェ ラル デバイスとして動作するよう初期設定されます。 OTG 機能を使うかどうかの選択は、2 つのデバイスの ロールを動的に切り換える必要があるかどうかによっ て決まります。ほとんどの場合、互いに通信する 2 つ のデバイスのロール ( ホスト / ペリフェラル ) は固定さ れています。例えば、上記のデュアルロール デジタル カメラの場合、PC またはプリンタとの間でロールを 交替する必要がないため、OTG 機能は不要です。 また、On-The-Go デバイスの TPL には制約がありま す。OTG デバイスの TPL では、サポートする個々の デバイスを指定する必要があります ( サポートするク ラスを指定する事はできません )。例えば、OTG デバ イスでは、USB フラッシュ ドライブをマスストレー ジ クラスとして全般的にサポートする事はできませ ん。OTG デバイスは OTG 非対応ペリフェラル デバイ スをサポートできますが、そのペリフェラル デバイス の VID と PID を指定する必要があります。Microchip 社の PICDEM FS USB デモをサポートする OTG デバ イスの TPL の例を表 2 に示します。

表 2: OTG TPL

名称 クラス名 クラスコード サブクラスコード プロトコル

Flash Drive Mass Storage 0x08 0x06 0x50

名称 メーカー モデル VID PID

Full-Speed Demo Microchip PICDEM™ FS USB 0x04D8 0x000C

名称 メーカー モデル VID PID

(6)

USB 組み込みホストスタック

Microchip 社は、弊社製マイクロコントローラ向けに、 ロイヤリティ フリーで USB 組み込みホストスタック を提供しています。このスタックは、USB OTG モ ジュールを内蔵する全ての Microchip 社製デバイス上 で動作します。各種のコンパイル時オプションを使っ てスタックの動作を設定する事で、特定のアプリケー ション向けに速度とサイズを最適化できます。 スタックはステートマシンに基づき、割り込みとポー リングの両方を使います。割り込みは実行時間が重要 な全ての動作向けに使い、実行時間が重要ではない動 作の処理にはポーリングを使います。どちらも、スタッ クが適正に動作するように使う必要があります。ポー リングを使わずに、特定システムイベントの発生を通 知するようにスタックを設定する事もできます。

スタックのインストール

USB サポート パッケージは、Microchip 社のウェブサ イト(http://www.microchip.com/usb)からダウンロード できます。ウェブサイトから必要なインストール パッ ケージをダウンロードして実行してください。一部の USB デモは、他のアプリケーション ノートからのラ イブラリを使います。それらのライブラリもインス トールされます。既定値では、USB ホストスタック ファイルは図 4 に示すディレクトリ構造にインストー ルされます。 図 4: インストール ディレクトリ構造

Local Hard Drive (C:)

Microchip Solutions Microchip Common Include USB USB Documents USBConfig.exe

USB Data Logger Project Files

USB Source Files Generic Microchip Source Files

USB Header Files Generic Microchip Header Files + + + + + + + + Help + Help Files Client Driver Directories

(7)

スタック アーキテクチャ

USB 組み込みホストスタックはモジュール構造を持 ち、ノンブロッキング、RTOS 非依存です。このスタッ クは以下の 2 つのメインセクションによって構成され ます。 • ステートマシン - バックグラウンド処理用 ( デバイ ス エニュメレーション等 ) • 割り込みハンドラ – 実行時間が重要な処理向けに バスを効率的に使用 ステートマシンの構造を図 5 に示します。 図 5: USB 組み込みホストのステートマシン DETACHED STATE ATTACHED STATE ADDRESSING STATE RUNNING STATE INIT Validation Successful Address Assigned CONFIGURING STATE Device Configured Device Deconfigured Deattach Interrupt Deattach Interrupt Deattach Interrupt Deattach Interrupt Attach Interrupt Validation Failed

(8)

デバイスが動作ステートに移行すると、スタックは初 期化イベントハンドラを呼び出す事によって、新たに エニュメレートされたデバイスをクライアント ドラ イバに知らせます。このイベントハンドラの詳細は、 「 イベントハンドラの定義」を参照してください。ク ライアント ドライバが正常に初期化されると、通常の 通信が始まります。 USB バスは 1 ms のフレームを使って動作します。こ のフレーム内で複数メッセージを送信できます。従っ て、高速に応答して USB トラフィックを効果的に制 御するために、割り込みを使います。スタックは以下 の 2 種類の重要割り込みを使います。

• SOF (Start-Of-Frame)割り込み - USB OTGモジュー ルが新しい 1 ms フレームを開始する直前に生成さ れる • トランザクション完了割り込み - USB OTG モ ジュールが最後に要求されたトランザクションを完 了した時点で生成される これらの割り込みを受信すると、割り込みサービス ルーチン (ISR) はバス上で送信する次のトランザク ション ( 存在する場合 ) を決定します。

スタックの設定

図 4 のディレクトリ構造内にインストールされるコン フィグレーション ツール (USBConfig.exe) を使う と、USB ホストスタックとクライアント ドライバを 特定のアプリケーション向けに設定できます。 図 6 に示すように、最初に [Main] タブで [Device Type] と [Ping-Pong Mode] を指定します。[Device Type] を 指定すると、それに応じた適切なコンフィグレーショ ン パラメータが、他のタブ上で設定可能になります。 これらのパラメータを使って、ホスト / デバイスと必 要なクライアント ドライバを設定します。

(9)

[Device Type] で「USB Emgedded Host」、「USB Dual Role」、「USB OTG」のいずれかを指定した場合、図 7 に示す [Host] タブ上でホストモードを設定できます。 エンドポイント サポートを調整する事で、プログラム メ モ リ を 節 約 で き ま す。[Attach Debounce Interval (ms)] の値を USB 仕様値 (100 ms) よりも大きくする 事で、より低速のデバイスをサポートできます。[Name

of Application Event Handler] には、アプリケーション レベ ルのイベ ントハ ンドラと して機 能する メイン ソースファイル内の関数の名前を入力する必要があり ます。転送イベントを使う場合、[Generate Transfer Events] にチェックマークを付ける必要があります。転 送イベントの使用方法については、「 転送イベントの 使用」を参照してください。 図 7: USB コンフィグレーション ツール - [HOST] タブ

(10)

TPL は、図 8 に示す [TPL] タブで指定できます。VID/ PID またはクラスのどちらかを指定できます。TPL の 詳細については、「 TPL (Targeted Peripheral List)」 を参照してください。 図 8: USB コンフィグレーション ツール - [TPL] タブ アプリケーションに固有のクラスサポートは、別のタ ブを使って指定できます。クラスとそれらのクライア ント ドライバに関する詳細については、別冊の USB 関連アプリケーション ノートを参照してください。

PIC24F の要件

USB OTG モジュールには 48 MHz クロックが必要で す。これは最大 CPU クロックレートを超えているた め、1 つのオシレータソースから CPU クロックと USB クロックの両方を生成するための方法が用意されてい ます。 オシレータソースは、4 MHz の整数倍の周波数で動作 する必要があります。この周波数は、USB PLL プリス ケーラを使って 4 MHz に分周する必要があります。 USB PLL プリスケーラは、入力されるオシレータ周波 数を自動的に検出しません。4 MHz のプリスケーラ出 力を生成するには、ユーザが手動で PLL 分周比 (PLLDIV2:PLLDIV0 コンフィグレーション ビット ) を 適切に設定する必要があります。このため、プライマ リ オシレータ周波数の選択肢は表 3 に示す 8 通りに制 限されます。 表 3: PIC24F USB 動作向けのプライマリ オシレータ設定 Note: FRC オシレータの許容誤差は USB 仕様の許 容誤差よりも大きいため、FRC の使用は推奨 しません。 入力オシレータ周波数 クロックモード PLL 分周比 (PLLDIV<2:0>) 48 MHz ECPLL 12 (111) 40 MHz ECPLL 10 (110) 24 MHz HSPLL, ECPLL 6 (101) 20 MHz HSPLL, ECPLL 5 (100) 16 MHz HSPLL, ECPLL 4 (011) 12 MHz HSPLL, ECPLL 3 (010) 8 MHz HSPLL, ECPLL 2 (001) 4 MHz HSPLL, ECPLL, XTPLL 1 (000)

(11)

USB PLL 出力を使って内蔵 96 MHz PLL 周波数逓倍器 を駆動し、その出力は 2 つのクロック回路に分岐され ます。一方の分岐は、2 分周 ( 固定 ) の分周器を使っ て、48 MHz の USB クロックを生成します。他方の分 岐は、3 分周 ( 固定 ) の分周器と設定可能 PLL プリス ケーラ / 分周器 (CLKDIV<CPDIV1:0>) を使って、所定 レンジのシステムクロック周波数を生成します。表 4 に、利用可能なシステムクロック オプションを示しま す。オシレータモードの詳細については、マイクロコ ントローラのデータシートを参照してください。 表 4: USB 動作時のシステムクロック オプション

PIC32 の要件

USB OTG モジュールには 48 MHz のクロックが必要 です。このクロックは、以下の 3 通りの方法で供給で きます。 • 8 MHz FRC 内部オシレータを使う • OSC1/OSC2 ピンに 48 MHz オシレータを供給する • OSC1/OSC2 から 96 MHz USB PLL を使う USB PLL は、UPLLEN コンフィグレーション ビット で有効にします。OSC1/OSC2 ピン上のオシレータ ソースは、4 MHz の整数倍の周波数で動作する必要が あります。この周波数は、USB PLL プリスケーラを 使って 4 MHz に分周する必要があります。USB PLL プリスケーラは、入力されるオシレータ周波数を自動 的に検出しません。4 MHz 出力を生成するには、ユー ザが手動で PLL 分周比 (UPLLIDIV コンフィグレーショ ン ビット ) を適切に設定する必要があります。次に、 96 MHz PLL 出力を 2 分周 ( 固定 ) の分周器に入力して 48 MHz の USB クロックを生成します。システムバス および周辺モジュールバス クロックは、USB PLL の 使用によって影響を受けません。 あるいは、サスペンドモードからの復帰時に USB モ ジュール向けのクロック源が必要な場合、FRC を使う 事ができます。FRC ソースは、OSCCON<UFRCEN>

プロジェクト要件

USB 組み込みホストスタックは、接続デバイスに関す る情報を動的メモリに保存します。USB ペリフェラル のデバイス ディスクリプタ、全てのコンフィグレー ション ディスクリプタ、64 バイトのオーバーヘッド 用に十分なヒープ空間を割り当てる必要があります。 クライアント ドライバは、追加の動的メモリを要求す る場合があります。デバイス情報を保持するために十 分な動的メモリが得られない場合、デバイスはエニュ メレーションに失敗します。

ヒープサイズは、MPLAB® IDE プロジェクト内で MPLAB

IDE メインメニューから Project>Build Options…>Project を選択する事で指定できます。16 ビット マイクロコ ントローラを使う場合、[MPLAB LINK30] タブを開い て、[Heap Size] 編集ボックスに値を入力します。次い で、[OK] をクリックします。

スタックの使用方法

ほとんどのアプリケーションは、USB 組み込みホスト スタックと直接連携しません。その代わりに、クライ アント ドライバを使います ( クライアント ドライバが 代わりにホストスタックを使用します )。アプリケー ションによっては、クライアント ドライバと連携する 追 加 の レ イ ヤ を 備 え る 場 合 が あ り ま す。例 え ば、 『AN1145 - 組み込みホストにおける USB フラッシュ ド ライブの使用』に記載したアプリケーションは、図 9 に 示すように、アプリケーション層を含む 5 つのレイヤ を使います。 図 9: USB フラッシュ ドライブのデータロガー アーキテクチャ 本書の内容は、主にクライアント ドライバの開発者を 対象としています。 MCU クロック分周比 (CPUDIV<1:0>) MCU クロック周波数 分周せず (00) 32 MHz 2??(01) 16 MHz 4??(10) 8 MHz 8??(11) 4 MHz Note: その他の選択可能クロック オプションまた は制約事項に関しては、各デバイスのデータ シートを参照してください。

Note: USB 組み込みホストスタック API の詳細につ

いては、「Help」ディレクトリ内の API 関連文

Application Layer File System Support SCSI Command Support Mass Storage Client Driver

(12)

TPL の定義

サポート可能な USB ペリフェラル デバイスをスタッ クに知らせるために、TPL (Targeted Peripheral List) を 定義する必要があります。アプリケーションが USB OTG を使う場合、TPL にはサポートする個々のデバイ ス ( 各デバイスに固有の VID/PID ペア ) だけを含める 事ができます。アプリケーションが USB 組み込みホ ストを使う場合、TPL にはサポートする個々のデバイ ス ( 固有の VID/OID ペア ) に加えて、サポートするク ラスも含める事ができます。 TPL は、スタックと一緒に提供されるコンフィグレー ション ツール (USBConfig.exe) を使って定義できま す。「 スタックの設定」を参照してください。

イベントハンドラの定義

クライアント レベルのイベント スタックは、クライアント ドライバ内で 2 つのイベン トハンドラを必要とします。1 つはデバイス初期化ハ ンドラです。これは、デバイスのコンフィグレーショ ンが設定された後、デバイス エミュレーション中に呼 び出されます。デバイス初期化ハンドラは、以下のよ うに typedef で定義された関数である事が必要です。 typedef BOOL (*USB_CLIENT_INIT) ( BYTE address, DWORD flags );

この関数は、デバイスのクラスに固有のデバイス初期 化を実行します。初期化中にエラーが発生しなかった 場合、このルーチンは TRUE を返します。エラーが発 生した場合、このルーチンは FALSE を返し、デバイス はエニュメレートされません。例 1 に、初期化ハンド ラのサンプルコードを示します。 例 1: 初期化ハンドラ

BOOL USBHostSampleInitialize( BYTE address, DWORD flags ) {

// This handler supports one attached device. if (deviceHandle != 0)

{

return FALSE; // We cannot support this device. }

deviceHandle = address;

// Initialize something based on flags. if (flags & 0x01) { // Do something } else { // Do something else }

return TRUE; // Device successfully initialized }

(13)

2 つめのイベントハンドラは、通常動作中に発生する イベントを処理するために必要です。このイベントハ ンドラは、以下のように typedef で定義された関数 である事が必要です。

typedef BOOL (*USB_CLIENT_EVENT_HANDLER) ( BYTE address, USB_EVENT event, void *data, DWORD size );

発 生 す る 可 能 性 の あ る イ ベ ン ト の 例 と し て、 EVENT_DETACH があります。このイベントは、デバイ スがバスから切断された時に発生します。この場合、 クライアント ドライバのステータスを更新する必要 があります。この更新は、そのクライアント ドライバ を使う接続デバイスのリストから、切断されたデバイ スを削除する等の動作によって行います。例 2 に、イ ベントハンドラのサンプルを示します。 例 2: イベントハンドラ OTG 動作向けに各種のイベントが提供されます。 加えて、転送イベント (EVENT_TRANSFER) を提供す るようにスタックを設定する事もできます。「 転送イ ベントの使用」を参照してください。 イベントの完全なリストは、「Help」ディレクトリ内 の API 関連文書に記載されています。 スタックは、サポートする各クライアント ドライバの 全ての初期化およびイベントハンドラを含むリストを 要求します。このリストは、スタックと一緒に提供さ れるコンフィグレーション ツール (USBConfig.exe) を使って定義できます。「 スタックの設定」を参照し てください。

BOOL USBHostSampleEventHandler( BYTE address, USB_EVENT event, void *data, DWORD size )

{ switch (event) { case EVENT_DETACH: deviceHandle = 0; return TRUE; break;

// More events handled here… }

return FALSE; // We did not handle the event }

(14)

アプリケーション レベルのイベント 一部のイベントは、クライアント ドライバ レベルでは なく最上位のアプリケーション レベルを対象とします。 この種のイベントの代表例が EVENT_REQUEST_POWER です。このイベントは、エニュメレーションの処理 中にデバイスが電源を要求した時に生成されます。 接続デバイスに割り当てる電力量をアプリケーショ ン で監 視 ま た は 制 御す る 必 要 が あ る場 合、ア プ リ ケーション イベントハンドラを実装する必要があ り ま す。こ の イ ベ ン ト ハ ン ド ラ の 型 も、上 記 の USB_CLIENT_EVENT_HANDLER である事が必要で す。イベントハンドラの名前は、コンフィグレーショ ン ツール (USBConfig.exe) の[Host]タブ内の [Name of Application Event Handler] フィールドに入力する必 要があります (「 スタックの設定」参照 )。例 3 に、電 源を制御するための最小限のイベントハンドラを示し ます。 例 3: アプリケーション レベルのイベントハンドラ イベントハンドラが何も実装されていない場合、組み 込みホストスタックは、イベントハンドラが TRUE を 返したかのように応答します。

スタックの初期化

USB 組み込みホストの動作は、以下の 1 つの関数に よって初期化されます。

BYTE USBHostInit( void );

この関数は、スタック動作の全ての内部変数を初期化 します。この関数は、アプリケーションの実行中に 1 度 だけ呼び出します。マイクロコントローラ上の USB OTG モジュールは、この関数内で設定されません。 USB コンフィグレーション ツールは、 USB ホストド ライバとサポートするクライアント ドライバが要求 する全ての初期化ルーチンを呼び出すためのマクロ (USBInitialize()) を生成します。

通常のスタック動作

初期化後は、以下の 1 つの関数によって USB OTG モ ジュール コンフィグレーションと USB 組み込みホス ト動作がトリガされます。

void USBHostTasks( void );

この関数は、デバイスをエニュメレートするために必 要なステートマシンを実行します。適切なタイミング でエニュメレーションを行うために、この関数は一定 間隔で呼び出す必要があります。 USB コンフィグレーション ツールは、 USB ホストド ライバとサポートするクライアント ドライバが要求 する全てのタスク ルーチンを呼び出すためのマクロ (USBTasks()) を生成します。

ペリフェラル デバイスとの通信

デバイスとの通常の通信は、以下の 2 つの関数によっ て開始されます。

BYTE USBHostRead( BYTE deviceAddress, BYTE endpoint, BYTE *data, DWORD size ); BYTE USBHostWrite( BYTE deviceAddress, BYTE endpoint, BYTE *data, DWORD size ); USB_SUCCESS (0x00) の戻り値は、動作が正常に始 まった事を示します。

BOOL USB_ApplicationEventHandler( BYTE address, USB_EVENT event, void *data, DWORD size )

{

switch( event ) {

case EVENT_REQUEST_POWER:

// data points to a byte that represents the amount // of power requested in mA, divided by two.

if (*(BYTE*)data > 50) // We will allow up to 100mA { return FALSE; } break; } return TRUE;

// Allow all other events to pass. } Note: アプリケーションは、より低レベルの関数呼 び出しの代わりに USBInitialize() マク ロを使う必要があります。 Note: アプリケーションは、より低レベルの関数呼 び出しの代わり USBTasks() マクロを使う 必要があります。 Note: 以下では、ペリフェラル デバイスと通信す るためにクライアント ドライバ向けに必要 なルーチンについて説明します。アプリケー ション レベルのコードはこれらの関数を呼 び出さず、代わりにクライアント ドライバ 内の適切なルーチンを使います。

(15)

通信が始まった後は、動作のステータス ( 完了したかど うか ) を監視しながら USBTasks() (USBHostTasks() と必要な全てのクライアント タスク ) を実行するよう 注意してください。動作ステータスは、以下の関数を 呼び出す事で判定できます。

BOOL USBHostTransferIsComplete( BYTE deviceAddress, BYTE endpoint, BYTE *errorCode, DWORD *byteCount );

この関数が FALSE を返した場合、転送は未完了であ り、返されたエラーコードとバイトカウントは無効で す。この関数が TRUE を返した場合、返されたエラー コードは動作のステータスを示し、返されたバイトカ ウントは転送されたバイトの数を示します。 ホストからデバイスへのデータ転送の例を例 4 に示し ます。 例 4: ペリフェラル デバイスへのデータ送信

error = USBHostWrite( device, EP1, buffer, sizeof(buffer) ); if (error)

{

// There was a problem }

else {

while (!USBHostTransferIsComplete( device, EP1, &error, &count )) {

USBHostTasks(); }

if (error) {

// There was a problem }

else {

// The data was transferred successfully }

(16)

スタックの高度な使用方法

転送イベントの使用 例 4 に示したデータ転送の方法は簡単ですが、転送の 完了を待機している間は実行がループ内でトラップさ れるという欠点があります。これを防ぐ 1 つの方法と して、転送イベントを使います。 基本的なスタック動作向けに特定のイベントをサポー トする必要があるため、全てのクライアント ドライバ はイベントハンドラを備える必要があります。しかし 転送イベントは必須ではありません。なぜならば、全 てのアプリケーションが転送イベントを必要とするわ けではなく、また、転送イベントによって必要リソー スが増加するからです。 転送イベントは、システム内の他のイベントとは異 なる方法で動作します。USB 転送の完了ステータス は、転送完了割り込みの発生時に、USB ISR 内で判 定されます。しかし、この時点では、転送イベント は生成されません。バスを効率的に使うには、1 USB フレーム (1 ms) 内で可能な限り多くのトランザク ションを実行するために、USB 割り込みをできるだ け短くする必要があります。クライアント ドライバ のイベントハンドラは比較的サイズが大きく、実行 に長い時間を要する場合があります。また、アプリ ケーションの別のレイヤによる処理が必要な別のイ ベントが発生する可能性があり、その場合は非常に 長い遅延が生じます。このため、転送イベントキュー を使います。転送イベント (EVENT_TRANSFER) は、 ISR 内で HOST_TRANSFER_DATA 型の構造体と一緒に キューに入れられます。これにより、アプリケーショ ンは、どの転送が完了したのかと、その転送が成功し たかどうかを判定できます。関数 USBHostTasks() は、転送イベントをキューから取り出し、それらをク ライアント ドライバのイベントハンドラへ引き渡し ます。 一般的に、転送イベントをサポートする場合、転送イ ベントキューのために、プログラムメモリとデータメ モリの必要量が増加します。コード アーキテクチャが 複雑化するため、C 言語プログラミングの初心者がこ のアーキテクチャを設計、開発、デバッグ、維持する 事はより難しくなります。しかし転送イベントを使う 事で、クライアント ドライバのバックグラウンド タス ク処理関数を最小限に ( あるいは不要に ) して、処理帯 域幅をより効率的に活用できます。 転送の終了 スタックは、デバイスが送信する NAK の数をカウン トする事で、デバイスが応答に失敗している転送を自 動的に終了できます。アプリケーションがこれとは異 なるタイムアウトを必要とする場合、以下の関数を呼 び出す事によって転送を手動で終了できます。 void USBHostTerminateTransfer( BYTE deviceAddress, BYTE endpoint );

標準デバイス リクエストの発行

全ての USB デバイスは、ホストからの特定の要求に 応答します。アプリケーションは、以下の関数を呼び 出す事によって、USB 標準デバイス リクエストを発 行できます。

BYTE USBHostDeviceRequest( BYTE deviceAddress, BYTE bmRequestType, BYTE bRequest, WORD wValue, WORD wIndex, WORD wLength, BYTE *data, BYTE dataDirection ); その後、スタックは要求されたコントロール転送をエ ンドポイント 0 上で開始します。標準デバイス リクエ ストの詳細は、USB 2.0 仕様書を参照してください。 エンドポイント エラーのクリア 発生エラー数が多すぎるために転送に失敗した場合、 またはデバイスがエンドポイントをストールさせたた めに転送に失敗した場合、別の転送を試みる前にエ ラーをクリアする必要があります。エラー条件は、以 下の関数を呼び出す事によってクリアできます。 BYTE USBHostClearEndpointErrors( BYTE deviceAddress, BYTE endpoint );

ストールが発生した場合、 USBHostClearEndpointErrors() を呼び出すと 共に、デバイス上のストール条件をクリアする必要が あります。これを行うには、CLEAR FEATURE デバイ ス リクエストを、ENDPOINT HALT 機能セレクタと 現在ストール中のエンドポイント番号を使って発行 します (「 標準デバイス リクエストの発行」参照 )。 CLEAR FEATURE デバイス リクエストの詳細は、USB 2.0 仕様書を参照してください。 デバイスおよびコンフィグレーション ディスク リプタへのアクセス エニュメレーション中に、スタックはデバイス ディ スクリプタと、そのデバイスのコンフィグレーション ディスクリプタを取得して保存します。クライアント ドライバは、USBHostGetDeviceDescriptor()関 数を使ってデバイス ディスクリプタにアクセスでき ます。この関数は、デバイス ディスクリプタを指す ポインタを返します。

BYTE * USBHostGetDeviceDescriptor( BYTE deviceAddress ); クライアント ドライバは、 USBHostGetCurrentConfigurationDescriptor() 関数を使う事で、現在のコンフィグレーションのコン フィグレーション ディスクリプタにアクセスする事 もできます。この関数も、ディスクリプタを指すポイ ンタを返します。 BYTE * USBHostGetCurrentConfigurationDescriptor ( BYTE deviceAddress )

(17)

ストリング ディスクリプタの取得 USB ペリフェラル デバイスには製品、メーカー、デバ イスシリアル番号等の文字列情報を記述したストリン グ ディスクリプタを格納できます。必要な文字列のイ ンデックスは、デバイス ディスクリプタ内の適切な フィールドを参照する事で取得できます。次に以下の 関数を呼び出す事で、必要な文字列を取得できます。 BYTE USBHostGetStringDescriptor ( BYTE deviceAddress, BYTE stringNumber, BYTE *stringDescriptor, BYTE stringLength ) 例 5 に、接続デバイスのシリアル番号を取得する方法 を示します。 デバイス ディスクリプタとストリング ディスクリプ タの詳細については、USB 2.0 仕様書を参照してくだ さい。 例 5: デバイスシリアル番号の取得

deviceDescriptor = USBHostGetDeviceDescriptor( device ); snIndex = deviceDescriptor[16]; //See Device Descriptor spec.

if (snIndex != 0) {

if (!USBHostGetStringDescriptor( device, snIndex, buffer, 50 )) {

while(!USBHostTransferIsComplete( device, 0, &error, &count )) {

USBHostTasks(); }

if (!error) {

// Serial number is in buffer[] in UNICODE }

} }

(18)

まとめ

Microchip 社製 16 および 32 ビットマイクロコント ローラ向けの USB 組み込みホストスタックは、各種 の USB クラスをサポートするためのプラットフォー ムを提供します。これらのソリューションを使う事 で、マスストレージおよびヒューマン インターフェ イス デバイスを含む各種の USB ペリフェラル デバ イ ス を ア プ リ ケ ー シ ョ ン で 使 用 で き ま す。一 部 の Microchip 社製 16 および 32 ビットマイクロコント ローラが内蔵する USB OTG モジュールの USB 組み 込みホスト機能は、組み込みアプリケーションに全く 新しい境地を開きます。

参考資料

• AN1141 - USB 組み込みホストスタック プログラマガイド (http://www.microchip.com) • AN1142 - 組み込みホストにおける USB マススト レージ クラス (http://www.microchip.com) • AN1143 - 組み込みホストにおける USB 汎用クライ アント (http://www.microchip.com)

• AN1143 - 組み込みホストにおける USB HID クラス (http://www.microchip.com)

• AN1145 - 組み込みホストにおける USB フラッシュ ドライブの使用 (http://www.microchip.com) • Universal Serial Bus ウェブサイト (http://www.usb.org) • Microchip 社ウェブサイト (http://www.microchip.com)

(19)

本書に記載されているデバイス アプリケーション等に関する 情報は、ユーザの便宜のためにのみ提供されているものであ り、更新によって無効とされる事があります。お客様のアプ リケーションが仕様を満たす事を保証する責任は、お客様に あります。Microchip 社は、明示的、暗黙的、書面、口頭、法 定のいずれであるかを問わず、本書に記載されている情報に 関して、状態、品質、性能、商品性、特定目的への適合性を は じ め と す る、い か な る 類 の 表 明 も 保 証 も 行 い ま せ ん。 Microchip 社は、本書の情報およびその使用に起因する一切の 責任を否認します。Microchip 社の明示的な書面による承認な しに、生命維持装置あるいは生命安全用途に Microchip 社の製 品を使用する事は全て購入者のリスクとし、また購入者はこ れによって発生したあらゆる損害、クレーム、訴訟、費用に 関して、Microchip 社は擁護され、免責され、損害をうけない 事に同意するものとします。暗黙的あるいは明示的を問わず、 Microchip社が知的財産権を保有しているライセンスは一切譲 渡されません。 商標

Microchip 社の名称と Microchip ロゴ、dsPIC、FlashFlex、 KEELOQ、KEELOQロゴ、MPLAB、PIC、PICmicro、PICSTART、

PIC32ロゴ、rfPIC、SST、SST ロゴ、SuperFlash、UNI/O は、 米 国お よ びそ の 他の 国 にお け る Microchip Technology Incorporated の登録商標です。

FilterLab、Hampshire、HI-TECH C、Linear Active Thermistor、 MTP、SEEVAL、Embedded Control Solutions Company は、 米国における Microchip Technology Incorporated の登録商標 です。

Silicon Storage Technology は、その他の国における Microchip Technology Incorporated の登録商標です。

Analog-for-the-Digital Age、Application Maestro、BodyCom、 chipKIT、chipKIT ロゴ、CodeGuard、dsPICDEM、dsPICDEM.net、 dsPICworks、dsSPEAK、ECAN、ECONOMONITOR、FanSense、 HI-TIDE、In-Circuit Serial Programming、ICSP、Mindi、MiWi、 MPASM、MPF、MPLAB 認証ロゴ、MPLIB、MPLINK、mTouch、 Omniscient Code Generation、PICC、PICC-18、PICDEM、 PICDEM.net、PICkit、PICtail、REAL ICE、rfLAB、Select Mode、 SQI、Serial Quad I/O、Total Endurance、TSHARC、UniWinDriver、 WiperLock、ZENA、Z-Scale は、米国およびその他の国におけ る Microchip Technology Incorporated の登録商標です。 SQTP は、米国における Microchip Technology Incorporated のサービスマークです。

GestICとULPPは、その他の国におけるMicrochip Technology Germany II GmbH & Co. & KG (Microchip Technology Incorporated の子会社 ) の登録商標です。

その他、本書に記載されている商標は各社に帰属します。 ©2013, Microchip Technology Incorporated, Printed in the U.S.A., All Rights Reserved.

ISBN: 978-1-63276-119-4 通している同種製品の中でも最も高度であると考えています。 • しかし、コード保護機能を解除するための不正かつ違法な方法が存在する事もまた事実です。弊社の理解ではこうした手法は、 Microchip 社データシートにある動作仕様書以外の方法で Microchip 社製品を使用する事になります。このような行為は知的所 有権の侵害に該当する可能性が非常に高いと言えます。 • Microchip 社は、コードの保全性に懸念を抱くお客様と連携し、対応策に取り組んでいきます。 • Microchip 社を含む全ての半導体メーカーで、自社のコードのセキュリティを完全に保証できる企業はありません。コード保護 機能とは、Microchip 社が製品を「解読不能」として保証するものではありません。 コード保護機能は常に進歩しています。Microchip 社では、常に製品のコード保護機能の改善に取り組んでいます。Microchip 社 のコード保護機能の侵害は、デジタル ミレニアム著作権法に違反します。そのような行為によってソフトウェアまたはその他の著

(20)

北米 本社 2355 West Chandler Blvd. Chandler, AZ 85224-6199 Tel:480-792-7200 Fax:480-792-7277 技術サポート : http://www.microchip.com/ support URL: www.microchip.com アトランタ Duluth, GA Tel:678-957-9614 Fax:678-957-1455 オースティン (TX) Tel:512-257-3370 ボストン Westborough, MA Tel:774-760-0087 Fax:774-760-0088 シカゴ Itasca, IL Tel:630-285-0071 Fax:630-285-0075 クリーブランド Independence, OH Tel:216-447-0464 Fax:216-447-0643 ダラス Addison, TX Tel:972-818-7423 Fax:972-818-2924 デトロイト Novi, MI Tel:248-848-4000 ヒューストン (TX) Tel:281-894-5983 インディアナポリス Noblesville, IN Tel:317-773-8323 Fax:317-773-5453 ロサンゼルス Mission Viejo, CA Tel:949-462-9523 Fax:949-462-9608 ニューヨーク (NY) Tel:631-435-6000 サンノゼ (CA) Tel:408-735-9110 カナダ - トロント Tel:905-673-0699 Fax:905-673-6509 アジア / 太平洋 アジア太平洋支社 Suites 3707-14, 37th Floor Tower 6, The Gateway Harbour City, Kowloon Hong Kong Tel:852-2943-5100 Fax:852-2401-3431 オーストラリア - シドニー Tel:61-2-9868-6733 Fax:61-2-9868-6755 中国 - 北京 Tel:86-10-8569-7000 Fax:86-10-8528-2104 中国 - 成都 Tel:86-28-8665-5511 Fax:86-28-8665-7889 中国 - 重慶 Tel:86-23-8980-9588 Fax:86-23-8980-9500 中国 - 杭州 Tel:86-571-8792-8115 Fax:86-571-8792-8116 中国 - 香港 SAR Tel:852-2943-5100 Fax:852-2401-3431 中国 - 南京 Tel:86-25-8473-2460 Fax:86-25-8473-2470 中国 - 青島 Tel:86-532-8502-7355 Fax:86-532-8502-7205 中国 - 上海 Tel:86-21-5407-5533 Fax:86-21-5407-5066 中国 - 瀋陽 Tel:86-24-2334-2829 Fax:86-24-2334-2393 中国 - 深圳 Tel:86-755-8864-2200 Fax:86-755-8203-1760 中国 - 武漢 Tel:86-27-5980-5300 Fax:86-27-5980-5118 中国 - 西安 Tel:86-29-8833-7252 Fax:86-29-8833-7256 中国 - 厦門 Tel:86-592-2388138 Fax:86-592-2388130 中国 - 珠海 Tel:86-756-3210040 Fax:86-756-3210049 アジア / 太平洋 インド - バンガロール Tel:91-80-3090-4444 Fax:91-80-3090-4123 インド - ニューデリー Tel:91-11-4160-8631 Fax:91-11-4160-8632 インド - プネ Tel:91-20-3019-1500 日本 - 大阪 Tel:81-6-6152-7160 Fax:81-6-6152-9310 日本 - 東京 Tel:81-3-6880- 3770 Fax:81-3-6880-3771 韓国 - 大邱 Tel:82-53-744-4301 Fax:82-53-744-4302 韓国 - ソウル Tel:82-2-554-7200 Fax:82-2-558-5932 または 82-2-558-5934 マレーシア - クアラルンプール Tel:60-3-6201-9857 Fax:60-3-6201-9859 マレーシア - ペナン Tel:60-4-227-8870 Fax:60-4-227-4068 フィリピン - マニラ Tel:63-2-634-9065 Fax:63-2-634-9069 シンガポール Tel:65-6334-8870 Fax:65-6334-8850 台湾 - 新竹 Tel:886-3-5778-366 Fax:886-3-5770-955 台湾 - 高雄 Tel:886-7-213-7830 台湾 - 台北 Tel:886-2-2508-8600 Fax:886-2-2508-0102 タイ - バンコク Tel:66-2-694-1351 Fax:66-2-694-1350 ヨーロッパ オーストリア - ヴェルス Tel:43-7242-2244-39 Fax:43-7242-2244-393 デンマーク - コペンハーゲン Tel:45-4450-2828 Fax:45-4485-2829 フランス - パリ Tel:33-1-69-53-63-20 Fax:33-1-69-30-90-79 ドイツ - デュッセルドルフ Tel:49-2129-3766400 ドイツ - ミュンヘン Tel:49-89-627-144-0 Fax:49-89-627-144-44 ドイツ - プフォルツハイム Tel:49-7231-424750 イタリア - ミラノ Tel:39-0331-742611 Fax:39-0331-466781 イタリア - ベニス Tel:39-049-7625286 オランダ - ドリューネン Tel:31-416-690399 Fax:31-416-690340 ポーランド - ワルシャワ Tel:48-22-3325737 スペイン - マドリッド Tel:34-91-708-08-90 Fax:34-91-708-08-91 スウェーデン - ストックホルム Tel:46-8-5090-4654 イギリス - ウォーキンガム Tel:44-118-921-5800 Fax:44-118-921-5820 03/25/14

図 2:  コントロール転送の構造
図 6 に示すように、最初に [Main] タブで [Device Type]

参照

関連したドキュメント

必要に応じて、「タイムゾーンの設定(p5)」「McAfee Endpoint Security

しかし何かを不思議だと思うことは勉強をする最も良い動機だと思うので,興味を 持たれた方は以下の文献リストなどを参考に各自理解を深められたい.少しだけ案

注:一般品についての機種型名は、その部品が最初に使用された機種型名を示します。

本装置は OS のブート方法として、Secure Boot をサポートしています。 Secure Boot とは、UEFI Boot

それでは資料 2 ご覧いただきまして、1 の要旨でございます。前回皆様にお集まりいただ きました、昨年 11

(7)

Q-Flash Plus では、システムの電源が切れているとき(S5シャットダウン状態)に BIOS を更新する ことができます。最新の BIOS を USB

注1) 本は再版にあたって新たに写本を参照してはいないが、