summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/drivers/audio/eros_qn_codec.c23
-rw-r--r--firmware/export/eros_qn_codec.h2
-rw-r--r--firmware/target/mips/ingenic_x1000/erosqnative/audiohw-erosqnative.c38
-rw-r--r--firmware/target/mips/ingenic_x1000/erosqnative/button-erosqnative.c4
-rw-r--r--firmware/target/mips/ingenic_x1000/erosqnative/gpio-target.h26
5 files changed, 47 insertions, 46 deletions
diff --git a/firmware/drivers/audio/eros_qn_codec.c b/firmware/drivers/audio/eros_qn_codec.c
index da50d62fe5..39a421ee92 100644
--- a/firmware/drivers/audio/eros_qn_codec.c
+++ b/firmware/drivers/audio/eros_qn_codec.c
@@ -31,10 +31,10 @@
31static long int vol_l_hw = 0; 31static long int vol_l_hw = 0;
32static long int vol_r_hw = 0; 32static long int vol_r_hw = 0;
33 33
34/* internal: mute the headphone amp. 0 - unmuted, 1 - muted */ 34/* internal: Switch the output sink. 0 - headphones, 1 - line out */
35void audiohw_mute_hp(int mute); 35void audiohw_switch_output(int select);
36 36
37void pcm5102_set_outputs(void) 37void dac_set_outputs(void)
38{ 38{
39 audiohw_set_volume(vol_l_hw, vol_r_hw); 39 audiohw_set_volume(vol_l_hw, vol_r_hw);
40} 40}
@@ -56,15 +56,14 @@ void audiohw_set_volume(int vol_l, int vol_r)
56 * blow out our eardrums cranking it to full */ 56 * blow out our eardrums cranking it to full */
57 if (lineout_inserted() && !headphones_inserted()) 57 if (lineout_inserted() && !headphones_inserted())
58 { 58 {
59 l = r = global_settings.volume_limit * 10; 59 audiohw_switch_output(1);
60 60
61 /* mute the headphone amp if not plugged in */ 61 l = r = global_settings.volume_limit * 10;
62 audiohw_mute_hp(1);
63 } 62 }
64 else 63 else
65 { 64 {
66 /* unmute the headphone amp when plugged in */ 65 audiohw_switch_output(0);
67 audiohw_mute_hp(0); 66
68 l = vol_l; 67 l = vol_l;
69 r = vol_r; 68 r = vol_r;
70 } 69 }
@@ -76,14 +75,14 @@ void audiohw_set_volume(int vol_l, int vol_r)
76 pcm_set_master_volume(l, r); 75 pcm_set_master_volume(l, r);
77} 76}
78 77
79void audiohw_mute_hp(int mute) 78void audiohw_switch_output(int select)
80{ 79{
81 if (mute == 0) 80 if (select == 0)
82 { 81 {
83 gpio_set_level(GPIO_MAX97220_SHDN, 1); 82 gpio_set_level(GPIO_STEREOSW_SEL, 0);
84 } 83 }
85 else 84 else
86 { 85 {
87 gpio_set_level(GPIO_MAX97220_SHDN, 0); 86 gpio_set_level(GPIO_STEREOSW_SEL, 1);
88 } 87 }
89} 88}
diff --git a/firmware/export/eros_qn_codec.h b/firmware/export/eros_qn_codec.h
index 851ab63362..bf108aa1c7 100644
--- a/firmware/export/eros_qn_codec.h
+++ b/firmware/export/eros_qn_codec.h
@@ -39,6 +39,6 @@ AUDIOHW_SETTING(VOLUME, "dB", 0, 2, PCM5102A_VOLUME_MIN/10, PCM5102A_VOLUME_MAX/
39 39
40/* this just calls audiohw_set_volume() with the last (locally) known volume, 40/* this just calls audiohw_set_volume() with the last (locally) known volume,
41 * used for switching to/from fixed line out volume. */ 41 * used for switching to/from fixed line out volume. */
42void pcm5102_set_outputs(void); 42void dac_set_outputs(void);
43 43
44#endif 44#endif
diff --git a/firmware/target/mips/ingenic_x1000/erosqnative/audiohw-erosqnative.c b/firmware/target/mips/ingenic_x1000/erosqnative/audiohw-erosqnative.c
index b32a32a3a3..c53da728ff 100644
--- a/firmware/target/mips/ingenic_x1000/erosqnative/audiohw-erosqnative.c
+++ b/firmware/target/mips/ingenic_x1000/erosqnative/audiohw-erosqnative.c
@@ -27,20 +27,22 @@
27#include "gpio-x1000.h" 27#include "gpio-x1000.h"
28#include "logf.h" 28#include "logf.h"
29 29
30/* Audio path appears to be: 30/*
31 * DAC --> HP Amp --> Stereo Switch --> HP OUT 31 * Earlier devices audio path appears to be:
32 * \--> LO OUT 32 * DAC \--> HP Amp --> Stereo Switch --> HP OUT
33 * \-> LO OUT
33 * 34 *
34 * The real purpose of the Stereo Switch is not clear. 35 * Recent devices, the audio path seems to have changed to:
35 * It appears to switch sources between the HP amp and something, 36 * DAC --> HP Amp --> Stereo Switch \--> HP OUT
36 * likely something unimplemented. */ 37 * \-> LO OUT
38 */
37 39
38void audiohw_init(void) 40void audiohw_init(void)
39{ 41{
40 /* explicitly mute everything */ 42 /* explicitly mute everything */
41 gpio_set_level(GPIO_MAX97220_SHDN, 0); 43 gpio_set_level(GPIO_HPAMP_SHDN, 0);
42 gpio_set_level(GPIO_ISL54405_MUTE, 1); 44 gpio_set_level(GPIO_STEREOSW_MUTE, 1);
43 gpio_set_level(GPIO_PCM5102A_XMIT, 0); 45 gpio_set_level(GPIO_DAC_XMIT, 0);
44 46
45 aic_set_play_last_sample(true); 47 aic_set_play_last_sample(true);
46 aic_set_external_codec(true); 48 aic_set_external_codec(true);
@@ -53,8 +55,8 @@ void audiohw_init(void)
53 mdelay(10); 55 mdelay(10);
54 56
55 /* power on DAC and HP Amp */ 57 /* power on DAC and HP Amp */
56 gpio_set_level(GPIO_PCM5102A_ANALOG_PWR, 1); 58 gpio_set_level(GPIO_DAC_ANALOG_PWR, 1);
57 gpio_set_level(GPIO_MAX97220_POWER, 1); 59 gpio_set_level(GPIO_HPAMP_POWER, 1);
58} 60}
59 61
60void audiohw_postinit(void) 62void audiohw_postinit(void)
@@ -76,23 +78,23 @@ void audiohw_postinit(void)
76 jz_writef(AIC_CCR, ERPL(0)); 78 jz_writef(AIC_CCR, ERPL(0));
77 79
78 /* unmute - attempt to make power-on pop-free */ 80 /* unmute - attempt to make power-on pop-free */
79 gpio_set_level(GPIO_ISL54405_SEL, 0); 81 gpio_set_level(GPIO_STEREOSW_SEL, 0);
80 gpio_set_level(GPIO_MAX97220_SHDN, 1); 82 gpio_set_level(GPIO_HPAMP_SHDN, 1);
81 mdelay(10); 83 mdelay(10);
82 gpio_set_level(GPIO_PCM5102A_XMIT, 1); 84 gpio_set_level(GPIO_DAC_XMIT, 1);
83 mdelay(10); 85 mdelay(10);
84 gpio_set_level(GPIO_ISL54405_MUTE, 0); 86 gpio_set_level(GPIO_STEREOSW_MUTE, 0);
85} 87}
86 88
87/* TODO: get shutdown just right according to dac datasheet */ 89/* TODO: get shutdown just right according to dac datasheet */
88void audiohw_close(void) 90void audiohw_close(void)
89{ 91{
90 /* mute - attempt to make power-off pop-free */ 92 /* mute - attempt to make power-off pop-free */
91 gpio_set_level(GPIO_ISL54405_MUTE, 1); 93 gpio_set_level(GPIO_STEREOSW_MUTE, 1);
92 mdelay(10); 94 mdelay(10);
93 gpio_set_level(GPIO_PCM5102A_XMIT, 0); 95 gpio_set_level(GPIO_DAC_XMIT, 0);
94 mdelay(10); 96 mdelay(10);
95 gpio_set_level(GPIO_MAX97220_SHDN, 0); 97 gpio_set_level(GPIO_HPAMP_SHDN, 0);
96} 98}
97 99
98void audiohw_set_frequency(int fsel) 100void audiohw_set_frequency(int fsel)
diff --git a/firmware/target/mips/ingenic_x1000/erosqnative/button-erosqnative.c b/firmware/target/mips/ingenic_x1000/erosqnative/button-erosqnative.c
index 6c50021ce1..d82cb5b5dc 100644
--- a/firmware/target/mips/ingenic_x1000/erosqnative/button-erosqnative.c
+++ b/firmware/target/mips/ingenic_x1000/erosqnative/button-erosqnative.c
@@ -127,7 +127,7 @@ bool headphones_inserted(void)
127 { 127 {
128 hp_detect_reg_old = hp_detect_reg; 128 hp_detect_reg_old = hp_detect_reg;
129#if !defined(BOOTLOADER) 129#if !defined(BOOTLOADER)
130 pcm5102_set_outputs(); 130 dac_set_outputs();
131#endif 131#endif
132 } 132 }
133 return hp_detect_reg & 0x10 ? false : true; 133 return hp_detect_reg & 0x10 ? false : true;
@@ -140,7 +140,7 @@ bool lineout_inserted(void)
140 { 140 {
141 hp_detect_reg_old = hp_detect_reg; 141 hp_detect_reg_old = hp_detect_reg;
142#if !defined(BOOTLOADER) 142#if !defined(BOOTLOADER)
143 pcm5102_set_outputs(); 143 dac_set_outputs();
144#endif 144#endif
145 } 145 }
146 return hp_detect_reg & 0x20 ? false : true; 146 return hp_detect_reg & 0x20 ? false : true;
diff --git a/firmware/target/mips/ingenic_x1000/erosqnative/gpio-target.h b/firmware/target/mips/ingenic_x1000/erosqnative/gpio-target.h
index 376eae136e..3318a39786 100644
--- a/firmware/target/mips/ingenic_x1000/erosqnative/gpio-target.h
+++ b/firmware/target/mips/ingenic_x1000/erosqnative/gpio-target.h
@@ -24,26 +24,26 @@ DEFINE_PINGROUP(I2S, GPIO_B, 0x1f << 0, GPIOF_DEVICE(1))
24DEFINE_PINGROUP(I2C2, GPIO_D, 3 << 0, GPIOF_DEVICE(1)) 24DEFINE_PINGROUP(I2C2, GPIO_D, 3 << 0, GPIOF_DEVICE(1))
25 25
26/* Name Pin Function */ 26/* Name Pin Function */
27/* mute DAC - 0 - mute, 1 - play. Affects both HP and LO. */ 27/* mute DAC: 0 - mute, 1 - play */
28DEFINE_GPIO(PCM5102A_XMIT, GPIO_PB(12), GPIOF_OUTPUT(0)) 28DEFINE_GPIO(DAC_XMIT, GPIO_PB(12), GPIOF_OUTPUT(0))
29 29
30/* mute HP amp, no effect on LO. 0 - mute, 1 - play */ 30/* mute HP amp: 0 - mute, 1 - play */
31DEFINE_GPIO(MAX97220_SHDN, GPIO_PB(8), GPIOF_OUTPUT(0)) 31DEFINE_GPIO(HPAMP_SHDN, GPIO_PB(8), GPIOF_OUTPUT(0))
32 32
33/* mute audio mux, only affects Headphone out. 33/* mute audio mux: 0 - play, 1 - mute */
34 * 0 - play, 1 - mute */ 34DEFINE_GPIO(STEREOSW_MUTE, GPIO_PB(15), GPIOF_OUTPUT(1))
35DEFINE_GPIO(ISL54405_MUTE, GPIO_PB(15), GPIOF_OUTPUT(1))
36 35
37/* switches HP on/off - 0 HP on, 1 hp off, has no effect on LO. 36/*
38 * As best I can tell, it switches HP Out sources between HP amp and something 37 * Original devices: switches HP on/off - 0 HP on, 1 HP off, no effect on LO.
39 * not implemented - there seem to be resistors missing. */ 38 * Newer devices: switches between HP and LO - 0 HP, 1 LO.
40DEFINE_GPIO(ISL54405_SEL, GPIO_PB(5), GPIOF_OUTPUT(0)) 39 */
40DEFINE_GPIO(STEREOSW_SEL, GPIO_PB(5), GPIOF_OUTPUT(0))
41 41
42/* DAC AVDD */ 42/* DAC AVDD */
43DEFINE_GPIO(PCM5102A_ANALOG_PWR, GPIO_PB(9), GPIOF_OUTPUT(0)) 43DEFINE_GPIO(DAC_ANALOG_PWR, GPIO_PB(9), GPIOF_OUTPUT(0))
44 44
45/* Headphone Amp power */ 45/* Headphone Amp power */
46DEFINE_GPIO(MAX97220_POWER, GPIO_PB(6), GPIOF_OUTPUT(0)) 46DEFINE_GPIO(HPAMP_POWER, GPIO_PB(6), GPIOF_OUTPUT(0))
47 47
48/* SD card */ 48/* SD card */
49DEFINE_GPIO(MSC0_CD, GPIO_PB(11), GPIOF_INPUT) 49DEFINE_GPIO(MSC0_CD, GPIO_PB(11), GPIOF_INPUT)