unsigned short x_modify;
};
+ // フレームワークの作業用内部変数
static struct {
- struct dma_descripter rx_dma_dsc[2];
- struct dma_descripter tx_dma_dsc[2];
+ struct dma_descripter rx_dma_dsc[2]; // FPGAからのデータDMAデスクリプタ
+ struct dma_descripter tx_dma_dsc[2]; // FPGAへのデータDMAデスクリプタ
- unsigned int rxif_buffer[2][RXIF_BUFSIZE];
- unsigned int af_buffer[2][AF_BUFSIZE];
+ unsigned int rxif_buffer[2][RXIF_BUFSIZE]; // FPGAからのデータDMAバッファ
+ unsigned int af_buffer[2][AF_BUFSIZE]; // FPGAへのデータDMAバッファ
int index; // パッカーが使う。現在のワードインデックスが0か1か
- short wide_fm_i[WIDE_FM_OVERSAMPE];
- short wide_fm_q[WIDE_FM_OVERSAMPE];
- int wide_fm_index;
+ short wide_fm_i[WIDE_FM_OVERSAMPE]; // Wide FMを複数サンプルまとめて処理するためのバッファ
+ short wide_fm_q[WIDE_FM_OVERSAMPE]; // Wide FMを複数サンプルまとめて処理するためのバッファ
+ int wide_fm_index; // 次のバッファ格納位置。現在のバッファ長でもある。
} framework;
+ // ラジオアルゴリズムとのやりとりに使う変数
struct {
unsigned short flags;
unsigned short smeter;
} radio;
+static int debug_counter = 0;
+static int debug_level = 0;
+static int debug_tx_counter = 0;
+static int debug_rx_counter = 0;
+
+#define DEBUGLOOP (31700)
+
/**
* \brief RX_IF受信データの処理タスク
{
int i;
+ // オーディオ送信プライマリチャンネルとセカンダリチャンネルデータ
+ unsigned int af_pri_ch, af_sec_ch;
+
vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG));
syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (INT) exinf);
syscall(serial_ctl_por(TASK_PORTID,
(IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV)));
+ // データキューのプリフィル。半分まで詰める
+ for ( i=0; i<AF_QUESIZE/2; i+=2)
+ {
+ pack_af_sample(0, 0, &af_pri_ch, &af_sec_ch);
+ syscall(psnd_dtq(DTQ_AF, (VP_INT)af_pri_ch));
+ syscall(psnd_dtq(DTQ_AF, (VP_INT)af_sec_ch));
+ debug_level ++;
+ }
+
+
framework.index = FALSE; // パッカーのインデックスの初期値設定。実のところ、初期値はランダムでも構わない。
framework.wide_fm_index = 0; // 配列内部の有効データ数
-
/*
* メインループ
* 受信DMA割り込み待ってから、DMAバッファ内部のデータを解析して然るべき受信処理を行う。
// SPORT0受信DMAがバッファを埋めるのを待つ。
syscall(wai_sem(SEM_SPORT0_RX));
+
// SPORT0受信DMAコントローラが次にロードするデスクリプタへのポインタを取得する。
// このデスクリプタは、「現在使われていない」DMAデスクリプタであり、逆に言うと
// 割り込みが完了したDMAのデスクリプタである
// パック済みオーディオサンプルをAFキューに送信する
// キューに空きがなければ、待たずにエラーをもって帰る
+#if 0
syscall(psnd_dtq(DTQ_AF, (VP_INT)af_pri_ch));
syscall(psnd_dtq(DTQ_AF, (VP_INT)af_sec_ch));
+#endif
+ debug_level += 2;
}
}
pack_af_sample( left, right, &af_pri_ch, &af_sec_ch);
// パック済みオーディオサンプルをAFキューに送信する
// キューに空きがなければ、待たずにエラーをもって帰る
+#if 0
syscall(psnd_dtq(DTQ_AF, (VP_INT)af_pri_ch));
syscall(psnd_dtq(DTQ_AF, (VP_INT)af_sec_ch));
+#endif
+ debug_level += 2;
}
- }
+ } // 非ワイドFMの場合
- }
+ } // RX-IF DMAバッファ内部のデータを処理
} while (1);
// 送信が終わるのを待つ
syscall(wai_sem(SEM_SPORT0_TX));
+
// SPORT0送信DMAコントローラが次にロードするデスクリプタへのポインタを取得する。
// このデスクリプタは、「現在使われていない」DMAデスクリプタであり、逆に言うと
// 割り込みが完了したDMAのデスクリプタである
unsigned int data;
// AFキューから送信すべきデータを取り出す
- // SVCにポーリングをしているため、取り出すべきデータがなければ待ちに入らずに
+ // SVCにポーリングを使用しているため、取り出すべきデータがなければ待ちに入らずに
// エラーコードを返す
+#if 0
syscall(prcv_dtq( DTQ_AF, (VP_INT)&data));
+#endif
// DMAバッファに書き込み
filled_buffer[i] = data;
- }
+ debug_level --;
+ }
+#if 0
+ debug_counter ++;
+ if ( debug_counter > DEBUGLOOP ){
+ syslog( LOG_NOTICE, "AF LENGTH %d", debug_level);
+ debug_counter =0;
+ }
+#endif
}while (1);
}
// ペリフェラルへの書き込みを待つ。
ssync();
+ debug_rx_counter++;
+
}
/**
// ペリフェラルへの書き込みを待つ。
ssync();
+ debug_tx_counter++;
+ if ( debug_tx_counter > 31000)
+ {
+ syslog( LOG_INFO, "TX, SIC_ISR:x08", *pSIC_ISR );
+ debug_tx_counter = 0;
+ }
}
/**
// 受信DMAデスクリプタを作る
framework.rx_dma_dsc[0].next_descripter = &framework.rx_dma_dsc[1];
- framework.rx_dma_dsc[0].start_address = framework.rxif_buffer[0];
- framework.rx_dma_dsc[0].x_count = RXIF_BUFSIZE;
- framework.rx_dma_dsc[0].x_modify = sizeof(framework.rxif_buffer[0][0]);
- framework.rx_dma_dsc[0].config =
- FLOW_LARGE | // FLOW, 0:Stop, 1:Auto buffer, 4:Desc array, 6:Desc List small, 7:Desc, List, Large
- NDSIZE_7 | // NDSIZE, the # of element of the next descripter to fetch
- 1 << DI_EN_P | // DI_EN, 0:No interrupt at the end, 1:Interrupt at the end
- 0 << DI_SEL_P | // DI_SEL, 0:Interrupt at the end of outer loop, 1:Interrupt at the end of inter loop
- 0 << RESTART_P | // RESTART, 0:Keep DMA FIFO before start, 1:Purge DMA FIFO before start
- 0 << DMA2D_P | // DMA2D, 0:Linear DMA, 1:2D DMA
- WDSIZE_32 | // WDSIZE, 0:8bit, 1:16bit, 2:32bit,3:reserved
- 1 << WNR_P | // WNR, 0:Read from memory, 1:Write to Memory
- 1 << 0 ; // DMA_EN, 0:Disable DMA, 1:Enable DMA
-
framework.rx_dma_dsc[1].next_descripter = &framework.rx_dma_dsc[0];
+
framework.rx_dma_dsc[1].start_address = framework.rxif_buffer[1];
+ framework.rx_dma_dsc[0].start_address = framework.rxif_buffer[0];
+
+ framework.rx_dma_dsc[0].x_count =
framework.rx_dma_dsc[1].x_count = RXIF_BUFSIZE;
+
+ framework.rx_dma_dsc[0].x_modify =
framework.rx_dma_dsc[1].x_modify = sizeof(framework.rxif_buffer[1][0]);
+
+ framework.rx_dma_dsc[0].config =
framework.rx_dma_dsc[1].config =
FLOW_LARGE | // FLOW, 0:Stop, 1:Auto buffer, 4:Desc array, 6:Desc List small, 7:Desc, List, Large
NDSIZE_7 | // NDSIZE, the # of element of the next descripter to fetch
1 << WNR_P | // WNR, 0:Read from memory, 1:Write to Memory
1 << 0 ; // DMA_EN, 0:Disable DMA, 1:Enable DMA
+
// SPORT0 受信DMAコントローラの初期状態設定
// ここではDMAをイネーブルにしない。また、バッファクリアする
*pDMA1_CONFIG =
// である。rx_if_taskの初期化部でSPORT受信部を起動する際に、送信部の割り込みも
// 有効にする。
framework.tx_dma_dsc[0].next_descripter = &framework.tx_dma_dsc[1];
- framework.tx_dma_dsc[0].start_address = framework.af_buffer[0];
- framework.tx_dma_dsc[0].x_count = RXIF_BUFSIZE;
- framework.tx_dma_dsc[0].x_modify = sizeof(framework.af_buffer[0][0]);
- framework.tx_dma_dsc[0].config =
- FLOW_LARGE | // FLOW, 0:Stop, 1:Auto buffer, 4:Desc array, 6:Desc List small, 7:Desc, List, Large
- NDSIZE_7 | // NDSIZE, the # of element of the next descripter to fetch
- 0 << DI_EN_P | // DI_EN, 0:No interrupt at the end, 1:Interrupt at the end
- 0 << DI_SEL_P | // DI_SEL, 0:Interrupt at the end of outer loop, 1:Interrupt at the end of inter loop
- 0 << RESTART_P | // RESTART, 0:Keep DMA FIFO before start, 1:Purge DMA FIFO before start
- 0 << DMA2D_P | // DMA2D, 0:Linear DMA, 1:2D DMA
- WDSIZE_32 | // WDSIZE, 0:8bit, 1:16bit, 2:32bit,3:reserved
- 0 << WNR_P | // WNR, 0:Read from memory, 1:Write to Memory
- 1 << 0 ; // DMA_EN, 0:Disable DMA, 1:Enable DMA
-
framework.tx_dma_dsc[1].next_descripter = &framework.tx_dma_dsc[0];
+
+ framework.tx_dma_dsc[0].start_address = framework.af_buffer[0];
framework.tx_dma_dsc[1].start_address = framework.af_buffer[1];
- framework.tx_dma_dsc[1].x_count = RXIF_BUFSIZE;
- framework.tx_dma_dsc[1].x_modify = sizeof(framework.af_buffer[1][0]);
+
+ framework.tx_dma_dsc[0].x_count =
+ framework.tx_dma_dsc[1].x_count = AF_BUFSIZE;
+
+ framework.tx_dma_dsc[0].x_modify =
+ framework.tx_dma_dsc[1].x_modify = sizeof(framework.af_buffer[0][0]);
+
+ framework.tx_dma_dsc[0].config =
framework.tx_dma_dsc[1].config =
FLOW_LARGE | // FLOW, 0:Stop, 1:Auto buffer, 4:Desc array, 6:Desc List small, 7:Desc, List, Large
NDSIZE_7 | // NDSIZE, the # of element of the next descripter to fetch
0 << WNR_P | // WNR, 0:Read from memory, 1:Write to Memory
1 << 0 ; // DMA_EN, 0:Disable DMA, 1:Enable DMA
+
// SPORT0 送信DMAコントローラの初期状態設定
// ここではDMAをイネーブルにしない。また、バッファクリアする
*pDMA2_CONFIG =