diff options
Diffstat (limited to 'firmware/drivers/audio')
-rw-r--r-- | firmware/drivers/audio/as3514.c | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/firmware/drivers/audio/as3514.c b/firmware/drivers/audio/as3514.c index 0fe8d90b11..771275e8fa 100644 --- a/firmware/drivers/audio/as3514.c +++ b/firmware/drivers/audio/as3514.c | |||
@@ -55,16 +55,11 @@ static void as3514_write(int reg, int value) | |||
55 | /* convert tenth of dB volume to master volume register value */ | 55 | /* convert tenth of dB volume to master volume register value */ |
56 | int tenthdb2master(int db) | 56 | int tenthdb2master(int db) |
57 | { | 57 | { |
58 | /* +6 to -40.43dB in 1.5dB steps == 32 levels = 5 bits */ | 58 | /* +6 to -73.5dB in 1.5dB steps == 53 levels */ |
59 | /* 11111 == +6dB (0x1f) = 31) */ | ||
60 | /* 11110 == -4.5dB (0x1e) = 30) */ | ||
61 | /* 00001 == -39dB (0x01) */ | ||
62 | /* 00000 == -40.5dB (0x00) */ | ||
63 | |||
64 | if (db < VOLUME_MIN) { | 59 | if (db < VOLUME_MIN) { |
65 | return 0x0; | 60 | return 0x0; |
66 | } else if (db >= VOLUME_MAX) { | 61 | } else if (db >= VOLUME_MAX) { |
67 | return 0x1f; | 62 | return 0x35; |
68 | } else { | 63 | } else { |
69 | return((db-VOLUME_MIN)/15); /* VOLUME_MIN is negative */ | 64 | return((db-VOLUME_MIN)/15); /* VOLUME_MIN is negative */ |
70 | } | 65 | } |
@@ -147,16 +142,35 @@ void audiohw_enable_output(bool enable) | |||
147 | 142 | ||
148 | int audiohw_set_master_vol(int vol_l, int vol_r) | 143 | int audiohw_set_master_vol(int vol_l, int vol_r) |
149 | { | 144 | { |
150 | vol_l &= 0x1f; | 145 | int hph_r = as3514_regs[HPH_OUT_R] & ~0x1f; |
151 | vol_r &= 0x1f; | 146 | int hph_l = as3514_regs[HPH_OUT_L] & ~0x1f; |
152 | 147 | ||
153 | /* we are controling dac volume instead of headphone volume, | 148 | /* we are controling dac volume instead of headphone volume, |
154 | as the volume is bigger. | 149 | as the volume is bigger. |
155 | HDP: 1.07 dB gain | 150 | HDP: 1.07 dB gain |
156 | DAC: 6 dB gain | 151 | DAC: 6 dB gain |
157 | */ | 152 | */ |
158 | as3514_write(DAC_R, vol_r); | 153 | if(vol_r <= 0x16) |
159 | as3514_write(DAC_L, 0x40 | vol_l); | 154 | { |
155 | as3514_write(DAC_R, vol_r); | ||
156 | as3514_write(HPH_OUT_R, hph_r); /* set 0 */ | ||
157 | } | ||
158 | else | ||
159 | { | ||
160 | as3514_write(DAC_R, 0x16); | ||
161 | as3514_write(HPH_OUT_R, hph_r + (vol_r - 0x16)); | ||
162 | } | ||
163 | |||
164 | if(vol_l <= 0x16) | ||
165 | { | ||
166 | as3514_write(DAC_L, 0x40 + vol_l); | ||
167 | as3514_write(HPH_OUT_L, hph_l); /* set 0 */ | ||
168 | } | ||
169 | else | ||
170 | { | ||
171 | as3514_write(DAC_L, 0x40 + 0x16); | ||
172 | as3514_write(HPH_OUT_L, hph_l + (vol_l - 0x16)); | ||
173 | } | ||
160 | 174 | ||
161 | return 0; | 175 | return 0; |
162 | } | 176 | } |