一方LATENCY_TORELANCE_MESSAGE(LTM)の場合、Photo01の様なフィールド構成となる。ここでSubTypeがDEV_NOTIFICATION、Notification TypeはLATENCY_TORELANCE_MESSAGEと成るわけだが、これに続くBELT(Best Effort Latency Tolerance)フィールドは12bitとなるが、うち先頭の10bitは具体的なLatencyValue(ns)、続く2bitがLatencyScale(係数)となっており、

00b : Reserved
01b : 1024
10b : 32768
11b : 1048576

となっている。つまり実際の新しいLatencyは、LatencyValue×LatencyScaleという計算になるわけだ。

Photo01: Universal Serial Bus 3.0 SpecificationのFigure 8-18から抜粋

またBUS_INTERVAL_ADJUSTMENT_MESSAGEの場合は、Photo02の様なフィールド構成となる。ここでNotificationTypeは当然BUS_INTERVAL_ADJUSTMENT_MESSAGEになるとして、Reservedを挟んだ後半16bitのBus Interval Adjustmentは、Bus Intervalの補正値が入ることになる。値自体はInteger(つまり符号付き整数)で、範囲は-32768~+32767までであるが、この値はBusIntervalAdjustmentGranularityへの係数となる。ちなみにこのBusIntervalAdjustmentGranularityは、4.0690104psとSpecificationでは定められている。

Photo02: Universal Serial Bus 3.0 SpecificationのFigure 8-19から抜粋

ちなみにLTMについては、(以前もちょっと触れたが)デバイスの省電力性を最大限に高めるために有効となる機能である。そのデバイスがサポートする最大の時間間隔(これがBELTである)に設定することで、不要な通信を減らして消費電力を減らすというものだ。一方BUS_INTERVAL_ADJUSTMENT_MESSAGEの方は、現在のIntervalの微調整を行うためのものとなる。例えばDeviceのClockが必ずしもHostのClockと同期するとは限らない(というか、むしろ微妙にずれているのが普通である)訳で、だからといってDevice側にClockの微調整のメカニズムを入れるとコストが上がることになる。そこで調整機能をHostの側に持たせ、Deviceに同期させようというのが趣旨で、このためにこのTPが使われる事になる。

ちなみにこれはLMPではなくTPで、つまりDevice毎にこのIntervalが異なるという事が当然ありえる訳だ。Hostはこうしたものも個別に管理する必要がある。

PING/PING_RESPONSE TP(Photo03)

Photo03: PING/PING_RESPONSE共に、フィールドは同じ

PING TPは、Isochronous Transferに使われることになる。これは特に、DeviceがPower Save Modeに入っている場合に効果的である。Power Save Modeにおいては、EndpointがU0に達するまで若干の遅れが出ることは間違いなく、逆に言うとIsochronous TransferのPacketをいきなり送りつけてEndpointをU0に復帰させるという方法では、時間が間に合わない可能性がある。そこで、転送に先立ちあらかじめPING TPをHostからEndpointに伝達 すると、Endpoint側は待機状態からU0に復帰後にPING_RESPONSE TPを送り出し、以後後続のPacketが来るまでU0状態が維持される。このため、Isochronous Transferであっても遅延なく処理が行えるというものである。

さて、そんなわけでPING TPのフォーマットはPhoto03に示す通りである。SubTypeにPINGが入るほか、Retry Data Packet/Direction/Endpoint Numberの各フィールドはACK TPと同じとなる。これの返答となるPING_RESPONSE TPも同じフォーマットで、SubTypeにPING_RESPONSEが入るほかは全く同じである。

以上でTransaction Packetは終了、次がData Packet(DP)となる。DPはPhoto04の様なフォーマットとなる。こちらは当然ながらサイズは可変長であり、実際のサイズは送り出すデータによって変わってくる。厳密に言えば、DPの先頭4 DWORDはData Packet Header(DPH)で毎回共通で、続くData Packet Payload(DPP)が可変長となる形だ。実際のDPPの長さはDPHの中に格納される。またDPPは必ず32bit Alignmentとされ、最後にはCRC-32が付加される形だ。

Photo04: フィールドの詳細は次回

(続く)