USB XHCIについてのメモ
#USB XHCIについて
- XHCIではデータ転送はハードウェアが主に実現する
- XHCIではTRB(Transfer Ring Block)という16バイトの制御構造体を用いてデータ転送などを実現する
- TRBは、TRB Ringというリング配列のデータ構造により、メインメモリ領域を介してコントローラドライバとホストコントローラでデータのやり取りを行う
- TRB Ringは次の3つ
- Transfer TRB
- USBデバイスとのデータ転送に使用される
- コントローラドライバによりパイプごとに作成される
- ホストコントローラが順次取り出して実際の転送を実行する
- Command TRB
- USBデバイスの認識プロセスにおけるコマンドの発行やステート遷移に使用される
- システムに一つだけ存在する
- ホストコントローラが順次取り出して実行する
- Event TRB
- ホストコントローラで発生したイベントをコントローラドライバに通知するために使用される
- 転送処理、コマンド処理の完了やポートの状態変化の通知など、ハードウェアの状態変化をUSBソフトウェアに伝えるために存在する
- システムに1つだけ存在する
- Transfer TRB
##データ転送
- 基本は以下の手順
- コントローラドライバが送信したいTransfer TRBまたはCommand TRBをTransfer RingまたはCommand Ringについかする
- コントローラドライバがDoorbell Arrayレジスタに転送したいエンドポイントを設定することで転送開始
- ホストコントローラがTRBを受信してUSB転送処理を開始する
- ホストコントローラは処理が完了したことのEvent TRBをEvent Ringに追加
- ホストコントローラは割り込みを発生させてコントローラドライバに処理が完了したことを通知する
- Event TRBを取得する
##xhciにおけるステート遷移
###デバイス認識シーケンス
- xHCにデバイスが接続される
- PORTSCレジスタのCCSビットとCSCビットが1にセットされる
- PORTSCレジスタの変化とともに、XHCIはPort Status Change Event TRBを生成し、Event Ringに追加。その後割り込みがあがり、コントローラドライバに通知される。
- ドライバはデバイスのために、Event Slot Command TRBを発行し、Device Slotをアサインする。ドライバはCommand Completion Event TRBを受け取り、Device SlotのSlot IDを入手できる。
- ドライバはDevice Slot管理用のDevice Contextの確保と初期化を行う
- ドライバはAdress Device Command TRB用のInput Contextの確保と初期化を行う。(Enable State)
- ドライバはAddress Device Command TRBを発行し、デバイス・アドレスの割り当てを行う。この時、バス上では、SET_ADDRESSのControl転送がxHCにより自動実行される。この転送が成功すると、(Block Set Address Request(BSR)が0の時)Enable StateからAddressed Stateに遷移する。(Addressed State)
- ドライバはGET_DESCRIPTORコントロール転送を発行し、USBデバイスのディスクリプタ情報を取得する
- ドライバはConfigure Endpoint Command TRBを発行し、デバイスステートをConfigured Stateへ移行し、認識シーケンスが完了する。(Configured State)
※この時、Deconfigure(DC)フラグを1にしてConfigure Endpoint Commandが発行されると、Addressed stateに戻る