高性能 USB スタック
USBX デバイススタック・ユーザガイド
Express Logic
858.613.6640 Toll Free 888.THREADX FAX858.521.4259 http://www.expresslogic.com
©1999-2014 by Express Logic, Inc.
All rights reserved.This document and the associated USBX software are the sole property of
Express Logic, Inc. Each contains proprietary information of Express Logic, Inc.
Reproduction or duplication by any means of any portion of this document without the prior
written consent of Express Logic, Inc. is expressly forbidden.
Express Logic, Inc.は、USBX の設計または信頼性を向上するために、随時に予告なく、本書に
記載する仕様を変更する権利を留保します。本書の内容については万全を期していますが、本書
の正確性について Express Logic, Inc.が保証するものではありません。
商標
FileX および ThreadX は Express Logic, Inc.の登録商標であり、USBX、NetX、picokernel、
preemption-threshold、event-chaining は、Express Logic, Inc.の商標です。その他の製品およ
び社名は、各所有者の商標または登録商標です。
保証の制限
Express Logic, Inc.は、USBX 製品が使用者の要件を満たすもしくは使用者により指定されたとお
りに動作すること、USBX 製品が中断もしくは欠陥なしに動作すること、または USBX 製品に見つ
かるいかなる欠陥も保障期間後に補正されることにつき、一切保証するものではありません。
Express Logic, Inc.は USBX 製品に関し、市場性および特定の目的への適合性を含めて、明示
あるいは黙示を問わず一切責任を負わないものとします。Express Logic, Inc.、そのディーラ、販
売店、代理店または従業員から口頭もしくは書面で情報または助言が与えられた場合、それによ
り、他の保証が生じるものでもなく、またこの保証の範囲がいかなる形であれ拡大するものでもあ
りません。また、ライセンス取得者はそのような情報または助言に依拠してはなりません。
パート番号: 000-1010
改訂 5.7 版
目次
目次... 3
本書について ... 5
第 1 章
USBX の概要 ... 6
USBX の機能 ... 6
製品ハイライト ... 7
USBX の強力なサービス ... 8
USB デバイスフレームワークの完全なサポート ... 8
使いやすい API ... 8
第 2 章
USBX のインストール ... 9
ホストについて ... 9
コンピュータの種類 ... 9
ダウンロード用インタフェース ... 9
デバッグツール ... 9
必要なハードディスク容量 ... 9
ターゲットについて ... 9
コンフィギュレーションオプション ... 12
ソースコードツリー ... 14
USBX リソースの初期化 ... 15
USB デバイスコントローラの定義 ... 16
トラブルシューティング ... 18
USBX バージョン ID ... 18
第 3 章
USBX デバイススタックの ファンクションコンポーネント ... 19
実行概要 ... 19
初期化 ... 19
アプリケーションインタフェースコール ... 20
USB デバイススタック API ... 20
USB デバイスクラス API ... 20
デバイスフレームワーク ... 20
デバイスフレームワークのコンポーネントの定義 ... 20
デバイスフレームワークのストリングの定義 ... 21
ストリングごとにデバイスでサポートする言語の定義 ... 22
VBUS マネージャ ... 23
第 4 章
USBX デバイスサービスの説明 ... 24
ux_device_stack_alternate_setting_get ... 25
ux_device_stack_alternate_setting_set ... 26
ux_device_stack_class_register ... 27
ux_device_stack_configuration_get ... 29
ux_device_stack_configuration_set ... 30
ux_device_stack_descriptor_send ... 31
ux_device_stack_disconnect ... 32
ux_device_stack_endpoint_stall ... 33
ux_device_stack_host_wakeup ... 34
ux_device_stack_initialize ... 35
ux_device_stack_interface_delete ... 39
ux_device_stack_interface_get ... 40
ux_device_stack_interface_set ... 41
ux_device_stack_interface_start ... 42
ux_device_stack_transfer_request ... 43
ux_device_stack_transfer_request_abort ... 45
第 5 章
USBX デバイスクラスについて ... 46
USB デバイスストレージクラス ... 46
複数 SCSI LUN ... 48
USB デバイス CDC-ACM クラス ... 50
ux_device_class_cdc_acm_read ... 53
ux_device_class_cdc_acm_write ... 54
USB デバイス CDC-ECM クラス ... 55
USB デバイス RNDIS クラス ... 59
USB デバイス DFU クラス ... 62
USB デバイス HID クラス ... 68
ux_device_class_hid_event_set ... 70
hid_callback ... 71
USB デバイス PIMA クラス(PTP レスポンダ)... 72
PIMA デバイスクラスの初期化 ... 74
ux_device_class_pima_object_number_get ... 78
ux_device_class_pima_object_handles_get ... 79
ux_device_class_pima_object_info_get ... 81
ux_device_class_pima_object_data_get ... 83
ux_device_class_pima_object_info_send ... 86
ux_device_class_pima_object_data_send ... 88
ux_device_class_pima_object_delete ... 90
第 6 章
USBX DPUMP クラスについて ... 91
USBX DPUMP デバイスクラス ... 92
第 7 章
ピクトブリッジの実装 ... 93
ピクトブリッジクライアントの実装 ... 94
ux_pictbridge_jobinfo_object_data_read ... 98
ピクトブリッジホストの実装 ... 99
ux_pictbridge_application_object_data_write ...101
第 8 章
USBX OTG ... 102
インデックス... 105
本書について
本書では、Express Logic, Inc.の高性能 USB ファウンデーションソフトウェア USBX について包括
的に説明します。
本書は、組み込み式リアルタイムソフトウェアの開発者を対象にしています。開発者は、標準的な
リアルタイムオペレーティングシステムファンクション、USB 仕様、および C プログラミング言語に
精通していることとします。
USB 関連の技術的な情報については、http://www.USB.org/developers から USB 仕様書および
USB クラス仕様書をダウンロードして参照してください。
本書の構成
第 1 章では、USB について紹介します。
第 2 章では、ThreadX アプリケーションに USBX をインストールして使用するための基本
手順を説明します。
第 3 章は「USBX デバイススタックのファンクションコンポーネント」と題しています。
第 4 章は「USBX デバイスサービスの説明」と題しています。
第 5 章は、「USBX デバイスクラスについて」と題しています。
第 6 章は、「USBX DPUMP クラスについて」と題しています。
第 7 章は、「USBX Pictbridge の実装」と題しています。
第 8 章は、「USBX OTG」と題しています。
第
1
章
USBX
の概要
USBX は、組み込みアプリケーション対応の本格的 USB スタックです。この章では USBX
の概要を紹介し、その用途と利点を説明します。
USBX の機能
USBX は、現行の USB Specification 1.1、2.0、および OTG をサポートします。スケーラブルに設
計してあるため、1 つだけのデバイスを接続する簡易 USB テクノロジから、複数のデバイスとカス
ケードハブを備えた複雑なテクノロジまで対応します。USB プロトコルで可能な制御転送、バルク
転送、インタラプト転送、アイソクロナス転送をすべて USBX でサポートします。
USBX はホスト側、デバイス側の両方をサポートします。いずれの側も、次の 3 つのレイヤで構成
されます。
•
制御
レイヤ
• スタックレイヤ
•
クラスレ
イヤ
USB 各相の関係は次のようになっています。
製品ハイライト
ThreadX プロセッサの完全なサポートロイヤルティなし
完全な ANSI C ソースコード
リアルタイムパフォーマンス迅速なテクニカルサポート
複数のクラスサポート
複数のクラスインスタンス
ThreadX、FileX、NetX とのクラス統合
複数コンフィギュレーション対応の USB デバイスのサポート
USB 複合デバイスのサポート
USB 電力管理のサポート
USB OTG のサポート
TraceX のトレースイベントのエクポート
クラスドライバ クラスドライバ ホストスタック ホストコントローラ ドライバ ホストコントローラ デバイススタック ホストコントローラ ドライバ デバイスコントローラ ホスト 側 デバイ ス側USBX の強力なサービス
USB デバイスフレームワークの完全なサポート
複数コンフィギュレーション、複数インタフェース、複数代替設定などをともなう、最高度の USB デバ
イスをサポートすることができます。
使いやすい API
USBX は、最高の組み込み USB スタックを、わかりやすく簡単に使える形で提供します。USBX の
API により、直感的かつ一貫したサービスが得られます。付属の USBX クラス API を使用すれば、
ユーザアプリケーション側で複雑な USB プロトコルを理解する必要がありません。
第
2
章
USBX
のインストール
ホストについて
コンピュータの種類
組み込み開発は通常、IBM-PC または Unix のホストコンピュータ上で実行されます。ホスト側でアプ
リケーションをコンパイル、リンク、配置した後、ターゲットハードウェアにアプリケーションをダウン
ロードして実行します。
ダウンロード用インタフェース
ターゲットへのダウンロードは通常、RS-232 シリアルインタフェースを介して行いますが、パラレルイ
ンタフェースや、USB、Ethernet を使用する例も増えています。対応するオプションに関する開発
ツールドキュメントを参照してください。
デバッグツール
デバッグは一般に、プログラムイメージダウンロード用と同じリンクで実行されます。デバッガには、
BDM(Background Debug Monitor)や ICE(In-Circuit Emulator)ツールを介してターゲット上で実
行する小型のモニタプログラムを初め、各種があります。このうち、実際のターゲットハードウェアを
最も強力にデバッグできるのは、もちろん ICE ツールです。
必要なハードディスク容量
USBX のソースコードは ASCII 形式で提供され、コンピュータのハードディスクに約 500KB の空き容
量が必要です。その他のホストシステム要件とオプションについては、付属の「readme_usbx.txt」
ファイルで確認してください。
ターゲットについて
USBX は、ホストモードのターゲット上に 24KB~64KB の読み取り専用メモリ(ROM)が必要です。
必要なメモリ容量は、使用するコントローラ、および USBX にリンクする USB クラスにより異なります。
さらに、USBX グローバルデータ構造とグローバルメモリプール用には、ターゲットに 32KB のランダ
ムアクセスメモリ(RAM)が必要になります。このメモリプールは、USB で実行するデバイス数、およ
び USB コントローラの種類に応じて調整することも可能です。USBX デバイス側では、デバイスコン
トローラの種類に応じて約 10~12K の ROM が必要です。RAM メモリの使用量は、デバイスでエミュ
レートするクラスの種類により異なります。
さらに USBX では、マルチスレッド保護のために ThreadX の セマフォ、ミューテックス、スレッド
を必要とし、また USB バストポロジの監視のために I/O の中断と周期処理を必要とします。
製品の配布
USBX パッケージには、標準とプレミアムの 2 種類があります。標準パッケージでは最小限のソース
コードを備えているの対し、プレミアムパッケージには USBX ソースコードを一式完備しています。い
ずれのパッケージも 1 枚の CD で出荷されます。
配布 CD の内容は、ターゲットプロセッサ、開発ツール、USBX パッケージにより異なります。以下は、
ほとんどの製品配布に共通する重要ファイルのリストです。
readme_usbx.txt
This file contains specific information about the USBX port,
ux_api.h
すべてのシステム equate、データ構造、サービスプロトタイプを記述し
た C ヘッダファイルです。
ux_port.h
開発ツール向けのデータ定義と構造をすべて記述した C ヘッダファイ
ルです。
ux.lib
USBX C ライブラリのバイナリバージョンです。標準パッケージで配布さ
れます。。
demo_usbx.c
簡単な USBX デモを記述した C ファイルです。
ファイル名はすべて小文字で表します。これにより、コマンドを Unix 開発プラットフォームに簡単に変
換することができます。
USBX のインストールは簡単明快です。以下に示す全般的な方法は、ほぼすべてのインストールに
適 用 さ れ ま す 。 た だ し 、 実 際 の 開 発 ツ ー ル 環 境 に 応 じ た 変 更 点 に つ い て は 、
「readme_usbx_generic.txt」で確認してください。
ステップ 1
USBX 配布ディスクをバックアップし、安全な場所に保管しておきます。
ステップ 2
ホストハードドライブ上で以前に ThreadX をインストールしたのと同じディレクトリを
使用します。USBX 名はすべて一意となっているため、以前にインストールした
USBX と干渉することはありません。
ステップ 3
tx_application_define またはその先頭付近に ux_system_initialize のコール
を追加します。
tx_application_define.追加した場所で USBX リソースが初期化されます。
ステップ 4
ux_host_stack_initialize へのコールを追加します。
ステップ 5
必要な USBX クラス(ホストクラスとデバイスクラス、またはそのいずれか)を初期
化するためののコールを 1 つ以上追加します。
ステップ 6
システム内で使用可能なホストコントローラを初期化するためのコールを 1 つ以上
追加します。
ステップ 7
低レベルのハードウェア初期化と割り込みベクトルのルーティングを追加するため
に、tx_low_level_initialize.c ファイルの修正が必要になる場合があります。ハード
ウェアプラットフォームごとに異なるステップとなるため、ここでは説明しません。
ステップ 8
アプリケーションソースコードをコンパイルし、それを USBX と ThreadX のランタイ
ムライブラリとリンクし(USB ストレージクラスや USB ネットワーククラスをコンパイ
ルするときは FileX や Netx も必要になる場合があります)、また ux.a(または ux.lib)
と tx.a(または tx.lib)にもリンクします。結果をターゲットにダウンロードすれば実行
できます。
コンフィギュレーションオプション
USBX ライブラリの構築用にいくつかのコンフィギュレーションオプションがあります。オプションはす
べて ux_port.h に置かれています。
各コンフィギュレーションオプションについて、以下に詳述します。配布ディスクで提供される
readme_usbx.txt ファイルに、その他の開発ツールオプションが記述されています。
UX_PERIODIC_RATE
個々のハードウェアプラットフォームにおける秒あたりのティック数です。デフォルトは 1000、すなわ
ちミリ秒あたり 1 ティックです。
UX_THREAD_STACK_SIZE
USBX スレッドに関するスタックサイズ(単位: バイト)です。通常は、使用するプロセッサとホストコン
トローラに応じて 1024~2048 バイトが可能です。
UX_THREAD_PRIORITY_ENUM
バストポロジをモニタする USBX 列挙スレッドの ThreadX 優先度値です。
UX_THREAD_PRIORITY_CLASS
標準 USBX スレッドの ThreadX 優先度値です。
UX_THREAD_PRIORITY_KEYBOARD
USBX HID キーボードクラスの ThreadX 優先度値です。
UX_THREAD_PRIORITY_DCD
デバイスコントローラスレッドの ThreadX 優先度値です。
UX_NO_TIME_SLICE
1 を指定した場合、ThreadX ターゲットポートはタイムスライスを使用しません。
UX_MAX_SLAVE_LUN
デバイスストレージクラスドライバに表される SCSI 論理ユニットの現在数を表します。
UX_SLAVE_REQUEST_CONTROL_MAX_LENGTH
デバイススタック内の制御エンドポイントで受信される最大バイト数を表します。デフォルトでは 256
バイトですが、メモリが制約されている環境では少なくすることができます。
UX_SLAVE_REQUEST_DATA_MAX_LENGTH
デバイススタック内のバルクエンドポイントで受信される最大バイト数を表します。デフォルトでは
4096 バイトですが、メモリが制約されている環境では少なくすることができます。
ソースコードツリー
USBX の各ファイルは、いくつかのディレクトリで提供されます。
USBX コア USBX デバイススタック USBX ホストスタック USBX デバイス コントローラ USBX ホスト コントローラ USBX ネットワーク USBX の例 ホストファイル Windows USBX OTG USBX デバイス クラス USBX ホストクラス各ファイルを名前で識別可能にするように、以下の表記法を採用しています。
ファイル接尾名
ファイルの説明
ux_host_stack
USBX ホストスタックのコアファイル
ux_host_class
USBX ホストスタックのクラスファイル
ux_hcd
USBX ホストスタックのコントローラドライバファイル
ux_device_stack
USBX デバイススタックのコアファイル
ux_device_class
USBX デバイススタックのクラスファイル
ux_dcd
USBX デバイススタックのコントローラドライバファイル
ux_otg
USBX OTG コントローラドライバ関連ファイル
ux_pictbridge
USBX ピクトブリッジファイル
ux_utility
USBX ユーティリティファンクション
demo_usbx
USBX のデモファイル
USBX リソースの初期化
USBX は、自身のメモリマネージャを備えています。先に USBX にメモリを割り当てておかないと、
USBX のホスト側やデバイス側を初期化することができません。メモリキャッシュが可能なシステム
にも、USBX メモリマネージャは対応します。
次のファンクションは、USBX メモリリソースを 128K の正規メモリで、かつキャッシュセーフメモリ用
プールを別途に設けずに初期化します。
/* Initialize USBX Memory */
ux_system_initialize(memory_pointer,(128*1024),UX_NULL,0);
ux_system_initialize のプロトタイプは次の通りです。
UINT ux_system_initialize(VOID *regular_memory_pool_start, ULONG regular_memory_size,
VOID *cache_safe_memory_pool_start, ULONG cache_safe_memory_size)
入力パラメータ:
VOID
*regular_memory_pool_start
Beginning of the regular memory pool
ULONG regular_memory_size
Size of the regular memory pool
VOID
*cache_safe_memory_pool_start
Beginning of the cache safe memory
ULONG cache_safe_memory_size
Size of the cache safe memory pool
すべてのシステムでキャッシュセーフメモリが必要なわけではありません。そのようなシステムでは、
メモリポインタの初期化時に渡される値は UX_NULL に、プールの値は 0 にそれぞれ設定されます。
その場合、USBX はキャッシュセーフメモリに代えて正規メモリプールを使用します。
正規メモリがキャッシュセーフではなく、またコントローラが DMA メモリを実行する必要がある場合
(OHCI、EHCI などのコントローラの場合)、キャッシュセーフメモリにメモリプールを定義することが
必要です。
USB デバイスコントローラの定義
デバイスモードで動作するための USB デバイスコントローラは、常に 1 つのみを定義できます。この
定義をアプリケーション初期化ファイルに記述します。下の例では、OKI USB デバイスコントローラを
指しています。その他のコントローラについては、ファンクションエントリ定義を適宜変更しなければな
りません
次のファンクションは、OKI コネクタの定義を実行します。
ux_dcd_ml6965_initialize(0x7BB00000, 0, 0xB7A00000);The USB device initialization has the following prototype:
UINT ux_dcd_ml6965_initialize(ULONG dcd_io, ULONG dcd_irq, ULONG dcd_vbus_address);
パラメータの説明:
ULONG dcd_io
コントローラ IO のアドレス
ULONG dcd_irq
コントローラで使用するインタラプト
ULONG dcd_vbus_address
VBUS GPIO のアドレス
次の例では、ストレージデバイスクラスと OKI コントローラを用いて、USBX をデバイスモードで初期
化します。
/* Initialize USBX Memory */
ux_system_initialize(memory_pointer,(128*1024), 0, 0);
/* The code below is required for installing the device portion of USBX */ status = ux_device_stack_initialize(&device_framework_high_speed, DEVICE_FRAMEWORK_LENGTH_HIGH_SPEED, &device_framework_full_speed, DEVICE_FRAMEWORK_LENGTH_FULL_SPEED, &string_framework, STRING_FRAMEWORK_LENGTH, &language_id_framework, LANGUAGE_ID_FRAMEWORK_LENGTH, UX_NULL);
/* If status equals UX_SUCCESS, installation was successful.*/
/* Store the number of LUN in this device storage instance: single LUN. */ storage_parameter.ux_slave_class_storage_parameter_number_lun = 1;
/* Initialize the storage class parameters for reading/writing to the Flash Disk. */ storage_parameter.ux_slave_class_storage_parameter_lun[0]. ux_slave_class_storage_media_last_lba = 0x1e6bfe; storage_parameter.ux_slave_class_storage_parameter_lun[0]. ux_slave_class_storage_media_block_length = 512; storage_parameter.ux_slave_class_storage_parameter_lun[0]. ux_slave_class_storage_media_type = 0;
storage_parameter.ux_slave_class_storage_parameter_lun[0]. ux_slave_class_storage_media_removable_flag = 0x80; storage_parameter.ux_slave_class_storage_parameter_lun[0]. ux_slave_class_storage_media_read = tx_demo_thread_flash_media_read; storage_parameter.ux_slave_class_storage_parameter_lun[0]. ux_slave_class_storage_media_write = tx_demo_thread_flash_media_write; storage_parameter.ux_slave_class_storage_parameter_lun[0]. ux_slave_class_storage_media_status = tx_demo_thread_flash_media_status; /* Initialize the device storage class.The class is connected with interface 0 */ status = ux_device_stack_class_register(ux_system_slave_class_storage_name,
ux_device_class_storage_entry, ux_device_class_storage_thread,0, (VOID *)&storage_parameter); /* Register the OKI USB device controllers available in this system */ status = ux_dcd_ml6965_initialize(0x7BB00000, 0, 0xB7A00000);
トラブルシューティング
USBX には、デモファイルとシミュレーション環境が付属しています。最初に、ターゲットハードウェア
または個々のデモプラットフォームでデモプラットフォームを実行してみるのがよいでしょう。
•
デモシステムが機能しない場合、以下の方法で問題を絞り込んでください。
USBX バージョン ID
USBX の現在のバージョンは、実行時にユーザからもアプリケーションソフトウェアからも確認できま
す。
プログラマは、usbx.txt ファイルを調べて USB バージョンを取得できます。このファイルには、対応す
るポートのバージョン履歴も記載されています。アプリケーションソフトウェアでは、ux_port.h に定義
されているグローバルストリング_ux_version_id を調べて USBX バージョンを取得できます。
第
3
章
USBX
デバイススタックの
ファンクションコンポーネント
この章では、USBX の高性能埋め込み USB デバイススタックについて、ファンクションの観点から説
明します。
実行概要
デバイスの USBX は、次のコンポーネントから構成されます。初期化
アプリケーションインタフェースコール
デバイスクラス
USB デバイススタック
デバイスコントローラ
VBUS マネージャ
USBX デバイススタックを下の図に示します。
初期化
USBX をアクティブにするには、ファンクション ux_system_initialize をコールする必要があります。
USBX のメモリリソースがこのファンクションで初期化されます。
USBX ホスト機能をアクティブにするには、ファンクション ux_host_stack_initialize をコールする必
要があります。USBX ホストスタックで使用する ThreadX スレッド、ミューテックス、セマフォなどすべ
てのリソースが、この機能で初期化されます。
1 つ以上の USB ホストコントローラと 1 つ以上の 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 のほとんどは、デバ
イスのオープン/クローズ、デバイスとの読み書きなどのサービスを提供します。これらの API は、
ホスト側と似た性質のものです。
デバイスフレームワーク
USB デバイス側は、デバイスフレームワークを定義する責任があります。デバイスフレームワーク
は、次に説明する 3 つのカテゴリに分類されます。
デバイスフレームワークのコンポーネントの定義
デバイスフレームワークの各コンポーネントの定義は、デバイスの性質、およびデバイスで使用する
リソースと関係しています。主なカテゴリには次のものがあります。
•
デバイス記述子
•
コンフィギュレーション記述子
•
インタフェース記述子
•
エンドポイント記述子
USBX は、高速用と全速用の両方のデバイスコンポーネントの定義をサポートします(定速は全速と
同じに扱われます)。このため、接続先のホストが高速か全速かにより、デバイスの動作を変えるこ
その主な違いは、各エンドポイントのサイズと、デバイスで消費する電力です。
デバイスコンポーネントの定義は、USB 仕様に従った 1 つのバイトストリングという形式を取ります。
定義は隣接形状を取り、メモリ内でフレームワークを表す順序は、列挙時にホストに返されるときの
順序と同じになります。
以下は、高速 USB フラッシュディスク用のデバイスフレームワークの例です。
#define DEVICE_FRAMEWORK_LENGTH_HIGH_SPEED 60 UCHAR device_framework_high_speed[] = { /* Device descriptor */ 0x12, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0x0a, 0x07, 0x25, 0x40, 0x01, 0x00, 0x01, 0x02, 0x03, 0x01,/* Device qualifier descriptor */
0x0a, 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, /* Configuration descriptor */ 0x09, 0x02, 0x20, 0x00, 0x01, 0x01, 0x00, 0xc0, 0x32, /* Interface descriptor */ 0x09, 0x04, 0x00, 0x00, 0x02, 0x08, 0x06, 0x50, 0x00,
/* Endpoint descriptor (Bulk Out) */
0x07, 0x05, 0x01, 0x02, 0x00, 0x02, 0x00, /* Endpoint descriptor (Bulk In) */
0x07, 0x05, 0x82, 0x02, 0x00, 0x02, 0x00 };
デバイスフレームワークのストリングの定義
ストリングはデバイス内のオプションです。ストリングの目的は、デバイスのメーカー、製品名、リビ
ジョン番号を、USB ホストに Unicode ストリングを介して知らせるためです。
主要なストリングは、デバイス記述子に埋め込まれているインデックスです。その他のストリングのイ
ンデックスは、個々のインタフェースに埋め込むことができます。
上の例のデバイスフレームワークで、デバイス記述子に 3 つのストリングインデックスが埋め込まれ
ているとすると、ストリングフレームワークの定義は次の例のようになります。
/* String Device Framework:
Byte 0 and 1 : Word containing the language ID:0x0904 for US
Byte 2 : Byte containing the index of the descriptor
Byte 3 : Byte containing the length of the descriptor string
*/
#define STRING_FRAMEWORK_LENGTH 38 UCHAR string_framework[] = {
/* Manufacturer string descriptor:Index 1 */ 0x09, 0x04, 0x01, 0x0c,
0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x20, 0x4c, 0x6f, 0x67, 0x69, 0x63,
/* Product string descriptor:Index 2 */ 0x09, 0x04, 0x02, 0x0c,
0x4D, 0x4C, 0x36, 0x39, 0x36, 0x35, 0x30, 0x30, 0x20, 0x53, 0x44, 0x4B,
/* Serial Number string descriptor:Index 3 */ 0x09, 0x04, 0x03, 0x04, 0x30, 0x30, 0x30, 0x31 };
速度ごとに異なるストリングを使用せざるを得ない場合は、ストリングは速度に関与しないため、異な
るインデックスを使用する必要があります。
ストリングのエンコーディングは UNICODE ベースです。UNICODE エンコーディング規格の詳細に
ついては、次の出版物を参照してください。
The Unicode Standard, Worldwide Character Encoding, Version 1., Volumes 1 and 2, The
Unicode Consortium, Addison-Wesley Publishing Company, Reading MA.
ストリングごとにデバイスでサポートする言語の定義
USBX で使用する言語は、デフォルトでは英語ですが、複数の言語をサポートすることができます。
ストリング記述子で使用する各言語の定義は、言語の配列という形態を取り、次のように定義され
ます。
#define LANGUAGE_ID_FRAMEWORK_LENGTH 2 UCHAR language_id_framework[] = { /* English.*/ 0x09, 0x04 };追加の言語をサポートするには、デフォルトの英語コードに続けて単純に言語コードの 2 バイト定義
を追加します。言語コードについては、Microsoft 社が次の文書で定義しています。
Developing International Software for Windows 95 and Windows NT, Nadine Kano,
Microsoft Press, Redmond WA
VBUS マネージャ
ほとんどの USB デバイス設計では、VBUS は USB デバイスコアの一部になっているのではなく、
VBUS を外部の GPIO に接続することでライン信号をモニタします。
その結果、VBUS はデバイスコントローラドライバとは別に管理しなければなりません。
デバイスコントローラに VBUS IO のアドレスを提供するのは、アプリケーションの担当になります。デ
バイスコントローラの初期化に先立って VBUS を所期化する必要があります。
VBUS モニタリングに関するプラットフォーム仕様によっては、VBUS IO の初期化後にコントローラド
ライバに VBUS 信号の扱いを任せることが可能ですが、もし不可能なら、VBUS を扱うためのコード
をアプリケーションから提供しなければなりません。
アプリケーションが自ら VBUS を扱おうとする場合は、アプリケーションに必要なことは次のファンク
ションをコールすることだけです。
ux_device_stack_disconnect()すなわち、デバイスが引き抜かれたことをアプリケーションが検出したときに、このファンクションを
コールします。デバイスが挿入されたときにコントローラに通知する必要はありません。理由は、
BUS RESET がアサート/デアサート信号を検出したときに、コントローラが自動的にウェイクアップ
するからです。
ux_device_stack_alternate_setting_get
インタフェース値に対する現在の代替設定を取得
プロトタイプ
UINT ux_device_stack_alternate_setting_get(ULONG interface_value)
説明
特定のインタフェース値に関し、現在の代替設定を取得するために USB ホストが使用する
ファンクションです。GET_INTERFACE 要求を受信したときにコントローラドライバがこのファ
ンクションをコールします。
入力パラメータ
interface_value
現在の代替設定を問い合わせる対象のインタフェー
ス値
返却値
UX_SUCCESS
(0x00)
データ転送が完了しました。
UX_ERROR
(0xFF)
インタフェース値が間違っています。
例
ULONG interface_value; UINT status;/* The following example illustrates this service.*/
status = ux_device_stack_alternate_setting_get(interface_value); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_device_stack_alternate_setting_set
インタフェース値に対する現在の代替設定を設定
プロトタイプ
UINT ux_device_stack_alternate_setting_set(ULONG interface_value,
ULONG alternate_setting_value)
説明
特定のインタフェース値に関し、現在の代替設定を設定するために USB ホストが使用する
ファンクションです。SET_INTERFACE 要求を受信したときにコントローラドライバがこのファ
ンクションをコールします。SET_INTERFACE が完了すると、代替設定の値がクラスに適用
されます。
デバイススタックは、このインタフェースを所有するクラスに UX_SLAVE_CLASS_
COMMAND_CHANGE を発行し、代替設定の変更を反映します。
パラメータ
interface_value
現在の代替設定を設定する対象のインタフェース値
alternate_setting_value
新しい代替設定値
返却値
UX_SUCCESS
(0x00) データ転送が完了しました。
UX_INTERFACE_HANDLE_UNKNOWN (0x52) アタッチされているインタフェースがあ
りません。
UX_ERROR
(0xFF) インタフェース値が間違っています。
例
ULONG interface_value; ULONG alternate_setting_value;/* The following example illustrates this service.*/
status = ux_device_stack_alternate_setting_set(interface_value,
ux_device_stack_class_register
新しい USB デバイスクラスを登録
プロトタイプ
UINT ux_device_stack_class_register(UCHAR *class_name,
UINT (*class_entry_function)(struct UX_SLAVE_CLASS_COMMAND_STRUCT *), ULONG configuration_number, ULONG interface_number, VOID *parameter)
説明
アプリケーションが新しい USB デバイスクラスを登録するために使用するファンクションです。
この登録では、クラスのインスタンスではなくクラスコンテナが起動されます。クラスは、アク
ティブスレッドを持っていて、かつ特定のインタフェースにアタッチしている必要があります。
パラメータまたはパラメータリストを必要とするクラスもあります。例えば、デバイスストレージ
クラスなら、エミュレート対象のストレージデバイスのジオメトリが必要になります。したがって、
そのパラメータフィールドは、クラス要件に依存するため、1 つの値である場合と、クラス値を
代入した構造へのポインタである場合とがあります。
パラメータ
class_entry_function
クラスのエントリファンクション
Configuration_number
このクラスのアタッチ先のコンフィギュレーション番号
interface_number
このクラスのアタッチ先のインタフェース番号
Parameter
クラス固有のパラメータリストへのポインタ
返却値
UX_SUCCESS
(0x00)
データ転送が完了しました。
UX_MEMORY_INSUFFICIENT
(0x52)
メモリが不足しています。
UX_THREAD_ERROR
(0xFF)
クラススレッドを作成できません。
例
UINT status;
/* The following example illustrates this service.*/
/* Initialize the device storage class.The class is connected with interface 1 */
status =
ux_device_stack_class_register(_ux_system_slave_class_storage_name, ux_device_class_storage_entry,
1, 1, (VOID *)¶meter);
ux_device_stack_configuration_get
現在のコンフィギュレーションを取得
プロトタイプ
UINT ux_device_stack_configuration_get(VOID)説明
デバイスで実行している現在のコンフィギュレーションを取得するためにホストが使用する
ファンクションです。
入力パラメータ
なし
返却値
UX_SUCCESS
(0x00)
データ転送が完了しました。
例
UINT status;/* The following example illustrates this service.*/ status = ux_device_stack_configuration_get();
ux_device_stack_configuration_set
現在のコンフィギュレーションを設定
プロトタイプ
UINT ux_device_stack_configuration_set(ULONG configuration_value)
説明
デバイスで実行している現在のコンフィギュレーションを設定するためにホストが使用する
ファンクションです。このコマンドを受信すると、USB デバイススタックはこのコンフィギュレー
ションに接続している各インタフェースの代替設定をアクティブ化します。
入力パラメータ
configuration_value
ホストが選択するコンフィギュレーション値
返却値
UX_SUCCESS
(0x00)
データ転送が完了しました。
例
ULONG configuration_value; UINT status;/* The following example illustrates this service.*/
status = ux_device_stack_configuration_set(configuration_value); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_device_stack_descriptor_send
記述子をホストに送信
プロトタイプ
UINT ux_device_stack_descriptor_send(ULONG descriptor_type,
ULONG request_index, ULONG host_length)
説明
デバイス側が記述子をホストに返すために使用するファンクションです。この記述子は、デバ
イス記述子、コンフィギュレーション記述子、またはストレージ記述子です。
パラメータ
Descriptor_type
記述子の性質
UX_DEVICE_DESCRIPTOR_ITEM
UX_CONFIGURATION_DESCRIPTOR_ITEM
UX_STRING_DESCRIPTOR_ITEM
UX_DEVICE_QUALIFIER_DESCRIPTOR_ITEM
UX_OTHER_SPEED_DESCRIPTOR_ITEM
request_index
記述子のインデックス
host_length
ホストが要求する長さ
返却値
UX_SUCCESS
(0x00)
データ転送が完了しました。
UX_ERROR
(0xFF)
転送が完了しませんでした。
例
ULONG descriptor_type; ULONG request_index; ULONG host_length; UINT status;/* The following example illustrates this service.*/
status = ux_device_stack_configuration_send(descriptor_type,
request_index, host_length); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_device_stack_disconnect
デバイススタックを切断
プロトタイプ
UINT ux_device_stack_disconnect(VOID)説明
デバイスの切断が発生したときに VBUS マネージャがコールするファンクションです。デバイ
ススタックは、このデバイスに登録されているすべてのクラスに通知し、その後、すべてのデ
バイスリソースを解放します。
入力パラメータ
なし
返却値
UX_SUCCESS
(0x00)
デバイスが切断されました。
例
UINT status;/* The following example illustrates this service.*/ status = ux_device_stack_disconnected();
ux_device_stack_endpoint_stall
エンドポイント STALL 状態を要求
プロトタイプ
UINT ux_device_stack_endpoint_stall(UX_SLAVE_ENDPOINT *endpoint)
説明
エンドポイントからホストに STALL 状態を返すべきときに、USB デバイスクラスがコールする
ファンクションです。
入力パラメータ
endpoint
STALL 状態が要求されるエンドポイント
返却値
UX_SUCCESS
(0x00)
この操作は成功しました。
例
UINT status;/* The following example illustrates this service.*/ status = ux_device_stack_endpoint_stall(endpoint);
ux_device_stack_host_wakeup
ホストをウェイクアップ
プロトタイプ
UINT ux_device_stack_host_wakeup(VOID)説明
ホストをウェイクアップしようとするデバイスがコールするファンクションです。このコマンドは、
デバイスが中断モードのときにのみ有効です。USB ホストをいつウェイクアップするかは、デ
バイスアプリケーションが決めることです。例えば、電話回線上で RING 信号を検出したとき
に、USB モデムがホストをウェイクアップしたりできます。
入力パラメータ
なし
返却値
UX_SUCCESS
(0x00)
コールに成功しました。
UX_ERROR
(0xFF)
コールに失敗しました(デバイスが中断モードではな
かったことが考えられます)。
例
UINT status;/* The following example illustrates this service.*/ status = ux_device_stack_host_wakeup();
ux_device_stack_initialize
USB デバイススタックを初期化
プロトタイプ
UINT ux_device_stack_initialize(UCHAR_PTR device_framework_high_speed, ULONG device_framework_length_high_speed, UCHAR_PTR device_framework_full_speed, ULONG device_framework_length_full_speed, UCHAR_PTR string_framework, ULONG string_framework_length, UCHAR_PTR language_id_framework, ULONG language_id_framework_length), UINT (*ux_system_slave_change_function)(ULONG)))
説明
アプリケーションが USB デバイススタックを初期化するためにコールするファンクションです。
クラスやコントローラは一切初期化されません。これらの初期化は別のファンクションコール
で行います。このコールは主に、当該 USB ファンクション用のデバイスフレームワークをス
タックに提供します。高速、全速の両方をサポートするコールであるため、速度ごとに全く別
のデバイスフレームワークとすることが可能です。ストリングフレームワークと多言語がサ
ポートされます。
パラメータ
device_framework_high_speed
高速フレームワークへのポインタ
device_framework_length_high_speed 高速フレームワークの長さ
device_framework_full_speed
全速フレームワークへのポインタ
device_framework_length_full_speed
全速フレームワークの長さ
string_framework
ストリングフレームワークへのポインタ
string_framework_length
ストリングフレームワークの長さ
language_id_framework
ストリング言語フレームワークへのポインタ
language_id_framework_length
ストリング言語フレームワークの長さ
ux_system_slave_change_function
デバイスステータスが切り替わるときにコー
ルされるファンクション
返却値
UX_SUCCESS
(0x00)
この操作は成功しました。
UX_MEMORY_INSUFFICIENT
(0x12)
スタックを初期化するためのメモリが不
足しています。
例
/* Example of a device framework */
#define DEVICE_FRAMEWORK_LENGTH_FULL_SPEED 50 UCHAR device_framework_full_speed[] = { /* Device descriptor */ 0x12, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, 0x08, 0xec, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, /* Configuration descriptor */ 0x09, 0x02, 0x20, 0x00, 0x01, 0x01, 0x00, 0xc0, 0x32, /* Interface descriptor */ 0x09, 0x04, 0x00, 0x00, 0x02, 0x08, 0x06, 0x50, 0x00,
/* Endpoint descriptor (Bulk Out) */
0x07, 0x05, 0x01, 0x02, 0x40, 0x00, 0x00, /* Endpoint descriptor (Bulk In) */
0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00 }; #define DEVICE_FRAMEWORK_LENGTH_HIGH_SPEED 60 UCHAR device_framework_high_speed[] = { /* Device descriptor */ 0x12, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0x0a, 0x07, 0x25, 0x40, 0x01, 0x00, 0x01, 0x02, 0x03, 0x01,
/* Device qualifier descriptor */
0x0a, 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, /* Configuration descriptor */ 0x09, 0x02, 0x20, 0x00, 0x01, 0x01, 0x00, 0xc0, 0x32, /* Interface descriptor */ 0x09, 0x04, 0x00, 0x00, 0x02, 0x08, 0x06, 0x50, 0x00,
/* Endpoint descriptor (Bulk Out) */
0x07, 0x05, 0x01, 0x02, 0x00, 0x02, 0x00, /* Endpoint descriptor (Bulk In) */
0x07, 0x05, 0x82, 0x02, 0x00, 0x02, 0x00 };
/* String Device Framework:
Byte 0 and 1 :Word containing the language ID:0x0904 for US
Byte 2 :Byte containing the index of the descriptor
Byte 3 :Byte containing the length of the descriptor string
*/
#define STRING_FRAMEWORK_LENGTH 38 UCHAR string_framework[] = {
/* Manufacturer string descriptor:Index 1 */ 0x09, 0x04, 0x01, 0x0c,
0x45, 0x78, 0x70, 0x72,0x65, 0x73, 0x20, 0x4c, 0x6f, 0x67, 0x69, 0x63,
/* Product string descriptor:Index 2 */ 0x09, 0x04, 0x02, 0x0c,
0x4D, 0x4C, 0x36, 0x39, 0x36, 0x35, 0x30, 0x30, 0x20, 0x53, 0x44, 0x4B,
/* Serial Number string descriptor:Index 3 */ 0x09, 0x04, 0x03, 0x04,
0x30, 0x30, 0x30, 0x31 };
/* Multiple languages are supported on the device, to add a language besides English, the Unicode language code must be appended to the language_id_framework array and the length adjusted accordingly.*/ #define LANGUAGE_ID_FRAMEWORK_LENGTH 2 UCHAR language_id_framework[] = { /* English.*/ 0x09, 0x04 };
The application can request a call back when the controller changes its state.The two
main states for the controller are:
UX_DEVICE_SUSPENDED
UX_DEVICE_RESUMED
If the application does not need Suspend/Resume signals, it would supply a UX_NULL
function.
UINT status;
/* The code below is required for installing the device portion of USBX.There is no call back for device status change in this example.*/
status = ux_device_stack_initialize(&device_framework_high_speed, &device_framework_full_speed, DEVICE_FRAMEWORK_LENGTH_HIGH_SPEED, STRING_FRAMEWORK_LENGTH, &language_id_framework, LANGUAGE_ID_FRAMEWORK_LENGTH, UX_NULL);
ux_device_stack_interface_delete
スタックインタフェースを削除
プロトタイプ
UINT ux_device_stack_interface_delete(UX_SLAVE_INTERFACE *interface)
説明
インタフェースを削除すべときにコールするファンクションです。インタフェースが削除されるの
は、デバイスが引き抜かれるとき、バスリセットが生じた後、または新しい代替設定があると
きです。
入力パラメータ
interface
削除するインタフェースへのポインタ
返却値
UX_SUCCESS
(0x00)
この操作は成功しました。
例
UINT status;/* The following example illustrates this service.*/ status = ux_device_stack_interface_delete(interface);
ux_device_stack_interface_get
現在のインタフェース値を取得
プロトタイプ
UINT ux_device_stack_interface_get(UINT interface_value)
説明
ホストが現在のインタフェースを必要とするときに、コールされるファンクションです。デバイス
は現在のインタフェース値を返します。
入力パラメータ
interface_value
返却するインタフェース値
返却値
UX_SUCCESS
(0x00)
この操作は成功しました。
UX_ERROR
(0xFF)
インタフェースが存在しません。
例
ULONG interface_value; UINT status;/* The following example illustrates this service.*/
status = ux_device_stack_interface_delete(interface_value); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_device_stack_interface_set
インタフェースの代替設定を変更
プロトタイプ
UINT ux_device_stack_interface_set(UCHAR_PTR device_framework, ULONG device_framework_length, ULONG alternate_setting_value)
説明
ホストがインタフェースの代替設定の変更を要求するときに、コールされるファンクションで
す。
パラメータ
device_framework
このインタフェースのデバイスフレームワークの
アドレス
device_framework_length
デバイスフレームワークの長さ
alternate_setting_value
このインタフェースが使用する代替設定値
返却値
UX_SUCCESS
(0x00)
この操作は成功しました。
UX_ERROR
(0xFF)
インタフェースが存在しません。
例
UCHAR_PTR device_framework ULONG device_framework_length; ULONG alternate_setting_value; UINT status;/* The following example illustrates this service.*/ status = ux_device_stack_interface_set(device_framework,
device_framework_length, alternate_setting_value); /* If status equals UX_SUCCESS, the operation was successful.*/
ux_device_stack_interface_start
インタフェースインスタンスを所有するクラスの検索を開始
プロトタイプ
UINT ux_device_stack_interface_start(UX_SLAVE_INTERFACE *interface)
説明
ホストによりインタフェースが選択された後、このインタフェースインスタンスを所有すべきデ
バイスクラスをデバイススタックが検索する必要があるときに、コールされるファンクションで
す。
入力パラメータ
interface
作成されたインタフェースへのポインタ
返却値
UX_SUCCESS
(0x00)
この操作は成功しました。
UX_NO_CLASS_MATCH (0x57)
このインタフェースに対するクラスが存在しません。
例
UINT status;/* The following example illustrates this service.*/ status = ux_device_stack_interface_start(interface);
ux_device_stack_transfer_request
ホストへのデータ転送を要求
プロトタイプ
UINT ux_device_stack_transfer_request(UX_SLAVE_TRANSFER *transfer_request, ULONG slave_length, ULONG host_length)
説明
クラスまたはスタックがホストにデータを転送しようとするときに、コールされるファンクション
です。ホストは常にデバイスをポストしますが、デバイスは前もってデータを準備することがで
きます。
パラメータ
Transfer_request
転送要求へのポインタ。
slave_length
デバイスが返そうとする長さ
host_length
ホストが要求した長さ
返却値
UX_SUCCESS
(0x00)
この操作は成功しました。
UX_ERROR
(0xFF)
転送エラー。
例
UINT status;
/* The following example illustrates how to transfer more data than an application requests.*/
while(total_length) {
/* How much can we send in this transfer?*/
if (total_length > UX_SLAVE_CLASS_STORAGE_BUFFER_SIZE) transfer_length = UX_SLAVE_CLASS_STORAGE_BUFFER_SIZE; else
transfer_length = total_length;
/* Copy the Storage Buffer into the transfer request memory.*/ ux_utility_memory_copy(transfer_request ->
ux_slave_transfer_request_data_pointer, media_memory, transfer_length);
/* Send the data payload back to the caller.*/
status = ux_device_transfer_request(transfer_request,
transfer_length, transfer_length); /* If status equals UX_SUCCESS, the operation was successful.*/
/* Update the buffer address. */
media_memory += transfer_length; /* Update the length to remain.*/ total_length -= transfer_length; }
ux_device_stack_transfer_request_abort
転送要求を取り消す
プロトタイプ
UINT ux_device_stack_transfer_abort(UX_SLAVE_TRANSFER *transfer_request, ULONG completion_code)
説明
アプリケーションが転送要求を取り消す必要があるとき、またはスタックがエンドポイントに関
連する転送要求をアボートする必要があるときに、コールされるファンクションです。
パラメータ
Transfer_request
転送要求へのポインタ。
completion_code
この転送要求の完了を待っているクラスに返すエ
ラーコード
返却値
UX_SUCCESS
(0x00)
この操作は成功しました。
例
UINT status;/* The following example illustrates how to abort a transfer when a bus reset has been detected on the bus. */
status = ux_device_stack_transfer_abort(transfer_request,
UX_TRANSFER_BUS_RESET); /* If status equals UX_SUCCESS, the operation was successful.*/
第
5
章
USBX
デバイスクラスについて
USB デバイスストレージクラス
USB デバイスストレージクラスにより、システムに埋め込まれたストレージデバイスが USB ホストに
可視になります。
USB デバイスストレージクラスは、それ自体でストレージソリューションを提供するものではありませ
ん。単にホストからの SCSI 要求を受け付け、解釈するだけです。その要求の 1 つが読み出しコマン
ドまたは書き込みコマンドのときは、ATA デバイスドライバ、フラッシュデバイスドライバなど、実スト
レージデバイスハンドラへの定義済みのコールバックを呼び出します。
デバイスストレージクラスを初期化するときに、必要なすべての情報を含むクラスにポインタ構造が
与えられます。例を次に示します。
/* Store the number of LUN in this device storage instance: single LUN.*/ storage_parameter.ux_slave_class_storage_parameter_number_lun = 1;
/* Initialize the storage class parameters for reading/writing to the Flash Disk. */ storage_parameter.ux_slave_class_storage_parameter_lun[0]. ux_slave_class_storage_media_last_lba = 0x1e6bfe; storage_parameter.ux_slave_class_storage_parameter_lun[0]. ux_slave_class_storage_media_block_length = 512; storage_parameter.ux_slave_class_storage_parameter_lun[0]. ux_slave_class_storage_media_type = 0; storage_parameter.ux_slave_class_storage_parameter_lun[0]. ux_slave_class_storage_media_removable_flag = 0x80; storage_parameter.ux_slave_class_storage_parameter_lun[0]. ux_slave_class_storage_media_read = tx_demo_thread_flash_media_read; storage_parameter.ux_slave_class_storage_parameter_lun[0]. ux_slave_class_storage_media_write = tx_demo_thread_flash_media_write; storage_parameter.ux_slave_class_storage_parameter_lun[0]. ux_slave_class_storage_media_status = tx_demo_thread_flash_media_status;
/* Initialize the device storage class.The class is connected with interface 0 */
status =
ux_device_stack_class_register(_ux_system_slave_class_storage_name, ux_device_class_storage_entry, ux_device_class_storage_thread, 0, (VOID *)&storage_parameter);
この例では、ドライブの LBA(最後のブロックアドレス)、それに論理セクタサイズが与えられます。
LBA は、media –1 において使用可能なセクタ数数です。ブロック長は、正規のストレージ媒体内で
512 に設定されます。光学ドライブの場合は、2048 に設定できます。
ストレージクラスが媒体のステータスを読み出し、書き込み、および取得できるように、アプリケーショ
ンは 3 つのコールバックファンクションポインタを渡す必要があります。
読み出し用と書き込み用のファンクションのプロトタイプは次の通りです。
UINT media_read(UCHAR_PTR data_pointer, ULONG number_blocks, ULONG lba);
UINT media_write(UCHAR_PTR data_pointer, ULONG number_blocks, ULONG lba);
ここで、
data_pointer は 、 読 み 出 し ま た は 書 き 込 み に 使 用 す る バ ッ フ ァ の ア ド レ ス 、
number_blocks は、読み出し/書き込み対象のセクタの数、lba は、読み出すセクタアド
レスです。
返却値は UX_SUCCESS、UX_ERROR のいずれかで、操作に成功したか失敗したかを示します。
これらの操作で、その他のエラーコードを返す必要はありません。操作にエラーがある場合は、スト
レージクラスがステータスコールバックファンクションを呼び出します。
このファンクションのプロトタイプは次の通りです。
ULONG tx_demo_thread_media_status(ULONG media_id);
呼び出しパラメータ media_id は、現在使用されていないため、常に 0 に設定しておきます。将来は、
複数ストレージデバイスを区別するため、あるいは複数 SCSI LUN を持つストレージデバイスを区別
するために、media_id が使用される可能性があります。このバージョンのストレージクラスでは、スト
レージクラスの複数インスタンスや、複数 SCSI LUN を持つストレージデバイスをサポートしていませ
ん。
返却値は SCSI エラーコードです。これは次のようなフォーマットにすることができます。
ビット 0~7
Sense_key
ビット 8~15
追加センスコード(Additional Sense Code: ASC)
ビット 16~23
追加センスコード修飾子(Additional Sense Code Qualifier: ASCQ)
可能な Sense/ASC/ASCQ の組み合わせを次の表にまとめます。
Sense Key ASC ASCQ 説明 00 00 00 検知なし 01 17 01 再試行によって読み取れたデータ 01 18 00 ECC を使って読み取れたデータ 02 04 01 論理ドライブが動作不可能。動作可能にする処理中 02 04 02 論理ドライブが動作不可能。初期化が必要 02 04 04 論理ユニットが動作不可能。フォーマット中 02 04 FF 論理ドライブが動作不可能。デバイスが BUSY02 06 00 参照位置を検出せず 02 08 00 論理ユニットの通信の故障 02 08 01 論理ユニットの通信のタイムアウト 02 08 80 論理ユニットの通信のオーバーラン 02 3A 00 媒体未装着 02 54 00 USB とホストシステムとの間のインタフェース故障 02 80 00 リソース不足 02 FF FF 不明なエラー 03 02 00 シーク完了せず 03 03 00 書き込み障害 03 10 00 ID CRC エラー 03 11 00 回復不可能読み出しエラー 03 12 00 ID フィールドのアドレスマーク検出せず 03 13 00 データフィールドのアドレスマーク検出せず 03 14 00 レコード実体検出せず 03 30 01 未知フォーマットのため読み出し不可能 03 31 01 フォーマットコマンド失敗 04 40 NN 診断で構成要素 NN に故障(80H-FFH) 05 1A 00 パラメータリスト長エラー 05 20 00 コマンドの操作コードが不正 05 21 00 論理ブロックアドレスが範囲外 05 24 00 コマンドパケットのフィールドが不正 05 25 00 論理ユニットがサポートされていない 05 26 00 パラメータリストのフィールドが不正 05 26 01 パラメータがサポートされていない 05 26 02 パラメータ値が不正 05 39 00 パラメータ保存機能なし 06 28 00 動作不可能状態から動作可能状態への遷移あり。媒体が交換された 06 29 00 電源投入、リセットまたはバスデバイスリセットが発生 06 2F 00 他のイニシエータによりコマンドが消去 07 27 00 書き込み保護媒体 0B 4E 00 コマンド重複
複数 SCSI LUN
USBX デバイスストレージクラスは、複数の LUN をサポートします。したがって、CD-ROM とフラッ
シュディスクを同時に兼任するストレージデバイスを作成できます。その場合、初期化は若干違った
ものになります。以下は、フラッシュディスクと CD-ROM の場合の例です。
/* Store the number of LUN in this device storage instance. */ storage_parameter.ux_slave_class_storage_parameter_number_lun = 2; /* Initialize the storage class parameters for reading/writing to the Flash Disk. */
storage_parameter.ux_slave_class_storage_parameter_lun[0]. ux_slave_class_storage_media_last_lba = 0x7bbff;