diff options
| author | Marcin Bukat <marcin.bukat@gmail.com> | 2010-10-31 21:09:34 +0000 |
|---|---|---|
| committer | Marcin Bukat <marcin.bukat@gmail.com> | 2010-10-31 21:09:34 +0000 |
| commit | 56c4e9fa600557242d8b78f5fd8e32c2245b76fc (patch) | |
| tree | f8558778a302f89c3e819e66e86577a5e37c3660 /firmware | |
| parent | 40ed5f57d9be61f1200026e9b0f944a9718111c1 (diff) | |
| download | rockbox-56c4e9fa600557242d8b78f5fd8e32c2245b76fc.zip rockbox-56c4e9fa600557242d8b78f5fd8e32c2245b76fc.tar.gz rockbox-56c4e9fa600557242d8b78f5fd8e32c2245b76fc.tar.bz2 rockbox-56c4e9fa600557242d8b78f5fd8e32c2245b76fc.tar.xz | |
Separate mas35xx lowlevel stuff. Move SH specific bits to target tree. FS#11189 by me.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28425 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware')
| -rw-r--r-- | firmware/SOURCES | 22 | ||||
| -rw-r--r-- | firmware/drivers/audio/dac3550a.c (renamed from firmware/drivers/dac.c) | 15 | ||||
| -rw-r--r-- | firmware/drivers/audio/mas35xx.c | 99 | ||||
| -rw-r--r-- | firmware/drivers/tuner/s1a0903x01.c | 2 | ||||
| -rw-r--r-- | firmware/export/audiohw.h | 3 | ||||
| -rw-r--r-- | firmware/export/dac3550a.h (renamed from firmware/drivers/dac.h) | 13 | ||||
| -rw-r--r-- | firmware/export/mas.h | 184 | ||||
| -rw-r--r-- | firmware/export/mas35xx.h | 162 | ||||
| -rw-r--r-- | firmware/export/mascodec.h | 43 | ||||
| -rw-r--r-- | firmware/sound.c | 85 | ||||
| -rw-r--r-- | firmware/target/sh/archos/audio-archos.c (renamed from firmware/mp3_playback.c) | 55 | ||||
| -rw-r--r-- | firmware/target/sh/archos/mascodec-archos.c (renamed from firmware/drivers/mas.c) | 4 | ||||
| -rw-r--r-- | firmware/test/i2c/main.c | 4 |
13 files changed, 339 insertions, 352 deletions
diff --git a/firmware/SOURCES b/firmware/SOURCES index f118f6a..5b7a582 100644 --- a/firmware/SOURCES +++ b/firmware/SOURCES @@ -175,7 +175,7 @@ drivers/led.c drivers/button.c #if (CONFIG_PLATFORM & PLATFORM_NATIVE) #ifdef HAVE_DAC3550A -drivers/dac.c +drivers/audio/dac3550a.c #endif #ifdef HAVE_SERIAL drivers/serial.c @@ -289,9 +289,6 @@ drivers/tuner/rda5802.c #endif /* BOOTLOADER */ /* Sound */ -#if CONFIG_CODEC != SWCODEC -mp3_playback.c -#endif /* CONFIG_CODEC != SWCODEC */ sound.c #if CONFIG_CODEC == SWCODEC @@ -303,15 +300,6 @@ pcm.c enc_base.c #endif /* HAVE_RECORDING */ #endif /* BOOTLOADER */ - -#else /* !SWCODEC */ - -#ifndef BOOTLOADER -#ifndef SIMULATOR -drivers/mas.c -#endif /* SIMULATOR */ -#endif /* BOOTLOADER */ - #endif /* SWCODEC */ /* Audio codec */ @@ -574,6 +562,8 @@ target/sh/archos/player/lcd-player.c target/sh/archos/player/power-player.c target/sh/archos/player/powermgmt-player.c target/sh/archos/player/usb-player.c +target/sh/archos/mascodec-archos.c +target/sh/archos/audio-archos.c #endif /* SIMULATOR */ #endif /* ARCHOS_PLAYER */ @@ -588,6 +578,8 @@ target/sh/archos/recorder/button-recorder.c target/sh/archos/recorder/power-recorder.c target/sh/archos/recorder/powermgmt-recorder.c target/sh/archos/recorder/usb-recorder.c +target/sh/archos/mascodec-archos.c +target/sh/archos/audio-archos.c #endif /* SIMULATOR */ #endif /* ARCHOS_RECORDER */ @@ -602,6 +594,8 @@ target/sh/archos/fm_v2/button-fm_v2.c target/sh/archos/fm_v2/power-fm_v2.c target/sh/archos/fm_v2/powermgmt-fm_v2.c target/sh/archos/fm_v2/usb-fm_v2.c +target/sh/archos/mascodec-archos.c +target/sh/archos/audio-archos.c #endif /* SIMULATOR */ #endif /* ARCHOS_FMRECORDER || ARCHOS_RECORDERV2 */ @@ -614,6 +608,8 @@ target/sh/archos/ondio/button-ondio.c target/sh/archos/ondio/power-ondio.c target/sh/archos/ondio/powermgmt-ondio.c target/sh/archos/ondio/usb-ondio.c +target/sh/archos/mascodec-archos.c +target/sh/archos/audio-archos.c #if (CONFIG_TUNER & TEA5767) target/sh/archos/ondio/fmradio_i2c-ondio.c #endif diff --git a/firmware/drivers/dac.c b/firmware/drivers/audio/dac3550a.c index f21ef9a..e13602e 100644 --- a/firmware/drivers/dac.c +++ b/firmware/drivers/audio/dac3550a.c @@ -5,7 +5,7 @@ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ - * $Id$ + * $Id: dac.c 17847 2008-06-28 18:10:04Z bagder $ * * Copyright (C) 2002 by Linus Nielsen Feltzing * @@ -22,13 +22,19 @@ #include "stdbool.h" #include "i2c.h" #include "debug.h" -#include "dac.h" - -#ifdef HAVE_DAC3550A +#include "dac3550a.h" static bool line_in_enabled = false; static bool dac_enabled = false; +/* convert tenth of dB volume (-780..+180) to dac3550 register value */ +int tenthdb2reg(int db) +{ + if (db < -540) /* 3 dB steps */ + return (db + 780) / 30; + else /* 1.5 dB steps */ + return (db + 660) / 15; +} int dac_volume(unsigned int left, unsigned int right, bool deemph) { @@ -116,4 +122,3 @@ void dac_init(void) i2c_end(); } -#endif diff --git a/firmware/drivers/audio/mas35xx.c b/firmware/drivers/audio/mas35xx.c index 342d8a3..e6cc665 100644 --- a/firmware/drivers/audio/mas35xx.c +++ b/firmware/drivers/audio/mas35xx.c @@ -23,8 +23,8 @@ ****************************************************************************/ #include "config.h" +#include "system.h" /* MAX MIN macros */ #include "audiohw.h" -#include "mas.h" const struct sound_settings_info audiohw_settings[] = { #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) @@ -56,10 +56,15 @@ const struct sound_settings_info audiohw_settings[] = { #endif }; - int channel_configuration = SOUND_CHAN_STEREO; int stereo_width = 100; +#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) +unsigned long mdb_shape_shadow = 0; +unsigned long loudness_shadow = 0; +unsigned long shadow_io_control_main; +#endif + static void set_channel_config(void) { @@ -181,13 +186,97 @@ void audiohw_set_treble(int val) } #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) -void audiohw_set_volume(int val) { +void audiohw_set_volume(int val) +{ unsigned tmp = ((unsigned)(val + 115) & 0xff) << 8; mas_codec_writereg(MAS_REG_VOLUME_CONTROL, tmp); } -void audiohw_set_balance(int val) { +void audiohw_set_loudness(int value) +{ + loudness_shadow = (loudness_shadow & 0x04) | + (MAX(MIN(value * 4, 0x44), 0) << 8); + mas_codec_writereg(MAS_REG_KLOUDNESS, loudness_shadow); +} + +void audiohw_set_avc(int value) +{ + int tmp; + + static const uint16_t avc_vals[] = + { + (0x1 << 8) | (0x8 << 12), /* 20ms */ + (0x2 << 8) | (0x8 << 12), /* 2s */ + (0x4 << 8) | (0x8 << 12), /* 4s */ + (0x8 << 8) | (0x8 << 12), /* 8s */ + }; + switch (value) { + case 1: + case 2: + case 3: + case 4: + tmp = avc_vals[value -1]; + break; + case -1: /* turn off and then turn on again to decay quickly */ + tmp = mas_codec_readreg(MAS_REG_KAVC); + mas_codec_writereg(MAS_REG_KAVC, 0); + break; + default: /* off */ + tmp = 0; + break; + } + mas_codec_writereg(MAS_REG_KAVC, tmp); +} + +void audiohw_set_mdb_strength(int value) +{ + mas_codec_writereg(MAS_REG_KMDB_STR, (value & 0x7f) << 8); +} + +void audiohw_set_mdb_harmonics(int value) +{ + int tmp = value * 127 / 100; + mas_codec_writereg(MAS_REG_KMDB_HAR, (tmp & 0x7f) << 8); +} + +void audiohw_set_mdb_center(int value) +{ + mas_codec_writereg(MAS_REG_KMDB_FC, (value/10) << 8); +} + +void audiohw_set_mdb_shape(int value) +{ + mdb_shape_shadow = (mdb_shape_shadow & 0x02) | ((value/10) << 8); + mas_codec_writereg(MAS_REG_KMDB_SWITCH, mdb_shape_shadow); +} + +void audiohw_set_mdb_enable(int value) +{ + mdb_shape_shadow = (mdb_shape_shadow & ~0x02) | (value?2:0); + mas_codec_writereg(MAS_REG_KMDB_SWITCH, mdb_shape_shadow); +} + +void audiohw_set_superbass(int value) +{ + loudness_shadow = (loudness_shadow & ~0x04) | (value?4:0); + mas_codec_writereg(MAS_REG_KLOUDNESS, loudness_shadow); +} + +void audiohw_set_balance(int val) +{ unsigned tmp = ((unsigned)(val * 127 / 100) & 0xff) << 8; mas_codec_writereg(MAS_REG_BALANCE, tmp); } -#endif + +void audiohw_set_pitch(unsigned long val) +{ + mas_writemem(MAS_BANK_D0, MAS_D0_OFREQ_CONTROL, &val, 1); + + /* We must tell the MAS that the frequency has changed. + * This will unfortunately cause a short silence. */ + + mas_writemem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN, &shadow_io_control_main, 1); +} + +#endif /* CONFIG_CODEC == MAS3587F || CONFIG_CODEC == MAS3539F */ + diff --git a/firmware/drivers/tuner/s1a0903x01.c b/firmware/drivers/tuner/s1a0903x01.c index 3a417d7..2c93ebd 100644 --- a/firmware/drivers/tuner/s1a0903x01.c +++ b/firmware/drivers/tuner/s1a0903x01.c @@ -27,7 +27,7 @@ #include "tuner.h" /* tuner abstraction interface */ #include "fmradio.h" /* physical interface driver */ #include "sound.h" -#include "mas.h" +#include "mas35xx.h" #include "power.h" #define DEFAULT_IN1 0x100003 /* Mute */ diff --git a/firmware/export/audiohw.h b/firmware/export/audiohw.h index 56f4d3d..930c671 100644 --- a/firmware/export/audiohw.h +++ b/firmware/export/audiohw.h @@ -59,6 +59,9 @@ #include "as3514.h" #elif defined(HAVE_MAS35XX) #include "mas35xx.h" +#if defined(HAVE_DAC3550A) +#include "dac3550a.h" +#endif /* HAVE_DAC3550A */ #elif defined(HAVE_TSC2100) #include "tsc2100.h" #elif defined(HAVE_JZ4740_CODEC) diff --git a/firmware/drivers/dac.h b/firmware/export/dac3550a.h index 121ce74..3744b22 100644 --- a/firmware/drivers/dac.h +++ b/firmware/export/dac3550a.h @@ -5,7 +5,7 @@ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ - * $Id$ + * $Id: dac.h 24158 2010-01-03 11:31:14Z Buschel $ * * Copyright (C) 2002 by Linus Nielsen Feltzing * @@ -18,13 +18,11 @@ * KIND, either express or implied. * ****************************************************************************/ -#ifndef _DAC_H_ -#define _DAC_H_ +#ifndef _DAC3550A_H_ +#define _DAC3550A_H_ #include "config.h" -#ifdef HAVE_DAC3550A - /* DAC I2C defs */ @@ -38,11 +36,12 @@ #define DAC_AVOL 2 #define DAC_GCFG 3 +/* function prototypes */ +extern int tenthdb2reg(int db); extern int dac_volume(unsigned int left, unsigned int right, bool deemph); extern void dac_enable(bool enable); extern void dac_line_in(bool enable); extern void dac_init(void); -#endif +#endif /* _DAC3550A_H_ */ -#endif diff --git a/firmware/export/mas.h b/firmware/export/mas.h deleted file mode 100644 index 9cbe970..0000000 --- a/firmware/export/mas.h +++ /dev/null @@ -1,184 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2002 by Linus Nielsen Feltzing - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#ifndef _MAS_H_ -#define _MAS_H_ - -#define MAS_BANK_D0 0 -#define MAS_BANK_D1 1 - -#define MAX_PEAK 0x8000 - -/* - MAS I2C defs -*/ -#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) -#define MAS_ADR 0x3c -#define MAS_DEV_WRITE (MAS_ADR | 0x00) -#define MAS_DEV_READ (MAS_ADR | 0x01) - -#elif CONFIG_CODEC == MAS3507D -#define MAS_ADR 0x3a -#define MAS_DEV_WRITE (MAS_ADR | 0x00) -#define MAS_DEV_READ (MAS_ADR | 0x01) -#endif - -/* registers..*/ -#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) -#define MAS_DATA_WRITE 0x68 -#define MAS_DATA_READ 0x69 -#define MAS_CODEC_WRITE 0x6c -#define MAS_CODEC_READ 0x6d -#define MAS_CONTROL 0x6a -#define MAS_DCCF 0x76 -#define MAS_DCFR 0x77 - -#elif CONFIG_CODEC == MAS3507D -#define MAS_DATA_WRITE 0x68 -#define MAS_DATA_READ 0x69 -#define MAS_CONTROL 0x6a -#endif - -/* - * MAS register - */ -#define MAS_REG_DCCF 0x8e -#define MAS_REG_MUTE 0xaa -#define MAS_REG_PIODATA 0xc8 -#define MAS_REG_StartUpConfig 0xe6 -#define MAS_REG_KPRESCALE 0xe7 -#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) -#define MAS_REG_KMDB_SWITCH 0x21 -#define MAS_REG_KMDB_STR 0x22 -#define MAS_REG_KMDB_HAR 0x23 -#define MAS_REG_KMDB_FC 0x24 -#define MAS_REG_KLOUDNESS 0x1e -#define MAS_REG_QPEAK_L 0x0a -#define MAS_REG_QPEAK_R 0x0b -#define MAS_REG_DQPEAK_L 0x0c -#define MAS_REG_DQPEAK_R 0x0d -#define MAS_REG_VOLUME_CONTROL 0x10 -#define MAS_REG_BALANCE 0x11 -#define MAS_REG_KAVC 0x12 -#define MAS_REG_KBASS 0x14 -#define MAS_REG_KTREBLE 0x15 - -#elif CONFIG_CODEC == MAS3507D -#define MAS_REG_KBASS 0x6b -#define MAS_REG_KTREBLE 0x6f -#endif - -/* - * MAS commands - */ -#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) -#define MAS_CMD_READ_ANCILLARY 0x50 -#define MAS_CMD_FAST_PRG_DL 0x60 -#define MAS_CMD_READ_IC_VER 0x70 -#define MAS_CMD_READ_REG 0xa0 -#define MAS_CMD_WRITE_REG 0xb0 -#define MAS_CMD_READ_D0_MEM 0xc0 -#define MAS_CMD_READ_D1_MEM 0xd0 -#define MAS_CMD_WRITE_D0_MEM 0xe0 -#define MAS_CMD_WRITE_D1_MEM 0xf0 - -#elif CONFIG_CODEC == MAS3507D -#define MAS_CMD_READ_ANCILLARY 0x30 -#define MAS_CMD_WRITE_REG 0x90 -#define MAS_CMD_WRITE_D0_MEM 0xa0 -#define MAS_CMD_WRITE_D1_MEM 0xb0 -#define MAS_CMD_READ_REG 0xd0 -#define MAS_CMD_READ_D0_MEM 0xe0 -#define MAS_CMD_READ_D1_MEM 0xf0 -#endif - -/* - * MAS D0 memory cells (MAS3587F / MAS3539F) - */ -#if CONFIG_CODEC == MAS3587F -#define MAS_D0_APP_SELECT 0x7f6 -#define MAS_D0_APP_RUNNING 0x7f7 -#define MAS_D0_ENCODER_CONTROL 0x7f0 -#define MAS_D0_IO_CONTROL_MAIN 0x7f1 -#define MAS_D0_INTERFACE_CONTROL 0x7f2 -#define MAS_D0_OFREQ_CONTROL 0x7f3 -#define MAS_D0_OUT_CLK_CONFIG 0x7f4 -#define MAS_D0_SPD_OUT_BITS 0x7f8 -#define MAS_D0_SOFT_MUTE 0x7f9 -#define MAS_D0_OUT_LL 0x7fc -#define MAS_D0_OUT_LR 0x7fd -#define MAS_D0_OUT_RL 0x7fe -#define MAS_D0_OUT_RR 0x7ff -#define MAS_D0_MPEG_FRAME_COUNT 0xfd0 -#define MAS_D0_MPEG_STATUS_1 0xfd1 -#define MAS_D0_MPEG_STATUS_2 0xfd2 -#define MAS_D0_CRC_ERROR_COUNT 0xfd3 - -#elif CONFIG_CODEC == MAS3539F -#define MAS_D0_APP_SELECT 0x34b -#define MAS_D0_APP_RUNNING 0x34c -/* no encoder :( */ -#define MAS_D0_IO_CONTROL_MAIN 0x346 -#define MAS_D0_INTERFACE_CONTROL 0x347 -#define MAS_D0_OFREQ_CONTROL 0x348 -#define MAS_D0_OUT_CLK_CONFIG 0x349 -#define MAS_D0_SPD_OUT_BITS 0x351 -#define MAS_D0_SOFT_MUTE 0x350 -#define MAS_D0_OUT_LL 0x354 -#define MAS_D0_OUT_LR 0x355 -#define MAS_D0_OUT_RL 0x356 -#define MAS_D0_OUT_RR 0x357 -#define MAS_D0_MPEG_FRAME_COUNT 0xfd0 -#define MAS_D0_MPEG_STATUS_1 0xfd1 -#define MAS_D0_MPEG_STATUS_2 0xfd2 -#define MAS_D0_CRC_ERROR_COUNT 0xfd3 - -#elif CONFIG_CODEC == MAS3507D -#define MAS_D0_MPEG_FRAME_COUNT 0x300 -#define MAS_D0_MPEG_STATUS_1 0x301 -#define MAS_D0_MPEG_STATUS_2 0x302 -#define MAS_D0_CRC_ERROR_COUNT 0x303 -#define MAS_D0_OUT_LL 0x7f8 -#define MAS_D0_OUT_LR 0x7f9 -#define MAS_D0_OUT_RL 0x7fa -#define MAS_D0_OUT_RR 0x7fb - -#endif - -int mas_default_read(unsigned short *buf); -int mas_run(unsigned short address); -int mas_readmem(int bank, int addr, unsigned long* dest, int len); -int mas_writemem(int bank, int addr, const unsigned long* src, int len); -int mas_readreg(int reg); -int mas_writereg(int reg, unsigned int val); -void mas_reset(void); -int mas_direct_config_read(unsigned char reg); -int mas_direct_config_write(unsigned char reg, unsigned int val); -int mas_codec_writereg(int reg, unsigned int val); -int mas_codec_readreg(int reg); -unsigned long mas_readver(void); - -#endif - -#if CONFIG_TUNER & S1A0903X01 -void mas_store_pllfreq(int freq); -int mas_get_pllfreq(void); -#endif - diff --git a/firmware/export/mas35xx.h b/firmware/export/mas35xx.h index 1c50b7f..f75658f 100644 --- a/firmware/export/mas35xx.h +++ b/firmware/export/mas35xx.h @@ -25,27 +25,55 @@ #define _MAS35XX_H #include "config.h" +#include "mascodec.h" -#if CONFIG_CODEC == MAS3507D +#define MAS_BANK_D0 0 +#define MAS_BANK_D1 1 -#define VOLUME_MIN -780 -#define VOLUME_MAX 180 -#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | PRESCALER_CAP) +/* registers common to all MAS35xx */ +#define MAS_REG_DCCF 0x8e +#define MAS_REG_MUTE 0xaa +#define MAS_REG_PIODATA 0xc8 +#define MAS_REG_StartUpConfig 0xe6 +#define MAS_REG_KPRESCALE 0xe7 -#else /* CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F */ +#if CONFIG_CODEC == MAS3507D -/* MAS3587F and MAS3539F handle clipping prevention internally so we do not need - * the prescaler -> CLIPPING_CAP - */ +/* I2C defines */ +#define MAS_ADR 0x3a +#define MAS_DEV_WRITE (MAS_ADR | 0x00) +#define MAS_DEV_READ (MAS_ADR | 0x01) -#define VOLUME_MIN -400 -#define VOLUME_MAX 600 -#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | BALANCE_CAP | CLIPPING_CAP) +/* MAS3507D registers */ +#define MAS_DATA_WRITE 0x68 +#define MAS_DATA_READ 0x69 +#define MAS_CONTROL 0x6a -#endif +#define MAS_REG_KBASS 0x6b +#define MAS_REG_KTREBLE 0x6f +/* MAS3507D commands */ +#define MAS_CMD_READ_ANCILLARY 0x30 +#define MAS_CMD_WRITE_REG 0x90 +#define MAS_CMD_WRITE_D0_MEM 0xa0 +#define MAS_CMD_WRITE_D1_MEM 0xb0 +#define MAS_CMD_READ_REG 0xd0 +#define MAS_CMD_READ_D0_MEM 0xe0 +#define MAS_CMD_READ_D1_MEM 0xf0 -#if CONFIG_CODEC == MAS3507D +/* MAS3507D D0 memmory cells */ +#define MAS_D0_MPEG_FRAME_COUNT 0x300 +#define MAS_D0_MPEG_STATUS_1 0x301 +#define MAS_D0_MPEG_STATUS_2 0x302 +#define MAS_D0_CRC_ERROR_COUNT 0x303 +#define MAS_D0_OUT_LL 0x7f8 +#define MAS_D0_OUT_LR 0x7f9 +#define MAS_D0_OUT_RL 0x7fa +#define MAS_D0_OUT_RR 0x7fb + +#define VOLUME_MIN -780 +#define VOLUME_MAX 180 +#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | PRESCALER_CAP) static const unsigned int bass_table[] = { @@ -136,6 +164,112 @@ static const unsigned int prescale_table[] = 0xe6800, /* 14dB */ 0xe9400 /* 15dB */ }; -#endif /*CONFIG_CODEC == MAS3507D*/ + +#else /* CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F */ + +/* I2C defines */ +#define MAS_ADR 0x3c +#define MAS_DEV_WRITE (MAS_ADR | 0x00) +#define MAS_DEV_READ (MAS_ADR | 0x01) + +/* MAS3587F/MAS3539F registers */ +#define MAS_DATA_WRITE 0x68 +#define MAS_DATA_READ 0x69 +#define MAS_CODEC_WRITE 0x6c +#define MAS_CODEC_READ 0x6d +#define MAS_CONTROL 0x6a +#define MAS_DCCF 0x76 +#define MAS_DCFR 0x77 + +#define MAS_REG_KMDB_SWITCH 0x21 +#define MAS_REG_KMDB_STR 0x22 +#define MAS_REG_KMDB_HAR 0x23 +#define MAS_REG_KMDB_FC 0x24 +#define MAS_REG_KLOUDNESS 0x1e +#define MAS_REG_QPEAK_L 0x0a +#define MAS_REG_QPEAK_R 0x0b +#define MAS_REG_DQPEAK_L 0x0c +#define MAS_REG_DQPEAK_R 0x0d +#define MAS_REG_VOLUME_CONTROL 0x10 +#define MAS_REG_BALANCE 0x11 +#define MAS_REG_KAVC 0x12 +#define MAS_REG_KBASS 0x14 +#define MAS_REG_KTREBLE 0x15 + +/* MAS3587F/MAS3539F commands */ +#define MAS_CMD_READ_ANCILLARY 0x50 +#define MAS_CMD_FAST_PRG_DL 0x60 +#define MAS_CMD_READ_IC_VER 0x70 +#define MAS_CMD_READ_REG 0xa0 +#define MAS_CMD_WRITE_REG 0xb0 +#define MAS_CMD_READ_D0_MEM 0xc0 +#define MAS_CMD_READ_D1_MEM 0xd0 +#define MAS_CMD_WRITE_D0_MEM 0xe0 +#define MAS_CMD_WRITE_D1_MEM 0xf0 + +/* MAS3587F D0 memory cells */ +#if CONFIG_CODEC == MAS3587F +#define MAS_D0_APP_SELECT 0x7f6 +#define MAS_D0_APP_RUNNING 0x7f7 +#define MAS_D0_ENCODER_CONTROL 0x7f0 +#define MAS_D0_IO_CONTROL_MAIN 0x7f1 +#define MAS_D0_INTERFACE_CONTROL 0x7f2 +#define MAS_D0_OFREQ_CONTROL 0x7f3 +#define MAS_D0_OUT_CLK_CONFIG 0x7f4 +#define MAS_D0_SPD_OUT_BITS 0x7f8 +#define MAS_D0_SOFT_MUTE 0x7f9 +#define MAS_D0_OUT_LL 0x7fc +#define MAS_D0_OUT_LR 0x7fd +#define MAS_D0_OUT_RL 0x7fe +#define MAS_D0_OUT_RR 0x7ff +#define MAS_D0_MPEG_FRAME_COUNT 0xfd0 +#define MAS_D0_MPEG_STATUS_1 0xfd1 +#define MAS_D0_MPEG_STATUS_2 0xfd2 +#define MAS_D0_CRC_ERROR_COUNT 0xfd3 + +/* MAS3539F D0 memory cells */ +#elif CONFIG_CODEC == MAS3539F +#define MAS_D0_APP_SELECT 0x34b +#define MAS_D0_APP_RUNNING 0x34c +/* no encoder :( */ +#define MAS_D0_IO_CONTROL_MAIN 0x346 +#define MAS_D0_INTERFACE_CONTROL 0x347 +#define MAS_D0_OFREQ_CONTROL 0x348 +#define MAS_D0_OUT_CLK_CONFIG 0x349 +#define MAS_D0_SPD_OUT_BITS 0x351 +#define MAS_D0_SOFT_MUTE 0x350 +#define MAS_D0_OUT_LL 0x354 +#define MAS_D0_OUT_LR 0x355 +#define MAS_D0_OUT_RL 0x356 +#define MAS_D0_OUT_RR 0x357 +#define MAS_D0_MPEG_FRAME_COUNT 0xfd0 +#define MAS_D0_MPEG_STATUS_1 0xfd1 +#define MAS_D0_MPEG_STATUS_2 0xfd2 +#define MAS_D0_CRC_ERROR_COUNT 0xfd3 +#endif + +/* MAS3587F and MAS3539F handle clipping prevention internally so we do not need + * the prescaler -> CLIPPING_CAP + */ + +#define VOLUME_MIN -400 +#define VOLUME_MAX 600 +#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | BALANCE_CAP | CLIPPING_CAP) + +#endif /* CONFIG_CODEC */ + +/* Function prototypes */ +#if CONFIG_CODEC == MAS3587F || CONFIG_CODEC == MAS3539F +extern void audiohw_set_loudness(int value); +extern void audiohw_set_avc(int value); +extern void audiohw_set_mdb_strength(int value); +extern void audiohw_set_mdb_harmonics(int value); +extern void audiohw_set_mdb_center(int value); +extern void audiohw_set_mdb_shape(int value); +extern void audiohw_set_mdb_enable(int value); +extern void audiohw_set_superbass(int value); +extern void audiohw_set_balance(int val); +extern void audiohw_set_pitch(unsigned long val); +#endif #endif /* _MAS35XX_H */ diff --git a/firmware/export/mascodec.h b/firmware/export/mascodec.h new file mode 100644 index 0000000..82a71e3 --- /dev/null +++ b/firmware/export/mascodec.h @@ -0,0 +1,43 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id: mas.h 24154 2010-01-03 10:27:43Z Buschel $ + * + * Copyright (C) 2002 by Linus Nielsen Feltzing + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#ifndef _MASCODEC_H_ +#define _MASCODEC_H_ + +int mas_default_read(unsigned short *buf); +int mas_run(unsigned short address); +int mas_readmem(int bank, int addr, unsigned long* dest, int len); +int mas_writemem(int bank, int addr, const unsigned long* src, int len); +int mas_readreg(int reg); +int mas_writereg(int reg, unsigned int val); +void mas_reset(void); +int mas_direct_config_read(unsigned char reg); +int mas_direct_config_write(unsigned char reg, unsigned int val); +int mas_codec_writereg(int reg, unsigned int val); +int mas_codec_readreg(int reg); +unsigned long mas_readver(void); + +#endif + +#if CONFIG_TUNER & S1A0903X01 +void mas_store_pllfreq(int freq); +int mas_get_pllfreq(void); +#endif + diff --git a/firmware/sound.c b/firmware/sound.c index bede186..82d5cdf 100644 --- a/firmware/sound.c +++ b/firmware/sound.c @@ -26,16 +26,17 @@ #include "logf.h" #include "system.h" #include "i2c.h" -#include "mas.h" #if (CONFIG_PLATFORM & PLATFORM_NATIVE) #if CONFIG_CPU == PNX0101 #include "pnx0101.h" -#endif -#include "dac.h" +#endif /* CONFIG_CPU == PNX101 */ #if CONFIG_CODEC == SWCODEC #include "pcm.h" +#else /* !CONFIG_CODEC == HWCODEC */ +#include "mas35xx.h" +#include "dac3550a.h" #endif -#endif +#endif /* !SIMULATOR */ /* TODO * find a nice way to handle 1.5db steps -> see wm8751 ifdef in sound_set_bass/treble @@ -162,18 +163,6 @@ void sound_set_dsp_callback(int (*func)(int, intptr_t)) } #endif -#if (CONFIG_CODEC == MAS3507D) && !defined(SIMULATOR) -/* convert tenth of dB volume (-780..+180) to dac3550 register value */ -static int tenthdb2reg(int db) -{ - if (db < -540) /* 3 dB steps */ - return (db + 780) / 30; - else /* 1.5 dB steps */ - return (db + 660) / 15; -} -#endif - - #if !defined(AUDIOHW_HAVE_CLIPPING) /* * The prescaler compensates for any kind of boosts, to prevent clipping. @@ -282,12 +271,6 @@ static void set_prescaled_volume(void) } #endif /* (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 */ - -#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) -static unsigned long mdb_shape_shadow = 0; -static unsigned long loudness_shadow = 0; -#endif - void sound_set_volume(int value) { if(!audio_is_initialized) @@ -620,86 +603,64 @@ void sound_set_loudness(int value) { if(!audio_is_initialized) return; - loudness_shadow = (loudness_shadow & 0x04) | - (MAX(MIN(value * 4, 0x44), 0) << 8); - mas_codec_writereg(MAS_REG_KLOUDNESS, loudness_shadow); + + audiohw_set_loudness(value); } void sound_set_avc(int value) { if(!audio_is_initialized) return; - int tmp; - static const uint16_t avc_vals[] = - { - (0x1 << 8) | (0x8 << 12), /* 20ms */ - (0x2 << 8) | (0x8 << 12), /* 2s */ - (0x4 << 8) | (0x8 << 12), /* 4s */ - (0x8 << 8) | (0x8 << 12), /* 8s */ - }; - switch (value) { - case 1: - case 2: - case 3: - case 4: - tmp = avc_vals[value -1]; - break; - case -1: /* turn off and then turn on again to decay quickly */ - tmp = mas_codec_readreg(MAS_REG_KAVC); - mas_codec_writereg(MAS_REG_KAVC, 0); - break; - default: /* off */ - tmp = 0; - break; - } - mas_codec_writereg(MAS_REG_KAVC, tmp); + audiohw_set_avc(value); } void sound_set_mdb_strength(int value) { if(!audio_is_initialized) return; - mas_codec_writereg(MAS_REG_KMDB_STR, (value & 0x7f) << 8); + + audiohw_set_mdb_strength(value); } void sound_set_mdb_harmonics(int value) { if(!audio_is_initialized) return; - int tmp = value * 127 / 100; - mas_codec_writereg(MAS_REG_KMDB_HAR, (tmp & 0x7f) << 8); + + audiohw_set_mdb_harmonics(value); } void sound_set_mdb_center(int value) { if(!audio_is_initialized) return; - mas_codec_writereg(MAS_REG_KMDB_FC, (value/10) << 8); + + audiohw_set_mdb_center(value); } void sound_set_mdb_shape(int value) { if(!audio_is_initialized) return; - mdb_shape_shadow = (mdb_shape_shadow & 0x02) | ((value/10) << 8); - mas_codec_writereg(MAS_REG_KMDB_SWITCH, mdb_shape_shadow); + + audiohw_set_mdb_shape(value); } void sound_set_mdb_enable(int value) { if(!audio_is_initialized) return; - mdb_shape_shadow = (mdb_shape_shadow & ~0x02) | (value?2:0); - mas_codec_writereg(MAS_REG_KMDB_SWITCH, mdb_shape_shadow); + + audiohw_set_mdb_enable(value); } void sound_set_superbass(int value) { if(!audio_is_initialized) return; - loudness_shadow = (loudness_shadow & ~0x04) | (value?4:0); - mas_codec_writereg(MAS_REG_KLOUDNESS, loudness_shadow); + + audiohw_set_superbass(value); } #endif /* (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) */ @@ -847,11 +808,7 @@ void sound_set_pitch(int32_t pitch) /* Calculate the new (bogus) frequency */ val = 18432 * PITCH_SPEED_100 / pitch; - mas_writemem(MAS_BANK_D0, MAS_D0_OFREQ_CONTROL, &val, 1); - - /* We must tell the MAS that the frequency has changed. - * This will unfortunately cause a short silence. */ - mas_writemem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN, &shadow_io_control_main, 1); + audiohw_set_pitch(val); last_pitch = pitch; } diff --git a/firmware/mp3_playback.c b/firmware/target/sh/archos/audio-archos.c index 8e19829..e2d8b6f 100644 --- a/firmware/mp3_playback.c +++ b/firmware/target/sh/archos/audio-archos.c @@ -28,12 +28,8 @@ #include <kernel.h> #include "mp3_playback.h" #include "sound.h" -#ifndef SIMULATOR #include "i2c.h" -#include "mas.h" -#include "dac.h" #include "system.h" -#endif #include "audiohw.h" /* hacking into mpeg.c, recording is still there */ @@ -56,14 +52,12 @@ extern unsigned shadow_codec_reg0; static bool paused; /* playback is paused */ static bool playing; /* We are playing an MP3 stream */ -#ifndef SIMULATOR /* for measuring the play time */ static long playstart_tick; static long cumulative_ticks; /* the registered callback function to ask for more mp3 data */ static void (*callback_for_more)(unsigned char**, size_t*); -#endif /* #ifndef SIMULATOR */ /* list of tracks in memory */ #define MAX_ID3_TAGS (1<<4) /* Must be power of 2 */ @@ -77,8 +71,6 @@ bool audio_is_initialized = false; extern void playback_tick(void); extern void rec_tick(void); -#ifndef SIMULATOR - unsigned long mas_version_code; #if CONFIG_CODEC == MAS3507D @@ -133,7 +125,6 @@ static void postpone_dma_tick(void) } #endif - #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) void demand_irq_enable(bool on) { @@ -328,7 +319,6 @@ static void init_playback(void) DEBUGF("MAS Decoding application started\n"); } #endif /* #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) */ -#endif /* SIMULATOR */ void mp3_init(int volume, int bass, int treble, int balance, int loudness, int avc, int channel_config, int stereo_width, @@ -336,23 +326,6 @@ void mp3_init(int volume, int bass, int treble, int balance, int loudness, int mdb_center, int mdb_shape, bool mdb_enable, bool superbass) { -#ifdef SIMULATOR - (void)volume; - (void)bass; - (void)treble; - (void)balance; - (void)loudness; - (void)avc; - (void)channel_config; - (void)stereo_width; - (void)mdb_strength; - (void)mdb_harmonics; - (void)mdb_center; - (void)mdb_shape; - (void)mdb_enable; - (void)superbass; - audio_is_initialized = true; -#else #if CONFIG_CODEC == MAS3507D unsigned long val; (void)loudness; @@ -469,7 +442,6 @@ void mp3_init(int volume, int bass, int treble, int balance, int loudness, sound_set(SOUND_MDB_ENABLE, mdb_enable); sound_set(SOUND_SUPERBASS, superbass); #endif -#endif /* !SIMULATOR */ playing = false; paused = true; @@ -477,7 +449,6 @@ void mp3_init(int volume, int bass, int treble, int balance, int loudness, void mp3_shutdown(void) { -#ifndef SIMULATOR #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) unsigned long val = 1; mas_writemem(MAS_BANK_D0, MAS_D0_SOFT_MUTE, &val, 1); /* Mute */ @@ -486,14 +457,10 @@ void mp3_shutdown(void) #if CONFIG_CODEC == MAS3507D dac_volume(0, 0, false); #endif - -#endif } /* new functions, to be exported to plugin API */ -#ifndef SIMULATOR - void mp3_play_init(void) { #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) @@ -594,25 +561,3 @@ unsigned char* mp3_get_pos(void) { return (unsigned char*)SAR3; } -#else /* #ifndef SIMULATOR */ - -void mp3_play_pause(bool play) -{ - (void)play; -} -void mp3_play_stop(void) -{ -} - -unsigned char* mp3_get_pos(void) -{ - return NULL; -} - -void mp3_play_data(const unsigned char* start, int size, - void (*get_more)(unsigned char** start, size_t* size) /* callback fn */ -) -{ - (void)start; (void)size; (void)get_more; -} -#endif diff --git a/firmware/drivers/mas.c b/firmware/target/sh/archos/mascodec-archos.c index 4f384d3..3f93216 100644 --- a/firmware/drivers/mas.c +++ b/firmware/target/sh/archos/mascodec-archos.c @@ -5,7 +5,7 @@ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ - * $Id$ + * $Id: mas.c 18807 2008-10-14 11:12:20Z zagor $ * * Copyright (C) 2002 by Linus Nielsen Feltzing * @@ -23,7 +23,7 @@ #include "sh7034.h" #include "i2c.h" #include "debug.h" -#include "mas.h" +#include "mas35xx.h" #include "kernel.h" #include "system.h" #include "hwcompat.h" diff --git a/firmware/test/i2c/main.c b/firmware/test/i2c/main.c index ad0f8ef..7a2ff49 100644 --- a/firmware/test/i2c/main.c +++ b/firmware/test/i2c/main.c @@ -46,9 +46,9 @@ #include "i2c.h" -#include "mas.h" +#include "mas35xx.h" -#include "dac.h" +#include "dac3550a.h" #include "sh7034.h" |