Route Stringの話も終わったところで、いよいよ実際のパケットである。Link LayerではパケットはTransmitter/Receiverそれぞれが必要に応じてパケットを送る(といっても、大半はTransmitter側だが)事になるが、Protocol Layerでは基本的に全てのTransactionがHost側から始まることになる。つまりHostとEndpoint、どちらがデータの送り側であっても、TransactionそのものはHost側から始まる形だ。そしてTransactionの最後はEndpoint側からデータの送信ないしデータ受信通知を送る形で終了する。この管理は全てHostが行っているから、例えば複数のTransactionを同時に進行させる事も可能だが、Transactionの種類によっては制約がある(特にEndpoint→Hostの場合)事や、異常状態(NRDYとかSTALL TPといったPacketが返ってきた場合)には相応の配慮が必要な事もあり、常に複数Transactionを同時に進行させられるわけではない。このあたりはまた後で触れたいと思う。
さて、ではPacket TypeとFormatについて紹介したい。Protocol Layerでは大別して4種類のPacket Typeが定義され、更にSub Typeを幾つか持つ。4種類のTypeとは、
LINK Management Packet(LMP) | Link制御。これはHostとEndpointではなく、各々のLinkの間でのみやりとりされる。 |
---|---|
Transaction Packet(TP) | Transaction制御。これはHostとDevice(Endpoint)の間で交換される。データパケットのフロー制御とかDevice/HubのConfigurationなどに利用される。TPはData Payloadを持たない。 |
Data Packet(DP) | HostとEndpointの間のデータ交換に利用される。DPはData Packet Header(DPH)とData Packet Payload(DP)の2パートから構成される |
Isochronus Timestamp Packet(ITP) | HostからのTreeにぶら下がっている全てのデバイスにMulticastされるPacket |
となっている。
基本的なPacket FormatはPhoto01の様になっている。もっとも、4種類のPacketで共通なのはこのうち、
- DWORD 0のType field
- DWORD 3のCRC-16
- DWORD 3のLink Control Word
のみで、あとはPacket毎に異なっているのが実情だ。このうちType fieldは先に示した4種類のPacketを5bitで示している。具体的には、
00000b | LMP |
---|---|
01000b | DPH |
00100b | TP |
01100b | ITP |
となっており(これ以外の値はInvalid)、5bitもとっていながら、実際には2bitしか使っていない。ちなみにSubtypeを持つPacketは、ここではなくこれに続くFieldにSubtypeを示すfieldが用意されるので、ここは2bitが使われるのみである。おそらく将来の拡張に備えてのReserveだと思うが、何でこんなにゆとりをとったのか、機会があれば聞いてみたいところだ。
CRC-16はもうそのまんまで、DWORD 0/1/2の12Bytes分のデータについて16bitのCRCを生成して格納する。続くLink Control Wordは連載の298回で触れたのでここでは割愛する。これら3つのフィールドは全てのPacket Typeで共通な項目だ。ではPacket Type毎に独自の部分は? ということで、まずはLMPから紹介して行きたい。
LMPのフォーマットはこんな具合だ(Photo02)。最初の3つ以外だと、4bitのSubTypeが加わった程度で、あとはSubType毎にばらばらである。ちなみにSubTypeのFieldは、
0000b | Reserved |
---|---|
0001b | Set Link Function |
0010b | U2 Inactivity Timeout |
0011b | Veder Device Test |
0100b | Port Capability |
0101b | Port Configuration |
0110b | Port Configuration Response |
その他 | Reserved |
となっている。
(続く)