summaryrefslogtreecommitdiff
path: root/firmware/drivers/audio
diff options
context:
space:
mode:
authorMarcin Bukat <marcin.bukat@gmail.com>2010-10-31 21:09:34 +0000
committerMarcin Bukat <marcin.bukat@gmail.com>2010-10-31 21:09:34 +0000
commit56c4e9fa600557242d8b78f5fd8e32c2245b76fc (patch)
treef8558778a302f89c3e819e66e86577a5e37c3660 /firmware/drivers/audio
parent40ed5f57d9be61f1200026e9b0f944a9718111c1 (diff)
downloadrockbox-56c4e9fa600557242d8b78f5fd8e32c2245b76fc.tar.gz
rockbox-56c4e9fa600557242d8b78f5fd8e32c2245b76fc.zip
Separate mas35xx lowlevel stuff. Move SH specific bits to target tree. FS#11189 by me.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28425 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/drivers/audio')
-rw-r--r--firmware/drivers/audio/dac3550a.c124
-rw-r--r--firmware/drivers/audio/mas35xx.c99
2 files changed, 218 insertions, 5 deletions
diff --git a/firmware/drivers/audio/dac3550a.c b/firmware/drivers/audio/dac3550a.c
new file mode 100644
index 0000000000..e13602e481
--- /dev/null
+++ b/firmware/drivers/audio/dac3550a.c
@@ -0,0 +1,124 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id: dac.c 17847 2008-06-28 18:10:04Z bagder $
9 *
10 * Copyright (C) 2002 by Linus Nielsen Feltzing
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21#include "config.h"
22#include "stdbool.h"
23#include "i2c.h"
24#include "debug.h"
25#include "dac3550a.h"
26
27static bool line_in_enabled = false;
28static bool dac_enabled = false;
29
30/* convert tenth of dB volume (-780..+180) to dac3550 register value */
31int tenthdb2reg(int db)
32{
33 if (db < -540) /* 3 dB steps */
34 return (db + 780) / 30;
35 else /* 1.5 dB steps */
36 return (db + 660) / 15;
37}
38
39int dac_volume(unsigned int left, unsigned int right, bool deemph)
40{
41 int ret = 0;
42 unsigned char buf[3];
43
44 i2c_begin();
45
46 if (left > 0x38)
47 left = 0x38;
48 if (right > 0x38)
49 right = 0x38;
50
51 buf[0] = DAC_REG_WRITE | DAC_AVOL;
52 buf[1] = (left & 0x3f) | (deemph ? 0x40 : 0);
53 buf[2] = right & 0x3f;
54
55 /* send write command */
56 if (i2c_write(DAC_DEV_WRITE,buf,3))
57 {
58 ret = -1;
59 }
60
61 i2c_end();
62 return ret;
63}
64
65/******************************************************************
66** Bit6: 0 = 3V 1 = 5V
67** Bit5: 0 = normal 1 = low power
68** Bit4: 0 = AUX2 off 1 = AUX2 on
69** Bit3: 0 = AUX1 off 1 = AUX1 on
70** Bit2: 0 = DAC off 1 = DAC on
71** Bit1: 0 = stereo 1 = mono
72** Bit0: 0 = normal right amp 1 = inverted right amp
73******************************************************************/
74/* dac_config is called once to initialize it. we will apply
75 our static settings because of the init flow.
76 dac_init -> dac_line_in -> mpeg_init -> dac_config
77*/
78static int dac_config(void)
79{
80 int ret = 0;
81 unsigned char buf[2];
82
83 i2c_begin();
84
85 buf[0] = DAC_REG_WRITE | DAC_GCFG;
86 buf[1] = (dac_enabled ? 0x04 : 0) |
87 (line_in_enabled ? 0x08 : 0);
88
89 /* send write command */
90 if (i2c_write(DAC_DEV_WRITE,buf,2))
91 {
92 ret = -1;
93 }
94
95 i2c_end();
96 return ret;
97}
98
99void dac_enable(bool enable)
100{
101 dac_enabled = enable;
102 dac_config();
103}
104
105void dac_line_in(bool enable)
106{
107 line_in_enabled = enable;
108 dac_config();
109}
110
111void dac_init(void)
112{
113 unsigned char buf[2];
114
115 i2c_begin();
116
117 buf[0] = DAC_REG_WRITE | DAC_SR_REG;
118 buf[1] = 0x07;
119
120 /* send write command */
121 i2c_write(DAC_DEV_WRITE,buf,2);
122 i2c_end();
123}
124
diff --git a/firmware/drivers/audio/mas35xx.c b/firmware/drivers/audio/mas35xx.c
index 342d8a3c2e..e6cc665109 100644
--- a/firmware/drivers/audio/mas35xx.c
+++ b/firmware/drivers/audio/mas35xx.c
@@ -23,8 +23,8 @@
23 ****************************************************************************/ 23 ****************************************************************************/
24 24
25#include "config.h" 25#include "config.h"
26#include "system.h" /* MAX MIN macros */
26#include "audiohw.h" 27#include "audiohw.h"
27#include "mas.h"
28 28
29const struct sound_settings_info audiohw_settings[] = { 29const struct sound_settings_info audiohw_settings[] = {
30#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) 30#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
@@ -56,10 +56,15 @@ const struct sound_settings_info audiohw_settings[] = {
56#endif 56#endif
57}; 57};
58 58
59
60int channel_configuration = SOUND_CHAN_STEREO; 59int channel_configuration = SOUND_CHAN_STEREO;
61int stereo_width = 100; 60int stereo_width = 100;
62 61
62#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
63unsigned long mdb_shape_shadow = 0;
64unsigned long loudness_shadow = 0;
65unsigned long shadow_io_control_main;
66#endif
67
63 68
64static void set_channel_config(void) 69static void set_channel_config(void)
65{ 70{
@@ -181,13 +186,97 @@ void audiohw_set_treble(int val)
181} 186}
182 187
183#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) 188#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
184void audiohw_set_volume(int val) { 189void audiohw_set_volume(int val)
190{
185 unsigned tmp = ((unsigned)(val + 115) & 0xff) << 8; 191 unsigned tmp = ((unsigned)(val + 115) & 0xff) << 8;
186 mas_codec_writereg(MAS_REG_VOLUME_CONTROL, tmp); 192 mas_codec_writereg(MAS_REG_VOLUME_CONTROL, tmp);
187} 193}
188 194
189void audiohw_set_balance(int val) { 195void audiohw_set_loudness(int value)
196{
197 loudness_shadow = (loudness_shadow & 0x04) |
198 (MAX(MIN(value * 4, 0x44), 0) << 8);
199 mas_codec_writereg(MAS_REG_KLOUDNESS, loudness_shadow);
200}
201
202void audiohw_set_avc(int value)
203{
204 int tmp;
205
206 static const uint16_t avc_vals[] =
207 {
208 (0x1 << 8) | (0x8 << 12), /* 20ms */
209 (0x2 << 8) | (0x8 << 12), /* 2s */
210 (0x4 << 8) | (0x8 << 12), /* 4s */
211 (0x8 << 8) | (0x8 << 12), /* 8s */
212 };
213 switch (value) {
214 case 1:
215 case 2:
216 case 3:
217 case 4:
218 tmp = avc_vals[value -1];
219 break;
220 case -1: /* turn off and then turn on again to decay quickly */
221 tmp = mas_codec_readreg(MAS_REG_KAVC);
222 mas_codec_writereg(MAS_REG_KAVC, 0);
223 break;
224 default: /* off */
225 tmp = 0;
226 break;
227 }
228 mas_codec_writereg(MAS_REG_KAVC, tmp);
229}
230
231void audiohw_set_mdb_strength(int value)
232{
233 mas_codec_writereg(MAS_REG_KMDB_STR, (value & 0x7f) << 8);
234}
235
236void audiohw_set_mdb_harmonics(int value)
237{
238 int tmp = value * 127 / 100;
239 mas_codec_writereg(MAS_REG_KMDB_HAR, (tmp & 0x7f) << 8);
240}
241
242void audiohw_set_mdb_center(int value)
243{
244 mas_codec_writereg(MAS_REG_KMDB_FC, (value/10) << 8);
245}
246
247void audiohw_set_mdb_shape(int value)
248{
249 mdb_shape_shadow = (mdb_shape_shadow & 0x02) | ((value/10) << 8);
250 mas_codec_writereg(MAS_REG_KMDB_SWITCH, mdb_shape_shadow);
251}
252
253void audiohw_set_mdb_enable(int value)
254{
255 mdb_shape_shadow = (mdb_shape_shadow & ~0x02) | (value?2:0);
256 mas_codec_writereg(MAS_REG_KMDB_SWITCH, mdb_shape_shadow);
257}
258
259void audiohw_set_superbass(int value)
260{
261 loudness_shadow = (loudness_shadow & ~0x04) | (value?4:0);
262 mas_codec_writereg(MAS_REG_KLOUDNESS, loudness_shadow);
263}
264
265void audiohw_set_balance(int val)
266{
190 unsigned tmp = ((unsigned)(val * 127 / 100) & 0xff) << 8; 267 unsigned tmp = ((unsigned)(val * 127 / 100) & 0xff) << 8;
191 mas_codec_writereg(MAS_REG_BALANCE, tmp); 268 mas_codec_writereg(MAS_REG_BALANCE, tmp);
192} 269}
193#endif 270
271void audiohw_set_pitch(unsigned long val)
272{
273 mas_writemem(MAS_BANK_D0, MAS_D0_OFREQ_CONTROL, &val, 1);
274
275 /* We must tell the MAS that the frequency has changed.
276 * This will unfortunately cause a short silence. */
277
278 mas_writemem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN, &shadow_io_control_main, 1);
279}
280
281#endif /* CONFIG_CODEC == MAS3587F || CONFIG_CODEC == MAS3539F */
282