From e83fc30b6790eabcbc693e206428c324b870fa37 Mon Sep 17 00:00:00 2001 From: Armando Date: Fri, 8 Nov 2024 12:24:52 +0800 Subject: [PATCH 1/6] fix(lp_i2s): added cbs iram check --- components/esp_driver_i2s/lp_i2s.c | 8 ++++++++ .../esp_driver_i2s/test_apps/lp_i2s/main/test_lp_i2s.c | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/components/esp_driver_i2s/lp_i2s.c b/components/esp_driver_i2s/lp_i2s.c index 0d5e43dd8d..5b5f8b7393 100644 --- a/components/esp_driver_i2s/lp_i2s.c +++ b/components/esp_driver_i2s/lp_i2s.c @@ -18,6 +18,7 @@ #include "freertos/FreeRTOS.h" #include "freertos/semphr.h" #include "esp_clk_tree.h" +#include "esp_memory_utils.h" #include "hal/hal_utils.h" #include "hal/lp_i2s_hal.h" #include "hal/lp_i2s_ll.h" @@ -250,6 +251,13 @@ esp_err_t lp_i2s_register_event_callbacks(lp_i2s_chan_handle_t handle, const lp_ ESP_RETURN_ON_FALSE(handle && cbs, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); ESP_RETURN_ON_FALSE(handle->state < I2S_CHAN_STATE_RUNNING, ESP_ERR_INVALID_STATE, TAG, "the channel is in enabled state already"); + if (cbs->on_thresh_met) { + ESP_RETURN_ON_FALSE(esp_ptr_in_iram(cbs->on_thresh_met), ESP_ERR_INVALID_ARG, TAG, "on_thresh_met callback not in IRAM"); + } + if (cbs->on_request_new_trans) { + ESP_RETURN_ON_FALSE(esp_ptr_in_iram(cbs->on_request_new_trans), ESP_ERR_INVALID_ARG, TAG, "on_request_new_trans callback not in IRAM"); + } + handle->cbs.on_thresh_met = cbs->on_thresh_met; handle->cbs.on_request_new_trans = cbs->on_request_new_trans; handle->user_data = user_data; diff --git a/components/esp_driver_i2s/test_apps/lp_i2s/main/test_lp_i2s.c b/components/esp_driver_i2s/test_apps/lp_i2s/main/test_lp_i2s.c index 8d87f12f78..4e399a9efd 100644 --- a/components/esp_driver_i2s/test_apps/lp_i2s/main/test_lp_i2s.c +++ b/components/esp_driver_i2s/test_apps/lp_i2s/main/test_lp_i2s.c @@ -222,7 +222,7 @@ TEST_CASE("test LP I2S read for STD", "[lp_i2s]") } } -static bool s_lp_i2s_on_thresh_met(lp_i2s_chan_handle_t handle, lp_i2s_evt_data_t *edata, void *user_data) +static bool IRAM_ATTR s_lp_i2s_on_thresh_met(lp_i2s_chan_handle_t handle, lp_i2s_evt_data_t *edata, void *user_data) { ESP_DRAM_LOGD(TAG, "edata->trans.received_size: %d", edata->trans.received_size); s_data_check(edata->trans.buffer, edata->trans.received_size); @@ -230,7 +230,7 @@ static bool s_lp_i2s_on_thresh_met(lp_i2s_chan_handle_t handle, lp_i2s_evt_data_ return false; } -static bool s_lp_i2s_on_request_new_trans(lp_i2s_chan_handle_t handle, lp_i2s_evt_data_t *edata, void *user_data) +static bool IRAM_ATTR s_lp_i2s_on_request_new_trans(lp_i2s_chan_handle_t handle, lp_i2s_evt_data_t *edata, void *user_data) { lp_i2s_trans_t trans = *(lp_i2s_trans_t *)user_data; edata->trans.buffer = trans.buffer; From e4a924351784374554afae4c516a52897c0e5b83 Mon Sep 17 00:00:00 2001 From: Armando Date: Fri, 8 Nov 2024 12:25:50 +0800 Subject: [PATCH 2/6] doc(lp_i2s): lp i2s programming guide --- .../esp_driver_i2s/include/driver/lp_i2s.h | 16 +- components/esp_driver_i2s/lp_i2s.c | 12 +- docs/doxygen/Doxyfile | 3 + docs/en/api-reference/peripherals/i2s.rst | 6 + docs/en/api-reference/peripherals/index.rst | 1 + docs/en/api-reference/peripherals/lp_i2s.rst | 147 ++++++++++++++++++ 6 files changed, 171 insertions(+), 14 deletions(-) create mode 100644 docs/en/api-reference/peripherals/lp_i2s.rst diff --git a/components/esp_driver_i2s/include/driver/lp_i2s.h b/components/esp_driver_i2s/include/driver/lp_i2s.h index 09db9c057e..49cf3272e0 100644 --- a/components/esp_driver_i2s/include/driver/lp_i2s.h +++ b/components/esp_driver_i2s/include/driver/lp_i2s.h @@ -55,7 +55,7 @@ esp_err_t lp_i2s_new_channel(const lp_i2s_chan_config_t *chan_cfg, lp_i2s_chan_h /** * @brief Register LP I2S event callbacks * - * @param[in] handle LP I2S channel handle + * @param[in] chan LP I2S channel handle * @param[in] cbs Callbacks * @param[in] user_data User data * @@ -64,12 +64,12 @@ esp_err_t lp_i2s_new_channel(const lp_i2s_chan_config_t *chan_cfg, lp_i2s_chan_h * - ESP_ERR_INVALID_ARG: Invalid argument * - ESP_ERR_INVALID_STATE: Invalid state */ -esp_err_t lp_i2s_register_event_callbacks(lp_i2s_chan_handle_t handle, const lp_i2s_evt_cbs_t *cbs, void *user_data); +esp_err_t lp_i2s_register_event_callbacks(lp_i2s_chan_handle_t chan, const lp_i2s_evt_cbs_t *cbs, void *user_data); /** * @brief Enable LP I2S driver * - * @param[in] handle LP I2S channel handle + * @param[in] chan LP I2S channel handle * * @return * - ESP_OK: On success @@ -81,7 +81,7 @@ esp_err_t lp_i2s_channel_enable(lp_i2s_chan_handle_t chan); /** * @brief Read LP I2S received data * - * @param[in] handle LP I2S channel handle + * @param[in] chan LP I2S channel handle * @param[in] trans LP I2S transaction * @param[in] timeout_ms Timeout in ms, set to `LP_I2S_MAX_DELAY` to wait until read is done * @@ -95,7 +95,7 @@ esp_err_t lp_i2s_channel_read(lp_i2s_chan_handle_t chan, lp_i2s_trans_t *trans, /** * @brief Read LP I2S received data until certain bytes * - * @param[in] handle LP I2S channel handle + * @param[in] chan LP I2S channel handle * @param[in] trans LP I2S transaction * * @return @@ -108,7 +108,7 @@ esp_err_t lp_i2s_channel_read_until_bytes(lp_i2s_chan_handle_t chan, lp_i2s_tran /** * @brief Disable LP I2S driver * - * @param[in] handle LP I2S channel handle + * @param[in] chan LP I2S channel handle * * @return * - ESP_OK: On success @@ -120,13 +120,13 @@ esp_err_t lp_i2s_channel_disable(lp_i2s_chan_handle_t chan); /** * @brief Delete the LP I2S channel * - * @param[in] handle LP I2S channel handler + * @param[in] chan LP I2S channel handler * * @return * - ESP_OK Delete successfully * - ESP_ERR_INVALID_ARG NULL pointer */ -esp_err_t lp_i2s_del_channel(lp_i2s_chan_handle_t handle); +esp_err_t lp_i2s_del_channel(lp_i2s_chan_handle_t chan); #ifdef __cplusplus } diff --git a/components/esp_driver_i2s/lp_i2s.c b/components/esp_driver_i2s/lp_i2s.c index 5b5f8b7393..707e5c12c7 100644 --- a/components/esp_driver_i2s/lp_i2s.c +++ b/components/esp_driver_i2s/lp_i2s.c @@ -246,10 +246,10 @@ esp_err_t lp_i2s_del_channel(lp_i2s_chan_handle_t chan) _Static_assert(sizeof(lp_i2s_evt_cbs_t) == sizeof(lp_i2s_evt_cbs_internal_t), "Invalid size of lp_i2s_evt_cbs_t structure"); #endif -esp_err_t lp_i2s_register_event_callbacks(lp_i2s_chan_handle_t handle, const lp_i2s_evt_cbs_t *cbs, void *user_data) +esp_err_t lp_i2s_register_event_callbacks(lp_i2s_chan_handle_t chan, const lp_i2s_evt_cbs_t *cbs, void *user_data) { - ESP_RETURN_ON_FALSE(handle && cbs, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); - ESP_RETURN_ON_FALSE(handle->state < I2S_CHAN_STATE_RUNNING, ESP_ERR_INVALID_STATE, TAG, "the channel is in enabled state already"); + ESP_RETURN_ON_FALSE(chan && cbs, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + ESP_RETURN_ON_FALSE(chan->state < I2S_CHAN_STATE_RUNNING, ESP_ERR_INVALID_STATE, TAG, "the channel is in enabled state already"); if (cbs->on_thresh_met) { ESP_RETURN_ON_FALSE(esp_ptr_in_iram(cbs->on_thresh_met), ESP_ERR_INVALID_ARG, TAG, "on_thresh_met callback not in IRAM"); @@ -258,9 +258,9 @@ esp_err_t lp_i2s_register_event_callbacks(lp_i2s_chan_handle_t handle, const lp_ ESP_RETURN_ON_FALSE(esp_ptr_in_iram(cbs->on_request_new_trans), ESP_ERR_INVALID_ARG, TAG, "on_request_new_trans callback not in IRAM"); } - handle->cbs.on_thresh_met = cbs->on_thresh_met; - handle->cbs.on_request_new_trans = cbs->on_request_new_trans; - handle->user_data = user_data; + chan->cbs.on_thresh_met = cbs->on_thresh_met; + chan->cbs.on_request_new_trans = cbs->on_request_new_trans; + chan->user_data = user_data; return ESP_OK; } diff --git a/docs/doxygen/Doxyfile b/docs/doxygen/Doxyfile index 8a3c7d78c2..f2cc320d35 100644 --- a/docs/doxygen/Doxyfile +++ b/docs/doxygen/Doxyfile @@ -125,6 +125,9 @@ INPUT = \ $(PROJECT_PATH)/components/esp_driver_i2s/include/driver/i2s_pdm.h \ $(PROJECT_PATH)/components/esp_driver_i2s/include/driver/i2s_std.h \ $(PROJECT_PATH)/components/esp_driver_i2s/include/driver/i2s_tdm.h \ + $(PROJECT_PATH)/components/esp_driver_i2s/include/driver/lp_i2s.h \ + $(PROJECT_PATH)/components/esp_driver_i2s/include/driver/lp_i2s_std.h \ + $(PROJECT_PATH)/components/esp_driver_i2s/include/driver/lp_i2s_pdm.h \ $(PROJECT_PATH)/components/esp_driver_i2s/include/driver/i2s_types.h \ $(PROJECT_PATH)/components/esp_driver_pcnt/include/driver/pulse_cnt.h \ $(PROJECT_PATH)/components/esp_driver_rmt/include/driver/rmt_common.h \ diff --git a/docs/en/api-reference/peripherals/i2s.rst b/docs/en/api-reference/peripherals/i2s.rst index 8169e6d551..47a8e73756 100644 --- a/docs/en/api-reference/peripherals/i2s.rst +++ b/docs/en/api-reference/peripherals/i2s.rst @@ -10,6 +10,12 @@ Introduction I2S (Inter-IC Sound) is a synchronous serial communication protocol usually used for transmitting audio data between two digital audio devices. +.. only:: SOC_LP_I2S_SUPPORTED + + .. note:: + + For LP I2S documentation, see :doc:`Low Power Inter-IC Sound <./lp_i2s>`. + {IDF_TARGET_NAME} contains {IDF_TARGET_I2S_NUM} I2S peripheral(s). These peripherals can be configured to input and output sample data via the I2S driver. An I2S bus that communicates in standard or TDM mode consists of the following lines: diff --git a/docs/en/api-reference/peripherals/index.rst b/docs/en/api-reference/peripherals/index.rst index 3a959b7249..ce256d9c76 100644 --- a/docs/en/api-reference/peripherals/index.rst +++ b/docs/en/api-reference/peripherals/index.rst @@ -41,6 +41,7 @@ Peripherals API :SOC_GPSPI_SUPPORTED: spi_master :SOC_GPSPI_SUPPORTED: spi_slave :SOC_SPI_SUPPORT_SLAVE_HD_VER2: spi_slave_hd + :SOC_LP_I2S_SUPPORTED: lp_i2s :SOC_TEMP_SENSOR_SUPPORTED: temp_sensor :SOC_TOUCH_SENSOR_SUPPORTED and not esp32p4: touch_pad :esp32p4: cap_touch_sens diff --git a/docs/en/api-reference/peripherals/lp_i2s.rst b/docs/en/api-reference/peripherals/lp_i2s.rst new file mode 100644 index 0000000000..04cd3c9c09 --- /dev/null +++ b/docs/en/api-reference/peripherals/lp_i2s.rst @@ -0,0 +1,147 @@ +Low Power Inter-IC Sound (LP I2S) +================================= + + +Introduction +------------ + +LP I2S (Low Power Inter-IC Sound) is a synchronous protocol which can be used for audio data transmission. It also provides a data reception communication interface for Voice Activity Detection (VAD) and some digital audio applications in low power mode. For more details about VAD, see :doc:`Voice Activity Detection <./vad>`. + +.. only:: SOC_I2S_SUPPORTED + + .. note:: + + For I2S documentation, see :doc:`Inter-IC Sound <./i2s>`. + +The I2S standard bus defines three signals, +- BCK: bit clock +- WS: word select +- SD: serial data + +A basic I2S data bus has one master and one slave. The roles remain unchanged throughout the communication. + +.. only:: esp32p4 + + LP I2S on {IDF_TARGET_NAME} only supports working as an I2S Slave. + +The LP I2S module on {IDF_TARGET_NAME} provides an independent RX unit, which supports receiving data when the chip is running with the lowest power consumption. Compared to HP I2S, LP I2S does not support DMA access. Instead, it uses a piece of separate internal memory to store data. + + +I2S Communication Mode +---------------------- + +Standard Mode +^^^^^^^^^^^^^ + +In standard mode, there are always two sound channels, i.e., the left and right channels, which are called "slots". These slots support 16-bit-width sample data. The communication format for the slots mainly includes the following: + +- **Philips Format**: Data signal has one-bit shift comparing to the WS signal, and the duty of WS signal is 50%. + +.. wavedrom:: /../_static/diagrams/i2s/std_philips.json + +- **MSB Format**: Basically the same as Philips format, but without data shift. + +.. wavedrom:: /../_static/diagrams/i2s/std_msb.json + +- **PCM Short Format**: Data has one-bit shift and meanwhile the WS signal becomes a pulse lasting for one BCLK cycle. + +.. wavedrom:: /../_static/diagrams/i2s/std_pcm.json + +PDM Mode (RX) +^^^^^^^^^^^^^ + +PDM (Pulse-density Modulation) mode for RX channel can receive PDM-format data. Only 16-bit-width sample data are supported. + + +Functional Overview +------------------- + +Resource Allocation +^^^^^^^^^^^^^^^^^^^ + +To create a LP I2S channel handle, you should set up the LP I2S channel configuration structure :cpp:type:`lp_i2s_chan_config_t`, and call :cpp:func:`lp_i2s_new_channel` with the prepared configuration structure. + +If the LP I2S channel is no longer used, you should recycle the allocated resource by calling :cpp:func:`lp_i2s_del_channel`. + +.. code:: c + + //initialization + lp_i2s_chan_handle_t rx_handle = NULL; + lp_i2s_chan_config_t config = { + .id = 0, + .role = I2S_ROLE_SLAVE, + .threshold = 512, + }; + ESP_ERROR_CHECK(lp_i2s_new_channel(&config, NULL, &rx_handle)); + + //deinitialization + ESP_ERROR_CHECK(lp_i2s_del_channel(rx_chan)); + + +Register Event Callbacks +^^^^^^^^^^^^^^^^^^^^^^^^ + +By calling :cpp:func:`lp_i2s_register_event_callbacks`, you can hook your own function to the driver ISR. Supported event callbacks are listed in :cpp:type:`lp_i2s_evt_cbs_t`. + +As the above callbacks are called in an ISR context, you should always ensure the callback function is suitable for an ISR context. Blocking logic should not appear in these callbacks. The callback function prototype is declared in :cpp:type:`lp_i2s_callback_t`. + +You can also register your own context when calling :cpp:func:`lp_i2s_register_event_callbacks` by the parameter ``user_data``. This user data will be passed to the callback functions directly. + +This function may fail due to reasons like :c:macro:`ESP_ERR_INVALID_ARG`, especially, this error may indicate that the callback functions are not in the internal RAM. Callbacks should be placed in IRAM since the default ISR handler is allocated with the `ESP_INTR_FLAG_IRAM` flag. + +Please check the error log for more details. If it fails due to :c:macro:`ESP_ERR_INVALID_STATE`, it indicates that the LP I2S channel is enabled, and you cannot add a callback at this moment. + +.. code:: c + + lp_i2s_evt_cbs_t cbs = { + .on_thresh_met = s_lp_i2s_on_thresh_met, + .on_request_new_trans = s_lp_i2s_on_request_new_trans, + }; + ESP_ERROR_CHECK(lp_i2s_register_event_callbacks(rx_chan, &cbs, &trans)); + +Enable and Disable LP I2S +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Before using LP I2S to receive data, you need to enable the LP I2S channel by calling :cpp:func:`lp_i2s_channel_enable`, this function switches the driver state from **init** to **enable**. Calling :cpp:func:`lp_i2s_channel_disable` does the opposite, that is, puts the driver back to the **init** state. + +Communication Mode +^^^^^^^^^^^^^^^^^^ + +.. list:: + + - Calling :cpp:func:`lp_i2s_channel_init_std_mode` can help you initialize the LP I2S channel to STD mode. Some initialization helpers are listed below: + - :c:macro:`LP_I2S_STD_PHILIPS_SLOT_DEFAULT_CONFIG` + - :c:macro:`LP_I2S_STD_MSB_SLOT_DEFAULT_CONFIG` + - :c:macro:`LP_I2S_STD_PCM_SHORT_SLOT_DEFAULT_CONFIG` + + - Calling :cpp:func:`lp_i2s_channel_init_pdm_rx_mode` can help you initialize the LP I2S channel to PDM mode. :c:macro:`LP_I2S_PDM_RX_SLOT_DEFAULT_CONFIG` is an initialization helper. + +Read Data via LP I2S +^^^^^^^^^^^^^^^^^^^^ + +After the LP I2S channel is enabled, :cpp:func:`lp_i2s_channel_read` and :cpp:func:`lp_i2s_channel_read_until_bytes` will be available. + +.. list:: + + - For :cpp:func:`lp_i2s_channel_read`, if there are new data received by the LP I2S channel, this API will move the received data to the ``buffer`` you specified in :cpp:type:`lp_i2s_trans_t`. The API will try to receive the data as the ``buflen`` you specified. Check the ``received_size`` to know how many bytes you received, in case there are no enough received data. If no new received data, the API will block until ``timeout_ms``. + + - For :cpp:func:`lp_i2s_channel_read_until_bytes`, this API is a wrapper of the :cpp:func:`lp_i2s_channel_read`. The difference is, the :cpp:func:`lp_i2s_channel_read_until_bytes` will block until ``buflen`` bytes are received. + + - For both of the two APIs, if :cpp:member:`lp_i2s_evt_cbs_t::on_request_new_trans` is set, the driver will each time requesting a new LP I2S transaction descriptor (:cpp:type:`lp_i2s_trans_t`) from the callback event data structure (:cpp:type:`lp_i2s_evt_data_t`). This also means, the ``buffer`` in the (:cpp:type:`lp_i2s_trans_t`) needs to be ready for receiving data. + + +Thread Safety +^^^^^^^^^^^^^ + +All the APIs are guaranteed to be thread safe by the driver, which means, you can call them from different RTOS tasks without protection by extra locks. + +All the APIs are not allowed to be used in ISR context. + + +API Reference +------------- + +.. include-build-file:: inc/lp_i2s.inc +.. include-build-file:: inc/lp_i2s_std.inc +.. include-build-file:: inc/lp_i2s_pdm.inc +.. include-build-file:: inc/components/esp_driver_i2s/include/driver/i2s_types.inc From 37d8e97a9d8525303c98489cbb60fb748d59b638 Mon Sep 17 00:00:00 2001 From: Armando Date: Fri, 8 Nov 2024 12:26:05 +0800 Subject: [PATCH 3/6] doc(lp_vad): lp vad programming guide --- .../include/driver/lp_i2s_vad.h | 10 +- .../include/ulp_lp_core_lp_vad_shared.h | 2 - .../diagrams/vad/vad_state_machine.png | Bin 0 -> 52656 bytes docs/conf_common.py | 6 + docs/doxygen/Doxyfile | 3 - docs/doxygen/Doxyfile_esp32p4 | 5 + docs/en/api-reference/peripherals/index.rst | 1 + docs/en/api-reference/peripherals/lp_i2s.rst | 19 +- docs/en/api-reference/peripherals/vad.rst | 181 ++++++++++++++++++ .../zh_CN/api-reference/peripherals/index.rst | 2 + .../api-reference/peripherals/lp_i2s.rst | 1 + docs/zh_CN/api-reference/peripherals/vad.rst | 1 + 12 files changed, 206 insertions(+), 25 deletions(-) create mode 100644 docs/_static/diagrams/vad/vad_state_machine.png create mode 100644 docs/en/api-reference/peripherals/vad.rst create mode 100644 docs/zh_CN/api-reference/peripherals/lp_i2s.rst create mode 100644 docs/zh_CN/api-reference/peripherals/vad.rst diff --git a/components/esp_driver_i2s/include/driver/lp_i2s_vad.h b/components/esp_driver_i2s/include/driver/lp_i2s_vad.h index ce52370cde..a11f19782b 100644 --- a/components/esp_driver_i2s/include/driver/lp_i2s_vad.h +++ b/components/esp_driver_i2s/include/driver/lp_i2s_vad.h @@ -78,8 +78,9 @@ typedef struct vad_unit_ctx_t *vad_unit_handle_t; typedef struct { int init_frame_num; /**< Number of init frames that are used for VAD to denoise, this helps the VAD to decrease the accidental trigger ratio. Note too big values may lead to voice activity miss */ - int min_energy_thresh; ///< Min energy threshold. - bool skip_band_energy_thresh; ///< Skip band energy threshold or not + int min_energy_thresh; ///< Minimum energy threshold, voice activities with energy higher than this value will be detected. + bool skip_band_energy_thresh; /**< Skip band energy threshold or not, the passband energy check determines whether the proportion of passband energy within the total frequency domain meets the required threshold. + Note in different environments, enabling the passband energy check may reduce false trigger rates but could also increase the rate of missed detections. */ int speak_activity_thresh; /**< When in speak-activity-listening-state, if number of the detected speak activity is higher than this value, VAD runs into speak-activity-detected-state */ @@ -93,6 +94,9 @@ typedef struct { int max_speak_activity_thresh; /**< When in speak-activity-detected-state, if the number of the detected speak activity is higher than this value, VAD runs into speak-activity-listening-state */ } lp_vad_config_t; +/** + * @brief LP VAD Init Configurations + */ typedef struct { lp_i2s_chan_handle_t lp_i2s_chan; ///< LP I2S channel handle lp_vad_config_t vad_config; ///< LP VAD config @@ -115,7 +119,6 @@ esp_err_t lp_i2s_vad_new_unit(lp_vad_t vad_id, const lp_vad_init_config_t *init_ * @brief Enable LP VAD * * @param[in] unit VAD handle - * @param[in] init_config Initial configurations * * @return * - ESP_OK: On success @@ -128,7 +131,6 @@ esp_err_t lp_i2s_vad_enable(vad_unit_handle_t unit); * @brief Disable LP VAD * * @param[in] unit VAD handle - * @param[in] init_config Initial configurations * * @return * - ESP_OK: On success diff --git a/components/ulp/lp_core/shared/include/ulp_lp_core_lp_vad_shared.h b/components/ulp/lp_core/shared/include/ulp_lp_core_lp_vad_shared.h index 8a37dee54d..979398eab6 100644 --- a/components/ulp/lp_core/shared/include/ulp_lp_core_lp_vad_shared.h +++ b/components/ulp/lp_core/shared/include/ulp_lp_core_lp_vad_shared.h @@ -82,7 +82,6 @@ esp_err_t lp_core_lp_vad_init(lp_vad_t vad_id, const lp_core_lp_vad_cfg_t *init_ * @brief Enable LP VAD * * @param[in] vad_id VAD ID - * @param[in] init_config Initial configurations * * @return * - ESP_OK: On success @@ -95,7 +94,6 @@ esp_err_t lp_core_lp_vad_enable(lp_vad_t vad_id); * @brief Disable LP VAD * * @param[in] vad_id VAD ID - * @param[in] init_config Initial configurations * * @return * - ESP_OK: On success diff --git a/docs/_static/diagrams/vad/vad_state_machine.png b/docs/_static/diagrams/vad/vad_state_machine.png new file mode 100644 index 0000000000000000000000000000000000000000..7677ec07a4d98558176f36ed5eebf98c8a57fd21 GIT binary patch literal 52656 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 bY>$x!{_3IFo5&G>^C7B=nhHgCEua1e_O2ue literal 0 HcmV?d00001 diff --git a/docs/conf_common.py b/docs/conf_common.py index 9d79a4f6e3..abfc7d3efb 100644 --- a/docs/conf_common.py +++ b/docs/conf_common.py @@ -174,6 +174,10 @@ SPI_DOCS = ['api-reference/peripherals/spi_master.rst', I2S_DOCS = ['api-reference/peripherals/i2s.rst'] +VAD_DOCS = ['api-reference/peripherals/vad.rst'] + +LP_I2S_DOCS = ['api-reference/peripherals/lp_i2s.rst'] + ISP_DOCS = ['api-reference/peripherals/isp.rst'] DSLP_STUB_DOCS = ['api-guides/deep-sleep-stub.rst'] @@ -286,6 +290,8 @@ conditional_include_dict = {'SOC_BT_SUPPORTED':BT_DOCS, 'SOC_I2C_SUPPORTED':I2C_DOCS, 'SOC_GPSPI_SUPPORTED':SPI_DOCS, 'SOC_I2S_SUPPORTED':I2S_DOCS, + 'SOC_LP_I2S_SUPPORTED':LP_I2S_DOCS, + 'SOC_LP_VAD_SUPPORTED':VAD_DOCS, 'SOC_ISP_SUPPORTED':ISP_DOCS, 'ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB': DSLP_STUB_DOCS, 'SOC_ADC_SUPPORTED':ADC_DOCS, diff --git a/docs/doxygen/Doxyfile b/docs/doxygen/Doxyfile index f2cc320d35..8a3c7d78c2 100644 --- a/docs/doxygen/Doxyfile +++ b/docs/doxygen/Doxyfile @@ -125,9 +125,6 @@ INPUT = \ $(PROJECT_PATH)/components/esp_driver_i2s/include/driver/i2s_pdm.h \ $(PROJECT_PATH)/components/esp_driver_i2s/include/driver/i2s_std.h \ $(PROJECT_PATH)/components/esp_driver_i2s/include/driver/i2s_tdm.h \ - $(PROJECT_PATH)/components/esp_driver_i2s/include/driver/lp_i2s.h \ - $(PROJECT_PATH)/components/esp_driver_i2s/include/driver/lp_i2s_std.h \ - $(PROJECT_PATH)/components/esp_driver_i2s/include/driver/lp_i2s_pdm.h \ $(PROJECT_PATH)/components/esp_driver_i2s/include/driver/i2s_types.h \ $(PROJECT_PATH)/components/esp_driver_pcnt/include/driver/pulse_cnt.h \ $(PROJECT_PATH)/components/esp_driver_rmt/include/driver/rmt_common.h \ diff --git a/docs/doxygen/Doxyfile_esp32p4 b/docs/doxygen/Doxyfile_esp32p4 index ebdf3a5619..66146f1ed7 100644 --- a/docs/doxygen/Doxyfile_esp32p4 +++ b/docs/doxygen/Doxyfile_esp32p4 @@ -11,6 +11,7 @@ INPUT += \ $(PROJECT_PATH)/components/ulp/lp_core/lp_core/include/ulp_lp_core_utils.h \ $(PROJECT_PATH)/components/ulp/lp_core/lp_core/include/ulp_lp_core_interrupts.h \ $(PROJECT_PATH)/components/ulp/lp_core/lp_core/include/ulp_lp_core_spi.h \ + $(PROJECT_PATH)/components/ulp/lp_core/shared/include/ulp_lp_core_lp_vad_shared.h \ $(PROJECT_PATH)/components/ulp/ulp_common/include/ulp_common.h \ $(PROJECT_PATH)/components/usb/include/usb/usb_helpers.h \ $(PROJECT_PATH)/components/usb/include/usb/usb_host.h \ @@ -41,6 +42,10 @@ INPUT += \ $(PROJECT_PATH)/components/esp_driver_isp/include/driver/isp_gamma.h \ $(PROJECT_PATH)/components/esp_driver_isp/include/driver/isp_hist.h \ $(PROJECT_PATH)/components/esp_driver_isp/include/driver/isp_color.h \ + $(PROJECT_PATH)/components/esp_driver_i2s/include/driver/lp_i2s.h \ + $(PROJECT_PATH)/components/esp_driver_i2s/include/driver/lp_i2s_std.h \ + $(PROJECT_PATH)/components/esp_driver_i2s/include/driver/lp_i2s_pdm.h \ + $(PROJECT_PATH)/components/esp_driver_i2s/include/driver/lp_i2s_vad.h \ $(PROJECT_PATH)/components/esp_driver_jpeg/include/driver/jpeg_decode.h \ $(PROJECT_PATH)/components/esp_driver_jpeg/include/driver/jpeg_encode.h \ $(PROJECT_PATH)/components/esp_driver_ppa/include/driver/ppa.h \ diff --git a/docs/en/api-reference/peripherals/index.rst b/docs/en/api-reference/peripherals/index.rst index ce256d9c76..72a69e1f8e 100644 --- a/docs/en/api-reference/peripherals/index.rst +++ b/docs/en/api-reference/peripherals/index.rst @@ -42,6 +42,7 @@ Peripherals API :SOC_GPSPI_SUPPORTED: spi_slave :SOC_SPI_SUPPORT_SLAVE_HD_VER2: spi_slave_hd :SOC_LP_I2S_SUPPORTED: lp_i2s + :SOC_LP_VAD_SUPPORTED: vad :SOC_TEMP_SENSOR_SUPPORTED: temp_sensor :SOC_TOUCH_SENSOR_SUPPORTED and not esp32p4: touch_pad :esp32p4: cap_touch_sens diff --git a/docs/en/api-reference/peripherals/lp_i2s.rst b/docs/en/api-reference/peripherals/lp_i2s.rst index 04cd3c9c09..4d928d62df 100644 --- a/docs/en/api-reference/peripherals/lp_i2s.rst +++ b/docs/en/api-reference/peripherals/lp_i2s.rst @@ -24,7 +24,7 @@ A basic I2S data bus has one master and one slave. The roles remain unchanged th LP I2S on {IDF_TARGET_NAME} only supports working as an I2S Slave. -The LP I2S module on {IDF_TARGET_NAME} provides an independent RX unit, which supports receiving data when the chip is running with the lowest power consumption. Compared to HP I2S, LP I2S does not support DMA access. Instead, it uses a piece of separate internal memory to store data. +The LP I2S module on {IDF_TARGET_NAME} provides an independent RX unit, which supports receiving data when the chip is running under sleep modes. Compared to HP I2S, LP I2S does not support DMA access. Instead, it uses a piece of separate internal memory to store data. I2S Communication Mode @@ -33,24 +33,12 @@ I2S Communication Mode Standard Mode ^^^^^^^^^^^^^ -In standard mode, there are always two sound channels, i.e., the left and right channels, which are called "slots". These slots support 16-bit-width sample data. The communication format for the slots mainly includes the following: - -- **Philips Format**: Data signal has one-bit shift comparing to the WS signal, and the duty of WS signal is 50%. - -.. wavedrom:: /../_static/diagrams/i2s/std_philips.json - -- **MSB Format**: Basically the same as Philips format, but without data shift. - -.. wavedrom:: /../_static/diagrams/i2s/std_msb.json - -- **PCM Short Format**: Data has one-bit shift and meanwhile the WS signal becomes a pulse lasting for one BCLK cycle. - -.. wavedrom:: /../_static/diagrams/i2s/std_pcm.json +In standard mode, there are always two sound channels, i.e., the left and right channels, which are called "slots". These slots support 16-bit-width sample data. The communication format for the slots can be found in this :ref:`i2s-communication-mode` section. PDM Mode (RX) ^^^^^^^^^^^^^ -PDM (Pulse-density Modulation) mode for RX channel can receive PDM-format data. Only 16-bit-width sample data are supported. +PDM (Pulse-density Modulation) mode for RX channel can receive PDM-format data. Only 16-bit-width sample data are supported. The communication format for the slots can be found in this :ref:`i2s-communication-mode` section. Functional Overview @@ -144,4 +132,3 @@ API Reference .. include-build-file:: inc/lp_i2s.inc .. include-build-file:: inc/lp_i2s_std.inc .. include-build-file:: inc/lp_i2s_pdm.inc -.. include-build-file:: inc/components/esp_driver_i2s/include/driver/i2s_types.inc diff --git a/docs/en/api-reference/peripherals/vad.rst b/docs/en/api-reference/peripherals/vad.rst new file mode 100644 index 0000000000..73827b45df --- /dev/null +++ b/docs/en/api-reference/peripherals/vad.rst @@ -0,0 +1,181 @@ +Voice Activity Detection (VAD) +============================== + +:link_to_translation:`zh_CN:[中文]` + + +Introduction +------------ + +Voice Activity Detection (VAD) module facilitates the hardware implementation of the first-stage algorithm for voice wake-up and other multimedia functions. + +Additionally, it provides hardware support for low-power voice wake-up solutions. + +.. only:: SOC_LP_I2S_SUPPORTED + + For LP I2S documentation, see :doc:`Low Power Inter-IC Sound <./lp_i2s>`. + + +Hardware State Machine +---------------------- + +LP VAD driver provides a structure :cpp:type:`lp_vad_config_t` to configure the LP VAD module: + +- :cpp:member:`lp_vad_config_t::init_frame_num`, number of init frames that are used for VAD to denoise, this helps the VAD to decrease the accidental trigger ratio. Note too big values may lead to voice activity miss. +- :cpp:member:`lp_vad_config_t::min_energy_thresh`, minimum energy threshold, voice activities with energy higher than this value will be detected. +- :cpp:member:`lp_vad_config_t::skip_band_energy_thresh`, skip band energy threshold or not, the passband energy check determines whether the proportion of passband energy within the total frequency domain meets the required threshold. Note in different environments, enabling the passband energy check may reduce false trigger rates but could also increase the rate of missed detections. +- :cpp:member:`lp_vad_config_t::speak_activity_thresh`, when in speak-activity-listening-state, if number of the detected speak activity is higher than this value, VAD runs into speak-activity-detected-state. +- :cpp:member:`lp_vad_config_t::non_speak_activity_thresh`, when in speak-activity-detected-state, if the number of the detected speak activity is higher than this value, but lower than :cpp:member:`lp_vad_config_t::max_speak_activity_thresh`, + * if the number of the detected non-speak activity is higher than this value, VAD runs into speak-activity-listening-state + * if the number of the detected non-speak activity is lower than this value, VAD keeps in speak-activity-detected-state +- :cpp:member:`lp_vad_config_t::min_speak_activity_thresh`, when in speak-activity-detected-state, if the number of the detected speak activity is higher than this value, but lower than :cpp:member:`lp_vad_config_t::max_speak_activity_thresh`, then the VAD state machine will depends on the value of :cpp:member:`lp_vad_config_t::non_speak_activity_thresh` +- :cpp:member:`lp_vad_config_t::max_speak_activity_thresh`, when in speak-activity-detected-state, if the number of the detected speak activity is higher than this value, VAD runs into speak-activity-listening-state + +Above configurations can change the VAD state machine shown below: + +.. code-block:: text + + ┌──────────────────────────────────┐ + │ │ + ┌─────────────┤ speak-activity-listening-state │ ◄───────────────┐ + │ │ │ │ + │ └──────────────────────────────────┘ │ + │ ▲ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + detected speak activity │ │ detected speak activity │ detected speak activity + >= │ │ >= │ >= + 'speak_activity_thresh' │ │ 'min_speak_activity_thresh' │ 'max_speak_activity_thresh' + │ │ │ + │ │ && │ + │ │ │ + │ │ detected non-speak activity │ + │ │ < │ + │ │ 'non_speak_activity_thresh' │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ ┌───────────┴─────────────────────┐ │ + │ │ │ │ + └───────────► │ speak-activity-detected-state ├─────────────────┘ + │ │ + └─┬───────────────────────────────┘ + │ + │ ▲ + │ │ + │ │ + │ │ detected speak activity + │ │ >= + │ │ 'min_speak_activity_thresh' + │ │ + │ │ && + │ │ + │ │ detected non-speak activity + │ │ < + └─────────────────────┘ 'non_speak_activity_thresh' + + +HP Driver Functional Overview +----------------------------- + +The VAD HP driver is used for configure the LP VAD to be working under the control of the HP core. The HP core can also be woken up by the VAD when voice activity is detected. + +Resource Allocation +^^^^^^^^^^^^^^^^^^^ + +.. only:: SOC_LP_I2S_SUPPORT_VAD + + :cpp:type:`lp_vad_init_config_t` is the configuration structure that is needed to create a LP I2S VAD unit handle. To create a LP I2S VAD unit handle, you will need to first create a LP I2S channel handle. see :doc:`Low Power Inter-IC Sound <./lp_i2s>`. + + You can call :cpp:func:`lp_i2s_vad_new_unit` to create the handle. If the VAD unit is no longer used, you should recycle the allocated resource by calling :cpp:func:`lp_i2s_vad_del_unit`. + + .. code:: c + + vad_unit_handle_t vad_handle = NULL; + lp_vad_init_config_t init_config = { + .lp_i2s_chan = rx_handle, + .vad_config = { + .init_frame_num = 100, + .min_energy_thresh = 100, + .speak_activity_thresh = 10, + .non_speak_activity_thresh = 30, + .min_speak_activity_thresh = 3, + .max_speak_activity_thresh = 100, + }, + }; + ESP_ERROR_CHECK(lp_i2s_vad_new_unit(vad_id, init_config, &vad_handle)); + + ESP_ERROR_CHECK(lp_i2s_vad_del_unit(vad_handle)); + +Enable and Disable the VAD +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. only:: SOC_LP_I2S_SUPPORT_VAD + + Before using a VAD unit to detect voice activity, you need to enable the VAD unit by calling :cpp:func:`lp_i2s_vad_enable`, this function switches the driver state from **init** to **enable**, and also enables the VAD hardware. Calling :cpp:func:`lp_i2s_vad_disable` does the opposite, that is, put the driver back to the **init** state, the hardware will stop as well. + +HP Core Wake-up +^^^^^^^^^^^^^^^ + +.. only:: SOC_LP_I2S_SUPPORT_VAD + + :cpp:func:`esp_sleep_enable_vad_wakeup` can help you to set the VAD to be working as the HP core wake-up source. To make VAD work during sleep, you should let the system maintain the RTC domain and XTAL power. See code example below: + + .. code:: c + + ESP_ERROR_CHECK(esp_sleep_enable_vad_wakeup()); + + +LP Driver Functional Overview +----------------------------- + +The VAD LP driver is mainly for LP core wake-up. The VAD can be configured under HP core control, then it can wakeup the LP core when voice activities are detected. + +Resource Allocation +^^^^^^^^^^^^^^^^^^^ + +.. only:: SOC_LP_I2S_SUPPORT_VAD + + :cpp:type:`lp_core_lp_vad_cfg_t` and :cpp:func:`lp_core_lp_vad_init` are used to initialize the VAD LP driver. + + :cpp:func:`lp_core_lp_vad_deinit` is used to recycle the allocated resources. + +Enable and Disable the VAD +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. only:: SOC_LP_I2S_SUPPORT_VAD + + :cpp:func:`lp_core_lp_vad_enable` and :cpp:func:`lp_core_lp_vad_disable` are used for enabling / disabling the hardware. + +LP Core Wake-up +^^^^^^^^^^^^^^^ + +.. only:: SOC_LP_I2S_SUPPORT_VAD + + Set :c:macro:`ULP_LP_CORE_WAKEUP_SOURCE_LP_VAD` in :cpp:type:`ulp_lp_core_cfg_t` to enable the VAD to be working as the LP core wake-up source. + + .. code:: c + + static void load_and_start_lp_core_firmware(ulp_lp_core_cfg_t* cfg, const uint8_t* firmware_start, const uint8_t* firmware_end) + { + TEST_ASSERT(ulp_lp_core_load_binary(firmware_start, + (firmware_end - firmware_start)) == ESP_OK); + + TEST_ASSERT(ulp_lp_core_run(cfg) == ESP_OK); + } + + ulp_lp_core_cfg_t cfg = { + .wakeup_source = ULP_LP_CORE_WAKEUP_SOURCE_LP_VAD, + }; + load_and_start_lp_core_firmware(&cfg, lp_core_main_vad_bin_start, lp_core_main_vad_bin_end); + + +API Reference +------------- + +.. include-build-file:: inc/lp_i2s_vad.inc +.. include-build-file:: inc/ulp_lp_core_lp_vad_shared.inc diff --git a/docs/zh_CN/api-reference/peripherals/index.rst b/docs/zh_CN/api-reference/peripherals/index.rst index ea2198b57a..fb247adae0 100644 --- a/docs/zh_CN/api-reference/peripherals/index.rst +++ b/docs/zh_CN/api-reference/peripherals/index.rst @@ -40,6 +40,8 @@ :SOC_GPSPI_SUPPORTED: spi_master :SOC_GPSPI_SUPPORTED: spi_slave :SOC_SPI_SUPPORT_SLAVE_HD_VER2: spi_slave_hd + :SOC_LP_I2S_SUPPORTED: lp_i2s + :SOC_LP_VAD_SUPPORTED: vad :SOC_JPEG_CODEC_SUPPORTED: jpeg :SOC_TEMP_SENSOR_SUPPORTED: temp_sensor :SOC_TOUCH_SENSOR_SUPPORTED and not esp32p4: touch_pad diff --git a/docs/zh_CN/api-reference/peripherals/lp_i2s.rst b/docs/zh_CN/api-reference/peripherals/lp_i2s.rst new file mode 100644 index 0000000000..7bb773ad78 --- /dev/null +++ b/docs/zh_CN/api-reference/peripherals/lp_i2s.rst @@ -0,0 +1 @@ +.. include:: ../../../en/api-reference/peripherals/lp_i2s.rst diff --git a/docs/zh_CN/api-reference/peripherals/vad.rst b/docs/zh_CN/api-reference/peripherals/vad.rst new file mode 100644 index 0000000000..bd87f08f81 --- /dev/null +++ b/docs/zh_CN/api-reference/peripherals/vad.rst @@ -0,0 +1 @@ +.. include:: ../../../en/api-reference/peripherals/vad.rst From 22f36bea530994afe4ff7ad7626ab22475e3d381 Mon Sep 17 00:00:00 2001 From: Armando Date: Thu, 14 Nov 2024 14:24:45 +0800 Subject: [PATCH 4/6] change(vad): wakeup driver maitain necessary power domain --- components/esp_hw_support/sleep_modes.c | 21 ++++++++++++++++++- .../test_apps/vad_wakeup/README.md | 1 + .../vad_wakeup/main/test_vad_wakeup.c | 2 -- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/components/esp_hw_support/sleep_modes.c b/components/esp_hw_support/sleep_modes.c index 71d873069f..935fdd4f91 100644 --- a/components/esp_hw_support/sleep_modes.c +++ b/components/esp_hw_support/sleep_modes.c @@ -1669,8 +1669,27 @@ esp_err_t esp_sleep_enable_timer_wakeup(uint64_t time_in_us) #if SOC_LP_VAD_SUPPORTED esp_err_t esp_sleep_enable_vad_wakeup(void) { + esp_err_t ret = ESP_FAIL; + + ret = esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "fail to keep rtc periph power on"); + return ret; + } + + ret = esp_sleep_pd_config(ESP_PD_DOMAIN_XTAL, ESP_PD_OPTION_ON); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "fail to keep xtal power on"); + return ret; + } + ret = esp_sleep_sub_mode_config(ESP_SLEEP_LP_USE_XTAL_MODE, true); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "fail to set to ESP_SLEEP_LP_USE_XTAL_MODE mode"); + return ret; + } s_config.wakeup_triggers |= RTC_LP_VAD_TRIG_EN; - return esp_sleep_sub_mode_config(ESP_SLEEP_LP_USE_XTAL_MODE, true); + + return ESP_OK; } #endif diff --git a/components/esp_hw_support/test_apps/vad_wakeup/README.md b/components/esp_hw_support/test_apps/vad_wakeup/README.md index f8ea707124..49827b24fa 100644 --- a/components/esp_hw_support/test_apps/vad_wakeup/README.md +++ b/components/esp_hw_support/test_apps/vad_wakeup/README.md @@ -1,3 +1,4 @@ | Supported Targets | ESP32-P4 | | ----------------- | -------- | +Slave side (LP I2S) should use default (UART0) console, as the USJ isn't working well under sleep modes. \ No newline at end of file diff --git a/components/esp_hw_support/test_apps/vad_wakeup/main/test_vad_wakeup.c b/components/esp_hw_support/test_apps/vad_wakeup/main/test_vad_wakeup.c index 2a245bfc6f..290d9b6638 100644 --- a/components/esp_hw_support/test_apps/vad_wakeup/main/test_vad_wakeup.c +++ b/components/esp_hw_support/test_apps/vad_wakeup/main/test_vad_wakeup.c @@ -98,8 +98,6 @@ static void s_hp_i2s_config(void) static void s_lp_vad_config(void) { ESP_ERROR_CHECK(esp_sleep_enable_vad_wakeup()); - ESP_ERROR_CHECK(esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON)); - ESP_ERROR_CHECK(esp_sleep_pd_config(ESP_PD_DOMAIN_XTAL, ESP_PD_OPTION_ON)); lp_i2s_chan_handle_t rx_handle = NULL; lp_i2s_chan_config_t config = { From 6aa6883af474dfca988d309ddc554941b1748a77 Mon Sep 17 00:00:00 2001 From: Armando Date: Thu, 21 Nov 2024 10:51:39 +0800 Subject: [PATCH 5/6] change(lp_i2d): use atomic fsm check --- components/esp_driver_i2s/i2s_private.h | 3 ++- components/esp_driver_i2s/lp_i2s.c | 17 ++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/components/esp_driver_i2s/i2s_private.h b/components/esp_driver_i2s/i2s_private.h index bc2cc1f8b4..b875c08f0b 100644 --- a/components/esp_driver_i2s/i2s_private.h +++ b/components/esp_driver_i2s/i2s_private.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include "freertos/FreeRTOS.h" #include "freertos/semphr.h" #include "freertos/queue.h" @@ -199,7 +200,7 @@ struct lp_i2s_channel_obj_t { i2s_comm_mode_t mode; /*!< lp i2s channel communication mode */ i2s_role_t role; /*!< lp i2s role */ i2s_dir_t dir; /*!< lp i2s channel direction */ - i2s_state_t state; /*!< lp i2s driver state. Ensuring the driver working in a correct sequence */ + _Atomic i2s_state_t state; /*!< lp i2s driver state. Ensuring the driver working in a correct sequence */ SemaphoreHandle_t semphr; /*!< lp i2s event semphr*/ lp_i2s_trans_t trans; /*!< transaction */ size_t threshold; /*!< lp i2s threshold*/ diff --git a/components/esp_driver_i2s/lp_i2s.c b/components/esp_driver_i2s/lp_i2s.c index 707e5c12c7..82284bdd46 100644 --- a/components/esp_driver_i2s/lp_i2s.c +++ b/components/esp_driver_i2s/lp_i2s.c @@ -135,8 +135,8 @@ err1: esp_err_t lp_i2s_channel_enable(lp_i2s_chan_handle_t chan) { ESP_RETURN_ON_FALSE(chan, ESP_ERR_INVALID_ARG, TAG, "invalid argument: null pointer"); - ESP_RETURN_ON_FALSE(chan->state < I2S_CHAN_STATE_RUNNING, ESP_ERR_INVALID_STATE, TAG, "the channel is in enabled state already"); - + i2s_state_t expected_state = I2S_CHAN_STATE_READY; + ESP_RETURN_ON_FALSE(atomic_compare_exchange_strong(&(chan->state), &expected_state, I2S_CHAN_STATE_RUNNING), ESP_ERR_INVALID_STATE, TAG, "the channel isn't enabled"); lp_i2s_evt_data_t evt_data = {}; if (chan->cbs.on_request_new_trans) { chan->cbs.on_request_new_trans(chan, &evt_data, chan->user_data); @@ -146,7 +146,6 @@ esp_err_t lp_i2s_channel_enable(lp_i2s_chan_handle_t chan) chan->trans = evt_data.trans; } - chan->state = I2S_CHAN_STATE_RUNNING; portENTER_CRITICAL(&g_i2s.spinlock); lp_i2s_ll_rx_enable_interrupt(chan->ctlr->hal.dev, LP_I2S_LL_EVENT_RX_MEM_THRESHOLD_INT, true); lp_i2s_ll_rx_start(chan->ctlr->hal.dev); @@ -158,7 +157,7 @@ esp_err_t lp_i2s_channel_enable(lp_i2s_chan_handle_t chan) esp_err_t lp_i2s_channel_read(lp_i2s_chan_handle_t chan, lp_i2s_trans_t *trans, uint32_t timeout_ms) { ESP_RETURN_ON_FALSE(chan, ESP_ERR_INVALID_ARG, TAG, "invalid argument: null pointer"); - ESP_RETURN_ON_FALSE(chan->state == I2S_CHAN_STATE_RUNNING, ESP_ERR_INVALID_STATE, TAG, "the channel isn't enabled"); + ESP_RETURN_ON_FALSE(atomic_load(&(chan->state)) == I2S_CHAN_STATE_RUNNING, ESP_ERR_INVALID_STATE, TAG, "the channel can't be deleted unless it is disabled"); ESP_RETURN_ON_FALSE(!chan->cbs.on_request_new_trans, ESP_ERR_INVALID_STATE, TAG, "on_request_new_trans registered, no use of this read API"); TickType_t ticks_to_wait = timeout_ms / portTICK_PERIOD_MS; @@ -207,8 +206,8 @@ esp_err_t lp_i2s_channel_read_until_bytes(lp_i2s_chan_handle_t chan, lp_i2s_tran esp_err_t lp_i2s_channel_disable(lp_i2s_chan_handle_t chan) { ESP_RETURN_ON_FALSE(chan, ESP_ERR_INVALID_ARG, TAG, "invalid argument: null pointer"); - ESP_RETURN_ON_FALSE(chan->state > I2S_CHAN_STATE_READY, ESP_ERR_INVALID_STATE, TAG, "the channel is disabled already"); - chan->state = I2S_CHAN_STATE_READY; + i2s_state_t expected_state = I2S_CHAN_STATE_RUNNING; + ESP_RETURN_ON_FALSE(atomic_compare_exchange_strong(&(chan->state), &expected_state, I2S_CHAN_STATE_READY), ESP_ERR_INVALID_STATE, TAG, "the channel isn't enabled"); portENTER_CRITICAL(&g_i2s.spinlock); lp_i2s_ll_rx_enable_interrupt(chan->ctlr->hal.dev, LP_I2S_LL_EVENT_RX_MEM_THRESHOLD_INT, false); @@ -221,7 +220,7 @@ esp_err_t lp_i2s_channel_disable(lp_i2s_chan_handle_t chan) esp_err_t lp_i2s_del_channel(lp_i2s_chan_handle_t chan) { ESP_RETURN_ON_FALSE(chan, ESP_ERR_INVALID_ARG, TAG, "invalid argument: null pointer"); - ESP_RETURN_ON_FALSE(chan->state < I2S_CHAN_STATE_RUNNING, ESP_ERR_INVALID_STATE, TAG, "the channel can't be deleted unless it is disabled"); + ESP_RETURN_ON_FALSE(atomic_load(&(chan->state)) == I2S_CHAN_STATE_READY, ESP_ERR_INVALID_STATE, TAG, "the channel can't be deleted unless it is disabled"); int id = chan->ctlr->id; portENTER_CRITICAL(&g_i2s.spinlock); @@ -249,7 +248,7 @@ _Static_assert(sizeof(lp_i2s_evt_cbs_t) == sizeof(lp_i2s_evt_cbs_internal_t), "I esp_err_t lp_i2s_register_event_callbacks(lp_i2s_chan_handle_t chan, const lp_i2s_evt_cbs_t *cbs, void *user_data) { ESP_RETURN_ON_FALSE(chan && cbs, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); - ESP_RETURN_ON_FALSE(chan->state < I2S_CHAN_STATE_RUNNING, ESP_ERR_INVALID_STATE, TAG, "the channel is in enabled state already"); + ESP_RETURN_ON_FALSE(atomic_load(&(chan->state)) == I2S_CHAN_STATE_READY, ESP_ERR_INVALID_STATE, TAG, "the channel is in enabled state already"); if (cbs->on_thresh_met) { ESP_RETURN_ON_FALSE(esp_ptr_in_iram(cbs->on_thresh_met), ESP_ERR_INVALID_ARG, TAG, "on_thresh_met callback not in IRAM"); @@ -287,7 +286,7 @@ static esp_err_t s_i2s_register_channel(lp_i2s_controller_t *ctlr, i2s_dir_t dir new_chan->mode = I2S_COMM_MODE_NONE; new_chan->role = I2S_ROLE_MASTER; new_chan->dir = dir; - new_chan->state = I2S_CHAN_STATE_REGISTER; + atomic_init(&(new_chan->state), I2S_CHAN_STATE_READY); new_chan->ctlr = ctlr; if (dir == I2S_DIR_RX) { From 4207ec8b3b915db26da82f4c58507c8def0ae2b9 Mon Sep 17 00:00:00 2001 From: Armando Date: Thu, 21 Nov 2024 18:27:11 +0800 Subject: [PATCH 6/6] doc(vad): remove vad png --- docs/_static/diagrams/vad/vad_state_machine.png | Bin 52656 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/_static/diagrams/vad/vad_state_machine.png diff --git a/docs/_static/diagrams/vad/vad_state_machine.png b/docs/_static/diagrams/vad/vad_state_machine.png deleted file mode 100644 index 7677ec07a4d98558176f36ed5eebf98c8a57fd21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52656 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 bY>$x!{_3IFo5&G>^C7B=nhHgCEua1e_O2ue