Comments
Description
Transcript
USBX™ Host Stack ユーザーズマニュアル(参考資料)
User’s Manual USBXTM Host Stack ユーザーズマニュアル (参考資料) Renesas SynergyTM プラットフォーム 本資料は英語版を翻訳した参考資料です。内容に相違がある場合には英語版を優先します。資料によって は英語版のバージョンが更新され、内容が変わっている場合があります。日本語版は参考用としてご使用 のうえ、最新および正式な内容については英語版のドキュメントをご参照ください。 資料番号 R11UM0008EU0570、リビジョン Rev.5.70、発行日 2015 年 10 月 1 日の翻訳版です。 www.renesas.com Rev.5.70 2016.09 ご注意書き 1. 本資料に記載された回路、ソフトウェアおよびこれらに関連する情報は、半導体製品の動作例、応用例を説 明するものです。お客様の機器・システムの設計において、回路、ソフトウェアおよびこれらに関連する情 報を使用する場合には、お客様の責任において行ってください。これらの使用に起因して、お客様または第 三者に生じた損害に関し、当社は、一切その責任を負いません。 2. 本資料に記載されている情報は、正確を期すため慎重に作成したものですが、誤りがないことを保証するもの ではありません。万一、本資料に記載されている情報の誤りに起因する損害がお客様に生じた場合において も、当社は、一切その責任を負いません。 3. 本資料に記載された製品デ-タ、図、表、プログラム、アルゴリズム、応用回路例等の情報の使用に起因して 発生した第三者の特許権、著作権その他の知的財産権に対する侵害に関し、当社は、何らの責任を負うもので はありません。当社は、本資料に基づき当社または第三者の特許権、著作権その他の知的財産権を何ら許諾す るものではありません。 4. 当社製品を改造、改変、複製等しないでください。かかる改造、改変、複製等により生じた損害に関し、当社 は、一切その責任を負いません。 資 料 5. 当社は、当社製品の品質水準を「標準水準」および「高品質水準」に分類しており、各品質水準は、以下に示 す用途に製品が使用されることを意図しております。 標準水準:コンピュータ、OA機器、通信機器、計測機器、AV機器、家電、工作機械、パーソナル機器、 産業用ロボット等 高品質水準:輸送機器(自動車、電車、船舶等)、交通用信号機器、防災・防犯装置、各種安全装置等 当社製品は、直接生命・身体に危害を及ぼす可能性のある機器・システム(生命維持装置、人体に埋め込み使 用するもの等)、もしくは多大な物的損害を発生させるおそれのある機器・システム(原子力制御システム、 軍事機器等)に使用されることを意図しておらず、使用することはできません。たとえ、意図しない用途に当 社製品を使用したことによりお客様または第三者に損害が生じても、当社は一切その責任を負いません。なお、 ご不明点がある場合は、当社営業にお問い合わせください。 参 考 6. 当社製品をご使用の際は、当社が指定する最大定格、動作電源電圧範囲、放熱特性、実装条件その他の保証範 囲内でご使用ください。当社保証範囲を超えて当社製品をご使用された場合の故障および事故につきまして は、当社は、一切その責任を負いません。 7. 当社は、当社製品の品質および信頼性の向上に努めていますが、半導体製品はある確率で故障が発生したり、 使用条件によっては誤動作したりする場合があります。また、当社製品は耐放射線設計については行っており ません。当社製品の故障または誤動作が生じた場合も、人身事故、火災事故、社会的損害等を生じさせないよ う、お客様の責任において、冗長設計、延焼対策設計、誤動作防止設計等の安全設計およびエージング処理 等、お客様の機器・システムとしての出荷保証を行ってください。特に、マイコンソフトウェアは、単独での 検証は困難なため、お客様の機器・システムとしての安全検証をお客様の責任で行ってください。 8. 当社製品の環境適合性等の詳細につきましては、製品個別に必ず当社営業窓口までお問合せください。ご使用 に際しては、特定の物質の含有・使用を規制する RoHS指令等、適用される環境関連法令を十分調査のうえ、 かかる法令に適合するようご使用ください。お客様がかかる法令を遵守しないことにより生じた損害に関し て、当社は、一切その責任を負いません。 9. 本資料に記載されている当社製品および技術を国内外の法令および規則により製造・使用・販売を禁止されて いる機器・システムに使用することはできません。また、当社製品および技術を大量破壊兵器の開発等の目 的、軍事利用の目的その他軍事用途に使用しないでください。当社製品または技術を輸出する場合は、「外国 為替及び外国貿易法」その他輸出関連法令を遵守し、かかる法令の定めるところにより必要な手続を行ってく ださい。 10. お客様の転売等により、本ご注意書き記載の諸条件に抵触して当社製品が使用され、その使用から損害が生 じた場合、当社は何らの責任も負わず、お客様にてご負担して頂きますのでご了承ください。 11. 本資料の全部または一部を当社の文書による事前の承諾を得ることなく転載または複製することを禁じま す。 注 1. 本資料において使用されている「当社」とは、ルネサス エレクトロニクス株式会社およびルネサス エレク トロニクス株式会社がその総株主の議決権の過半数を直接または間接に保有する会社をいいます。 注 2. 本資料において使用されている「当社製品」とは、注1 において定義された当社の開発、製造製品をいいます。 (2012.4) Renesas Synergy™プラットフォーム向け 製品情報 料 Renesas Synergy プラットフォームで USBX™を使用する 場合、以下の情報をご参照ください。 Renesas Synergy プラットフォームのサポートに関するご質 問およびお問合せは、下記のサポート窓口およびお問合せ先 へご連絡ください。 サポート窓口 https://synergygallery.renesas.com/support お問合せ先 http://japan.renesas.com/contact/index.jsp USBX™の インストール USBX™は Renesas Synergy Software Package(SSP)を 構成するコンポーネントのひとつです。お客様が SSP を Renesas Synergy ギャラリーからダウンロードしてインス トールすると、USBX™も同時にインストールされます。 このため、お客様が再度 USBX™を単独でインストールす る必要はありません。 製品に含まれ ないファイル の扱い SSP を通じて提供する USBX™には、以下のファイルは含 まれていません。以下のファイルの使用についての説明を ご覧いただく必要はありません。 ・readme_usbx.txt ・demo_usbx.c 参 考 資 カスタマー・ サポート ユーザーガイド 資 料 高性能 USB スタック 参 考 USBX ホストスタック・ユーザガイド ©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 第2章 資 複数ホストコントローラのサポート .......................................................................... 8 USB ソフトウェアスケジューラ ................................................................................ 8 USB デバイスフレームワークの完全なサポート ..................................................... 8 使いやすい API..................................................................................................... 8 USBX のインストール..................................................................... 9 ホストについて ............................................................................................................... 9 参 考 コンピュータの種類 ................................................................................................ 9 ダウンロード用インタフェース ................................................................................. 9 デバッグツール ..................................................................................................... 9 必要なハードディスク容量 ..................................................................................... 9 ターゲットについて................................................................................................. 9 コンフィギュレーションオプション.................................................................................... 12 ソースコードツリー ........................................................................................................ 14 USBX リソースの初期化 .............................................................................................. 15 USB ホストコントローラの定義 ...................................................................................... 16 ホストクラスの定義 ....................................................................................................... 17 トラブルシューティング .................................................................................................. 19 USBX バージョン ID ..................................................................................................... 19 第3章 USBX ホストスタックのファンクション コンポーネント ...................... 20 実行概要 ..................................................................................................................... 20 初期化 ................................................................................................................ 21 アプリケーションインタフェースコール ................................................................... 21 USB ホストスタック API ....................................................................................... 21 USB ホストクラス API .......................................................................................... 21 ルートハブ ................................................................................................................... 22 ハブクラス .................................................................................................................... 22 USB ホストスタック ....................................................................................................... 22 トポロジマネージャ ....................................................................................................... 22 USB クラスのバインド .................................................................................................. 22 USBX API ................................................................................................................... 23 ホストコントローラ ......................................................................................................... 23 ルートハブ........................................................................................................... 24 電力管理 ............................................................................................................ 24 エンドポイント ...................................................................................................... 24 転送.................................................................................................................... 24 USB デバイスのフレームワーク .................................................................................... 25 USBX ホストサービスの説明 ........................................................ 42 資 第4章 料 デバイス記述子 ................................................................................................... 27 コンフィギュレーション記述子 ............................................................................... 30 インタフェース記述子 ........................................................................................... 32 エンドポイント記述子 ........................................................................................... 35 ストリング記述子 ................................................................................................. 38 ファンクショナル記述子 ........................................................................................ 40 メモリ内の USBX デバイス記述子フレームワーク................................................. 40 参 考 ux_host_stack_initialize ..................................................................................... 43 ux_host_stack_endpoint_transfer_abort ........................................................... 44 ux_host_stack_class_get .................................................................................. 45 ux_host_stack_class_register ........................................................................... 46 ux_host_stack_class_instance_create .............................................................. 47 ux_host_stack_class_instance_destroy ............................................................ 48 ux_host_stack_class_instance_get ................................................................... 49 ux_host_stack_device_configuration_get ......................................................... 50 ux_host_stack_device_configuration_select ..................................................... 51 ux_host_stack_device_get ................................................................................ 53 ux_host_stack_interface_endpoint_get ............................................................. 54 ux_host_stack_hcd_register .............................................................................. 56 ux_host_stack_configuration_interface_get ...................................................... 58 ux_host_stack_interface_setting_select ............................................................ 59 ux_host_stack_transfer_request_abort ............................................................. 60 ux_host_stack_transfer_request ....................................................................... 61 第5章 USBX ホストクラスの API ............................................................ 63 ux_host_class_printer_read .............................................................................. 64 ux_host_class_printer_write .............................................................................. 65 ux_host_class_printer_soft_reset ...................................................................... 66 ux_host_class_printer_status_get ..................................................................... 67 ux_host_class_audio_read ................................................................................ 68 ux_host_class_audio_write ............................................................................... 69 ux_host_class_audio_control_get ..................................................................... 70 ux_host_class_audio_control_value_set ........................................................... 71 ux_host_class_audio_streaming_sampling_set ................................................ 72 ux_host_class_audio_streaming_sampling_get ................................................ 73 ux_host_class_hid_client_register..................................................................... 75 ux_host_class_hid_report_callback_register .................................................... 76 参 考 資 料 ux_host_class_hid_periodic_report_start .......................................................... 77 ux_host_class_hid_periodic_report_stop .......................................................... 78 ux_host_class_hid_report_get........................................................................... 79 ux_host_class_hid_report_set ........................................................................... 80 ux_host_class_asix_read .................................................................................. 81 ux_host_class_asix_write .................................................................................. 82 ux_host_class_cdc_acm_read .......................................................................... 83 ux_host_class_cdc_acm _write ......................................................................... 84 ux_host_class_cdc_acm_ioctl ........................................................................... 85 ux_host_class_pima_session_open .................................................................. 87 ux_host_class_pima_session_close ................................................................. 88 ux_host_class_pima_storage_ids_get .............................................................. 89 ux_host_class_pima_storage_info_get ............................................................. 90 ux_host_class_pima_num_objects_get ............................................................ 91 ux_host_class_pima_object_handles_get ......................................................... 94 ux_host_class_pima_object_info_get................................................................ 96 ux_host_class_pima_object_info_send ............................................................. 98 ux_host_class_pima_object_open .................................................................. 100 ux_host_class_pima_object_get ..................................................................... 101 ux_host_class_pima_object_send................................................................... 103 ux_host_class_pima_thumb_get ..................................................................... 105 ux_host_class_pima_object_delete................................................................. 107 ux_host_class_pima_object_close .................................................................. 108 ux_host_class_gser_read................................................................................ 109 ux_host_class_gser_write ............................................................................... 110 ux_host_class_gser_ioctl ................................................................................ 111 ux_host_class_gser_reception_start ............................................................... 113 ux_host_class_gser_reception_stop ............................................................... 114 第6章 USBX DPUMP クラスについて .................................................. 115 USBX DPUMP ホストクラス ....................................................................................... 116 USBX DPUMP デバイスクラス................................................................................... 118 第7章 ピクトブリッジの実装 ................................................................... 119 ピクトブリッジクライアントの実装 ................................................................................. 120 ux_pictbridge_jobinfo_object_data_read ......................................................... 124 ピクトブリッジホストの実装 .......................................................................................... 125 ux_pictbridge_application_object_data_write .................................................. 127 第8章 USBX OTG ............................................................................... 128 インデックス ................................................................................................. 131 本書について 本書では、Express Logic, Inc.の高性能 USB ファウンデーションソフトウェア USBX について包括的 に説明します。 本書は、組み込み式リアルタイムソフトウェアの開発者を対象にしています。開発者は、標準的なリ アルタイムオペレーティングシステムファンクション、USB 仕様、および C プログラミング言語に精通 していることとします。 本書の構成 第 1 章では、USB について紹介します。 料 USB 関連の技術的な情報については、http://www.USB.org/developers から USB 仕様書および 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 各相の関係は次のようになっています。 クラスドライバ クラスドライバ ホストスタック デバイススタック ホストコントローラ ドライバ ホストコントローラ ドライバ ホストコントローラ デバイスコントローラ ホスト 側 デバイ ス側 製品ハイライト USBX の強力なサービス 資 複数ホストコントローラのサポート 料 ThreadX プロセッサの完全なサポートロイヤルティなし 完全な ANSI C ソースコード リアルタイムパフォーマンス迅速なテクニカルサポート 複数のクラスサポート 複数のクラスインスタンス ThreadX、FileX、NetX とのクラス統合 複数コンフィギュレーション対応の USB デバイスのサポート USB 複合デバイスのサポート カスケードハブのサポート USB 電力管理のサポート USB OTG のサポート TraceX のトレースイベントのエクスポート 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 パッケージにより異なります。以下は、 ほとんどの製品配布に共通する重要ファイルのリストです。 USBX ポートに関するファイルで、ターゲットプロセッサ、開発ツールな どが含まれています。 ux_api.h すべてのシステム equate、データ構造、サービスプロトタイプを記述し た C ヘッダファイルです。 ux_port.h 開発ツール向けのデータ定義と構造をすべて記述した C ヘッダファイ ルです。 ux.lib USBX C ライブラリのバイナリバージョンです。標準パッケージで配布さ れます。 demo_usbx.c 簡単な USBX デモを記述した C ファイルです。 資 料 readme_usbx.txt 参 考 ファイル名はすべて小文字で表します。これにより、コマンドを 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 ファイルの修正が必要になる場合があります。ハード ウェアプラットフォームごとに異なるステップとなるため、ここでは説明しません。 アプリケーションソースコードをコンパイルし、それを USBX と ThreadX のランタイ ムライブラリとリンクし(USB ストレージクラスや USB ネットワーククラスをコンパイ ルするときは FileX や Netx も必要になる場合があります)、また ux.a(または ux.lib) と tx.a(または tx.lib)にもリンクします。結果をターゲットにダウンロードすれば実行 できます。 参 考 資 料 ステップ 8 コンフィギュレーションオプション USBX ライブラリの構築用にいくつかのコンフィギュレーションオプションがあります。オプションはす べて ux_port.h に置かれています。 各コンフィギュレーションオプションについて、以下に詳述します。配布ディスクで提供される readme_usbx.txt ファイルに、その他の開発ツールオプションが記述されています。 UX_PERIODIC_RATE 個々のハードウェアプラットフォームにおける秒あたりのティック数です。デフォルトは 1000、すなわ ちミリ秒あたり 1 ティックです。 料 UX_MAX_CLASS_DRIVER UX_MAX_HCD 資 USBX でロード可能なクラスの最大数です。クラスコンテナを表す値であり、1 クラスのインスタンス 数ではありません。例えば、USBX の実装にハブクラス、プリンタクラス、およびストレージクラスが必 要な場合、これらのクラスに属するデバイス数とは無関係に、UX_MAX_CLASS_DRIVER 値を 3 に 設定できます。 参 考 システムで使用可能なホストコントローラの数です。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 UX_THREAD_PRIORITY_CLASS 資 バストポロジをモニタする USBX 列挙スレッドの ThreadX 優先度値です。 標準 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 OTG USBX ホストクラス 参 考 USBX デバイス クラス 資 USBX デバイス コントローラ USBX ネットワーク USBX の例 料 USBX デバイススタック Windows ホストファイル 各ファイルを名前で識別できるように、以下の表記法を採用しています。 ファイルの説明 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 ファンクションは次のパラメータを使用します。 コントローラ名のストリング コントローラの初期化ファンクション 通常は、コントローラで使用する IO 値またはメモリ 通常は、コントローラで使用する IRQ 参 考 hcd_name: hcd_initialize_function: hcd_param1: hcd_param2: 前の例では次のようになります。 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 SH2A Renesas RX62 組み込みホストコントローラ Renesas SH2A ベースの組み込みホストコントローラ STM32 MUSB ST Micro STM32 F1/F2/F4 組み込みホストコントローラ 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 ホストスタックについて、ファンクションの観点から説明 します。 実行概要 資 初期化 アプリケーションインタフェースコール ルートハブ ハブクラス ホストクラス USB ホストスタック ホストコントローラ 料 USBX は、次のコンポーネントから構成されます。 参 考 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 つあります。この記述子には、デバイス識別子、サポー トしているコンフィギュレーションの数、およびデバイスのコンフィギュレーションに使用するデフォルト の制御エンドポイントの特性が記述されます。 フィールド サイズ 値 数値 定数 BCD BLength bDescriptorType bcdUSB 1 1 2 4 bDeviceClass 1 この記述子のサイズ(単位、バイト) デバイス記述子の型 USB 仕様リリース番号(2 進化 10 進数) 例例: 2.10 は 0x210 と等しい。このフィールドには、デバ イスとその記述子が準拠する USB 仕様のリリース番号 を示します。 クラス クラスコード(USB-IF により割り当てられる)。 このフィールドを 0 にリセットすると、コンフィギュレーショ ン内の各インタフェースが自身のクラス情報を指定し、 それぞれのインタフェースが独立して動作します。 このフィールドを 1~0xFE の値に設定すると、デバイス はインタフェースごとに異なるクラス仕様をサポートする ことになり、各インタフェースは独立して動作しない場合 があります。この値は、インタフェースの集合に使用され るクラス定義を特定します。 このフィールドを 0xFF に設定すると、ベンダ固有のデバ イスクラスになります。 サブクラス サブクラスコード(USB-IF により割り当てられる)。 これらのコードは bDeviceClass フィールドの値に修飾さ れます。bDeviceClass フィールドが 0 にリセットされた 場合は、このフィールドも 0 にリセットする必要がありま す。bDeviceClass フィールドが 0xFF に設定されない場 合、すべての値が USB による割り当て用に予約されま す。 プロトコル プロトコルコード(USB-IF により割り当てられる)。 こ れ ら の コ ー ド は bDeviceClass フ ィ ー ル ド と bDeviceSubClass フィールドの値に修飾されます。イン タフェースベースではなくクラスベースのクラス固有プロ トコルをサポートするデバイスでは、デバイスが使用す るプロトコルを、デバイスクラスの仕様の定義に従ってこ のコードで識別します。このフィールドを 0 にリセットする と、デバイスはクラス固有プロトコルをデバイスベースで 使用しません。 ただし、インタフェースベースでクラス固有プロトコルを 使用することはできます。 このフィールドを 0xFF に設定すると、デバイスはベンダ 固有プロトコルをデバイスベースで使用します。 数値 エンドポイント 0 の最大パケットサイズ(バイトサイズ 8、 16、32、または 64 のみが有効) ID ベンダ ID(USB-IF により割り当てられる) 5 参 考 資 0 1 2 説明 料 オフ セット bDeviceSubClass 1 bDeviceProtocol 1 7 bMaxPacketSize0 1 8 idVendor 2 6 10 12 14 15 16 idProduct bcdDevice iManufacturer iProduct iSerialNumber 2 2 1 1 1 17 bNumConfiguration s 1 製品 ID(メーカーにより割り当てられる) デバイスリリース番号(2 進化 10 進数) インデックス メーカーを記述するストリング記述子のインデックス インデックス 製品を記述するストリング記述子のインデックス インデックス デバイスのシリアル番号を記述するストリング記述子の インデックス 数値 可能なコンフィギュレーションの数 ID BCD 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_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 SET_ADDRESS コマンドが受け付けられた後のデバイス のアドレス(1~127)。 参 考 ux_device_address 資 料 ux_device_handle ux_device_speed デバイスの速度。 UX_LOW_SPEED_DEVICE UX_FULL_SPEED_DEVICE UX_HIGH_SPEED_DEVICE 0 1 2 ux_device_port_location 親デバイス(ルートハブまたはハブ)のポートのインデック ス。 ux_device_max_power 選択されたコンフィギュレーションにおいてデバイスに取り 込める最大電力(単位、mA)。 ux_device_power_source 次の 2 つのいずれかの値が可能です。 UX_DEVICE_BUS_POWERED UX_DEVICE_SELF_POWERED 1 2 ux_device_current_configuration このデバイスで現在使用しているコンフィギュレーションの インデックス。 ux_device_parent このデバイスの親のデバイスコンテナポインタ。ポインタが NULL なら、コントローラのルートハブが親です。 このデバイスを所有するクラス型へのポインタ。 ux_device_class_instance このデバイスを所有するクラスのインスタンスへのポイン タ。 ux_device_hcd このデバイスがアタッチされる USB ホストコントローライン スタンス。 ux_device_first_configuration このデバイスの 1 番目のコンフィギュレーションコンテナへ のポインタ。 ux_device_next_device USBX により検出されるいずれかのバスにあるデバイス のうち、デバイスリストに含まれる次のデバイスへのポイ ンタ。 ux_device_descriptor ux_device_control_endpoint USB device descriptor. このデバイスで使用するデフォルトの制御エンドポイントの 記述子。 ux_device_hub_tt デバイスのハブ TT の配列。 資 コンフィギュレーション記述子 料 ux_device_class 参 考 コンフィギュレーション記述子には、特定のデバイスコンフィギュレーションに関する情報を記述しま す。USB デバイスには、1 つ以上のコンフィギュレーション記述子を含めることができます。デバイス 記述子の bNumConfigurations フィールドに、コンフィギュレーション記述子の数が示されます。コン フィギュレーション記述子の bConfigurationValue フィールドの値は、それが Set Configuration 要求 へのパラメータとして使用された場合、その値に対応するコンフィギュレーションをデバイスが取るよ うになります。 コンフィギュレーション記述子には、コンフィギュレーションで提供されるインタフェースの数を記述し ます。各インタフェースは、デバイス内での論理ファンクションを表すもので、それぞれ独立して動作 することが可能です。例えば USB オーディオスピーカでは、オーディオストリーミングインタフェース、 オーディオコントロールインタフェース、各種スピーカボタンの管理用の HID インタフェースが各 1 個、 合計 3 個のインタフェースを設けることができます。 ホストがコンフィギュレーション記述子に対して GET_DESCRIPTOR 要求を発行すると、関連するイ ンタフェース記述子とエンドポイント記述子がすべて返されます。 オフセット フィールド サイズ 値 説明 bLength 1 数値 この記述子のサイズ(単位、バイト) 1 bDescriptorType 1 定数 コンフィギュレーション 2 wTotalLength 2 数値 このコンフィギュレーションに対して返される データの合計長さ。このコンフィギュレーション に対して返されるすべての記述子(コンフィギュ レーション、インタフェース、エンドポイント、お よびクラス固有またはベンダ固有)を組合わせ た長さが含まれます。 4 bNumInterfaces 1 数値 このコンフィギュレーションでサポートされるイ ンタフェースの合計数。 5 bConfigurationValue 1 数値 このコンフィギュレーションを選択するために Set Configuration の引数として使用する値。 6 iConfiguration 1 インデックス このコンフィギュレーションを記述するストリン グ記述子のインデックス。 7 bMAttributes 1 ビットマップ 料 0 8 参 考 資 コンフィギュレーション特性 D7 バス電力 D6 自己電力 D5 リモートウェイクアップ D4..0 予約済み(0 にリセット) バスからの電力およびローカル電源を使用す るデバイスコンフィギュレーションでは、D7 と D6 の両方をセットします。実行時の実際の電 源は、Get Status デバイス要求を使用して決 定することも可能です。 デバイスコンフィギュレーションがリモートウェイ クアップをサポートする場合は、D5 を 1 に設定 します。 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 ux_configuration_first_interface USB device descriptor. このコンフィギュレーションの 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 のみを使用します。 クラス クラスコード(USB により割り当てられる)。 この値を 0 にリセットすると、インタフェースは USB 指定のどのデバイスクラスにも属さなく なります。 このフィールドを 0xFF に設定すると、インタ フェースクラスはベンダ固有になります。 その他の値はすべて、USB による割り当て 用に予約されています。 bInterfaceClass 1 6 bInterfaceSubClas s 1 サブクラス サブクラスコード(USB により割り当てられ る)。 これらのコードは bInterfaceClass フィールド の値に修飾されます。bInterfaceClass フィー ルドが 0 にリセットされた場合は、このフィー ルドも 0 にリセットする必要があります。 bInterfaceClass フィールドが 0xFF に設定さ れない場合、すべての値が USB による割り 当て用に予約されます。 7 bInterfaceProtocol 1 プロトコル プロトコルコード(USB により割り当てられ る)。これらのコードは bInterfaceClass フィー ルドと bInterfaceSubClass フィールドの値に 修飾されます。クラス固有要求をインタフェー スでサポートする場合、デバイスクラスの仕 様に従ってデバイスが使用するプロトコル を、このコードで特定します。 このフィールドを 0 にリセットすると、デバイス はこのインタフェースにクラス固有プロトコル を使用しません。このフィールドを 0xFF に設 定すると、デバイスはこのインタフェースにベ ンダ固有プロトコルを使用します。 8 参 考 資 料 5 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 ULONG ULONG struct UX_INTERFACE_DESCRIPTOR_STRUCT struct UX_HOST_CLASS_STRUCT VOID struct UX_ENDPOINT_STRUCT struct UX_INTERFACE_STRUCT struct UX_CONFIGURATION_STRUCT } UX_INTERFACE; ux_interface_handle; ux_interface_state; ux_interface_current_alternate_setting; ux_interface_descriptor; *ux_interface_class; *ux_interface_class_instance; *ux_interface_first_endpoint; *ux_interface_next_interface; *ux_interface_configuration; 変数の説明 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 エンドポイント bmAttributes 1 ビットマップ このフィールドには、bConfigurationValue を用いてエ ンドポイントをコンフィギュレーションするときの、エンド ポイントの属性を記述します。 ビット 1~0: 転送の種類 00 = 制御 01 = アイソクロナス 10 = バルク 11 = インタラプト 料 3 4 参 考 資 アイソクロナスエンドポイントでない場合は、ビット 5~ 2 は予約されていて、0 に設定する必要があります。ア イソクロナスの場合は、次のように定義されます。 wMaxPacketSize 2 数値 ビット 3~2:同期の種類 00 = 同期なし 01 = 非同期 10 = 適応 11 = 同期 ビット 5~4:使用法の種類 00 = データエンドポイント 01 = フィードバックエンドポイント 10 = インプリシット・フィードバックデータエンドポイント このコンフィギュレーションを選択したときにこのエンド ポイントで送受信可能な最大パケットサイズ。 アイソクロナスエンドポイントの場合は、(マイクロ)フ レームあたりのデータペイロードに必要となるバス時 間を、この値でスケジュールに予約します。パイプで実 際に使用される帯域幅(継続ベース)は、予約した帯 域幅より少ない場合があります。実際に使用した帯域 幅は、デバイスから通常の非 USB 定義のメカニズム を介して必要に応じて報告されます。 すべてのエンドポイントについて、ビット 10~0 で最大 パケットサイズを指定します。 高速アイソクロナスおよびインタラプトのエンド ポイントの場合は: ビット 12~11 では、マイクロフレームあたりの 追加トランザクション機会数を指定します。 00 = なし(1 トランザクション/マイクロフレー ム) 01 = 1 additional (2 per microframe) 10 = 2 つ追加(3/マイクロフレーム) 11 = 予約 ビット 15~13 は予約済みで、0 に設定する必要があり ます。 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 の範囲内である必要があります。 参 考 資 料 6 USBX では USB エンドポイント記述子を次のように定義します。 typedef struct UX_ENDPOINT_DESCRIPTOR_STRUCT { UINT bLength; UINT UINT UINT USHORT UINT bDescriptorType; bEndpointAddress; bmAttributes; wMaxPacketSize; bInterval; } UX_ENDPOINT_DESCRIPTOR; USB エンドポイント記述子は、以下のエンドポイントコンテナの一部となっています。 typedef struct UX_ENDPOINT_STRUCT { ULONG ULONG VOID struct struct struct struct struct UX_ENDPOINT_DESCRIPTOR_STRUCT UX_ENDPOINT_STRUCT UX_INTERFACE_STRUCT UX_DEVICE_STRUCT UX_TRANSFER REQUEST_STRUCT ux_endpoint_handle; ux_endpoint_state; *ux_endpoint_ed; ux_endpoint_descriptor; *ux_endpoint_next_endpoint; *ux_endpoint_interface; *ux_endpoint_device; ux_endpoint_transfer request; } UX_ENDPOINT; 変数の説明 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 転送要求 参 考 資 料 Variable Name ストリング記述子 ストリング記述子はオプションです。デバイスでストリング記述子をサポートしていない場合は、デバ イス記述子、コンフィギュレーション記述子、インタフェース記述子にそれぞれ含まれるストリング記 述子への参照は、すべて 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 ストリング記述子を次のように定義します。 UINT USHORT bDescriptorType; ファンクショナル記述子 資 bString[1]; } UX_STRING_DESCRIPTOR; 料 typedef struct UX_STRING_DESCRIPTOR_STRUCT { UINT bLength; 参 考 ファンクション記述子は、クラス固有記述子とも呼ばれます。この記述子は通常、ジェネリック記述子 と同じ基本構造を用い、追加の情報がクラスで使用できるようになります。例えば 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 はホストコントローラ とクラスの登録が可能になります。 入力パラメータ アプリケーションにデバイスの変更を通知するため のオプションのコールバックルーチンへのポインタ 返却値 UX_SUCCESS 参 考 Example (0x00) 資 system_change_function 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 ステータスでコー ルバックファンクションがコールされます。 入力パラメータ エンドポイントへのポインタ 返却値 UX_SUCCESS 資 endpoint (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 スタックか らクラスのコンテナを取得する必要があります。 料 パラメータ Pointer to the class name. class クラスの名前に関し、クラスコンテナを記述したファ ンクションコールにより更新されたポインタ 返却値 参 考 UX_SUCCESS 資 class_name UX_HOST_CLASS_UNKNOWN 例 UX_HOST_CLASS UINT (0x00) エラーなし。返却時に、クラスフィールドが クラスコンテナへのポインタとともにファイ ル化されます。 (0x59) スタックにとって不明のクラスです。 *printer_container; 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 返却値 参 考 class_entry_address 資 パラメータ クラス名へのポインタについては、USBX の USB ク ラスの下にあるファイル ux_system_initialize.c に有 効なエントリが見つかります。 クラスのエントリファンクションのアドレス 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_instance 作成するクラスインスタンスへのポインタ 返却値 (0x00) クラスインスタンスがクラスコンテナにアタッチされま した。 参 考 UX_SUCCESS 資 class Example UINT UX_HOST_CLASS_PRINTER status; *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 破棄するインスタンスへのポインタ (0x00) クラスインスタンスが破棄されま した。. UX_HOST_CLASS_INSTANCE_UNKNOWN (0x5b) クラスインスタンスがクラスコンテ ナにアタッチされていません。 参 考 UX_SUCCESS 例 資 返却値 UINT UX_HOST_CLASS_PRINTER status; *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_index 返却値 コンテナにアタッチされているクラスのリスト内で、 ファンクションコールが使用するインデックス 参 考 class_instance クラスコンテナへのポインタ 資 class ファンクションコールにより返されるインスタンスへの ポインタ (0x00) クラスインスタンスが見つかりま した。 UX_HOST_CLASS_INSTANCE_UNKNOWN (0x5b) これ以上のクラスインスタンスは クラスコンテナにアタッチされて いません。 UX_SUCCESS 例 UINT UX_HOST_CLASS_PRINTER status; *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) 説明 料 デバイスハンドルとコンフィギュレーションインデックスに基づいて、コンフィギュレーションコン テナを返すファンクションです。 パラメータ 要求されたコンフィギュレーションを所有するデバイ スコンテナへのポインタ configuration_index 検索対象のコンフィギュレーションのインデックス 返却値 例 返却対象のコンフィギュレーションコンテナへのポイ ンタのアドレス 参 考 configuration 資 device UX_SUCCESS (0x00) コンフィギュレーションが見つか りました。 UX_DEVICE_HANDLE_UNKNOWN (0x50) デバイスコンテナが存在しません。 UX_CONFIGURATION_HANDLE_UNKNOWN (0x51) インデックスのコンフィギュレー ションハンドルが存在しません。 UINT UX_HOST_CLASS_PRINTER status; *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 サービスコールを発行する必要があります。 パラメータ 返却値 (0x00) 参 考 UX_SUCCESS このサービスに対して有効にすべきコンフィギュレー ションコンテナへのポインタ 資 configuration コンフィギュレーションの選択に成功しました。 UX_CONFIGURATION_HANDLE_UNKNOWN (0x51) コンフィギュレーションハンドルが存在しません。 UX_OVER_CURRENT_CONDITION (0x43) このコンフィギュレーションに対してバス上に過電流 状態が存在します。 例 UINT UX_HOST_CLASS_PRINTER status; *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 返却対象のデバイスコンテナへのポインタのアドレス 返却値 UX_SUCCESS 資 device_index (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) 説明 料 インタフェースハンドルとエンドポイントインデックスに基づいて、エンドポイントコンテナを返 すファンクションです。エンドポイントの検索に先立ち、インタフェースの代替設定が選択され ているか、またはデフォルト設定が使用されているものとします。 パラメータ 要求されたエンドポイントを含むインタフェースコンテ ナへのポインタ Endpoint_index 返却値 このインタフェースに入っているエンドポイントのイン デックス 返却対象のエンドポイントコンテナのアドレス 参 考 endpoint 資 interface UX_SUCCESS (0x00) エンドポイントコンテナが存在し、 返されました。 UX_INTERFACE_HANDLE_UNKNOWN (0x52) 指定されたインタフェースが存在 しません。 UX_ENDPOINT_HANDLE_UNKNOWN (0x53) エンドポイントインデックスが存 在しません。 例 UINT UX_HOST_CLASS_PRINTER status; *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 コントローラを登録するファンクションです。このファンクションは主に、こ のコントローラで使用しているメモリを割り当て、コントローラに初期化コマンドを渡します。 パラメータ ホストコントローラに含まれていて、初期化を担うファ ンクション。使用可能なコントローラエントリファンク ションとして、次のものがあります。 ux_hcd_ehci_initialize ux_hcd_ohci_initialize ux_hcd_isp1161_initialize 参 考 hcd_function ホストコントローラの名前使用可能なコントローラとし て、次のものがあります。 "ux_hcd_ohci" "ux_hcd_ehci" "ux_hcd_isp1161" 資 hcd_name UX_SUCCESS (0x00) コントローラが正しく初期化されました。 UX_MEMORY_INSUFFICIENT (0x12) このコントローラのためのメモリが不足し ています。 UX_PORT_RESET_FAILED (0x31) コントローラのリセットに失敗しました。 UX_CONTROLLER_INIT_FAILED (0x32) コントローラが正しく初期化されませんで した。 hcd_param1 hcd で使用している IO またはメモリリソース。 hcd_param2 ホストコントローラで使用している IRQ。 返却値 例 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) 説明 料 コンフィギュレーションハンドル、インタフェースインデックス、および代替設定インデックスに 基づいて、インタフェースコンテナを返すファンクションです。 パラメータ interface_index 参 考 alternate_setting_index interface 返却値 インタフェースを所有するコンフィギュレーションコン テナへのポインタ 資 configuration 検索対象のインデックス インタフェースに含まれている、検索対象の代替 設定 返却対象のインタフェースコンテナポインタのアド レス 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) 説明 料 選択したコンフィギュレーションに属するあるインタフェースについて、特定の代替設定を選 択するファンクションです。このファンクションは、デフォルトの代替設定から新しい設定に変 更するため、またはデフォルトの代替設定に戻すために使用します。 新しい代替設定を選択したときは、以前のエンドポイント特性が無効になるため、リロードが 必要になります。 入力パラメータ 返却値 参 考 UX_SUCCESS 選択対象の代替設定が入っているインタフェースコ ンテナへのポインタ 資 interface UX_INTERFACE_HANDLE_UNKNOWN (0x00) このインタフェースの代替設定が正 常に選択されました。 (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 ステータスが含まれます。 パラメータ アボート対象の転送要求へのポインタ 返却値 例 (0x00) 参 考 UX_SUCCESS 資 transfer request UINT この転送要求に対する USB 転送が取り消されまし た。 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) 説明 入力パラメータ 返却値 参 考 transfer_request 資 料 USB トランザクションを実行するファンクションです。転送要求の入力時に、このトランザク ション用に選択されたエンドポイントパイプと、転送に関連するパラメータ(データペイロード、 トランザクション長)が指定されます。制御パイプでは、トランザクションはブロッキングになり ます。制御転送の 3 つのフェーズが完了したとき、または以前のエラーがある場合に限り、ト ランザクションが返ります。その他のパイプでは、USB スタックが USB 上でのトランザクション をスケジュールしますが、そのトランザクションの完了を待つことはありません。非ブロッキン グパイプでの転送要求では、各々に完了ルーチンハンドラを指定しなければなりません。 ファンクションコールが返るときに、転送要求のステータスにトランザクションの結果が含まれ ているため、このステータスを調べることが望まれます。 転送要求へのポインタ。転送要求には、転送に必要 なすべての情報が含まれます。 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) 説明 料 プリンタインタフェースに書き込むためのファンクションです。これはブロッキングコールであり、 エラーがあるときまたは転送が完了したときにのみ返されます。 パラメータ プリンタクラスインスタンスへのポインタ data_pointer データペイロードのバッファアドレスへのポインタ requested_length actual_length 例 送信する長さ 実際に送信した長さ 参 考 返却値 資 printer 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_TRANSFER_TIMEOUT 例 status; 参 考 UINT (0x00) 資 UX_SUCCESS (0x5c) リセットが完了しました。 転送タイムアウト。リセットは未完で す。 /* 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_status 返却対象のステータスのアドレス 返却値 UX_SUCCESS 資 printer 参 考 UX_MEMORY_INSUFFICIENT UX_TRANSFER_TIMEOUT 例 UINT (0x00) リセットが完了しました。 (0x12) 操作を実行するためのメモリが不足 しています。 (0x5c) 転送タイムアウト。リセットは未完で す。 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) 説明 料 オーディオインタフェースから読み出すためのファンクションです。これは非ブロッキングコー ルです。オーディオストリーミングインタフェース用に適切な代替設定が選択されていることを、 アプリケーションで確実にする必要があります。 パラメータ 返却値 参 考 UX_SUCCESS UX_FUNCTION_NOT_SUPPORTED 例 オーディオクラスインスタンスへのポインタ audio_transfer_request オーディオ転送構 造へのポインタ 資 audio (0x00) データ転送が完了しました。 (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_transfer_request オーディオ転送構造へのポインタ 返却値 UX_SUCCESS 資 audio 参 考 UX_FUNCTION_NOT_SUPPORTED (0x00) データ転送が完了しまし た。 (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 資 返却値 参 考 UX_FUNCTION_NOT_SUPPORTED UX_HOST_CLASS_AUDIO_WRONG_INTERFACE 例 UINT (0x00) データ転送が完了しま した。 (0x54) ファンクションがサポー トされていません。 (0x81) インタフェースが不正で す。 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_control オーディオ制御構造へのポインタ 料 audio UX_FUNCTION_NOT_SUPPORTED (0x54) ファンクションがサポー トされていません。 (0x81) インタフェースが不正で す。 UX_HOST_CLASS_AUDIO_WRONG_INTERFACE 例 (0x00) データ転送が完了しま した。 参 考 UX_SUCCESS 資 返却値 /* The following example sets the volume control of a stereo USB speaker.*/ UX_HOST_CLASS_AUDIO_CONTROL UINT status; audio_control; 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_sampling オーディオサンプリング構造へのポインタ 返却値 UX_SUCCESS 資 audio 参 考 UX_FUNCTION_NOT_SUPPORTED (0x00) データ転送が完了しまし た。 (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 返却値 オーディオクラスインスタンスへのポインタ 資 パラメータ オーディオサンプリング構造へのポインタ (0x00) データ転送が完了しま した。 UX_FUNCTION_NOT_SUPPORTED (0x54) ファンクションがサ ポートされていませ ん。 UX_HOST_CLASS_AUDIO_WRONG_INTERFACE (0x81) インタフェースが不正 です。 UX_NO_ALTERNATE_SETTING (0x5e) サンプリング値用の代 替設定がありません。 参 考 UX_SUCCESS 例 /* The following example gets the sampling values for the first alternate setting interface of a stereo USB speaker.*/ UX_HOST_CLASS_AUDIO_SAMPLING_CHARACTERISTICS status; UINT audio_sampling; 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 クライアント名へのポインタ hid_client_handler HID クライアントハンドラへのポインタ 返却値 参 考 UX_SUCCESS 資 hid_client_name UX_FUNCTION_NOT_SUPPORTED (0x00) データ転送が完了しました。 (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 クラスインスタンスへのポインタ call_back コールバック構造へのポインタ 返却値 UX_SUCCESS 資 hid 参 考 UX_FUNCTION_NOT_SUPPORTED UX_HOST_CLASS_HID_REPORT_ERROR 例 UINT (0x00) データ転送が完了しました。 (0x54) ファンクションがサポートされて いません。 (0x79) レポートコールバック登録時に エラーが発生しました。 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 クラスインスタンスへのポインタ 返却値 UX_SUCCESS 資 hid 参 考 UX_FUNCTION_NOT_SUPPORTED (0x00) 転送が完了しました。 (0x54) ファンクションがサポートさ れていません。. UX_HOST_CLASS_HID_PERIODIC_REPORT_ERROR (0x7A) 周期的レポート内でエラー が発生しました。 UX_HOST_CLASS_INSTANCE_UNKNOWN 例 UINT (0x5b) HID クラスインスタンスが 存在しません。 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 クラスインスタンスへのポインタ 返却値 UX_SUCCESS 資 hid 参 考 UX_FUNCTION_NOT_SUPPORTED (0x00) 転 送 が 完 了 し ま し た。 (0x54) フ ァ ン ク シ ョ ン が サ ポー トされてい ませ ん。. UX_HOST_CLASS_HID_PERIODIC_REPORT_ERROR (0x7A) 周期的レポート内で エラーが発生しまし た UX_HOST_CLASS_INSTANCE_UNKNOWN 例 UINT (0x5b) HID クラスインスタン スが存在しません。 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 クラスインスタンスへのポインタ client_report HID クライアントレポートへのポインタ 返却値 UX_SUCCESS 資 hid (0x00) データ転送が完了しました。 (0x54) ファンクションがサポートされて いません。 UX_HOST_CLASS_HID_REPORT_ERROR (0x70) 周期的レポート内でエラーが発 生しました。 参 考 UX_FUNCTION_NOT_SUPPORTED UX_HOST_CLASS_INSTANCE_UNKNOWN (0x5b) HID クラスインスタンスが存在し ません。 UX_BUFFER_OVERFLOW (0x5d) 提供されたバッファは、未圧縮の レポートを収容する大きさがあり ません。 例 UX_HOST_CLASS_HID_CLIENT_REPORT UINT status; input_report; /* 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) データ転送が完了しました。 (0x54) ファンクションがサポートされて いません。 UX_HOST_CLASS_HID_REPORT_ERROR (0x70) 周期的レポート内でエラーが発 生しました。 参 考 UX_FUNCTION_NOT_SUPPORTED 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 インタフェースから読み出すためのファンクションです。これはブロッキングコールであり、 エラーがあるときまたは転送が完了したときにのみ返されます。 クラスインスタンスへのポインタ data_pointer データペイロードのバッファアドレスへのポインタ requested_length 受信する長さ 返却値 参 考 UX_SUCCESS 資 Asix actual_length UX_TRANSFER_TIMEOUT 例 料 パラメータ UINT 実際に受信した長さ (0x00) データ転送が完了しました。 (0x5c) 転送タイムアウト。読み出しは未完です。 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 インタフェースに書き込むためのファンクションです。これはブロッキングコールであり、 エラーがあるときまたは転送が完了したときにのみ返されます。 クラスインスタンスへのポインタ data_pointer データペイロードのバッファアドレスへのポインタ requested_length 送信する長さ 返却値 参 考 UX_SUCCESS 資 Asix actual_length UX_TRANSFER_TIMEOUT 例 料 パラメータ UINT 実際に送信した長さ (0x00) データ転送が完了しました。 (0x5c) 転送タイムアウト。書き込みは未完です。 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 インスタンスへのポインタ。 data_pointer データペイロードのバッファアドレスへのポインタ requested_length 受信する長さ 返却値 参 考 UX_SUCCESS 資 cdc_acm actual_length UX_TRANSFER_TIMEOUT 例 料 パラメータ UINT 実際に受信した長さ (0x00) データ転送が完了しました。 (0x5c) 転送タイムアウト。読み出しは未完です。 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 インスタンスへのポインタ。 data_pointer データペイロードのバッファアドレスへのポインタ requested_length 返却値 例 参 考 actual_length 資 cdc_acm 送信する長さ 実際に送信した長さ 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 インスタンスへのポインタ。 ioctl_function 実行対象の ioctl ファンクション。許容される ioctl ファ ンクションは、下の表の中のいずれかです。 parameter 参 考 返却値 資 cdc_acm 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_session PIMA セッションへのポインタ 返却値 UX_SUCCESS 資 pima (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_session PIMA セッションへのポインタ 返却値 UX_SUCCESS 資 pima (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_session PIMA セッションへのポインタ storage_ids_array storage_id_length 参 考 返却値 資 pima UX_SUCCESS 返されるストレージ ID の配列 ストレージ配列の長さ (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_session PIMA セッションへのポインタ storage_id storage 参 考 返却値 資 pima UX_SUCCESS ストレージコンテナの ID ストレージ情報コンテナへのポインタ (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 セッションへのポインタ ストレージコンテナの ID storage_id 参 考 object_format_code オブジェクトフォーマットコードフィルタ object_format_code には、次のいずれかの値を設定できます。 オブジェクト フォーマット コード 0x3000 0x3001 0x3002 0x3003 0x3004 0x3005 0x3006 説明//グループ名 Undefined: 未定義の非イメー ジオブジェクト Association: アソシエーション (例: フォルダ) Script: デバイスモデル固有の スクリプト Executable: デバイスモデル 固有のバイナリ実行形式 Text: テキストファイル HTML: HyperText Markup Language ファイル(テキスト) DPOF: Digital Print Order Format ファイル(テキスト) USBX コード UX_HOST_CLASS_PIMA_OFC_UNDEFINED UX_HOST_CLASS_PIMA_OFC_ASSOCIATION UX_HOST_CLASS_PIMA_OFC_SCRIPT UX_HOST_CLASS_PIMA_OFC_EXECUTABLE UX_HOST_CLASS_PIMA_OFC_TEXT UX_HOST_CLASS_PIMA_OFC_HTML 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 0x3801 0x3802 0x3803 0x3804 0x3805 0x3806 0x3807 0x3808 GIF: Graphics Interchange Format JFIF: JPEG File Interchange Format PCD: PhotoCD Image Pac 参 考 0x3809 Undefined Reserved 0x380A 0x380B UX_HOST_CLASS_PIMA_OFC_ASF UX_HOST_CLASS_PIMA_OFC_QT UX_HOST_CLASS_PIMA_OFC_EXIF_JPEG UX_HOST_CLASS_PIMA_OFC_TIFF_EP UX_HOST_CLASS_PIMA_OFC_FLASHPIX 料 0x3800 ASF: Microsoft Advanced Streaming Format(ビデオ) Undefined: 未定のイメージオ ブジェクト EXIF/JPEG: Exchangeable File Format (JEIDA 規格) TIFF/EP: Tag Image File Format for Electronic Photography FlashPix: 構造化ストレージイ メージフォーマット BMP: Microsoft Windows Bitmap ファイル CIFF: Canon Camera Image File Format UX_HOST_CLASS_PIMA_OFC_BMP UX_HOST_CLASS_PIMA_OFC_CIFF 資 0x300C PICT: Quickdraw Image Format PNG: Portable Network Graphics UX_HOST_CLASS_PIMA_OFC_GIF UX_HOST_CLASS_PIMA_OFC_JFIF UX_HOST_CLASS_PIMA_OFC_PCD UX_HOST_CLASS_PIMA_OFC_PICT UX_HOST_CLASS_PIMA_OFC_PNG 0x380C Undefined Reserved 0x380D TIFF: Tag Image File Format UX_HOST_CLASS_PIMA_OFC_TIFF 0x380E 0x380F 0x3810 TIFF/IT: Tag Image File Format for Information UX_HOST_CLASS_PIMA_OFC_TIFF_IT Technology(グラフィックアー ト) JP2: JPEG2000 Baseline File UX_HOST_CLASS_PIMA_OFC_JP2 Format JPX: JPEG2000 UX_HOST_CLASS_PIMA_OFC_JPX Extended File Format 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_session object_handes_array object_handles_length storage_id object_format_code 資 パラメータ object_handle_association PIMA クラスインスタンスへのポインタ PIMA セッションへのポインタ 返されるハンドルの配列 配列の長さ ストレージコンテナの ID オ ブ ジ ェ ク ト の フ ォ ー マ ッ ト コ ー ド (ux_host_class_pima_num_objects_get ファンク ションの項で示した表を参照) オプションのオブジェクトアソシエーション値 オブジェクトハンドルアソシエーションとしては、下の表に示すいずれかの値が可能です。 0x0000 Undefined AssociationDesc 解釈 Undefined 0x0001 GenericFolder 不使用 0x0002 Album 予約済み 0x0003 TimeSequence DefaultPlaybackDelta 0x0004 HorizontalPanoramic 不使用 0x0005 VerticalPanoramic 不使用 0x0006 2DPanoramic ImagesPerRow アソシエーションコード アソシエーションの種類 0x0007 AncillaryData ビット 15 を 0 に設定し Reserved た、その他すべての値 ビット 15 を 1 に設定し Vendor-Defined た、すべての値 Undefined Undefined 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_session PIMA セッションへのポインタ object_handles object 参 考 返却値 資 pima 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_session storage_id 参 考 parent_object_id 資 パラメータ object 返却値 UX_SUCCESS PIMA クラスインスタンスへのポインタ PIMA セッションへのポインタ 格納先ストレージ ID オブジェクトを置くところの、レスポンダの親オブジェ クトハンドル オブジェクト情報コンテナへのポインタ (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_session PIMA セッションへのポインタ object_handles object 参 考 返却値 資 pima 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_session object_handles object object_buffer object_buffer_length object_actual_length 資 pima UX_SUCCESS PIMA セッションへのポインタ オブジェクトのハンドル オブジェクト情報コンテナへのポインタ オブジェクトデータのアドレス 要求されたオブジェクト長さ 返却対象のオブジェクトの長さ (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_session PIMA セッションへのポインタ object_handles オブジェクトのハンドル object object_buffer 返却値 参 考 object_buffer_length 資 pima 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_session PIMA セッションへのポインタ object_handles object thumb_buffer 参 考 thumb_buffer_length 資 pima 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_session PIMA セッションへのポインタ object_handles オブジェクトのハンドル 返却値 UX_SUCCESS 資 pima (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_session PIMA セッションへのポインタ object_handles オブジェクトのハンドル 返却値 UX_SUCCESS 資 pima (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) 説明 料 ジェネリックシリアルインタフェースから読み出すためのファンクションです。これはブロッキン グコールであり、エラーがあるときまたは転送が完了したときにのみ返されます。 パラメータ クラスインスタンスへのポインタ Interface_index 読み出し元のインタフェースインデックス data_pointer requested_length 返却値 例 参 考 actual_length 資 gser データペイロードのバッファアドレスへのポインタ 受信する長さ 実際に受信した長さ 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) 説明 料 ジェネリックシリアルインタフェースに書き込むためのファンクションです。これはブロッキング コールであり、エラーがあるときまたは転送が完了したときにのみ返されます。 パラメータ クラスインスタンスへのポインタ interface_index 書き込み先のインタフェース data_pointer requested_length 返却値 例 参 考 actual_length 資 Gser データペイロードのバッファアドレスへのポインタ 送信する長さ 実際に送信した長さ 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 インタフェースに対して実行するファンクションです。これは ブロッキングコールであり、エラーがあるときまたはコマンドが完了したときにのみ返されま す。 パラメータ クラスインスタンスへのポインタ Interface_index インタフェースインデックス ioctl_function 返却値 参 考 parameter 資 Gser 実行対象の ioctl ファンクション。許容される ioctl ファ ンクションは、下の表の中のいずれかです。 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_reception 受信パラメータを含む構造 返却値 (0x00) データ転送が完了しました。 UX_HOST_CLASS_UNKNOWN (0x59) クラスインスタンスが間違っています。 UX_ERROR (0x01) エラー 参 考 UX_SUCCESS 例 資 Gser /* 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_reception 受信パラメータを含む構造 料 Gser 返却値 データ転送が完了しました。 UX_HOST_CLASS_UNKNOWN (0x59) クラスインスタンスが間違っています。 UX_ERROR (0x01) エラー 参 考 例 資 (0x00) UX_SUCCESS /* 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デバイススタック DPUMPデバイスクラススレッド パケットを書く パケットを待機 料 _ux_host_class_dpump_write _ux_host_stack_transfer_request _ux_device_stack_transfer_request バルクアウト上で転送完了を待機 転送完了を待機 資 参 考 転送ステータスと 送信データ長を受信 パケットを受信 転送完了を待機 転送完了を待機 パケットを書く _ux_device_stack_transfer_request _ux_host_class_dpump_read バルクアウト上でインパケットを待機 _ux_host_stack_transfer_request 転送完了を待機 送信ステータス、 データパケット、 受信データ長を受信 転送完了を待機 転送完了を待機 USBX DPUMP ホストクラス DPUMP クラスのホスト側は、データの送信用、データの受信用の、2 つのファンクションを備えてい ます。 ux_host_class_dpump_write ux_host_class_dpump_read どちらのファンクションも、DPUMP アプリケーションの簡易化のためにブロッキングファンクションと なっています。IN パイプと OUT パイプを同時に実行させておく必要がある場合は、またアプリケー ション側で送信スレッドと受信スレッドを作成する必要があります。 書き込み関数のプロトタイプは次の通りです。 ux_host_class_dpump_write(UX_HOST_CLASS_DPUMP *dpump, UCHAR * data_pointer, ULONG requested_length, ULONG *actual_length) 料 UINT 資 ここで、 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 サーバの間でのコマンドと応答 の様子を示します。 ストレージデバイス ストレージサーバ プリントサーバ プリントクライアント ストレージ クライアント プリントデバイス DPS サービスディスカバリ DPS_ConfigurePrintServices DPS_GetCapabilities アプリケーションが印刷開始 DPS_StartJob DPS_GetFileInfo DPS_GetFile ファイルデータを取得 料 ファイルデータ プリントデータ 資 DPS_NotifyDeviceStatus ピクトブリッジクライアントの実装 参 考 クライアント側のピクトブリッジでは、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 }; 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 クライアントがデータブロックを 取り込む必要が生じたときに、このファンクションがコールされます。 料 パラメータ ピクトブリッジクラスインスタンスへのポインタ object_buffer オブジェクトバッファへのポインタ object_offset データブロックの読み出しを始める場所 資 pictbridge 返す長さ 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 レイヤです。 ピクトブリッジのフィールド 料 次のステップは、プリントサービス用のピクトブリッジのデフォルト値を次のように初期化することで す。 値 0x00010000 0x00010001 0x00000000 0x00010000 PrintServiceAvailable 0x30010000 参 考 資 DpsVersion[0] DpsVersion[1] DpsVersion[2] VendorSpecificVersion Qualities[0] Qualities[1] Qualities[2] Qualities[3] PaperSizes[0] PaperSizes[1] PaperSizes[2] PaperSizes[3] PaperSizes[4] PaperTypes[0] PaperTypes[1] PaperTypes[2] FileTypes[0] FileTypes[1] FileTypes[2] FileTypes[3] DatePrints[0] DatePrints[1] DatePrints[2] FileNamePrints[0] FileNamePrints[1] FileNamePrints[2] UX_PICTBRIDGE_QUALITIES_DEFAULT UX_PICTBRIDGE_QUALITIES_NORMAL UX_PICTBRIDGE_QUALITIES_DRAFT UX_PICTBRIDGE_QUALITIES_FINE 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 UX_PICTBRIDGE_PAPER_TYPES_DEFAULT UX_PICTBRIDGE_PAPER_TYPES_PLAIN UX_PICTBRIDGE_PAPER_TYPES_PHOTO UX_PICTBRIDGE_FILE_TYPES_DEFAULT UX_PICTBRIDGE_FILE_TYPES_EXIF_JPEG UX_PICTBRIDGE_FILE_TYPES_JFIF UX_PICTBRIDGE_FILE_TYPES_DPOF UX_PICTBRIDGE_DATE_PRINTS_DEFAULT UX_PICTBRIDGE_DATE_PRINTS_OFF UX_PICTBRIDGE_DATE_PRINTS_ON 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 ピクトブリッジのフィールド UX_PICTBRIDGE_IMAGE_OPTIMIZES_OFF UX_PICTBRIDGE_IMAGE_OPTIMIZES_ON UX_PICTBRIDGE_LAYOUTS_DEFAULT UX_PICTBRIDGE_LAYOUTS_1_UP_BORDER UX_PICTBRIDGE_LAYOUTS_INDEX_PRINT UX_PICTBRIDGE_LAYOUTS_1_UP_BORDERLESS 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 UX_PICTBRIDGE_CROPPINGS_DEFAULT UX_PICTBRIDGE_CROPPINGS_OFF UX_PICTBRIDGE_CROPPINGS_ON 料 ImageOptimizes[1] ImageOptimizes[2] Layouts[0] Layouts[1] Layouts[2] Layouts[3] FixedSizes[0] FixedSizes[1] FixedSizes[2] FixedSizes[3] FixedSizes[4] FixedSizes[5] FixedSizes[6] Croppings[0] Croppings[1] Croppings[2] 値 資 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 クライアントからデータブロックを 取り組む必要が生じたときに、このファンクションがコールされます。 パラメータ ピクトブリッジクラスインスタンスへのポインタ object_buffer オブジェクトバッファへのポインタ 資 pictbridge データブロックの読み出しを始める場所 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 機能を格納しています。 VBUS 固有ファンクション コントローラの起動と停止 USB ロールマネージャ インタラプトハンドラ 参 考 • • • • 資 通常のホスト/デバイスのファンクションに加え、OTG コントローラ対応ファンクションには次の 4 種 類があります。 VBUS ファンクション 電力管理要件に基づいて VBUS のステートを変更するために、各コントローラは VBUS マネージャ を搭載する必要があります。このファンクションは通常、VBUS のオン/オフ切り替えのみを実行しま す。 コントローラの起動と停止 通常の USB 実装とは異なり、OTG ではロールを変更するときに、ホストスタックとデバイススタック (またはそのいずれか)をアクティブ/非アクティブ化する必要があります。 USB ロールマネージャ USB ロールマネージャは、USB のステートを変更するためのコマンドを受信します。遷移を必要とす るステートが、次のようにいくつかあります。 説明//グループ名 デバイスはアイドル。通常は、何にも接続していない。 デバイスがタイプ A コネクタに接続している。 デバイスがタイプ B コネクタに接続している。 ホストデバイスが切断された。 ホストからスレーブへのロール切り替え スレーブデバイスが切断している スレーブからへホストのロール切り替え 料 値 0 1 2 3 4 5 6 資 ステート UX_OTG_IDLE UX_OTG_IDLE_TO_HOST UX_OTG_IDLE_TO_SLAVE UX_OTG_HOST_TO_IDLE UX_OTG_HOST_TO_SLAVE UX_OTG_SLAVE_TO_IDLE UX_OTG_SLAVE_TO_HOST 参 考 インタラプトハンドラ 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; インデックス 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 コントローラレイヤ ......................................... 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 資 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 コールバック ................. 5, 48, 49, 87, 88, 131, 141, 144, 147, 148 料 Asix クラス .................................................. 72 参 考 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 送信スレッド .............................................. 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 料 資 参 考 USBXTM Host Stack ユーザーズマニュアル(参考資料) 発行年月日 2016 年 9 月 2 日 Rev.5.70 発行 ルネサス エレクトロニクス株式会社 〒 135-0061 東京都江東区豊洲 3-2-24(豊洲フォレシア) http://www.renesas.com ڦႠᴗ࠾ၥྜࡏ❆ཱྀ ͤႠᴗ࠾ၥྜࡏ❆ཱྀࡢఫᡤࡣኚ᭦࡞ࡿࡇࡀ࠶ࡾࡲࡍࠋ᭱᪂ሗࡘࡁࡲࡋ࡚ࡣࠊᘢ♫࣮࣒࣮࣍࣌ࢪࢆࡈぴࡃࡔࡉ࠸ࠋ ࣝࢿࢧࢫ ࢚ࣞࢡࢺࣟࢽࢡࢫᰴᘧ♫ࠛ135-0061ᮾி㒔Ụᮾ༊㇏Ὢ3-2-24㸦㇏Ὢࣇ࢛ࣞࢩ㸧 ڦᢏ⾡ⓗ࡞࠾ၥྜࡏ࠾ࡼࡧ㈨ᩱࡢࡈㄳồࡣୗグ࠺ࡒࠋ ࠉ⥲ྜ࠾ၥྜࡏ❆ཱྀ㸸http://japan.renesas.com/contact/ © 2016 Renesas Electronics Corporation. All rights reserved. Colophon 3.0 USBXTM Host Stack ユーザーズマニュアル (参考資料) R11UM0008JU0570