summaryrefslogtreecommitdiff
path: root/firmware/target/arm/imx233
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/imx233')
-rw-r--r--firmware/target/arm/imx233/audioin-imx233.c28
-rw-r--r--firmware/target/arm/imx233/audioin-imx233.h18
2 files changed, 45 insertions, 1 deletions
diff --git a/firmware/target/arm/imx233/audioin-imx233.c b/firmware/target/arm/imx233/audioin-imx233.c
index 6c2a212c4d..859e65f813 100644
--- a/firmware/target/arm/imx233/audioin-imx233.c
+++ b/firmware/target/arm/imx233/audioin-imx233.c
@@ -20,6 +20,7 @@
20 ****************************************************************************/ 20 ****************************************************************************/
21#include "audioin-imx233.h" 21#include "audioin-imx233.h"
22#include "pcm_sampr.h" 22#include "pcm_sampr.h"
23#include "string.h"
23 24
24/* values in half-dB, one for each setting */ 25/* values in half-dB, one for each setting */
25static int audioin_vol[2][4]; /* 0=left, 1=right */ 26static int audioin_vol[2][4]; /* 0=left, 1=right */
@@ -79,7 +80,7 @@ static void apply_config(void)
79 * - microphone: -100dB -> 62dB in 0.5dB steps 80 * - microphone: -100dB -> 62dB in 0.5dB steps
80 */ 81 */
81 82
82 /* First apply mic gain of possible and necessary 83 /* First apply mic gain if possible and necessary
83 * Only left volume is relevant with microphone 84 * Only left volume is relevant with microphone
84 * If gain is > 22dB, use mic gain */ 85 * If gain is > 22dB, use mic gain */
85 if(select_l == AUDIOIN_SELECT_MICROPHONE && vol_l > 22 * 2) 86 if(select_l == AUDIOIN_SELECT_MICROPHONE && vol_l > 22 * 2)
@@ -188,3 +189,28 @@ void imx233_audioin_set_freq(int fsel)
188 SRC_FRAC(dacssr[fsel].src_frac), SRC_INT(dacssr[fsel].src_int), 189 SRC_FRAC(dacssr[fsel].src_frac), SRC_INT(dacssr[fsel].src_int),
189 SRC_HOLD(dacssr[fsel].src_hold), BASEMULT(dacssr[fsel].base_mult)); 190 SRC_HOLD(dacssr[fsel].src_hold), BASEMULT(dacssr[fsel].base_mult));
190} 191}
192
193struct imx233_audioin_info_t imx233_audioin_get_info(void)
194{
195 struct imx233_audioin_info_t info;
196 memset(&info, 0, sizeof(info));
197 /* 6*10^6*basemult/(src_frac*8*(src_hold+1)) in Hz */
198 info.freq = 60000000 * BF_RD(AUDIOIN_ADCSRR, BASEMULT) / 8 /
199 BF_RD(AUDIOIN_ADCSRR, SRC_FRAC) / (1 + BF_RD(AUDIOIN_ADCSRR, SRC_HOLD));
200 info.muxselect[0] = BF_RD(AUDIOIN_ADCVOL, SELECT_LEFT);
201 info.muxselect[1] = BF_RD(AUDIOIN_ADCVOL, SELECT_RIGHT);
202 /* convert half-dB to tenth-dB */
203 info.muxvol[0] = BF_RD(AUDIOIN_ADCVOL, GAIN_LEFT) * 15;
204 info.muxvol[1] = BF_RD(AUDIOIN_ADCVOL, GAIN_RIGHT) * 15;
205 info.muxmute[0] = info.adcmute[1] = BF_RD(AUDIOIN_ADCVOL, MUTE);
206 info.adcvol[0] = MAX((int)BF_RD(AUDIOIN_ADCVOLUME, VOLUME_LEFT) - 0xff, -100) * 5;
207 info.adcvol[1] = MAX((int)BF_RD(AUDIOIN_ADCVOLUME, VOLUME_RIGHT) - 0xff, -100) * 5;
208 info.adcmute[0] = info.adcmute[1] = false;
209 info.micvol[0] = BF_RD(AUDIOIN_MICLINE, MIC_GAIN);
210 if(info.micvol[0] != 0)
211 info.micvol[0] = info.micvol[1] = info.micvol[0] * 100 + 100;
212 info.micmute[0] = info.micmute[1] = false;
213 info.adc = !BF_RD(AUDIOOUT_PWRDN, ADC);
214 info.mic = info.mux = true;
215 return info;
216}
diff --git a/firmware/target/arm/imx233/audioin-imx233.h b/firmware/target/arm/imx233/audioin-imx233.h
index a36cbf6e1a..12c7b1dad5 100644
--- a/firmware/target/arm/imx233/audioin-imx233.h
+++ b/firmware/target/arm/imx233/audioin-imx233.h
@@ -34,6 +34,22 @@
34#define AUDIOIN_SELECT_HEADPHONE 2 34#define AUDIOIN_SELECT_HEADPHONE 2
35#define AUDIOIN_SELECT_LINE2 3 35#define AUDIOIN_SELECT_LINE2 3
36 36
37struct imx233_audioin_info_t
38{
39 // NOTE there is a convention here: adc -> adcvol -> adcmute
40 int freq; // in mHz
41 int muxselect[2];
42 bool adc;
43 int adcvol[2]; // in tenth-dB, l/r
44 bool adcmute[2]; // l/r
45 bool mux;
46 int muxvol[2]; // in tenth-db, l/r
47 bool muxmute[2]; // l/r
48 bool mic;
49 int micvol[2]; // in tenth-db, l/r
50 int micmute[2]; // l/r
51};
52
37void imx233_audioin_preinit(void); 53void imx233_audioin_preinit(void);
38void imx233_audioin_postinit(void); 54void imx233_audioin_postinit(void);
39void imx233_audioin_open(void); 55void imx233_audioin_open(void);
@@ -47,4 +63,6 @@ void imx233_audioin_set_freq(int fsel);
47/* enable microphone */ 63/* enable microphone */
48void imx233_audioin_enable_mic(bool enable); 64void imx233_audioin_enable_mic(bool enable);
49 65
66struct imx233_audioin_info_t imx233_audioin_get_info(void);
67
50#endif /* __audioin_imx233__ */ 68#endif /* __audioin_imx233__ */