From 5cfbcc6d1ac95bd43dee1714ae56005809e0b337 Mon Sep 17 00:00:00 2001 From: Shinichiro Nakamura Date: Fri, 10 Aug 2012 03:24:51 +0900 Subject: [PATCH] Separated the SSM2603 control codes. --- firm/bare_metal/Makefile | 2 +- firm/bare_metal/main.c | 73 ++++++++++------------------------------------- firm/bare_metal/ssm2603.c | 47 ++++++++++++++++++++++++++++++ firm/bare_metal/ssm2603.h | 8 ++++++ 4 files changed, 71 insertions(+), 59 deletions(-) create mode 100644 firm/bare_metal/ssm2603.c create mode 100644 firm/bare_metal/ssm2603.h diff --git a/firm/bare_metal/Makefile b/firm/bare_metal/Makefile index ac35b81..55f8897 100644 --- a/firm/bare_metal/Makefile +++ b/firm/bare_metal/Makefile @@ -6,7 +6,7 @@ PROJECT = bluetank # # Source files and search directories # -CSRC += lcd.c led.c main.c mmc.c pff.c twi.c +CSRC += lcd.c led.c main.c mmc.c pff.c twi.c ssm2603.c ASRC += VPATH = diff --git a/firm/bare_metal/main.c b/firm/bare_metal/main.c index d64307d..e2868b1 100644 --- a/firm/bare_metal/main.c +++ b/firm/bare_metal/main.c @@ -10,49 +10,21 @@ #include "lcd.h" #include "led.h" #include "pff.h" -#include "twi.h" +#include "ssm2603.h" -/* システムクロック(100MHz) */ -#define SCLOCK_HZ (100000000) +#define SCLOCK_HZ (100000000) /**< システムクロック(100MHz) */ +#define DMA_SAMPLE_SIZE (256) /**< 1回のサンプルサイズ */ -/* SSM2603のI2Cデバイスアドレス */ -#define TWI_DEVICE_ADDR (0x1A) - -/* 1回のサンプルサイズ */ -#define NUM_SAMPLES (256) - -/* SPORT RX DMA割り込みのプロトタイプ宣言 */ void sport_rx_isr() __attribute__((interrupt_handler)); -/* オーディオ処理用関数 */ void audio_effect(const int32_t* src, int32_t* des, int32_t count); -/* SPORT受信バッファ(ダブルバッファ) */ -static int32_t sport_buffer_rx[2][NUM_SAMPLES]; -/* SPORT受信バッファ(ダブルバッファ) */ -static int32_t sport_buffer_tx[2][NUM_SAMPLES]; -/* DMAがどのバッファ使用をしているか */ -static volatile int32_t bufidx_dma_target; -/* データ転送完了フラグ */ -static volatile int32_t data_ready; +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; -/* SSM2603 TWI初期化データ列 */ -static const uint8_t ssm2603_initdata[] = -{ - (0x0F << 1) | 0, 0x00, - (0x00 << 1) | 1, 0x17, - (0x01 << 1) | 1, 0x17, - (0x02 << 1) | 1, 0x79, - (0x03 << 1) | 1, 0x79, - (0x04 << 1) | 0, 0x12, - (0x05 << 1) | 0, 0x00, - (0x06 << 1) | 0, 0x02, - (0x07 << 1) | 0, 0x4E, - (0x08 << 1) | 0, 0x00, - (0x09 << 1) | 0, 0x01, -}; - static void setup_pll(uint8_t mul_val, uint8_t div_val) { *pSIC_IWR = IWR_ENABLE(0); /* PLLのみIWRを許す */ @@ -62,7 +34,6 @@ static void setup_pll(uint8_t mul_val, uint8_t div_val) *pSIC_IWR = IWR_ENABLE_ALL; } -/* SPORT RX DMA割り込みハンドラ */ __attribute__((interrupt_handler)) void sport_rx_isr() { *pDMA1_IRQ_STATUS = DMA_DONE; @@ -75,7 +46,6 @@ __attribute__((interrupt_handler)) void sport_rx_isr() int main(void) { - uint32_t i, j; int32_t bufidx_dma_done; FATFS fatfs; DIR dir; @@ -104,6 +74,11 @@ int main(void) lcd_puts("Init...."); /* + * オーディオコーデックを初期化する。 + */ + ssm2603_init(); + + /* * SDカードをマウントする。 */ if (pf_mount(&fatfs) == FR_OK) { @@ -129,24 +104,6 @@ int main(void) *pPORTG_FER |= (PG1 | PG2 | PG3 | PG5 | PG6 | PG7); /* - * TWI初期化 - */ - twi_init(); - - /* - * SSM2603初期化 - */ - for (i = 0; i < sizeof(ssm2603_initdata); i+=2) { - twi_master_write(TWI_DEVICE_ADDR, TWI_STOP, &ssm2603_initdata[i], 2); - /* - * STOP CONDITIONから600ns以上空ける - */ - for (j = 0; j < 300; j++) { - asm("ssync;"); - } - } - - /* * 割り込みハンドラをIVG9に登録 */ *pEVT9 = sport_rx_isr; @@ -178,7 +135,7 @@ int main(void) *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 = NUM_SAMPLES; + *pDMA1_X_COUNT = DMA_SAMPLE_SIZE; *pDMA1_X_MODIFY = sizeof(int32_t); *pDMA1_Y_COUNT = 2; *pDMA1_Y_MODIFY = sizeof(int32_t); @@ -189,7 +146,7 @@ int main(void) *pDMA2_PERIPHERAL_MAP = 0x2000; *pDMA2_CONFIG = FLOW_AUTO | DMA2D | WDSIZE_32; *pDMA2_START_ADDR = sport_buffer_tx; - *pDMA2_X_COUNT = NUM_SAMPLES; + *pDMA2_X_COUNT = DMA_SAMPLE_SIZE; *pDMA2_X_MODIFY = sizeof(int32_t); *pDMA2_Y_COUNT = 2; *pDMA2_Y_MODIFY = sizeof(int32_t); @@ -240,7 +197,7 @@ int main(void) * DMAが完了したバッファを使用してオーディオ処理を行なう。 */ bufidx_dma_done = bufidx_dma_target ^ 1; - audio_effect(sport_buffer_rx[bufidx_dma_done], sport_buffer_tx[bufidx_dma_done], NUM_SAMPLES); + audio_effect(sport_buffer_rx[bufidx_dma_done], sport_buffer_tx[bufidx_dma_done], DMA_SAMPLE_SIZE); } } diff --git a/firm/bare_metal/ssm2603.c b/firm/bare_metal/ssm2603.c new file mode 100644 index 0000000..51140e8 --- /dev/null +++ b/firm/bare_metal/ssm2603.c @@ -0,0 +1,47 @@ + +#include +#include "twi.h" +#include "ssm2603.h" + +/* SSM2603$B$N(BI2C$B%G%P%$%9%"%I%l%9(B */ +#define TWI_DEVICE_ADDR (0x1A) + +/* SSM2603 TWI$B=i4|2=%G!<%?Ns(B */ +static const uint8_t ssm2603_initdata[] = +{ + (0x0F << 1) | 0, 0x00, + (0x00 << 1) | 1, 0x17, + (0x01 << 1) | 1, 0x17, + (0x02 << 1) | 1, 0x79, + (0x03 << 1) | 1, 0x79, + (0x04 << 1) | 0, 0x12, + (0x05 << 1) | 0, 0x00, + (0x06 << 1) | 0, 0x02, + (0x07 << 1) | 0, 0x4E, + (0x08 << 1) | 0, 0x00, + (0x09 << 1) | 0, 0x01, +}; + +void ssm2603_init(void) +{ + uint32_t i, j; + + /* + * TWI$B=i4|2=(B + */ + twi_init(); + + /* + * SSM2603$B=i4|2=(B + */ + for (i = 0; i < sizeof(ssm2603_initdata); i+=2) { + twi_master_write(TWI_DEVICE_ADDR, TWI_STOP, &ssm2603_initdata[i], 2); + /* + * STOP CONDITION$B$+$i(B600ns$B0J>e6u$1$k(B + */ + for (j = 0; j < 300; j++) { + asm("ssync;"); + } + } +} + diff --git a/firm/bare_metal/ssm2603.h b/firm/bare_metal/ssm2603.h new file mode 100644 index 0000000..7b673ea --- /dev/null +++ b/firm/bare_metal/ssm2603.h @@ -0,0 +1,8 @@ + +#ifndef SSM2603_H +#define SSM2603_H + +void ssm2603_init(void); + +#endif + -- 2.11.0