diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9965b1e9045f1f2c9401696ef270e6b20b57ca5c..436463d8b799253857ed75482c91c0491dae038d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -10,6 +10,8 @@ default: # built via: # docker load < $(nix-build nix/docker-image.nix) image: registry.gitlab.com/flow3r-badge/flow3r-build:kfjixcricw2358zp5vg15b784l9jnpzz + before_script: + - sed -i 's/clk_info->bclk_div = 8;/clk_info->bclk_div = 13;/g' $IDF_PATH/components/driver/i2s/i2s_pdm.c build: stage: build diff --git a/components/flow3r_bsp/flow3r_bsp_audio.c b/components/flow3r_bsp/flow3r_bsp_audio.c index 660ba4ebd99598514132d2fc2a5777b69457527f..4d55bb01d3c7c44406fddc0ce961f9f50bf791c2 100644 --- a/components/flow3r_bsp/flow3r_bsp_audio.c +++ b/components/flow3r_bsp/flow3r_bsp_audio.c @@ -2,53 +2,75 @@ #include <string.h> -#include "driver/i2s.h" +#include "driver/i2s_pdm.h" #include "esp_log.h" +i2s_chan_handle_t tx_handle; + esp_err_t flow3r_bsp_audio_write(const void *src, size_t size, size_t *bytes_written, TickType_t ticks_to_wait) { - return i2s_write(0, src, size, bytes_written, ticks_to_wait); + return i2s_channel_write(tx_handle, src, size, bytes_written, ticks_to_wait); } #include "flow3r_bsp_max98091.h" -// TODO: rewrite to new driver, enable stereo +// copied from ESP-IDF 5.2 +#define I2S_PDM_TX_SLOT_DAC_DEFAULT_CONFIG(bits_per_sample, mono_or_stereo) { \ + .data_bit_width = bits_per_sample, \ + .slot_bit_width = I2S_SLOT_BIT_WIDTH_AUTO, \ + .slot_mode = mono_or_stereo, \ + .sd_prescale = 0, \ + .sd_scale = I2S_PDM_SIG_SCALING_MUL_1, \ + .hp_scale = I2S_PDM_SIG_SCALING_MUL_1, \ + .lp_scale = I2S_PDM_SIG_SCALING_MUL_1, \ + .sinc_scale = I2S_PDM_SIG_SCALING_MUL_1, \ + .line_mode = ((mono_or_stereo) == I2S_SLOT_MODE_MONO ? \ + I2S_PDM_TX_ONE_LINE_DAC : I2S_PDM_TX_TWO_LINE_DAC), \ + .hp_en = true, \ + .hp_cut_off_freq_hz = 35.5, \ + .sd_dither = 0, \ + .sd_dither2 = 1, \ +} + +#define I2S_PDM_TX_CLK_DAC_DEFAULT_CONFIG(rate) { \ + .sample_rate_hz = rate, \ + .clk_src = I2S_CLK_SRC_DEFAULT, \ + .mclk_multiple = I2S_MCLK_MULTIPLE_256, \ + .up_sample_fp = 960, \ + .up_sample_fs = (rate) / 100, \ +} +// .bclk_div = 13, void flow3r_bsp_audio_init(void) { //flow3r_bsp_max98091_init(); //vTaskDelay(100 / portTICK_PERIOD_MS); // dunno if necessary - static const i2s_config_t i2s_config = { - .mode = I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_PDM, - .sample_rate = FLOW3R_BSP_AUDIO_SAMPLE_RATE, - .bits_per_sample = 16, - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, - .communication_format = I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_LSB, - .intr_alloc_flags = 0, // default interrupt priority - .dma_buf_count = FLOW3R_BSP_AUDIO_DMA_BUFFER_COUNT, - .dma_buf_len = FLOW3R_BSP_AUDIO_DMA_BUFFER_SIZE, - .use_apll = false - }; - static const i2s_pin_config_t pin_config = { - .bck_io_num = I2S_PIN_NO_CHANGE, - .mck_io_num = I2S_PIN_NO_CHANGE, - .ws_io_num = 45, - .data_out_num = 46, - .data_in_num = I2S_PIN_NO_CHANGE, + + i2s_chan_config_t chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG(I2S_NUM_0, I2S_ROLE_MASTER); + i2s_new_channel(&chan_cfg, &tx_handle, NULL); + + i2s_pdm_tx_config_t pdm_tx_cfg = { + .clk_cfg = I2S_PDM_TX_CLK_DAC_DEFAULT_CONFIG(FLOW3R_BSP_AUDIO_SAMPLE_RATE), + .slot_cfg = I2S_PDM_TX_SLOT_DAC_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_STEREO), + .gpio_cfg = { + .dout = 46, + .dout2 = 45 + }, }; - ESP_ERROR_CHECK(i2s_driver_install(0, &i2s_config, 0, NULL)); - i2s_set_pin(0, &pin_config); + i2s_channel_init_pdm_tx_mode(tx_handle, &pdm_tx_cfg); + i2s_channel_enable(tx_handle); } + float flow3r_bsp_audio_headphones_set_volume(bool mute, float dB) { - return dB; //flow3r_bsp_max98091_headphones_set_volume(mute, dB); + return 0; //flow3r_bsp_max98091_headphones_set_volume(mute, dB); } float flow3r_bsp_audio_speaker_set_volume(bool mute, float dB) { - return dB; //flow3r_bsp_max98091_speaker_set_volume(mute, dB); + return 0; //flow3r_bsp_max98091_speaker_set_volume(mute, dB); } int8_t flow3r_bsp_audio_headset_set_gain_dB(int8_t gain_dB) { - return gain_dB; //flow3r_bsp_max98091_headset_set_gain_dB(gain_dB); + return 0; //flow3r_bsp_max98091_headset_set_gain_dB(gain_dB); } void flow3r_bsp_audio_read_jacksense(flow3r_bsp_audio_jacksense_state_t *st) {