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.