Index: apps/recorder/keyboard.c =================================================================== --- apps/recorder/keyboard.c (revision 23621) +++ apps/recorder/keyboard.c (working copy) @@ -92,10 +92,15 @@ #define KBD_TOGGLE_INPUT #endif +#ifdef HAVE_SCROLLWHEEL +#define SCROLL_1D +#endif + struct keyboard_parameters { const unsigned char* default_kbd; int DEFAULT_LINES; + int DEFAULT_WIDTH; unsigned short kbd_buf[KBD_BUF_SIZE]; int nchars; int font_w; @@ -295,6 +300,14 @@ FOR_NB_SCREENS(l) { struct keyboard_parameters *pm = ¶m[l]; +#ifdef SCROLL_1D + { pm->default_kbd = " abcdefghijklmnopqrstuvwxyz\n" + " ABCDEFGHIJKLMNOPQRSTUVWXYZ\n" + " 0123456789 !@#$%^&*().,;:'\n"; + pm->DEFAULT_LINES = 3; + pm->DEFAULT_WIDTH = 27; + } +#else #if LCD_WIDTH >= 160 && LCD_HEIGHT >= 96 struct screen *sc = &screens[l]; @@ -333,6 +346,7 @@ pm->DEFAULT_LINES = 4; } +#endif } char outline[256]; @@ -409,6 +423,10 @@ int i = 0; pm->max_chars = sc->getwidth() / pm->font_w; +#ifdef SCROLL_1D + if ( pm->max_chars > pm->DEFAULT_WIDTH ) + pm->max_chars = pm->DEFAULT_WIDTH; +#endif /* Pad lines with spaces */ while (i < pm->nchars) @@ -482,6 +500,10 @@ pm->max_chars_text = sc_w / pm->text_w - 2; pm->lines = (sc_h - BUTTONBAR_HEIGHT) / pm->font_h - 1; +#ifdef SCROLL_1D + if ( pm->lines > pm->DEFAULT_LINES ) + pm->lines = pm->DEFAULT_LINES; +#endif if (!kbd_loaded && pm->lines > pm->DEFAULT_LINES) pm->lines = pm->DEFAULT_LINES; @@ -817,6 +839,10 @@ pm->page = 0; #endif pm->x = 0; +#ifdef SCROLL_1D + if (++pm->y >= pm->lines) + pm->y = 0; +#endif /* SCROLL_1D */ } ch = get_kbd_ch(pm); @@ -832,6 +858,10 @@ pm->page = pm->pages - 1; #endif pm->x = pm->max_chars - 1; +#ifdef SCROLL_1D + if (--pm->y < 0 ) + pm->y = pm->lines-1; +#endif /* SCROLL_1D */ } ch = get_kbd_ch(pm); Index: apps/keymaps/keymap-e200.c =================================================================== --- apps/keymaps/keymap-e200.c (revision 23621) +++ apps/keymaps/keymap-e200.c (working copy) @@ -245,20 +245,18 @@ }; /* button_context_radio */ static const struct button_mapping button_context_keyboard[] = { - { ACTION_KBD_LEFT, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_KBD_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_KBD_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_KBD_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - + { ACTION_KBD_CURSOR_LEFT, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_KBD_CURSOR_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_CURSOR_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_KBD_CURSOR_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, { ACTION_KBD_CURSOR_LEFT, BUTTON_REC|BUTTON_LEFT, BUTTON_NONE }, { ACTION_KBD_CURSOR_LEFT, BUTTON_REC|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, { ACTION_KBD_CURSOR_RIGHT, BUTTON_REC|BUTTON_RIGHT, BUTTON_NONE }, { ACTION_KBD_CURSOR_RIGHT, BUTTON_REC|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_REC|BUTTON_SELECT, BUTTON_REC }, { ACTION_KBD_BACKSPACE, BUTTON_DOWN, BUTTON_NONE }, { ACTION_KBD_BACKSPACE, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, Index: apps/keymaps/keymap-ipod.c =================================================================== --- apps/keymaps/keymap-ipod.c (revision 23621) +++ apps/keymaps/keymap-ipod.c (working copy) @@ -156,17 +156,17 @@ }; /* button_context_pitchscreen */ static const struct button_mapping button_context_keyboard[] = { - { ACTION_KBD_LEFT, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_KBD_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_KBD_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_KBD_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_CURSOR_LEFT, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_KBD_CURSOR_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_CURSOR_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_KBD_CURSOR_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, { ACTION_KBD_SELECT, BUTTON_SELECT, BUTTON_NONE }, { ACTION_KBD_DONE, BUTTON_PLAY, BUTTON_NONE }, { ACTION_KBD_ABORT, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, - { 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_MORSE_INPUT, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU }, { ACTION_KBD_MORSE_SELECT, BUTTON_SELECT|BUTTON_REL, BUTTON_NONE }, LAST_ITEM_IN_LIST Index: apps/keymaps/keymap-fuze.c =================================================================== --- apps/keymaps/keymap-fuze.c (revision 23621) +++ apps/keymaps/keymap-fuze.c (working copy) @@ -246,20 +246,18 @@ }; /* button_context_radio */ static const struct button_mapping button_context_keyboard[] = { - { ACTION_KBD_LEFT, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_KBD_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_KBD_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_KBD_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - + { ACTION_KBD_CURSOR_LEFT, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_KBD_CURSOR_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_CURSOR_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_KBD_CURSOR_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, { ACTION_KBD_CURSOR_LEFT, BUTTON_HOME|BUTTON_LEFT, BUTTON_NONE }, { ACTION_KBD_CURSOR_LEFT, BUTTON_HOME|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, { 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_BACKSPACE, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, Index: firmware/export/config-fuze.h =================================================================== --- firmware/export/config-fuze.h (revision 23621) +++ 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 23621) +++ 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(); } @@ -222,16 +230,46 @@ register int status; register pcm_more_callback_type2 more_ready; + /* register *tmp will coax gcc into reading */ + /* I2SIN_DATA and writing in two instructions */ + register unsigned int *tmp; + status = I2SIN_STATUS; -#if 0 /* FIXME */ if ( status & ((1<<6)|(1<<0)) ) /* errors */ panicf("i2sin error: 0x%x = %s %s", status, (status & (1<<6)) ? "push" : "", (status & (1<<0)) ? "pop" : "" ); -#endif + /* called at half full so it's safe to */ + /* pull 16 FIFO reads in one chunk */ + if ( rec_size >= (16*4) ) { + tmp = rec_start_addr; + *tmp = *I2SIN_DATA; + *(tmp+1) = *I2SIN_DATA; + *(tmp+2) = *I2SIN_DATA; + *(tmp+3) = *I2SIN_DATA; + + *(tmp+4) = *I2SIN_DATA; + *(tmp+5) = *I2SIN_DATA; + *(tmp+6) = *I2SIN_DATA; + *(tmp+7) = *I2SIN_DATA; + + *(tmp+8) = *I2SIN_DATA; + *(tmp+9) = *I2SIN_DATA; + *(tmp+10)= *I2SIN_DATA; + *(tmp+11)= *I2SIN_DATA; + + *(tmp+12)= *I2SIN_DATA; + *(tmp+13)= *I2SIN_DATA; + *(tmp+14)= *I2SIN_DATA; + *(tmp+15)= *I2SIN_DATA; + rec_start_addr += 16; /* in 32bit words */ + rec_size -= 64; /* 16x4byte reads */ + } + + /* read out any odd samples left */ while (((I2SIN_RAW_STATUS & (1<<5)) == 0) && rec_size) { /* 14 bits per sample = 1 32 bits word */ @@ -287,7 +325,6 @@ void pcm_rec_dma_init(void) { - CGU_AUDIO = (CGU_AUDIO & ~(3<<12)) | (1<<12); /* clock source = PLLA */ pcm_dma_apply_settings(); }