EZ-USBのエンドポイント構成

 EZ-USBのもっているエンドポイントの一覧を表3に示します.比較のために,Am186CUの内蔵USBコントローラやUSBN9602のエンドポイント構成も表4に併記しました.この表からわかるとおり,EZ-USBはAm186CUの6個,USBN9602の7個などに比べて,はるかに多い32個のエンドポイントをもっているうえ,バッファの大きさもはるかに大きなものになっています.

 EZ-USBの場合,コントロールエンドポイント以外のエンドポイントは,IN方向のエンドポイントが15個(INEP1〜INEP15),同じくOUT方向のエンドポイントが15個(OUTEP1〜OUTEP15)あります.

 これらのうち,前半の14個(INEP1〜INEP7/OUTEP1〜OUTEP7)はバルク伝送(またはインタラプト伝送)用のもの,後半の16個(INEP8〜INEP15,OUTEP8〜OUTEP15)はアイソクロナス伝送用です.

● エンドポイントのバッファ構造
 バルク伝送用のエンドポイントバッファのサイズはすべて64バイトです.通常,エンドポイントバッファはFIFOになっていて,特定のポートを連続アクセスしてデータの書き込み/読み出しを行うものが多いのですが,EZ-USBの場合には,コントロールエンドポイントやバルクエンドポイントのバッファメモリは,CPUのメモリ空間にマッピングされており,CPUがランダムアクセスすることができます.

 これにより,エンドポイントバッファサイズ以下のデータしかやりとりしないのであれば,メインメモリにバッファ領域を設ける必要がなくなるほか,使用しないエンドポイントバッファを通常の拡張メモリ領域として使うことも可能になっています.今回のサンプルプログラムでも,この特徴を活かして,未使用エンドポイントバッファの一部をワークエリアとして使用してみました.

 アイソクロナス伝送のバッファのほうは,EZ-USBでもFIFO構造になっています.ただ,ほかのコントローラと違ってユニークなところは,EZ-USBの場合,CPUからは直接アクセスできない領域に2面×1Kバイトのバッファメモリが用意されており,この範囲を全アイソクロナスエンドポイントで共有して使うようになっていることです.

 1Kバイトの領域のどこからがどのアイソクロナスエンドポイント用のバッファとするかは,ユーザーが任意に決められるようになっています.

● コントロール伝送用エンドポイント
 通常のUSBコントローラのコントロールエンドポイント(EP0)は,IN方向とOUT方向のエンドポイントFIFOを一つずつもち,OUT方向についてはFIFOに格納されているのがデータなのか,SETUPパケット(デバイスリクエスト)なのかを区別するためのフラグを設けています.

 これに対し,EZ-USBは通常のIN方向,OUT方向のバッファの他に,SETUPパケット専用のバッファをもっています.図10に,セットアップデータ処理に関係するレジスタを示します.デバイスリクエストは常に8バイトなので,このバッファ領域(SETUPBUF)も8バイト分が用意されています.

〔図10〕セットアップデータ用レジスタ




 当然,割り込みが入ったときに,これがOUT方向のデータ転送によるものなのか,あるいはSETUPパケットなのかによってベクタ番号が変わるので,簡単に判定できるわけです.また,SETUPパケットに続いてデータOUT転送があった場合,SETUPパケットの内容を残したまま,データを受け取れるわけです.

 また,EZ-USBではGET_DESCRIPTORなど,デバイスリクエストへの応答データとして,エンドポイントバッファ以上のデータを送るような場合に便利なように,直接USBコントローラがメインメモリ上のテーブルを読み出して転送してしまうDMA(Direct Memory Access)機能をもっています.

 デバイスリクエストをCPUが解析し,ホストにデータを送る必要があった場合は,あらかじめデータ領域に転送データを用意したうえで,そのバッファの先頭アドレスをSUDPTRHとSUDPTRLという二つの8ビットレジスタに設定し,EP0CS(Endpoint0 Control Register)のHSNAKビットをクリアするだけで,あとは自動的に転送が行われます.

 ここでデータ数を設定する必要はありません.というのは,デバイスリクエストの6,7バイト目(wLengthフィールド)により,続くデータステージで転送されるデータサイズが分かっているためで,USBコントローラはこの値を自分で解釈し,自動的に必要なサイズ分のデータ転送を行うようになっているのです(表5).

 データサイズがFIFOバッファサイズ以上であった場合の分割転送もUSBコントローラ側で自動的に行われるので,CPUはいったんレジスタを設定してしまえば,後は何もすることはありません.

 なお,ベンダ定義のデバイスリクエストの場合,wLengthフィールドを任意目的に使うことも可能ではあるのですが,EZ-USBでこの機能を使うときには,wLengthフィールドにはデータサイズを設定しておかなくてはなりません.

