Lines Matching refs:i2s_num
56 #define I2S_ENTER_CRITICAL_ISR(i2s_num) portENTER_CRITICAL_ISR(&i2s_spinlock[i2s_num]) argument
57 #define I2S_EXIT_CRITICAL_ISR(i2s_num) portEXIT_CRITICAL_ISR(&i2s_spinlock[i2s_num]) argument
58 #define I2S_ENTER_CRITICAL(i2s_num) portENTER_CRITICAL(&i2s_spinlock[i2s_num]) argument
59 #define I2S_EXIT_CRITICAL(i2s_num) portEXIT_CRITICAL(&i2s_spinlock[i2s_num]) argument
103 i2s_port_t i2s_num; /*!< I2S port number*/ member
311 static esp_err_t i2s_dma_intr_init(i2s_port_t i2s_num, int intr_flag) in i2s_dma_intr_init() argument
317 switch (i2s_num) { in i2s_dma_intr_init()
330 if ( p_i2s[i2s_num]->dir & I2S_DIR_TX_) { in i2s_dma_intr_init()
333 …ESP_RETURN_ON_ERROR(gdma_new_channel(&dma_cfg, &p_i2s[i2s_num]->tx_dma_chan), TAG, "Register tx dm… in i2s_dma_intr_init()
334 …ESP_RETURN_ON_ERROR(gdma_connect(p_i2s[i2s_num]->tx_dma_chan, trig), TAG, "Connect tx dma channel … in i2s_dma_intr_init()
337 gdma_register_tx_event_callbacks(p_i2s[i2s_num]->tx_dma_chan, &cb, p_i2s[i2s_num]); in i2s_dma_intr_init()
339 if ( p_i2s[i2s_num]->dir & I2S_DIR_RX_) { in i2s_dma_intr_init()
342 …ESP_RETURN_ON_ERROR(gdma_new_channel(&dma_cfg, &p_i2s[i2s_num]->rx_dma_chan), TAG, "Register rx dm… in i2s_dma_intr_init()
343 …ESP_RETURN_ON_ERROR(gdma_connect(p_i2s[i2s_num]->rx_dma_chan, trig), TAG, "Connect rx dma channel … in i2s_dma_intr_init()
346 gdma_register_rx_event_callbacks(p_i2s[i2s_num]->rx_dma_chan, &cb, p_i2s[i2s_num]); in i2s_dma_intr_init()
350 …OR(esp_intr_alloc(i2s_periph_signal[i2s_num].irq, intr_flag, i2s_intr_handler_default, p_i2s[i2s_n… in i2s_dma_intr_init()
355 static void i2s_tx_reset(i2s_port_t i2s_num) in i2s_tx_reset() argument
357 p_i2s[i2s_num]->tx->curr_ptr = NULL; in i2s_tx_reset()
358 p_i2s[i2s_num]->tx->rw_pos = 0; in i2s_tx_reset()
359 i2s_hal_tx_reset(&(p_i2s[i2s_num]->hal)); in i2s_tx_reset()
361 gdma_reset(p_i2s[i2s_num]->tx_dma_chan); in i2s_tx_reset()
363 i2s_hal_tx_reset_dma(&(p_i2s[i2s_num]->hal)); in i2s_tx_reset()
365 i2s_hal_tx_reset_fifo(&(p_i2s[i2s_num]->hal)); in i2s_tx_reset()
373 static void i2s_rx_reset(i2s_port_t i2s_num) in i2s_rx_reset() argument
375 p_i2s[i2s_num]->rx->curr_ptr = NULL; in i2s_rx_reset()
376 p_i2s[i2s_num]->rx->rw_pos = 0; in i2s_rx_reset()
377 i2s_hal_rx_reset(&(p_i2s[i2s_num]->hal)); in i2s_rx_reset()
379 gdma_reset(p_i2s[i2s_num]->rx_dma_chan); in i2s_rx_reset()
381 i2s_hal_rx_reset_dma(&(p_i2s[i2s_num]->hal)); in i2s_rx_reset()
383 i2s_hal_rx_reset_fifo(&(p_i2s[i2s_num]->hal)); in i2s_rx_reset()
386 static void i2s_tx_start(i2s_port_t i2s_num) in i2s_tx_start() argument
389 gdma_start(p_i2s[i2s_num]->tx_dma_chan, (uint32_t) p_i2s[i2s_num]->tx->desc[0]); in i2s_tx_start()
391 i2s_hal_tx_enable_dma(&(p_i2s[i2s_num]->hal)); in i2s_tx_start()
392 i2s_hal_tx_enable_intr(&(p_i2s[i2s_num]->hal)); in i2s_tx_start()
393 i2s_hal_tx_start_link(&(p_i2s[i2s_num]->hal), (uint32_t) p_i2s[i2s_num]->tx->desc[0]); in i2s_tx_start()
395 i2s_hal_tx_start(&(p_i2s[i2s_num]->hal)); in i2s_tx_start()
398 static void i2s_rx_start(i2s_port_t i2s_num) in i2s_rx_start() argument
401 gdma_start(p_i2s[i2s_num]->rx_dma_chan, (uint32_t) p_i2s[i2s_num]->rx->desc[0]); in i2s_rx_start()
403 i2s_hal_rx_enable_dma(&(p_i2s[i2s_num]->hal)); in i2s_rx_start()
404 i2s_hal_rx_enable_intr(&(p_i2s[i2s_num]->hal)); in i2s_rx_start()
405 i2s_hal_rx_start_link(&(p_i2s[i2s_num]->hal), (uint32_t) p_i2s[i2s_num]->rx->desc[0]); in i2s_rx_start()
407 i2s_hal_rx_start(&(p_i2s[i2s_num]->hal)); in i2s_rx_start()
410 static void i2s_tx_stop(i2s_port_t i2s_num) in i2s_tx_stop() argument
412 i2s_hal_tx_stop(&(p_i2s[i2s_num]->hal)); in i2s_tx_stop()
414 gdma_stop(p_i2s[i2s_num]->tx_dma_chan); in i2s_tx_stop()
416 i2s_hal_tx_stop_link(&(p_i2s[i2s_num]->hal)); in i2s_tx_stop()
417 i2s_hal_tx_disable_intr(&(p_i2s[i2s_num]->hal)); in i2s_tx_stop()
418 i2s_hal_tx_disable_dma(&(p_i2s[i2s_num]->hal)); in i2s_tx_stop()
422 static void i2s_rx_stop(i2s_port_t i2s_num) in i2s_rx_stop() argument
424 i2s_hal_rx_stop(&(p_i2s[i2s_num]->hal)); in i2s_rx_stop()
426 gdma_stop(p_i2s[i2s_num]->rx_dma_chan); in i2s_rx_stop()
428 i2s_hal_rx_stop_link(&(p_i2s[i2s_num]->hal)); in i2s_rx_stop()
429 i2s_hal_rx_disable_intr(&(p_i2s[i2s_num]->hal)); in i2s_rx_stop()
430 i2s_hal_rx_disable_dma(&(p_i2s[i2s_num]->hal)); in i2s_rx_stop()
434 esp_err_t i2s_start(i2s_port_t i2s_num) in i2s_start() argument
436 ESP_RETURN_ON_FALSE((i2s_num < SOC_I2S_NUM), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); in i2s_start()
438 I2S_ENTER_CRITICAL(i2s_num); in i2s_start()
440 if (p_i2s[i2s_num]->dir & I2S_DIR_TX_) { in i2s_start()
441 i2s_tx_reset(i2s_num); in i2s_start()
442 i2s_tx_start(i2s_num); in i2s_start()
444 if (p_i2s[i2s_num]->dir & I2S_DIR_RX_) { in i2s_start()
445 i2s_rx_reset(i2s_num); in i2s_start()
446 i2s_rx_start(i2s_num); in i2s_start()
449 esp_intr_enable(p_i2s[i2s_num]->i2s_isr_handle); in i2s_start()
451 I2S_EXIT_CRITICAL(i2s_num); in i2s_start()
455 esp_err_t i2s_stop(i2s_port_t i2s_num) in i2s_stop() argument
457 ESP_RETURN_ON_FALSE((i2s_num < SOC_I2S_NUM), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); in i2s_stop()
458 I2S_ENTER_CRITICAL(i2s_num); in i2s_stop()
460 esp_intr_disable(p_i2s[i2s_num]->i2s_isr_handle); in i2s_stop()
462 if (p_i2s[i2s_num]->dir & I2S_DIR_TX_) { in i2s_stop()
463 i2s_tx_stop(i2s_num); in i2s_stop()
465 if (p_i2s[i2s_num]->dir & I2S_DIR_RX_) { in i2s_stop()
466 i2s_rx_stop(i2s_num); in i2s_stop()
469 i2s_hal_clear_intr_status(&(p_i2s[i2s_num]->hal), I2S_INTR_MAX); in i2s_stop()
471 I2S_EXIT_CRITICAL(i2s_num); in i2s_stop()
478 static inline uint32_t i2s_get_buf_size(i2s_port_t i2s_num) in i2s_get_buf_size() argument
480 i2s_hal_slot_config_t *slot_cfg = &p_i2s[i2s_num]->slot_cfg; in i2s_get_buf_size()
484 uint32_t bytes_per_frame = bytes_per_sample * p_i2s[i2s_num]->active_slot; in i2s_get_buf_size()
485 …p_i2s[i2s_num]->dma_frame_num = (p_i2s[i2s_num]->dma_frame_num * bytes_per_frame > I2S_DMA_BUFFER_… in i2s_get_buf_size()
486 … I2S_DMA_BUFFER_MAX_SIZE / bytes_per_frame : p_i2s[i2s_num]->dma_frame_num; in i2s_get_buf_size()
487 return p_i2s[i2s_num]->dma_frame_num * bytes_per_frame; in i2s_get_buf_size()
490 static esp_err_t i2s_delete_dma_buffer(i2s_port_t i2s_num, i2s_dma_t *dma_obj) in i2s_delete_dma_buffer() argument
493 uint32_t buf_cnt = p_i2s[i2s_num]->dma_desc_num; in i2s_delete_dma_buffer()
508 static esp_err_t i2s_alloc_dma_buffer(i2s_port_t i2s_num, i2s_dma_t *dma_obj) in i2s_alloc_dma_buffer() argument
513 uint32_t buf_cnt = p_i2s[i2s_num]->dma_desc_num; in i2s_alloc_dma_buffer()
538 if (p_i2s[i2s_num]->dir & I2S_DIR_RX_) { in i2s_alloc_dma_buffer()
539 i2s_ll_rx_set_eof_num(p_i2s[i2s_num]->hal.dev, dma_obj->buf_size); in i2s_alloc_dma_buffer()
545 i2s_delete_dma_buffer(i2s_num, dma_obj); in i2s_alloc_dma_buffer()
549 static esp_err_t i2s_realloc_dma_buffer(i2s_port_t i2s_num, i2s_dma_t *dma_obj) in i2s_realloc_dma_buffer() argument
554 i2s_delete_dma_buffer(i2s_num, dma_obj); in i2s_realloc_dma_buffer()
556 … ESP_RETURN_ON_ERROR(i2s_alloc_dma_buffer(i2s_num, dma_obj), TAG, "Failed to allocate dma buffer"); in i2s_realloc_dma_buffer()
561 static esp_err_t i2s_destroy_dma_object(i2s_port_t i2s_num, i2s_dma_t **dma) in i2s_destroy_dma_object() argument
564 ESP_RETURN_ON_FALSE(p_i2s[i2s_num], ESP_ERR_INVALID_ARG, TAG, "I2S not initialized yet"); in i2s_destroy_dma_object()
569 i2s_delete_dma_buffer(i2s_num, (*dma)); in i2s_destroy_dma_object()
591 static esp_err_t i2s_create_dma_object(i2s_port_t i2s_num, i2s_dma_t **dma) in i2s_create_dma_object() argument
595 uint32_t buf_cnt = p_i2s[i2s_num]->dma_desc_num; in i2s_create_dma_object()
623 i2s_destroy_dma_object(i2s_num, dma); in i2s_create_dma_object()
631 static uint32_t i2s_config_source_clock(i2s_port_t i2s_num, bool use_apll, uint32_t mclk) in i2s_config_source_clock() argument
667 static esp_err_t i2s_calculate_adc_dac_clock(int i2s_num, i2s_hal_clock_info_t *clk_info) in i2s_calculate_adc_dac_clock() argument
672 i2s_clk_config_t *clk_cfg = &p_i2s[i2s_num]->clk_cfg; in i2s_calculate_adc_dac_clock()
673 i2s_hal_slot_config_t *slot_cfg = &p_i2s[i2s_num]->slot_cfg; in i2s_calculate_adc_dac_clock()
680 clk_info->mclk = (p_i2s[i2s_num]->use_apll && p_i2s[i2s_num]->fixed_mclk) ? in i2s_calculate_adc_dac_clock()
681 p_i2s[i2s_num]->fixed_mclk : clk_info->bclk * clk_info->bclk_div; in i2s_calculate_adc_dac_clock()
685 clk_info->sclk = i2s_config_source_clock(i2s_num, p_i2s[i2s_num]->use_apll, clk_info->mclk); in i2s_calculate_adc_dac_clock()
698 static esp_err_t i2s_calculate_pdm_tx_clock(int i2s_num, i2s_hal_clock_info_t *clk_info) in i2s_calculate_pdm_tx_clock() argument
700 i2s_clk_config_t *clk_cfg = &p_i2s[i2s_num]->clk_cfg; in i2s_calculate_pdm_tx_clock()
709 clk_info->mclk = (p_i2s[i2s_num]->use_apll && p_i2s[i2s_num]->fixed_mclk) ? in i2s_calculate_pdm_tx_clock()
710 p_i2s[i2s_num]->fixed_mclk : clk_info->bclk * clk_info->bclk_div; in i2s_calculate_pdm_tx_clock()
714 clk_info->sclk = i2s_config_source_clock(i2s_num, p_i2s[i2s_num]->use_apll, clk_info->mclk); in i2s_calculate_pdm_tx_clock()
727 static esp_err_t i2s_calculate_pdm_rx_clock(int i2s_num, i2s_hal_clock_info_t *clk_info) in i2s_calculate_pdm_rx_clock() argument
729 i2s_clk_config_t *clk_cfg = &p_i2s[i2s_num]->clk_cfg; in i2s_calculate_pdm_rx_clock()
736 clk_info->mclk = (p_i2s[i2s_num]->use_apll && p_i2s[i2s_num]->fixed_mclk) ? in i2s_calculate_pdm_rx_clock()
737 p_i2s[i2s_num]->fixed_mclk : clk_info->bclk * clk_info->bclk_div; in i2s_calculate_pdm_rx_clock()
741 clk_info->sclk = i2s_config_source_clock(i2s_num, p_i2s[i2s_num]->use_apll, clk_info->mclk); in i2s_calculate_pdm_rx_clock()
752 static esp_err_t i2s_calculate_common_clock(int i2s_num, i2s_hal_clock_info_t *clk_info) in i2s_calculate_common_clock() argument
754 i2s_clk_config_t *clk_cfg = &p_i2s[i2s_num]->clk_cfg; in i2s_calculate_common_clock()
755 i2s_hal_slot_config_t *slot_cfg = &p_i2s[i2s_num]->slot_cfg; in i2s_calculate_common_clock()
757 uint32_t slot_num = p_i2s[i2s_num]->total_slot < 2 ? 2 : p_i2s[i2s_num]->total_slot; in i2s_calculate_common_clock()
760 if (p_i2s[i2s_num]->role == I2S_ROLE_MASTER) { in i2s_calculate_common_clock()
771 clk_info->sclk = i2s_config_source_clock(i2s_num, p_i2s[i2s_num]->use_apll, clk_info->mclk); in i2s_calculate_common_clock()
782 static esp_err_t i2s_calculate_clock(i2s_port_t i2s_num, i2s_hal_clock_info_t *clk_info) in i2s_calculate_clock() argument
786 if ((int)p_i2s[i2s_num]->mode == I2S_COMM_MODE_ADC_DAC) { in i2s_calculate_clock()
787 …ESP_RETURN_ON_ERROR(i2s_calculate_adc_dac_clock(i2s_num, clk_info), TAG, "ADC/DAC clock calculate … in i2s_calculate_clock()
794 if (p_i2s[i2s_num]->mode == I2S_COMM_MODE_PDM) { in i2s_calculate_clock()
796 if (p_i2s[i2s_num]->dir & I2S_DIR_TX_) { in i2s_calculate_clock()
797 …ESP_RETURN_ON_ERROR(i2s_calculate_pdm_tx_clock(i2s_num, clk_info), TAG, "PDM TX clock calculate fa… in i2s_calculate_clock()
801 if (p_i2s[i2s_num]->dir & I2S_DIR_RX_) { in i2s_calculate_clock()
802 …ESP_RETURN_ON_ERROR(i2s_calculate_pdm_rx_clock(i2s_num, clk_info), TAG, "PDM RX clock calculate fa… in i2s_calculate_clock()
810 …ESP_RETURN_ON_ERROR(i2s_calculate_common_clock(i2s_num, clk_info), TAG, "Common clock calculate fa… in i2s_calculate_clock()
895 esp_err_t i2s_adc_enable(i2s_port_t i2s_num) in i2s_adc_enable() argument
897 ESP_RETURN_ON_FALSE((i2s_num < SOC_I2S_NUM), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); in i2s_adc_enable()
898 … ESP_RETURN_ON_FALSE((p_i2s[i2s_num] != NULL), ESP_ERR_INVALID_STATE, TAG, "Not initialized yet"); in i2s_adc_enable()
899 …ESP_RETURN_ON_FALSE(((int)p_i2s[i2s_num]->mode == I2S_COMM_MODE_ADC_DAC) && (p_i2s[i2s_num]->dir &… in i2s_adc_enable()
904 i2s_rx_reset(i2s_num); in i2s_adc_enable()
905 return i2s_start(i2s_num); in i2s_adc_enable()
908 esp_err_t i2s_adc_disable(i2s_port_t i2s_num) in i2s_adc_disable() argument
910 ESP_RETURN_ON_FALSE((i2s_num < SOC_I2S_NUM), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); in i2s_adc_disable()
911 … ESP_RETURN_ON_FALSE((p_i2s[i2s_num] != NULL), ESP_ERR_INVALID_STATE, TAG, "Not initialized yet"); in i2s_adc_disable()
912 …ESP_RETURN_ON_FALSE(((int)p_i2s[i2s_num]->mode == I2S_COMM_MODE_ADC_DAC) && (p_i2s[i2s_num]->dir &… in i2s_adc_disable()
915 i2s_hal_rx_stop(&(p_i2s[i2s_num]->hal)); in i2s_adc_disable()
921 static esp_err_t i2s_check_cfg_validity(i2s_port_t i2s_num, const i2s_config_t *cfg) in i2s_check_cfg_validity() argument
925 ESP_RETURN_ON_FALSE((i2s_num < SOC_I2S_NUM), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); in i2s_check_cfg_validity()
926 …ESP_RETURN_ON_FALSE(p_i2s[i2s_num] == NULL, ESP_ERR_INVALID_STATE, TAG, "this i2s port is in use"); in i2s_check_cfg_validity()
936 …ESP_RETURN_ON_FALSE(i2s_num == I2S_NUM_0, ESP_ERR_INVALID_ARG, TAG, "I2S PDM mode only support on … in i2s_check_cfg_validity()
951 …ESP_RETURN_ON_FALSE(i2s_num == I2S_NUM_0, ESP_ERR_INVALID_ARG, TAG, "I2S built-in ADC/DAC only sup… in i2s_check_cfg_validity()
963 static void i2s_set_slot_legacy(i2s_port_t i2s_num) in i2s_set_slot_legacy() argument
965 bool is_tx_slave = p_i2s[i2s_num]->role == I2S_ROLE_SLAVE; in i2s_set_slot_legacy()
967 if (p_i2s[i2s_num]->dir == (I2S_DIR_TX_ | I2S_DIR_RX_)) { in i2s_set_slot_legacy()
968 i2s_ll_share_bck_ws(p_i2s[i2s_num]->hal.dev, true); in i2s_set_slot_legacy()
973 i2s_ll_share_bck_ws(p_i2s[i2s_num]->hal.dev, false); in i2s_set_slot_legacy()
975 if (p_i2s[i2s_num]->mode == I2S_COMM_MODE_STD) { in i2s_set_slot_legacy()
976 if (p_i2s[i2s_num]->dir & I2S_DIR_TX_) { in i2s_set_slot_legacy()
977 …i2s_hal_std_set_tx_slot(&(p_i2s[i2s_num]->hal), is_tx_slave, (i2s_hal_slot_config_t *)(&p_i2s[i2s_… in i2s_set_slot_legacy()
979 if (p_i2s[i2s_num]->dir & I2S_DIR_RX_) { in i2s_set_slot_legacy()
980 …i2s_hal_std_set_rx_slot(&(p_i2s[i2s_num]->hal), is_rx_slave, (i2s_hal_slot_config_t *)(&p_i2s[i2s_… in i2s_set_slot_legacy()
984 else if (p_i2s[i2s_num]->mode == I2S_COMM_MODE_PDM) { in i2s_set_slot_legacy()
986 if (p_i2s[i2s_num]->dir & I2S_DIR_TX_) { in i2s_set_slot_legacy()
987 …i2s_hal_pdm_set_tx_slot(&(p_i2s[i2s_num]->hal), is_tx_slave, (i2s_hal_slot_config_t *)(&p_i2s[i2s_… in i2s_set_slot_legacy()
991 if (p_i2s[i2s_num]->dir & I2S_DIR_RX_) { in i2s_set_slot_legacy()
992 …i2s_hal_pdm_set_rx_slot(&(p_i2s[i2s_num]->hal), is_rx_slave, (i2s_hal_slot_config_t *)(&p_i2s[i2s_… in i2s_set_slot_legacy()
998 else if (p_i2s[i2s_num]->mode == I2S_COMM_MODE_TDM) { in i2s_set_slot_legacy()
999 if (p_i2s[i2s_num]->dir & I2S_DIR_TX_) { in i2s_set_slot_legacy()
1000 …i2s_hal_tdm_set_tx_slot(&(p_i2s[i2s_num]->hal), is_tx_slave, (i2s_hal_slot_config_t *)(&p_i2s[i2s_… in i2s_set_slot_legacy()
1002 if (p_i2s[i2s_num]->dir & I2S_DIR_RX_) { in i2s_set_slot_legacy()
1003 …i2s_hal_tdm_set_rx_slot(&(p_i2s[i2s_num]->hal), is_rx_slave, (i2s_hal_slot_config_t *)(&p_i2s[i2s_… in i2s_set_slot_legacy()
1008 else if ((int)p_i2s[i2s_num]->mode == I2S_COMM_MODE_ADC_DAC) { in i2s_set_slot_legacy()
1009 if (p_i2s[i2s_num]->dir & I2S_DIR_TX_) { in i2s_set_slot_legacy()
1012 if (p_i2s[i2s_num]->dir & I2S_DIR_RX_) { in i2s_set_slot_legacy()
1019 static void i2s_set_clock_legacy(i2s_port_t i2s_num) in i2s_set_clock_legacy() argument
1021 i2s_clk_config_t *clk_cfg = &p_i2s[i2s_num]->clk_cfg; in i2s_set_clock_legacy()
1023 i2s_calculate_clock(i2s_num, &clk_info); in i2s_set_clock_legacy()
1024 if (p_i2s[i2s_num]->dir & I2S_DIR_TX_) { in i2s_set_clock_legacy()
1025 i2s_hal_set_tx_clock(&(p_i2s[i2s_num]->hal), &clk_info, clk_cfg->clk_src); in i2s_set_clock_legacy()
1027 if (p_i2s[i2s_num]->dir & I2S_DIR_RX_) { in i2s_set_clock_legacy()
1028 i2s_hal_set_rx_clock(&(p_i2s[i2s_num]->hal), &clk_info, clk_cfg->clk_src); in i2s_set_clock_legacy()
1032 float i2s_get_clk(i2s_port_t i2s_num) in i2s_get_clk() argument
1034 ESP_RETURN_ON_FALSE((i2s_num < SOC_I2S_NUM), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); in i2s_get_clk()
1035 i2s_clk_config_t *clk_cfg = &p_i2s[i2s_num]->clk_cfg; in i2s_get_clk()
1039 esp_err_t i2s_set_clk(i2s_port_t i2s_num, uint32_t rate, uint32_t bits_cfg, i2s_channel_t ch) in i2s_set_clk() argument
1041 ESP_RETURN_ON_FALSE((i2s_num < SOC_I2S_NUM), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); in i2s_set_clk()
1042 …ESP_RETURN_ON_FALSE(p_i2s[i2s_num], ESP_ERR_INVALID_ARG, TAG, "I2S%d has not installed yet", i2s_n… in i2s_set_clk()
1045 if (p_i2s[i2s_num]->dir & I2S_MODE_TX) { in i2s_set_clk()
1046 xSemaphoreTake(p_i2s[i2s_num]->tx->mux, portMAX_DELAY); in i2s_set_clk()
1048 if (p_i2s[i2s_num]->dir & I2S_MODE_RX) { in i2s_set_clk()
1049 xSemaphoreTake(p_i2s[i2s_num]->rx->mux, portMAX_DELAY); in i2s_set_clk()
1053 i2s_stop(i2s_num); in i2s_set_clk()
1055 i2s_clk_config_t *clk_cfg = &p_i2s[i2s_num]->clk_cfg; in i2s_set_clk()
1056 i2s_hal_slot_config_t *slot_cfg = &p_i2s[i2s_num]->slot_cfg; in i2s_set_clk()
1066 if (p_i2s[i2s_num]->mode == I2S_COMM_MODE_STD) { in i2s_set_clk()
1080 if (p_i2s[i2s_num]->mode == I2S_COMM_MODE_TDM) { in i2s_set_clk()
1085 …ESP_RETURN_ON_FALSE(p_i2s[i2s_num]->total_slot >= (32 - __builtin_clz(slot_mask)), ESP_ERR_INVALID… in i2s_set_clk()
1086 … "The max channel number can't be greater than CH%"PRIu32, p_i2s[i2s_num]->total_slot); in i2s_set_clk()
1087 p_i2s[i2s_num]->active_slot = __builtin_popcount(slot_mask); in i2s_set_clk()
1091 p_i2s[i2s_num]->active_slot = (slot_cfg->slot_mode == I2S_SLOT_MODE_MONO) ? 1 : 2; in i2s_set_clk()
1094 i2s_set_slot_legacy(i2s_num); in i2s_set_clk()
1095 i2s_set_clock_legacy(i2s_num); in i2s_set_clk()
1097 uint32_t buf_size = i2s_get_buf_size(i2s_num); in i2s_set_clk()
1098 bool need_realloc = buf_size != p_i2s[i2s_num]->last_buf_size; in i2s_set_clk()
1102 if (p_i2s[i2s_num]->dir & I2S_DIR_TX_) { in i2s_set_clk()
1103 p_i2s[i2s_num]->tx->buf_size = buf_size; in i2s_set_clk()
1104 ret = i2s_realloc_dma_buffer(i2s_num, p_i2s[i2s_num]->tx); in i2s_set_clk()
1105 xQueueReset(p_i2s[i2s_num]->tx->queue); in i2s_set_clk()
1106 ESP_RETURN_ON_ERROR(ret, TAG, "I2S%d tx DMA buffer malloc failed", i2s_num); in i2s_set_clk()
1108 if (p_i2s[i2s_num]->dir & I2S_DIR_RX_) { in i2s_set_clk()
1109 p_i2s[i2s_num]->rx->buf_size = buf_size; in i2s_set_clk()
1110 ret = i2s_realloc_dma_buffer(i2s_num, p_i2s[i2s_num]->rx); in i2s_set_clk()
1111 xQueueReset(p_i2s[i2s_num]->rx->queue); in i2s_set_clk()
1112 ESP_RETURN_ON_ERROR(ret, TAG, "I2S%d rx DMA buffer malloc failed", i2s_num); in i2s_set_clk()
1116 p_i2s[i2s_num]->last_buf_size = buf_size; in i2s_set_clk()
1119 i2s_start(i2s_num); in i2s_set_clk()
1121 if (p_i2s[i2s_num]->dir & I2S_MODE_TX) { in i2s_set_clk()
1122 xSemaphoreGive(p_i2s[i2s_num]->tx->mux); in i2s_set_clk()
1124 if (p_i2s[i2s_num]->dir & I2S_MODE_RX) { in i2s_set_clk()
1125 xSemaphoreGive(p_i2s[i2s_num]->rx->mux); in i2s_set_clk()
1131 esp_err_t i2s_set_sample_rates(i2s_port_t i2s_num, uint32_t rate) in i2s_set_sample_rates() argument
1133 ESP_RETURN_ON_FALSE((i2s_num < SOC_I2S_NUM), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); in i2s_set_sample_rates()
1134 i2s_hal_slot_config_t *slot_cfg = &p_i2s[i2s_num]->slot_cfg; in i2s_set_sample_rates()
1137 if (p_i2s[i2s_num]->mode == I2S_COMM_MODE_TDM) { in i2s_set_sample_rates()
1141 return i2s_set_clk(i2s_num, rate, slot_cfg->data_bit_width, slot_cfg->slot_mode | (mask << 16)); in i2s_set_sample_rates()
1146 esp_err_t i2s_pcm_config(i2s_port_t i2s_num, const i2s_pcm_cfg_t *pcm_cfg) in i2s_pcm_config() argument
1148 ESP_RETURN_ON_FALSE(p_i2s[i2s_num], ESP_FAIL, TAG, "i2s has not installed yet"); in i2s_pcm_config()
1150 if (p_i2s[i2s_num]->dir & I2S_MODE_TX) { in i2s_pcm_config()
1151 xSemaphoreTake(p_i2s[i2s_num]->tx->mux, portMAX_DELAY); in i2s_pcm_config()
1153 if (p_i2s[i2s_num]->dir & I2S_MODE_RX) { in i2s_pcm_config()
1154 xSemaphoreTake(p_i2s[i2s_num]->rx->mux, portMAX_DELAY); in i2s_pcm_config()
1157 i2s_stop(i2s_num); in i2s_pcm_config()
1158 I2S_ENTER_CRITICAL(i2s_num); in i2s_pcm_config()
1159 if (p_i2s[i2s_num]->dir & I2S_DIR_TX_) { in i2s_pcm_config()
1160 i2s_ll_tx_set_pcm_type(p_i2s[i2s_num]->hal.dev, pcm_cfg->pcm_type); in i2s_pcm_config()
1162 if (p_i2s[i2s_num]->dir & I2S_DIR_RX_) { in i2s_pcm_config()
1163 i2s_ll_rx_set_pcm_type(p_i2s[i2s_num]->hal.dev, pcm_cfg->pcm_type); in i2s_pcm_config()
1165 I2S_EXIT_CRITICAL(i2s_num); in i2s_pcm_config()
1166 i2s_start(i2s_num); in i2s_pcm_config()
1168 if (p_i2s[i2s_num]->dir & I2S_MODE_TX) { in i2s_pcm_config()
1169 xSemaphoreGive(p_i2s[i2s_num]->tx->mux); in i2s_pcm_config()
1171 if (p_i2s[i2s_num]->dir & I2S_MODE_RX) { in i2s_pcm_config()
1172 xSemaphoreGive(p_i2s[i2s_num]->rx->mux); in i2s_pcm_config()
1180 esp_err_t i2s_set_pdm_rx_down_sample(i2s_port_t i2s_num, i2s_pdm_dsr_t downsample) in i2s_set_pdm_rx_down_sample() argument
1182 ESP_RETURN_ON_FALSE(p_i2s[i2s_num], ESP_FAIL, TAG, "i2s has not installed yet"); in i2s_set_pdm_rx_down_sample()
1183 …ESP_RETURN_ON_FALSE((p_i2s[i2s_num]->mode == I2S_COMM_MODE_PDM), ESP_ERR_INVALID_ARG, TAG, "i2s mo… in i2s_set_pdm_rx_down_sample()
1184 xSemaphoreTake(p_i2s[i2s_num]->rx->mux, portMAX_DELAY); in i2s_set_pdm_rx_down_sample()
1185 i2s_stop(i2s_num); in i2s_set_pdm_rx_down_sample()
1186 p_i2s[i2s_num]->clk_cfg.dn_sample_mode = downsample; in i2s_set_pdm_rx_down_sample()
1187 i2s_ll_rx_set_pdm_dsr(p_i2s[i2s_num]->hal.dev, downsample); in i2s_set_pdm_rx_down_sample()
1188 i2s_start(i2s_num); in i2s_set_pdm_rx_down_sample()
1189 xSemaphoreGive(p_i2s[i2s_num]->rx->mux); in i2s_set_pdm_rx_down_sample()
1190 …return i2s_set_clk(i2s_num, p_i2s[i2s_num]->clk_cfg.sample_rate_hz, p_i2s[i2s_num]->slot_cfg.data_… in i2s_set_pdm_rx_down_sample()
1195 esp_err_t i2s_set_pdm_tx_up_sample(i2s_port_t i2s_num, const i2s_pdm_tx_upsample_cfg_t *upsample_cf… in i2s_set_pdm_tx_up_sample() argument
1197 ESP_RETURN_ON_FALSE(p_i2s[i2s_num], ESP_FAIL, TAG, "i2s has not installed yet"); in i2s_set_pdm_tx_up_sample()
1198 …ESP_RETURN_ON_FALSE((p_i2s[i2s_num]->mode == I2S_COMM_MODE_PDM) && (p_i2s[i2s_num]->dir & I2S_DIR_… in i2s_set_pdm_tx_up_sample()
1200 xSemaphoreTake(p_i2s[i2s_num]->tx->mux, portMAX_DELAY); in i2s_set_pdm_tx_up_sample()
1201 i2s_stop(i2s_num); in i2s_set_pdm_tx_up_sample()
1202 p_i2s[i2s_num]->clk_cfg.up_sample_fp = upsample_cfg->fp; in i2s_set_pdm_tx_up_sample()
1203 p_i2s[i2s_num]->clk_cfg.up_sample_fs = upsample_cfg->fs; in i2s_set_pdm_tx_up_sample()
1204 i2s_ll_tx_set_pdm_fpfs(p_i2s[i2s_num]->hal.dev, upsample_cfg->fp, upsample_cfg->fs); in i2s_set_pdm_tx_up_sample()
1205 … i2s_ll_tx_set_pdm_over_sample_ratio(p_i2s[i2s_num]->hal.dev, upsample_cfg->fp / upsample_cfg->fs); in i2s_set_pdm_tx_up_sample()
1206 i2s_start(i2s_num); in i2s_set_pdm_tx_up_sample()
1207 xSemaphoreGive(p_i2s[i2s_num]->tx->mux); in i2s_set_pdm_tx_up_sample()
1208 …return i2s_set_clk(i2s_num, p_i2s[i2s_num]->clk_cfg.sample_rate_hz, p_i2s[i2s_num]->slot_cfg.data_… in i2s_set_pdm_tx_up_sample()
1212 static esp_err_t i2s_dma_object_init(i2s_port_t i2s_num) in i2s_dma_object_init() argument
1214 uint32_t buf_size = i2s_get_buf_size(i2s_num); in i2s_dma_object_init()
1215 p_i2s[i2s_num]->last_buf_size = buf_size; in i2s_dma_object_init()
1217 if (p_i2s[i2s_num]->dir & I2S_DIR_TX_) { in i2s_dma_object_init()
1218 …ESP_RETURN_ON_ERROR(i2s_create_dma_object(i2s_num, &p_i2s[i2s_num]->tx), TAG, "I2S TX DMA object c… in i2s_dma_object_init()
1219 p_i2s[i2s_num]->tx->buf_size = buf_size; in i2s_dma_object_init()
1221 if (p_i2s[i2s_num]->dir & I2S_DIR_RX_) { in i2s_dma_object_init()
1222 …ESP_RETURN_ON_ERROR(i2s_create_dma_object(i2s_num, &p_i2s[i2s_num]->rx), TAG, "I2S RX DMA object c… in i2s_dma_object_init()
1223 p_i2s[i2s_num]->rx->buf_size = buf_size; in i2s_dma_object_init()
1228 static void i2s_mode_identify(i2s_port_t i2s_num, const i2s_config_t *i2s_config) in i2s_mode_identify() argument
1231 p_i2s[i2s_num]->mode = I2S_COMM_MODE_STD; in i2s_mode_identify()
1234 p_i2s[i2s_num]->role = I2S_ROLE_MASTER; in i2s_mode_identify()
1236 p_i2s[i2s_num]->role = I2S_ROLE_SLAVE; in i2s_mode_identify()
1239 p_i2s[i2s_num]->dir |= I2S_DIR_TX_; in i2s_mode_identify()
1242 p_i2s[i2s_num]->dir |= I2S_DIR_RX_; in i2s_mode_identify()
1246 p_i2s[i2s_num]->mode = I2S_COMM_MODE_PDM; in i2s_mode_identify()
1252 p_i2s[i2s_num]->mode = I2S_COMM_MODE_TDM; in i2s_mode_identify()
1259 p_i2s[i2s_num]->mode = (i2s_comm_mode_t)I2S_COMM_MODE_ADC_DAC; in i2s_mode_identify()
1264 static esp_err_t i2s_config_transfer(i2s_port_t i2s_num, const i2s_config_t *i2s_config) in i2s_config_transfer() argument
1266 #define SLOT_CFG(m) p_i2s[i2s_num]->slot_cfg.m in i2s_config_transfer()
1267 #define CLK_CFG() p_i2s[i2s_num]->clk_cfg in i2s_config_transfer()
1269 p_i2s[i2s_num]->slot_cfg.data_bit_width = i2s_config->bits_per_sample; in i2s_config_transfer()
1270 …p_i2s[i2s_num]->slot_cfg.slot_bit_width = (int)i2s_config->bits_per_chan < (int)i2s_config->bits_p… in i2s_config_transfer()
1273 p_i2s[i2s_num]->slot_cfg.slot_mode = i2s_config->channel_format < I2S_CHANNEL_FMT_ONLY_RIGHT ? in i2s_config_transfer()
1278 p_i2s[i2s_num]->fixed_mclk = i2s_config->fixed_mclk; in i2s_config_transfer()
1279 p_i2s[i2s_num]->use_apll = false; in i2s_config_transfer()
1282 p_i2s[i2s_num]->use_apll = i2s_config->use_apll; in i2s_config_transfer()
1286 if (p_i2s[i2s_num]->mode == I2S_COMM_MODE_STD) { in i2s_config_transfer()
1314 …p_i2s[i2s_num]->active_slot = (int)p_i2s[i2s_num]->slot_cfg.slot_mode == I2S_SLOT_MODE_MONO ? 1 : … in i2s_config_transfer()
1315 p_i2s[i2s_num]->total_slot = 2; in i2s_config_transfer()
1319 if (p_i2s[i2s_num]->mode == I2S_COMM_MODE_PDM) { in i2s_config_transfer()
1337 …p_i2s[i2s_num]->active_slot = (int)p_i2s[i2s_num]->slot_cfg.slot_mode == I2S_SLOT_MODE_MONO ? 1 : … in i2s_config_transfer()
1338 p_i2s[i2s_num]->total_slot = 2; in i2s_config_transfer()
1344 if (p_i2s[i2s_num]->mode == I2S_COMM_MODE_PDM) { in i2s_config_transfer()
1347 …p_i2s[i2s_num]->active_slot = (int)p_i2s[i2s_num]->slot_cfg.slot_mode == I2S_SLOT_MODE_MONO ? 1 : … in i2s_config_transfer()
1348 p_i2s[i2s_num]->total_slot = 2; in i2s_config_transfer()
1354 if (p_i2s[i2s_num]->mode == I2S_COMM_MODE_TDM) { in i2s_config_transfer()
1359 p_i2s[i2s_num]->slot_cfg.slot_mode = I2S_SLOT_MODE_STEREO; in i2s_config_transfer()
1369 SLOT_CFG(tdm).ws_width = p_i2s[i2s_num]->slot_cfg.slot_bit_width; in i2s_config_transfer()
1378 p_i2s[i2s_num]->active_slot = __builtin_popcount(SLOT_CFG(tdm).slot_mask); in i2s_config_transfer()
1381 … p_i2s[i2s_num]->total_slot = mx_slot < i2s_config->total_chan ? mx_slot : i2s_config->total_chan; in i2s_config_transfer()
1387 if ((int)p_i2s[i2s_num]->mode == I2S_COMM_MODE_ADC_DAC) { in i2s_config_transfer()
1388 p_i2s[i2s_num]->slot_cfg.slot_mode = (p_i2s[i2s_num]->dir & I2S_DIR_TX_) ? in i2s_config_transfer()
1390 p_i2s[i2s_num]->active_slot = (p_i2s[i2s_num]->dir & I2S_DIR_TX_) ? 2 : 1; in i2s_config_transfer()
1391 p_i2s[i2s_num]->total_slot = 2; in i2s_config_transfer()
1402 static esp_err_t i2s_init_legacy(i2s_port_t i2s_num, int intr_alloc_flag) in i2s_init_legacy() argument
1408 if (p_i2s[i2s_num]->use_apll) { in i2s_init_legacy()
1412 …ESP_RETURN_ON_ERROR(esp_pm_lock_create(pm_lock, 0, "i2s_driver", &p_i2s[i2s_num]->pm_lock), TAG, "… in i2s_init_legacy()
1416 if (p_i2s[i2s_num]->use_apll) { in i2s_init_legacy()
1422 if (p_i2s[i2s_num]->mode == I2S_COMM_MODE_STD) { in i2s_init_legacy()
1423 if (p_i2s[i2s_num]->dir & I2S_DIR_TX_) { in i2s_init_legacy()
1424 i2s_hal_std_enable_tx_channel(&(p_i2s[i2s_num]->hal)); in i2s_init_legacy()
1426 if (p_i2s[i2s_num]->dir & I2S_DIR_RX_) { in i2s_init_legacy()
1427 i2s_hal_std_enable_rx_channel(&(p_i2s[i2s_num]->hal)); in i2s_init_legacy()
1431 else if (p_i2s[i2s_num]->mode == I2S_COMM_MODE_PDM) { in i2s_init_legacy()
1433 if (p_i2s[i2s_num]->dir & I2S_DIR_TX_) { in i2s_init_legacy()
1434 i2s_hal_pdm_enable_tx_channel(&(p_i2s[i2s_num]->hal)); in i2s_init_legacy()
1438 if (p_i2s[i2s_num]->dir & I2S_DIR_RX_) { in i2s_init_legacy()
1439 i2s_hal_pdm_enable_rx_channel(&(p_i2s[i2s_num]->hal)); in i2s_init_legacy()
1445 else if (p_i2s[i2s_num]->mode == I2S_COMM_MODE_TDM) { in i2s_init_legacy()
1446 if (p_i2s[i2s_num]->dir & I2S_DIR_TX_) { in i2s_init_legacy()
1447 i2s_hal_tdm_enable_tx_channel(&(p_i2s[i2s_num]->hal)); in i2s_init_legacy()
1449 if (p_i2s[i2s_num]->dir & I2S_DIR_RX_) { in i2s_init_legacy()
1450 i2s_hal_tdm_enable_rx_channel(&(p_i2s[i2s_num]->hal)); in i2s_init_legacy()
1455 if ((int)p_i2s[i2s_num]->mode == I2S_COMM_MODE_ADC_DAC) { in i2s_init_legacy()
1456 if (p_i2s[i2s_num]->dir & I2S_DIR_RX_) { in i2s_init_legacy()
1459 i2s_ll_enable_builtin_adc(p_i2s[i2s_num]->hal.dev, true); in i2s_init_legacy()
1461 if (p_i2s[i2s_num]->dir & I2S_DIR_TX_) { in i2s_init_legacy()
1462 i2s_ll_enable_builtin_dac(p_i2s[i2s_num]->hal.dev, true); in i2s_init_legacy()
1466 i2s_ll_enable_builtin_adc(p_i2s[i2s_num]->hal.dev, false); in i2s_init_legacy()
1467 i2s_ll_enable_builtin_dac(p_i2s[i2s_num]->hal.dev, false); in i2s_init_legacy()
1471 i2s_set_slot_legacy(i2s_num); in i2s_init_legacy()
1472 i2s_set_clock_legacy(i2s_num); in i2s_init_legacy()
1473 …ESP_RETURN_ON_ERROR(i2s_dma_intr_init(i2s_num, intr_alloc_flag), TAG, "I2S interrupt initailze fai… in i2s_init_legacy()
1474 ESP_RETURN_ON_ERROR(i2s_dma_object_init(i2s_num), TAG, "I2S dma object create failed"); in i2s_init_legacy()
1475 if (p_i2s[i2s_num]->dir & I2S_DIR_TX_) { in i2s_init_legacy()
1476 …ESP_RETURN_ON_ERROR(i2s_realloc_dma_buffer(i2s_num, p_i2s[i2s_num]->tx), TAG, "Allocate I2S dma tx… in i2s_init_legacy()
1478 if (p_i2s[i2s_num]->dir & I2S_DIR_RX_) { in i2s_init_legacy()
1479 …ESP_RETURN_ON_ERROR(i2s_realloc_dma_buffer(i2s_num, p_i2s[i2s_num]->rx), TAG, "Allocate I2S dma rx… in i2s_init_legacy()
1485 if (p_i2s[i2s_num]->dir & I2S_DIR_TX_) { in i2s_init_legacy()
1486 i2s_ll_tx_enable_clock(p_i2s[i2s_num]->hal.dev); in i2s_init_legacy()
1488 if (p_i2s[i2s_num]->dir & I2S_DIR_RX_) { in i2s_init_legacy()
1489 i2s_ll_rx_enable_clock(p_i2s[i2s_num]->hal.dev); in i2s_init_legacy()
1496 esp_err_t i2s_driver_uninstall(i2s_port_t i2s_num) in i2s_driver_uninstall() argument
1498 ESP_RETURN_ON_FALSE(i2s_num < SOC_I2S_NUM, ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); in i2s_driver_uninstall()
1499 …ESP_RETURN_ON_FALSE(p_i2s[i2s_num], ESP_ERR_INVALID_STATE, TAG, "I2S port %d has not installed", i… in i2s_driver_uninstall()
1500 i2s_obj_t *obj = p_i2s[i2s_num]; in i2s_driver_uninstall()
1501 i2s_stop(i2s_num); in i2s_driver_uninstall()
1531 i2s_destroy_dma_object(i2s_num, &obj->tx); in i2s_driver_uninstall()
1532 i2s_destroy_dma_object(i2s_num, &obj->rx); in i2s_driver_uninstall()
1567 i2s_platform_release_occupation(i2s_num); in i2s_driver_uninstall()
1569 p_i2s[i2s_num] = NULL; in i2s_driver_uninstall()
1574 esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config, int queue_size, vo… in i2s_driver_install() argument
1582 …ESP_RETURN_ON_ERROR(i2s_check_cfg_validity(i2s_num, i2s_config), TAG, "I2S configuration is invali… in i2s_driver_install()
1587 if (i2s_platform_acquire_occupation(i2s_num, "i2s_legacy") != ESP_OK) { in i2s_driver_install()
1592 p_i2s[i2s_num] = i2s_obj; in i2s_driver_install()
1593 i2s_hal_init(&i2s_obj->hal, i2s_num); in i2s_driver_install()
1596 i2s_mode_identify(i2s_num, i2s_config); in i2s_driver_install()
1597 ESP_GOTO_ON_ERROR(i2s_config_transfer(i2s_num, i2s_config), err, TAG, "I2S install failed"); in i2s_driver_install()
1603 …ESP_GOTO_ON_ERROR(i2s_init_legacy(i2s_num, i2s_config->intr_alloc_flags), err, TAG, "I2S init fail… in i2s_driver_install()
1616 ESP_GOTO_ON_ERROR(i2s_start(i2s_num), err, TAG, "I2S start failed"); in i2s_driver_install()
1622 i2s_driver_uninstall(i2s_num); in i2s_driver_install()
1626 esp_err_t i2s_write(i2s_port_t i2s_num, const void *src, size_t size, size_t *bytes_written, TickTy… in i2s_write() argument
1632 ESP_RETURN_ON_FALSE((i2s_num < SOC_I2S_NUM), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); in i2s_write()
1633 ESP_RETURN_ON_FALSE((p_i2s[i2s_num]->tx), ESP_ERR_INVALID_ARG, TAG, "TX mode is not enabled"); in i2s_write()
1634 xSemaphoreTake(p_i2s[i2s_num]->tx->mux, portMAX_DELAY); in i2s_write()
1636 esp_pm_lock_acquire(p_i2s[i2s_num]->pm_lock); in i2s_write()
1640 …if (p_i2s[i2s_num]->tx->rw_pos == p_i2s[i2s_num]->tx->buf_size || p_i2s[i2s_num]->tx->curr_ptr == … in i2s_write()
1641 …if (xQueueReceive(p_i2s[i2s_num]->tx->queue, &p_i2s[i2s_num]->tx->curr_ptr, ticks_to_wait) == pdFA… in i2s_write()
1644 p_i2s[i2s_num]->tx->rw_pos = 0; in i2s_write()
1646 …buf_size: %d, curr_ptr: %d", size, p_i2s[i2s_num]->tx->rw_pos, p_i2s[i2s_num]->tx->buf_size, (int)… in i2s_write()
1647 data_ptr = (char *)p_i2s[i2s_num]->tx->curr_ptr; in i2s_write()
1648 data_ptr += p_i2s[i2s_num]->tx->rw_pos; in i2s_write()
1649 bytes_can_write = p_i2s[i2s_num]->tx->buf_size - p_i2s[i2s_num]->tx->rw_pos; in i2s_write()
1656 p_i2s[i2s_num]->tx->rw_pos += bytes_can_write; in i2s_write()
1660 esp_pm_lock_release(p_i2s[i2s_num]->pm_lock); in i2s_write()
1662 xSemaphoreGive(p_i2s[i2s_num]->tx->mux); in i2s_write()
1666 esp_err_t i2s_write_expand(i2s_port_t i2s_num, const void *src, size_t size, size_t src_bits, size_… in i2s_write_expand() argument
1675 ESP_RETURN_ON_FALSE((i2s_num < SOC_I2S_NUM), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); in i2s_write_expand()
1678 ESP_RETURN_ON_FALSE((p_i2s[i2s_num]->tx), ESP_ERR_INVALID_ARG, TAG, "TX mode is not enabled"); in i2s_write_expand()
1699 xSemaphoreTake(p_i2s[i2s_num]->tx->mux, portMAX_DELAY); in i2s_write_expand()
1703 …if (p_i2s[i2s_num]->tx->rw_pos == p_i2s[i2s_num]->tx->buf_size || p_i2s[i2s_num]->tx->curr_ptr == … in i2s_write_expand()
1704 …if (xQueueReceive(p_i2s[i2s_num]->tx->queue, &p_i2s[i2s_num]->tx->curr_ptr, ticks_to_wait) == pdFA… in i2s_write_expand()
1707 p_i2s[i2s_num]->tx->rw_pos = 0; in i2s_write_expand()
1709 data_ptr = (char *)p_i2s[i2s_num]->tx->curr_ptr; in i2s_write_expand()
1710 data_ptr += p_i2s[i2s_num]->tx->rw_pos; in i2s_write_expand()
1711 bytes_can_write = p_i2s[i2s_num]->tx->buf_size - p_i2s[i2s_num]->tx->rw_pos; in i2s_write_expand()
1725 p_i2s[i2s_num]->tx->rw_pos += bytes_can_write; in i2s_write_expand()
1727 xSemaphoreGive(p_i2s[i2s_num]->tx->mux); in i2s_write_expand()
1731 esp_err_t i2s_read(i2s_port_t i2s_num, void *dest, size_t size, size_t *bytes_read, TickType_t tick… in i2s_read() argument
1738 ESP_RETURN_ON_FALSE((i2s_num < SOC_I2S_NUM), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); in i2s_read()
1739 ESP_RETURN_ON_FALSE((p_i2s[i2s_num]->rx), ESP_ERR_INVALID_ARG, TAG, "RX mode is not enabled"); in i2s_read()
1740 xSemaphoreTake(p_i2s[i2s_num]->rx->mux, portMAX_DELAY); in i2s_read()
1742 esp_pm_lock_acquire(p_i2s[i2s_num]->pm_lock); in i2s_read()
1745 …if (p_i2s[i2s_num]->rx->rw_pos == p_i2s[i2s_num]->rx->buf_size || p_i2s[i2s_num]->rx->curr_ptr == … in i2s_read()
1746 …if (xQueueReceive(p_i2s[i2s_num]->rx->queue, &p_i2s[i2s_num]->rx->curr_ptr, ticks_to_wait) == pdFA… in i2s_read()
1749 p_i2s[i2s_num]->rx->rw_pos = 0; in i2s_read()
1751 data_ptr = (char *)p_i2s[i2s_num]->rx->curr_ptr; in i2s_read()
1752 data_ptr += p_i2s[i2s_num]->rx->rw_pos; in i2s_read()
1753 bytes_can_read = p_i2s[i2s_num]->rx->buf_size - p_i2s[i2s_num]->rx->rw_pos; in i2s_read()
1760 p_i2s[i2s_num]->rx->rw_pos += bytes_can_read; in i2s_read()
1764 esp_pm_lock_release(p_i2s[i2s_num]->pm_lock); in i2s_read()
1766 xSemaphoreGive(p_i2s[i2s_num]->rx->mux); in i2s_read()
1793 static esp_err_t i2s_check_set_mclk(i2s_port_t i2s_num, gpio_num_t gpio_num) in i2s_check_set_mclk() argument
1802 bool is_i2s0 = i2s_num == I2S_NUM_0; in i2s_check_set_mclk()
1815 gpio_matrix_out_check_and_set(gpio_num, i2s_periph_signal[i2s_num].mck_out_sig, 0, 0); in i2s_check_set_mclk()
1817 ESP_LOGD(TAG, "I2S%d, MCLK output by GPIO%d", i2s_num, gpio_num); in i2s_check_set_mclk()
1821 esp_err_t i2s_zero_dma_buffer(i2s_port_t i2s_num) in i2s_zero_dma_buffer() argument
1823 ESP_RETURN_ON_FALSE((i2s_num < SOC_I2S_NUM), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); in i2s_zero_dma_buffer()
1824 uint32_t buf_cnt = p_i2s[i2s_num]->dma_desc_num; in i2s_zero_dma_buffer()
1827 … if (p_i2s[i2s_num]->rx && p_i2s[i2s_num]->rx->buf != NULL && p_i2s[i2s_num]->rx->buf_size != 0) { in i2s_zero_dma_buffer()
1829 memset(p_i2s[i2s_num]->rx->buf[i], 0, p_i2s[i2s_num]->rx->buf_size); in i2s_zero_dma_buffer()
1834 … if (p_i2s[i2s_num]->tx && p_i2s[i2s_num]->tx->buf != NULL && p_i2s[i2s_num]->tx->buf_size != 0) { in i2s_zero_dma_buffer()
1836 int bytes_left = (p_i2s[i2s_num]->tx->buf_size - p_i2s[i2s_num]->tx->rw_pos) % 4; in i2s_zero_dma_buffer()
1840 i2s_write(i2s_num, (void *)&zero_bytes, bytes_left, &bytes_written, portMAX_DELAY); in i2s_zero_dma_buffer()
1843 memset(p_i2s[i2s_num]->tx->buf[i], 0, p_i2s[i2s_num]->tx->buf_size); in i2s_zero_dma_buffer()
1849 esp_err_t i2s_set_pin(i2s_port_t i2s_num, const i2s_pin_config_t *pin) in i2s_set_pin() argument
1851 ESP_RETURN_ON_FALSE((i2s_num < SOC_I2S_NUM), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); in i2s_set_pin()
1869 if (p_i2s[i2s_num]->role == I2S_ROLE_SLAVE) { in i2s_set_pin()
1871 if (p_i2s[i2s_num]->dir & I2S_DIR_RX_) { in i2s_set_pin()
1872 gpio_matrix_in_check_and_set(pin->ws_io_num, i2s_periph_signal[i2s_num].s_rx_ws_sig, 0); in i2s_set_pin()
1873 … gpio_matrix_in_check_and_set(pin->bck_io_num, i2s_periph_signal[i2s_num].s_rx_bck_sig, 0); in i2s_set_pin()
1876 gpio_matrix_in_check_and_set(pin->ws_io_num, i2s_periph_signal[i2s_num].s_tx_ws_sig, 0); in i2s_set_pin()
1877 … gpio_matrix_in_check_and_set(pin->bck_io_num, i2s_periph_signal[i2s_num].s_tx_bck_sig, 0); in i2s_set_pin()
1881 … ESP_RETURN_ON_ERROR(i2s_check_set_mclk(i2s_num, pin->mck_io_num), TAG, "mclk config failed"); in i2s_set_pin()
1883 if (p_i2s[i2s_num]->dir & I2S_DIR_TX_) { in i2s_set_pin()
1884 … gpio_matrix_out_check_and_set(pin->ws_io_num, i2s_periph_signal[i2s_num].m_tx_ws_sig, 0, 0); in i2s_set_pin()
1885 … gpio_matrix_out_check_and_set(pin->bck_io_num, i2s_periph_signal[i2s_num].m_tx_bck_sig, 0, 0); in i2s_set_pin()
1888 … gpio_matrix_out_check_and_set(pin->ws_io_num, i2s_periph_signal[i2s_num].m_rx_ws_sig, 0, 0); in i2s_set_pin()
1889 … gpio_matrix_out_check_and_set(pin->bck_io_num, i2s_periph_signal[i2s_num].m_rx_bck_sig, 0, 0); in i2s_set_pin()
1894 gpio_matrix_out_check_and_set(pin->data_out_num, i2s_periph_signal[i2s_num].data_out_sig, 0, 0); in i2s_set_pin()
1895 gpio_matrix_in_check_and_set(pin->data_in_num, i2s_periph_signal[i2s_num].data_in_sig, 0); in i2s_set_pin()