#include <chip_config.h>
/*
- * ターゲットシステム依存モジュール(EZKIT-BF592用)
+ * ターゲットシステム依存モジュール(BSP_AMAKUSA592用)
*
* このインクルードファイルは,t_config.h のみからインクルードされる.
* 他のファイルから直接インクルードしてはならない.
#define CLKIN 25000000
/*
+ * Uzumeコンフィギュレーションマクロ群
+ *
+ * Uzumeの各機能モジュールはハードウェアに応じた自由度を持っている。それらの設定をデフォルト以外で
+ * 使う場合には引数となるマクロをシステム依存部のsys_config.hで宣言する。
+ *
+ * UZUME_INT_BITS はaudio_callback()の引数として渡されるオーディオ・サンプルの整数値の何ビット取るか
+ * 指定する。デフォルトは0である。符号部を除く整数部を7ビット取りたければ、7を指定する。
+ *
+ * UZUME_BLOCKSIZE は一回のDMA転送で転送するデータのサンプル数である。ステレオデータなので、実際に転送する
+ * データ数は UZUME_BLOCKSIZEで指定した量の倍のデータである。48kHzサンプルの場合に48を指定すると、1m秒に
+ * 一回割り込みがかかる。
+ *
+ * UZUME_SSM2603_I2C_ADRS はSSM2603 コーデックの I2Cデバイスアドレスである。7bitアドレスを右詰めで表現する
+ * デフォルトは0x1A
+ *
+ * UZUME_AD7999_I2C_ADRS はAD7999 ADCの I2Cデバイスアドレスである。7bitアドレスを右詰めで表現する。
+ * デフォルトは 0x28
+ *
+ * その他、I2Cペリフェラルのポート番号を指定するマクロもあるが、2012年時点で0以外には対応していないので
+ * ここでは説明しない。
+ */
+
+//#define UZUME_BLOCKSIZE 64
+//#define UZUME_INT_BITS 0
+//#define UZUME_SSM2603_I2C_ADRS 0x1A
+//#define UZUME_AD7999_I2C_ADRS 0x28
+
+/*
* システムタイマーの選択
* USE_TIC_COREをdefineすると、COREタイマーが使用される
* コメントアウトすると、GP_TIMER_2を使用する
/*
* 起動メッセージのターゲットシステム名
*/
-#define TARGET_NAME "ACB-BF592"
+#define TARGET_NAME "BSP-AMAKUSA592"
/*
/*
- * ターゲットシステムに依存する定義(EZKIT-BF592用)
+ * ターゲットシステムに依存する定義(BSP-AMAKUSA592用)
*
* このインクルードファイルは,kernel.h と sil.h でインクルードされる.
* 他のファイルから直接インクルードすることはない.このファイルをイン
#include "ad7999.h"
/**
+ * @brief AD7999のチャンネル数
+ */
+#define NUM_CH 4
+
+/**
* @brief ADC変換値保存用配列
* @details
* 変換値を保存する。アクセスは排他的でなければならない。値は符号付き左詰めである。
* 整数部はないので、1ビットの符号の右に小数部が連なる。
*/
-static fract32 values[4];
+static fract32 values[NUM_CH];
-#define AD7999_I2C_ADRS 0x28
+/*
+ * ADCのI2Cポート。
+ * AD7999が接続されているI2Cペリフェラルのポート番号。デフォルトは0である。他のポートを使いたい時には
+ * sys_config.hで宣言すると良い。なお、I2Cコントローラ・ペリフェラルがひとつしかない場合には0を指定
+ * する。
+ */
+#ifndef UZUME_AD7999_I2C_PORT
+#define UZUME_AD7999_I2C_PORT 0x00
+#endif
+
+/*
+ * ADCのI2Cアドレス。
+ * AD7999の7bit I2Cアドレスはデフォルトで0x28と決め打ちしている。他のアドレスを使いたい時には
+ * sys_config.hで宣言すると良い
+ */
+#ifndef UZUME_AD7999_I2C_ADRS
+#define UZUME_AD7999_I2C_ADRS 0x28
+#endif
/**
* \brief ADU999 制御タスク
while(1)
{
- i2c_master_read(0, AD7999_I2C_ADRS, adcbuf, 2);
+ i2c_master_read(UZUME_AD7999_I2C_PORT, UZUME_AD7999_I2C_ADRS, adcbuf, 2);
/* 上位バイトのbit 5:4 をチャンネル番号として受け取る */
ch = ( adcbuf[0] & 0x30 ) >> 4;
{
fract32 retval;
+ // パラメータチェック
+ if (ch >= NUM_CH)
+ ch = NUM_CH - 1;
+
/* 排他区間開始 */
wai_sem(AD7999_SEM);
retval = values[ch];
*/
#include "i2c_subsystem.h"
#include "kernel_id.h"
-#include "s_services.h"
+#include <s_services.h>
#include <t_services.h>
#ifdef _COMMON_BF592
*twi->control = 0; // TWI をディセーブル
*twi->master_ctl = 0; // マスター機能をディセーブル
*twi->slave_ctl = 0; // スレーブ機能をディセーブル
+ *twi->master_addr = 0;
+ *twi->fifo_ctl = 0;
+ *twi->int_mask = 0;
+ *twi->int_stat = 0x1F; // すべての割り込みステータスをクリア
+ *twi->master_stat =0x1F; // すべてのステータスをクリア
*twi->control = TWI_ENA | (SYSCLOCK/10000000); // HWRによると、プリスケール値はSYSCLKを10MHzで割ったものでなければならない。
*twi->clkdiv = 30<<8 | 70; // TWI内部クロック10MHzに対して、100kHzのI2Cクロックは100分の1である
--- /dev/null
+/*
+ * i2s_subsystem.h
+ *
+ * Created on: 2012/12/23
+ * Author: takemasa
+ */
+
+#ifndef I2S_SUBSYSTEM_H_
+#define I2S_SUBSYSTEM_H_
+
+#include <t_services.h>
+#include <s_services.h>
+#include "uzume.h"
+
+
+/**
+ * @brief サンプルあたりのスロット数。I2Sなら2。
+ */
+#define SLOT_PER_SAMPLE 2
+
+
+
+/**
+ * @brief CODECとデータをやり取りするためのバッファ
+ *
+ * 割り込み1回の間にCODECが転送するデータを格納するバッファ。サイズは
+ * 割り込み1回あたりのサンプル数 @ref SAMPLE_PER_INTRと1サンプル内の
+ * スロット数 @ref SLOT_PER_SAMPLEの積である。
+ */
+struct CODEC_BUFFER{
+ AUDIOSAMPLE data[UZUME_BLOCKSIZE][SLOT_PER_SAMPLE];
+} ;
+
+/*
+ * 関数のプロトタイプ宣言
+ */
+#ifndef _MACRO_ONLY
+
+
+extern void task_audiocodec( VP_INT exinf );
+extern void inh_codec_sport(void);
+extern void init_audio( int count );
+extern void init_codec();
+extern void process_audio(
+ AUDIOSAMPLE input_left[],
+ AUDIOSAMPLE input_right[],
+ AUDIOSAMPLE output_left[],
+ AUDIOSAMPLE output_right[]
+ );
+
+#endif /* _MACRO_ONLY */
+
+
+#endif /* I2S_SUBSYSTEM_H_ */
--- /dev/null
+/**
+ * @file ssm2603.c
+ * @Author: takemasa
+ * @brief Analog Devices SSM2603初期化プログラム
+ * @details
+ * SSM2603の初期化を行う。I2Cを使って初期化を行う。
+ */
+
+
+
+
+/**
+ * @file uzume.c
+ * @brief CODECの初期化と制御
+ */
+#include "i2s_subsystem.h"
+#include "i2c_subsystem.h"
+/**
+ * \brief コーデック初期化データ列の長さ
+ * \details
+ * TLV320AIC23に与える初期化データの長さである。長さはレジスタアドレスとデータの組が
+ * 何組であるかを示す。
+ */
+#define CODECINITDATALEN 11 /* TLV320AIC23B初期化データ長 */
+
+/*
+ * CODECのI2Cポート。
+ * SSM2603が接続されているI2Cペリフェラルのポート番号。デフォルトは0である。他のポートを使いたい時には
+ * sys_config.hで宣言すると良い。なお、I2Cコントローラ・ペリフェラルがひとつしかない場合には0を指定
+ * する。
+ */
+#ifndef UZUME_SSM2603_I2C_PORT
+#define UZUME_SSM2603_I2C_PORT 0
+#endif
+
+/*
+ * TLV320AIC23 / SSM2603のI2Cデバイスアドレス(7bit右づめ)
+ */
+#ifndef UZUME_SSM2603_I2C_ADRS
+#define UZUME_SSM2603_I2C_ADRS 0x1A
+#endif
+
+/**
+ * \brief CODEC初期化データ列
+ * \details
+ * TLV320AIC23Bを初期化するためのデータ列である。
+ */
+static unsigned char tlv320aic23init[CODECINITDATALEN][2] =
+{
+ { 30 | 0x00, 0x00 }, /* RESET. */
+ { 0 | 0x01, 0x17 }, /* L_in vol : LR simul-update, unmute, 0dB */
+ { 2 | 0x01, 0x17 }, /* R_in vol : LR simul-update, unmute, 0dB */
+ { 4 | 0x01, 0xF9 }, /* L_HP vol : LR simul-update, zero-cross, 0dB */
+ { 6 | 0x01, 0xF9 }, /* R_HP vol : LR simul-update, zero-cross, 0dB */
+ { 8 | 0x00, 0x12 }, /* Analog Audio Path : No Sidetone, No bypass, DAC for Out, Line out for ADC, Mic Mute */
+ { 10 | 0x00, 0x00 }, /* Digital Path: DAC unmute, De-emphasis 48k, ADC HPF enable */
+ { 12 | 0x00, 0x02 }, /* Power Down : Only Mic is down*/
+ { 14 | 0x00, 0x4E }, /* Digital Audio Format : Master, 32bit, I2S */
+ { 16 | 0x00, 0x01 }, /* Sanmpling Rate, 48kHz, USB mode*/
+// { 16 | 0x00, 0x00 }, /* Sanmpling Rate, 48kHz, NORMAL mode*/
+ { 18 | 0x00, 0x01 } /* Activateion : Active. */
+
+};
+
+
+/**
+ * @brief コーデックの初期化
+ * @details
+ * TLV32AIC23Bに初期化数値列をI2C経由で送り込む。タスクコンテキストで呼び出さなければならない。
+ * 初期化後、TLV32AIC23Bはクロック信号を生成して動作を開始する。
+ */
+void init_codec()
+{
+ int i;
+
+
+ /* TLV320AIC23Bに初期化データを送信する */
+ for ( i=0; i< CODECINITDATALEN; i++){
+ i2c_master_write( UZUME_SSM2603_I2C_PORT, UZUME_SSM2603_I2C_ADRS, tlv320aic23init[i], 2 );
+ }
+}
+
+
#ifndef UZUME_H_
#define UZUME_H_
+#include <s_services.h>
+#include <t_services.h>
#include <fract_math.h>
/**
* @brief オーディオコーデック用データ型。
/**
* @brief 割り込み1回あたりのサンプル数。ユーザーが変えてもよい。
+ * @breif
+ * 変更したい場合は、sys_config.hで宣言すると良い。
*/
+#ifndef UZUME_INT_BITS
#define UZUME_INT_BITS 0
+#endif
+
/**
* @brief スケーリング・ファクター
* @details
* AUDIOSAMPLE型の整数部のビット数を指定する。0の場合フォーマットは1.32、
- * 3ならば4.28、7ならば8.24となる。
+ * 3ならば4.28、7ならば8.24となる。デフォルトで64だが、変更したければsys_config.hで宣言すると良い。
*/
+#ifndef UZUME_BLOCKSIZE
#define UZUME_BLOCKSIZE 64
+#endif
#ifndef _MACRO_ONLY