USBについて雑多なメモ。その2
#USBのソフトウェア
##ソフトウェアの階層
ざっくりとわけるとホスト/デバイスにそれぞれ3つにわけられる。
###ホスト
- ホストコントローラドライバ
- 一番HWに近い層で、以下の仕事を担っている。
- レジスタの初期化や制御データの初期化
- USBホスト・ポート制御(ルートハブ制御、デバイス接続/切断制御、サスペンド/レジューム制御)
- 転送制御(コントトール転送、バルク転送、インタラプト転送、アイソクロナス転送)
- 割り込み/イベント処理
- 上記機能に関するUSBバス・ドライバ、OS機能、PCI Expressバスドライバへのインターフェースの提供
- USB3.0で提供されることとなったxHCは単一のコントローラでLow/Full/High/Super Speedをサポートすることができる。
- USB2.0対応のEHCIではHighスピード通信専用
- そのため、コンパチ対応のため、OHCI/UHCIコントローラーを搭載する必要があった。
- 一番HWに近い層で、以下の仕事を担っている。
- バスドライバ
- 特定のコントローラ/デバイスに依存しない層で、すべてのコントローラ/デバイスに対して拡張性を意識した設計をする必要がある。
- コントローラドライバ、クラスドライバを管理するそうである。
- USBデバイスの管理をし、クラスドライバ/コントローラドライバにインターフェースを提供している。
- USBデバイス管理
- デバイスエニュメレーション管理(アドレス割り当て、各種ディスクリプタ情報取得/保持)
- デバイスツリー構成、デバイスアドレス管理
- USBハブポート制御/管理
- バスステート、リソース管理
- パワーマネジメント管理
- クラスドライバインターフェース
- デフォルトパイプ(標準リクエスト)リクエストの生成/発行
- バルク、インタラプト、アイソクロナス/コントロールパイプによるリクエストの生成/発行
- デバイススロットの有効化/無効化
- バルクストリーム転送
- デバイス情報提供、アクセス、制御(標準ディスクリプタ取得/設定など)
- パイプステート制御
- コンフィグレーション/インターフェース設定、オルタネートセッティング
- クラスリクエスト、ベンダリクエスト
- コントローラドライバインターフェース
- 接続/切断、サスペンドレジューム検出
- エニュメレーションに関する標準リクエストコール
- USBデバイス管理
- クラスドライバ
- 特定のデバイスのターゲット機能を実現する階層
- マスストレージクラスやオーディオクラス用の標準デバイスクラスもあれば、ベンダ用のクラスドライバもある。
###デバイス
- ディスクリプタ情報を生成してホストに渡すことが重要な機能の1つで、その情報をもとにUSBホストは同じUSB接続でも通信相手によって必要な通信を行うことができる。
- デバイスソフトウェアにも以下の階層が存在する。
- コントローラドライバ
- HWに一番近い層で、以下の仕事を担っている
- USBデバイス接続/切断
- VBUS制御
- パワーマネジメント
- サスペンドレジューム制御
- 転送制御
- コントロール転送/バルク転送/インタラプト転送/アイソクロナス転送
- DMAコントローラ・ハードウェア制御
- USB EPCバッファ-メモリ間DMA転送
- USB EPCバッファ-他デバイス間DMA転送
- 割り込み制御
- 転送割り込み/DMA終了割り込み
- 切断/接続、サスペンド/レジューム割り込み
- USBデバイス接続/切断
- HWに一番近い層で、以下の仕事を担っている
- バスドライバ
- クラスドライバ/コントローラドライバの管理を行っている層で以下の仕事を担っている
- ディスクリプタ管理
- リクエスト処理
- USBデバイス管理
- 接続・切断、イベント発生
- コントローラドライバインターフェース
- クラスドライバインターフェース
- クラスドライバ/コントローラドライバの管理を行っている層で以下の仕事を担っている
- クラスドライバ
- USB製品に合わせてユーザーから見た機能を実現する層
- USB2.0 3.0による違いに関してはバスドライバ、コントローラドライバで吸収されているため、基本的な通信においての差分はあまり気にしなくてもいい。(5.0Gbpsを実現するにはケアが必要。)
- 以下の仕事を担っている
- クラス固有ディスクリプタ管理
- デバイスクラス転送制御
- クラスリクエスト機能
- アプリケーションへのAPIの提供
- ブリッジI/F機能