☆でたらめ☆LOW SPEEDデバイス(HID)のインタラプト転送の周期を1msにしてみた [USB]
Tsuneoさんからのアドバイス(*´ー`) に従って、エンドポイントディスクリプタのポーリング周期を書き換え、通常10ms(実際は8ms)を1msにしてみました。
書き換える場所は”usb_descriptors.c”の多分69行目の以下の行
10 // Polling Interval (Interrupt) in ms
これを
1 // Polling Interval (Interrupt) in ms
とします。これだけ。
まず2Kマシンでやってみました。
それで動かした結果が上のキャプチャなのですが、半周期が1msとなっている事が判ります。
ただし常に1msと言う訳ではなく、流石にJB16マイコンにも1msの割り込みを取りこぼし無く処理するのがきついと思われ、偶に2msになったりもします。
しかしタイピングは早いです。
今度はXPマシンでやってみました。
明らかにこちらはタイピングが遅いです。周期も8msに戻っています。
つまり2Kはこの点に関してもルーズで、XPはスペックを遵守していると言えるのでしょう。
この結果はOSやハードウエア等に大きく依存しますので、一つのオプションとして考えてください。
追加
どうせ3byteしか有効なデータは無いのだから、同じ”usb_descriptors.c”のエンドポイントディスクリプタのエンドポイントのサイズを変更してみました。
{0x08, 0x00}, // Max. Endpoint Packet Size
を
{0x03, 0x00}, // Max. Endpoint Packet Size
しかし結果は全然駄目です。メモ帳に文字がタイプされません。一体どこで止まっているのか原因は不明です。
書き換える場所は”usb_descriptors.c”の多分69行目の以下の行
10 // Polling Interval (Interrupt) in ms
これを
1 // Polling Interval (Interrupt) in ms
とします。これだけ。
まず2Kマシンでやってみました。
それで動かした結果が上のキャプチャなのですが、半周期が1msとなっている事が判ります。
ただし常に1msと言う訳ではなく、流石にJB16マイコンにも1msの割り込みを取りこぼし無く処理するのがきついと思われ、偶に2msになったりもします。
しかしタイピングは早いです。
今度はXPマシンでやってみました。
明らかにこちらはタイピングが遅いです。周期も8msに戻っています。
つまり2Kはこの点に関してもルーズで、XPはスペックを遵守していると言えるのでしょう。
この結果はOSやハードウエア等に大きく依存しますので、一つのオプションとして考えてください。
追加
どうせ3byteしか有効なデータは無いのだから、同じ”usb_descriptors.c”のエンドポイントディスクリプタのエンドポイントのサイズを変更してみました。
{0x08, 0x00}, // Max. Endpoint Packet Size
を
{0x03, 0x00}, // Max. Endpoint Packet Size
しかし結果は全然駄目です。メモ帳に文字がタイプされません。一体どこで止まっているのか原因は不明です。
2008-03-16 00:33
nice!(0)
コメント(4)
トラックバック(0)
>つまり2Kはこの点に関してもルーズで、XPはスペックを遵守していると言えるのでしょう。
うーん、残念。WinXPは、だまくらかせませんでしたか。
>エンドポイントディスクリプタのエンドポイントのサイズを変更してみました。
>一体どこで止まっているのか原因は不明です。
「エンドポイントディスクリプタのエンドポイントのサイズ」というのは
{0x08, 0x00}, // Max. Endpoint Packet Size
の部分ですね。これが、wMaxPacketSize フィールドです。
レポートのバイト数とこの wMaxPacketSize は直接の関係は実はありません。
なので、戻しておいて下さいな。
レポートのバイト数を決めている部分はレポートデスクリプタ内にあります。
usb_descriptors.c
const byte ReportDesc[]=
{
0x05, 0x01,
0x09, 0x06,
0xA1, 0x01,
0x05, 0x07,
0x19, 0xE0,
0x29, 0xE7,
0x15, 0x00,
0x25, 0x01,
0x75, 0x01,
0x95, 0x08,
0x81, 0x02,
0x95, 0x01,
0x75, 0x08,
0x81, 0x01,
0x95, 0x05,
0x75, 0x01,
0x05, 0x08,
0x19, 0x01,
0x29, 0x05,
0x91, 0x02,
0x95, 0x01,
0x75, 0x03,
0x91, 0x01,
0x95, 0x06, // Report Count (6), バイト数 <-----------
0x75, 0x08, // Report Size (8), ビット
0x15, 0x00, // Logical Minimum (0), 値の最小値
0x25, 0x65, // Logical Maximum(101), 値の最大値
0x05, 0x07, // Usage Page (Key Codes), Usage: キーコード ページ
0x19, 0x00, // Usage Minimum (0), 最小のキーコード (no event indicated)
0x29, 0x65, // Usage Maximum (101), 最大のキーコード (Keyboard Application)
0x81, 0x00, // Input (Data, Array), ;Key arrays (6 bytes)
0xC0 // End Collection
};
コメントを付けた部分がキーバッファの定義です。
その中で、最初の
0x95, 0x06, // Report Count (6),
がキーバッファのバイト数を指定しています。
これを1バイトにすれば良いでしょう。
0x95, 0x01, // Report Count (1),
なお、このレポートデスクリプタは、下記のUSB HIDスペックにのっているキーボードのサンプルと全く同じものです。このサンプルの方はきちんとコメントが付いてますので、各行の意味が多少なりともわかるかと思います。
"Device Class Definition for HID 1.11" on USB.org
http://www.usb.org/developers/devclass_docs/HID1_11.pdf
E.6 Report Descriptor (Keyboard) (HID1_11.pdf p69)
先ほどの「エンドポイントディスクリプタのエンドポイントのサイズ」wMaxPacketSize とは、このエンドポイントで扱う最大のパケットサイズ(データ部分のみ)を指定しています。だから Max がついているんですね。これは、noritan さんのところで解説まがいのものをやらさせていただいてますが、長いトランスファをパケットに分割する単位となります。また、スケジューリングで占有帯域を計算するのにも使用されます。
なお、wMaxPacketSize など、デスクリプタのフィールドの名称は、USB 2.0 スペックに沿ったものを使うよう心がけています。
USB 2.0 スペック
"Universal Serial Bus Revision 2.0 specification" on USB.org
http://www.usb.org/developers/docs/usb_20_092407.zip
エンドポイントデスクリプタの定義
9.6.6 Endpoint (usb_20.pdf p269)
Table 9-13. Standard Endpoint Descriptor
Tsuneo
by Tsuneo (2008-03-16 16:07)
はじめまして KEN といいます
こちらでHOSのブログを書かれているようなので、ちょっと、
お聞きしたいことがあるのですが?
H8マイコンとHOSではじめる組み込み開発 ITRONプログラミング入門
の付録Aの299ページのセクション宣言についてなんですが?
使用しているマイコンはH8/3664です。
使用しているHEWのバージョンVersion 4.03.00.001です。
OS Windows XP
そうするとセクションの設定は、本に書いてある通りだと
0x00000000 VECT,P,C,D
0x0000F780 B,X
となってます。これで、ビルドすると
次のような、エラーが出ます。
L2330 (E) Relocation size overflow : "C:\WorkSpace\hosv4\h8sample\Debug\crt0.obj"-"P"-"00000002"
で、もしかしたら、これなら出来るかもしれないと想い、
次のように変更しましたがこれでもエラーがでます。
0x00000000 VECT
0x00000034 P,C,D
0x0000F780 B,X
L2330 (E) Relocation size overflow : "C:\WorkSpace\hosv4\h8sample\Debug\crt0.obj"-"P"-"00000002"
もし、わかるようでした。教えてください。
お願いします
by KEN (2008-03-20 18:27)
はじめまして、、、始めてではないかもしれないけれど。
L2330エラーをコンパイラマニュアルで調べると、「セクションのオフセット位置の参照シンボルが正しくない」となっていますので、crt0.srcの該当する位置は多分以下のコードでしょう。
_startup:
; ----- スタック初期化
mov.w #STACK, r7
この中で参照シンボルと言えるのは「STACK」なので、この「STACK」を正しく解決してやれば良いのだと思います。
色々方法はありますが、300ページに書いてありますね。
by hamayan (2008-03-20 23:05)
こんにちは
回答ありがとうございます。
ご指摘いただいた内容を、確認しましたら、無事にビルドが出来ました。
ありがとうございます。
by KEN (2008-03-21 10:47)