2016-12-22 21 views
0

/HIDレポートで/を掘り起こすと、USB HIDデバイス内で奇妙な問題が発生しました。私はHIDクラスデバイスを実装しており、Keilが提供するHID USBプログラムに基づいてプログラムを作成しています。いくつかのコードはこのプロジェクトで変更されており、32バイトの入力と32バイトの出力レポートでうまく動作しているようです。どういうわけか、数千回のデータ転送後、エンドポイント1がハングして不良パイプになります。それから私はいくつかのヒントのためのGoogleを検索し、トピックは、レポートの説明で定義したものと一致するパケットの長さを送信した後にデータ長ゼロのパケットを書き込む必要があることを思い出させる。しかし、それは私のために働いていない。それから私はアウトパケットと魔法のように受け取った後、コントロールパイプにデータ長ゼロを書き込みます、それは動作します!何百万回も移動した後も決してハングしません!usb hid:アウトエンドポイント割り込みのコントロールパイプに "null"を書き込む必要があります

ここに私の質問です:コントロールパイプにデータ長ゼロを書き込んだ後に動作するのはなぜですか?出力パイプで転送されるデータは、制御パイプ内のデータとは関係がありません。それは私を混乱させる!

+0

を参照してください:[掲載]と[MCVE]をご提示ください。あなたはまた、尋ねる前に2分間のサイトツアーを完了させるのに気にしませんでした。 –

答えて

0

予想されるペイロードサイズより小さいデータを転送する場合は、データが転送されたことを示すゼロ長パケットを送信する必要があります。

しかし、それはホストコントローラ上の実装に大きく依存し、すべてのデバイスがポイントまでの仕様に従っているわけではなく、ストールする可能性があります。

出典:
When do USB Hosts require a zero-length IN packet at the end of a Control Read Transfer?

+0

ありがとうございます。あなたが提供した情報は本当に私に多くの助けをもたらしました。私は、USBパケットを送信した後にZLPを送信する必要がある理由は、すべてのUSB OUTトランザクションが、USBパケットを正常に送信した後、デバイスからのACKを必要としていることです。デバイスが送信するペイロードサイズはどれくらいですか。 –

+0

コメントを整理する:送信後ではなく、受信後です。 –

関連する問題