UTASK_DIR = $(SRCDIR)/library
UTASK_ASMOBJS =
ifdef USE_CXX
- UTASK_CXXOBJS = $(UNAME).o codec_ad1836a.o codec_callback.o
+ UTASK_CXXOBJS = $(UNAME).o uzume.o uzume_callback.o
UTASK_COBJS =
else
- UTASK_COBJS = $(UNAME).o codec_ad1836a.o codec_callback.o
+ UTASK_COBJS = $(UNAME).o uzume.o uzume_callback.o
endif
UTASK_CFLAGS =
UTASK_LIBS =
kernel_cfg.c kernel_id.h kernel_chk.c: kernel/systask/logtask.cfg \
- kernel/include/kernel.h kernel/config/blackfin/cpu_defs.h \
+ kernel/include/kernel.h uzume.cfg \
+ kernel/config/blackfin/cpu_defs.h \
kernel/config/blackfin/_common_bf592/chip_defs.h \
kernel/config/blackfin/_common_bf592/sys_rename.h \
kernel/include/t_config.h \
kernel/include/itron.h \
/opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h \
kernel/include/t_stddef.h
-codec_ad1836a.o: \
+uzume.o: \
/opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/defBF59x_base.h \
kernel/include/kernel.h kernel/config/blackfin/cpu_defs.h \
/opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/stdint.h \
kernel/config/blackfin/_common_bf592/chip_defs.h \
/opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/cdef_LPBlackfin.h \
- codec_ad1836a.h \
kernel/config/blackfin/_common_bf592/sys_rename.h \
kernel/include/t_config.h \
/opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/defBF592-A.h \
kernel/config/blackfin/tool_config.h kernel/include/serial.h \
+ uzume.c \
/opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/cdefBF59x_base.h \
/opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/cdefBF592-A.h \
kernel/config/blackfin/cpu_rename.h \
kernel/config/blackfin/amakusa_bf592/sys_config.h \
kernel/include/t_stddef.h \
+ kernel/config/blackfin/amakusa_bf592/i2c_subsystem.h \
/opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/def_LPBlackfin.h \
- kernel/include/t_services.h kernel/include/sil.h \
- codec_ad1836a.c \
+ kernel/include/t_services.h kernel/include/sil.h uzume.h \
/opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \
kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \
kernel/config/blackfin/amakusa_bf592/sys_defs.h \
kernel/config/blackfin/_common_bf592/chip_config.h \
/opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h \
kernel/include/itron.h
-codec_callback.o: kernel/include/kernel.h \
+uzume_callback.o: kernel/include/kernel.h \
kernel/include/t_services.h \
- kernel/config/blackfin/cpu_defs.h \
+ kernel/config/blackfin/cpu_defs.h uzume.h \
kernel/config/blackfin/_common_bf592/chip_defs.h \
/opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \
kernel/include/t_syslog.h kernel/config/blackfin/tool_defs.h \
- codec_callback.c codec_ad1836a.h \
kernel/config/blackfin/amakusa_bf592/sys_defs.h \
- kernel/include/serial.h kernel_id.h kernel/include/itron.h \
+ kernel/include/serial.h uzume_callback.c kernel_id.h \
+ kernel/include/itron.h \
/opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h \
kernel/include/t_stddef.h
timer.o: \
/opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/stdint.h \
kernel/config/blackfin/_common_bf592/chip_defs.h \
/opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/cdef_LPBlackfin.h \
- codec_ad1836a.h kernel/include/t_config.h \
+ kernel/include/t_config.h \
kernel/config/blackfin/_common_bf592/sys_rename.h \
/opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/defBF592-A.h \
kernel/include/../kernel/eventflag.h \
kernel/config/blackfin/amakusa_bf592/i2c_subsystem.h \
/opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/def_LPBlackfin.h \
kernel/include/sil.h kernel/include/t_services.h \
- kernel/config/blackfin/cpu_unrename.h \
+ kernel/config/blackfin/cpu_unrename.h uzume.h \
/opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \
kernel/include/t_syslog.h \
kernel/config/blackfin/_common_bf592/hw_timer.h \
+++ /dev/null
-/**
- * @file codec_ad1836a.h
- * @brief CODEC関連定義
- */
-#ifndef AD1836A_COMPACT_H_
-#define AD1836A_COMPACT_H_
-/**
- * @brief 割り込み1回あたりのサンプル数。ユーザーが変えてもよい。
- */
-#define SAMPLE_PER_INTR 64
-/**
- * @brief サンプルあたりのスロット数。I2Sなら2。
- */
-#define SLOT_PER_SAMPLE 2
-
-
-// AD1836Aのスロット番号
-#define ADC_L0 0
-#define ADC_R0 1
-#define DAC_L0 0
-#define DAC_R0 1
-
-
-/**
- * @brief AD1836Aとデータをやり取りするためのバッファ
- *
- * 割り込み1回の間にAD1836Aが転送するデータを格納するバッファ。サイズは
- * 割り込み1回あたりのサンプル数 @ref SAMPLE_PER_INTRと1サンプル内の
- * スロット数 @ref SLOT_PER_SAMPLEの積である。
- */
-struct CODEC_BUFFER{
- int data[SAMPLE_PER_INTR][SLOT_PER_SAMPLE];
-} ;
-
-
-extern void task_ad1836a( VP_INT exinf );
-extern void inh_codec_sport(void);
-extern void codec_callback_init( int count );
-extern void codec_callback(
- int in0_left[],
- int in0_right[],
- int out0_left[],
- int out0_right[],
- int count);
-
-#endif /*AD1836A_COMPACT_H_*/
-kernel/configure -C blackfin -S amakusa_bf592 -A uzume_prototype -U "codec_ad1836a.o codec_callback.o"
+kernel/configure -C blackfin -S amakusa_bf592 -A uzume_prototype -U "uzume.o uzume_callback.o"
#endif
/* User specified include files*/
-#include "codec_ad1836a.h"
#include "uzume_prototype.h"
#include "hw_timer.h"
#include "timer.h"
#include "serial.h"
#include "logtask.h"
#include "i2c_subsystem.h"
+#include "uzume.h"
/* Object initializer [task] */
const ID _kernel_tmax_tskid = (TMIN_TSKID + TNUM_TSKID - 1);
-static __STK_UNIT __stack_CODEC_TASK[__TCOUNT_STK_UNIT(512)];
static __STK_UNIT __stack_MAIN_TASK[__TCOUNT_STK_UNIT(1024)];
static __STK_UNIT __stack_LOGTASK[__TCOUNT_STK_UNIT(LOGTASK_STACK_SIZE)];
+static __STK_UNIT __stack_CODEC_TASK[__TCOUNT_STK_UNIT(512)];
const TINIB _kernel_tinib_table[TNUM_TSKID] = {
- {0x00u | 0x02u, (VP_INT)(0), (FP)(task_ad1836a), INT_PRIORITY(3), __TROUND_STK_UNIT(512), __stack_CODEC_TASK, TA_NULL, (FP)(NULL)},
{0x00u | 0x02u, (VP_INT)(0), (FP)(main_task), INT_PRIORITY(5), __TROUND_STK_UNIT(1024), __stack_MAIN_TASK, TA_NULL, (FP)(NULL)},
- {0x00u | 0x02u, (VP_INT)(( VP_INT ) 1), (FP)(logtask), INT_PRIORITY(LOGTASK_PRIORITY), __TROUND_STK_UNIT(LOGTASK_STACK_SIZE), __stack_LOGTASK, TA_NULL, (FP)(NULL)}
+ {0x00u | 0x02u, (VP_INT)(( VP_INT ) 1), (FP)(logtask), INT_PRIORITY(LOGTASK_PRIORITY), __TROUND_STK_UNIT(LOGTASK_STACK_SIZE), __stack_LOGTASK, TA_NULL, (FP)(NULL)},
+ {0x00u | 0x02u, (VP_INT)(0), (FP)(task_audiocodec), INT_PRIORITY(3), __TROUND_STK_UNIT(512), __stack_CODEC_TASK, TA_NULL, (FP)(NULL)}
};
const ID _kernel_torder_table[TNUM_TSKID] = {1,2,3};
const SEMINIB _kernel_seminib_table[TNUM_SEMID] = {
{1, 0, 1},
- {1, 0, 1},
{1, 1, 1},
{1, 1, 1},
+ {1, 0, 1},
{1, 0, 1}
};
{16,0,(FP)CFG_INT_ENTRY(sio0_tx_handler)},
{21,0,(FP)CFG_INT_ENTRY(timer_handler)},
{24,0,(FP)CFG_INT_ENTRY(i2c0_master_handler)},
- {INHNO_SPORT0_RX,0,(FP)CFG_INT_ENTRY(inh_codec_sport)}
+ {9,0,(FP)CFG_INT_ENTRY(inh_codec_sport)}
};
/* task */
- OBJECT(task_1,CODEC_TASK);
- OBJECT(task_3,LOGTASK);
- OBJECT(task_2,MAIN_TASK);
+ OBJECT(task_3,CODEC_TASK);
+ OBJECT(task_2,LOGTASK);
+ OBJECT(task_1,MAIN_TASK);
EVAR(ID,_kernel_tmax_tskid);
EVAR(TINIB,_kernel_tinib_table);
MEMBER(task_initialization_block,tskatr);
/* semaphore */
- OBJECT(semaphore_4,SEM_I2C0_BLOCK);
- OBJECT(semaphore_5,SEM_I2C0_SIGNAL);
- OBJECT(semaphore_2,SERIAL_RCV_SEM1);
- OBJECT(semaphore_3,SERIAL_SND_SEM1);
- OBJECT(semaphore_1,SPORT0_SEM);
+ OBJECT(semaphore_3,SEM_I2C0_BLOCK);
+ OBJECT(semaphore_4,SEM_I2C0_SIGNAL);
+ OBJECT(semaphore_1,SERIAL_RCV_SEM1);
+ OBJECT(semaphore_2,SERIAL_SND_SEM1);
+ OBJECT(semaphore_5,SPORT0_SEM);
EVAR(ID,_kernel_tmax_semid);
EVAR(SEMINIB,_kernel_seminib_table);
MEMBER(semaphore_initialization_block,sematr);
OBJECT(interrupt_1,16);
OBJECT(interrupt_2,21);
OBJECT(interrupt_3,24);
- OBJECT(interrupt_4,INHNO_SPORT0_RX);
+ OBJECT(interrupt_4,9);
EVAR(ID,_kernel_tnum_inhno);
EVAR(INHINIB,_kernel_inhinib_table);
MEMBER(interrupt_handler_initialization_block,inhno);
/* object identifier deifnition */
-#define CODEC_TASK 1
-#define LOGTASK 3
-#define MAIN_TASK 2
-#define SEM_I2C0_BLOCK 4
-#define SEM_I2C0_SIGNAL 5
-#define SERIAL_RCV_SEM1 2
-#define SERIAL_SND_SEM1 3
-#define SPORT0_SEM 1
+#define CODEC_TASK 3
+#define LOGTASK 2
+#define MAIN_TASK 1
+#define SEM_I2C0_BLOCK 3
+#define SEM_I2C0_SIGNAL 4
+#define SERIAL_RCV_SEM1 1
+#define SERIAL_SND_SEM1 2
+#define SPORT0_SEM 5
#endif /* KERNEL_ID_H */
/**
- * @file codec_ad1836a.c
- * @brief AD1836Aの初期化と制御
+ * @file uzume.c
+ * @brief CODECの初期化と制御
*/
#include "t_services.h"
#include "s_services.h"
#include "cdefBF592-A.h"
-#include "codec_ad1836a.h"
+#include "uzume.h"
#include "kernel_id.h"
#include <i2c_subsystem.h>
/**
* TLV320AIC23に与える初期化データの長さである。長さはレジスタアドレスとデータの組が
* 何組であるかを示す。
*/
-#define CODECINITDATALEN 10 /* TLV320AIC23B初期化データ長 */
+#define CODECINITDATALEN 11 /* TLV320AIC23B初期化データ長 */
#define I2C_PORT 0
#define CODEC_ADDRESS 0x1A
*/
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 */
* @brief DMAデスクリプタ型
*
* ADSP-BF533のDMA用デスクリプタ型。 avairablebufメンバーはDMAが使わないフィールドで、
- * これは@ref task_ad1836a()が利用できるバッファを特定するためのIDとして使う。
+ * これは@ref task_CODEC()が利用できるバッファを特定するためのIDとして使う。
*/
struct DMA_DESCRIPTOR{
struct DMA_DESCRIPTOR * next; ///< 次のデスクリプタへのポインタ
/**
* @brief バッファ特定用フィールド
*
- * 初期化時に定数を設定しておく。@ref task_ad1836a()はDMAが使用中のデスクリプタの
+ * 初期化時に定数を設定しておく。@ref task_CODEC()はDMAが使用中のデスクリプタの
* このフィールドを読み、有効なバッファにアクセスするためのインデックスとして使う。
*/
short avairableBuf;
/**
* @brief 送信CODECバッファ
*
- * DMAがSPORT経由でAD1836Aにデータを送り出すためのバッファ。配列要素が3つあるのはトリプルバッファであるため。
+ * DMAがSPORT経由でCODECにデータを送り出すためのバッファ。配列要素が3つあるのはトリプルバッファであるため。
*/
static struct CODEC_BUFFER TxBuffer[3];
/**
* @brief 受信CODECバッファ
*
*
- * DMAがSPORT経由でAD1836Aにデータを受信するためのバッファ。配列要素が3つあるのはトリプルバッファであるため。
+ * DMAがSPORT経由でCODECにデータを受信するためのバッファ。配列要素が3つあるのはトリプルバッファであるため。
*/
static struct CODEC_BUFFER RxBuffer[3];
*
* トリプルバッファなのでデスクリプタを3個使用する。
*/
-static struct DMA_DESCRIPTOR tDesc[3];
+static struct DMA_DESCRIPTOR txDesc[3];
/**
* @brief 受信DMAデスクリプタ変数
*
*
* トリプルバッファなのでデスクリプタを3個使用する。
*/
-static struct DMA_DESCRIPTOR rDesc[3];
+static struct DMA_DESCRIPTOR rxDesc[3];
/**
* @brief 左入力データ引渡し変数
* 左右チャンネルそれぞれに配列を与える。配列内部にはサンプル順にデータが並ぶ。
* ステレオは2系統あるので左チャンネルも2系統分のデータがある。
*/
-static int leftIn[SAMPLE_PER_INTR];
+static int leftIn[AUDIOBUFSIZE];
/**
* @brief 右入力データ引渡し変数
*
* 左右チャンネルそれぞれに配列を与える。配列内部にはサンプル順にデータが並ぶ。
* ステレオは2系統あるので右チャンネルも2系統分のデータがある。
*/
-static int rightIn[SAMPLE_PER_INTR];
+static int rightIn[AUDIOBUFSIZE];
/**
* @brief 左出力データ引渡し変数
*
* @ref codec_callback()関数から出力オーディオデータをうけとるための引数。
* 左右チャンネルそれぞれに配列を与える。配列内部にはサンプル順にデータが並ぶ。
*/
-static int leftOut[SAMPLE_PER_INTR];
+static int leftOut[AUDIOBUFSIZE];
/**
* @brief 右出力データ引渡し変数
*
* @ref codec_callback()関数から出力オーディオデータをうけとるための引数。
* 左右チャンネルそれぞれに配列を与える。配列内部にはサンプル順にデータが並ぶ。
*/
-static int rightOut[SAMPLE_PER_INTR];
+static int rightOut[AUDIOBUFSIZE];
/**
* @brief コーデックの初期化
* TLV32AIC23Bに初期化数値列をI2C経由で送り込む。タスクコンテキストで呼び出さなければならない。
* 初期化後、TLV32AIC23Bはクロック信号を生成して動作を開始する。
*/
-void init_tlv320aic23b()
+void init_codec()
{
int i;
/**
- * @brief AD1836A用SPORTを設定する
+ * @brief CODEC用SPORTを設定する
*
*
- * SPORT0をAD1836A用に設定する。EZ-KIT BF533の結線はTDM仕様になっているので
+ * SPORT0をCODEC用に設定する。EZ-KIT BF533の結線はTDM仕様になっているので
* この設定もI2SではなくTDMである。RCRx, TCRxの設定はBF533のマニュアルを参照されたい。
*/
static void setup_sport0(void)
{
- // PORTG設定
+ // ADSP-BF592 PORTG設定
// DR0PRI, RSCK0, RFS0, TD0PRI, TSCK0, TSF0をMUXで0 ( Primary func )にする
*pPORTG_MUX &= ~0x00ee;
- // PORTG設定
+ // ADSP-BF592 PORTG設定
// DR0PRI, RSCK0, RFS0, TD0PRI, TSCK0, TSF0をFERでイネーブルにする
*pPORTG_FER = 0x00ee;
}
/**
- * @brief AD1836A用にSPORT0 DMAを設定する
+ * @brief CODEC用にSPORT0 DMAを設定する
*
*
- * AD1836A用のオーディオDMAを設定する。DMAはデスクリプタのリンクからなる。トリプルバッファを
+ * CODEC用のオーディオDMAを設定する。DMAはデスクリプタのリンクからなる。トリプルバッファを
* 使うため、デスクリプタは送受それぞれに3つ用意する。
*
* デスクリプタ変数のavairableBufフィールドはDMAハードウェア用ではなく、管理ソフトウェア
*/
static void setup_sport0_dma(void)
{
- rDesc[0].next = &rDesc[1];
- rDesc[0].start = RxBuffer[0].data;
- rDesc[0].config = 0x7700 | WNR | WDSIZE_32 | DI_EN | DMAEN; // Large List, 7 short word.
- rDesc[0].x_count = SLOT_PER_SAMPLE * SAMPLE_PER_INTR;
- rDesc[0].x_modify = 4;
- rDesc[0].avairableBuf = 1; // DMA_NEXT_PTRがデスクリプタ[0]なら、バッファ1を使える。
+ rxDesc[0].next = &rxDesc[1];
+ rxDesc[0].start = RxBuffer[0].data;
+ rxDesc[0].config = 0x7700 | WNR | WDSIZE_32 | DI_EN | DMAEN; // Large List, 7 short word.
+ rxDesc[0].x_count = SLOT_PER_SAMPLE * AUDIOBUFSIZE;
+ rxDesc[0].x_modify = 4;
+ rxDesc[0].avairableBuf = 1; // DMA_NEXT_PTRがデスクリプタ[0]なら、バッファ1を使える。
- rDesc[1].next = &rDesc[2];
- rDesc[1].start = RxBuffer[1].data;
- rDesc[1].config = 0x7700 | WNR | WDSIZE_32 | DI_EN | DMAEN; // Large List, 7 short word.
- rDesc[1].x_count = SLOT_PER_SAMPLE * SAMPLE_PER_INTR;
- rDesc[1].x_modify = 4;
- rDesc[1].avairableBuf = 2; // DMA_NEXT_PTRがデスクリプタ[1]なら、バッファ2を使える。
+ rxDesc[1].next = &rxDesc[2];
+ rxDesc[1].start = RxBuffer[1].data;
+ rxDesc[1].config = 0x7700 | WNR | WDSIZE_32 | DI_EN | DMAEN; // Large List, 7 short word.
+ rxDesc[1].x_count = SLOT_PER_SAMPLE * AUDIOBUFSIZE;
+ rxDesc[1].x_modify = 4;
+ rxDesc[1].avairableBuf = 2; // DMA_NEXT_PTRがデスクリプタ[1]なら、バッファ2を使える。
- rDesc[2].next = &rDesc[0];
- rDesc[2].start = RxBuffer[2].data;
- rDesc[2].config = 0x7700 | WNR | WDSIZE_32 | DI_EN | DMAEN; // Large List, 7 short word.
- rDesc[2].x_count = SLOT_PER_SAMPLE * SAMPLE_PER_INTR;
- rDesc[2].x_modify = 4;
- rDesc[2].avairableBuf = 0; // DMA_NEXT_PTRがデスクリプタ[2]なら、バッファ0を使える。
+ rxDesc[2].next = &rxDesc[0];
+ rxDesc[2].start = RxBuffer[2].data;
+ rxDesc[2].config = 0x7700 | WNR | WDSIZE_32 | DI_EN | DMAEN; // Large List, 7 short word.
+ rxDesc[2].x_count = SLOT_PER_SAMPLE * AUDIOBUFSIZE;
+ rxDesc[2].x_modify = 4;
+ rxDesc[2].avairableBuf = 0; // DMA_NEXT_PTRがデスクリプタ[2]なら、バッファ0を使える。
// DMA2設定 (SPORT0 TX)
- tDesc[0].next = &tDesc[1];
- tDesc[0].start = TxBuffer[0].data;
- tDesc[0].config = 0x7700 | WDSIZE_32 | DMAEN; // Large List, 7 short word.
- tDesc[0].x_count = SLOT_PER_SAMPLE * SAMPLE_PER_INTR;
- tDesc[0].x_modify = 4;
- tDesc[0].avairableBuf = 1; // DMA_NEXT_PTRがデスクリプタ[0]なら、バッファ1を使える。
+ txDesc[0].next = &txDesc[1];
+ txDesc[0].start = TxBuffer[0].data;
+ txDesc[0].config = 0x7700 | WDSIZE_32 | DMAEN; // Large List, 7 short word.
+ txDesc[0].x_count = SLOT_PER_SAMPLE * AUDIOBUFSIZE;
+ txDesc[0].x_modify = 4;
+ txDesc[0].avairableBuf = 1; // DMA_NEXT_PTRがデスクリプタ[0]なら、バッファ1を使える。
- tDesc[1].next = &tDesc[2];
- tDesc[1].start = TxBuffer[1].data;
- tDesc[1].config = 0x7700 | WDSIZE_32 | DMAEN; // Large List, 7 short word.
- tDesc[1].x_count = SLOT_PER_SAMPLE * SAMPLE_PER_INTR;
- tDesc[1].x_modify = 4;
- tDesc[1].avairableBuf = 2; // DMA_NEXT_PTRがデスクリプタ[1]なら、バッファ2を使える。
-
- tDesc[2].next = &tDesc[0];
- tDesc[2].start = TxBuffer[2].data;
- tDesc[2].config = 0x7700 | WDSIZE_32 | DMAEN; // Large List, 7 short word.
- tDesc[2].x_count = SLOT_PER_SAMPLE * SAMPLE_PER_INTR;
- tDesc[2].x_modify = 4;
- tDesc[2].avairableBuf = 0; // DMA_NEXT_PTRがデスクリプタ[2]なら、バッファ1を使える。
-
-
- *pDMA2_NEXT_DESC_PTR = &tDesc[0]; // 送信設定
- *pDMA1_NEXT_DESC_PTR = &rDesc[0]; // 受信DMA設定
+ txDesc[1].next = &txDesc[2];
+ txDesc[1].start = TxBuffer[1].data;
+ txDesc[1].config = 0x7700 | WDSIZE_32 | DMAEN; // Large List, 7 short word.
+ txDesc[1].x_count = SLOT_PER_SAMPLE * AUDIOBUFSIZE;
+ txDesc[1].x_modify = 4;
+ txDesc[1].avairableBuf = 2; // DMA_NEXT_PTRがデスクリプタ[1]なら、バッファ2を使える。
+
+ txDesc[2].next = &txDesc[0];
+ txDesc[2].start = TxBuffer[2].data;
+ txDesc[2].config = 0x7700 | WDSIZE_32 | DMAEN; // Large List, 7 short word.
+ txDesc[2].x_count = SLOT_PER_SAMPLE * AUDIOBUFSIZE;
+ txDesc[2].x_modify = 4;
+ txDesc[2].avairableBuf = 0; // DMA_NEXT_PTRがデスクリプタ[2]なら、バッファ1を使える。
+
+
+ *pDMA2_NEXT_DESC_PTR = &txDesc[0]; // 送信設定
+ *pDMA1_NEXT_DESC_PTR = &rxDesc[0]; // 受信DMA設定
*pDMA2_CONFIG = 0x7700 | WDSIZE_32; // 32bit転送、デスクリプタ・リンク、デスクリプタ・サイズ=7word
*pDMA1_CONFIG = 0x7700 | WNR | WDSIZE_32;
}
* @brief SPORTをイネーブルにしてオーディオ処理をはじめる
*
*
- * DMA送受信を開始してオーディオ送受信を開始する。
+ * DMA送受信を開始してオーディオ送受信を開始する。この関数はCPUアンロック状態で呼ばなければならない。
*/
static void start_audio(void)
{
*pDMA2_CONFIG |= DMAEN;
*pDMA1_CONFIG |= DMAEN;
asm("ssync;");
- // SPORT0 開始
+
+ // SPORT0 開始 なるべくアトミックに近い状態になるよう、CPUロック状態で開始する。
+ loc_cpu();
*pSPORT0_TCR1 |= TSPEN;
*pSPORT0_RCR1 |= RSPEN;
+ unl_cpu();
}
/**
* 最初にSPIとSPORT0の割り込み禁止を解除する。SPORT0はオーディオ受信DMA割り込み
* であるため問題はないが、SPIに関しては他のペリフェラルと共用するならば何らかの検討が必要である。
*
- * 次にAD1836Aのリセットパルスを生成する。これはEZ-KIT Lite Bf533の設計上必須である。
*
* SPORT DMAは送受信いずれもDMAチェーンを用いている。そのための設計をする際、
* デスクリプタ変数に有効なバッファのインデックスを書き込んでおくことで後の処理を簡略化
* できるようにしている。
*
* 割り込み待ちのループ内部ではsport0_semを使ってSPORT RX割り込みハンドらである
- * @ref inh_codec_sport()からの割り込み通知を待つ。通知を受けたらAD1836Aの構造に依存した
+ * @ref inh_codec_sport()からの割り込み通知を待つ。通知を受けたらCODECの構造に依存した
* バッファを解いてフラットな入力配列をL/R両方に用意する。これは @ref codec_callback()に
* 渡すためのものである。
*
- * @ref codec_callback()から戻ったら、今度は先ほどと逆にフラットな出力配列からAD1836Aの
+ * @ref codec_callback()から戻ったら、今度は先ほどと逆にフラットな出力配列からCODECの
* 構造に応じたバッファを組み立てる。
*
*/
-void task_ad1836a(VP_INT extinf)
+void task_audiocodec(VP_INT extinf)
{
ena_int( INTNO_SPORT0_RX ); // SPORT0 DMA割り込みマスクをはずす
- init_tlv320aic23b();
+ init_codec();
- codec_callback_init( SAMPLE_PER_INTR ); // コールバックの初期化
-
+ init_audio( AUDIOBUFSIZE ); // コールバックの初期化
setup_sport0(); // SPORT0 設定
setup_sport0_dma(); // SPORT DMA 設定
bufTx = (( struct DMA_DESCRIPTOR * ) *pDMA2_NEXT_DESC_PTR )->avairableBuf;
bufRx = (( struct DMA_DESCRIPTOR * ) *pDMA1_NEXT_DESC_PTR )->avairableBuf;
- // AD1836Aの受信データを引数バッファにコピー
- for ( sample = 0; sample < SAMPLE_PER_INTR; sample++ ){
+ // CODECの受信データを引数バッファにコピー
+ for ( sample = 0; sample < AUDIOBUFSIZE; sample++ ){
leftIn[sample] = RxBuffer[bufRx].data[sample][ADC_L0];
rightIn[sample] = RxBuffer[bufRx].data[sample][ADC_R0];
}
// 信号処理
- codec_callback(
+ process_audio(
leftIn,
rightIn,
leftOut,
rightOut,
- SAMPLE_PER_INTR);
+ AUDIOBUFSIZE);
- // 引数データをAD1836A用送信バッファにコピー
- for ( sample = 0; sample < SAMPLE_PER_INTR; sample++ ){
+ // 引数データをCODEC用送信バッファにコピー
+ for ( sample = 0; sample < AUDIOBUFSIZE; sample++ ){
TxBuffer[bufRx].data[sample][DAC_L0] = leftOut[sample];
TxBuffer[bufRx].data[sample][DAC_R0] = rightOut[sample];
}
--- /dev/null
+INCLUDE("\"uzume.h\"");
+
+/*
+* SPORT0の割り込み通知用セマフォ
+*/
+CRE_SEM( SPORT0_SEM, { TA_TPRI, 0, 1});
+
+
+/*
+* プライベートな資源
+*/
+
+CRE_TSK( CODEC_TASK, { TA_HLNG|TA_ACT, 0, task_audiocodec, 3, 512, NULL });
+DEF_INH( INHNO_SPORT0_RX, {TA_HLNG, inh_codec_sport} );
+
--- /dev/null
+/**
+ * @file uzume.h
+ * @brief CODEC関連定義
+ */
+#ifndef UZUME_H_
+#define UZUME_H_
+/**
+ * @brief 割り込み1回あたりのサンプル数。ユーザーが変えてもよい。
+ */
+#define AUDIOBUFSIZE 64
+/**
+ * @brief サンプルあたりのスロット数。I2Sなら2。
+ */
+#define SLOT_PER_SAMPLE 2
+
+typedef int AUDIOSAMPLE;
+
+// CODECのスロット番号
+#define ADC_L0 0
+#define ADC_R0 1
+#define DAC_L0 0
+#define DAC_R0 1
+
+
+/**
+ * @brief CODECとデータをやり取りするためのバッファ
+ *
+ * 割り込み1回の間にCODECが転送するデータを格納するバッファ。サイズは
+ * 割り込み1回あたりのサンプル数 @ref SAMPLE_PER_INTRと1サンプル内の
+ * スロット数 @ref SLOT_PER_SAMPLEの積である。
+ */
+struct CODEC_BUFFER{
+ AUDIOSAMPLE data[AUDIOBUFSIZE][SLOT_PER_SAMPLE];
+} ;
+
+
+extern void task_audiocodec( VP_INT exinf );
+extern void inh_codec_sport(void);
+extern void init_audio( int count );
+extern void process_audio(
+ AUDIOSAMPLE input_left[],
+ AUDIOSAMPLE input_right[],
+ AUDIOSAMPLE output_left[],
+ AUDIOSAMPLE output_right[],
+ AUDIOSAMPLE count);
+
+#endif /*UZUME_H_*/
/**
- * @file codec_callback.c
+ * @file uzume_callback.c
* @brief オーディオ信号処理を行うユーザー・コールバック
*
*/
#include "t_services.h"
#include "kernel_id.h"
-#include "codec_ad1836a.h"
+#include "uzume.h"
/**
* @brief 信号処理初期化関数
* @param count @ref codec_callback()に渡される引数配列のサイズ
* この関数は@ref codec_callback()に先立って一度だけ呼び出される。フィルタの構築や
* 変数の初期化に使う。count引数の値は@ref codec_callback()のcount引数と同じである。
*/
-void codec_callback_init( int count )
+void init_audio( int count )
{
}
* この関数が使う資源で、あらかじめ初期化が必要なものは、@ref codec_callback_init()の
* 中で初期化しておく。
*/
-void codec_callback(
- int in0_left[],
- int in0_right[],
- int out0_left[],
- int out0_right[],
+void process_audio(
+ int input_left[],
+ int input_right[],
+ int output_left[],
+ int output_right[],
int count)
{
// ループ変数
// count個のサンプルすべてを処理する
for ( sample = 0; sample < count; sample++ ){
- out0_left[sample] = in0_left[sample];
- out0_right[sample] = in0_right[sample];
+ output_left[sample] = input_left[sample];
+ output_right[sample] = input_right[sample];
}
}
#define _MACRO_ONLY
#include "uzume_prototype.h"
-INCLUDE("\"codec_ad1836a.h\"");
-
-/*
-* プライベートだがアプリケーションで初期化が必要な資源
-*/
-CRE_SEM( SPORT0_SEM, { TA_TPRI, 0, 1});
-
-
-/*
-* プライベートな資源
-*/
-
-
-CRE_TSK( CODEC_TASK, { TA_HLNG|TA_ACT, 0, task_ad1836a, 3, 512, NULL });
-DEF_INH( INHNO_SPORT0_RX, {TA_HLNG, inh_codec_sport} );
-
-
-
-
INCLUDE("\"uzume_prototype.h\"");
CRE_TSK(MAIN_TASK, { TA_HLNG|TA_ACT, 0, main_task, MAIN_PRIORITY,
STACK_SIZE, NULL });
#include "kernel/systask/timer.cfg"
#include "kernel/systask/serial.cfg"
#include "kernel/systask/logtask.cfg"
-#include "i2c0_m.cfg"
\ No newline at end of file
+#include "i2c0_m.cfg"
+#include "uzume.cfg"
\ No newline at end of file