ipod Classic: implement HAVE_RECORDING

This patch has been tested on iPod 80 and 160slim, actually
it works but some updates must be done to the final version:

 - unlimitted input buffer
 - decrease CHUNK_SIZE
 - use non-cached addresses instead of discard d-cache ???

Capture hardware versions:

 Ver  iPod models   capture support
 ---  -----------   ---------------
 0    80/160fat     dock line-in
 1    120/160slim   dock line-in + jack mic

 HW version 1 includes an amplifier for the jack plug mic.

 Capture HW detection only tested on iPod 80 and 160slim.

CODEC power:

 AFAIK, OF powers CS42L55 at VA=2.4V for capture (1.8V for
 playback) and turns on the ADC charge pump. CODEC datasheet
 recommmends to disable the charge pump for VA>2.1V.

 CS42L55 DS, s4.13 (Required Initialization Settings): for
 VA>2.1V, some adjustments "must" be done using undocummented
 "control port compensation" registers. OF does not modifies
 these registers when VA=2.4V.

 This patch configures capture HW in the same way as OF does.

TODO:
 - ADC full scale voltage depends on VA, perform tests to find
   clipping levels for VA=1.8V and VA=2.4V

Change-Id: I7e20fd3ecaa83b1c58d5c746f5153fe5c3891d75
This commit is contained in:
Cástor Muñoz 2014-12-06 19:00:34 +01:00
parent 42abc6a496
commit 291b2338c9
6 changed files with 246 additions and 14 deletions

View file

@ -22,6 +22,9 @@
#include "cpu.h"
#include "audio.h"
#include "sound.h"
#include "pmu-target.h"
extern int rec_hw_ver;
#if INPUT_SRC_CAPS != 0
void audio_set_output_source(int source)
@ -46,13 +49,42 @@ void audio_input_mux(int source, unsigned flags)
{
audiohw_set_monitor(false);
audiohw_disable_recording();
/* Vcodec = 1800mV (900mV + value*100mV) */
pmu_ldo_set_voltage(3, 0x9);
if (rec_hw_ver == 1)
GPIOCMD = 0xe070e;
}
#endif
break;
#ifdef HAVE_MIC_REC
case AUDIO_SRC_MIC: /* recording only */
if (source != last_source)
{
if (rec_hw_ver == 1)
GPIOCMD = 0xe070f;
/* Vcodec = 2400mV (900mV + value*100mV) */
pmu_ldo_set_voltage(3, 0xf);
audiohw_set_monitor(false);
audiohw_enable_recording(true); /* source mic */
}
break;
#endif
#ifdef HAVE_LINE_REC
case AUDIO_SRC_LINEIN: /* recording only */
if (source != last_source)
{
if (rec_hw_ver == 1)
GPIOCMD = 0xe070e;
/* Vcodec = 2400mV (900mV + value*100mV) */
pmu_ldo_set_voltage(3, 0xf);
audiohw_set_monitor(false);
audiohw_enable_recording(false); /* source line */
}