OKIセミコンダクタ株式会社 > お問い合わせ・FAQ > FAQ > USB > ソフトウェア

ソフトウェア

質問一覧

1.リアルタイムOS

 

2.ホストソフトウェア

 

3.サンプルファームウェア


回答

1.リアルタイムOS

【質問】
リアルタイムOS搭載の製品開発は可能ですか?

【回答】
JOB60851に搭載しておりますマイコンMSM66573のリアルタイムOS(μITRON)を、沖電気にて発売しております。JOB60851に添付しているサンプルファームウェアはOSなしで動作する構造になっております。お客様の方でソフトウェア構造を変更していただく必要があります。

 

2.ホストソフトウェア

【質問】
ドライバのサポートはOS(Dos、Windows95/98、WindowsNT、Windows2000、 Linux etc)に依存するのか?

【回答】
Windows98/Windows2000上で動作するバルクIN/OUT通信用のバイナリ評価ドライバを提供できます。このサンプル・ドライバは、 Windows98 DDKとWindows2000 DDKのサンプル・ソースを元にしています。

 

【質問】
プラグ&プレイに対するソフトウェアのサポート状況は?

【回答】
ホスト側とデバイス側の2つに分けて説明します。

 

[ホスト側](Windows98/Windows2000)

わたくしどものサポートの必要はありません。マイクロソフトのホスト・コントローラ・ドライバとハブ・ドライバは、プラグ&プレイの機能をサポートしています。


[デバイス側]

沖電気は、USB仕様1.0/1.1準拠のプラグ&プレイのためのサンプル・ソースコードを提供できます。このサンプル・ファームウェア・ソースコードはC言語で書かれており、ML60851D/ML60852Aの両方をサポートしています。ソースコードは、JOB60851スタータ・キットのCD-ROMに含まれています。

 

【質問】
ML60852AのOHCI/UHCI対応は?

【回答】
ML60852Aは、OHCIおよびUHCIの両方に対応しております。

OHCI:Open Host Controller Interfaceの略

UHCI:Universal Host Controller Interfaceの略

UCHIおよびOHCIは、USBホストコントローラのタイプです。私どもの把握している限りでは、両者の違いは、バストラフィックのスケジューリングタイミングの差です。OHCIの方がよりデバイスに対して厳しいタイミングでアクセスします。

MacintoshはOHCIですが、WindowsにもOHCI搭載のPCがあります。

Microsoftは、Windows用にOHCIとUCHI用の2つのドライバを用意しています。ML60852Aは、OHCIおよびUHCIの両方に対応しております。

OHCI:Open Host Controller Interfaceの略

UHCI:Universal Host Controller Interfaceの略

UCHIおよびOHCIは、USBホストコントローラのタイプです。私どもの把握している限りでは、両者の違いは、バストラフィックのスケジューリングタイミングの差です。OHCIの方がよりデバイスに対して厳しいタイミングでアクセスします。

MacintoshはOHCIですが、WindowsにもOHCI搭載のPCがあります。

Microsoftは、Windows用にOHCIとUCHI用の2つのドライバを用意しています。

 

【質問】
複合デバイスにおいて、既存クラスドライバと新たに追加するクラスドライバがある場合、複合デバイス用のデバイスドライバを既存のドライバも含めて、新規に 作成しなければいけないのですか?

【回答】
既存のクラスドライバをマウスとした場合、ディスクリプタで複数のインターフェースを持つデバイスを定義して、そのひとつのインターフェースとしてマウスを実装します。(マウスを含むHIDクラス仕様はインターフェースレベルでの定義になっています)

この場合、ドライバは、Windows98の標準HIDクラスドライバを使用できます。初回接続時ドライバのインストールがクラスごとに複数回行われます。

 

3.サンプルファームウェア

【質問】
read_FIFO部のタスク化は可能ですか?

【回答】
USBプロトコル処理をハンドラから切り出してタスク化することを、いままで検討したことがございません。申し訳ございませんが、現在、read_FIFO部のタスク化が可能であるかそうでないかは判断できません。

 

【質問】
サンプルファームウェアのサポート状況は?

【回答】
ホスト側とデバイス側の2つに分けて説明します。

 

[ホスト側]

わたしどものソースコードは提供しておりません。マイクロソフトのDDK(Device driver Development Kit)でドライバを作成しています。わたしどもは、DDKでどのようにドライバを作成するかについての情報を提供できます。

 

