OSDN Git Service

SPORTのイネーブル時に、TX/RXの開始時間にずれが起きないよう、ブロックを一度空読みした。
authortakemasa <suikan@users.sourceforge.jp>
Sat, 29 Dec 2012 01:19:42 +0000 (10:19 +0900)
committertakemasa <suikan@users.sourceforge.jp>
Sat, 29 Dec 2012 01:19:42 +0000 (10:19 +0900)
uzume_prototype/Makefile.depend
uzume_prototype/configure-project
uzume_prototype/kernel/uzume/ad7999.c
uzume_prototype/kernel/uzume/i2s.cfg
uzume_prototype/kernel/uzume/i2s_subsystem.c
uzume_prototype/kernel_cfg.c
uzume_prototype/kernel_obj.dat

index f2dec94..739578c 100644 (file)
@@ -291,28 +291,34 @@ i2c_subsystem.o: \
        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 \
index 8b47b6f..a7f3be7 100755 (executable)
@@ -1 +1,8 @@
+pushd .
+cd kernel/cfg
+make depend
+make
+popd
 kernel/configure -C blackfin -S bsp_amakusa592 -A uzume_prototype
+make depend
+make clean
index efc27ab..853367b 100644 (file)
@@ -63,9 +63,9 @@ void ad7999_task(VP_INT exinf)
             /*上位バイトの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);
@@ -81,9 +81,9 @@ fract32 get_volume(unsigned int ch)
         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;
index 213afe3..702442c 100644 (file)
@@ -32,7 +32,7 @@ CRE_TSK(
             0,                  /* タスク引数。特に何も与えない */
             task_audiocodec,    /* タスク実体となる関数 */
             CODEC_TASK_PRI,     /* タスク優先順位 */
-            512,                /* タスク・スタック・サイズ */
+            1024,                /* タスク・スタック・サイズ */
             NULL                /* スタックは自動割付とする */
          });
 
index 7e22aec..ce6e14a 100644 (file)
@@ -109,6 +109,15 @@ static AUDIOSAMPLE rightOut[UZUME_BLOCKSIZE];
  */
 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;
@@ -219,13 +228,33 @@ static void start_audio(void)
        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
@@ -251,17 +280,44 @@ static void start_audio(void)
  */
 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 ){
@@ -270,7 +326,7 @@ void task_audiocodec(VP_INT extinf)
 
                
                                // 受信DMA終了割り込みと同期
-               wai_sem( SPORT0_SEM);
+               syscall(wai_sem( SPORT0_SEM));
                        
                                // プロセッサが使ってよいバッファを割り出す 
                bufTx = (( struct DMA_DESCRIPTOR * ) *pDMA2_NEXT_DESC_PTR )->avairableBuf;
@@ -314,9 +370,11 @@ void task_audiocodec(VP_INT extinf)
  */
 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;");                      // クリアが終了するのを待つ
 }
 
 
index 2c876d1..5b8f3a1 100644 (file)
@@ -40,13 +40,13 @@ const ID _kernel_tmax_tskid = (TMIN_TSKID + TNUM_TSKID - 1);
 
 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)}
 };
 
index 80c0ccf..da12776 100644 (file)
Binary files a/uzume_prototype/kernel_obj.dat and b/uzume_prototype/kernel_obj.dat differ