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

by Express Logic, Inc. All rights reserved.this document and the associated USBX software are the sole property of Express Logic, Inc. Each

N/A
N/A
Protected

Academic year: 2021

シェア "by Express Logic, Inc. All rights reserved.this document and the associated USBX software are the sole property of Express Logic, Inc. Each"

Copied!
105
0
0

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

全文

(1)

高性能 USB スタック

USBX デバイススタック・ユーザガイド

Express Logic

858.613.6640 Toll Free 888.THREADX FAX

858.521.4259 http://www.expresslogic.com

(2)

©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)

目次

目次... 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

(4)

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

(5)

本書について

本書では、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」と題しています。

(6)

1

USBX

の概要

USBX は、組み込みアプリケーション対応の本格的 USB スタックです。この章では USBX

の概要を紹介し、その用途と利点を説明します。

USBX の機能

USBX は、現行の USB Specification 1.1、2.0、および OTG をサポートします。スケーラブルに設

計してあるため、1 つだけのデバイスを接続する簡易 USB テクノロジから、複数のデバイスとカス

ケードハブを備えた複雑なテクノロジまで対応します。USB プロトコルで可能な制御転送、バルク

転送、インタラプト転送、アイソクロナス転送をすべて USBX でサポートします。

USBX はホスト側、デバイス側の両方をサポートします。いずれの側も、次の 3 つのレイヤで構成

されます。

制御

レイヤ

• スタックレイヤ

クラスレ

イヤ

USB 各相の関係は次のようになっています。

(7)

製品ハイライト

ThreadX プロセッサの完全なサポートロイヤルティなし

完全な ANSI C ソースコード

リアルタイムパフォーマンス迅速なテクニカルサポート

複数のクラスサポート

複数のクラスインスタンス

ThreadX、FileX、NetX とのクラス統合

複数コンフィギュレーション対応の USB デバイスのサポート

USB 複合デバイスのサポート

USB 電力管理のサポート

USB OTG のサポート

TraceX のトレースイベントのエクポート

クラスドライバ クラスドライバ ホストスタック ホストコントローラ ドライバ ホストコントローラ デバイススタック ホストコントローラ ドライバ デバイスコントローラ ホスト 側 デバイ ス側

(8)

USBX の強力なサービス

USB デバイスフレームワークの完全なサポート

複数コンフィギュレーション、複数インタフェース、複数代替設定などをともなう、最高度の USB デバ

イスをサポートすることができます。

使いやすい API

USBX は、最高の組み込み USB スタックを、わかりやすく簡単に使える形で提供します。USBX の

API により、直感的かつ一貫したサービスが得られます。付属の USBX クラス API を使用すれば、

ユーザアプリケーション側で複雑な USB プロトコルを理解する必要がありません。

(9)

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 の中断と周期処理を必要とします。

(10)

製品の配布

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 つ以上

追加します。

(11)

ステップ 7

低レベルのハードウェア初期化と割り込みベクトルのルーティングを追加するため

に、tx_low_level_initialize.c ファイルの修正が必要になる場合があります。ハード

ウェアプラットフォームごとに異なるステップとなるため、ここでは説明しません。

ステップ 8

アプリケーションソースコードをコンパイルし、それを USBX と ThreadX のランタイ

ムライブラリとリンクし(USB ストレージクラスや USB ネットワーククラスをコンパイ

ルするときは FileX や Netx も必要になる場合があります)、また ux.a(または ux.lib)

と tx.a(または tx.lib)にもリンクします。結果をターゲットにダウンロードすれば実行

できます。

(12)

コンフィギュレーションオプション

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 論理ユニットの現在数を表します。

(13)

UX_SLAVE_REQUEST_CONTROL_MAX_LENGTH

デバイススタック内の制御エンドポイントで受信される最大バイト数を表します。デフォルトでは 256

バイトですが、メモリが制約されている環境では少なくすることができます。

UX_SLAVE_REQUEST_DATA_MAX_LENGTH

デバイススタック内のバルクエンドポイントで受信される最大バイト数を表します。デフォルトでは

4096 バイトですが、メモリが制約されている環境では少なくすることができます。

(14)

ソースコードツリー

USBX の各ファイルは、いくつかのディレクトリで提供されます。

USBX コア USBX デバイススタック USBX ホストスタック USBX デバイス コントローラ USBX ホスト コントローラ USBX ネットワーク USBX の例 ホストファイル Windows USBX OTG USBX デバイス クラス USBX ホストクラス

(15)

各ファイルを名前で識別可能にするように、以下の表記法を採用しています。

ファイル接尾名

ファイルの説明

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 はキャッシュセーフメモリに代えて正規メモリプールを使用します。

