diff options
author | Dave Chapman <dave@dchapman.com> | 2006-01-30 21:12:31 +0000 |
---|---|---|
committer | Dave Chapman <dave@dchapman.com> | 2006-01-30 21:12:31 +0000 |
commit | 5ffa8c52df2df1096c484efe6815ea8e8b548065 (patch) | |
tree | c9add96d65013bfced444a7b77f9c09b8dc785a4 /firmware | |
parent | 1a4ef4fc0aa7a6257995f5df51f686c726802e5b (diff) | |
download | rockbox-5ffa8c52df2df1096c484efe6815ea8e8b548065.tar.gz rockbox-5ffa8c52df2df1096c484efe6815ea8e8b548065.zip |
iPod: Initial attempt at volume/bass/treble control - more work is needed, but it seems to be working.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8495 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/drivers/wm8975.c | 15 | ||||
-rw-r--r-- | firmware/sound.c | 74 |
2 files changed, 70 insertions, 19 deletions
diff --git a/firmware/drivers/wm8975.c b/firmware/drivers/wm8975.c index 802bcfa72b..a817284406 100644 --- a/firmware/drivers/wm8975.c +++ b/firmware/drivers/wm8975.c | |||
@@ -196,14 +196,25 @@ int wm8975_set_mixer_vol(int channel1, int channel2) | |||
196 | return 0; | 196 | return 0; |
197 | } | 197 | } |
198 | 198 | ||
199 | /* We are using Linear bass control */ | ||
199 | void wm8975_set_bass(int value) | 200 | void wm8975_set_bass(int value) |
200 | { | 201 | { |
201 | (void)value; | 202 | int regvalues[]={11, 10, 10, 9, 8, 8, 0xf , 6, 6, 5, 4, 4, 3, 2, 1, 0}; |
203 | |||
204 | if ((value >= -6) && (value <= 9)) { | ||
205 | /* We use linear bass control with 130Hz cutoff */ | ||
206 | ipod_i2c_send(0x1a, 0x0c << 1, regvalues[value+6]); | ||
207 | } | ||
202 | } | 208 | } |
203 | 209 | ||
204 | void wm8975_set_treble(int value) | 210 | void wm8975_set_treble(int value) |
205 | { | 211 | { |
206 | (void)value; | 212 | int regvalues[]={11, 10, 10, 9, 8, 8, 0xf , 6, 6, 5, 4, 4, 3, 2, 1, 0}; |
213 | |||
214 | if ((value >= -6) && (value <= 9)) { | ||
215 | /* We use a 8Khz cutoff */ | ||
216 | ipod_i2c_send(0x1a, 0x0d << 1, regvalues[value+6]); | ||
217 | } | ||
207 | } | 218 | } |
208 | 219 | ||
209 | int wm8975_mute(int mute) | 220 | int wm8975_mute(int mute) |
diff --git a/firmware/sound.c b/firmware/sound.c index 555280c3d5..41212e72b9 100644 --- a/firmware/sound.c +++ b/firmware/sound.c | |||
@@ -20,11 +20,14 @@ | |||
20 | #include <stdio.h> | 20 | #include <stdio.h> |
21 | #include "config.h" | 21 | #include "config.h" |
22 | #include "sound.h" | 22 | #include "sound.h" |
23 | #include "logf.h" | ||
23 | #ifndef SIMULATOR | 24 | #ifndef SIMULATOR |
24 | #include "i2c.h" | 25 | #include "i2c.h" |
25 | #include "mas.h" | 26 | #include "mas.h" |
26 | #ifdef HAVE_UDA1380 | 27 | #ifdef HAVE_UDA1380 |
27 | #include "uda1380.h" | 28 | #include "uda1380.h" |
29 | #elif defined(HAVE_WM8975) | ||
30 | #include "wm8975.h" | ||
28 | #elif HAVE_TLV320 | 31 | #elif HAVE_TLV320 |
29 | #include "tlv320.h" | 32 | #include "tlv320.h" |
30 | #endif | 33 | #endif |
@@ -64,6 +67,10 @@ static const struct sound_settings_info sound_settings_table[] = { | |||
64 | [SOUND_VOLUME] = {"dB", 0, 1, -84, 0, -25, sound_set_volume}, | 67 | [SOUND_VOLUME] = {"dB", 0, 1, -84, 0, -25, sound_set_volume}, |
65 | [SOUND_BASS] = {"dB", 0, 2, 0, 24, 0, sound_set_bass}, | 68 | [SOUND_BASS] = {"dB", 0, 2, 0, 24, 0, sound_set_bass}, |
66 | [SOUND_TREBLE] = {"dB", 0, 2, 0, 6, 0, sound_set_treble}, | 69 | [SOUND_TREBLE] = {"dB", 0, 2, 0, 6, 0, sound_set_treble}, |
70 | #elif defined(HAVE_WM8975) | ||
71 | [SOUND_VOLUME] = {"dB", 0, 1, -73, 6, -25, sound_set_volume}, | ||
72 | [SOUND_BASS] = {"dB", 0, 1, -6, 9, 0, sound_set_bass}, | ||
73 | [SOUND_TREBLE] = {"dB", 0, 1, -6, 9, 0, sound_set_treble}, | ||
67 | #else /* MAS3507D */ | 74 | #else /* MAS3507D */ |
68 | [SOUND_VOLUME] = {"dB", 0, 1, -78, 18, -18, sound_set_volume}, | 75 | [SOUND_VOLUME] = {"dB", 0, 1, -78, 18, -18, sound_set_volume}, |
69 | [SOUND_BASS] = {"dB", 0, 1, -15, 15, 7, sound_set_bass}, | 76 | [SOUND_BASS] = {"dB", 0, 1, -15, 15, 7, sound_set_bass}, |
@@ -269,9 +276,42 @@ static int tenthdb2mixer(int db) | |||
269 | return -db * 2 / 5; | 276 | return -db * 2 / 5; |
270 | } | 277 | } |
271 | 278 | ||
279 | #elif defined(HAVE_WM8975) /* volume/balance/treble/bass interdependency */ | ||
280 | #define VOLUME_MIN -730 | ||
281 | #define VOLUME_MAX 60 | ||
282 | |||
283 | /* convert tenth of dB volume (-730..60) to master volume register value */ | ||
284 | static int tenthdb2master(int db) | ||
285 | { | ||
286 | /* +6 to -73dB 1dB steps (plus mute == 80levels) 7bits */ | ||
287 | /* 1111111 == +6dB (0x7f) */ | ||
288 | /* 1111001 == 0dB (0x79) */ | ||
289 | /* 0110000 == -73dB (0x30 */ | ||
290 | /* 0101111 == mute (0x2f) */ | ||
291 | |||
292 | if (db <= -730) { | ||
293 | return 0x2f; | ||
294 | } else { | ||
295 | return((db/10)+74+0x2f); | ||
296 | } | ||
297 | } | ||
298 | |||
299 | /* convert tenth of dB volume (-780..0) to mixer volume register value */ | ||
300 | static int tenthdb2mixer(int db) | ||
301 | { | ||
302 | if (db < -660) /* 1.5 dB steps */ | ||
303 | return (2640 - db) / 15; | ||
304 | else if (db < -600) /* 0.75 dB steps */ | ||
305 | return (990 - db) * 2 / 15; | ||
306 | else if (db < -460) /* 0.5 dB steps */ | ||
307 | return (460 - db) / 5; | ||
308 | else /* 0.25 dB steps */ | ||
309 | return -db * 2 / 5; | ||
310 | } | ||
311 | |||
272 | #endif | 312 | #endif |
273 | 313 | ||
274 | #if (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 | 314 | #if (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 || defined HAVE_WM8975 |
275 | /* volume/balance/treble/bass interdependency main part */ | 315 | /* volume/balance/treble/bass interdependency main part */ |
276 | #define VOLUME_RANGE (VOLUME_MAX - VOLUME_MIN) | 316 | #define VOLUME_RANGE (VOLUME_MAX - VOLUME_MIN) |
277 | 317 | ||
@@ -299,8 +339,10 @@ static void set_prescaled_volume(void) | |||
299 | 339 | ||
300 | #if CONFIG_CODEC == MAS3507D | 340 | #if CONFIG_CODEC == MAS3507D |
301 | mas_writereg(MAS_REG_KPRESCALE, prescale_table[prescale/10]); | 341 | mas_writereg(MAS_REG_KPRESCALE, prescale_table[prescale/10]); |
302 | #else /* UDA1380 */ | 342 | #elif defined(HAVE_UDA1380) |
303 | uda1380_set_mixer_vol(tenthdb2mixer(-prescale), tenthdb2mixer(-prescale)); | 343 | uda1380_set_mixer_vol(tenthdb2mixer(-prescale), tenthdb2mixer(-prescale)); |
344 | #elif defined(HAVE_WM8975) | ||
345 | wm8975_set_mixer_vol(tenthdb2mixer(-prescale), tenthdb2mixer(-prescale)); | ||
304 | #endif | 346 | #endif |
305 | 347 | ||
306 | if (current_volume == VOLUME_MIN) | 348 | if (current_volume == VOLUME_MIN) |
@@ -323,8 +365,10 @@ static void set_prescaled_volume(void) | |||
323 | 365 | ||
324 | #if CONFIG_CODEC == MAS3507D | 366 | #if CONFIG_CODEC == MAS3507D |
325 | dac_volume(tenthdb2reg(l), tenthdb2reg(r), false); | 367 | dac_volume(tenthdb2reg(l), tenthdb2reg(r), false); |
326 | #else /* UDA1380 */ | 368 | #elif defined(HAVE_UDA1380) |
327 | uda1380_set_master_vol(tenthdb2master(l), tenthdb2master(r)); | 369 | uda1380_set_master_vol(tenthdb2master(l), tenthdb2master(r)); |
370 | #elif defined(HAVE_WM8975) | ||
371 | wm8975_set_master_vol(tenthdb2master(l), tenthdb2master(r)); | ||
328 | #endif | 372 | #endif |
329 | } | 373 | } |
330 | #endif /* (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 */ | 374 | #endif /* (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 */ |
@@ -424,12 +468,9 @@ void sound_set_volume(int value) | |||
424 | #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) | 468 | #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) |
425 | unsigned tmp = ((unsigned)(value + 115) & 0xff) << 8; | 469 | unsigned tmp = ((unsigned)(value + 115) & 0xff) << 8; |
426 | mas_codec_writereg(0x10, tmp); | 470 | mas_codec_writereg(0x10, tmp); |
427 | #elif (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 | 471 | #elif (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 || defined HAVE_WM8975 |
428 | current_volume = value * 10; /* tenth of dB */ | 472 | current_volume = value * 10; /* tenth of dB */ |
429 | set_prescaled_volume(); | 473 | set_prescaled_volume(); |
430 | #elif (CONFIG_CPU == PP5020) | ||
431 | /* TODO: Implement sound_set_volume() */ | ||
432 | (void)value; | ||
433 | #endif | 474 | #endif |
434 | } | 475 | } |
435 | 476 | ||
@@ -440,12 +481,9 @@ void sound_set_balance(int value) | |||
440 | #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) | 481 | #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) |
441 | unsigned tmp = ((unsigned)(value * 127 / 100) & 0xff) << 8; | 482 | unsigned tmp = ((unsigned)(value * 127 / 100) & 0xff) << 8; |
442 | mas_codec_writereg(0x11, tmp); | 483 | mas_codec_writereg(0x11, tmp); |
443 | #elif CONFIG_CODEC == MAS3507D || defined HAVE_UDA1380 | 484 | #elif CONFIG_CODEC == MAS3507D || defined HAVE_UDA1380 || defined HAVE_WM8975 |
444 | current_balance = value * VOLUME_RANGE / 100; /* tenth of dB */ | 485 | current_balance = value * VOLUME_RANGE / 100; /* tenth of dB */ |
445 | set_prescaled_volume(); | 486 | set_prescaled_volume(); |
446 | #elif (CONFIG_CPU == PP5020) | ||
447 | /* TODO: Implement sound_set_balance() */ | ||
448 | (void)value; | ||
449 | #endif | 487 | #endif |
450 | } | 488 | } |
451 | 489 | ||
@@ -464,9 +502,10 @@ void sound_set_bass(int value) | |||
464 | uda1380_set_bass(value >> 1); | 502 | uda1380_set_bass(value >> 1); |
465 | current_bass = value * 10; | 503 | current_bass = value * 10; |
466 | set_prescaled_volume(); | 504 | set_prescaled_volume(); |
467 | #elif (CONFIG_CPU == PP5020) | 505 | #elif defined(HAVE_WM8975) |
468 | /* TODO: Implement sound_set_bass() */ | 506 | current_bass = value * 10; |
469 | (void)value; | 507 | wm8975_set_bass(value); |
508 | set_prescaled_volume(); | ||
470 | #endif | 509 | #endif |
471 | } | 510 | } |
472 | 511 | ||
@@ -485,9 +524,10 @@ void sound_set_treble(int value) | |||
485 | uda1380_set_treble(value >> 1); | 524 | uda1380_set_treble(value >> 1); |
486 | current_treble = value * 10; | 525 | current_treble = value * 10; |
487 | set_prescaled_volume(); | 526 | set_prescaled_volume(); |
488 | #elif (CONFIG_CPU == PP5020) | 527 | #elif defined(HAVE_WM8975) |
489 | /* TODO: Implement sound_set_treble() */ | 528 | wm8975_set_treble(value); |
490 | (void)value; | 529 | current_treble = value * 10; |
530 | set_prescaled_volume(); | ||
491 | #endif | 531 | #endif |
492 | } | 532 | } |
493 | 533 | ||