summaryrefslogtreecommitdiff
path: root/firmware/drivers/audio/mas35xx.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/drivers/audio/mas35xx.c')
-rw-r--r--firmware/drivers/audio/mas35xx.c285
1 files changed, 0 insertions, 285 deletions
diff --git a/firmware/drivers/audio/mas35xx.c b/firmware/drivers/audio/mas35xx.c
deleted file mode 100644
index 65c582c79c..0000000000
--- a/firmware/drivers/audio/mas35xx.c
+++ /dev/null
@@ -1,285 +0,0 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Driver for MAS35xx audio codec
11 *
12 *
13 * Copyright (c) 2007 by Christian Gmeiner
14 *
15 * This program is free software; you can redistribute it and/or
16 * modify it under the terms of the GNU General Public License
17 * as published by the Free Software Foundation; either version 2
18 * of the License, or (at your option) any later version.
19 *
20 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
21 * KIND, either express or implied.
22 *
23 ****************************************************************************/
24
25#include "config.h"
26#include "system.h" /* MAX MIN macros */
27#include "sound.h"
28
29int channel_configuration = SOUND_CHAN_STEREO;
30int stereo_width = 100;
31
32#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
33unsigned long mdb_shape_shadow = 0;
34unsigned long loudness_shadow = 0;
35unsigned long shadow_io_control_main;
36#endif
37
38static void set_channel_config(void)
39{
40 /* default values: stereo */
41 unsigned long val_ll = 0x80000;
42 unsigned long val_lr = 0;
43 unsigned long val_rl = 0;
44 unsigned long val_rr = 0x80000;
45 int bank;
46
47 switch(channel_configuration)
48 {
49 /* case SOUND_CHAN_STEREO unnecessary */
50
51 case SOUND_CHAN_MONO:
52 val_ll = 0xc0000;
53 val_lr = 0xc0000;
54 val_rl = 0xc0000;
55 val_rr = 0xc0000;
56 break;
57
58 case SOUND_CHAN_CUSTOM:
59 {
60 /* fixed point variables (matching MAS internal format)
61 integer part: upper 13 bits (inlcuding sign)
62 fractional part: lower 19 bits */
63 long fp_width, fp_straight, fp_cross;
64
65 fp_width = (stereo_width << 19) / 100;
66 if (stereo_width <= 100)
67 {
68 fp_straight = - ((1<<19) + fp_width) / 2;
69 fp_cross = fp_straight + fp_width;
70 }
71 else
72 {
73 /* straight = - (1 + width) / (2 * width) */
74 fp_straight = - ((((1<<19) + fp_width) / (fp_width >> 9)) << 9);
75 fp_cross = (1<<19) + fp_straight;
76 }
77 val_ll = val_rr = fp_straight & 0xfffff;
78 val_lr = val_rl = fp_cross & 0xfffff;
79 }
80 break;
81
82 case SOUND_CHAN_MONO_LEFT:
83 val_ll = 0x80000;
84 val_lr = 0x80000;
85 val_rl = 0;
86 val_rr = 0;
87 break;
88
89 case SOUND_CHAN_MONO_RIGHT:
90 val_ll = 0;
91 val_lr = 0;
92 val_rl = 0x80000;
93 val_rr = 0x80000;
94 break;
95
96 case SOUND_CHAN_KARAOKE:
97 val_ll = 0xc0000;
98 val_lr = 0x40000;
99 val_rl = 0x40000;
100 val_rr = 0xc0000;
101 break;
102 }
103
104#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
105 bank = MAS_BANK_D0;
106#elif CONFIG_CODEC == MAS3507D
107 bank = MAS_BANK_D1;
108#endif
109
110 mas_writemem(bank, MAS_D0_OUT_LL, &val_ll, 1); /* LL */
111 mas_writemem(bank, MAS_D0_OUT_LR, &val_lr, 1); /* LR */
112 mas_writemem(bank, MAS_D0_OUT_RL, &val_rl, 1); /* RL */
113 mas_writemem(bank, MAS_D0_OUT_RR, &val_rr, 1); /* RR */
114}
115
116void audiohw_set_channel(int val)
117{
118 channel_configuration = val;
119 set_channel_config();
120}
121
122void audiohw_set_stereo_width(int val)
123{
124 stereo_width = val;
125 if (channel_configuration == SOUND_CHAN_CUSTOM) {
126 set_channel_config();
127 }
128}
129
130void audiohw_set_bass(int val)
131{
132#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
133 unsigned tmp = ((unsigned)(val * 8) & 0xff) << 8;
134 mas_codec_writereg(MAS_REG_KBASS, tmp);
135#elif CONFIG_CODEC == MAS3507D
136 mas_writereg(MAS_REG_KBASS, bass_table[val+15]);
137#endif
138}
139
140#if CONFIG_CODEC == MAS3507D
141void audiohw_set_prescaler(int val)
142{
143 mas_writereg(MAS_REG_KPRESCALE, prescale_table[val/10]);
144}
145#endif
146
147void audiohw_set_treble(int val)
148{
149#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
150 unsigned tmp = ((unsigned)(val * 8) & 0xff) << 8;
151 mas_codec_writereg(MAS_REG_KTREBLE, tmp);
152#elif CONFIG_CODEC == MAS3507D
153 mas_writereg(MAS_REG_KTREBLE, treble_table[val+15]);
154#endif
155}
156
157#if (CONFIG_CODEC == MAS3507D)
158/* convert tenth of dB volume (-780..+180) to dac3550 register value */
159static unsigned int tenthdb2reg(int db)
160{
161 if (db < -540) /* 3 dB steps */
162 return (db + 780) / 30;
163 else /* 1.5 dB steps */
164 return (db + 660) / 15;
165}
166
167void audiohw_set_volume(int vol_l, int vol_r)
168{
169 dac_volume(tenthdb2reg(vol_l), tenthdb2reg(vol_r), false);
170}
171#endif /* CONFIG_CODEC == MAS3507D */
172
173#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
174void audiohw_set_volume(int val)
175{
176 unsigned tmp = ((unsigned)(val + 115) & 0xff) << 8;
177 mas_codec_writereg(MAS_REG_VOLUME_CONTROL, tmp);
178}
179
180void audiohw_set_loudness(int value)
181{
182 loudness_shadow = (loudness_shadow & 0x04) |
183 (MAX(MIN(value * 4, 0x44), 0) << 8);
184 mas_codec_writereg(MAS_REG_KLOUDNESS, loudness_shadow);
185}
186
187void audiohw_set_avc(int value)
188{
189 int tmp;
190
191 static const uint16_t avc_vals[] =
192 {
193 (0x1 << 8) | (0x8 << 12), /* 20ms */
194 (0x2 << 8) | (0x8 << 12), /* 2s */
195 (0x4 << 8) | (0x8 << 12), /* 4s */
196 (0x8 << 8) | (0x8 << 12), /* 8s */
197 };
198 switch (value) {
199 case 1:
200 case 2:
201 case 3:
202 case 4:
203 tmp = avc_vals[value -1];
204 break;
205 case -1: /* turn off and then turn on again to decay quickly */
206 tmp = mas_codec_readreg(MAS_REG_KAVC);
207 mas_codec_writereg(MAS_REG_KAVC, 0);
208 break;
209 default: /* off */
210 tmp = 0;
211 break;
212 }
213 mas_codec_writereg(MAS_REG_KAVC, tmp);
214}
215
216void audiohw_set_mdb_strength(int value)
217{
218 mas_codec_writereg(MAS_REG_KMDB_STR, (value & 0x7f) << 8);
219}
220
221void audiohw_set_mdb_harmonics(int value)
222{
223 int tmp = value * 127 / 100;
224 mas_codec_writereg(MAS_REG_KMDB_HAR, (tmp & 0x7f) << 8);
225}
226
227void audiohw_set_mdb_center(int value)
228{
229 mas_codec_writereg(MAS_REG_KMDB_FC, (value/10) << 8);
230}
231
232void audiohw_set_mdb_shape(int value)
233{
234 mdb_shape_shadow = (mdb_shape_shadow & 0x02) | ((value/10) << 8);
235 mas_codec_writereg(MAS_REG_KMDB_SWITCH, mdb_shape_shadow);
236}
237
238void audiohw_set_mdb_enable(int value)
239{
240 mdb_shape_shadow = (mdb_shape_shadow & ~0x02) | (value?2:0);
241 mas_codec_writereg(MAS_REG_KMDB_SWITCH, mdb_shape_shadow);
242}
243
244void audiohw_set_superbass(int value)
245{
246 loudness_shadow = (loudness_shadow & ~0x04) | (value?4:0);
247 mas_codec_writereg(MAS_REG_KLOUDNESS, loudness_shadow);
248}
249
250void audiohw_set_balance(int val)
251{
252 unsigned tmp = ((unsigned)(val * 127 / 100) & 0xff) << 8;
253 mas_codec_writereg(MAS_REG_BALANCE, tmp);
254}
255
256/* This functionality works by telling the decoder that we have another
257 crystal frequency than we actually have. It will adjust its internal
258 parameters and the result is that the audio is played at another pitch.
259*/
260static int32_t last_pitch = PITCH_SPEED_100;
261
262void audiohw_set_pitch(int32_t val)
263{
264 if (val == last_pitch)
265 return;
266
267 /* Calculate the new (bogus) frequency */
268 unsigned long reg = 18432 * PITCH_SPEED_100 / val;
269 mas_writemem(MAS_BANK_D0, MAS_D0_OFREQ_CONTROL, &reg, 1);
270
271 /* We must tell the MAS that the frequency has changed.
272 * This will unfortunately cause a short silence. */
273 mas_writemem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN,
274 &shadow_io_control_main, 1);
275
276 last_pitch = val;
277}
278
279int32_t audiohw_get_pitch(void)
280{
281 return last_pitch;
282}
283
284#endif /* CONFIG_CODEC == MAS3587F || CONFIG_CODEC == MAS3539F */
285