プライベートな連絡先の最初の情報
送料メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
この記事では、USB 帯域幅を慎重に管理する方法について説明します。 各 USB クライアント ドライバーは、使用する USB 帯域幅を最小限に抑え、未使用の帯域幅を使用可能な帯域幅のプールにできるだけ早く返す責任があります。
ここで、USB 2.0 の速度は 480Mbps、12Mbps、1.5Mbps で、それぞれハイスピード、フルスピード、ロースピードに相当すると思いますが、実はこれも USB 2.0 の帯域幅は非常に狭いのです。 USB 3.0 の外観 これにより帯域幅の問題は軽減されますが、帯域幅の問題は上限不足ではなく、スケジュール ハイビスカスの問題です。
USB バス上の帯域幅をめぐる競争は、ハードウェアやソフトウェアなどの複数のソースから発生します。 USB クライアント ドライバーが使用できる帯域幅の量を正確に予測することは困難です。 USB ホスト コントローラーが動作するには、ある程度の帯域幅が必要です。 必要な量は、コントローラが高速であるかどうかによって異なります。 システムごとに異なります。 高速で動作する USB ハブは、高速アップストリーム ポートとダウンストリームの低速デバイス間のトランザクションを変換する必要がある場合があり、この変換プロセスは帯域幅を消費します。 ただし、トランザクション変換に帯域幅が必要かどうかは、接続されているデバイスのタイプとデバイス ツリーのトポロジによって異なります。
帯域幅リソースに対する最も深刻な圧力は、通常、帯域幅を独占する USB クライアント ドライバーによって発生します。 システムは帯域幅を先着順に割り当てます。 最初にロードされた USB ドライバが利用可能なすべての帯域幅を要求した場合、その後ロードされる USB ドライバはデバイスに帯域幅を許可しません。 システムはデバイスを構成または列挙できません。 列挙の失敗の理由が明らかではないため、ユーザー エクスペリエンスは低下します。
場合によっては、クライアント ドライバーが高速割り込み転送によって利用可能な帯域幅を使い果たすことがあります。 しかし、最も一般的なシナリオは、クライアント ドライバーが定常的な転送に多すぎる帯域幅を割り当て、適時に解放できないというものです。 システムは、帯域幅を要求したドライバーが別のエンドポイントを開いてエンドポイントを閉じるか、帯域幅が割り当てられていたデバイスが削除されるまで、割り当てられた帯域幅を保持します。 システムはバルク転送に保証された帯域幅を割り当てないため、バルク転送が列挙エラーの原因になることはありません。 ただし、バルク転送デバイスのパフォーマンスは、定期的な (一定の待機と中断) 転送用にデバイスに割り当てられた帯域幅の量によって決まります。
USB 2.0 仕様では、デフォルトのインターフェイス設定で帯域幅ゼロのエンドポイントを持つ定数デバイスが必要です。 これにより、ファンクション ドライバーがデフォルト以外のインターフェイスを開くまでデバイスの帯域幅が予約されなくなり、デバイス構成中の過剰な帯域幅要求による列挙の失敗を防ぐことができます。 クライアント ドライバーがデバイスの構成後に過剰な帯域幅を割り当てて、他のデバイスが正常に機能しなくなることを防ぐことはできません。
適切な帯域幅管理の鍵は、定数転送を実行するシステム内のすべての USB デバイスが定数エンドポイントを含むインターフェイスごとに複数の代替 (Alt) 設定を提供する必要があり、クライアント ドライバーがこれらの Alt 設定を賢明に使用する必要があることです。 クライアント ドライバーは、最初に最大の帯域幅を備えたインターフェイス設定を要求する必要があります。 要求が失敗した場合、クライアント ドライバーは、要求が成功するまで帯域幅を徐々に小さくしてインターフェイス設定を要求する必要があります。
たとえば、Web カメラ デバイスに次のインターフェイスがあるとします。
インターフェイス 0 (デフォルトのインターフェイス設定: デフォルト設定ではゼロ以外の一定帯域幅を持つエンドポイントはありません)
Const エンドポイント 1: 最大パケット サイズ = 0 バイト
Const エンドポイント 2: 最大パケット サイズ = 0 バイト
インターフェイス 0 Alt 設定 1
定数エンドポイント 1: 最大パケット サイズ = 256 バイト
Const エンドポイント 2: 最大パケット サイズ = 256 バイト
インターフェース 0 Alt 設定 2
定数エンドポイント 1: 最大パケット サイズ = 512 バイト
Const エンドポイント 2: 最大パケット サイズ = 512 バイト
Web カメラのドライバーは、初期化時にデフォルトのインターフェイス設定を使用するように Web カメラを構成します。 デフォルト設定には一定の帯域幅がないため、初期化中にデフォルト設定を使用すると、一定の帯域幅要求の失敗により Web カメラが列挙できなくなる危険を回避できます。
クライアント ドライバーが一定のアイソクロナス転送を実行する準備ができたら、Alt 設定 2 のパケット サイズが最大であるため、Alt 設定 2 の使用を試行する必要があります。 リクエストが失敗した場合、ドライバーは Alt 設定 1 を使用して再度試行できます。 Alt 設定 1 では必要な帯域幅が少なくなるため、最初のリクエストが失敗した場合でも、このリクエストは成功する可能性があります。 複数の Alt 設定により、ドライバーは諦める前に複数回試行することができます。
Web カメラがアイドル状態になると、デフォルト設定を再度選択することで、割り当てられた帯域幅を利用可能な帯域幅プールに戻すことができます。
ユーザーは、Windows デバイス マネージャーでコントローラーのプロパティを確認することで、USB コントローラーに割り当てられた帯域幅を確認できます。 コントローラーのプロパティを選択し、[詳細設定] タブを確認します。この読み取り値は、USB ハブがトランザクション変換に割り当てる帯域幅の量を示すものではありません。
USB コントローラの帯域幅使用状況を報告するデバイス マネージャ機能は、Windows XP では正しく動作しません。
最大転送サイズは、USB ドライバー スタックにハードコーディングされた制限を指定します。 これらの制限を下回る転送サイズは、システム リソースの制限により失敗する可能性があります。 このような種類の障害を回避し、すべての Windows バージョンとの互換性を確保するには、USB 転送に大きな転送サイズを使用しないようにしてください。
USBD_PIPE_INFORMATION 構造体の MaximumTransferSize メンバーは廃止されました。 USB ドライバー スタックは、複合デバイスおよび非複合デバイスの MaximumTransferSize の値を無視します。
Windows 2000 では、USB ドライバ スタックは MaximumTransferSize を USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE に初期化します。 クライアント ドライバーは、デバイスを構成するときに、より小さい値を設定できます。 複合デバイスの場合、機能ごとのクライアント ドライバーは、デフォルト以外のインターフェイス設定でパイプの MaximumTransferSize のみを変更できます。
USB 転送サイズは次によって制限されます。
MaximumTransferSize を使用して転送サイズを制限しても、デバイスが消費する帯域幅には直接影響しません。 クライアント ドライバーは、インターフェイス設定を変更するか、USBD_PIPE_INFORMATION の MaximumPacketSize メンバーに設定されている最大パケット サイズを制限する必要があります。
最大パケット サイズは、エンドポイント記述子の wMaxPacketSize フィールドによって定義されます。 クライアント ドライバーは、デバイスへの選択したインターフェイス要求で USB パケット サイズを調整できます。 この値を変更しても、デバイス上の wMaxPacketSize は変更されません。
要求された URB 内には、パイプの USBD_PIPE_INFORMATION 構造体があります。 この構造では、
クライアント ドライバーが読み取り要求を発行する場合、送信バッファーは最大パケット サイズの倍数である必要があります。 ドライバーが必要とするデータが最大パケット サイズよりも少ない場合でも、パケット全体を要求する必要があります。 デバイスが最大サイズより小さいパケット (ショート パケット) を送信すると、転送は完了します。
古いコントローラーでは、クライアント ドライバーがこの動作をオーバーライドできます。 データ転送 URB の TransferFlags メンバーで、クライアント ドライバーは USBD_SHORT_TRANSFER_OK フラグを設定する必要があります。 このフラグにより、デバイスは wMaxPacketSize より小さいパケットを送信できるようになります。
xHCI ホスト コントローラーでは、USBD_SHORT_TRANSFER_OK はバルク エンドポイントと割り込みエンドポイントを無視します。 EHCI コントローラでショート パケットを送信しても、エラー状態は発生しません。
EHCI ホスト コントローラーでは、USBD_SHORT_TRANSFER_OK はバルク エンドポイントおよび割り込みエンドポイントに対して無視されます。
UHCI および OHCI ホスト コントローラーで、USBD_SHORT_TRANSFER_OK がバルク転送または割り込み転送に設定されていない場合、ショート パケット転送はエンドポイントを停止し、転送のエラー コードを返します。
USB ドライバー スタック ドライバーは、デバイスへの書き込み時とデバイスからの読み取り時では、パケット サイズに異なる制限を課します。 一部のクライアント ドライバーは、デバイスを管理するために少量の制御データを頻繁に送信する必要があります。 この場合、データ転送を均一サイズのパケットに制限するのは現実的ではありません。 したがって、データの書き込み中、ドライバー スタックはエンドポイントの最大サイズより小さいパケットに特別な意味を割り当てません。 これにより、クライアント ドライバーは、デバイスへの大規模な転送を最大サイズ以下の複数の URB に分割できます。
ドライバーは、最大サイズより小さいパケットで転送を終了するか、長さ 0 のパケットを使用して転送の終わりを区切る必要があります。 ドライバが wMaxPacketSize より小さいパケットを送信するまで、転送は完了しません。 転送サイズがちょうど最大値の倍数である場合、ドライバーは長さ 0 で区切られたパケットを送信して転送を明示的に終了する必要があります。
USB 仕様で要求されているように、クライアント ドライバーは長さ 0 のパケットを使用してデータ転送を区切る必要があります。 USB ドライバー スタックは、これらのパケットを自動的に生成しません。
準拠した USB 2.0 および USB 1.1 ドライバーは、最大サイズのパケット (wMaxPacketSize) を送信してから、最大サイズ未満のパケットで送信を終了するか、長さ 0 のパケットで送信の終わりを区切る必要があります。 ドライバが wMaxPacketSize より小さいパケットを送信するまで、転送は完了しません。 転送サイズがちょうど最大値の倍数である場合、ドライバーは転送を明示的に終了するために長さ 0 で区切られたパケットを送信する必要があります。
デバイス ドライバーは、USB 仕様で要求されている長さ 0 のパケットを使用してデータ転送を区切る役割を果たします。 システムの USB スタックは、これらのパケットを自動的に生成しません。