Skip to content
uchan-nos edited this page Aug 5, 2017 · 40 revisions

USB のホスト側の制御(特に xHCI)についてのメモ書き

2017/08/05 by uchan

USB 制御の概要

USB を制御するには、いくつかの層のドライバを書く必要がある。

  • USB クラスドライバ:例えば HID(キーボードやマウス)とか、Web カメラとか用のドライバ
  • USB ドライバ:USB 規格で規定された、データのやり取りとかを実装する部分
  • ホストコントローラドライバ:xHCI など、ホストコントローラを制御する部分
  • PCI ドライバ:ホストコントローラは PCI バスに繋がることが前提になっているので、PCI ドライバも必要

USB 規格はあくまでもデータのやり取りの形式(フレームの構造、USB 機器とやり取りする際のプロトコルなど)を規定している。 USB 規格と物理層をつなぐのがホストコントローラで、これは USB 規格とは別物。

ホストコントローラ規格には幾つか種類がある:UHCI, OHCI, EHCI, xHCI

資料リンク

xHCI のレジスタ

xHCI のレジスタは大きく 2 箇所に存在する。

  • PCI コンフィギュレーション空間のレジスタ:MMIO 空間のスタートアドレスを設定する BAR を含む。
  • MMIO 空間のレジスタ:こちらがメイン。USB 機器に送るデータをためるキューなどはこちらにある。

PCI コンフィギュレーション空間の BAR で MMIO 空間のアドレスを設定し、後は MMIO 空間のレジスタでいろいろ制御する感じになる。

MMIO 空間

"xHCI for Universal Serial Bus: Specification"(以降 "xHCI Spec" と書く)5.3 節によれば、規格書に出てくる MMIO レジスタは、すべて MMIO 空間の先頭を基準に配置されているらしい。規格書の中では一貫して MMIO 空間の先頭のことを Base と呼んでいる。

MMIO 空間の先頭(Base offset 00h)には xHCI Capability Registers が配置されている。

Clone this wiki locally