From d8dcdf7eec34c594d96c150fba51c62c10cdc856 Mon Sep 17 00:00:00 2001 From: Valentin Roland Date: Tue, 30 Apr 2024 21:16:49 +0200 Subject: [PATCH 01/15] update clang format config --- .clang-format-ignore | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .clang-format-ignore diff --git a/.clang-format-ignore b/.clang-format-ignore new file mode 100644 index 00000000..b9b8b27b --- /dev/null +++ b/.clang-format-ignore @@ -0,0 +1,3 @@ +src/waveforms/* +ED*.h +ES*.h From 549cf9d464c7504ac454c5911251b744789939f4 Mon Sep 17 00:00:00 2001 From: Valentin Roland Date: Tue, 30 Apr 2024 22:55:17 +0200 Subject: [PATCH 02/15] clangfmt reformatting --- .clang-format-ignore | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 .clang-format-ignore diff --git a/.clang-format-ignore b/.clang-format-ignore deleted file mode 100644 index b9b8b27b..00000000 --- a/.clang-format-ignore +++ /dev/null @@ -1,3 +0,0 @@ -src/waveforms/* -ED*.h -ES*.h From 751b51bba8c5dfcc8040c45a27cf45c99ead1cd6 Mon Sep 17 00:00:00 2001 From: Valentin Roland Date: Mon, 10 Jun 2024 00:25:42 +0200 Subject: [PATCH 03/15] clean up lut.c, fix 2bpp order on LCD --- CMakeLists.txt | 1 + src/diff.S | 4 +- src/output_common/lut.S | 4 +- src/output_common/lut.c | 163 +++++++++++++---------------- src/output_common/lut.h | 101 ++++-------------- src/output_common/render_context.c | 39 +------ src/output_common/render_context.h | 13 ++- src/output_common/render_method.c | 10 ++ src/output_common/render_method.h | 15 +++ src/output_i2s/render_i2s.c | 4 +- src/output_lcd/render_lcd.c | 9 +- src/render.c | 8 ++ test/test_lut.c | 84 ++++++++++----- 13 files changed, 200 insertions(+), 255 deletions(-) create mode 100644 src/output_common/render_method.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 053177ae..8c30b033 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,6 +10,7 @@ set(app_sources "src/epdiy.c" "src/output_common/lut.S" "src/output_common/line_queue.c" "src/output_common/render_context.c" + "src/output_common/render_method.c" "src/font.c" "src/displays.c" "src/diff.S" diff --git a/src/diff.S b/src/diff.S index ab71794e..1210049d 100644 --- a/src/diff.S +++ b/src/diff.S @@ -1,8 +1,8 @@ #include #include -#include "output_common/render_method.h" +#include "sdkconfig.h" -#ifdef RENDER_METHOD_LCD +#ifdef CONFIG_IDF_TARGET_ESP32S3 .text .align 4 diff --git a/src/output_common/lut.S b/src/output_common/lut.S index fd6af856..3bbbaaa7 100644 --- a/src/output_common/lut.S +++ b/src/output_common/lut.S @@ -1,8 +1,8 @@ #include #include -#include "render_method.h" +#include "sdkconfig.h" -#ifdef RENDER_METHOD_LCD +#ifdef CONFIG_IDF_TARGET_ESP32S3 .text .align 4 diff --git a/src/output_common/lut.c b/src/output_common/lut.c index 5d470ef4..9cb9d47d 100644 --- a/src/output_common/lut.c +++ b/src/output_common/lut.c @@ -5,6 +5,7 @@ #include "render_method.h" #include +#include #include #include "esp_system.h" // for ESP_IDF_VERSION_VAL @@ -89,9 +90,6 @@ nibble_shift_buffer_right(uint8_t* buf, uint32_t len) { } } -///////////////////////////// Looking up EPD Pixels -////////////////////////////////// - __attribute__((optimize("O3"))) void IRAM_ATTR calc_epd_input_1bpp( const uint32_t* line_data, uint8_t* epd_input, const uint8_t* lut, uint32_t epd_width ) { @@ -122,8 +120,8 @@ __attribute__((optimize("O3"))) void IRAM_ATTR calc_epd_input_4bpp_lut_64k( uint16_t v4 = *(line_data_16++); #ifdef RENDER_METHOD_LCD - uint32_t pixel = conversion_lut[v1] << 16 | conversion_lut[v2] << 24 | conversion_lut[v3] - | conversion_lut[v4] << 8; + uint32_t pixel = conversion_lut[v1] | conversion_lut[v2] << 8 | conversion_lut[v3] << 16 + | conversion_lut[v4] << 24; #elif RENDER_METHOD_I2S uint32_t pixel = conversion_lut[v4]; pixel = pixel << 8; @@ -159,6 +157,15 @@ void IRAM_ATTR calc_epd_input_1ppB_1k_S3_VE_aligned( const uint32_t* ld, uint8_t* epd_input, const uint8_t* conversion_lut, uint32_t epd_width ); +#ifdef RENDER_METHOD_I2S +void calc_epd_input_1ppB_1k_S3_VE_aligned( + const uint32_t* ld, uint8_t* epd_input, const uint8_t* conversion_lut, uint32_t epd_width +) { + // dummy implementation, should never be called. + abort(); +} +#endif + /** * Lookup accelerated by the S3 Vector Extensions. * Uses a 1K padded LUT (each entry takes up 32 bits) @@ -288,7 +295,7 @@ __attribute__((optimize("O3"))) void IRAM_ATTR calc_epd_input_4bpp_1k_lut_black( * Unpack the waveform data into a lookup table, with bit shifted copies. */ __attribute__((optimize("O3"))) static void IRAM_ATTR -waveform_lut(uint8_t* lut, const EpdWaveformPhases* phases, int frame) { +build_2ppB_lut_1k(uint8_t* lut, const EpdWaveformPhases* phases, int frame) { const uint8_t* p_lut = phases->luts + (16 * 4 * frame); for (uint8_t to = 0; to < 16; to++) { for (uint8_t from_packed = 0; from_packed < 4; from_packed++) { @@ -317,7 +324,7 @@ waveform_lut(uint8_t* lut, const EpdWaveformPhases* phases, int frame) { * 64k to loop up two bytes at once */ __attribute__((optimize("O3"))) static void IRAM_ATTR -waveform_lut_64k(uint8_t* lut, const EpdWaveformPhases* phases, int frame) { +build_1ppB_lut_64k(uint8_t* lut, const EpdWaveformPhases* phases, int frame) { const uint8_t* p_lut = phases->luts + (16 * 4 * frame); for (uint8_t to = 0; to < 16; to++) { for (uint8_t from_packed = 0; from_packed < 4; from_packed++) { @@ -349,7 +356,7 @@ waveform_lut_64k(uint8_t* lut, const EpdWaveformPhases* phases, int frame) { * A 32bit aligned lookup table for lookup using the ESP32-S3 vector extensions. */ __attribute__((optimize("O3"))) static void IRAM_ATTR -waveform_lut_S3_VE(uint8_t* lut, const EpdWaveformPhases* phases, int frame) { +build_1ppB_lut_S3_VE_1k(uint8_t* lut, const EpdWaveformPhases* phases, int frame) { uint32_t* lut32 = (uint32_t*)lut; const uint8_t* p_lut = phases->luts + (16 * 4 * frame); for (uint8_t to = 0; to < 16; to++) { @@ -369,8 +376,8 @@ waveform_lut_S3_VE(uint8_t* lut, const EpdWaveformPhases* phases, int frame) { * known, e.g. all white or all black. * This LUT is use to look up 4 pixels at once, as with the epdiy LUT. */ -__attribute__((optimize("O3"))) static void IRAM_ATTR -waveform_lut_static_from(uint8_t* lut, const EpdWaveformPhases* phases, uint8_t from, int frame) { +__attribute__((optimize("O3"))) static void +build_2ppB_lut_64k_static_from(uint8_t* lut, const EpdWaveformPhases* phases, uint8_t from, int frame) { const uint8_t* p_lut = phases->luts + (16 * 4 * frame); /// index into the packed "from" row @@ -409,99 +416,73 @@ waveform_lut_static_from(uint8_t* lut, const EpdWaveformPhases* phases, uint8_t } } -/** - * Set all pixels not in [xmin,xmax) to nop in the current line buffer. - */ -__attribute__((optimize("O3"))) void mask_line_buffer( - uint8_t* lb, int line_buf_len, int xmin, int xmax -) { -#ifdef RENDER_METHOD_I2S - const int offset_table[4] = { 2, 3, 0, 1 }; -#else - const int offset_table[4] = { 0, 1, 2, 3 }; -#endif - - // lower bound to where byte order is not an issue. - int memset_start = (xmin / 16) * 4; - int memset_end = min(((xmax + 15) / 16) * 4, line_buf_len); - - // memset the areas where order is not an issue - memset(lb, 0, memset_start); - memset(lb + memset_end, 0, line_buf_len - memset_end); - - // mask unused pixels at the start of the output interval - uint8_t line_start_mask = 0xFF << (2 * (xmin % 4)); - uint8_t line_end_mask = 0xFF >> (8 - 2 * (xmax % 4)); - - // number of full bytes to mask - int lower_full_bytes = max(0, (xmin / 4 - memset_start)); - int upper_full_bytes = max(0, (memset_end - ((xmax + 3) / 4))); - assert(lower_full_bytes <= 3); - assert(upper_full_bytes <= 3); - assert(memset_end >= 4); +static void build_2ppB_lut_64k_from_0(uint8_t* lut, const EpdWaveformPhases* phases, int frame) { + build_2ppB_lut_64k_static_from(lut, phases, 0, frame); +} - // mask full bytes - for (int i = 0; i < lower_full_bytes; i++) { - lb[memset_start + offset_table[i]] = 0x0; - } - for (int i = 0; i < upper_full_bytes; i++) { - lb[memset_end - 4 + offset_table[3 - i]] = 0x0; - } +static void build_2ppB_lut_64k_from_15(uint8_t* lut, const EpdWaveformPhases* phases, int frame) { + build_2ppB_lut_64k_static_from(lut, phases, 0xF, frame); +} - // mask partial bytes - if ((memset_start + lower_full_bytes) * 4 < xmin) { - lb[memset_start + offset_table[lower_full_bytes]] &= line_start_mask; - } - if ((memset_end - upper_full_bytes) * 4 > xmax) { - lb[memset_end - 4 + offset_table[3 - upper_full_bytes]] &= line_end_mask; - } +static void build_8ppB_lut_256b_from_15(uint8_t* lut, const EpdWaveformPhases* phases, int frame) { + memcpy(lut, lut_1bpp_black, sizeof(lut_1bpp_black)); } -__attribute__((optimize("O3"))) enum EpdDrawError IRAM_ATTR calculate_lut( - uint8_t* lut, int lut_size, enum EpdDrawMode mode, int frame, const EpdWaveformPhases* phases -) { - enum EpdDrawMode selected_mode = mode & 0x3F; -#ifdef RENDER_METHOD_LCD - if ((mode & MODE_PACKING_1PPB_DIFFERENCE) && !(mode & MODE_FORCE_NO_PIE)) { - waveform_lut_S3_VE(lut, phases, frame); - return EPD_DRAW_SUCCESS; - } -#endif - // two pixel per byte packing with only target color - if (lut_size == (1 << 16)) { - if (mode & MODE_PACKING_2PPB) { +LutFunctionPair find_lut_functions(enum EpdDrawMode mode, uint32_t lut_size) { + LutFunctionPair pair; + pair.build_func = NULL; + pair.lookup_func = NULL; + + + if (mode & MODE_PACKING_1PPB_DIFFERENCE) { + if (EPD_CURRENT_RENDER_METHOD == RENDER_METHOD_LCD && !(mode & MODE_FORCE_NO_PIE) && lut_size >= 1024) { + pair.build_func = &build_1ppB_lut_S3_VE_1k; + pair.lookup_func = &calc_epd_input_1ppB_1k_S3_VE; + return pair; + } else if (lut_size >= 1 << 16) { + pair.build_func = &build_1ppB_lut_64k; + pair.lookup_func = &calc_epd_input_1bpp; + return pair; + } + } else if (mode & MODE_PACKING_2PPB) { + if (lut_size >= 1 << 16) { + if (mode & PREVIOUSLY_WHITE) { + pair.build_func = &build_2ppB_lut_64k_from_15; + pair.lookup_func = &calc_epd_input_4bpp_lut_64k; + return pair; + } else if (mode & PREVIOUSLY_BLACK) { + pair.build_func = &build_2ppB_lut_64k_from_0; + pair.lookup_func = &calc_epd_input_4bpp_lut_64k; + return pair; + } + } else if (lut_size >= 1024) { if (mode & PREVIOUSLY_WHITE) { - waveform_lut_static_from(lut, phases, 0x0F, frame); + pair.build_func = &build_2ppB_lut_1k; + pair.lookup_func = &calc_epd_input_4bpp_1k_lut_white; + return pair; } else if (mode & PREVIOUSLY_BLACK) { - waveform_lut_static_from(lut, phases, 0x00, frame); - } else { - waveform_lut(lut, phases, frame); + pair.build_func = &build_2ppB_lut_1k; + pair.lookup_func = &calc_epd_input_4bpp_1k_lut_black; + return pair; } - // one pixel per byte with from and to colors - } else if (mode & MODE_PACKING_1PPB_DIFFERENCE) { - waveform_lut_64k(lut, phases, frame); - } else { - return EPD_DRAW_LOOKUP_NOT_IMPLEMENTED; } - - // 1bit per pixel monochrome with only target color - } else if (mode & MODE_PACKING_8PPB && selected_mode == MODE_EPDIY_MONOCHROME) { - // FIXME: Pack into waveform? + } else if (mode & MODE_PACKING_8PPB) { + if (lut_size < sizeof(lut_1bpp_black)) { + return pair; + } + if (mode & PREVIOUSLY_WHITE) { - memcpy(lut, lut_1bpp_black, sizeof(lut_1bpp_black)); + pair.build_func = &build_8ppB_lut_256b_from_15; + pair.lookup_func = &calc_epd_input_1bpp; + return pair; } else if (mode & PREVIOUSLY_BLACK) { - // FIXME: implement! - // memcpy(render_context.conversion_lut, lut_1bpp_white, sizeof(lut_1bpp_white)); - return EPD_DRAW_LOOKUP_NOT_IMPLEMENTED; - } else { - return EPD_DRAW_LOOKUP_NOT_IMPLEMENTED; + // FIXME: to implement } - - // unknown format. - } else { - return EPD_DRAW_LOOKUP_NOT_IMPLEMENTED; } - return EPD_DRAW_SUCCESS; + + return pair; } + + diff --git a/src/output_common/lut.h b/src/output_common/lut.h index 05057523..55e56f4d 100644 --- a/src/output_common/lut.h +++ b/src/output_common/lut.h @@ -2,97 +2,42 @@ #include #include "epdiy.h" -#include "esp_attr.h" -#include "freertos/FreeRTOS.h" -#include "freertos/queue.h" -#include "freertos/semphr.h" // Make a block of 4 pixels lighter on the EPD. #define CLEAR_BYTE 0B10101010 // Make a block of 4 pixels darker on the EPD. #define DARK_BYTE 0B01010101 -///////////////////////////// Utils ///////////////////////////////////// -/* - * Reorder the output buffer to account for I2S FIFO order. +/** + * Type signature of a framebuffer to display output lookup function. */ -void reorder_line_buffer(uint32_t* line_data, int buf_len); - -typedef struct { - int thread_id; - const uint8_t* data_ptr; - EpdRect crop_to; - void (*done_cb)(void); - SemaphoreHandle_t start_smphr; - EpdRect area; - int frame; - /// index of the waveform mode when using vendor waveforms. - /// This is not necessarily the mode number if the waveform header - // only contains a selection of modes! - int waveform_index; - /// waveform range when using vendor waveforms - int waveform_range; - /// Draw time for the current frame in 1/10ths of us. - int frame_time; - const EpdWaveform* waveform; - enum EpdDrawMode mode; - enum EpdDrawError error; - const bool* drawn_lines; - // Queue of input data lines - QueueHandle_t* pixel_queue; - // Queue of display data lines - QueueHandle_t* display_queue; +typedef void (*lut_func_t)(const uint32_t* line_buffer, uint8_t* epd_input, const uint8_t* lut, uint32_t epd_width); - // Lookup table size. - size_t conversion_lut_size; - // Lookup table space. - uint8_t* conversion_lut; -} OutputParams; +/** + * Type signature of a LUT preparation function. + */ +typedef void (*lut_build_func_t)(uint8_t* lut, const EpdWaveformPhases* phases, int frame); -// void feed_display(OutputParams *params); -// void provide_out(OutputParams *params); -void bit_shift_buffer_right(uint8_t* buf, uint32_t len, int shift); -void mask_line_buffer(uint8_t* lb, int line_buf_len, int xmin, int xmax); -void nibble_shift_buffer_right(uint8_t* buf, uint32_t len); +typedef struct { + lut_build_func_t build_func; + lut_func_t lookup_func; +} LutFunctionPair; -void calc_epd_input_1ppB( - const uint32_t* ld, uint8_t* epd_input, const uint8_t* conversion_lut, uint32_t epd_width -); -void calc_epd_input_1ppB_64k( - const uint32_t* ld, uint8_t* epd_input, const uint8_t* conversion_lut, uint32_t epd_width -); -void calc_epd_input_1ppB_1k_S3_VE( - const uint32_t* ld, uint8_t* epd_input, const uint8_t* conversion_lut, uint32_t epd_width -); +/** + * Select the appropriate LUT building and lookup function + * for the selected draw mode and allocated LUT size. + */ +LutFunctionPair find_lut_functions(enum EpdDrawMode mode, uint32_t lut_size); -uint8_t lookup_pixels_4bpp_1k( - uint16_t in, const uint8_t* conversion_lut, uint8_t from, uint32_t epd_width -); -void calc_epd_input_1bpp( - const uint32_t* line_data, uint8_t* epd_input, const uint8_t* lut, uint32_t epd_width -); -void calc_epd_input_4bpp_1k_lut_white( - const uint32_t* ld, uint8_t* epd_input, const uint8_t* conversion_lut, uint32_t epd_width -); -void calc_epd_input_4bpp_1k_lut_black( - const uint32_t* ld, uint8_t* epd_input, const uint8_t* conversion_lut, uint32_t epd_width -); -void calc_epd_input_4bpp_1k_lut( - const uint32_t* ld, - uint8_t* epd_input, - const uint8_t* conversion_lut, - uint8_t from, - uint32_t epd_width -); -void calc_epd_input_4bpp_lut_64k( - const uint32_t* line_data, uint8_t* epd_input, const uint8_t* conversion_lut, uint32_t epd_width -); +/* + * Reorder the output buffer to account for I2S FIFO order. + */ +void reorder_line_buffer(uint32_t* line_data, int buf_len); -enum EpdDrawError calculate_lut( - uint8_t* lut, int lut_size, enum EpdDrawMode mode, int frame, const EpdWaveformPhases* phases -); -extern const uint32_t lut_1bpp_black[256]; +// legacy functions +void bit_shift_buffer_right(uint8_t* buf, uint32_t len, int shift); +void nibble_shift_buffer_right(uint8_t* buf, uint32_t len); diff --git a/src/output_common/render_context.c b/src/output_common/render_context.c index 7ff05061..e5abc584 100644 --- a/src/output_common/render_context.c +++ b/src/output_common/render_context.c @@ -14,39 +14,6 @@ static inline int min(int x, int y) { return x < y ? x : y; } -lut_func_t get_lut_function(RenderContext_t* ctx) { - const enum EpdDrawMode mode = ctx->mode; - if (mode & MODE_PACKING_2PPB) { - if (ctx->conversion_lut_size == 1024) { - if (mode & PREVIOUSLY_WHITE) { - return &calc_epd_input_4bpp_1k_lut_white; - } else if (mode & PREVIOUSLY_BLACK) { - return &calc_epd_input_4bpp_1k_lut_black; - } else { - ctx->error |= EPD_DRAW_LOOKUP_NOT_IMPLEMENTED; - } - } else if (ctx->conversion_lut_size == (1 << 16)) { - return &calc_epd_input_4bpp_lut_64k; - } else { - ctx->error |= EPD_DRAW_LOOKUP_NOT_IMPLEMENTED; - } - } else if (mode & MODE_PACKING_1PPB_DIFFERENCE) { -#ifdef RENDER_METHOD_LCD - return &calc_epd_input_1ppB_1k_S3_VE; -#endif - - if (ctx->conversion_lut_size == (1 << 16)) { - return &calc_epd_input_1ppB_64k; - } - return NULL; - } else if (mode & MODE_PACKING_8PPB) { - return &calc_epd_input_1bpp; - } else { - ctx->error |= EPD_DRAW_LOOKUP_NOT_IMPLEMENTED; - } - return NULL; -} - void get_buffer_params( RenderContext_t* ctx, int* bytes_per_line, @@ -111,13 +78,11 @@ void IRAM_ATTR prepare_context_for_next_frame(RenderContext_t* ctx) { } ctx->frame_time = frame_time; - enum EpdDrawMode mode = ctx->mode; const EpdWaveformPhases* phases = ctx->waveform->mode_data[ctx->waveform_index]->range_data[ctx->waveform_range]; - ctx->error |= calculate_lut( - ctx->conversion_lut, ctx->conversion_lut_size, mode, ctx->current_frame, phases - ); + assert(ctx->lut_build_func != NULL); + ctx->lut_build_func(ctx->conversion_lut, phases, ctx->current_frame); ctx->lines_prepared = 0; ctx->lines_consumed = 0; diff --git a/src/output_common/render_context.h b/src/output_common/render_context.h index 99421934..262c93c3 100644 --- a/src/output_common/render_context.h +++ b/src/output_common/render_context.h @@ -7,6 +7,7 @@ #include "../epdiy.h" #include "line_queue.h" +#include "lut.h" #define NUM_RENDER_THREADS 2 @@ -56,6 +57,11 @@ typedef struct { size_t conversion_lut_size; // Lookup table space. uint8_t* conversion_lut; + + /// LUT lookup function. Must not be NULL. + lut_func_t lut_lookup_func; + /// LUT building function. Must not be NULL + lut_build_func_t lut_build_func; /// Queue of lines prepared for output to the display, /// one for each thread. @@ -66,13 +72,6 @@ typedef struct { int skipping; } RenderContext_t; -typedef void (*lut_func_t)(const uint32_t*, uint8_t*, const uint8_t*, uint32_t); - -/** - * Depending on the render context, decide which LUT function to use. - * If the lookup fails, an error flag in the context is set. - */ -lut_func_t get_lut_function(RenderContext_t* ctx); /** * Based on the render context, assign the bytes per line, diff --git a/src/output_common/render_method.c b/src/output_common/render_method.c new file mode 100644 index 00000000..916ac419 --- /dev/null +++ b/src/output_common/render_method.c @@ -0,0 +1,10 @@ +#include "sdkconfig.h" +#include "render_method.h" + +#ifdef CONFIG_IDF_TARGET_ESP32 +const enum EpdRenderMethod EPD_CURRENT_RENDER_METHOD = RENDER_METHOD_I2S; +#elif defined(CONFIG_IDF_TARGET_ESP32S3) +const enum EpdRenderMethod EPD_CURRENT_RENDER_METHOD = RENDER_METHOD_LCD; +#else +#error "unknown chip, cannot choose render method!" +#endif \ No newline at end of file diff --git a/src/output_common/render_method.h b/src/output_common/render_method.h index a7e44a76..9db72208 100644 --- a/src/output_common/render_method.h +++ b/src/output_common/render_method.h @@ -1,5 +1,19 @@ +#pragma once + #include "sdkconfig.h" +/** + * Rendering Method / Hardware to use. + */ +enum EpdRenderMethod { + /// Use the I2S peripheral on ESP32 chips. + RENDER_METHOD_I2S = 1, + /// Use the CAM/LCD peripheral in ESP32-S3 chips. + RENDER_METHOD_LCD = 2, +}; + +extern const enum EpdRenderMethod EPD_CURRENT_RENDER_METHOD; + #ifdef CONFIG_IDF_TARGET_ESP32 #define RENDER_METHOD_I2S 1 #elif defined(CONFIG_IDF_TARGET_ESP32S3) @@ -8,6 +22,7 @@ #error "unknown chip, cannot choose render method!" #endif + #ifdef __clang__ #define IRAM_ATTR // define this if we're using clangd to make it accept the GCC builtin diff --git a/src/output_i2s/render_i2s.c b/src/output_i2s/render_i2s.c index fe08d126..50508200 100644 --- a/src/output_i2s/render_i2s.c +++ b/src/output_i2s/render_i2s.c @@ -228,8 +228,6 @@ void IRAM_ATTR i2s_output_frame(RenderContext_t* ctx, int thread_id) { EpdRect area = ctx->area; int frame_time = ctx->frame_time; - lut_func_t input_calc_func = get_lut_function(ctx); - i2s_start_frame(); for (int i = 0; i < ctx->display_height; i++) { LineQueue_t* lq = &ctx->line_queues[0]; @@ -245,7 +243,7 @@ void IRAM_ATTR i2s_output_frame(RenderContext_t* ctx, int thread_id) { continue; } - (*input_calc_func)( + ctx->lut_lookup_func( (uint32_t*)line_buf, (uint8_t*)i2s_get_current_buffer(), ctx->conversion_lut, diff --git a/src/output_lcd/render_lcd.c b/src/output_lcd/render_lcd.c index cdd59beb..348b9030 100644 --- a/src/output_lcd/render_lcd.c +++ b/src/output_lcd/render_lcd.c @@ -116,13 +116,12 @@ void epd_push_pixels_lcd(RenderContext_t* ctx, short time, int color) { #define int_min(a, b) (((a) < (b)) ? (a) : (b)) __attribute__((optimize("O3"))) void IRAM_ATTR lcd_calculate_frame(RenderContext_t* ctx, int thread_id) { + assert(ctx->lut_lookup_func != NULL); uint8_t* input_line = ctx->feed_line_buffers[thread_id]; LineQueue_t* lq = &ctx->line_queues[thread_id]; int l = 0; - - lut_func_t input_calc_func = get_lut_function(ctx); - + // if there is an error, start the frame but don't feed data. if (ctx->error) { memset(ctx->line_threads, 0, ctx->lines_total); @@ -132,8 +131,6 @@ lcd_calculate_frame(RenderContext_t* ctx, int thread_id) { return; } - assert(input_calc_func != NULL); - // line must be able to hold 2-pixel-per-byte or 1-pixel-per-byte data memset(input_line, 0x00, ctx->display_width); @@ -194,7 +191,7 @@ lcd_calculate_frame(RenderContext_t* ctx, int thread_id) { buf = lq_current(lq); } - (*input_calc_func)(lp, buf, ctx->conversion_lut, ctx->display_width); + ctx->lut_lookup_func(lp, buf, ctx->conversion_lut, ctx->display_width); lq_commit(lq); } diff --git a/src/render.c b/src/render.c index 9bb1715f..53c0453b 100644 --- a/src/render.c +++ b/src/render.c @@ -169,6 +169,12 @@ enum EpdDrawError IRAM_ATTR epd_draw_base( ); } #endif + + LutFunctionPair lut_functions = find_lut_functions(mode, render_context.conversion_lut_size); + if (lut_functions.build_func == NULL || lut_functions.lookup_func == NULL) { + ESP_LOGE("epdiy", "no output lookup method found for your mode and LUT size!"); + return EPD_DRAW_LOOKUP_NOT_IMPLEMENTED; + } render_context.area = area; render_context.crop_to = crop_to; @@ -179,6 +185,8 @@ enum EpdDrawError IRAM_ATTR epd_draw_base( render_context.error = EPD_DRAW_SUCCESS; render_context.drawn_lines = drawn_lines; render_context.data_ptr = data; + render_context.lut_build_func = lut_functions.build_func; + render_context.lut_lookup_func = lut_functions.lookup_func; render_context.lines_prepared = 0; render_context.lines_consumed = 0; diff --git a/test/test_lut.c b/test/test_lut.c index fe6ecf1e..0d9f3306 100644 --- a/test/test_lut.c +++ b/test/test_lut.c @@ -15,11 +15,16 @@ static const uint8_t input_data_pattern[16] = { 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0x00, 0x01, 0x10, 0xA5, 0xA5, 0x5A, 0x5A, 0xFF, 0xFF, 0x00, 0x08 }; -static const uint8_t result_data_pattern_lcd[4] = { 0x20, 0x90, 0x5A, 0x40 }; +static const uint8_t result_data_pattern_lcd_1ppB[4] = { 0x20, 0x90, 0x5A, 0x40 }; +static const uint8_t result_data_pattern_lcd_2ppB_white[8] = { 0x00, 0x01, 0x50, 0x55, 0x55, 0x55, 0x00, 0x55 }; typedef void (*lut_func_t)(const uint32_t*, uint8_t*, const uint8_t*, uint32_t); static uint8_t waveform_phases[16][4]; +void calc_epd_input_1ppB_1k_S3_VE(const uint32_t* ld, uint8_t* epd_input, const uint8_t* conversion_lut, uint32_t epd_width); +void calc_epd_input_1ppB_64k(const uint32_t* ld, uint8_t* epd_input, const uint8_t* conversion_lut, uint32_t epd_width); + + static EpdWaveformPhases test_waveform = { .phase_times = NULL, .phases = 1, @@ -27,13 +32,16 @@ static EpdWaveformPhases test_waveform = { }; typedef struct { - uint32_t* line_data; + uint8_t* line_data; uint8_t* result_line; uint8_t* expected_line; uint8_t* lut; + /// Ratio of input bytes to output bytes + int in_out_ratio; int example_len_px; } LutTestBuffers; + static void fill_test_waveform() { for (int to = 0; to < 16; to++) { memset(waveform_phases[to], 0, 4); @@ -52,15 +60,17 @@ static void fill_test_waveform() { /** * (Re-)fill buffers with example data, clear result buffers. */ -static void lut_test_buffers_fill(LutTestBuffers* bufs) { +static void lut_test_buffers_fill(LutTestBuffers* bufs, const uint8_t* result_pattern) { + int result_pattern_len = sizeof(input_data_pattern) / bufs->in_out_ratio; + // initialize test and check patterns - for (int i = 0; i < bufs->example_len_px / 16; i++) { - memcpy(bufs->line_data + 4 * i, input_data_pattern, 16); - memcpy(bufs->expected_line + 4 * i, result_data_pattern_lcd, 4); + for (int i = 0; i < bufs->example_len_px; i++) { + bufs->line_data[i] = input_data_pattern[i % sizeof(input_data_pattern)]; + bufs->expected_line[i / bufs->in_out_ratio] = result_pattern[(i / bufs->in_out_ratio) % result_pattern_len]; } - + memset(bufs->lut, 0, 1 << 16); - memset(bufs->result_line, 0, bufs->example_len_px / 4); + memset(bufs->result_line, 0, bufs->example_len_px / bufs->in_out_ratio); fill_test_waveform(); } @@ -68,14 +78,15 @@ static void lut_test_buffers_fill(LutTestBuffers* bufs) { /* * Allocates and populates buffers for LUT tests. */ -static void lut_test_buffers_init(LutTestBuffers* bufs, int example_len_px) { +static void lut_test_buffers_init(LutTestBuffers* bufs, int example_len_px, const uint8_t* result_pattern, int in_out_ratio) { bufs->line_data = heap_caps_aligned_alloc(16, example_len_px, MALLOC_CAP_DEFAULT); - bufs->result_line = heap_caps_aligned_alloc(16, example_len_px / 4, MALLOC_CAP_DEFAULT); - bufs->expected_line = heap_caps_aligned_alloc(16, example_len_px / 4, MALLOC_CAP_DEFAULT); + bufs->result_line = heap_caps_aligned_alloc(16, example_len_px / in_out_ratio, MALLOC_CAP_DEFAULT); + bufs->expected_line = heap_caps_aligned_alloc(16, example_len_px / in_out_ratio, MALLOC_CAP_DEFAULT); bufs->lut = heap_caps_aligned_alloc(16, 1 << 16, MALLOC_CAP_DEFAULT); bufs->example_len_px = example_len_px; + bufs->in_out_ratio = in_out_ratio; - lut_test_buffers_fill(bufs); + lut_test_buffers_fill(bufs, result_pattern); } /** @@ -90,7 +101,7 @@ static void diff_test_buffers_free(LutTestBuffers* bufs) { static void IRAM_ATTR test_with_alignments(LutTestBuffers* bufs, lut_func_t lut_func) { int len = bufs->example_len_px; - int out_len = bufs->example_len_px / 4; + int out_len = bufs->example_len_px / bufs->in_out_ratio; uint8_t* expectation_backup = heap_caps_aligned_alloc(16, out_len, MALLOC_CAP_DEFAULT); memcpy(expectation_backup, bufs->expected_line, out_len); @@ -104,28 +115,29 @@ static void IRAM_ATTR test_with_alignments(LutTestBuffers* bufs, lut_func_t lut_ memcpy(bufs->expected_line, expectation_backup, out_len); // before and after the designated range the buffer shoulld be clear - memset(bufs->expected_line, 0, start_offset / 4); - memset(bufs->expected_line + (start_offset + unaligned_len) / 4, 0, end_offset / 4); + memset(bufs->expected_line, 0, start_offset / bufs->in_out_ratio); + memset(bufs->expected_line + (start_offset + unaligned_len) / bufs->in_out_ratio, 0, end_offset / bufs->in_out_ratio); - printf("testing with alignment (in px): (%d, %d)... ", start_offset, unaligned_len); + // if we have less than four bytes of input for one output byte, we have to adjust the "line length", + // so that all of the input is used. + int line_length = unaligned_len * 4 / bufs->in_out_ratio; + printf("benchmarking and checking with alignment (in px): (%d, %d)... ", start_offset, unaligned_len); uint64_t start = esp_timer_get_time(); for (int i = 0; i < 100; i++) { lut_func( - bufs->line_data + start_offset / 4, - bufs->result_line + start_offset / 4, + (uint32_t*)(bufs->line_data + start_offset), + bufs->result_line + start_offset / bufs->in_out_ratio, bufs->lut, - unaligned_len + line_length ); } uint64_t end = esp_timer_get_time(); - printf("took %.2fus per iter.\n", (end - start) / 100.0); - // for (int i=0; i < out_len; i++) { - // printf("%X\n", bufs->result_line[i]); - // } - TEST_ASSERT_EQUAL_UINT8_ARRAY(bufs->expected_line, bufs->result_line, out_len); + // Compare computed outputs to the expectation. We limit the comparison to len / 4, since the LUT functions + // only compute a full display line, not more, even though our test buffer may be larger. + TEST_ASSERT_EQUAL_UINT8_ARRAY(bufs->expected_line, bufs->result_line, len / 4); } } @@ -134,10 +146,11 @@ static void IRAM_ATTR test_with_alignments(LutTestBuffers* bufs, lut_func_t lut_ TEST_CASE("1ppB lookup LCD, 64k LUT", "[epdiy,unit]") { LutTestBuffers bufs; - lut_test_buffers_init(&bufs, DEFAULT_EXAMPLE_LEN); + lut_test_buffers_init(&bufs, DEFAULT_EXAMPLE_LEN, result_data_pattern_lcd_1ppB, 4); enum EpdDrawMode mode = MODE_GL16 | MODE_PACKING_1PPB_DIFFERENCE | MODE_FORCE_NO_PIE; - TEST_ASSERT(calculate_lut(bufs.lut, 1 << 16, mode, 0, &test_waveform) == EPD_DRAW_SUCCESS); + LutFunctionPair func_pair = find_lut_functions(mode, 1 << 16); + func_pair.build_func(bufs.lut, &test_waveform, 0); test_with_alignments(&bufs, calc_epd_input_1ppB_64k); diff_test_buffers_free(&bufs); @@ -145,10 +158,23 @@ TEST_CASE("1ppB lookup LCD, 64k LUT", "[epdiy,unit]") { TEST_CASE("1ppB lookup LCD, 1k LUT, PIE", "[epdiy,unit]") { LutTestBuffers bufs; - lut_test_buffers_init(&bufs, DEFAULT_EXAMPLE_LEN); + lut_test_buffers_init(&bufs, DEFAULT_EXAMPLE_LEN, result_data_pattern_lcd_1ppB, 4); enum EpdDrawMode mode = MODE_GL16 | MODE_PACKING_1PPB_DIFFERENCE; - TEST_ASSERT(calculate_lut(bufs.lut, 1 << 10, mode, 0, &test_waveform) == EPD_DRAW_SUCCESS); + LutFunctionPair func_pair = find_lut_functions(mode, 1 << 10); + func_pair.build_func(bufs.lut, &test_waveform, 0); test_with_alignments(&bufs, calc_epd_input_1ppB_1k_S3_VE); diff_test_buffers_free(&bufs); -} \ No newline at end of file +} + +TEST_CASE("2ppB lookup LCD, 64k LUT, previously white", "[epdiy,unit]") { + LutTestBuffers bufs; + lut_test_buffers_init(&bufs, DEFAULT_EXAMPLE_LEN, result_data_pattern_lcd_2ppB_white, 2); + + enum EpdDrawMode mode = MODE_GL16 | MODE_PACKING_2PPB | PREVIOUSLY_WHITE; + LutFunctionPair func_pair = find_lut_functions(mode, 1 << 16); + func_pair.build_func(bufs.lut, &test_waveform, 0); + test_with_alignments(&bufs, func_pair.lookup_func); + + diff_test_buffers_free(&bufs); +} From abdf6055b7fb422834ef47c9f415702f39cb4279 Mon Sep 17 00:00:00 2001 From: Valentin Roland Date: Sun, 16 Jun 2024 15:01:38 +0200 Subject: [PATCH 04/15] test LCD 1k, bpp LUT functions --- examples/test/main/main.c | 4 +- src/output_common/lut.c | 127 ++++++++++++++++------------- src/output_common/lut.h | 12 ++- src/output_common/render_context.h | 3 +- src/output_common/render_method.c | 2 +- src/output_common/render_method.h | 1 - src/output_lcd/render_lcd.c | 2 +- src/render.c | 2 +- test/test_lut.c | 106 +++++++++++++++++------- 9 files changed, 159 insertions(+), 100 deletions(-) diff --git a/examples/test/main/main.c b/examples/test/main/main.c index 4ff48869..9fa5e22d 100644 --- a/examples/test/main/main.c +++ b/examples/test/main/main.c @@ -9,7 +9,7 @@ static void print_banner(const char* text) { void app_main(void) { print_banner("Running all the registered tests"); UNITY_BEGIN(); - // unity_run_tests_by_tag("unit", false); - unity_run_all_tests(); + unity_run_tests_by_tag("lut", false); + // unity_run_all_tests(); UNITY_END(); } diff --git a/src/output_common/lut.c b/src/output_common/lut.c index 9cb9d47d..d4b439ab 100644 --- a/src/output_common/lut.c +++ b/src/output_common/lut.c @@ -105,36 +105,6 @@ __attribute__((optimize("O3"))) void IRAM_ATTR calc_epd_input_1bpp( } } -__attribute__((optimize("O3"))) void IRAM_ATTR calc_epd_input_4bpp_lut_64k( - const uint32_t* line_data, uint8_t* epd_input, const uint8_t* conversion_lut, uint32_t epd_width -) { - uint32_t* wide_epd_input = (uint32_t*)epd_input; - const uint16_t* line_data_16 = (const uint16_t*)line_data; - - // this is reversed for little-endian, but this is later compensated - // through the output peripheral. - for (uint32_t j = 0; j < epd_width / 16; j++) { - uint16_t v1 = *(line_data_16++); - uint16_t v2 = *(line_data_16++); - uint16_t v3 = *(line_data_16++); - uint16_t v4 = *(line_data_16++); - -#ifdef RENDER_METHOD_LCD - uint32_t pixel = conversion_lut[v1] | conversion_lut[v2] << 8 | conversion_lut[v3] << 16 - | conversion_lut[v4] << 24; -#elif RENDER_METHOD_I2S - uint32_t pixel = conversion_lut[v4]; - pixel = pixel << 8; - pixel |= conversion_lut[v3]; - pixel = pixel << 8; - pixel |= conversion_lut[v2]; - pixel = pixel << 8; - pixel |= conversion_lut[v1]; -#endif - wide_epd_input[j] = pixel; - } -} - /** * Look up 4 pixels of a differential image in a LUT constructed for use with vector extensions. */ @@ -226,11 +196,43 @@ __attribute__((optimize("O3"))) void IRAM_ATTR calc_epd_input_1ppB_64k( #endif } +__attribute__((optimize("O3"))) void IRAM_ATTR calc_epd_input_4bpp_lut_64k( + const uint32_t* line_data, uint8_t* epd_input, const uint8_t* conversion_lut, uint32_t epd_width +) { + const uint16_t* line_data_16 = (const uint16_t*)line_data; + +#ifdef RENDER_METHOD_LCD + for (uint32_t j = 0; j < epd_width / 4; j++) { + epd_input[j] = conversion_lut[*(line_data_16++)]; + } +#elif RENDER_METHOD_I2S + // TODO! + uint32_t* wide_epd_input = (uint32_t*)epd_input; + + // this is reversed for little-endian, but this is later compensated + // through the output peripheral. + for (uint32_t j = 0; j < epd_width / 16; j++) { + uint16_t v1 = *(line_data_16++); + uint16_t v2 = *(line_data_16++); + uint16_t v3 = *(line_data_16++); + uint16_t v4 = *(line_data_16++); + uint32_t pixel = conversion_lut[v4]; + pixel = pixel << 8; + pixel |= conversion_lut[v3]; + pixel = pixel << 8; + pixel |= conversion_lut[v2]; + pixel = pixel << 8; + pixel |= conversion_lut[v1]; + wide_epd_input[j] = pixel; + } +#endif +} + /** * Look up 4 pixels in a 1K LUT with fixed "from" value. */ -__attribute__((optimize("O3"))) uint8_t lookup_pixels_4bpp_1k( - uint16_t in, const uint8_t* conversion_lut, uint8_t from, uint32_t epd_width +__attribute__((optimize("O3"))) static uint8_t lookup_pixels_4bpp_1k( + uint16_t in, const uint8_t* conversion_lut, uint8_t from ) { uint8_t v; uint8_t out; @@ -258,22 +260,36 @@ __attribute__((optimize("O3"))) void IRAM_ATTR calc_epd_input_4bpp_1k_lut( uint8_t from, uint32_t epd_width ) { - uint16_t* ptr = (uint16_t*)ld; - // this is reversed for little-endian, but this is later compensated - // through the output peripheral. - for (uint32_t j = 0; j < epd_width / 4; j += 4) { + const uint16_t* line_data_16 = (const uint16_t*)ld; + #ifdef RENDER_METHOD_LCD - epd_input[j + 0] = lookup_pixels_4bpp_1k(*(ptr++), conversion_lut, from, epd_width); - epd_input[j + 1] = lookup_pixels_4bpp_1k(*(ptr++), conversion_lut, from, epd_width); - epd_input[j + 2] = lookup_pixels_4bpp_1k(*(ptr++), conversion_lut, from, epd_width); - epd_input[j + 3] = lookup_pixels_4bpp_1k(*(ptr++), conversion_lut, from, epd_width); + for (uint32_t j = 0; j < epd_width / 4; j++) { + epd_input[j] = lookup_pixels_4bpp_1k(*(line_data_16++), conversion_lut, from); + }; #elif RENDER_METHOD_I2S - epd_input[j + 2] = lookup_pixels_4bpp_1k(*(ptr++), conversion_lut, from, epd_width); - epd_input[j + 3] = lookup_pixels_4bpp_1k(*(ptr++), conversion_lut, from, epd_width); - epd_input[j + 0] = lookup_pixels_4bpp_1k(*(ptr++), conversion_lut, from, epd_width); - epd_input[j + 1] = lookup_pixels_4bpp_1k(*(ptr++), conversion_lut, from, epd_width); -#endif + uint32_t* wide_epd_input = (uint32_t*)epd_input; + const uint16_t* line_data_16 = (const uint16_t*)ld + // this is reversed for little-endian, but this is later compensated + // through the output peripheral. + for (uint32_t j = 0; j < epd_width / 16; j++) { + uint16_t v1 = *(line_data_16++); + uint16_t v2 = *(line_data_16++); + uint16_t v3 = *(line_data_16++); + uint16_t v4 = *(line_data_16++); + uint8_t o1 = lookup_pixels_4bpp_1k(v1, conversion_lut, from); + uint8_t o2 = lookup_pixels_4bpp_1k(v2, conversion_lut, from); + uint8_t o3 = lookup_pixels_4bpp_1k(v3, conversion_lut, from); + uint8_t o4 = lookup_pixels_4bpp_1k(v4, conversion_lut, from); + uint32_t pixel = o4; + pixel = pixel << 8; + pixel |= o3; + pixel = pixel << 8; + pixel |= o2; + pixel = pixel << 8; + pixel |= o1; + wide_epd_input[j] = pixel; } +#endif } __attribute__((optimize("O3"))) void IRAM_ATTR calc_epd_input_4bpp_1k_lut_white( @@ -376,8 +392,9 @@ build_1ppB_lut_S3_VE_1k(uint8_t* lut, const EpdWaveformPhases* phases, int frame * known, e.g. all white or all black. * This LUT is use to look up 4 pixels at once, as with the epdiy LUT. */ -__attribute__((optimize("O3"))) static void -build_2ppB_lut_64k_static_from(uint8_t* lut, const EpdWaveformPhases* phases, uint8_t from, int frame) { +__attribute__((optimize("O3"))) static void build_2ppB_lut_64k_static_from( + uint8_t* lut, const EpdWaveformPhases* phases, uint8_t from, int frame +) { const uint8_t* p_lut = phases->luts + (16 * 4 * frame); /// index into the packed "from" row @@ -428,16 +445,14 @@ static void build_8ppB_lut_256b_from_15(uint8_t* lut, const EpdWaveformPhases* p memcpy(lut, lut_1bpp_black, sizeof(lut_1bpp_black)); } - - LutFunctionPair find_lut_functions(enum EpdDrawMode mode, uint32_t lut_size) { LutFunctionPair pair; pair.build_func = NULL; pair.lookup_func = NULL; - - if (mode & MODE_PACKING_1PPB_DIFFERENCE) { - if (EPD_CURRENT_RENDER_METHOD == RENDER_METHOD_LCD && !(mode & MODE_FORCE_NO_PIE) && lut_size >= 1024) { + if (mode & MODE_PACKING_1PPB_DIFFERENCE) { + if (EPD_CURRENT_RENDER_METHOD == RENDER_METHOD_LCD && !(mode & MODE_FORCE_NO_PIE) + && lut_size >= 1024) { pair.build_func = &build_1ppB_lut_S3_VE_1k; pair.lookup_func = &calc_epd_input_1ppB_1k_S3_VE; return pair; @@ -445,14 +460,14 @@ LutFunctionPair find_lut_functions(enum EpdDrawMode mode, uint32_t lut_size) { pair.build_func = &build_1ppB_lut_64k; pair.lookup_func = &calc_epd_input_1bpp; return pair; - } + } } else if (mode & MODE_PACKING_2PPB) { if (lut_size >= 1 << 16) { if (mode & PREVIOUSLY_WHITE) { pair.build_func = &build_2ppB_lut_64k_from_15; pair.lookup_func = &calc_epd_input_4bpp_lut_64k; return pair; - } else if (mode & PREVIOUSLY_BLACK) { + } else if (mode & PREVIOUSLY_BLACK) { pair.build_func = &build_2ppB_lut_64k_from_0; pair.lookup_func = &calc_epd_input_4bpp_lut_64k; return pair; @@ -472,7 +487,7 @@ LutFunctionPair find_lut_functions(enum EpdDrawMode mode, uint32_t lut_size) { if (lut_size < sizeof(lut_1bpp_black)) { return pair; } - + if (mode & PREVIOUSLY_WHITE) { pair.build_func = &build_8ppB_lut_256b_from_15; pair.lookup_func = &calc_epd_input_1bpp; @@ -484,5 +499,3 @@ LutFunctionPair find_lut_functions(enum EpdDrawMode mode, uint32_t lut_size) { return pair; } - - diff --git a/src/output_common/lut.h b/src/output_common/lut.h index 55e56f4d..08a9dab8 100644 --- a/src/output_common/lut.h +++ b/src/output_common/lut.h @@ -8,36 +8,34 @@ // Make a block of 4 pixels darker on the EPD. #define DARK_BYTE 0B01010101 - /** - * Type signature of a framebuffer to display output lookup function. + * Type signature of a framebuffer to display output lookup function. */ -typedef void (*lut_func_t)(const uint32_t* line_buffer, uint8_t* epd_input, const uint8_t* lut, uint32_t epd_width); +typedef void (*lut_func_t)( + const uint32_t* line_buffer, uint8_t* epd_input, const uint8_t* lut, uint32_t epd_width +); /** * Type signature of a LUT preparation function. */ typedef void (*lut_build_func_t)(uint8_t* lut, const EpdWaveformPhases* phases, int frame); - typedef struct { lut_build_func_t build_func; lut_func_t lookup_func; } LutFunctionPair; /** - * Select the appropriate LUT building and lookup function + * Select the appropriate LUT building and lookup function * for the selected draw mode and allocated LUT size. */ LutFunctionPair find_lut_functions(enum EpdDrawMode mode, uint32_t lut_size); - /* * Reorder the output buffer to account for I2S FIFO order. */ void reorder_line_buffer(uint32_t* line_data, int buf_len); - // legacy functions void bit_shift_buffer_right(uint8_t* buf, uint32_t len, int shift); void nibble_shift_buffer_right(uint8_t* buf, uint32_t len); diff --git a/src/output_common/render_context.h b/src/output_common/render_context.h index 262c93c3..5a6f9612 100644 --- a/src/output_common/render_context.h +++ b/src/output_common/render_context.h @@ -57,7 +57,7 @@ typedef struct { size_t conversion_lut_size; // Lookup table space. uint8_t* conversion_lut; - + /// LUT lookup function. Must not be NULL. lut_func_t lut_lookup_func; /// LUT building function. Must not be NULL @@ -72,7 +72,6 @@ typedef struct { int skipping; } RenderContext_t; - /** * Based on the render context, assign the bytes per line, * framebuffer start pointer, min and max vertical positions and the pixels per byte. diff --git a/src/output_common/render_method.c b/src/output_common/render_method.c index 916ac419..5404b7ee 100644 --- a/src/output_common/render_method.c +++ b/src/output_common/render_method.c @@ -1,5 +1,5 @@ -#include "sdkconfig.h" #include "render_method.h" +#include "sdkconfig.h" #ifdef CONFIG_IDF_TARGET_ESP32 const enum EpdRenderMethod EPD_CURRENT_RENDER_METHOD = RENDER_METHOD_I2S; diff --git a/src/output_common/render_method.h b/src/output_common/render_method.h index 9db72208..217b4100 100644 --- a/src/output_common/render_method.h +++ b/src/output_common/render_method.h @@ -22,7 +22,6 @@ extern const enum EpdRenderMethod EPD_CURRENT_RENDER_METHOD; #error "unknown chip, cannot choose render method!" #endif - #ifdef __clang__ #define IRAM_ATTR // define this if we're using clangd to make it accept the GCC builtin diff --git a/src/output_lcd/render_lcd.c b/src/output_lcd/render_lcd.c index 348b9030..fe93a87f 100644 --- a/src/output_lcd/render_lcd.c +++ b/src/output_lcd/render_lcd.c @@ -121,7 +121,7 @@ lcd_calculate_frame(RenderContext_t* ctx, int thread_id) { LineQueue_t* lq = &ctx->line_queues[thread_id]; int l = 0; - + // if there is an error, start the frame but don't feed data. if (ctx->error) { memset(ctx->line_threads, 0, ctx->lines_total); diff --git a/src/render.c b/src/render.c index 53c0453b..51f1fa70 100644 --- a/src/render.c +++ b/src/render.c @@ -169,7 +169,7 @@ enum EpdDrawError IRAM_ATTR epd_draw_base( ); } #endif - + LutFunctionPair lut_functions = find_lut_functions(mode, render_context.conversion_lut_size); if (lut_functions.build_func == NULL || lut_functions.lookup_func == NULL) { ESP_LOGE("epdiy", "no output lookup method found for your mode and LUT size!"); diff --git a/test/test_lut.c b/test/test_lut.c index 0d9f3306..c201a4ff 100644 --- a/test/test_lut.c +++ b/test/test_lut.c @@ -16,14 +16,20 @@ static const uint8_t input_data_pattern[16] = { 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0x00, 0x01, 0x10, 0xA5, 0xA5, 0x5A, 0x5A, 0xFF, 0xFF, 0x00, 0x08 }; static const uint8_t result_data_pattern_lcd_1ppB[4] = { 0x20, 0x90, 0x5A, 0x40 }; -static const uint8_t result_data_pattern_lcd_2ppB_white[8] = { 0x00, 0x01, 0x50, 0x55, 0x55, 0x55, 0x00, 0x55 }; +static const uint8_t result_data_pattern_lcd_2ppB_white[8] + = { 0x00, 0x01, 0x50, 0x55, 0x55, 0x55, 0x00, 0x55 }; +static const uint8_t result_data_pattern_lcd_2ppB_black[8] + = { 0xAA, 0xA8, 0x0A, 0x82, 0xAA, 0xAA, 0xAA, 0x20 }; typedef void (*lut_func_t)(const uint32_t*, uint8_t*, const uint8_t*, uint32_t); static uint8_t waveform_phases[16][4]; -void calc_epd_input_1ppB_1k_S3_VE(const uint32_t* ld, uint8_t* epd_input, const uint8_t* conversion_lut, uint32_t epd_width); -void calc_epd_input_1ppB_64k(const uint32_t* ld, uint8_t* epd_input, const uint8_t* conversion_lut, uint32_t epd_width); - +void calc_epd_input_1ppB_1k_S3_VE( + const uint32_t* ld, uint8_t* epd_input, const uint8_t* conversion_lut, uint32_t epd_width +); +void calc_epd_input_1ppB_64k( + const uint32_t* ld, uint8_t* epd_input, const uint8_t* conversion_lut, uint32_t epd_width +); static EpdWaveformPhases test_waveform = { .phase_times = NULL, @@ -41,7 +47,6 @@ typedef struct { int example_len_px; } LutTestBuffers; - static void fill_test_waveform() { for (int to = 0; to < 16; to++) { memset(waveform_phases[to], 0, 4); @@ -66,23 +71,29 @@ static void lut_test_buffers_fill(LutTestBuffers* bufs, const uint8_t* result_pa // initialize test and check patterns for (int i = 0; i < bufs->example_len_px; i++) { bufs->line_data[i] = input_data_pattern[i % sizeof(input_data_pattern)]; - bufs->expected_line[i / bufs->in_out_ratio] = result_pattern[(i / bufs->in_out_ratio) % result_pattern_len]; + bufs->expected_line[i / bufs->in_out_ratio] + = result_pattern[(i / bufs->in_out_ratio) % result_pattern_len]; } - + memset(bufs->lut, 0, 1 << 16); memset(bufs->result_line, 0, bufs->example_len_px / bufs->in_out_ratio); fill_test_waveform(); + heap_caps_check_integrity_all(true); } /* * Allocates and populates buffers for LUT tests. */ -static void lut_test_buffers_init(LutTestBuffers* bufs, int example_len_px, const uint8_t* result_pattern, int in_out_ratio) { - bufs->line_data = heap_caps_aligned_alloc(16, example_len_px, MALLOC_CAP_DEFAULT); - bufs->result_line = heap_caps_aligned_alloc(16, example_len_px / in_out_ratio, MALLOC_CAP_DEFAULT); - bufs->expected_line = heap_caps_aligned_alloc(16, example_len_px / in_out_ratio, MALLOC_CAP_DEFAULT); - bufs->lut = heap_caps_aligned_alloc(16, 1 << 16, MALLOC_CAP_DEFAULT); +static void lut_test_buffers_init( + LutTestBuffers* bufs, int example_len_px, const uint8_t* result_pattern, int in_out_ratio +) { + bufs->line_data = heap_caps_aligned_alloc(16, example_len_px, MALLOC_CAP_INTERNAL); + bufs->result_line + = heap_caps_aligned_alloc(16, example_len_px / in_out_ratio, MALLOC_CAP_INTERNAL); + bufs->expected_line + = heap_caps_aligned_alloc(16, example_len_px / in_out_ratio, MALLOC_CAP_INTERNAL); + bufs->lut = heap_caps_malloc(1 << 16, MALLOC_CAP_INTERNAL); bufs->example_len_px = example_len_px; bufs->in_out_ratio = in_out_ratio; @@ -115,36 +126,39 @@ static void IRAM_ATTR test_with_alignments(LutTestBuffers* bufs, lut_func_t lut_ memcpy(bufs->expected_line, expectation_backup, out_len); // before and after the designated range the buffer shoulld be clear - memset(bufs->expected_line, 0, start_offset / bufs->in_out_ratio); - memset(bufs->expected_line + (start_offset + unaligned_len) / bufs->in_out_ratio, 0, end_offset / bufs->in_out_ratio); - - // if we have less than four bytes of input for one output byte, we have to adjust the "line length", - // so that all of the input is used. - int line_length = unaligned_len * 4 / bufs->in_out_ratio; - - printf("benchmarking and checking with alignment (in px): (%d, %d)... ", start_offset, unaligned_len); + memset(bufs->expected_line, 0, start_offset / 4); + memset(bufs->expected_line + (start_offset + unaligned_len) / 4, 0, end_offset / 4); + + printf( + "benchmarking and checking with alignment (in px): (%d, %d)... ", + start_offset, + unaligned_len + ); uint64_t start = esp_timer_get_time(); for (int i = 0; i < 100; i++) { lut_func( - (uint32_t*)(bufs->line_data + start_offset), - bufs->result_line + start_offset / bufs->in_out_ratio, + (uint32_t*)(bufs->line_data + start_offset * bufs->in_out_ratio / 4), + bufs->result_line + start_offset / 4, bufs->lut, - line_length + unaligned_len ); } + heap_caps_check_integrity_all(true); uint64_t end = esp_timer_get_time(); printf("took %.2fus per iter.\n", (end - start) / 100.0); - // Compare computed outputs to the expectation. We limit the comparison to len / 4, since the LUT functions - // only compute a full display line, not more, even though our test buffer may be larger. + // Compare computed outputs to the expectation. We limit the comparison to len / 4, + // since the LUT functions only compute a full display line, not more, even though our + // test buffer may be larger. TEST_ASSERT_EQUAL_UINT8_ARRAY(bufs->expected_line, bufs->result_line, len / 4); } } + heap_caps_check_integrity_all(true); heap_caps_free(expectation_backup); } -TEST_CASE("1ppB lookup LCD, 64k LUT", "[epdiy,unit]") { +TEST_CASE("1ppB lookup LCD, 64k LUT", "[epdiy,unit,lut]") { LutTestBuffers bufs; lut_test_buffers_init(&bufs, DEFAULT_EXAMPLE_LEN, result_data_pattern_lcd_1ppB, 4); @@ -156,7 +170,7 @@ TEST_CASE("1ppB lookup LCD, 64k LUT", "[epdiy,unit]") { diff_test_buffers_free(&bufs); } -TEST_CASE("1ppB lookup LCD, 1k LUT, PIE", "[epdiy,unit]") { +TEST_CASE("1ppB lookup LCD, 1k LUT, PIE", "[epdiy,unit,lut]") { LutTestBuffers bufs; lut_test_buffers_init(&bufs, DEFAULT_EXAMPLE_LEN, result_data_pattern_lcd_1ppB, 4); @@ -167,7 +181,7 @@ TEST_CASE("1ppB lookup LCD, 1k LUT, PIE", "[epdiy,unit]") { diff_test_buffers_free(&bufs); } -TEST_CASE("2ppB lookup LCD, 64k LUT, previously white", "[epdiy,unit]") { +TEST_CASE("2ppB lookup LCD, 64k LUT, previously white", "[epdiy,unit,lut]") { LutTestBuffers bufs; lut_test_buffers_init(&bufs, DEFAULT_EXAMPLE_LEN, result_data_pattern_lcd_2ppB_white, 2); @@ -178,3 +192,39 @@ TEST_CASE("2ppB lookup LCD, 64k LUT, previously white", "[epdiy,unit]") { diff_test_buffers_free(&bufs); } + +TEST_CASE("2ppB lookup LCD, 64k LUT, previously black", "[epdiy,unit,lut]") { + LutTestBuffers bufs; + lut_test_buffers_init(&bufs, DEFAULT_EXAMPLE_LEN, result_data_pattern_lcd_2ppB_black, 2); + + enum EpdDrawMode mode = MODE_GL16 | MODE_PACKING_2PPB | PREVIOUSLY_BLACK; + LutFunctionPair func_pair = find_lut_functions(mode, 1 << 16); + func_pair.build_func(bufs.lut, &test_waveform, 0); + test_with_alignments(&bufs, func_pair.lookup_func); + + diff_test_buffers_free(&bufs); +} + +TEST_CASE("2ppB lookup LCD, 1k LUT, previously white", "[epdiy,unit,lut]") { + LutTestBuffers bufs; + lut_test_buffers_init(&bufs, DEFAULT_EXAMPLE_LEN, result_data_pattern_lcd_2ppB_white, 2); + + enum EpdDrawMode mode = MODE_GL16 | MODE_PACKING_2PPB | PREVIOUSLY_WHITE; + LutFunctionPair func_pair = find_lut_functions(mode, 1 << 10); + func_pair.build_func(bufs.lut, &test_waveform, 0); + test_with_alignments(&bufs, func_pair.lookup_func); + + diff_test_buffers_free(&bufs); +} + +TEST_CASE("2ppB lookup LCD, 1k LUT, previously black", "[epdiy,unit,lut]") { + LutTestBuffers bufs; + lut_test_buffers_init(&bufs, DEFAULT_EXAMPLE_LEN, result_data_pattern_lcd_2ppB_black, 2); + + enum EpdDrawMode mode = MODE_GL16 | MODE_PACKING_2PPB | PREVIOUSLY_BLACK; + LutFunctionPair func_pair = find_lut_functions(mode, 1 << 10); + func_pair.build_func(bufs.lut, &test_waveform, 0); + test_with_alignments(&bufs, func_pair.lookup_func); + + diff_test_buffers_free(&bufs); +} From d45ea54391fbb98be48fe3f18b11315e184a5879 Mon Sep 17 00:00:00 2001 From: Valentin Roland Date: Sun, 16 Jun 2024 21:26:20 +0200 Subject: [PATCH 05/15] fix tests for esp32 --- src/output_common/lut.c | 74 +++-------------------------------------- test/test_lut.c | 45 ++++++++++++++----------- 2 files changed, 31 insertions(+), 88 deletions(-) diff --git a/src/output_common/lut.c b/src/output_common/lut.c index d4b439ab..8900ad3f 100644 --- a/src/output_common/lut.c +++ b/src/output_common/lut.c @@ -64,6 +64,8 @@ uint32_t skipping; __attribute__((optimize("O3"))) void IRAM_ATTR reorder_line_buffer(uint32_t* line_data, int buf_len) { + uint16_t* load = (uint16_t*)line_data; + uint16_t* store = (uint16_t*)line_data; for (uint32_t i = 0; i < buf_len / 4; i++) { uint32_t val = *line_data; *(line_data++) = val >> 16 | ((val & 0x0000FFFF) << 16); @@ -172,28 +174,9 @@ __attribute__((optimize("O3"))) void IRAM_ATTR calc_epd_input_1ppB_64k( const uint32_t* ld, uint8_t* epd_input, const uint8_t* conversion_lut, uint32_t epd_width ) { const uint16_t* lp = (uint16_t*)ld; -#ifdef RENDER_METHOD_LCD for (uint32_t j = 0; j < epd_width / 4; j++) { epd_input[j] = (conversion_lut[lp[2 * j + 1]] << 4) | conversion_lut[lp[2 * j]]; } -#elif RENDER_METHOD_I2S - // this is reversed for little-endian, but this is later compensated - // through the output peripheral. - for (uint32_t j = 0; j < epd_width / 4; j += 4) { - epd_input[j + 2] = conversion_lut[*(lp++)]; - ; - epd_input[j + 2] |= (conversion_lut[*(lp++)] << 4); - epd_input[j + 3] = conversion_lut[*(lp++)]; - ; - epd_input[j + 3] |= (conversion_lut[*(lp++)] << 4); - epd_input[j + 0] = conversion_lut[*(lp++)]; - ; - epd_input[j + 0] |= (conversion_lut[*(lp++)] << 4); - epd_input[j + 1] = conversion_lut[*(lp++)]; - ; - epd_input[j + 1] |= (conversion_lut[*(lp++)] << 4); - } -#endif } __attribute__((optimize("O3"))) void IRAM_ATTR calc_epd_input_4bpp_lut_64k( @@ -201,31 +184,9 @@ __attribute__((optimize("O3"))) void IRAM_ATTR calc_epd_input_4bpp_lut_64k( ) { const uint16_t* line_data_16 = (const uint16_t*)line_data; -#ifdef RENDER_METHOD_LCD for (uint32_t j = 0; j < epd_width / 4; j++) { epd_input[j] = conversion_lut[*(line_data_16++)]; } -#elif RENDER_METHOD_I2S - // TODO! - uint32_t* wide_epd_input = (uint32_t*)epd_input; - - // this is reversed for little-endian, but this is later compensated - // through the output peripheral. - for (uint32_t j = 0; j < epd_width / 16; j++) { - uint16_t v1 = *(line_data_16++); - uint16_t v2 = *(line_data_16++); - uint16_t v3 = *(line_data_16++); - uint16_t v4 = *(line_data_16++); - uint32_t pixel = conversion_lut[v4]; - pixel = pixel << 8; - pixel |= conversion_lut[v3]; - pixel = pixel << 8; - pixel |= conversion_lut[v2]; - pixel = pixel << 8; - pixel |= conversion_lut[v1]; - wide_epd_input[j] = pixel; - } -#endif } /** @@ -262,34 +223,9 @@ __attribute__((optimize("O3"))) void IRAM_ATTR calc_epd_input_4bpp_1k_lut( ) { const uint16_t* line_data_16 = (const uint16_t*)ld; -#ifdef RENDER_METHOD_LCD for (uint32_t j = 0; j < epd_width / 4; j++) { epd_input[j] = lookup_pixels_4bpp_1k(*(line_data_16++), conversion_lut, from); }; -#elif RENDER_METHOD_I2S - uint32_t* wide_epd_input = (uint32_t*)epd_input; - const uint16_t* line_data_16 = (const uint16_t*)ld - // this is reversed for little-endian, but this is later compensated - // through the output peripheral. - for (uint32_t j = 0; j < epd_width / 16; j++) { - uint16_t v1 = *(line_data_16++); - uint16_t v2 = *(line_data_16++); - uint16_t v3 = *(line_data_16++); - uint16_t v4 = *(line_data_16++); - uint8_t o1 = lookup_pixels_4bpp_1k(v1, conversion_lut, from); - uint8_t o2 = lookup_pixels_4bpp_1k(v2, conversion_lut, from); - uint8_t o3 = lookup_pixels_4bpp_1k(v3, conversion_lut, from); - uint8_t o4 = lookup_pixels_4bpp_1k(v4, conversion_lut, from); - uint32_t pixel = o4; - pixel = pixel << 8; - pixel |= o3; - pixel = pixel << 8; - pixel |= o2; - pixel = pixel << 8; - pixel |= o1; - wide_epd_input[j] = pixel; - } -#endif } __attribute__((optimize("O3"))) void IRAM_ATTR calc_epd_input_4bpp_1k_lut_white( @@ -358,8 +294,8 @@ build_1ppB_lut_64k(uint8_t* lut, const EpdWaveformPhases* phases, int frame) { for (int outer = 0xFF; outer >= 0; outer--) { uint32_t outer_result = lut[outer] << 2; - outer_result = (outer_result << 16) | outer_result; - outer_result = (outer_result << 8) | outer_result; + outer_result |= (outer_result << 16); + outer_result |= (outer_result << 8); uint32_t* lut_section = (uint32_t*)(&lut[outer << 8]); memcpy(lut_section, lut, 0x100); for (int i = 0; i < 0x100 / 4; i++) { @@ -458,7 +394,7 @@ LutFunctionPair find_lut_functions(enum EpdDrawMode mode, uint32_t lut_size) { return pair; } else if (lut_size >= 1 << 16) { pair.build_func = &build_1ppB_lut_64k; - pair.lookup_func = &calc_epd_input_1bpp; + pair.lookup_func = &calc_epd_input_1ppB_64k; return pair; } } else if (mode & MODE_PACKING_2PPB) { diff --git a/test/test_lut.c b/test/test_lut.c index c201a4ff..4df7d6d1 100644 --- a/test/test_lut.c +++ b/test/test_lut.c @@ -9,16 +9,19 @@ #include "epdiy.h" #include "esp_attr.h" #include "esp_timer.h" + #include "output_common/lut.h" +#include "output_common/render_method.h" #define DEFAULT_EXAMPLE_LEN 1408 static const uint8_t input_data_pattern[16] = { 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0x00, 0x01, 0x10, 0xA5, 0xA5, 0x5A, 0x5A, 0xFF, 0xFF, 0x00, 0x08 }; -static const uint8_t result_data_pattern_lcd_1ppB[4] = { 0x20, 0x90, 0x5A, 0x40 }; -static const uint8_t result_data_pattern_lcd_2ppB_white[8] + +static const uint8_t result_pattern_1ppB[4] = { 0x20, 0x90, 0x5A, 0x40 }; +static const uint8_t result_pattern_2ppB_white[8] = { 0x00, 0x01, 0x50, 0x55, 0x55, 0x55, 0x00, 0x55 }; -static const uint8_t result_data_pattern_lcd_2ppB_black[8] +static const uint8_t result_pattern_2ppB_black[8] = { 0xAA, 0xA8, 0x0A, 0x82, 0xAA, 0xAA, 0xAA, 0x20 }; typedef void (*lut_func_t)(const uint32_t*, uint8_t*, const uint8_t*, uint32_t); @@ -27,9 +30,6 @@ static uint8_t waveform_phases[16][4]; void calc_epd_input_1ppB_1k_S3_VE( const uint32_t* ld, uint8_t* epd_input, const uint8_t* conversion_lut, uint32_t epd_width ); -void calc_epd_input_1ppB_64k( - const uint32_t* ld, uint8_t* epd_input, const uint8_t* conversion_lut, uint32_t epd_width -); static EpdWaveformPhases test_waveform = { .phase_times = NULL, @@ -88,15 +88,19 @@ static void lut_test_buffers_fill(LutTestBuffers* bufs, const uint8_t* result_pa static void lut_test_buffers_init( LutTestBuffers* bufs, int example_len_px, const uint8_t* result_pattern, int in_out_ratio ) { - bufs->line_data = heap_caps_aligned_alloc(16, example_len_px, MALLOC_CAP_INTERNAL); - bufs->result_line - = heap_caps_aligned_alloc(16, example_len_px / in_out_ratio, MALLOC_CAP_INTERNAL); - bufs->expected_line - = heap_caps_aligned_alloc(16, example_len_px / in_out_ratio, MALLOC_CAP_INTERNAL); - bufs->lut = heap_caps_malloc(1 << 16, MALLOC_CAP_INTERNAL); + uint32_t caps = MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT; + bufs->line_data = heap_caps_aligned_alloc(16, example_len_px, caps); + bufs->result_line = heap_caps_aligned_alloc(16, example_len_px / in_out_ratio, caps); + bufs->expected_line = heap_caps_aligned_alloc(16, example_len_px / in_out_ratio, caps); + bufs->lut = heap_caps_malloc(1 << 16, caps); bufs->example_len_px = example_len_px; bufs->in_out_ratio = in_out_ratio; + assert(bufs->line_data != NULL); + assert(bufs->result_line != NULL); + assert(bufs->expected_line != NULL); + assert(bufs->lut != NULL); + lut_test_buffers_fill(bufs, result_pattern); } @@ -143,6 +147,7 @@ static void IRAM_ATTR test_with_alignments(LutTestBuffers* bufs, lut_func_t lut_ unaligned_len ); } + heap_caps_check_integrity_all(true); uint64_t end = esp_timer_get_time(); printf("took %.2fus per iter.\n", (end - start) / 100.0); @@ -160,19 +165,20 @@ static void IRAM_ATTR test_with_alignments(LutTestBuffers* bufs, lut_func_t lut_ TEST_CASE("1ppB lookup LCD, 64k LUT", "[epdiy,unit,lut]") { LutTestBuffers bufs; - lut_test_buffers_init(&bufs, DEFAULT_EXAMPLE_LEN, result_data_pattern_lcd_1ppB, 4); + lut_test_buffers_init(&bufs, DEFAULT_EXAMPLE_LEN, result_pattern_1ppB, 4); enum EpdDrawMode mode = MODE_GL16 | MODE_PACKING_1PPB_DIFFERENCE | MODE_FORCE_NO_PIE; LutFunctionPair func_pair = find_lut_functions(mode, 1 << 16); func_pair.build_func(bufs.lut, &test_waveform, 0); - test_with_alignments(&bufs, calc_epd_input_1ppB_64k); + test_with_alignments(&bufs, func_pair.lookup_func); diff_test_buffers_free(&bufs); } +#if !DISABLED_FOR_TARGETS(ESP32) TEST_CASE("1ppB lookup LCD, 1k LUT, PIE", "[epdiy,unit,lut]") { LutTestBuffers bufs; - lut_test_buffers_init(&bufs, DEFAULT_EXAMPLE_LEN, result_data_pattern_lcd_1ppB, 4); + lut_test_buffers_init(&bufs, DEFAULT_EXAMPLE_LEN, result_pattern_1ppB, 4); enum EpdDrawMode mode = MODE_GL16 | MODE_PACKING_1PPB_DIFFERENCE; LutFunctionPair func_pair = find_lut_functions(mode, 1 << 10); @@ -180,10 +186,11 @@ TEST_CASE("1ppB lookup LCD, 1k LUT, PIE", "[epdiy,unit,lut]") { test_with_alignments(&bufs, calc_epd_input_1ppB_1k_S3_VE); diff_test_buffers_free(&bufs); } +#endif TEST_CASE("2ppB lookup LCD, 64k LUT, previously white", "[epdiy,unit,lut]") { LutTestBuffers bufs; - lut_test_buffers_init(&bufs, DEFAULT_EXAMPLE_LEN, result_data_pattern_lcd_2ppB_white, 2); + lut_test_buffers_init(&bufs, DEFAULT_EXAMPLE_LEN, result_pattern_2ppB_white, 2); enum EpdDrawMode mode = MODE_GL16 | MODE_PACKING_2PPB | PREVIOUSLY_WHITE; LutFunctionPair func_pair = find_lut_functions(mode, 1 << 16); @@ -195,7 +202,7 @@ TEST_CASE("2ppB lookup LCD, 64k LUT, previously white", "[epdiy,unit,lut]") { TEST_CASE("2ppB lookup LCD, 64k LUT, previously black", "[epdiy,unit,lut]") { LutTestBuffers bufs; - lut_test_buffers_init(&bufs, DEFAULT_EXAMPLE_LEN, result_data_pattern_lcd_2ppB_black, 2); + lut_test_buffers_init(&bufs, DEFAULT_EXAMPLE_LEN, result_pattern_2ppB_black, 2); enum EpdDrawMode mode = MODE_GL16 | MODE_PACKING_2PPB | PREVIOUSLY_BLACK; LutFunctionPair func_pair = find_lut_functions(mode, 1 << 16); @@ -207,7 +214,7 @@ TEST_CASE("2ppB lookup LCD, 64k LUT, previously black", "[epdiy,unit,lut]") { TEST_CASE("2ppB lookup LCD, 1k LUT, previously white", "[epdiy,unit,lut]") { LutTestBuffers bufs; - lut_test_buffers_init(&bufs, DEFAULT_EXAMPLE_LEN, result_data_pattern_lcd_2ppB_white, 2); + lut_test_buffers_init(&bufs, DEFAULT_EXAMPLE_LEN, result_pattern_2ppB_white, 2); enum EpdDrawMode mode = MODE_GL16 | MODE_PACKING_2PPB | PREVIOUSLY_WHITE; LutFunctionPair func_pair = find_lut_functions(mode, 1 << 10); @@ -219,7 +226,7 @@ TEST_CASE("2ppB lookup LCD, 1k LUT, previously white", "[epdiy,unit,lut]") { TEST_CASE("2ppB lookup LCD, 1k LUT, previously black", "[epdiy,unit,lut]") { LutTestBuffers bufs; - lut_test_buffers_init(&bufs, DEFAULT_EXAMPLE_LEN, result_data_pattern_lcd_2ppB_black, 2); + lut_test_buffers_init(&bufs, DEFAULT_EXAMPLE_LEN, result_pattern_2ppB_black, 2); enum EpdDrawMode mode = MODE_GL16 | MODE_PACKING_2PPB | PREVIOUSLY_BLACK; LutFunctionPair func_pair = find_lut_functions(mode, 1 << 10); From 560da445f6a52743e80b53805886f678745d7be6 Mon Sep 17 00:00:00 2001 From: Valentin Roland Date: Fri, 21 Jun 2024 21:42:01 +0200 Subject: [PATCH 06/15] reorder line buffer in i2s mode --- src/output_i2s/render_i2s.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/output_i2s/render_i2s.c b/src/output_i2s/render_i2s.c index 50508200..fbfcf23d 100644 --- a/src/output_i2s/render_i2s.c +++ b/src/output_i2s/render_i2s.c @@ -249,6 +249,7 @@ void IRAM_ATTR i2s_output_frame(RenderContext_t* ctx, int thread_id) { ctx->conversion_lut, ctx->display_width ); + reorder_line_buffer((uint32_t*)i2s_get_current_buffer(), ctx->display_width / 4); i2s_write_row(ctx, frame_time); } if (!ctx->skipping) { From 34da90bd7f74452a162f3fa63350c1f57d806113 Mon Sep 17 00:00:00 2001 From: Valentin Roland Date: Sun, 4 Aug 2024 21:56:09 +0200 Subject: [PATCH 07/15] add unit test for 8ppB, previously white mode --- examples/dragon/main/main.c | 18 ++++++-- examples/weather/main/ArduinoJson.h | 4 +- examples/www-image/main/jpg-render.c | 13 +++--- examples/www-image/main/jpgdec-render.cpp | 11 +++-- src/output_common/lut.c | 55 ++++++++++++++--------- src/render.c | 5 ++- test/test_lut.c | 42 ++++++++++++++--- 7 files changed, 100 insertions(+), 48 deletions(-) diff --git a/examples/dragon/main/main.c b/examples/dragon/main/main.c index f5d9d453..55d9b880 100644 --- a/examples/dragon/main/main.c +++ b/examples/dragon/main/main.c @@ -4,6 +4,7 @@ #include "freertos/FreeRTOS.h" #include "freertos/task.h" +#include "ED097TC2.h" #include "dragon.h" #include "epd_highlevel.h" #include "epdiy.h" @@ -27,14 +28,25 @@ void idf_loop() { epd_copy_to_framebuffer(dragon_area, dragon_data, epd_hl_get_framebuffer(&hl)); - enum EpdDrawError _err = epd_hl_update_screen(&hl, MODE_GC16, temperature); + epd_draw_base( + dragon_area, + epd_hl_get_framebuffer(&hl), + dragon_area, + MODE_GC16 | MODE_PACKING_2PPB | PREVIOUSLY_WHITE, + temperature, + NULL, + NULL, + &ed097tc2 + ); + + // enum EpdDrawError _err = epd_hl_update_screen(&hl, MODE_GC16, temperature); epd_poweroff(); - vTaskDelay(1000); + vTaskDelay(100000); } void idf_setup() { - epd_init(&DEMO_BOARD, &ED097TC2, EPD_LUT_64K); + epd_init(&DEMO_BOARD, &ED097TC2, EPD_LUT_1K); epd_set_vcom(1560); hl = epd_hl_init(EPD_BUILTIN_WAVEFORM); } diff --git a/examples/weather/main/ArduinoJson.h b/examples/weather/main/ArduinoJson.h index a92135cc..60b0ccfe 100644 --- a/examples/weather/main/ArduinoJson.h +++ b/examples/weather/main/ArduinoJson.h @@ -4546,8 +4546,8 @@ struct BoundedReader::value>: public: explicit BoundedReader(const void* ptr, size_t len) : IteratorReader( - reinterpret_cast(ptr), reinterpret_cast(ptr) + len - ) {} + reinterpret_cast(ptr), reinterpret_cast(ptr) + len + ) {} }; template struct Reader, void> : Reader { diff --git a/examples/www-image/main/jpg-render.c b/examples/www-image/main/jpg-render.c index 66e1f143..fd460933 100644 --- a/examples/www-image/main/jpg-render.c +++ b/examples/www-image/main/jpg-render.c @@ -367,15 +367,14 @@ static void http_post(void) { * either in URL or as host and path parameters. * FIX: Uncommenting cert_pem restarts even if providing the right certificate */ - esp_http_client_config_t config - = {.url = IMG_URL, - .event_handler = _http_event_handler, - .buffer_size = HTTP_RECEIVE_BUFFER_SIZE, - .disable_auto_redirect = false, + esp_http_client_config_t config = { .url = IMG_URL, + .event_handler = _http_event_handler, + .buffer_size = HTTP_RECEIVE_BUFFER_SIZE, + .disable_auto_redirect = false, #if VALIDATE_SSL_CERTIFICATE == true - .cert_pem = (char*)server_cert_pem_start + .cert_pem = (char*)server_cert_pem_start #endif - }; + }; esp_http_client_handle_t client = esp_http_client_init(&config); #if DEBUG_VERBOSE diff --git a/examples/www-image/main/jpgdec-render.cpp b/examples/www-image/main/jpgdec-render.cpp index 2d7fe7be..02a84ce4 100644 --- a/examples/www-image/main/jpgdec-render.cpp +++ b/examples/www-image/main/jpgdec-render.cpp @@ -284,14 +284,13 @@ static void http_post(void) { * NOTE: All the configuration parameters for http_client must be specified * either in URL or as host and path parameters. */ - esp_http_client_config_t config - = {.url = IMG_URL, + esp_http_client_config_t config = { .url = IMG_URL, #if VALIDATE_SSL_CERTIFICATE == true - .cert_pem = (char*)server_cert_pem_start, + .cert_pem = (char*)server_cert_pem_start, #endif - .disable_auto_redirect = false, - .event_handler = _http_event_handler, - .buffer_size = HTTP_RECEIVE_BUFFER_SIZE }; + .disable_auto_redirect = false, + .event_handler = _http_event_handler, + .buffer_size = HTTP_RECEIVE_BUFFER_SIZE }; esp_http_client_handle_t client = esp_http_client_init(&config); diff --git a/src/output_common/lut.c b/src/output_common/lut.c index 8900ad3f..216e8e9b 100644 --- a/src/output_common/lut.c +++ b/src/output_common/lut.c @@ -19,7 +19,7 @@ * Since we disable the PSRAM workaround here for performance reasons. */ -/* Python script for generating the 1bpp lookup table: +/* Python script for generating the 8ppB lookup table: * for i in range(256): number = 0; for b in range(8): @@ -27,7 +27,7 @@ number |= 1 << (2*b) print ('0x%04x,'%number) */ -const uint32_t lut_1bpp_black[256] = { +const uint32_t lut_8ppB_black[256] = { 0x5555, 0x5554, 0x5551, 0x5550, 0x5545, 0x5544, 0x5541, 0x5540, 0x5515, 0x5514, 0x5511, 0x5510, 0x5505, 0x5504, 0x5501, 0x5500, 0x5455, 0x5454, 0x5451, 0x5450, 0x5445, 0x5444, 0x5441, 0x5440, 0x5415, 0x5414, 0x5411, 0x5410, 0x5405, 0x5404, 0x5401, 0x5400, 0x5155, 0x5154, 0x5151, 0x5150, @@ -92,7 +92,7 @@ nibble_shift_buffer_right(uint8_t* buf, uint32_t len) { } } -__attribute__((optimize("O3"))) void IRAM_ATTR calc_epd_input_1bpp( +__attribute__((optimize("O3"))) void IRAM_ATTR calc_epd_input_8ppB( const uint32_t* line_data, uint8_t* epd_input, const uint8_t* lut, uint32_t epd_width ) { uint32_t* wide_epd_input = (uint32_t*)epd_input; @@ -100,10 +100,23 @@ __attribute__((optimize("O3"))) void IRAM_ATTR calc_epd_input_1bpp( uint32_t* lut_32 = (uint32_t*)lut; // this is reversed for little-endian, but this is later compensated // through the output peripheral. - for (uint32_t j = 0; j < epd_width / 16; j++) { + for (int j = 0; j < epd_width / 16; j++) { uint8_t v1 = *(data_ptr++); uint8_t v2 = *(data_ptr++); - wide_epd_input[j] = (lut_32[v1] << 16) | lut_32[v2]; + wide_epd_input[j] = (lut_32[v2] << 16) | lut_32[v1]; + } + + // Account for missing line end if epd_width is not divisible by 16. + // We assume divisibility by 4. + for (int j = 0; j < (epd_width % 16) / 4; j++) { + uint8_t nibble = *data_ptr; + if (j % 2 == 1) { + nibble = nibble >> 4; + data_ptr++; + } else { + nibble = nibble & 0xF; + } + epd_input[(epd_width / 16) * 4 + j] = lut_32[nibble]; } } @@ -179,7 +192,7 @@ __attribute__((optimize("O3"))) void IRAM_ATTR calc_epd_input_1ppB_64k( } } -__attribute__((optimize("O3"))) void IRAM_ATTR calc_epd_input_4bpp_lut_64k( +__attribute__((optimize("O3"))) void IRAM_ATTR calc_epd_input_2ppB_lut_64k( const uint32_t* line_data, uint8_t* epd_input, const uint8_t* conversion_lut, uint32_t epd_width ) { const uint16_t* line_data_16 = (const uint16_t*)line_data; @@ -192,7 +205,7 @@ __attribute__((optimize("O3"))) void IRAM_ATTR calc_epd_input_4bpp_lut_64k( /** * Look up 4 pixels in a 1K LUT with fixed "from" value. */ -__attribute__((optimize("O3"))) static uint8_t lookup_pixels_4bpp_1k( +__attribute__((optimize("O3"))) static uint8_t lookup_pixels_2ppB_1k( uint16_t in, const uint8_t* conversion_lut, uint8_t from ) { uint8_t v; @@ -211,10 +224,10 @@ __attribute__((optimize("O3"))) static uint8_t lookup_pixels_4bpp_1k( } /** - * Calculate EPD input for a 4bpp buffer, but with a difference image LUT. + * Calculate EPD input for a 2ppB buffer, but with a difference image LUT. * This is used for small-LUT mode. */ -__attribute__((optimize("O3"))) void IRAM_ATTR calc_epd_input_4bpp_1k_lut( +__attribute__((optimize("O3"))) void IRAM_ATTR calc_epd_input_2ppB_1k_lut( const uint32_t* ld, uint8_t* epd_input, const uint8_t* conversion_lut, @@ -224,20 +237,20 @@ __attribute__((optimize("O3"))) void IRAM_ATTR calc_epd_input_4bpp_1k_lut( const uint16_t* line_data_16 = (const uint16_t*)ld; for (uint32_t j = 0; j < epd_width / 4; j++) { - epd_input[j] = lookup_pixels_4bpp_1k(*(line_data_16++), conversion_lut, from); + epd_input[j] = lookup_pixels_2ppB_1k(*(line_data_16++), conversion_lut, from); }; } -__attribute__((optimize("O3"))) void IRAM_ATTR calc_epd_input_4bpp_1k_lut_white( +__attribute__((optimize("O3"))) void IRAM_ATTR calc_epd_input_2ppB_1k_lut_white( const uint32_t* ld, uint8_t* epd_input, const uint8_t* conversion_lut, uint32_t epd_width ) { - calc_epd_input_4bpp_1k_lut(ld, epd_input, conversion_lut, 0xF, epd_width); + calc_epd_input_2ppB_1k_lut(ld, epd_input, conversion_lut, 0xF, epd_width); } -__attribute__((optimize("O3"))) void IRAM_ATTR calc_epd_input_4bpp_1k_lut_black( +__attribute__((optimize("O3"))) void IRAM_ATTR calc_epd_input_2ppB_1k_lut_black( const uint32_t* ld, uint8_t* epd_input, const uint8_t* conversion_lut, uint32_t epd_width ) { - calc_epd_input_4bpp_1k_lut(ld, epd_input, conversion_lut, 0x0, epd_width); + calc_epd_input_2ppB_1k_lut(ld, epd_input, conversion_lut, 0x0, epd_width); } ///////////////////////////// Calculate Lookup Tables @@ -378,7 +391,7 @@ static void build_2ppB_lut_64k_from_15(uint8_t* lut, const EpdWaveformPhases* ph } static void build_8ppB_lut_256b_from_15(uint8_t* lut, const EpdWaveformPhases* phases, int frame) { - memcpy(lut, lut_1bpp_black, sizeof(lut_1bpp_black)); + memcpy(lut, lut_8ppB_black, sizeof(lut_8ppB_black)); } LutFunctionPair find_lut_functions(enum EpdDrawMode mode, uint32_t lut_size) { @@ -401,32 +414,32 @@ LutFunctionPair find_lut_functions(enum EpdDrawMode mode, uint32_t lut_size) { if (lut_size >= 1 << 16) { if (mode & PREVIOUSLY_WHITE) { pair.build_func = &build_2ppB_lut_64k_from_15; - pair.lookup_func = &calc_epd_input_4bpp_lut_64k; + pair.lookup_func = &calc_epd_input_2ppB_lut_64k; return pair; } else if (mode & PREVIOUSLY_BLACK) { pair.build_func = &build_2ppB_lut_64k_from_0; - pair.lookup_func = &calc_epd_input_4bpp_lut_64k; + pair.lookup_func = &calc_epd_input_2ppB_lut_64k; return pair; } } else if (lut_size >= 1024) { if (mode & PREVIOUSLY_WHITE) { pair.build_func = &build_2ppB_lut_1k; - pair.lookup_func = &calc_epd_input_4bpp_1k_lut_white; + pair.lookup_func = &calc_epd_input_2ppB_1k_lut_white; return pair; } else if (mode & PREVIOUSLY_BLACK) { pair.build_func = &build_2ppB_lut_1k; - pair.lookup_func = &calc_epd_input_4bpp_1k_lut_black; + pair.lookup_func = &calc_epd_input_2ppB_1k_lut_black; return pair; } } } else if (mode & MODE_PACKING_8PPB) { - if (lut_size < sizeof(lut_1bpp_black)) { + if (lut_size < sizeof(lut_8ppB_black)) { return pair; } if (mode & PREVIOUSLY_WHITE) { pair.build_func = &build_8ppB_lut_256b_from_15; - pair.lookup_func = &calc_epd_input_1bpp; + pair.lookup_func = &calc_epd_input_8ppB; return pair; } else if (mode & PREVIOUSLY_BLACK) { // FIXME: to implement diff --git a/src/render.c b/src/render.c index 51f1fa70..3aeeadb9 100644 --- a/src/render.c +++ b/src/render.c @@ -94,8 +94,9 @@ static inline int rounded_display_height() { * * don't inline for to ensure availability in tests. */ -void __attribute__((noinline)) -_epd_populate_line_mask(uint8_t* line_mask, const uint8_t* dirty_columns, int mask_len) { +void __attribute__((noinline)) _epd_populate_line_mask( + uint8_t* line_mask, const uint8_t* dirty_columns, int mask_len +) { if (dirty_columns == NULL) { memset(line_mask, 0xFF, mask_len); } else { diff --git a/test/test_lut.c b/test/test_lut.c index 4df7d6d1..86beeb32 100644 --- a/test/test_lut.c +++ b/test/test_lut.c @@ -23,6 +23,10 @@ static const uint8_t result_pattern_2ppB_white[8] = { 0x00, 0x01, 0x50, 0x55, 0x55, 0x55, 0x00, 0x55 }; static const uint8_t result_pattern_2ppB_black[8] = { 0xAA, 0xA8, 0x0A, 0x82, 0xAA, 0xAA, 0xAA, 0x20 }; +static const uint8_t result_pattern_8ppB[32] + = { 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, + 0x55, 0x54, 0x55, 0x55, 0x54, 0x44, 0x11, 0x44, 0x11, 0x11, 0x44, + 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x15, 0x55 }; typedef void (*lut_func_t)(const uint32_t*, uint8_t*, const uint8_t*, uint32_t); static uint8_t waveform_phases[16][4]; @@ -43,7 +47,7 @@ typedef struct { uint8_t* expected_line; uint8_t* lut; /// Ratio of input bytes to output bytes - int in_out_ratio; + float in_out_ratio; int example_len_px; } LutTestBuffers; @@ -71,8 +75,10 @@ static void lut_test_buffers_fill(LutTestBuffers* bufs, const uint8_t* result_pa // initialize test and check patterns for (int i = 0; i < bufs->example_len_px; i++) { bufs->line_data[i] = input_data_pattern[i % sizeof(input_data_pattern)]; - bufs->expected_line[i / bufs->in_out_ratio] - = result_pattern[(i / bufs->in_out_ratio) % result_pattern_len]; + } + + for (int i = 0; i < bufs->example_len_px / bufs->in_out_ratio; i++) { + bufs->expected_line[i] = result_pattern[i % result_pattern_len]; } memset(bufs->lut, 0, 1 << 16); @@ -86,12 +92,12 @@ static void lut_test_buffers_fill(LutTestBuffers* bufs, const uint8_t* result_pa * Allocates and populates buffers for LUT tests. */ static void lut_test_buffers_init( - LutTestBuffers* bufs, int example_len_px, const uint8_t* result_pattern, int in_out_ratio + LutTestBuffers* bufs, int example_len_px, const uint8_t* result_pattern, float in_out_ratio ) { uint32_t caps = MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT; bufs->line_data = heap_caps_aligned_alloc(16, example_len_px, caps); - bufs->result_line = heap_caps_aligned_alloc(16, example_len_px / in_out_ratio, caps); - bufs->expected_line = heap_caps_aligned_alloc(16, example_len_px / in_out_ratio, caps); + bufs->result_line = heap_caps_aligned_alloc(16, (int)(example_len_px / in_out_ratio), caps); + bufs->expected_line = heap_caps_aligned_alloc(16, (int)(example_len_px / in_out_ratio), caps); bufs->lut = heap_caps_malloc(1 << 16, caps); bufs->example_len_px = example_len_px; bufs->in_out_ratio = in_out_ratio; @@ -124,6 +130,12 @@ static void IRAM_ATTR test_with_alignments(LutTestBuffers* bufs, lut_func_t lut_ // test combinations of start / end missalignment in four byte steps for (int start_offset = 0; start_offset <= 16; start_offset += 4) { for (int end_offset = 0; end_offset <= 16; end_offset += 4) { + /// for 8ppB buffers, we skip 4 byte start offset since an input byte encodes 2 output + /// bytes, there is no way to shift the output by just one byte. + if (bufs->in_out_ratio < 1.0 && (start_offset % 8) == 4) { + continue; + } + int unaligned_len = len - end_offset - start_offset; memset(bufs->result_line, 0, out_len); @@ -141,7 +153,9 @@ static void IRAM_ATTR test_with_alignments(LutTestBuffers* bufs, lut_func_t lut_ uint64_t start = esp_timer_get_time(); for (int i = 0; i < 100; i++) { lut_func( - (uint32_t*)(bufs->line_data + start_offset * bufs->in_out_ratio / 4), + // We shift the alignment of the input data by four pixels + (uint32_t*)(bufs->line_data + (int)(start_offset * bufs->in_out_ratio / 4)), + // we shift the alignment of the result line by one byte bufs->result_line + start_offset / 4, bufs->lut, unaligned_len @@ -235,3 +249,17 @@ TEST_CASE("2ppB lookup LCD, 1k LUT, previously black", "[epdiy,unit,lut]") { diff_test_buffers_free(&bufs); } + +TEST_CASE("8ppB lookup LCD, 1k LUT, previously white", "[epdiy,unit,lut]") { + LutTestBuffers bufs; + lut_test_buffers_init(&bufs, DEFAULT_EXAMPLE_LEN / 2, result_pattern_8ppB, 0.5); + + enum EpdDrawMode mode = MODE_DU | MODE_PACKING_8PPB | PREVIOUSLY_WHITE; + LutFunctionPair func_pair = find_lut_functions(mode, 1 << 10); + TEST_ASSERT_NOT_NULL(func_pair.build_func); + TEST_ASSERT_NOT_NULL(func_pair.lookup_func); + func_pair.build_func(bufs.lut, &test_waveform, 0); + test_with_alignments(&bufs, func_pair.lookup_func); + + diff_test_buffers_free(&bufs); +} \ No newline at end of file From 7f64ad4fd057a669c24590dd61f6c93ee4cacad1 Mon Sep 17 00:00:00 2001 From: Valentin Roland Date: Sun, 1 Sep 2024 22:21:08 +0200 Subject: [PATCH 08/15] add fb mode test example --- examples/fb_mode_test/CMakeLists.txt | 4 + examples/fb_mode_test/main/CMakeLists.txt | 4 + examples/fb_mode_test/main/main.c | 110 ++ examples/fb_mode_test/sdkconfig.defaults | 0 .../fb_mode_test/sdkconfig.defaults.esp32 | 1500 +++++++++++++++++ .../fb_mode_test/sdkconfig.defaults.esp32s3 | 1455 ++++++++++++++++ src/output_common/lut.c | 1 + 7 files changed, 3074 insertions(+) create mode 100644 examples/fb_mode_test/CMakeLists.txt create mode 100644 examples/fb_mode_test/main/CMakeLists.txt create mode 100644 examples/fb_mode_test/main/main.c create mode 100644 examples/fb_mode_test/sdkconfig.defaults create mode 100644 examples/fb_mode_test/sdkconfig.defaults.esp32 create mode 100644 examples/fb_mode_test/sdkconfig.defaults.esp32s3 diff --git a/examples/fb_mode_test/CMakeLists.txt b/examples/fb_mode_test/CMakeLists.txt new file mode 100644 index 00000000..4fe6f31e --- /dev/null +++ b/examples/fb_mode_test/CMakeLists.txt @@ -0,0 +1,4 @@ +cmake_minimum_required(VERSION 3.10.0) +set(EXTRA_COMPONENT_DIRS "../../") +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(firmware) diff --git a/examples/fb_mode_test/main/CMakeLists.txt b/examples/fb_mode_test/main/CMakeLists.txt new file mode 100644 index 00000000..a107619b --- /dev/null +++ b/examples/fb_mode_test/main/CMakeLists.txt @@ -0,0 +1,4 @@ +set(app_sources "main.c") + +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) +idf_component_register(SRCS ${app_sources} REQUIRES epdiy) diff --git a/examples/fb_mode_test/main/main.c b/examples/fb_mode_test/main/main.c new file mode 100644 index 00000000..76e91c2f --- /dev/null +++ b/examples/fb_mode_test/main/main.c @@ -0,0 +1,110 @@ +/* + * Visual tests for framebuffer modes that are not commonly used by the high-level API. + * Currently, includes 2 pixel per byte (ppB) with static origin color and 8ppB with static origin + * color. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "sdkconfig.h" + +#define WAVEFORM EPD_BUILTIN_WAVEFORM + +// choose the default demo board depending on the architecture +#ifdef CONFIG_IDF_TARGET_ESP32 +#define DEMO_BOARD epd_board_v6 +#elif defined(CONFIG_IDF_TARGET_ESP32S3) +#define DEMO_BOARD epd_board_v7 +#endif + +// Singular framebuffer to use for all of the tests. +// Allocated for 2ppB, the least compact that we test here. +uint8_t* framebuffer; +int fb_size; + +static inline void checkError(enum EpdDrawError err) { + if (err != EPD_DRAW_SUCCESS) { + ESP_LOGE("demo", "draw error: %X", err); + } +} + +/** + * Clears the screen to white and resets the framebuffer. + */ +void clear() { + epd_poweron(); + epd_clear(); + epd_poweroff(); + memset(framebuffer, 0xFF, fb_size); +} + +void test_8ppB() { + clear(); + + // bytes in a line in 8ppB mode + int line_bytes = epd_width() / 8; + + int start_line = 100; + int start_column = 80 / 8; + + // draw differently aligned triangles to check for uniformity + for (int align = 0; align < 16; align++) { + for (int height = 0; height < 16; height++) { + for (int len = 0; len < height; len++) { + int line = (start_line + 16 * align + height); + int column = align + len; + uint8_t* line_address = framebuffer + (line_bytes * line); + *(line_address + start_column + column / 8) &= ~(1 << (column % 8)); + } + } + } + + int black_start_column = 160 / 8; + + // draw a black area for later + for (int line = 0; line < 200; line++) { + uint8_t* line_address = framebuffer + (line_bytes * (start_line + line)); + memset(line_address + black_start_column, 0, 32); + } + + epd_poweron(); + checkError(epd_draw_base( + epd_full_screen(), + framebuffer, + epd_full_screen(), + MODE_PACKING_8PPB | MODE_DU | PREVIOUSLY_WHITE, + 25, + NULL, + NULL, + &epdiy_ED047TC2 + )); + epd_poweroff(); +} + +void app_main() { + epd_init(&DEMO_BOARD, &ED060XC3, EPD_OPTIONS_DEFAULT); + // Set VCOM for boards that allow to set this in software (in mV). + // This will print an error if unsupported. In this case, + // set VCOM using the hardware potentiometer and delete this line. + epd_set_vcom(2100); + + fb_size = epd_width() * epd_height() / 2; + framebuffer = heap_caps_aligned_alloc(16, fb_size, MALLOC_CAP_SPIRAM); + + test_8ppB(); + + printf("going to sleep...\n"); + epd_deinit(); + esp_deep_sleep_start(); +} \ No newline at end of file diff --git a/examples/fb_mode_test/sdkconfig.defaults b/examples/fb_mode_test/sdkconfig.defaults new file mode 100644 index 00000000..e69de29b diff --git a/examples/fb_mode_test/sdkconfig.defaults.esp32 b/examples/fb_mode_test/sdkconfig.defaults.esp32 new file mode 100644 index 00000000..3591fe7f --- /dev/null +++ b/examples/fb_mode_test/sdkconfig.defaults.esp32 @@ -0,0 +1,1500 @@ +# +# Automatically generated file. DO NOT EDIT. +# Espressif IoT Development Framework (ESP-IDF) Project Configuration +# +CONFIG_IDF_CMAKE=y +CONFIG_IDF_TARGET_ARCH_XTENSA=y +CONFIG_IDF_TARGET="esp32" +CONFIG_IDF_TARGET_ESP32=y +CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000 + +# +# SDK tool configuration +# +CONFIG_SDK_TOOLPREFIX="xtensa-esp32-elf-" +# CONFIG_SDK_TOOLCHAIN_SUPPORTS_TIME_WIDE_64_BITS is not set +# end of SDK tool configuration + +# +# Build type +# +CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y +# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set +CONFIG_APP_BUILD_GENERATE_BINARIES=y +CONFIG_APP_BUILD_BOOTLOADER=y +CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y +# end of Build type + +# +# Application manager +# +CONFIG_APP_COMPILE_TIME_DATE=y +# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set +# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set +# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set +CONFIG_APP_RETRIEVE_LEN_ELF_SHA=16 +# end of Application manager + +# +# Bootloader config +# +CONFIG_BOOTLOADER_OFFSET_IN_FLASH=0x1000 +CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_NONE is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set +CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y +# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set +CONFIG_BOOTLOADER_LOG_LEVEL=3 +# CONFIG_BOOTLOADER_SPI_CUSTOM_WP_PIN is not set +CONFIG_BOOTLOADER_SPI_WP_PIN=7 +CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y +# CONFIG_BOOTLOADER_FACTORY_RESET is not set +# CONFIG_BOOTLOADER_APP_TEST is not set +CONFIG_BOOTLOADER_REGION_PROTECTION_ENABLE=y +CONFIG_BOOTLOADER_WDT_ENABLE=y +# CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE is not set +CONFIG_BOOTLOADER_WDT_TIME_MS=9000 +# CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set +CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0 +# CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set +CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y +# end of Bootloader config + +# +# Security features +# +# CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set +# CONFIG_SECURE_BOOT is not set +# CONFIG_SECURE_FLASH_ENC_ENABLED is not set +# end of Security features + +# +# Serial flasher config +# +CONFIG_ESPTOOLPY_BAUD_OTHER_VAL=115200 +# CONFIG_ESPTOOLPY_NO_STUB is not set +CONFIG_ESPTOOLPY_FLASHMODE_QIO=y +# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set +# CONFIG_ESPTOOLPY_FLASHMODE_DIO is not set +# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set +CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_STR=y +CONFIG_ESPTOOLPY_FLASHMODE="dio" +CONFIG_ESPTOOLPY_FLASHFREQ_80M=y +# CONFIG_ESPTOOLPY_FLASHFREQ_40M is not set +# CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set +# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set +CONFIG_ESPTOOLPY_FLASHFREQ="80m" +# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE_2MB=y +# CONFIG_ESPTOOLPY_FLASHSIZE_4MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE="2MB" +CONFIG_ESPTOOLPY_FLASHSIZE_DETECT=y +CONFIG_ESPTOOLPY_BEFORE_RESET=y +# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set +CONFIG_ESPTOOLPY_BEFORE="default_reset" +CONFIG_ESPTOOLPY_AFTER_RESET=y +# CONFIG_ESPTOOLPY_AFTER_NORESET is not set +CONFIG_ESPTOOLPY_AFTER="hard_reset" +# CONFIG_ESPTOOLPY_MONITOR_BAUD_CONSOLE is not set +# CONFIG_ESPTOOLPY_MONITOR_BAUD_9600B is not set +# CONFIG_ESPTOOLPY_MONITOR_BAUD_57600B is not set +CONFIG_ESPTOOLPY_MONITOR_BAUD_115200B=y +# CONFIG_ESPTOOLPY_MONITOR_BAUD_230400B is not set +# CONFIG_ESPTOOLPY_MONITOR_BAUD_921600B is not set +# CONFIG_ESPTOOLPY_MONITOR_BAUD_2MB is not set +# CONFIG_ESPTOOLPY_MONITOR_BAUD_OTHER is not set +CONFIG_ESPTOOLPY_MONITOR_BAUD_OTHER_VAL=115200 +CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 +# end of Serial flasher config + +# +# Partition Table +# +# CONFIG_PARTITION_TABLE_SINGLE_APP is not set +CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE=y +# CONFIG_PARTITION_TABLE_TWO_OTA is not set +# CONFIG_PARTITION_TABLE_CUSTOM is not set +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions_singleapp_large.csv" +CONFIG_PARTITION_TABLE_OFFSET=0x8000 +CONFIG_PARTITION_TABLE_MD5=y +# end of Partition Table + +# +# Compiler options +# +# CONFIG_COMPILER_OPTIMIZATION_DEFAULT is not set +# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set +CONFIG_COMPILER_OPTIMIZATION_PERF=y +# CONFIG_COMPILER_OPTIMIZATION_NONE is not set +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set +CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set +CONFIG_COMPILER_HIDE_PATHS_MACROS=y +# CONFIG_COMPILER_CXX_EXCEPTIONS is not set +# CONFIG_COMPILER_CXX_RTTI is not set +CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y +# CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set +# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set +# CONFIG_COMPILER_DISABLE_GCC8_WARNINGS is not set +# CONFIG_COMPILER_DUMP_RTL_FILES is not set +# end of Compiler options + +# +# Component config +# + +# +# Application Level Tracing +# +# CONFIG_APPTRACE_DEST_JTAG is not set +CONFIG_APPTRACE_DEST_NONE=y +CONFIG_APPTRACE_LOCK_ENABLE=y +# end of Application Level Tracing + +# +# ESP-ASIO +# +# CONFIG_ASIO_SSL_SUPPORT is not set +# end of ESP-ASIO + +# +# Bluetooth +# +# CONFIG_BT_ENABLED is not set +# end of Bluetooth + +# +# CoAP Configuration +# +CONFIG_COAP_MBEDTLS_PSK=y +# CONFIG_COAP_MBEDTLS_PKI is not set +# CONFIG_COAP_MBEDTLS_DEBUG is not set +CONFIG_COAP_LOG_DEFAULT_LEVEL=0 +# end of CoAP Configuration + +# +# Driver configurations +# + +# +# ADC configuration +# +# CONFIG_ADC_FORCE_XPD_FSM is not set +CONFIG_ADC_DISABLE_DAC=y +# end of ADC configuration + +# +# MCPWM configuration +# +# CONFIG_MCPWM_ISR_IN_IRAM is not set +# end of MCPWM configuration + +# +# SPI configuration +# +# CONFIG_SPI_MASTER_IN_IRAM is not set +CONFIG_SPI_MASTER_ISR_IN_IRAM=y +# CONFIG_SPI_SLAVE_IN_IRAM is not set +CONFIG_SPI_SLAVE_ISR_IN_IRAM=y +# end of SPI configuration + +# +# TWAI configuration +# +# CONFIG_TWAI_ISR_IN_IRAM is not set +# CONFIG_TWAI_ERRATA_FIX_BUS_OFF_REC is not set +# CONFIG_TWAI_ERRATA_FIX_TX_INTR_LOST is not set +# CONFIG_TWAI_ERRATA_FIX_RX_FRAME_INVALID is not set +# CONFIG_TWAI_ERRATA_FIX_RX_FIFO_CORRUPT is not set +# CONFIG_TWAI_ERRATA_FIX_LISTEN_ONLY_DOM is not set +# end of TWAI configuration + +# +# UART configuration +# +# CONFIG_UART_ISR_IN_IRAM is not set +# end of UART configuration + +# +# RTCIO configuration +# +# CONFIG_RTCIO_SUPPORT_RTC_GPIO_DESC is not set +# end of RTCIO configuration + +# +# GPIO Configuration +# +# CONFIG_GPIO_ESP32_SUPPORT_SWITCH_SLP_PULL is not set +# end of GPIO Configuration + +# +# GDMA Configuration +# +# CONFIG_GDMA_CTRL_FUNC_IN_IRAM is not set +# CONFIG_GDMA_ISR_IRAM_SAFE is not set +# end of GDMA Configuration +# end of Driver configurations + +# +# eFuse Bit Manager +# +# CONFIG_EFUSE_CUSTOM_TABLE is not set +# CONFIG_EFUSE_VIRTUAL is not set +# CONFIG_EFUSE_CODE_SCHEME_COMPAT_NONE is not set +CONFIG_EFUSE_CODE_SCHEME_COMPAT_3_4=y +# CONFIG_EFUSE_CODE_SCHEME_COMPAT_REPEAT is not set +CONFIG_EFUSE_MAX_BLK_LEN=192 +# end of eFuse Bit Manager + +# +# ESP-TLS +# +CONFIG_ESP_TLS_USING_MBEDTLS=y +# CONFIG_ESP_TLS_USE_SECURE_ELEMENT is not set +# CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS is not set +# CONFIG_ESP_TLS_SERVER is not set +# CONFIG_ESP_TLS_PSK_VERIFICATION is not set +# CONFIG_ESP_TLS_INSECURE is not set +# end of ESP-TLS + +# +# ESP32-specific +# +CONFIG_ESP32_ECO3_CACHE_LOCK_FIX=y +CONFIG_ESP32_REV_MIN_0=y +# CONFIG_ESP32_REV_MIN_1 is not set +# CONFIG_ESP32_REV_MIN_1_1 is not set +# CONFIG_ESP32_REV_MIN_2 is not set +# CONFIG_ESP32_REV_MIN_3 is not set +# CONFIG_ESP32_REV_MIN_3_1 is not set +CONFIG_ESP32_REV_MIN=0 +CONFIG_ESP32_REV_MIN_FULL=0 +CONFIG_ESP_REV_MIN_FULL=0 +CONFIG_ESP32_REV_MAX_FULL_STR_OPT=y +CONFIG_ESP32_REV_MAX_FULL=399 +CONFIG_ESP_REV_MAX_FULL=399 +CONFIG_ESP32_DPORT_WORKAROUND=y +# CONFIG_ESP32_DEFAULT_CPU_FREQ_80 is not set +# CONFIG_ESP32_DEFAULT_CPU_FREQ_160 is not set +CONFIG_ESP32_DEFAULT_CPU_FREQ_240=y +CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=240 +CONFIG_ESP32_SPIRAM_SUPPORT=y + +# +# SPI RAM config +# +CONFIG_SPIRAM_TYPE_AUTO=y +# CONFIG_SPIRAM_TYPE_ESPPSRAM16 is not set +# CONFIG_SPIRAM_TYPE_ESPPSRAM32 is not set +# CONFIG_SPIRAM_TYPE_ESPPSRAM64 is not set +CONFIG_SPIRAM_SIZE=-1 +# CONFIG_SPIRAM_SPEED_40M is not set +CONFIG_SPIRAM_SPEED_80M=y +CONFIG_SPIRAM=y +CONFIG_SPIRAM_BOOT_INIT=y +# CONFIG_SPIRAM_IGNORE_NOTFOUND is not set +# CONFIG_SPIRAM_USE_MEMMAP is not set +# CONFIG_SPIRAM_USE_CAPS_ALLOC=y +CONFIG_SPIRAM_USE_MALLOC=y +CONFIG_SPIRAM_MEMTEST=y +# CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP is not set +# CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY is not set +# CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY is not set +CONFIG_SPIRAM_CACHE_WORKAROUND=y + +# +# SPIRAM cache workaround debugging +# +CONFIG_SPIRAM_CACHE_WORKAROUND_STRATEGY_MEMW=y +# CONFIG_SPIRAM_CACHE_WORKAROUND_STRATEGY_DUPLDST is not set +# CONFIG_SPIRAM_CACHE_WORKAROUND_STRATEGY_NOPS is not set +# end of SPIRAM cache workaround debugging + +# +# SPIRAM workaround libraries placement +# +CONFIG_SPIRAM_CACHE_LIBJMP_IN_IRAM=y +CONFIG_SPIRAM_CACHE_LIBMATH_IN_IRAM=y +CONFIG_SPIRAM_CACHE_LIBNUMPARSER_IN_IRAM=y +CONFIG_SPIRAM_CACHE_LIBIO_IN_IRAM=y +CONFIG_SPIRAM_CACHE_LIBTIME_IN_IRAM=y +CONFIG_SPIRAM_CACHE_LIBCHAR_IN_IRAM=y +CONFIG_SPIRAM_CACHE_LIBMEM_IN_IRAM=y +CONFIG_SPIRAM_CACHE_LIBSTR_IN_IRAM=y +CONFIG_SPIRAM_CACHE_LIBRAND_IN_IRAM=y +CONFIG_SPIRAM_CACHE_LIBENV_IN_IRAM=y +CONFIG_SPIRAM_CACHE_LIBFILE_IN_IRAM=y +CONFIG_SPIRAM_CACHE_LIBMISC_IN_IRAM=y +# end of SPIRAM workaround libraries placement + +CONFIG_SPIRAM_BANKSWITCH_ENABLE=y +CONFIG_SPIRAM_BANKSWITCH_RESERVE=8 +# CONFIG_SPIRAM_OCCUPY_HSPI_HOST is not set +CONFIG_SPIRAM_OCCUPY_VSPI_HOST=y +# CONFIG_SPIRAM_OCCUPY_NO_HOST is not set + +# +# PSRAM clock and cs IO for ESP32-DOWD +# +CONFIG_D0WD_PSRAM_CLK_IO=17 +CONFIG_D0WD_PSRAM_CS_IO=16 +# end of PSRAM clock and cs IO for ESP32-DOWD + +# +# PSRAM clock and cs IO for ESP32-D2WD +# +CONFIG_D2WD_PSRAM_CLK_IO=9 +CONFIG_D2WD_PSRAM_CS_IO=10 +# end of PSRAM clock and cs IO for ESP32-D2WD + +# +# PSRAM clock and cs IO for ESP32-PICO +# +CONFIG_PICO_PSRAM_CS_IO=10 +# end of PSRAM clock and cs IO for ESP32-PICO + +# CONFIG_SPIRAM_2T_MODE is not set +# end of SPI RAM config + +# CONFIG_ESP32_TRAX is not set +CONFIG_ESP32_TRACEMEM_RESERVE_DRAM=0x0 +# CONFIG_ESP32_ULP_COPROC_ENABLED is not set +CONFIG_ESP32_ULP_COPROC_RESERVE_MEM=0 +CONFIG_ESP32_DEBUG_OCDAWARE=y +CONFIG_ESP32_BROWNOUT_DET=y +CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_0=y +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_1 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_7 is not set +CONFIG_ESP32_BROWNOUT_DET_LVL=0 +CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1=y +# CONFIG_ESP32_TIME_SYSCALL_USE_RTC is not set +# CONFIG_ESP32_TIME_SYSCALL_USE_FRC1 is not set +# CONFIG_ESP32_TIME_SYSCALL_USE_NONE is not set +CONFIG_ESP32_RTC_CLK_SRC_INT_RC=y +# CONFIG_ESP32_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_ESP32_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_ESP32_RTC_CLK_SRC_INT_8MD256 is not set +CONFIG_ESP32_RTC_CLK_CAL_CYCLES=1024 +CONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAY=2000 +CONFIG_ESP32_XTAL_FREQ_40=y +# CONFIG_ESP32_XTAL_FREQ_26 is not set +# CONFIG_ESP32_XTAL_FREQ_AUTO is not set +CONFIG_ESP32_XTAL_FREQ=40 +# CONFIG_ESP32_DISABLE_BASIC_ROM_CONSOLE is not set +# CONFIG_ESP32_NO_BLOBS is not set +# CONFIG_ESP32_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set +# CONFIG_ESP32_COMPATIBLE_PRE_V3_1_BOOTLOADERS is not set +# CONFIG_ESP32_USE_FIXED_STATIC_RAM_SIZE is not set +CONFIG_ESP32_DPORT_DIS_INTERRUPT_LVL=5 +# end of ESP32-specific + +# +# ADC-Calibration +# +CONFIG_ADC_CAL_EFUSE_TP_ENABLE=y +CONFIG_ADC_CAL_EFUSE_VREF_ENABLE=y +CONFIG_ADC_CAL_LUT_ENABLE=y +# end of ADC-Calibration + +# +# Common ESP-related +# +CONFIG_ESP_ERR_TO_NAME_LOOKUP=y +# end of Common ESP-related + +# +# Ethernet +# +CONFIG_ETH_ENABLED=y +CONFIG_ETH_USE_ESP32_EMAC=y +CONFIG_ETH_PHY_INTERFACE_RMII=y +CONFIG_ETH_RMII_CLK_INPUT=y +# CONFIG_ETH_RMII_CLK_OUTPUT is not set +CONFIG_ETH_RMII_CLK_IN_GPIO=0 +CONFIG_ETH_DMA_BUFFER_SIZE=512 +CONFIG_ETH_DMA_RX_BUFFER_NUM=10 +CONFIG_ETH_DMA_TX_BUFFER_NUM=10 +CONFIG_ETH_USE_SPI_ETHERNET=y +# CONFIG_ETH_SPI_ETHERNET_DM9051 is not set +# CONFIG_ETH_SPI_ETHERNET_W5500 is not set +# CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL is not set +# CONFIG_ETH_USE_OPENETH is not set +# end of Ethernet + +# +# Event Loop Library +# +# CONFIG_ESP_EVENT_LOOP_PROFILING is not set +CONFIG_ESP_EVENT_POST_FROM_ISR=y +CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y +# end of Event Loop Library + +# +# GDB Stub +# +# end of GDB Stub + +# +# ESP HTTP client +# +CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y +# CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set +CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH=y +# end of ESP HTTP client + +# +# HTTP Server +# +CONFIG_HTTPD_MAX_REQ_HDR_LEN=512 +CONFIG_HTTPD_MAX_URI_LEN=512 +CONFIG_HTTPD_ERR_RESP_NO_DELAY=y +CONFIG_HTTPD_PURGE_BUF_LEN=32 +# CONFIG_HTTPD_LOG_PURGE_DATA is not set +# CONFIG_HTTPD_WS_SUPPORT is not set +# end of HTTP Server + +# +# ESP HTTPS OTA +# +# CONFIG_OTA_ALLOW_HTTP is not set +# end of ESP HTTPS OTA + +# +# ESP HTTPS server +# +# CONFIG_ESP_HTTPS_SERVER_ENABLE is not set +# end of ESP HTTPS server + +# +# Hardware Settings +# + +# +# MAC Config +# +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y +# CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_TWO is not set +CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP_MAC_IGNORE_MAC_CRC_ERROR is not set +# end of MAC Config + +# +# Sleep Config +# +CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND=y +# CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND is not set +CONFIG_ESP_SLEEP_PSRAM_LEAKAGE_WORKAROUND=y +CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=y +# CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU is not set +# end of Sleep Config + +# +# RTC Clock Config +# +# end of RTC Clock Config +# end of Hardware Settings + +# +# IPC (Inter-Processor Call) +# +CONFIG_ESP_IPC_TASK_STACK_SIZE=1536 +CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y +CONFIG_ESP_IPC_ISR_ENABLE=y +# end of IPC (Inter-Processor Call) + +# +# LCD and Touch Panel +# + +# +# LCD Peripheral Configuration +# +CONFIG_LCD_PANEL_IO_FORMAT_BUF_SIZE=32 +# end of LCD Peripheral Configuration +# end of LCD and Touch Panel + +# +# ESP NETIF Adapter +# +CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL=120 +CONFIG_ESP_NETIF_TCPIP_LWIP=y +# CONFIG_ESP_NETIF_LOOPBACK is not set +CONFIG_ESP_NETIF_TCPIP_ADAPTER_COMPATIBLE_LAYER=y +# end of ESP NETIF Adapter + +# +# PHY +# +CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y +# CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION is not set +CONFIG_ESP_PHY_MAX_WIFI_TX_POWER=20 +CONFIG_ESP_PHY_MAX_TX_POWER=20 +CONFIG_ESP_PHY_RF_CAL_PARTIAL=y +# CONFIG_ESP_PHY_RF_CAL_NONE is not set +# CONFIG_ESP_PHY_RF_CAL_FULL is not set +CONFIG_ESP_PHY_CALIBRATION_MODE=0 +# end of PHY + +# +# Power Management +# +# CONFIG_PM_ENABLE is not set +# end of Power Management + +# +# ESP Ringbuf +# +# CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH is not set +# CONFIG_RINGBUF_PLACE_ISR_FUNCTIONS_INTO_FLASH is not set +# end of ESP Ringbuf + +# +# ESP System Settings +# +# CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT is not set +CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y +# CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set +# CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set +# CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set + +# +# Memory protection +# +# end of Memory protection + +CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_ESP_MAIN_TASK_STACK_SIZE=3584 +CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0=y +# CONFIG_ESP_MAIN_TASK_AFFINITY_CPU1 is not set +# CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_ESP_MAIN_TASK_AFFINITY=0x0 +CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE=2048 +CONFIG_ESP_CONSOLE_UART_DEFAULT=y +# CONFIG_ESP_CONSOLE_UART_CUSTOM is not set +# CONFIG_ESP_CONSOLE_NONE is not set +CONFIG_ESP_CONSOLE_UART=y +CONFIG_ESP_CONSOLE_MULTIPLE_UART=y +CONFIG_ESP_CONSOLE_UART_NUM=0 +CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 +CONFIG_ESP_INT_WDT=y +CONFIG_ESP_INT_WDT_TIMEOUT_MS=300 +CONFIG_ESP_INT_WDT_CHECK_CPU1=y +CONFIG_ESP_TASK_WDT=y +# CONFIG_ESP_TASK_WDT_PANIC is not set +CONFIG_ESP_TASK_WDT_TIMEOUT_S=5 +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=y +# CONFIG_ESP_PANIC_HANDLER_IRAM is not set +# CONFIG_ESP_DEBUG_STUBS_ENABLE is not set +# CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5 is not set +CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4=y +# end of ESP System Settings + +# +# High resolution timer (esp_timer) +# +# CONFIG_ESP_TIMER_PROFILING is not set +CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER=y +CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER=y +CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP_TIMER_INTERRUPT_LEVEL=1 +# CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD is not set +# CONFIG_ESP_TIMER_IMPL_FRC2 is not set +CONFIG_ESP_TIMER_IMPL_TG0_LAC=y +# end of High resolution timer (esp_timer) + +# +# Wi-Fi +# +CONFIG_ESP32_WIFI_ENABLED=y +CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10 +CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32 +# CONFIG_ESP32_WIFI_STATIC_TX_BUFFER is not set +CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y +CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1 +CONFIG_ESP32_WIFI_CACHE_TX_BUFFER_NUM=32 +CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=32 +# CONFIG_ESP32_WIFI_CSI_ENABLED is not set +CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP32_WIFI_TX_BA_WIN=6 +CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP32_WIFI_RX_BA_WIN=6 +# CONFIG_ESP32_WIFI_AMSDU_TX_ENABLED is not set +CONFIG_ESP32_WIFI_NVS_ENABLED=y +CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0=y +# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1 is not set +CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 +CONFIG_ESP32_WIFI_IRAM_OPT=y +CONFIG_ESP32_WIFI_RX_IRAM_OPT=y +CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y +# CONFIG_ESP_WIFI_SLP_IRAM_OPT is not set +# CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE is not set +# CONFIG_ESP_WIFI_GMAC_SUPPORT is not set +CONFIG_ESP_WIFI_SOFTAP_SUPPORT=y +# CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT is not set +CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7 +# end of Wi-Fi + +# +# Core dump +# +# CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH is not set +# CONFIG_ESP_COREDUMP_ENABLE_TO_UART is not set +CONFIG_ESP_COREDUMP_ENABLE_TO_NONE=y +# end of Core dump + +# +# FAT Filesystem support +# +# CONFIG_FATFS_CODEPAGE_DYNAMIC is not set +CONFIG_FATFS_CODEPAGE_437=y +# CONFIG_FATFS_CODEPAGE_720 is not set +# CONFIG_FATFS_CODEPAGE_737 is not set +# CONFIG_FATFS_CODEPAGE_771 is not set +# CONFIG_FATFS_CODEPAGE_775 is not set +# CONFIG_FATFS_CODEPAGE_850 is not set +# CONFIG_FATFS_CODEPAGE_852 is not set +# CONFIG_FATFS_CODEPAGE_855 is not set +# CONFIG_FATFS_CODEPAGE_857 is not set +# CONFIG_FATFS_CODEPAGE_860 is not set +# CONFIG_FATFS_CODEPAGE_861 is not set +# CONFIG_FATFS_CODEPAGE_862 is not set +# CONFIG_FATFS_CODEPAGE_863 is not set +# CONFIG_FATFS_CODEPAGE_864 is not set +# CONFIG_FATFS_CODEPAGE_865 is not set +# CONFIG_FATFS_CODEPAGE_866 is not set +# CONFIG_FATFS_CODEPAGE_869 is not set +# CONFIG_FATFS_CODEPAGE_932 is not set +# CONFIG_FATFS_CODEPAGE_936 is not set +# CONFIG_FATFS_CODEPAGE_949 is not set +# CONFIG_FATFS_CODEPAGE_950 is not set +CONFIG_FATFS_CODEPAGE=437 +CONFIG_FATFS_LFN_NONE=y +# CONFIG_FATFS_LFN_HEAP is not set +# CONFIG_FATFS_LFN_STACK is not set +CONFIG_FATFS_FS_LOCK=0 +CONFIG_FATFS_TIMEOUT_MS=10000 +CONFIG_FATFS_PER_FILE_CACHE=y +CONFIG_FATFS_ALLOC_PREFER_EXTRAM=y +# CONFIG_FATFS_USE_FASTSEEK is not set +# end of FAT Filesystem support + +# +# Modbus configuration +# +CONFIG_FMB_COMM_MODE_TCP_EN=y +CONFIG_FMB_TCP_PORT_DEFAULT=502 +CONFIG_FMB_TCP_PORT_MAX_CONN=5 +CONFIG_FMB_TCP_CONNECTION_TOUT_SEC=20 +CONFIG_FMB_COMM_MODE_RTU_EN=y +CONFIG_FMB_COMM_MODE_ASCII_EN=y +CONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND=150 +CONFIG_FMB_MASTER_DELAY_MS_CONVERT=200 +CONFIG_FMB_QUEUE_LENGTH=20 +CONFIG_FMB_PORT_TASK_STACK_SIZE=4096 +CONFIG_FMB_SERIAL_BUF_SIZE=256 +CONFIG_FMB_SERIAL_ASCII_BITS_PER_SYMB=8 +CONFIG_FMB_SERIAL_ASCII_TIMEOUT_RESPOND_MS=1000 +CONFIG_FMB_PORT_TASK_PRIO=10 +# CONFIG_FMB_PORT_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_FMB_PORT_TASK_AFFINITY_CPU0=y +# CONFIG_FMB_PORT_TASK_AFFINITY_CPU1 is not set +CONFIG_FMB_PORT_TASK_AFFINITY=0x0 +CONFIG_FMB_CONTROLLER_SLAVE_ID_SUPPORT=y +CONFIG_FMB_CONTROLLER_SLAVE_ID=0x00112233 +CONFIG_FMB_CONTROLLER_NOTIFY_TIMEOUT=20 +CONFIG_FMB_CONTROLLER_NOTIFY_QUEUE_SIZE=20 +CONFIG_FMB_CONTROLLER_STACK_SIZE=4096 +CONFIG_FMB_EVENT_QUEUE_TIMEOUT=20 +# CONFIG_FMB_TIMER_PORT_ENABLED is not set +# CONFIG_FMB_TIMER_USE_ISR_DISPATCH_METHOD is not set +# end of Modbus configuration + +# +# FreeRTOS +# +# CONFIG_FREERTOS_UNICORE is not set +CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_TICK_SUPPORT_CORETIMER=y +CONFIG_FREERTOS_CORETIMER_0=y +# CONFIG_FREERTOS_CORETIMER_1 is not set +CONFIG_FREERTOS_SYSTICK_USES_CCOUNT=y +CONFIG_FREERTOS_HZ=100 +CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION=y +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set +CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y +# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set +CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y +CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1 +CONFIG_FREERTOS_ASSERT_FAIL_ABORT=y +# CONFIG_FREERTOS_ASSERT_FAIL_PRINT_CONTINUE is not set +# CONFIG_FREERTOS_ASSERT_DISABLE is not set +CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536 +CONFIG_FREERTOS_ISR_STACKSIZE=1536 +# CONFIG_FREERTOS_LEGACY_HOOKS is not set +CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 +CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y +# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set +CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 +CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 +CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 +# CONFIG_FREERTOS_USE_TRACE_FACILITY is not set +# CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set +CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y +# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set +# CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set +CONFIG_FREERTOS_DEBUG_OCDAWARE=y +# CONFIG_FREERTOS_FPU_IN_ISR is not set +CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y +# CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH is not set +# end of FreeRTOS + +# +# Hardware Abstraction Layer (HAL) and Low Level (LL) +# +CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y +# CONFIG_HAL_ASSERTION_DISABLE is not set +# CONFIG_HAL_ASSERTION_SILIENT is not set +# CONFIG_HAL_ASSERTION_ENABLE is not set +CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=2 +# end of Hardware Abstraction Layer (HAL) and Low Level (LL) + +# +# Heap memory debugging +# +CONFIG_HEAP_POISONING_DISABLED=y +# CONFIG_HEAP_POISONING_LIGHT is not set +# CONFIG_HEAP_POISONING_COMPREHENSIVE is not set +CONFIG_HEAP_TRACING_OFF=y +# CONFIG_HEAP_TRACING_STANDALONE is not set +# CONFIG_HEAP_TRACING_TOHOST is not set +# CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set +# end of Heap memory debugging + +# +# jsmn +# +# CONFIG_JSMN_PARENT_LINKS is not set +# CONFIG_JSMN_STRICT is not set +# end of jsmn + +# +# libsodium +# +# end of libsodium + +# +# Log output +# +# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set +# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set +# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set +CONFIG_LOG_DEFAULT_LEVEL_INFO=y +# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set +# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set +CONFIG_LOG_DEFAULT_LEVEL=3 +CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y +# CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set +# CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set +CONFIG_LOG_MAXIMUM_LEVEL=3 +CONFIG_LOG_COLORS=y +CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y +# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set +# end of Log output + +# +# LWIP +# +CONFIG_LWIP_LOCAL_HOSTNAME="espressif" +# CONFIG_LWIP_NETIF_API is not set +# CONFIG_LWIP_TCPIP_CORE_LOCKING is not set +# CONFIG_LWIP_CHECK_THREAD_SAFETY is not set +CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y +# CONFIG_LWIP_L2_TO_L3_COPY is not set +# CONFIG_LWIP_IRAM_OPTIMIZATION is not set +CONFIG_LWIP_TIMERS_ONDEMAND=y +CONFIG_LWIP_MAX_SOCKETS=10 +# CONFIG_LWIP_USE_ONLY_LWIP_SELECT is not set +# CONFIG_LWIP_SO_LINGER is not set +CONFIG_LWIP_SO_REUSE=y +CONFIG_LWIP_SO_REUSE_RXTOALL=y +# CONFIG_LWIP_SO_RCVBUF is not set +# CONFIG_LWIP_NETBUF_RECVINFO is not set +CONFIG_LWIP_IP4_FRAG=y +CONFIG_LWIP_IP6_FRAG=y +# CONFIG_LWIP_IP4_REASSEMBLY is not set +# CONFIG_LWIP_IP6_REASSEMBLY is not set +# CONFIG_LWIP_IP_FORWARD is not set +# CONFIG_LWIP_STATS is not set +# CONFIG_LWIP_ETHARP_TRUST_IP_MAC is not set +CONFIG_LWIP_ESP_GRATUITOUS_ARP=y +CONFIG_LWIP_GARP_TMR_INTERVAL=60 +CONFIG_LWIP_ESP_MLDV6_REPORT=y +CONFIG_LWIP_MLDV6_TMR_INTERVAL=40 +CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32 +CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y +# CONFIG_LWIP_DHCP_DISABLE_CLIENT_ID is not set +CONFIG_LWIP_DHCP_DISABLE_VENDOR_CLASS_ID=y +# CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set +CONFIG_LWIP_DHCP_OPTIONS_LEN=68 +CONFIG_LWIP_DHCP_COARSE_TIMER_SECS=1 + +# +# DHCP server +# +CONFIG_LWIP_DHCPS=y +CONFIG_LWIP_DHCPS_LEASE_UNIT=60 +CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8 +# end of DHCP server + +# CONFIG_LWIP_AUTOIP is not set +CONFIG_LWIP_IPV6=y +# CONFIG_LWIP_IPV6_AUTOCONFIG is not set +CONFIG_LWIP_IPV6_NUM_ADDRESSES=3 +# CONFIG_LWIP_IPV6_FORWARD is not set +# CONFIG_LWIP_NETIF_STATUS_CALLBACK is not set +CONFIG_LWIP_NETIF_LOOPBACK=y +CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8 + +# +# TCP +# +CONFIG_LWIP_MAX_ACTIVE_TCP=16 +CONFIG_LWIP_MAX_LISTENING_TCP=16 +CONFIG_LWIP_TCP_HIGH_SPEED_RETRANSMISSION=y +CONFIG_LWIP_TCP_MAXRTX=12 +CONFIG_LWIP_TCP_SYNMAXRTX=12 +CONFIG_LWIP_TCP_MSS=1440 +CONFIG_LWIP_TCP_TMR_INTERVAL=250 +CONFIG_LWIP_TCP_MSL=60000 +CONFIG_LWIP_TCP_FIN_WAIT_TIMEOUT=20000 +CONFIG_LWIP_TCP_SND_BUF_DEFAULT=5744 +CONFIG_LWIP_TCP_WND_DEFAULT=5744 +CONFIG_LWIP_TCP_RECVMBOX_SIZE=6 +CONFIG_LWIP_TCP_QUEUE_OOSEQ=y +# CONFIG_LWIP_TCP_SACK_OUT is not set +# CONFIG_LWIP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set +CONFIG_LWIP_TCP_OVERSIZE_MSS=y +# CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set +# CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set +CONFIG_LWIP_TCP_RTO_TIME=1500 +# end of TCP + +# +# UDP +# +CONFIG_LWIP_MAX_UDP_PCBS=16 +CONFIG_LWIP_UDP_RECVMBOX_SIZE=6 +# end of UDP + +# +# Checksums +# +# CONFIG_LWIP_CHECKSUM_CHECK_IP is not set +# CONFIG_LWIP_CHECKSUM_CHECK_UDP is not set +CONFIG_LWIP_CHECKSUM_CHECK_ICMP=y +# end of Checksums + +CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=3072 +CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set +# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU1 is not set +CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF +# CONFIG_LWIP_PPP_SUPPORT is not set +CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3 +CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5 +# CONFIG_LWIP_SLIP_SUPPORT is not set + +# +# ICMP +# +CONFIG_LWIP_ICMP=y +# CONFIG_LWIP_MULTICAST_PING is not set +# CONFIG_LWIP_BROADCAST_PING is not set +# end of ICMP + +# +# LWIP RAW API +# +CONFIG_LWIP_MAX_RAW_PCBS=16 +# end of LWIP RAW API + +# +# SNTP +# +CONFIG_LWIP_SNTP_MAX_SERVERS=1 +# CONFIG_LWIP_DHCP_GET_NTP_SRV is not set +CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000 +# end of SNTP + +CONFIG_LWIP_ESP_LWIP_ASSERT=y + +# +# Hooks +# +# CONFIG_LWIP_HOOK_TCP_ISN_NONE is not set +CONFIG_LWIP_HOOK_TCP_ISN_DEFAULT=y +# CONFIG_LWIP_HOOK_TCP_ISN_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_ROUTE_NONE=y +# CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_ROUTE_CUSTOM is not set +CONFIG_LWIP_HOOK_ND6_GET_GW_NONE=y +# CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT is not set +# CONFIG_LWIP_HOOK_ND6_GET_GW_CUSTOM is not set +CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y +# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT is not set +# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM is not set +# end of Hooks + +# CONFIG_LWIP_DEBUG is not set +# end of LWIP + +# +# mbedTLS +# +CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y +# CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC is not set +# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set +# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set +CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y +CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384 +CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096 +# CONFIG_MBEDTLS_DYNAMIC_BUFFER is not set +# CONFIG_MBEDTLS_DEBUG is not set + +# +# mbedTLS v2.28.x related +# +# CONFIG_MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH is not set +# CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set +# CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set +CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=y +# end of mbedTLS v2.28.x related + +# +# Certificate Bundle +# +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=y +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE is not set +# CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE is not set +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200 +# end of Certificate Bundle + +# CONFIG_MBEDTLS_ECP_RESTARTABLE is not set +# CONFIG_MBEDTLS_CMAC_C is not set +CONFIG_MBEDTLS_HARDWARE_AES=y +CONFIG_MBEDTLS_HARDWARE_MPI=y +CONFIG_MBEDTLS_HARDWARE_SHA=y +CONFIG_MBEDTLS_ROM_MD5=y +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY is not set +CONFIG_MBEDTLS_HAVE_TIME=y +# CONFIG_MBEDTLS_HAVE_TIME_DATE is not set +CONFIG_MBEDTLS_ECDSA_DETERMINISTIC=y +CONFIG_MBEDTLS_SHA512_C=y +CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y +# CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set +# CONFIG_MBEDTLS_TLS_CLIENT_ONLY is not set +# CONFIG_MBEDTLS_TLS_DISABLED is not set +CONFIG_MBEDTLS_TLS_SERVER=y +CONFIG_MBEDTLS_TLS_CLIENT=y +CONFIG_MBEDTLS_TLS_ENABLED=y + +# +# TLS Key Exchange Methods +# +# CONFIG_MBEDTLS_PSK_MODES is not set +CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_DHE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y +# end of TLS Key Exchange Methods + +CONFIG_MBEDTLS_SSL_RENEGOTIATION=y +# CONFIG_MBEDTLS_SSL_PROTO_SSL3 is not set +CONFIG_MBEDTLS_SSL_PROTO_TLS1=y +CONFIG_MBEDTLS_SSL_PROTO_TLS1_1=y +CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y +# CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 is not set +# CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set +CONFIG_MBEDTLS_SSL_ALPN=y +CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y +CONFIG_MBEDTLS_X509_CHECK_KEY_USAGE=y +CONFIG_MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE=y +CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y + +# +# Symmetric Ciphers +# +CONFIG_MBEDTLS_AES_C=y +# CONFIG_MBEDTLS_CAMELLIA_C is not set +# CONFIG_MBEDTLS_DES_C is not set +CONFIG_MBEDTLS_RC4_DISABLED=y +# CONFIG_MBEDTLS_RC4_ENABLED_NO_DEFAULT is not set +# CONFIG_MBEDTLS_RC4_ENABLED is not set +# CONFIG_MBEDTLS_BLOWFISH_C is not set +# CONFIG_MBEDTLS_XTEA_C is not set +CONFIG_MBEDTLS_CCM_C=y +CONFIG_MBEDTLS_GCM_C=y +# CONFIG_MBEDTLS_NIST_KW_C is not set +# end of Symmetric Ciphers + +# CONFIG_MBEDTLS_RIPEMD160_C is not set + +# +# Certificates +# +CONFIG_MBEDTLS_PEM_PARSE_C=y +CONFIG_MBEDTLS_PEM_WRITE_C=y +CONFIG_MBEDTLS_X509_CRL_PARSE_C=y +CONFIG_MBEDTLS_X509_CSR_PARSE_C=y +# end of Certificates + +CONFIG_MBEDTLS_ECP_C=y +CONFIG_MBEDTLS_ECDH_C=y +CONFIG_MBEDTLS_ECDSA_C=y +# CONFIG_MBEDTLS_ECJPAKE_C is not set +CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y +CONFIG_MBEDTLS_ECP_NIST_OPTIM=y +# CONFIG_MBEDTLS_POLY1305_C is not set +# CONFIG_MBEDTLS_CHACHA20_C is not set +# CONFIG_MBEDTLS_HKDF_C is not set +# CONFIG_MBEDTLS_THREADING_C is not set +# CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI is not set +# CONFIG_MBEDTLS_SECURITY_RISKS is not set +# end of mbedTLS + +# +# mDNS +# +CONFIG_MDNS_MAX_SERVICES=10 +CONFIG_MDNS_TASK_PRIORITY=1 +CONFIG_MDNS_TASK_STACK_SIZE=4096 +# CONFIG_MDNS_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_MDNS_TASK_AFFINITY_CPU0=y +# CONFIG_MDNS_TASK_AFFINITY_CPU1 is not set +CONFIG_MDNS_TASK_AFFINITY=0x0 +CONFIG_MDNS_SERVICE_ADD_TIMEOUT_MS=2000 +# CONFIG_MDNS_STRICT_MODE is not set +CONFIG_MDNS_TIMER_PERIOD_MS=100 +# CONFIG_MDNS_NETWORKING_SOCKET is not set +CONFIG_MDNS_MULTIPLE_INSTANCE=y +# end of mDNS + +# +# ESP-MQTT Configurations +# +CONFIG_MQTT_PROTOCOL_311=y +CONFIG_MQTT_TRANSPORT_SSL=y +CONFIG_MQTT_TRANSPORT_WEBSOCKET=y +CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y +# CONFIG_MQTT_MSG_ID_INCREMENTAL is not set +# CONFIG_MQTT_SKIP_PUBLISH_IF_DISCONNECTED is not set +# CONFIG_MQTT_REPORT_DELETED_MESSAGES is not set +# CONFIG_MQTT_USE_CUSTOM_CONFIG is not set +# CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED is not set +# CONFIG_MQTT_CUSTOM_OUTBOX is not set +# end of ESP-MQTT Configurations + +# +# Newlib +# +CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y +# CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF is not set +# CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR is not set +# CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF is not set +# CONFIG_NEWLIB_STDIN_LINE_ENDING_LF is not set +CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y +# CONFIG_NEWLIB_NANO_FORMAT is not set +# end of Newlib + +# +# NVS +# +# CONFIG_NVS_ASSERT_ERROR_CHECK is not set +# end of NVS + +# +# OpenSSL +# +# CONFIG_OPENSSL_DEBUG is not set +CONFIG_OPENSSL_ERROR_STACK=y +# CONFIG_OPENSSL_ASSERT_DO_NOTHING is not set +CONFIG_OPENSSL_ASSERT_EXIT=y +# end of OpenSSL + +# +# OpenThread +# +# CONFIG_OPENTHREAD_ENABLED is not set +# end of OpenThread + +# +# PThreads +# +CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_PTHREAD_STACK_MIN=768 +CONFIG_PTHREAD_DEFAULT_CORE_NO_AFFINITY=y +# CONFIG_PTHREAD_DEFAULT_CORE_0 is not set +# CONFIG_PTHREAD_DEFAULT_CORE_1 is not set +CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" +# end of PThreads + +# +# SPI Flash driver +# +# CONFIG_SPI_FLASH_VERIFY_WRITE is not set +# CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set +CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y +CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set +# CONFIG_SPI_FLASH_USE_LEGACY_IMPL is not set +# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set +# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set +CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y +CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20 +CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=1 +CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192 +# CONFIG_SPI_FLASH_SIZE_OVERRIDE is not set +# CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED is not set +# CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST is not set + +# +# Auto-detect flash chips +# +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=y +# CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP is not set +# CONFIG_SPI_FLASH_SUPPORT_TH_CHIP is not set +# end of Auto-detect flash chips + +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=y +# end of SPI Flash driver + +# +# SPIFFS Configuration +# +CONFIG_SPIFFS_MAX_PARTITIONS=3 + +# +# SPIFFS Cache Configuration +# +CONFIG_SPIFFS_CACHE=y +CONFIG_SPIFFS_CACHE_WR=y +# CONFIG_SPIFFS_CACHE_STATS is not set +# end of SPIFFS Cache Configuration + +CONFIG_SPIFFS_PAGE_CHECK=y +CONFIG_SPIFFS_GC_MAX_RUNS=10 +# CONFIG_SPIFFS_GC_STATS is not set +CONFIG_SPIFFS_PAGE_SIZE=256 +CONFIG_SPIFFS_OBJ_NAME_LEN=32 +# CONFIG_SPIFFS_FOLLOW_SYMLINKS is not set +CONFIG_SPIFFS_USE_MAGIC=y +CONFIG_SPIFFS_USE_MAGIC_LENGTH=y +CONFIG_SPIFFS_META_LENGTH=4 +CONFIG_SPIFFS_USE_MTIME=y + +# +# Debug Configuration +# +# CONFIG_SPIFFS_DBG is not set +# CONFIG_SPIFFS_API_DBG is not set +# CONFIG_SPIFFS_GC_DBG is not set +# CONFIG_SPIFFS_CACHE_DBG is not set +# CONFIG_SPIFFS_CHECK_DBG is not set +# CONFIG_SPIFFS_TEST_VISUALISATION is not set +# end of Debug Configuration +# end of SPIFFS Configuration + +# +# TCP Transport +# + +# +# Websocket +# +CONFIG_WS_TRANSPORT=y +CONFIG_WS_BUFFER_SIZE=1024 +# end of Websocket +# end of TCP Transport + +# +# Unity unit testing library +# +CONFIG_UNITY_ENABLE_FLOAT=y +CONFIG_UNITY_ENABLE_DOUBLE=y +# CONFIG_UNITY_ENABLE_64BIT is not set +# CONFIG_UNITY_ENABLE_COLOR is not set +CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y +# CONFIG_UNITY_ENABLE_FIXTURE is not set +# CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set +# end of Unity unit testing library + +# +# Root Hub configuration +# +# end of Root Hub configuration + +# +# Virtual file system +# +CONFIG_VFS_SUPPORT_IO=y +CONFIG_VFS_SUPPORT_DIR=y +CONFIG_VFS_SUPPORT_SELECT=y +CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y +CONFIG_VFS_SUPPORT_TERMIOS=y + +# +# Host File System I/O (Semihosting) +# +CONFIG_VFS_SEMIHOSTFS_MAX_MOUNT_POINTS=1 +# end of Host File System I/O (Semihosting) +# end of Virtual file system + +# +# Wear Levelling +# +# CONFIG_WL_SECTOR_SIZE_512 is not set +CONFIG_WL_SECTOR_SIZE_4096=y +CONFIG_WL_SECTOR_SIZE=4096 +# end of Wear Levelling + +# +# Wi-Fi Provisioning Manager +# +CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16 +CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30 +# CONFIG_WIFI_PROV_BLE_FORCE_ENCRYPTION is not set +# end of Wi-Fi Provisioning Manager + +# +# Supplicant +# +CONFIG_WPA_MBEDTLS_CRYPTO=y +# CONFIG_WPA_WAPI_PSK is not set +# CONFIG_WPA_SUITE_B_192 is not set +# CONFIG_WPA_DEBUG_PRINT is not set +# CONFIG_WPA_TESTING_OPTIONS is not set +# CONFIG_WPA_WPS_STRICT is not set +# CONFIG_WPA_11KV_SUPPORT is not set +# CONFIG_WPA_MBO_SUPPORT is not set +# CONFIG_WPA_DPP_SUPPORT is not set +# end of Supplicant +# end of Component config + +# +# Compatibility options +# +# CONFIG_LEGACY_INCLUDE_COMMON_HEADERS is not set +# end of Compatibility options + +# Deprecated options for backward compatibility +CONFIG_TOOLPREFIX="xtensa-esp32-elf-" +# CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set +CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y +# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set +CONFIG_LOG_BOOTLOADER_LEVEL=3 +# CONFIG_APP_ROLLBACK_ENABLE is not set +# CONFIG_FLASH_ENCRYPTION_ENABLED is not set +CONFIG_FLASHMODE_QIO=y +# CONFIG_FLASHMODE_QOUT is not set +# CONFIG_FLASHMODE_DIO is not set +# CONFIG_FLASHMODE_DOUT is not set +# CONFIG_MONITOR_BAUD_9600B is not set +# CONFIG_MONITOR_BAUD_57600B is not set +CONFIG_MONITOR_BAUD_115200B=y +# CONFIG_MONITOR_BAUD_230400B is not set +# CONFIG_MONITOR_BAUD_921600B is not set +# CONFIG_MONITOR_BAUD_2MB is not set +# CONFIG_MONITOR_BAUD_OTHER is not set +CONFIG_MONITOR_BAUD_OTHER_VAL=115200 +CONFIG_MONITOR_BAUD=115200 +# CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG is not set +# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set +CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y +# CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set +CONFIG_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_CXX_EXCEPTIONS is not set +CONFIG_STACK_CHECK_NONE=y +# CONFIG_STACK_CHECK_NORM is not set +# CONFIG_STACK_CHECK_STRONG is not set +# CONFIG_STACK_CHECK_ALL is not set +# CONFIG_WARN_WRITE_STRINGS is not set +# CONFIG_DISABLE_GCC8_WARNINGS is not set +# CONFIG_ESP32_APPTRACE_DEST_TRAX is not set +CONFIG_ESP32_APPTRACE_DEST_NONE=y +CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y +CONFIG_ADC2_DISABLE_DAC=y +CONFIG_SPIRAM_SUPPORT=y +# CONFIG_WIFI_LWIP_ALLOCATION_FROM_SPIRAM_FIRST is not set +CONFIG_TRACEMEM_RESERVE_DRAM=0x0 +# CONFIG_ULP_COPROC_ENABLED is not set +CONFIG_ULP_COPROC_RESERVE_MEM=0 +CONFIG_BROWNOUT_DET=y +CONFIG_BROWNOUT_DET_LVL_SEL_0=y +# CONFIG_BROWNOUT_DET_LVL_SEL_1 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_7 is not set +CONFIG_BROWNOUT_DET_LVL=0 +CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC=y +# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_CRYSTAL is not set +# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_OSC is not set +# CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_8MD256 is not set +# CONFIG_DISABLE_BASIC_ROM_CONSOLE is not set +# CONFIG_NO_BLOBS is not set +# CONFIG_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set +# CONFIG_EVENT_LOOP_PROFILING is not set +CONFIG_POST_EVENTS_FROM_ISR=y +CONFIG_POST_EVENTS_FROM_IRAM_ISR=y +# CONFIG_TWO_UNIVERSAL_MAC_ADDRESS is not set +CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS=y +CONFIG_NUMBER_OF_UNIVERSAL_MAC_ADDRESS=4 +# CONFIG_ESP32C3_LIGHTSLEEP_GPIO_RESET_WORKAROUND is not set +CONFIG_IPC_TASK_STACK_SIZE=1536 +CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y +# CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION is not set +CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20 +CONFIG_ESP32_PHY_MAX_TX_POWER=20 +# CONFIG_ESP32S2_PANIC_PRINT_HALT is not set +CONFIG_ESP32S2_PANIC_PRINT_REBOOT=y +# CONFIG_ESP32S2_PANIC_SILENT_REBOOT is not set +# CONFIG_ESP32S2_PANIC_GDBSTUB is not set +CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_MAIN_TASK_STACK_SIZE=3584 +CONFIG_CONSOLE_UART_DEFAULT=y +# CONFIG_CONSOLE_UART_CUSTOM is not set +# CONFIG_ESP_CONSOLE_UART_NONE is not set +CONFIG_CONSOLE_UART=y +CONFIG_CONSOLE_UART_NUM=0 +CONFIG_CONSOLE_UART_BAUDRATE=115200 +CONFIG_INT_WDT=y +CONFIG_INT_WDT_TIMEOUT_MS=300 +CONFIG_INT_WDT_CHECK_CPU1=y +CONFIG_TASK_WDT=y +# CONFIG_TASK_WDT_PANIC is not set +CONFIG_TASK_WDT_TIMEOUT_S=5 +CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1=y +# CONFIG_ESP32_DEBUG_STUBS_ENABLE is not set +CONFIG_TIMER_TASK_STACK_SIZE=3584 +# CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set +# CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set +CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y +CONFIG_MB_MASTER_TIMEOUT_MS_RESPOND=150 +CONFIG_MB_MASTER_DELAY_MS_CONVERT=200 +CONFIG_MB_QUEUE_LENGTH=20 +CONFIG_MB_SERIAL_TASK_STACK_SIZE=4096 +CONFIG_MB_SERIAL_BUF_SIZE=256 +CONFIG_MB_SERIAL_TASK_PRIO=10 +CONFIG_MB_CONTROLLER_SLAVE_ID_SUPPORT=y +CONFIG_MB_CONTROLLER_SLAVE_ID=0x00112233 +CONFIG_MB_CONTROLLER_NOTIFY_TIMEOUT=20 +CONFIG_MB_CONTROLLER_NOTIFY_QUEUE_SIZE=20 +CONFIG_MB_CONTROLLER_STACK_SIZE=4096 +CONFIG_MB_EVENT_QUEUE_TIMEOUT=20 +# CONFIG_MB_TIMER_PORT_ENABLED is not set +# CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK is not set +CONFIG_TIMER_TASK_PRIORITY=1 +CONFIG_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_TIMER_QUEUE_LENGTH=10 +# CONFIG_L2_TO_L3_COPY is not set +# CONFIG_USE_ONLY_LWIP_SELECT is not set +CONFIG_ESP_GRATUITOUS_ARP=y +CONFIG_GARP_TMR_INTERVAL=60 +CONFIG_TCPIP_RECVMBOX_SIZE=32 +CONFIG_TCP_MAXRTX=12 +CONFIG_TCP_SYNMAXRTX=12 +CONFIG_TCP_MSS=1440 +CONFIG_TCP_MSL=60000 +CONFIG_TCP_SND_BUF_DEFAULT=5744 +CONFIG_TCP_WND_DEFAULT=5744 +CONFIG_TCP_RECVMBOX_SIZE=6 +CONFIG_TCP_QUEUE_OOSEQ=y +# CONFIG_ESP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set +CONFIG_TCP_OVERSIZE_MSS=y +# CONFIG_TCP_OVERSIZE_QUARTER_MSS is not set +# CONFIG_TCP_OVERSIZE_DISABLE is not set +CONFIG_UDP_RECVMBOX_SIZE=6 +CONFIG_TCPIP_TASK_STACK_SIZE=3072 +CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_TCPIP_TASK_AFFINITY_CPU0 is not set +# CONFIG_TCPIP_TASK_AFFINITY_CPU1 is not set +CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF +# CONFIG_PPP_SUPPORT is not set +CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_ESP32_PTHREAD_STACK_MIN=768 +CONFIG_ESP32_DEFAULT_PTHREAD_CORE_NO_AFFINITY=y +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_0 is not set +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_1 is not set +CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread" +CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set +CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y +CONFIG_SUPPORT_TERMIOS=y +CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1 +# End of deprecated options diff --git a/examples/fb_mode_test/sdkconfig.defaults.esp32s3 b/examples/fb_mode_test/sdkconfig.defaults.esp32s3 new file mode 100644 index 00000000..e9f6ddb3 --- /dev/null +++ b/examples/fb_mode_test/sdkconfig.defaults.esp32s3 @@ -0,0 +1,1455 @@ +# +# Automatically generated file. DO NOT EDIT. +# Espressif IoT Development Framework (ESP-IDF) Project Configuration +# +CONFIG_IDF_CMAKE=y +CONFIG_IDF_TARGET_ARCH_XTENSA=y +CONFIG_IDF_TARGET="esp32s3" +CONFIG_IDF_TARGET_ESP32S3=y +CONFIG_IDF_FIRMWARE_CHIP_ID=0x0009 + +# +# SDK tool configuration +# +CONFIG_SDK_TOOLPREFIX="xtensa-esp32s3-elf-" +# CONFIG_SDK_TOOLCHAIN_SUPPORTS_TIME_WIDE_64_BITS is not set +# end of SDK tool configuration + +# +# Build type +# +CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y +# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set +CONFIG_APP_BUILD_GENERATE_BINARIES=y +CONFIG_APP_BUILD_BOOTLOADER=y +CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y +# end of Build type + +# +# Application manager +# +CONFIG_APP_COMPILE_TIME_DATE=y +# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set +# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set +# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set +CONFIG_APP_RETRIEVE_LEN_ELF_SHA=16 +# end of Application manager + +# +# Bootloader config +# +CONFIG_BOOTLOADER_OFFSET_IN_FLASH=0x0 +CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_NONE is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set +CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y +# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set +CONFIG_BOOTLOADER_LOG_LEVEL=3 +CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y +# CONFIG_BOOTLOADER_FACTORY_RESET is not set +# CONFIG_BOOTLOADER_APP_TEST is not set +CONFIG_BOOTLOADER_REGION_PROTECTION_ENABLE=y +CONFIG_BOOTLOADER_WDT_ENABLE=y +# CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE is not set +CONFIG_BOOTLOADER_WDT_TIME_MS=9000 +# CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set +CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0 +# CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set +CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y +# end of Bootloader config + +# +# Security features +# +CONFIG_SECURE_BOOT_SUPPORTS_RSA=y +CONFIG_SECURE_TARGET_HAS_SECURE_ROM_DL_MODE=y +# CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set +# CONFIG_SECURE_BOOT is not set +# CONFIG_SECURE_FLASH_ENC_ENABLED is not set +# end of Security features + +# +# Boot ROM Behavior +# +CONFIG_BOOT_ROM_LOG_ALWAYS_ON=y +# CONFIG_BOOT_ROM_LOG_ALWAYS_OFF is not set +# CONFIG_BOOT_ROM_LOG_ON_GPIO_HIGH is not set +# CONFIG_BOOT_ROM_LOG_ON_GPIO_LOW is not set +# end of Boot ROM Behavior + +# +# Serial flasher config +# +CONFIG_ESPTOOLPY_BAUD_OTHER_VAL=115200 +# CONFIG_ESPTOOLPY_NO_STUB is not set +# CONFIG_ESPTOOLPY_OCT_FLASH is not set +CONFIG_ESPTOOLPY_FLASHMODE_QIO=y +# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set +# CONFIG_ESPTOOLPY_FLASHMODE_DIO is not set +# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set +CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_STR=y +CONFIG_ESPTOOLPY_FLASHMODE="dio" +# CONFIG_ESPTOOLPY_FLASHFREQ_120M is not set +CONFIG_ESPTOOLPY_FLASHFREQ_80M=y +# CONFIG_ESPTOOLPY_FLASHFREQ_40M is not set +# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set +CONFIG_ESPTOOLPY_FLASHFREQ="80m" +# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE_2MB=y +# CONFIG_ESPTOOLPY_FLASHSIZE_4MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE="2MB" +CONFIG_ESPTOOLPY_FLASHSIZE_DETECT=y +CONFIG_ESPTOOLPY_BEFORE_RESET=y +# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set +CONFIG_ESPTOOLPY_BEFORE="default_reset" +CONFIG_ESPTOOLPY_AFTER_RESET=y +# CONFIG_ESPTOOLPY_AFTER_NORESET is not set +CONFIG_ESPTOOLPY_AFTER="hard_reset" +# CONFIG_ESPTOOLPY_MONITOR_BAUD_CONSOLE is not set +# CONFIG_ESPTOOLPY_MONITOR_BAUD_9600B is not set +# CONFIG_ESPTOOLPY_MONITOR_BAUD_57600B is not set +CONFIG_ESPTOOLPY_MONITOR_BAUD_115200B=y +# CONFIG_ESPTOOLPY_MONITOR_BAUD_230400B is not set +# CONFIG_ESPTOOLPY_MONITOR_BAUD_921600B is not set +# CONFIG_ESPTOOLPY_MONITOR_BAUD_2MB is not set +# CONFIG_ESPTOOLPY_MONITOR_BAUD_OTHER is not set +CONFIG_ESPTOOLPY_MONITOR_BAUD_OTHER_VAL=115200 +CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 +# end of Serial flasher config + +# +# Partition Table +# +# CONFIG_PARTITION_TABLE_SINGLE_APP is not set +CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE=y +# CONFIG_PARTITION_TABLE_TWO_OTA is not set +# CONFIG_PARTITION_TABLE_CUSTOM is not set +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions_singleapp_large.csv" +CONFIG_PARTITION_TABLE_OFFSET=0x8000 +CONFIG_PARTITION_TABLE_MD5=y +# end of Partition Table + +# +# Compiler options +# +# CONFIG_COMPILER_OPTIMIZATION_DEFAULT is not set +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +# CONFIG_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_COMPILER_OPTIMIZATION_NONE is not set +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE is not set +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT=y +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set +CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=1 +# CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set +CONFIG_COMPILER_HIDE_PATHS_MACROS=y +# CONFIG_COMPILER_CXX_EXCEPTIONS is not set +# CONFIG_COMPILER_CXX_RTTI is not set +CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y +# CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set +# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set +# CONFIG_COMPILER_DISABLE_GCC8_WARNINGS is not set +# CONFIG_COMPILER_DUMP_RTL_FILES is not set +# end of Compiler options + +# +# Component config +# + +# +# Application Level Tracing +# +# CONFIG_APPTRACE_DEST_JTAG is not set +CONFIG_APPTRACE_DEST_NONE=y +CONFIG_APPTRACE_LOCK_ENABLE=y +# end of Application Level Tracing + +# +# ESP-ASIO +# +# CONFIG_ASIO_SSL_SUPPORT is not set +# end of ESP-ASIO + +# +# Bluetooth +# +# CONFIG_BT_ENABLED is not set +# end of Bluetooth + +# +# CoAP Configuration +# +CONFIG_COAP_MBEDTLS_PSK=y +# CONFIG_COAP_MBEDTLS_PKI is not set +# CONFIG_COAP_MBEDTLS_DEBUG is not set +CONFIG_COAP_LOG_DEFAULT_LEVEL=0 +# end of CoAP Configuration + +# +# Driver configurations +# + +# +# ADC configuration +# +# CONFIG_ADC_FORCE_XPD_FSM is not set +CONFIG_ADC_DISABLE_DAC=y +# CONFIG_ADC_CONTINUOUS_FORCE_USE_ADC2_ON_C3_S3 is not set +# end of ADC configuration + +# +# MCPWM configuration +# +# CONFIG_MCPWM_ISR_IN_IRAM is not set +# end of MCPWM configuration + +# +# SPI configuration +# +# CONFIG_SPI_MASTER_IN_IRAM is not set +CONFIG_SPI_MASTER_ISR_IN_IRAM=y +# CONFIG_SPI_SLAVE_IN_IRAM is not set +CONFIG_SPI_SLAVE_ISR_IN_IRAM=y +# end of SPI configuration + +# +# TWAI configuration +# +# CONFIG_TWAI_ISR_IN_IRAM is not set +# CONFIG_TWAI_ERRATA_FIX_LISTEN_ONLY_DOM is not set +# end of TWAI configuration + +# +# UART configuration +# +# CONFIG_UART_ISR_IN_IRAM is not set +# end of UART configuration + +# +# GDMA Configuration +# +# CONFIG_GDMA_CTRL_FUNC_IN_IRAM is not set +# CONFIG_GDMA_ISR_IRAM_SAFE is not set +# end of GDMA Configuration +# end of Driver configurations + +# +# eFuse Bit Manager +# +# CONFIG_EFUSE_CUSTOM_TABLE is not set +# CONFIG_EFUSE_VIRTUAL is not set +CONFIG_EFUSE_MAX_BLK_LEN=256 +# end of eFuse Bit Manager + +# +# ESP-TLS +# +CONFIG_ESP_TLS_USING_MBEDTLS=y +CONFIG_ESP_TLS_USE_DS_PERIPHERAL=y +# CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS is not set +# CONFIG_ESP_TLS_SERVER is not set +# CONFIG_ESP_TLS_PSK_VERIFICATION is not set +# CONFIG_ESP_TLS_INSECURE is not set +# end of ESP-TLS + +# +# ESP32S3-Specific +# +CONFIG_ESP32S3_REV_MIN_0=y +# CONFIG_ESP32S3_REV_MIN_1 is not set +# CONFIG_ESP32S3_REV_MIN_2 is not set +CONFIG_ESP32S3_REV_MIN_FULL=0 +CONFIG_ESP_REV_MIN_FULL=0 +CONFIG_ESP32S3_REV_MAX_FULL_STR_OPT=y +CONFIG_ESP32S3_REV_MAX_FULL=99 +CONFIG_ESP_REV_MAX_FULL=99 +# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_80 is not set +# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_160 is not set +CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240=y +CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ=240 + +# +# Cache config +# +CONFIG_ESP32S3_INSTRUCTION_CACHE_16KB=y +# CONFIG_ESP32S3_INSTRUCTION_CACHE_32KB is not set +CONFIG_ESP32S3_INSTRUCTION_CACHE_SIZE=0x4000 +# CONFIG_ESP32S3_INSTRUCTION_CACHE_4WAYS is not set +CONFIG_ESP32S3_INSTRUCTION_CACHE_8WAYS=y +CONFIG_ESP32S3_ICACHE_ASSOCIATED_WAYS=8 +# CONFIG_ESP32S3_INSTRUCTION_CACHE_LINE_16B is not set +CONFIG_ESP32S3_INSTRUCTION_CACHE_LINE_32B=y +CONFIG_ESP32S3_INSTRUCTION_CACHE_LINE_SIZE=32 +# CONFIG_ESP32S3_INSTRUCTION_CACHE_WRAP is not set +# CONFIG_ESP32S3_DATA_CACHE_16KB is not set +CONFIG_ESP32S3_DATA_CACHE_32KB=y +# CONFIG_ESP32S3_DATA_CACHE_64KB is not set +CONFIG_ESP32S3_DATA_CACHE_SIZE=0x8000 +# CONFIG_ESP32S3_DATA_CACHE_4WAYS is not set +CONFIG_ESP32S3_DATA_CACHE_8WAYS=y +CONFIG_ESP32S3_DCACHE_ASSOCIATED_WAYS=8 +# CONFIG_ESP32S3_DATA_CACHE_LINE_16B is not set +# CONFIG_ESP32S3_DATA_CACHE_LINE_32B is not set +CONFIG_ESP32S3_DATA_CACHE_LINE_64B=y +CONFIG_ESP32S3_DATA_CACHE_LINE_SIZE=64 +# CONFIG_ESP32S3_DATA_CACHE_WRAP is not set +# end of Cache config + +CONFIG_ESP32S3_SPIRAM_SUPPORT=y + +# +# SPI RAM config +# +# CONFIG_SPIRAM_MODE_QUAD is not set +CONFIG_SPIRAM_MODE_OCT=y +CONFIG_SPIRAM_TYPE_AUTO=y +# CONFIG_SPIRAM_TYPE_ESPPSRAM64 is not set +CONFIG_SPIRAM_SIZE=-1 +CONFIG_SPIRAM_CLK_IO=30 +CONFIG_SPIRAM_CS_IO=26 +# CONFIG_SPIRAM_FETCH_INSTRUCTIONS is not set +# CONFIG_SPIRAM_RODATA is not set +# CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY is not set +CONFIG_SPIRAM_SPEED_80M=y +# CONFIG_SPIRAM_SPEED_40M is not set +CONFIG_SPIRAM=y +CONFIG_SPIRAM_BOOT_INIT=y +# CONFIG_SPIRAM_IGNORE_NOTFOUND is not set +# CONFIG_SPIRAM_USE_MEMMAP is not set +# CONFIG_SPIRAM_USE_CAPS_ALLOC=y +CONFIG_SPIRAM_USE_MALLOC=y +CONFIG_SPIRAM_MEMTEST=y +# CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP is not set +# end of SPI RAM config + +# CONFIG_ESP32S3_TRAX is not set +CONFIG_ESP32S3_TRACEMEM_RESERVE_DRAM=0x0 +# CONFIG_ESP32S3_ULP_COPROC_ENABLED is not set +CONFIG_ESP32S3_ULP_COPROC_RESERVE_MEM=0 +CONFIG_ESP32S3_DEBUG_OCDAWARE=y +CONFIG_ESP32S3_BROWNOUT_DET=y +CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_7=y +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_1 is not set +CONFIG_ESP32S3_BROWNOUT_DET_LVL=7 +CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC_FRC1=y +# CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC is not set +# CONFIG_ESP32S3_TIME_SYSCALL_USE_FRC1 is not set +# CONFIG_ESP32S3_TIME_SYSCALL_USE_NONE is not set +CONFIG_ESP32S3_RTC_CLK_SRC_INT_RC=y +# CONFIG_ESP32S3_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_ESP32S3_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_ESP32S3_RTC_CLK_SRC_INT_8MD256 is not set +CONFIG_ESP32S3_RTC_CLK_CAL_CYCLES=1024 +CONFIG_ESP32S3_DEEP_SLEEP_WAKEUP_DELAY=2000 +# CONFIG_ESP32S3_NO_BLOBS is not set +# CONFIG_ESP32S3_RTCDATA_IN_FAST_MEM is not set +# CONFIG_ESP32S3_USE_FIXED_STATIC_RAM_SIZE is not set +# end of ESP32S3-Specific + +# +# ADC-Calibration +# +# end of ADC-Calibration + +# +# Common ESP-related +# +CONFIG_ESP_ERR_TO_NAME_LOOKUP=y +# end of Common ESP-related + +# +# Ethernet +# +CONFIG_ETH_ENABLED=y +CONFIG_ETH_USE_SPI_ETHERNET=y +# CONFIG_ETH_SPI_ETHERNET_DM9051 is not set +# CONFIG_ETH_SPI_ETHERNET_W5500 is not set +# CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL is not set +# CONFIG_ETH_USE_OPENETH is not set +# end of Ethernet + +# +# Event Loop Library +# +# CONFIG_ESP_EVENT_LOOP_PROFILING is not set +CONFIG_ESP_EVENT_POST_FROM_ISR=y +CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y +# end of Event Loop Library + +# +# GDB Stub +# +# end of GDB Stub + +# +# ESP HTTP client +# +CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y +# CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set +CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH=y +# end of ESP HTTP client + +# +# HTTP Server +# +CONFIG_HTTPD_MAX_REQ_HDR_LEN=512 +CONFIG_HTTPD_MAX_URI_LEN=512 +CONFIG_HTTPD_ERR_RESP_NO_DELAY=y +CONFIG_HTTPD_PURGE_BUF_LEN=32 +# CONFIG_HTTPD_LOG_PURGE_DATA is not set +# CONFIG_HTTPD_WS_SUPPORT is not set +# end of HTTP Server + +# +# ESP HTTPS OTA +# +# CONFIG_OTA_ALLOW_HTTP is not set +# end of ESP HTTPS OTA + +# +# ESP HTTPS server +# +# CONFIG_ESP_HTTPS_SERVER_ENABLE is not set +# end of ESP HTTPS server + +# +# Hardware Settings +# + +# +# MAC Config +# +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y +# CONFIG_ESP32S3_UNIVERSAL_MAC_ADDRESSES_TWO is not set +CONFIG_ESP32S3_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP32S3_UNIVERSAL_MAC_ADDRESSES=4 +# end of MAC Config + +# +# Sleep Config +# +CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND=y +CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND=y +CONFIG_ESP_SLEEP_PSRAM_LEAKAGE_WORKAROUND=y +CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=y +CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU=y +# end of Sleep Config + +# +# RTC Clock Config +# +CONFIG_RTC_CLOCK_BBPLL_POWER_ON_WITH_USB=y +# end of RTC Clock Config +# end of Hardware Settings + +# +# IPC (Inter-Processor Call) +# +CONFIG_ESP_IPC_TASK_STACK_SIZE=1536 +CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y +CONFIG_ESP_IPC_ISR_ENABLE=y +# end of IPC (Inter-Processor Call) + +# +# LCD and Touch Panel +# + +# +# LCD Peripheral Configuration +# +CONFIG_LCD_PANEL_IO_FORMAT_BUF_SIZE=32 +# CONFIG_LCD_RGB_ISR_IRAM_SAFE is not set +# end of LCD Peripheral Configuration +# end of LCD and Touch Panel + +# +# ESP NETIF Adapter +# +CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL=120 +CONFIG_ESP_NETIF_TCPIP_LWIP=y +# CONFIG_ESP_NETIF_LOOPBACK is not set +CONFIG_ESP_NETIF_TCPIP_ADAPTER_COMPATIBLE_LAYER=y +# end of ESP NETIF Adapter + +# +# PHY +# +CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y +# CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION is not set +CONFIG_ESP_PHY_MAX_WIFI_TX_POWER=20 +CONFIG_ESP_PHY_MAX_TX_POWER=20 +CONFIG_ESP_PHY_ENABLE_USB=y +CONFIG_ESP_PHY_RF_CAL_PARTIAL=y +# CONFIG_ESP_PHY_RF_CAL_NONE is not set +# CONFIG_ESP_PHY_RF_CAL_FULL is not set +CONFIG_ESP_PHY_CALIBRATION_MODE=0 +# end of PHY + +# +# Power Management +# +# CONFIG_PM_ENABLE is not set +CONFIG_PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP=y +CONFIG_PM_POWER_DOWN_TAGMEM_IN_LIGHT_SLEEP=y +# end of Power Management + +# +# ESP Ringbuf +# +# CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH is not set +# CONFIG_RINGBUF_PLACE_ISR_FUNCTIONS_INTO_FLASH is not set +# end of ESP Ringbuf + +# +# ESP System Settings +# +# CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT is not set +CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y +# CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set +# CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set +# CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set +CONFIG_ESP_SYSTEM_RTC_FAST_MEM_AS_HEAP_DEPCHECK=y +CONFIG_ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP=y + +# +# Memory protection +# +# end of Memory protection + +CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_ESP_MAIN_TASK_STACK_SIZE=3584 +CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0=y +# CONFIG_ESP_MAIN_TASK_AFFINITY_CPU1 is not set +# CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_ESP_MAIN_TASK_AFFINITY=0x0 +CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE=2048 +CONFIG_ESP_CONSOLE_UART_DEFAULT=y +# CONFIG_ESP_CONSOLE_USB_CDC is not set +# CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG is not set +# CONFIG_ESP_CONSOLE_UART_CUSTOM is not set +# CONFIG_ESP_CONSOLE_NONE is not set +# CONFIG_ESP_CONSOLE_SECONDARY_NONE is not set +CONFIG_ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG=y +CONFIG_ESP_CONSOLE_UART=y +CONFIG_ESP_CONSOLE_MULTIPLE_UART=y +CONFIG_ESP_CONSOLE_UART_NUM=0 +CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 +CONFIG_ESP_INT_WDT=y +CONFIG_ESP_INT_WDT_TIMEOUT_MS=300 +CONFIG_ESP_INT_WDT_CHECK_CPU1=y +CONFIG_ESP_TASK_WDT=y +# CONFIG_ESP_TASK_WDT_PANIC is not set +CONFIG_ESP_TASK_WDT_TIMEOUT_S=5 +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=y +# CONFIG_ESP_PANIC_HANDLER_IRAM is not set +# CONFIG_ESP_DEBUG_STUBS_ENABLE is not set +CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4=y +# end of ESP System Settings + +# +# High resolution timer (esp_timer) +# +# CONFIG_ESP_TIMER_PROFILING is not set +CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER=y +CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER=y +CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP_TIMER_INTERRUPT_LEVEL=1 +# CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD is not set +CONFIG_ESP_TIMER_IMPL_SYSTIMER=y +# end of High resolution timer (esp_timer) + +# +# Wi-Fi +# +CONFIG_ESP32_WIFI_ENABLED=y +CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10 +CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32 +# CONFIG_ESP32_WIFI_STATIC_TX_BUFFER is not set +CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y +CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1 +CONFIG_ESP32_WIFI_CACHE_TX_BUFFER_NUM=32 +CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=32 +# CONFIG_ESP32_WIFI_CSI_ENABLED is not set +CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP32_WIFI_TX_BA_WIN=6 +CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP32_WIFI_RX_BA_WIN=6 +# CONFIG_ESP32_WIFI_AMSDU_TX_ENABLED is not set +CONFIG_ESP32_WIFI_NVS_ENABLED=y +CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0=y +# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1 is not set +CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 +CONFIG_ESP32_WIFI_IRAM_OPT=y +CONFIG_ESP32_WIFI_RX_IRAM_OPT=y +CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y +# CONFIG_ESP_WIFI_SLP_IRAM_OPT is not set +# CONFIG_ESP_WIFI_FTM_ENABLE is not set +# CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE is not set +# CONFIG_ESP_WIFI_GCMP_SUPPORT is not set +# CONFIG_ESP_WIFI_GMAC_SUPPORT is not set +CONFIG_ESP_WIFI_SOFTAP_SUPPORT=y +# CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT is not set +CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7 +# end of Wi-Fi + +# +# Core dump +# +# CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH is not set +# CONFIG_ESP_COREDUMP_ENABLE_TO_UART is not set +CONFIG_ESP_COREDUMP_ENABLE_TO_NONE=y +# end of Core dump + +# +# FAT Filesystem support +# +# CONFIG_FATFS_CODEPAGE_DYNAMIC is not set +CONFIG_FATFS_CODEPAGE_437=y +# CONFIG_FATFS_CODEPAGE_720 is not set +# CONFIG_FATFS_CODEPAGE_737 is not set +# CONFIG_FATFS_CODEPAGE_771 is not set +# CONFIG_FATFS_CODEPAGE_775 is not set +# CONFIG_FATFS_CODEPAGE_850 is not set +# CONFIG_FATFS_CODEPAGE_852 is not set +# CONFIG_FATFS_CODEPAGE_855 is not set +# CONFIG_FATFS_CODEPAGE_857 is not set +# CONFIG_FATFS_CODEPAGE_860 is not set +# CONFIG_FATFS_CODEPAGE_861 is not set +# CONFIG_FATFS_CODEPAGE_862 is not set +# CONFIG_FATFS_CODEPAGE_863 is not set +# CONFIG_FATFS_CODEPAGE_864 is not set +# CONFIG_FATFS_CODEPAGE_865 is not set +# CONFIG_FATFS_CODEPAGE_866 is not set +# CONFIG_FATFS_CODEPAGE_869 is not set +# CONFIG_FATFS_CODEPAGE_932 is not set +# CONFIG_FATFS_CODEPAGE_936 is not set +# CONFIG_FATFS_CODEPAGE_949 is not set +# CONFIG_FATFS_CODEPAGE_950 is not set +CONFIG_FATFS_CODEPAGE=437 +CONFIG_FATFS_LFN_NONE=y +# CONFIG_FATFS_LFN_HEAP is not set +# CONFIG_FATFS_LFN_STACK is not set +CONFIG_FATFS_FS_LOCK=0 +CONFIG_FATFS_TIMEOUT_MS=10000 +CONFIG_FATFS_PER_FILE_CACHE=y +CONFIG_FATFS_ALLOC_PREFER_EXTRAM=y +# CONFIG_FATFS_USE_FASTSEEK is not set +# end of FAT Filesystem support + +# +# Modbus configuration +# +CONFIG_FMB_COMM_MODE_TCP_EN=y +CONFIG_FMB_TCP_PORT_DEFAULT=502 +CONFIG_FMB_TCP_PORT_MAX_CONN=5 +CONFIG_FMB_TCP_CONNECTION_TOUT_SEC=20 +CONFIG_FMB_COMM_MODE_RTU_EN=y +CONFIG_FMB_COMM_MODE_ASCII_EN=y +CONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND=150 +CONFIG_FMB_MASTER_DELAY_MS_CONVERT=200 +CONFIG_FMB_QUEUE_LENGTH=20 +CONFIG_FMB_PORT_TASK_STACK_SIZE=4096 +CONFIG_FMB_SERIAL_BUF_SIZE=256 +CONFIG_FMB_SERIAL_ASCII_BITS_PER_SYMB=8 +CONFIG_FMB_SERIAL_ASCII_TIMEOUT_RESPOND_MS=1000 +CONFIG_FMB_PORT_TASK_PRIO=10 +# CONFIG_FMB_PORT_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_FMB_PORT_TASK_AFFINITY_CPU0=y +# CONFIG_FMB_PORT_TASK_AFFINITY_CPU1 is not set +CONFIG_FMB_PORT_TASK_AFFINITY=0x0 +CONFIG_FMB_CONTROLLER_SLAVE_ID_SUPPORT=y +CONFIG_FMB_CONTROLLER_SLAVE_ID=0x00112233 +CONFIG_FMB_CONTROLLER_NOTIFY_TIMEOUT=20 +CONFIG_FMB_CONTROLLER_NOTIFY_QUEUE_SIZE=20 +CONFIG_FMB_CONTROLLER_STACK_SIZE=4096 +CONFIG_FMB_EVENT_QUEUE_TIMEOUT=20 +# CONFIG_FMB_TIMER_PORT_ENABLED is not set +# CONFIG_FMB_TIMER_USE_ISR_DISPATCH_METHOD is not set +# end of Modbus configuration + +# +# FreeRTOS +# +# CONFIG_FREERTOS_UNICORE is not set +CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_TICK_SUPPORT_SYSTIMER=y +CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL1=y +# CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL3 is not set +CONFIG_FREERTOS_SYSTICK_USES_SYSTIMER=y +CONFIG_FREERTOS_HZ=100 +CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION=y +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set +CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y +# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set +CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y +CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1 +CONFIG_FREERTOS_ASSERT_FAIL_ABORT=y +# CONFIG_FREERTOS_ASSERT_FAIL_PRINT_CONTINUE is not set +# CONFIG_FREERTOS_ASSERT_DISABLE is not set +CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536 +CONFIG_FREERTOS_ISR_STACKSIZE=1536 +# CONFIG_FREERTOS_LEGACY_HOOKS is not set +CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 +CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y +# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set +CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 +CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 +CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 +# CONFIG_FREERTOS_USE_TRACE_FACILITY is not set +# CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set +CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y +# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set +# CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set +CONFIG_FREERTOS_DEBUG_OCDAWARE=y +CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y +# CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH is not set +# end of FreeRTOS + +# +# Hardware Abstraction Layer (HAL) and Low Level (LL) +# +CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y +# CONFIG_HAL_ASSERTION_DISABLE is not set +# CONFIG_HAL_ASSERTION_SILIENT is not set +CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=1 +# end of Hardware Abstraction Layer (HAL) and Low Level (LL) + +# +# Heap memory debugging +# +CONFIG_HEAP_POISONING_DISABLED=y +# CONFIG_HEAP_POISONING_LIGHT is not set +# CONFIG_HEAP_POISONING_COMPREHENSIVE is not set +CONFIG_HEAP_TRACING_OFF=y +# CONFIG_HEAP_TRACING_STANDALONE is not set +# CONFIG_HEAP_TRACING_TOHOST is not set +# CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set +# end of Heap memory debugging + +# +# jsmn +# +# CONFIG_JSMN_PARENT_LINKS is not set +# CONFIG_JSMN_STRICT is not set +# end of jsmn + +# +# libsodium +# +# end of libsodium + +# +# Log output +# +# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set +# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set +# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set +CONFIG_LOG_DEFAULT_LEVEL_INFO=y +# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set +# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set +CONFIG_LOG_DEFAULT_LEVEL=3 +CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y +# CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set +# CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set +CONFIG_LOG_MAXIMUM_LEVEL=3 +CONFIG_LOG_COLORS=y +CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y +# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set +# end of Log output + +# +# LWIP +# +CONFIG_LWIP_LOCAL_HOSTNAME="espressif" +# CONFIG_LWIP_NETIF_API is not set +# CONFIG_LWIP_TCPIP_CORE_LOCKING is not set +# CONFIG_LWIP_CHECK_THREAD_SAFETY is not set +CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y +# CONFIG_LWIP_L2_TO_L3_COPY is not set +# CONFIG_LWIP_IRAM_OPTIMIZATION is not set +CONFIG_LWIP_TIMERS_ONDEMAND=y +CONFIG_LWIP_MAX_SOCKETS=10 +# CONFIG_LWIP_USE_ONLY_LWIP_SELECT is not set +# CONFIG_LWIP_SO_LINGER is not set +CONFIG_LWIP_SO_REUSE=y +CONFIG_LWIP_SO_REUSE_RXTOALL=y +# CONFIG_LWIP_SO_RCVBUF is not set +# CONFIG_LWIP_NETBUF_RECVINFO is not set +CONFIG_LWIP_IP4_FRAG=y +CONFIG_LWIP_IP6_FRAG=y +# CONFIG_LWIP_IP4_REASSEMBLY is not set +# CONFIG_LWIP_IP6_REASSEMBLY is not set +# CONFIG_LWIP_IP_FORWARD is not set +# CONFIG_LWIP_STATS is not set +# CONFIG_LWIP_ETHARP_TRUST_IP_MAC is not set +CONFIG_LWIP_ESP_GRATUITOUS_ARP=y +CONFIG_LWIP_GARP_TMR_INTERVAL=60 +CONFIG_LWIP_ESP_MLDV6_REPORT=y +CONFIG_LWIP_MLDV6_TMR_INTERVAL=40 +CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32 +CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y +# CONFIG_LWIP_DHCP_DISABLE_CLIENT_ID is not set +CONFIG_LWIP_DHCP_DISABLE_VENDOR_CLASS_ID=y +# CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set +CONFIG_LWIP_DHCP_OPTIONS_LEN=68 +CONFIG_LWIP_DHCP_COARSE_TIMER_SECS=1 + +# +# DHCP server +# +CONFIG_LWIP_DHCPS=y +CONFIG_LWIP_DHCPS_LEASE_UNIT=60 +CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8 +# end of DHCP server + +# CONFIG_LWIP_AUTOIP is not set +CONFIG_LWIP_IPV6=y +# CONFIG_LWIP_IPV6_AUTOCONFIG is not set +CONFIG_LWIP_IPV6_NUM_ADDRESSES=3 +# CONFIG_LWIP_IPV6_FORWARD is not set +# CONFIG_LWIP_NETIF_STATUS_CALLBACK is not set +CONFIG_LWIP_NETIF_LOOPBACK=y +CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8 + +# +# TCP +# +CONFIG_LWIP_MAX_ACTIVE_TCP=16 +CONFIG_LWIP_MAX_LISTENING_TCP=16 +CONFIG_LWIP_TCP_HIGH_SPEED_RETRANSMISSION=y +CONFIG_LWIP_TCP_MAXRTX=12 +CONFIG_LWIP_TCP_SYNMAXRTX=12 +CONFIG_LWIP_TCP_MSS=1440 +CONFIG_LWIP_TCP_TMR_INTERVAL=250 +CONFIG_LWIP_TCP_MSL=60000 +CONFIG_LWIP_TCP_FIN_WAIT_TIMEOUT=20000 +CONFIG_LWIP_TCP_SND_BUF_DEFAULT=5744 +CONFIG_LWIP_TCP_WND_DEFAULT=5744 +CONFIG_LWIP_TCP_RECVMBOX_SIZE=6 +CONFIG_LWIP_TCP_QUEUE_OOSEQ=y +# CONFIG_LWIP_TCP_SACK_OUT is not set +# CONFIG_LWIP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set +CONFIG_LWIP_TCP_OVERSIZE_MSS=y +# CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set +# CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set +CONFIG_LWIP_TCP_RTO_TIME=1500 +# end of TCP + +# +# UDP +# +CONFIG_LWIP_MAX_UDP_PCBS=16 +CONFIG_LWIP_UDP_RECVMBOX_SIZE=6 +# end of UDP + +# +# Checksums +# +# CONFIG_LWIP_CHECKSUM_CHECK_IP is not set +# CONFIG_LWIP_CHECKSUM_CHECK_UDP is not set +CONFIG_LWIP_CHECKSUM_CHECK_ICMP=y +# end of Checksums + +CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=3072 +CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set +# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU1 is not set +CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF +# CONFIG_LWIP_PPP_SUPPORT is not set +CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3 +CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5 +# CONFIG_LWIP_SLIP_SUPPORT is not set + +# +# ICMP +# +CONFIG_LWIP_ICMP=y +# CONFIG_LWIP_MULTICAST_PING is not set +# CONFIG_LWIP_BROADCAST_PING is not set +# end of ICMP + +# +# LWIP RAW API +# +CONFIG_LWIP_MAX_RAW_PCBS=16 +# end of LWIP RAW API + +# +# SNTP +# +CONFIG_LWIP_SNTP_MAX_SERVERS=1 +# CONFIG_LWIP_DHCP_GET_NTP_SRV is not set +CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000 +# end of SNTP + +CONFIG_LWIP_ESP_LWIP_ASSERT=y + +# +# Hooks +# +# CONFIG_LWIP_HOOK_TCP_ISN_NONE is not set +CONFIG_LWIP_HOOK_TCP_ISN_DEFAULT=y +# CONFIG_LWIP_HOOK_TCP_ISN_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_ROUTE_NONE=y +# CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_ROUTE_CUSTOM is not set +CONFIG_LWIP_HOOK_ND6_GET_GW_NONE=y +# CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT is not set +# CONFIG_LWIP_HOOK_ND6_GET_GW_CUSTOM is not set +CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y +# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT is not set +# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM is not set +# end of Hooks + +# CONFIG_LWIP_DEBUG is not set +# end of LWIP + +# +# mbedTLS +# +CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y +# CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC is not set +# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set +# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set +CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y +CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384 +CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096 +# CONFIG_MBEDTLS_DYNAMIC_BUFFER is not set +# CONFIG_MBEDTLS_DEBUG is not set + +# +# mbedTLS v2.28.x related +# +# CONFIG_MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH is not set +# CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set +# CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set +CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=y +# end of mbedTLS v2.28.x related + +# +# Certificate Bundle +# +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=y +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE is not set +# CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE is not set +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200 +# end of Certificate Bundle + +# CONFIG_MBEDTLS_ECP_RESTARTABLE is not set +# CONFIG_MBEDTLS_CMAC_C is not set +CONFIG_MBEDTLS_HARDWARE_AES=y +CONFIG_MBEDTLS_AES_USE_INTERRUPT=y +CONFIG_MBEDTLS_HARDWARE_MPI=y +CONFIG_MBEDTLS_HARDWARE_SHA=y +CONFIG_MBEDTLS_ROM_MD5=y +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY is not set +CONFIG_MBEDTLS_HAVE_TIME=y +# CONFIG_MBEDTLS_HAVE_TIME_DATE is not set +CONFIG_MBEDTLS_ECDSA_DETERMINISTIC=y +CONFIG_MBEDTLS_SHA512_C=y +CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y +# CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set +# CONFIG_MBEDTLS_TLS_CLIENT_ONLY is not set +# CONFIG_MBEDTLS_TLS_DISABLED is not set +CONFIG_MBEDTLS_TLS_SERVER=y +CONFIG_MBEDTLS_TLS_CLIENT=y +CONFIG_MBEDTLS_TLS_ENABLED=y + +# +# TLS Key Exchange Methods +# +# CONFIG_MBEDTLS_PSK_MODES is not set +CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_DHE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y +# end of TLS Key Exchange Methods + +CONFIG_MBEDTLS_SSL_RENEGOTIATION=y +# CONFIG_MBEDTLS_SSL_PROTO_SSL3 is not set +CONFIG_MBEDTLS_SSL_PROTO_TLS1=y +CONFIG_MBEDTLS_SSL_PROTO_TLS1_1=y +CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y +# CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 is not set +# CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set +CONFIG_MBEDTLS_SSL_ALPN=y +CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y +CONFIG_MBEDTLS_X509_CHECK_KEY_USAGE=y +CONFIG_MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE=y +CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y + +# +# Symmetric Ciphers +# +CONFIG_MBEDTLS_AES_C=y +# CONFIG_MBEDTLS_CAMELLIA_C is not set +# CONFIG_MBEDTLS_DES_C is not set +CONFIG_MBEDTLS_RC4_DISABLED=y +# CONFIG_MBEDTLS_RC4_ENABLED_NO_DEFAULT is not set +# CONFIG_MBEDTLS_RC4_ENABLED is not set +# CONFIG_MBEDTLS_BLOWFISH_C is not set +# CONFIG_MBEDTLS_XTEA_C is not set +CONFIG_MBEDTLS_CCM_C=y +CONFIG_MBEDTLS_GCM_C=y +# CONFIG_MBEDTLS_NIST_KW_C is not set +# end of Symmetric Ciphers + +# CONFIG_MBEDTLS_RIPEMD160_C is not set + +# +# Certificates +# +CONFIG_MBEDTLS_PEM_PARSE_C=y +CONFIG_MBEDTLS_PEM_WRITE_C=y +CONFIG_MBEDTLS_X509_CRL_PARSE_C=y +CONFIG_MBEDTLS_X509_CSR_PARSE_C=y +# end of Certificates + +CONFIG_MBEDTLS_ECP_C=y +CONFIG_MBEDTLS_ECDH_C=y +CONFIG_MBEDTLS_ECDSA_C=y +# CONFIG_MBEDTLS_ECJPAKE_C is not set +CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y +CONFIG_MBEDTLS_ECP_NIST_OPTIM=y +# CONFIG_MBEDTLS_POLY1305_C is not set +# CONFIG_MBEDTLS_CHACHA20_C is not set +# CONFIG_MBEDTLS_HKDF_C is not set +# CONFIG_MBEDTLS_THREADING_C is not set +# CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI is not set +# CONFIG_MBEDTLS_SECURITY_RISKS is not set +# end of mbedTLS + +# +# mDNS +# +CONFIG_MDNS_MAX_SERVICES=10 +CONFIG_MDNS_TASK_PRIORITY=1 +CONFIG_MDNS_TASK_STACK_SIZE=4096 +# CONFIG_MDNS_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_MDNS_TASK_AFFINITY_CPU0=y +# CONFIG_MDNS_TASK_AFFINITY_CPU1 is not set +CONFIG_MDNS_TASK_AFFINITY=0x0 +CONFIG_MDNS_SERVICE_ADD_TIMEOUT_MS=2000 +# CONFIG_MDNS_STRICT_MODE is not set +CONFIG_MDNS_TIMER_PERIOD_MS=100 +# CONFIG_MDNS_NETWORKING_SOCKET is not set +CONFIG_MDNS_MULTIPLE_INSTANCE=y +# end of mDNS + +# +# ESP-MQTT Configurations +# +CONFIG_MQTT_PROTOCOL_311=y +CONFIG_MQTT_TRANSPORT_SSL=y +CONFIG_MQTT_TRANSPORT_WEBSOCKET=y +CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y +# CONFIG_MQTT_MSG_ID_INCREMENTAL is not set +# CONFIG_MQTT_SKIP_PUBLISH_IF_DISCONNECTED is not set +# CONFIG_MQTT_REPORT_DELETED_MESSAGES is not set +# CONFIG_MQTT_USE_CUSTOM_CONFIG is not set +# CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED is not set +# CONFIG_MQTT_CUSTOM_OUTBOX is not set +# end of ESP-MQTT Configurations + +# +# Newlib +# +CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y +# CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF is not set +# CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR is not set +# CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF is not set +# CONFIG_NEWLIB_STDIN_LINE_ENDING_LF is not set +CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y +# CONFIG_NEWLIB_NANO_FORMAT is not set +# end of Newlib + +# +# NVS +# +# CONFIG_NVS_ASSERT_ERROR_CHECK is not set +# end of NVS + +# +# OpenSSL +# +# CONFIG_OPENSSL_DEBUG is not set +CONFIG_OPENSSL_ERROR_STACK=y +# CONFIG_OPENSSL_ASSERT_DO_NOTHING is not set +CONFIG_OPENSSL_ASSERT_EXIT=y +# end of OpenSSL + +# +# OpenThread +# +# CONFIG_OPENTHREAD_ENABLED is not set +# end of OpenThread + +# +# PThreads +# +CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_PTHREAD_STACK_MIN=768 +CONFIG_PTHREAD_DEFAULT_CORE_NO_AFFINITY=y +# CONFIG_PTHREAD_DEFAULT_CORE_0 is not set +# CONFIG_PTHREAD_DEFAULT_CORE_1 is not set +CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" +# end of PThreads + +# +# SPI Flash driver +# +# CONFIG_SPI_FLASH_VERIFY_WRITE is not set +# CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set +CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y +# CONFIG_SPI_FLASH_ROM_IMPL is not set +CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set +# CONFIG_SPI_FLASH_USE_LEGACY_IMPL is not set +# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set +# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set +CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y +CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20 +CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=1 +CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192 +# CONFIG_SPI_FLASH_SIZE_OVERRIDE is not set +# CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED is not set +# CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST is not set + +# +# Auto-detect flash chips +# +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_MXIC_OPI_CHIP=y +# end of Auto-detect flash chips + +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=y +# end of SPI Flash driver + +# +# SPIFFS Configuration +# +CONFIG_SPIFFS_MAX_PARTITIONS=3 + +# +# SPIFFS Cache Configuration +# +CONFIG_SPIFFS_CACHE=y +CONFIG_SPIFFS_CACHE_WR=y +# CONFIG_SPIFFS_CACHE_STATS is not set +# end of SPIFFS Cache Configuration + +CONFIG_SPIFFS_PAGE_CHECK=y +CONFIG_SPIFFS_GC_MAX_RUNS=10 +# CONFIG_SPIFFS_GC_STATS is not set +CONFIG_SPIFFS_PAGE_SIZE=256 +CONFIG_SPIFFS_OBJ_NAME_LEN=32 +# CONFIG_SPIFFS_FOLLOW_SYMLINKS is not set +CONFIG_SPIFFS_USE_MAGIC=y +CONFIG_SPIFFS_USE_MAGIC_LENGTH=y +CONFIG_SPIFFS_META_LENGTH=4 +CONFIG_SPIFFS_USE_MTIME=y + +# +# Debug Configuration +# +# CONFIG_SPIFFS_DBG is not set +# CONFIG_SPIFFS_API_DBG is not set +# CONFIG_SPIFFS_GC_DBG is not set +# CONFIG_SPIFFS_CACHE_DBG is not set +# CONFIG_SPIFFS_CHECK_DBG is not set +# CONFIG_SPIFFS_TEST_VISUALISATION is not set +# end of Debug Configuration +# end of SPIFFS Configuration + +# +# TCP Transport +# + +# +# Websocket +# +CONFIG_WS_TRANSPORT=y +CONFIG_WS_BUFFER_SIZE=1024 +# end of Websocket +# end of TCP Transport + +# +# TinyUSB Stack +# +# CONFIG_TINYUSB is not set +# end of TinyUSB Stack + +# +# Unity unit testing library +# +CONFIG_UNITY_ENABLE_FLOAT=y +CONFIG_UNITY_ENABLE_DOUBLE=y +# CONFIG_UNITY_ENABLE_64BIT is not set +# CONFIG_UNITY_ENABLE_COLOR is not set +CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y +# CONFIG_UNITY_ENABLE_FIXTURE is not set +# CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set +# end of Unity unit testing library + +# +# USB-OTG +# +CONFIG_USB_OTG_SUPPORTED=y +CONFIG_USB_HOST_CONTROL_TRANSFER_MAX_SIZE=256 +CONFIG_USB_HOST_HW_BUFFER_BIAS_BALANCED=y +# CONFIG_USB_HOST_HW_BUFFER_BIAS_IN is not set +# CONFIG_USB_HOST_HW_BUFFER_BIAS_PERIODIC_OUT is not set + +# +# Root Hub configuration +# +CONFIG_USB_HOST_DEBOUNCE_DELAY_MS=250 +CONFIG_USB_HOST_RESET_HOLD_MS=30 +CONFIG_USB_HOST_RESET_RECOVERY_MS=30 +CONFIG_USB_HOST_SET_ADDR_RECOVERY_MS=10 +# end of Root Hub configuration +# end of USB-OTG + +# +# Virtual file system +# +CONFIG_VFS_SUPPORT_IO=y +CONFIG_VFS_SUPPORT_DIR=y +CONFIG_VFS_SUPPORT_SELECT=y +CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y +CONFIG_VFS_SUPPORT_TERMIOS=y + +# +# Host File System I/O (Semihosting) +# +CONFIG_VFS_SEMIHOSTFS_MAX_MOUNT_POINTS=1 +# end of Host File System I/O (Semihosting) +# end of Virtual file system + +# +# Wear Levelling +# +# CONFIG_WL_SECTOR_SIZE_512 is not set +CONFIG_WL_SECTOR_SIZE_4096=y +CONFIG_WL_SECTOR_SIZE=4096 +# end of Wear Levelling + +# +# Wi-Fi Provisioning Manager +# +CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16 +CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30 +# CONFIG_WIFI_PROV_BLE_FORCE_ENCRYPTION is not set +# end of Wi-Fi Provisioning Manager + +# +# Supplicant +# +CONFIG_WPA_MBEDTLS_CRYPTO=y +# CONFIG_WPA_WAPI_PSK is not set +# CONFIG_WPA_SUITE_B_192 is not set +# CONFIG_WPA_DEBUG_PRINT is not set +# CONFIG_WPA_TESTING_OPTIONS is not set +# CONFIG_WPA_WPS_STRICT is not set +# CONFIG_WPA_11KV_SUPPORT is not set +# CONFIG_WPA_MBO_SUPPORT is not set +# CONFIG_WPA_DPP_SUPPORT is not set +# end of Supplicant +# end of Component config + +# +# Compatibility options +# +# CONFIG_LEGACY_INCLUDE_COMMON_HEADERS is not set +# end of Compatibility options + +# Deprecated options for backward compatibility +CONFIG_TOOLPREFIX="xtensa-esp32s3-elf-" +# CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set +CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y +# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set +CONFIG_LOG_BOOTLOADER_LEVEL=3 +# CONFIG_APP_ROLLBACK_ENABLE is not set +# CONFIG_FLASH_ENCRYPTION_ENABLED is not set +CONFIG_FLASHMODE_QIO=y +# CONFIG_FLASHMODE_QOUT is not set +# CONFIG_FLASHMODE_DIO is not set +# CONFIG_FLASHMODE_DOUT is not set +# CONFIG_MONITOR_BAUD_9600B is not set +# CONFIG_MONITOR_BAUD_57600B is not set +CONFIG_MONITOR_BAUD_115200B=y +# CONFIG_MONITOR_BAUD_230400B is not set +# CONFIG_MONITOR_BAUD_921600B is not set +# CONFIG_MONITOR_BAUD_2MB is not set +# CONFIG_MONITOR_BAUD_OTHER is not set +CONFIG_MONITOR_BAUD_OTHER_VAL=115200 +CONFIG_MONITOR_BAUD=115200 +# CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG is not set +CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE=y +# CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED is not set +CONFIG_OPTIMIZATION_ASSERTIONS_SILENT=y +# CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set +CONFIG_OPTIMIZATION_ASSERTION_LEVEL=1 +# CONFIG_CXX_EXCEPTIONS is not set +CONFIG_STACK_CHECK_NONE=y +# CONFIG_STACK_CHECK_NORM is not set +# CONFIG_STACK_CHECK_STRONG is not set +# CONFIG_STACK_CHECK_ALL is not set +# CONFIG_WARN_WRITE_STRINGS is not set +# CONFIG_DISABLE_GCC8_WARNINGS is not set +# CONFIG_ESP32_APPTRACE_DEST_TRAX is not set +CONFIG_ESP32_APPTRACE_DEST_NONE=y +CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y +CONFIG_ADC2_DISABLE_DAC=y +CONFIG_DEFAULT_PSRAM_CLK_IO=30 +CONFIG_DEFAULT_PSRAM_CS_IO=26 +# CONFIG_EVENT_LOOP_PROFILING is not set +CONFIG_POST_EVENTS_FROM_ISR=y +CONFIG_POST_EVENTS_FROM_IRAM_ISR=y +CONFIG_ESP32C3_LIGHTSLEEP_GPIO_RESET_WORKAROUND=y +CONFIG_IPC_TASK_STACK_SIZE=1536 +CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y +# CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION is not set +CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20 +CONFIG_ESP32_PHY_MAX_TX_POWER=20 +CONFIG_ESP_SYSTEM_PM_POWER_DOWN_CPU=y +# CONFIG_ESP32S2_PANIC_PRINT_HALT is not set +CONFIG_ESP32S2_PANIC_PRINT_REBOOT=y +# CONFIG_ESP32S2_PANIC_SILENT_REBOOT is not set +# CONFIG_ESP32S2_PANIC_GDBSTUB is not set +CONFIG_ESP32S2_ALLOW_RTC_FAST_MEM_AS_HEAP=y +CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_MAIN_TASK_STACK_SIZE=3584 +CONFIG_CONSOLE_UART_DEFAULT=y +# CONFIG_CONSOLE_UART_CUSTOM is not set +# CONFIG_ESP_CONSOLE_UART_NONE is not set +CONFIG_CONSOLE_UART=y +CONFIG_CONSOLE_UART_NUM=0 +CONFIG_CONSOLE_UART_BAUDRATE=115200 +CONFIG_INT_WDT=y +CONFIG_INT_WDT_TIMEOUT_MS=300 +CONFIG_INT_WDT_CHECK_CPU1=y +CONFIG_TASK_WDT=y +# CONFIG_TASK_WDT_PANIC is not set +CONFIG_TASK_WDT_TIMEOUT_S=5 +CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1=y +# CONFIG_ESP32_DEBUG_STUBS_ENABLE is not set +CONFIG_TIMER_TASK_STACK_SIZE=3584 +# CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set +# CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set +CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y +CONFIG_MB_MASTER_TIMEOUT_MS_RESPOND=150 +CONFIG_MB_MASTER_DELAY_MS_CONVERT=200 +CONFIG_MB_QUEUE_LENGTH=20 +CONFIG_MB_SERIAL_TASK_STACK_SIZE=4096 +CONFIG_MB_SERIAL_BUF_SIZE=256 +CONFIG_MB_SERIAL_TASK_PRIO=10 +CONFIG_MB_CONTROLLER_SLAVE_ID_SUPPORT=y +CONFIG_MB_CONTROLLER_SLAVE_ID=0x00112233 +CONFIG_MB_CONTROLLER_NOTIFY_TIMEOUT=20 +CONFIG_MB_CONTROLLER_NOTIFY_QUEUE_SIZE=20 +CONFIG_MB_CONTROLLER_STACK_SIZE=4096 +CONFIG_MB_EVENT_QUEUE_TIMEOUT=20 +# CONFIG_MB_TIMER_PORT_ENABLED is not set +# CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK is not set +CONFIG_TIMER_TASK_PRIORITY=1 +CONFIG_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_TIMER_QUEUE_LENGTH=10 +# CONFIG_L2_TO_L3_COPY is not set +# CONFIG_USE_ONLY_LWIP_SELECT is not set +CONFIG_ESP_GRATUITOUS_ARP=y +CONFIG_GARP_TMR_INTERVAL=60 +CONFIG_TCPIP_RECVMBOX_SIZE=32 +CONFIG_TCP_MAXRTX=12 +CONFIG_TCP_SYNMAXRTX=12 +CONFIG_TCP_MSS=1440 +CONFIG_TCP_MSL=60000 +CONFIG_TCP_SND_BUF_DEFAULT=5744 +CONFIG_TCP_WND_DEFAULT=5744 +CONFIG_TCP_RECVMBOX_SIZE=6 +CONFIG_TCP_QUEUE_OOSEQ=y +# CONFIG_ESP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set +CONFIG_TCP_OVERSIZE_MSS=y +# CONFIG_TCP_OVERSIZE_QUARTER_MSS is not set +# CONFIG_TCP_OVERSIZE_DISABLE is not set +CONFIG_UDP_RECVMBOX_SIZE=6 +CONFIG_TCPIP_TASK_STACK_SIZE=3072 +CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_TCPIP_TASK_AFFINITY_CPU0 is not set +# CONFIG_TCPIP_TASK_AFFINITY_CPU1 is not set +CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF +# CONFIG_PPP_SUPPORT is not set +CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_ESP32_PTHREAD_STACK_MIN=768 +CONFIG_ESP32_DEFAULT_PTHREAD_CORE_NO_AFFINITY=y +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_0 is not set +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_1 is not set +CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread" +CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set +# CONFIG_USB_ENABLED is not set +CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y +CONFIG_SUPPORT_TERMIOS=y +CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1 +# End of deprecated options diff --git a/src/output_common/lut.c b/src/output_common/lut.c index 216e8e9b..e0a64dbe 100644 --- a/src/output_common/lut.c +++ b/src/output_common/lut.c @@ -443,6 +443,7 @@ LutFunctionPair find_lut_functions(enum EpdDrawMode mode, uint32_t lut_size) { return pair; } else if (mode & PREVIOUSLY_BLACK) { // FIXME: to implement + return pair; } } From a1049d6ebb21f08248ef79402faa35568f12d7f8 Mon Sep 17 00:00:00 2001 From: Valentin Roland Date: Sun, 1 Sep 2024 23:09:46 +0200 Subject: [PATCH 09/15] add previously black 8ppB LUT --- examples/fb_mode_test/main/main.c | 59 +++++++++++++++++------------ examples/test/main/main.c | 4 +- src/output_common/lut.c | 62 +++++++++++++++++++++++++------ test/test_diff.c | 5 +-- test/test_lut.c | 22 ++++++++++- 5 files changed, 111 insertions(+), 41 deletions(-) diff --git a/examples/fb_mode_test/main/main.c b/examples/fb_mode_test/main/main.c index 76e91c2f..4ddb8f9b 100644 --- a/examples/fb_mode_test/main/main.c +++ b/examples/fb_mode_test/main/main.c @@ -49,46 +49,59 @@ void clear() { memset(framebuffer, 0xFF, fb_size); } -void test_8ppB() { - clear(); - - // bytes in a line in 8ppB mode +/** + * Draw triangles at varying alignments into the framebuffer in 8ppB mode. + * start_line, start_column specify the start position. + * The bits that belong to a triangle are flipped, i.e., it is drawn at the + * inverse color to the background it is drawn onto. + */ +void draw_8bpp_triangles(int start_line, int start_column) { + start_column /= 8; int line_bytes = epd_width() / 8; - int start_line = 100; - int start_column = 80 / 8; - - // draw differently aligned triangles to check for uniformity for (int align = 0; align < 16; align++) { for (int height = 0; height < 16; height++) { for (int len = 0; len < height; len++) { int line = (start_line + 16 * align + height); int column = align + len; uint8_t* line_address = framebuffer + (line_bytes * line); - *(line_address + start_column + column / 8) &= ~(1 << (column % 8)); + *(line_address + start_column + column / 8) ^= 1 << (column % 8); } } } +} - int black_start_column = 160 / 8; +void test_8ppB() { + clear(); + EpdRect area = epd_full_screen(); - // draw a black area for later - for (int line = 0; line < 200; line++) { + // bytes in a line in 8ppB mode + int line_bytes = epd_width() / 8; + + int start_line = 100; + + // draw differently aligned black triangles to check for uniformity + draw_8bpp_triangles(start_line, 80); + + int black_start_column = 160; + + // draw a black area + for (int line = 0; line < 300; line++) { uint8_t* line_address = framebuffer + (line_bytes * (start_line + line)); - memset(line_address + black_start_column, 0, 32); + memset(line_address + black_start_column / 8, 0, 32); } + // draw white triangles on the black background + draw_8bpp_triangles(start_line, black_start_column + 16); + + // update the display. In the first update, white pixels are no-opps, + // in the second update, black pixels are no-ops. + enum EpdDrawMode mode; epd_poweron(); - checkError(epd_draw_base( - epd_full_screen(), - framebuffer, - epd_full_screen(), - MODE_PACKING_8PPB | MODE_DU | PREVIOUSLY_WHITE, - 25, - NULL, - NULL, - &epdiy_ED047TC2 - )); + mode = MODE_PACKING_8PPB | MODE_DU | PREVIOUSLY_WHITE; + checkError(epd_draw_base(area, framebuffer, area, mode, 25, NULL, NULL, &epdiy_ED047TC2)); + mode = MODE_PACKING_8PPB | MODE_DU | PREVIOUSLY_BLACK; + checkError(epd_draw_base(area, framebuffer, area, mode, 25, NULL, NULL, &epdiy_ED047TC2)); epd_poweroff(); } diff --git a/examples/test/main/main.c b/examples/test/main/main.c index 9fa5e22d..c15e9330 100644 --- a/examples/test/main/main.c +++ b/examples/test/main/main.c @@ -9,7 +9,7 @@ static void print_banner(const char* text) { void app_main(void) { print_banner("Running all the registered tests"); UNITY_BEGIN(); - unity_run_tests_by_tag("lut", false); - // unity_run_all_tests(); + // unity_run_tests_by_tag("lut", false); + unity_run_all_tests(); UNITY_END(); } diff --git a/src/output_common/lut.c b/src/output_common/lut.c index e0a64dbe..eca7530a 100644 --- a/src/output_common/lut.c +++ b/src/output_common/lut.c @@ -19,15 +19,15 @@ * Since we disable the PSRAM workaround here for performance reasons. */ -/* Python script for generating the 8ppB lookup table: - * for i in range(256): +/* Python script for generating the 8ppB, starting at white lookup table: + for i in range(256): number = 0; for b in range(8): - if not (i & (b << 1)): + if not (i & (1 << b)): number |= 1 << (2*b) print ('0x%04x,'%number) */ -const uint32_t lut_8ppB_black[256] = { +const uint32_t lut_8ppB_start_at_white[256] = { 0x5555, 0x5554, 0x5551, 0x5550, 0x5545, 0x5544, 0x5541, 0x5540, 0x5515, 0x5514, 0x5511, 0x5510, 0x5505, 0x5504, 0x5501, 0x5500, 0x5455, 0x5454, 0x5451, 0x5450, 0x5445, 0x5444, 0x5441, 0x5440, 0x5415, 0x5414, 0x5411, 0x5410, 0x5405, 0x5404, 0x5401, 0x5400, 0x5155, 0x5154, 0x5151, 0x5150, @@ -52,6 +52,39 @@ const uint32_t lut_8ppB_black[256] = { 0x0005, 0x0004, 0x0001, 0x0000 }; +/* Python script for generating the 8ppB, starting at black lookup table: + for i in range(256): + number = 0; + for b in range(8): + if (i & (1 << b)): + number |= 2 << (2*b) + print ('0x%04x,'%number) + */ +const uint32_t lut_8ppB_start_at_black[256] = { + 0x0000, 0x0002, 0x0008, 0x000a, 0x0020, 0x0022, 0x0028, 0x002a, 0x0080, 0x0082, 0x0088, 0x008a, + 0x00a0, 0x00a2, 0x00a8, 0x00aa, 0x0200, 0x0202, 0x0208, 0x020a, 0x0220, 0x0222, 0x0228, 0x022a, + 0x0280, 0x0282, 0x0288, 0x028a, 0x02a0, 0x02a2, 0x02a8, 0x02aa, 0x0800, 0x0802, 0x0808, 0x080a, + 0x0820, 0x0822, 0x0828, 0x082a, 0x0880, 0x0882, 0x0888, 0x088a, 0x08a0, 0x08a2, 0x08a8, 0x08aa, + 0x0a00, 0x0a02, 0x0a08, 0x0a0a, 0x0a20, 0x0a22, 0x0a28, 0x0a2a, 0x0a80, 0x0a82, 0x0a88, 0x0a8a, + 0x0aa0, 0x0aa2, 0x0aa8, 0x0aaa, 0x2000, 0x2002, 0x2008, 0x200a, 0x2020, 0x2022, 0x2028, 0x202a, + 0x2080, 0x2082, 0x2088, 0x208a, 0x20a0, 0x20a2, 0x20a8, 0x20aa, 0x2200, 0x2202, 0x2208, 0x220a, + 0x2220, 0x2222, 0x2228, 0x222a, 0x2280, 0x2282, 0x2288, 0x228a, 0x22a0, 0x22a2, 0x22a8, 0x22aa, + 0x2800, 0x2802, 0x2808, 0x280a, 0x2820, 0x2822, 0x2828, 0x282a, 0x2880, 0x2882, 0x2888, 0x288a, + 0x28a0, 0x28a2, 0x28a8, 0x28aa, 0x2a00, 0x2a02, 0x2a08, 0x2a0a, 0x2a20, 0x2a22, 0x2a28, 0x2a2a, + 0x2a80, 0x2a82, 0x2a88, 0x2a8a, 0x2aa0, 0x2aa2, 0x2aa8, 0x2aaa, 0x8000, 0x8002, 0x8008, 0x800a, + 0x8020, 0x8022, 0x8028, 0x802a, 0x8080, 0x8082, 0x8088, 0x808a, 0x80a0, 0x80a2, 0x80a8, 0x80aa, + 0x8200, 0x8202, 0x8208, 0x820a, 0x8220, 0x8222, 0x8228, 0x822a, 0x8280, 0x8282, 0x8288, 0x828a, + 0x82a0, 0x82a2, 0x82a8, 0x82aa, 0x8800, 0x8802, 0x8808, 0x880a, 0x8820, 0x8822, 0x8828, 0x882a, + 0x8880, 0x8882, 0x8888, 0x888a, 0x88a0, 0x88a2, 0x88a8, 0x88aa, 0x8a00, 0x8a02, 0x8a08, 0x8a0a, + 0x8a20, 0x8a22, 0x8a28, 0x8a2a, 0x8a80, 0x8a82, 0x8a88, 0x8a8a, 0x8aa0, 0x8aa2, 0x8aa8, 0x8aaa, + 0xa000, 0xa002, 0xa008, 0xa00a, 0xa020, 0xa022, 0xa028, 0xa02a, 0xa080, 0xa082, 0xa088, 0xa08a, + 0xa0a0, 0xa0a2, 0xa0a8, 0xa0aa, 0xa200, 0xa202, 0xa208, 0xa20a, 0xa220, 0xa222, 0xa228, 0xa22a, + 0xa280, 0xa282, 0xa288, 0xa28a, 0xa2a0, 0xa2a2, 0xa2a8, 0xa2aa, 0xa800, 0xa802, 0xa808, 0xa80a, + 0xa820, 0xa822, 0xa828, 0xa82a, 0xa880, 0xa882, 0xa888, 0xa88a, 0xa8a0, 0xa8a2, 0xa8a8, 0xa8aa, + 0xaa00, 0xaa02, 0xaa08, 0xaa0a, 0xaa20, 0xaa22, 0xaa28, 0xaa2a, 0xaa80, 0xaa82, 0xaa88, 0xaa8a, + 0xaaa0, 0xaaa2, 0xaaa8, 0xaaaa, +}; + static inline int min(int x, int y) { return x < y ? x : y; } @@ -64,8 +97,6 @@ uint32_t skipping; __attribute__((optimize("O3"))) void IRAM_ATTR reorder_line_buffer(uint32_t* line_data, int buf_len) { - uint16_t* load = (uint16_t*)line_data; - uint16_t* store = (uint16_t*)line_data; for (uint32_t i = 0; i < buf_len / 4; i++) { uint32_t val = *line_data; *(line_data++) = val >> 16 | ((val & 0x0000FFFF) << 16); @@ -390,8 +421,16 @@ static void build_2ppB_lut_64k_from_15(uint8_t* lut, const EpdWaveformPhases* ph build_2ppB_lut_64k_static_from(lut, phases, 0xF, frame); } -static void build_8ppB_lut_256b_from_15(uint8_t* lut, const EpdWaveformPhases* phases, int frame) { - memcpy(lut, lut_8ppB_black, sizeof(lut_8ppB_black)); +static void build_8ppB_lut_256b_from_white( + uint8_t* lut, const EpdWaveformPhases* phases, int frame +) { + memcpy(lut, lut_8ppB_start_at_white, sizeof(lut_8ppB_start_at_white)); +} + +static void build_8ppB_lut_256b_from_black( + uint8_t* lut, const EpdWaveformPhases* phases, int frame +) { + memcpy(lut, lut_8ppB_start_at_black, sizeof(lut_8ppB_start_at_black)); } LutFunctionPair find_lut_functions(enum EpdDrawMode mode, uint32_t lut_size) { @@ -433,16 +472,17 @@ LutFunctionPair find_lut_functions(enum EpdDrawMode mode, uint32_t lut_size) { } } } else if (mode & MODE_PACKING_8PPB) { - if (lut_size < sizeof(lut_8ppB_black)) { + if (lut_size < sizeof(lut_8ppB_start_at_white)) { return pair; } if (mode & PREVIOUSLY_WHITE) { - pair.build_func = &build_8ppB_lut_256b_from_15; + pair.build_func = &build_8ppB_lut_256b_from_white; pair.lookup_func = &calc_epd_input_8ppB; return pair; } else if (mode & PREVIOUSLY_BLACK) { - // FIXME: to implement + pair.build_func = &build_8ppB_lut_256b_from_black; + pair.lookup_func = &calc_epd_input_8ppB; return pair; } } diff --git a/test/test_diff.c b/test/test_diff.c index d8fb8c03..b71aae25 100644 --- a/test/test_diff.c +++ b/test/test_diff.c @@ -86,7 +86,7 @@ TEST_CASE("simple aligned diff works", "[epdiy,unit]") { diff_test_buffers_init(&bufs, example_len); // This should trigger use of vector extensions on the S3 - TEST_ASSERT((uint32_t)bufs.to % 16 == 0) + TEST_ASSERT((uint32_t)bufs.to % 16 == 0); // fully aligned dirty = _epd_interlace_line( @@ -109,7 +109,7 @@ TEST_CASE("dirtynes for diff without changes is correct", "[epdiy,unit]") { diff_test_buffers_init(&bufs, example_len); // This should trigger use of vector extensions on the S3 - TEST_ASSERT((uint32_t)bufs.to % 16 == 0) + TEST_ASSERT((uint32_t)bufs.to % 16 == 0); // both use "from" buffer dirty = _epd_interlace_line( @@ -132,7 +132,6 @@ TEST_CASE("dirtynes for diff without changes is correct", "[epdiy,unit]") { TEST_CASE("different 4-byte alignments work", "[epdiy,unit]") { const int example_len = DEFAULT_EXAMPLE_LEN; - const uint8_t NULL_ARRAY[DEFAULT_EXAMPLE_LEN * 2] = { 0 }; DiffTestBuffers bufs; bool dirty; diff --git a/test/test_lut.c b/test/test_lut.c index 86beeb32..3d1195b1 100644 --- a/test/test_lut.c +++ b/test/test_lut.c @@ -23,10 +23,14 @@ static const uint8_t result_pattern_2ppB_white[8] = { 0x00, 0x01, 0x50, 0x55, 0x55, 0x55, 0x00, 0x55 }; static const uint8_t result_pattern_2ppB_black[8] = { 0xAA, 0xA8, 0x0A, 0x82, 0xAA, 0xAA, 0xAA, 0x20 }; -static const uint8_t result_pattern_8ppB[32] +static const uint8_t result_pattern_8ppB_on_white[32] = { 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x54, 0x55, 0x55, 0x54, 0x44, 0x11, 0x44, 0x11, 0x11, 0x44, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x15, 0x55 }; +static const uint8_t result_pattern_8ppB_on_black[32] + = { 0xAA, 0xAA, 0xAA, 0xAA, 0x00, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x02, 0x22, 0x88, 0x22, 0x88, 0x88, 0x22, + 0x88, 0x22, 0xAA, 0xAA, 0xAA, 0xAA, 0x00, 0x00, 0x80, 0x00 }; typedef void (*lut_func_t)(const uint32_t*, uint8_t*, const uint8_t*, uint32_t); static uint8_t waveform_phases[16][4]; @@ -252,7 +256,7 @@ TEST_CASE("2ppB lookup LCD, 1k LUT, previously black", "[epdiy,unit,lut]") { TEST_CASE("8ppB lookup LCD, 1k LUT, previously white", "[epdiy,unit,lut]") { LutTestBuffers bufs; - lut_test_buffers_init(&bufs, DEFAULT_EXAMPLE_LEN / 2, result_pattern_8ppB, 0.5); + lut_test_buffers_init(&bufs, DEFAULT_EXAMPLE_LEN / 2, result_pattern_8ppB_on_white, 0.5); enum EpdDrawMode mode = MODE_DU | MODE_PACKING_8PPB | PREVIOUSLY_WHITE; LutFunctionPair func_pair = find_lut_functions(mode, 1 << 10); @@ -261,5 +265,19 @@ TEST_CASE("8ppB lookup LCD, 1k LUT, previously white", "[epdiy,unit,lut]") { func_pair.build_func(bufs.lut, &test_waveform, 0); test_with_alignments(&bufs, func_pair.lookup_func); + diff_test_buffers_free(&bufs); +} + +TEST_CASE("8ppB lookup LCD, 1k LUT, previously black", "[epdiy,unit,lut]") { + LutTestBuffers bufs; + lut_test_buffers_init(&bufs, DEFAULT_EXAMPLE_LEN / 2, result_pattern_8ppB_on_black, 0.5); + + enum EpdDrawMode mode = MODE_DU | MODE_PACKING_8PPB | PREVIOUSLY_BLACK; + LutFunctionPair func_pair = find_lut_functions(mode, 1 << 10); + TEST_ASSERT_NOT_NULL(func_pair.build_func); + TEST_ASSERT_NOT_NULL(func_pair.lookup_func); + func_pair.build_func(bufs.lut, &test_waveform, 0); + test_with_alignments(&bufs, func_pair.lookup_func); + diff_test_buffers_free(&bufs); } \ No newline at end of file From 3c1aefc09b42e0734e5e365f469b95b05baba955 Mon Sep 17 00:00:00 2001 From: Valentin Roland Date: Tue, 3 Sep 2024 21:04:25 +0200 Subject: [PATCH 10/15] complete fb variant demo --- examples/fb_mode_test/main/main.c | 78 ++++++++++++++++++++++++++++++- 1 file changed, 76 insertions(+), 2 deletions(-) diff --git a/examples/fb_mode_test/main/main.c b/examples/fb_mode_test/main/main.c index 4ddb8f9b..4bcf0686 100644 --- a/examples/fb_mode_test/main/main.c +++ b/examples/fb_mode_test/main/main.c @@ -2,6 +2,9 @@ * Visual tests for framebuffer modes that are not commonly used by the high-level API. * Currently, includes 2 pixel per byte (ppB) with static origin color and 8ppB with static origin * color. + * + * After running this, you should see two identical test images, with a "ladder" of black triangles + * next to a black rectangle with a ladder of white triangles on it. */ #include @@ -9,10 +12,13 @@ #include #include #include +#include #include #include #include +#include #include +#include #include #include @@ -61,7 +67,7 @@ void draw_8bpp_triangles(int start_line, int start_column) { for (int align = 0; align < 16; align++) { for (int height = 0; height < 16; height++) { - for (int len = 0; len < height; len++) { + for (int len = 0; len <= height; len++) { int line = (start_line + 16 * align + height); int column = align + len; uint8_t* line_address = framebuffer + (line_bytes * line); @@ -71,8 +77,27 @@ void draw_8bpp_triangles(int start_line, int start_column) { } } +/** + * Draw triangles at varying alignments into the framebuffer in 2ppB mode. + * start_line, start_column specify the start position. + * color specifies the color to draw in. + */ +void draw_2bpp_triangles(int start_line, int start_column, uint8_t color) { + int height = 16; + + for (int align = 0; align < 16; align++) { + int x0 = start_column + align; + int y0 = start_line + height * align; + int x1 = x0; + int y1 = y0 + height - 1; + int x2 = x0 + height - 1; + int y2 = y0 + height - 1; + + epd_fill_triangle(x0, y0, x1, y1, x2, y2, color, framebuffer); + } +} + void test_8ppB() { - clear(); EpdRect area = epd_full_screen(); // bytes in a line in 8ppB mode @@ -105,18 +130,67 @@ void test_8ppB() { epd_poweroff(); } +void test_2ppB() { + EpdRect area = epd_full_screen(); + int start_column = 500; + int start_line = 100; + + // draw differently aligned black triangles to check for uniformity + draw_2bpp_triangles(start_line, start_column, 0); + + int black_start_column = start_column + 60; + + // draw a black area + EpdRect black_area = { .x = black_start_column, .y = 100, .width = 256, .height = 300 }; + epd_fill_rect(black_area, 0, framebuffer); + + // draw white triangles on the black background + draw_2bpp_triangles(start_line, black_start_column + 16, 255); + + // Do not overdraw the 8ppB image + uint8_t* drawn_columns = malloc(epd_width() / 2); + assert(drawn_columns != NULL); + memset(drawn_columns, 0, epd_width() / 2); + memset(drawn_columns + start_column / 2, 255, (epd_width() - start_column) / 2); + + // update the display. In the first update, white pixels are no-opps, + // in the second update, black pixels are no-ops. + enum EpdDrawMode mode; + epd_poweron(); + mode = MODE_PACKING_2PPB | MODE_DU | PREVIOUSLY_WHITE; + checkError( + epd_draw_base(area, framebuffer, area, mode, 25, NULL, drawn_columns, &epdiy_ED047TC2) + ); + mode = MODE_PACKING_2PPB | MODE_DU | PREVIOUSLY_BLACK; + checkError( + epd_draw_base(area, framebuffer, area, mode, 25, NULL, drawn_columns, &epdiy_ED047TC2) + ); + epd_poweroff(); + + free(drawn_columns); +} + void app_main() { epd_init(&DEMO_BOARD, &ED060XC3, EPD_OPTIONS_DEFAULT); + // Set VCOM for boards that allow to set this in software (in mV). // This will print an error if unsupported. In this case, // set VCOM using the hardware potentiometer and delete this line. epd_set_vcom(2100); + epd_set_lcd_pixel_clock_MHz(10); + fb_size = epd_width() * epd_height() / 2; framebuffer = heap_caps_aligned_alloc(16, fb_size, MALLOC_CAP_SPIRAM); + clear(); + test_8ppB(); + memset(framebuffer, 0xFF, fb_size); + + test_2ppB(); + printf("going to sleep...\n"); epd_deinit(); esp_deep_sleep_start(); From 196ba5742e3cd804dc17b125fdbcc13923548e9d Mon Sep 17 00:00:00 2001 From: Valentin Roland Date: Wed, 4 Sep 2024 09:49:20 +0200 Subject: [PATCH 11/15] wip --- examples/fb_mode_test/main/main.c | 26 +++++++++++++++++--------- src/output_common/line_queue.c | 14 +++++++------- src/render.c | 13 +++++++++---- 3 files changed, 33 insertions(+), 20 deletions(-) diff --git a/examples/fb_mode_test/main/main.c b/examples/fb_mode_test/main/main.c index 4bcf0686..7be93f54 100644 --- a/examples/fb_mode_test/main/main.c +++ b/examples/fb_mode_test/main/main.c @@ -99,6 +99,7 @@ void draw_2bpp_triangles(int start_line, int start_column, uint8_t color) { void test_8ppB() { EpdRect area = epd_full_screen(); + enum EpdDrawMode mode; // bytes in a line in 8ppB mode int line_bytes = epd_width() / 8; @@ -115,16 +116,19 @@ void test_8ppB() { uint8_t* line_address = framebuffer + (line_bytes * (start_line + line)); memset(line_address + black_start_column / 8, 0, 32); } - - // draw white triangles on the black background - draw_8bpp_triangles(start_line, black_start_column + 16); - + // update the display. In the first update, white pixels are no-opps, // in the second update, black pixels are no-ops. - enum EpdDrawMode mode; epd_poweron(); mode = MODE_PACKING_8PPB | MODE_DU | PREVIOUSLY_WHITE; checkError(epd_draw_base(area, framebuffer, area, mode, 25, NULL, NULL, &epdiy_ED047TC2)); + epd_poweroff(); + + // draw white triangles on the black background + draw_8bpp_triangles(start_line, black_start_column + 16); + + + epd_poweron(); mode = MODE_PACKING_8PPB | MODE_DU | PREVIOUSLY_BLACK; checkError(epd_draw_base(area, framebuffer, area, mode, 25, NULL, NULL, &epdiy_ED047TC2)); epd_poweroff(); @@ -132,6 +136,7 @@ void test_8ppB() { void test_2ppB() { EpdRect area = epd_full_screen(); + enum EpdDrawMode mode; int start_column = 500; int start_line = 100; @@ -144,9 +149,6 @@ void test_2ppB() { EpdRect black_area = { .x = black_start_column, .y = 100, .width = 256, .height = 300 }; epd_fill_rect(black_area, 0, framebuffer); - // draw white triangles on the black background - draw_2bpp_triangles(start_line, black_start_column + 16, 255); - // Do not overdraw the 8ppB image uint8_t* drawn_columns = malloc(epd_width() / 2); assert(drawn_columns != NULL); @@ -155,12 +157,18 @@ void test_2ppB() { // update the display. In the first update, white pixels are no-opps, // in the second update, black pixels are no-ops. - enum EpdDrawMode mode; epd_poweron(); mode = MODE_PACKING_2PPB | MODE_DU | PREVIOUSLY_WHITE; checkError( epd_draw_base(area, framebuffer, area, mode, 25, NULL, drawn_columns, &epdiy_ED047TC2) ); + epd_poweroff(); + + // draw white triangles on the black background + draw_2bpp_triangles(start_line, black_start_column + 16, 255); + + + epd_poweron(); mode = MODE_PACKING_2PPB | MODE_DU | PREVIOUSLY_BLACK; checkError( epd_draw_base(area, framebuffer, area, mode, 25, NULL, drawn_columns, &epdiy_ED047TC2) diff --git a/src/output_common/line_queue.c b/src/output_common/line_queue.c index 4e203576..84834614 100644 --- a/src/output_common/line_queue.c +++ b/src/output_common/line_queue.c @@ -1,6 +1,7 @@ #include #include #include +#include #include #include @@ -66,13 +67,6 @@ uint8_t* IRAM_ATTR lq_current(LineQueue_t* queue) { void IRAM_ATTR lq_commit(LineQueue_t* queue) { int current = atomic_load_explicit(&queue->current, memory_order_acquire); - - if (current == queue->size - 1) { - queue->current = 0; - } else { - atomic_fetch_add(&queue->current, 1); - } - #ifdef RENDER_METHOD_LCD void epd_apply_line_mask_VE(uint8_t * line, const uint8_t* mask, int mask_len); epd_apply_line_mask_VE(queue->bufs[current], queue->mask_buffer, queue->mask_buffer_len); @@ -81,6 +75,12 @@ void IRAM_ATTR lq_commit(LineQueue_t* queue) { ((uint32_t*)(queue->bufs[current]))[i] &= ((uint32_t*)(queue->mask_buffer))[i]; } #endif + + if (current == queue->size - 1) { + queue->current = 0; + } else { + atomic_fetch_add(&queue->current, 1); + } } int IRAM_ATTR lq_read(LineQueue_t* queue, uint8_t* dst) { diff --git a/src/render.c b/src/render.c index 3aeeadb9..af80e79b 100644 --- a/src/render.c +++ b/src/render.c @@ -198,15 +198,20 @@ enum EpdDrawError IRAM_ATTR epd_draw_base( if (waveform_phases != NULL && waveform_phases->phase_times != NULL) { render_context.phase_times = waveform_phases->phase_times; } - -#ifdef RENDER_METHOD_I2S - i2s_do_update(&render_context); -#elif defined(RENDER_METHOD_LCD) + for (int i = 0; i < NUM_RENDER_THREADS; i++) { LineQueue_t* queue = &render_context.line_queues[i]; _epd_populate_line_mask(queue->mask_buffer, drawn_columns, queue->mask_buffer_len); + + + for (int i = 0; i < queue->mask_buffer_len / 4; i++) { + printf("%X\n", ((uint32_t*)(queue->mask_buffer))[i]); + } } +#ifdef RENDER_METHOD_I2S + i2s_do_update(&render_context); +#elif defined(RENDER_METHOD_LCD) lcd_do_update(&render_context); #endif From e884db8c7951a6bcbbdb5482e2f60a29da3f7d9f Mon Sep 17 00:00:00 2001 From: Valentin Roland Date: Wed, 4 Sep 2024 21:44:59 +0200 Subject: [PATCH 12/15] fix line masking for esp32 --- examples/fb_mode_test/main/main.c | 4 +--- src/output_common/line_queue.c | 23 +---------------------- src/output_common/line_queue.h | 7 +------ src/output_common/lut.c | 7 +++++++ src/output_common/lut.h | 6 ++++++ src/output_common/render_context.h | 4 ++++ src/output_i2s/i2s_data_bus.c | 5 ++--- src/output_i2s/i2s_data_bus.h | 2 +- src/output_i2s/render_i2s.c | 5 +++++ src/output_lcd/render_lcd.c | 4 ++++ src/render.c | 25 +++++++++++-------------- 11 files changed, 43 insertions(+), 49 deletions(-) diff --git a/examples/fb_mode_test/main/main.c b/examples/fb_mode_test/main/main.c index 7be93f54..567b3c66 100644 --- a/examples/fb_mode_test/main/main.c +++ b/examples/fb_mode_test/main/main.c @@ -116,7 +116,7 @@ void test_8ppB() { uint8_t* line_address = framebuffer + (line_bytes * (start_line + line)); memset(line_address + black_start_column / 8, 0, 32); } - + // update the display. In the first update, white pixels are no-opps, // in the second update, black pixels are no-ops. epd_poweron(); @@ -127,7 +127,6 @@ void test_8ppB() { // draw white triangles on the black background draw_8bpp_triangles(start_line, black_start_column + 16); - epd_poweron(); mode = MODE_PACKING_8PPB | MODE_DU | PREVIOUSLY_BLACK; checkError(epd_draw_base(area, framebuffer, area, mode, 25, NULL, NULL, &epdiy_ED047TC2)); @@ -167,7 +166,6 @@ void test_2ppB() { // draw white triangles on the black background draw_2bpp_triangles(start_line, black_start_column + 16, 255); - epd_poweron(); mode = MODE_PACKING_2PPB | MODE_DU | PREVIOUSLY_BLACK; checkError( diff --git a/src/output_common/line_queue.c b/src/output_common/line_queue.c index 84834614..5a2dfa60 100644 --- a/src/output_common/line_queue.c +++ b/src/output_common/line_queue.c @@ -13,7 +13,7 @@ static inline int ceil_div(int x, int y) { } /// Initialize the line queue and allocate memory. -LineQueue_t lq_init(int queue_len, int element_size, bool use_mask) { +LineQueue_t lq_init(int queue_len, int element_size) { LineQueue_t queue; queue.element_size = element_size; queue.size = queue_len; @@ -30,16 +30,6 @@ LineQueue_t lq_init(int queue_len, int element_size, bool use_mask) { assert(queue.bufs[i] != NULL); } - if (use_mask) { - queue.mask_buffer_len = elem_buf_size; - queue.mask_buffer - = heap_caps_aligned_alloc(16, elem_buf_size, MALLOC_CAP_8BIT | MALLOC_CAP_INTERNAL); - assert(queue.mask_buffer != NULL); - } else { - queue.mask_buffer_len = 0; - queue.mask_buffer = NULL; - } - return queue; } @@ -49,9 +39,6 @@ void lq_free(LineQueue_t* queue) { heap_caps_free(queue->bufs[i]); } - if (queue->mask_buffer != NULL) { - heap_caps_free(queue->mask_buffer); - } free(queue->bufs); } @@ -67,14 +54,6 @@ uint8_t* IRAM_ATTR lq_current(LineQueue_t* queue) { void IRAM_ATTR lq_commit(LineQueue_t* queue) { int current = atomic_load_explicit(&queue->current, memory_order_acquire); -#ifdef RENDER_METHOD_LCD - void epd_apply_line_mask_VE(uint8_t * line, const uint8_t* mask, int mask_len); - epd_apply_line_mask_VE(queue->bufs[current], queue->mask_buffer, queue->mask_buffer_len); -#else - for (int i = 0; i < queue->mask_buffer_len / 4; i++) { - ((uint32_t*)(queue->bufs[current]))[i] &= ((uint32_t*)(queue->mask_buffer))[i]; - } -#endif if (current == queue->size - 1) { queue->current = 0; diff --git a/src/output_common/line_queue.h b/src/output_common/line_queue.h index f1046d87..e6fa81de 100644 --- a/src/output_common/line_queue.h +++ b/src/output_common/line_queue.h @@ -14,15 +14,10 @@ typedef struct { uint8_t** bufs; // size of an element size_t element_size; - // size of the mask buffer - size_t mask_buffer_len; - // mask to appyl to the output buffer, NULL if none. - // mut be elem_buf_size long. - uint8_t* mask_buffer; } LineQueue_t; /// Initialize the line queue and allocate memory. -LineQueue_t lq_init(int queue_len, int element_size, bool use_mask); +LineQueue_t lq_init(int queue_len, int element_size); /// Deinitialize the line queue and free memory. void lq_free(LineQueue_t* queue); diff --git a/src/output_common/lut.c b/src/output_common/lut.c index eca7530a..4ae87233 100644 --- a/src/output_common/lut.c +++ b/src/output_common/lut.c @@ -1,6 +1,7 @@ #include "lut.h" #include "epdiy.h" +#include "esp_attr.h" #include "render_context.h" #include "render_method.h" @@ -433,6 +434,12 @@ static void build_8ppB_lut_256b_from_black( memcpy(lut, lut_8ppB_start_at_black, sizeof(lut_8ppB_start_at_black)); } +void IRAM_ATTR epd_apply_line_mask(uint8_t* buf, const uint8_t* mask, int len) { + for (int i = 0; i < len / 4; i++) { + ((uint32_t*)buf)[i] &= ((uint32_t*)mask)[i]; + } +} + LutFunctionPair find_lut_functions(enum EpdDrawMode mode, uint32_t lut_size) { LutFunctionPair pair; pair.build_func = NULL; diff --git a/src/output_common/lut.h b/src/output_common/lut.h index 08a9dab8..364636e4 100644 --- a/src/output_common/lut.h +++ b/src/output_common/lut.h @@ -36,6 +36,12 @@ LutFunctionPair find_lut_functions(enum EpdDrawMode mode, uint32_t lut_size); */ void reorder_line_buffer(uint32_t* line_data, int buf_len); +/** + * Apply a mask to a line buffer. + * `len` must be divisible by 4. + */ +void epd_apply_line_mask(uint8_t* buf, const uint8_t* mask, int len); + // legacy functions void bit_shift_buffer_right(uint8_t* buf, uint32_t len, int shift); void nibble_shift_buffer_right(uint8_t* buf, uint32_t len); diff --git a/src/output_common/render_context.h b/src/output_common/render_context.h index 5a6f9612..232dbe27 100644 --- a/src/output_common/render_context.h +++ b/src/output_common/render_context.h @@ -4,6 +4,7 @@ #include #include #include +#include #include "../epdiy.h" #include "line_queue.h" @@ -68,6 +69,9 @@ typedef struct { LineQueue_t line_queues[NUM_RENDER_THREADS]; uint8_t* line_threads; + // Output line mask + uint8_t* line_mask; + /// track line skipping when working in old i2s mode int skipping; } RenderContext_t; diff --git a/src/output_i2s/i2s_data_bus.c b/src/output_i2s/i2s_data_bus.c index 571586ff..48c22796 100644 --- a/src/output_i2s/i2s_data_bus.c +++ b/src/output_i2s/i2s_data_bus.c @@ -100,9 +100,8 @@ static void IRAM_ATTR i2s_int_hdl(void* arg) { dev->int_clr.val = dev->int_raw.val; } -volatile uint8_t IRAM_ATTR* i2s_get_current_buffer() { - return (volatile uint8_t*)(current_buffer ? i2s_state.dma_desc_a->buf - : i2s_state.dma_desc_b->buf); +uint8_t* IRAM_ATTR i2s_get_current_buffer() { + return (uint8_t*)(current_buffer ? i2s_state.dma_desc_a->buf : i2s_state.dma_desc_b->buf); } bool IRAM_ATTR i2s_is_busy() { diff --git a/src/output_i2s/i2s_data_bus.h b/src/output_i2s/i2s_data_bus.h index 4c611d74..2aeb1f0e 100644 --- a/src/output_i2s/i2s_data_bus.h +++ b/src/output_i2s/i2s_data_bus.h @@ -52,7 +52,7 @@ void i2s_gpio_detach(i2s_bus_config* cfg); /** * Get the currently writable line buffer. */ -volatile uint8_t* i2s_get_current_buffer(); +uint8_t* i2s_get_current_buffer(); /** * Switches front and back line buffer. diff --git a/src/output_i2s/render_i2s.c b/src/output_i2s/render_i2s.c index fbfcf23d..08db8106 100644 --- a/src/output_i2s/render_i2s.c +++ b/src/output_i2s/render_i2s.c @@ -243,12 +243,17 @@ void IRAM_ATTR i2s_output_frame(RenderContext_t* ctx, int thread_id) { continue; } + // lookup pixel actions in the waveform LUT ctx->lut_lookup_func( (uint32_t*)line_buf, (uint8_t*)i2s_get_current_buffer(), ctx->conversion_lut, ctx->display_width ); + + // apply the line mask + epd_apply_line_mask(i2s_get_current_buffer(), ctx->line_mask, ctx->display_width / 4); + reorder_line_buffer((uint32_t*)i2s_get_current_buffer(), ctx->display_width / 4); i2s_write_row(ctx, frame_time); } diff --git a/src/output_lcd/render_lcd.c b/src/output_lcd/render_lcd.c index fe93a87f..71aadabb 100644 --- a/src/output_lcd/render_lcd.c +++ b/src/output_lcd/render_lcd.c @@ -193,6 +193,10 @@ lcd_calculate_frame(RenderContext_t* ctx, int thread_id) { ctx->lut_lookup_func(lp, buf, ctx->conversion_lut, ctx->display_width); + // apply the line mask + void epd_apply_line_mask_VE(uint8_t * line, const uint8_t* mask, int mask_len); + epd_apply_line_mask_VE(buf, ctx->line_mask, ctx->display_width / 4); + lq_commit(lq); } } diff --git a/src/render.c b/src/render.c index af80e79b..ab6c66f2 100644 --- a/src/render.c +++ b/src/render.c @@ -198,16 +198,10 @@ enum EpdDrawError IRAM_ATTR epd_draw_base( if (waveform_phases != NULL && waveform_phases->phase_times != NULL) { render_context.phase_times = waveform_phases->phase_times; } - - for (int i = 0; i < NUM_RENDER_THREADS; i++) { - LineQueue_t* queue = &render_context.line_queues[i]; - _epd_populate_line_mask(queue->mask_buffer, drawn_columns, queue->mask_buffer_len); - - - for (int i = 0; i < queue->mask_buffer_len / 4; i++) { - printf("%X\n", ((uint32_t*)(queue->mask_buffer))[i]); - } - } + + _epd_populate_line_mask( + render_context.line_mask, drawn_columns, render_context.display_width / 4 + ); #ifdef RENDER_METHOD_I2S i2s_do_update(&render_context); @@ -326,16 +320,18 @@ void epd_renderer_init(enum EpdInitOptions options) { abort(); } + render_context.line_mask + = heap_caps_aligned_alloc(16, epd_width() / 4, MALLOC_CAP_8BIT | MALLOC_CAP_INTERNAL); + assert(render_context.line_mask != NULL); + #ifdef RENDER_METHOD_LCD - bool use_lq_mask = true; size_t queue_elem_size = render_context.display_width / 4; #elif defined(RENDER_METHOD_I2S) - bool use_lq_mask = false; - size_t queue_elem_size = epd_width(); + size_t queue_elem_size = render_context.display_width; #endif for (int i = 0; i < NUM_RENDER_THREADS; i++) { - render_context.line_queues[i] = lq_init(queue_len, queue_elem_size, use_lq_mask); + render_context.line_queues[i] = lq_init(queue_len, queue_elem_size); render_context.feed_line_buffers[i] = (uint8_t*)heap_caps_malloc( render_context.display_width, MALLOC_CAP_8BIT | MALLOC_CAP_INTERNAL ); @@ -376,6 +372,7 @@ void epd_renderer_deinit() { heap_caps_free(render_context.conversion_lut); heap_caps_free(render_context.line_threads); + heap_caps_free(render_context.line_mask); vSemaphoreDelete(render_context.frame_done); } From 812a5fc8ad625a8dc93f4df5673fe0294c089d43 Mon Sep 17 00:00:00 2001 From: Valentin Roland Date: Wed, 4 Sep 2024 21:48:24 +0200 Subject: [PATCH 13/15] revert debugging changes --- examples/dragon/main/main.c | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/examples/dragon/main/main.c b/examples/dragon/main/main.c index 55d9b880..f5d9d453 100644 --- a/examples/dragon/main/main.c +++ b/examples/dragon/main/main.c @@ -4,7 +4,6 @@ #include "freertos/FreeRTOS.h" #include "freertos/task.h" -#include "ED097TC2.h" #include "dragon.h" #include "epd_highlevel.h" #include "epdiy.h" @@ -28,25 +27,14 @@ void idf_loop() { epd_copy_to_framebuffer(dragon_area, dragon_data, epd_hl_get_framebuffer(&hl)); - epd_draw_base( - dragon_area, - epd_hl_get_framebuffer(&hl), - dragon_area, - MODE_GC16 | MODE_PACKING_2PPB | PREVIOUSLY_WHITE, - temperature, - NULL, - NULL, - &ed097tc2 - ); - - // enum EpdDrawError _err = epd_hl_update_screen(&hl, MODE_GC16, temperature); + enum EpdDrawError _err = epd_hl_update_screen(&hl, MODE_GC16, temperature); epd_poweroff(); - vTaskDelay(100000); + vTaskDelay(1000); } void idf_setup() { - epd_init(&DEMO_BOARD, &ED097TC2, EPD_LUT_1K); + epd_init(&DEMO_BOARD, &ED097TC2, EPD_LUT_64K); epd_set_vcom(1560); hl = epd_hl_init(EPD_BUILTIN_WAVEFORM); } From 14ac2d2a9e391f1e26226e55a557a68706ef4bf3 Mon Sep 17 00:00:00 2001 From: Valentin Roland Date: Wed, 4 Sep 2024 21:55:52 +0200 Subject: [PATCH 14/15] use idf 5.3 for format checking --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0a3bb6c4..5ef7ed83 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -6,7 +6,7 @@ jobs: format-check: runs-on: ubuntu-latest container: - image: "espressif/idf:release-v5.2" + image: "espressif/idf:release-v5.3" steps: - uses: actions/checkout@v4 - run: | From 3fd938481bd0965a1b186f081c70928cd30e6999 Mon Sep 17 00:00:00 2001 From: Valentin Roland Date: Wed, 4 Sep 2024 23:00:10 +0200 Subject: [PATCH 15/15] reformat --- examples/weather/main/ArduinoJson.h | 4 ++-- examples/www-image/main/jpg-render.c | 13 +++++++------ examples/www-image/main/jpgdec-render.cpp | 11 ++++++----- src/render.c | 5 ++--- 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/examples/weather/main/ArduinoJson.h b/examples/weather/main/ArduinoJson.h index 60b0ccfe..a92135cc 100644 --- a/examples/weather/main/ArduinoJson.h +++ b/examples/weather/main/ArduinoJson.h @@ -4546,8 +4546,8 @@ struct BoundedReader::value>: public: explicit BoundedReader(const void* ptr, size_t len) : IteratorReader( - reinterpret_cast(ptr), reinterpret_cast(ptr) + len - ) {} + reinterpret_cast(ptr), reinterpret_cast(ptr) + len + ) {} }; template struct Reader, void> : Reader { diff --git a/examples/www-image/main/jpg-render.c b/examples/www-image/main/jpg-render.c index fd460933..66e1f143 100644 --- a/examples/www-image/main/jpg-render.c +++ b/examples/www-image/main/jpg-render.c @@ -367,14 +367,15 @@ static void http_post(void) { * either in URL or as host and path parameters. * FIX: Uncommenting cert_pem restarts even if providing the right certificate */ - esp_http_client_config_t config = { .url = IMG_URL, - .event_handler = _http_event_handler, - .buffer_size = HTTP_RECEIVE_BUFFER_SIZE, - .disable_auto_redirect = false, + esp_http_client_config_t config + = {.url = IMG_URL, + .event_handler = _http_event_handler, + .buffer_size = HTTP_RECEIVE_BUFFER_SIZE, + .disable_auto_redirect = false, #if VALIDATE_SSL_CERTIFICATE == true - .cert_pem = (char*)server_cert_pem_start + .cert_pem = (char*)server_cert_pem_start #endif - }; + }; esp_http_client_handle_t client = esp_http_client_init(&config); #if DEBUG_VERBOSE diff --git a/examples/www-image/main/jpgdec-render.cpp b/examples/www-image/main/jpgdec-render.cpp index 02a84ce4..2d7fe7be 100644 --- a/examples/www-image/main/jpgdec-render.cpp +++ b/examples/www-image/main/jpgdec-render.cpp @@ -284,13 +284,14 @@ static void http_post(void) { * NOTE: All the configuration parameters for http_client must be specified * either in URL or as host and path parameters. */ - esp_http_client_config_t config = { .url = IMG_URL, + esp_http_client_config_t config + = {.url = IMG_URL, #if VALIDATE_SSL_CERTIFICATE == true - .cert_pem = (char*)server_cert_pem_start, + .cert_pem = (char*)server_cert_pem_start, #endif - .disable_auto_redirect = false, - .event_handler = _http_event_handler, - .buffer_size = HTTP_RECEIVE_BUFFER_SIZE }; + .disable_auto_redirect = false, + .event_handler = _http_event_handler, + .buffer_size = HTTP_RECEIVE_BUFFER_SIZE }; esp_http_client_handle_t client = esp_http_client_init(&config); diff --git a/src/render.c b/src/render.c index ab6c66f2..713d660b 100644 --- a/src/render.c +++ b/src/render.c @@ -94,9 +94,8 @@ static inline int rounded_display_height() { * * don't inline for to ensure availability in tests. */ -void __attribute__((noinline)) _epd_populate_line_mask( - uint8_t* line_mask, const uint8_t* dirty_columns, int mask_len -) { +void __attribute__((noinline)) +_epd_populate_line_mask(uint8_t* line_mask, const uint8_t* dirty_columns, int mask_len) { if (dirty_columns == NULL) { memset(line_mask, 0xFF, mask_len); } else {