From 782b6a4010b0177415b93ff4ea8c98265165cf30 Mon Sep 17 00:00:00 2001 From: Valentin Roland Date: Sun, 11 Feb 2024 17:04:20 +0100 Subject: [PATCH] fix re-initialization for v6 board --- src/board/epd_board_v6.c | 6 +++++- src/output_i2s/i2s_data_bus.c | 2 ++ src/output_i2s/render_i2s.c | 1 + src/output_i2s/rmt_pulse.c | 7 +++++++ src/output_i2s/rmt_pulse.h | 7 +++++++ test/test_initialization.c | 22 ++++++++++++---------- 6 files changed, 34 insertions(+), 11 deletions(-) diff --git a/src/board/epd_board_v6.c b/src/board/epd_board_v6.c index 643c788a..39789228 100644 --- a/src/board/epd_board_v6.c +++ b/src/board/epd_board_v6.c @@ -1,3 +1,4 @@ +#include "driver/gpio.h" #include "epd_board.h" #include @@ -144,8 +145,11 @@ static void epd_board_deinit() { vTaskDelay(500); pca9555_read_input(config_reg.port, 0); pca9555_read_input(config_reg.port, 1); - ESP_LOGI("epdiy", "going to sleep."); i2c_driver_delete(EPDIY_I2C_PORT); + gpio_isr_handler_remove(CFG_INTR); + gpio_uninstall_isr_service(); + gpio_reset_pin(CFG_INTR); + gpio_reset_pin(V4_LATCH_ENABLE); } static void epd_board_set_ctrl(epd_ctrl_state_t *state, const epd_ctrl_state_t * const mask) { diff --git a/src/output_i2s/i2s_data_bus.c b/src/output_i2s/i2s_data_bus.c index 9768db7e..7d1ffd7f 100644 --- a/src/output_i2s/i2s_data_bus.c +++ b/src/output_i2s/i2s_data_bus.c @@ -1,5 +1,6 @@ #include "i2s_data_bus.h" +#include "esp_intr_alloc.h" #include "sdkconfig.h" // the I2S driver is based on ESP32 registers and won't compile on the S3 @@ -301,6 +302,7 @@ void i2s_bus_init(i2s_bus_config *cfg, uint32_t epd_row_width) { } void i2s_bus_deinit() { + esp_intr_disable(gI2S_intr_handle); esp_intr_free(gI2S_intr_handle); free(i2s_state.buf_a); diff --git a/src/output_i2s/render_i2s.c b/src/output_i2s/render_i2s.c index 77b5f77e..0258f33f 100644 --- a/src/output_i2s/render_i2s.c +++ b/src/output_i2s/render_i2s.c @@ -391,6 +391,7 @@ void IRAM_ATTR i2s_fetch_frame_data(RenderContext_t *ctx, int thread_id) { } void i2s_deinit() { + rmt_pulse_deinit(); i2s_bus_deinit(); } diff --git a/src/output_i2s/rmt_pulse.c b/src/output_i2s/rmt_pulse.c index 92a5d40b..dfde274c 100644 --- a/src/output_i2s/rmt_pulse.c +++ b/src/output_i2s/rmt_pulse.c @@ -1,4 +1,5 @@ #include "../output_common/render_method.h" +#include "esp_intr_alloc.h" #ifdef RENDER_METHOD_I2S @@ -60,6 +61,12 @@ void rmt_pulse_init(gpio_num_t pin) { rmt_set_tx_intr_en(row_rmt_config.channel, true); } + +void rmt_pulse_deinit() { + esp_intr_disable(gRMT_intr_handle); + esp_intr_free(gRMT_intr_handle); +} + void IRAM_ATTR pulse_ckv_ticks(uint16_t high_time_ticks, uint16_t low_time_ticks, bool wait) { while (!rmt_tx_done) { diff --git a/src/output_i2s/rmt_pulse.h b/src/output_i2s/rmt_pulse.h index 300159ed..8fda6b7a 100644 --- a/src/output_i2s/rmt_pulse.h +++ b/src/output_i2s/rmt_pulse.h @@ -13,6 +13,12 @@ */ void rmt_pulse_init(gpio_num_t pin); + +/** +* Resets the pin and RMT peripheral, frees associated resources. +*/ +void rmt_pulse_deinit(); + /** * Outputs a single pulse (high -> low) on the configured pin. * This function will always wait for a previous call to finish. @@ -38,3 +44,4 @@ bool rmt_busy(); */ void pulse_ckv_ticks(uint16_t high_time_us, uint16_t low_time_us, bool wait); + diff --git a/test/test_initialization.c b/test/test_initialization.c index b66a381b..24728684 100644 --- a/test/test_initialization.c +++ b/test/test_initialization.c @@ -6,15 +6,17 @@ #include "epdiy.h" #include "epd_display.h" -TEST_CASE("Mean of an empty array is zero", "[mean]") -{ - const int values[] = { 0 }; - TEST_ASSERT_EQUAL(1, 1); -} -TEST_CASE("V7 initialization and deinitialization works", "[epdiy]") +// choose the default demo board depending on the architecture +#ifdef CONFIG_IDF_TARGET_ESP32 +#define TEST_BOARD epd_board_v6 +#elif defined(CONFIG_IDF_TARGET_ESP32S3) +#define TEST_BOARD epd_board_v7 +#endif + +TEST_CASE("initialization and deinitialization works", "[epdiy]") { - epd_init(&epd_board_v7, &ED097TC2, EPD_OPTIONS_DEFAULT); + epd_init(&TEST_BOARD, &ED097TC2, EPD_OPTIONS_DEFAULT); epd_poweron(); vTaskDelay(2); @@ -23,9 +25,9 @@ TEST_CASE("V7 initialization and deinitialization works", "[epdiy]") epd_deinit(); } -TEST_CASE("V7 re-initialization works", "[epdiy]") +TEST_CASE("re-initialization works", "[epdiy]") { - epd_init(&epd_board_v7, &ED097TC2, EPD_OPTIONS_DEFAULT); + epd_init(&TEST_BOARD, &ED097TC2, EPD_OPTIONS_DEFAULT); epd_poweron(); vTaskDelay(2); @@ -33,7 +35,7 @@ TEST_CASE("V7 re-initialization works", "[epdiy]") epd_deinit(); - epd_init(&epd_board_v7, &ED097TC2, EPD_OPTIONS_DEFAULT); + epd_init(&TEST_BOARD, &ED097TC2, EPD_OPTIONS_DEFAULT); epd_poweron(); vTaskDelay(2);