3 * @brief BlueTank ACB-BF592 Application Sample Codes.
4 * @author Copyright(C) 2012 Shinichiro Nakamura
9 #include <cdefBF592-A.h>
11 #include <sys/exception.h>
18 #define SCLOCK_HZ (100000000) /**< システムクロック(100MHz) */
19 #define DMA_SAMPLE_SIZE (256) /**< 1回のサンプルサイズ */
21 typedef __attribute__((interrupt_handler)) void (*ex_handler_fn_gcc)(void);
23 static void setup_pll(uint8_t mul_val, uint8_t div_val);
24 static void __attribute__((interrupt_handler)) sport_rx_isr();
27 * SPORT受信バッファ(ダブルバッファ)
29 static int32_t sport_buffer_rx[2][DMA_SAMPLE_SIZE];
31 * SPORT受信バッファ(ダブルバッファ)
33 static int32_t sport_buffer_tx[2][DMA_SAMPLE_SIZE];
37 static volatile int32_t bufidx_dma_target;
41 static volatile int32_t data_ready;
43 static void setup_pll(uint8_t mul_val, uint8_t div_val)
45 *pSIC_IWR = IWR_ENABLE(0); /* PLLのみIWRを許す */
47 *pPLL_CTL = (mul_val) << 9;
48 asm("cli r0; csync; idle; sti r0;": : :"R0");
49 *pSIC_IWR = IWR_ENABLE_ALL;
52 static void __attribute__((interrupt_handler)) sport_rx_isr()
54 *pDMA1_IRQ_STATUS = DMA_DONE;
56 /* オーディオコーデックからデータ到着 */
59 bufidx_dma_target = (bufidx_dma_target ^ 1) & 1;
62 static void vdsp_register_handler(interrupt_kind kind, ex_handler_fn_gcc fn)
66 if ((ik_emulation > kind) || (kind > ik_ivg15)) {
70 *((ex_handler_fn_gcc*)&(((uint32_t*)EVT0)[(int32_t)kind])) = fn;
72 mask |= 1u << (int32_t)kind;
76 void uzume_init(UZUME *p)
96 led_write(LedTargetR, 1);
97 led_write(LedTargetG, 0);
105 lcd_puts("BlueTank");
107 lcd_puts("Init....");
111 * 初期化された時点ではミュートされている。
118 if (pf_mount(&fatfs) == FR_OK) {
123 lcd_puts("MT: FAIL");
129 memset(sport_buffer_rx, 0 , sizeof(sport_buffer_rx));
130 memset(sport_buffer_tx, 0 , sizeof(sport_buffer_tx));
131 bufidx_dma_target = 0;
138 vdsp_register_handler(ik_ivg9, sport_rx_isr);
139 *pSIC_IMASK |= IRQ_DMA1;
143 * 外部クロック、外部SYNC、MSB First
146 *pSPORT0_RCR1 = RFSR | RCKFE;
147 *pSPORT0_RCR2 = SLEN(31) | RSFSE;
151 * 外部クロック、外部SYNC、MSB First
154 *pSPORT0_TCR1 = TFSR | TCKFE;
155 *pSPORT0_TCR2 = SLEN(31) | TSFSE;
160 *pDMA1_PERIPHERAL_MAP = 0x1000;
161 *pDMA1_CONFIG = FLOW_AUTO | DI_EN | DI_SEL | DMA2D | WDSIZE_32 | WNR;
162 *pDMA1_START_ADDR = sport_buffer_rx;
163 *pDMA1_X_COUNT = DMA_SAMPLE_SIZE;
164 *pDMA1_X_MODIFY = sizeof(int32_t);
166 *pDMA1_Y_MODIFY = sizeof(int32_t);
171 *pDMA2_PERIPHERAL_MAP = 0x2000;
172 *pDMA2_CONFIG = FLOW_AUTO | DMA2D | WDSIZE_32;
173 *pDMA2_START_ADDR = sport_buffer_tx;
174 *pDMA2_X_COUNT = DMA_SAMPLE_SIZE;
175 *pDMA2_X_MODIFY = sizeof(int32_t);
177 *pDMA2_Y_MODIFY = sizeof(int32_t);
183 *pDMA1_IRQ_STATUS = DMA_DONE;
184 *pDMA1_CONFIG |= DMAEN;
185 *pDMA2_CONFIG |= DMAEN;
191 *pSPORT0_TCR1 |= TSPEN;
192 *pSPORT0_RCR1 |= RSPEN;
198 led_write(LedTargetR, 0);
199 led_write(LedTargetG, 1);
201 lcd_puts("InitDone");
209 void uzume_set_effect(UZUME *p, UZUME_EFFECT_FUNC effect)
214 void uzume_set_system(UZUME *p, UZUME_SYSTEM_FUNC system)
219 void uzume_execute(UZUME *p)
221 int32_t bufidx_dma_done;
225 if (0 != data_ready) {
232 * DMAが完了したバッファを使用してオーディオ処理を行なう。
234 bufidx_dma_done = bufidx_dma_target ^ 1;
235 if (p->effect != NULL) {
238 sport_buffer_rx[bufidx_dma_done],
239 sport_buffer_tx[bufidx_dma_done],
245 led_write(LedTargetR, 1);
247 if (p->system != NULL) {