マイク入力は、タッチスクリーンコントローラを通して行われます。

ARM7側からのみアクセス可能です。

初期化 (mainの中に書き込む)

writePowerManagement(2, 1);

電源管理レジスタ 2 に、1 を書き込む

電源管理レジスタ

レジスタ 2 (マイクロフォンアンプコントロール) R/W

ビット内容設定
0Amplifier0=無効, 1=有効
1 〜 7未使用

レジスタ 3 (マイクロフォンアンプゲインコントロール) R/W

ビット内容設定
0Gain0=Gain 20, 1 = 40, 2 = 80, 3 = 160
1 〜 7未使用

データ取得

uint16 aux;

// タッチスクリーンセンサを通してマイク入力を取得
aux = touchRead(TSC_MEASURE_AUX);

// 共有メモリに取得した値をセット。ARM9から読み込み可能
IPC->aux = aux;

値の範囲

取得した値は、0 〜 4095 の範囲で変化するようです。 無音に近い状態の時は 2048 、波形に変化があった時は最大 0 まで下がるか、 4095 まで上がるかします。

実際に使ってみる

ARM7 側で共有メモリにマイク入力の値を入れ、それを ARM9 側で操作するというような形にするのがやりやすいと思います。 マイク入力は、取得リクエストを出した瞬間の音量を 12 ビットの値として得られるので、操作しやすい 8 ビットの形式にするには、右に 4 ビットシフトする必要があります。

ARM7、ARM9ともに、タイマ割り込みを使って処理するのが理解しやすいと思います。

// タイマー1の割り込みハンドラ
void timer1Handler()
{
   uint16 aux = 0;
   aux  = touchRead(TSC_MEASURE_AUX);
   IPC->aux = aux;
}

int main(int argc, char ** argv) {
   // マイク入力 ON
   writePowerManagement(2, 1);

   // タイマ割り込みハンドラ有効
   irqInit();
   irqSet(IRQ_TIMER1, timer1Handler);
   irqEnable(IRQ_TIMER1);

   // 2097 * 1 cycles
   //  = (59.595ns(GBAの速度) / 2(の2倍)) * 2097(タイマ間隔)
   //  = 1回の割り込み間隔 62.48マイクロ秒 → 約 16 kHz
   TIMER1_DATA = -2097;
   TIMER1_CR = 0x00C0;  // 割り込み有効、タイマ間隔のセット

   // 割り込みだけ有効にして後は待つ
   while (1) swiWaitForVBlank();
}
volatile static u8 aux_buf[2048]; // なんとなく余分に取得。実際はきっちりで良いと思います。
volatile static int aux_buf_count = 0;

void timer0Handler()
{
   // 共有メモリからデータ取得。12ビットのデータを8ビットにシフト。
   // シフトの処理はARM7 側で済ませておいたほうが良いかもしれません。
   aux_buf[aux_buf_count] = IPC->aux >> 4;
   aux_buf_count++;

   if ( aux_buf_count > 1023 ) {
       aux_buf_count = 0;

	// バッファを使って音を鳴らすとか、データを送るとか。
       // 鳴らすだけなら、バッファ自体使う必要ありません。

   }
}

int main(void) {

   // … 画面とか色々初期化

   irqSet(IRQ_TIMER0, timer0Handler);
   irqEnable(IRQ_TIMER0);
   TIMER0_DATA = -2097; // 16 kHz
   TIMER0_CR = 0x00C0;  // タイマ有効

   while (1) {

       // ここで入力レベルメータ描いたり

       swiWaitForVBlank();
   }
}

この例では、ARM7 にタイマー1、ARM9 にタイマー0 というような書き方をしてますが、実際には ARM7側、ARM9側共に タイマー0 が1個ずつ存在するので、両方ともタイマー0を使うように書いても問題ないと思います。 タイマーは各CPUに4つずつ、合計8個ついてるそうです。

参考リンク


トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS