From 726dcd5d5fe79a9206c48ad45925e3eaaacb387a Mon Sep 17 00:00:00 2001 From: Buschel Date: Sat, 23 Jan 2010 19:28:26 +0000 Subject: [PATCH] Commit FS#10082, enlarge volume control range for WM8758. This will enable volume control down to -90 dB for iPod Video targets. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@24318 a1c6a512-1295-4272-9138-f99709370657 --- firmware/drivers/audio/wm8758.c | 66 ++++++++++++++++++++++++----- firmware/export/wm8758.h | 2 +- manual/configure_rockbox/sound_settings.tex | 6 ++- 3 files changed, 61 insertions(+), 13 deletions(-) diff --git a/firmware/drivers/audio/wm8758.c b/firmware/drivers/audio/wm8758.c index bb05960ce..715c921e3 100644 --- a/firmware/drivers/audio/wm8758.c +++ b/firmware/drivers/audio/wm8758.c @@ -33,7 +33,7 @@ #include "audiohw.h" const struct sound_settings_info audiohw_settings[] = { - [SOUND_VOLUME] = {"dB", 0, 1, -58, 6, -25}, + [SOUND_VOLUME] = {"dB", 0, 1, -90, 6, -25}, [SOUND_BASS] = {"dB", 0, 1, -12, 12, 0}, [SOUND_TREBLE] = {"dB", 0, 1, -12, 12, 0}, [SOUND_BALANCE] = {"%", 0, 1,-100, 100, 0}, @@ -52,13 +52,46 @@ const struct sound_settings_info audiohw_settings[] = { static unsigned short eq1_reg = EQ1_EQ3DMODE | EQ_GAIN_VALUE(0); static unsigned short eq5_reg = EQ_GAIN_VALUE(0); -/* convert tenth of dB volume (-57..6) to master volume register value */ +/* convert tenth of dB volume (-89..6) to master volume register value */ int tenthdb2master(int db) { + /* att DAC AMP result + +6dB 0 +6 96 + 0dB 0 0 90 + -57dB 0 -57 33 + -58dB -1 -57 32 + -89dB -32 -57 1 + -90dB -oo -oo 0 */ if (db < VOLUME_MIN) { - return 0x40; + return 0; } else { - return (db/10)+57; + return (db-VOLUME_MIN)/10 + 1; + } +} + +/* helper function that calculates the register setting for amplifier and + DAC volume out of the input from tenthdb2master() */ +static void get_volume_params(int db, int *dac, int *amp) +{ + /* should never happen, set max volume for amp and dac */ + if (db > 96) { + *dac = 255; + *amp = 63; + } + /* set dac to max and set volume for amp (better snr) */ + else if (db > 32) { + *dac = 255; + *amp = (db-90)+57; + } + /* set amp to min and reduce dac output */ + else if (db > 0) { + *dac = (db-33)*2 + 255; + *amp = 0; + } + /* mute all */ + else { + *dac = 0x00; + *amp = 0x40; } } @@ -123,16 +156,29 @@ void audiohw_postinit(void) void audiohw_set_master_vol(int vol_l, int vol_r) { - /* OUT1 */ - wmcodec_write(LOUT1VOL, LOUT1VOL_LOUT1ZC | vol_l); - wmcodec_write(ROUT1VOL, ROUT1VOL_OUT1VU | ROUT1VOL_ROUT1ZC | vol_r); + int dac_l, amp_l, dac_r, amp_r; + get_volume_params(vol_l, &dac_l, &_l); + get_volume_params(vol_r, &dac_r, &_r); + + /* set DAC + Important: DAC is global and will also affect lineout */ + wmcodec_write(LDACVOL, dac_l); + wmcodec_write(RDACVOL, dac_r | RDACVOL_DACVU); + + /* set headphone amp OUT1 */ + wmcodec_write(LOUT1VOL, amp_l | LOUT1VOL_LOUT1ZC); + wmcodec_write(ROUT1VOL, amp_r | ROUT1VOL_ROUT1ZC | ROUT1VOL_OUT1VU); } void audiohw_set_lineout_vol(int vol_l, int vol_r) { - /* OUT2 */ - wmcodec_write(LOUT2VOL, LOUT2VOL_LOUT2ZC | vol_l); - wmcodec_write(ROUT2VOL, ROUT2VOL_OUT2VU | ROUT2VOL_ROUT2ZC | vol_r); + int dac_l, amp_l, dac_r, amp_r; + get_volume_params(vol_l, &dac_l, &_l); + get_volume_params(vol_r, &dac_r, &_r); + + /* set lineout amp OUT2 */ + wmcodec_write(LOUT2VOL, amp_l | LOUT2VOL_LOUT2ZC); + wmcodec_write(ROUT2VOL, amp_r | ROUT2VOL_ROUT2ZC | ROUT2VOL_OUT2VU); } void audiohw_set_bass(int value) diff --git a/firmware/export/wm8758.h b/firmware/export/wm8758.h index 29304b879..9d1a93816 100644 --- a/firmware/export/wm8758.h +++ b/firmware/export/wm8758.h @@ -23,7 +23,7 @@ #define _WM8758_H /* volume/balance/treble/bass interdependency */ -#define VOLUME_MIN -570 +#define VOLUME_MIN -890 #define VOLUME_MAX 60 #define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | BASS_CUTOFF_CAP | TREBLE_CUTOFF_CAP) diff --git a/manual/configure_rockbox/sound_settings.tex b/manual/configure_rockbox/sound_settings.tex index 6291b5f64..a22468e0b 100644 --- a/manual/configure_rockbox/sound_settings.tex +++ b/manual/configure_rockbox/sound_settings.tex @@ -22,12 +22,14 @@ change to customise your listening experience. \opt{h100,h300}{minimum of -84 dB to a maximum of 0 dB.}% \opt{x5,m5,ipod3g,ipod4g,gigabeatf,mrobe100}{minimum of -73 dB to a maximum of +6 dB.}% \opt{ipodnano}{minimum of -72 dB to a maximum of +6 dB.}% - \opt{ipodvideo}{minimum of -57 dB to a maximum of +6 dB.}% + \opt{ipodvideo}{minimum of -89 dB to a maximum of +6 dB.}% \opt{ipodnano2g,ipodcolor,ipod1g2g,h10,h10_5gb,sansa,sansaAMS}{minimum of -74 dB to a maximum of +6 db.}% \opt{gigabeats}{minimum of -90 dB to a maximum of +6 dB.}% \opt{gigabeatf}{minimum of -74 dB to a maximum of +6 dB.}% - + \opt{ipodvideo}{\\Remark: Lowering the volume below -57 dB will also affect the lineout + and the recording gain.} + \section{Bass} This setting emphasises \nopt{h100,h300}{or suppresses} -- 2.11.4.GIT