こんな違いを反映してか、内部構造もかなり異なる。EHCIの場合、基本的にはUSB 2.0 Deviceのみをサポートすれば済むということもあってか、構造もシンプルである。Photo01はEHCIの大雑把な内部構造である。
EHCIの場合、内部でAsyncronousとPeriodicという2種類のキューを管理している。AsyncronousではControlとBulkが、PeriodicではIsochronousとInterruptの各Transferがそれぞれ管理される形だ。ちなみにPeriodicの方は、Time base windowを使って定期的な転送管理が行われるが、Asyncronousの方はラウンドロビンで管理されることになっている。で、このPeriodicとAsynchronousの2つのキューに関しては、Host側のメモリをEHCI ControllerがShared Mappingする形で共用している。ではHost側は? というと、PCI Configuration RegisterにECHIの内部レジスタをMapするBase I/O Addressが格納されており、ここからCapabilities RegistersとOperational RegistersのI/O Addressが判断できる。このOperation Registerの中にはそれぞれのキューの先頭アドレスが入っており、これを参照することで実際にEHCI Controllerが管理している2つのキューをHost側からアクセスすることも出来る。
勿論通常はEHCI Controller側がこのキューの中身を見ながら順次転送を掛け、これにあわせてキューへのポインタなどを更新してゆくわけだ。とはいえ、Deviceの追加とか削除、Transfer Scheduleの更新などはHost側の(実際にはEHCI Base Driverの)お仕事である。
これがxHCIになるとどう変わるか? というのがPhoto02である。当たり前だがPCI Configuration Spaceにマッピングされている部分は大きくは変わらない。強いて言えば、xHCIはPCI Expressが前提となっているため、PCI Configuration Spaceも最初からPCIeを前提としたものになっているのが異なるところだ。ただ、そこから先は随分異なる。まずCapabilities RegistersとOperation Registersに加え、xHCI Extended Capabilities RegistersとRuntime Registers、Doorbell Arrayといったものが追加されている。
まずxHCI Extended Capabilities Registersだが、EHCIの場合Capabilities Registersは、
CAPLENGTH(8bit) | Capabilities Registerのサイズ |
---|---|
Reserved(8bit) | 無し |
HCIVERSION(16bit) | Interface Version Number |
HCSPARAMS(32bit) | Structual Parameters |
HCCPARAMS(32bit) | Capabilities Parameters |
HCSP-PORTROUTE(64bit) | Companion Port Route Description |
といった構造になっており、一方xHCIは、
CAPLENGTH(8bit) | Capabilities Registerのサイズ |
---|---|
Reserved(8bit) | 無し |
HCIVERSION(16bit) | Interface Version Number |
HCSPARAMS1(32bit) | Structual Parameters1 |
HCSPARAMS2(32bit) | Structual Parameters2 |
HCSPARAMS3(32bit) | Structual Parameters3 |
HCCPARAMS(32bit) | Capabilities Parameters |
DBOFF(32bit) | Doorbell Offset |
RTSOFF(32bit) | Runtime Register Space Offset |
Reserved(不定) | 無し |
といった具合に、大幅に拡張されている。もともと通信ハンドリング方式が異なるから、例えばEHCIのドライバを持ってきて、xHCI ControllerをUSB 2.0のみで使うといった形の互換性はそもそも考慮されていない(現実問題として不可能)だが、一応Registerの構造は似せる努力はしているようだ。続くStructual Parameterは名前の通り「構造」を示す部分で、EHCIの場合はここにDownstream Portの数とかDebug Portの番号、1つのCompanion Controllerあたり接続されるポート数といった、基本的な構造が含まれているわけだが、xHCIでは内部構造を大幅に拡張したため、ここで示すべき項目もまた大幅に増えており、結果としてレジスタが3つも並ぶことになっている。続くCapabilities Parameterは「能力」を示すものであるが、これもxHCIでは大幅に拡張されており、到底レジスタ1個では収まらなくなった。そこで、32bitレジスタの前半には色々な能力(例えば64bit Memory Pointerをサポートしているか否か、とかBandwidth Negotiationの機能を持っているか否か、など)をbit fieldで細かく示しているが、ここに収まりきらなかった分はxHCI Extended Capabilitiesという別レジスタで示すことにし、ここへのポインタを後半16bitで示している。
(続く)