● バルク(インタラプト)用エンドポイント
 EZ-USBはバルクIN用,バルクOUT用にそれぞれ7個ずつのエンドポイントをもっています.エンドポイント番号は固定で,1番から7番に割り振られているので,エンドポイント番号の設定レジスタはありません.

 これらのエンドポイントは,インタラプト伝送用にも使用可能です.インタラプト伝送用とバルク伝送の違いは,インタラプト伝送の方がプライオリティが高く,あらかじめエンドポイントディスクリプタで指定した周期以下の周期でアクセスされることになっているのに対し,バルク伝送の場合にはプライオリティが低い代わりに,空きがあれば同一フレーム内で何度でも伝送が行われるという程度のことで,ターゲットのファームウェアの作成においては,ほとんど違いを意識する必要はありません.

 バルク/インタラプト伝送に関連するレジスタの構成を図11に示します.バルク用エンドポイントは,それぞれのエンドポイントごとに64バイトのバッファメモリが用意されており,CPUからランダムアクセスが可能であるということは先ほど述べたとおりです.

〔図11〕IN/OUT伝送用レジスタ




 転送動作を行う場合,バッファはCPUとUSBコントローラが交互に使うような形になるので,両者が同時にアクセスすることを避けるため,各エンドポイントバッファごとにステータスレジスタが用意されています.BUSY=‘1’ならば,USBコントローラが現在バッファを使用中ということなので,CPUからのアクセスは行えません.

 バルクINエンドポイントが空になったときや,バルクOUTエンドポイントに1パケット分のデータが入ったときには,CPUに割り込みが発生するので,ここでデータをエンドポイントバッファに入れたり,エンドポイントバッファのデータを取り出すということになります.

 各エンドポイントには,データサイズを示すバイトカウントレジスタ(INxBC/OUTxBC)があります.OUTエンドポイントの場合には受信されたパケットのサイズが,INエンドポイントの場合にはエンドポイントバッファの中の有効データ数(送信したいデータサイズ)を指定することになります.

 バイトカウントレジスタに書き込みを行うことで,エンドポイントバッファのアクセス権がUSBコントローラ側に移ります.OUTエンドポイントの場合,バイトカウンタへの書き込み値そのものに意味はありません.

 また,EZ-USBではバルクエンドポイントの数が多くあることを利用して,二つずつペアにしてダブルバッファのように使うことができるようになっています.

 通常のシングルバッファのときには,たとえばOUTトランザクションで受け取ったデータをCPUが引き取り終わるまでは,ホストが次のOUTトランザクションを発行してもNAKが返ってしまうのですが,ダブルバッファの場合,最初のOUTトランザクションの処理をCPUが行っている最中でも次のOUTトランザクションを受け付けることができるため,全体のスループットが向上するというわけです.

● アイソクロナス用エンドポイント
 EZ-USBは,16本(IN方向8個,OUT方向8個)のアイソクロナスエンドポイントをもっていますが,アイソクロナス伝送は最大データサイズが大きい(最大1024バイト/パケット)のため,エンドポイントごとにバッファを用意することができません.このため,EZ-USBではバッファを16個のアイソクロナスエンドポイントで共有するという形をとっています.

 バッファ領域は1Kバイトですが,ダブルバッファになっているため,内部には2Kバイト分のバッファが存在します.図12にアイソクロナスバッファのようすを,図13にアイソクロナス伝送関連レジスタを示します.

〔図12〕
アイソクロナスバッファの共有
〔図13〕アイソクロナス伝送関連レジスタ


 このバッファメモリのどこからをどのエンドポイント用のバッファにするかは,任意に決めることができます.FIFOバッファサイズをユーザーが自由に決められるようになっていると思えばよいでしょう.

 このバッファメモリは,バルクエンドポイントのバッファのようにランダムアクセスすることはできず,各エンドポイント用のレジスタを通したFIFO形式のアクセスになります.

 ただ,アイソクロナス伝送を行わない場合,アイソクロナス伝送をディセーブルにする(ISOCTLレジスタのISODISABを‘1’)と,この2Kバイトのバッファメモリが2000h番地から27FFh番地に現れ,通常のメモリ領域として利用することができます.


◆ はじめに
◆ EZ-USBの特徴

◆ EZ-USBの三つの起動モード

◆ EZ-USBのエンドポイント構成
◆ EZ-USBの割り込み処理
コラム  サイプレス製USBコントローラの系譜

1月号特集トップページへ戻る


Copyright 2001 桑野 雅彦