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
This commit is contained in:
Marcin Bukat 2010-10-31 21:09:34 +00:00
parent 40ed5f57d9
commit 56c4e9fa60
23 changed files with 452 additions and 364 deletions

View file

@ -36,7 +36,6 @@
#include "kernel.h"
#include "screens.h"
#include "misc.h"
#include "mas.h"
#include "codecs.h"
#include "lang.h"
#include "keyboard.h"

View file

@ -61,7 +61,6 @@
#include "rtc.h"
#include "storage.h"
#include "fat.h"
#include "mas.h"
#include "eeprom_24cxx.h"
#if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD)
#include "sdmmc.h"

View file

@ -49,7 +49,6 @@
#endif
#ifdef HAVE_RECORDING
#include "peakmeter.h"
#include "mas.h"
#endif
#include "splash.h"
#if CONFIG_CODEC == SWCODEC

View file

@ -45,7 +45,7 @@
#include "settings.h"
#ifndef SIMULATOR
#include "i2c.h"
#include "mas.h"
#include "mas35xx.h"
#include "system.h"
#include "usb.h"
#include "file.h"
@ -53,7 +53,7 @@
#endif /* !SIMULATOR */
#ifdef HAVE_LCD_BITMAP
#include "lcd.h"
#endif
#endif /* CONFIG_CODEC != SWCODEC */
#define MPEG_SWAP_CHUNKSIZE 0x2000
#define MPEG_HIGH_WATER 2 /* We leave 2 bytes empty because otherwise we

View file

@ -77,7 +77,7 @@ void* plugin_get_buffer(size_t *buffer_size);
#include "recording.h"
#endif
#else
#include "mas.h"
#include "mas35xx.h"
#endif /* CONFIG_CODEC == SWCODEC */
#include "settings.h"
#include "timer.h"

View file

@ -23,7 +23,6 @@
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include "mas.h"
#include "settings.h"
#include "button.h"
#include "status.h"

View file

@ -22,7 +22,6 @@
#if defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
#include <stdlib.h> /* sim uses rand for peakmeter simulation */
#endif
#include "mas.h"
#include "thread.h"
#include "kernel.h"
#include "settings.h"

View file

@ -22,6 +22,7 @@
#define __PEAKMETER_H__
#define PEAK_METER_FPS 20
#define MAX_PEAK 0x8000
/*#define PM_DEBUG */
#ifdef PM_DEBUG

View file

@ -42,7 +42,6 @@
#include "pcm_record.h"
#include "recording.h"
#include "mp3_playback.h"
#include "mas.h"
#include "button.h"
#include "kernel.h"
#include "settings.h"

View file

@ -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

View file

@ -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

View file

@ -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 */

View file

@ -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 */

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -25,28 +25,56 @@
#define _MAS35XX_H
#include "config.h"
#include "mascodec.h"
#define MAS_BANK_D0 0
#define MAS_BANK_D1 1
/* 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
#if CONFIG_CODEC == MAS3507D
/* I2C defines */
#define MAS_ADR 0x3a
#define MAS_DEV_WRITE (MAS_ADR | 0x00)
#define MAS_DEV_READ (MAS_ADR | 0x01)
/* MAS3507D registers */
#define MAS_DATA_WRITE 0x68
#define MAS_DATA_READ 0x69
#define MAS_CONTROL 0x6a
#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
/* 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)
#else /* CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F */
/* 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
#if CONFIG_CODEC == MAS3507D
static const unsigned int bass_table[] =
{
0x9e400, /* -15dB */
@ -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 */

View file

@ -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

View file

@ -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;
}

View file

@ -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

View file

@ -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"

View file

@ -46,9 +46,9 @@
#include "i2c.h"
#include "mas.h"
#include "mas35xx.h"
#include "dac.h"
#include "dac3550a.h"
#include "sh7034.h"

View file

@ -40,7 +40,113 @@ void audio_set_buffer_margin(int seconds)
{
(void)seconds;
}
#endif
/* firmware/target/sh/archos/audio-archos.c */
/* list of tracks in memory */
#define MAX_ID3_TAGS (1<<4) /* Must be power of 2 */
#define MAX_ID3_TAGS_MASK (MAX_ID3_TAGS - 1)
static bool paused; /* playback is paused */
static bool playing; /* We are playing an MP3 stream */
bool audio_is_initialized = false;
void mp3_init(int volume, int bass, int treble, int balance, int loudness,
int avc, int channel_config, int stereo_width,
int mdb_strength, int mdb_harmonics,
int mdb_center, int mdb_shape, bool mdb_enable,
bool superbass)
{
(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;
playing = false;
paused = true;
}
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;
}
/* firmware/drivers/audio/mas35xx.c */
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
void audiohw_set_loudness(int value)
{
(void)value;
}
void audiohw_set_avc(int value)
{
(void)value;
}
void audiohw_set_mdb_strength(int value)
{
(void)value;
}
void audiohw_set_mdb_harmonics(int value)
{
(void)value;
}
void audiohw_set_mdb_center(int value)
{
(void)value;
}
void audiohw_set_mdb_shape(int value)
{
(void)value;
}
void audiohw_set_mdb_enable(int value)
{
(void)value;
}
void audiohw_set_superbass(int value)
{
(void)value;
}
void audiohw_set_pitch(unsigned long value)
{
(void)value;
}
#endif /* (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) */
#endif /* CODEC != SWCODEC */
int fat_startsector(void)
{