Index: apps/plugins/CATEGORIES =================================================================== --- apps/plugins/CATEGORIES (revision 23155) +++ apps/plugins/CATEGORIES (working copy) @@ -1,3 +1,4 @@ +gui_synclist_plugin,apps alpine_cdc,apps autostart,apps battery_bench,apps @@ -38,6 +39,7 @@ keybox,apps lamp,apps logo,demos +lrcplayer,apps lua,viewers mandelbrot,demos matrix,demos Index: apps/plugins/SOURCES =================================================================== --- apps/plugins/SOURCES (revision 23155) +++ apps/plugins/SOURCES (working copy) @@ -34,10 +34,12 @@ crypt_firmware.c #endif +#if (LCD_DEPTH > 1) #if (CONFIG_CODEC == SWCODEC) && defined(HAVE_RECORDING) && \ (defined(HAVE_LINE_IN) || defined(HAVE_MIC_IN)) pitch_detector.c #endif +#endif #if (CONFIG_CODEC == SWCODEC) || !defined(SIMULATOR) metronome.c Index: apps/plugins/viewers.config =================================================================== --- apps/plugins/viewers.config (revision 23155) +++ apps/plugins/viewers.config (working copy) @@ -11,6 +11,9 @@ mp3,viewers/vbrfix,5 m3u,viewers/search,- txt,viewers/sort,- +lrc,apps/lrcplayer,1 +lrc8,apps/lrcplayer,1 +snc,apps/lrcplayer,1 gb,viewers/rockboy,6 gbc,viewers/rockboy,6 sgb,viewers/rockboy,6 Index: apps/bitmaps/native/rockboxlogo.220x68x16.bmp =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: apps/keymaps/keymap-fuze.c =================================================================== --- apps/keymaps/keymap-fuze.c (revision 23155) +++ apps/keymaps/keymap-fuze.c (working copy) @@ -256,16 +256,17 @@ { ACTION_KBD_CURSOR_RIGHT, BUTTON_HOME|BUTTON_RIGHT, BUTTON_NONE }, { ACTION_KBD_CURSOR_RIGHT, BUTTON_HOME|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_KBD_UP, BUTTON_SCROLL_BACK, BUTTON_NONE }, - { ACTION_KBD_UP, BUTTON_SCROLL_BACK|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_KBD_DOWN, BUTTON_SCROLL_FWD, BUTTON_NONE }, - { ACTION_KBD_DOWN, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_LEFT, BUTTON_SCROLL_BACK, BUTTON_NONE }, + { ACTION_KBD_LEFT, BUTTON_SCROLL_BACK|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_RIGHT, BUTTON_SCROLL_FWD, BUTTON_NONE }, + { ACTION_KBD_RIGHT, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_NONE }, { ACTION_KBD_PAGE_FLIP, BUTTON_HOME|BUTTON_SELECT, BUTTON_HOME }, - { ACTION_KBD_BACKSPACE, BUTTON_DOWN, BUTTON_NONE }, + { ACTION_KBD_DOWN, BUTTON_DOWN, BUTTON_NONE }, { ACTION_KBD_BACKSPACE, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, { ACTION_KBD_SELECT, BUTTON_SELECT, BUTTON_NONE }, - { ACTION_KBD_DONE, BUTTON_UP, BUTTON_NONE }, - { ACTION_KBD_ABORT, BUTTON_HOME|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_UP, BUTTON_UP, BUTTON_NONE }, + { ACTION_KBD_DONE, BUTTON_HOME|BUTTON_REL, BUTTON_HOME }, + { ACTION_KBD_ABORT, BUTTON_HOME|BUTTON_REPEAT, BUTTON_HOME }, LAST_ITEM_IN_LIST }; /* button_context_keyboard */ Index: firmware/export/config-clip.h =================================================================== --- firmware/export/config-clip.h (revision 23155) +++ firmware/export/config-clip.h (working copy) @@ -9,8 +9,6 @@ #define FIRMWARE_OFFSET_FILE_DATA 8 #define FIRMWARE_OFFSET_FILE_CRC 0 -#if 0 /* disabled since there is no driver (yet) */ - #define HW_SAMPR_CAPS (SAMPR_CAP_44) /* define this if you have recording possibility */ @@ -20,8 +18,6 @@ #define REC_FREQ_DEFAULT REC_FREQ_22 /* Default is not 44.1kHz */ #define REC_SAMPR_DEFAULT SAMPR_22 -#endif - /* Define bitmask of input sources - recordable bitmask can be defined explicitly if different */ #define INPUT_SRC_CAPS (SRC_CAP_MIC | SRC_CAP_FMRADIO) Index: firmware/export/config-fuze.h =================================================================== --- firmware/export/config-fuze.h (revision 23155) +++ firmware/export/config-fuze.h (working copy) @@ -9,7 +9,6 @@ #define HW_SAMPR_CAPS (SAMPR_CAP_44) -#if 0 /* define this if you have recording possibility */ #define HAVE_RECORDING @@ -24,7 +23,6 @@ /* Define bitmask of input sources - recordable bitmask can be defined explicitly if different */ -#endif #define INPUT_SRC_CAPS (SRC_CAP_MIC | SRC_CAP_FMRADIO) /* define this if you have a bitmap LCD display */ Index: firmware/export/config-e200v2.h =================================================================== --- firmware/export/config-e200v2.h (revision 23155) +++ firmware/export/config-e200v2.h (working copy) @@ -9,7 +9,6 @@ #define HW_SAMPR_CAPS (SAMPR_CAP_44) -#if 0 /* define this if you have recording possibility */ #define HAVE_RECORDING @@ -17,7 +16,6 @@ #define REC_FREQ_DEFAULT REC_FREQ_22 /* Default is not 44.1kHz */ #define REC_SAMPR_DEFAULT SAMPR_22 -#endif /* Define bitmask of input sources - recordable bitmask can be defined explicitly if different */ #define INPUT_SRC_CAPS (SRC_CAP_MIC | SRC_CAP_FMRADIO) Index: firmware/export/config-c200v2.h =================================================================== --- firmware/export/config-c200v2.h (revision 23155) +++ firmware/export/config-c200v2.h (working copy) @@ -9,8 +9,6 @@ #define FIRMWARE_OFFSET_FILE_DATA 8 #define FIRMWARE_OFFSET_FILE_CRC 0 -#if 0 - #define HW_SAMPR_CAPS (SAMPR_CAP_44) /* define this if you have recording possibility */ @@ -20,8 +18,6 @@ #define REC_FREQ_DEFAULT REC_FREQ_22 /* Default is not 44.1kHz */ #define REC_SAMPR_DEFAULT SAMPR_22 -#endif - /* Define bitmask of input sources - recordable bitmask can be defined explicitly if different */ #define INPUT_SRC_CAPS (SRC_CAP_MIC | SRC_CAP_FMRADIO) Index: firmware/export/as3525.h =================================================================== --- firmware/export/as3525.h (revision 23155) +++ firmware/export/as3525.h (working copy) @@ -507,4 +507,15 @@ #define USB_NUM_ENDPOINTS 4 #define USB_DEVBSS_ATTR IBSS_ATTR +/* I2SIN registers */ + +#define I2SIN_CONTROL (*(volatile unsigned char*)(I2SIN_BASE+0x00)) +#define I2SIN_MASK (*(volatile unsigned char*)(I2SIN_BASE+0x04)) +#define I2SIN_RAW_STATUS (*(volatile unsigned char*)(I2SIN_BASE+0x08)) +#define I2SIN_STATUS (*(volatile unsigned char*)(I2SIN_BASE+0x0C)) +#define I2SIN_CLEAR (*(volatile unsigned char*)(I2SIN_BASE+0x10)) +#define I2SIN_DATA (volatile unsigned long*)(I2SIN_BASE+0x14) +#define I2SIN_SPDIF_STATUS (*(volatile unsigned long*)(I2SIN_BASE+0x18)) + + #endif /*__AS3525_H__*/ Index: firmware/target/arm/as3525/pcm-as3525.c =================================================================== --- firmware/target/arm/as3525/pcm-as3525.c (revision 23155) +++ firmware/target/arm/as3525/pcm-as3525.c (working copy) @@ -35,11 +35,16 @@ * and the number of 32bits words has to * fit in 11 bits of DMA register */ + static unsigned char *dma_start_addr; static size_t dma_size; /* in 4*32 bits */ static void dma_callback(void); static int locked = 0; +unsigned int fredvalue[16] = { 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}; +char *fredlabel[16] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"}; +int fredindex=0; + /* Mask the DMA interrupt */ void pcm_play_lock(void) { @@ -66,10 +71,15 @@ dma_size -= size; dma_start_addr += size; + CGU_PERI &=~CGU_I2SIN_APB_CLOCK_ENABLE; + CGU_PERI |= CGU_I2SOUT_APB_CLOCK_ENABLE; - CGU_PERI |= CGU_I2SOUT_APB_CLOCK_ENABLE; CGU_AUDIO |= (1<<11); - +static int shown = 0; +if (!shown) { +fredvalue[fredindex]=CGU_PERI; fredlabel[fredindex]= "play_start_pcm/peri";fredindex=(fredindex+1)%16; +fredvalue[fredindex]=CGU_AUDIO; fredlabel[fredindex]="play_start_pcm/CA ";fredindex=(fredindex+1)%16; +shown = 1; } 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, @@ -110,9 +120,11 @@ dma_size = 0; dma_release(); - + CGU_PERI &=~CGU_I2SIN_APB_CLOCK_ENABLE; CGU_PERI &= ~CGU_I2SOUT_APB_CLOCK_ENABLE; +//fredvalue[fredindex]=CGU_PERI; fredlabel[fredindex]="pcm_play_dma_stop/peri";fredindex=(fredindex+1)%16; CGU_AUDIO &= ~(1<<11); +//fredvalue[fredindex]=CGU_AUDIO; fredlabel[fredindex]="pcm_play_dma_stop/CA ";fredindex=(fredindex+1)%16; } void pcm_play_dma_pause(bool pause) @@ -126,14 +138,25 @@ void pcm_play_dma_init(void) { CGU_PERI |= CGU_I2SOUT_APB_CLOCK_ENABLE; +fredvalue[fredindex]=CGU_PERI; fredlabel[fredindex]="pcm_play_dma_init/peri";fredindex=(fredindex+1)%16; + unsigned long frequency = pcm_sampr; + const int divider = (((AS3525_PLLA_FREQ/128) + (frequency/2)) / frequency) - 1; + if(divider < 0 || divider > 511) + panicf("unsupported frequency %ld", frequency); /* clock source PLLA, minimal frequency */ - CGU_AUDIO |= (511<<2) | (1<<0); - - I2SOUT_CONTROL |= (1<<6) ; /* enable dma */ + //CGU_AUDIO |= (511<<2) | (1<<0); + int cgu_audio = CGU_AUDIO; /* read register */ + cgu_audio &= ~(511 << 2); /* clear i2sout divider */ + cgu_audio |= (divider << 2); /* set new i2sout divider */ + cgu_audio |= 01; /* clock source plla */ + //cgu_audio &= ~(3 << 12); /* i2sin clock -> main */ + CGU_AUDIO = cgu_audio; /* write back register */ +fredvalue[fredindex]=CGU_AUDIO; fredlabel[fredindex]="pcm_play_dma_init/CA ";fredindex=(fredindex+1)%16; + I2SOUT_CONTROL = (1<<6) ; /* enable dma */ I2SOUT_CONTROL |= (1<<3) ; /* stereo */ I2SOUT_CONTROL &= ~(1<<2); /* 16 bit samples */ - +fredvalue[fredindex]=I2SOUT_CONTROL; fredlabel[fredindex]="pcm_play_dma_init/i2so";fredindex=(fredindex+1)%16; audiohw_preinit(); } @@ -150,9 +173,20 @@ if(divider < 0 || divider > 511) panicf("unsupported frequency %ld", frequency); - CGU_AUDIO &= ~(((511 ^ divider) << 2) /* I2SOUT */ - /*| ((511 ^ divider) << 14) */ /* I2SIN */ - ); + int cgu_audio = CGU_AUDIO; /* read register */ + cgu_audio &= ~(511 << 2); /* clear i2sout divider */ + cgu_audio |= (divider << 2); /* set new i2sout divider */ +#if 1 + cgu_audio &= ~(511 << 14); /* clear i2sin divider */ + cgu_audio |= (divider << 14); /* set new i2sin divider */ +#endif + CGU_AUDIO = cgu_audio; /* write back register */ +//as3525_i2c_audio_base = 0xc8070000 +//AudioSet_1 = 0x14 +#define AUDIO_SET_1 (*(volatile unsigned long *)0xC8070014) + AUDIO_SET_1 = AUDIOSET1_ADC_on|AUDIOSET1_MIC1_on|AUDIOSET1_MIC2_on; +// as3514_write(AS3514_AUDIOSET1, AUDIOSET1_ADC_on|AUDIOSET1_MIC1_on|AUDIOSET1_MIC2_on); +fredvalue[fredindex]=AUDIO_SET_1; fredlabel[fredindex]="pcm_dma_apply_set/AS1";fredindex=(fredindex+1)%16; } size_t pcm_get_bytes_waiting(void) @@ -180,43 +214,200 @@ ** Recording DMA transfer **/ #ifdef HAVE_RECORDING + +//#define I2SI_DMA + +static int rec_locked = 0; +static unsigned char *dma_rec_start_addr; +static size_t dma_rec_size; /* in 4*32 bits */ +#ifdef I2SI_DMA +static void dma_rec_callback(void); +#endif + +#define show_fn() lcd_puts(0,13,__func__);lcd_update(); + void pcm_rec_lock(void) { + if(++rec_locked == 1) +#ifdef I2SI_DMA + VIC_INT_EN_CLEAR = INTERRUPT_DMAC; +#else + VIC_INT_EN_CLEAR = INTERRUPT_I2SIN; +#endif } void pcm_rec_unlock(void) { + if(--rec_locked == 0) +#ifdef I2SI_DMA + VIC_INT_ENABLE |= INTERRUPT_DMAC; +#else + VIC_INT_ENABLE |= INTERRUPT_I2SIN; +#endif } void pcm_record_more(void *start, size_t size) { - (void)start; - (void)size; + dma_rec_start_addr = start; + dma_rec_size = size; } void pcm_rec_dma_stop(void) { +#ifdef I2SI_DMA + dma_disable_channel(1); + dma_rec_size = 0; + + dma_release(); +#else + VIC_INT_EN_CLEAR = INTERRUPT_I2SIN; +#endif + + CGU_PERI &= ~CGU_I2SIN_APB_CLOCK_ENABLE; +//fredvalue[fredindex]=CGU_PERI; fredlabel[fredindex]="pcm_rec_dma_stop/peri";fredindex=(fredindex+1)%16; + CGU_AUDIO &= ~(1<<23); +//fredvalue[fredindex]=CGU_AUDIO; fredlabel[fredindex]="pcm_rec_dma_stop/CA ";fredindex=(fredindex+1)%16; } +#ifdef I2SI_DMA +static void start_recording(void) +{ + size_t size = dma_rec_size; + void* addr = dma_rec_start_addr; + + if(size > MAX_TRANSFER) + size = MAX_TRANSFER; + + dma_rec_size -= size; + dma_rec_start_addr += size; + + dump_dcache_range((void*)dma_rec_start_addr, size); + //we might want to use a buffer aligned on cache line size (32 bytes) + dma_enable_channel(1, (void*)I2SIN_DATA, addr, DMA_PERI_I2SIN, + DMAC_FLOWCTRL_DMAC_PERI_TO_MEM, false, true, size >> 2, DMA_S4, + dma_rec_callback); +} +#endif + +int i2si_interrupts = 0; +#ifndef I2SI_DMA +void INT_I2SIN(void) +{ + i2si_interrupts++; +//fredvalue[fredindex]=I2SIN_RAW_STATUS; fredlabel[fredindex]="ISR:I2SIN_RAW_STATUS ";fredindex=(fredindex+1)%16; + const int status = I2SIN_STATUS; + I2SIN_CLEAR = status; /* clear interrupt */ + + if(status & ((1<<6)|(1<<0))) + panicf("i2sin : %x (%s/%s)", I2SIN_STATUS, + (status & (1<<6)) ? "push error" : "", + (status & (1<<0)) ? "pop error" : "" + ); + + unsigned int *addr = (unsigned int*)dma_rec_start_addr; + size_t size; + for ( size = 0; (I2SIN_RAW_STATUS & (1<<5)) == 0 ; size++ ) /* while NOT_EMPTY */ + *addr++ = *I2SIN_DATA; +#if 0 + if(status & (1<<1)) /* full */ + size = 32; /* all words */ + else if(status & (1<<3)) + size = 16; /* half of words */ + if(size > dma_rec_size) + size = dma_rec_size; + + size_t i; + for(i=0; i MAIN, fdiv = max */ +//fredvalue[fredindex]=CGU_PERI; fredlabel[fredindex]="pcm_rec_dma_start/peri";fredindex=(fredindex+1)%16; + + CGU_PERI |= CGU_I2SIN_APB_CLOCK_ENABLE; +fredvalue[fredindex]=CGU_PERI; fredlabel[fredindex]="pcm_rec_dma_start/peri";fredindex=(fredindex+1)%16; + I2SIN_CONTROL = 0 + #if 0 /* spdif */ + | (0<<5) /* 24 bits samples */ + | (2<<8) /* i2c clk src = from spdif */ + | (2<<6) /* sdata src = from spdif */ + #else + | (1<<2) /* fred added; sclk +edge */ + | (1<<5) /* 14 bits samples */ + | (0<<8) /* i2c clk src = from I2SOUTIF (with AFE) */ + | (0<<6) /* sdata src = from AFE*/ + #endif + ; +fredvalue[fredindex]=I2SIN_CONTROL; fredlabel[fredindex]="pcm_rec_dma_start/i2si";fredindex=(fredindex+1)%16; + CGU_AUDIO |= (1<<23); +fredvalue[fredindex]=CGU_AUDIO; fredlabel[fredindex]="pcm_rec_dma_start/CA ";fredindex=(fredindex+1)%16; +#ifdef I2SI_DMA + dma_retain(); + + start_recording(); + + I2SIN_CONTROL |= (1<<11); /* dma request enable */ +#else + I2SIN_MASK = 0x4f; /* no pop empty/almost empty */ + VIC_INT_ENABLE |= INTERRUPT_I2SIN; +#endif } +#ifdef I2SI_DMA +static void dma_rec_callback(void) +{ + panicf("rec callback"); + + register pcm_more_callback_type2 more_ready = pcm_callback_more_ready; + + if(dma_rec_size || (more_ready && more_ready(0) >= 0)) + { + start_recording(); + return; + } + + pcm_rec_dma_stop(); + pcm_rec_dma_stopped_callback(); +} +#endif + void pcm_rec_dma_close(void) { + pcm_rec_dma_stop(); } void pcm_rec_dma_init(void) { + pcm_dma_apply_settings(); } const void * pcm_rec_dma_get_peak_buffer(int *count) { - (void)count; + const void *peak_buffer; + + pcm_rec_lock(); + *count = dma_rec_size >> 2; + peak_buffer = (const void*)dma_rec_start_addr; + pcm_rec_unlock(); + + return peak_buffer; } #endif /* HAVE_RECORDING */ Index: firmware/target/arm/as3525/system-as3525.c =================================================================== --- firmware/target/arm/as3525/system-as3525.c (revision 23155) +++ firmware/target/arm/as3525/system-as3525.c (working copy) @@ -113,6 +113,7 @@ { INT_SRC_MCI0, INT_MCI0 }, { INT_SRC_GPIOA, INT_GPIOA, }, { INT_SRC_GPIOB, INT_GPIOB, }, + { INT_SRC_I2SIN, INT_I2SIN, }, }; static void setup_vic(void) Index: firmware/target/arm/as3525/debug-as3525.c =================================================================== --- firmware/target/arm/as3525/debug-as3525.c (revision 23155) +++ firmware/target/arm/as3525/debug-as3525.c (working copy) @@ -315,7 +315,8 @@ _DEBUG_PRINTF("Icache:%s Dcache:%s", (read_cp15() & CP15_IC) ? " on" : "off", (read_cp15() & CP15_DC) ? " on" : "off"); - + _DEBUG_PRINTF("I2SOUT_CONTROL :%8x", (unsigned int)(I2SOUT_CONTROL)); + _DEBUG_PRINTF("I2SIN_CONTROL :%8x", (unsigned int)(I2SIN_CONTROL)); lcd_update(); int btn = button_get_w_tmo(HZ/10); if(btn == (DEBUG_CANCEL|BUTTON_REL)) @@ -381,19 +382,41 @@ while(1) { line = 0; - _DEBUG_PRINTF("[GPIO Values and Directions]"); - _DEBUG_PRINTF("GPIOA: %2x DIR: %2x", GPIOA_DATA, GPIOA_DIR); - _DEBUG_PRINTF("GPIOB: %2x DIR: %2x", GPIOB_DATA, GPIOB_DIR); - _DEBUG_PRINTF("GPIOC: %2x DIR: %2x", GPIOC_DATA, GPIOC_DIR); - _DEBUG_PRINTF("GPIOD: %2x DIR: %2x", GPIOD_DATA, GPIOD_DIR); -#ifdef DEBUG_DBOP + //_DEBUG_PRINTF("[GPIO Values and Directions]"); + //_DEBUG_PRINTF("GPIOA: %2x DIR: %2x", GPIOA_DATA, GPIOA_DIR); + //_DEBUG_PRINTF("GPIOB: %2x DIR: %2x", GPIOB_DATA, GPIOB_DIR); + //_DEBUG_PRINTF("GPIOC: %2x DIR: %2x", GPIOC_DATA, GPIOC_DIR); + //_DEBUG_PRINTF("GPIOD: %2x DIR: %2x", GPIOD_DATA, GPIOD_DIR); + + //line++; + //_DEBUG_PRINTF("[CP15]"); + _DEBUG_PRINTF("I2SIN_RAW_STATUS: 0x%8x", I2SIN_RAW_STATUS&255); + line++; - _DEBUG_PRINTF("[DBOP_DIN]"); - _DEBUG_PRINTF("DBOP_DIN: %4x", button_dbop_data()); -#endif - line++; - _DEBUG_PRINTF("[CP15]"); - _DEBUG_PRINTF("CP15: 0x%8x", read_cp15()); + extern int i2si_interrupts; + extern unsigned int fredvalue[]; + extern char *fredlabel[]; + _DEBUG_PRINTF("I2SIN : %d interrupts", i2si_interrupts); + _DEBUG_PRINTF("%s :%8x", fredlabel[0], fredvalue[0]); + _DEBUG_PRINTF("%s :%8x", fredlabel[1], fredvalue[1]); + _DEBUG_PRINTF("%s :%8x", fredlabel[2], fredvalue[2]); + _DEBUG_PRINTF("%s :%8x", fredlabel[3], fredvalue[3]); + _DEBUG_PRINTF("%s :%8x", fredlabel[4], fredvalue[4]); + _DEBUG_PRINTF("%s :%8x", fredlabel[5], fredvalue[5]); + _DEBUG_PRINTF("%s :%8x", fredlabel[6], fredvalue[6]); + _DEBUG_PRINTF("%s :%8x", fredlabel[7], fredvalue[7]); + _DEBUG_PRINTF("%s :%8x", fredlabel[8], fredvalue[8]); + _DEBUG_PRINTF("%s :%8x", fredlabel[9], fredvalue[9]); + _DEBUG_PRINTF("%s :%8x", fredlabel[10], fredvalue[10]); + _DEBUG_PRINTF("%s :%8x", fredlabel[11], fredvalue[11]); + _DEBUG_PRINTF("%s :%8x", fredlabel[12], fredvalue[12]); + _DEBUG_PRINTF("%s :%8x", fredlabel[13], fredvalue[13]); + _DEBUG_PRINTF("%s :%8x", fredlabel[14], fredvalue[14]); + _DEBUG_PRINTF("%s :%8x", fredlabel[15], fredvalue[15]); + + + + lcd_update(); if (button_get_w_tmo(HZ/10) == (DEBUG_CANCEL|BUTTON_REL)) break; Index: firmware/target/arm/as3525/audio-as3525.c =================================================================== --- firmware/target/arm/as3525/audio-as3525.c (revision 23155) +++ firmware/target/arm/as3525/audio-as3525.c (working copy) @@ -25,41 +25,65 @@ #include "audiohw.h" #include "sound.h" -int audio_channels = 2; -int audio_output_source = AUDIO_SRC_PLAYBACK; +//int audio_channels = 2; void audio_set_output_source(int source) { +#if 0 if ((unsigned)source >= AUDIO_NUM_SOURCES) source = AUDIO_SRC_PLAYBACK; +#else + (void)source; +#endif - audio_output_source = source; } /* audio_set_output_source */ void audio_input_mux(int source, unsigned flags) { static int last_source = AUDIO_SRC_PLAYBACK; + static bool last_recording = false; + const bool recording = flags & SRCF_RECORDING; - (void)flags; - switch (source) { default: /* playback - no recording */ source = AUDIO_SRC_PLAYBACK; case AUDIO_SRC_PLAYBACK: - audio_channels = 2; + //audio_channels = 2; if (source != last_source) { audiohw_set_monitor(false); + audiohw_disable_recording(); } break; + case AUDIO_SRC_MIC: /* recording only */ + //audio_channels = 1; + if (source != last_source) + { + audiohw_set_monitor(false); + audiohw_enable_recording(true); /* source mic */ + } + break; + case AUDIO_SRC_FMRADIO: /* recording and playback */ - audio_channels = 2; - if (source == last_source) + //audio_channels = 2; + + if (source == last_source && recording == last_recording) break; - audiohw_set_monitor(true); + last_recording = recording; + + if (recording) + { + audiohw_set_monitor(false); + audiohw_enable_recording(false); + } + else + { + audiohw_disable_recording(); + audiohw_set_monitor(true); /* line 2 analog audio path */ + } break; } /* end switch */