summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2010-05-11 04:02:45 +0000
committerMichael Sevakis <jethead71@rockbox.org>2010-05-11 04:02:45 +0000
commit8ce5b01ec717a8ee1d765ec9c0d4d6f20868092e (patch)
tree00469290ec43bbf5493c14226d766a164b6562d6
parent7d21e5ab32ef24724c201b5ffc4df3a2637966e7 (diff)
downloadrockbox-8ce5b01ec717a8ee1d765ec9c0d4d6f20868092e.zip
rockbox-8ce5b01ec717a8ee1d765ec9c0d4d6f20868092e.tar.gz
rockbox-8ce5b01ec717a8ee1d765ec9c0d4d6f20868092e.tar.bz2
rockbox-8ce5b01ec717a8ee1d765ec9c0d4d6f20868092e.tar.xz
MRobe100, HD200, Gigabeat F/X (anything with wm8750 or wm8751). Properly prescale bass and treble controls to avoid clipping.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25940 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/drivers/audio/wm8751.c14
-rw-r--r--firmware/export/wm8751.h8
-rw-r--r--firmware/sound.c7
3 files changed, 21 insertions, 8 deletions
diff --git a/firmware/drivers/audio/wm8751.c b/firmware/drivers/audio/wm8751.c
index 1844182..e7c0b18 100644
--- a/firmware/drivers/audio/wm8751.c
+++ b/firmware/drivers/audio/wm8751.c
@@ -61,6 +61,8 @@ const struct sound_settings_info audiohw_settings[] = {
/* We use linear treble control with 4 kHz cutoff */
#define TREBCTRL_BITS (TREBCTRL_TC)
+static int prescaler = 0;
+
/* convert tenth of dB volume (-730..60) to master volume register value */
int tenthdb2master(int db)
{
@@ -173,6 +175,10 @@ void audiohw_postinit(void)
PWRMGMT2_ROUT2);
#endif
+ /* Full -0dB on the DACS */
+ wmcodec_write(LEFTGAIN, 0xff);
+ wmcodec_write(RIGHTGAIN, RIGHTGAIN_RDVU | 0xff);
+
wmcodec_write(ADDITIONAL1, ADDITIONAL1_TSDEN | ADDITIONAL1_TOEN |
ADDITIONAL1_DMONOMIX_LLRR | ADDITIONAL1_VSEL_DEFAULT);
@@ -249,6 +255,14 @@ void audiohw_set_treble(int value)
TREBCTRL_TREB(tone_tenthdb2hw(value)));
}
+void audiohw_set_prescaler(int value)
+{
+ prescaler = 2 * value;
+ wmcodec_write(LEFTGAIN, 0xff - (prescaler & LEFTGAIN_LDACVOL));
+ wmcodec_write(RIGHTGAIN, RIGHTGAIN_RDVU |
+ (0xff - (prescaler & RIGHTGAIN_RDACVOL)));
+}
+
/* Nice shutdown of WM8751 codec */
void audiohw_close(void)
{
diff --git a/firmware/export/wm8751.h b/firmware/export/wm8751.h
index fb7532b..8992c88 100644
--- a/firmware/export/wm8751.h
+++ b/firmware/export/wm8751.h
@@ -25,7 +25,7 @@
#define VOLUME_MIN -730
#define VOLUME_MAX 60
-#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP)
+#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | PRESCALER_CAP)
extern int tenthdb2master(int db);
@@ -96,12 +96,12 @@ void audiohw_set_recsrc(int source, bool recording);
#define CLOCKING_BCLK_DIV2 (1 << 7)
#define LEFTGAIN 0x0a
-#define LEFTGAIN_LDACVOL(x) ((x) & 0xff)
+#define LEFTGAIN_LDACVOL 0xff
#define LEFTGAIN_LDVU (1 << 8)
#define RIGHTGAIN 0x0b
-#define RIGHTGAIN_LDACVOL(x) ((x) & 0xff)
-#define RIGHTGAIN_LDVU (1 << 8)
+#define RIGHTGAIN_RDACVOL 0xff
+#define RIGHTGAIN_RDVU (1 << 8)
#define BASSCTRL 0x0c
#define BASSCTRL_BASS(x) ((x) & 0xf)
diff --git a/firmware/sound.c b/firmware/sound.c
index 4f95b6e..2973721 100644
--- a/firmware/sound.c
+++ b/firmware/sound.c
@@ -189,8 +189,7 @@ static void set_prescaled_volume(void)
*/
#if defined(HAVE_SW_TONE_CONTROLS) || !(defined(HAVE_WM8975) \
|| defined(HAVE_WM8711) || defined(HAVE_WM8721) || defined(HAVE_WM8731) \
- || defined(HAVE_WM8751) || defined(HAVE_WM8758) || defined(HAVE_WM8985) \
- || defined(HAVE_UDA1341))
+ || defined(HAVE_WM8758) || defined(HAVE_WM8985) || defined(HAVE_UDA1341))
prescale = MAX(current_bass, current_treble);
if (prescale < 0)
@@ -297,7 +296,7 @@ void sound_set_bass(int value)
#if !defined(AUDIOHW_HAVE_CLIPPING)
#if defined(HAVE_WM8750) || defined(HAVE_WM8751)
- current_bass = value;
+ current_bass = value / 15;
#else
current_bass = value * 10;
#endif
@@ -321,7 +320,7 @@ void sound_set_treble(int value)
#if !defined(AUDIOHW_HAVE_CLIPPING)
#if defined(HAVE_WM8750) || defined(HAVE_WM8751)
- current_treble = value;
+ current_treble = value / 15;
#else
current_treble = value * 10;
#endif