T-Engine SH7760 2006/12/27 | |||
T-Engine SH7760のサウンド・ドライバ | |||
---|---|---|---|
1 はじめに | |||
T-Engineは規格化されたTronボードのようです。 詳細はPersonal Media社の下記HomePageに書いてあります。 http://www.personal-media.co.jp/te/ このT-Engine/SH7760開発キットを対象にしています。 このキットには何故かサウンド・ドライバのサンプルが付属していなかった。そこで・・・・地獄の入り口。 |
|||
2 T-Engine/SH7760のサウンド構成 | |||
T/Engine/SH7760のサウンドはPhilips社のUDA1342が使用されている。このボードではサウンドチップとCPU間の通信はI2Cで行うように配線されている。また、サウンドデータは同期シリアル・インターフェースSSIで通信するように配線済みである。 | |||
SH7760側 | UDA1342側 | ||
I2C SSI CH0 24/32bit受信 SSI CH1 24/32bit送信 DMABRG0 DMABRG1 H8 Interface |
コマンド 音声受信 音声送信 受信DMA 送信DMA Volume |
I2C Mode 24bit Mode 24bit Mode |
|
Xtal 22.5792Mhz | |||
3 SH7760のドライバ構成 | |||
まず、UDA1342と通信する I2Cドライバが必要である。 これが無いと始まらない。 SH7760/I2Cチップを使用してUDA1342のレジスタを操作できることが最低限必要である。 次に、SSIドライバ(音声入出力ドライバ)を作成する。ここで、SSIとUDA1342に供給されている源クロック周波数に注目する。これは22.5792Mhzが固定的に供給されている。UDA1342側は最低サンプリング周波数は44.1khzなる。従って、サンプリング周波数は44.1khzに決定する。しかし、SSIのクロックを計算すると、やはり最低44.1khzとなり、他に選択肢は無さそうである。(条件、フレームサイズ32bit、データサイズ24bit)(もっと良い設定があるかも知れないが。) これで、通信できるわけであるが、44.1khzで送受信し、かつSSIはダブルバッファのみなので、22.67uSec毎に処理しなければならない。ポーリングでは到底無理で割込みで処理したが、間に合うようなプログラムは出来なかった。 そこで、DMAを導入することにした。SH7760はDMABRGの一つとして、SSI専用にDMABRG0/1を用意してある。このSSI0/1用ドライバを作成する。 従って、大きく分けて3ドライバを作成しなければならない。 |
|||
4 I2C ドライバ | |||
I2CドライバはSH7760ハードウエア・マニュアル通りである。その他の注意点は、チップに対するクロック供給及びプルアップの解除をしておかなければならない。これに気づくまで大変な時間を浪費してしまった。 タイミングを作るのが難しいので、モードはFIFOモードを使用する。しかし、「マスタ送信--リスタート--マスタ受信」のFIFO版がハードウエア・マニュアルに書いてなくて、今ひとつ理解できない。 |
|||
5 UDA1342設定 | |||
I2Cドライバを使用してUDA1342の設定を行う。設定すべき最低限の項目はSystemFunctionの下記項目だけである。後はDefault値で、さしあたっては動作する。 System Clock Frequency Setting Data Format |
|||
6 SSIドライバ | |||
SSIドライバはSH7760のハードウエア・マニュアル通りである。その他注意点としては、PullUpを解除し、チップのスリープモードを解除しておく。 内容はOverClockSample分周比とdata/wordを設定し、DMAモードで実行するだけである。後のハンドシェークはDMABRGに任せる。 そうそう、音声出力はH8電子ボリュームを経由してジャックに出ている。この電子ボリュームが最小になっている。これを最大にして、ボリュームはUDA1342TAのmasterVolumeで行う。これに気づくまで、また悩んでしまった。 |
|||
7 DMAドライバ | |||
DMABRGドライバはSH7760のハードウエア・マニュアル通りである。その他注意点としては、DMABRGのスリープモードを解除しておく事。 DMA割込みを設定し、DMAが転送長/2と転送終了時に割り込むように設定したが、マニュアルを良く読むとAutoReload機能があるようだ。割込みで動かすプログラムが完成した後に、AutoReloadを設定し割込み不可にすると、DMA転送終了時AddressとCounterを再設定しDMAreStartまでを自動的に実行する。 これは便利なので、ポーリングで残りカウンタを監視してダブルバッファを実現するタスクに変更した。 |
|||
8 デバイス・ドライバ | |||
デバイス・ドライバは付属のdevsampのgdrサンプルを基に付加する形で作成する。 既に作成したドライバ群をインクルードするだけであるが、いくつかの問題点がある。 デバイス・ドライバからユーザのタスク固有空間にはアクセスできない。ユーザ・バッファは共有空間に確保しなければならない。デバイス・ドライバはこのチェックを実行し、アクセスが許可されていなければエラーを返して終了する。 デバイス・ドライバのReadFuncとWriteFuncにサウンド・データの入出力と設定/状態データの入出力を入れる。 デバイス・ドライバには、いくつかの項目を追加する。 作成したドライバではSSIとUDA1342の間は24bit/Stereoデータ固定なのでユーザとのインターフェースのため、ドライバ内で次の処理を行う。 DMAのBlock単位 <--> サンプル単位の変換 24bit Stereo <--> Monoの変換(必要に応じて) 24bit <--> 16bitの変換 を実行する。 悪戦苦闘の末、やっと完成した・・・・・ 完成して、Micから入力しSpeeker に出力すると、低いレベルながら「ごとごと」というノイズが聞こえる。試みに、音楽ファイルを再生すると、ノイズも無く明瞭な音で再生する。 入力 MixerVolumeを -24db位にするとノイズも気にならないレベルになるので、Mic 入力辺りで拾っているようだ。 (相対的に大きな声になっているのでノイズが隠れる。) |
|||
9 T-Engineの感想 | |||
KernelモードとProcessモードがあるが、各々のモードでアプリケーションが作成できるので、ドライバの製作は容易である。 また、リアルタイム処理ではKernelモード・プログラミングで完成できるので、かなり早い処理も簡単に処理できる。
Processモードへの移行もシームレスであり、好ましい印象を持った。 マルチタスクも思っている通りであり、また、そのように実行する。これでミドルウエアが充実していれば鬼に金棒なのだが・・・・・。 |
|||
|
|||
お問い合わせ | |||
戻る | |||
Guest No. |
|||