ご存知のように、DDKはマイクロソフトのWebサイトにあり、そこでダウンロードできます。

 Windows98用  http://www.microsoft.com/ddk/ddk98.htm

 Windows2000用 http://www.microsoft.com/ddk/W2kDDK.htm

 

[デバイス側]

沖電気としては、C言語で書かれたサンプル・ファームウェアを提供できます。このサンプル・ファームウェアは、プラグ&プレイ、コントロール転送(ベンダ固有-リクエストも含む)、バルク転送をサポートしています。また、USBコントローラにおいては、PIO(Programed I/O)アクセスを使用し、DMAアクセスは使用していません。

 

 

【質問】
サンプルファームウェア単体での販売は可能ですか?

【回答】
申し訳ありませんが、サンプルファームウェア単体の販売は致しておりません。弊社のスタータキットでは、評価ボードとソフトウェアをパッケージ化して提供致しております。サンプルファームウェア単体、あるいはUSBコントローラ単体での販売は致しかねますのでご了承下さい。

尚、スタータキットの簡易版としてCAB60851 USB Boardがあります.こちらをご購入いただければ、JOB60851スタータキットにパッケージされているサンプルファームウェアとCAB60851 USB Boardのサンプルファームウェアは同じ物ですので、サンプルファームウェアアのみご必要とされるケースにおいてはお買い求め頂くのがお得と考えます。

 

【質問】
USB評価ボードのサンプルツールソフトの使用方法を教えてください。

【回答】
以下にサンプルツールソフトの使用方法を説明します。

 

==== Bulkusb.sys/Rwbulk.exeの使用ガイド =====

■Step1 : USBデバイスの動作確認

 

