diff options
author | Aidan MacDonald <amachronic@protonmail.com> | 2021-05-31 01:26:26 +0100 |
---|---|---|
committer | Aidan MacDonald <amachronic@protonmail.com> | 2021-05-31 23:00:14 +0100 |
commit | 663c5268ace48cc4be03b4c43355038f06d4b3c5 (patch) | |
tree | 192b2189580357cc2f886bd248c99572b8a21cda /firmware/target/mips/ingenic_x1000 | |
parent | f63edb52ef8ecf18520926b40b3c61db37081a9d (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.c | 50 |
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)); } |