-
Notifications
You must be signed in to change notification settings - Fork 5
USB Memo
uchan-nos edited this page Aug 5, 2017
·
40 revisions
USB のホスト側の制御(特に xHCI)についてのメモ書き
2017/08/05 by uchan
USB を制御するには、いくつかの層のドライバを書く必要がある。
- USB クラスドライバ:例えば HID(キーボードやマウス)とか、Web カメラとか用のドライバ
- USB ドライバ:USB 規格で規定された、データのやり取りとかを実装する部分
- ホストコントローラドライバ:xHCI など、ホストコントローラを制御する部分
- PCI ドライバ:ホストコントローラは PCI バスに繋がることが前提になっているので、PCI ドライバも必要
USB 規格はあくまでもデータのやり取りの形式(フレームの構造、USB 機器とやり取りする際のプロトコルなど)を規定している。 USB 規格と物理層をつなぐのがホストコントローラで、これは USB 規格とは別物。
ホストコントローラ規格には幾つか種類がある:UHCI, OHCI, EHCI, xHCI
- USB
- USB 規格の解説 http://wiki.osdev.org/USB
- xHCI
- インテルの xHCI 規格書 xHCI for Universal Serial Bus: Specification
- PCI
xHCI のレジスタは大きく 2 箇所に存在する。
- PCI コンフィギュレーション空間のレジスタ:MMIO 空間のスタートアドレスを設定する BAR を含む。
- MMIO 空間のレジスタ:こちらがメイン。USB 機器に送るデータをためるキューなどはこちらにある。
PCI コンフィギュレーション空間の BAR で MMIO 空間のアドレスを設定し、後は MMIO 空間のレジスタでいろいろ制御する感じになる。
"xHCI for Universal Serial Bus: Specification"(以降 "xHCI Spec" と書く)5.3 節によれば、規格書に出てくる MMIO レジスタは、すべて MMIO 空間の先頭を基準に配置されているらしい。規格書の中では一貫して MMIO 空間の先頭のことを Base と呼んでいる。
MMIO 空間の先頭(Base offset 00h)には xHCI Capability Registers が配置されている。