From db7e90fef98e29d0035a54dcc93ec968259c7cab Mon Sep 17 00:00:00 2001 From: laokaiyao Date: Sat, 7 Oct 2023 14:34:21 +0800 Subject: [PATCH] feat(parlio_rx): add parlio rx examples --- .../driver/parlio/include/driver/parlio_rx.h | 128 +++--- components/driver/parlio/parlio_common.c | 44 ++- components/driver/parlio/parlio_private.h | 18 +- components/driver/parlio/parlio_rx.c | 222 +++++++---- components/driver/parlio/parlio_tx.c | 34 +- .../test_apps/parlio/main/CMakeLists.txt | 2 +- .../test_apps/parlio/main/test_parlio_rx.c | 364 ++++++++++-------- .../test_apps/parlio/pytest_parlio_unity.py | 2 +- .../hal/esp32c6/include/hal/parlio_ll.h | 60 +-- .../hal/esp32h2/include/hal/parlio_ll.h | 60 +-- .../hal/esp32p4/include/hal/parlio_ll.h | 63 --- components/hal/include/hal/parlio_types.h | 7 +- docs/en/api-reference/peripherals/parlio.rst | 4 - examples/peripherals/.build-test-rules.yml | 8 +- .../parlio_rx/logic_analyzer/CMakeLists.txt | 8 + .../parlio/parlio_rx/logic_analyzer/README.md | 229 +++++++++++ .../components/esp_probe/CMakeLists.txt | 12 + .../components/esp_probe/esp_probe.c | 288 ++++++++++++++ .../components/esp_probe/esp_probe_private.h | 66 ++++ .../components/esp_probe/host/tcp_server.py | 76 ++++ .../components/esp_probe/host/vcd_dumper.py | 128 ++++++ .../esp_probe/hw_impl/esp_probe_impl_parlio.c | 147 +++++++ .../components/esp_probe/include/esp_probe.h | 147 +++++++ .../esp_probe/include/esp_probe_streams.h | 74 ++++ .../components/esp_probe/stream/file_stream.c | 31 ++ .../components/esp_probe/stream/flash_fatfs.c | 41 ++ .../components/esp_probe/stream/tcp_stream.c | 84 ++++ .../logic_analyzer/img/gpio_sig.jpeg | Bin 0 -> 95055 bytes .../parlio_rx/logic_analyzer/img/i2s_sig.jpeg | Bin 0 -> 199312 bytes .../logic_analyzer/img/pulseview.jpeg | Bin 0 -> 54021 bytes .../logic_analyzer/main/CMakeLists.txt | 3 + .../logic_analyzer/main/Kconfig.projbuild | 39 ++ .../logic_analyzer/main/idf_component.yml | 3 + .../main/logic_analyzer_example_main.c | 132 +++++++ .../parlio_rx/logic_analyzer/partitions.csv | 5 + .../logic_analyzer/sdkconfig.defaults | 6 + .../simple_rgb_led_matrix/CMakeLists.txt | 0 .../simple_rgb_led_matrix/README.md | 0 .../simple_rgb_led_matrix/main/CMakeLists.txt | 0 .../main/idf_component.yml | 0 .../simple_rgb_led_matrix/main/lvgl_demo_ui.c | 0 .../main/rgb_led_matrix_example_main.c | 0 .../pytest_simple_rgb_led_matrix.py | 0 .../simple_rgb_led_matrix/sdkconfig.defaults | 0 44 files changed, 2017 insertions(+), 518 deletions(-) create mode 100644 examples/peripherals/parlio/parlio_rx/logic_analyzer/CMakeLists.txt create mode 100644 examples/peripherals/parlio/parlio_rx/logic_analyzer/README.md create mode 100644 examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/CMakeLists.txt create mode 100644 examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/esp_probe.c create mode 100644 examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/esp_probe_private.h create mode 100644 examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/host/tcp_server.py create mode 100644 examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/host/vcd_dumper.py create mode 100644 examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/hw_impl/esp_probe_impl_parlio.c create mode 100644 examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/include/esp_probe.h create mode 100644 examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/include/esp_probe_streams.h create mode 100644 examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/stream/file_stream.c create mode 100644 examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/stream/flash_fatfs.c create mode 100644 examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/stream/tcp_stream.c create mode 100644 examples/peripherals/parlio/parlio_rx/logic_analyzer/img/gpio_sig.jpeg create mode 100644 examples/peripherals/parlio/parlio_rx/logic_analyzer/img/i2s_sig.jpeg create mode 100644 examples/peripherals/parlio/parlio_rx/logic_analyzer/img/pulseview.jpeg create mode 100644 examples/peripherals/parlio/parlio_rx/logic_analyzer/main/CMakeLists.txt create mode 100644 examples/peripherals/parlio/parlio_rx/logic_analyzer/main/Kconfig.projbuild create mode 100644 examples/peripherals/parlio/parlio_rx/logic_analyzer/main/idf_component.yml create mode 100644 examples/peripherals/parlio/parlio_rx/logic_analyzer/main/logic_analyzer_example_main.c create mode 100644 examples/peripherals/parlio/parlio_rx/logic_analyzer/partitions.csv create mode 100644 examples/peripherals/parlio/parlio_rx/logic_analyzer/sdkconfig.defaults rename examples/peripherals/parlio/{ => parlio_tx}/simple_rgb_led_matrix/CMakeLists.txt (100%) rename examples/peripherals/parlio/{ => parlio_tx}/simple_rgb_led_matrix/README.md (100%) rename examples/peripherals/parlio/{ => parlio_tx}/simple_rgb_led_matrix/main/CMakeLists.txt (100%) rename examples/peripherals/parlio/{ => parlio_tx}/simple_rgb_led_matrix/main/idf_component.yml (100%) rename examples/peripherals/parlio/{ => parlio_tx}/simple_rgb_led_matrix/main/lvgl_demo_ui.c (100%) rename examples/peripherals/parlio/{ => parlio_tx}/simple_rgb_led_matrix/main/rgb_led_matrix_example_main.c (100%) rename examples/peripherals/parlio/{ => parlio_tx}/simple_rgb_led_matrix/pytest_simple_rgb_led_matrix.py (100%) rename examples/peripherals/parlio/{ => parlio_tx}/simple_rgb_led_matrix/sdkconfig.defaults (100%) diff --git a/components/driver/parlio/include/driver/parlio_rx.h b/components/driver/parlio/include/driver/parlio_rx.h index 890049fc4f..a080c399d1 100644 --- a/components/driver/parlio/include/driver/parlio_rx.h +++ b/components/driver/parlio/include/driver/parlio_rx.h @@ -24,10 +24,10 @@ typedef struct { size_t max_recv_size; /*!< Maximum receive size in one transaction, in bytes. This decides the number of DMA nodes will be used for each transaction */ size_t data_width; /*!< Parallel IO data width, can set to 1/2/4/8/..., but can't be greater than PARLIO_RX_UNIT_MAX_DATA_WIDTH */ parlio_clock_source_t clk_src; /*!< Parallel IO clock source */ - uint32_t clk_freq_hz; /*!< The source clock frequency for external when the clock source is selected as PARLIO_CLK_SRC_EXTERNAL; - The expected output clock frequency when the clock source is from internal */ - gpio_num_t clk_gpio_num; /*!< The input or output clock pin. If the clock source is input from external, - the clock gpio must be set, otherwise set `-1` can disable the clock output if not needed */ + uint32_t ext_clk_freq_hz; /*!< The external source clock frequency. Only be valid when select PARLIO_CLK_SRC_EXTERNAL as clock source */ + uint32_t exp_clk_freq_hz; /*!< The expected sample/bit clock frequency, which is divided from the internal or external clock regarding the clock source */ + gpio_num_t clk_in_gpio_num; /*!< The the external clock input pin. Only be valid when select PARLIO_CLK_SRC_EXTERNAL as clock source. Set to -1 if not needed */ + gpio_num_t clk_out_gpio_num; /*!< The sample/bit clock output pin. Set to -1 if not needed */ gpio_num_t valid_gpio_num; /*!< GPIO number of the valid signal. The signal on this pin is used to indicate whether the data on the data lines are valid. Only takes effect when using level or pulse delimiter, set to `-1` if only use the soft delimiter */ gpio_num_t data_gpio_nums[PARLIO_RX_UNIT_MAX_DATA_WIDTH]; /*!< Parallel IO data GPIO numbers, set to `-1` if it's not used, @@ -35,14 +35,14 @@ typedef struct { struct { uint32_t free_clk : 1; /*!< Whether the input external clock is a free-running clock. A free-running clock will always keep running (e.g. I2S bclk), a non-free-running clock will start when there are data transporting and stop when the bus idle (e.g. SPI). - This flag only takes effect when the clock source is selected as PARLIO_CLK_SRC_EXTERNAL */ + This flag only takes effect when select PARLIO_CLK_SRC_EXTERNAL as clock source */ uint32_t clk_gate_en : 1; /*!< Enable RX clock gating, only available when the clock direction is output(not supported on ESP32-C6) the output clock will be controlled by the valid gpio, i.e. high level of valid gpio to enable the clock output, low to disable */ uint32_t io_loop_back: 1; /*!< For debug/test, the signal output from the GPIO will be fed to the input path as well */ uint32_t io_no_init: 1; /*!< Set to skip initializing the GPIO, but only attach the pralio rx signals to those GPIOs via IO Matrix. So that the signals that have attached to those GPIO won't be overwritten. Mainly used for self communication or self monitoring */ - } flags; + } flags; /*!< RX driver flags */ } parlio_rx_unit_config_t; /** @@ -50,7 +50,11 @@ typedef struct { * * @param[in] config Parallel IO RX unit configuration * @param[out] ret_unit Returned Parallel IO RX unit handle - * @return esp_err_t + * @return + * - ESP_ERR_INVALID_ARG Invalid arguments in the parameter list or the rx unit configuration + * - ESP_ERR_NOT_FOUND No available rx unit found + * - ESP_ERR_NO_MEM No enough memory for the rx unit resources + * - ESP_OK Success to allocate the rx unit */ esp_err_t parlio_new_rx_unit(const parlio_rx_unit_config_t *config, parlio_rx_unit_handle_t *ret_unit); @@ -58,7 +62,10 @@ esp_err_t parlio_new_rx_unit(const parlio_rx_unit_config_t *config, parlio_rx_un * @brief Delete a Parallel IO RX unit * * @param[in] rx_unit Parallel IO RX unit handle that created by `parlio_new_rx_unit` - * @return esp_err_t + * @return + * - ESP_ERR_INVALID_ARG rx_unit is NULL + * - ESP_ERR_INVALID_STATE The rx unit is enabled, can't delete an enabled rx unit + * - ESP_OK Success to delete the rx unit */ esp_err_t parlio_del_rx_unit(parlio_rx_unit_handle_t rx_unit); @@ -79,19 +86,24 @@ typedef struct { uint32_t timeout_ticks; /*!< The number of source clock ticks to trigger timeout interrupt. Set 0 to disable the receive timeout interrupt The timeout counter starts when the valid/enable signal is invalid/disabled. */ struct { - uint32_t active_level: 1; /*!< Which level indicates the validation of the transmitting data */ + uint32_t active_low_en: 1; /*!< Set true to set the valid signal active when the level is low, + otherwise, the valid signal becomes active when its level is high */ } flags; /*!< Extra flags */ } parlio_rx_level_delimiter_config_t; /** * @brief Create a level delimiter - * + * @note This function only allocate the software resources, the hardware configurations + * will lazy installed while the transaction that using this delimiter start processing * @note The enable signal must be aligned with the valid data. * @note There're at most `SOC_PARLIO_RX_UNIT_MAX_DATA_WIDTH - 1` IO pins left for RXD * * @param[in] config Level delimiter configuration * @param[out] ret_delimiter Returned delimiter handle - * @return esp_err_t + * @return + * - ESP_ERR_INVALID_ARG Invalid arguments in the parameter list or the level delimiter configuration + * - ESP_ERR_NO_MEM No enough memory for the level delimiter resources + * - ESP_OK Success to allocate the level delimiter */ esp_err_t parlio_new_rx_level_delimiter(const parlio_rx_level_delimiter_config_t *config, parlio_rx_delimiter_handle_t *ret_delimiter); @@ -124,12 +136,16 @@ typedef struct { /** * @brief Create a pulse delimiter - * + * @note This function only allocate the software resources, the hardware configurations + * will lazy installed while the transaction that using this delimiter start processing * @note There're at most `SOC_PARLIO_RX_UNIT_MAX_DATA_WIDTH - 1` IO pins left for RXD * * @param[in] config Pulse delimiter configuration * @param[out] ret_delimiter Returned delimiter handle - * @return esp_err_t + * @return + * - ESP_ERR_INVALID_ARG Invalid arguments in the parameter list or the pulse delimiter configuration + * - ESP_ERR_NO_MEM No enough memory for the pulse delimiter resources + * - ESP_OK Success to allocate the pulse delimiter */ esp_err_t parlio_new_rx_pulse_delimiter(const parlio_rx_pulse_delimiter_config_t *config, parlio_rx_delimiter_handle_t *ret_delimiter); @@ -144,16 +160,20 @@ typedef struct { uint32_t eof_data_len; /*!< Set the data length to trigger the End Of Frame (EOF, i.e. transaction done) interrupt, if the data length is set to `0`, that mean the EOF will only triggers when the end pulse detected, please ensure there is an end pulse for a frame and - `has_end_pulse` flag is set */ + `parlio_rx_pulse_delimiter_config_t::has_end_pulse` flag is set */ uint32_t timeout_ticks; /*!< The number of APB clock ticks to trigger timeout interrupt. Set 0 to disable the receive timeout interrupt */ } parlio_rx_soft_delimiter_config_t; /** * @brief Create a pulse delimiter - * + * @note This function only allocate the software resources, the hardware configurations + * will lazy installed while the transaction that using this delimiter start processing * @param[in] config Soft delimiter configuration * @param[out] ret_delimiter Returned delimiter handle - * @return esp_err_t + * @return + * - ESP_ERR_INVALID_ARG Invalid arguments in the parameter list or the soft delimiter configuration + * - ESP_ERR_NO_MEM No enough memory for the soft delimiter resources + * - ESP_OK Success to allocate the soft delimiter */ esp_err_t parlio_new_rx_soft_delimiter(const parlio_rx_soft_delimiter_config_t *config, parlio_rx_delimiter_handle_t *ret_delimiter); @@ -165,31 +185,22 @@ esp_err_t parlio_new_rx_soft_delimiter(const parlio_rx_soft_delimiter_config_t * * @param[in] rx_unit Parallel IO RX unit handle that created by `parlio_new_rx_unit` * @param[in] delimiter Delimiter handle * @param[in] start_stop Set true to start, set false to stop - * @return esp_err_t + * @return + * - ESP_ERR_INVALID_ARG Invalid arguments in the parameter list or not soft delimiter + * - ESP_ERR_INVALID_STATE The rx unit not enabled + * - ESP_OK Success to start or stop the soft delimiter */ esp_err_t parlio_rx_soft_delimiter_start_stop(parlio_rx_unit_handle_t rx_unit, parlio_rx_delimiter_handle_t delimiter, bool start_stop); -/** - * @brief Generic Selection of the delimiter create functions - * @note This is a helper function for creating the delimiter generically, - * input different type of configuration to create a corresponding delimiter - * - * @param[in] config The configuration of the delimiter, whose type decides the delimiter type that created, - * Can be `parlio_rx_level_delimiter_config_t`, `parlio_rx_pulse_delimiter_config_t` or `parlio_rx_soft_delimiter_config_t` - * @param[out] ret_delimiter Returned delimiter handle - */ -#define parlio_new_rx_delimiter(config, ret_delimiter) _Generic((config), \ - parlio_rx_level_delimiter_config_t* : parlio_new_rx_level_delimiter, \ - parlio_rx_pulse_delimiter_config_t* : parlio_new_rx_pulse_delimiter, \ - parlio_rx_soft_delimiter_config_t* : parlio_new_rx_soft_delimiter, \ - default: parlio_new_rx_soft_delimiter) (config, ret_delimiter) - /** * @brief Delete the delimiter * @note To delete the delimiter safely, please delete it after disable all the RX units * * @param[in] delimiter Delimiter handle - * @return esp_err_t + * @return + * - ESP_ERR_INVALID_ARG The input delimiter is NULL + * - ESP_ERR_INVALID_STATE The delimiter is on receiving + * - ESP_OK Success to delete the delimiter */ esp_err_t parlio_del_rx_delimiter(parlio_rx_delimiter_handle_t delimiter); @@ -200,15 +211,21 @@ esp_err_t parlio_del_rx_delimiter(parlio_rx_delimiter_handle_t delimiter); * @param[in] reset_queue Whether to reset the receiving queue. * If set to false, the legacy receive transactions in the queue are still available, * If set to true, the legacy receive transactions in the queue are dropped. - * @return esp_err_t + * @return + * - ESP_ERR_INVALID_ARG The input rx_unit is NULL + * - ESP_ERR_INVALID_STATE The rx unit has been enabled + * - ESP_OK Success to enable the rx unit */ esp_err_t parlio_rx_unit_enable(parlio_rx_unit_handle_t rx_unit, bool reset_queue); /** - * @brief Disable the Parallel IO TX unit + * @brief Disable the Parallel IO RX unit * * @param[in] rx_unit Parallel IO RX unit handle that created by `parlio_new_rx_unit` - * @return esp_err_t + * @return + * - ESP_ERR_INVALID_ARG The input rx_unit is NULL + * - ESP_ERR_INVALID_STATE The rx unit has been disabled + * - ESP_OK Success to disable the rx unit */ esp_err_t parlio_rx_unit_disable(parlio_rx_unit_handle_t rx_unit); @@ -216,22 +233,24 @@ esp_err_t parlio_rx_unit_disable(parlio_rx_unit_handle_t rx_unit); * @brief Configuration of a receive transaction */ typedef struct { - parlio_rx_delimiter_handle_t delimiter; /*!< The delimiter of this receiving transaction */ + parlio_rx_delimiter_handle_t delimiter; /*!< The delimiter of this receiving transaction */ struct { - uint32_t is_infinite: 1; /*!< Whether this is an infinite transaction that supposed to receive continuously */ - uint32_t indirect_mount: 1;/*!< This flag only take effect when `is_infinite` is enabled. - * Enable this flag, the DMA descriptor will mount to an internal DMA buffer instead, + uint32_t partial_rx_en: 1; /*!< Whether this is an infinite transaction that supposed to receive continuously and partially */ + uint32_t indirect_mount: 1; /*!< This flag only take effect when `partial_rx_en` is enabled. + * Enable this flag, an INTERNAL DMA buffer will be mounted to the DMA descriptor instead, * The data will be copy to the payload in every interrupt. So that to guarantee the payload buffer * is valid during the `on_receive_done` callback. - * Either `is_infinite` or `indirect_mount` is disabled, - * the finite payload will be mounted to the DMA descriptor directly. - * By default, the receive payload will be mounted to the DMA descriptor directly, + * Either `partial_rx_en` or `indirect_mount` is disabled, + * the user given finite payload will be mounted to the DMA descriptor directly. + * By default, the user given receive payload will be mounted to the DMA descriptor directly. */ } flags; /*!< Extra flags */ } parlio_receive_config_t; /** * @brief Receive data by Parallel IO RX unit + * @note This is a non-blocking and asynchronous function. To block or realize synchronous receive, + * please call `parlio_rx_unit_wait_all_done` after this function * @note The receive transaction will start immediately when there is not other transaction on receiving, * Otherwise it will be sent to the transaction queue to wait for the bus. * @@ -239,7 +258,12 @@ typedef struct { * @param[in] payload The payload buffer pointer * @param[in] payload_size The size of the payload buffer, in bytes. * @param[in] recv_cfg The configuration of this receive transaction - * @return esp_err_t + * @return + * - ESP_ERR_INVALID_ARG Invalid arguments in the parameter list or the receive configuration + * - ESP_ERR_NO_MEM No memory for the internal DMA buffer (only when parlio_receive_config_t::indirect_mount enabled) + * - ESP_ERR_INVALID_STATE Transaction queue is full, failed to queue the current transaction. + * Or the internal buffer is under using by an infinite transaction, can't allocate a new one + * - ESP_OK Success to queue the current receiving transaction */ esp_err_t parlio_rx_unit_receive(parlio_rx_unit_handle_t rx_unit, void *payload, @@ -248,10 +272,16 @@ esp_err_t parlio_rx_unit_receive(parlio_rx_unit_handle_t rx_unit, /** * @brief Wait for all pending RX transactions done + * @note This function will block until all receiving transactions done or timeout. + * When timeout occurs, either the timeout limitation too short for all transactions done, + * or the peripheral got stuck and no more interrupts trigger (e.g., external clock stopped). * * @param[in] rx_unit Parallel IO RX unit handle that created by `parlio_new_rx_unit` * @param[in] timeout_ms Timeout in milliseconds, `-1` means to wait forever (software timeout) - * @return esp_err_t + * @return + * - ESP_ERR_INVALID_ARG The input rx_unit is NULL + * - ESP_ERR_TIMEOUT Wait for all transactions done timeout + * - ESP_OK All transaction done */ esp_err_t parlio_rx_unit_wait_all_done(parlio_rx_unit_handle_t rx_unit, int timeout_ms); @@ -261,7 +291,6 @@ esp_err_t parlio_rx_unit_wait_all_done(parlio_rx_unit_handle_t rx_unit, int time typedef struct { parlio_rx_delimiter_handle_t delimiter; /*!< The current delimiter of this receiving event */ void *data; /*!< The data buffer address that just finished receiving */ - size_t size; /*!< The total size of the data buffer , in byte */ size_t recv_bytes; /*!< The number of received bytes in the data buffer */ } parlio_rx_event_data_t; @@ -291,9 +320,12 @@ typedef struct { * @brief Register event callbacks for Parallel IO RX unit * * @param[in] rx_unit Parallel IO RX unit handle that created by `parlio_new_rx_unit` - * @param[in] cbs Callbacks + * @param[in] cbs Callback group, set callback to NULL to deregister the corresponding callback (callback group pointer shouldn't be NULL) * @param[in] user_data User specified data that will be transported to the callbacks - * @return esp_err_t + * @return + * - ESP_ERR_INVALID_ARG The input rx_unit is NULL + * - ESP_ERR_INVALID_STATE The rx unit has been enabled, callback should be registered before enabling the unit + * - ESP_OK Success to register the callbacks */ esp_err_t parlio_rx_unit_register_event_callbacks(parlio_rx_unit_handle_t rx_unit, const parlio_rx_event_callbacks_t *cbs, void *user_data); diff --git a/components/driver/parlio/parlio_common.c b/components/driver/parlio/parlio_common.c index a5b5087723..cd5a7aeb70 100644 --- a/components/driver/parlio/parlio_common.c +++ b/components/driver/parlio/parlio_common.c @@ -99,12 +99,23 @@ esp_err_t parlio_register_unit_to_group(parlio_unit_base_handle_t unit) parlio_unit_base_handle_t *group_unit = NULL; ESP_RETURN_ON_FALSE(group, ESP_ERR_NO_MEM, TAG, "no memory for group (%d)", i); portENTER_CRITICAL(&group->spinlock); - for (int j = 0; j < SOC_PARLIO_RX_UNITS_PER_GROUP; j++) { - group_unit = (unit->dir == PARLIO_DIR_TX) ? &group->tx_units[j] : &group->rx_units[j]; - if (*group_unit == NULL) { - *group_unit = unit; - unit_id = j; - break; + if (unit->dir == PARLIO_DIR_TX) { + for (int j = 0; j < SOC_PARLIO_TX_UNITS_PER_GROUP; j++) { + group_unit = &group->tx_units[j]; + if (*group_unit == NULL) { + *group_unit = unit; + unit_id = j; + break; + } + } + } else { + for (int j = 0; j < SOC_PARLIO_RX_UNITS_PER_GROUP; j++) { + group_unit = &group->rx_units[j]; + if (*group_unit == NULL) { + *group_unit = unit; + unit_id = j; + break; + } } } portEXIT_CRITICAL(&group->spinlock); @@ -125,16 +136,15 @@ esp_err_t parlio_register_unit_to_group(parlio_unit_base_handle_t unit) void parlio_unregister_unit_from_group(parlio_unit_base_handle_t unit) { - if (unit) { - parlio_group_t *group = unit->group; - portENTER_CRITICAL(&group->spinlock); - if (unit->dir == PARLIO_DIR_TX) { - group->tx_units[unit->unit_id] = NULL; - } else { - group->rx_units[unit->unit_id] = NULL; - } - portEXIT_CRITICAL(&group->spinlock); - /* the rx unit has a reference of the group, release it now */ - parlio_release_group_handle(group); + assert(unit); + parlio_group_t *group = unit->group; + portENTER_CRITICAL(&group->spinlock); + if (unit->dir == PARLIO_DIR_TX) { + group->tx_units[unit->unit_id] = NULL; + } else { + group->rx_units[unit->unit_id] = NULL; } + portEXIT_CRITICAL(&group->spinlock); + /* the parlio unit has a reference of the group, release it now */ + parlio_release_group_handle(group); } diff --git a/components/driver/parlio/parlio_private.h b/components/driver/parlio/parlio_private.h index c16b93b37f..1a88979734 100644 --- a/components/driver/parlio/parlio_private.h +++ b/components/driver/parlio/parlio_private.h @@ -118,12 +118,22 @@ struct parlio_unit_t { parlio_group_t *group; // group handle }; -parlio_group_t *parlio_acquire_group_handle(int group_id); - -void parlio_release_group_handle(parlio_group_t *group); - +/** + * @brief Register the rx or tx unit to the parlio group + * + * @param[in] unit The TX/RX unit base handle + * @return + * - ESP_ERR_NO_MEM No memory for the unit + * - ESP_ERR_NOT_FOUND No available unit found on this group + * - ESP_OK Success to register the unit on the group + */ esp_err_t parlio_register_unit_to_group(parlio_unit_base_handle_t unit); +/** + * @brief Unregister the rx or tx unit from the parlio group + * + * @param[in] unit The TX/RX unit base handle + */ void parlio_unregister_unit_from_group(parlio_unit_base_handle_t unit); #ifdef __cplusplus diff --git a/components/driver/parlio/parlio_rx.c b/components/driver/parlio/parlio_rx.c index b698a9cde5..b51959d8b6 100644 --- a/components/driver/parlio/parlio_rx.c +++ b/components/driver/parlio/parlio_rx.c @@ -6,7 +6,6 @@ #include #include -#include #include #include #include "sdkconfig.h" @@ -27,6 +26,7 @@ #include "hal/parlio_ll.h" #include "hal/gpio_hal.h" #include "hal/dma_types.h" +#include "hal/hal_utils.h" #include "driver/gpio.h" #include "driver/parlio_rx.h" #include "parlio_private.h" @@ -57,12 +57,10 @@ typedef struct { */ typedef struct parlio_rx_unit_t { /* Unit general Resources */ - int unit_id; /*!< unit id */ - parlio_dir_t dir; /*!< unit direction */ - parlio_group_t *group; /*!< group handle */ + struct parlio_unit_t base; /*!< base unit */ parlio_clock_source_t clk_src; /*!< clock source of the unit */ parlio_rx_unit_config_t cfg; /*!< basic configuration of the rx unit */ - bool is_enabled; /*!< State flag that indicates whether the unit is enabled */ + volatile bool is_enabled; /*!< State flag that indicates whether the unit is enabled */ /* Mutex Lock */ SemaphoreHandle_t mutex; /*!< Mutex lock for concurrence safety, * which should be acquired and released in a same function */ @@ -118,7 +116,7 @@ typedef struct parlio_rx_delimiter_t { uint32_t eof_data_len; /*!< The length of the data to trigger the eof interrupt */ uint32_t timeout_ticks; /*!< The ticks of source clock that can trigger hardware timeout */ struct { - uint32_t active_level: 1; /*!< Which level indicates the validation of the transmitting data */ + uint32_t active_low_en: 1; /*!< Whether the transmitting data validate when the valid signal at low level */ uint32_t start_bit_included: 1; /*!< Whether data bit is included in the start pulse */ uint32_t end_bit_included: 1; /*!< Whether data bit is included in the end pulse, only valid when `has_end_pulse` is true */ uint32_t has_end_pulse: 1; /*!< Whether there's an end pulse to terminate the transaction, @@ -127,13 +125,16 @@ typedef struct parlio_rx_delimiter_t { } flags; } parlio_rx_delimiter_t; +static portMUX_TYPE s_rx_spinlock = (portMUX_TYPE)portMUX_INITIALIZER_UNLOCKED; static IRAM_ATTR size_t s_parlio_mount_transaction_buffer(parlio_rx_unit_handle_t rx_unit, parlio_rx_transaction_t *trans) { dma_descriptor_t *p_desc = rx_unit->dma_descs; /* Update the current transaction to the next one, and declare the delimiter is under using of the rx unit */ memcpy(&rx_unit->curr_trans, trans, sizeof(parlio_rx_transaction_t)); + portENTER_CRITICAL_SAFE(&s_rx_spinlock); trans->delimiter->under_using = true; + portEXIT_CRITICAL_SAFE(&s_rx_spinlock); uint32_t desc_num = trans->size / DMA_DESCRIPTOR_BUFFER_MAX_SIZE_4B_ALIGNED; uint32_t remain_num = trans->size % DMA_DESCRIPTOR_BUFFER_MAX_SIZE_4B_ALIGNED; @@ -177,7 +178,7 @@ static IRAM_ATTR size_t s_parlio_mount_transaction_buffer(parlio_rx_unit_handle_ static IRAM_ATTR void s_parlio_set_delimiter_config(parlio_rx_unit_handle_t rx_unit, parlio_rx_delimiter_handle_t deli) { - parlio_hal_context_t *hal = &(rx_unit->group->hal); + parlio_hal_context_t *hal = &(rx_unit->base.group->hal); /* Set the clock sampling edge and the bit order */ parlio_ll_rx_set_sample_clock_edge(hal->regs, deli->sample_edge); @@ -187,7 +188,7 @@ static IRAM_ATTR void s_parlio_set_delimiter_config(parlio_rx_unit_handle_t rx_u switch (deli->mode) { case PARLIO_RX_LEVEL_MODE: /* Select the level receive mode */ - parlio_ll_rx_set_level_recv_mode(hal->regs, deli->flags.active_level); + parlio_ll_rx_set_level_recv_mode(hal->regs, deli->flags.active_low_en); parlio_ll_rx_treat_data_line_as_en(hal->regs, deli->valid_sig_line_id); break; case PARLIO_RX_PULSE_MODE: @@ -235,8 +236,8 @@ static IRAM_ATTR void s_parlio_set_delimiter_config(parlio_rx_unit_handle_t rx_u static esp_err_t s_parlio_rx_unit_set_gpio(parlio_rx_unit_handle_t rx_unit, const parlio_rx_unit_config_t *config) { - int group_id = rx_unit->group->group_id; - int unit_id = rx_unit->unit_id; + int group_id = rx_unit->base.group->group_id; + int unit_id = rx_unit->base.unit_id; /* Default GPIO configuration */ gpio_config_t gpio_conf = { .intr_type = GPIO_INTR_DISABLE, @@ -246,24 +247,24 @@ static esp_err_t s_parlio_rx_unit_set_gpio(parlio_rx_unit_handle_t rx_unit, cons /* When the source clock comes from external, enable the gpio input direction and connect to the clock input signal */ if (config->clk_src == PARLIO_CLK_SRC_EXTERNAL) { - ESP_RETURN_ON_FALSE(config->clk_gpio_num >= 0, ESP_ERR_INVALID_ARG, TAG, "clk_gpio_num must be set while the clock input from external"); + ESP_RETURN_ON_FALSE(config->clk_in_gpio_num >= 0, ESP_ERR_INVALID_ARG, TAG, "clk_in_gpio_num must be set while the clock input from external"); /* Connect the clock in signal to the GPIO matrix if it is set */ if (!config->flags.io_no_init) { gpio_conf.mode = config->flags.io_loop_back ? GPIO_MODE_INPUT_OUTPUT : GPIO_MODE_INPUT; - gpio_conf.pin_bit_mask = BIT64(config->clk_gpio_num); + gpio_conf.pin_bit_mask = BIT64(config->clk_in_gpio_num); ESP_RETURN_ON_ERROR(gpio_config(&gpio_conf), TAG, "config clk in GPIO failed"); } - esp_rom_gpio_connect_in_signal(config->clk_gpio_num, + esp_rom_gpio_connect_in_signal(config->clk_in_gpio_num, parlio_periph_signals.groups[group_id].rx_units[unit_id].clk_in_sig, false); } /* When the source clock comes from internal and supported to output the internal clock, * enable the gpio output direction and connect to the clock output signal */ - else if (config->clk_gpio_num >= 0) { + if (config->clk_out_gpio_num >= 0) { #if SOC_PARLIO_RX_CLK_SUPPORT_OUTPUT gpio_conf.mode = config->flags.io_loop_back ? GPIO_MODE_INPUT_OUTPUT : GPIO_MODE_OUTPUT; - gpio_conf.pin_bit_mask = BIT64(config->clk_gpio_num); + gpio_conf.pin_bit_mask = BIT64(config->clk_out_gpio_num); ESP_RETURN_ON_ERROR(gpio_config(&gpio_conf), TAG, "config clk out GPIO failed"); - esp_rom_gpio_connect_out_signal(config->clk_gpio_num, + esp_rom_gpio_connect_out_signal(config->clk_out_gpio_num, parlio_periph_signals.groups[group_id].rx_units[unit_id].clk_out_sig, false, false); #else ESP_RETURN_ON_FALSE(false, ESP_ERR_NOT_SUPPORTED, TAG, "this target not support to output the clock"); @@ -318,7 +319,6 @@ static IRAM_ATTR bool s_parlio_rx_default_eof_callback(gdma_channel_handle_t dma /* If received a normal EOF, it's a receive done event on parlio RX */ if (rx_unit->cbs.on_receive_done) { evt_data.data = rx_unit->usr_recv_buf; - evt_data.size = rx_unit->curr_trans.size; evt_data.recv_bytes = rx_unit->curr_trans.recv_bytes; need_yield |= rx_unit->cbs.on_receive_done(rx_unit, &evt_data, rx_unit->user_data); } @@ -328,27 +328,29 @@ static IRAM_ATTR bool s_parlio_rx_default_eof_callback(gdma_channel_handle_t dma /* For infinite transactions, reset the receiving bytes when the transaction is done */ rx_unit->curr_trans.recv_bytes = 0; } else { - parlio_rx_transaction_t next_trans; + parlio_rx_transaction_t next_trans = {}; /* The current transaction finished, try to get the next transaction from the transaction queue */ if (xQueueReceiveFromISR(rx_unit->trans_que, &next_trans, &high_task_woken) == pdTRUE) { if (rx_unit->cfg.flags.free_clk) { - parlio_ll_rx_enable_clock(rx_unit->group->hal.regs, false); + parlio_ll_rx_enable_clock(rx_unit->base.group->hal.regs, false); } /* If the delimiter of the next transaction is not same as the current one, need to re-config the hardware */ if (next_trans.delimiter != rx_unit->curr_trans.delimiter) { s_parlio_set_delimiter_config(rx_unit, next_trans.delimiter); } /* Mount the new transaction buffer and start the new transaction */ - s_parlio_mount_transaction_buffer(rx_unit, &rx_unit->curr_trans); + s_parlio_mount_transaction_buffer(rx_unit, &next_trans); gdma_start(rx_unit->dma_chan, (intptr_t)rx_unit->dma_descs); if (rx_unit->cfg.flags.free_clk) { - parlio_ll_rx_start(rx_unit->group->hal.regs, true); - parlio_ll_rx_enable_clock(rx_unit->group->hal.regs, true); + parlio_ll_rx_start(rx_unit->base.group->hal.regs, true); + parlio_ll_rx_enable_clock(rx_unit->base.group->hal.regs, true); } - } else { + } else if (rx_unit->curr_trans.delimiter) { // Add condition in case the curr_trans has been cleared in the last timeout isr /* No more transaction pending to receive, clear the current transaction */ + portENTER_CRITICAL_ISR(&s_rx_spinlock); rx_unit->curr_trans.delimiter->under_using = false; memset(&rx_unit->curr_trans, 0, sizeof(parlio_rx_transaction_t)); + portEXIT_CRITICAL_ISR(&s_rx_spinlock); need_yield |= high_task_woken == pdTRUE; xSemaphoreGiveFromISR(rx_unit->trans_sem, &high_task_woken); } @@ -362,13 +364,16 @@ static IRAM_ATTR bool s_parlio_rx_default_desc_done_callback(gdma_channel_handle { parlio_rx_unit_handle_t rx_unit = (parlio_rx_unit_handle_t )user_data; bool need_yield = false; + /* No need to process the data if error EOF (i.e. timeout) happened */ + if (event_data->flags.abnormal_eof) { + return false; + } + /* Get the finished descriptor from the current descriptor */ dma_descriptor_t *finished_desc = rx_unit->curr_desc; parlio_rx_event_data_t evt_data = { .delimiter = rx_unit->curr_trans.delimiter, - // TODO: The current descriptor is not able to access when error EOF occur .data = finished_desc->buffer, - .size = finished_desc->dw0.size, .recv_bytes = finished_desc->dw0.length, }; if (rx_unit->cbs.on_partial_receive) { @@ -378,7 +383,9 @@ static IRAM_ATTR bool s_parlio_rx_default_desc_done_callback(gdma_channel_handle if (rx_unit->curr_trans.flags.infinite && rx_unit->curr_trans.flags.indirect_mount) { memcpy(rx_unit->usr_recv_buf + rx_unit->curr_trans.recv_bytes, evt_data.data, evt_data.recv_bytes); } else { + portENTER_CRITICAL_ISR(&s_rx_spinlock); rx_unit->curr_trans.delimiter->under_using = false; + portEXIT_CRITICAL_ISR(&s_rx_spinlock); } /* Update received bytes */ if (rx_unit->curr_trans.recv_bytes >= rx_unit->curr_trans.size) { @@ -395,7 +402,7 @@ static esp_err_t s_parlio_rx_create_dma_descriptors(parlio_rx_unit_handle_t rx_u { ESP_RETURN_ON_FALSE(rx_unit, ESP_ERR_INVALID_ARG, TAG, "invalid param"); - uint32_t desc_num =max_recv_size / DMA_DESCRIPTOR_BUFFER_MAX_SIZE_4B_ALIGNED + 1; + uint32_t desc_num = max_recv_size / DMA_DESCRIPTOR_BUFFER_MAX_SIZE_4B_ALIGNED + 1; /* set at least 2 descriptors */ if (desc_num < 2) { desc_num = 4; @@ -439,25 +446,43 @@ static esp_err_t s_parlio_rx_unit_init_dma(parlio_rx_unit_handle_t rx_unit) static esp_err_t s_parlio_select_periph_clock(parlio_rx_unit_handle_t rx_unit, const parlio_rx_unit_config_t *config) { - parlio_hal_context_t *hal = &rx_unit->group->hal; + parlio_hal_context_t *hal = &rx_unit->base.group->hal; parlio_clock_source_t clk_src = config->clk_src; - uint32_t periph_src_clk_hz = 0; - uint32_t div = 1; + uint32_t src_freq_hz = 0; + uint32_t exp_freq_hz = 0; + hal_utils_clk_div_t clk_div = { + .integer = 1, + }; /* if the source clock is input from the GPIO, then we're in the slave mode */ if (clk_src != PARLIO_CLK_SRC_EXTERNAL) { - ESP_RETURN_ON_FALSE(config->clk_freq_hz, ESP_ERR_INVALID_ARG, TAG, "clock frequency not set"); + ESP_RETURN_ON_FALSE(config->exp_clk_freq_hz, ESP_ERR_INVALID_ARG, TAG, "output clock frequency not set"); + exp_freq_hz = config->exp_clk_freq_hz; /* get the internal clock source frequency */ - esp_clk_tree_src_get_freq_hz(clk_src, ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED, &periph_src_clk_hz); - /* set clock division, round up */ - div = (periph_src_clk_hz + config->clk_freq_hz - 1) / config->clk_freq_hz; + esp_clk_tree_src_get_freq_hz(clk_src, ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED, &src_freq_hz); } else { - periph_src_clk_hz = config->clk_freq_hz; + ESP_RETURN_ON_FALSE(config->ext_clk_freq_hz, ESP_ERR_INVALID_ARG, TAG, "input clock frequency not set"); + exp_freq_hz = config->exp_clk_freq_hz > 0 ? config->exp_clk_freq_hz : config->ext_clk_freq_hz; + src_freq_hz = config->ext_clk_freq_hz; } + /* set clock division, round up */ + hal_utils_clk_info_t clk_info = { + .src_freq_hz = src_freq_hz, + .exp_freq_hz = exp_freq_hz, + .max_integ = PARLIO_LL_RX_MAX_CLK_INT_DIV, + .min_integ = 1, + .round_opt = HAL_DIV_ROUND, + }; +#if PARLIO_LL_RX_MAX_CLK_FRACT_DIV + clk_info.max_fract = PARLIO_LL_RX_MAX_CLK_FRACT_DIV; + rx_unit->cfg.exp_clk_freq_hz = hal_utils_calc_clk_div_frac_accurate(&clk_info, &clk_div); +#else + rx_unit->cfg.exp_clk_freq_hz = hal_utils_calc_clk_div_integer(&clk_info, &clk_div.integer); +#endif #if CONFIG_PM_ENABLE if (clk_src != PARLIO_CLK_SRC_EXTERNAL) { /* XTAL and PLL clock source will be turned off in light sleep, so we need to create a NO_LIGHT_SLEEP lock */ - sprintf(rx_unit->pm_lock_name, "parlio_rx_%d_%d", rx_unit->group->group_id, rx_unit->unit_id); // e.g. parlio_rx_0_0 + sprintf(rx_unit->pm_lock_name, "parlio_rx_%d_%d", rx_unit->base.group->group_id, rx_unit->base.unit_id); // e.g. parlio_rx_0_0 esp_err_t ret = esp_pm_lock_create(ESP_PM_NO_LIGHT_SLEEP, 0, rx_unit->pm_lock_name, &rx_unit->pm_lock); ESP_RETURN_ON_ERROR(ret, TAG, "create NO_LIGHT_SLEEP lock failed"); } @@ -465,14 +490,13 @@ static esp_err_t s_parlio_select_periph_clock(parlio_rx_unit_handle_t rx_unit, c /* Set clock configuration */ parlio_ll_rx_set_clock_source(hal->regs, clk_src); - parlio_ll_rx_set_clock_div(hal->regs, div); + parlio_ll_rx_set_clock_div(hal->regs, &clk_div); rx_unit->clk_src = clk_src; - rx_unit->cfg.clk_freq_hz = periph_src_clk_hz / div; /* warning if precision lost due to division */ if ((clk_src != PARLIO_CLK_SRC_EXTERNAL) && - (config->clk_freq_hz != rx_unit->cfg.clk_freq_hz )) { - ESP_LOGW(TAG, "precision loss, real output frequency: %"PRIu32, rx_unit->cfg.clk_freq_hz ); + (config->exp_clk_freq_hz != rx_unit->cfg.exp_clk_freq_hz )) { + ESP_LOGW(TAG, "precision loss, real output frequency: %"PRIu32, rx_unit->cfg.exp_clk_freq_hz ); } return ESP_OK; @@ -510,7 +534,7 @@ static esp_err_t s_parlio_destroy_rx_unit(parlio_rx_unit_handle_t rx_unit) free(rx_unit->dma_buf); } /* Unregister the RX unit from the PARLIO group */ - if (rx_unit->group) { + if (rx_unit->base.group) { parlio_unregister_unit_from_group((parlio_unit_base_handle_t)rx_unit); } /* Free the RX unit */ @@ -527,6 +551,8 @@ esp_err_t parlio_new_rx_unit(const parlio_rx_unit_config_t *config, parlio_rx_un /* Check the data width to be the the power of 2 */ ESP_RETURN_ON_FALSE(__builtin_popcount(config->data_width) == 1, ESP_ERR_INVALID_ARG, TAG, "data line number should be the power of 2 without counting valid signal"); + ESP_RETURN_ON_FALSE(config->data_width <= (int)PARLIO_RX_UNIT_MAX_DATA_WIDTH, ESP_ERR_INVALID_ARG, TAG, + "data line number should be within %d", (int)PARLIO_RX_UNIT_MAX_DATA_WIDTH); esp_err_t ret = ESP_OK; parlio_rx_unit_handle_t unit = NULL; @@ -534,11 +560,12 @@ esp_err_t parlio_new_rx_unit(const parlio_rx_unit_config_t *config, parlio_rx_un /* Allocate unit memory */ unit = heap_caps_calloc(1, sizeof(parlio_rx_unit_t), PARLIO_MEM_ALLOC_CAPS); ESP_GOTO_ON_FALSE(unit, ESP_ERR_NO_MEM, err, TAG, "no memory for rx unit"); - unit->dir = PARLIO_DIR_RX; + unit->base.dir = PARLIO_DIR_RX; unit->is_enabled = false; /* Initialize mutex lock */ unit->mutex = xSemaphoreCreateMutexWithCaps(PARLIO_MEM_ALLOC_CAPS); + ESP_GOTO_ON_FALSE(unit->mutex, ESP_ERR_NO_MEM, err, TAG, "no memory for mutex semaphore"); /* Create transaction binary semaphore */ unit->trans_sem = xSemaphoreCreateBinaryWithCaps(PARLIO_MEM_ALLOC_CAPS); ESP_GOTO_ON_FALSE(unit->trans_sem, ESP_ERR_NO_MEM, err, TAG, "no memory for transaction semaphore"); @@ -559,7 +586,7 @@ esp_err_t parlio_new_rx_unit(const parlio_rx_unit_config_t *config, parlio_rx_un unit->cfg.flags.free_clk = 1; } - parlio_group_t *group = unit->group; + parlio_group_t *group = unit->base.group; parlio_hal_context_t *hal = &group->hal; /* Initialize GPIO */ ESP_GOTO_ON_ERROR(s_parlio_rx_unit_set_gpio(unit, config), err, TAG, "failed to set GPIO"); @@ -576,13 +603,17 @@ esp_err_t parlio_new_rx_unit(const parlio_rx_unit_config_t *config, parlio_rx_un parlio_ll_rx_set_bus_width(hal->regs, config->data_width); #if SOC_PARLIO_RX_CLK_SUPPORT_GATING parlio_ll_rx_enable_clock_gating(hal->regs, config->flags.clk_gate_en); +#else + if (config->flags.clk_gate_en) { + ESP_LOGW(TAG, "The current target does not support clock gating"); + } #endif // SOC_PARLIO_RX_CLK_SUPPORT_GATING /* return RX unit handle */ *ret_unit = unit; ESP_LOGD(TAG, "new rx unit(%d,%d) at %p, trans_queue_depth=%zu", - group->group_id, unit->unit_id, (void *)unit, unit->cfg.trans_queue_depth); + group->group_id, unit->base.unit_id, (void *)unit, unit->cfg.trans_queue_depth); return ESP_OK; err: @@ -595,21 +626,24 @@ err: esp_err_t parlio_del_rx_unit(parlio_rx_unit_handle_t rx_unit) { ESP_RETURN_ON_FALSE(rx_unit, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + // Not necessary to take the semaphore while checking the flag because it's going to be deleted ESP_RETURN_ON_FALSE(!rx_unit->is_enabled, ESP_ERR_INVALID_STATE, TAG, "the unit has not disabled"); - ESP_LOGD(TAG, "del rx unit (%d, %d)", rx_unit->group->group_id, rx_unit->unit_id); + ESP_LOGD(TAG, "del rx unit (%d, %d)", rx_unit->base.group->group_id, rx_unit->base.unit_id); return s_parlio_destroy_rx_unit(rx_unit); } esp_err_t parlio_rx_unit_enable(parlio_rx_unit_handle_t rx_unit, bool reset_queue) { ESP_RETURN_ON_FALSE(rx_unit, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); - ESP_RETURN_ON_FALSE(!rx_unit->is_enabled, ESP_ERR_INVALID_STATE, TAG, "the unit has enabled or running"); - rx_unit->is_enabled = true; - parlio_hal_context_t *hal = &rx_unit->group->hal; + esp_err_t ret = ESP_OK; + parlio_hal_context_t *hal = &rx_unit->base.group->hal; xSemaphoreTake(rx_unit->mutex, portMAX_DELAY); + ESP_GOTO_ON_FALSE(!rx_unit->is_enabled, ESP_ERR_INVALID_STATE, err, TAG, "the unit has enabled or running"); + rx_unit->is_enabled = true; + /* Acquire the power management lock incase */ if (rx_unit->pm_lock) { esp_pm_lock_acquire(rx_unit->pm_lock); @@ -623,43 +657,50 @@ esp_err_t parlio_rx_unit_enable(parlio_rx_unit_handle_t rx_unit, bool reset_queu } /* Check if we need to start a pending transaction */ - parlio_rx_transaction_t trans; + parlio_rx_transaction_t trans = {}; if (reset_queue) { xQueueReset(rx_unit->trans_que); xSemaphoreGive(rx_unit->trans_sem); } else if (xQueueReceive(rx_unit->trans_que, &trans, 0) == pdTRUE) { - xSemaphoreTake(rx_unit->trans_sem, 0); + // The semaphore always supposed to be taken successfully + assert(xSemaphoreTake(rx_unit->trans_sem, 0) == pdTRUE); if (rx_unit->cfg.flags.free_clk) { parlio_ll_rx_enable_clock(hal->regs, false); } s_parlio_set_delimiter_config(rx_unit, trans.delimiter); - s_parlio_mount_transaction_buffer(rx_unit, &rx_unit->curr_trans); + s_parlio_mount_transaction_buffer(rx_unit, &trans); gdma_start(rx_unit->dma_chan, (intptr_t)rx_unit->curr_desc); if (rx_unit->cfg.flags.free_clk) { parlio_ll_rx_start(hal->regs, true); parlio_ll_rx_enable_clock(hal->regs, true); } } +err: xSemaphoreGive(rx_unit->mutex); - return ESP_OK; + return ret; } esp_err_t parlio_rx_unit_disable(parlio_rx_unit_handle_t rx_unit) { ESP_RETURN_ON_FALSE(rx_unit, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); - ESP_RETURN_ON_FALSE(rx_unit->is_enabled, ESP_ERR_INVALID_STATE, TAG, "the unit has disabled"); - rx_unit->is_enabled = false; - /* stop the RX engine */ - parlio_hal_context_t *hal = &rx_unit->group->hal; + esp_err_t ret = ESP_OK; + parlio_hal_context_t *hal = &rx_unit->base.group->hal; + xSemaphoreTake(rx_unit->mutex, portMAX_DELAY); + ESP_GOTO_ON_FALSE(rx_unit->is_enabled, ESP_ERR_INVALID_STATE, err, TAG, "the unit has disabled"); + rx_unit->is_enabled = false; + /* stop the RX engine */ gdma_stop(rx_unit->dma_chan); parlio_ll_rx_enable_clock(hal->regs, false); parlio_ll_rx_start(hal->regs, false); if (rx_unit->curr_trans.delimiter) { + portENTER_CRITICAL(&s_rx_spinlock); rx_unit->curr_trans.delimiter->under_using = false; + portEXIT_CRITICAL(&s_rx_spinlock); } + xSemaphoreGive(rx_unit->trans_sem); /* For continuous receiving, free the temporary buffer and stop the DMA */ if (rx_unit->dma_buf) { @@ -672,9 +713,10 @@ esp_err_t parlio_rx_unit_disable(parlio_rx_unit_handle_t rx_unit) } /* Erase the current transaction */ memset(&rx_unit->curr_trans, 0, sizeof(parlio_rx_transaction_t)); +err: xSemaphoreGive(rx_unit->mutex); - return ESP_OK; + return ret; } esp_err_t parlio_new_rx_level_delimiter(const parlio_rx_level_delimiter_config_t *config, @@ -698,7 +740,7 @@ esp_err_t parlio_new_rx_level_delimiter(const parlio_rx_level_delimiter_config_t delimiter->bit_pack_order = config->bit_pack_order; delimiter->eof_data_len = config->eof_data_len; delimiter->timeout_ticks = config->timeout_ticks; - delimiter->flags.active_level = config->flags.active_level; + delimiter->flags.active_low_en = config->flags.active_low_en; *ret_delimiter = delimiter; @@ -773,13 +815,16 @@ esp_err_t parlio_rx_soft_delimiter_start_stop(parlio_rx_unit_handle_t rx_unit, p { ESP_RETURN_ON_FALSE(rx_unit && delimiter, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); ESP_RETURN_ON_FALSE(delimiter->mode == PARLIO_RX_SOFT_MODE, ESP_ERR_INVALID_ARG, TAG, "The delimiter is not soft delimiter"); - ESP_RETURN_ON_FALSE(rx_unit->is_enabled, ESP_ERR_INVALID_STATE, TAG, "the unit has not enabled"); + + esp_err_t ret = ESP_OK; xSemaphoreTake(rx_unit->mutex, portMAX_DELAY); - parlio_hal_context_t *hal = &(rx_unit->group->hal); + ESP_GOTO_ON_FALSE(rx_unit->is_enabled, ESP_ERR_INVALID_STATE, err, TAG, "the unit has not enabled"); + parlio_hal_context_t *hal = &(rx_unit->base.group->hal); parlio_ll_rx_start_soft_recv(hal->regs, start_stop); +err: xSemaphoreGive(rx_unit->mutex); - return ESP_OK; + return ret; } esp_err_t parlio_del_rx_delimiter(parlio_rx_delimiter_handle_t delimiter) @@ -792,20 +837,25 @@ esp_err_t parlio_del_rx_delimiter(parlio_rx_delimiter_handle_t delimiter) static esp_err_t s_parlio_rx_unit_do_transaction(parlio_rx_unit_handle_t rx_unit, parlio_rx_transaction_t *trans) { - if (!rx_unit->curr_trans.delimiter) { - xSemaphoreTake(rx_unit->trans_sem, 0); + bool is_stopped = false; + /* Get whether DMA stopped atomically */ + portENTER_CRITICAL_ISR(&s_rx_spinlock); + is_stopped = rx_unit->curr_trans.delimiter == NULL; + portEXIT_CRITICAL_ISR(&s_rx_spinlock); + if (is_stopped) { if (rx_unit->cfg.flags.free_clk) { - parlio_ll_rx_enable_clock(rx_unit->group->hal.regs, false); + parlio_ll_rx_enable_clock(rx_unit->base.group->hal.regs, false); } if (trans->delimiter != rx_unit->curr_trans.delimiter) { s_parlio_set_delimiter_config(rx_unit, trans->delimiter); } s_parlio_mount_transaction_buffer(rx_unit, trans); + // Take semaphore without block time here, only indicate there are transactions on receiving + xSemaphoreTake(rx_unit->trans_sem, 0); gdma_start(rx_unit->dma_chan, (intptr_t)rx_unit->curr_desc); if (rx_unit->cfg.flags.free_clk) { - printf("enable start\n"); - parlio_ll_rx_start(rx_unit->group->hal.regs, true); - parlio_ll_rx_enable_clock(rx_unit->group->hal.regs, true); + parlio_ll_rx_start(rx_unit->base.group->hal.regs, true); + parlio_ll_rx_enable_clock(rx_unit->base.group->hal.regs, true); } } else { // Otherwise send to the queue /* Send the transaction to the queue */ @@ -837,14 +887,15 @@ esp_err_t parlio_rx_unit_receive(parlio_rx_unit_handle_t rx_unit, ESP_RETURN_ON_FALSE(recv_cfg->delimiter->valid_sig_line_id >= rx_unit->cfg.data_width, ESP_ERR_INVALID_ARG, TAG, "the valid_sig_line_id of this delimiter is conflict with rx unit data width"); /* Assign the signal here to ensure iram safe */ - recv_cfg->delimiter->valid_sig = parlio_periph_signals.groups[rx_unit->group->group_id]. - rx_units[rx_unit->unit_id]. + recv_cfg->delimiter->valid_sig = parlio_periph_signals.groups[rx_unit->base.group->group_id]. + rx_units[rx_unit->base.unit_id]. data_sigs[recv_cfg->delimiter->valid_sig_line_id]; } void *p_buffer = payload; /* Create the internal DMA buffer for the infinite transaction if indirect_mount is set */ - if (recv_cfg->flags.is_infinite && recv_cfg->flags.indirect_mount) { + if (recv_cfg->flags.partial_rx_en && recv_cfg->flags.indirect_mount) { + ESP_RETURN_ON_FALSE(!rx_unit->dma_buf, ESP_ERR_INVALID_STATE, TAG, "infinite transaction is using the internal DMA buffer"); /* Allocate the internal DMA buffer to store the data temporary */ rx_unit->dma_buf = heap_caps_calloc(1, payload_size, MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA); ESP_RETURN_ON_FALSE(rx_unit->dma_buf, ESP_ERR_NO_MEM, TAG, "No memory for the internal DMA buffer"); @@ -858,7 +909,7 @@ esp_err_t parlio_rx_unit_receive(parlio_rx_unit_handle_t rx_unit, .payload = p_buffer, .size = payload_size, .recv_bytes = 0, - .flags.infinite = recv_cfg->flags.is_infinite, + .flags.infinite = recv_cfg->flags.partial_rx_en, .flags.indirect_mount = recv_cfg->flags.indirect_mount, }; rx_unit->usr_recv_buf = payload; @@ -873,29 +924,38 @@ esp_err_t parlio_rx_unit_wait_all_done(parlio_rx_unit_handle_t rx_unit, int time { ESP_RETURN_ON_FALSE(rx_unit, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); - xSemaphoreTake(rx_unit->mutex, portMAX_DELAY); TickType_t ticks = timeout_ms < 0 ? portMAX_DELAY : pdMS_TO_TICKS(timeout_ms); - /* Waiting for the all transaction done signal */ - if (xSemaphoreTake(rx_unit->trans_sem, ticks) == pdFALSE) { - xSemaphoreGive(rx_unit->mutex); - return ESP_ERR_TIMEOUT; - } + /* Waiting for the all transactions done */ + ESP_RETURN_ON_FALSE(xSemaphoreTake(rx_unit->trans_sem, ticks) == pdTRUE, ESP_ERR_TIMEOUT, TAG, "wait all transactions done timeout"); /* Put back the signal */ xSemaphoreGive(rx_unit->trans_sem); - xSemaphoreGive(rx_unit->mutex); return ESP_OK; } esp_err_t parlio_rx_unit_register_event_callbacks(parlio_rx_unit_handle_t rx_unit, const parlio_rx_event_callbacks_t *cbs, void *user_data) { - ESP_RETURN_ON_FALSE(rx_unit, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); - ESP_RETURN_ON_FALSE(!rx_unit->is_enabled, ESP_ERR_INVALID_STATE, TAG, "the unit has enabled or running"); + esp_err_t ret = ESP_OK; + ESP_RETURN_ON_FALSE(rx_unit, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + ESP_RETURN_ON_FALSE(cbs, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + +#if CONFIG_PARLIO_ISR_IRAM_SAFE + ESP_RETURN_ON_FALSE(!cbs->on_partial_receive || esp_ptr_in_iram(cbs->on_partial_receive), ESP_ERR_INVALID_ARG, + TAG, "on_partial_receive not in IRAM"); + ESP_RETURN_ON_FALSE(!cbs->on_receive_done || esp_ptr_in_iram(cbs->on_receive_done), ESP_ERR_INVALID_ARG, + TAG, "on_receive_done not in IRAM"); + ESP_RETURN_ON_FALSE(!cbs->on_timeout || esp_ptr_in_iram(cbs->on_timeout), ESP_ERR_INVALID_ARG, + TAG, "on_timeout not in IRAM"); + ESP_RETURN_ON_FALSE(!user_data || esp_ptr_internal(user_data), ESP_ERR_INVALID_ARG, + TAG, "user_data not in internal RAM"); +#endif xSemaphoreTake(rx_unit->mutex, portMAX_DELAY); + ESP_GOTO_ON_FALSE(!rx_unit->is_enabled, ESP_ERR_INVALID_STATE, err, TAG, "the unit has enabled or running"); + memcpy(&rx_unit->cbs, cbs, sizeof(parlio_rx_event_callbacks_t)); rx_unit->user_data = user_data; +err: xSemaphoreGive(rx_unit->mutex); - - return ESP_OK; + return ret; } diff --git a/components/driver/parlio/parlio_tx.c b/components/driver/parlio/parlio_tx.c index 5a4f806d66..f96b9f507a 100644 --- a/components/driver/parlio/parlio_tx.c +++ b/components/driver/parlio/parlio_tx.c @@ -45,9 +45,7 @@ typedef struct { } parlio_tx_trans_desc_t; typedef struct parlio_tx_unit_t { - int unit_id; // unit id - parlio_dir_t dir; - parlio_group_t *group; // group handle + struct parlio_unit_t base; // base unit size_t data_width; // data width intr_handle_t intr; // allocated interrupt handle esp_pm_lock_handle_t pm_lock; // power management lock @@ -120,9 +118,9 @@ static esp_err_t parlio_destroy_tx_unit(parlio_tx_unit_t *tx_unit) vQueueDeleteWithCaps(tx_unit->trans_queues[i]); } } - if (tx_unit->group) { + if (tx_unit->base.group) { // de-register from group - parlio_unregister_unit_from_group((parlio_unit_base_handle_t)tx_unit); + parlio_unregister_unit_from_group((parlio_unit_base_handle_t)&(tx_unit->base)); } free(tx_unit->dma_nodes); free(tx_unit); @@ -131,8 +129,8 @@ static esp_err_t parlio_destroy_tx_unit(parlio_tx_unit_t *tx_unit) static esp_err_t parlio_tx_unit_configure_gpio(parlio_tx_unit_t *tx_unit, const parlio_tx_unit_config_t *config) { - int group_id = tx_unit->group->group_id; - int unit_id = tx_unit->unit_id; + int group_id = tx_unit->base.group->group_id; + int unit_id = tx_unit->base.unit_id; gpio_config_t gpio_conf = { .intr_type = GPIO_INTR_DISABLE, .mode = config->flags.io_loop_back ? GPIO_MODE_INPUT_OUTPUT : GPIO_MODE_OUTPUT, @@ -195,7 +193,7 @@ static esp_err_t parlio_tx_unit_init_dma(parlio_tx_unit_t *tx_unit) static esp_err_t parlio_select_periph_clock(parlio_tx_unit_t *tx_unit, const parlio_tx_unit_config_t *config) { - parlio_hal_context_t *hal = &tx_unit->group->hal; + parlio_hal_context_t *hal = &tx_unit->base.group->hal; parlio_clock_source_t clk_src = config->clk_in_gpio_num >= 0 ? PARLIO_CLK_SRC_EXTERNAL : config->clk_src; uint32_t periph_src_clk_hz = 0; // if the source clock is input from the GPIO, then we're in the slave mode @@ -210,7 +208,7 @@ static esp_err_t parlio_select_periph_clock(parlio_tx_unit_t *tx_unit, const par #if CONFIG_PM_ENABLE if (clk_src != PARLIO_CLK_SRC_EXTERNAL) { // XTAL and PLL clock source will be turned off in light sleep, so we need to create a NO_LIGHT_SLEEP lock - sprintf(tx_unit->pm_lock_name, "parlio_tx_%d_%d", tx_unit->group->group_id, tx_unit->unit_id); // e.g. parlio_tx_0_0 + sprintf(tx_unit->pm_lock_name, "parlio_tx_%d_%d", tx_unit->base.group->group_id, tx_unit->base.unit_id); // e.g. parlio_tx_0_0 esp_err_t ret = esp_pm_lock_create(ESP_PM_NO_LIGHT_SLEEP, 0, tx_unit->pm_lock_name, &tx_unit->pm_lock); ESP_RETURN_ON_ERROR(ret, TAG, "create NO_LIGHT_SLEEP lock failed"); } @@ -280,14 +278,14 @@ esp_err_t parlio_new_tx_unit(const parlio_tx_unit_config_t *config, parlio_tx_un unit->dma_nodes[i].next = (i == dma_nodes_num - 1) ? NULL : &(unit->dma_nodes[i+1]); } unit->max_transfer_bits = config->max_transfer_size * 8; - unit->dir = PARLIO_DIR_TX; + unit->base.dir = PARLIO_DIR_TX; unit->data_width = data_width; //create transaction queue ESP_GOTO_ON_ERROR(parlio_tx_create_trans_queue(unit, config), err, TAG, "create transaction queue failed"); // register the unit to a group - ESP_GOTO_ON_ERROR(parlio_register_unit_to_group((parlio_unit_base_handle_t)unit), err, TAG, "register unit to group failed"); - parlio_group_t *group = unit->group; + ESP_GOTO_ON_ERROR(parlio_register_unit_to_group((parlio_unit_base_handle_t)&(unit->base)), err, TAG, "register unit to group failed"); + parlio_group_t *group = unit->base.group; parlio_hal_context_t *hal = &group->hal; // select the clock source ESP_GOTO_ON_ERROR(parlio_select_periph_clock(unit, config), err, TAG, "set clock source failed"); @@ -346,7 +344,7 @@ esp_err_t parlio_new_tx_unit(const parlio_tx_unit_config_t *config, parlio_tx_un // return TX unit handle *ret_unit = unit; ESP_LOGD(TAG, "new tx unit(%d,%d) at %p, out clk=%"PRIu32"Hz, queue_depth=%zu, idle_mask=%"PRIx32, - group->group_id, unit->unit_id, unit, unit->out_clk_freq_hz, unit->queue_depth, unit->idle_value_mask); + group->group_id, unit->base.unit_id, unit, unit->out_clk_freq_hz, unit->queue_depth, unit->idle_value_mask); return ESP_OK; err: @@ -360,7 +358,7 @@ esp_err_t parlio_del_tx_unit(parlio_tx_unit_handle_t unit) { ESP_RETURN_ON_FALSE(unit, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); ESP_RETURN_ON_FALSE(atomic_load(&unit->fsm) == PARLIO_TX_FSM_INIT, ESP_ERR_INVALID_STATE, TAG, "unit not in init state"); - ESP_LOGD(TAG, "del tx unit(%d,%d)", unit->group->group_id, unit->unit_id); + ESP_LOGD(TAG, "del tx unit(%d,%d)", unit->base.group->group_id, unit->base.unit_id); return parlio_destroy_tx_unit(unit); } @@ -425,7 +423,7 @@ esp_err_t parlio_tx_unit_register_event_callbacks(parlio_tx_unit_handle_t tx_uni static void IRAM_ATTR parlio_tx_do_transaction(parlio_tx_unit_t *tx_unit, parlio_tx_trans_desc_t *t) { - parlio_hal_context_t *hal = &tx_unit->group->hal; + parlio_hal_context_t *hal = &tx_unit->base.group->hal; tx_unit->cur_trans = t; @@ -458,7 +456,7 @@ esp_err_t parlio_tx_unit_enable(parlio_tx_unit_handle_t tx_unit) if (tx_unit->pm_lock) { esp_pm_lock_acquire(tx_unit->pm_lock); } - parlio_hal_context_t *hal = &tx_unit->group->hal; + parlio_hal_context_t *hal = &tx_unit->base.group->hal; parlio_ll_enable_interrupt(hal->regs, PARLIO_LL_EVENT_TX_EOF, true); atomic_store(&tx_unit->fsm, PARLIO_TX_FSM_ENABLE); } else { @@ -506,7 +504,7 @@ esp_err_t parlio_tx_unit_disable(parlio_tx_unit_handle_t tx_unit) ESP_RETURN_ON_FALSE(valid_state, ESP_ERR_INVALID_STATE, TAG, "unit can't be disabled in state %d", expected_fsm); // stop the TX engine - parlio_hal_context_t *hal = &tx_unit->group->hal; + parlio_hal_context_t *hal = &tx_unit->base.group->hal; gdma_stop(tx_unit->dma_chan); parlio_ll_tx_start(hal->regs, false); parlio_ll_enable_interrupt(hal->regs, PARLIO_LL_EVENT_TX_EOF, false); @@ -569,7 +567,7 @@ esp_err_t parlio_tx_unit_transmit(parlio_tx_unit_handle_t tx_unit, const void *p static void IRAM_ATTR parlio_tx_default_isr(void *args) { parlio_tx_unit_t *tx_unit = (parlio_tx_unit_t *)args; - parlio_group_t *group = tx_unit->group; + parlio_group_t *group = tx_unit->base.group; parlio_hal_context_t *hal = &group->hal; BaseType_t high_task_woken = pdFALSE; bool need_yield = false; diff --git a/components/driver/test_apps/parlio/main/CMakeLists.txt b/components/driver/test_apps/parlio/main/CMakeLists.txt index de6a0905fa..7fc221c2fe 100644 --- a/components/driver/test_apps/parlio/main/CMakeLists.txt +++ b/components/driver/test_apps/parlio/main/CMakeLists.txt @@ -10,5 +10,5 @@ endif() # In order for the cases defined by `TEST_CASE` to be linked into the final elf, # the component can be registered as WHOLE_ARCHIVE idf_component_register(SRCS ${srcs} - PRIV_REQUIRES unity driver soc + PRIV_REQUIRES unity driver WHOLE_ARCHIVE) diff --git a/components/driver/test_apps/parlio/main/test_parlio_rx.c b/components/driver/test_apps/parlio/main/test_parlio_rx.c index 65b9b3da91..900895ac9c 100644 --- a/components/driver/test_apps/parlio/main/test_parlio_rx.c +++ b/components/driver/test_apps/parlio/main/test_parlio_rx.c @@ -32,8 +32,10 @@ .max_recv_size = 10 * 1024, \ .data_width = 1, \ .clk_src = _clk_src, \ - .clk_freq_hz = _clk_freq, \ - .clk_gpio_num = _clk_src == PARLIO_CLK_SRC_EXTERNAL ? TEST_CLK_GPIO : -1, \ + .ext_clk_freq_hz = _clk_src == PARLIO_CLK_SRC_EXTERNAL ? _clk_freq : 0, \ + .clk_in_gpio_num = _clk_src == PARLIO_CLK_SRC_EXTERNAL ? TEST_CLK_GPIO : -1, \ + .exp_clk_freq_hz = _clk_freq, \ + .clk_out_gpio_num = -1, \ .valid_gpio_num = TEST_VALID_GPIO, \ .data_gpio_nums = { \ [0] = TEST_DATA0_GPIO, \ @@ -48,52 +50,6 @@ #define TEST_TASK_DATA_READY_BIT 0x01 #define TEST_TASK_FINISHED_BIT 0x02 -TEST_CASE("parallel_rx_unit_install_uninstall", "[parlio_rx]") -{ - printf("install rx units exhaustively\r\n"); - parlio_rx_unit_handle_t units[SOC_PARLIO_GROUPS * SOC_PARLIO_RX_UNITS_PER_GROUP]; - int k = 0; - parlio_rx_unit_config_t config = TEST_DEFAULT_UNIT_CONFIG(PARLIO_CLK_SRC_DEFAULT, 1000000); - for (int i = 0; i < SOC_PARLIO_GROUPS; i++) { - for (int j = 0; j < SOC_PARLIO_RX_UNITS_PER_GROUP; j++) { - TEST_ESP_OK(parlio_new_rx_unit(&config, &units[k++])); - } - } - TEST_ESP_ERR(ESP_ERR_NOT_FOUND, parlio_new_rx_unit(&config, &units[0])); - - for (int i = 0; i < k; i++) { - TEST_ESP_OK(parlio_del_rx_unit(units[i])); - } - - // clock from external - config.clk_src = PARLIO_CLK_SRC_EXTERNAL; - // clock gpio must be set when the clock is input from external - TEST_ESP_ERR(ESP_ERR_INVALID_ARG, parlio_new_rx_unit(&config, &units[0])); - - // clock from internal - config.clk_src = PARLIO_CLK_SRC_DEFAULT; - config.clk_gpio_num = TEST_CLK_GPIO; -#if SOC_PARLIO_RX_CLK_SUPPORT_OUTPUT - TEST_ESP_OK(parlio_new_rx_unit(&config, &units[0])); - TEST_ESP_OK(parlio_del_rx_unit(units[0])); -#else - // failed because of not support output the clock to a gpio - TEST_ESP_ERR(ESP_ERR_NOT_SUPPORTED, parlio_new_rx_unit(&config, &units[0])); - config.clk_gpio_num = -1; -#endif - config.data_width = 3; - // data width should be power of 2 - TEST_ESP_ERR(ESP_ERR_INVALID_ARG, parlio_new_rx_unit(&config, &units[0])); - - config.data_width = 4; - TEST_ESP_OK(parlio_new_rx_unit(&config, &units[0])); - TEST_ESP_OK(parlio_rx_unit_enable(units[0], true)); - // delete unit before it's disabled is not allowed - TEST_ESP_ERR(ESP_ERR_INVALID_STATE, parlio_del_rx_unit(units[0])); - TEST_ESP_OK(parlio_rx_unit_disable(units[0])); - TEST_ESP_OK(parlio_del_rx_unit(units[0])); -} - typedef struct { uint32_t partial_recv_cnt; uint32_t recv_done_cnt; @@ -124,107 +80,6 @@ static bool test_parlio_rx_timeout_callback(parlio_rx_unit_handle_t rx_unit, con return false; } -#define TEST_PAYLOAD_SIZE 5000 - -// This test case uses soft delimiter -TEST_CASE("parallel_rx_unit_receive_transaction_test", "[parlio_rx]") -{ - parlio_rx_unit_handle_t rx_unit = NULL; - parlio_rx_delimiter_handle_t deli = NULL; - parlio_rx_delimiter_handle_t timeout_deli = NULL; - - parlio_rx_unit_config_t config = TEST_DEFAULT_UNIT_CONFIG(PARLIO_CLK_SRC_DEFAULT, 1000000); - TEST_ESP_OK(parlio_new_rx_unit(&config, &rx_unit)); - - parlio_rx_soft_delimiter_config_t sft_deli_cfg = { - .sample_edge = PARLIO_SAMPLE_EDGE_POS, - .eof_data_len = TEST_PAYLOAD_SIZE, - .timeout_ticks = 0, - }; - TEST_ESP_OK(parlio_new_rx_delimiter(&sft_deli_cfg, &deli)); - parlio_rx_level_delimiter_config_t lvl_deli_cfg = { - .valid_sig_line_id = TEST_VALID_SIG, - .sample_edge = PARLIO_SAMPLE_EDGE_POS, - .bit_pack_order = PARLIO_BIT_PACK_ORDER_MSB, - .eof_data_len = TEST_PAYLOAD_SIZE, - .timeout_ticks = 5, - .flags = { - .active_level = 1, - }, - }; - TEST_ESP_OK(parlio_new_rx_delimiter(&lvl_deli_cfg, &timeout_deli)); - - parlio_rx_event_callbacks_t cbs = { - .on_partial_receive = test_parlio_rx_partial_recv_callback, - .on_receive_done = test_parlio_rx_done_callback, - .on_timeout = test_parlio_rx_timeout_callback, - }; - test_data_t test_data = { - .partial_recv_cnt = 0, - .recv_done_cnt = 0, - }; - TEST_ESP_OK(parlio_rx_unit_register_event_callbacks(rx_unit, &cbs, &test_data)); - TEST_ESP_OK(parlio_rx_unit_enable(rx_unit, true)); - - parlio_receive_config_t recv_config = { - .delimiter = deli, - .flags.is_infinite = false, - }; - uint8_t *payload = heap_caps_calloc(1, TEST_PAYLOAD_SIZE, TEST_PARLIO_MEM_ALLOC_CAPS); - TEST_ASSERT(payload); - - printf("Testing one normal transaction...\n"); - TEST_ESP_OK(parlio_rx_soft_delimiter_start_stop(rx_unit, deli, true)); - TEST_ESP_OK(parlio_rx_unit_receive(rx_unit, payload, TEST_PAYLOAD_SIZE, &recv_config)); - TEST_ESP_OK(parlio_rx_unit_wait_all_done(rx_unit, 5000)); - TEST_ESP_OK(parlio_rx_soft_delimiter_start_stop(rx_unit, deli, false)); - TEST_ASSERT_EQUAL_UINT32(2, test_data.partial_recv_cnt); - TEST_ASSERT_EQUAL_UINT32(1, test_data.recv_done_cnt); - memset(&test_data, 0, sizeof(test_data_t)); - - printf("Testing normal transactions in queue...\n"); - TEST_ESP_OK(parlio_rx_soft_delimiter_start_stop(rx_unit, deli, true)); - // push 5 repeated transactions to the queue - for (int i = 0; i < 5; i++) { - TEST_ESP_OK(parlio_rx_unit_receive(rx_unit, payload, TEST_PAYLOAD_SIZE, &recv_config)); - } - TEST_ESP_OK(parlio_rx_unit_wait_all_done(rx_unit, 5000)); - TEST_ESP_OK(parlio_rx_soft_delimiter_start_stop(rx_unit, deli, false)); - TEST_ASSERT_EQUAL_UINT32(10, test_data.partial_recv_cnt); - TEST_ASSERT_EQUAL_UINT32(5, test_data.recv_done_cnt); - memset(&test_data, 0, sizeof(test_data_t)); - - printf("Testing the infinite transaction...\n"); - recv_config.flags.is_infinite = true; - TEST_ESP_OK(parlio_rx_soft_delimiter_start_stop(rx_unit, deli, true)); - TEST_ESP_OK(parlio_rx_unit_receive(rx_unit, payload, TEST_PAYLOAD_SIZE, &recv_config)); - // Won't receive done semaphore in infinite transaction - TEST_ESP_ERR(ESP_ERR_TIMEOUT, parlio_rx_unit_wait_all_done(rx_unit, 500)); - TEST_ESP_OK(parlio_rx_soft_delimiter_start_stop(rx_unit, deli, false)); - TEST_ASSERT_GREATER_THAN(6, test_data.partial_recv_cnt); - TEST_ASSERT_GREATER_THAN(3, test_data.recv_done_cnt); - memset(&test_data, 0, sizeof(test_data_t)); - - // printf("Testing the timeout callback...\n"); - // recv_config.flags.is_infinite = false; - // recv_config.delimiter = timeout_deli; - // // push 5 repeated transactions to the queue - // for (int i = 0; i < 5; i++) { - // TEST_ESP_OK(parlio_rx_unit_receive(rx_unit, payload, TEST_PAYLOAD_SIZE, &recv_config)); - // gpio_set_level(TEST_VALID_GPIO, 1); - // vTaskDelay(pdMS_TO_TICKS(100)); - // gpio_set_level(TEST_VALID_GPIO, 0); - // vTaskDelay(pdMS_TO_TICKS(50)); - // } - // TEST_ASSERT_TRUE(test_data.timeout_cnt); - - TEST_ESP_OK(parlio_rx_unit_disable(rx_unit)); - TEST_ESP_OK(parlio_del_rx_delimiter(deli)); - TEST_ESP_OK(parlio_del_rx_delimiter(timeout_deli)); - TEST_ESP_OK(parlio_del_rx_unit(rx_unit)); - free(payload); -}; - static void connect_signal_internally(uint32_t gpio, uint32_t sigo, uint32_t sigi) { gpio_config_t gpio_conf = { @@ -407,15 +262,12 @@ static void level_delimiter_sender_task_spi(void *args) } } -static bool test_delimiter(parlio_rx_delimiter_handle_t deli, void (*sender_task_thread)(void *args)) +static bool test_delimiter(parlio_rx_delimiter_handle_t deli, bool free_running_clk, void (*sender_task_thread)(void *args)) { parlio_rx_unit_handle_t rx_unit = NULL; parlio_rx_unit_config_t config = TEST_DEFAULT_UNIT_CONFIG(PARLIO_CLK_SRC_EXTERNAL, 1000000); - if (sender_task_thread == pulse_delimiter_sender_task_i2s) { - // I2S offers free-running clock - config.flags.free_clk = 1; - } + config.flags.free_clk = free_running_clk; TEST_ESP_OK(parlio_new_rx_unit(&config, &rx_unit)); TEST_ESP_OK(parlio_rx_unit_enable(rx_unit, true)); @@ -431,7 +283,7 @@ static bool test_delimiter(parlio_rx_delimiter_handle_t deli, void (*sender_task parlio_receive_config_t recv_config = { .delimiter = deli, - .flags.is_infinite = false, + .flags.partial_rx_en = false, }; uint8_t recv_buff[TEST_EOF_DATA_LEN]; bool is_success = false; @@ -479,12 +331,12 @@ TEST_CASE("parallel_rx_unit_level_delimiter_test_via_spi", "[parlio_rx]") .eof_data_len = TEST_EOF_DATA_LEN, .timeout_ticks = 0, .flags = { - .active_level = 1, + .active_low_en = 0, }, }; parlio_rx_delimiter_handle_t deli = NULL; - TEST_ESP_OK(parlio_new_rx_delimiter(&lvl_deli_cfg, &deli)); - bool is_success = test_delimiter(deli, level_delimiter_sender_task_spi); + TEST_ESP_OK(parlio_new_rx_level_delimiter(&lvl_deli_cfg, &deli)); + bool is_success = test_delimiter(deli, false, level_delimiter_sender_task_spi); TEST_ESP_OK(parlio_del_rx_delimiter(deli)); TEST_ASSERT(is_success); } @@ -506,8 +358,200 @@ TEST_CASE("parallel_rx_unit_pulse_delimiter_test_via_i2s", "[parlio_rx]") }, }; parlio_rx_delimiter_handle_t deli = NULL; - TEST_ESP_OK(parlio_new_rx_delimiter(&pls_deli_cfg, &deli)); - bool is_success = test_delimiter(deli, pulse_delimiter_sender_task_i2s); + TEST_ESP_OK(parlio_new_rx_pulse_delimiter(&pls_deli_cfg, &deli)); + bool is_success = test_delimiter(deli, true, pulse_delimiter_sender_task_i2s); TEST_ESP_OK(parlio_del_rx_delimiter(deli)); TEST_ASSERT(is_success); } + +TEST_CASE("parallel_rx_unit_install_uninstall", "[parlio_rx]") +{ + printf("install rx units exhaustively\r\n"); + parlio_rx_unit_handle_t units[SOC_PARLIO_GROUPS * SOC_PARLIO_RX_UNITS_PER_GROUP]; + int k = 0; + parlio_rx_unit_config_t config = TEST_DEFAULT_UNIT_CONFIG(PARLIO_CLK_SRC_DEFAULT, 1000000); + for (int i = 0; i < SOC_PARLIO_GROUPS; i++) { + for (int j = 0; j < SOC_PARLIO_RX_UNITS_PER_GROUP; j++) { + TEST_ESP_OK(parlio_new_rx_unit(&config, &units[k++])); + } + } + TEST_ESP_ERR(ESP_ERR_NOT_FOUND, parlio_new_rx_unit(&config, &units[0])); + + for (int i = 0; i < k; i++) { + TEST_ESP_OK(parlio_del_rx_unit(units[i])); + } + + // clock from external + config.clk_src = PARLIO_CLK_SRC_EXTERNAL; + // clock gpio must be set when the clock is input from external + TEST_ESP_ERR(ESP_ERR_INVALID_ARG, parlio_new_rx_unit(&config, &units[0])); + + // clock from internal + config.clk_src = PARLIO_CLK_SRC_DEFAULT; + config.clk_out_gpio_num = TEST_CLK_GPIO; +#if SOC_PARLIO_RX_CLK_SUPPORT_OUTPUT + TEST_ESP_OK(parlio_new_rx_unit(&config, &units[0])); + TEST_ESP_OK(parlio_del_rx_unit(units[0])); +#else + // failed because of not support output the clock to a gpio + TEST_ESP_ERR(ESP_ERR_NOT_SUPPORTED, parlio_new_rx_unit(&config, &units[0])); + config.clk_out_gpio_num = -1; +#endif + config.data_width = 3; + // data width should be power of 2 + TEST_ESP_ERR(ESP_ERR_INVALID_ARG, parlio_new_rx_unit(&config, &units[0])); + + config.data_width = 4; + TEST_ESP_OK(parlio_new_rx_unit(&config, &units[0])); + TEST_ESP_OK(parlio_rx_unit_enable(units[0], true)); + // delete unit before it's disabled is not allowed + TEST_ESP_ERR(ESP_ERR_INVALID_STATE, parlio_del_rx_unit(units[0])); + TEST_ESP_OK(parlio_rx_unit_disable(units[0])); + TEST_ESP_OK(parlio_del_rx_unit(units[0])); +} + +#define TEST_PAYLOAD_SIZE 5000 + +// This test case uses soft delimiter +TEST_CASE("parallel_rx_unit_receive_transaction_test", "[parlio_rx]") +{ + parlio_rx_unit_handle_t rx_unit = NULL; + parlio_rx_delimiter_handle_t deli = NULL; + + parlio_rx_unit_config_t config = TEST_DEFAULT_UNIT_CONFIG(PARLIO_CLK_SRC_DEFAULT, 1000000); + config.flags.free_clk = 1; + TEST_ESP_OK(parlio_new_rx_unit(&config, &rx_unit)); + + parlio_rx_soft_delimiter_config_t sft_deli_cfg = { + .sample_edge = PARLIO_SAMPLE_EDGE_POS, + .eof_data_len = TEST_PAYLOAD_SIZE, + .timeout_ticks = 0, + }; + TEST_ESP_OK(parlio_new_rx_soft_delimiter(&sft_deli_cfg, &deli)); + + parlio_rx_event_callbacks_t cbs = { + .on_partial_receive = test_parlio_rx_partial_recv_callback, + .on_receive_done = test_parlio_rx_done_callback, + }; + test_data_t test_data = { + .partial_recv_cnt = 0, + .recv_done_cnt = 0, + }; + TEST_ESP_OK(parlio_rx_unit_register_event_callbacks(rx_unit, &cbs, &test_data)); + TEST_ESP_OK(parlio_rx_unit_enable(rx_unit, true)); + + parlio_receive_config_t recv_config = { + .delimiter = deli, + .flags.partial_rx_en = false, + }; + uint8_t *payload = heap_caps_calloc(1, TEST_PAYLOAD_SIZE, TEST_PARLIO_MEM_ALLOC_CAPS); + TEST_ASSERT(payload); + + printf("Testing one normal transaction...\n"); + TEST_ESP_OK(parlio_rx_soft_delimiter_start_stop(rx_unit, deli, true)); + TEST_ESP_OK(parlio_rx_unit_receive(rx_unit, payload, TEST_PAYLOAD_SIZE, &recv_config)); + TEST_ESP_OK(parlio_rx_unit_wait_all_done(rx_unit, 5000)); + TEST_ESP_OK(parlio_rx_soft_delimiter_start_stop(rx_unit, deli, false)); + TEST_ASSERT_EQUAL_UINT32(2, test_data.partial_recv_cnt); + TEST_ASSERT_EQUAL_UINT32(1, test_data.recv_done_cnt); + memset(&test_data, 0, sizeof(test_data_t)); + + printf("Testing normal transactions in queue...\n"); + TEST_ESP_OK(parlio_rx_soft_delimiter_start_stop(rx_unit, deli, true)); + // push 5 repeated transactions to the queue + for (int i = 0; i < 5; i++) { + TEST_ESP_OK(parlio_rx_unit_receive(rx_unit, payload, TEST_PAYLOAD_SIZE, &recv_config)); + } + TEST_ESP_OK(parlio_rx_unit_wait_all_done(rx_unit, 5000)); + TEST_ESP_OK(parlio_rx_soft_delimiter_start_stop(rx_unit, deli, false)); + TEST_ASSERT_EQUAL_UINT32(10, test_data.partial_recv_cnt); + TEST_ASSERT_EQUAL_UINT32(5, test_data.recv_done_cnt); + memset(&test_data, 0, sizeof(test_data_t)); + + printf("Testing resume transactions in queue after enabling...\n"); + TEST_ESP_OK(parlio_rx_soft_delimiter_start_stop(rx_unit, deli, true)); + // push 5 repeated transactions to the queue + for (int i = 0; i < 10; i++) { + TEST_ESP_OK(parlio_rx_unit_receive(rx_unit, payload, TEST_PAYLOAD_SIZE, &recv_config)); + } + TEST_ESP_OK(parlio_rx_unit_disable(rx_unit)); + memset(&test_data, 0, sizeof(test_data_t)); + TEST_ESP_OK(parlio_rx_unit_enable(rx_unit, false)); + TEST_ESP_OK(parlio_rx_unit_wait_all_done(rx_unit, 5000)); + TEST_ESP_OK(parlio_rx_soft_delimiter_start_stop(rx_unit, deli, false)); + TEST_ASSERT_GREATER_THAN(2, test_data.partial_recv_cnt); + TEST_ASSERT_GREATER_THAN(1, test_data.recv_done_cnt); + memset(&test_data, 0, sizeof(test_data_t)); + + printf("Testing the infinite transaction...\n"); + recv_config.flags.partial_rx_en = true; + TEST_ESP_OK(parlio_rx_soft_delimiter_start_stop(rx_unit, deli, true)); + TEST_ESP_OK(parlio_rx_unit_receive(rx_unit, payload, TEST_PAYLOAD_SIZE, &recv_config)); + // Won't receive done semaphore in infinite transaction + TEST_ESP_ERR(ESP_ERR_TIMEOUT, parlio_rx_unit_wait_all_done(rx_unit, 500)); + TEST_ESP_OK(parlio_rx_soft_delimiter_start_stop(rx_unit, deli, false)); + TEST_ASSERT_GREATER_THAN(6, test_data.partial_recv_cnt); + TEST_ASSERT_GREATER_THAN(3, test_data.recv_done_cnt); + memset(&test_data, 0, sizeof(test_data_t)); + + TEST_ESP_OK(parlio_rx_unit_disable(rx_unit)); + TEST_ESP_OK(parlio_del_rx_delimiter(deli)); + TEST_ESP_OK(parlio_del_rx_unit(rx_unit)); + free(payload); +}; + +TEST_CASE("parallel_rx_unit_receive_timeout_test", "[parlio_rx]") +{ + parlio_rx_unit_handle_t rx_unit = NULL; + parlio_rx_delimiter_handle_t timeout_deli = NULL; + + parlio_rx_unit_config_t config = TEST_DEFAULT_UNIT_CONFIG(PARLIO_CLK_SRC_DEFAULT, 1000000); + config.flags.free_clk = 1; + config.flags.clk_gate_en = 1; + TEST_ESP_OK(parlio_new_rx_unit(&config, &rx_unit)); + + parlio_rx_level_delimiter_config_t lvl_deli_cfg = { + .valid_sig_line_id = TEST_VALID_SIG, + .sample_edge = PARLIO_SAMPLE_EDGE_POS, + .bit_pack_order = PARLIO_BIT_PACK_ORDER_MSB, + .eof_data_len = TEST_PAYLOAD_SIZE, + .timeout_ticks = 400, + .flags = { + .active_low_en = 0, + }, + }; + TEST_ESP_OK(parlio_new_rx_level_delimiter(&lvl_deli_cfg, &timeout_deli)); + + parlio_rx_event_callbacks_t cbs = { + .on_timeout = test_parlio_rx_timeout_callback, + }; + test_data_t test_data = { + .timeout_cnt = 0, + }; + TEST_ESP_OK(parlio_rx_unit_register_event_callbacks(rx_unit, &cbs, &test_data)); + TEST_ESP_OK(parlio_rx_unit_enable(rx_unit, true)); + + parlio_receive_config_t recv_config = { + .delimiter = timeout_deli, + .flags.partial_rx_en = false, + }; + uint8_t *payload = heap_caps_calloc(1, TEST_PAYLOAD_SIZE, TEST_PARLIO_MEM_ALLOC_CAPS); + TEST_ASSERT(payload); + + printf("Testing the timeout callback...\n"); + // push 5 repeated transactions to the queue + for (int i = 0; i < 5; i++) { + TEST_ESP_OK(parlio_rx_unit_receive(rx_unit, payload, TEST_PAYLOAD_SIZE, &recv_config)); + gpio_set_level(TEST_VALID_GPIO, 1); + vTaskDelay(pdMS_TO_TICKS(10)); + gpio_set_level(TEST_VALID_GPIO, 0); + vTaskDelay(pdMS_TO_TICKS(5)); + printf("Transaction %d finished\n", i); + } + TEST_ASSERT_TRUE(test_data.timeout_cnt); + + TEST_ESP_OK(parlio_rx_unit_disable(rx_unit)); + TEST_ESP_OK(parlio_del_rx_delimiter(timeout_deli)); + TEST_ESP_OK(parlio_del_rx_unit(rx_unit)); + free(payload); +} diff --git a/components/driver/test_apps/parlio/pytest_parlio_unity.py b/components/driver/test_apps/parlio/pytest_parlio_unity.py index 1bfd4acb7b..4f572edd20 100644 --- a/components/driver/test_apps/parlio/pytest_parlio_unity.py +++ b/components/driver/test_apps/parlio/pytest_parlio_unity.py @@ -17,4 +17,4 @@ from pytest_embedded import Dut indirect=True, ) def test_parlio(dut: Dut) -> None: - dut.run_all_single_board_cases(reset=True) + dut.run_all_single_board_cases() diff --git a/components/hal/esp32c6/include/hal/parlio_ll.h b/components/hal/esp32c6/include/hal/parlio_ll.h index 32685ed67c..78d126a33f 100644 --- a/components/hal/esp32c6/include/hal/parlio_ll.h +++ b/components/hal/esp32c6/include/hal/parlio_ll.h @@ -101,33 +101,6 @@ static inline void parlio_ll_rx_set_clock_source(parl_io_dev_t *dev, parlio_cloc PCR.parl_clk_rx_conf.parl_clk_rx_sel = clk_sel; } -/** - * @brief Get the clock source for the RX unit - * - * @param dev Parallel IO register base address - * @return - * parlio_clock_source_t RX core clock source - */ -static inline parlio_clock_source_t parlio_ll_rx_get_clock_source(parl_io_dev_t *dev) -{ - (void)dev; - uint32_t clk_sel = PCR.parl_clk_rx_conf.parl_clk_rx_sel; - switch (clk_sel) { - case 0: - return PARLIO_CLK_SRC_XTAL; - case 1: - return PARLIO_CLK_SRC_PLL_F240M; - case 2: - return PARLIO_CLK_SRC_RC_FAST; - case 3: - return PARLIO_CLK_SRC_EXTERNAL; - default: // unsupported clock source - HAL_ASSERT(false); - break; - } - return PARLIO_CLK_SRC_DEFAULT; -} - /** * @brief Set the clock divider for the RX unit * @@ -209,13 +182,13 @@ static inline void parlio_ll_rx_set_recv_bit_len(parl_io_dev_t *dev, uint32_t bi * @brief Set the sub mode of the level controlled receive mode * * @param dev Parallel IO register base address - * @param active_level Level of the external enable signal, true for active high, false for active low + * @param active_low_en Level of the external enable signal, true for active low, false for active high */ __attribute__((always_inline)) -static inline void parlio_ll_rx_set_level_recv_mode(parl_io_dev_t *dev, bool active_level) +static inline void parlio_ll_rx_set_level_recv_mode(parl_io_dev_t *dev, bool active_low_en) { dev->rx_cfg0.rx_smp_mode_sel = 0; - dev->rx_cfg0.rx_level_submode_sel = !active_level; // 0: active low, 1: active high + dev->rx_cfg0.rx_level_submode_sel = active_low_en; } /** @@ -425,33 +398,6 @@ static inline void parlio_ll_tx_set_clock_source(parl_io_dev_t *dev, parlio_cloc PCR.parl_clk_tx_conf.parl_clk_tx_sel = clk_sel; } -/** - * @brief Get the clock source for the TX unit - * - * @param dev Parallel IO register base address - * @return - * parlio_clock_source_t TX core clock source - */ -static inline parlio_clock_source_t parlio_ll_tx_get_clock_source(parl_io_dev_t *dev) -{ - (void)dev; - uint32_t clk_sel = PCR.parl_clk_tx_conf.parl_clk_tx_sel; - switch (clk_sel) { - case 0: - return PARLIO_CLK_SRC_XTAL; - case 1: - return PARLIO_CLK_SRC_PLL_F240M; - case 2: - return PARLIO_CLK_SRC_RC_FAST; - case 3: - return PARLIO_CLK_SRC_EXTERNAL; - default: // unsupported clock source - HAL_ASSERT(false); - break; - } - return PARLIO_CLK_SRC_DEFAULT; -} - /** * @brief Set the clock divider for the TX unit * diff --git a/components/hal/esp32h2/include/hal/parlio_ll.h b/components/hal/esp32h2/include/hal/parlio_ll.h index 9c94987cfa..e0236e0f8a 100644 --- a/components/hal/esp32h2/include/hal/parlio_ll.h +++ b/components/hal/esp32h2/include/hal/parlio_ll.h @@ -103,33 +103,6 @@ static inline void parlio_ll_rx_set_clock_source(parl_io_dev_t *dev, parlio_cloc PCR.parl_clk_rx_conf.parl_clk_rx_sel = clk_sel; } -/** - * @brief Get the clock source for the RX unit - * - * @param dev Parallel IO register base address - * @return - * parlio_clock_source_t RX core clock source - */ -static inline parlio_clock_source_t parlio_ll_rx_get_clock_source(parl_io_dev_t *dev) -{ - (void)dev; - uint32_t clk_sel = PCR.parl_clk_rx_conf.parl_clk_rx_sel; - switch (clk_sel) { - case 0: - return PARLIO_CLK_SRC_XTAL; - case 1: - return PARLIO_CLK_SRC_PLL_F96M; - case 2: - return PARLIO_CLK_SRC_RC_FAST; - case 3: - return PARLIO_CLK_SRC_EXTERNAL; - default: // unsupported clock source - HAL_ASSERT(false); - break; - } - return PARLIO_CLK_SRC_DEFAULT; -} - /** * @brief Set the clock divider for the RX unit * @@ -210,13 +183,13 @@ static inline void parlio_ll_rx_set_recv_bit_len(parl_io_dev_t *dev, uint32_t bi * @brief Set the sub mode of the level controlled receive mode * * @param dev Parallel IO register base address - * @param active_level Level of the external enable signal, true for active high, false for active low + * @param active_low_en Level of the external enable signal, true for active low, false for active high */ __attribute__((always_inline)) -static inline void parlio_ll_rx_set_level_recv_mode(parl_io_dev_t *dev, bool active_level) +static inline void parlio_ll_rx_set_level_recv_mode(parl_io_dev_t *dev, bool active_low_en) { dev->rx_mode_cfg.rx_smp_mode_sel = 0; - dev->rx_mode_cfg.rx_ext_en_inv = !active_level; // 0: active low, 1: active high + dev->rx_mode_cfg.rx_ext_en_inv = active_low_en; } /** @@ -432,33 +405,6 @@ static inline void parlio_ll_tx_set_clock_source(parl_io_dev_t *dev, parlio_cloc PCR.parl_clk_tx_conf.parl_clk_tx_sel = clk_sel; } -/** - * @brief Get the clock source for the TX unit - * - * @param dev Parallel IO register base address - * @return - * parlio_clock_source_t TX core clock source - */ -static inline parlio_clock_source_t parlio_ll_tx_get_clock_source(parl_io_dev_t *dev) -{ - (void)dev; - uint32_t clk_sel = PCR.parl_clk_tx_conf.parl_clk_tx_sel; - switch (clk_sel) { - case 0: - return PARLIO_CLK_SRC_XTAL; - case 1: - return PARLIO_CLK_SRC_PLL_F96M; - case 2: - return PARLIO_CLK_SRC_RC_FAST; - case 3: - return PARLIO_CLK_SRC_EXTERNAL; - default: // unsupported clock source - HAL_ASSERT(false); - break; - } - return PARLIO_CLK_SRC_DEFAULT; -} - /** * @brief Set the clock divider for the TX unit * diff --git a/components/hal/esp32p4/include/hal/parlio_ll.h b/components/hal/esp32p4/include/hal/parlio_ll.h index c26fa810d9..cc070cf95b 100644 --- a/components/hal/esp32p4/include/hal/parlio_ll.h +++ b/components/hal/esp32p4/include/hal/parlio_ll.h @@ -126,38 +126,6 @@ static inline void parlio_ll_rx_set_clock_source(parl_io_dev_t *dev, parlio_ll_c /// the critical section needs to declare the __DECLARE_RCC_ATOMIC_ENV variable in advance #define parlio_ll_rx_set_clock_source(...) (void)__DECLARE_RCC_ATOMIC_ENV; parlio_ll_rx_set_clock_source(__VA_ARGS__) -/** - * @brief Get the clock source for the RX unit - * - * @param dev Parallel IO register base address - * @return - * parlio_clock_source_t RX core clock source - */ -static inline parlio_ll_clock_source_t parlio_ll_rx_get_clock_source(parl_io_dev_t *dev) -{ - (void)dev; - uint32_t clk_sel = HP_SYS_CLKRST.peri_clk_ctrl117.reg_parlio_rx_clk_src_sel; - switch (clk_sel) { - case 0: - return PARLIO_LL_CLK_SRC_XTAL; - case 1: - return PARLIO_LL_CLK_SRC_RC_FAST; - case 2: - return PARLIO_LL_CLK_SRC_PLL_F160M; - case 3: - return PARLIO_LL_CLK_SRC_PAD; - default: // unsupported clock source - HAL_ASSERT(false); - break; - } - return PARLIO_LL_CLK_SRC_XTAL; -} - - -/// use a macro to wrap the function, force the caller to use it in a critical section -/// the critical section needs to declare the __DECLARE_RCC_ATOMIC_ENV variable in advance -#define parlio_ll_rx_get_clock_source(...) (void)__DECLARE_RCC_ATOMIC_ENV; parlio_ll_rx_get_clock_source(__VA_ARGS__) - /** * @brief Set the clock divider for the RX unit * @@ -481,37 +449,6 @@ static inline void parlio_ll_tx_set_clock_source(parl_io_dev_t *dev, parlio_ll_c /// the critical section needs to declare the __DECLARE_RCC_ATOMIC_ENV variable in advance #define parlio_ll_tx_set_clock_source(...) (void)__DECLARE_RCC_ATOMIC_ENV; parlio_ll_tx_set_clock_source(__VA_ARGS__) -/** - * @brief Get the clock source for the TX unit - * - * @param dev Parallel IO register base address - * @return - * parlio_clock_source_t TX core clock source - */ -static inline parlio_ll_clock_source_t parlio_ll_tx_get_clock_source(parl_io_dev_t *dev) -{ - (void)dev; - uint32_t clk_sel = HP_SYS_CLKRST.peri_clk_ctrl118.reg_parlio_tx_clk_src_sel; - switch (clk_sel) { - case 0: - return PARLIO_LL_CLK_SRC_XTAL; - case 1: - return PARLIO_LL_CLK_SRC_RC_FAST; - case 2: - return PARLIO_LL_CLK_SRC_PLL_F160M; - case 3: - return PARLIO_LL_CLK_SRC_PAD; - default: // unsupported clock source - HAL_ASSERT(false); - break; - } - return PARLIO_LL_CLK_SRC_XTAL; -} - -/// use a macro to wrap the function, force the caller to use it in a critical section -/// the critical section needs to declare the __DECLARE_RCC_ATOMIC_ENV variable in advance -#define parlio_ll_tx_get_clock_source(...) (void)__DECLARE_RCC_ATOMIC_ENV; parlio_ll_tx_get_clock_source(__VA_ARGS__) - /** * @brief Set the clock divider for the TX unit * diff --git a/components/hal/include/hal/parlio_types.h b/components/hal/include/hal/parlio_types.h index 75439fe658..baaeeb4d9d 100644 --- a/components/hal/include/hal/parlio_types.h +++ b/components/hal/include/hal/parlio_types.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -49,11 +49,6 @@ typedef enum { PARLIO_BIT_PACK_ORDER_MSB, /*!< Bit pack order: MSB */ } parlio_bit_pack_order_t; -typedef enum { - PARIO_CLK_TYPE_FREE, - PARIO_CLK_TYPE_NON_FREE, -} parlio_clock_type_t; - #if SOC_PARLIO_SUPPORTED /** * @brief Parallel IO clock source diff --git a/docs/en/api-reference/peripherals/parlio.rst b/docs/en/api-reference/peripherals/parlio.rst index b2c96cbf87..7a9405715f 100644 --- a/docs/en/api-reference/peripherals/parlio.rst +++ b/docs/en/api-reference/peripherals/parlio.rst @@ -8,10 +8,6 @@ The Parallel IO peripheral is a general purpose parallel interface that can be u The TX and RX driver of Parallel IO peripheral are designed separately, you can include ``driver/parlio_tx.h`` or ``driver/parlio_rx.h`` to use any of them. -Parlio RX Driver ----------------- - - Application Examples -------------------- diff --git a/examples/peripherals/.build-test-rules.yml b/examples/peripherals/.build-test-rules.yml index b2ceb4fcb3..322285d9c7 100644 --- a/examples/peripherals/.build-test-rules.yml +++ b/examples/peripherals/.build-test-rules.yml @@ -218,7 +218,13 @@ examples/peripherals/parlio: temporary: true reason: lack of runner -examples/peripherals/parlio/simple_rgb_led_matrix: +examples/peripherals/parlio/parlio_rx: + disable: + - if: SOC_PARLIO_SUPPORTED != 1 or IDF_TARGET == "esp32p4" + temporary: true + reason: not support esp32p4 yet (IDF-7471) + +examples/peripherals/parlio/parlio_tx/simple_rgb_led_matrix: disable: - if: SOC_PARLIO_SUPPORTED != 1 or SOC_DEDICATED_GPIO_SUPPORTED != 1 disable_test: diff --git a/examples/peripherals/parlio/parlio_rx/logic_analyzer/CMakeLists.txt b/examples/peripherals/parlio/parlio_rx/logic_analyzer/CMakeLists.txt new file mode 100644 index 0000000000..3cadaa97a3 --- /dev/null +++ b/examples/peripherals/parlio/parlio_rx/logic_analyzer/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(logic_analyzer) diff --git a/examples/peripherals/parlio/parlio_rx/logic_analyzer/README.md b/examples/peripherals/parlio/parlio_rx/logic_analyzer/README.md new file mode 100644 index 0000000000..6f91587df2 --- /dev/null +++ b/examples/peripherals/parlio/parlio_rx/logic_analyzer/README.md @@ -0,0 +1,229 @@ +| Supported Targets | ESP32-C6 | ESP32-H2 | +| ----------------- | -------- | -------- | + +# Logic Analyzer Example + +(See the README.md file in the upper level 'examples' directory for more information about examples.) + +This example demonstrates how to implement a logic analyzer via Parallel IO RX peripheral. The main implementation is extracted as `esp_probe` component for portability. + +Parallel IO is a peripheral that can sample data on multiple GPIOs in parallel at a high rate, which in its basic form is exactly the functionality of a logic analyzer. + +This example uses the "software delimiter mode" of the Parallel IO RX driver, so that the Parallel IO RX peripheral can be driven by the internal clock and keep sampling continuously. + +## Example Overview + +Under the default configuration, this example will probe the signals on several GPIOs, meanwhile these GPIOs will generate some signals by GPIO driver. The probed raw data will be stored temporary on the heap. When the allocated heap is run out or the probing time expires, the probing will stop and output the stored raw data to the output stream. + +## How to Use Example + +### Step 0: Requirement + +#### Hardware + +* A development board which has the parlio peripheral integrated, for supported chips see the table at the top +* A USB cable for power supply and programming +* Network connection if using TCP output stream + +#### Extra Software on PC + +* [PulseView](https://sigrok.org/wiki/Downloads) for visualizing the captured signal + +### Step 1: Configure The Project + +Run `idf.py menuconfig` under this example director to configure the example. + +1. The `esp_probe` component can probe either internal signals or external signals, choose this configuration to select: + + * "Select signal source": to select where the signals come from. + + - "Probing the internal signals": the signals come from the chip itself (i.e., internal). The output signals on the GPIO will be feed back to the Parallel IO RX via GPIO matrix. This example only simulates some signals by GPIO driver, you can also modify the example code to probe the signals that produced by other peripherals (like I2C, I2S, SPI, etc). + + - "Probing the External signals": the signals come from external source that connected to the probing GPIOs. + +2. The `esp_probe` component support Flash or TCP stream to output the raw data, choose this configuration to select: + + * "Select ESP probe dump stream": to select the output stream + + - "Dump data into FLASH": the data will be dumped into the Flash, it requires you to allocate a FAT partition in the partition table. In this example, there is a `storage` partition for saving the probed raw data. Then we can use `esptool`to read this partition on the host side. Normally we read the whole `storage` partition, because we don't know the exact start address that the raw data saved. + + - "Dump data to the host using TCP": the data will be dumped to the host directly via the TCP stream. Target should support connecting to the network via WiFi or Ethernet. + +3. To change the probing GPIOs, modify the `s_probe_gpio` array in the `logic_analyzer_example_main.c` + +#### Flash Stream + +If we choose to dump into flash, please make sure the data partition label we set in the menuconfig is same as what we set in the `partition.csv` + +* "The label of the data storage partition": sets the partition label that specified in `partition.csv` file. Defaults to `storage`. + +#### TCP Stream + +If we choose to dump via TCP, please specify the WiFi or Ethernet configurations in the menu "Example Connection Configuration", and then specify the TCP server information in "ESP probe configurations > Select ESP probe dump stream" menu: + +* "TCP server IP address": the IP address that TCP server bound +* "TCP server port": the port the TCP server is listening on (default 8888) + +### Step 2: Build And Flash + +(If you're using TCP stream, please go to Step 3 first) + +Build the project and flash it to the board, then run monitor tool to view serial output: + +```bash +idf.py -p PORT build flash monitor +``` + +And then waiting until the main task finished + +``` +I (2625) main_task: Returned from app_main() +``` + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the Getting Started Guide for full steps to configure and use ESP-IDF to build projects. + +### Step 3: Convert Raw Data into VCD Format + +Before conversion, we need to know how many channels in the raw data. In this example, we probed 4 GPIOs that set in `s_probe_gpio`, so we need to specify the channel number for the conversion. + +#### Flash Stream + +1. Exit the serial monitor and use `esptool` to read the flash partition to the host: + + For the default partition in this example: + + ```bash + parttool.py -p -b 406800 -f partitions.csv read_partition -h -n storage --output probe_raw.dat + ``` +2. Convert the raw data into VCD format: + + (Run the following command under the example directory) + ```bash + python components/esp_probe/host/vcd_dumper.py -n 4 -i probe_raw.dat -o probe_vcd_data.vcd + ``` + + * `-n`: the channel number that probed + * `-i`: the the input raw data file + * `-o`: the output vcd file name (optional) + + Then you can get the VCD file on the host. + +**Note:** This example converted the whole partition into VCD file for demonstration, you can also adopt some methods to extract the saved file in this partitions like: + +- Download the whole partition into the host and mount it as FS on host by Loop Device or RAM Disk; +- Download the whole partition into the host and parse the FAT Root Directory and find the data offset of the file `/esp_probe/probe_raw.dat`; + +#### TCP Stream + +1. Start the TCP server on the host: + + (Run the following command under the example directory) + ```bash + python components/esp_probe/host/tcp_server -n 4 -p 8888 -o probe_vcd_data.vcd + ``` + + * `-n`: the channel number that probed + * `-p`: the TCP port (default 8888) + * `-o`: the output vcd file name (optional) + + Then you can see the TCP server is on, log printed like: + + ``` + TCP listening at 192.168.1.106:8888 + ``` +2. Jump back to the Step 2 to flash and monitor the target + +3. If the TCP client connected successfully, there will be data received, you can see the log like: + + ``` + Client 192.168.1.183:49626 joined + data received 1440 bytes + data received 1440 bytes + data received 2880 bytes + ... + Client 192.168.1.183:49626 left + ``` + + Then you can get the VCD data on the host. + +### Step 4: View The Signals on PulseView + +Open PulseView and import the file `probe_vcd_data.vcd` with `Value Change Dump data` option: + +![pulseview_image](./img/pulseview.jpeg) + +#### Internal Signals That Simulated by GPIOs + +![internal_gpio_signals](./img/gpio_sig.jpeg) + +#### External I2S Philips Signals with I2S Decoder + +![external_i2s_signals](./img/i2s_sig.jpeg) + +## Further More Introduction on `esp_probe` + +### Data Mode + +#### Stream Mode + +Stream mode will output the raw data via the output stream without storing. Stream mode can be selected by the helper macro `ESP_PROBE_DEFAULT_STREAM_CONFIG` (the probe GPIOs need to be set additionally). + +* Advantage is that don't need extra storage to store the raw data. +* Disadvantage is that, due to the received data must finish sending before the new data receives, the sample rate is limited by the output stream bandwidth. Normally it can only achieve a low sample rate to avoid data lost. + +#### Buffer Mode (Recommended) + +Buffer mode store the raw data on the heap storage temporary before sending them. Buffer mode can be selected by the helper macro `ESP_PROBE_DEFAULT_BUFFER_CONFIG` (the probe GPIOs need to be set additionally). + +* Advantage is that, it can support a high sample rate. +* Disadvantage is that, the sampling time is limited by the available heap size. Normally the available heap size is only several hundreds KB, which can only hold raw data for several ms when sampling with a high rate. But buffer mode is still recommended as it is more useful in most of cases. + +#### Buffer Stream Mode + +Buffer Stream mode store the raw data on the heap storage temporary but the storage will be used as Ping-Pong buffer to send the data in the storage. Buffer Stream mode can be selected by the helper macro `ESP_PROBE_DEFAULT_BUFFER_STREAM_CONFIG` (the probe GPIOs need to be set additionally). + +* Advantage is that, the sampling time is not limited. Comparing to the Stream mode, it can reach a relative higher sample rate. +* Disadvantage is that, we still need to guarantee the output stream can catch the new data generation, otherwise data will be still be dropped. + +### Output Streams + +Currently `esp_probe` supports `Flash` and `TCP` stream. + +#### Flash Stream + +Requires a built-in Flash or external Flash and a data partition in FAT format. + +* Advantages: + + 1. Support larger storage comparing to the heap; + 2. ESP modules always have Flash on it, and no additional WiFi environment required; + +* Disadvantages: + + 1. Low bandwidth. About several hundreds KB/s supported (e.g. 300+ KB/s on ESP32-H2); + 2. Have to use `esptool` to read the raw data from the partition and then dump it into VCD format additionally; + 3. This example convert the whole storage partition into VCD format, which includes some unrelated data. Or you have to get the file from the partition in some ways additionally. + +#### TCP Stream + +Requires WiFi or Ethernet supported on the target and accessible network. + +* Advantages: + + 1. High bandwidth. Nearly 30 MB/s throughput supported, which allows a higher sample rate. For example, the sample rate can reach `25MB/s` on C6 with `Buffer Mode`, and 700+ KB/s with `Stream mode` without data dropped; + 2. The TCP server can dump the raw data into VCD format directly without other operations; + +* Disadvantages: + + 1. WiFi or Ethernet is required on the target; + 2. Larger image size; + +## Troubleshooting + +* The TCP server will sometimes miss the client disconnection (i.e. no `Client 192.168.1.183:56208 left` log). + - Just quit the progress by `Ctrl + C` and wait for a while util the port is released + +For any technical queries, please open an [issue](https://github.com/espressif/esp-idf/issues) on GitHub. We will get back to you soon. + diff --git a/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/CMakeLists.txt b/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/CMakeLists.txt new file mode 100644 index 0000000000..a8b85f9b03 --- /dev/null +++ b/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/CMakeLists.txt @@ -0,0 +1,12 @@ +set(src "hw_impl/esp_probe_impl_parlio.c" "esp_probe.c" + "stream/flash_fatfs.c" "stream/file_stream.c") + +if(CONFIG_SOC_WIFI_SUPPORTED OR CONFIG_SOC_EMAC_SUPPORTED) + list(APPEND src "stream/tcp_stream.c") +endif() + +idf_component_register(SRCS ${src} + INCLUDE_DIRS "./include" + PRIV_INCLUDE_DIRS "." + PRIV_REQUIRES driver hal fatfs esp_partition esp_netif + lwip) diff --git a/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/esp_probe.c b/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/esp_probe.c new file mode 100644 index 0000000000..1c44d9a748 --- /dev/null +++ b/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/esp_probe.c @@ -0,0 +1,288 @@ +/* + * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/queue.h" +#include "freertos/idf_additions.h" +#include "sdkconfig.h" +#include "esp_probe_private.h" +#include "esp_probe.h" +#include "esp_check.h" +#include "esp_cpu.h" + +static const char *TAG = "esp_probe"; + +#define GET_US_BY_CCOUNT(t) ((float)(t)/CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ) + +static void s_esp_probe_flush_task(void *args) +{ + esp_probe_handle_t handle = (esp_probe_handle_t)args; + esp_probe_flush_data_t flush_data; + + // Suspend if not start probing yet + if (!handle->flags.is_started) { + vTaskSuspend(NULL); + } + + while (1) { + if (xQueueReceive(handle->flush_que, &flush_data, portMAX_DELAY) == pdTRUE) { + if (flush_data.size) { + fwrite(flush_data.data, flush_data.size, 1, handle->out_stream); + } + } + // If probe is stopped and no data to flush, suspend the task + if (!handle->flags.is_started && uxQueueSpacesAvailable(handle->flush_que) == 2) { + vTaskSuspend(NULL); + } + } +} + +static void s_esp_probe_push_flush_queue(esp_probe_handle_t handle, void *data, uint32_t size, bool reset_ptr) +{ + esp_probe_flush_data_t flush_data = { + .data = data, + .size = size, + }; + TickType_t timeout_tick = 0; + if (!size) { + // If no data to flush but only inform the flush task to suspend + // then wait until data flushed + timeout_tick = portMAX_DELAY; + } + if (xQueueSend(handle->flush_que, &flush_data, timeout_tick) != pdTRUE) { + esp_probe_flush_data_t dummy; + xQueueReceive(handle->flush_que, &dummy, 0); + xQueueSend(handle->flush_que, &flush_data, 0); + ESP_LOGW(TAG, "data dropped"); + } + if (reset_ptr) { + handle->w_ptr = 0; + handle->f_ptr = 0; + } else { + handle->f_ptr = handle->w_ptr; // Update the flush pointer to the current write pointer + } +} + +static void s_esp_probe_dump_task(void *args) +{ + esp_probe_handle_t handle = (esp_probe_handle_t)args; + esp_probe_recv_data_t recv_data; + bool need_suspend = false; + uint32_t byte_dump = 0; + + // Suspend if not start probing yet + if (!handle->flags.is_started) { + vTaskSuspend(NULL); + } + + while (1) { + // Receive the data that from data receive callback + if (xQueueReceive(handle->recv_que, &recv_data, portMAX_DELAY) == pdTRUE) { + if (handle->buf_size) { // Buffer mode, adopt ping-pong buffer strategy to flush data + if (unlikely(handle->w_ptr + recv_data.size > handle->max_dump_size)) { + // If the received in buffer has exceeded the max_dump_size but not reached the buffer size + // Only dump the rest piece of data + byte_dump = handle->max_dump_size - handle->w_ptr; + } else { + // If the rest buffer is not sufficient for the received data + // Flush the second half of the buffer + if (handle->w_ptr + recv_data.size > handle->buf_size) { + s_esp_probe_push_flush_queue(handle, handle->buffer + handle->f_ptr, + handle->w_ptr - handle->f_ptr, true); + } + byte_dump = recv_data.size; + } + memcpy(handle->buffer + handle->w_ptr, recv_data.data, byte_dump); + handle->w_ptr += byte_dump; + + // If the last flush pointer is 0 and the stored data has exceed the half of the buffer + // Flush the first half of the buffer + // Here minus some extra bytes to trigger the flush more timely + if (!handle->f_ptr && handle->w_ptr >= handle->buf_size / 2 - 32) { + s_esp_probe_push_flush_queue(handle, handle->buffer, handle->w_ptr, false); + } + + } else { // Stream mode, write directly + if (handle->dump_data_size + recv_data.size > handle->max_dump_size) { + byte_dump = handle->max_dump_size - handle->dump_data_size; + } else { + byte_dump = recv_data.size; + } + fwrite(recv_data.data, byte_dump, 1, handle->out_stream); + } + // Update the dump data size statistic + handle->dump_data_size += byte_dump; + } + uint32_t exceed_bytes = 0; + // If reach the max dump size, suspend the task + if (handle->dump_data_size >= handle->max_dump_size) { + ESP_LOGW(TAG, "Dump data size reached the max dump size"); + need_suspend = true; + exceed_bytes = handle->dump_data_size - handle->max_dump_size; + } + // If probe is stopped, suspend the task + need_suspend |= !handle->flags.is_started; + + if (need_suspend) { + // Flush the legacy data before suspend + if (handle->buf_size) { + s_esp_probe_push_flush_queue(handle, handle->buffer + handle->f_ptr, + handle->w_ptr - handle->f_ptr - exceed_bytes, true); + } + vTaskSuspend(NULL); + } + } +} + +static void s_esp_probe_destroy_object(esp_probe_handle_t handle) +{ + if (handle) { + if (handle->buffer) { + free(handle->buffer); + handle->buffer = NULL; + } + if (handle->recv_que) { + vQueueDeleteWithCaps(handle->recv_que); + handle->recv_que = NULL; + } + if (handle->dump_task) { + vTaskDelete(handle->dump_task); + handle->dump_task = NULL; + } + if (handle->flush_que) { + vQueueDeleteWithCaps(handle->flush_que); + handle->flush_que = NULL; + } + if (handle->flush_task) { + vTaskDelete(handle->flush_task); + handle->flush_task = NULL; + } + free(handle); + } +} + +esp_err_t esp_new_probe(esp_probe_config_t *config, esp_probe_handle_t* ret_handle) +{ + ESP_RETURN_ON_FALSE(config && ret_handle, ESP_ERR_INVALID_ARG, TAG, "input parameter is NULL"); + // Get the max channel id and check whether any gpio specified + int max_chan_id = ESP_PROBE_MAX_CHANNEL_NUM - 1; + while (config->probe_gpio[max_chan_id] < 0) { + max_chan_id--; + ESP_RETURN_ON_FALSE(max_chan_id > 0, ESP_ERR_INVALID_ARG, TAG, "no gpio to probe"); + } + // Create the probe object + esp_err_t ret = ESP_OK; + esp_probe_handle_t probe = heap_caps_calloc(1, sizeof(struct esp_probe_t), ESP_PROBE_ALLOC_CAPS); + ESP_RETURN_ON_FALSE(probe, ESP_ERR_NO_MEM, TAG, "no memory for probe object"); + probe->max_dump_size = config->max_dump_size_kb ? (config->max_dump_size_kb << 10) : UINT32_MAX; + + // Allocate the storage buffer if the data should be cached + if (config->storage_depth_kb) { + if (config->storage_depth_kb < 8) { + ESP_LOGW(TAG, "the storage depth is at least 8 KB, set to 8 KB instead"); + probe->buf_size = 8192; + } else { + probe->buf_size = config->storage_depth_kb * 1024; + } + probe->buffer = calloc(1, probe->buf_size); + ESP_GOTO_ON_FALSE(probe->buffer, ESP_ERR_NO_MEM, err, TAG, "no memory for data storage"); + // Create flush task + xTaskCreate(s_esp_probe_flush_task, "esp_probe_flush_task", 4096, probe, + (UBaseType_t)config->dump_task_priority, &(probe->flush_task)); + // Create the flush queue + probe->flush_que = xQueueCreateWithCaps(2, sizeof(esp_probe_flush_data_t), MALLOC_CAP_DEFAULT); + ESP_GOTO_ON_FALSE(probe->flush_que, ESP_ERR_NO_MEM, err, TAG, "no memory for flush queue"); + } + + // Create the receive queue + probe->recv_que = xQueueCreateWithCaps(ESP_PROBE_DEFAULT_Q_DEPTH, sizeof(esp_probe_recv_data_t), ESP_PROBE_ALLOC_CAPS); + ESP_GOTO_ON_FALSE(probe->recv_que, ESP_ERR_NO_MEM, err, TAG, "no memory for receive queue"); + + // Create the dump task and suspend it + xTaskCreate(s_esp_probe_dump_task, "esp_probe_dump_task", 4096, probe, + (UBaseType_t)config->dump_task_priority, &(probe->dump_task)); + + // Initialize the hardware peripheral + ESP_GOTO_ON_ERROR(esp_probe_priv_init_hardware(probe, config, max_chan_id), err, TAG, "fail to init the hardware peripheral"); + + *ret_handle = probe; + return ret; + +err: + s_esp_probe_destroy_object(probe); + probe = NULL; + return ret; +} + +esp_err_t esp_del_probe(esp_probe_handle_t handle) +{ + ESP_RETURN_ON_FALSE(handle, ESP_ERR_INVALID_ARG, TAG, "input parameter is NULL"); + ESP_RETURN_ON_FALSE(!handle->flags.is_started, ESP_ERR_INVALID_STATE, TAG, "probe is still running"); + esp_probe_priv_deinit_hardware(handle); + s_esp_probe_destroy_object(handle); + return ESP_OK; +} + +esp_err_t esp_probe_start(esp_probe_handle_t handle, FILE *out_stream) +{ + ESP_RETURN_ON_FALSE(handle, ESP_ERR_INVALID_ARG, TAG, "input parameter is NULL"); + ESP_RETURN_ON_FALSE(!handle->flags.is_started, ESP_ERR_INVALID_STATE, TAG, "probe is still running"); + handle->flags.is_started = true; + + esp_err_t ret = ESP_OK; + ESP_GOTO_ON_ERROR(esp_probe_priv_enable_hardware(handle), err, TAG, "enable the hardware failed"); + out_stream = out_stream ? out_stream : stdout; + if (handle->out_stream != out_stream) { + handle->out_stream = out_stream; + // io stream changed, reset timestamp and dump data size + handle->dump_data_size = 0; + } + if (handle->buf_size) { + // Reset the queue before resume the task + xQueueReset(handle->flush_que); + vTaskResume(handle->flush_task); + } + // Reset the queue before resume the task + xQueueReset(handle->recv_que); + vTaskResume(handle->dump_task); + + return ret; +err: + handle->flags.is_started = false; + return ret; +} + +esp_err_t esp_probe_stop(esp_probe_handle_t handle, uint32_t *dump_data_size) +{ + ESP_RETURN_ON_FALSE(handle, ESP_ERR_INVALID_ARG, TAG, "input parameter is NULL"); + if (!handle->flags.is_started) { + return ESP_OK; + } + // Set start flag to false + handle->flags.is_started = false; + + // Waiting for the dump task be suspended after detecting the start flag is cleared + while (eTaskGetState(handle->dump_task) != eSuspended) { + vTaskDelay(1); + } + ESP_RETURN_ON_ERROR(esp_probe_priv_disable_hardware(handle), TAG, "disable the hardware failed"); + // Waiting for the flush task to flush the legacy data + if (handle->buf_size) { + // Push an empty data to inform the flush task to suspend + s_esp_probe_push_flush_queue(handle, NULL, 0, true); + while (eTaskGetState(handle->flush_task) != eSuspended) { + vTaskDelay(1); + } + } + if (dump_data_size) { + *dump_data_size = handle->dump_data_size; + } + return ESP_OK; +} diff --git a/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/esp_probe_private.h b/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/esp_probe_private.h new file mode 100644 index 0000000000..77d6b4b517 --- /dev/null +++ b/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/esp_probe_private.h @@ -0,0 +1,66 @@ +/* + * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include "stdint.h" +#include "sdkconfig.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/queue.h" +#include "esp_heap_caps.h" +#include "esp_probe.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ESP_PROBE_DEFAULT_Q_DEPTH 8 +#define ESP_PROBE_DEFAULT_MAX_RECV_SIZE (ESP_PROBE_DEFAULT_Q_DEPTH * 4092) +#if CONFIG_PARLIO_ISR_IRAM_SAFE +#define ESP_PROBE_ALLOC_CAPS (MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT) +#else +#define ESP_PROBE_ALLOC_CAPS MALLOC_CAP_DEFAULT +#endif + +struct esp_probe_t { + uint32_t sample_width; /*!< sample width, i.e., enabled probe channel nums */ + uint32_t sample_rate_hz; /*!< sample rate in Hz */ + FILE *out_stream; /*!< Output stream */ + TaskHandle_t dump_task; /*!< Task handle of the raw data dump task */ + TaskHandle_t flush_task; /*!< Task handle of the raw data flush task, only created in buffer mode */ + int dump_task_priority; /*!< Task priority */ + uint32_t max_dump_size; /*!< Max dump size */ + uint32_t dump_data_size; /*!< Dump data size */ + QueueHandle_t recv_que; /*!< Receive data queue */ + QueueHandle_t flush_que; /*!< Flush data queue */ + uint8_t *buffer; /*!< The storage buffer for dump data */ + uint32_t buf_size; /*!< The storage buffer size/depth */ + uint32_t w_ptr; /*!< The pointer of the current write offset of the buffer */ + uint32_t f_ptr; /*!< The pointer of the current flush offset of the buffer */ + struct { + volatile uint32_t is_started: 1; /*!< Is the sampling started */ + } flags; +}; + +typedef struct { + void *data; /*!< The pointer of the received raw data buffer */ + uint32_t size; /*!< The size of the received raw data buffer */ +} esp_probe_recv_data_t; + +typedef esp_probe_recv_data_t esp_probe_flush_data_t; + +esp_err_t esp_probe_priv_init_hardware(esp_probe_handle_t handle, esp_probe_config_t *config, int max_chan_id); + +esp_err_t esp_probe_priv_deinit_hardware(esp_probe_handle_t handle); + +esp_err_t esp_probe_priv_enable_hardware(esp_probe_handle_t handle); + +esp_err_t esp_probe_priv_disable_hardware(esp_probe_handle_t handle); + +#ifdef __cplusplus +} +#endif diff --git a/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/host/tcp_server.py b/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/host/tcp_server.py new file mode 100644 index 0000000000..e5fee66ed4 --- /dev/null +++ b/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/host/tcp_server.py @@ -0,0 +1,76 @@ +# SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: Apache-2.0 + +import argparse +import socket +from io import TextIOWrapper +from typing import Any + +from vcd_dumper import VCDDumper + + +def _get_local_host_ip() -> Any: + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + s.connect(('8.8.8.8', 80)) + return s.getsockname()[0] + + +def _tcp_server(port:int, chan_num:int, vcd_out_io:TextIOWrapper) -> None: + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + host = _get_local_host_ip() + s.bind((host, port)) + s.listen(5) + print(f'TCP listening at {host}:{port}') + + try: + while True: + c, addr = s.accept() + print(f'Client {addr[0]}:{addr[1]} joined') + vcd = VCDDumper() + vcd.open_new_vcd_file(chan_num, vcd_out_io) + + while True: + recv_data = c.recv(16384) + if recv_data == b'': + break + print(f'data received {len(recv_data)} bytes') + vcd.dump_samples(recv_data) + + print(f'Client {addr[0]}:{addr[1]} left') + vcd.close_vcd_file() + c.close() + finally: + vcd.close_vcd_file() + c.close() + s.shutdown(socket.SHUT_RDWR) + s.close() + print('TCP server closed') + + +def tcp_server_main() -> None: + # Args parser + parser = argparse.ArgumentParser(description='Dump raw data to VCD format') + parser.add_argument('-n', '--chan-num', type=int, help='The channel number that probed') + parser.add_argument('-p', '--port', type=int, help='The TCP port', default=8888) + parser.add_argument('-o', '--output-file', type=argparse.FileType('w'), help='The output vcd file name (optional)', default=None) + + # Parse args + args = parser.parse_args() + chan_num = args.chan_num + port = args.port + vcd_out_io = args.output_file + if chan_num <= 0: + raise ValueError('Invalid channel number') + + # Get the actual probe channel number (round up to the nearest number that is power of 2) + p = 0 + while (1 << p) < chan_num: + p = p + 1 + chan_num = 1 << p + + _tcp_server(port, chan_num, vcd_out_io) + + +if __name__ == '__main__': + tcp_server_main() diff --git a/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/host/vcd_dumper.py b/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/host/vcd_dumper.py new file mode 100644 index 0000000000..0e7fdc0871 --- /dev/null +++ b/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/host/vcd_dumper.py @@ -0,0 +1,128 @@ +# SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: Apache-2.0 + +# This dumper script run on the host after get the probed raw data on the host +# Usage: python vcd_dumper.py -n -f + +import argparse +import time +from io import FileIO, TextIOWrapper + + +class VCDDumper(): + def __init__(self) -> None: + pass + + def open_new_vcd_file(self, chan_num: int, vcd_out_io:TextIOWrapper) -> None: + self.ts = 0 + self.odd_samples = 0 + self.prev = 0 + self.chan_num = chan_num + self.step = 1 if chan_num <= 8 else 2 + # vcd file name + if vcd_out_io: + self.vcd = vcd_out_io + else: + dump_file = 'probe_{}.vcd'.format(time.strftime('%m-%d_%H-%M-%S')) + self.vcd = open(dump_file, 'w', encoding='utf-8') + + # Write VCD header + self.vcd.write('$date today $end\n' + '$timescale 1 ns $end\n' + '$scope module logic_analyzer $end\n') + for i in range(chan_num): + self.vcd.write(f'$var wire 1 {chr(33 + i)} chan_{i} $end\n') + self.vcd.write('$upscope $end\n' + '$enddefinitions $end\n' + '$dumpvars\n') + for i in range(chan_num): + self.vcd.write(f'0{chr(33 + i)}\n') + self.vcd.write('$end\n') + + def close_vcd_file(self) -> None: + if self.vcd: + self.vcd.close() + + def _dump_one_sample_to_vcd(self, prev:int, curr:int) -> None: + change_mask = prev ^ curr + if change_mask == 0: + return + self.vcd.write(f'#{self.ts}\n') + i = 0 + while change_mask != 0: + if change_mask & 1: + self.vcd.write(f'{(curr >> i) & 1}{chr(33 + i)}\n') + change_mask >>= 1 + i += 1 + + def dump_samples(self, raw_data:bytes) -> None: + # Parse the raw data and write VCD body + byte_cnt = 0 + # If last time is one byte left, load it + if self.odd_samples: + samples = self.odd_samples + self.odd_samples = 0 + byte_cnt = 1 + else: + samples = 0 + + # Loop the raw data and parse byte by byte + for byte in raw_data: + byte_cnt += 1 + if byte_cnt % self.step == 0: + samples = (samples & 0xff00) | byte + self.odd_samples = 0 + else: + samples = byte << 8 + self.odd_samples = samples + continue + samples = byte + + # Loop the samples in one byte + for _ in range((8 * self.step) // self.chan_num): + curr = samples & ((2 ** self.chan_num) - 1) + self._dump_one_sample_to_vcd(self.prev, curr) + samples >>= self.chan_num + self.prev = curr + self.ts += 1 + + def dump_samples_from_file(self, raw_in_io:FileIO) -> None: + data_bytes = raw_in_io.read() + self.dump_samples(data_bytes) + + +def dump_binary_raw_data_to_vcd(chan_num:int, raw_in_io:FileIO, vcd_out_io:TextIOWrapper) -> None: + vcd = VCDDumper() + vcd.open_new_vcd_file(chan_num, vcd_out_io) + vcd.dump_samples_from_file(raw_in_io) + vcd.close_vcd_file() + print('Converted successfully!') + + +def dump_vcd_main() -> None: + # Args parser + parser = argparse.ArgumentParser(description='Dump raw data to VCD format') + parser.add_argument('-n', '--chan-num', type=int, help='The channel number that probed') + parser.add_argument('-i', '--input-file', type=argparse.FileType('rb'), help='The the input raw data file') + parser.add_argument('-o', '--output-file', type=argparse.FileType('w'), help='The output vcd file name (optional)', default=None) + + # Parse args + args = parser.parse_args() + chan_num = args.chan_num + raw_in_io = args.input_file + vcd_out_io = args.output_file + if chan_num <= 0: + raise ValueError('Invalid channel number') + + # Get the actual probe channel number (round up to the nearest number that is power of 2) + p = 0 + while (1 << p) < chan_num: + p = p + 1 + chan_num = 1 << p + + # Convert the data to the VCD format and save it into the file + dump_binary_raw_data_to_vcd(chan_num, raw_in_io, vcd_out_io) + + +if __name__ == '__main__': + dump_vcd_main() diff --git a/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/hw_impl/esp_probe_impl_parlio.c b/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/hw_impl/esp_probe_impl_parlio.c new file mode 100644 index 0000000000..389687f609 --- /dev/null +++ b/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/hw_impl/esp_probe_impl_parlio.c @@ -0,0 +1,147 @@ +/* + * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include "sdkconfig.h" +#include "driver/parlio_rx.h" +#include "esp_clk_tree.h" +#include "esp_heap_caps.h" +#include "esp_check.h" +#include "esp_probe_private.h" + +typedef struct { + parlio_rx_unit_handle_t rx_unit; + parlio_rx_delimiter_handle_t deli; + uint8_t *payload; +} esp_probe_impl_pralio_t; + +static const char *TAG = "esp_probe_impl"; +static esp_probe_impl_pralio_t *s_ephi = NULL; + +static bool s_esp_probe_on_recv_callback(parlio_rx_unit_handle_t rx_unit, const parlio_rx_event_data_t *edata, void *user_data) +{ + esp_probe_handle_t handle = (esp_probe_handle_t)user_data; + esp_probe_recv_data_t recv_data = { + .data = edata->data, + .size = edata->recv_bytes, + }; + BaseType_t need_yield; + xQueueSendFromISR(handle->recv_que, &recv_data, &need_yield); + + return need_yield == pdTRUE; +} + +esp_err_t esp_probe_priv_init_hardware(esp_probe_handle_t handle, esp_probe_config_t *config, int max_chan_id) +{ + ESP_RETURN_ON_FALSE(!s_ephi, ESP_ERR_INVALID_STATE, TAG, "parlio rx has initialized"); + ESP_RETURN_ON_FALSE(max_chan_id <= PARLIO_RX_UNIT_MAX_DATA_WIDTH, ESP_ERR_NOT_SUPPORTED, TAG, + "The target can only support upto %d channels", (int)PARLIO_RX_UNIT_MAX_DATA_WIDTH); + esp_err_t ret = ESP_OK; + s_ephi = calloc(1, sizeof(esp_probe_impl_pralio_t)); + ESP_RETURN_ON_FALSE(s_ephi, ESP_ERR_NO_MEM, TAG, "no memory for the esp probe hardware implementation"); + s_ephi->payload = heap_caps_calloc(1, ESP_PROBE_DEFAULT_MAX_RECV_SIZE, ESP_PROBE_ALLOC_CAPS); + ESP_GOTO_ON_FALSE(s_ephi->payload, ESP_ERR_NO_MEM, err, TAG, "no memory for payload"); + + // Get the channel number, the channel number can only be the power of 2 + uint32_t sample_width = 1; + while (sample_width < max_chan_id) { + sample_width <<= 1; + } + handle->sample_width = sample_width; + + // Get the sample rate + uint32_t src_freq_hz = 0; + esp_clk_tree_src_get_freq_hz(PARLIO_CLK_SRC_DEFAULT, ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED, &src_freq_hz); + uint32_t sample_rate_hz = config->sample_rate_hz ? config->sample_rate_hz : src_freq_hz; + if (sample_rate_hz > src_freq_hz) { + ESP_LOGW(TAG, "sample rate exceed the max value, limited to %"PRIu32, src_freq_hz); + sample_rate_hz = src_freq_hz; + } + handle->sample_rate_hz = sample_rate_hz; + + // Allocate the parlio rx instance + parlio_rx_unit_config_t parlio_rx_cfg = { + .trans_queue_depth = ESP_PROBE_DEFAULT_Q_DEPTH, + .max_recv_size = ESP_PROBE_DEFAULT_MAX_RECV_SIZE, + .data_width = sample_width, + .clk_src = PARLIO_CLK_SRC_DEFAULT, + .ext_clk_freq_hz = 0, // Use the internal clock, no external clock needed + .clk_in_gpio_num = GPIO_NUM_NC, // Use the internal clock, no external clock input gpio needed + .exp_clk_freq_hz = sample_rate_hz, // Set expected clock frequency (i.e., sample rate) + .clk_out_gpio_num = GPIO_NUM_NC, // Use the internal clock for sampling and does not need to output + .valid_gpio_num = GPIO_NUM_NC, // Does not need valid gpio, all data gpio are used as sampling channel + .flags = { + .clk_gate_en = false, + .io_loop_back = true, + .io_no_init = true, + } + }; + memcpy(parlio_rx_cfg.data_gpio_nums, config->probe_gpio, PARLIO_RX_UNIT_MAX_DATA_WIDTH * sizeof(gpio_num_t)); + ESP_GOTO_ON_ERROR(parlio_new_rx_unit(&parlio_rx_cfg, &s_ephi->rx_unit), err, TAG, "Failed to allocate the parlio rx unit"); + + // Allocate the software delimiter + parlio_rx_soft_delimiter_config_t sft_deli_cfg = { + .sample_edge = PARLIO_SAMPLE_EDGE_POS, + .eof_data_len = 0xFFFF > ESP_PROBE_DEFAULT_MAX_RECV_SIZE ? ESP_PROBE_DEFAULT_MAX_RECV_SIZE : 0xFFFF, + .timeout_ticks = 0, + }; + ESP_GOTO_ON_ERROR(parlio_new_rx_soft_delimiter(&sft_deli_cfg, &s_ephi->deli), err, TAG, "Failed to allocate the delimiter"); + + // Register the data receive callback + parlio_rx_event_callbacks_t cbs = { + .on_partial_receive = s_esp_probe_on_recv_callback, + }; + ESP_GOTO_ON_ERROR(parlio_rx_unit_register_event_callbacks(s_ephi->rx_unit, &cbs, handle), err, TAG, "Failed to register the receive callback"); + + return ESP_OK; +err: + esp_probe_priv_deinit_hardware(handle); + return ret; +} + +esp_err_t esp_probe_priv_deinit_hardware(esp_probe_handle_t handle) +{ + (void)handle; + if (s_ephi) { + if (s_ephi->deli) { + ESP_RETURN_ON_ERROR(parlio_del_rx_delimiter(s_ephi->deli), TAG, "Failed to delete the parlio rx delimiter"); + s_ephi->deli = NULL; + } + if (s_ephi->rx_unit) { + ESP_RETURN_ON_ERROR(parlio_del_rx_unit(s_ephi->rx_unit), TAG, "Failed to delete the parlio rx unit"); + s_ephi->rx_unit = NULL; + } + if (s_ephi->payload) { + free(s_ephi->payload); + s_ephi->payload = NULL; + } + free(s_ephi); + s_ephi = NULL; + } + return ESP_OK; +} + +esp_err_t esp_probe_priv_enable_hardware(esp_probe_handle_t handle) +{ + (void)handle; + ESP_RETURN_ON_ERROR(parlio_rx_unit_enable(s_ephi->rx_unit, true), TAG, "Failed to enable the parlio rx unit"); + ESP_RETURN_ON_ERROR(parlio_rx_soft_delimiter_start_stop(s_ephi->rx_unit, s_ephi->deli, true), TAG, "Failed to start the soft delimiter"); + parlio_receive_config_t recv_cfg = { + .delimiter = s_ephi->deli, + .flags.partial_rx_en = true, // Infinite receiving, use callback to get received data + }; + ESP_RETURN_ON_ERROR(parlio_rx_unit_receive(s_ephi->rx_unit, s_ephi->payload, ESP_PROBE_DEFAULT_MAX_RECV_SIZE, &recv_cfg), TAG, "Failed to receive data"); + return ESP_OK; +} + +esp_err_t esp_probe_priv_disable_hardware(esp_probe_handle_t handle) +{ + (void)handle; + ESP_RETURN_ON_ERROR(parlio_rx_soft_delimiter_start_stop(s_ephi->rx_unit, s_ephi->deli, false), TAG, "Failed to stop the soft delimiter"); + ESP_RETURN_ON_ERROR(parlio_rx_unit_disable(s_ephi->rx_unit), TAG, "Failed to disable the parlio rx unit"); + return ESP_OK; +} diff --git a/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/include/esp_probe.h b/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/include/esp_probe.h new file mode 100644 index 0000000000..a6cec6f98f --- /dev/null +++ b/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/include/esp_probe.h @@ -0,0 +1,147 @@ +/* + * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include +#include "driver/parlio_rx.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ESP_PROBE_MAX_CHANNEL_NUM 16 /*!< Max supported probe channel number. + Note that not all targets can reach the max channel, for example, ESP32-H2 has only 8 channels */ +#define ESP_PROBE_MAX_SAMPLE_RATE 0 /*!< The maximum sample rates are different among different targets, + Set 0 to adopt the maximum sample rate of the current target */ + +/** + * @brief ESP Probe stream mode default configuration + * @note The stream mode relies heavily on the bandwidth of the output stream + * Stream mode can only achieve a relatively low sample rate to guarantee no samples are dropped, + * But it can keep sampling continuously for a long time + */ +#define ESP_PROBE_DEFAULT_STREAM_CONFIG(rate_hz) { \ + .sample_rate_hz = rate_hz, \ + .dump_task_priority = 6, \ + .storage_depth_kb = 0, \ + .max_dump_size_kb = 0, \ + .probe_gpio = { \ + [0 ... ESP_PROBE_MAX_CHANNEL_NUM - 1] = -1, \ + }, \ +} + +/** + * @brief ESP Probe buffer mode default configuration + * @note The buffer mode will store the data onto heap storage first, + * and output all of them to the stream in once. + * @note The probe will stop if run out of the given storage on heap. + * So that to guarantee a reliable data storing during the sampling period. + * However, the disadvantage is that, the probing time is limited by the available heap size, + * the higher the sample rate is, the shorter time the sampling last. + */ +#define ESP_PROBE_DEFAULT_BUFFER_CONFIG(rate_hz, depth_kb) { \ + .sample_rate_hz = rate_hz, \ + .dump_task_priority = 6, \ + .storage_depth_kb = depth_kb, \ + .max_dump_size_kb = depth_kb, \ + .probe_gpio = { \ + [0 ... ESP_PROBE_MAX_CHANNEL_NUM - 1] = -1, \ + }, \ +} + +/** + * @brief ESP Probe buffer stream mode default configuration + * @note The buffer stream mode will store the data onto heap storage first, + * and output them to the stream every half of the storage + * @note Buffer stream mode means the probe will loop to use the given storage on heap. + * So that we can also sample the data continuously for a long time. + * However, while the data outputting rate can't catch the data producing rate, + * data will still be dropped. + * The difference comparing to the stream mode is that, it sends a larger block in every output, + * i.e., it can hold more reliable samples for a time + */ +#define ESP_PROBE_DEFAULT_BUFFER_STREAM_CONFIG(rate_hz, depth_kb) { \ + .sample_rate_hz = rate_hz, \ + .dump_task_priority = 6, \ + .storage_depth_kb = depth_kb, \ + .max_dump_size_kb = 0, \ + .probe_gpio = { \ + [0 ... ESP_PROBE_MAX_CHANNEL_NUM - 1] = -1, \ + }, \ +} + +typedef struct { + uint32_t sample_rate_hz; /*!< The sample rate of the probe, unit: Hz, set '0' to use the max sample rate */ + int probe_gpio[ESP_PROBE_MAX_CHANNEL_NUM]; /*!< The GPIO of each probe channel, please set '-1' for unused channels, + some targets like ESP32-H2 only support up to 8 channels */ + uint32_t storage_depth_kb; /*!< The max heap storage depth for probed data (unit: kilobytes). + 0: the probed data won't be stored but output in realtime, i.e. stream mode; + others: the probed data will be stored in a ping-pong buffer, + The ping-pong buffer will be flushed alternately, i.e. buffer mode. + ATTENTION: storage depth at lease be 8 KB, otherwise there is no difference with stream mode. */ + uint32_t max_dump_size_kb; /*!< The max dump size for the limited storage (like flash/ram) (unit: kilobytes), + The probe will stop if the dump data size reach this value. + set 0 for no dump size limitation (like dumping to the host via UART/USB/Network), + set equals to `storage_depth_kb` to guarantee no sample lost in a short time */ + uint32_t dump_task_priority; /*!< The priority of the dump task, which used for dumping the probed data via the out stream */ +} esp_probe_config_t; + +typedef struct esp_probe_t *esp_probe_handle_t; /*!< The handle of probe instance */ + +/** + * @brief Allocate a new probe instance + * + * @param[in] config The probe configuration + * @param[out] ret_handle The returned probe handle + * @return + * - ESP_OK Success to allocate the probe instance + * - ESP_NO_MEM No memory for probe instance + * - ESP_ERR_INVALID_ARG NULL pointer or invalid configuration + * - ESP_ERR_NOT_SUPPORTED Exceed the max supported channels + */ +esp_err_t esp_new_probe(esp_probe_config_t *config, esp_probe_handle_t* ret_handle); + +/** + * @brief Delete the probe instance + * + * @param[in] handle The probe handle + * @return + * - ESP_OK Success to delete the probe instance + * - ESP_ERR_INVALID_ARG NULL pointer + * - ESP_ERR_INVALID_STATE The probe has not stopped yet + */ +esp_err_t esp_del_probe(esp_probe_handle_t handle); + +/** + * @brief Start sampling on the probe channels + * + * @param[in] handle The probe handle + * @param[in] out_stream The output stream for the VCD data, set NULL will use 'stdout' by default + * @return + * - ESP_OK Success to start the sampling on the probe channels + * - ESP_ERR_INVALID_ARG NULL pointer + * - ESP_ERR_INVALID_STATE The probe has already started + */ +esp_err_t esp_probe_start(esp_probe_handle_t handle, FILE *out_stream); + +/** + * @brief Stop sampling on the probe channels + * @note If the 'esp_probe_config_t::storage_depth_kb' is set (i.e. buffer mode), + * The data in the buffer will be popped to the out stream after this function is called + * @note This function is + * + * @param[in] handle The probe handle + * @param[out] dump_data_size The dumped data size, can be NULL if not needed + * @return + * - ESP_OK Success to stop the sampling on the probe channels + * - Others Failed to stop the sampling + */ +esp_err_t esp_probe_stop(esp_probe_handle_t handle, uint32_t *dump_data_size); + +#ifdef __cplusplus +} +#endif diff --git a/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/include/esp_probe_streams.h b/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/include/esp_probe_streams.h new file mode 100644 index 0000000000..e92b7fe185 --- /dev/null +++ b/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/include/esp_probe_streams.h @@ -0,0 +1,74 @@ +/* + * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include +#include +#include "soc/soc_caps.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if SOC_WIFI_SUPPORTED || SOC_EMAC_SUPPORTED +/** + * @brief Open the output stream to the host via TCP + * + * @param[in] host_ip The host IP address + * @param[in] port The host port + * @return + * - The the output stream pointer + */ +FILE* esp_probe_open_tcp_stream(const char *host_ip, int port); + +/** + * @brief Close the output stream to the host + * + * @param[in] f The the output stream pointer + */ +void esp_probe_close_tcp_stream(FILE *f); +#endif // SOC_WIFI_SUPPORTED || SOC_EMAC_SUPPORTED + +/** + * @brief Initialize the FAT partition in SPIFlash + * + * @param[in] mount_point The mount point + * @param[in] partition_label The label of the partition that used for saving the raw probed data + * @param[out] size The size of this partition, can be NULL if not needed + * @return + * - ESP_ERR_NOT_FOUND: Not found the FAT partition with this label + * - ESP_OK: Initialize FAT partition success + * - others: Initialize failed due to other reasons + */ +esp_err_t esp_probe_init_spiflash_fatfs(const char *mount_point, const char *partition_label, uint32_t *size); + +/** + * @brief Deinitialize the FAT partition in SPIFlash + * + * @param[in] mount_point The mount point + */ +void esp_probe_deinit_spiflash_fatfs(const char *mount_point); + +/** + * @brief Open the output stream to the FAT partition in flash + * + * @param[in] file_path The file path to open + * @return + * - The the output stream pointer + */ +FILE* esp_probe_open_file_stream(const char *file_path); + +/** + * @brief Close the output stream to the FAT partition in flash + * + * @param[in] f The the output stream pointer + */ +void esp_probe_close_file_stream(FILE *f); + +#ifdef __cplusplus +} +#endif diff --git a/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/stream/file_stream.c b/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/stream/file_stream.c new file mode 100644 index 0000000000..8f46022e60 --- /dev/null +++ b/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/stream/file_stream.c @@ -0,0 +1,31 @@ +/* + * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include "esp_check.h" + +const static char *TAG = "file_stream"; + +FILE* esp_probe_open_file_stream(const char *file_path) +{ + esp_err_t ret = ESP_FAIL; + // Create new raw data file + FILE *f = fopen(file_path, "wb"); + ESP_GOTO_ON_FALSE(f, ESP_FAIL, err, TAG, "Failed to open file, error %s", strerror(errno)); + ESP_LOGI(TAG, "Stream opened"); + + return f; +err: + ESP_LOGE(TAG, "Open Flash stream failed with error code %s", esp_err_to_name(ret)); + return NULL; +} + +void esp_probe_close_file_stream(FILE *f) +{ + fclose(f); +} diff --git a/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/stream/flash_fatfs.c b/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/stream/flash_fatfs.c new file mode 100644 index 0000000000..7805a219f3 --- /dev/null +++ b/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/stream/flash_fatfs.c @@ -0,0 +1,41 @@ +/* + * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "esp_vfs_fat.h" +#include "esp_partition.h" +#include "esp_check.h" + +static const char *TAG = "flash_fat"; + +static wl_handle_t s_wlh = WL_INVALID_HANDLE; + +esp_err_t esp_probe_init_spiflash_fatfs(const char *mount_point, const char *partition_label, uint32_t *size) +{ + // Get the partition info + const esp_partition_t *part = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, partition_label); + ESP_RETURN_ON_FALSE(part, ESP_ERR_NOT_FOUND, TAG, "Failed to find the partition with label %s", partition_label); + ESP_LOGI(TAG, "Probe data partition base addr: 0x%lx size: 0x%lx", part->address, part->size); + if (size) { + *size = (uint32_t)part->size; + } + + // Format and mount the partition of storage + esp_vfs_fat_mount_config_t mount_config = { + .max_files = 4, + .format_if_mount_failed = true, + .allocation_unit_size = CONFIG_WL_SECTOR_SIZE, + .disk_status_check_enable = false + }; + ESP_RETURN_ON_ERROR(esp_vfs_fat_spiflash_mount_rw_wl(mount_point, partition_label, &mount_config, &s_wlh), + TAG, "Failed to mount FATFS"); + ESP_LOGI(TAG, "flash FATFS mounted"); + return ESP_OK; +} + +void esp_probe_deinit_spiflash_fatfs(const char *mount_point) +{ + esp_vfs_fat_spiflash_unmount_rw_wl(mount_point, s_wlh); +} diff --git a/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/stream/tcp_stream.c b/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/stream/tcp_stream.c new file mode 100644 index 0000000000..a5d51fb91b --- /dev/null +++ b/examples/peripherals/parlio/parlio_rx/logic_analyzer/components/esp_probe/stream/tcp_stream.c @@ -0,0 +1,84 @@ +/* + * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "lwip/sockets.h" +#include "esp_check.h" + +#define EXAMPLE_ESP_MAXIMUM_RETRY 5 + +static const char *TAG = "tcp_stream"; + +static int s_tcp_client_connect(const char *host_ip, int port) +{ + int addr_family = 0; + int ip_protocol = 0; + + struct sockaddr_in dest_addr = {}; + dest_addr.sin_addr.s_addr = inet_addr(host_ip); + dest_addr.sin_family = AF_INET; + dest_addr.sin_port = htons(port); + addr_family = AF_INET; + ip_protocol = IPPROTO_IP; + + int sock = socket(addr_family, SOCK_STREAM, ip_protocol); + if (sock < 0) { + ESP_LOGE(TAG, "Unable to create socket: errno %d", errno); + goto _exit; + } + ESP_LOGI(TAG, "Socket created, connecting to %s:%d", host_ip, port); + + int err = connect(sock, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr_in6)); + if (err != 0) { + ESP_LOGE(TAG, "Socket unable to connect: errno %d", errno); + goto _exit; + } + ESP_LOGI(TAG, "Successfully connected"); + return sock; +_exit: + if (sock > 1) { + close(sock); + } + return -1; +} + +FILE* esp_probe_open_tcp_stream(const char *host_ip, int port) +{ + esp_err_t ret = ESP_FAIL; + + // Create a TCP socket + int sock = s_tcp_client_connect(host_ip, port); + if (sock < 0) { + goto err; + } + // LWIP socket has been registered to the VFS, associate the TCP socket with the file descriptor for output stream + FILE *f = fdopen(sock, "wb"); + ESP_GOTO_ON_FALSE(f, ESP_FAIL, err, TAG, "open tcp stream failed, error %s", strerror(errno)); + return f; + +err: + ESP_LOGE(TAG, "Open TCP stream failed with error code %s", esp_err_to_name(ret)); + return NULL; +} + +void esp_probe_close_tcp_stream(FILE *f) +{ + // Get the socket by the file descriptor + int sock = fileno(f); + // Close the file stream + fclose(f); + // Shutdown explicitly to inform the server no further data will be sent + shutdown(sock, SHUT_RDWR); + // Close the socket + close(sock); + ESP_LOGI(TAG, "TCP stream closed"); +} diff --git a/examples/peripherals/parlio/parlio_rx/logic_analyzer/img/gpio_sig.jpeg b/examples/peripherals/parlio/parlio_rx/logic_analyzer/img/gpio_sig.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..c02c745b4cc508200cb4452a3915953f6b0da9aa GIT binary patch literal 95055 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࿝RBHOdmgrxuSl%}6VMKz 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

hvra)B#2=(?#% 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∋;o(izTB7soZ4NGNav<{e;Uo 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 literal 0 HcmV?d00001 diff --git a/examples/peripherals/parlio/parlio_rx/logic_analyzer/img/pulseview.jpeg b/examples/peripherals/parlio/parlio_rx/logic_analyzer/img/pulseview.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..a066a63e60bc78488d7f993f0b58342a13b1ced8 GIT binary patch literal 54021 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 TA$kGotubuXbuV-D*Vz97Iq4s) literal 0 HcmV?d00001 diff --git a/examples/peripherals/parlio/parlio_rx/logic_analyzer/main/CMakeLists.txt b/examples/peripherals/parlio/parlio_rx/logic_analyzer/main/CMakeLists.txt new file mode 100644 index 0000000000..81a37c3a1f --- /dev/null +++ b/examples/peripherals/parlio/parlio_rx/logic_analyzer/main/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRCS "logic_analyzer_example_main.c" + PRIV_REQUIRES esp_probe driver nvs_flash esp_netif protocol_examples_common + INCLUDE_DIRS ".") diff --git a/examples/peripherals/parlio/parlio_rx/logic_analyzer/main/Kconfig.projbuild b/examples/peripherals/parlio/parlio_rx/logic_analyzer/main/Kconfig.projbuild new file mode 100644 index 0000000000..de589fd111 --- /dev/null +++ b/examples/peripherals/parlio/parlio_rx/logic_analyzer/main/Kconfig.projbuild @@ -0,0 +1,39 @@ +menu "ESP probe configurations" + + choice EXAMPLE_SIGNAL_SRC + prompt "Select signal source" + default EXAMPLE_INTERNAL_SIGNAL + config EXAMPLE_INTERNAL_SIGNAL + bool "Probing the internal signals" + config EXAMPLE_EXTERNAL_SIGNAL + bool "Probing the External signals" + endchoice + + choice EXAMPLE_STREAM + prompt "Select ESP probe dump stream" + default EXAMPLE_FLASH_STREAM if !SOC_WIFI_SUPPORTED && !SOC_EMAC_SUPPORTED + default EXAMPLE_TCP_STREAM if SOC_WIFI_SUPPORTED || SOC_EMAC_SUPPORTED + help + Select the dump stream for the sampled data + config EXAMPLE_FLASH_STREAM + bool "Dump data into FLASH" + config EXAMPLE_TCP_STREAM + depends on SOC_WIFI_SUPPORTED || SOC_EMAC_SUPPORTED + bool "Dump data to the host using TCP" + endchoice + + config EXAMPLE_HOST_IP_ADDR + depends on EXAMPLE_TCP_STREAM + default "192.168.1.100" + string "TCP server IP address" + config EXAMPLE_HOST_PORT + depends on EXAMPLE_TCP_STREAM + default 8888 + int "TCP server port" + + config EXAMPLE_PARTITION_LABEL + depends on EXAMPLE_FLASH_STREAM + default "storage" + string "The label of the data storage partition" + +endmenu diff --git a/examples/peripherals/parlio/parlio_rx/logic_analyzer/main/idf_component.yml b/examples/peripherals/parlio/parlio_rx/logic_analyzer/main/idf_component.yml new file mode 100644 index 0000000000..718194867b --- /dev/null +++ b/examples/peripherals/parlio/parlio_rx/logic_analyzer/main/idf_component.yml @@ -0,0 +1,3 @@ +dependencies: + protocol_examples_common: + path: ${IDF_PATH}/examples/common_components/protocol_examples_common diff --git a/examples/peripherals/parlio/parlio_rx/logic_analyzer/main/logic_analyzer_example_main.c b/examples/peripherals/parlio/parlio_rx/logic_analyzer/main/logic_analyzer_example_main.c new file mode 100644 index 0000000000..4f86027739 --- /dev/null +++ b/examples/peripherals/parlio/parlio_rx/logic_analyzer/main/logic_analyzer_example_main.c @@ -0,0 +1,132 @@ +/* + * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: CC0-1.0 + */ + +#include +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "driver/gpio.h" +#include "esp_check.h" +#include "esp_probe.h" +#include "esp_probe_streams.h" + +// Alias of the Kconfig options +#if CONFIG_EXAMPLE_TCP_STREAM +#include "nvs_flash.h" +#include "protocol_examples_common.h" +#include "esp_event.h" + +#define EXAMPLE_HOST_IP_ADDR CONFIG_EXAMPLE_HOST_IP_ADDR // Host IP (string) +#define EXAMPLE_HOST_PORT CONFIG_EXAMPLE_HOST_PORT // Host port (int) +#elif CONFIG_EXAMPLE_FLASH_STREAM +#define EXAMPLE_MOUNT_POINT "/esp_probe" +#define EXAMPLE_DATA_FILE_PATH EXAMPLE_MOUNT_POINT"/probe_raw.dat" +#define EXAMPLE_PARTITION_LABEL CONFIG_EXAMPLE_PARTITION_LABEL // Flash partition label (string, see 'partitions.csv') +#endif + +#define EXAMPLE_SAMPLE_RATE_HZ (8 * 1000 * 1000) +#define EXAMPLE_STORAGE_DEPTH_KB 128 + +// GPIOs to probe +const static int s_probe_gpio[] = {2, 3, 4, 5}; +const static char *TAG = "example"; +static esp_probe_handle_t s_probe = NULL; + +#if CONFIG_EXAMPLE_INTERNAL_SIGNAL +void example_init_gpio_to_generate_internal_signal(void) +{ + gpio_config_t gpio_cfg = { + .pin_bit_mask = BIT(s_probe_gpio[0]) | + BIT(s_probe_gpio[1]) | + BIT(s_probe_gpio[2]) | + BIT(s_probe_gpio[3]), + .mode = GPIO_MODE_INPUT_OUTPUT, + }; + gpio_config(&gpio_cfg); +} +#endif + +void example_probe_function(void) +{ +#if CONFIG_EXAMPLE_INTERNAL_SIGNAL + // Simulate the internal signals + // Pulses might not spread averagely because the thread might be interrupted + for (int cnt = 0; cnt < 100; cnt++) { + for (int i = 0; i < 4; i++) { + gpio_set_level(s_probe_gpio[i], cnt & BIT(i)); + } + vTaskDelay(pdMS_TO_TICKS(1)); + } +#else // CONFIG_EXAMPLE_EXTERNAL_SIGNAL + // Probing the external signal here + vTaskDelay(pdMS_TO_TICKS(100)); +#endif // CONFIG_EXAMPLE_INTERNAL_SIGNAL +} + +FILE *example_probe_init(void) +{ + FILE *f = NULL; + // Create dump stream +#if CONFIG_EXAMPLE_TCP_STREAM + ESP_ERROR_CHECK(nvs_flash_init()); + ESP_ERROR_CHECK(esp_netif_init()); + ESP_ERROR_CHECK(esp_event_loop_create_default()); + ESP_ERROR_CHECK(example_connect()); + f = esp_probe_open_tcp_stream(EXAMPLE_HOST_IP_ADDR, EXAMPLE_HOST_PORT); +#elif CONFIG_EXAMPLE_FLASH_STREAM + ESP_ERROR_CHECK(esp_probe_init_spiflash_fatfs(EXAMPLE_MOUNT_POINT, EXAMPLE_PARTITION_LABEL, NULL)); + f = esp_probe_open_file_stream(EXAMPLE_DATA_FILE_PATH); +#endif + assert(f); + + // Configure and allocate the ESP probe + esp_probe_config_t config = ESP_PROBE_DEFAULT_BUFFER_CONFIG(EXAMPLE_SAMPLE_RATE_HZ, EXAMPLE_STORAGE_DEPTH_KB); + // Set the GPIOs to be probed + memcpy(&config.probe_gpio, &s_probe_gpio, sizeof(s_probe_gpio)); + ESP_ERROR_CHECK(esp_new_probe(&config, &s_probe)); + return f; +} + +void example_probe_signals(FILE *f, void (*probe_func)(void)) +{ + uint32_t dump_data_size = 0; + // Probe the signals during the function, the data will be dumped via the out stream + ESP_ERROR_CHECK(esp_probe_start(s_probe, f)); + probe_func(); + ESP_ERROR_CHECK(esp_probe_stop(s_probe, &dump_data_size)); + ESP_LOGI(TAG, "Probe finished! %"PRIu32" (0x%"PRIx32") bytes dumped\n", dump_data_size, dump_data_size); +} + +void example_probe_deinit(FILE *f) +{ + // Delete the probe instance and free the resources + ESP_ERROR_CHECK(esp_del_probe(s_probe)); + s_probe = NULL; + + // Close the output stream +#if CONFIG_EXAMPLE_TCP_STREAM + esp_probe_close_tcp_stream(f); + example_disconnect(); +#elif CONFIG_EXAMPLE_FLASH_STREAM + esp_probe_close_file_stream(f); + esp_probe_deinit_spiflash_fatfs(EXAMPLE_PARTITION_LABEL); +#endif +} + +void app_main(void) +{ +#if CONFIG_EXAMPLE_INTERNAL_SIGNAL + // If choose to probe the internal signals via IO MUX, init GPIOs for simulating the internal signals + example_init_gpio_to_generate_internal_signal(); +#endif + // Initialize the probe, the probe needs an output stream to dump the raw data + FILE *f = example_probe_init(); + // Use the probe as decorator, probe the signals that generated during this function + example_probe_signals(f, example_probe_function); + // Deinitialize the probe, close the output stream + example_probe_deinit(f); +} diff --git a/examples/peripherals/parlio/parlio_rx/logic_analyzer/partitions.csv b/examples/peripherals/parlio/parlio_rx/logic_analyzer/partitions.csv new file mode 100644 index 0000000000..f8c91a89ce --- /dev/null +++ b/examples/peripherals/parlio/parlio_rx/logic_analyzer/partitions.csv @@ -0,0 +1,5 @@ +# Name, Type, SubType, Offset, Size, Flags +# Note: if you have increased the bootloader size, make sure to update the offsets to avoid overlap +nvs, data, nvs, 0x9000, 0x6000, +factory, 0, 0, 0x10000, 1M, +storage, data, fat, , 528K, diff --git a/examples/peripherals/parlio/parlio_rx/logic_analyzer/sdkconfig.defaults b/examples/peripherals/parlio/parlio_rx/logic_analyzer/sdkconfig.defaults new file mode 100644 index 0000000000..c9861483a4 --- /dev/null +++ b/examples/peripherals/parlio/parlio_rx/logic_analyzer/sdkconfig.defaults @@ -0,0 +1,6 @@ +CONFIG_ESP_TASK_WDT_EN=n +CONFIG_FREERTOS_HZ=1000 +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_FATFS_LFN_STACK=y +CONFIG_VFS_SUPPORT_IO=y diff --git a/examples/peripherals/parlio/simple_rgb_led_matrix/CMakeLists.txt b/examples/peripherals/parlio/parlio_tx/simple_rgb_led_matrix/CMakeLists.txt similarity index 100% rename from examples/peripherals/parlio/simple_rgb_led_matrix/CMakeLists.txt rename to examples/peripherals/parlio/parlio_tx/simple_rgb_led_matrix/CMakeLists.txt diff --git a/examples/peripherals/parlio/simple_rgb_led_matrix/README.md b/examples/peripherals/parlio/parlio_tx/simple_rgb_led_matrix/README.md similarity index 100% rename from examples/peripherals/parlio/simple_rgb_led_matrix/README.md rename to examples/peripherals/parlio/parlio_tx/simple_rgb_led_matrix/README.md diff --git a/examples/peripherals/parlio/simple_rgb_led_matrix/main/CMakeLists.txt b/examples/peripherals/parlio/parlio_tx/simple_rgb_led_matrix/main/CMakeLists.txt similarity index 100% rename from examples/peripherals/parlio/simple_rgb_led_matrix/main/CMakeLists.txt rename to examples/peripherals/parlio/parlio_tx/simple_rgb_led_matrix/main/CMakeLists.txt diff --git a/examples/peripherals/parlio/simple_rgb_led_matrix/main/idf_component.yml b/examples/peripherals/parlio/parlio_tx/simple_rgb_led_matrix/main/idf_component.yml similarity index 100% rename from examples/peripherals/parlio/simple_rgb_led_matrix/main/idf_component.yml rename to examples/peripherals/parlio/parlio_tx/simple_rgb_led_matrix/main/idf_component.yml diff --git a/examples/peripherals/parlio/simple_rgb_led_matrix/main/lvgl_demo_ui.c b/examples/peripherals/parlio/parlio_tx/simple_rgb_led_matrix/main/lvgl_demo_ui.c similarity index 100% rename from examples/peripherals/parlio/simple_rgb_led_matrix/main/lvgl_demo_ui.c rename to examples/peripherals/parlio/parlio_tx/simple_rgb_led_matrix/main/lvgl_demo_ui.c diff --git a/examples/peripherals/parlio/simple_rgb_led_matrix/main/rgb_led_matrix_example_main.c b/examples/peripherals/parlio/parlio_tx/simple_rgb_led_matrix/main/rgb_led_matrix_example_main.c similarity index 100% rename from examples/peripherals/parlio/simple_rgb_led_matrix/main/rgb_led_matrix_example_main.c rename to examples/peripherals/parlio/parlio_tx/simple_rgb_led_matrix/main/rgb_led_matrix_example_main.c diff --git a/examples/peripherals/parlio/simple_rgb_led_matrix/pytest_simple_rgb_led_matrix.py b/examples/peripherals/parlio/parlio_tx/simple_rgb_led_matrix/pytest_simple_rgb_led_matrix.py similarity index 100% rename from examples/peripherals/parlio/simple_rgb_led_matrix/pytest_simple_rgb_led_matrix.py rename to examples/peripherals/parlio/parlio_tx/simple_rgb_led_matrix/pytest_simple_rgb_led_matrix.py diff --git a/examples/peripherals/parlio/simple_rgb_led_matrix/sdkconfig.defaults b/examples/peripherals/parlio/parlio_tx/simple_rgb_led_matrix/sdkconfig.defaults similarity index 100% rename from examples/peripherals/parlio/simple_rgb_led_matrix/sdkconfig.defaults rename to examples/peripherals/parlio/parlio_tx/simple_rgb_led_matrix/sdkconfig.defaults