From ed0c5edd6280b58755736700b95a3e65034d52b4 Mon Sep 17 00:00:00 2001 From: Rafaël Carré Date: Mon, 29 Mar 2010 22:26:58 +0000 Subject: as3525v2 : recording (FM only, no microphone yet) Add HAVE_AS3543 config define to differentiate the bits changed since as3514/as3517 Enable recording on Fuzev2/Clipv2/Clip+, although it was tested on Clip+ only Note: storage is still read-only so I tested by listening to headphones loopback and watching the recording level in recscreen git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25390 a1c6a512-1295-4272-9138-f99709370657 --- apps/keymaps/keymap-clip.c | 28 +++++------ firmware/drivers/audio/as3514.c | 85 ++++++++++++++++++---------------- firmware/export/as3514.h | 23 +++++++-- firmware/export/config/sansaclipplus.h | 15 ++---- firmware/export/config/sansaclipv2.h | 14 ++---- firmware/export/config/sansafuzev2.h | 10 ++-- 6 files changed, 93 insertions(+), 82 deletions(-) diff --git a/apps/keymaps/keymap-clip.c b/apps/keymaps/keymap-clip.c index c71aedf80a..69d728c029 100644 --- a/apps/keymaps/keymap-clip.c +++ b/apps/keymaps/keymap-clip.c @@ -209,22 +209,22 @@ static const struct button_mapping button_context_pitchscreen[] = { LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD), }; /* button_context_pitchscreen */ -#if 0 +#ifdef HAVE_RECORDING /** Recording Screen **/ static const struct button_mapping button_context_recscreen[] = { - { ACTION_REC_PAUSE, BUTTON_UP|BUTTON_REL, BUTTON_UP }, - { ACTION_STD_CANCEL, BUTTON_POWER|BUTTON_REL, BUTTON_POWER }, - { ACTION_REC_NEWFILE, BUTTON_HOME|BUTTON_REL, BUTTON_HOME }, - { ACTION_STD_MENU, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT}, - { ACTION_SETTINGS_INC, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_SETTINGS_INCREPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_SETTINGS_DEC, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_SETTINGS_DECREPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_STD_PREV, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_STD_PREV, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_STD_NEXT, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_STD_NEXT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_NONE, BUTTON_DOWN|BUTTON_REL, BUTTON_DOWN }, + { ACTION_REC_PAUSE, BUTTON_UP|BUTTON_REL, BUTTON_UP }, + { ACTION_STD_CANCEL, BUTTON_POWER|BUTTON_REL, BUTTON_POWER }, + { ACTION_REC_NEWFILE, BUTTON_HOME|BUTTON_REL, BUTTON_HOME }, + { ACTION_STD_MENU, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT}, + { ACTION_SETTINGS_INC, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_SETTINGS_INCREPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_SETTINGS_DEC, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_SETTINGS_DECREPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_PREV, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_STD_PREV, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_NEXT, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_STD_NEXT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_NONE, BUTTON_DOWN|BUTTON_REL, BUTTON_DOWN }, LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) }; /* button_context_recscreen */ #endif diff --git a/firmware/drivers/audio/as3514.c b/firmware/drivers/audio/as3514.c index 11adddc0f1..9255828f75 100644 --- a/firmware/drivers/audio/as3514.c +++ b/firmware/drivers/audio/as3514.c @@ -38,12 +38,29 @@ * as3543 , as used in the as3525v2 targets */ +#if CONFIG_CPU == AS3525 /* AMS Sansas based on the AS3525 use the LINE2 input for the analog radio signal instead of LINE1 */ -#if CONFIG_CPU == AS3525 -#define LINE_INPUT 2 -#else -#define LINE_INPUT 1 +#define AS3514_LINE_IN_R AS3514_LINE_IN2_R +#define AS3514_LINE_IN_L AS3514_LINE_IN2_L +#define ADC_R_ADCMUX_LINE_IN ADC_R_ADCMUX_LINE_IN2 +#define AUDIOSET1_LIN_on AUDIOSET1_LIN2_on + +#elif CONFIG_CPU == AS3525v2 +/* There is only 1 pair of registers on AS3543, the line input is selectable in + LINE_IN_R register */ +#define AS3514_LINE_IN_R AS3514_LINE_IN1_R +#define AS3514_LINE_IN_L AS3514_LINE_IN1_L +#define ADC_R_ADCMUX_LINE_IN ADC_R_ADCMUX_LINE_IN2 +#define AUDIOSET1_LIN_on AUDIOSET1_LIN1_on + +#else /* PP use line1 */ + +#define AS3514_LINE_IN_R AS3514_LINE_IN1_R +#define AS3514_LINE_IN_L AS3514_LINE_IN1_L +#define ADC_R_ADCMUX_LINE_IN ADC_R_ADCMUX_LINE_IN1 +#define AUDIOSET1_LIN_on AUDIOSET1_LIN1_on + #endif const struct sound_settings_info audiohw_settings[] = { @@ -177,22 +194,22 @@ void audiohw_preinit(void) as3514_write(AS3514_AUDIOSET3, AUDIOSET3_HPCM_off); #endif -#if CONFIG_CPU != AS3525v2 +#ifdef HAVE_AS3543 + as3514_clear(AS3543_DAC_IF, 0x80); + as3514_set(AS3514_LINE_IN1_R, LINE_IN_R_LINE_SELECT); /* Line 2 */ +#else /* Mute and disable speaker */ as3514_write(AS3514_LSP_OUT_R, LSP_OUT_R_SP_OVC_TO_256MS | 0x00); as3514_write(AS3514_LSP_OUT_L, LSP_OUT_L_SP_MUTE | 0x00); -#else - as3514_clear(AS3543_DAC_IF, 0x80); - as3514_set(AS3514_LINE_IN1_R, 1<<6); // Select Line-in 2 #endif -#if CONFIG_CPU != AS3525v2 +#ifdef HAVE_AS3543 + as3514_write(AS3514_HPH_OUT_R, (0<<7) /* out */ | HPH_OUT_R_HP_OUT_DAC | + 0x00); +#else /* Set headphone over-current to 0, Min volume */ as3514_write(AS3514_HPH_OUT_R, HPH_OUT_R_HP_OVC_TO_0MS | 0x00); -#else - as3514_write(AS3514_HPH_OUT_R, (0<<7) /* out */ | HPH_OUT_R_HP_OUT_DAC | - 0x00); #endif /* Headphone ON, MUTE, Min volume */ as3514_write(AS3514_HPH_OUT_L, @@ -211,8 +228,10 @@ void audiohw_preinit(void) /* M1_Sup_off */ as3514_set(AS3514_MIC1_L, MIC1_L_M1_SUP_off); +#ifndef HAVE_AS3543 /* M2_Sup_off */ as3514_set(AS3514_MIC2_L, MIC2_L_M2_SUP_off); +#endif } void audiohw_postinit(void) @@ -257,12 +276,8 @@ void audiohw_set_master_vol(int vol_l, int vol_r) as3514_write_masked(AS3514_DAC_R, mix_r, AS3514_VOL_MASK); as3514_write_masked(AS3514_DAC_L, mix_l, AS3514_VOL_MASK); #if defined(HAVE_RECORDING) || defined(HAVE_FMRADIO_IN) - as3514_write_masked((LINE_INPUT == 1) ? AS3514_LINE_IN1_R : - AS3514_LINE_IN2_R, - mix_r, AS3514_VOL_MASK); - as3514_write_masked((LINE_INPUT == 1) ? AS3514_LINE_IN1_L : - AS3514_LINE_IN2_L, - mix_l, AS3514_VOL_MASK); + as3514_write_masked(AS3514_LINE_IN_R, mix_r, AS3514_VOL_MASK); + as3514_write_masked(AS3514_LINE_IN_L, mix_l, AS3514_VOL_MASK); #endif as3514_write_masked(AS3514_HPH_OUT_R, hph_r, AS3514_VOL_MASK); as3514_write_masked(AS3514_HPH_OUT_L, hph_l, AS3514_VOL_MASK); @@ -278,13 +293,13 @@ void audiohw_mute(bool mute) { if (mute) { as3514_set(AS3514_HPH_OUT_L, HPH_OUT_L_HP_MUTE); -#if CONFIG_CPU == AS3525v2 +#ifdef HAVE_AS3543 as3514_set(AS3543_DAC_IF, 0x80); #endif } else { as3514_clear(AS3514_HPH_OUT_L, HPH_OUT_L_HP_MUTE); -#if CONFIG_CPU == AS3525v2 +#ifdef HAVE_AS3543 as3514_clear(AS3543_DAC_IF, 0x80); #endif } @@ -307,7 +322,7 @@ void audiohw_close(void) as3514_clear(AS3514_HPH_OUT_L, HPH_OUT_L_HP_ON); as3514_write(AS3514_AUDIOSET1, 0x0); -#if CONFIG_CPU == AS3525v2 +#ifdef HAVE_AS3543 as3514_set(AS3543_DAC_IF, 0x80); #endif @@ -336,15 +351,11 @@ void audiohw_enable_recording(bool source_mic) as3514_clear(AS3514_MIC1_R, MIC1_R_M1_AGC_off); } else { /* ADCmux = Line_IN1 or Line_IN2 */ - as3514_write_masked(AS3514_ADC_R, - (LINE_INPUT == 1) ? ADC_R_ADCMUX_LINE_IN1 : - ADC_R_ADCMUX_LINE_IN2, + as3514_write_masked(AS3514_ADC_R, ADC_R_ADCMUX_LINE_IN, ADC_R_ADCMUX); /* LIN1_or LIN2 on, rest off */ - as3514_write_masked(AS3514_AUDIOSET1, - (LINE_INPUT == 1) ? AUDIOSET1_LIN1_on : - AUDIOSET1_LIN2_on, + as3514_write_masked(AS3514_AUDIOSET1, AUDIOSET1_LIN_on, AUDIOSET1_INPUT_MASK); } @@ -422,16 +433,12 @@ void audiohw_set_monitor(bool enable) { if (enable) { /* select either LIN1 or LIN2 */ - as3514_write_masked(AS3514_AUDIOSET1, - (LINE_INPUT == 1) ? - AUDIOSET1_LIN1_on : AUDIOSET1_LIN2_on, + as3514_write_masked(AS3514_AUDIOSET1, AUDIOSET1_LIN_on, AUDIOSET1_LIN1_on | AUDIOSET1_LIN2_on); - as3514_set((LINE_INPUT == 1) ? AS3514_LINE_IN1_R : AS3514_LINE_IN2_R, - LINE_IN1_R_LI1R_MUTE_off); - as3514_set((LINE_INPUT == 1) ? AS3514_LINE_IN1_L : AS3514_LINE_IN2_L, - LINE_IN1_L_LI1L_MUTE_off); + as3514_set(AS3514_LINE_IN_R, LINE_IN1_R_LI1R_MUTE_off); + as3514_set(AS3514_LINE_IN_L, LINE_IN1_L_LI1L_MUTE_off); -#if CONFIG_CPU == AS3525v2 +#ifdef HAVE_AS3543 as3514_write_masked(AS3514_HPH_OUT_R, HPH_OUT_R_HP_OUT_LINE, HPH_OUT_R_HP_OUT_MASK); #endif @@ -440,12 +447,12 @@ void audiohw_set_monitor(bool enable) /* turn off both LIN1 and LIN2 */ as3514_clear(AS3514_LINE_IN1_R, LINE_IN1_R_LI1R_MUTE_off); as3514_clear(AS3514_LINE_IN1_L, LINE_IN1_L_LI1L_MUTE_off); -#if CONFIG_CPU != AS3525v2 /* not in as3543 */ - as3514_clear(AS3514_LINE_IN2_R, LINE_IN2_R_LI2R_MUTE_off); - as3514_clear(AS3514_LINE_IN2_L, LINE_IN2_L_LI2L_MUTE_off); -#else +#ifdef HAVE_AS3543 as3514_write_masked(AS3514_HPH_OUT_R, HPH_OUT_R_HP_OUT_DAC, HPH_OUT_R_HP_OUT_MASK); +#else + as3514_clear(AS3514_LINE_IN2_R, LINE_IN2_R_LI2R_MUTE_off); + as3514_clear(AS3514_LINE_IN2_L, LINE_IN2_L_LI2L_MUTE_off); #endif as3514_clear(AS3514_AUDIOSET1, AUDIOSET1_LIN1_on | AUDIOSET1_LIN2_on); } diff --git a/firmware/export/as3514.h b/firmware/export/as3514.h index afc982da39..2db28397f1 100644 --- a/firmware/export/as3514.h +++ b/firmware/export/as3514.h @@ -22,6 +22,8 @@ #ifndef _AS3514_H #define _AS3514_H +#include "config.h" + extern int tenthdb2master(int db); extern void audiohw_set_master_vol(int vol_l, int vol_r); @@ -36,24 +38,32 @@ extern void audiohw_set_lineout_vol(int vol_l, int vol_r); #define AS3514_LSP_OUT_L 0x05 #define AS3514_MIC1_R 0x06 #define AS3514_MIC1_L 0x07 +#ifndef HAVE_AS3543 #define AS3514_MIC2_R 0x08 #define AS3514_MIC2_L 0x09 +#endif #define AS3514_LINE_IN1_R 0x0a #define AS3514_LINE_IN1_L 0x0b +#ifndef HAVE_AS3543 #define AS3514_LINE_IN2_R 0x0c #define AS3514_LINE_IN2_L 0x0d +#endif #define AS3514_DAC_R 0x0e #define AS3514_DAC_L 0x0f #define AS3514_ADC_R 0x10 #define AS3514_ADC_L 0x11 -#define AS3543_DAC_IF 0x12 /* only in as3543 */ +#ifdef HAVE_AS3543 +#define AS3543_DAC_IF 0x12 +#endif #define AS3514_AUDIOSET1 0x14 #define AS3514_AUDIOSET2 0x15 #define AS3514_AUDIOSET3 0x16 #define AS3517_USB_UTIL 0x17 /* only in as3517+ */ -#define AS3543_BACKLIGHT 0x1b /* only in as3543 */ -#define AS3543_PMU_ENABLE 0x1c /* only in as3543 */ +#ifdef HAVE_AS3543 +#define AS3543_BACKLIGHT 0x1b +#define AS3543_PMU_ENABLE 0x1c +#endif #define AS3514_PLLMODE 0x1d @@ -161,6 +171,9 @@ extern void audiohw_set_lineout_vol(int vol_l, int vol_r); /* Use AS3514_VOL_MASK */ /* LINE_IN1_R (0Ah) */ +#ifdef HAVE_AS3543 +#define LINE_IN_R_LINE_SELECT (0x1 << 6) +#endif #define LINE_IN1_R_LI1R_MUTE_off (0x1 << 5) /* Use AS3514_VOL_MASK */ @@ -201,8 +214,12 @@ extern void audiohw_set_lineout_vol(int vol_l, int vol_r); /* Use AS3514_VOL_MASK */ /* ADC_L (11h) */ +#ifdef HAVE_AS3543 +#define ADC_L_ADC_MUTE_off (0x1 << 5) +#else #define ADC_L_FS_2 (0x1 << 7) #define ADC_L_ADC_MUTE_off (0x1 << 6) +#endif /* Use AS3514_VOL_MASK */ /* AUDIOSET1 (14h)*/ diff --git a/firmware/export/config/sansaclipplus.h b/firmware/export/config/sansaclipplus.h index 310df3a115..462c0a76e8 100644 --- a/firmware/export/config/sansaclipplus.h +++ b/firmware/export/config/sansaclipplus.h @@ -16,19 +16,12 @@ #define HAVE_HOTSWAP #endif - -#if 0 /* disabled since there is no driver (yet) */ - -#define HW_SAMPR_CAPS (SAMPR_CAP_44) +#define HW_SAMPR_CAPS SAMPR_CAP_ALL /* define this if you have recording possibility */ #define HAVE_RECORDING -#define REC_SAMPR_CAPS (SAMPR_CAP_22) -#define REC_FREQ_DEFAULT REC_FREQ_22 /* Default is not 44.1kHz */ -#define REC_SAMPR_DEFAULT SAMPR_22 - -#endif +#define REC_SAMPR_CAPS SAMPR_CAP_ALL /* Define bitmask of input sources - recordable bitmask can be defined explicitly if different */ @@ -104,9 +97,9 @@ /* There is no hardware tone control */ #define HAVE_SW_TONE_CONTROLS -/* We're working on the assumption that the AS3525 has something - similar to the AS3514 for audio codec etc */ +/* AS3514 or newer */ #define HAVE_AS3514 +#define HAVE_AS3543 /* define this if you have a real-time clock */ #ifndef BOOTLOADER diff --git a/firmware/export/config/sansaclipv2.h b/firmware/export/config/sansaclipv2.h index d9f3cf2142..20196dc72f 100644 --- a/firmware/export/config/sansaclipv2.h +++ b/firmware/export/config/sansaclipv2.h @@ -9,18 +9,12 @@ #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 HW_SAMPR_CAPS SAMPR_CAP_ALL /* define this if you have recording possibility */ #define HAVE_RECORDING -#define REC_SAMPR_CAPS (SAMPR_CAP_22) -#define REC_FREQ_DEFAULT REC_FREQ_22 /* Default is not 44.1kHz */ -#define REC_SAMPR_DEFAULT SAMPR_22 - -#endif +#define REC_SAMPR_CAPS SAMPR_CAP_ALL /* Define bitmask of input sources - recordable bitmask can be defined explicitly if different */ @@ -99,9 +93,9 @@ /* There is no hardware tone control */ #define HAVE_SW_TONE_CONTROLS -/* We're working on the assumption that the AS3525 has something - similar to the AS3514 for audio codec etc */ +/* AS3514 or newer */ #define HAVE_AS3514 +#define HAVE_AS3543 /* define this if you have a real-time clock */ #ifndef BOOTLOADER diff --git a/firmware/export/config/sansafuzev2.h b/firmware/export/config/sansafuzev2.h index b42a0d1bb8..ddf42d9563 100644 --- a/firmware/export/config/sansafuzev2.h +++ b/firmware/export/config/sansafuzev2.h @@ -1,5 +1,5 @@ /* - * This config file is for the Sandisk Sansa Fuze + * This config file is for the Sandisk Sansa Fuze v2 */ #define TARGET_TREE /* this target is using the target tree system */ @@ -10,9 +10,9 @@ #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 +#define REC_SAMPR_CAPS SAMPR_CAP_ALL /* Default recording levels */ #define DEFAULT_REC_MIC_GAIN 23 @@ -89,9 +89,9 @@ #define LCD_PIXELFORMAT RGB565 /* rgb565 */ -/* We're working on the assumption that the AS3525 has something - similar to the AS3514 for audio codec etc */ +/* AS3514 or newer */ #define HAVE_AS3514 +#define HAVE_AS3543 /* Define this if you have a software controlled poweroff */ #define HAVE_SW_POWEROFF -- cgit