kernel/config/blackfin/cpu_config.h kernel/include/itron.h \
/opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h \
kernel/config/blackfin/bsp_amakusa592/sys_defs.h
-ad7999.o: kernel/include/kernel.h kernel/config/blackfin/cpu_defs.h \
- kernel/config/blackfin/_common_bf592/chip_defs.h \
- kernel/uzume/ad7999.c \
+ad7999.o: kernel/config/blackfin/cpu_defs.h \
/opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/fr2x16_typedef.h \
- /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/raw_typedef.h \
- kernel/include/serial.h \
+ kernel/config/blackfin/tool_config.h kernel/include/serial.h \
/opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/r2x16_base.h \
./kernel_id.h \
/opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/fr2x16_math.h \
+ kernel/include/t_stddef.h kernel/config/blackfin/tool_defs.h \
+ kernel/uzume/uzume.h \
+ /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/fract_math.h \
+ kernel/include/s_services.h \
+ /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/fr2x16_base.h \
+ kernel/config/blackfin/_common_bf592/chip_config.h \
+ kernel/include/kernel.h \
+ kernel/config/blackfin/_common_bf592/chip_defs.h \
+ kernel/uzume/ad7999.c 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/raw_typedef.h \
/opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/fract_typedef.h \
- kernel/include/t_stddef.h kernel/include/t_services.h \
- kernel/uzume/i2c_subsystem.h \
+ kernel/config/blackfin/cpu_rename.h kernel/include/sil.h \
+ kernel/include/t_services.h kernel/uzume/i2c_subsystem.h \
/opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/gcc.h \
/opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \
+ kernel/include/t_syslog.h \
/opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/r2x16_typedef.h \
- kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \
- kernel/uzume/uzume.h \
- /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/fract_math.h \
- kernel/uzume/ad7999.h \
- /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/fr2x16_base.h \
- /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h \
+ kernel/config/blackfin/bsp_amakusa592/sys_config.h \
+ kernel/uzume/ad7999.h kernel/config/blackfin/cpu_config.h \
kernel/include/itron.h \
+ /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h \
kernel/config/blackfin/bsp_amakusa592/sys_defs.h
uzume_callback.o: kernel/config/blackfin/cpu_defs.h \
/opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/fr2x16_typedef.h \
+pushd .
+cd kernel/cfg
+make depend
+make
+popd
kernel/configure -C blackfin -S bsp_amakusa592 -A uzume_prototype
+make depend
+make clean
/*上位バイトのbit 3;0と下位バイトから12bitのADCデータを作る。そのデータを32bitに左詰めする */
/* 排他区間開始 */
- wai_sem(AD7999_SEM);
+ syscall(wai_sem(AD7999_SEM));
values[ch] = ( (( adcbuf[0] & 0x0F )<<8 ) | adcbuf[1] ) << 19;
- sig_sem(AD7999_SEM);
+ syscall(sig_sem(AD7999_SEM));
/* 排他区間終了 */
tslp_tsk(1);
ch = NUM_CH - 1;
/* 排他区間開始 */
- wai_sem(AD7999_SEM);
+ syscall(wai_sem(AD7999_SEM));
retval = values[ch];
- sig_sem(AD7999_SEM);
+ syscall(sig_sem(AD7999_SEM));
/* 排他区間終了 */
return retval;
0, /* タスク引数。特に何も与えない */
task_audiocodec, /* タスク実体となる関数 */
CODEC_TASK_PRI, /* タスク優先順位 */
- 512, /* タスク・スタック・サイズ */
+ 1024, /* タスク・スタック・サイズ */
NULL /* スタックは自動割付とする */
});
*/
static void setup_sport0(void)
{
+ // SPORTをディセーブルにする
+ *pSPORT0_TCR1 = 0;
+ *pSPORT0_RCR1 = 0;
+
+ // DMAをディセーブルにする
+ *pDMA2_CONFIG = 0;
+ *pDMA1_CONFIG = 0;
+
+
// ADSP-BF592 PORTG設定
// DR0PRI, RSCK0, RFS0, TD0PRI, TSCK0, TSF0をMUXで0 ( Primary func )にする
*pPORTG_MUX &= ~0x00ee;
asm("ssync;");
// SPORT0 開始 なるべくアトミックに近い状態になるよう、CPUロック状態で開始する。
- loc_cpu();
+ _syscall(loc_cpu());
*pSPORT0_TCR1 |= TSPEN;
*pSPORT0_RCR1 |= RSPEN;
- unl_cpu();
+ _syscall(unl_cpu());
}
/**
+ * @brief SPORTをディセーブルにしてオーディオ処理をはじめる
+ *
+ *
+ * DMA送受信を開始してオーディオ送受信を開始する。この関数はCPUアンロック状態で呼ばなければならない。
+ */
+static void stop_audio(void)
+{
+ // SPORT0 停止
+ *pSPORT0_TCR1 =0 ;
+ *pSPORT0_RCR1 =0 ;
+
+ // DMA 停止
+ *pDMA2_CONFIG = 0;
+ *pDMA1_CONFIG = 0;
+
+}
+
+
+
+/**
* @brief オーディオ処理の開始とコールバック呼び出し
* @param extinf ITRONのタスク引数。このタスクはタスク引数を利用しない。
* @ingroup TOPPERS
*/
void task_audiocodec(VP_INT extinf)
{
+ unsigned int dummy;
+ PRI old_priority; // タスクの優先順位を保存しておくための変数
+
+ init_codec(); // CODEC初期化
+
+ init_audio(); // コールバックの初期化
+
+ setup_sport0(); // SPORT0 設定
+
+ // これより1サンプルだけデータを空読みする。このカラ読みによって
+ // SPORTの外部同期信号に対する同期点直後で以下の処理をすすめることが可能になる。
+ // このようなことをするのは、RXとTXのSPORT開始の間に同期点が来ると、TXとRXの
+ // スタート・タイミングがずれることがおきうるからである。
+ while ( SPORT0_STAT & RXNE ) // RX FIFOがカラになるまで空読み
+ dummy = SPORT0_RX;
- ena_int( INTNO_SPORT0_RX ); // SPORT0 DMA割り込みマスクをはずす
-
- init_codec();
+ // タスクの優先順位を一旦引き上げる。これは、SPORT開始処理のレスポンスを保証するためである
+ syscall(get_pri( TSK_SELF, &old_priority ));
+ syscall(chg_pri( TSK_SELF, TMAX_TPRI ));
- init_audio( ); // コールバックの初期化
+ syscall(ena_int( INTNO_SPORT0_RX )); // SPORT0 DMA割り込みマスクをはずす
- setup_sport0(); // SPORT0 設定
- setup_sport0_dma(); // SPORT DMA 設定
- start_audio(); // SPORT0 開始
+ // DMA転送開始
+ setup_sport0_dma(); // SPORT DMA 設定
+ start_audio(); // SPORT0 開始
+ // 1ブロック受信するまで待機
+ syscall(wai_sem( SPORT0_SEM));
+
+ stop_audio();
+
+ // この時点で、我々は「SPORTの同期点直後」にいると言える
+ // 再度データ転送を開始する
+ setup_sport0_dma(); // SPORT DMA 設定
+ start_audio(); // SPORT0 開始
+
+ // ここでタスク優先順位を戻す
+ syscall(chg_pri( TSK_SELF, old_priority ));
// 割り込み待ちループ
while( 1 ){
// 受信DMA終了割り込みと同期
- wai_sem( SPORT0_SEM);
+ syscall(wai_sem( SPORT0_SEM));
// プロセッサが使ってよいバッファを割り出す
bufTx = (( struct DMA_DESCRIPTOR * ) *pDMA2_NEXT_DESC_PTR )->avairableBuf;
*/
void inh_codec_sport(void)
{
- *pDMA1_IRQ_STATUS = DMA_DONE; // SPORT0 RX DMA割り込みをクリア
- asm("ssync;"); // クリアが終了するのを待つ
- isig_sem( SPORT0_SEM ); // タスクに通知
+
+ *pDMA1_IRQ_STATUS = DMA_DONE; // SPORT0 RX DMA割り込みをクリア
+
+ syscall(isig_sem( SPORT0_SEM )); // タスクに通知
+ asm("ssync;"); // クリアが終了するのを待つ
}
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)];
+static __STK_UNIT __stack_CODEC_TASK[__TCOUNT_STK_UNIT(1024)];
static __STK_UNIT __stack_AD7999_TASK[__TCOUNT_STK_UNIT(1024)];
const TINIB _kernel_tinib_table[TNUM_TSKID] = {
{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)(0), (FP)(task_audiocodec), INT_PRIORITY(3), __TROUND_STK_UNIT(512), __stack_CODEC_TASK, TA_NULL, (FP)(NULL)},
+ {0x00u | 0x02u, (VP_INT)(0), (FP)(task_audiocodec), INT_PRIORITY(3), __TROUND_STK_UNIT(1024), __stack_CODEC_TASK, TA_NULL, (FP)(NULL)},
{0x00u | 0x02u, (VP_INT)(0), (FP)(ad7999_task), INT_PRIORITY(7), __TROUND_STK_UNIT(1024), __stack_AD7999_TASK, TA_NULL, (FP)(NULL)}
};