EZ-USBのもっているエンドポイントの一覧を表3に示します.比較のために,Am186CUの内蔵USBコントローラやUSBN9602のエンドポイント構成も表4に併記しました.この表からわかるとおり,EZ-USBはAm186CUの6個,USBN9602の7個などに比べて,はるかに多い32個のエンドポイントをもっているうえ,バッファの大きさもはるかに大きなものになっています.
当然,割り込みが入ったときに,これが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からランダムアクセスが可能であるということは先ほど述べたとおりです.
転送動作を行う場合,バッファは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にアイソクロナス伝送関連レジスタを示します.
このバッファメモリのどこからをどのエンドポイント用のバッファにするかは,任意に決めることができます.FIFOバッファサイズをユーザーが自由に決められるようになっていると思えばよいでしょう. このバッファメモリは,バルクエンドポイントのバッファのようにランダムアクセスすることはできず,各エンドポイント用のレジスタを通したFIFO形式のアクセスになります. ただ,アイソクロナス伝送を行わない場合,アイソクロナス伝送をディセーブルにする(ISOCTLレジスタのISODISABを‘1’)と,この2Kバイトのバッファメモリが2000h番地から27FFh番地に現れ,通常のメモリ領域として利用することができます. ![]()
1月号特集トップページへ戻る Copyright 2001 桑野 雅彦 |