EZ-KIT Lite 2191はオーディオ入出力用のペリフェラルとしてAC97コーデックAD1885を搭載しています。
AC97とはIntelが策定したPC用の低価格オーディオインターフェース規格です。低価格というと聞こえは悪いですが、その実体はなかなか高性能なスペックです。ざっと特徴を列挙すると:
などです。最近ではSPDIFへの対応など規格の拡張が行われています。いずれにせよ内蔵ミクサーを持っていることから、PCのオーディオ機能を1チップで実現することを目指しており、しかも決して安かろう悪かろうではありません(オーディオマニアは異を唱えるでしょうけど)。
DSP用の入出力として考えた場合、上記の特徴のほとんどはオーバースペックです。特に16ビットDSPからみると20ビット精度は不要です。しかしながらPCに使われてコストが安いというのはありがたい点です。AC97規格はピン配置まで規定しているためにメーカー間に互換性があり、激しい価格競争が行われています。
なんにせよAC97は困るくらい高性能な上にちょっとした罠まで用意してくれていますので、周到に調べておくに越したことはありません。幸いなことにAC97の規格はIntelからダウンロードできますし、AD1885のデータシートもAnalog Devicesからダウンロードできます。
AC97コーデックは大きく分けて7つのブロックからなります。ADC/DACとリンク・インターフェースはコーデックの基本部分であり、残りの回路がミクサーと入出力アナログ回路です(下図)。アナログのパスにはそれぞれミュートとボリューム(ゲイン)制御用の回路が付加されています。複数ある入力の選択はやや面倒です。アナログ系ではミクサーがそれぞれの入力の信号に重みをつけて加算し、結果を出力にまわします。一方、ADCの入力にまわすことのできる信号は1回線だけです。
これらの信号選択やゲイン/ボリューム/ミュートの制御はすべてAC97リンクから与えられるコマンドによって行います。コマンドはレジスタに対するデータの書き込みという形式で与えられます。
AC97リンクはコーデックとDSP(本来はPCチップセット)との間のデータ回線です。この回線にはステレオ入出力データのほかコーデックへの制御コマンド、コーデックからのステータス情報が時分割で乗せられています(下図)。ここでスロット0はあとに続くデータスロットのステータス、ADDRはコマンドとなるレジスタのアドレス、DATAはレジスタに書き込むデータです。そして、続くLchとRchがステレオ・データです。AC97リンクには入力(IN)と出力(OUT)の回線がありますので、シリアル回線も2回線となります。
さて、ここで気をつけないければならない点は、各スロットのビット構成です。実はAC97は一般のマルチチャンネル回線と異なり、スロット長が不等なのです。具体的にはSLOT0のみ16ビットで、SLOT1からSLOT12までが20ビットです。データ用のスロットが20ビットなのはAC97の最大精度が20ビットですからうなずけます。ではなぜSLOT0は16bitなのでしょう。私は本当の理由は知りませんが、単に1フレームを256ビットにしたかっただけじゃないかとにらんでます。なんか怪しいです。
いずれにせよ、AC97がつながるのはPCチップセットに限定されますので困らないと考えたのでしょう。それは事実なのですが、一般品として流用する側にしてみれば迷惑な話です。シリアルポートがハードウェアでこのスロット構成に対応していない限り、プログラムは恐ろしく煩雑になります。
そこで、Analog Devicesはベンダー固有機能としてSLOT16モードという特殊モードを用意しています。このモードではデータスロットの長さが16ビットになるかわりに、DSPからも扱いやすくなっています(下図)。
SLOT16モードに入るにはAC97のコマンドで特定のレジスタに命令を書き込みます。
⇒次はDMA転送