-/**\r
- * @file main.c\r
- * @brief BlueTank ACB-BF592 Application Sample Codes.\r
- * @author Copyright(C) 2012 Shinichiro Nakamura\r
- */\r
-\r
-#include <cdefBF592-A.h>\r
-#include <stdint.h>\r
-#include <string.h>\r
-#include "lcd.h"\r
-#include "led.h"\r
-#include "pff.h"\r
-#include "ssm2603.h"\r
-\r
-#define SCLOCK_HZ (100000000) /**< システムクロック(100MHz) */\r
-#define DMA_SAMPLE_SIZE (256) /**< 1回のサンプルサイズ */\r
-\r
-void sport_rx_isr() __attribute__((interrupt_handler));\r
-void audio_effect(const int32_t* src, int32_t* des, int32_t count);\r
-\r
-static int32_t sport_buffer_rx[2][DMA_SAMPLE_SIZE]; /**< SPORT受信バッファ(ダブルバッファ) */\r
-static int32_t sport_buffer_tx[2][DMA_SAMPLE_SIZE]; /**< SPORT受信バッファ(ダブルバッファ) */\r
-static volatile int32_t bufidx_dma_target; /**< DMAがどのバッファ使用をしているか */\r
-static volatile int32_t data_ready; /**< データ転送完了フラグ */\r
-\r
-int iii;\r
-\r
-static void setup_pll(uint8_t mul_val, uint8_t div_val)\r
-{\r
- *pSIC_IWR = IWR_ENABLE(0); /* PLLのみIWRを許す */\r
- *pPLL_DIV = div_val;\r
- *pPLL_CTL = (mul_val) << 9;\r
- asm("cli r0; csync; idle; sti r0;": : :"R0");\r
- *pSIC_IWR = IWR_ENABLE_ALL;\r
-}\r
-\r
-__attribute__((interrupt_handler)) void sport_rx_isr()\r
-{\r
- *pDMA1_IRQ_STATUS = DMA_DONE;\r
- asm("ssync;");\r
- /* オーディオコーデックからデータ到着 */\r
- data_ready = 1;\r
- /* DMAが使用するバッファを変更 */\r
- bufidx_dma_target = (bufidx_dma_target ^ 1) & 1;\r
-}\r
-\r
-int main(void)\r
-{\r
- int32_t bufidx_dma_done;\r
- FATFS fatfs;\r
- DIR dir;\r
- FILINFO finfo;\r
-\r
- /*\r
- * PLLを設定する。\r
- */\r
- setup_pll(16, 4);\r
-\r
- /*\r
- * LEDを初期化する。\r
- */\r
- led_init();\r
- led_write(LedTargetR, 1);\r
- led_write(LedTargetG, 0);\r
-\r
- /*\r
- * LCDを初期化する。\r
- */\r
- lcd_init();\r
- lcd_clear();\r
- lcd_goto(0, 0);\r
- lcd_puts("BlueTank");\r
- lcd_goto(0, 1);\r
- lcd_puts("Init....");\r
-\r
- /*\r
- * オーディオコーデックを初期化する。\r
- */\r
- ssm2603_init();\r
-\r
- /*\r
- * SDカードをマウントする。\r
- */\r
- if (pf_mount(&fatfs) == FR_OK) {\r
- lcd_goto(0, 0);\r
- lcd_puts("MT: OK ");\r
- } else {\r
- lcd_goto(0, 0);\r
- lcd_puts("MT: FAIL");\r
- }\r
-\r
- /*\r
- * バッファをクリアする。\r
- */\r
- memset(sport_buffer_rx, 0 , sizeof(sport_buffer_rx));\r
- memset(sport_buffer_tx, 0 , sizeof(sport_buffer_tx));\r
- bufidx_dma_target = 0;\r
- data_ready = 0;\r
-\r
- /*\r
- * ポートの設定\r
- */\r
- *pPORTG_MUX &= ~(PG1 | PG2 | PG3 | PG5 | PG6 | PG7);\r
- *pPORTG_FER |= (PG1 | PG2 | PG3 | PG5 | PG6 | PG7);\r
-\r
- /*\r
- * 割り込みハンドラをIVG9に登録\r
- */\r
- *pEVT9 = sport_rx_isr;\r
- asm("ssync;");\r
- asm volatile ("cli %0; bitset (%0, 9); sti %0; csync;": "+d"(iii)); // set IMASK bit\r
- asm("ssync;");\r
- *pSIC_IMASK |= IRQ_DMA1;\r
- asm("ssync;");\r
-\r
- /*\r
- * SPORT RXの設定\r
- * 外部クロック、外部SYNC、MSB First\r
- * 24ビットデータ、 ステレオ\r
- */\r
- *pSPORT0_RCR1 = RFSR | RCKFE;\r
- *pSPORT0_RCR2 = SLEN(31) | RSFSE;\r
-\r
- /*\r
- * SPORT TXの設定\r
- * 外部クロック、外部SYNC、MSB First\r
- * 24ビットデータ、 ステレオ\r
- */\r
- *pSPORT0_TCR1 = TFSR | TCKFE;\r
- *pSPORT0_TCR2 = SLEN(31) | TSFSE;\r
-\r
- /*\r
- * DMA1(SPORT0 RX)の設定\r
- */\r
- *pDMA1_PERIPHERAL_MAP = 0x1000;\r
- *pDMA1_CONFIG = FLOW_AUTO | DI_EN | DI_SEL | DMA2D | WDSIZE_32 | WNR;\r
- *pDMA1_START_ADDR = sport_buffer_rx;\r
- *pDMA1_X_COUNT = DMA_SAMPLE_SIZE;\r
- *pDMA1_X_MODIFY = sizeof(int32_t);\r
- *pDMA1_Y_COUNT = 2;\r
- *pDMA1_Y_MODIFY = sizeof(int32_t);\r
-\r
- /*\r
- * DMA2(SPORT0 TX)の設定\r
- */\r
- *pDMA2_PERIPHERAL_MAP = 0x2000;\r
- *pDMA2_CONFIG = FLOW_AUTO | DMA2D | WDSIZE_32;\r
- *pDMA2_START_ADDR = sport_buffer_tx;\r
- *pDMA2_X_COUNT = DMA_SAMPLE_SIZE;\r
- *pDMA2_X_MODIFY = sizeof(int32_t);\r
- *pDMA2_Y_COUNT = 2;\r
- *pDMA2_Y_MODIFY = sizeof(int32_t);\r
- asm("ssync;");\r
-\r
- /*\r
- * DMAを有効\r
- */\r
- *pDMA1_IRQ_STATUS = DMA_DONE;\r
- *pDMA1_CONFIG |= DMAEN;\r
- *pDMA2_CONFIG |= DMAEN;\r
- asm("ssync;");\r
-\r
- /*\r
- * SPORT0を有効\r
- */\r
- *pSPORT0_TCR1 |= TSPEN;\r
- *pSPORT0_RCR1 |= RSPEN;\r
- asm("ssync;");\r
-\r
- /*\r
- * PG13(MUTE#)を出力ピンに設定する。\r
- */\r
- *pPORTGIO_DIR |= PG13;\r
-\r
- /*\r
- * PG13(MUTE#)を'H'出力に設定する。\r
- */\r
- *pPORTGIO_SET = PG13;\r
-\r
- /*\r
- * 初期化の完了をユーザに通知する。\r
- */\r
- led_write(LedTargetR, 0);\r
- led_write(LedTargetG, 1);\r
- lcd_goto(0, 1);\r
- lcd_puts("InitDone");\r
-\r
- while (1) {\r
- asm("idle;");\r
- if (0 != data_ready) {\r
- /*\r
- * フラグをクリアする。\r
- */\r
- data_ready = 0;\r
-\r
- /*\r
- * DMAが完了したバッファを使用してオーディオ処理を行なう。\r
- */\r
- bufidx_dma_done = bufidx_dma_target ^ 1;\r
- audio_effect(sport_buffer_rx[bufidx_dma_done], sport_buffer_tx[bufidx_dma_done], DMA_SAMPLE_SIZE);\r
- }\r
- }\r
-\r
- return 0;\r
-}\r
-\r
-/**\r
- * @brief オーディオ処理を実行する。\r
- *\r
- * @param src 処理元バッファ。\r
- * @param des 処理後バッファ。\r
- */\r
-void audio_effect(const int32_t *src, int32_t *des, int32_t count)\r
-{\r
- memcpy(des, src, sizeof(int32_t) * count);\r
-}\r
-\r
+/**
+ * @file main.c
+ * @brief BlueTank ACB-BF592 Application Sample Codes.
+ * @author Copyright(C) 2012 Shinichiro Nakamura
+ */
+
+#include <cdefBF592-A.h>
+#include <stdint.h>
+#include <string.h>
+#include "lcd.h"
+#include "led.h"
+#include "pff.h"
+#include "ssm2603.h"
+
+#define SCLOCK_HZ (100000000) /**< システムクロック(100MHz) */
+#define DMA_SAMPLE_SIZE (256) /**< 1回のサンプルサイズ */
+
+void sport_rx_isr() __attribute__((interrupt_handler));
+void audio_effect(const int32_t* src, int32_t* des, int32_t count);
+
+static int32_t sport_buffer_rx[2][DMA_SAMPLE_SIZE]; /**< SPORT受信バッファ(ダブルバッファ) */
+static int32_t sport_buffer_tx[2][DMA_SAMPLE_SIZE]; /**< SPORT受信バッファ(ダブルバッファ) */
+static volatile int32_t bufidx_dma_target; /**< DMAがどのバッファ使用をしているか */
+static volatile int32_t data_ready; /**< データ転送完了フラグ */
+
+int iii;
+
+static void setup_pll(uint8_t mul_val, uint8_t div_val)
+{
+ *pSIC_IWR = IWR_ENABLE(0); /* PLLのみIWRを許す */
+ *pPLL_DIV = div_val;
+ *pPLL_CTL = (mul_val) << 9;
+ asm("cli r0; csync; idle; sti r0;": : :"R0");
+ *pSIC_IWR = IWR_ENABLE_ALL;
+}
+
+__attribute__((interrupt_handler)) void sport_rx_isr()
+{
+ *pDMA1_IRQ_STATUS = DMA_DONE;
+ asm("ssync;");
+ /* オーディオコーデックからデータ到着 */
+ data_ready = 1;
+ /* DMAが使用するバッファを変更 */
+ bufidx_dma_target = (bufidx_dma_target ^ 1) & 1;
+}
+
+int main(void)
+{
+ int32_t bufidx_dma_done;
+ FATFS fatfs;
+ DIR dir;
+ FILINFO finfo;
+
+ /*
+ * PLLを設定する。
+ */
+ setup_pll(16, 4);
+
+ /*
+ * LEDを初期化する。
+ */
+ led_init();
+ led_write(LedTargetR, 1);
+ led_write(LedTargetG, 0);
+
+ /*
+ * LCDを初期化する。
+ */
+ lcd_init();
+ lcd_clear();
+ lcd_goto(0, 0);
+ lcd_puts("BlueTank");
+ lcd_goto(0, 1);
+ lcd_puts("Init....");
+
+ /*
+ * オーディオコーデックを初期化する。
+ * 初期化された時点ではミュートされている。
+ */
+ ssm2603_init();
+
+ /*
+ * SDカードをマウントする。
+ */
+ if (pf_mount(&fatfs) == FR_OK) {
+ lcd_goto(0, 0);
+ lcd_puts("MT: OK ");
+ } else {
+ lcd_goto(0, 0);
+ lcd_puts("MT: FAIL");
+ }
+
+ /*
+ * バッファをクリアする。
+ */
+ memset(sport_buffer_rx, 0 , sizeof(sport_buffer_rx));
+ memset(sport_buffer_tx, 0 , sizeof(sport_buffer_tx));
+ bufidx_dma_target = 0;
+ data_ready = 0;
+
+ /*
+ * ポートの設定
+ */
+ *pPORTG_MUX &= ~(PG1 | PG2 | PG3 | PG5 | PG6 | PG7);
+ *pPORTG_FER |= (PG1 | PG2 | PG3 | PG5 | PG6 | PG7);
+
+ /*
+ * 割り込みハンドラをIVG9に登録
+ */
+ *pEVT9 = sport_rx_isr;
+ asm("ssync;");
+ asm volatile ("cli %0; bitset (%0, 9); sti %0; csync;": "+d"(iii)); // set IMASK bit
+ asm("ssync;");
+ *pSIC_IMASK |= IRQ_DMA1;
+ asm("ssync;");
+
+ /*
+ * SPORT RXの設定
+ * 外部クロック、外部SYNC、MSB First
+ * 24ビットデータ、 ステレオ
+ */
+ *pSPORT0_RCR1 = RFSR | RCKFE;
+ *pSPORT0_RCR2 = SLEN(31) | RSFSE;
+
+ /*
+ * SPORT TXの設定
+ * 外部クロック、外部SYNC、MSB First
+ * 24ビットデータ、 ステレオ
+ */
+ *pSPORT0_TCR1 = TFSR | TCKFE;
+ *pSPORT0_TCR2 = SLEN(31) | TSFSE;
+
+ /*
+ * DMA1(SPORT0 RX)の設定
+ */
+ *pDMA1_PERIPHERAL_MAP = 0x1000;
+ *pDMA1_CONFIG = FLOW_AUTO | DI_EN | DI_SEL | DMA2D | WDSIZE_32 | WNR;
+ *pDMA1_START_ADDR = sport_buffer_rx;
+ *pDMA1_X_COUNT = DMA_SAMPLE_SIZE;
+ *pDMA1_X_MODIFY = sizeof(int32_t);
+ *pDMA1_Y_COUNT = 2;
+ *pDMA1_Y_MODIFY = sizeof(int32_t);
+
+ /*
+ * DMA2(SPORT0 TX)の設定
+ */
+ *pDMA2_PERIPHERAL_MAP = 0x2000;
+ *pDMA2_CONFIG = FLOW_AUTO | DMA2D | WDSIZE_32;
+ *pDMA2_START_ADDR = sport_buffer_tx;
+ *pDMA2_X_COUNT = DMA_SAMPLE_SIZE;
+ *pDMA2_X_MODIFY = sizeof(int32_t);
+ *pDMA2_Y_COUNT = 2;
+ *pDMA2_Y_MODIFY = sizeof(int32_t);
+ asm("ssync;");
+
+ /*
+ * DMAを有効
+ */
+ *pDMA1_IRQ_STATUS = DMA_DONE;
+ *pDMA1_CONFIG |= DMAEN;
+ *pDMA2_CONFIG |= DMAEN;
+ asm("ssync;");
+
+ /*
+ * SPORT0を有効
+ */
+ *pSPORT0_TCR1 |= TSPEN;
+ *pSPORT0_RCR1 |= RSPEN;
+ asm("ssync;");
+
+ /*
+ * 初期化の完了をユーザに通知する。
+ */
+ led_write(LedTargetR, 0);
+ led_write(LedTargetG, 1);
+ lcd_goto(0, 1);
+ lcd_puts("InitDone");
+
+ /*
+ * ミュートを解除する。
+ */
+ ssm2603_mute(false);
+
+ while (1) {
+ asm("idle;");
+ if (0 != data_ready) {
+ /*
+ * フラグをクリアする。
+ */
+ data_ready = 0;
+
+ /*
+ * DMAが完了したバッファを使用してオーディオ処理を行なう。
+ */
+ bufidx_dma_done = bufidx_dma_target ^ 1;
+ audio_effect(sport_buffer_rx[bufidx_dma_done], sport_buffer_tx[bufidx_dma_done], DMA_SAMPLE_SIZE);
+ }
+ }
+
+ return 0;
+}
+
+/**
+ * @brief オーディオ処理を実行する。
+ *
+ * @param src 処理元バッファ。
+ * @param des 処理後バッファ。
+ */
+void audio_effect(const int32_t *src, int32_t *des, int32_t count)
+{
+ memcpy(des, src, sizeof(int32_t) * count);
+}
+