Index: firmware/export/config-fuze.h =================================================================== --- firmware/export/config-fuze.h (revision 23580) +++ firmware/export/config-fuze.h (working copy) @@ -10,7 +10,7 @@ #define HW_SAMPR_CAPS SAMPR_CAP_ALL /* define this if you have recording possibility */ -//#define HAVE_RECORDING +#define HAVE_RECORDING #define REC_SAMPR_CAPS SAMPR_CAP_ALL Index: firmware/target/arm/as3525/pcm-as3525.c =================================================================== --- firmware/target/arm/as3525/pcm-as3525.c (revision 23580) +++ firmware/target/arm/as3525/pcm-as3525.c (working copy) @@ -64,6 +64,13 @@ dma_size -= size; dma_start_addr += size; + CGU_PERI |= CGU_I2SOUT_APB_CLOCK_ENABLE; + CGU_AUDIO |= (1<<11); +#ifdef HAVE_RECORDING + CGU_PERI &= ~CGU_I2SIN_APB_CLOCK_ENABLE; + CGU_AUDIO &= ~(1<<23); +#endif + clean_dcache_range((void*)addr, size); /* force write back */ dma_enable_channel(1, (void*)addr, (void*)I2SOUT_DATA, DMA_PERI_I2SOUT, DMAC_FLOWCTRL_DMAC_MEM_TO_PERI, true, false, size >> 2, DMA_S1, @@ -95,11 +102,6 @@ dma_retain(); - I2SOUT_CONTROL |= 1<<6; /* dma */ - - CGU_PERI |= CGU_I2SOUT_APB_CLOCK_ENABLE; - CGU_AUDIO |= (1<<11); - play_start_pcm(); } @@ -126,9 +128,10 @@ { CGU_PERI |= CGU_I2SOUT_APB_CLOCK_ENABLE; - CGU_AUDIO = (CGU_AUDIO & ~(3<<0)) | (1<<0); /* clock source PLLA */ + /* clock source PLLA, minimal frequency */ + CGU_AUDIO |= (511<<2) | (1<<0); - I2SOUT_CONTROL = (1<<3) /* stereo */; + I2SOUT_CONTROL = (1<<6)|(1<<3) /* enable dma, stereo */; audiohw_preinit(); } @@ -149,6 +152,8 @@ cgu_audio &= ~(511 << 2); /* clear i2sout divider */ cgu_audio |= divider << 2; /* set new i2sout divider */ #ifdef HAVE_RECORDING + cgu_audio &= ~(3 << 12); /* clear i2sin clocksource */ + cgu_audio |= (1 << 12); /* set to PLLA */ cgu_audio &= ~(511 << 14); /* clear i2sin divider */ cgu_audio |= divider << 14; /* set new i2sin divider */ #endif @@ -184,22 +189,23 @@ static int rec_locked = 0; static unsigned int *rec_start_addr; static size_t rec_size; +static unsigned long vic_int_enable; - void pcm_rec_lock(void) { - if(++rec_locked == 1) - VIC_INT_EN_CLEAR = INTERRUPT_I2SIN; + if(++rec_locked == 1) { + vic_int_enable = VIC_INT_ENABLE; + VIC_INT_EN_CLEAR = 0; + } } - void pcm_rec_unlock(void) { - if(--rec_locked == 0) - VIC_INT_ENABLE |= INTERRUPT_I2SIN; + if(--rec_locked == 0) + VIC_INT_ENABLE = vic_int_enable; } + - void pcm_record_more(void *start, size_t size) { rec_start_addr = start; @@ -209,11 +215,13 @@ void pcm_rec_dma_stop(void) { + pcm_rec_lock(); VIC_INT_EN_CLEAR = INTERRUPT_I2SIN; I2SOUT_CONTROL &= ~(1<<5); /* source = i2soutif fifo */ CGU_AUDIO &= ~((1<<23)|(1<<11)); CGU_PERI &= ~(CGU_I2SIN_APB_CLOCK_ENABLE|CGU_I2SOUT_APB_CLOCK_ENABLE); + pcm_rec_unlock(); } @@ -224,7 +232,7 @@ status = I2SIN_STATUS; -#if 0 /* FIXME */ +#if 1 /* FIXME */ if ( status & ((1<<6)|(1<<0)) ) /* errors */ panicf("i2sin error: 0x%x = %s %s", status, (status & (1<<6)) ? "push" : "", @@ -287,7 +295,6 @@ void pcm_rec_dma_init(void) { - CGU_AUDIO = (CGU_AUDIO & ~(3<<12)) | (1<<12); /* clock source = PLLA */ pcm_dma_apply_settings(); }