diff options
author | Cástor Muñoz <cmvidal@gmail.com> | 2017-04-16 00:36:11 +0200 |
---|---|---|
committer | Cástor Muñoz <cmvidal@gmail.com> | 2017-04-16 00:37:45 +0200 |
commit | 3fffff90e2c7c4e6ae3ab9d93f2c82d7b4d59961 (patch) | |
tree | 546d80b3c8e7b3db2bbc2c7f404be13b18def131 /firmware/target/arm/s5l8702/ipod6g/audio-6g.c | |
parent | c577c63c93e96571c3c0c3b84a1bbf3d3ecd66c2 (diff) | |
download | rockbox-3fffff90e2c7c4e6ae3ab9d93f2c82d7b4d59961.tar.gz rockbox-3fffff90e2c7c4e6ae3ab9d93f2c82d7b4d59961.zip |
ipod6g: some fixes for recording
- Fix broken recording from jack microphone.
- Fix recording hardware detection on models that do not support
the jack microphone.
- Enable monitor mode when recording.
Change-Id: Ib79a2746f2d75f74cf6667d33bc9ed6512bbc8a9
Diffstat (limited to 'firmware/target/arm/s5l8702/ipod6g/audio-6g.c')
-rw-r--r-- | firmware/target/arm/s5l8702/ipod6g/audio-6g.c | 58 |
1 files changed, 50 insertions, 8 deletions
diff --git a/firmware/target/arm/s5l8702/ipod6g/audio-6g.c b/firmware/target/arm/s5l8702/ipod6g/audio-6g.c index 6a3bab06d6..825249400f 100644 --- a/firmware/target/arm/s5l8702/ipod6g/audio-6g.c +++ b/firmware/target/arm/s5l8702/ipod6g/audio-6g.c | |||
@@ -23,10 +23,55 @@ | |||
23 | #include "audio.h" | 23 | #include "audio.h" |
24 | #include "sound.h" | 24 | #include "sound.h" |
25 | #include "pmu-target.h" | 25 | #include "pmu-target.h" |
26 | #include "i2c-s5l8702.h" | ||
26 | 27 | ||
27 | extern int rec_hw_ver; | 28 | extern int rec_hw_ver; |
28 | 29 | ||
30 | /* Mikey is the internal controller for jack microphone and/or | ||
31 | * remote accessories. | ||
32 | * TODO: | ||
33 | * - move to mikey-6g.c | ||
34 | * - detect jack accessory | ||
35 | * - support for remote buttons | ||
36 | */ | ||
37 | unsigned char mikey_read(int address) | ||
38 | { | ||
39 | unsigned char val; | ||
40 | i2c_read(0, 0x72, address, 1, &val); | ||
41 | return val; | ||
42 | } | ||
43 | |||
44 | int mikey_write(int address, unsigned char val) | ||
45 | { | ||
46 | return i2c_write(0, 0x72, address, 1, &val); | ||
47 | } | ||
48 | |||
49 | void mikey_reset(void) | ||
50 | { | ||
51 | mikey_write(0, 5); | ||
52 | mikey_write(1, 0x80); | ||
53 | } | ||
54 | |||
29 | #if INPUT_SRC_CAPS != 0 | 55 | #if INPUT_SRC_CAPS != 0 |
56 | #ifdef HAVE_RECORDING | ||
57 | void audio_enable_mic(bool enable) | ||
58 | { | ||
59 | if (rec_hw_ver == 0) | ||
60 | return; | ||
61 | |||
62 | if (enable) | ||
63 | { | ||
64 | mikey_write(0, 7); /* raise voltage to polarize microphone */ | ||
65 | GPIOCMD = 0xe070f; /* enable preamp */ | ||
66 | } | ||
67 | else | ||
68 | { | ||
69 | mikey_reset(); /* microphone line voltage = 0 */ | ||
70 | GPIOCMD = 0xe070e; /* disable preamp */ | ||
71 | } | ||
72 | } | ||
73 | #endif | ||
74 | |||
30 | void audio_set_output_source(int source) | 75 | void audio_set_output_source(int source) |
31 | { | 76 | { |
32 | if ((unsigned)source >= AUDIO_NUM_SOURCES) | 77 | if ((unsigned)source >= AUDIO_NUM_SOURCES) |
@@ -53,8 +98,7 @@ void audio_input_mux(int source, unsigned flags) | |||
53 | /* Vcodec = 1800mV (900mV + value*100mV) */ | 98 | /* Vcodec = 1800mV (900mV + value*100mV) */ |
54 | pmu_ldo_set_voltage(3, 0x9); | 99 | pmu_ldo_set_voltage(3, 0x9); |
55 | 100 | ||
56 | if (rec_hw_ver == 1) | 101 | audio_enable_mic(false); |
57 | GPIOCMD = 0xe070e; | ||
58 | } | 102 | } |
59 | #endif | 103 | #endif |
60 | break; | 104 | break; |
@@ -63,13 +107,12 @@ void audio_input_mux(int source, unsigned flags) | |||
63 | case AUDIO_SRC_MIC: /* recording only */ | 107 | case AUDIO_SRC_MIC: /* recording only */ |
64 | if (source != last_source) | 108 | if (source != last_source) |
65 | { | 109 | { |
66 | if (rec_hw_ver == 1) | 110 | audio_enable_mic(true); |
67 | GPIOCMD = 0xe070f; | ||
68 | 111 | ||
69 | /* Vcodec = 2400mV (900mV + value*100mV) */ | 112 | /* Vcodec = 2400mV (900mV + value*100mV) */ |
70 | pmu_ldo_set_voltage(3, 0xf); | 113 | pmu_ldo_set_voltage(3, 0xf); |
71 | 114 | ||
72 | audiohw_set_monitor(false); | 115 | audiohw_set_monitor(true); |
73 | audiohw_enable_recording(true); /* source mic */ | 116 | audiohw_enable_recording(true); /* source mic */ |
74 | } | 117 | } |
75 | break; | 118 | break; |
@@ -79,13 +122,12 @@ void audio_input_mux(int source, unsigned flags) | |||
79 | case AUDIO_SRC_LINEIN: /* recording only */ | 122 | case AUDIO_SRC_LINEIN: /* recording only */ |
80 | if (source != last_source) | 123 | if (source != last_source) |
81 | { | 124 | { |
82 | if (rec_hw_ver == 1) | 125 | audio_enable_mic(false); |
83 | GPIOCMD = 0xe070e; | ||
84 | 126 | ||
85 | /* Vcodec = 2400mV (900mV + value*100mV) */ | 127 | /* Vcodec = 2400mV (900mV + value*100mV) */ |
86 | pmu_ldo_set_voltage(3, 0xf); | 128 | pmu_ldo_set_voltage(3, 0xf); |
87 | 129 | ||
88 | audiohw_set_monitor(false); | 130 | audiohw_set_monitor(true); |
89 | audiohw_enable_recording(false); /* source line */ | 131 | audiohw_enable_recording(false); /* source line */ |
90 | } | 132 | } |
91 | break; | 133 | break; |