summaryrefslogtreecommitdiff
path: root/firmware/drivers
diff options
context:
space:
mode:
authorRafaël Carré <rafael.carre@gmail.com>2010-03-29 22:26:58 +0000
committerRafaël Carré <rafael.carre@gmail.com>2010-03-29 22:26:58 +0000
commited0c5edd6280b58755736700b95a3e65034d52b4 (patch)
tree6238c9efe1f34ca36e021b45e006d8797a03f459 /firmware/drivers
parentef41ad91dbf5b6a5b4e23a70ac0e9a4824e940d3 (diff)
downloadrockbox-ed0c5edd6280b58755736700b95a3e65034d52b4.tar.gz
rockbox-ed0c5edd6280b58755736700b95a3e65034d52b4.zip
as3525v2 : recording (FM only, no microphone yet)
Add HAVE_AS3543 config define to differentiate the bits changed since as3514/as3517 Enable recording on Fuzev2/Clipv2/Clip+, although it was tested on Clip+ only Note: storage is still read-only so I tested by listening to headphones loopback and watching the recording level in recscreen git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25390 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/drivers')
-rw-r--r--firmware/drivers/audio/as3514.c85
1 files changed, 46 insertions, 39 deletions
diff --git a/firmware/drivers/audio/as3514.c b/firmware/drivers/audio/as3514.c
index 11adddc0f1..9255828f75 100644
--- a/firmware/drivers/audio/as3514.c
+++ b/firmware/drivers/audio/as3514.c
@@ -38,12 +38,29 @@
38 * as3543 , as used in the as3525v2 targets 38 * as3543 , as used in the as3525v2 targets
39 */ 39 */
40 40
41#if CONFIG_CPU == AS3525
41/* AMS Sansas based on the AS3525 use the LINE2 input for the analog radio 42/* AMS Sansas based on the AS3525 use the LINE2 input for the analog radio
42 signal instead of LINE1 */ 43 signal instead of LINE1 */
43#if CONFIG_CPU == AS3525 44#define AS3514_LINE_IN_R AS3514_LINE_IN2_R
44#define LINE_INPUT 2 45#define AS3514_LINE_IN_L AS3514_LINE_IN2_L
45#else 46#define ADC_R_ADCMUX_LINE_IN ADC_R_ADCMUX_LINE_IN2
46#define LINE_INPUT 1 47#define AUDIOSET1_LIN_on AUDIOSET1_LIN2_on
48
49#elif CONFIG_CPU == AS3525v2
50/* There is only 1 pair of registers on AS3543, the line input is selectable in
51 LINE_IN_R register */
52#define AS3514_LINE_IN_R AS3514_LINE_IN1_R
53#define AS3514_LINE_IN_L AS3514_LINE_IN1_L
54#define ADC_R_ADCMUX_LINE_IN ADC_R_ADCMUX_LINE_IN2
55#define AUDIOSET1_LIN_on AUDIOSET1_LIN1_on
56
57#else /* PP use line1 */
58
59#define AS3514_LINE_IN_R AS3514_LINE_IN1_R
60#define AS3514_LINE_IN_L AS3514_LINE_IN1_L
61#define ADC_R_ADCMUX_LINE_IN ADC_R_ADCMUX_LINE_IN1
62#define AUDIOSET1_LIN_on AUDIOSET1_LIN1_on
63
47#endif 64#endif
48 65
49const struct sound_settings_info audiohw_settings[] = { 66const struct sound_settings_info audiohw_settings[] = {
@@ -177,22 +194,22 @@ void audiohw_preinit(void)
177 as3514_write(AS3514_AUDIOSET3, AUDIOSET3_HPCM_off); 194 as3514_write(AS3514_AUDIOSET3, AUDIOSET3_HPCM_off);
178#endif 195#endif
179 196
180#if CONFIG_CPU != AS3525v2 197#ifdef HAVE_AS3543
198 as3514_clear(AS3543_DAC_IF, 0x80);
199 as3514_set(AS3514_LINE_IN1_R, LINE_IN_R_LINE_SELECT); /* Line 2 */
200#else
181 /* Mute and disable speaker */ 201 /* Mute and disable speaker */
182 as3514_write(AS3514_LSP_OUT_R, LSP_OUT_R_SP_OVC_TO_256MS | 0x00); 202 as3514_write(AS3514_LSP_OUT_R, LSP_OUT_R_SP_OVC_TO_256MS | 0x00);
183 as3514_write(AS3514_LSP_OUT_L, LSP_OUT_L_SP_MUTE | 0x00); 203 as3514_write(AS3514_LSP_OUT_L, LSP_OUT_L_SP_MUTE | 0x00);
184#else
185 as3514_clear(AS3543_DAC_IF, 0x80);
186 as3514_set(AS3514_LINE_IN1_R, 1<<6); // Select Line-in 2
187#endif 204#endif
188 205
189#if CONFIG_CPU != AS3525v2 206#ifdef HAVE_AS3543
207 as3514_write(AS3514_HPH_OUT_R, (0<<7) /* out */ | HPH_OUT_R_HP_OUT_DAC |
208 0x00);
209#else
190 /* Set headphone over-current to 0, Min volume */ 210 /* Set headphone over-current to 0, Min volume */
191 as3514_write(AS3514_HPH_OUT_R, 211 as3514_write(AS3514_HPH_OUT_R,
192 HPH_OUT_R_HP_OVC_TO_0MS | 0x00); 212 HPH_OUT_R_HP_OVC_TO_0MS | 0x00);
193#else
194 as3514_write(AS3514_HPH_OUT_R, (0<<7) /* out */ | HPH_OUT_R_HP_OUT_DAC |
195 0x00);
196#endif 213#endif
197 /* Headphone ON, MUTE, Min volume */ 214 /* Headphone ON, MUTE, Min volume */
198 as3514_write(AS3514_HPH_OUT_L, 215 as3514_write(AS3514_HPH_OUT_L,
@@ -211,8 +228,10 @@ void audiohw_preinit(void)
211 228
212 /* M1_Sup_off */ 229 /* M1_Sup_off */
213 as3514_set(AS3514_MIC1_L, MIC1_L_M1_SUP_off); 230 as3514_set(AS3514_MIC1_L, MIC1_L_M1_SUP_off);
231#ifndef HAVE_AS3543
214 /* M2_Sup_off */ 232 /* M2_Sup_off */
215 as3514_set(AS3514_MIC2_L, MIC2_L_M2_SUP_off); 233 as3514_set(AS3514_MIC2_L, MIC2_L_M2_SUP_off);
234#endif
216} 235}
217 236
218void audiohw_postinit(void) 237void audiohw_postinit(void)
@@ -257,12 +276,8 @@ void audiohw_set_master_vol(int vol_l, int vol_r)
257 as3514_write_masked(AS3514_DAC_R, mix_r, AS3514_VOL_MASK); 276 as3514_write_masked(AS3514_DAC_R, mix_r, AS3514_VOL_MASK);
258 as3514_write_masked(AS3514_DAC_L, mix_l, AS3514_VOL_MASK); 277 as3514_write_masked(AS3514_DAC_L, mix_l, AS3514_VOL_MASK);
259#if defined(HAVE_RECORDING) || defined(HAVE_FMRADIO_IN) 278#if defined(HAVE_RECORDING) || defined(HAVE_FMRADIO_IN)
260 as3514_write_masked((LINE_INPUT == 1) ? AS3514_LINE_IN1_R : 279 as3514_write_masked(AS3514_LINE_IN_R, mix_r, AS3514_VOL_MASK);
261 AS3514_LINE_IN2_R, 280 as3514_write_masked(AS3514_LINE_IN_L, mix_l, AS3514_VOL_MASK);
262 mix_r, AS3514_VOL_MASK);
263 as3514_write_masked((LINE_INPUT == 1) ? AS3514_LINE_IN1_L :
264 AS3514_LINE_IN2_L,
265 mix_l, AS3514_VOL_MASK);
266#endif 281#endif
267 as3514_write_masked(AS3514_HPH_OUT_R, hph_r, AS3514_VOL_MASK); 282 as3514_write_masked(AS3514_HPH_OUT_R, hph_r, AS3514_VOL_MASK);
268 as3514_write_masked(AS3514_HPH_OUT_L, hph_l, AS3514_VOL_MASK); 283 as3514_write_masked(AS3514_HPH_OUT_L, hph_l, AS3514_VOL_MASK);
@@ -278,13 +293,13 @@ void audiohw_mute(bool mute)
278{ 293{
279 if (mute) { 294 if (mute) {
280 as3514_set(AS3514_HPH_OUT_L, HPH_OUT_L_HP_MUTE); 295 as3514_set(AS3514_HPH_OUT_L, HPH_OUT_L_HP_MUTE);
281#if CONFIG_CPU == AS3525v2 296#ifdef HAVE_AS3543
282 as3514_set(AS3543_DAC_IF, 0x80); 297 as3514_set(AS3543_DAC_IF, 0x80);
283#endif 298#endif
284 299
285 } else { 300 } else {
286 as3514_clear(AS3514_HPH_OUT_L, HPH_OUT_L_HP_MUTE); 301 as3514_clear(AS3514_HPH_OUT_L, HPH_OUT_L_HP_MUTE);
287#if CONFIG_CPU == AS3525v2 302#ifdef HAVE_AS3543
288 as3514_clear(AS3543_DAC_IF, 0x80); 303 as3514_clear(AS3543_DAC_IF, 0x80);
289#endif 304#endif
290 } 305 }
@@ -307,7 +322,7 @@ void audiohw_close(void)
307 as3514_clear(AS3514_HPH_OUT_L, HPH_OUT_L_HP_ON); 322 as3514_clear(AS3514_HPH_OUT_L, HPH_OUT_L_HP_ON);
308 as3514_write(AS3514_AUDIOSET1, 0x0); 323 as3514_write(AS3514_AUDIOSET1, 0x0);
309 324
310#if CONFIG_CPU == AS3525v2 325#ifdef HAVE_AS3543
311 as3514_set(AS3543_DAC_IF, 0x80); 326 as3514_set(AS3543_DAC_IF, 0x80);
312#endif 327#endif
313 328
@@ -336,15 +351,11 @@ void audiohw_enable_recording(bool source_mic)
336 as3514_clear(AS3514_MIC1_R, MIC1_R_M1_AGC_off); 351 as3514_clear(AS3514_MIC1_R, MIC1_R_M1_AGC_off);
337 } else { 352 } else {
338 /* ADCmux = Line_IN1 or Line_IN2 */ 353 /* ADCmux = Line_IN1 or Line_IN2 */
339 as3514_write_masked(AS3514_ADC_R, 354 as3514_write_masked(AS3514_ADC_R, ADC_R_ADCMUX_LINE_IN,
340 (LINE_INPUT == 1) ? ADC_R_ADCMUX_LINE_IN1 :
341 ADC_R_ADCMUX_LINE_IN2,
342 ADC_R_ADCMUX); 355 ADC_R_ADCMUX);
343 356
344 /* LIN1_or LIN2 on, rest off */ 357 /* LIN1_or LIN2 on, rest off */
345 as3514_write_masked(AS3514_AUDIOSET1, 358 as3514_write_masked(AS3514_AUDIOSET1, AUDIOSET1_LIN_on,
346 (LINE_INPUT == 1) ? AUDIOSET1_LIN1_on :
347 AUDIOSET1_LIN2_on,
348 AUDIOSET1_INPUT_MASK); 359 AUDIOSET1_INPUT_MASK);
349 } 360 }
350 361
@@ -422,16 +433,12 @@ void audiohw_set_monitor(bool enable)
422{ 433{
423 if (enable) { 434 if (enable) {
424 /* select either LIN1 or LIN2 */ 435 /* select either LIN1 or LIN2 */
425 as3514_write_masked(AS3514_AUDIOSET1, 436 as3514_write_masked(AS3514_AUDIOSET1, AUDIOSET1_LIN_on,
426 (LINE_INPUT == 1) ?
427 AUDIOSET1_LIN1_on : AUDIOSET1_LIN2_on,
428 AUDIOSET1_LIN1_on | AUDIOSET1_LIN2_on); 437 AUDIOSET1_LIN1_on | AUDIOSET1_LIN2_on);
429 as3514_set((LINE_INPUT == 1) ? AS3514_LINE_IN1_R : AS3514_LINE_IN2_R, 438 as3514_set(AS3514_LINE_IN_R, LINE_IN1_R_LI1R_MUTE_off);
430 LINE_IN1_R_LI1R_MUTE_off); 439 as3514_set(AS3514_LINE_IN_L, LINE_IN1_L_LI1L_MUTE_off);
431 as3514_set((LINE_INPUT == 1) ? AS3514_LINE_IN1_L : AS3514_LINE_IN2_L,
432 LINE_IN1_L_LI1L_MUTE_off);
433 440
434#if CONFIG_CPU == AS3525v2 441#ifdef HAVE_AS3543
435 as3514_write_masked(AS3514_HPH_OUT_R, 442 as3514_write_masked(AS3514_HPH_OUT_R,
436 HPH_OUT_R_HP_OUT_LINE, HPH_OUT_R_HP_OUT_MASK); 443 HPH_OUT_R_HP_OUT_LINE, HPH_OUT_R_HP_OUT_MASK);
437#endif 444#endif
@@ -440,12 +447,12 @@ void audiohw_set_monitor(bool enable)
440 /* turn off both LIN1 and LIN2 */ 447 /* turn off both LIN1 and LIN2 */
441 as3514_clear(AS3514_LINE_IN1_R, LINE_IN1_R_LI1R_MUTE_off); 448 as3514_clear(AS3514_LINE_IN1_R, LINE_IN1_R_LI1R_MUTE_off);
442 as3514_clear(AS3514_LINE_IN1_L, LINE_IN1_L_LI1L_MUTE_off); 449 as3514_clear(AS3514_LINE_IN1_L, LINE_IN1_L_LI1L_MUTE_off);
443#if CONFIG_CPU != AS3525v2 /* not in as3543 */ 450#ifdef HAVE_AS3543
444 as3514_clear(AS3514_LINE_IN2_R, LINE_IN2_R_LI2R_MUTE_off);
445 as3514_clear(AS3514_LINE_IN2_L, LINE_IN2_L_LI2L_MUTE_off);
446#else
447 as3514_write_masked(AS3514_HPH_OUT_R, 451 as3514_write_masked(AS3514_HPH_OUT_R,
448 HPH_OUT_R_HP_OUT_DAC, HPH_OUT_R_HP_OUT_MASK); 452 HPH_OUT_R_HP_OUT_DAC, HPH_OUT_R_HP_OUT_MASK);
453#else
454 as3514_clear(AS3514_LINE_IN2_R, LINE_IN2_R_LI2R_MUTE_off);
455 as3514_clear(AS3514_LINE_IN2_L, LINE_IN2_L_LI2L_MUTE_off);
449#endif 456#endif
450 as3514_clear(AS3514_AUDIOSET1, AUDIOSET1_LIN1_on | AUDIOSET1_LIN2_on); 457 as3514_clear(AS3514_AUDIOSET1, AUDIOSET1_LIN1_on | AUDIOSET1_LIN2_on);
451 } 458 }