USBの基礎知識 ――パケットのフォーマットからプロトコルの詳細まで
● バルクOUT転送時の動作
バルクOUT転送は,ホストからターゲットへのデータ転送です.いま図8のように,ホストからバルクOUTトランザクションが発行されたとします.はじめはトークン・パケットが送られてきます.パケットの先頭はSYNCで,次のPIDにはOUT転送であることが示されています.続いてUSBターゲット・アドレスとエンドポイントが示されます.パケットの最後はCRCで,パケットが正常かどうかを確認できます.以上でトークン・パケットは終了です.
図8 バルクOUT転送時のUSBターゲットの動作
そして次のパケットがデータ・パケットです.SYNCに続き,PIDにはDATA0またはDATA1が示されます.その後に実際の転送データが格納され,最後にCRCが続きます.
ここで,先ほどトークン・パケットで指定されたエンドポイントのバッファが空いているので,バルクOUTで転送されたデータはエンドポイントに格納されます.このとき,エンドポイントのバッファ・サイズより大きなサイズのデータが転送されることはありません.ホスト側はあらかじめエンドポイント・ディスクリプタを取得し,各エンドポイントのバッファ・サイズを把握しているからです.
無事エンドポイントにデータを格納したら,ターゲット・コントローラはホストに対してハンドシェイク・パケットでACKを返します.これは,ターゲットからホストへのパケットの転送になります.バルクOUT転送時に,転送先のエンドポイントが空いていない場合は,転送されたデータを格納する場所がないのでそのままデータを破棄し,ターゲット・コントローラはホストに対してハンドシェイク・パケットでNAKを返します.NAKを受け取ったホストは,再度同じデータでバルクOUTトランザクションを発行します.
バルクOUT転送は,USBのトランザクションの中でも最も理解しやすい転送といえます.