USBX ホストスタック・ユーザガイド · Express Logic, Inc. は、USBX...
Transcript of USBX ホストスタック・ユーザガイド · Express Logic, Inc. は、USBX...
高性能 USB スタック
USBX ホストスタック・ユーザガイド
Express Logic 858.613.6640
Toll Free 888.THREADX FAX
858.521.4259
http://www.expresslogic.com
©1999-2014 by Express Logic, Inc.
All rights reserved.This document and the associated USBX software are the sole property of Express Logic, Inc. Each contains proprietary information of Express Logic, Inc. Reproduction or duplication by any means of any portion of this document without the prior written consent of Express Logic, Inc. is expressly forbidden.
Express Logic, Inc.は、USBX の設計または信頼性を向上するために、随時に予告なく、本書に記
載する仕様を変更する権利を留保します。本書の内容については万全を期していますが、本書の正
確性について Express Logic, Inc.が保証するものではありません。
商標
FileX および ThreadX は Express Logic, Inc.の登録商標であり、USBX、NetX、picokernel、preemption-threshold、event-chaining は、Express Logic, Inc.の商標です。
保証の制限
Express Logic, Inc.は、USBX 製品が使用者の要件を満たすもしくは使用者により指定されたとおり
に動作すること、USBX 製品が中断もしくは欠陥なしに動作すること、または USBX 製品に見つかる
いかなる欠陥も保障期間後に補正されることにつき、一切保証するものではありません。Express Logic, Inc.は USBX 製品に関し、市場性および特定の目的への適合性を含めて、明示あるいは黙
示を問わず一切責任を負わないものとします。Express Logic, Inc.、そのディーラ、販売店、代理店
または従業員から口頭もしくは書面で情報または助言が与えられた場合、それにより、他の保証が
生じるものでもなく、またこの保証の範囲がいかなる形であれ拡大するものでもありません。また、ラ
イセンス取得者はそのような情報または助言に依拠してはなりません。
パート番号: 000-1010 改訂 5.7 版
目次 目次 ............................................................................................................... 3
本書について ................................................................................................. 6
第 1 章 USBX の概要 ............................................................................... 7
USBX の機能 .............................................................................................................. 7 製品ハイライト .............................................................................................................. 8 USBX の強力なサービス .............................................................................................. 8
複数ホストコントローラのサポート ......................................................................... 8 USB ソフトウェアスケジューラ .............................................................................. 8 USB デバイスフレームワークの完全なサポート ..................................................... 8 使いやすい API ................................................................................................... 8
第 2 章 USBX のインストール .................................................................. 10
ホストについて ........................................................................................................... 10 コンピュータの種類 ............................................................................................ 10 ダウンロード用インタフェース .............................................................................. 10 デバッグツール .................................................................................................. 10 必要なハードディスク容量 .................................................................................. 10 ターゲットについて ............................................................................................. 10
コンフィギュレーションオプション .................................................................................. 13 ソースコードツリー ...................................................................................................... 15 USBX リソースの初期化 ............................................................................................. 16 USB ホストコントローラの定義 .................................................................................... 17 ホストクラスの定義 ..................................................................................................... 18 トラブルシューティング ................................................................................................ 20 USBX バージョン ID ................................................................................................... 20
第 3 章 USBX ホストスタックのファンクション コンポーネント...................... 21
実行概要 ................................................................................................................... 21 初期化 .............................................................................................................. 22 アプリケーションインタフェースコール .................................................................. 22 USB ホストスタック API ...................................................................................... 22 USB ホストクラス API ........................................................................................ 22
ルートハブ ................................................................................................................. 23 ハブクラス .................................................................................................................. 23 USB ホストスタック ..................................................................................................... 23
トポロジマネージャ ..................................................................................................... 23 USB クラスのバインド ................................................................................................. 23 USBX API ................................................................................................................. 24 ホストコントローラ ....................................................................................................... 24
ルートハブ ......................................................................................................... 25 電力管理 .......................................................................................................... 25 エンドポイント .................................................................................................... 25 転送 ................................................................................................................. 25
USB デバイスのフレームワーク .................................................................................. 26 デバイス記述子 ................................................................................................. 28 コンフィギュレーション記述子 .............................................................................. 31 インタフェース記述子 ......................................................................................... 33 エンドポイント記述子.......................................................................................... 36 ストリング記述子 ............................................................................................... 39 ファンクショナル記述子 ...................................................................................... 41 メモリ内の USBX デバイス記述子フレームワーク ................................................ 41
第 4 章 USBX ホストサービスの説明 ....................................................... 43
ux_host_stack_initialize ................................................................................... 44 ux_host_stack_endpoint_transfer_abort .......................................................... 45 ux_host_stack_class_get ................................................................................. 46 ux_host_stack_class_register .......................................................................... 47 ux_host_stack_class_instance_create ............................................................. 48 ux_host_stack_class_instance_destroy ........................................................... 49 ux_host_stack_class_instance_get .................................................................. 50 ux_host_stack_device_configuration_get ........................................................ 51 ux_host_stack_device_configuration_select .................................................... 52 ux_host_stack_device_get ............................................................................... 54 ux_host_stack_interface_endpoint_get ............................................................ 55 ux_host_stack_hcd_register ............................................................................ 57 ux_host_stack_configuration_interface_get ..................................................... 59 ux_host_stack_interface_setting_select ........................................................... 60 ux_host_stack_transfer_request_abort ............................................................ 61 ux_host_stack_transfer_request ...................................................................... 62
第 5 章 USBX ホストクラスの API ........................................................... 64
ux_host_class_printer_read ............................................................................. 65 ux_host_class_printer_write ............................................................................. 66 ux_host_class_printer_soft_reset .................................................................... 67 ux_host_class_printer_status_get .................................................................... 68 ux_host_class_audio_read .............................................................................. 69 ux_host_class_audio_write .............................................................................. 70 ux_host_class_audio_control_get .................................................................... 71 ux_host_class_audio_control_value_set .......................................................... 72 ux_host_class_audio_streaming_sampling_set ............................................... 73 ux_host_class_audio_streaming_sampling_get ............................................... 74 ux_host_class_hid_client_register ................................................................... 76 ux_host_class_hid_report_callback_register .................................................... 77
ux_host_class_hid_periodic_report_start ......................................................... 78 ux_host_class_hid_periodic_report_stop ......................................................... 79 ux_host_class_hid_report_get ......................................................................... 80 ux_host_class_hid_report_set ......................................................................... 81 ux_host_class_asix_read ................................................................................. 82 ux_host_class_asix_write ................................................................................ 83 ux_host_class_cdc_acm_read ......................................................................... 84 ux_host_class_cdc_acm _write ....................................................................... 85 ux_host_class_cdc_acm_ioctl .......................................................................... 86 ux_host_class_pima_session_open ................................................................. 88 ux_host_class_pima_session_close ................................................................ 89 ux_host_class_pima_storage_ids_get ............................................................. 90 ux_host_class_pima_storage_info_get ............................................................ 91 ux_host_class_pima_num_objects_get ........................................................... 92 ux_host_class_pima_object_handles_get ........................................................ 95 ux_host_class_pima_object_info_get .............................................................. 97 ux_host_class_pima_object_info_send ............................................................ 99 ux_host_class_pima_object_open ................................................................. 101 ux_host_class_pima_object_get .................................................................... 102 ux_host_class_pima_object_send ................................................................. 104 ux_host_class_pima_thumb_get .................................................................... 106 ux_host_class_pima_object_delete ............................................................... 108 ux_host_class_pima_object_close ................................................................. 109 ux_host_class_gser_read .............................................................................. 110 ux_host_class_gser_write .............................................................................. 111 ux_host_class_gser_ioctl ............................................................................... 112 ux_host_class_gser_reception_start .............................................................. 114 ux_host_class_gser_reception_stop .............................................................. 115
第 6 章 USBX DPUMP クラスについて .................................................. 116
USBX DPUMP ホストクラス ..................................................................................... 117 USBX DPUMP デバイスクラス ................................................................................. 119
第 7 章 ピクトブリッジの実装 .................................................................. 120
ピクトブリッジクライアントの実装 ................................................................................ 121 ux_pictbridge_jobinfo_object_data_read ........................................................ 125
ピクトブリッジホストの実装 ........................................................................................ 126 ux_pictbridge_application_object_data_write ................................................. 128
第 8 章 USBX OTG .............................................................................. 129
インデックス ................................................................................................ 132
本書について 本書では、Express Logic, Inc.の高性能USBファウンデーションソフトウェアUSBXについて包括的
に説明します。
本書は、組み込み式リアルタイムソフトウェアの開発者を対象にしています。開発者は、標準的なリ
アルタイムオペレーティングシステムファンクション、USB 仕様、および C プログラミング言語に精通
していることとします。
USB 関連の技術的な情報については、http://www.USB.org/developers から USB 仕様書および
USB クラス仕様書をダウンロードして参照してください。
本書の構成
第 1 章では、USB について紹介します。
第2章では、ThreadXアプリケーションにUSBXをインストールして使用するための基本
手順を説明します。
第 3 章では、USBX の機能の概要と USB の基本事項を説明します。
第4章では、ホストモードのUSBXへのアプリケーションのインタフェースについて詳述し
ます。
第 5 章は、「USBX DPUMP クラスについて」と題しています。
第 6 章は、「USBX Pictbridge の実装」と題しています。
第 7 章は、「USBX OTG」と題しています。
第 1 章 USBX の概要 USBX は、組み込みアプリケーション対応の本格的 USB スタックです。この章では USBX の概要を
紹介し、その用途と利点を説明します。
USBX の機能 USBX は、現行の USB Specification 1.1、2.0、および OTG をサポートします。スケーラブルに設計
してあるため、1 つだけのデバイスを接続する簡易 USB テクノロジから、複数のデバイスとカスケー
ドハブを備えた複雑なテクノロジまで対応します。USBプロトコルで可能な制御転送、バルク転送、イ
ンタラプト転送、アイソクロナス転送をすべて USBX でサポートします。
USBX はホスト側、デバイス側の両方をサポートします。いずれの側も、次の 3 つのレイヤで構成さ
れます。
• 制御レイヤ • スタックレイヤ • クラスレイヤ
USB 各相の関係は次のようになっています。
クラスドライバ クラスドライバ
ホストスタック
ホストコントローラドライバ
ホストコントローラ
デバイススタック
ホストコントローラドライバ
デバイスコントローラ
ホスト 側 デバイス側
製品ハイライト ThreadX プロセッサの完全なサポートロイヤルティなし 完全な ANSI C ソースコード リアルタイムパフォーマンス迅速なテクニカルサポート 複数のクラスサポート 複数のクラスインスタンス ThreadX、FileX、NetX とのクラス統合 複数コンフィギュレーション対応の USB デバイスのサポート USB 複合デバイスのサポート カスケードハブのサポート USB 電力管理のサポート USB OTG のサポート TraceX のトレースイベントのエクスポート
USBX の強力なサービス
複数ホストコントローラのサポート USBXは、並列実行される複数の USBホストコントローラをサポートできます。これにより、市販され
ている USB 2.0ホストコントローラの大半で採用している下位互換方式の USB 2.0規格を USBX で
サポートできます。
USB ソフトウェアスケジューラ ハードウェアリスト処理機能のないUSBコントローラをサポートするにはUSBソフトウェアスケジュー
ラが必要ですが、そのスケジューラをUSBXに内蔵しています。USBXのソフトウェアスケジューラは、
各USB転送を所定の頻度と優先度に応じて編成し、USBコントローラに命令して転送をそれぞれ実
行します。
USB デバイスフレームワークの完全なサポート 複数コンフィギュレーション、複数インタフェース、複数代替設定などをともなう、最高度の USB デバ
イスをサポートすることができます。
使いやすい API USBX は、最高の組み込み USB スタックを、わかりやすく簡単に使える形で提供します。USBX の
API により、直感的かつ一貫したサービスが得られます。付属の USBX クラス API を使用すれば、
ユーザアプリケーション側で複雑な USB プロトコルを理解する必要がありません。
第 2 章 USBX のインストール
ホストについて
コンピュータの種類 組み込み開発は通常、IBM-PC または Unix のホストコンピュータ上で実行されます。ホスト側でアプ
リケーションをコンパイル、リンク、配置した後、ターゲットハードウェアにアプリケーションをダウン
ロードして実行します。
ダウンロード用インタフェース ターゲットへのダウンロードは通常、RS-232 シリアルインタフェースを介して行いますが、パラレルイ
ンタフェースや、USB、Ethernet を使用する例も増えています。対応するオプションに関する開発
ツールドキュメントを参照してください。
デバッグツール デバッグは一般に、プログラムイメージダウンロード用と同じリンクで実行されます。デバッガには、
BDM(Background Debug Monitor)や ICE(In-Circuit Emulator)ツールを介してターゲット上で実
行する小型のモニタプログラムを初め、各種があります。このうち、実際のターゲットハードウェアを
最も強力にデバッグできるのは、もちろん ICE ツールです。
必要なハードディスク容量 USBXのソースコードはASCII形式で提供され、コンピュータのハードディスクに約 500KBの空き容
量が必要です。その他のホストシステム要件とオプションについては、付属の「readme_usbx.txt」ファイルで確認してください。
ターゲットについて USBX は、ホストモードのターゲット上に 24KB~64KB の読み取り専用メモリ(ROM)が必要です。
必要なメモリ容量は、使用するコントローラ、および USBX にリンクする USB クラスにより異なります。
さらに、USBX グローバルデータ構造とグローバルメモリプール用には、ターゲットに 32KB のランダ
ムアクセスメモリ(RAM)が必要になります。このメモリプールは、USB で実行するデバイス数、およ
び USB コントローラの種類に応じて調整することも可能です。USBX デバイス側では、デバイスコン
トローラの種類に応じて約10~12KのROMが必要です。RAMメモリの使用量は、デバイスでエミュ
レートするクラスの種類により異なります。
さらに USBX では、マルチスレッド保護のために ThreadX の セマフォ、ミューテックス、スレッドを必
要とし、また USB バストポロジの監視のために I/O の中断と周期処理を必要とします。
製品の配布
USBX パッケージには、標準とプレミアムの 2 種類があります。標準パッケージでは最小限のソース
コードを備えているの対し、プレミアムパッケージには USBX ソースコードを一式完備しています。い
ずれのパッケージも 1 枚の CD で出荷されます。
配布 CD の内容は、ターゲットプロセッサ、開発ツール、USBX パッケージにより異なります。以下は、
ほとんどの製品配布に共通する重要ファイルのリストです。
readme_usbx.txt USBX ポートに関するファイルで、ターゲットプロセッサ、開発ツールな
どが含まれています。
ux_api.h すべてのシステム equate、データ構造、サービスプロトタイプを記述し
た C ヘッダファイルです。
ux_port.h 開発ツール向けのデータ定義と構造をすべて記述した C ヘッダファイ
ルです。
ux.lib USBX Cライブラリのバイナリバージョンです。標準パッケージで配布さ
れます。。
demo_usbx.c 簡単な USBX デモを記述した C ファイルです。
ファイル名はすべて小文字で表します。これにより、コマンドを Unix 開発プラットフォームに簡単に変
換することができます。
USBX のインストールは簡単明快です。以下に示す全般的な方法は、ほぼすべてのインストールに
適 用 さ れ ま す 。 た だ し 、 実 際 の 開 発 ツ ー ル 環 境 に 応 じ た 変 更 点 に つ い て は 、
「readme_usbx_generic.txt」で確認してください。
ステップ 1 USBX 配布ディスクをバックアップし、安全な場所に保管しておきます。
ステップ 2 ホストハードドライブ上で以前にThreadXをインストールしたのと同じディレクトリを
使用します。USBX 名はすべて一意となっているため、以前にインストールした
USBX と干渉することはありません。
ステップ 3 tx_application_defineまたはその先頭付近に ux_system_initializeのコールを追
加します。tx_application_define.追加した場所で USBX リソースが初期化され
ます。
ステップ 4 ux_host_stack_initialize へのコールを追加します。
ステップ 5 必要な USBX を初期化するためのコールを 1 つ以上追加します。
ステップ 6 システム内で使用可能なホストコントローラを初期化するためのコールを 1 つ以上
追加します。
ステップ 7 低レベルのハードウェア初期化と割り込みベクトルのルーティングを追加するため
に、tx_low_level_initialize.c ファイルの修正が必要になる場合があります。ハード
ウェアプラットフォームごとに異なるステップとなるため、ここでは説明しません。
ステップ 8 アプリケーションソースコードをコンパイルし、それを USBX と ThreadX のランタイ
ムライブラリとリンクし(USB ストレージクラスや USB ネットワーククラスをコンパイ
ルするときはFileXやNetxも必要になる場合があります)、またux.a(またはux.lib)と tx.a(または tx.lib)にもリンクします。結果をターゲットにダウンロードすれば実行
できます。
コンフィギュレーションオプション USBX ライブラリの構築用にいくつかのコンフィギュレーションオプションがあります。オプションはす
べて ux_port.h に置かれています。
各コンフィギュレーションオプションについて、以下に詳述します。配布ディスクで提供される
readme_usbx.txt ファイルに、その他の開発ツールオプションが記述されています。
UX_PERIODIC_RATE
個々のハードウェアプラットフォームにおける秒あたりのティック数です。デフォルトは 1000、すなわ
ちミリ秒あたり 1 ティックです。
UX_MAX_CLASS_DRIVER
USBX でロード可能なクラスの最大数です。クラスコンテナを表す値であり、1 クラスのインスタンス
数ではありません。例えば、USBXの実装にハブクラス、プリンタクラス、およびストレージクラスが必
要な場合、これらのクラスに属するデバイス数とは無関係に、UX_MAX_CLASS_DRIVER値を3に設定できます。
UX_MAX_HCD
システムで使用可能なホストコントローラの数です。USB 1.1 対応には、この値は通常 1 に設定され、
USB 2.0 対応には 2 以上に設定できます。この値は、同時に実行する並列ホストコントローラの数を
表すものです。例えば、実行する OHCI のインスタンスが 2 つある場合、または EHCI コントローラ 1つと OHCI コントローラが 1 つを実行する場合は、UX_MAX_HCD を 2 に設定します。
UX_MAX_DEVICES
USBにアタッチ可能なデバイスの最大数を表します。1つのUSBに対する理論上の最大数は、通常
127 個です。メモリ節約のためにこの値を下げることが可能です。システム内の USB バス数とはか
かわりなく、デバイスの合計数を表す値であるので留意してください。
UX_MAX_ED
コントローラプール内の ED の最大数を表します。この値は、1 つのコントローラにみに割り当てられ
ます。複数のコントローラのインスタンスがある場合は、各々のコントローラにこの値が使用されま
す。
UX_MAX_TD および UX_MAX_ISO_TD
コントローラプール内の正規 TD とアイソクロナス TD の最大数を表します。この値は、1 つのコント
ローラにみに割り当てられます。複数のコントローラのインスタンスがある場合は、各々のコントロー
ラにこの値が使用されます。
UX_THREAD_STACK_SIZE
USBX スレッドに関するスタックサイズ(単位: バイト)です。通常は、使用するプロセッサとホストコン
トローラに応じて 1024~2048 バイトが可能です。
UX_THREAD_PRIORITY_ENUM
バストポロジをモニタする USBX 列挙スレッドの ThreadX 優先度値です。
UX_THREAD_PRIORITY_CLASS
標準 USBX スレッドの ThreadX 優先度値です。
UX_THREAD_PRIORITY_KEYBOARD
USBX HID キーボードクラスの ThreadX 優先度値です。
UX_THREAD_PRIORITY_HCD
ホストコントローラスレッドの ThreadX 優先度値です。
UX_NO_TIME_SLICE
1 を指定した場合、ThreadX ターゲットポートはタイムスライスを使用しません。
UX_MAX_HOST_LUN
ホストストレージクラスドライバに表される SCSI 論理ユニットの最大数を表します
ソースコードツリー USBX の各ファイルは、いくつかのディレクトリで提供されます。
USBX コア
USBX デバイススタック
USBX ホストスタック
USBX デバイス コントローラ
USBX ホスト コントローラ
USBX ネットワーク
USBX の例
Windows ホストファイル
USBX OTG
USBX デバイス
クラス
USBX ホストクラス
各ファイルを名前で識別できるように、以下の表記法を採用しています。
ファイル接尾名 ファイルの説明 ux_host_stack USBX ホストスタックのコアファイル ux_host_class USBX ホストスタックのクラスファイル ux_hcd USBX ホストスタックのコントローラドライバファイル ux_device_stack USBX デバイススタックのコアファイル ux_device_class USBX デバイススタックのクラスファイル ux_dcd USBX デバイススタックのコントローラドライバファイル ux_otg USBX OTG コントローラドライバ関連ファイル ux_pictbridge USBX ピクトブリッジファイル ux_utility USBX ユーティリティファンクション demo_usbx USBX のデモファイル
USBX リソースの初期化 USBX は、自身のメモリマネージャを備えています。先に USBX にメモリを割り当てておかないと、
USBX のホスト側やデバイス側を初期化することができません。メモリキャッシュが可能なシステム
にも、USBX メモリマネージャは対応します。
次のファンクションは、USBX メモリリソースを 128K の正規メモリで、かつキャッシュセーフメモリ用
プールを別途に設けずに初期化します。
/* Initialize USBX Memory */ ux_system_initialize(memory_pointer,(128*1024),UX_NULL,0);
ux_system_initialize のプロトタイプは次の通りです。
UINT ux_system_initialize(VOID *regular_memory_pool_start, ULONG regular_memory_size, VOID *cache_safe_memory_pool_start, ULONG cache_safe_memory_size)
入力パラメータ:
VOID *regular_memory_pool_start 正規メモリプールの先頭 ULONG regular_memory_size 正規メモリプールのサイズ VOID *cache_safe_memory_pool_start キャッシュセーフメモリプールの先頭 ULONG cache_safe_memory_size キャッシュセーフメモリプールのサイズ
すべてのシステムでキャッシュセーフメモリの定義が必要なわけではありません。そのようなシステ
ムでは、メモリポインタの初期化時に渡される値はUX_NULLに、プールの値は0にそれぞれ設定さ
れます。その場合、USBX はキャッシュセーフメモリに代えて正規メモリプールを使用します。
正規メモリがキャッシュセーフではなく、またコントローラが DMA メモリを実行する必要がある場合
(OHCI、EHCI などのコントローラの場合)、キャッシュセーフメモリにメモリプールを定義することが
必要です。
USB ホストコントローラの定義 USBX がホストモードで動作するためには、USB ホストコントローラを 1 つ以上定義する必要があり
ます。この定義は、アプリケーション初期化ファイルに記述します。下の例では、OHCI USB デバイ
スコントローラを指しています。EHCI などその他のコントローラでは、そのコントローラの名前とファ
ンクションエントリ定義を適宜変更しなければなりません。
次の行は、OHCI コントローラの定義を実行します。
ux_host_stack_hcd_register("ux_hcd_ohci", ux_hcd_ohci_initialize, 0xd0000, 0x0a);
ux_host_stack_hcd_register のプロトタイプは次の通りです。
UINT_ux_host_stack_hcd_register(CHAR_PTR hcd_name, UINT (*hcd_initialize_function)(struct UX_HCD_STRUCT *), ULONG hcd_param1, ULONG hcd_param2);
ux_host_stack_hcd_register ファンクションは次のパラメータを使用します。
hcd_name: コントローラ名のストリング hcd_initialize_function: コントローラの初期化ファンクション hcd_param1: 通常は、コントローラで使用する IO 値またはメモリ hcd_param2: 通常は、コントローラで使用する IRQ
前の例では次のようになります。
ux_hcd_ohci が OHCI コントローラの名前、ux_hcd_ohci_initialize が OHCI コントロー
ラの初期化ルーチン、0xd0000 が OHCI コントローラレジスタがメモリ上で可視となって
いるアドレス、そして 0x0a が OHCI で使用する IRQ です。
USBX では、現在、以下のコントローラをサポートしています。他のコントローラのサポートも予定さ
れています。
ホストコントローラ名 商標およびプロセッサ(参考)
EHCI Generic 2.0 USB ホストコントローラ
OHCI Generic 1.1 USB ホストコントローラ
ISP1161 NXP 1.1 組み込み離散ホストコントローラ
ISP1362 NXP 2.0 組み込み離散ホストコントローラ
PIC32 Microchip 組み込み 1.1 ホストコントローラ RX Renesas RX62 組み込みホストコントローラ SH2A Renesas SH2A ベースの組み込みホストコントローラ
STM32 ST Micro STM32 F1/F2/F4 組み込みホストコントローラ MUSB Mentor ジェネリックホストコントローラ
以下は、1つのOHCIコントローラといくつかのクラスを用いて、USBXをホストモードで初期化すると
きの例です。
UINT status; /* Initialize USBX.*/ ux_system_initialize(memory_ptr, (128*1024),0,0); /* The code below is required for installing the USBX host stack.*/ status = ux_host_stack_initialize(UX_NULL); /* If status equals UX_SUCCESS, host stack has been initialized.*/ /* Register all the host classes for this USBX implementation.*/ status = ux_host_class_register("ux_host_class_hub",
ux_host_class_hub_entry); /* If status equals UX_SUCCESS, host class has been registered.*/ status = ux_host_class_register("ux_host_class_storage",
ux_host_class_storage_entry); /* If status equals UX_SUCCESS, host class has been registered.*/ status = ux_host_class_register("ux_host_class_printer",
ux_host_class_printer_entry); /* If status equals UX_SUCCESS, host class has been registered.*/ status = ux_host_class_register("ux_host_class_audio",
ux_host_class_audio_entry); /* If status equals UX_SUCCESS, host class has been registered.*/ /* Register all the USB host controllers available in this system.*/ status = ux_host_stack_hcd_register("ux_hcd_ohci",
ux_hcd_ohci_initialize, 0x300000, 0x0a);
/* If status equals UX_SUCCESS, USB host controllers have been registered.*/
ホストクラスの定義 1 つ以上のホストクラスを USBX で定義する必要があります。USB スタックで USB デバイスをコン
フィギュレーションした後にUSBデバイスを駆動するためにUSBクラスが必要になります。USBクラ
スは USB デバイスに特化しています。
USB デバイス記述子に含まれるインタフェース数に応じ、1 つの USB デバイスを駆動するために 1つまたは複数のクラスが必要になることがあります。
以下は、HUB クラスの登録例です。
status = ux_host_stack_class_register("ux_host_class_hub", ux_host_class_hub_entry);
ux_host_class_register のプロトタイプは次の通りです。
UINT ux_host_staack_class_register(CHAR_PTR class_name, UINT (*class_entry_address) (struct UX_HOST_CLASS_COMMAND_STRUCT *))
class_name はクラス名、class_entry_address はクラスのエンドポイントです。
HUB クラスの初期化例において: ux_host_class_hub はハブの名前です。
ux_host_class_hub_entry は HUB クラスのエンドポイントです。
トラブルシューティング USBX には、デモファイルとシミュレーション環境が付属しています。最初に、ターゲットハードウェア
または特定のデモプラットフォームでデモプラットフォームを実行してみるのがよいでしょう。
デモシステムが機能しない場合、以下の方法で問題を絞り込んでください。
USBX バージョン ID USBX の現在のバージョンは、実行時にユーザからもアプリケーションソフトウェアからも確認できま
す。
プログラマは、usbx.txt ファイルを調べて USBバージョンを取得できます。このファイルには、対応す
るポートのバージョン履歴も記載されています。アプリケーションソフトウェアでは、ux_port.h に定義
されているグローバルストリング_ux_version_id を調べて USBX バージョンを取得できます。
第 3 章 USBX ホストスタックのファンクション コンポーネント
この章では、USBX の高性能埋め込み USB ホストスタックについて、ファンクションの観点から説明
します。
実行概要 USBX は、次のコンポーネントから構成されます。
初期化 アプリケーションインタフェースコール ルートハブ ハブクラス ホストクラス USB ホストスタック ホストコントローラ
USBX ホストスタックを下の図に示します。
キーボード クライアント
マウスク ライアント
リモート
コントロール クライアント
ハブクラス
アイソクロナス クラス
非同期クラス
HID クラス
USB スタック
OHCI EHCI
ソフトウェア スケジューラ
コントローラドライバ
初期化 USBXをアクティブ化するには、ファンクションux_system_initializeをコールする必要があります。
このファンクションは USBX のメモリリソースを初期化します。
USBXホスト機能をアクティブ化するには、ファンクションux_host_stack_initializeをコールする必
要があります。ThreadXスレッド、ミューテックス、セマフォなど、USBXホストスタックで使用するすべ
てのリソースがこのファンクションで初期化されます。
1つ以上のUSBホストコントローラと 1つ以上のUSBクラスをアクティブ化するのは、アプリケーショ
ン初期化での処理になります。スタックにクラスが登録され、ホストコントローラ初期化ファンクション
がコールされたら、バスがアクティブになり、デバイス発見が開始できます。ホストコントローラのルー
トハブが、アタッチされているデバイスを検出した場合、USB トポロジを担当する USB 列挙スレッド
がウェイクアップし、デバイスの列挙処理に進みます。
ルートハブおよび下流ハブの性質上、ホストコントローラ初期化ファンクションが返ったときに、アタッ
チされているすべての USB デバイスがまだ完全にコンフィギュレーションされていない可能性があり
ます。USBハブの列挙に際し、特にルートハブと USBデバイスの間に 1つ以上のハブがある場合、
すべてが列挙されるまでに数秒かかることがあります。
アプリケーションインタフェースコール USBX の API には、次の 2 つのレベルがあります。
USB ホストスタック API USB ホストクラス API
通常、USBXアプリケーションではどのUSBホストスタックAPIもコールする必要がありません。ほと
んどのアプリケーションは、USB クラス API にのみアクセスします。
USB ホストスタック API ホストスタックAPIは、USBXコンポーネント(ホストクラスとホストコントローラ)の登録、デバイスのコ
ンフィギュレーション、および使用可能なデバイスエンドポイントの転送要求を担当します。
USB ホストクラス API クラス APIは、USBクラスごとに特化しています。USBクラス用の一般的な APIのほとんどは、デバ
イスのオープン/クローズ、デバイスとの読み書きなどのサービスを提供します。
ルートハブ ホストコントローラの各インスタンスには、1つ以上の USB ルートハブがあります。ルートハブの数は、
コントローラの性質によって決まるか、またはコントローラから特定のレジスタを読み出すことで取得
できます。
ハブクラス ハブクラスは、USB ハブの駆動を担当します。USB ハブは、スタンドアロンハブのほか、キーボード、
モニタなど複合デバイスの一部とすることも可能です。ハブには、自己電力形とバス電力形がありま
す。バス電力ハブでは、最大 4 つまでの下流ポートを搭載でき、また使用電力が 100mA 未満の自
己電力またはバス電力のデバイスのみが接続可能です。各ハブのカスケード化が可能です。最大 5つのハブを相互に接続できます。
USB ホストスタック USB ホストスタックは、USBX の中核部分です。次の 3 つの主要機能を持ちます。
• USB のトポロジの管理 • 1 つ以上のクラスへの USB デバイスのバインド • デバイス記述子問い合わせと USB 転送を実行するための、API をクラスに提供
トポロジマネージャ 新しいデバイスが接続されるまたはデバイスの接続が外されると、USB スタックトポロジスレッドが
ウェイクアップされます。ルートハブでも正規ハブでも、デバイスの接続を受け付けることができます。
USB にデバイスが接続されると、トポロジマネージャがデバイス記述子を取得します。この記述子に
は、そのデバイスで可能なコンフィギュレーションの数が示されています。ほとんどのデバイスは、1つのコンフィギュレーションのみを備えています。接続先ポートでの使用可能電力に従って、異なる
動作が可能なデバイスもあります。そのようなデバイスには、使用可能電力に応じて複数のコンフィ
ギュレーションがあり、選択できるようにしてあります。トポロジマネージャによりコンフィギュレーショ
ンされたデバイスには、コンフィギュレーション記述子に指定されている電力が供給できるようになり
ます。
USB クラスのバインド デバイスがコンフィギュレーションされたらトポロジマネージャは、クラスマネージャがデバイスインタ
フェース記述子を見ながらデバイス発見を続行するようにさせます。各デバイスには 1 つ以上のイン
タフェース記述子を持つことができます。
インタフェースとは、デバイスに含まれるファンクションです。例えば、USB スピーカには、オーディオ
ストリーミング用、オーディオコントロール用、各種スピーカボタンの管理用のインタフェースが各 1個、
合計 3 個のインタフェースがあります。
クラスマネージャには、デバイスインタフェースを 1 つ以上のクラスに結合するメカニズムが 2 つあり
ます。すなわち、インタフェース記述子に含まれている PID/VID(製品 ID とベンダ ID)の組み合わせ
を使用するメカニズムと、クラス/サブクラス/プロトコルの組合せを使用するメカニズムがありま
す。
PID/VID の組み合わせは、ジェネリッククラスによる駆動ができないインタフェースに対して有効です。
クラス/サブクラス/プロトコルの組合せは、USB-IF認定のクラス(プリンタ、ハブ、ストレージ、オー
ディオ、HID など)に属するインタフェースで使用されます。
クラスマネージャには、USBX の初期化で登録されたクラスのリストがあります。クラスマネージャは、
クラスを 1 つずつコールしていき、そのデバイスのインタフェースの管理をいずれかのクラスが引き
受けるようになるまでコールを続けます。1 つのクラスでは 1 つのインタフェースのみを管理できます。
USB オーディオスピーカの例では、インタフェースの各々に対してクラスマネージャがすべてのクラ
スをコールします。
あるクラスがインタフェースを引き受けたら、そのクラスの新しいインスタンスが作成されます。次にク
ラスマネージャは、そのインタフェースのデフォルトの代替設定を探します。各デバイスでは、個々の
インタフェースごとに 1 つ以上の代替設定を設けることができます。クラスで他の代替設定への変更
が決定されるまでは、デフォルトの代替設定 0 が使用されます。
デフォルトの代替設定時には、クラスマネージャは代替設定に含まれるすべてのエンドポイントをマ
ウントします。各エンドポイントのマウントに成功すると、クラスマネージャは最後にそのクラスに返り、
インタフェースの初期化が完成します。
USBX API USB スタックから、一定数の API がエクスポートされます。これらは、USB クラスがデバイスでの問
い合わせおよび特定のエンドポイントでの USB 転送を実行するための API です。これら API につい
ては、リフェレンスマニュアルに詳述されています。
ホストコントローラ ホストコントローラドライバは、特定の種類のUSBコントローラを駆動する任にあたります。USBホス
トコントローラは複数のコントローラを内蔵できます。例えば、ある種のインテル PC チップセットは 2つの UHCIコントローラを搭載しています。また、一部の USB 2.0コントローラには、EHCIコントロー
ラのインスタンス 1 つに加え、OHCI コントローラのインスタンスを複数搭載しているものがあります。
ホストコントローラでは、同一のコントローラのみの複数のインスタンスを管理します。ほとんどの
USB 2.0ホストコントローラを駆動するためには、USBX の初期化時に OCHI コントローラと EHCI コントローラの両方を初期化することが必要になります。
ホストコントローラは、以下のものを管理の対象とします。
ルートハブ Power Management Endpoints Transfers
ルートハブ ルートハブ管理では、各コントローラポートに電源を投入し、挿入されているデバイスがあるかどうか
を判定します。この機能を USBX ジェネリックルートハブが使用し、コントローラの下流ポートに問い
合わせを行います。
電力管理 電力管理処理は、中断/再開信号を扱うための機能です。ギャングモードにしてコントローラのすべ
ての下流ポートに同時に影響するようにするか、または(コントローラ側で対応している場合は)各
ポートに対して個別に使用します。
エンドポイント エンドポイント管理では、コントローラへの物理エンドポイントを作成または破壊することができます。
物理エンドポイントとはメモリエンティティのことで、マスターDMA をサポートするコントローラで解析
される場合と、コントローラに書き込まれている場合があります。物理エンドポイントには、コントロー
ラにより実行されるトランザクション情報が含まれています。
転送 転送管理とは、作成した各エンドポイントでクラスがトランザクションを実行するためのものです。各
論理エンドポイントには、USB転送要求用のTRANSFER REQUESTというコンポーネントが含まれ
ています。TRANSFER REQUEST は、トランザクションを記述するためにスタックで使用されます。
この TRANSFER REQUEST がスタックとコントローラに渡され、コントローラではその能力に応じて
いくつかのサブトランザクションに分割することができます。
USB デバイスのフレームワーク USB デバイスは、記述子のツリーで表されます。記述子は次の 6 種類に大別されます。
デバイス記述子 コンフィギュレーション記述子 インタフェース記述子 エンドポイント記述子 ストリング記述子 ファンクショナル記述子
USB デバイスは、ごく簡潔に記述することが可能で、その場合は次のようになります。
上の図では、デバイスに含まれるコンフィギュレーションは 1 つだけです。このコンフィギュレーション
に 1 つのインタフェースがアタッチされています。すなわち、このデバイスではファンクションが 1 つだ
け、エンドポイントも 1 つだけです。デバイス記述子にストリング記述子をアタッチして、デバイスの識
別を可視化しています。
デバイス 記述子
ストリング 記述子
コンフィギュレーション 記述子
インタフェース 記述子
エンドポイント 記述子
逆に、もっと複雑なデバイスも可能で、その場合は次のようになります。
上の図では、デバイス記述子にコンフィギュレーション記述子が 2 つアタッチされています。このデバ
イスでは、電力モードが 2つある場合や、標準クラスや各社独自のクラスで駆動される場合などがあ
ります。
最初のコンフィギュレーションには 2 つのインタフェースがアタッチされている、すなわち 2 つの論理
ファンクションを持っています。最初のファンクションには、エンドポイント記述子が 3 つ、ファンクショ
ナル記述子が 1 つあります。ファンクショナル記述子は、例えばインタフェースの駆動を担うクラスが
使用し、このインタフェースに関してジェネリック記述子には含まれていないような追加情報を取得し
たりします。
デバイス記述子 ストリング記述子
コンフィギュレーション 記述子
コンフィギュレーション 記述子
インタフェース 記述子
インタフェース 記述子
インタフェース 記述子
エンドポイント 記述子
エンドポイント 記述子
エンドポイント 記述子
エンドポイント 記述子
エンドポイント 記述子
エンドポイント 記述子
エンドポイント 記述子
ファンクショナル 記述子
ファンクショナル 記述子
ファンクショナル 記述子
デバイス記述子 各 USB デバイスには、デバイス記述子が 1 つあります。この記述子には、デバイス識別子、サポー
トしているコンフィギュレーションの数、およびデバイスのコンフィギュレーションに使用するデフォルト
の制御エンドポイントの特性が記述されます。
オフ セット フィールド サイズ 値 説明
0 BLength 1 数値 この記述子のサイズ(単位、バイト) 1 bDescriptorType 1 定数 デバイス記述子の型 2 bcdUSB 2 BCD USB 仕様リリース番号(2 進化 10 進数)
例例: 2.10は 0x210と等しい。このフィールドには、デバ
イスとその記述子が準拠する USB 仕様のリリース番号
を示します。 4 bDeviceClass 1 クラス クラスコード(USB-IF により割り当てられる)。
このフィールドを 0 にリセットすると、コンフィギュレーショ
ン内の各インタフェースが自身のクラス情報を指定し、
それぞれのインタフェースが独立して動作します。 このフィールドを 1~0xFE の値に設定すると、デバイス
はインタフェースごとに異なるクラス仕様をサポートする
ことになり、各インタフェースは独立して動作しない場合
があります。この値は、インタフェースの集合に使用され
るクラス定義を特定します。 このフィールドを 0xFFに設定すると、ベンダ固有のデバ
イスクラスになります。 5 bDeviceSubClass 1 サブクラス サブクラスコード(USB-IF により割り当てられる)。
これらのコードはbDeviceClassフィールドの値に修飾さ
れます。bDeviceClass フィールドが 0 にリセットされた
場合は、このフィールドも 0 にリセットする必要がありま
す。bDeviceClass フィールドが 0xFF に設定されない場
合、すべての値が USB による割り当て用に予約されま
す。 6 bDeviceProtocol 1 プロトコル プロトコルコード(USB-IF により割り当てられる)。
こ れ ら の コ ー ド は bDeviceClass フ ィ ー ル ド と
bDeviceSubClass フィールドの値に修飾されます。イン
タフェースベースではなくクラスベースのクラス固有プロ
トコルをサポートするデバイスでは、デバイスが使用す
るプロトコルを、デバイスクラスの仕様の定義に従ってこ
のコードで識別します。このフィールドを 0 にリセットする
と、デバイスはクラス固有プロトコルをデバイスベースで
使用しません。 ただし、インタフェースベースでクラス固有プロトコルを
使用することはできます。 このフィールドを 0xFF に設定すると、デバイスはベンダ
固有プロトコルをデバイスベースで使用します。 7 bMaxPacketSize0 1 数値 エンドポイント 0 の最大パケットサイズ(バイトサイズ 8、
16、32、または 64 のみが有効) 8 idVendor 2 ID ベンダ ID(USB-IF により割り当てられる)
10 idProduct 2 ID 製品 ID(メーカーにより割り当てられる) 12 bcdDevice 2 BCD デバイスリリース番号(2 進化 10 進数) 14 iManufacturer 1 インデックス メーカーを記述するストリング記述子のインデックス 15 iProduct 1 インデックス 製品を記述するストリング記述子のインデックス 16 iSerialNumber 1 インデックス デバイスのシリアル番号を記述するストリング記述子の
インデックス 17 bNumConfiguration
s 1 数値 可能なコンフィギュレーションの数
USBX では、USB デバイス記述子を次のように定義します。
typedef struct UX_DEVICE_DESCRIPTOR_STRUCT {
UINT bLength; UINT bDescriptorType; USHORT bcdUSB; UINT bDeviceClass; UINT bDeviceSubClass; UINT bDeviceProtocol; UINT bMaxPacketSize0; USHORT idVendor; USHORT idProduct; USHORT bcdDevice; UINT iManufacturer; UINT iProduct; UINT iSerialNumber; UINT bNumConfigurations;
} UX_DEVICE_DESCRIPTOR;
USB デバイス記述子は、以下のデバイスコンテナの一部となっています。
typedef struct UX_DEVICE_STRUCT {
ULONG ux_device_handle; ULONG ux_device_type; ULONG ux_device_state; ULONG ux_device_address; ULONG ux_device_speed; ULONG ux_device_port_location; ULONG ux_device_max_power; ULONG ux_device_power_source; UINT ux_device_current_configuration; TX_SEMAPHORE ux_device_protection_semaphore; struct UX_DEVICE_STRUCT *ux_device_parent; struct UX_HOST_CLASS_STRUCT *ux_device_class; VOID *ux_device_class_instance; struct UX_HCD_STRUCT *ux_device_hcd; struct UX_CONFIGURATION_STRUCT *ux_device_first_configuration; struct UX_DEVICE_STRUCT *ux_device_next_device; struct UX_DEVICE_DESCRIPTOR_STRUCT ux_device_descriptor;
struct UX_ENDPOINT_STRUCT ux_device_control_endpoint; struct UX_HUB_TT_STRUCT ux_device_hub_tt[UX_MAX_TT];
} UX_DEVICE;
変数名 変数の説明 ux_device_handle デバイスのハンドル。通常は、デバイスのこの構造のイン
スタンスのアドレスです。 ux_device_type 廃止された値。不使用。 ux_device_state デバイスステート。次のいずれかの値を設定できます。
UX_DEVICE_RESET 0 UX_DEVICE_ATTACHED 1 UX_DEVICE_ADDRESSED 2 UX_DEVICE_CONFIGURED 3 UX_DEVICE_SUSPENDED 4 UX_DEVICE_RESUMED 5 UX_DEVICE_SELF_POWERED_STATE 6 UX_DEVICE_SELF_POWERED_STATE 7 UX_DEVICE_REMOTE_WAKEUP 8 UX_DEVICE_BUS_RESET_COMPLETED 9 UX_DEVICE_REMOVED 10 UX_DEVICE_FORCE_DISCONNECT 11
ux_device_address SET_ADDRESS コマンドが受け付けられた後のデバイス
のアドレス(1~127)。 ux_device_speed デバイスの速度。
UX_LOW_SPEED_DEVICE 0 UX_FULL_SPEED_DEVICE 1 UX_HIGH_SPEED_DEVICE 2
ux_device_port_location 親デバイス(ルートハブまたはハブ)のポートのインデック
ス。 ux_device_max_power 選択されたコンフィギュレーションにおいてデバイスに取り
込める最大電力(単位、mA)。 ux_device_power_source 次の 2 つのいずれかの値が可能です。
UX_DEVICE_BUS_POWERED 1 UX_DEVICE_SELF_POWERED 2
ux_device_current_configuration このデバイスで現在使用しているコンフィギュレーションの
インデックス。 ux_device_parent このデバイスの親のデバイスコンテナポインタ。ポインタが
NULL なら、コントローラのルートハブが親です。
ux_device_class このデバイスを所有するクラス型へのポインタ。 ux_device_class_instance このデバイスを所有するクラスのインスタンスへのポイン
タ。 ux_device_hcd このデバイスがアタッチされる USB ホストコントローライン
スタンス。 ux_device_first_configuration このデバイスの 1 番目のコンフィギュレーションコンテナへ
のポインタ。 ux_device_next_device USBX により検出されるいずれかのバスにあるデバイス
のうち、デバイスリストに含まれる次のデバイスへのポイ
ンタ。 ux_device_descriptor USB device descriptor. ux_device_control_endpoint このデバイスで使用するデフォルトの制御エンドポイントの
記述子。 ux_device_hub_tt デバイスのハブ TT の配列。
コンフィギュレーション記述子 コンフィギュレーション記述子には、特定のデバイスコンフィギュレーションに関する情報を記述しま
す。USB デバイスには、1 つ以上のコンフィギュレーション記述子を含めることができます。デバイス
記述子の bNumConfigurations フィールドに、コンフィギュレーション記述子の数が示されます。コン
フィギュレーション記述子のbConfigurationValueフィールドの値は、それがSet Configuration要求
へのパラメータとして使用された場合、その値に対応するコンフィギュレーションをデバイスが取るよ
うになります。
コンフィギュレーション記述子には、コンフィギュレーションで提供されるインタフェースの数を記述し
ます。各インタフェースは、デバイス内での論理ファンクションを表すもので、それぞれ独立して動作
することが可能です。例えば USBオーディオスピーカでは、オーディオストリーミングインタフェース、
オーディオコントロールインタフェース、各種スピーカボタンの管理用のHIDインタフェースが各1個、
合計 3 個のインタフェースを設けることができます。
ホストがコンフィギュレーション記述子に対して GET_DESCRIPTOR 要求を発行すると、関連するイ
ンタフェース記述子とエンドポイント記述子がすべて返されます。
オフセット フィールド サイズ 値 説明 0 bLength 1 数値 この記述子のサイズ(単位、バイト) 1 bDescriptorType 1 定数 コンフィギュレーション 2 wTotalLength 2 数値 このコンフィギュレーションに対して返される
データの合計長さ。このコンフィギュレーション
に対して返されるすべての記述子(コンフィギュ
レーション、インタフェース、エンドポイント、お
よびクラス固有またはベンダ固有)を組合わせ
た長さが含まれます。 4 bNumInterfaces 1 数値 このコンフィギュレーションでサポートされるイ
ンタフェースの合計数。 5 bConfigurationValue 1 数値 このコンフィギュレーションを選択するために
Set Configuration の引数として使用する値。 6 iConfiguration 1 インデックス このコンフィギュレーションを記述するストリン
グ記述子のインデックス。 7 bMAttributes 1 ビットマップ コンフィギュレーション特性 D7 バス電力
D6 自己電力 D5 リモートウェイクアップ D4..0 予約済み(0 にリセット) バスからの電力およびローカル電源を使用す
るデバイスコンフィギュレーションでは、D7 と
D6 の両方をセットします。実行時の実際の電
源は、Get Status デバイス要求を使用して決
定することも可能です。 デバイスコンフィギュレーションがリモートウェイ
クアップをサポートする場合は、D5 を 1 に設定
します。 8 MaxPower 1 mA デバイスが完全に機能するときに、このコン
フィギュレーションにおいてバスから供給される
電力に対する USBデバイスの最大消費電力。 2mA 単位で表します(例: 50 = 100mA)。 注: コンフィギュレーションがバス電力か自己電
力かは、デバイスコンフィギュレーションで報告
します。 デバイスは現在自己電力で動作しているかど
うかは、デバイスステータスで報告します。デ
バイスの外部電源から接続が切断したときは、
デバイスがデバイスステータスを更新し、自己
電力ではなくなっていることを示します。
USBX では USB コンフィギュレーション記述子を次のように定義します。
typedef struct UX_CONFIGURATION_DESCRIPTOR_STRUCT {
UINT bLength; UINT bDescriptorType; USHORT wTotalLength; UINT bNumInterfaces; UINT bConfigurationValue; UINT iConfiguration; UINT bmAttributes; UINT MaxPower;
} UX_CONFIGURATION_DESCRIPTOR;
USB コンフィギュレーション記述子は、以下のコンフィギュレーションコンテナの一部となっています。
typedef struct UX_CONFIGURATION_STRUCT {
ULONG ux_configuration_handle; ULONG ux_configuration_state; struct UX_CONFIGURATION_DESCRIPTOR_STRUCT ux_configuration_descriptor; struct UX_INTERFACE_STRUCT *ux_configuration_first_interface; struct UX_CONFIGURATION_STRUCT *ux_configuration_next_configuration; struct UX_DEVICE_STRUCT *ux_configuration_device;
} UX_CONFIGURATION;
変数名 変数の説明 ux_configuration_handle コンフィギュレーションのハンドル。通常は、コンフィギュ
レーションのこの構造のインスタンスのアドレスです。 ux_configuration_state コンフィギュレーションのステート ux_configuration_descriptor USB device descriptor. ux_configuration_first_interface このコンフィギュレーションの 1 番目のインタフェースへの
ポインタ ux_configuration_next_configuration 同じデバイスの次のコンフィギュレーションへのポインタ ux_configuration_device このコンフィギュレーションのデバイス所有者へのポインタ
インタフェース記述子 インタフェース記述子には、コンフィギュレーション内の特定のインタフェースについて記述します。イ
ンタフェースとは、USBデバイス内の論理ファンクションです。コンフィギュレーションには 1つ以上の
インタフェースを備えています。各インタフェースには、コンフィギュレーションに含まれるエンドポイン
トの一意のセットを記述する、エンドポイント記述子が 0 個以上含まれます。2 つ以上のインタフェー
スをサポートするコンフィギュレーションでは、指定されたコンフィギュレーションについて
GET_DESCRIPTOR 要求から返されるデータに含まれるインタフェース記述子に、各インタフェース
のエンドポイント記述子が従います。
インタフェース記述子は、必ずコンフィギュレーション記述子の一部として返されます。
GET_DESCRIPTOR 要求からインタフェース記述子に直接アクセスすることはできません。
デバイスをコンフィギュレーションした後にエンドポイントやその特性を変更できるように、代替設定を
インタフェースに含めることができます。インタフェースのデフォルト設定では、常に代替設定が 0 で
す。現在の代替設定をクラスから変更することで、インタフェースの挙動および関連するエンドポイン
トの特性を変更することができます。代替設定の選択やデフォルト設定への復帰には、
SET_INTERFACE 要求を使用します。
代替設定を使用することで、他のインタフェースを作動させたままでデバイスのコンフィギュレーショ
ンを一部変更することができます。1 つまたは複数のインタフェースに対して代替設定を備えている
コンフィギュレーションでは、別のインタフェース記述子とその関連エンドポイントが代替設定ごとに
含まれます。
2 つの代替設定を持つ 1 つのインタフェースを記述したデバイスコンフィギュレーションの場合、この
コンフィギュレーションに GET_DESCRIPTOR 要求を発行すると、コンフィギュレーション記述子が
返され、 次に bInterfaceNumber フィールドと bAlternateSetting フィールドが共に 0 に設定されたイ
ンタフェース記述子が返され、その次にその設定のエンドポイント記述子が返されます。その後に、
もう 1 つのインタフェース記述子およびそれに関連するエンドポイント記述子が返されてきます。2 番
目のインタフェース記述子では、bInterfaceNumber フィールドは 0 に設定されていますが、
bAlternateSetting フィールドは 1 に設定されています。つまり、この代替設定は 1 番目のインタ
フェースに属するものです。
関連するエンドポイントを持たないインタフェースもありますが、その場合は、デフォルトの制御エンド
ポイントのみが有効なインターフェイスとなっています。
代替設定は主に、インタフェースに関連する周期的エンドポイントへの要求帯域幅を変更するために
使用されます。例えば USB スピーカのストリーミングインタフェースの場合、1 番目の代替設定には、
アイソクロナスエンドポイントでの帯域幅需要として 0 を設定します。その他の代替設定では、オー
ディオストリーミング周波数に応じて異なる帯域幅要件が選択できます。
インタフェースの USB 記述子は次のようになっています。
オフ セット
フィールド サイズ 値 記述子
0 bLength 1 数値 この記述子のサイズ(単位、バイト) 1 bDescriptorType 1 定数 インタフェース記述子の型 2 bInterfaceNumber 1 数値 インタフェースの番号。このコンフィギュレーションで
サポートされる並列インタフェースの配列内のイン
デックスを示す、ゼロベースの値。 3 bAltenateSetting 1 数値 前のフィールドで示したインタフェースに対する代替
設定を選択するための値。 4 bNumEndpoints 1 数値 この値を 0 に設定すると、このインタフェースはエ
ンドポイント 0 のみを使用します。
5 bInterfaceClass 1 クラス クラスコード(USB により割り当てられる)。 この値を 0にリセットすると、インタフェースは
USB 指定のどのデバイスクラスにも属さなく
なります。 このフィールドを 0xFF に設定すると、インタ
フェースクラスはベンダ固有になります。 その他の値はすべて、USB による割り当て
用に予約されています。 6 bInterfaceSubClas
s 1 サブクラス サブクラスコード(USB により割り当てられ
る)。 これらのコードは bInterfaceClass フィールド
の値に修飾されます。bInterfaceClassフィー
ルドが 0 にリセットされた場合は、このフィー
ルドも 0 にリセットする必要があります。
bInterfaceClass フィールドが 0xFF に設定さ
れない場合、すべての値が USB による割り
当て用に予約されます。 7 bInterfaceProtocol 1 プロトコル プロトコルコード(USB により割り当てられ
る)。これらのコードはbInterfaceClassフィー
ルドと bInterfaceSubClass フィールドの値に
修飾されます。クラス固有要求をインタフェー
スでサポートする場合、デバイスクラスの仕
様に従ってデバイスが使用するプロトコル
を、このコードで特定します。 このフィールドを 0 にリセットすると、デバイス
はこのインタフェースにクラス固有プロトコル
を使用しません。このフィールドを 0xFF に設
定すると、デバイスはこのインタフェースにベ
ンダ固有プロトコルを使用します。 8 iInterface 1 インデックス このインタフェースを記述するストリング記述
子のインデックス。
USBX では、USB インタフェース記述子を次のように定義します。
typedef struct UX_INTERFACE_DESCRIPTOR_STRUCT {
UINT bLength; UINT bDescriptorType; UINT bInterfaceNumber; UINT bAlternateSetting; UINT bNumEndpoints; UINT bInterfaceClass; UINT bInterfaceSubClass; UINT bInterfaceProtocol; UINT iInterface;
} UX_INTERFACE_DESCRIPTOR;
USB インタフェース記述子は、以下のインタフェースコンテナの一部となっています。
typedef struct UX_INTERFACE_STRUCT {
ULONG ux_interface_handle; ULONG ux_interface_state; ULONG ux_interface_current_alternate_setting; struct UX_INTERFACE_DESCRIPTOR_STRUCT ux_interface_descriptor; struct UX_HOST_CLASS_STRUCT *ux_interface_class; VOID *ux_interface_class_instance; struct UX_ENDPOINT_STRUCT *ux_interface_first_endpoint; struct UX_INTERFACE_STRUCT *ux_interface_next_interface; struct UX_CONFIGURATION_STRUCT *ux_interface_configuration;
} UX_INTERFACE;
変数名 変数の説明 ux_interface_handle インタフェースのハンドル。通常は、インタフェースのこの構造
のインスタンスのアドレスです。 ux_interface_state インタフェースのステート ux_interface_descriptor USB インタフェース記述子 ux_interface_class このインタフェースを所有するクラス型へのポインタ ux_interface_class_instance このインタフェースを所有するクラスのインスタンスへのポイン
タ ux_interface_first_endpoint このインタフェースで登録される 1 番目のエンドポイントへのポ
インタ ux_interface_next_interface このコンフィギュレーションに関連する次のインタフェースへの
ポインタ ux_interface_configuration このインタフェースのコンフィギュレーション所有者へのポインタ
エンドポイント記述子 インタフェースに関連するエンドポイントには、それぞれ自身のエンドポイント記述子があります。こ
の記述子には、各エンドポイントに関し、その帯域幅要件、関連する最大ペイロード、周期性、およ
び方向を、それぞれホストスタックで決定するのに必要な情報を記述します。エンドポイント記述子は
常に、コンフィギュレーションに対する GET_DESCRIPTOR コマンドによって返されます。
デバイス記述子に関連するデフォルトの制御エンドポイントは、インタフェースに関連するエンドポイ
ントの一部とはカウントされないため、この記述子では返されません。
インタフェースの代替設定の切り替えをホストソフトウェアが要求するときは、関連するすべてのエン
ドポイントとその USB リソースが新しい代替設定に従って修正されます。
デフォルトの制御エンドポイントを除き、エンドポイントをインタフェース間で共有することはできませ
ん。
オフセット フィールド サイズ 値 説明 0 bLength 1 数値 この記述子のサイズ(単位、バイト) 1 bDescriptorType 1 定数 エンドポイント記述子の型 2 bEndpointAddress 1 エンドポイント この記述子に記述されるUSBデバイス上のエンドポイ
ントのアドレス。アドレスは次のようにエンコードされま
す。 ビット 3~0: エンドポイント番号 ビット 6~4:予約(0 にリセット) ビット 7: 方向(制御エンドポイントの場合は無視) 0 = OUT エンドポイント 1 = IN エンドポイント
3 bmAttributes 1 ビットマップ このフィールドには、bConfigurationValue を用いてエ
ンドポイントをコンフィギュレーションするときの、エンド
ポイントの属性を記述します。 ビット 1~0: 転送の種類 00 = 制御 01 = アイソクロナス 10 = バルク 11 = インタラプト アイソクロナスエンドポイントでない場合は、ビット 5~2 は予約されていて、0 に設定する必要があります。ア
イソクロナスの場合は、次のように定義されます。 ビット 3~2:同期の種類 00 = 同期なし 01 = 非同期 10 = 適応 11 = 同期 ビット 5~4:使用法の種類 00 = データエンドポイント 01 = フィードバックエンドポイント 10 = インプリシット・フィードバックデータエンドポイント
4 wMaxPacketSize 2 数値 このコンフィギュレーションを選択したときにこのエンド
ポイントで送受信可能な最大パケットサイズ。 アイソクロナスエンドポイントの場合は、(マイクロ)フ
レームあたりのデータペイロードに必要となるバス時
間を、この値でスケジュールに予約します。パイプで実
際に使用される帯域幅(継続ベース)は、予約した帯
域幅より少ない場合があります。実際に使用した帯域
幅は、デバイスから通常の非 USB 定義のメカニズム
を介して必要に応じて報告されます。 すべてのエンドポイントについて、ビット 10~0 で最大
パケットサイズを指定します。
高速アイソクロナスおよびインタラプトのエンド
ポイントの場合は: ビット 12~11 では、マイクロフレームあたりの
追加トランザクション機会数を指定します。 00 = なし(1 トランザクション/マイクロフレー
ム) 01 = 1 additional (2 per microframe) 10 = 2 つ追加(3/マイクロフレーム) 11 = 予約
ビット 15~13は予約済みで、0に設定する必要があり
ます。 6 bInterval 1 数値 データ転送用にエンドポイントをポーリングする間
隔数値。 デバイスの動作速度に応じてフレーム数またはマ
イクロフレーム数で表します(1 ミリ秒または 125 マ
イクロ秒単位)。 全速/高速アイソクロナスエンドポイントでは、この
値を 1~16 の範囲に設定する必要があります。
bInterva 値は、2 x bInterval - 1 の値の指数として
使用されます。例えば、bInterval を 4 にすると、8 (24-1)の周期になります。 全速/低速インタラプトエンドポイントでは、この
フィールドの値は 1~255 が可能です。 高速インタラプトエンドポイントでは、bInterva 値は、2×bInterval - 1 の値の指数として使用されま
す。例えば、bIntervalを 4にすると、8 (24-1)の周期
になります。この値は 1~16 とします。 高速バルク/制御 OUT エンドポイントでは、
bInterval でエンドポイントの最大 NAK 率を指定する
必要があります。0 は、NAK が絶対に発生しないこと
を示します。その他の値では、bInterval×マイクロ秒
ごとに NAK 数が高々1 となります。 この値は 0~255 の範囲内である必要があります。
USBX では USB エンドポイント記述子を次のように定義します。
typedef struct UX_ENDPOINT_DESCRIPTOR_STRUCT {
UINT bLength; UINT bDescriptorType; UINT bEndpointAddress; UINT bmAttributes; USHORT wMaxPacketSize; UINT bInterval;
} UX_ENDPOINT_DESCRIPTOR;
USB エンドポイント記述子は、以下のエンドポイントコンテナの一部となっています。
typedef struct UX_ENDPOINT_STRUCT {
ULONG ux_endpoint_handle; ULONG ux_endpoint_state; VOID *ux_endpoint_ed; struct UX_ENDPOINT_DESCRIPTOR_STRUCT ux_endpoint_descriptor; struct UX_ENDPOINT_STRUCT *ux_endpoint_next_endpoint; struct UX_INTERFACE_STRUCT *ux_endpoint_interface; struct UX_DEVICE_STRUCT *ux_endpoint_device; struct UX_TRANSFER REQUEST_STRUCT ux_endpoint_transfer request;
} UX_ENDPOINT;
Variable Name 変数の説明 ux_endpoint_handle エンドポイントのハンドル。通常は、エンドポイントのこの構造の
インスタンスのアドレスです。 ux_endpoint_state エンドポイントのステート ux_endpoint_ed ホストコントローラレイヤでの物理エンドポイントへのポインタ ux_endpoint_descriptor USB エンドポイント記述子 ux_endpoint_next_endpoint 同じインタフェースに属する次のエンドポイントへのポインタ ux_endpoint_interface このエンドポイントインタフェースを所有するインタフェースへの
ポインタ ux_endpoint_device 親デバイスコンテナへのポインタ ux_endpoint_transfer request デバイスとの間でデータを送受信するための USB 転送要求
ストリング記述子 ストリング記述子はオプションです。デバイスでストリング記述子をサポートしていない場合は、デバ
イス記述子、コンフィギュレーション記述子、インタフェース記述子にそれぞれ含まれるストリング記
述子への参照は、すべて 0 にリセットする必要があります。
ストリング記述子では UNICODE エンコーディングを使用します。これにより、いくつかの文字セット
をサポートすることができます。USB デバイス内のストリングは、複数の言語のサポートが可能です。
ストリング記述子を要求するときにリクエスタは、USB-IF で定義されている言語を使用して目的の言
語を指定します。現在定義されている USB LANGID のリストを、USBX の附属書??に載せてありま
す。すべての言語に対してストリングインデックスをゼロにすると、デバイスでサポートしている 2バイ
トの LANGIDコードの配列を含むストリング記述子が返ります。なお、UNICODEストリングは 0では
終わりません。代わりに、記述子の先頭バイトに含まれる配列のサイズから 2 を差し引いてストリン
グ配列のサイズが計算されます。
USB ストリング記述子 0 は、次のようにエンコードされます。
オフセット フィールド サイズ 値 説明 0 bLength 1 N+2 この記述子のサイズ(単位、バイト) 1 bDescriptorType 1 定数 ストリング記述子の型。 2 wLANGID[0] 2 数値 LANGID コード 0 .. …] .. … … N wLANGID[n] 2 数値 LANGID コード n
その他の USB ストリング記述子は、次のようにエンコードされます。
オフセット フィールド サイズ 値 説明 0 bLength 1 数値 この記述子のサイズ(単位、バイト) 1 bDescriptorType 1 定数 ストリング記述子の型。 2 bString N 数値 UNICODE エンコードストリング
USBX では、非ゼロ長の USB ストリング記述子を次のように定義します。
typedef struct UX_STRING_DESCRIPTOR_STRUCT {
UINT bLength; UINT bDescriptorType; USHORT bString[1];
} UX_STRING_DESCRIPTOR;
ファンクショナル記述子 ファンクション記述子は、クラス固有記述子とも呼ばれます。この記述子は通常、ジェネリック記述子
と同じ基本構造を用い、追加の情報がクラスで使用できるようになります。例えば USB オーディオス
ピーカの場合では、オーディオクラスがクラス固有記述子を使用することで、サポートされるオーディ
オ周波数の種類を代替設定ごとに取得することができます。
メモリ内の USBX デバイス記述子フレームワーク USBX では、ほとんどのデバイス記述子、すなわちストリング記述子とファンクション記述子を除くす
べての記述子が、メモリに保持されます。次の図に、各記述子がどのように保存され、互いにどのよ
うに関係するかを示します。
デバイス
デバイス 記述子
コンフィギュレーション
コンフィギュレーション 述
デバイス コンテナ
デバイス 記述子
コンフィギュ レーション コンテナ
コンフィギュ レーション 記述子
インタフェース コンテナ
(代替設定 0)
インタフェース
インタフェース コンテナ
(代替設定 1)
インタフェース
述
インタフェース 記述子
エンドポイント コンテナ
エンドポイント コンテナ
エンドポイント コンテナ
エンドポイント コンテナ
エンドポイント 記述子
エンドポイント 記述子
エンドポイント 記述子
エンドポイント 記述子
デバイス コンテナ
コンフィギュ レーション コンテナ
デバイス 記述子
コンフィギュ レーション 記述子
インタフェース コンテナ
インタフェース 記述子
第 4 章 USBX ホストサービスの説明
ux_host_stack_initialize ホスト操作用に USBX を初期化
プロトタイプ
UINT ux_host_stack_initialize(UINT (*system_change_function) (ULONG, UX_HOST_CLASS *))
説明
USB ホストスタックを初期化するファンクションです。与えられたメモリ領域が USBX 内部で
の使用用にセットアップされます。UX_SUCCESSが返されたら、USBXはホストコントローラ
とクラスの登録が可能になります。
入力パラメータ
system_change_function アプリケーションにデバイスの変更を通知するため
のオプションのコールバックルーチンへのポインタ
返却値
UX_SUCCESS (0x00) 初期化成功。
Example
UINT status; /* Initialize USBX for host operation, without notification. */ status = ux_host_stack_initialize(UX_NULL); /* If status equals UX_SUCCESS, USBX has been successfully initialized for host operation.*/
ux_host_stack_endpoint_transfer_abort エンドポイントへの転送要求にアタッチされているすべてのトランザクションをアボート
プロトタイプ
UINT ux_host_stack_endpoint_transfer_abort(UX_ENDPOINT *endpoint)
説明
エンドポイントにアタッチされている特定の転送要求に関し、すべてのトランザクションを(アク
ティブか保留中かにかかわりなく)取り消すファンクションです。転送要求にコールバックファ
ンクションがアタッチされているときは、UX_TRANSACTION_ABORTED ステータスでコー
ルバックファンクションがコールされます。
入力パラメータ
endpoint エンドポイントへのポインタ
返却値
UX_SUCCESS (0x00) エラーなし。
UX_ENDPOINT_HANDLE_UNKNOWN (0x53) エンドポイントハンドルが無効で
す。
例
UX_HOST_CLASS_PRINTER *printer; UINT status; /* Get the instance for this class.*/ printer = (UX_HOST_CLASS_PRINTER *) command -> ux_host_class_command_instance; /* The printer is being shut down.*/ printer -> printer_state = UX_HOST_CLASS_INSTANCE_SHUTDOWN; /* We need to abort transactions on the bulk out pipe.*/ status = ux_host_stack_endpoint_transfer_abort
(printer -> printer_bulk_out_endpoint); /* If status equals UX_SUCCESS, the operation was successful */
ux_host_stack_class_get クラスコンテナへのポインタを取得
プロトタイプ
UINT ux_host_stack_class_get(UCHAR *class_name, UX_HOST_CLASS **class)
説明
クラスコンテナへのポインタを返すファンクションです。クラスまたはアプリケーションでデバイ
スをオープンしようとするときに、クラスでは、インスタンスを検索するために USB スタックか
らクラスのコンテナを取得する必要があります。
パラメータ
class_name Pointer to the class name.
class クラスの名前に関し、クラスコンテナを記述したファ
ンクションコールにより更新されたポインタ
返却値
UX_SUCCESS (0x00) エラーなし。返却時に、クラスフィールドが
クラスコンテナへのポインタとともにファイ
ル化されます。
UX_HOST_CLASS_UNKNOWN (0x59) スタックにとって不明のクラスです。
例
UX_HOST_CLASS *printer_container; UINT status; /* Get the container for this class. */ status = ux_host_stack_class_get("ux_host_class_printer",
&printer_container); /* If status equals UX_SUCCESS, the operation was successful */
ux_host_stack_class_register USB スタックに USB クラスを登録
プロトタイプ
UINT ux_host_stack_class_register(CHAR_PTR class_name, UINT (*class_entry_address) (struct UX_HOST_CLASS_COMMAND_STRUCT *))
説明
USBスタックにUSBクラスを登録するファンクションです。以下のようなコマンドを送信するた
めには、クラスは USB スタックへのエントリポイントを指定する必要があります。
UX_HOST_CLASS_COMMAND_QUERY UX_HOST_CLASS_COMMAND_ACTIVATE UX_HOST_CLASS_COMMAND_DESTROY
パラメータ
class_name クラス名へのポインタについては、USBX の USB ク
ラスの下にあるファイル ux_system_initialize.cに有
効なエントリが見つかります。
class_entry_address クラスのエントリファンクションのアドレス
返却値
UX_SUCCESS (0x00) クラスが正常にインストールされま
した。
UX_MEMORY_INSUFFICIENT (0x12) このクラスを保存するためのメモリ
が不足しています。
UX_HOST_CLASS_ALREADY_INSTALLED (0x58) ホストクラスは既にインストールさ
れています。
例
UINT status; /* Register all the classes for this implementation.*/ status = ux_host_stack_class_register("ux_host_class_hub",
ux_host_class_hub_entry); /* If status equals UX_SUCCESS, class was successfully installed.*/
ux_host_stack_class_instance_create クラスコンテナに新しいクラスインスタンスを作成
プロトタイプ
UINT ux_host_stack_class_instance_create(UX_HOST_CLASS *class, VOID *class_instance)
説明
クラスコンテナに新しいクラスインスタンスを作成するファンクションです。クラスの複雑さを軽
減するために、クラスのインスタンスはクラスコードには含まていません。代わりに、メインス
タックにあるクラスコンテナに各クラスがアタッチされています。
パラメータ
class クラスコンテナへのポインタ
class_instance 作成するクラスインスタンスへのポインタ
返却値
UX_SUCCESS (0x00) クラスインスタンスがクラスコンテナにアタッチされま
した。
Example
UINT status; UX_HOST_CLASS_PRINTER *printer; /* Obtain memory for this class instance.*/ printer = ux_memory_allocate(UX_NO_ALIGN,
sizeof(UX_HOST_CLASS_PRINTER)); if (printer == UX_NULL)
return(UX_MEMORY_INSUFFICIENT); /* Store the class container into this instance.*/ printer -> printer_class = command -> ux_host_class; /* Create this class instance. */ status = ux_host_stack_class_instance_create(printer -> printer_class,
(VOID *)printer); /* If status equals UX_SUCCESS, the class instance was successfully created and attached to the class container.*/
ux_host_stack_class_instance_destroy クラスコンテナのクラスインスタンスを破棄
プロトタイプ
UINT ux_host_stack_class_instance_destroy(UX_HOST_CLASS *class, VOID *class_instance);
説明
クラスコンテナのクラスインスタンスを破棄するファンクションです。
パラメータ
class クラスコンテナへのポインタ
class_instance 破棄するインスタンスへのポインタ
返却値
UX_SUCCESS (0x00) クラスインスタンスが破棄されま
した。.
UX_HOST_CLASS_INSTANCE_UNKNOWN (0x5b) クラスインスタンスがクラスコンテ
ナにアタッチされていません。
例
UINT status; UX_HOST_CLASS_PRINTER *printer; /* Get the instance for this class. */ printer = (UX_HOST_CLASS_PRINTER *) command -> ux_host_class_command_instance; /* The printer is being shut down. */ printer -> printer_state = UX_HOST_CLASS_INSTANCE_SHUTDOWN; /* Destroy the instance.*/ status = ux_host_stack_class_instance_destroy(printer -> printer_class,
(VOID *) printer); /* If status equals UX_SUCCESS, the class instance was successfully destroyed.*/
ux_host_stack_class_instance_get 特定のクラスへのクラスインスタンスポインタを取得
プロトタイプ
UINT ux_host_stack_class_instance_get(UX_HOST_CLASS *class, UINT class_index, VOID **class_instance)
説明
特定のクラスへのクラスインスタンスポインタを返すファンクションです。クラスの複雑さを軽
減するために、クラスのインスタンスはクラスコードには含まていません。代わりに、クラスコ
ンテナに各クラスがアタッチされています。このファンクションは、クラスコンテナ内でクラスイ
ンスタンスを検索するために使用されます。
パラメータ
class クラスコンテナへのポインタ
class_index コンテナにアタッチされているクラスのリスト内で、
ファンクションコールが使用するインデックス
class_instance ファンクションコールにより返されるインスタンスへの
ポインタ
返却値
UX_SUCCESS (0x00) クラスインスタンスが見つかりま
した。
UX_HOST_CLASS_INSTANCE_UNKNOWN (0x5b) これ以上のクラスインスタンスは
クラスコンテナにアタッチされて
いません。
例
UINT status; UX_HOST_CLASS_PRINTER *printer; /* Obtain memory for this class instance.*/ printer = ux_memory_allocate(UX_NO_ALIGN,
sizeof(UX_HOST_CLASS_PRINTER)); if (printer == UX_NULL)
return(UX_MEMORY_INSUFFICIENT); /* Search for instance index 2.*/ status = ux_host_stack_class_instance_get(class, 2, (VOID *) printer); /* If status equals UX_SUCCESS, the class instance was found.*/
ux_host_stack_device_configuration_get コンフィギュレーションコンテナへのポインタを取得
プロトタイプ
UINT ux_host_device_stack_configuration_get(UX_DEVICE *device, UINT configuration_index, UX_CONFIGURATION **configuration)
説明
デバイスハンドルとコンフィギュレーションインデックスに基づいて、コンフィギュレーションコン
テナを返すファンクションです。
パラメータ
device 要求されたコンフィギュレーションを所有するデバイ
スコンテナへのポインタ
configuration_index 検索対象のコンフィギュレーションのインデックス
configuration 返却対象のコンフィギュレーションコンテナへのポイ
ンタのアドレス
返却値
UX_SUCCESS (0x00) コンフィギュレーションが見つか
りました。
UX_DEVICE_HANDLE_UNKNOWN (0x50) デバイスコンテナが存在しません。
UX_CONFIGURATION_HANDLE_UNKNOWN (0x51) インデックスのコンフィギュレー
ションハンドルが存在しません。
例
UINT status; UX_HOST_CLASS_PRINTER *printer; /* If the device has been configured already, we don't need to do it again.*/ if (printer -> printer_device -> ux_device_state == UX_DEVICE_CONFIGURED) return(UX_SUCCESS); /* A printer normally has one configuration, retrieve 1st configuration only.*/ status = ux_host_stack_device_configuration_get(printer ->
printer_device, 0, configuration); /* If status equals UX_SUCCESS, the configuration was found.*/
ux_host_stack_device_configuration_select デバイスに特定のコンフィギュレーションを選択
プロトタイプ
UINT ux_host_stack_device_configuration_select (UX_CONFIGURATION *configuration)
説明
デバイスに特定のコンフィギュレーションを選択するファンクションです。このコンフィギュレー
ションをデバイスに設定すると、デフォルトでは、各デバイスインタフェースとそれに関連する
代替設定 0 がデバイス上でアクティブになります。特定のインタフェースの設定をデバイスク
ラ ス や イ ン タ フ ェ ー ス ク ラ ス で 変 更 し よ う と す る 場 合 は 、
ux_host_stack_interface_setting_select サービスコールを発行する必要があります。
パラメータ
configuration このサービスに対して有効にすべきコンフィギュレー
ションコンテナへのポインタ
返却値
UX_SUCCESS (0x00) コンフィギュレーションの選択に成功しました。
UX_CONFIGURATION_HANDLE_UNKNOWN (0x51) コンフィギュレーションハンドルが存在しません。
UX_OVER_CURRENT_CONDITION (0x43) このコンフィギュレーションに対してバス上に過電流
状態が存在します。
例
UINT status; UX_HOST_CLASS_PRINTER *printer; /* If the device has been configured already, we don't need to do it again.*/ if (printer -> printer_device -> ux_device_state == UX_DEVICE_CONFIGURED) return(UX_SUCCESS); /* A printer normally has one configuration - retrieve 1st
configuration only.*/ status = ux_host_stack_device_configuration_get(printer ->
printer_device, 0,configuration); /* If status equals UX_SUCCESS, the configuration selection was successful.*/
/* If valid configuration, ask USBX to set this configuration.*/ status = ux_host_stack_device_configuration_select(configuration); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_host_stack_device_get デバイスコンテナへのポインタを取得
プロトタイプ
UINT ux_host_stack_device_get(ULONG device_index, UX_DEVICE **device)
説明
デバイスコンテナを、デバイスのインデックスに基づいて返すファンクションです。デバイスイ
ンデックスは 0 で始まります。複数のコントローラを備えることも可能で、しかもバイトインデッ
クスでは不十分なため、インデックスが ULONG 型であることに注意してください。また、デバ
イスインデックスは、バス固有のデバイスアドレスとは異なります。
パラメータ
device_index デバイスのインデックス
device 返却対象のデバイスコンテナへのポインタのアドレス
返却値
UX_SUCCESS (0x00) デバイスコンテナが存在し、返されました。
UX_DEVICE_HANDLE_UNKNOWN (0x50) デバイスが不明です。
例
UINT status; /* Locate the first device in USBX.*/ status = ux_host_stack_device_get(0, device); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_host_stack_interface_endpoint_get エンドポイントコンテナを取得
プロトタイプ
UINT ux_host_stack_interface_endpoint_get(UX_INTERFACE *interface, UINT endpoint_index, UX_ENDPOINT **endpoint)
説明
インタフェースハンドルとエンドポイントインデックスに基づいて、エンドポイントコンテナを返
すファンクションです。エンドポイントの検索に先立ち、インタフェースの代替設定が選択され
ているか、またはデフォルト設定が使用されているものとします。
パラメータ
interface 要求されたエンドポイントを含むインタフェースコンテ
ナへのポインタ
Endpoint_index このインタフェースに入っているエンドポイントのイン
デックス
endpoint 返却対象のエンドポイントコンテナのアドレス
返却値
UX_SUCCESS (0x00) エンドポイントコンテナが存在し、
返されました。
UX_INTERFACE_HANDLE_UNKNOWN (0x52) 指定されたインタフェースが存在
しません。
UX_ENDPOINT_HANDLE_UNKNOWN (0x53) エンドポイントインデックスが存
在しません。
例
UINT status; UX_HOST_CLASS_PRINTER *printer; for (endpoint_index = 0; endpoint_index < printer -> printer_interface ->
ux_interface_descriptor.bNumEndpoints; endpoint_index++) { status = ux_host_stack_interface_endpoint_get
(printer ->printer_interface, endpoint_index, &endpoint); if (status == UX_SUCCESS) {
/* Check if endpoint is bulk and OUT.*/ if (((endpoint -> ux_endpoint_descriptor.bEndpointAddress &
UX_ENDPOINT_DIRECTION) == UX_ENDPOINT_OUT) && ((endpoint -> ux_endpoint_descriptor.bmAttributes &
UX_MASK_ENDPOINT_TYPE) == UX_BULK_ENDPOINT)) return(UX_SUCCESS) } }
ux_host_stack_hcd_register USB スタックに USB コントローラを登録
プロトタイプ
UINT ux_host_stack_hcd_register(CHAR_PTR hcd_name, UINT (*hcd_function)(struct UX_HCD_STRUCT *), ULONG hcd_param1, ULONG hcd_param2)
説明
USB スタックに USBコントローラを登録するファンクションです。このファンクションは主に、こ
のコントローラで使用しているメモリを割り当て、コントローラに初期化コマンドを渡します。
パラメータ
hcd_name ホストコントローラの名前使用可能なコントローラとし
て、次のものがあります。 "ux_hcd_ohci" "ux_hcd_ehci" "ux_hcd_isp1161"
hcd_function ホストコントローラに含まれていて、初期化を担うファ
ンクション。使用可能なコントローラエントリファンク
ションとして、次のものがあります。 ux_hcd_ehci_initialize ux_hcd_ohci_initialize ux_hcd_isp1161_initialize
hcd_param1 hcd で使用している IO またはメモリリソース。
hcd_param2 ホストコントローラで使用している IRQ。
返却値
UX_SUCCESS (0x00) コントローラが正しく初期化されました。
UX_MEMORY_INSUFFICIENT (0x12) このコントローラのためのメモリが不足し
ています。
UX_PORT_RESET_FAILED (0x31) コントローラのリセットに失敗しました。
UX_CONTROLLER_INIT_FAILED (0x32) コントローラが正しく初期化されませんで
した。
例
UINT status; /* Initialize an OHCI controller mapped at address 0xd0000 and using
IRQ 10.*/ status = ux_host_stack_hcd_register("ux_hcd_ohci",
ux_hcd_ohci_initialize, 0xd0000, 0x0a);
/* If status equals UX_SUCCESS, the controller was initialized
properly.*/ /* Note that the application must also setup a call to the interrupt
handler for the OHCI controller.The function for OHCI is called _ux_hch_ohci_interrupt_handler.*/
ux_host_stack_configuration_interface_get インタフェースコンテナポインタを取得
プロトタイプ
UINT ux_host_stack_configuration_interface_get (UX_CONFIGURATION *configuration, UINT interface_index, UINT alternate_setting_index, UX_INTERFACE **interface)
説明
コンフィギュレーションハンドル、インタフェースインデックス、および代替設定インデックスに
基づいて、インタフェースコンテナを返すファンクションです。
パラメータ
configuration インタフェースを所有するコンフィギュレーションコン
テナへのポインタ
interface_index 検索対象のインデックス
alternate_setting_index インタフェースに含まれている、検索対象の代替
設定
interface 返却対象のインタフェースコンテナポインタのアド
レス
返却値
UX_SUCCESS (0x00) インタフェースインデックスと代替
設定に対応するインタフェースコ
ンテナが見つかり、返されまし
た。
UX_CONFIGURATION_HANDLE_UNKNOWN (0x51) コンフィギュレーションが存在しま
せん。
UX_INTERFACE_HANDLE_UNKNOWN (0x52) インタフェースが存在しません。
例
UINT status; /* Search for the default alternate setting on the first interface for the
printer.*/ status = ux_host_stack_configuration_interface_get(configuration, 0, 0,
&printer -> printer_interface); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_host_stack_interface_setting_select インタフェースの代替設定を選択
プロトタイプ
UINT ux_host_stack_interface_setting_select(UX_INTERFACE *interface)
説明
選択したコンフィギュレーションに属するあるインタフェースについて、特定の代替設定を選
択するファンクションです。このファンクションは、デフォルトの代替設定から新しい設定に変
更するため、またはデフォルトの代替設定に戻すために使用します。 新しい代替設定を選択したときは、以前のエンドポイント特性が無効になるため、リロードが
必要になります。
入力パラメータ
interface 選択対象の代替設定が入っているインタフェースコ
ンテナへのポインタ
返却値
UX_SUCCESS (0x00) このインタフェースの代替設定が正
常に選択されました。
UX_INTERFACE_HANDLE_UNKNOWN (0x52) インタフェースが存在しません。
Example
UINT status; /* Select a new alternate setting for this interface.*/ status = ux_host_stack_interface_setting_select(interface); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_host_stack_transfer_request_abort 保留中の転送要求をアボート
プロトタイプ
UINT ux_host_stack_transfer_request_abort(UX_TRANSFER REQUEST *transfer request)
説明
以前に提出されて保留中の転送要求をアボートするファンクションです。特定の転送要求の
みが取り消されます。このファンクションのコールバックには、 UX_TRANSFER REQUEST_STATUS_ABORT ステータスが含まれます。
パラメータ
transfer request アボート対象の転送要求へのポインタ
返却値
UX_SUCCESS (0x00) この転送要求に対する USB 転送が取り消されまし
た。
例
UINT status; /* The following example illustrates this service.*/ status = ux_host_stack_transfer_request_abort(transfer request); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_host_stack_transfer_request USB 転送を要求
プロトタイプ
UINT ux_host_stack_transfer_request(UX_TRANSFER REQUEST *transfer request)
説明
USB トランザクションを実行するファンクションです。転送要求の入力時に、このトランザク
ション用に選択されたエンドポイントパイプと、転送に関連するパラメータ(データペイロード、
トランザクション長)が指定されます。制御パイプでは、トランザクションはブロッキングになり
ます。制御転送の 3 つのフェーズが完了したとき、または以前のエラーがある場合に限り、ト
ランザクションが返ります。その他のパイプでは、USBスタックがUSB上でのトランザクション
をスケジュールしますが、そのトランザクションの完了を待つことはありません。非ブロッキン
グパイプでの転送要求では、各々に完了ルーチンハンドラを指定しなければなりません。 ファンクションコールが返るときに、転送要求のステータスにトランザクションの結果が含まれ
ているため、このステータスを調べることが望まれます。
入力パラメータ
transfer_request 転送要求へのポインタ。転送要求には、転送に必要
なすべての情報が含まれます。
返却値
UX_SUCCESS (0x00) この転送要求に対する USB 転送が正しく
スケジュールされました。 転送要求が完了するときに、転送要求の
ステータスコードを調べることが望まれま
す。
UX_MEMORY_INSUFFICIENT (0x12) 必要なコントローラリソースを割り当てる
ためのメモリが不足しています。
例
UINT status; /* Create a transfer request for the SET_CONFIGURATION request.
No data for this request.*/ transfer_request -> ux_transfer_endpoint_handle = control_endpoint; transfer_request -> ux_transfer_requested_length = 0; transfer_request -> ux_transfer_request_function =
UX_SET_CONFIGURATION;
transfer_request -> ux_transfer_request_type = UX_REQUEST_OUT | UX_REQUEST_TYPE_STANDARD | UX_REQUEST_TARGET_DEVICE;
transfer_request -> ux_transfer_request_value = (USHORT) configuration -> ux_configuration_descriptor.bConfigurationValue; transfer_request -> ux_transfer_request_index = 0; /* Send request to HCD layer.*/ status = ux_host_stack_transfer_request(transfer_request); /* If status equals UX_SUCCESS, the operation was successful.*/
第 5 章 USBX ホストクラスの API この章では、USBX クラスの API として公開されているすべての API を説明します。各クラスについ
て、以下の API について詳述します。
プリンタクラス HID クラス オーディオクラス Asix クラス CDC-ACM クラス Pima/PTP クラス Prolific クラス ストレージクラス ジェネリックシリアルクラス
ux_host_class_printer_read プリンタインタフェースから読み出す
プロトタイプ
UINT ux_host_class_printer_read(UX_HOST_CLASS_PRINTER *printer, UCHAR *data_pointer, ULONG requested_length, ULONG *actual_length)
説明
プリンタインタフェースから読み出すためのファンクションです。これはブロッキングコールで
あり、エラーがあるときまたは転送が完了したときにのみ返されます。双方向プリンタでのみ
読み出しが許容されます。
パラメータ
printer プリンタクラスインスタンスへのポインタ
data_pointer データペイロードのバッファアドレスへのポインタ
requested_length 受信する長さ
actual_length 実際に受信した長さ
返却値
UX_SUCCESS (0x00) データ転送が完了しました。
UX_FUNCTION_NOT_SUPPORTED (0x54) プリンタが双方向でないため、ファン
クションがサポートされません。
UX_TRANSFER_TIMEOUT (0x5c) 転送タイムアウト。読み出しは未完で
す。
例
UINT status; /* The following example illustrates this service.*/ status = ux_host_class_printer_read(printer, data_pointer,
requested_length, &actual_length); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_host_class_printer_write プリンタインタフェースに書き込む
プロトタイプ
UINT ux_host_class_printer_write(UX_HOST_CLASS_PRINTER *printer, UCHAR *data_pointer, ULONG requested_length, ULONG *actual_length)
説明
プリンタインタフェースに書き込むためのファンクションです。これはブロッキングコールであり、
エラーがあるときまたは転送が完了したときにのみ返されます。
パラメータ
printer プリンタクラスインスタンスへのポインタ
data_pointer データペイロードのバッファアドレスへのポインタ
requested_length 送信する長さ
actual_length 実際に送信した長さ
返却値
UX_SUCCESS (0x00) データ転送が完了しました。
UX_TRANSFER_TIMEOUT (0x5c) 転送タイムアウト。書き込みは未完です。
例
UINT status; /* The following example illustrates this service.*/ status = ux_host_class_printer_write(printer, data_pointer,
requested_length, &actual_length); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_host_class_printer_soft_reset プリンタにソフトリセットを実行
プロトタイプ
UINT ux_host_class_printer_soft_reset(UX_HOST_CLASS_PRINTER *printer)
説明
プリンタにソフトリセットを実行するファンクションです。
入力パラメータ
printer プリンタクラスインスタンスへのポインタ
返却値
UX_SUCCESS (0x00) リセットが完了しました。
UX_TRANSFER_TIMEOUT (0x5c) 転送タイムアウト。リセットは未完で
す。
例
UINT status; /* The following example illustrates this service.*/ status = ux_host_class_printer_soft_reset(printer); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_host_class_printer_status_get プリンタステータスを取得
プロトタイプ
UINT ux_host_class_printer_status_get(UX_HOST_CLASS_PRINTER *printer, ULONG *printer_status)
説明
プリンタステータスを取得するファンクションです。プリンタステータスは、LPT ステータス
(1284 規格)に類似しています。
パラメータ
printer プリンタクラスインスタンスへのポインタ
printer_status 返却対象のステータスのアドレス
返却値
UX_SUCCESS (0x00) リセットが完了しました。
UX_MEMORY_INSUFFICIENT (0x12) 操作を実行するためのメモリが不足
しています。
UX_TRANSFER_TIMEOUT (0x5c) 転送タイムアウト。リセットは未完で
す。
例
UINT status; /* The following example illustrates this service.*/ status = ux_host_class_printer_status_get(printer, printer_status); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_host_class_audio_read オーディオインタフェースから読み出す
プロトタイプ
UINT ux_host_class_audio_read(UX_HOST_CLASS_AUDIO *audio, UX_HOST_CLASS_AUDIO_TRANSFER_REQUEST
*audio_transfer_request)
説明
オーディオインタフェースから読み出すためのファンクションです。これは非ブロッキングコー
ルです。オーディオストリーミングインタフェース用に適切な代替設定が選択されていることを、
アプリケーションで確実にする必要があります。
パラメータ
audio オーディオクラスインスタンスへのポインタ audio_transfer_request オーディオ転送構
造へのポインタ
返却値
UX_SUCCESS (0x00) データ転送が完了しました。
UX_FUNCTION_NOT_SUPPORTED (0x54) ファンクションがサポートされていま
せん。
例
/* The following example reads from the audio interface.*/ audio_transfer_request.ux_host_class_audio_transfer_request_completion_function =
tx_audio_transfer_completion_function; audio_transfer_request.ux_host_class_audio_transfer_request_class_instance = audio; audio_transfer_request.ux_host_class_audio_transfer_request_next_audio_audio_transfer_request =
UX_NULL; audio_transfer_request. ux_host_class_audio_transfer_request_data_pointer =
audio_buffer; audio_transfer_request.ux_host_class_audio_transfer_request_requested_length =
requested_length; audio_transfer_request.ux_host_class_audio_transfer_request_packet_length =
AUDIO_FRAME_LENGTH; status = ux_host_class_audio_read(audio, audio_transfer_request); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_host_class_audio_write オーディオインタフェースに書き込む
プロトタイプ
UINT ux_host_class_audio_write(UX_HOST_CLASS_AUDIO *audio, UX_HOST_CLASS_AUDIO_TRANSFER_REQUEST *audio_transfer_request)
説明
オーディオインタフェースに書き込むためのファンクションです。これは非ブロッキングコール
です。オーディオストリーミングインタフェース用に適切な代替設定が選択されていることを、
アプリケーションで確実にする必要があります。
パラメータ
audio オーディオクラスインスタンスへのポインタ
audio_transfer_request オーディオ転送構造へのポインタ
返却値
UX_SUCCESS (0x00) データ転送が完了しまし
た。
UX_FUNCTION_NOT_SUPPORTED (0x54) ファンクションがサポート
されていません。
UX_HOST_CLASS_AUDIO_WRONG_INTERFACE (0x81) インタフェースが不正で
す。
例
UINT status; /* The following example writes to the audio interface */ audio_transfer_request.ux_host_class_audio_transfer_request_completion_function =
tx_audio_transfer_completion_function; audio_transfer_request.ux_host_class_audio_transfer_request_class_instance = audio; audio_transfer_request.ux_host_class_audio_transfer_request_next_audio_audio_transfer_request =
UX_NULL; audio_transfer_request.ux_host_class_audio_transfer_request_data_pointer =
audio_buffer; audio_transfer_request.ux_host_class_audio_transfer_request_requested_length =
requested_length; audio_transfer_request.ux_host_class_audio_transfer_request_packet_length =
AUDIO_FRAME_LENGTH; status = ux_host_class_audio_write(audio, audio_transfer_request); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_host_class_audio_control_get オーディオ制御インタフェースから特定の制御を取得
プロトタイプ
UINT ux_host_class_audio_control_get(UX_HOST_CLASS_AUDIO *audio, UX_HOST_CLASS_AUDIO_CONTROL *audio_control)
説明
オーディオ制御インタフェースから特定の制御を取得するファンクションです。
パラメータ
audio オーディオクラスインスタンスへのポインタ
audio_control オーディオ制御構造へのポインタ
返却値
UX_SUCCESS (0x00) データ転送が完了しま
した。
UX_FUNCTION_NOT_SUPPORTED (0x54) ファンクションがサポー
トされていません。
UX_HOST_CLASS_AUDIO_WRONG_INTERFACE (0x81) インタフェースが不正で
す。
例
UINT status; /* The following example reads the volume control from a stereo USB speaker.*/ UX_HOST_CLASS_AUDIO_CONTROL audio_control; audio_control. ux_host_class_audio_control_channel = 1; audio_control. ux_host_class_audio_control = UX_HOST_CLASS_AUDIO_VOLUME_CONTROL; status = ux_host_class_audio_control_get(audio, &audio_control); /* If status equals UX_SUCCESS, the operation was successful.*/ audio_control. ux_host_class_audio_control_channel = 2; audio_control. ux_host_class_audio_control = UX_HOST_CLASS_AUDIO_VOLUME_CONTROL; status = ux_host_class_audio_control_get(audio, &audio_control); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_host_class_audio_control_value_set オーディオ制御インタフェースに特定の制御を設定
プロトタイプ
UINT ux_host_class_audio_control_value_set(UX_HOST_CLASS_AUDIO *audio, UX_HOST_CLASS_AUDIO_CONTROL *audio_control)
説明
オーディオ制御インタフェースに特定の制御を設定するファンクションです。
パラメータ
audio オーディオクラスインスタンスへのポインタ
audio_control オーディオ制御構造へのポインタ
返却値
UX_SUCCESS (0x00) データ転送が完了しま
した。
UX_FUNCTION_NOT_SUPPORTED (0x54) ファンクションがサポー
トされていません。
UX_HOST_CLASS_AUDIO_WRONG_INTERFACE (0x81) インタフェースが不正で
す。
例
/* The following example sets the volume control of a stereo USB speaker.*/ UX_HOST_CLASS_AUDIO_CONTROL audio_control; UINT status; audio_control. ux_host_class_audio_control_channel = 1; audio_control. ux_host_class_audio_control = UX_HOST_CLASS_AUDIO_VOLUME_CONTROL; audio_control. ux_host_class_audio_control_cur = 0xf000; status = ux_host_class_audio_control_value_set(audio, &audio_control); /* If status equals UX_SUCCESS, the operation was successful.*/ current_volume = audio_control.audio_ control_cur; audio_control. ux_host_class_audio_control_channel = 2; audio_control. ux_host_class_audio_control = UX_HOST_CLASS_AUDIO_VOLUME_CONTROL; audio_control. ux_host_class_audio_control_cur = 0xf000; status = ux_host_class_audio_control_value_set(audio, &audio_control); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_host_class_audio_streaming_sampling_set オーディオストリーミングインタフェースの代替設定インタフェースを設定
プロトタイプ
UINT ux_host_class_audio_streaming_sampling_set(UX_HOST_CLASS_AUDIO *audio, UX_HOST_CLASS_AUDIO_SAMPLING *audio_sampling)
説明
特定のサンプリング構造に従って、オーディオストリーミングインタフェースの適切な代替設
定インタフェースを設定するファンクションです。
パラメータ
audio オーディオクラスインスタンスへのポインタ
audio_sampling オーディオサンプリング構造へのポインタ
返却値
UX_SUCCESS (0x00) データ転送が完了しまし
た。
UX_FUNCTION_NOT_SUPPORTED (0x54) ファンクションがサポート
されていません。
UX_HOST_CLASS_AUDIO_WRONG_INTERFACE (0x81) インタフェースが不正で
す。
UX_NO_ALTERNATE_SETTING (0x5e) サンプリング値用の代替
設定がありません。
例
/* The following example sets the alternate setting interface of a stereo USB speaker.*/
UX_HOST_CLASS_AUDIO_SAMPLING audio_sampling; UINT status; sampling. ux_host_class_audio_sampling_channels = 2; sampling. ux_host_class_audio_sampling_frequency = AUDIO_FREQUENCY; sampling. ux_host_class_audio_sampling_resolution = 16; status = ux_host_class_audio_streaming_sampling_set(audio, &sampling); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_host_class_audio_streaming_sampling_get オーディオストリーミングインタフェースの可能サンプリング設定を取得
プロトタイプ
UINT ux_host_class_audio_streaming_sampling_get(UX_HOST_CLASS_AUDIO *audio, UX_HOST_CLASS_AUDIO_SAMPLING_CHARACTERISTICS *audio_sampling)
説明
オーディオストリーミングインタフェースの各代替設定に使用可能なすべてのサンプリング設
定を、1 つずつ取得するファンクションです。このファンクションの初回使用時には、呼び出し
構造ポインタ内のすべてのフィールドをリセットする必要があります。代替設定の末尾に達し
た場合を除き、返却時にストリーミング値の特定のセットが返されます。このファンクションの
再使用時には、以前のサンプリング値群を用いて次のサンプリング値群を見つけます。
パラメータ
audio オーディオクラスインスタンスへのポインタ
audio_sampling オーディオサンプリング構造へのポインタ
返却値
UX_SUCCESS (0x00) データ転送が完了しま
した。
UX_FUNCTION_NOT_SUPPORTED (0x54) ファンクシ ョンがサ
ポートされていませ
ん。
UX_HOST_CLASS_AUDIO_WRONG_INTERFACE (0x81) インタフェースが不正
です。
UX_NO_ALTERNATE_SETTING (0x5e) サンプリング値用の代
替設定がありません。
例
/* The following example gets the sampling values for the first alternate setting interface of a stereo USB speaker.*/
UX_HOST_CLASS_AUDIO_SAMPLING_CHARACTERISTICS audio_sampling; UINT status; sampling.ux_host_class_audio_sampling_channels=0; sampling.ux_host_class_audio_sampling_frequency_low=0; sampling.ux_host_class_audio_sampling_frequency_high=0; sampling.ux_host_class_audio_sampling_resolution=0;
status = ux_host_class_audio_streaming_sampling_get(audio, &sampling); /* If status equals UX_SUCCESS, the operation was successful and information could be displayed as follows:
printf("Number of channels %d, Resolution %d bits, frequency range %d- %d\n",
sampling.audio_channels, sampling.audio_resolution, sampling.audio_frequency_low, sampling.audio_frequency_high);
*/
ux_host_class_hid_client_register HID クラスに HID クライアントを登録
プロトタイプ
UINT ux_host_class_hid_client_register(UCHAR_PTR hid_client_name, UINT (*hid_client_handler)
(struct UX_HOST_CLASS_HID_CLIENT_COMMAND_STRUCT *))
説明
HIDクラスにHIDクライアントを登録するためのファンクションです。HIDクラスでは HIDデバ
イスとHIDクライアントとの一致を見つけてからでないと、このデバイスからデータを要求する
ことができません。
パラメータ
hid_client_name HID クライアント名へのポインタ
hid_client_handler HID クライアントハンドラへのポインタ
返却値
UX_SUCCESS (0x00) データ転送が完了しました。
UX_FUNCTION_NOT_SUPPORTED (0x54) ファンクションがサポートされて
いません。
UX_HOST_CLASS_ALREADY_INSTALLED (0x58) このクラスは既に存在します。
例
UINT status; /* The following example illustrates how to register a HID client, in
this case a USB mouse, to the HID class.*/ status = ux_host_class_hid_client_register("ux_host_class_hid_client_mouse",
ux_host_class_hid_mouse_entry); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_host_class_hid_report_callback_register HID クラスからのコールバックを登録
プロトタイプ
UINT ux_host_class_hid_report_callback_register(UX_HOST_CLASS_HID *hid, UX_HOST_CLASS_HID_REPORT_CALLBACK *call_back)
説明
レポートを受信するときに HID クラスから HID クライアントへのコールバックを登録するため
のファンクションです。
パラメータ
hid HID クラスインスタンスへのポインタ
call_back コールバック構造へのポインタ
返却値
UX_SUCCESS (0x00) データ転送が完了しました。
UX_FUNCTION_NOT_SUPPORTED (0x54) ファンクションがサポートされて
いません。
UX_HOST_CLASS_HID_REPORT_ERROR (0x79) レポートコールバック登録時に
エラーが発生しました。
例
UINT status; /* This example illustrates how to register a HID client, in this case
a USB mouse, to the HID class.In this case, the HID client is asking the HID class to call the client for each usage received in the HID report.*/
call_back.ux_host_class_hid_report_callback_id = 0; call_back.ux_host_class_hid_report_callback_function =
ux_host_class_hid_mouse_callback; call_back.ux_host_class_hid_report_callback_buffer = UX_NULL; call_back.ux_host_class_hid_report_callback_flags
=UX_HOST_CLASS_HID_REPORT_INDIVIDUAL_USAGE; call_back.ux_host_class_hid_report_callback_length = 0; status = ux_host_class_hid_report_callback_register(hid, &call_back); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_host_class_hid_periodic_report_start HID クラスインスタンスの周期的エンドポイントを起動
プロトタイプ
UINT ux_host_class_hid_periodic_report_start(UX_HOST_CLASS_HID *hid)
説明
この HID クライアントにバインドされた HID クラスのインスタンスの、周期的(インタラプト)エ
ンドポイントを起動するためのファンクションです。HID クライアントがアクティブ化されるまで
HID クラスから周期的エンドポイントを起動できないため、このエンドポイントを起動してレ
ポートを受信する作業は HID クライアントに任されています。
入力パラメータ
hid HID クラスインスタンスへのポインタ
返却値
UX_SUCCESS (0x00) 転送が完了しました。
UX_FUNCTION_NOT_SUPPORTED (0x54) ファンクションがサポートさ
れていません。.
UX_HOST_CLASS_HID_PERIODIC_REPORT_ERROR (0x7A) 周期的レポート内でエラー
が発生しました。
UX_HOST_CLASS_INSTANCE_UNKNOWN (0x5b) HID クラスインスタンスが
存在しません。
例
UINT status; /* The following example illustrates how to start the periodic
endpoint.*/ status = ux_host_class_hid_periodic_report_start(hid); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_host_class_hid_periodic_report_stop HID クラスインスタンスの周期的エンドポイントを停止
プロトタイプ
UINT ux_host_class_hid_periodic_report_stop(UX_HOST_CLASS_HID *hid)
説明
この HID クライアントにバインドされた HID クラスのインスタンスの、周期的(インタラプト)エ
ンドポイントを停止するためのファンクションです。HID クライアントが非アクティブ化され、そ
のすべてのリソースが解放されるまでは、HID クラスから周期的エンドポイントを停止できな
いため、このエンドポイントを停止する作業は HID クライアントに任されています。
入力パラメータ
hid HID クラスインスタンスへのポインタ
返却値
UX_SUCCESS (0x00) 転送が完了しまし
た。
UX_FUNCTION_NOT_SUPPORTED (0x54) ファンクションがサ
ポートされていませ
ん。.
UX_HOST_CLASS_HID_PERIODIC_REPORT_ERROR (0x7A) 周期的レポート内で
エラーが発生しまし
た
UX_HOST_CLASS_INSTANCE_UNKNOWN (0x5b) HID クラスインスタン
スが存在しません。
例
UINT status; /* The following example illustrates how to stop the periodic
endpoint.*/ status = ux_host_class_hid_periodic_report_stop(hid); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_host_class_hid_report_get HID クラスインスタンスからレポートを取得
プロトタイプ
UINT ux_host_class_hid_report_get(UX_HOST_CLASS_HID *hid, UX_HOST_CLASS_HID_CLIENT_REPORT *client_report)
説明
周期的エンドポイントに頼ることなく、デバイスから直接にレポートを受信するためのファンク
ションです。このレポートは制御エンドポイントから送信されますが、あたかも周期的エンドポ
イントから送信されたレポートであるかのように処理されます。
パラメータ
hid HID クラスインスタンスへのポインタ
client_report HID クライアントレポートへのポインタ
返却値
UX_SUCCESS (0x00) データ転送が完了しました。
UX_FUNCTION_NOT_SUPPORTED (0x54) ファンクションがサポートされて
いません。
UX_HOST_CLASS_HID_REPORT_ERROR (0x70) 周期的レポート内でエラーが発
生しました。
UX_HOST_CLASS_INSTANCE_UNKNOWN (0x5b) HID クラスインスタンスが存在し
ません。
UX_BUFFER_OVERFLOW (0x5d) 提供されたバッファは、未圧縮の
レポートを収容する大きさがあり
ません。
例
UX_HOST_CLASS_HID_CLIENT_REPORT input_report; UINT status; /* The following example illustrates how to get a report.*/ input_report.ux_host_class_hid_client_report = hid_report; input_report.ux_host_class_hid_client_report_buffer = buffer; input_report.ux_host_class_hid_client_report_length = length; input_report.ux_host_class_hid_client_flags =
UX_HOST_CLASS_HID_REPORT_INDIVIDUAL_USAGE; status = ux_host_class_hid_report_get(hid, &input_report); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_host_class_hid_report_set レポートを送信
プロトタイプ
UINT ux_host_class_hid_report_set(UX_HOST_CLASS_HID *hid, UX_HOST_CLASS_HID_CLIENT_REPORT *client_report)
説明
レポートをデバイスに直接送信するためのファンクションです。
パラメータ
hid HID クラスインスタンスへのポインタ
client_report HID クライアントレポートへのポインタ
返却値
UX_SUCCESS (0x00) データ転送が完了しました。
UX_FUNCTION_NOT_SUPPORTED (0x54) ファンクションがサポートされて
いません。
UX_HOST_CLASS_HID_REPORT_ERROR (0x70) 周期的レポート内でエラーが発
生しました。
UX_HOST_CLASS_INSTANCE_UNKNOWN (0x5b) HID クラスインスタンスが存在し
ません。
UX_BUFFER_OVERFLOW (0x5d) 提供されたバッファは、未圧縮の
レポートを収容する大きさがあり
ません。
例
/* The following example illustrates how to send a report.*/ UX_HOST_CLASS_HID_CLIENT_REPORT input_report; input_report.ux_host_class_hid_client_report = hid_report; input_report.ux_host_class_hid_client_report_buffer = buffer; input_report.ux_host_class_hid_client_report_length = length; input_report.ux_host_class_hid_client_report_flags =
UX_HOST_CLASS_HID_REPORT_INDIVIDUAL_USAGE; status = ux_host_class_hid_report_set(hid, &input_report); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_host_class_asix_read Asix インタフェースから読み出す
プロトタイプ
UINT ux_host_class_asix_read(UX_HOST_CLASS_ASIX *asix, UCHAR *data_pointer, ULONG requested_length, ULONG *actual_length)
説明
Asix インタフェースから読み出すためのファンクションです。これはブロッキングコールであり、
エラーがあるときまたは転送が完了したときにのみ返されます。
パラメータ
Asix クラスインスタンスへのポインタ
data_pointer データペイロードのバッファアドレスへのポインタ
requested_length 受信する長さ
actual_length 実際に受信した長さ
返却値
UX_SUCCESS (0x00) データ転送が完了しました。
UX_TRANSFER_TIMEOUT (0x5c) 転送タイムアウト。読み出しは未完です。
例
UINT status; /* The following example illustrates this service.*/ status = ux_host_class_asix_read(asix, data_pointer,
requested_length, &actual_length); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_host_class_asix_write Axis インタフェースに書き込む
プロトタイプ
UINT ux_host_class_asix_write(UX_HOST_CLASS_ASIX *asix, UCHAR *data_pointer, ULONG requested_length, ULONG *actual_length)
説明
Axis インタフェースに書き込むためのファンクションです。これはブロッキングコールであり、
エラーがあるときまたは転送が完了したときにのみ返されます。
パラメータ
Asix クラスインスタンスへのポインタ
data_pointer データペイロードのバッファアドレスへのポインタ
requested_length 送信する長さ
actual_length 実際に送信した長さ
返却値
UX_SUCCESS (0x00) データ転送が完了しました。
UX_TRANSFER_TIMEOUT (0x5c) 転送タイムアウト。書き込みは未完です。
例
UINT status; /* The following example illustrates this service.*/ status = ux_host_class_asix_write(asix, data_pointer,
requested_length, &actual_length); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_host_class_cdc_acm_read cdc_acm インタフェースから読み出す
プロトタイプ
UINT ux_host_class_cdc_acm_read(UX_HOST_CLASS_CDC_ACM *cdc_acm, UCHAR *data_pointer, ULONG requested_length, ULONG *actual_length)
説明
cdc_acm インタフェースから読み出すためのファンクションです。これはブロッキングコール
であり、エラーがあるときまたは転送が完了したときにのみ返されます。
パラメータ
cdc_acm cdc_acm インスタンスへのポインタ。
data_pointer データペイロードのバッファアドレスへのポインタ
requested_length 受信する長さ
actual_length 実際に受信した長さ
返却値
UX_SUCCESS (0x00) データ転送が完了しました。
UX_TRANSFER_TIMEOUT (0x5c) 転送タイムアウト。読み出しは未完です。
例
UINT status; /* The following example illustrates this service.*/ status = ux_host_class_cdc_acm_read(cdc_acm, data_pointer,
requested_length, &actual_length); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_host_class_cdc_acm _write cdc_acm インタフェースに書き込む
プロトタイプ
UINT ux_host_class_cdc_acm_write(UX_HOST_CLASS_CDC_ACM *cdc_acm, UCHAR *data_pointer, ULONG requested_length, ULONG *actual_length)
説明
cdc_acmインタフェースに書き込むためのファンクションです。これはブロッキングコールであ
り、エラーがあるときまたは転送が完了したときにのみ返されます。
パラメータ
cdc_acm cdc_acm インスタンスへのポインタ。
data_pointer データペイロードのバッファアドレスへのポインタ
requested_length 送信する長さ
actual_length 実際に送信した長さ
返却値
UX_SUCCESS (0x00) データ転送が完了しました。
UX_TRANSFER_TIMEOUT (0x5c) 転送タイムアウト。書き込みは未完です。
例
UINT status; /* The following example illustrates this service.*/ status = ux_host_class_cdc_acm_write(cdc_acm, data_pointer,
requested_length, &actual_length); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_host_class_cdc_acm_ioctl cdc_acm インタフェースに ioctl ファンクションを実行
プロトタイプ
UINT ux_host_class_cdc_acm_ioctl(UX_HOST_CLASS_CDC_ACM *cdc_acm, ULONG ioctl_function, VOID *parameter)
説明
特定の ioctl ファンクションを cdc_acm インタフェースに対して実行するファンクションです。こ
れはブロッキングコールであり、エラーがあるときまたはコマンドが完了したときにのみ返され
ます。
パラメータ
cdc_acm cdc_acm インスタンスへのポインタ。
ioctl_function 実行対象の ioctlファンクション。許容される ioctlファ
ンクションは、下の表の中のいずれかです。
parameter ioctl 固有のパラメータへのポインタ。
返却値
UX_SUCCESS (0x00) データ転送が完了しました。
UX_MEMORY_INSUFFICIENT (0x12) メモリが不足しています。
UX_HOST_CLASS_UNKNOWN (0x59) クラスインスタンスが間違っていま
す。
UX_FUNCTION_NOT_SUPPORTED (0x54) 未定義の ioctl ファンクションです。
IOCTL ファンクションの一覧
UX_HOST_CLASS_CDC_ACM_IOCTL_SET_LINE_CODING UX_HOST_CLASS_CDC_ACM_IOCTL_GET_LINE_CODING UX_HOST_CLASS_CDC_ACM_IOCTL_SET_LINE_STATE UX_HOST_CLASS_CDC_ACM_IOCTL_SEND_BREAK UX_HOST_CLASS_CDC_ACM_IOCTL_ABORT_IN_PIPE UX_HOST_CLASS_CDC_ACM_IOCTL_ABORT_OUT_PIPE UX_HOST_CLASS_CDC_ACM_IOCTL_NOTIFICATION_CALLBACK UX_HOST_CLASS_CDC_ACM_IOCTL_GET_DEVICE_STATUS
Example
UINT status; /* The following example illustrates this service.*/ status = ux_host_class_cdc_acm_write(cdc_acm, data_pointer,
requested_length, &actual_length); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_host_class_pima_session_open イニシエータとレスポンダの間でセッションをオープン
プロトタイプ
UINT ux_host_class_pima_session_open(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session)
説明
PIMA イニシエータと PIMA レスポンダの間でセッションをオープンするファンクションです。
セッションが正常にオープンしたら、ほとんどの PIMA コマンドが実行できます。
パラメータ
pima PIMA クラスインスタンスへのポインタ
pima_session PIMA セッションへのポインタ
返却値
UX_SUCCESS (0x00) セッションが正常にオープンしま
した。 UX_HOST_CLASS_PIMA_RC_SESSION_ALREADY_OPENED (0x201E) セッションは既にオープンしてい
ます。
例
/* Open a pima session. */ status = ux_host_class_pima_session_open(pima, pima_session); if (status != UX_SUCCESS)
return(UX_PICTBRIDGE_ERROR_SESSION_NOT_OPEN);
ux_host_class_pima_session_close イニシエータとレスポンダの間でセッションをクローズ
プロトタイプ
UINT ux_host_class_pima_session_close(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session)
説明
PIMA イニシエータと PIMA レスポンダの間でオープンされていたセッションをクローズする
ファンクションです。セッションがクローズしたら、ほとんどのPIMAコマンドは実行できなくなり
ます。
パラメータ
pima PIMA クラスインスタンスへのポインタ
pima_session PIMA セッションへのポインタ
返却値
UX_SUCCESS (0x00) セッションがクローズしました。
UX_HOST_CLASS_PIMA_RC_SESSION_NOT_OPEN (0x2003) セッションがオープンしていません。
例
/* Close the pima session. */ status = ux_host_class_pima_session_close(pima, pima_session);
ux_host_class_pima_storage_ids_get レスポンダからストレージ ID 配列を取得
プロトタイプ
UINT ux_host_class_pima_storage_ids_get(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, ULONG *storage_ids_array, ULONG storage_id_length)
説明
レスポンダからストレージ ID 配列を取得するファンクションです。
パラメータ
pima PIMA クラスインスタンスへのポインタ
pima_session PIMA セッションへのポインタ
storage_ids_array 返されるストレージ ID の配列
storage_id_length ストレージ配列の長さ
返却値
UX_SUCCESS (0x00) ストレージ ID 配列に入力されました。
UX_HOST_CLASS_PIMA_RC_SESSION_NOT_OPEN (0x2003) セッションがオープンしていません。
UX_MEMORY_INSUFFICIENT (0x12) PIMA コマンドを作成するためのメモ
リが不足しています。
例
/* Get the number of storage IDs. */ status = ux_host_class_pima_storage_ids_get(pima, pima_session,
pictbridge -> ux_pictbridge_storage_ids, 64); if (status != UX_SUCCESS) {
/* Close the pima session. */ status = ux_host_class_pima_session_close(pima, pima_session); return(UX_PICTBRIDGE_ERROR_STORE_NOT_AVAILABLE);
}
ux_host_class_pima_storage_info_get レスポンダからストレージ情報を取得
プロトタイプ
UINT ux_host_class_pima_storage_info_get(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, ULONG storage_id, UX_HOST_CLASS_PIMA_STORAGE *storage)
説明
値 storage_id のストレージコンテナに関するストレージ情報を取得するためのファンクション
です。
パラメータ
pima PIMA クラスインスタンスへのポインタ
pima_session PIMA セッションへのポインタ
storage_id ストレージコンテナの ID
storage ストレージ情報コンテナへのポインタ
返却値
UX_SUCCESS (0x00) ストレージ情報が取得されました。
UX_HOST_CLASS_PIMA_RC_SESSION_NOT_OPEN (0x2003) セッションがオープンしていません。
UX_MEMORY_INSUFFICIENT (0x12) PIMA コマンドを作成するためのメモ
リが不足しています。
例
/* Get the first storage ID info container. */ status = ux_host_class_pima_storage_info_get(pima, pima_session,
pictbridge -> ux_pictbridge_storage_ids[0], (UX_HOST_CLASS_PIMA_STORAGE *)pictbridge -> ux_pictbridge_storage);
if (status != UX_SUCCESS) {
/* Close the pima session. */ status = ux_host_class_pima_session_close(pictbridge ->
ux_pictbridge_pima, pima_session); return(UX_PICTBRIDGE_ERROR_STORE_NOT_AVAILABLE); }
ux_host_class_pima_num_objects_get レスポンダからストレージコンテナ上のオブジェクト数を取得
プロトタイプ
UINT ux_host_class_pima_num_objects_get(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, ULONG storage_id, ULONG object_format_code)
説明
特定のフォーマットコードに一致する storage_id 値を持つ特定のストレージコンテナにおいて、
保存されているオブジェクトの数を取得するファンクションです。オブジェクトの数は、
ux_host_class_pima_session_nb_objects of the pima_session 構造のフィールドに返され
ます。
パラメータ
pima PIMA クラスインスタンスへのポインタ
pima_session PIMA セッションへのポインタ
storage_id ストレージコンテナの ID
object_format_code オブジェクトフォーマットコードフィルタ
object_format_code には、次のいずれかの値を設定できます。
オブジェクト フォーマット
コード 説明//グループ名 USBX コード
0x3000 Undefined: 未定義の非イメー
ジオブジェクト UX_HOST_CLASS_PIMA_OFC_UNDEFINED
0x3001 Association: アソシエーション
(例: フォルダ) UX_HOST_CLASS_PIMA_OFC_ASSOCIATION
0x3002 Script: デバイスモデル固有の
スクリプト UX_HOST_CLASS_PIMA_OFC_SCRIPT
0x3003 Executable: デバイスモデル
固有のバイナリ実行形式 UX_HOST_CLASS_PIMA_OFC_EXECUTABLE
0x3004 Text: テキストファイル UX_HOST_CLASS_PIMA_OFC_TEXT
0x3005 HTML: HyperText Markup Language ファイル(テキスト) UX_HOST_CLASS_PIMA_OFC_HTML
0x3006 DPOF: Digital Print Order Format ファイル(テキスト) UX_HOST_CLASS_PIMA_OFC_DPOF
0x3007 AIFF オーディオクリップ UX_HOST_CLASS_PIMA_OFC_AIFF
0x3008 WAV オーディオクリップ UX_HOST_CLASS_PIMA_OFC_WAV
0x3009 MP3 オーディオクリップ UX_HOST_CLASS_PIMA_OFC_MP3
0x300A AVI ビデオクリップ UX_HOST_CLASS_PIMA_OFC_AVI
0x300B MPEG ビデオクリップ UX_HOST_CLASS_PIMA_OFC_MPEG
0x300C ASF: Microsoft Advanced Streaming Format(ビデオ) UX_HOST_CLASS_PIMA_OFC_ASF
0x3800 Undefined: 未定のイメージオ
ブジェクト UX_HOST_CLASS_PIMA_OFC_QT
0x3801 EXIF/JPEG: Exchangeable File Format(JEIDA 規格)
UX_HOST_CLASS_PIMA_OFC_EXIF_JPEG
0x3802 TIFF/EP: Tag Image File Format for Electronic Photography
UX_HOST_CLASS_PIMA_OFC_TIFF_EP
0x3803 FlashPix: 構造化ストレージイ
メージフォーマット UX_HOST_CLASS_PIMA_OFC_FLASHPIX
0x3804 BMP: Microsoft Windows Bitmap ファイル UX_HOST_CLASS_PIMA_OFC_BMP
0x3805 CIFF: Canon Camera Image File Format UX_HOST_CLASS_PIMA_OFC_CIFF
0x3806 Undefined Reserved
0x3807 GIF: Graphics Interchange Format UX_HOST_CLASS_PIMA_OFC_GIF
0x3808 JFIF: JPEG File Interchange Format UX_HOST_CLASS_PIMA_OFC_JFIF
0x3809 PCD: PhotoCD Image Pac UX_HOST_CLASS_PIMA_OFC_PCD
0x380A PICT: Quickdraw Image Format UX_HOST_CLASS_PIMA_OFC_PICT
0x380B PNG: Portable Network Graphics UX_HOST_CLASS_PIMA_OFC_PNG
0x380C Undefined Reserved
0x380D TIFF: Tag Image File Format UX_HOST_CLASS_PIMA_OFC_TIFF
0x380E
TIFF/IT: Tag Image File Format for Information Technology(グラフィックアー
ト)
UX_HOST_CLASS_PIMA_OFC_TIFF_IT
0x380F JP2: JPEG2000 Baseline File Format UX_HOST_CLASS_PIMA_OFC_JP2
0x3810 JPX: JPEG2000 Extended File Format UX_HOST_CLASS_PIMA_OFC_JPX
MSN が
0011 のその
他すべての
コード
任意の未定義コード;将来使用
MSN が
1011 のその
他すべての
コード
任意のベンダ定義コード ベンダ定義タイプ: イメージ
返却値
UX_SUCCESS (0x00) 転送が完了しました。
UX_HOST_CLASS_PIMA_RC_SESSION_NOT_OPEN (0x2003) セッションがオープンしていません。
UX_MEMORY_INSUFFICIENT (0x12) PIMA コマンドを作成するためのメモ
リが不足しています。
例
/* Get the number of objects on all containers matching a SCRIPT object. */
status = ux_host_class_pima_num_objects_get(pima, pima_session, UX_PICTBRIDGE_ALL_CONTAINERS, UX_PICTBRIDGE_OBJECT_SCRIPT);
if (status != UX_SUCCESS) {
/* Close the pima session. */ status = ux_host_class_pima_session_close(pima, pima_session); return(UX_PICTBRIDGE_ERROR_STORE_NOT_AVAILABLE);
} else
/* The number of objects is returned in the field: pima_session - > ux_host_class_pima_session_nb_objects */
ux_host_class_pima_object_handles_get レスポンダからオブジェクトハンドルを取得
プロトタイプ
UINT ux_host_class_pima_object_handles_get(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, ULONG *object_handles_array, ULONG object_handles_length, ULONG storage_id, ULONG object_format_code, ULONG object_handle_association)
説明
storage_id パラメータで示したストレージコンテナに存在するオブジェクトハンドルの配列を
返します。すべての記憶域にわたる集合リストが望まれる場合は、この値を0xFFFFFFFFに
設定するものとします。
パラメータ
pima PIMA クラスインスタンスへのポインタ pima_session PIMA セッションへのポインタ object_handes_array 返されるハンドルの配列 object_handles_length 配列の長さ storage_id ストレージコンテナの ID object_format_code オ ブ ジ ェ ク ト の フ ォ ー マ ッ ト コ ー ド
(ux_host_class_pima_num_objects_get ファンク
ションの項で示した表を参照) object_handle_association オプションのオブジェクトアソシエーション値
オブジェクトハンドルアソシエーションとしては、下の表に示すいずれかの値が可能です。
アソシエーションコード アソシエーションの種類 AssociationDesc 解釈
0x0000 Undefined Undefined 0x0001 GenericFolder 不使用 0x0002 Album 予約済み 0x0003 TimeSequence DefaultPlaybackDelta 0x0004 HorizontalPanoramic 不使用 0x0005 VerticalPanoramic 不使用 0x0006 2DPanoramic ImagesPerRow 0x0007 AncillaryData Undefined
ビット 15 を 0 に設定し
た、その他すべての値 Reserved Undefined
ビット 15 を 1 に設定し
た、すべての値 Vendor-Defined Vendor-Defined
返却値
UX_SUCCESS (0x00) 転送が完了しました。
UX_HOST_CLASS_PIMA_RC_SESSION_NOT_OPEN (0x2003) セッションがオープンしていません。
UX_MEMORY_INSUFFICIENT (0x12) PIMA コマンドを作成するためのメモ
リが不足しています。
例
/* Get the array of objects handles on the container. */ status = ux_host_class_pima_object_handles_get(pima, pima_session,
pictbridge -> ux_pictbridge_object_handles_array, 4 * pima_session -> ux_host_class_pima_session_nb_objects, UX_PICTBRIDGE_ALL_CONTAINERS, UX_PICTBRIDGE_OBJECT_SCRIPT, 0);
if (status != UX_SUCCESS) {
/* Close the pima session. */ status = ux_host_class_pima_session_close(pima, pima_session); return(UX_PICTBRIDGE_ERROR_STORE_NOT_AVAILABLE);
}
ux_host_class_pima_object_info_get レスポンダからオブジェクト情報を取得
プロトタイプ
UINT ux_host_class_pima_object_info_get(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, ULONG object_handle, UX_HOST_CLASS_PIMA_OBJECT *object)
説明
オブジェクトハンドルのオブジェクト情報を取得するファンクションです。
パラメータ
pima PIMA クラスインスタンスへのポインタ
pima_session PIMA セッションへのポインタ
object_handles オブジェクトのハンドル
object オブジェクト情報コンテナへのポインタ
返却値
UX_SUCCESS (0x00) 転送が完了しました。
UX_HOST_CLASS_PIMA_RC_SESSION_NOT_OPEN (0x2003) セッションがオープンしていません。
UX_MEMORY_INSUFFICIENT (0x12) PIMA コマンドを作成するためのメモ
リが不足しています。
例
/* We search for an object that is a picture or a script. */ object_index = 0; while (object_index < pima_session ->
ux_host_class_pima_session_nb_objects) {
/* Get the object info structure. */ status = ux_host_class_pima_object_info_get(pima, pima_session,
pictbridge -> ux_pictbridge_object_handles_array[object_index], pima_object);
if (status != UX_SUCCESS) {
/* Close the pima session. */ status = ux_host_class_pima_session_close(pima, pima_session); return(UX_PICTBRIDGE_ERROR_INVALID_OBJECT_HANDLE );
} }
ux_host_class_pima_object_info_send レスポンダにオブジェクト情報を送信
プロトタイプ
UINT ux_host_class_pima_object_info_send(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, ULONG storage_id, ULONG parent_object_id, UX_HOST_CLASS_PIMA_OBJECT *object)
説明
値 storage_id を持つストレージコンテナに関するストレージ情報を送信するためのファンク
ションです。オブジェクトをレスポンダに送信する前に、イニシエータでこのコマンドを使用す
ることが望まれます。
パラメータ
pima PIMA クラスインスタンスへのポインタ
pima_session PIMA セッションへのポインタ
storage_id 格納先ストレージ ID
parent_object_id オブジェクトを置くところの、レスポンダの親オブジェ
クトハンドル
object オブジェクト情報コンテナへのポインタ
返却値
UX_SUCCESS (0x00) 転送が完了しました。
UX_HOST_CLASS_PIMA_RC_SESSION_NOT_OPEN (0x2003) セッションがオープンしていません。
UX_MEMORY_INSUFFICIENT (0x12) PIMA コマンドを作成するためのメモ
リが不足しています。
例
/* Send a script info. */ status = ux_host_class_pima_object_info_send(pima, pima_session,
0, 0, pima_object); if (status != UX_SUCCESS) {
/* Close the pima session. */ status = ux_host_class_pima_session_close(pima, pima_session); return(UX_ERROR );
}
ux_host_class_pima_object_open レスポンダに保存されているオブジェクトをオープン
プロトタイプ
UINT ux_host_class_pima_object_open(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, ULONG object_handle, UX_HOST_CLASS_PIMA_OBJECT *object)
説明
読み出しまたは書き込みの前にレスポンダのオブジェクトをオープンするファンクションです。
パラメータ
pima PIMA クラスインスタンスへのポインタ
pima_session PIMA セッションへのポインタ
object_handles オブジェクトのハンドル
object オブジェクト情報コンテナへのポインタ
返却値
UX_SUCCESS (0x00) 転送が完了しました。 UX_HOST_CLASS_PIMA_RC_SESSION_NOT_OPEN (0x2003) セッションがオープンしていません。 UX_HOST_CLASS_PIMA_RC_OBJECT_ALREADY_OPENED (0x2021) オブジェクトは既にオープンしていま
す。
UX_MEMORY_INSUFFICIENT (0x12) PIMA コマンドを作成するためのメモ
リが不足しています。
例
/* Open the object. */ status = ux_host_class_pima_object_open(pima, pima_session,
object_handle, pima_object); /* Check status. */ if (status != UX_SUCCESS)
return(status);
ux_host_class_pima_object_get レスポンダに保存されているオブジェクトを取得
プロトタイプ
UINT ux_host_class_pima_object_get(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, ULONG object_handle, UX_HOST_CLASS_PIMA_OBJECT *object, UCHAR *object_buffer, ULONG object_buffer_length, ULONG *object_actual_length)
説明
レスポンダのオブジェクトを取得するファンクションです。
パラメータ
pima PIMA クラスインスタンスへのポインタ pima_session PIMA セッションへのポインタ object_handles オブジェクトのハンドル object オブジェクト情報コンテナへのポインタ object_buffer オブジェクトデータのアドレス object_buffer_length 要求されたオブジェクト長さ object_actual_length 返却対象のオブジェクトの長さ
返却値
UX_SUCCESS (0x00) 転送されました。
UX_HOST_CLASS_PIMA_RC_SESSION_NOT_OPEN (0x2003) セッションがオープンしていません。
UX_HOST_CLASS_PIMA_RC_OBJECT_NOT_OPENED (0x2023) オブジェクトがオープンしていません。
UX_HOST_CLASS_PIMA_RC_ACCESS_DENIED (0x200f) オブジェクトへのアクセスが拒否されま
した。
UX_HOST_CLASS_PIMA_RC_INCOMPLETE_TRANSFER (0x2007) 転送は未完です。
UX_MEMORY_INSUFFICIENT (0x12) PIMA コマンドを作成するためのメモリ
が不足しています。
UX_TRANSFER_ERROR (0x23) オブジェクトの読み出し中に転送エ
ラーが発生しました。
例
/* Open the object. */ status = ux_host_class_pima_object_open(pima, pima_session,
object_handle, pima_object); /* Check status. */ if (status != UX_SUCCESS) return(status); /* Set the object buffer pointer. */ object_buffer = pima_object -> ux_host_class_pima_object_buffer; /* Obtain all the object data. */ while(object_length != 0) {
/* Calculate what length to request. */ if (object_length > UX_PICTBRIDGE_MAX_PIMA_OBJECT_BUFFER)
/* Request maximum length. */ requested_length = UX_PICTBRIDGE_MAX_PIMA_OBJECT_BUFFER;
else
/* Request remaining length. */ requested_length = object_length;
/* Get the object data. */ status = ux_host_class_pima_object_get(pima, pima_session,
object_handle, pima_object, object_buffer, requested_length, &actual_length);
if (status != UX_SUCCESS) {
/* We had a problem, abort the transfer. */ ux_host_class_pima_object_transfer_abort(pima, pima_session,
object_handle, pima_object); /* And close the object. */ ux_host_class_pima_object_close(pima, pima_session,
object_handle, pima_object); return(status);
} /* We have received some data, update the length remaining. */ object_length -= actual_length; /* Update the buffer address. */ object_buffer += actual_length;
} /* Close the object. */ status = ux_host_class_pima_object_close(pima, pima_session,
object_handle, pima_object);
ux_host_class_pima_object_send レスポンダに保存されているオブジェクトを送信
プロトタイプ
UINT ux_host_class_pima_object_send(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, UX_HOST_CLASS_PIMA_OBJECT *object, UCHAR *object_buffer, ULONG object_buffer_length)
説明
レスポンダにオブジェクトを送信するファンクションです。
パラメータ
pima PIMA クラスインスタンスへのポインタ
pima_session PIMA セッションへのポインタ
object_handles オブジェクトのハンドル
object オブジェクト情報コンテナへのポインタ
object_buffer オブジェクトデータのアドレス
object_buffer_length 要求されたオブジェクト長さ
返却値
UX_SUCCESS (0x00) 転送が完了しました。
UX_HOST_CLASS_PIMA_RC_SESSION_NOT_OPEN (0x2003) セッションがオープンしていません。 UX_HOST_CLASS_PIMA_RC_OBJECT_NOT_OPENED (0x2023) オブジェクトがオープンしていませ
ん。 UX_HOST_CLASS_PIMA_RC_ACCESS_DENIED (0x200f) オブジェクトへのアクセスが拒否され
ました。
UX_HOST_CLASS_PIMA_RC_INCOMPLETE_TRANSFER (0x2007) 転送は未完です。
UX_MEMORY_INSUFFICIENT (0x12) PIMA コマンドを作成するためのメモ
リが不足しています。
UX_TRANSFER_ERROR (0x23) オブジェクトの書き込み中に転送エ
ラーが発生しました。
例
/* Open the object. */ status = ux_host_class_pima_object_open(pima, pima_session,
object_handle, pima_object);
/* Get the object length. */ object_length = pima_object -> ux_host_class_pima_object_compressed_size; /* Recall the object buffer address. */ pima_object_buffer = pima_object -> ux_host_class_pima_object_buffer; /* Send all the object data. */ while(object_length != 0) {
/* Calculate what length to request. */ if (object_length > UX_PICTBRIDGE_MAX_PIMA_OBJECT_BUFFER)
/* Request maximum length. */ requested_length = UX_PICTBRIDGE_MAX_PIMA_OBJECT_BUFFER;
else
/* Request remaining length. */ requested_length = object_length;
/* Send the object data. */ status = ux_host_class_pima_object_send(pima, pima_session, pima_object,
pima_object_buffer, requested_length); if (status != UX_SUCCESS) {
/* Abort the transfer. */ ux_host_class_pima_object_transfer_abort(pima, pima_session,
object_handle, pima_object); /* Return status. */ return(status);
} /* We have sent some data, update the length remaining. */ object_length -= requested_length;
} /* Close the object. */ status = ux_host_class_pima_object_close(pima, pima_session, object_handle,
pima_object);
ux_host_class_pima_thumb_get レスポンダに保存されているサムオブジェクトを取得
プロトタイプ
UINT ux_host_class_pima_thumb_get(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, ULONG object_handle, UX_HOST_CLASS_PIMA_OBJECT *object, UCHAR *thumb_buffer, ULONG thumb_buffer_length, ULONG *thumb_actual_length)
説明
レスポンダのサムオブジェクトを取得するファンクションです。
パラメータ
pima PIMA クラスインスタンスへのポインタ
pima_session PIMA セッションへのポインタ
object_handles オブジェクトのハンドル
object オブジェクト情報コンテナへのポインタ
thumb_buffer サムオブジェクトデータのアドレス
thumb_buffer_length 要求されたサムオブジェクト長さ
thumb_actual_length 返却対象のサムオブジェクトの長さ
返却値
UX_SUCCESS (0x00) 転送が完了しました。
UX_HOST_CLASS_PIMA_RC_SESSION_NOT_OPEN (0x2003) セッションがオープンしていません。 UX_HOST_CLASS_PIMA_RC_OBJECT_NOT_OPENED (0x2023) オブジェクトがオープンしていません。
UX_HOST_CLASS_PIMA_RC_ACCESS_DENIED (0x200f) オブジェクトへのアクセスが拒否されま
した。 UX_HOST_CLASS_PIMA_RC_INCOMPLETE_TRANSFER (0x2007) 転送は未完です。
UX_MEMORY_INSUFFICIENT (0x12) PIMA コマンドを作成するためのメモリ
が不足しています。
UX_TRANSFER_ERROR (0x23) オブジェクトの読み出し中に転送エ
ラーが発生しました。
例
/* Get the thumb object data. */ status = ux_host_class_pima_thumb_get(pima, pima_session,
object_handle, pima_object, object_buffer, requested_length, &actual_length);
if (status != UX_SUCCESS) {
/* And close the object. */ ux_host_class_pima_object_close(pima, pima_session, o
bject_handle, pima_object); return(status);
}
ux_host_class_pima_object_delete レスポンダに保存されているオブジェクトを削除
プロトタイプ
UINT ux_host_class_pima_object_delete(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, ULONG object_handle)
説明
レスポンダのオブジェクトを削除するファンクションです。
パラメータ
pima PIMA クラスインスタンスへのポインタ
pima_session PIMA セッションへのポインタ
object_handles オブジェクトのハンドル
返却値
UX_SUCCESS (0x00) オブジェクトが削除されました。
UX_HOST_CLASS_PIMA_RC_SESSION_NOT_OPEN (0x2003) セッションがオープンしていません。 UX_HOST_CLASS_PIMA_RC_ACCESS_DENIED (0x200f) オブジェクトを削除できません。
UX_MEMORY_INSUFFICIENT (0x12) PIMA コマンドを作成するためのメモ
リが不足しています。
例
/* Delete the object. */ status = ux_host_class_pima_object_delete(pima, pima_session,
object_handle, pima_object); /* Check status. */ if (status != UX_SUCCESS)
return(status);
ux_host_class_pima_object_close レスポンダに保存されているオブジェクトをクローズ
プロトタイプ
UINT ux_host_class_pima_object_close(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, ULONG object_handle)
説明
レスポンダのオブジェクトをクローズするファンクションです。
パラメータ
pima PIMA クラスインスタンスへのポインタ
pima_session PIMA セッションへのポインタ
object_handles オブジェクトのハンドル
返却値
UX_SUCCESS (0x00) オブジェクトがクローズしました。
UX_HOST_CLASS_PIMA_RC_SESSION_NOT_OPEN (0x2003) セッションがオープンしていません。 UX_HOST_CLASS_PIMA_RC_OBJECT_NOT_OPENED (0x2023) オブジェクトがオープンしていませ
ん。
UX_MEMORY_INSUFFICIENT (0x12) PIMA コマンドを作成するためのメモ
リが不足しています。
例
/* Close the object. */ status = ux_host_class_pima_object_close(pima, pima_session,
object_handle, pima_object);
ux_host_class_gser_read ジェネリックシリアルインタフェースから読み出す
プロトタイプ
UINT ux_host_class_gser_read(UX_HOST_CLASS_GSER *gser, UCHAR *data_pointer, ULONG interface_index, ULONG requested_length, ULONG *actual_length)
説明
ジェネリックシリアルインタフェースから読み出すためのファンクションです。これはブロッキン
グコールであり、エラーがあるときまたは転送が完了したときにのみ返されます。
パラメータ
gser クラスインスタンスへのポインタ
Interface_index 読み出し元のインタフェースインデックス
data_pointer データペイロードのバッファアドレスへのポインタ
requested_length 受信する長さ
actual_length 実際に受信した長さ
返却値
UX_SUCCESS (0x00) データ転送が完了しました。
UX_TRANSFER_TIMEOUT (0x5c) 転送タイムアウト。読み出しは未完で
す。
例
UINT status; /* The following example illustrates this service.*/ status = ux_host_class_gser_read(cdc_acm, interface, data_pointer,
requested_length, &actual_length); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_host_class_gser_write ジェネリックシリアルインタフェースに書き込む
プロトタイプ
UINT ux_host_class_gser_write(UX_HOST_CLASS_CDC_ACM *cdc_acm, ULONG interface_index, UCHAR *data_pointer, ULONG requested_length, ULONG *actual_length)
説明
ジェネリックシリアルインタフェースに書き込むためのファンクションです。これはブロッキング
コールであり、エラーがあるときまたは転送が完了したときにのみ返されます。
パラメータ
Gser クラスインスタンスへのポインタ
interface_index 書き込み先のインタフェース
data_pointer データペイロードのバッファアドレスへのポインタ
requested_length 送信する長さ
actual_length 実際に送信した長さ
返却値
UX_SUCCESS (0x00) データ転送が完了しました。
UX_TRANSFER_TIMEOUT (0x5c) 転送タイムアウト。書き込みは未完です。
例
UINT status; /* The following example illustrates this service.*/ status = ux_host_class_cdc_acm_write(cdc_acm, data_pointer,
requested_length, &actual_length); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_host_class_gser_ioctl ジェネリックシリアルインタフェースに IOCTL ファンクションを実行
プロトタイプ
UINT ux_host_class_cdc_acm_ioctl(UX_HOST_CLASS_CDC_ACM *cdc_acm, ULONG interface_index, ULONG ioctl_function, VOID *parameter)
説明
特定の ioctl ファンクションを gser インタフェースに対して実行するファンクションです。これは
ブロッキングコールであり、エラーがあるときまたはコマンドが完了したときにのみ返されま
す。
パラメータ
Gser クラスインスタンスへのポインタ
Interface_index インタフェースインデックス
ioctl_function 実行対象の ioctlファンクション。許容される ioctlファ
ンクションは、下の表の中のいずれかです。
parameter ioctl 固有のパラメータへのポインタ。
返却値
UX_SUCCESS (0x00) データ転送が完了しました。
UX_MEMORY_INSUFFICIENT (0x12) メモリが不足しています。
UX_HOST_CLASS_UNKNOWN (0x59) クラスインスタンスが間違っています。
UX_FUNCTION_NOT_SUPPORTED (0x54) 未定義の ioctl ファンクションです。
IOCTL ファンクションの一覧
UX_HOST_CLASS_GSER_IOCTL_SET_LINE_CODING UX_HOST_CLASS_GSER_IOCTL_GET_LINE_CODING UX_HOST_CLASS_GSER_IOCTL_SET_LINE_STATE UX_HOST_CLASS_GSER_IOCTL_SEND_BREAK UX_HOST_CLASS_GSER_IOCTL_ABORT_IN_PIPE UX_HOST_CLASS_GSER_IOCTL_ABORT_OUT_PIPE UX_HOST_CLASS_GSER_IOCTL_NOTIFICATION_CALLBACK UX_HOST_CLASS_GSER_IOCTL_GET_DEVICE_STATUS
例
UINT status; /* The following example illustrates this service.*/ status = ux_host_class_gser_write(gser, data_pointer, interface_index,
requested_length, &actual_length); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_host_class_gser_reception_start ジェネリックシリアルインタフェース上で受信を起動
プロトタイプ
UINT ux_host_class_gser_reception_start(UX_HOST_CLASS_GSER *gser, UX_HOST_CLASS_GSER_RECEPTION *gser_reception)
説明
ジェネリックシリアルクラスインタフェース上での受信を起動するファンクションです。非ブロッ
キング受信に対応しています。バッファを受信したときに、アプリケーションにコールバックが
呼び込まれます。
パラメータ
Gser クラスインスタンスへのポインタ
gser_reception 受信パラメータを含む構造
返却値
UX_SUCCESS (0x00) データ転送が完了しました。
UX_HOST_CLASS_UNKNOWN (0x59) クラスインスタンスが間違っています。
UX_ERROR (0x01) エラー
例
/* Start the reception for gser. AT commands are on interface 2.*/ gser_reception.ux_host_class_gser_reception_interface_index =
UX_DEMO_GSER_AT_INTERFACE; gser_reception.ux_host_class_gser_reception_block_size =
UX_DEMO_RECEPTION_BLOCK_SIZE; gser_reception.ux_host_class_gser_reception_data_buffer =
gser_reception_buffer; gser_reception.ux_host_class_gser_reception_data_buffer_size = UX_DEMO_RECEPTION_BUFFER_SIZE;
gser_reception.ux_host_class_gser_reception_callback = tx_demo_thread_callback;
ux_host_class_gser_reception_start(gser, &gser_reception);
ux_host_class_gser_reception_stop ジェネリックシリアルインタフェース上で受信を停止
プロトタイプ
UINT ux_host_class_gser_reception_stop(UX_HOST_CLASS_GSER *gser, UX_HOST_CLASS_GSER_RECEPTION *gser_reception)
説明
ジェネリックシリアルクラスインタフェース上での受信を停止するファンクションです。
パラメータ
Gser クラスインスタンスへのポインタ
gser_reception 受信パラメータを含む構造
返却値
UX_SUCCESS (0x00) データ転送が完了しました。
UX_HOST_CLASS_UNKNOWN (0x59) クラスインスタンスが間違っています。
UX_ERROR (0x01) エラー
例
/* Stops the reception for gser.*/ ux_host_class_gser_reception_stop(gser, &gser_reception);
第 6 章 USBX DPUMP クラスについて USBX には、ホスト側用とデバイス側用の DPUMP クラスが含まれています。このクラスは、それ自
体が標準クラスではありませんが、2つのバルクパイプを使用し、これらのパイプ上でデータのやりと
りをすることで、単純なデバイスを作成する方法を例示するものとなっています。DPUMP クラスを使
用すると、カスタムクラスやレガシーRS232 デバイスを起動するなどが可能です。
USB DPUMP のフローチャート
ホストアプリケーション DPUMPホストクラス USBホストスタック USBデバイススタック
パケットを書く
_ux_host_class_dpump_write
_ux_host_stack_transfer_request
転送完了を待機転送完了を待機
転送ステータスと送信データ長を受信
パケットを受信
_ux_host_class_dpump_read
_ux_host_stack_transfer_request
転送完了を待機
送信ステータス、データパケット、受信データ長を受信
転送完了を待機
_ux_device_stack_transfer_request
バルクアウト上で転送完了を待機
DPUMPデバイスクラススレッド
パケットを待機
転送完了を待機
パケットを書く
転送完了を待機
_ux_device_stack_transfer_request
バルクアウト上でインパケットを待機
USBX DPUMP ホストクラス DPUMP クラスのホスト側は、データの送信用、データの受信用の、2 つのファンクションを備えてい
ます。
ux_host_class_dpump_write ux_host_class_dpump_read
どちらのファンクションも、DPUMP アプリケーションの簡易化のためにブロッキングファンクションと
なっています。IN パイプと OUT パイプを同時に実行させておく必要がある場合は、またアプリケー
ション側で送信スレッドと受信スレッドを作成する必要があります。
書き込み関数のプロトタイプは次の通りです。
UINT ux_host_class_dpump_write(UX_HOST_CLASS_DPUMP *dpump, UCHAR * data_pointer, ULONG requested_length, ULONG *actual_length)
ここで、
dpump は、クラスのインスタンス data_pointer は、送信対象のバッファへのポインタ requested_length は、送信する長さ actual_length は、転送が(正常にまたは部分的に)完了した後に送信される長さ
受信ファンクションのプロトタイプは次の通りです。
UINT host_class_dpump_read(UX_HOST_CLASS_DPUMP *dpump, UCHAR *data_pointer, ULONG requested_length, ULONG *actual_length)
ホスト DPUMP クラスの一例を次に示します。ここでは、アプリケーションがデバイス側へのパケット
を書き、同じパケットを受信側で受信します。
/* We start with a 'A' in buffer. */ current_char = 'A'; while(1) {
/* Initialize the write buffer.*/ ux_utility_memory_set(out_buffer, current_char,
UX_HOST_CLASS_DPUMP_PACKET_SIZE); /* Increment the character in buffer. */ current_char++; /* Check for upper alphabet limit. */ if (current_char > 'Z')
current_char = 'A';
/* Write to the Data Pump Bulk out endpoint. */ status = ux_host_class_dpump_write (dpump, out_buffer,
UX_HOST_CLASS_DPUMP_PACKET_SIZE, &actual_length);
/* Verify that the status and the amount of data is correct. */ if ((status == UX_SUCCESS) && actual_length ==
UX_HOST_CLASS_DPUMP_PACKET_SIZE) {
/* Read to the Data Pump Bulk out endpoint. */ status = ux_host_class_dpump_read (dpump, in_buffer,
UX_HOST_CLASS_DPUMP_PACKET_SIZE, &actual_length); }
USBX DPUMP デバイスクラス デバイス DPUMP クラスでは、USB ホストとの接続後に起動されるスレットを使用します。このスレッ
ドは、バルクアウト・エンドポイントに着信するパケットを待機します。パケットを受信するとスレッドは、
その内容をバルクイン・エンドポイント・バッファにコピーし、このエンドポイントにトランザクションをポ
ストします。この状態で、このエンドポイントからの読み取りの要求をホストが発行するまで待機しま
す。こうして、バルクアウト・エンドポイントとバルクイン・エンドポイントの間にループバックメカニズム
が形成されます。
第 7 章 ピクトブリッジの実装 USBX は、ホストとデバイスの両側でピクトブリッジの完全実装をサポートします。どちらの側でも、ピ
クトブリッジは USBX PIMA クラスの上に載ります。
ピクトブリッジ規格では、デジタルスチルカメラやスマートフォンから PC を介さずに直接プリンタへの
接続を許容し、一定のピクトブリッジ対応プリンタへの直接印刷を可能にします。
カメラやスマートフォンをプリンタに接続したときに、プリンタが USB ホスト、カメラが USB デバイスで
す。しかしピクトブリッジでは、カメラがホストとして現れ、コマンドはカメラから駆動されます。カメラが
ストレージサーバであり、プリンタがストレージクライアントです。カメラがプリントクライアントであり、
当然にプリンタがプリントサーバです。
ピクトブリッジでは USB をトランスポートレイヤとして使用しますが、通信プロトコルとして PTP(Picture Transfer Protocol)を使用します。
下の図に、プリントジョブが発生したときの、DPS クライアントと DPS サーバの間でのコマンドと応答
の様子を示します。
ピクトブリッジクライアントの実装 クライアント側のピクトブリッジでは、USBX デバイススタックと PIMA クラスを最初に実行させておく
必要があります。
PIMA クラスのデバイスフレームワークは次のように記述されます。
UCHAR device_framework_full_speed[] = {
/* Device descriptor */ 0x12, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, 0x20, 0xA9, 0x04, 0xB6, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, /* Configuration descriptor */ 0x09, 0x02, 0x27, 0x00, 0x01, 0x01, 0x00, 0xc0, 0x32, /* Interface descriptor */ 0x09, 0x04, 0x00, 0x00, 0x03, 0x06, 0x01, 0x01, 0x00, /* Endpoint descriptor (Bulk Out) */ 0x07, 0x05, 0x01, 0x02, 0x40, 0x00, 0x00, /* Endpoint descriptor (Bulk In) */ 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00, /* Endpoint descriptor (Interrupt) */ 0x07, 0x05, 0x83, 0x03, 0x08, 0x00, 0x60
};
DPS_ConfigurePrintServicesDPS_ConfigurePrintServices
DPS_GetCapabilities
DPS_StartJob
DPS_GetFileInfo
DPS_GetFile
DPS_NotifyDeviceStatus
プリントデータ
ストレージデバイス ストレージサーバ プリントクライアント
DPS サービスディスカバリ
プリントサーバストレージクライアント
プリントデバイス
アプリケーションが印刷開始
ファイルデータを取得
ファイルデータ
PIMA クラスでは ID フィールド 0x06 を使用しています。そのサブクラスは静止画像用の 0x01、プロ
トコルは PIMA 15740 用の 0x01 となっています。
このクラスでは、データの送受信用にバルクエンドポイントが 2 つ、イベント用にインタラプトエンドポ
イントが 1 つ、合計 3 つのエンドポイントを定義しています。
他の USBX デバイスの実装とは異なり、ピクトブリッジアプリケーションではクラス自体を定義する必
要はありません。代わりに、ファンクション ux_pictbridge_dpsclient_start を呼び出します。例を次に
示します。
/* Initialize the Pictbridge string components.*/ ux_utility_memory_copy
(pictbridge.ux_pictbridge_dpslocal.ux_pictbridge_devinfo_vendor_name, "ExpressLogic",13);
ux_utility_memory_copy (pictbridge.ux_pictbridge_dpslocal.ux_pictbridge_devinfo_product_name, "EL_Pictbridge_Camera",21);
ux_utility_memory_copy (pictbridge.ux_pictbridge_dpslocal.ux_pictbridge_devinfo_serial_no, "ABC_123",7);
ux_utility_memory_copy (pictbridge.ux_pictbridge_dpslocal.ux_pictbridge_devinfo_dpsversions, "1.0 1.1",7);
pictbridge.ux_pictbridge_dpslocal. ux_pictbridge_devinfo_vendor_specific_version = 0x0100;
/* Start the Pictbridge client. */ status = ux_pictbridge_dpsclient_start(&pictbridge); if(status != UX_SUCCESS)
return;
ピクトブリッジクライアントに渡されるパラメータは、次の通りです。
pictbridge.ux_pictbridge_dpslocal.ux_pictbridge_devinfo_vendor_name :String of Vendor name
pictbridge.ux_pictbridge_dpslocal.ux_pictbridge_devinfo_product_name :String of product name
pictbridge.ux_pictbridge_dpslocal.ux_pictbridge_devinfo_serial_no, :String of serial number
pictbridge.ux_pictbridge_dpslocal.ux_pictbridge_devinfo_dpsversions :String of version
pictbridge.ux_pictbridge_dpslocal. ux_pictbridge_devinfo_vendor_specific_version :Value set to 0x0100;
次のステップでは、デバイスとホストを同期させ、情報の交換に備えさせます。
そのために、次のようにイベントフラグを待機します。
/* We should wait for the host and the client to discover one another. */ status = ux_utility_event_flags_get
(&pictbridge.ux_pictbridge_event_flags_group, UX_PICTBRIDGE_EVENT_FLAG_DISCOVERY,TX_AND_CLEAR, &actual_flags, UX_PICTBRIDGE_EVENT_TIMEOUT);
ステートマシンが DISCOVERY_COMPLETE ステートならば、カメラ側(DPS クライアント)がプリン
タとその能力に関して情報を収集します。
DPS 側 で プ リ ン ト ジ ョ ブ の 受 け 付 け が 可 能 な 状 態 で あ れ ば 、 そ の ス テ ー タ ス が
UX_PICTBRIDGE_NEW_JOB_TRUE に設定されます。これは次のように確認できます。
/* Check if the printer is ready for a print job. */ if (pictbridge.ux_pictbridge_dpsclient.ux_pictbridge_devinfo_newjobok ==
UX_PICTBRIDGE_NEW_JOB_TRUE) /* We can print something … */
次に、いくつかのプリントジョブ記述子に以下のように入力する必要があります。
/* We can start a new job.Fill in the JobConfig and PrintInfo structures.*/ jobinfo = &pictbridge.ux_pictbridge_jobinfo; /* Attach a printinfo structure to the job. */ jobinfo -> ux_pictbridge_jobinfo_printinfo_start = &printinfo; /* Set the default values for print job. */ jobinfo -> ux_pictbridge_jobinfo_quality =
UX_PICTBRIDGE_QUALITIES_DEFAULT; jobinfo -> ux_pictbridge_jobinfo_papersize =
UX_PICTBRIDGE_PAPER_SIZES_DEFAULT; jobinfo -> ux_pictbridge_jobinfo_papertype =
UX_PICTBRIDGE_PAPER_TYPES_DEFAULT; jobinfo -> ux_pictbridge_jobinfo_filetype =
UX_PICTBRIDGE_FILE_TYPES_DEFAULT; jobinfo -> ux_pictbridge_jobinfo_dateprint =
UX_PICTBRIDGE_DATE_PRINTS_DEFAULT; jobinfo -> ux_pictbridge_jobinfo_filenameprint =
UX_PICTBRIDGE_FILE_NAME_PRINTS_DEFAULT; jobinfo -> ux_pictbridge_jobinfo_imageoptimize =
UX_PICTBRIDGE_IMAGE_OPTIMIZES_OFF; jobinfo -> ux_pictbridge_jobinfo_layout =
UX_PICTBRIDGE_LAYOUTS_DEFAULT; jobinfo -> ux_pictbridge_jobinfo_fixedsize =
UX_PICTBRIDGE_FIXED_SIZE_DEFAULT; jobinfo -> ux_pictbridge_jobinfo_cropping =
UX_PICTBRIDGE_CROPPINGS_DEFAULT; /* Program the callback function for reading the object data. */ jobinfo -> ux_pictbridge_jobinfo_object_data_read =
ux_demo_object_data_copy;
/* This is a demo, the fileID is hardwired (1 and 2 for scripts, 3 for photo to be printed. */
printinfo.ux_pictbridge_printinfo_fileid = UX_PICTBRIDGE_OBJECT_HANDLE_PRINT;
ux_utility_memory_copy(printinfo.ux_pictbridge_printinfo_filename, "Pictbridge demo file", 20);
ux_utility_memory_copy(printinfo.ux_pictbridge_printinfo_date, "01/01/2008", 10);
/* Fill in the object info to be printed. First get the pointer to the
object container in the job info structure.*/ object = (UX_SLAVE_CLASS_PIMA_OBJECT *) jobinfo ->
ux_pictbridge_jobinfo_object; /* Store the object format:JPEG picture. */ object -> ux_device_class_pima_object_format =
UX_DEVICE_CLASS_PIMA_OFC_EXIF_JPEG; object -> ux_device_class_pima_object_compressed_size =IMAGE_LEN; object -> ux_device_class_pima_object_offset = 0; object -> ux_device_class_pima_object_handle_id =
UX_PICTBRIDGE_OBJECT_HANDLE_PRINT; object -> ux_device_class_pima_object_length = IMAGE_LEN; /* File name is in Unicode. */ ux_utility_string_to_unicode("JPEG Image", object ->
ux_device_class_pima_object_filename); /* And start the job. */ status =ux_pictbridge_dpsclient_api_start_job(&pictbridge);
以上でピクトブリッジクライアントは、実行するプリントジョブが与えられたので、アプリケーションから
コールバックを介してイメージブロック群を一度にフェッチします。このコールバックは次のフィールド
で定義されます。
jobinfo -> ux_pictbridge_jobinfo_object_data_read
そのファンクションのプロトコルは、次のように定義されます。
ux_pictbridge_jobinfo_object_data_read プリント用にユーザスペースからデータブロックをコピー
プロトタイプ
UINT ux_pictbridge_jobinfo_object_data_read(UX_PICTBRIDGE *pictbridge, UCHAR *object_buffer, ULONG object_offset, ULONG object_length, ULONG *actual_length)
説明
ターゲットのピクトブリッジプリンタにプリントするために DSP クライアントがデータブロックを
取り込む必要が生じたときに、このファンクションがコールされます。
パラメータ
pictbridge ピクトブリッジクラスインスタンスへのポインタ
object_buffer オブジェクトバッファへのポインタ
object_offset データブロックの読み出しを始める場所
object_length 返す長さ
actual_length 実際に返された長さ
返却値
UX_SUCCESS (0x00) この操作は成功しました。
UX_ERROR (0x01) アプリケーションがデータを取り込めませんでした。
例
/* Copy the object data. */ UINT ux_demo_object_data_copy(UX_PICTBRIDGE *pictbridge,UCHAR *object_buffer,
ULONG object_offset, ULONG object_length, ULONG *actual_length) {
/* Copy the demanded object data portion. */ ux_utility_memory_copy(object_buffer, image + object_offset,
object_length); /* Update the actual length. */ *actual_length = object_length; /* We have copied the requested data.Return OK. */ return(UX_SUCCESS);
}
ピクトブリッジホストの実装 ピクトブリッジのホスト実装は、クライアント実装とは異なります。
ピクトブリッジホスト環境において最初に行うことは、PIMA クラスを下の例のように登録することで
す。
status = ux_host_stack_class_register(ux_system_host_class_pima_name, ux_host_class_pima_entry);
if(status != UX_SUCCESS) return;
このクラスは、USB ホストスタックとピクトブリッジレイヤの間に挟まれる PTP レイヤです。
次のステップは、プリントサービス用のピクトブリッジのデフォルト値を次のように初期化することで
す。
ピクトブリッジのフィールド 値 DpsVersion[0] DpsVersion[1] DpsVersion[2] VendorSpecificVersion
0x00010000 0x00010001 0x00000000 0x00010000
PrintServiceAvailable 0x30010000
Qualities[0] Qualities[1] Qualities[2] Qualities[3]
UX_PICTBRIDGE_QUALITIES_DEFAULT UX_PICTBRIDGE_QUALITIES_NORMAL UX_PICTBRIDGE_QUALITIES_DRAFT UX_PICTBRIDGE_QUALITIES_FINE
PaperSizes[0] PaperSizes[1] PaperSizes[2] PaperSizes[3] PaperSizes[4]
UX_PICTBRIDGE_PAPER_SIZES_DEFAULT UX_PICTBRIDGE_PAPER_SIZES_4IX6I UX_PICTBRIDGE_PAPER_SIZES_L UX_PICTBRIDGE_PAPER_SIZES_2L UX_PICTBRIDGE_PAPER_SIZES_LETTER
PaperTypes[0] PaperTypes[1] PaperTypes[2]
UX_PICTBRIDGE_PAPER_TYPES_DEFAULT UX_PICTBRIDGE_PAPER_TYPES_PLAIN UX_PICTBRIDGE_PAPER_TYPES_PHOTO
FileTypes[0] FileTypes[1] FileTypes[2] FileTypes[3]
UX_PICTBRIDGE_FILE_TYPES_DEFAULT UX_PICTBRIDGE_FILE_TYPES_EXIF_JPEG UX_PICTBRIDGE_FILE_TYPES_JFIF UX_PICTBRIDGE_FILE_TYPES_DPOF
DatePrints[0] DatePrints[1] DatePrints[2]
UX_PICTBRIDGE_DATE_PRINTS_DEFAULT UX_PICTBRIDGE_DATE_PRINTS_OFF UX_PICTBRIDGE_DATE_PRINTS_ON
FileNamePrints[0] FileNamePrints[1] FileNamePrints[2]
UX_PICTBRIDGE_FILE_NAME_PRINTS_DEFAULT UX_PICTBRIDGE_FILE_NAME_PRINTS_OFF UX_PICTBRIDGE_FILE_NAME_PRINTS_ON
ImageOptimizes[0] UX_PICTBRIDGE_IMAGE_OPTIMIZES_DEFAULT
ピクトブリッジのフィールド 値 ImageOptimizes[1] ImageOptimizes[2]
UX_PICTBRIDGE_IMAGE_OPTIMIZES_OFF UX_PICTBRIDGE_IMAGE_OPTIMIZES_ON
Layouts[0] Layouts[1] Layouts[2] Layouts[3]
UX_PICTBRIDGE_LAYOUTS_DEFAULT UX_PICTBRIDGE_LAYOUTS_1_UP_BORDER UX_PICTBRIDGE_LAYOUTS_INDEX_PRINT UX_PICTBRIDGE_LAYOUTS_1_UP_BORDERLESS
FixedSizes[0] FixedSizes[1] FixedSizes[2] FixedSizes[3] FixedSizes[4] FixedSizes[5] FixedSizes[6]
UX_PICTBRIDGE_FIXED_SIZE_DEFAULT UX_PICTBRIDGE_FIXED_SIZE_35IX5I UX_PICTBRIDGE_FIXED_SIZE_4IX6I UX_PICTBRIDGE_FIXED_SIZE_5IX7I UX_PICTBRIDGE_FIXED_SIZE_7CMX10CM UX_PICTBRIDGE_FIXED_SIZE_LETTER UX_PICTBRIDGE_FIXED_SIZE_A4
Croppings[0] Croppings[1] Croppings[2]
UX_PICTBRIDGE_CROPPINGS_DEFAULT UX_PICTBRIDGE_CROPPINGS_OFF UX_PICTBRIDGE_CROPPINGS_ON
DPS ホストのステートマシンは、アイドルに設定され、新しいプリントジョブの受け付けが可能になり
ます。
これで、下の例のようにピクトブリッジのホスト部が起動可能になります。
/* Activate the pictbridge dpshost. */ status = ux_pictbridge_dpshost_start(&pictbridge, pima); if (status != UX_SUCCESS)
return;
データがプリント可能になったときに、ピクトブリッジホストファンクションにはコールバックが必要にな
ります。そのためには、次のようにピクトブリッジホスト構造にファンクションポインタを渡します。
/* Set a callback when an object is being received. */ pictbridge.ux_pictbridge_application_object_data_write =
tx_demo_object_data_write;
このファンクションは次のようなプロパティを持ちます。
ux_pictbridge_application_object_data_write 印刷用にデータブロックを書き込む
プロトタイプ
UINT ux_pictbridge_application_object_data_write(UX_PICTBRIDGE *pictbridge,UCHAR *object_buffer, ULONG offset, ULONG total_length, ULONG length);
説明
ローカルプリンタにプリントするために DPS サーバが DSP クライアントからデータブロックを
取り組む必要が生じたときに、このファンクションがコールされます。
パラメータ
pictbridge ピクトブリッジクラスインスタンスへのポインタ
object_buffer オブジェクトバッファへのポインタ
object_offset データブロックの読み出しを始める場所
total_length オブジェクトの全長
length このバッファの長さ
返却値
UX_SUCCESS (0x00) この操作は成功しました。
UX_ERROR (0x01) アプリケーションがデータをプリントできませんでし
た。
例
/* Copy the object data. */ UINT tx_demo_object_data_write(UX_PICTBRIDGE *pictbridge,
UCHAR *object_buffer, ULONG offset, ULONG total_length, ULONG length); { UINT status;
/* Send the data to the local printer. */ status = local_printer_data_send(object_buffer, length); /* We have printed the requested data.Return status. */ return(status);
}
第 8 章 USBX OTG OTG対応 USBコントローラがハードウェア設計に用意されているときは、USBXで USBの OTG機
能をサポートします。
USBXは、USBコアスタック内でOTGをサポートします。ただし、OTGが機能するためには、一定の
USB コントローラが必要です。USBX OTG コントローラのファンクションは、usbx_otg ディレクトリに
収めてあります。現在の USBX バージョンでは、すべての OTG 機能を備えた NXP LPC3131 のみ
をサポートします。
通常のコントローラドライバファンクション(ホストまたはデバイス)は従来どおりに標準の USBX usbx_device_controllersと usbx_host_controllersに収めてありますが、usbx_otgディレクトリには
特に USB コントローラに関連する OTG 機能を格納しています。
通常のホスト/デバイスのファンクションに加え、OTG コントローラ対応ファンクションには次の 4 種
類があります。
• VBUS 固有ファンクション • コントローラの起動と停止 • USB ロールマネージャ • インタラプトハンドラ
VBUS ファンクション 電力管理要件に基づいて VBUS のステートを変更するために、各コントローラは VBUS マネージャ
を搭載する必要があります。このファンクションは通常、VBUSのオン/オフ切り替えのみを実行しま
す。
コントローラの起動と停止 通常の USB 実装とは異なり、OTG ではロールを変更するときに、ホストスタックとデバイススタック
(またはそのいずれか)をアクティブ/非アクティブ化する必要があります。
USB ロールマネージャ USB ロールマネージャは、USB のステートを変更するためのコマンドを受信します。遷移を必要とす
るステートが、次のようにいくつかあります。
ステート 値 説明//グループ名 UX_OTG_IDLE 0 デバイスはアイドル。通常は、何にも接続していない。 UX_OTG_IDLE_TO_HOST 1 デバイスがタイプ A コネクタに接続している。 UX_OTG_IDLE_TO_SLAVE 2 デバイスがタイプ B コネクタに接続している。 UX_OTG_HOST_TO_IDLE 3 ホストデバイスが切断された。 UX_OTG_HOST_TO_SLAVE 4 ホストからスレーブへのロール切り替え UX_OTG_SLAVE_TO_IDLE 5 スレーブデバイスが切断している UX_OTG_SLAVE_TO_HOST 6 スレーブからへホストのロール切り替え
インタラプトハンドラ OTG用のホストコントローラドライバとデバイスコントローラドライバには、従来の USBインタラプトを
超えた信号(特に SRP や VBUS による信号)をモニタするために、別種のインタラプトハンドラが必
要です。
USB OTG コントローラを初期化する方法として、ここでは NXP LPC3131 を例に説明します。
/* Initialize the LPC3131 OTG controller. */ status = ux_otg_lpc3131_initialize(0x19000000, lpc3131_vbus_function,
tx_demo_change_mode_callback); この例では、VBUS ファンクションとモード変更用コールバックを(ホストからスレーブ、またはその逆
に)渡すことで、LPC3131 を OTG モードで初期化します。
コールバックファンクションでは、単に新しいモードを記録し、保留中のスレッドをウェイクアップして
新しいステートを取らせるようにします。
void tx_demo_change_mode_callback(ULONG mode) {
/* Simply save the otg mode. */ otg_mode = mode; /* Wake up the thread that is waiting. */ ux_utility_semaphore_put(&mode_change_semaphore);
}
渡されるモード値としては、以下の値が可能です。
• UX_OTG_MODE_IDLE • UX_OTG_MODE_SLAVE • UX_OTG_MODE_HOST
アプリケーションは次の変数を調べて、デバイスが何であるかを常に確認することができます。
ux_system_otg -> ux_system_otg_device_type この値としては、次のものが可能です。
• UX_OTG_DEVICE_A • UX_OTG_DEVICE_B • UX_OTG_DEVICE_IDLE
USB OTG ホストデバイスは、次のコマンドを発行することで、いつでもロールの切り替えを要求でき
ます。
/* Ask the stack to perform a HNP swap with the device. We relinquish the host role to A device.*/
ux_host_stack_role_swap(storage -> ux_host_class_storage_device);
スレーブデバイスから発行するコマンドはありませんが、スレーブデバイスではロールを変更するよ
うにステートを設定することができます。すなわち、ホストが GET_STATUS を発行したときに変更後
のロールがホストによりピックアップされ、切り替えが実行されます。
/* We are a B device, ask for role swap. The next GET_STATUS from the host will get the status change and do the HNP.*/
ux_system_otg -> ux_system_otg_slave_role_swap_flag = UX_OTG_HOST_REQUEST_FLAG;
インデックス Asix クラス ................................................. 72 CDC-ACM クラス ....................................... 72 DPUMP ................... 5, 7, 133, 134, 135, 136 EHCI コントローラ ................................ 20, 27 FileX ................................................ 2, 9, 14 HID クラス............... 72, 86, 87, 89, 91, 93, 94 LUN .......................................................... 16 NetX ....................................................... 2, 9 OHCI コントローラ ............... 15, 20, 21, 27, 65 OTG ........................ 5, 7, 8, 9, 146, 147, 148 PIMA クラス ...................... 137, 138, 139, 143 Picture Transfer Protocol ........................ 137 Prolific クラス ............................................. 72 SCSI logical unit ....................................... 16 ThreadX ................ 2, 7, 9, 11, 13, 14, 16, 25 TraceX ........................................................ 9 UNICODE ........................................... 43, 45 USB IF ..................................... 27, 31, 32, 43 USBX コンポーネント .................................. 25 USBX スレッド ............................................ 16 USBX ピクトブリッジ ......................... 5, 7, 137 USB デバイス .................................3, 4, 9, 29 USB プロトコル ...................................... 8, 10 USB ホストスタック ............ 24, 25, 26, 48, 143 VBUS .............................................. 146, 147 target ........................ 11, 13, 14, 16, 23, 142 timer tick ................................................... 15 version_id ................................................. 23 インタフェース記述子 ................. 4, 29, 37, 138 エンドポイント記述子 ......... 4, 29, 40, 138, 139 オーディオクラス ......................................... 72 クラスインスタンス .......... 9, 52, 53, 54, 55, 56,
73, 74, 75, 76, 77, 78, 80, 81, 83, 84, 95, 96, 97, 98, 99, 101, 102, 103, 104, 106, 109, 111, 113, 115, 117, 121, 123, 125, 126, 127, 128, 129, 131, 132, 142, 145
クラスコンテナ ............... 15, 50, 52, 53, 54, 55 クラスレイヤ ................................................. 8
コールバック ................ 5, 48, 49, 87, 88, 131, 141, 144, 147, 148
コントローラレイヤ ......................................... 8 コンフィギュレーション ............. 4, 9, 15, 25, 26,
29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 40, 41, 43, 57, 58, 59, 60, 66, 68, 71
コンフィギュレーション記述子 ..... 4, 29, 34, 138 ジェネリックシリアルクラス ........................... 72 受信スレッド ............................................. 134 初期化 .............. 14, 20, 21, 22, 25, 27, 48, 64 スタックレイヤ ............................................... 8 ストリング記述子 ............................... 4, 29, 43 ストレージクラス .......................................... 72 スレーブ ........................................... 147, 148 セマフォ .............................................. 32, 148 送信スレッド ............................................. 134 デバイスインデックス ................................... 61 デバイス記述子 .................. 4, 29, 31, 45, 138 デバイス側 ....................... 8, 11, 19, 133, 134 転送 ................................. 4, 9, 26, 27, 28, 42 電力管理 .................................... 4, 9, 28, 147 バルクアウト ..................................... 136, 138 バルクイン ........................................ 136, 139 パイプ ............................................ 41, 49, 70 ハンドル ........... 32, 33, 36, 40, 43, 49, 57, 59,
62, 66, 70, 109, 111, 115, 117, 119, 120, 121, 122, 123, 124, 125, 126, 141
ファンクショナル記述子.......................... 29, 45 プリンタクラス ............................................. 72 ホストコントローラ ........... 9, 13, 15, 16, 20, 21,
22, 25, 26, 27, 43, 48, 64 ホストスタック ...................... 19, 21, 24, 25, 40 ホスト側 ............................................... 8, 134 マスタ ......................................................... 28 メモリ不足 ............. 51, 52, 55, 64, 70, 76, 99,
103, 104, 108, 110, 111, 113, 115, 117, 121, 123, 125, 126, 129
メモリ割り当て....................................... 52, 55 ルートハブ ....... 3, 4, 24, 25, 26, 27, 28, 33, 34