summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Nielsen Feltzing <linus@haxx.se>2006-03-28 20:38:05 +0000
committerLinus Nielsen Feltzing <linus@haxx.se>2006-03-28 20:38:05 +0000
commita7db6e302f90ea9c0d6ae809f06981b5956c8d68 (patch)
treebe93aafcf819ee0b7bc787c5d5cbf2ff2ad89027
parentd1a93d8a0c508adce8cf12cec823b675260f2896 (diff)
downloadrockbox-a7db6e302f90ea9c0d6ae809f06981b5956c8d68.zip
rockbox-a7db6e302f90ea9c0d6ae809f06981b5956c8d68.tar.gz
rockbox-a7db6e302f90ea9c0d6ae809f06981b5956c8d68.tar.bz2
rockbox-a7db6e302f90ea9c0d6ae809f06981b5956c8d68.tar.xz
First quick'n'dirty volume control for the iAudio X5
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9327 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/sound.c32
1 files changed, 30 insertions, 2 deletions
diff --git a/firmware/sound.c b/firmware/sound.c
index 47a749f..47271f3 100644
--- a/firmware/sound.c
+++ b/firmware/sound.c
@@ -71,6 +71,10 @@ static const struct sound_settings_info sound_settings_table[] = {
[SOUND_VOLUME] = {"dB", 0, 1, -84, 0, -25, sound_set_volume},
[SOUND_BASS] = {"dB", 0, 2, 0, 24, 0, sound_set_bass},
[SOUND_TREBLE] = {"dB", 0, 2, 0, 6, 0, sound_set_treble},
+#elif defined(HAVE_TLV320)
+ [SOUND_VOLUME] = {"dB", 0, 1, -73, 0, 6, sound_set_volume},
+ [SOUND_BASS] = {"dB", 0, 2, 0, 24, 0, sound_set_bass},
+ [SOUND_TREBLE] = {"dB", 0, 2, 0, 6, 0, sound_set_treble},
#elif defined(HAVE_WM8975)
[SOUND_VOLUME] = {"dB", 0, 1, -74, 6, -25, sound_set_volume},
[SOUND_BASS] = {"dB", 0, 1, -6, 9, 0, sound_set_bass},
@@ -288,6 +292,26 @@ static int tenthdb2mixer(int db)
return -db * 2 / 5;
}
+#elif defined(HAVE_TLV320)
+#define VOLUME_MIN -730
+#define VOLUME_MAX 60
+
+/* convert tenth of dB volume (-840..0) to master volume register value */
+static int tenthdb2master(int db)
+{
+ /* +6 to -73dB 1dB steps (plus mute == 80levels) 7bits */
+ /* 1111111 == +6dB (0x7f) */
+ /* 1111001 == 0dB (0x79) */
+ /* 0110000 == -73dB (0x30 */
+ /* 0101111 == mute (0x2f) */
+
+ if (db < VOLUME_MIN) {
+ return 0x0;
+ } else {
+ return((db/10)+73+0x30);
+ }
+}
+
#elif defined(HAVE_WM8975)
/* volume/balance/treble/bass interdependency */
#define VOLUME_MIN -730
@@ -395,7 +419,8 @@ static int tenthdb2mixer(int db)
#endif
#if (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 || \
- defined HAVE_WM8975 || defined HAVE_WM8758 || defined(HAVE_WM8731)
+ defined HAVE_WM8975 || defined HAVE_WM8758 || defined(HAVE_WM8731) || \
+ defined(HAVE_TLV320)
/* volume/balance/treble/bass interdependency main part */
#define VOLUME_RANGE (VOLUME_MAX - VOLUME_MIN)
@@ -457,6 +482,8 @@ static void set_prescaled_volume(void)
wmcodec_set_lineout_vol(tenthdb2master(0), tenthdb2master(0));
#endif
+#elif defined(HAVE_TLV320)
+ tlv320_set_headphone_vol(tenthdb2master(l), tenthdb2master(r));
#endif
}
#endif /* (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 */
@@ -563,7 +590,8 @@ void sound_set_volume(int value)
unsigned tmp = ((unsigned)(value + 115) & 0xff) << 8;
mas_codec_writereg(0x10, tmp);
#elif (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 || \
- defined HAVE_WM8975 || defined HAVE_WM8758 || defined HAVE_WM8731
+ defined HAVE_WM8975 || defined HAVE_WM8758 || defined HAVE_WM8731 || \
+ defined(HAVE_TLV320)
current_volume = value * 10; /* tenth of dB */
set_prescaled_volume();
#elif CONFIG_CPU == PNX0101