LinuxでのUSB 3.0エラー "Failed to Submit Transfer Status=0xe2100001"#
問題#
Linux環境でUSB 3.0カメラを使用しており、トランスポートレイヤーの MaxTransferSize パラメータを65536バイトより大きい値に設定した場合、コンソールに次のようなエラーメッセージが繰り返し表示されることがあります。
Failed to submit transfer status=0xe2100001.
トランスポートレイヤーの MaxTransferSize パラメータを増やすと、通常はデータオーバーヘッドが削減され、CPU割り込みが減るため、CPU負荷を軽減できます。Linux環境では、Maximum Transfer Sizeの最大サイズは約3 MBです。
このエラーメッセージが表示される理由は、カーネルモジュール「usbcore」に、要求されたUSB Request Block(URB)サイズ分の十分なMemoryがないためです。デフォルトでは、「usbcore」には約16 MBのMemoryが割り当てられています。
要求されるURBサイズは、次のように計算されます。
Maximum Transfer Size x Num Max Queued URBs
デフォルトでは、Num Max Queued URBsは64に設定されています。
解決策#
上記のエラーメッセージを回避するには、次の手順を実行します。
- 前述の計算式を使用して、エラーメッセージが表示されなくなるまで、pylon Viewerまたはアプリケーション内の
NumMaxQueuedUrbsの値を下げます。 -
カーネルモジュール「usbcore」に追加のMemoryを割り当てます。
-
現在割り当てられているMemory(MBytes単位)を確認するには、コンソールで次のコマンドを実行します。
-
現在のセッションのみMemoryを増やす(例:32 MBにする)には、rootとしてログインし、次を実行します。
-
割り当てられたMemoryを恒久的に増やす方法は、使用しているLinuxディストリビューションによって異なります。
「grub2」を使用するUbuntuの場合は、次の手順を実行できます。
- ファイル /etc/default/grub を編集します。
- 変数を変更します。 GRUB_CMDLINE_LINUX例えば:
- rootとして次のコマンドを実行し、再起動します。