USBインプリメンターズ・フォーラム(USB)(http://www.usb.org/)からUSBのPnP動作を

評価するためのホストドライバおよびアプリケーションUSBcheck.EXEが提供されて

います。

 

http://www.usb.org/developers/ から tools & documentに行くとページ右側上に

compliance programという部分があり、ここからUsbcomp.exeをダウンロードできます。

これをダウンロードし、インストールするとUSBcheck.exeを使えるようになります。

 

USBcheckを起動すると、デバイスを接続要求するダイアログが出ます。

これにしたがって、ML60851A DEMO BOARDからのUSBケーブルをホストPCに接続してください。

接続後、デバイスがホストに認識された場合には、9章(デバイス)、11章(HUB)、CDCを評価するシートと、ディスクリプタを視覚的に見ることができるシートが出てきます。

 

この動作チェックのあと、ML60851C DEMO BOARDをPCから外し、USBCheckを終了して

下さい。

 

 

■Step2 : VendorIDとProductIDに調整

 

Bulkusb.infを接続するUSB機器のVendorIDとProductIDに調整する必要があります。

以下の箇所を修正して下さい。

 

INFファイルの[Manufacturer]セクションのVendorIDとProductIDを調整します。

Bulkusb.infの17行目のxxxxとyyyyに当たります.VendorIDの16進4桁をxxxxに、ProductIDの16進4桁をyyyyに指定して下さい。

(VendorIDとProductIDは、USBCheck.exeで確認できます。)

 

<オリジナル

013: [Manufacturer]

014: %MfgName%=Microsoft

015:

016: [Microsoft]

017: %USB/VID_045E&PID_930A.DeviceDesc%=BULKUSB.Dev,

USB/VID_04D7&PID_1BD9

 

<置換する箇所

013: [Manufacturer]

014: %MfgName%=Microsoft

015:

016: [Microsoft]

017: %USB/VID_045E&PID_930A.DeviceDesc%=BULKUSB.Dev,

USB/VID_xxxx&PID_yyyy

 ̄ ̄ ̄ ̄ ̄ ̄ ̄

■Step3 : ドライバのインストール

 

USBデバイスを接続すると、[新しいデバイスのインストール]ウィザードが立ち上がります。

このウィザードに対して、Step2で作成したINFファイルを指定すると、Bulkusb.sysをインストールすることができます。

 

 

■Step4 : 構成ディスクリプタの表示

 

RwBulkの-uオプションで、接続したUSBデバイスの構成ディスクリプタを表示できます。

 

以下の実行例を参考にして下さい。

 

RwBulk -u

Attempting to open

//./000000000000001e#{4c6edc82-1751-11d3-871e-00105a612537}

DeviceName =

(//./000000000000001e#{4c6edc82-1751-11d3-871e-00105a612537})

request complete, success = 1 nBytes = 39

 

===================

USB_CONFIGURATION_DESCRIPTOR

bLength = 0x9, decimal 9

bDescriptorType = 0x2 ( USB_CONFIGURATION_DESCRIPTOR_TYPE )

wTotalLength = 0x27, decimal 39

bNumInterfaces = 0x1, decimal 1

bConfigurationValue = 0x1, decimal 1

iConfiguration = 0x0, decimal 0

bmAttributes = 0xc0 ( ??? UNKNOWN!! )

MaxPower = 0x31, decimal 49

 

-----------------------------

USB_INTERFACE_DESCRIPTOR #0

bLength = 0x9

bDescriptorType = 0x4 ( USB_INTERFACE_DESCRIPTOR_TYPE )

bInterfaceNumber = 0x0

bAlternateSetting = 0x0

bNumEndpoints = 0x3

bInterfaceClass = 0xff

bInterfaceSubClass = 0xff

bInterfaceProtocol = 0xff

iInterface = 0x0, decimal 0

------------------------------

USB_ENDPOINT_DESCRIPTOR for Pipe00

bLength = 0x7

bDescriptorType = 0x5 ( USB_ENDPOINT_DESCRIPTOR_TYPE )

bEndpointAddress= 0x1 ( OUTPUT )

bmAttributes= 0x2 ( USB_ENDPOINT_TYPE_BULK )

wMaxPacketSize= 0x40, decimal 64

bInterval = 0x0, decimal 0

------------------------------

USB_ENDPOINT_DESCRIPTOR for Pipe01

bLength = 0x7

bDescriptorType = 0x5 ( USB_ENDPOINT_DESCRIPTOR_TYPE )

bEndpointAddress= 0x82 ( INPUT )

bmAttributes= 0x2 ( USB_ENDPOINT_TYPE_BULK )

wMaxPacketSize= 0x40, decimal 64

bInterval = 0x0, decimal 0

------------------------------

USB_ENDPOINT_DESCRIPTOR for Pipe02

bLength = 0x7

bDescriptorType = 0x5 ( USB_ENDPOINT_DESCRIPTOR_TYPE )

bEndpointAddress= 0x83 ( INPUT )

bmAttributes= 0x3 ( USB_ENDPOINT_TYPE_INTERRUPT )

wMaxPacketSize= 0x8, decimal 8

bInterval = 0x1, decimal 1

 

 

■Step4 : バルクアウト転送を発行

 

-oにバルクアウトエンドポイントのパイプ名(-uオプションで表示されるもの)を指定し、-wにアウト転送のサイズを指定すると、バルクアウト転送を発生させることが出来ます。

 

以下の例を参考にして下さい。

 

RwBulk -w 128 -o Pipe00 -vo -fo out.bin

 

Attempting to open

//./000000000000001e#{4c6edc82-1751-11d3-871e-00105a612537}

completeDeviceName =

(//./000000000000001e#{4c6edc82-1751-11d3-871e-00105a612537}/Pipe00)

Device Opened successfully.

Read File Opened successfully. (out.bin)

Out Data :

****** BEGIN DUMP LEN decimal 128, 0x80

0D 0A 0D 0A 20 20 20 20 - 20 20 20 20 57 69 6E 64

6F 77 73 20 39 38 20 44 - 44 4B 82 CC 83 54 83 93

83 76 83 8B 83 52 81 5B - 83 68 82 F0 83 78 81 5B

83 58 82 C9 82 B5 82 BD - 0D 0A 20 20 20 20 20 20

4D 4C 36 30 38 35 31 20 - 44 45 4D 4F 20 42 4F 41

52 44 97 70 83 68 83 89 - 83 43 83 6F 82 CC 83 72

83 8B 83 68 95 FB 96 40 - 82 C9 82 C2 82 A2 82 C4

0D 0A 0D 0A 20 20 20 20 - 20 20 20 20 20 20 20 20

****** END DUMP LEN decimal 128, 0x80

<Pipe00 W (0000) : request 000128 bytes -- 000128 bytes written

 

 

■Step5 : バルクイン転送を発行

 

-iにバルクインエンドポイントのパイプ名(-uオプションで表示されるもの)を指定し、-rにアウト転送のサイズを指定すると、バルクアウト転送を発生させることが出来ます。

バルクイン転送は、以下のコマンドラインで発生させることが出来ます。

 

RwBulk -r 128 -i Pipe01 -vi -fi in.bin

 

【質問】
サンプルファームウエアにおいて、下記のextint1()などの割り込み関数の中の記述は デバッグオプションに関係しますか?

【回答】
はい、関係します。質問にあるコードはデバッグオプションに/OSDを使用した場合です。

上記コードで/SDのオプションを使用すると正常に動作しません。上記コードで/SDオプションを用いた場合、関数呼び出しチェインを記憶するための_$baseptrを退避するコードが出力されています。したがって、これを正常に復帰させるために、下記のようにrti命令をコメントアウトする必要があります。

 

---- 以下のように変更する ------

{

#asm

inc psw /* 上位のポインティングレジスタセットに変更 */

inc lrb /* 上位のローカルレジスタセットに変更 */

acal _EXT_int /* 割り込み処理関数をコール */

;;;; rti /* 割り込み復帰 */ <-------ここに注目!

#endasm

}

 

こうすれば、#asm以前で、_$baseptrを退避し、#endasm以降で復帰した後、rtiで戻ります。アセンブリ混在での問題点を避けるためには、下記の様に完全にC言語で記述していただくのが良いと考えられます。

 

#pragma interrupt extint1 0x1C

void extint1(void)

{

EXT_int();

}

 

また、同一ファイル内の

 

void extint4(void);

void extint5(void);

 

も同様に変更します。

 

さらに、FIFO573.Cの二つの関数も、Cソースコードに変更して頂くのが良いと思います。

 

void __accpass read_fifo(uchar *fifo, uchar buf, uint cnt)

{

while(cnt--){

*buf++ = *fifo;

}

}

 

void __accpass write_fifo(uchar *fifo, uchar buf, uint cnt)

{

while(cnt--){

*fifo = *buf++;

}

}

 

【質問】
バルク転送試験はrwiso.exeで可能ですか?

【回答】
これは、できません。バルク試験にはrwbulk.exe、アイソクロナス試験にはrwiso.exeを使用してください。

 

【質問】
rwiso.exeにおいて、転送データ数の上限の制約はありますか?もし、上限の制約がある場合、この上限を4096バイトにすることは可能ですか?

【回答】
エンドポイント・ディスクリプタのwMaxPacketSizeのフィールドに、最大パケットサイズの記述があります。ここに記述されたサイズ以上のデータは送受信できません。

 

ML60852において、

5EPモード(エンドポイント5個)の場合、最大パケットサイズ=512バイト

6EPモード(エンドポイント6個)の場合、最大パケットサイズ=256バイト です。

 

5EPモード/6EPモードの選択は、システム制御レジスタ(SYSCON)のD2により設定されます。

D2="1"のとき、5EPモード

D2="0"のとき、6EPモード

 

【質問】
バルク試験において、"rwbulk -o pipe00 -w 128 -i pipe01 -r 128 -c 1"に した場合と、"rwbulk -o pipe00 -w 64 -i pipe01 -r 64 -c 2"の場合のデバイスドライバの動作の差は関数の遷移上どうなりますか?

【回答】
以下、サンプルファームの関数遷移で説明します。

(1)" rwbulk -o pipe00 -w 128 -i pipe01 -r 128 -c 1 " の場合

[バス上のトラフィック]

bulk OUT 64

bulk OUT 64

bulk IN 64

bulk IN 64

bulk IN 0

 

となります。

 

よって、関数遷移は以下のようになります。

 

usb_rx_start

read_FIFO---> read_fifo(64)

|

これ以降は3パターンあります。

(2)"rwbulk -o pipe00 -w 64 -i pipe01 -r 64 -c 2" の場合

 

bulk OUT 64

bulk IN 64

bulk IN 0

bulk OUT 64

bulk IN 64

bulk IN 0

 

となります。よって、関数遷移は以下のようになります。

 

usb_rx_start

read_FIFO

[--read_fifo(64)]

usb_tx_start

write_FIFO

[--write_fifo(64)]

write_FIFO

[--write_fifo(0)]

 

という関数遷移になります。

 

"rwbulk -o pipe00 -w 64 -i pipe01 -r 64 -c 2 "の方が、"rwbulk -o pipe00 -w 128 -i pipe01 -r 128 -c 1 "よりもデータ転送終了の分だけ処理が多くなります。

 

(注1) write_fifo(64)はFIFOに64バイトのライトを示し、write_fifo(0)はFIFOに0バイトのライトを示します。0バイトのライトとは、FIFOにデータは書き込みしないが、FIFOのロックを外す処理のことです。この処理により、ML60851Cは、INトークンに対してデータサイズ0のデータパケットをホストに送信します。データサイズ0のパケットを送信することはデータ転送終了を意味します。

(注2) write_FIFO : 関数write_FIFOの中で関数write_fifoが[--write_fifo()] 呼び出されることを示しています。read_FIFO : 関数read_FIFOの中で関数read_fifoが[-- read_fifo()] 呼び出されることを示しています。

 

 

【質問】
rwbulk試験を"rwbulk -o pipe00 -w 62 -i pipe01 -r 62 -c 1"で実行した場合、 サンプルファームウェアで関数write_FIFO()は2回動作するのですが、これは正しいのでしょうか?

【回答】
正しい動作です。

1回目のwrite_FIFO()では、MCUがFIFOに62バイトをライトしています。

2回目のwrite_FIFO()では、データ転送終了を示すために、MCUがFIFOに0バイトをライトしています。

(0バイトのライトとは、FIFOにデータは書き込みしないが、FIFOのロックを外す処理のことです)

よって、write_FIFO()は2回動作しています。

 

【質問】
サンプルファームウェアは、割り込みハンドラ内において、データをFIFOからメモリへ格納、または、データをメモリからFIFOへ格納しているのですか?

【回答】
はい、その通りです。

FIFOからメモリへのデータ格納は、関数read_FIFO()、read_FIFO_ISO()が

メモリからFIFOへのデータ格納は、関数write_FIFO()、write_FIFO_ISO()が

行ないます。

これらの関数は、割り込みハンドラ内において、対応する割り込み処理が発生したときに実行されます。

上記の各関数に対応する割り込み処理は下記の通りです。

バルク/インタラプト転送の場合

EPn受信パケットレディ割り込み → read_FIFO(EPn)

EPn送信パケットレディ割り込み → write_FIFO(EPn)

(n=1/2/3/4/5)

 

アイソクロナス転送の場合

EPn受信パケットレディ割り込み → read_FIFO_ISO(EPn)

EPn送信パケットレディ割り込み → write_FIFO_ISO(EPn)

(n=4/5)

 

【質問】
サンプルファームウェアにおいて、ML60851D/ML60852AのLength値とペイロードレジスタの値の関係は?

【回答】
2つの値は関係ありません。

Length値は、MCUの送信データサイズを示し、ペイロードレジスタの値は、ML60851D/ML60852Aが受信できるデータパケットの最大データサイズを示します。

 

【質問】
512バイトをアイソクロナス転送でライトすることはできますか?

【回答】
可能です。

以下、ML60852Aの5EPモード / 6EPモードのそれぞれの場合について記します。1msフレーム内には、最大パケットサイズのデータパケットしか送受信できません。エンドポイント・ディスクリプタのwMaxPacketSizeのフィールドに、最大パケットサイズの記述があります。ここに記述されたサイズ以上のデータは送受信できません。(USB仕様9.6.4を参照ください)

以下、512バイトをアイソクロナス転送でライトする場合の例を説明します。

 

[5EPモードの場合]

最大パケットサイズは256バイトであるので、下記のように2回に分けてアイソクロナスOUT転送を行なうことになります。

 

SOFトークン

ISO OUT (256バイト)

SOFトークン

ISO OUT (256バイト)

 

もしも、4096バイトを送信する場合には、最大パケットサイズは256バイト/1フレームであるので4096バイト=256バイト*16から、16フレームに分けてデータが転送されることになります。

 

[6EPモードの場合]

最大パケットサイズは512バイトであるので、下記のようにアイソクロナスOUT転送を1回行なうことになります。

 

SOFトークン

ISO OUT (512バイト)

 

もしも、4096バイトを送信する場合には、最大パケットサイズは512バイト/1フレームであるので4096バイト=512バイト*8から、8フレームに分けてデータが転送されることになります。

 

【質問】
rwiso.exe(アイソクロナス転送用テスト)では、アイソクロナス用のパイプを使用するのですか?

【回答】
はい、その通りです。

ML60852Aのサンプルファームウェアを使用する場合、PIPE03とPIPE04をそれぞれデフォルトにしています。