OSDN Git Service

sys_config.hからいくつかのパラメータを設定可能にした。bsp_amakusabf592/sys_config.h 参照。
authortakemasa <suikan@users.sourceforge.jp>
Mon, 24 Dec 2012 15:18:11 +0000 (00:18 +0900)
committertakemasa <suikan@users.sourceforge.jp>
Mon, 24 Dec 2012 15:18:11 +0000 (00:18 +0900)
uzume_prototype/kernel/config/blackfin/bsp_amakusa592/sys_config.h
uzume_prototype/kernel/config/blackfin/bsp_amakusa592/sys_defs.h
uzume_prototype/kernel/uzume/ad7999.c
uzume_prototype/kernel/uzume/i2c_subsystem.c
uzume_prototype/kernel/uzume/i2s_subsystem.h [new file with mode: 0644]
uzume_prototype/kernel/uzume/ssm2603.c [new file with mode: 0644]
uzume_prototype/kernel/uzume/uzume.h

index 152ebe1..e2cd68c 100644 (file)
@@ -54,7 +54,7 @@
 #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"
 
 
 /*
index 95a25a2..d4aa85d 100644 (file)
@@ -43,7 +43,7 @@
 
 
 /*
- *  ターゲットシステムに依存する定義(EZKIT-BF592用)
+ *  ターゲットシステムに依存する定義(BSP-AMAKUSA592用)
  *
  *  このインクルードファイルは,kernel.h と sil.h でインクルードされる.
  *  他のファイルから直接インクルードすることはない.このファイルをイン
index a371c66..39fc6dc 100644 (file)
 #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 制御タスク
@@ -34,7 +56,7 @@ void ad7999_task(VP_INT exinf)
 
     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;
@@ -54,6 +76,10 @@ fract32 get_volume(unsigned int ch)
 {
     fract32 retval;
 
+        // パラメータチェック
+    if (ch >= NUM_CH)
+        ch = NUM_CH - 1;
+
     /* 排他区間開始 */
     wai_sem(AD7999_SEM);
     retval = values[ch];
index 176cb25..dc60c11 100644 (file)
@@ -6,7 +6,7 @@
  */
 #include "i2c_subsystem.h"
 #include "kernel_id.h"
-#include "s_services.h"
+#include <s_services.h>
 #include <t_services.h>
 
 #ifdef _COMMON_BF592
@@ -332,6 +332,11 @@ void i2c_master_initialize(VP_INT exinf)
     *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である
diff --git a/uzume_prototype/kernel/uzume/i2s_subsystem.h b/uzume_prototype/kernel/uzume/i2s_subsystem.h
new file mode 100644 (file)
index 0000000..6f9ecef
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * 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_ */
diff --git a/uzume_prototype/kernel/uzume/ssm2603.c b/uzume_prototype/kernel/uzume/ssm2603.c
new file mode 100644 (file)
index 0000000..9020c71
--- /dev/null
@@ -0,0 +1,83 @@
+/**
+ * @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 );
+        }
+}
+
+
index b2c2822..c2ee865 100644 (file)
@@ -5,6 +5,8 @@
 #ifndef UZUME_H_
 #define UZUME_H_
 
+#include <s_services.h>
+#include <t_services.h>
 #include <fract_math.h>
 /**
  * @brief オーディオコーデック用データ型。
@@ -15,15 +17,22 @@ typedef fract32 AUDIOSAMPLE;
 
 /**
  * @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