マイコン工作実験日記

Microcontroller を用いての工作、実験記録

OHCIでのアイソクロナス転送

2009-06-04 00:23:27 | USB
OHCIの動き方/使い方の概要が理解できたので、USBスピーカを使うために必要なアイソクロナス転送をサポートするための、実装方式について考えました。OHCI上でのアイソクロナス転送は、周期的に実行される転送という観点からは1ms毎に実行されるインタラプト転送と同じ扱いになっていますが、使用するTD (Transfer Descriptor)の形式が他の転送方式とは違っています。

選定したUSBスピーカは、なにやらHIDデバイス機能も持った複合デバイスとなっていますが、今回のプロジェクトではスピーカのオーディオ出力機能だけを使うことにします。このように簡単化してしまえば、USBホストでサポートするのはコントロール転送と、オーディオPCM出力のためのアイソクロナス転送だけになります。よって、インタラプト転送はサポートしないことにしてしまいます。コントロール転送は、もともとのUSB Host Liteのものを流用していますので、新規に追加するのはOUT方向のアイソクロナス転送だけということになり、周期的転送処理のためのリスト構造を次の図のように単純化かつ固定化してしまうことにします。



OHCIではHCCA(Host Controller Communication Area)のInterrupt Tableにおいて、32ms分の周期的実行に実行する転送を表現できる仕組みになっています。アイソクロナス転送は1ms間隔で実行する必要がありますので、このテーブルには全て同一のED(End point Descriptor)を設定してやります。こうすることで、EDが指定しているエンドポイント(すなわちスピーカ出力)に対しての転送が毎回発生することになります。EDのFフラグはリンクされるTDのフォーマットがアイソクロナス転送用のものであることを示し、このEDには4つのTDをリンクさせます。ひとつのTDでは、下図のように8つの送信バッファを指定することができるので、8ms分の転送を表現することができます。このTDを4つ使うことで32ms分の転送を表現しようというわけです。


TDのには8つのオフセットフィールドがあり、この情報で8回の転送で使用するバッファの先頭アドレスからのオフセットを指定します。Starting Frameは転送開始する時刻を指定し、指定されたFrame番号に到達すると指定バッファアドレスからの転送が実行されます。実際の転送が行われる時点で、必要なTDとバッファが用意されていればいいので、実際には32回分の転送に相当するTDとバッファを全てあらかじめ用意しておく必要はないのですが、LPC2388にはUSB転送用のメモリ領域が16KBも用意されているので、32ms分をすべて用意することにしておきます。

このようにして、TDが示すバッファに再生すべきPCMデータを入れてやれば、あとはOHCIが指定のタイミングで自動的にデータを送出してTDのリストから外してくれます。リストから外れたTDはHCCAのDoneHeadが示すリストに付け替えられるので、これを割り込みで検出し、新たなPCMデータを示すTDを作成してEDからのリストに追加してやれば、順次再生データの送出ができることになります。

1ms毎に送信されるPCMデータの量は48KHzサンプリングの場合には、次のようになります。
1ms毎のサンプル数: 48,000 samples/sec = 48samples/msec
ステレオなので:    48 samples * 2 channel = 96samples
1サンプルは16bitなので: 2byte * 96 = 192byte
これを32ms分用意したとしても、192 * 32 = 6144 = 6KBなので、メモリは余裕十分です。このように、48KHzの時には毎回192バイトづつ転送すればいいのですが、44.1KHzサンプリングの場合には、1msでは176.4バイトという半端な数字になってしまいます。しかたがないので、10ms分のデータのうち9ms分は176バイト送り、残りの1ms分は180バイト送ってやることにします。

最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。