(16)

正規メモリがキャッシュセーフではなく、またコントローラが 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;

(17)

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);

(18)

トラブルシューティング

USBX には、デモファイルとシミュレーション環境が付属しています。最初に、ターゲットハードウェア

または個々のデモプラットフォームでデモプラットフォームを実行してみるのがよいでしょう。

デモシステムが機能しない場合、以下の方法で問題を絞り込んでください。

USBX バージョン ID

USBX の現在のバージョンは、実行時にユーザからもアプリケーションソフトウェアからも確認できま

す。

プログラマは、usbx.txt ファイルを調べて USB バージョンを取得できます。このファイルには、対応す

るポートのバージョン履歴も記載されています。アプリケーションソフトウェアでは、ux_port.h に定義

されているグローバルストリング_ux_version_id を調べて USBX バージョンを取得できます。

(19)

3

USBX

デバイススタックの

ファンクションコンポーネント

この章では、USBX の高性能埋め込み USB デバイススタックについて、ファンクションの観点から説

明します。

実行概要

デバイスの USBX は、次のコンポーネントから構成されます。初期化

アプリケーションインタフェースコール

デバイスクラス

USB デバイススタック

デバイスコントローラ

VBUS マネージャ

USBX デバイススタックを下の図に示します。

初期化

USBX をアクティブにするには、ファンクション ux_system_initialize をコールする必要があります。

USBX のメモリリソースがこのファンクションで初期化されます。

(20)

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 は、高速用と全速用の両方のデバイスコンポーネントの定義をサポートします(定速は全速と

同じに扱われます)。このため、接続先のホストが高速か全速かにより、デバイスの動作を変えるこ

(21)

その主な違いは、各エンドポイントのサイズと、デバイスで消費する電力です。

デバイスコンポーネントの定義は、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 つのストリングインデックスが埋め込まれ

ているとすると、ストリングフレームワークの定義は次の例のようになります。

(22)

/* 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

(23)

VBUS マネージャ

ほとんどの USB デバイス設計では、VBUS は USB デバイスコアの一部になっているのではなく、

VBUS を外部の GPIO に接続することでライン信号をモニタします。

その結果、VBUS はデバイスコントローラドライバとは別に管理しなければなりません。

デバイスコントローラに VBUS IO のアドレスを提供するのは、アプリケーションの担当になります。デ

バイスコントローラの初期化に先立って VBUS を所期化する必要があります。

VBUS モニタリングに関するプラットフォーム仕様によっては、VBUS IO の初期化後にコントローラド

ライバに VBUS 信号の扱いを任せることが可能ですが、もし不可能なら、VBUS を扱うためのコード

をアプリケーションから提供しなければなりません。

アプリケーションが自ら VBUS を扱おうとする場合は、アプリケーションに必要なことは次のファンク

ションをコールすることだけです。

ux_device_stack_disconnect()

すなわち、デバイスが引き抜かれたことをアプリケーションが検出したときに、このファンクションを

コールします。デバイスが挿入されたときにコントローラに通知する必要はありません。理由は、

BUS RESET がアサート/デアサート信号を検出したときに、コントローラが自動的にウェイクアップ

するからです。

(24)
(25)

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.*/

(26)

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,

(27)

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)

クラススレッドを作成できません。

(28)

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 *)&parameter);

(29)

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();

(30)

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.*/

(31)

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.*/

(32)

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();

(33)

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);

(34)

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();

(35)

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)

スタックを初期化するためのメモリが不

足しています。

(36)

/* 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 };

(37)

/* 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.*/

(38)

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);

(39)

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);

(40)

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.*/

(41)

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.*/

(42)

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);

(43)

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)

転送エラー。

(44)

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; }

(45)

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.*/

(46)

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);

(47)

この例では、ドライブの 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 論理ドライブが動作不可能。デバイスが BUSY

(48)

02 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;

参照

関連したドキュメント

「旅と音楽の融を J をテーマに、音旅演出家として THE ROYAL EXPRESS の旅の魅力をプ□デュース 。THE ROYAL

Heat Mass Transfer, Vol.23 1996 ©Tokyo Electric Power Company Holdings, Inc.. All

サテライトコンパス 表示部.. FURUNO ELECTRIC CO., LTD. All Rights Reserved.. ECS コンソール内に AR ナビゲーション システム用の制御

©Tokyo Electric Power Company Holdings, Inc.. All

©Tokyo Electric Power Company Holdings, Inc. All

©Tokyo Electric Power Company Holdings, Inc. All

©Tokyo Electric Power Company Holdings, Inc. All

32.. ©Tokyo Electric Power Company Holdings, Inc. All Rights Reserved. 無断複製・転載禁止