summaryrefslogtreecommitdiff
path: root/firmware/target/mips/ingenic_x1000
diff options
context:
space:
mode:
authorAidan MacDonald <amachronic@protonmail.com>2021-05-31 01:26:26 +0100
committerAidan MacDonald <amachronic@protonmail.com>2021-05-31 23:00:14 +0100
commit663c5268ace48cc4be03b4c43355038f06d4b3c5 (patch)
tree192b2189580357cc2f886bd248c99572b8a21cda /firmware/target/mips/ingenic_x1000
parentf63edb52ef8ecf18520926b40b3c61db37081a9d (diff)
AK4376 driver: refactoring
Some audiohw API calls are shared between playback and recording, eg. frequency settings. Implementing these in the DAC driver won't work for the M3K, as it uses a separate codec for microphone input. Change-Id: Ieb0a267f8a81b9e2bbf0bbca951c5778f8dcd203
Diffstat (limited to 'firmware/target/mips/ingenic_x1000')
-rw-r--r--firmware/target/mips/ingenic_x1000/fiiom3k/audiohw-fiiom3k.c50
1 files changed, 36 insertions, 14 deletions
diff --git a/firmware/target/mips/ingenic_x1000/fiiom3k/audiohw-fiiom3k.c b/firmware/target/mips/ingenic_x1000/fiiom3k/audiohw-fiiom3k.c
index d1c4d67d33..542d1745dc 100644
--- a/firmware/target/mips/ingenic_x1000/fiiom3k/audiohw-fiiom3k.c
+++ b/firmware/target/mips/ingenic_x1000/fiiom3k/audiohw-fiiom3k.c
@@ -22,10 +22,24 @@
#include "audiohw.h"
#include "system.h"
#include "pcm_sampr.h"
-#include "logf.h"
#include "aic-x1000.h"
#include "i2c-x1000.h"
#include "gpio-x1000.h"
+#include "logf.h"
+
+static int cur_fsel = HW_FREQ_48;
+static int cur_power_mode = 0;
+
+static void set_ak_freqmode(void)
+{
+ int freq = hw_freq_sampr[cur_fsel];
+ int mult = freq >= SAMPR_176 ? 128 : 256;
+
+ aic_enable_i2s_bit_clock(false);
+ aic_set_i2s_clock(X1000_CLK_SCLK_A, freq, mult);
+ ak4376_set_freqmode(cur_fsel, mult, cur_power_mode);
+ aic_enable_i2s_bit_clock(true);
+}
void audiohw_init(void)
{
@@ -36,7 +50,8 @@ void audiohw_init(void)
/* Initialize DAC */
i2c_x1000_set_freq(AK4376_BUS, I2C_FREQ_400K);
- ak4376_init();
+ ak4376_open();
+ set_ak_freqmode();
}
void audiohw_postinit(void)
@@ -48,22 +63,29 @@ void audiohw_close(void)
ak4376_close();
}
-void ak4376_set_pdn_pin(int level)
+void audiohw_set_volume(int vol_l, int vol_r)
{
- gpio_config(GPIO_A, 1 << 16, GPIO_OUTPUT(level ? 1 : 0));
+ ak4376_set_volume(vol_l, vol_r);
}
-int ak4376_set_mclk_freq(int hw_freq, bool enabled)
+void audiohw_set_filter_roll_off(int val)
{
- int freq = hw_freq_sampr[hw_freq];
- int mult = freq >= SAMPR_176 ? 128 : 256;
+ ak4376_set_filter_roll_off(val);
+}
+
+void audiohw_set_frequency(int fsel)
+{
+ cur_fsel = fsel;
+ set_ak_freqmode();
+}
- if(enabled) {
- if(aic_set_i2s_clock(X1000_CLK_SCLK_A, freq, mult)) {
- logf("WARNING: unachievable audio rate %d x %d!?", freq, mult);
- }
- }
+void audiohw_set_power_mode(int mode)
+{
+ cur_power_mode = mode;
+ set_ak_freqmode();
+}
- aic_enable_i2s_bit_clock(enabled);
- return mult;
+void ak4376_set_pdn_pin(int level)
+{
+ gpio_config(GPIO_A, 1 << 16, GPIO_OUTPUT(level ? 1 : 0));
}