USB:ソフトウェア
FAQ USB ソフトウェア 質問一覧
1.リアルタイムOS
2.ホストソフトウェア
- ドライバのサポートはOS(Dos、Windows95/98、WindowsNT、Windows2000、 Linux etc)に依存するのか?
- プラグ&プレイに対するソフトウェアのサポート状況は?
- ML60852AのOHCI/UHCI対応は?
- 複合デバイスにおいて、既存クラスドライバと新たに追加するクラスドライバがある場合、複合デバイス用のデバイスドライバを既存のドライバも含めて、新規に 作成しなければいけないのですか?
3.サンプルファームウェア
- read_FIFO部のタスク化は可能ですか?
- サンプルファームウェアのサポート状況は?
- サンプルファームウェア単体での販売は可能ですか?
- USB評価ボードのサンプルツールソフトの使用方法を教えてください。
- サンプルファームウエアにおいて、下記のextint1()などの割り込み関数の中の記述は デバッグオプションに関係しますか?
- バルク転送試験はrwiso.exeで可能ですか?
- rwiso.exeにおいて、転送データ数の上限の制約はありますか?もし、上限の制約がある場合、この上限を4096バイトにすることは可能ですか?
- バルク試験において、"rwbulk -o pipe00 -w 128 -i pipe01 -r 128 -c 1"に した場合と、"rwbulk -o pipe00 -w 64 -i pipe01 -r 64 -c 2"の場合のデバイスドライバの動作の差は関数の遷移上どうなりますか?
- rwbulk試験を"rwbulk -o pipe00 -w 62 -i pipe01 -r 62 -c 1"で実行した場合、 サンプルファームウェアで関数write_FIFO()は2回動作するのですが、これは正しいのでしょうか?
- サンプルファームウェアは、割り込みハンドラ内において、データをFIFOからメモリへ格納、または、データをメモリからFIFOへ格納しているのですか?
- サンプルファームウェアにおいて、ML60851D/ML60852AのLength値とペイロードレジスタの値の関係は?
- 512バイトをアイソクロナス転送でライトすることはできますか?
- rwiso.exe(アイソクロナス転送用テスト)では、アイソクロナス用のパイプを使用するのですか?
FAQ USB ソフトウェア 回答
1.リアルタイムOS
【 回 答 】
- JOB60851に搭載しておりますマイコンMSM66573のリアルタイムOS(μITRON)を、沖電気にて発売しております。JOB60851に添付しているサンプルファームウェアはOSなしで動作する構造になっております。お客様の方でソフトウェア構造を変更していただく必要があります。
2.ホストソフトウェア
【 回 答 】
- Windows98/Windows2000上で動作するバルクIN/OUT通信用のバイナリ評価ドライバを提供できます。このサンプル・ドライバは、 Windows98 DDKとWindows2000 DDKのサンプル・ソースを元にしています。
【 回 答 】
- ホスト側とデバイス側の2つに分けて説明します。
- [ホスト側] (Windows98 / Windows2000)
- わたくしどものサポートの必要はありません。マイクロソフトのホスト・コントローラ・ドライバとハブ・ドライバは、プラグ&プレイの機能をサポートしています。
- [デバイス側]
- 沖電気は、USB仕様1.0/1.1準拠のプラグ&プレイのためのサンプル・ソースコードを提供できます。このサンプル・ファームウェア・ソースコードはC言語で書かれており、ML60851D/ML60852Aの両方をサポートしています。ソースコードは、JOB60851スタータ・キットのCD-ROMに含まれています。
- [ホスト側] (Windows98 / Windows2000)
【 回 答 】
- 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の両方に対応しております。
【 回 答 】
- 既存のクラスドライバをマウスとした場合、ディスクリプタで複数のインターフェースを持つデバイスを定義して、そのひとつのインターフェースとしてマウスを実装します。(マウスを含むHIDクラス仕様はインターフェースレベルでの定義になっています)
- この場合、ドライバは、Windows98の標準HIDクラスドライバを使用できます。初回接続時ドライバのインストールがクラスごとに複数回行われます。
3.サンプルファームウェア
【 回 答 】
- 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
- わたしどものソースコードは提供しておりません。マイクロソフトのDDK(Device driver Development Kit)でドライバを作成しています。わたしどもは、DDKでどのようにドライバを作成するかについての情報を提供できます。
- [デバイス側]
- 沖電気としては、C言語で書かれたサンプル・ファームウェアを提供できます。このサンプル・ファームウェアは、プラグ&プレイ、コントロール転送(ベンダ固有-リクエストも含む)、バルク転送をサポートしています。
また、USBコントローラにおいては、PIO(Programed I/O)アクセスを使用し、DMAアクセスは使用していません。
- 沖電気としては、C言語で書かれたサンプル・ファームウェアを提供できます。このサンプル・ファームウェアは、プラグ&プレイ、コントロール転送(ベンダ固有-リクエストも含む)、バルク転送をサポートしています。
- [ホスト側]
【 回 答 】
- 申し訳ありませんが、サンプルファームウェア単体の販売は致しておりません。当社のスタータキットでは、評価ボードとソフトウェアをパッケージ化して提供致しております。サンプルファームウェア単体、あるいはUSBコントローラ単体での販売は致しかねますのでご了承下さい。
尚、スタータキットの簡易版としてCAB60851 USB Boardがあります。こちらをご購入いただければ、JOB60851スタータキットにパッケージされているサンプルファームウェアとCAB60851 USB Boardのサンプルファームウェアは同じ物ですので、サンプルファームウェアアのみご必要とされるケースにおいてはお買い求め頂くのがお得と考えます。
【 回 答 】
- 以下にサンプルツールソフトの使用方法を説明します。
- ==== 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を終了してください。
- USBインプリメンターズ・フォーラム(USB)(http://www.usb.org/)からUSBのPnP動作を評価するためのホストドライバおよびアプリケーションUSBcheck.EXEが提供されています。
- ■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
-  ̄ ̄ ̄ ̄ ̄ ̄ ̄
- オリジナル
- Bulkusb.infを接続するUSB機器のVendorIDとProductIDに調整する必要があります。
- ■Step3 : ドライバのインストール
- USBデバイスを接続すると、[新しいデバイスのインストール]ウィザードが立ち上がります。
このウィザードに対して、Step2で作成したINFファイルを指定すると、Bulkusb.sysをインストールすることができます。
- USBデバイスを接続すると、[新しいデバイスのインストール]ウィザードが立ち上がります。
- ■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
- RwBulk -u
- 以下の実行例を参考にして下さい。
- RwBulkの-uオプションで、接続したUSBデバイスの構成ディスクリプタを表示できます。
- ■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
- RwBulk -w 128 -o Pipe00 -vo -fo out.bin
- 以下の例を参考にして下さい。
- -oにバルクアウトエンドポイントのパイプ名(-uオプションで表示されるもの)を指定し、-wにアウト転送のサイズを指定すると、バルクアウト転送を発生させることが出来ます。
- ■Step5 : バルクイン転送を発行
- -iにバルクインエンドポイントのパイプ名(-uオプションで表示されるもの)を指定し、-rにアウト転送のサイズを指定すると、バルクアウト転送を発生させることが出来ます。
バルクイン転送は、以下のコマンドラインで発生させることが出来ます。- RwBulk -r 128 -i Pipe01 -vi -fi in.bin
- -iにバルクインエンドポイントのパイプ名(-uオプションで表示されるもの)を指定し、-rにアウト転送のサイズを指定すると、バルクアウト転送を発生させることが出来ます。
- ■Step1 : USBデバイスの動作確認
- ==== Bulkusb.sys / Rwbulk.exeの使用ガイド =====
【 回 答 】
- はい、関係します。質問にあるコードはデバッグオプションに/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++;
}
}
- ---- 以下のように変更する ------
【 回 答 】
- これは、できません。バルク試験にはrwbulk.exe、アイソクロナス試験にはrwiso.exeを使用してください。
【 回 答 】
- エンドポイント・ディスクリプタのwMaxPacketSizeのフィールドに、最大パケットサイズの記述があります。ここに記述されたサイズ以上のデータは送受信できません。
ML60852において、
5EPモード(エンドポイント5個)の場合、最大パケットサイズ=512バイト
6EPモード(エンドポイント6個)の場合、最大パケットサイズ=256バイト です。
5EPモード/6EPモードの選択は、システム制御レジスタ(SYSCON)のD2により設定されます。
D2="1"のとき、5EPモード
D2="0"のとき、6EPモード
【 回 答 】
-
以下、サンプルファームの関数遷移で説明します。
(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()] 呼び出されることを示しています。
【 回 答 】
- 正しい動作です。
1回目のwrite_FIFO()では、MCUがFIFOに62バイトをライトしています。
2回目のwrite_FIFO()では、データ転送終了を示すために、MCUがFIFOに0バイトをライトしています。
(0バイトのライトとは、FIFOにデータは書き込みしないが、FIFOのロックを外す処理のことです)
よって、write_FIFO()は2回動作しています。
【 回 答 】
- はい、その通りです。
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)
【 回 答 】
- 2つの値は関係ありません。
Length値は、MCUの送信データサイズを示し、ペイロードレジスタの値は、ML60851D/ML60852Aが受信できるデータパケットの最大データサイズを示します。
【 回 答 】
- 可能です。
以下、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フレームに分けてデータが転送されることになります。
【 回 答 】
- はい、その通りです。
ML60852Aのサンプルファームウェアを使用する場合、PIPE03とPIPE04をそれぞれデフォルトにしています。