Android が提供するUSB Host API を使用して、タブレット(Android バージョン 4.0.3 およびカーネル バージョン 2.6.39.4 の Motorola Xoom)と周辺機器の間で通信するためのソフトウェアを作成しています。私は 2 種類の通信のみを使用します。
- コントロール:
controlTransfer(int requestType, int request, int value, int index, byte[] buffer, int length, int timeout)
- バルク:
bulkTransfer(UsbEndpoint endpoint, byte[] buffer, int length, int timeout)
コントロール転送は問題なく動作しますが、一括転送に問題があります。bulkTransfer 関数のバッファーのサイズとして 32768 しか使用できません。少ないまたは多いを使用することはできません。バッファ パイプの制限 (サイズ: 32769 バイト) のため、これ以上使用できないことはわかっています。
この周辺機器は、bulkTranfer 関数によって正しく読み取られないデータをストリーミングします。一部のデータが失われていると思います。
Linux では、プロセスが空のパイプ (バッファ) から読み取ろうとすると、データが利用可能になるまで read(2) がブロックされます。プロセスが満杯のパイプに書き込もうとすると、 write(2) は、パイプから十分なデータが読み取られて書き込みが完了するまでブロックされます。
それに基づいて、問題の私の説明は、 write(2) 関数によって作成されたブロックフラグのために、一部のデータがパイプ (バッファー) に書き込まれないということです。私は正しいですか?これが本当なら、パイプ バッファを変更できます。
- この問題に対する私の最初の解決策は、バッファーを大きくすることです。カーネル>= 2.6.35の場合、パイプのサイズを変更できますが
fcntl(fd, F_SETPIPE_SZ, size)
fd
、USBパイプの(ファイル記述子)を見つけるにはどうすればよいですか? - 2番目のオプションは使用することです
ulimit -p SIZE
が、カーネルのパラメーターp
はパイプではなくプロセス用です。
誰かが同じ問題に直面しましたか、解決策はありますか?