From 8c9103e317677bd490d03a17fbbfb744a04e5161 Mon Sep 17 00:00:00 2001 From: Alexander Bobkov Date: Tue, 7 Oct 2025 00:19:02 -0400 Subject: [PATCH] mqtt --- .../CMakeFiles/3.31.6/CMakeASMCompiler.cmake | 29 + .../CMakeFiles/3.31.6/CMakeCCompiler.cmake | 82 + .../CMakeFiles/3.31.6/CMakeCXXCompiler.cmake | 106 + .../3.31.6/CMakeDetermineCompilerABI_C.bin | Bin 0 -> 4068 bytes .../3.31.6/CMakeDetermineCompilerABI_CXX.bin | Bin 0 -> 4088 bytes .../build/CMakeFiles/3.31.6/CMakeSystem.cmake | 15 + .../3.31.6/CompilerIdC/CMakeCCompilerId.c | 904 + .../build/CMakeFiles/3.31.6/CompilerIdC/a.out | Bin 0 -> 4324 bytes .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 919 + .../CMakeFiles/3.31.6/CompilerIdCXX/a.out | Bin 0 -> 4332 bytes .../build/CMakeFiles/CMakeConfigureLog.yaml | 567 + .../build/CMakeFiles/git-data/HEAD | 2 +- .../build/CMakeFiles/git-data/grabRef.cmake | 2 +- .../build/CMakeFiles/git-data/head-ref | 2 +- .../bootloader-patch-info.txt | 6 + .../bootloader-source_dirinfo.txt | 9 + .../bootloader-update-info.txt | 7 + .../tmp/bootloader-cfgcmd.txt | 1 + .../tmp/bootloader-mkdirs.cmake | 27 + ESP32-IDF_Temperture-Node-v2/build/config.env | 12 + .../build/config/kconfig_menus.json | 30319 ++++++++++++++++ .../build/config/sdkconfig.cmake | 1416 + .../build/config/sdkconfig.h | 854 + .../build/config/sdkconfig.json | 1204 + .../ld/linker_script_generator.cmake | 9 + .../esp-idf/mbedtls/mbedtls/library/error.c | 1 + .../psa_crypto_driver_wrappers_no_static.c | 1 + .../library/ssl_debug_helpers_generated.c | 1 + .../mbedtls/library/version_features.c | 1 + .../build/gdbinit/connect | 7 + .../build/gdbinit/gdbinit | 2 + .../build/gdbinit/prefix_map | 1 + .../build/gdbinit/py_extensions | 7 + .../build/gdbinit/symbols | 25 + .../build/kconfigs.in | 78 + .../build/kconfigs_projbuild.in | 5 + .../espressif__bme280/.component_hash | 1 + .../espressif__bme280/CHANGELOG.md | 13 + .../espressif__bme280/CHECKSUMS.json | 1 + .../espressif__bme280/CMakeLists.txt | 5 + .../espressif__bme280/README.md | 51 + .../espressif__bme280/bme280.c | 372 + .../espressif__bme280/idf_component.yml | 14 + .../espressif__bme280/include/bme280.h | 377 + .../espressif__bme280/license.txt | 202 + .../test_apps/CMakeLists.txt | 9 + .../test_apps/main/CMakeLists.txt | 3 + .../test_apps/main/bme280_test.c | 77 + .../test_apps/sdkconfig.defaults | 9 + .../.component_hash | 1 + .../espressif__cmake_utilities/CHANGELOG.md | 89 + .../espressif__cmake_utilities/CHECKSUMS.json | 1 + .../espressif__cmake_utilities/CMakeLists.txt | 1 + .../espressif__cmake_utilities/Kconfig | 65 + .../espressif__cmake_utilities/README.md | 31 + .../cmake_utilities.cmake | 7 + .../espressif__cmake_utilities/docs/gcc.md | 108 + .../docs/gen_compressed_ota.md | 41 + .../docs/relinker.md | 66 + .../espressif__cmake_utilities/gcc.cmake | 84 + .../gen_compressed_ota.cmake | 18 + .../gen_single_bin.cmake | 27 + .../idf_component.yml | 7 + .../espressif__cmake_utilities/license.txt | 202 + .../package_manager.cmake | 45 + .../project_include.cmake | 9 + .../espressif__cmake_utilities/relinker.cmake | 73 + .../scripts/gen_custom_ota.py | 243 + .../scripts/relinker/configuration.py | 211 + .../relinker/examples/esp32c2/function.csv | 365 + .../relinker/examples/esp32c2/library.csv | 24 + .../relinker/examples/esp32c2/object.csv | 66 + .../scripts/relinker/relinker.py | 311 + .../test_apps/CMakeLists.txt | 8 + .../components/TEST-component2/CMakeLists.txt | 10 + .../TEST-component2/idf_component.yml | 6 + .../TEST-component2/test_component2.c | 16 + .../TEST-component2/test_component2.h | 14 + .../components/test_component1/CMakeLists.txt | 10 + .../test_component1/idf_component.yml | 6 + .../test_component1/test_component1.c | 16 + .../test_component1/test_component1.h | 14 + .../test_apps/main/CMakeLists.txt | 3 + .../test_apps/main/test_cmake_utilities.c | 59 + .../test_apps/pytest_cmake_utilities.py | 20 + .../espressif__i2c_bus/.component_hash | 1 + .../espressif__i2c_bus/CHANGELOG.md | 51 + .../espressif__i2c_bus/CHECKSUMS.json | 1 + .../espressif__i2c_bus/CMakeLists.txt | 21 + .../espressif__i2c_bus/Kconfig | 48 + .../espressif__i2c_bus/README.md | 70 + .../espressif__i2c_bus/i2c_bus.c | 595 + .../espressif__i2c_bus/i2c_bus_soft.c | 319 + .../espressif__i2c_bus/i2c_bus_v2.c | 608 + .../espressif__i2c_bus/idf_component.yml | 12 + .../espressif__i2c_bus/include/i2c_bus.h | 358 + .../espressif__i2c_bus/license.txt | 202 + .../private_include/i2c_bus_soft.h | 121 + .../test_apps/CMakeLists.txt | 9 + .../test_apps/main/CMakeLists.txt | 3 + .../test_apps/main/test_i2c_bus.c | 595 + .../test_apps/pytest_i2c_bus.py | 30 + .../test_apps/sdkconfig.defaults | 10 + .../espressif__mqtt/.build-test-rules.yml | 106 + .../espressif__mqtt/.component_hash | 1 + .../espressif__mqtt/.editorconfig | 34 + .../espressif__mqtt/.gitignore | 112 + .../espressif__mqtt/.gitlab/ci/build.yml | 27 + .../espressif__mqtt/.gitlab/ci/deploy.yml | 29 + .../espressif__mqtt/.gitlab/ci/docs.yml | 82 + .../.gitlab/ci/ignore_build_warnings.txt | 5 + .../espressif__mqtt/.gitlab/ci/test.yml | 50 + .../espressif__mqtt/.gitlab/ci/utils.sh | 26 + .../espressif__mqtt/.idf_build_apps.toml | 18 + .../espressif__mqtt/.idf_ci.toml | 21 + .../espressif__mqtt/.travis.yml | 65 + .../espressif__mqtt/CHECKSUMS.json | 1 + .../espressif__mqtt/CMakeLists.txt | 14 + .../espressif__mqtt/Kconfig | 190 + .../espressif__mqtt/LICENSE | 202 + .../espressif__mqtt/README.md | 52 + .../espressif__mqtt/docs/Doxyfile | 57 + .../espressif__mqtt/docs/conf_common.py | 39 + .../docs/doxygen-known-warnings.txt | 2 + .../espressif__mqtt/docs/en/conf.py | 27 + .../espressif__mqtt/docs/en/index.rst | 208 + .../docs/sphinx-known-warnings.txt | 37 + .../espressif__mqtt/docs/zh_CN/conf.py | 27 + .../espressif__mqtt/docs/zh_CN/index.rst | 208 + .../examples/custom_outbox/CMakeLists.txt | 20 + .../examples/custom_outbox/README.md | 100 + .../custom_outbox/main/CMakeLists.txt | 4 + .../custom_outbox/main/Kconfig.projbuild | 13 + .../examples/custom_outbox/main/app_main.c | 173 + .../custom_outbox/main/custom_outbox.cpp | 393 + .../custom_outbox/main/idf_component.yml | 5 + .../custom_outbox/sdkconfig.ci.esp32c6 | 1 + .../examples/custom_outbox/sdkconfig.defaults | 3 + .../examples/mqtt5/CMakeLists.txt | 9 + .../espressif__mqtt/examples/mqtt5/README.md | 78 + .../examples/mqtt5/main/CMakeLists.txt | 3 + .../examples/mqtt5/main/Kconfig.projbuild | 13 + .../examples/mqtt5/main/app_main.c | 290 + .../examples/mqtt5/main/idf_component.yml | 5 + .../examples/mqtt5/pytest_mqtt5.py | 65 + .../examples/mqtt5/sdkconfig.ci | 10 + .../examples/mqtt5/sdkconfig.defaults | 1 + .../examples/ssl/CMakeLists.txt | 11 + .../espressif__mqtt/examples/ssl/README.md | 70 + .../examples/ssl/main/CMakeLists.txt | 3 + .../examples/ssl/main/Kconfig.projbuild | 26 + .../examples/ssl/main/app_main.c | 165 + .../examples/ssl/main/idf_component.yml | 5 + .../ssl/main/mqtt_eclipseprojects_io.pem | 30 + .../examples/ssl/pytest_mqtt_ssl.py | 135 + .../espressif__mqtt/examples/ssl/sdkconfig.ci | 22 + .../examples/ssl_ds/CMakeLists.txt | 18 + .../espressif__mqtt/examples/ssl_ds/README.md | 105 + .../examples/ssl_ds/main/CMakeLists.txt | 3 + .../examples/ssl_ds/main/app_main.c | 156 + .../examples/ssl_ds/main/idf_component.yml | 6 + .../examples/ssl_ds/main/mosquitto.org.crt | 25 + .../examples/ssl_ds/partitions.csv | 6 + .../examples/ssl_ds/sdkconfig.defaults | 7 + .../ssl_ds/sdkconfig.defaults.esp32h2 | 2 + .../examples/ssl_mutual_auth/CMakeLists.txt | 13 + .../examples/ssl_mutual_auth/README.md | 82 + .../ssl_mutual_auth/main/CMakeLists.txt | 3 + .../examples/ssl_mutual_auth/main/app_main.c | 155 + .../examples/ssl_mutual_auth/main/client.crt | 1 + .../examples/ssl_mutual_auth/main/client.key | 1 + .../ssl_mutual_auth/main/idf_component.yml | 5 + .../ssl_mutual_auth/main/mosquitto.org.crt | 24 + .../ssl_mutual_auth/sdkconfig.defaults | 1 + .../sdkconfig.defaults.esp32c5 | 1 + .../sdkconfig.defaults.esp32c6 | 1 + .../sdkconfig.defaults.esp32c61 | 1 + .../examples/ssl_psk/CMakeLists.txt | 9 + .../examples/ssl_psk/README.md | 78 + .../examples/ssl_psk/main/CMakeLists.txt | 3 + .../examples/ssl_psk/main/app_main.c | 151 + .../examples/ssl_psk/main/idf_component.yml | 5 + .../examples/ssl_psk/sdkconfig.defaults | 1 + .../ssl_psk/sdkconfig.defaults.esp32c5 | 1 + .../ssl_psk/sdkconfig.defaults.esp32c6 | 1 + .../ssl_psk/sdkconfig.defaults.esp32c61 | 1 + .../examples/tcp/CMakeLists.txt | 9 + .../espressif__mqtt/examples/tcp/README.md | 375 + .../examples/tcp/main/CMakeLists.txt | 3 + .../examples/tcp/main/Kconfig.projbuild | 13 + .../examples/tcp/main/app_main.c | 162 + .../examples/tcp/main/idf_component.yml | 13 + .../examples/tcp/pytest_mqtt_tcp.py | 97 + .../espressif__mqtt/examples/tcp/sdkconfig.ci | 13 + .../examples/tcp/sdkconfig.ci.p4_eppp | 5 + .../examples/tcp/sdkconfig.ci.p4_wifi | 3 + .../examples/tcp/sdkconfig.ci.ppp_connect | 3 + .../examples/ws/CMakeLists.txt | 9 + .../espressif__mqtt/examples/ws/README.md | 61 + .../examples/ws/main/CMakeLists.txt | 3 + .../examples/ws/main/Kconfig.projbuild | 9 + .../examples/ws/main/app_main.c | 144 + .../examples/ws/main/idf_component.yml | 5 + .../examples/ws/pytest_mqtt_ws_example.py | 108 + .../espressif__mqtt/examples/ws/sdkconfig.ci | 11 + .../examples/wss/CMakeLists.txt | 11 + .../espressif__mqtt/examples/wss/README.md | 73 + .../examples/wss/main/CMakeLists.txt | 3 + .../examples/wss/main/Kconfig.projbuild | 20 + .../examples/wss/main/app_main.c | 135 + .../examples/wss/main/idf_component.yml | 5 + .../wss/main/mqtt_eclipseprojects_io.pem | 30 + .../examples/wss/pytest_mqtt_wss_example.py | 111 + .../espressif__mqtt/examples/wss/sdkconfig.ci | 13 + .../espressif__mqtt/idf_component.yml | 18 + .../espressif__mqtt/include/mqtt5_client.h | 286 + .../espressif__mqtt/include/mqtt_client.h | 704 + .../include/mqtt_supported_features.h | 83 + .../lib/include/mqtt5_client_priv.h | 56 + .../espressif__mqtt/lib/include/mqtt5_msg.h | 142 + .../lib/include/mqtt_client_priv.h | 150 + .../espressif__mqtt/lib/include/mqtt_config.h | 118 + .../espressif__mqtt/lib/include/mqtt_msg.h | 152 + .../espressif__mqtt/lib/include/mqtt_outbox.h | 64 + .../espressif__mqtt/lib/include/platform.h | 14 + .../lib/include/platform_esp32_idf.h | 29 + .../espressif__mqtt/lib/mqtt5_msg.c | 1047 + .../espressif__mqtt/lib/mqtt_msg.c | 637 + .../espressif__mqtt/lib/mqtt_outbox.c | 225 + .../espressif__mqtt/lib/platform_esp32_idf.c | 48 + .../espressif__mqtt/mqtt5_client.c | 768 + .../espressif__mqtt/mqtt_client.c | 2392 ++ .../espressif__mqtt/pytest.ini | 28 + .../espressif__mqtt/static-analysis-rules.yml | 9 + .../test/apps/common/CMakeLists.txt | 4 + .../common/include/test_mqtt_connection.h | 18 + .../test/apps/common/test_mqtt_connection.c | 144 + .../test/apps/mqtt/CMakeLists.txt | 16 + .../espressif__mqtt/test/apps/mqtt/README.md | 2 + .../test/apps/mqtt/main/CMakeLists.txt | 8 + .../test/apps/mqtt/main/Kconfig.projbuild | 14 + .../test/apps/mqtt/main/idf_component.yml | 5 + .../test/apps/mqtt/main/test_mqtt.c | 122 + .../apps/mqtt/main/test_mqtt_client_broker.c | 227 + .../apps/mqtt/main/test_mqtt_client_broker.h | 50 + .../test/apps/mqtt/pytest_mqtt_ut.py | 11 + .../test/apps/mqtt/sdkconfig.ci.default | 4 + .../test/apps/mqtt/sdkconfig.defaults | 3 + .../test/apps/mqtt5/CMakeLists.txt | 16 + .../espressif__mqtt/test/apps/mqtt5/README.md | 2 + .../test/apps/mqtt5/main/CMakeLists.txt | 4 + .../test/apps/mqtt5/main/Kconfig.projbuild | 14 + .../test/apps/mqtt5/main/idf_component.yml | 4 + .../test/apps/mqtt5/main/test_mqtt5.c | 172 + .../mqtt5/main/test_mqtt5_client_broker.c | 285 + .../mqtt5/main/test_mqtt5_client_broker.h | 51 + .../test/apps/mqtt5/pytest_mqtt5_ut.py | 11 + .../test/apps/mqtt5/sdkconfig.ci.default | 4 + .../test/apps/mqtt5/sdkconfig.defaults | 4 + .../apps/publish_connect_test/CMakeLists.txt | 16 + .../test/apps/publish_connect_test/README.md | 25 + .../test/apps/publish_connect_test/ca.crt | 19 + .../test/apps/publish_connect_test/ca.der | Bin 0 -> 797 bytes .../test/apps/publish_connect_test/ca.key | 28 + .../apps/publish_connect_test/client_inv.crt | 19 + .../publish_connect_test/client_no_pwd.key | 28 + .../apps/publish_connect_test/client_pwd.crt | 18 + .../apps/publish_connect_test/client_pwd.key | 30 + .../publish_connect_test/main/CMakeLists.txt | 4 + .../main/Kconfig.projbuild | 94 + .../publish_connect_test/main/connect_test.c | 197 + .../main/idf_component.yml | 11 + .../main/mqtt_eclipseprojects_io.pem | 30 + .../main/publish_connect_test.c | 334 + .../main/publish_connect_test.h | 59 + .../publish_connect_test/main/publish_test.c | 229 + .../publish_connect_test/pytest_mqtt_app.py | 276 + .../pytest_mqtt_publish_app.py | 335 + .../publish_connect_test/sdkconfig.ci.default | 20 + .../sdkconfig.ci.local_broker | 13 + .../test/apps/publish_connect_test/server.key | 27 + .../espressif__mqtt/test/host/CMakeLists.txt | 17 + .../espressif__mqtt/test/host/README.md | 30 + .../test/host/main/CMakeLists.txt | 21 + .../espressif__mqtt/test/host/main/Kconfig | 9 + .../test/host/main/idf_component.yml | 9 + .../test/host/main/test_mqtt_client.cpp | 171 + .../test/host/mocks/include/sys/queue.h | 71 + .../test/host/sdkconfig.ci.coverage | 1 + .../test/host/sdkconfig.defaults | 6 + 290 files changed, 59001 insertions(+), 3 deletions(-) create mode 100644 ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/3.31.6/CMakeASMCompiler.cmake create mode 100644 ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/3.31.6/CMakeCCompiler.cmake create mode 100644 ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/3.31.6/CMakeCXXCompiler.cmake create mode 100755 ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/3.31.6/CMakeDetermineCompilerABI_C.bin create mode 100755 ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/3.31.6/CMakeDetermineCompilerABI_CXX.bin create mode 100644 ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/3.31.6/CMakeSystem.cmake create mode 100644 ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/3.31.6/CompilerIdC/CMakeCCompilerId.c create mode 100755 ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/3.31.6/CompilerIdC/a.out create mode 100644 ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/3.31.6/CompilerIdCXX/CMakeCXXCompilerId.cpp create mode 100755 ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/3.31.6/CompilerIdCXX/a.out create mode 100644 ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/CMakeConfigureLog.yaml create mode 100644 ESP32-IDF_Temperture-Node-v2/build/bootloader-prefix/src/bootloader-stamp/bootloader-patch-info.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/build/bootloader-prefix/src/bootloader-stamp/bootloader-source_dirinfo.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/build/bootloader-prefix/src/bootloader-stamp/bootloader-update-info.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/build/bootloader-prefix/tmp/bootloader-cfgcmd.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/build/bootloader-prefix/tmp/bootloader-mkdirs.cmake create mode 100644 ESP32-IDF_Temperture-Node-v2/build/config.env create mode 100644 ESP32-IDF_Temperture-Node-v2/build/config/kconfig_menus.json create mode 100644 ESP32-IDF_Temperture-Node-v2/build/config/sdkconfig.cmake create mode 100644 ESP32-IDF_Temperture-Node-v2/build/config/sdkconfig.h create mode 100644 ESP32-IDF_Temperture-Node-v2/build/config/sdkconfig.json create mode 100644 ESP32-IDF_Temperture-Node-v2/build/esp-idf/esp_system/ld/linker_script_generator.cmake create mode 120000 ESP32-IDF_Temperture-Node-v2/build/esp-idf/mbedtls/mbedtls/library/error.c create mode 120000 ESP32-IDF_Temperture-Node-v2/build/esp-idf/mbedtls/mbedtls/library/psa_crypto_driver_wrappers_no_static.c create mode 120000 ESP32-IDF_Temperture-Node-v2/build/esp-idf/mbedtls/mbedtls/library/ssl_debug_helpers_generated.c create mode 120000 ESP32-IDF_Temperture-Node-v2/build/esp-idf/mbedtls/mbedtls/library/version_features.c create mode 100644 ESP32-IDF_Temperture-Node-v2/build/gdbinit/connect create mode 100644 ESP32-IDF_Temperture-Node-v2/build/gdbinit/gdbinit create mode 100644 ESP32-IDF_Temperture-Node-v2/build/gdbinit/prefix_map create mode 100644 ESP32-IDF_Temperture-Node-v2/build/gdbinit/py_extensions create mode 100644 ESP32-IDF_Temperture-Node-v2/build/gdbinit/symbols create mode 100644 ESP32-IDF_Temperture-Node-v2/build/kconfigs.in create mode 100644 ESP32-IDF_Temperture-Node-v2/build/kconfigs_projbuild.in create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/.component_hash create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/CHANGELOG.md create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/CHECKSUMS.json create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/README.md create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/bme280.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/idf_component.yml create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/include/bme280.h create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/license.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/test_apps/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/test_apps/main/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/test_apps/main/bme280_test.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/test_apps/sdkconfig.defaults create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/.component_hash create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/CHANGELOG.md create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/CHECKSUMS.json create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/Kconfig create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/README.md create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/cmake_utilities.cmake create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/docs/gcc.md create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/docs/gen_compressed_ota.md create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/docs/relinker.md create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/gcc.cmake create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/gen_compressed_ota.cmake create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/gen_single_bin.cmake create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/idf_component.yml create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/license.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/package_manager.cmake create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/project_include.cmake create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/relinker.cmake create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/scripts/gen_custom_ota.py create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/scripts/relinker/configuration.py create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/scripts/relinker/examples/esp32c2/function.csv create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/scripts/relinker/examples/esp32c2/library.csv create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/scripts/relinker/examples/esp32c2/object.csv create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/scripts/relinker/relinker.py create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/TEST-component2/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/TEST-component2/idf_component.yml create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/TEST-component2/test_component2.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/TEST-component2/test_component2.h create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/test_component1/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/test_component1/idf_component.yml create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/test_component1/test_component1.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/test_component1/test_component1.h create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/main/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/main/test_cmake_utilities.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/pytest_cmake_utilities.py create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/.component_hash create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/CHANGELOG.md create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/CHECKSUMS.json create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/Kconfig create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/README.md create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/i2c_bus.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/i2c_bus_soft.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/i2c_bus_v2.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/idf_component.yml create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/include/i2c_bus.h create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/license.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/private_include/i2c_bus_soft.h create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/test_apps/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/test_apps/main/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/test_apps/main/test_i2c_bus.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/test_apps/pytest_i2c_bus.py create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/test_apps/sdkconfig.defaults create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.build-test-rules.yml create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.component_hash create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.editorconfig create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.gitignore create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.gitlab/ci/build.yml create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.gitlab/ci/deploy.yml create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.gitlab/ci/docs.yml create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.gitlab/ci/ignore_build_warnings.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.gitlab/ci/test.yml create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.gitlab/ci/utils.sh create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.idf_build_apps.toml create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.idf_ci.toml create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.travis.yml create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/CHECKSUMS.json create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/Kconfig create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/LICENSE create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/README.md create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/Doxyfile create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/conf_common.py create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/doxygen-known-warnings.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/en/conf.py create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/en/index.rst create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/sphinx-known-warnings.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/zh_CN/conf.py create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/zh_CN/index.rst create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/README.md create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/main/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/main/Kconfig.projbuild create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/main/app_main.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/main/custom_outbox.cpp create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/main/idf_component.yml create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/sdkconfig.ci.esp32c6 create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/sdkconfig.defaults create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/README.md create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/main/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/main/Kconfig.projbuild create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/main/app_main.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/main/idf_component.yml create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/pytest_mqtt5.py create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/sdkconfig.ci create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/sdkconfig.defaults create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/README.md create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/main/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/main/Kconfig.projbuild create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/main/app_main.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/main/idf_component.yml create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/main/mqtt_eclipseprojects_io.pem create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/pytest_mqtt_ssl.py create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/sdkconfig.ci create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/README.md create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/main/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/main/app_main.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/main/idf_component.yml create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/main/mosquitto.org.crt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/partitions.csv create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/sdkconfig.defaults create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/sdkconfig.defaults.esp32h2 create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/README.md create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/main/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/main/app_main.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/main/client.crt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/main/client.key create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/main/idf_component.yml create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/main/mosquitto.org.crt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/sdkconfig.defaults create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/sdkconfig.defaults.esp32c5 create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/sdkconfig.defaults.esp32c6 create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/sdkconfig.defaults.esp32c61 create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/README.md create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/main/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/main/app_main.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/main/idf_component.yml create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/sdkconfig.defaults create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/sdkconfig.defaults.esp32c5 create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/sdkconfig.defaults.esp32c6 create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/sdkconfig.defaults.esp32c61 create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/README.md create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/main/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/main/Kconfig.projbuild create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/main/app_main.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/main/idf_component.yml create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/pytest_mqtt_tcp.py create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/sdkconfig.ci create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/sdkconfig.ci.p4_eppp create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/sdkconfig.ci.p4_wifi create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/sdkconfig.ci.ppp_connect create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/README.md create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/main/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/main/Kconfig.projbuild create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/main/app_main.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/main/idf_component.yml create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/pytest_mqtt_ws_example.py create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/sdkconfig.ci create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/README.md create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/main/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/main/Kconfig.projbuild create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/main/app_main.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/main/idf_component.yml create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/main/mqtt_eclipseprojects_io.pem create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/pytest_mqtt_wss_example.py create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/sdkconfig.ci create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/idf_component.yml create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/include/mqtt5_client.h create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/include/mqtt_client.h create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/include/mqtt_supported_features.h create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/mqtt5_client_priv.h create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/mqtt5_msg.h create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/mqtt_client_priv.h create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/mqtt_config.h create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/mqtt_msg.h create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/mqtt_outbox.h create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/platform.h create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/platform_esp32_idf.h create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/mqtt5_msg.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/mqtt_msg.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/mqtt_outbox.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/platform_esp32_idf.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/mqtt5_client.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/mqtt_client.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/pytest.ini create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/static-analysis-rules.yml create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/common/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/common/include/test_mqtt_connection.h create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/common/test_mqtt_connection.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/README.md create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/main/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/main/Kconfig.projbuild create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/main/idf_component.yml create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/main/test_mqtt.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/main/test_mqtt_client_broker.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/main/test_mqtt_client_broker.h create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/pytest_mqtt_ut.py create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/sdkconfig.ci.default create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/sdkconfig.defaults create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/README.md create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/main/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/main/Kconfig.projbuild create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/main/idf_component.yml create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/main/test_mqtt5.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/main/test_mqtt5_client_broker.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/main/test_mqtt5_client_broker.h create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/pytest_mqtt5_ut.py create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/sdkconfig.ci.default create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/sdkconfig.defaults create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/README.md create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/ca.crt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/ca.der create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/ca.key create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/client_inv.crt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/client_no_pwd.key create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/client_pwd.crt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/client_pwd.key create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/main/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/main/Kconfig.projbuild create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/main/connect_test.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/main/idf_component.yml create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/main/mqtt_eclipseprojects_io.pem create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/main/publish_connect_test.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/main/publish_connect_test.h create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/main/publish_test.c create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/pytest_mqtt_app.py create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/pytest_mqtt_publish_app.py create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/sdkconfig.ci.default create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/sdkconfig.ci.local_broker create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/server.key create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/host/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/host/README.md create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/host/main/CMakeLists.txt create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/host/main/Kconfig create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/host/main/idf_component.yml create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/host/main/test_mqtt_client.cpp create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/host/mocks/include/sys/queue.h create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/host/sdkconfig.ci.coverage create mode 100644 ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/host/sdkconfig.defaults diff --git a/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/3.31.6/CMakeASMCompiler.cmake b/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/3.31.6/CMakeASMCompiler.cmake new file mode 100644 index 000000000..d32fbd02a --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/3.31.6/CMakeASMCompiler.cmake @@ -0,0 +1,29 @@ +set(CMAKE_ASM_COMPILER "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-gcc") +set(CMAKE_ASM_COMPILER_ARG1 "") +set(CMAKE_AR "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-ar") +set(CMAKE_ASM_COMPILER_AR "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-gcc-ar") +set(CMAKE_RANLIB "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-ranlib") +set(CMAKE_ASM_COMPILER_RANLIB "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-gcc-ranlib") +set(CMAKE_LINKER "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-ld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_ASM_COMPILER_LINKER "") +set(CMAKE_ASM_COMPILER_LINKER_ID "") +set(CMAKE_ASM_COMPILER_LINKER_VERSION ) +set(CMAKE_ASM_COMPILER_LINKER_FRONTEND_VARIANT ) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_ASM_COMPILER_LOADED 1) +set(CMAKE_ASM_COMPILER_ID "GNU") +set(CMAKE_ASM_COMPILER_VERSION "") +set(CMAKE_ASM_COMPILER_ENV_VAR "ASM") + + +set(CMAKE_ASM_COMPILER_SYSROOT "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/usr") +set(CMAKE_COMPILER_SYSROOT "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/usr") + +set(CMAKE_ASM_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_ASM_LINKER_PREFERENCE 0) +set(CMAKE_ASM_LINKER_DEPFILE_SUPPORTED ) + + diff --git a/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/3.31.6/CMakeCCompiler.cmake b/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/3.31.6/CMakeCCompiler.cmake new file mode 100644 index 000000000..e42e5e875 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/3.31.6/CMakeCCompiler.cmake @@ -0,0 +1,82 @@ +set(CMAKE_C_COMPILER "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-gcc") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "GNU") +set(CMAKE_C_COMPILER_VERSION "14.2.0") +set(CMAKE_C_COMPILER_VERSION_INTERNAL "") +set(CMAKE_C_COMPILER_WRAPPER "") +set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_C_STANDARD_LATEST "23") +set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17;c_std_23") +set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") +set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") +set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") +set(CMAKE_C17_COMPILE_FEATURES "c_std_17") +set(CMAKE_C23_COMPILE_FEATURES "c_std_23") + +set(CMAKE_C_PLATFORM_ID "") +set(CMAKE_C_SIMULATE_ID "") +set(CMAKE_C_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_C_SIMULATE_VERSION "") + +set(CMAKE_C_COMPILER_SYSROOT "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/usr") +set(CMAKE_COMPILER_SYSROOT "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/usr") + + +set(CMAKE_AR "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-ar") +set(CMAKE_C_COMPILER_AR "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-gcc-ar") +set(CMAKE_RANLIB "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-ranlib") +set(CMAKE_C_COMPILER_RANLIB "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-gcc-ranlib") +set(CMAKE_LINKER "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-ld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_C_COMPILER_LINKER "NOTFOUND") +set(CMAKE_C_COMPILER_LINKER_ID "") +set(CMAKE_C_COMPILER_LINKER_VERSION ) +set(CMAKE_C_COMPILER_LINKER_FRONTEND_VARIANT ) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCC 1) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) +set(CMAKE_C_LINKER_DEPFILE_SUPPORTED ) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "4") +set(CMAKE_C_COMPILER_ABI "ELF") +set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_C_LIBRARY_ARCHITECTURE "") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "") +endif() + +set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/include;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/include-fixed;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/include") +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "gcc;c;nosys;c;gcc") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/esp32;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/lib/esp32;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/lib;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/usr/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/3.31.6/CMakeCXXCompiler.cmake b/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/3.31.6/CMakeCXXCompiler.cmake new file mode 100644 index 000000000..60e46c90f --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/3.31.6/CMakeCXXCompiler.cmake @@ -0,0 +1,106 @@ +set(CMAKE_CXX_COMPILER "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-g++") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "GNU") +set(CMAKE_CXX_COMPILER_VERSION "14.2.0") +set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") +set(CMAKE_CXX_COMPILER_WRAPPER "") +set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_CXX_STANDARD_LATEST "26") +set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23;cxx_std_26") +set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") +set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") +set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") +set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") +set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20") +set(CMAKE_CXX23_COMPILE_FEATURES "cxx_std_23") +set(CMAKE_CXX26_COMPILE_FEATURES "cxx_std_26") + +set(CMAKE_CXX_PLATFORM_ID "") +set(CMAKE_CXX_SIMULATE_ID "") +set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_CXX_SIMULATE_VERSION "") + +set(CMAKE_CXX_COMPILER_SYSROOT "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/usr") +set(CMAKE_COMPILER_SYSROOT "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/usr") + + +set(CMAKE_AR "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-ar") +set(CMAKE_CXX_COMPILER_AR "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-gcc-ar") +set(CMAKE_RANLIB "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-ranlib") +set(CMAKE_CXX_COMPILER_RANLIB "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-gcc-ranlib") +set(CMAKE_LINKER "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-ld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_CXX_COMPILER_LINKER "NOTFOUND") +set(CMAKE_CXX_COMPILER_LINKER_ID "") +set(CMAKE_CXX_COMPILER_LINKER_VERSION ) +set(CMAKE_CXX_COMPILER_LINKER_FRONTEND_VARIANT ) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCXX 1) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;mpp;CPP;ixx;cppm;ccm;cxxm;c++m) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) + +foreach (lang IN ITEMS C OBJC OBJCXX) + if (CMAKE_${lang}_COMPILER_ID_RUN) + foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS) + list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension}) + endforeach() + endif() +endforeach() + +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) +set(CMAKE_CXX_LINKER_DEPFILE_SUPPORTED ) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "4") +set(CMAKE_CXX_COMPILER_ABI "ELF") +set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "") +endif() + +set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/include/c++/14.2.0;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/include/c++/14.2.0/xtensa-esp-elf/esp32;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/include/c++/14.2.0/backward;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/include;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/include-fixed;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/include") +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "stdc++;m;gcc;c;nosys;c;gcc") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/esp32;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/lib/esp32;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/lib;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/usr/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") +set(CMAKE_CXX_COMPILER_CLANG_RESOURCE_DIR "") + +set(CMAKE_CXX_COMPILER_IMPORT_STD "") +### Imported target for C++23 standard library +set(CMAKE_CXX23_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE "Toolchain does not support discovering `import std` support") + + +### Imported target for C++26 standard library +set(CMAKE_CXX26_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE "Toolchain does not support discovering `import std` support") + + + diff --git a/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/3.31.6/CMakeDetermineCompilerABI_C.bin b/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/3.31.6/CMakeDetermineCompilerABI_C.bin new file mode 100755 index 0000000000000000000000000000000000000000..e28dd48cce8a8f44269096ea521b2ebd7517f7ad GIT binary patch literal 4068 zcmcImTWB0r7(O$TZC0&mQg6|E+0+)=hwN_BAhlZ9ZMumI=|-Cb#j4ZY>}e(+o{W3=1VlnOx{w^Avs=ix z^sPh;43~(5m-+EsT0(pQzK4uBDJb{Dw-?;>V>LZNh&Tv4tS3YSoB;0xGykQ?b5%n$ zzI9KAMdKTOFZ&_+wR@;Th^vy~@KJS!Co2k{GYl3-6y>tl51xeBhol_qr}tH4lUm%|p#F zk~Twg8^2%syW4ory|5_`zvnjIKm7b4|G0o!flS;e_$aj9t$@+A8EpKoSr6py)ED38GJ9dw`_LyhrPbyphF1N?A%&MKY>>Xq2$;q*lnaXTUCo@3Ecs5tufjW~7kkbV*x00j7 z!*5^s@M7lhN6SfxH%Xf92yuHxO#oWa|l*s1k5tM$+0T+teLJ9 zs$yy)WhS>wjE_xCrc8_@wLLjDu{nNra!VRtfJv8vQLZ2q2Z(hp>rz@?;*ii}kR7xD zH^6uftnJr&ME6BK+R7D1*Q&0yUFWgx$G{=vj1r+~e|DWq!3R0;sozPk9Y->SRd1j!Kn1^Tk1<)DW7r-wl4E#K^Nt`>+d8Mm6fPNQv{+G=2 zrfBJEFSri8KS;z=H=z^%d7!Vb?v00-2=vPlr=EZw@%2UI=l(ON+FRd7>FfCnaZW1; z&5%cW%Vo$F4cc8TL*iGo+1>t(J$Hxr(d8wf=BHtPm%vuFreS{A(xvs#FoJ7fpY+#H zN4Cwd`QMOeUk}OpNDHtUQ3dJpoYVXJ)InC}#A%$NTp+usaZ zoq4o(w&7=BKY{fku|3b`x-(lSM5l#m4o{A6$CW-YX_~OMo@S-4Ge@>3x24Q2snK)> z06asinPT0sY||;5)1_*~s*CArxmL0qE5Bw?0 zF8OJu~KxrEP;0%@VR>3tUFoT z5#?;LBFqAS!nE>PCks)@3lXjFDLdI5q+@$>m(m<--Vsr|D$!AEmnoM-MCCL^RIZtb zq6@gH<+4=)+IyQsIaeU8-0X~*wX>BOY=du}7Ru#p>rNFZ6)Tp~F$Sg5jY+_sccNGs zDQkAMCJW|YepUg8GGleg`_zGahz_6lFO&Mfbn9T&co<3nx*~;J4~N3>U#$VBV#F$a zgO4*Hc_ul)g$eLU;Woi$KH_**?fnN_5^=UCj{n>}z(t@dQu#*UV7|B?ATFjrevI*P zaPUNb9=MHdIGQ~3h*$JOTfb^fy8#H|x-rl-s!<>|7tk3V0*-GPMJmU=a44Oz>wvpn zfda7yd|l1=Vc=eA!!ggJZMZ2c7+>~^h#^1YOXcstjmvu;_?W+i(Ku_GeVGTFkP#<^{i8P>J-N8jaE9*s(7Sr^ zO{bMF zTef?Kqki8B!10A({X z6Zu{4G0S%9cJZK-*<(#+)0w^5l#p@RE`Q9mt-4dRor6=Exw)ydmCo+Xq_RNBcrIT) zh&q!EkkbP(w~~|N>n}1QKO&-Y5XL&q(5^BB84cq3g>t3XjF*e0cz9*vrVPZF9LMr=!%spcAm0dVH<0Hb``}**?4>}ecHCuEM>_OBAx?^d-wyOO zTYMdxE9>tP?kp1h)RkY2fjQMUsH?G1zYxkv{W|z`@R!gjH-i5SofJj>ub>Y>XY5Dl zi*h4)FcZEff(&pdPz^YCu}A#}!0gz(D>13&L<66el) zUg_!|K)(k(&n5G`BRaa;3$6qIA0*xHlzZ9Am|7RpQ&XE2-`c-rMJ#^+KvzACva76F; zd!Uo(zY?)VNVr6#jOs}#4VhJl#;R>dzuE^w&c3r3hTP@OKiRnKhGhO8* zrBsx7b^H20LtNbnLNnx*-fk%;xTh%S?dtj@(Yy(=@uvMLM^$&&G_hG&j z+L$lTB=JXKt2>YOVi*2F*w10TNNmr$x#=#HN@hV=*7)4aKK#;W=PV1>-pj1?9oEFY z)O6a~lb+0E0l+iFo-a3D+p*lLRjAZ!c2gAU)kej3?c%0UQFQB$RW2@V8bPvR-NNrO zpQ~7OH?7>llBnnJvkUH~geW<=s%;e)s?}p^6nNRlLHKn9fItT z2)ws2+_~v-zQa0878vDP*+n?tY+6k>=eVMpDF+?t5v%OwEtu=IYJ=p{KCAIb8@wL>`q`_ z7Ru)x`+gOvlxw!qF$Sg5jY+^>a!o9TlntlekahHJK7#-cv4cQ33)|xLvTBk2v06$G-uWLY(c1 z<2il=xEORrD&GVg%$EoP#KjdTh%r6`4&U;>0&YhajwbIx;uU?-)vub<5dgxtJ`8k| zY7~kshIEFG4&d%opiu0IKv(m98o1wf;h5*=UAX;NFuwK`5kr0{ zkjlRX527or%dfj|w*$w$Q>4aD8FGtPu;>@y*Z}`#F!!ww%(n-IzDiHym-?_u0>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "ARM" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define C_STD_99 199901L +#define C_STD_11 201112L +#define C_STD_17 201710L +#define C_STD_23 202311L + +#ifdef __STDC_VERSION__ +# define C_STD __STDC_VERSION__ +#endif + +#if !defined(__STDC__) && !defined(__clang__) +# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) +# define C_VERSION "90" +# else +# define C_VERSION +# endif +#elif C_STD > C_STD_17 +# define C_VERSION "23" +#elif C_STD > C_STD_11 +# define C_VERSION "17" +#elif C_STD > C_STD_99 +# define C_VERSION "11" +#elif C_STD >= C_STD_99 +# define C_VERSION "99" +#else +# define C_VERSION "90" +#endif +const char* info_language_standard_default = + "INFO" ":" "standard_default[" C_VERSION "]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/3.31.6/CompilerIdC/a.out b/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/3.31.6/CompilerIdC/a.out new file mode 100755 index 0000000000000000000000000000000000000000..2288b808b9d0757b7c45b8cfb11bf954ec92fa1b GIT binary patch literal 4324 zcmcIneTW?88GmLbms@MR+$Ba2WAQGYkU(#D?-HVk5%zM~yB=IFXYPWfsSdNdvv=F< z$7OcToM31+*s_WFM-f`YVj}bdS}~DQv{p=!RuQF@LQN%LgjDl~6a|ZxhK|4AJM-R7 zHWBm>A9&{ZJshn+0L06Mo0qsN3eek z{uDfIX5@3o%V1Rx@@;KM<5F-TA&n3D{r1Nr9|R{?h-@8^Q~wGY9|XVZ?QC2OPV_2g zXn!v_b0IkS(%I8T`%k~par~vzXZlYZXq;aTLRshC;OI)Z{CeZv;NZDncjCyQvkPAT zz3&9qANq?a>zl_qGR>3C1d=v84&C+dJN_Fq-VSbR%Bi=5#$VZxRlP^Y&>FU*@m6rt z3v%Yo;M5yI;|)50@mT;D+kV*CG`{V=Rf%JrjXwuJOEkxiA3K_mpC_7~Pc~uu(=}`_ zUu}Er#h|_9@2`$(Jb$&V**TbCQ`pXfzX`?+LG!%VE;l=iiBF?8Hhvk7tV~Re?b)8M zRTfHR*V{inweNnp(q=#Cdi7GRx<9RGXiG8#>0u4hC=!-gC_8?!=2iCJAL@>mpVzqV zJJo{Y73_jrbQa70{-HaU%ehOwTV*BnW$&ITdPM?IT<$P4@(B0|@Ja9=!Q-Q&+xs@= zy;{BQ*J|a#sqsFyzA%WUqK)=&dU(sw(9pI`eW5{CiC`myOZWYhaet}(ptLY)hZxGKcH?ruy@+@Y zY#cFqr2FO`W6f%-Ykk)pU2D1DCcz!ZnPh}v{IBZ<3T6NU+@>mh0J;gh+Wa*=>LVQ{ z>#$ZCmT{dWWE4o{7E9$qJyj|cQ}IzrC6yzkM%x+W7`f$Qs_x}eRrgT2luLo<${5Bd z1f~6Saz?&p!mt+g9Yn@_dxfZY^YC(Af<@OiGSfGl+_E`2^bObbHGA^qLnG19JdEMz zgdc%SL%td5ek4yr_QL*pq%TEMm*Xt!Wnuz<2tO$S{#%4sYz#3bSFOLanE}Eogq>L1 zbsLydw}V)>h4@k|C-IH2nc&O7lpDbR2PP$uUvM7xL(ta`tYdBmCNX9p7L(O>_=s{qqvWn=t+)^vAH78bdF6w!))QpR|@5A!ZX&Jo4`=lw5^a&0$v_^4I1e0Ezos;4fK~&qsPZU zi|&T5_ne7r_du6uJyV~ij`83~8yJrtK=RGRGllvbB=;AI@rNP#hU$f+|0j^#HzfMQ z8B;29d=fkksMiqN`!w`;`<{i~Yi95b%fG5n_+j~f0P=mt_VnPk`wv~w{PmbCh1Zl` zmpx{ObV29aPRHL0U7urX&^jBsUYFg_H$dk*P{)4<`m`DDuO9Sh8+5)6wg3Cjb^YDw ze-XOgzs!FCdK%?P)DK<}zfzW<_eJez`NPn;&vkyD>veyzSWM={wnu08?8Q@HX4bZ$ z?YctCe%Bt`JF+`#@63)*Od+7)dhT4Q?z^7tSL}SbR(0#br&ZbY-NL}I6#SZJmkLV* zLr7Mr*|=(RPT8ipZaa%hQp^3&&HDpsDSA%DwF`@t%0s#p*{NNs5n-KLYh}qVXBpk? z9B@ZRqc`0|0X-?fE9;=i2R0F;p?Td(_rBRX0OLmD8^}u}jsGALioAE=1Au zu&s)#Uv#J>SFf{f&zFi*s)}7iKC#_`<2w-5LYPB8MsW_-AFB9H4$}8RIj@nA3MA>( zRN16EZ>tfLq#6ZDsv(77<|L|xqgJW7Rg?)IKS}ls0d8(_&UQSE4CX3QuW;pZp8KHo zluK1tW3)s=n$a=nOMbG9A);LHY71%=eznhfgmJ0zgyi|_L%v2sL|mVwelX2E-+3=ie^X}r8#Erz_xUW7!9N!q4 zbiQ#ISP$z}`x&5*I3gX#w=w&X)(*s_G>&}q?*qqglN93aYKx>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) || defined(__GNUG__) +# define COMPILER_ID "GNU" +# if defined(__GNUC__) +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# else +# define COMPILER_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "ARM" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define CXX_STD_98 199711L +#define CXX_STD_11 201103L +#define CXX_STD_14 201402L +#define CXX_STD_17 201703L +#define CXX_STD_20 202002L +#define CXX_STD_23 202302L + +#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) +# if _MSVC_LANG > CXX_STD_17 +# define CXX_STD _MSVC_LANG +# elif _MSVC_LANG == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 && __cplusplus > CXX_STD_17 +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 +# define CXX_STD CXX_STD_17 +# elif defined(__INTEL_CXX11_MODE__) && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# elif defined(__INTEL_CXX11_MODE__) +# define CXX_STD CXX_STD_11 +# else +# define CXX_STD CXX_STD_98 +# endif +#elif defined(_MSC_VER) && defined(_MSVC_LANG) +# if _MSVC_LANG > __cplusplus +# define CXX_STD _MSVC_LANG +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__NVCOMPILER) +# if __cplusplus == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__INTEL_COMPILER) || defined(__PGI) +# if __cplusplus == CXX_STD_11 && defined(__cpp_namespace_attributes) +# define CXX_STD CXX_STD_17 +# elif __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif (defined(__IBMCPP__) || defined(__ibmxl__)) && defined(__linux__) +# if __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif __cplusplus == 1 && defined(__GXX_EXPERIMENTAL_CXX0X__) +# define CXX_STD CXX_STD_11 +#else +# define CXX_STD __cplusplus +#endif + +const char* info_language_standard_default = "INFO" ":" "standard_default[" +#if CXX_STD > CXX_STD_23 + "26" +#elif CXX_STD > CXX_STD_20 + "23" +#elif CXX_STD > CXX_STD_17 + "20" +#elif CXX_STD > CXX_STD_14 + "17" +#elif CXX_STD > CXX_STD_11 + "14" +#elif CXX_STD >= CXX_STD_11 + "11" +#else + "98" +#endif +"]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} diff --git a/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/3.31.6/CompilerIdCXX/a.out b/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/3.31.6/CompilerIdCXX/a.out new file mode 100755 index 0000000000000000000000000000000000000000..74e440008fdb1cd127de4ef098d4333a1086d546 GIT binary patch literal 4332 zcmcInZHQb~8Gi4*+3eJ$o86>o7o)h_Y$5rvGqaNrlQf0dY-ZPm&1Re3U@*3qJ2Q87 z$Ie&o+-K{G37VPzAP60=X62u-x1g#WJ!f9LaB=wT6RoSOB-C}T1gF-@tyf!Dg5#HigNc(T zE;YR2NBZ|nELHxlisGpA1_F0s z{q8QYm+p*x^;bc6&0pNfYQ1o0tlc}BU{~1B<3A224MF$3S8la?ONkGnKDK@k&a6z& zP9EA@s8<{1it8PlnmzKE+#a)^biHP|UOSdnGPW}rf^DTL((b=gXx7ip)SJ6j1lg{iM8ynlReJBjbdJ%jG;TAv2h8=slR;tU9 z`J6qzfBw+Sk%gQ+Grf>IJU%o3Ncv;r`={}X3ZH=DGl5_;Lil~D??HKC(jGBXq52wE z36FyDGpKRW7?A!428@jxtiCOM5A|*0_cjCVLCz!@hVk#dduf;f3h*h_=;QEB;0@-F zSfYNU$7CDUdc!jAv4n~Wsr+)eQf#Km#ZoFhE2*R^NU7O&Mma}rrIc!Vg;dQwQ7PwB z(8UU-F`}ThpH9xpM@$&DqJBq_vC!Qh8s3pvZA-A}hQ{ZIGRd7gl4Jkpwm#xWK748< znwqCE{ao;quxZ%WBj1ng1=vBvUyb~g$m)7rWxY*I;CE3@NkIP;;WgVrjKx*^FKuRl zunQ3<)^Xhj=G6Tl)_ozq5z9$@A7Uo-7BKCD(Ek8a638z&kB4DcHVmveTY)L$jKnxO z9Y-1QR#@g-0_I*Pt^(^kbzlnf@J`tb%(5@X_-8Z+ao!OWj-B_5#`^AIe1{o+m(25L z>0rGUoCkGp!IDpW8kqdeW){EU{PUjb2PTK-&ZY>@0cRroEby)f>osP6z0SnECn?NB zd=D_&8V05$pv1hUAA}}>DU4r>jgfaMg?ZxR{cCKDZvitm^=)7Z^XxG@@rQvajNeVT zUnn?Gl;zkdmdYxk?{Z7+yv~|f(YdJC#ZoIS>b?)_N2g`87c7dhS!z6PlG5c~Tb`0@Vz6#k%@#cx>uWre~Y*1rNcXNLRTKnpkF^S#FY z4dC`$#|ESI95C0)1Mu}e9WZ;)cTsOW&CkHs=h{Z}b_u@Tr~UAE!{@tD^Y_E&+fe%j z_`1D*jK2s(_T=I5gE@PDZfbfKgre)Yi{+;8dbVG+3zd4!Z3>@O71wu*BN-|B zbn|AJfaN77RAoT_UVm#fvMbT4wV2UI7*HnrEu zQdrG0anO0foj7`QB6`(L7n6lXL+sDZjAhDr=;#-nD5v7o7MGnx*Y19xq2Yyt6Si(i z4L)>KJ^j`byId>#VJ^P+y0YH+v_sx}v&rT>U#d>ICUyxa#CD60@4(cGVGjK&#evv- zs_Hv=Sla6~KmBY0i(8f_CC_0W z_7w&q;Xb7dLmB2d&+~a7z_)<4Xx?@NG>_l?W$<(vxf<_?cor8{_fZ zyZ#}(@feTa*G=&F*3hE!O(DQ`*sl7n0fvYp(LBD9IgYe0057F+RL1fn(D<#A0&jO0 zk8U1HzLuq~cJ search starts here: + /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/include + /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/include-fixed + /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/include + End of search list. + Compiler executable checksum: 81174f71db4416537376b4420f5c69fd + COLLECT_GCC_OPTIONS='-mdynconfig=xtensa_esp32.so' '-mlongcalls' '-Wno-frame-address' '-fno-builtin-memcpy' '-fno-builtin-memset' '-fno-builtin-bzero' '-fno-builtin-stpcpy' '-fno-builtin-strncpy' '-v' '-o' 'CMakeFiles/cmTC_2fff8.dir/CMakeCCompilerABI.c.obj' '-c' '-dumpdir' 'CMakeFiles/cmTC_2fff8.dir/' + /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/bin/as --traditional-format --longcalls --dynconfig=xtensa_esp32.so -o CMakeFiles/cmTC_2fff8.dir/CMakeCCompilerABI.c.obj /tmp/ccfRC7cC.s + COMPILER_PATH=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/bin/ + LIBRARY_PATH=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/esp32/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib/esp32/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/usr/lib/ + COLLECT_GCC_OPTIONS='-mdynconfig=xtensa_esp32.so' '-mlongcalls' '-Wno-frame-address' '-fno-builtin-memcpy' '-fno-builtin-memset' '-fno-builtin-bzero' '-fno-builtin-stpcpy' '-fno-builtin-strncpy' '-v' '-o' 'CMakeFiles/cmTC_2fff8.dir/CMakeCCompilerABI.c.obj' '-c' '-dumpdir' 'CMakeFiles/cmTC_2fff8.dir/CMakeCCompilerABI.c.' + [2/2] : && /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-gcc -mlongcalls -Wno-frame-address -fno-builtin-memcpy -fno-builtin-memset -fno-builtin-bzero -fno-builtin-stpcpy -fno-builtin-strncpy -v CMakeFiles/cmTC_2fff8.dir/CMakeCCompilerABI.c.obj -o cmTC_2fff8 && : + Using built-in specs. + COLLECT_GCC=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp-elf-gcc + COLLECT_LTO_WRAPPER=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/lto-wrapper + Target: xtensa-esp-elf + Configured with: /builds/idf/crosstool-NG/.build/xtensa-esp-elf/src/gcc/configure --build=x86_64-build_pc-linux-gnu --host=x86_64-build_pc-linux-gnu --target=xtensa-esp-elf --prefix=/builds/idf/crosstool-NG/builds/xtensa-esp-elf --exec_prefix=/builds/idf/crosstool-NG/builds/xtensa-esp-elf --with-local-prefix=/builds/idf/crosstool-NG/builds/xtensa-esp-elf/xtensa-esp-elf --with-sysroot=/builds/idf/crosstool-NG/builds/xtensa-esp-elf/xtensa-esp-elf --with-native-system-header-dir=/include --with-newlib --enable-threads=no --disable-shared --with-pkgversion='crosstool-NG esp-14.2.0_20241119' --disable-__cxa_atexit --enable-cxx-flags=-ffunction-sections --disable-libgomp --disable-libmudflap --disable-libmpx --disable-libssp --disable-libquadmath --disable-libquadmath-support --disable-libstdcxx-verbose --with-gmp=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --with-mpfr=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --with-mpc=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --with-isl=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --enable-lto --enable-target-optspace --without-long-double-128 --disable-nls --enable-multiarch --enable-languages=c,c++ --disable-libstdcxx-verbose --enable-threads=posix --enable-gcov-custom-rtio --enable-libstdcxx-time=yes + Thread model: posix + Supported LTO compression algorithms: zlib zstd + gcc version 14.2.0 (crosstool-NG esp-14.2.0_20241119) + COMPILER_PATH=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/bin/ + LIBRARY_PATH=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/esp32/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib/esp32/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/usr/lib/ + COLLECT_GCC_OPTIONS='-mdynconfig=xtensa_esp32.so' '-mlongcalls' '-Wno-frame-address' '-fno-builtin-memcpy' '-fno-builtin-memset' '-fno-builtin-bzero' '-fno-builtin-stpcpy' '-fno-builtin-strncpy' '-v' '-o' 'cmTC_2fff8' '-dumpdir' 'cmTC_2fff8.' + /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/collect2 -plugin /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/liblto_plugin.so -plugin-opt=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/lto-wrapper -plugin-opt=-fresolution=/tmp/cckbGMLH.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lnosys -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc --sysroot=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf --dynconfig=xtensa_esp32.so -o cmTC_2fff8 /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/esp32/crt0.o /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crti.o /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtbegin.o -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32 -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/esp32 -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib/esp32 -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0 -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/usr/lib CMakeFiles/cmTC_2fff8.dir/CMakeCCompilerABI.c.obj -lgcc -lc -lnosys -lc -lgcc /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtend.o /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtn.o + COLLECT_GCC_OPTIONS='-mdynconfig=xtensa_esp32.so' '-mlongcalls' '-Wno-frame-address' '-fno-builtin-memcpy' '-fno-builtin-memset' '-fno-builtin-bzero' '-fno-builtin-stpcpy' '-fno-builtin-strncpy' '-v' '-o' 'cmTC_2fff8' '-dumpdir' 'cmTC_2fff8.' + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" + - "/usr/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "/home/abobkov/esp/v5.4.1/esp-idf/tools/cmake/project.cmake:571 (__project)" + - "CMakeLists.txt:6 (project)" + message: | + Parsed C implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/include] + add: [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/include-fixed] + add: [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/include] + end of search list found + collapse include dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/include] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/include] + collapse include dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/include-fixed] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/include-fixed] + collapse include dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/include] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/include] + implicit include dirs: [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/include;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/include-fixed;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/include] + + + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" + - "/usr/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "/home/abobkov/esp/v5.4.1/esp-idf/tools/cmake/project.cmake:571 (__project)" + - "CMakeLists.txt:6 (project)" + message: | + Parsed C implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] + ignore line: [Change Dir: '/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/CMakeScratch/TryCompile-7xx6Gq'] + ignore line: [] + ignore line: [Run Build Command(s): /usr/bin/ninja -v cmTC_2fff8] + ignore line: [[1/2] /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-gcc -mlongcalls -Wno-frame-address -fno-builtin-memcpy -fno-builtin-memset -fno-builtin-bzero -fno-builtin-stpcpy -fno-builtin-strncpy -v -o CMakeFiles/cmTC_2fff8.dir/CMakeCCompilerABI.c.obj -c /usr/share/cmake-3.31/Modules/CMakeCCompilerABI.c] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp-elf-gcc] + ignore line: [Target: xtensa-esp-elf] + ignore line: [Configured with: /builds/idf/crosstool-NG/.build/xtensa-esp-elf/src/gcc/configure --build=x86_64-build_pc-linux-gnu --host=x86_64-build_pc-linux-gnu --target=xtensa-esp-elf --prefix=/builds/idf/crosstool-NG/builds/xtensa-esp-elf --exec_prefix=/builds/idf/crosstool-NG/builds/xtensa-esp-elf --with-local-prefix=/builds/idf/crosstool-NG/builds/xtensa-esp-elf/xtensa-esp-elf --with-sysroot=/builds/idf/crosstool-NG/builds/xtensa-esp-elf/xtensa-esp-elf --with-native-system-header-dir=/include --with-newlib --enable-threads=no --disable-shared --with-pkgversion='crosstool-NG esp-14.2.0_20241119' --disable-__cxa_atexit --enable-cxx-flags=-ffunction-sections --disable-libgomp --disable-libmudflap --disable-libmpx --disable-libssp --disable-libquadmath --disable-libquadmath-support --disable-libstdcxx-verbose --with-gmp=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --with-mpfr=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --with-mpc=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --with-isl=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --enable-lto --enable-target-optspace --without-long-double-128 --disable-nls --enable-multiarch --enable-languages=c c++ --disable-libstdcxx-verbose --enable-threads=posix --enable-gcov-custom-rtio --enable-libstdcxx-time=yes] + ignore line: [Thread model: posix] + ignore line: [Supported LTO compression algorithms: zlib zstd] + ignore line: [gcc version 14.2.0 (crosstool-NG esp-14.2.0_20241119) ] + ignore line: [COLLECT_GCC_OPTIONS='-mdynconfig=xtensa_esp32.so' '-mlongcalls' '-Wno-frame-address' '-fno-builtin-memcpy' '-fno-builtin-memset' '-fno-builtin-bzero' '-fno-builtin-stpcpy' '-fno-builtin-strncpy' '-v' '-o' 'CMakeFiles/cmTC_2fff8.dir/CMakeCCompilerABI.c.obj' '-c' '-dumpdir' 'CMakeFiles/cmTC_2fff8.dir/'] + ignore line: [ /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/cc1 -quiet -v -imultilib esp32 -iprefix /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/ -isysroot /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf /usr/share/cmake-3.31/Modules/CMakeCCompilerABI.c -quiet -dumpdir CMakeFiles/cmTC_2fff8.dir/ -dumpbase CMakeCCompilerABI.c.c -dumpbase-ext .c -mdynconfig=xtensa_esp32.so -mlongcalls -Wno-frame-address -version -fno-builtin-memcpy -fno-builtin-memset -fno-builtin-bzero -fno-builtin-stpcpy -fno-builtin-strncpy -o /tmp/ccfRC7cC.s] + ignore line: [GNU C17 (crosstool-NG esp-14.2.0_20241119) version 14.2.0 (xtensa-esp-elf)] + ignore line: [ compiled by GNU C version 4.9.2 GMP version 6.2.1 MPFR version 4.2.1 MPC version 1.2.1 isl version isl-0.26-GMP] + ignore line: [] + ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072] + ignore line: [ignoring duplicate directory "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/../../lib/gcc/xtensa-esp-elf/14.2.0/include"] + ignore line: [ignoring nonexistent directory "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/builds/idf/crosstool-NG/builds/xtensa-esp-elf/xtensa-esp-elf/include"] + ignore line: [ignoring duplicate directory "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/../../lib/gcc/xtensa-esp-elf/14.2.0/include-fixed"] + ignore line: [ignoring duplicate directory "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/../../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/include"] + ignore line: [ignoring duplicate directory "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/include] + ignore line: [ /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/include-fixed] + ignore line: [ /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/include] + ignore line: [End of search list.] + ignore line: [Compiler executable checksum: 81174f71db4416537376b4420f5c69fd] + ignore line: [COLLECT_GCC_OPTIONS='-mdynconfig=xtensa_esp32.so' '-mlongcalls' '-Wno-frame-address' '-fno-builtin-memcpy' '-fno-builtin-memset' '-fno-builtin-bzero' '-fno-builtin-stpcpy' '-fno-builtin-strncpy' '-v' '-o' 'CMakeFiles/cmTC_2fff8.dir/CMakeCCompilerABI.c.obj' '-c' '-dumpdir' 'CMakeFiles/cmTC_2fff8.dir/'] + ignore line: [ /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/bin/as --traditional-format --longcalls --dynconfig=xtensa_esp32.so -o CMakeFiles/cmTC_2fff8.dir/CMakeCCompilerABI.c.obj /tmp/ccfRC7cC.s] + ignore line: [COMPILER_PATH=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/bin/] + ignore line: [LIBRARY_PATH=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/esp32/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib/esp32/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-mdynconfig=xtensa_esp32.so' '-mlongcalls' '-Wno-frame-address' '-fno-builtin-memcpy' '-fno-builtin-memset' '-fno-builtin-bzero' '-fno-builtin-stpcpy' '-fno-builtin-strncpy' '-v' '-o' 'CMakeFiles/cmTC_2fff8.dir/CMakeCCompilerABI.c.obj' '-c' '-dumpdir' 'CMakeFiles/cmTC_2fff8.dir/CMakeCCompilerABI.c.'] + ignore line: [[2/2] : && /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-gcc -mlongcalls -Wno-frame-address -fno-builtin-memcpy -fno-builtin-memset -fno-builtin-bzero -fno-builtin-stpcpy -fno-builtin-strncpy -v CMakeFiles/cmTC_2fff8.dir/CMakeCCompilerABI.c.obj -o cmTC_2fff8 && :] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp-elf-gcc] + ignore line: [COLLECT_LTO_WRAPPER=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/lto-wrapper] + ignore line: [Target: xtensa-esp-elf] + ignore line: [Configured with: /builds/idf/crosstool-NG/.build/xtensa-esp-elf/src/gcc/configure --build=x86_64-build_pc-linux-gnu --host=x86_64-build_pc-linux-gnu --target=xtensa-esp-elf --prefix=/builds/idf/crosstool-NG/builds/xtensa-esp-elf --exec_prefix=/builds/idf/crosstool-NG/builds/xtensa-esp-elf --with-local-prefix=/builds/idf/crosstool-NG/builds/xtensa-esp-elf/xtensa-esp-elf --with-sysroot=/builds/idf/crosstool-NG/builds/xtensa-esp-elf/xtensa-esp-elf --with-native-system-header-dir=/include --with-newlib --enable-threads=no --disable-shared --with-pkgversion='crosstool-NG esp-14.2.0_20241119' --disable-__cxa_atexit --enable-cxx-flags=-ffunction-sections --disable-libgomp --disable-libmudflap --disable-libmpx --disable-libssp --disable-libquadmath --disable-libquadmath-support --disable-libstdcxx-verbose --with-gmp=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --with-mpfr=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --with-mpc=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --with-isl=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --enable-lto --enable-target-optspace --without-long-double-128 --disable-nls --enable-multiarch --enable-languages=c c++ --disable-libstdcxx-verbose --enable-threads=posix --enable-gcov-custom-rtio --enable-libstdcxx-time=yes] + ignore line: [Thread model: posix] + ignore line: [Supported LTO compression algorithms: zlib zstd] + ignore line: [gcc version 14.2.0 (crosstool-NG esp-14.2.0_20241119) ] + ignore line: [COMPILER_PATH=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/bin/] + ignore line: [LIBRARY_PATH=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/esp32/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib/esp32/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-mdynconfig=xtensa_esp32.so' '-mlongcalls' '-Wno-frame-address' '-fno-builtin-memcpy' '-fno-builtin-memset' '-fno-builtin-bzero' '-fno-builtin-stpcpy' '-fno-builtin-strncpy' '-v' '-o' 'cmTC_2fff8' '-dumpdir' 'cmTC_2fff8.'] + link line: [ /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/collect2 -plugin /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/liblto_plugin.so -plugin-opt=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/lto-wrapper -plugin-opt=-fresolution=/tmp/cckbGMLH.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lnosys -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc --sysroot=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf --dynconfig=xtensa_esp32.so -o cmTC_2fff8 /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/esp32/crt0.o /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crti.o /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtbegin.o -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32 -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/esp32 -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib/esp32 -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0 -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/usr/lib CMakeFiles/cmTC_2fff8.dir/CMakeCCompilerABI.c.obj -lgcc -lc -lnosys -lc -lgcc /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtend.o /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtn.o] + arg [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/collect2] ==> ignore + arg [-plugin] ==> ignore + arg [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/liblto_plugin.so] ==> ignore + arg [-plugin-opt=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/lto-wrapper] ==> ignore + arg [-plugin-opt=-fresolution=/tmp/cckbGMLH.res] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lc] ==> ignore + arg [-plugin-opt=-pass-through=-lnosys] ==> ignore + arg [-plugin-opt=-pass-through=-lc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [--sysroot=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf] ==> ignore + arg [--dynconfig=xtensa_esp32.so] ==> ignore + arg [-o] ==> ignore + arg [cmTC_2fff8] ==> ignore + arg [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/esp32/crt0.o] ==> obj [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/esp32/crt0.o] + arg [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crti.o] ==> obj [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crti.o] + arg [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtbegin.o] ==> obj [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtbegin.o] + arg [-L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32] ==> dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32] + arg [-L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/esp32] ==> dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/esp32] + arg [-L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib/esp32] ==> dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib/esp32] + arg [-L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0] ==> dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0] + arg [-L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc] ==> dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc] + arg [-L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib] ==> dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib] + arg [-L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib] ==> dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib] + arg [-L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/usr/lib] ==> dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/usr/lib] + arg [CMakeFiles/cmTC_2fff8.dir/CMakeCCompilerABI.c.obj] ==> ignore + arg [-lgcc] ==> lib [gcc] + arg [-lc] ==> lib [c] + arg [-lnosys] ==> lib [nosys] + arg [-lc] ==> lib [c] + arg [-lgcc] ==> lib [gcc] + arg [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtend.o] ==> obj [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtend.o] + arg [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtn.o] ==> obj [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtn.o] + ignore line: [COLLECT_GCC_OPTIONS='-mdynconfig=xtensa_esp32.so' '-mlongcalls' '-Wno-frame-address' '-fno-builtin-memcpy' '-fno-builtin-memset' '-fno-builtin-bzero' '-fno-builtin-stpcpy' '-fno-builtin-strncpy' '-v' '-o' 'cmTC_2fff8' '-dumpdir' 'cmTC_2fff8.'] + ignore line: [] + ignore line: [] + collapse obj [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/esp32/crt0.o] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/lib/esp32/crt0.o] + collapse obj [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crti.o] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/esp32/crti.o] + collapse obj [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtbegin.o] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtbegin.o] + collapse obj [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtend.o] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtend.o] + collapse obj [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtn.o] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtn.o] + collapse library dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/esp32] + collapse library dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/esp32] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/lib/esp32] + collapse library dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib/esp32] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/lib/esp32] + collapse library dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0] + collapse library dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc] + collapse library dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/lib] + collapse library dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/lib] + collapse library dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/usr/lib] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/usr/lib] + implicit libs: [gcc;c;nosys;c;gcc] + implicit objs: [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/lib/esp32/crt0.o;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/esp32/crti.o;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtbegin.o;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtend.o;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtn.o] + implicit dirs: [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/esp32;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/lib/esp32;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/lib;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/usr/lib] + implicit fwks: [] + + + - + kind: "try_compile-v1" + backtrace: + - "/usr/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:74 (try_compile)" + - "/usr/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "/home/abobkov/esp/v5.4.1/esp-idf/tools/cmake/project.cmake:571 (__project)" + - "CMakeLists.txt:6 (project)" + checks: + - "Detecting CXX compiler ABI info" + directories: + source: "/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/CMakeScratch/TryCompile-Htug5T" + binary: "/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/CMakeScratch/TryCompile-Htug5T" + cmakeVariables: + CMAKE_CXX_FLAGS: "-mlongcalls -Wno-frame-address -fno-builtin-memcpy -fno-builtin-memset -fno-builtin-bzero -fno-builtin-stpcpy -fno-builtin-strncpy" + CMAKE_CXX_FLAGS_DEBUG: "-g" + CMAKE_CXX_SCAN_FOR_MODULES: "OFF" + CMAKE_EXE_LINKER_FLAGS: "" + CMAKE_MODULE_PATH: "/home/abobkov/esp/v5.4.1/esp-idf/tools/cmake;/home/abobkov/esp/v5.4.1/esp-idf/tools/cmake/third_party" + buildResult: + variable: "CMAKE_CXX_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/CMakeScratch/TryCompile-Htug5T' + + Run Build Command(s): /usr/bin/ninja -v cmTC_e3d88 + [1/2] /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-g++ -mlongcalls -Wno-frame-address -fno-builtin-memcpy -fno-builtin-memset -fno-builtin-bzero -fno-builtin-stpcpy -fno-builtin-strncpy -v -o CMakeFiles/cmTC_e3d88.dir/CMakeCXXCompilerABI.cpp.obj -c /usr/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp + Using built-in specs. + COLLECT_GCC=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp-elf-g++ + Target: xtensa-esp-elf + Configured with: /builds/idf/crosstool-NG/.build/xtensa-esp-elf/src/gcc/configure --build=x86_64-build_pc-linux-gnu --host=x86_64-build_pc-linux-gnu --target=xtensa-esp-elf --prefix=/builds/idf/crosstool-NG/builds/xtensa-esp-elf --exec_prefix=/builds/idf/crosstool-NG/builds/xtensa-esp-elf --with-local-prefix=/builds/idf/crosstool-NG/builds/xtensa-esp-elf/xtensa-esp-elf --with-sysroot=/builds/idf/crosstool-NG/builds/xtensa-esp-elf/xtensa-esp-elf --with-native-system-header-dir=/include --with-newlib --enable-threads=no --disable-shared --with-pkgversion='crosstool-NG esp-14.2.0_20241119' --disable-__cxa_atexit --enable-cxx-flags=-ffunction-sections --disable-libgomp --disable-libmudflap --disable-libmpx --disable-libssp --disable-libquadmath --disable-libquadmath-support --disable-libstdcxx-verbose --with-gmp=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --with-mpfr=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --with-mpc=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --with-isl=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --enable-lto --enable-target-optspace --without-long-double-128 --disable-nls --enable-multiarch --enable-languages=c,c++ --disable-libstdcxx-verbose --enable-threads=posix --enable-gcov-custom-rtio --enable-libstdcxx-time=yes + Thread model: posix + Supported LTO compression algorithms: zlib zstd + gcc version 14.2.0 (crosstool-NG esp-14.2.0_20241119) + COLLECT_GCC_OPTIONS='-mdynconfig=xtensa_esp32.so' '-mlongcalls' '-Wno-frame-address' '-fno-builtin-memcpy' '-fno-builtin-memset' '-fno-builtin-bzero' '-fno-builtin-stpcpy' '-fno-builtin-strncpy' '-v' '-o' 'CMakeFiles/cmTC_e3d88.dir/CMakeCXXCompilerABI.cpp.obj' '-c' '-dumpdir' 'CMakeFiles/cmTC_e3d88.dir/' + /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/cc1plus -quiet -v -imultilib esp32 -iprefix /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/ -isysroot /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf /usr/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpdir CMakeFiles/cmTC_e3d88.dir/ -dumpbase CMakeCXXCompilerABI.cpp.cpp -dumpbase-ext .cpp -mdynconfig=xtensa_esp32.so -mlongcalls -Wno-frame-address -version -fno-builtin-memcpy -fno-builtin-memset -fno-builtin-bzero -fno-builtin-stpcpy -fno-builtin-strncpy -o /tmp/ccwySqDI.s + GNU C++17 (crosstool-NG esp-14.2.0_20241119) version 14.2.0 (xtensa-esp-elf) + compiled by GNU C version 4.9.2, GMP version 6.2.1, MPFR version 4.2.1, MPC version 1.2.1, isl version isl-0.26-GMP + + GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 + ignoring duplicate directory "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/../../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/include/c++/14.2.0" + ignoring duplicate directory "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/../../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/include/c++/14.2.0/xtensa-esp-elf/esp32" + ignoring duplicate directory "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/../../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/include/c++/14.2.0/backward" + ignoring duplicate directory "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/../../lib/gcc/xtensa-esp-elf/14.2.0/include" + ignoring nonexistent directory "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/builds/idf/crosstool-NG/builds/xtensa-esp-elf/xtensa-esp-elf/include" + ignoring duplicate directory "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/../../lib/gcc/xtensa-esp-elf/14.2.0/include-fixed" + ignoring duplicate directory "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/../../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/include" + ignoring duplicate directory "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/include" + #include "..." search starts here: + #include <...> search starts here: + /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/include/c++/14.2.0 + /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/include/c++/14.2.0/xtensa-esp-elf/esp32 + /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/include/c++/14.2.0/backward + /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/include + /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/include-fixed + /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/include + End of search list. + Compiler executable checksum: 00a0abec3a35f1fd29e56d9fb54b091a + COLLECT_GCC_OPTIONS='-mdynconfig=xtensa_esp32.so' '-mlongcalls' '-Wno-frame-address' '-fno-builtin-memcpy' '-fno-builtin-memset' '-fno-builtin-bzero' '-fno-builtin-stpcpy' '-fno-builtin-strncpy' '-v' '-o' 'CMakeFiles/cmTC_e3d88.dir/CMakeCXXCompilerABI.cpp.obj' '-c' '-dumpdir' 'CMakeFiles/cmTC_e3d88.dir/' + /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/bin/as --traditional-format --longcalls --dynconfig=xtensa_esp32.so -o CMakeFiles/cmTC_e3d88.dir/CMakeCXXCompilerABI.cpp.obj /tmp/ccwySqDI.s + COMPILER_PATH=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/bin/ + LIBRARY_PATH=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/esp32/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib/esp32/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/usr/lib/ + COLLECT_GCC_OPTIONS='-mdynconfig=xtensa_esp32.so' '-mlongcalls' '-Wno-frame-address' '-fno-builtin-memcpy' '-fno-builtin-memset' '-fno-builtin-bzero' '-fno-builtin-stpcpy' '-fno-builtin-strncpy' '-v' '-o' 'CMakeFiles/cmTC_e3d88.dir/CMakeCXXCompilerABI.cpp.obj' '-c' '-dumpdir' 'CMakeFiles/cmTC_e3d88.dir/CMakeCXXCompilerABI.cpp.' + [2/2] : && /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-g++ -mlongcalls -Wno-frame-address -fno-builtin-memcpy -fno-builtin-memset -fno-builtin-bzero -fno-builtin-stpcpy -fno-builtin-strncpy -v CMakeFiles/cmTC_e3d88.dir/CMakeCXXCompilerABI.cpp.obj -o cmTC_e3d88 && : + Using built-in specs. + COLLECT_GCC=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp-elf-g++ + COLLECT_LTO_WRAPPER=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/lto-wrapper + Target: xtensa-esp-elf + Configured with: /builds/idf/crosstool-NG/.build/xtensa-esp-elf/src/gcc/configure --build=x86_64-build_pc-linux-gnu --host=x86_64-build_pc-linux-gnu --target=xtensa-esp-elf --prefix=/builds/idf/crosstool-NG/builds/xtensa-esp-elf --exec_prefix=/builds/idf/crosstool-NG/builds/xtensa-esp-elf --with-local-prefix=/builds/idf/crosstool-NG/builds/xtensa-esp-elf/xtensa-esp-elf --with-sysroot=/builds/idf/crosstool-NG/builds/xtensa-esp-elf/xtensa-esp-elf --with-native-system-header-dir=/include --with-newlib --enable-threads=no --disable-shared --with-pkgversion='crosstool-NG esp-14.2.0_20241119' --disable-__cxa_atexit --enable-cxx-flags=-ffunction-sections --disable-libgomp --disable-libmudflap --disable-libmpx --disable-libssp --disable-libquadmath --disable-libquadmath-support --disable-libstdcxx-verbose --with-gmp=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --with-mpfr=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --with-mpc=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --with-isl=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --enable-lto --enable-target-optspace --without-long-double-128 --disable-nls --enable-multiarch --enable-languages=c,c++ --disable-libstdcxx-verbose --enable-threads=posix --enable-gcov-custom-rtio --enable-libstdcxx-time=yes + Thread model: posix + Supported LTO compression algorithms: zlib zstd + gcc version 14.2.0 (crosstool-NG esp-14.2.0_20241119) + COMPILER_PATH=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/bin/ + LIBRARY_PATH=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/esp32/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib/esp32/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/usr/lib/ + COLLECT_GCC_OPTIONS='-mdynconfig=xtensa_esp32.so' '-mlongcalls' '-Wno-frame-address' '-fno-builtin-memcpy' '-fno-builtin-memset' '-fno-builtin-bzero' '-fno-builtin-stpcpy' '-fno-builtin-strncpy' '-v' '-o' 'cmTC_e3d88' '-dumpdir' 'cmTC_e3d88.' + /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/collect2 -plugin /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/liblto_plugin.so -plugin-opt=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/lto-wrapper -plugin-opt=-fresolution=/tmp/ccyBUDvB.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lnosys -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc --sysroot=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf --dynconfig=xtensa_esp32.so -o cmTC_e3d88 /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/esp32/crt0.o /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crti.o /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtbegin.o -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32 -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/esp32 -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib/esp32 -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0 -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/usr/lib CMakeFiles/cmTC_e3d88.dir/CMakeCXXCompilerABI.cpp.obj -lstdc++ -lm -lgcc -lc -lnosys -lc -lgcc /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtend.o /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtn.o + COLLECT_GCC_OPTIONS='-mdynconfig=xtensa_esp32.so' '-mlongcalls' '-Wno-frame-address' '-fno-builtin-memcpy' '-fno-builtin-memset' '-fno-builtin-bzero' '-fno-builtin-stpcpy' '-fno-builtin-strncpy' '-v' '-o' 'cmTC_e3d88' '-dumpdir' 'cmTC_e3d88.' + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" + - "/usr/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "/home/abobkov/esp/v5.4.1/esp-idf/tools/cmake/project.cmake:571 (__project)" + - "CMakeLists.txt:6 (project)" + message: | + Parsed CXX implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/include/c++/14.2.0] + add: [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/include/c++/14.2.0/xtensa-esp-elf/esp32] + add: [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/include/c++/14.2.0/backward] + add: [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/include] + add: [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/include-fixed] + add: [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/include] + end of search list found + collapse include dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/include/c++/14.2.0] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/include/c++/14.2.0] + collapse include dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/include/c++/14.2.0/xtensa-esp-elf/esp32] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/include/c++/14.2.0/xtensa-esp-elf/esp32] + collapse include dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/include/c++/14.2.0/backward] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/include/c++/14.2.0/backward] + collapse include dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/include] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/include] + collapse include dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/include-fixed] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/include-fixed] + collapse include dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/include] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/include] + implicit include dirs: [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/include/c++/14.2.0;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/include/c++/14.2.0/xtensa-esp-elf/esp32;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/include/c++/14.2.0/backward;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/include;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/include-fixed;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/include] + + + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" + - "/usr/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "/home/abobkov/esp/v5.4.1/esp-idf/tools/cmake/project.cmake:571 (__project)" + - "CMakeLists.txt:6 (project)" + message: | + Parsed CXX implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] + ignore line: [Change Dir: '/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/CMakeScratch/TryCompile-Htug5T'] + ignore line: [] + ignore line: [Run Build Command(s): /usr/bin/ninja -v cmTC_e3d88] + ignore line: [[1/2] /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-g++ -mlongcalls -Wno-frame-address -fno-builtin-memcpy -fno-builtin-memset -fno-builtin-bzero -fno-builtin-stpcpy -fno-builtin-strncpy -v -o CMakeFiles/cmTC_e3d88.dir/CMakeCXXCompilerABI.cpp.obj -c /usr/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp-elf-g++] + ignore line: [Target: xtensa-esp-elf] + ignore line: [Configured with: /builds/idf/crosstool-NG/.build/xtensa-esp-elf/src/gcc/configure --build=x86_64-build_pc-linux-gnu --host=x86_64-build_pc-linux-gnu --target=xtensa-esp-elf --prefix=/builds/idf/crosstool-NG/builds/xtensa-esp-elf --exec_prefix=/builds/idf/crosstool-NG/builds/xtensa-esp-elf --with-local-prefix=/builds/idf/crosstool-NG/builds/xtensa-esp-elf/xtensa-esp-elf --with-sysroot=/builds/idf/crosstool-NG/builds/xtensa-esp-elf/xtensa-esp-elf --with-native-system-header-dir=/include --with-newlib --enable-threads=no --disable-shared --with-pkgversion='crosstool-NG esp-14.2.0_20241119' --disable-__cxa_atexit --enable-cxx-flags=-ffunction-sections --disable-libgomp --disable-libmudflap --disable-libmpx --disable-libssp --disable-libquadmath --disable-libquadmath-support --disable-libstdcxx-verbose --with-gmp=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --with-mpfr=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --with-mpc=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --with-isl=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --enable-lto --enable-target-optspace --without-long-double-128 --disable-nls --enable-multiarch --enable-languages=c c++ --disable-libstdcxx-verbose --enable-threads=posix --enable-gcov-custom-rtio --enable-libstdcxx-time=yes] + ignore line: [Thread model: posix] + ignore line: [Supported LTO compression algorithms: zlib zstd] + ignore line: [gcc version 14.2.0 (crosstool-NG esp-14.2.0_20241119) ] + ignore line: [COLLECT_GCC_OPTIONS='-mdynconfig=xtensa_esp32.so' '-mlongcalls' '-Wno-frame-address' '-fno-builtin-memcpy' '-fno-builtin-memset' '-fno-builtin-bzero' '-fno-builtin-stpcpy' '-fno-builtin-strncpy' '-v' '-o' 'CMakeFiles/cmTC_e3d88.dir/CMakeCXXCompilerABI.cpp.obj' '-c' '-dumpdir' 'CMakeFiles/cmTC_e3d88.dir/'] + ignore line: [ /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/cc1plus -quiet -v -imultilib esp32 -iprefix /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/ -isysroot /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf /usr/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpdir CMakeFiles/cmTC_e3d88.dir/ -dumpbase CMakeCXXCompilerABI.cpp.cpp -dumpbase-ext .cpp -mdynconfig=xtensa_esp32.so -mlongcalls -Wno-frame-address -version -fno-builtin-memcpy -fno-builtin-memset -fno-builtin-bzero -fno-builtin-stpcpy -fno-builtin-strncpy -o /tmp/ccwySqDI.s] + ignore line: [GNU C++17 (crosstool-NG esp-14.2.0_20241119) version 14.2.0 (xtensa-esp-elf)] + ignore line: [ compiled by GNU C version 4.9.2 GMP version 6.2.1 MPFR version 4.2.1 MPC version 1.2.1 isl version isl-0.26-GMP] + ignore line: [] + ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072] + ignore line: [ignoring duplicate directory "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/../../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/include/c++/14.2.0"] + ignore line: [ignoring duplicate directory "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/../../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/include/c++/14.2.0/xtensa-esp-elf/esp32"] + ignore line: [ignoring duplicate directory "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/../../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/include/c++/14.2.0/backward"] + ignore line: [ignoring duplicate directory "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/../../lib/gcc/xtensa-esp-elf/14.2.0/include"] + ignore line: [ignoring nonexistent directory "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/builds/idf/crosstool-NG/builds/xtensa-esp-elf/xtensa-esp-elf/include"] + ignore line: [ignoring duplicate directory "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/../../lib/gcc/xtensa-esp-elf/14.2.0/include-fixed"] + ignore line: [ignoring duplicate directory "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/../../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/include"] + ignore line: [ignoring duplicate directory "/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/include/c++/14.2.0] + ignore line: [ /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/include/c++/14.2.0/xtensa-esp-elf/esp32] + ignore line: [ /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/include/c++/14.2.0/backward] + ignore line: [ /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/include] + ignore line: [ /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/include-fixed] + ignore line: [ /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/include] + ignore line: [End of search list.] + ignore line: [Compiler executable checksum: 00a0abec3a35f1fd29e56d9fb54b091a] + ignore line: [COLLECT_GCC_OPTIONS='-mdynconfig=xtensa_esp32.so' '-mlongcalls' '-Wno-frame-address' '-fno-builtin-memcpy' '-fno-builtin-memset' '-fno-builtin-bzero' '-fno-builtin-stpcpy' '-fno-builtin-strncpy' '-v' '-o' 'CMakeFiles/cmTC_e3d88.dir/CMakeCXXCompilerABI.cpp.obj' '-c' '-dumpdir' 'CMakeFiles/cmTC_e3d88.dir/'] + ignore line: [ /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/bin/as --traditional-format --longcalls --dynconfig=xtensa_esp32.so -o CMakeFiles/cmTC_e3d88.dir/CMakeCXXCompilerABI.cpp.obj /tmp/ccwySqDI.s] + ignore line: [COMPILER_PATH=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/bin/] + ignore line: [LIBRARY_PATH=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/esp32/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib/esp32/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-mdynconfig=xtensa_esp32.so' '-mlongcalls' '-Wno-frame-address' '-fno-builtin-memcpy' '-fno-builtin-memset' '-fno-builtin-bzero' '-fno-builtin-stpcpy' '-fno-builtin-strncpy' '-v' '-o' 'CMakeFiles/cmTC_e3d88.dir/CMakeCXXCompilerABI.cpp.obj' '-c' '-dumpdir' 'CMakeFiles/cmTC_e3d88.dir/CMakeCXXCompilerABI.cpp.'] + ignore line: [[2/2] : && /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-g++ -mlongcalls -Wno-frame-address -fno-builtin-memcpy -fno-builtin-memset -fno-builtin-bzero -fno-builtin-stpcpy -fno-builtin-strncpy -v CMakeFiles/cmTC_e3d88.dir/CMakeCXXCompilerABI.cpp.obj -o cmTC_e3d88 && :] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp-elf-g++] + ignore line: [COLLECT_LTO_WRAPPER=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/lto-wrapper] + ignore line: [Target: xtensa-esp-elf] + ignore line: [Configured with: /builds/idf/crosstool-NG/.build/xtensa-esp-elf/src/gcc/configure --build=x86_64-build_pc-linux-gnu --host=x86_64-build_pc-linux-gnu --target=xtensa-esp-elf --prefix=/builds/idf/crosstool-NG/builds/xtensa-esp-elf --exec_prefix=/builds/idf/crosstool-NG/builds/xtensa-esp-elf --with-local-prefix=/builds/idf/crosstool-NG/builds/xtensa-esp-elf/xtensa-esp-elf --with-sysroot=/builds/idf/crosstool-NG/builds/xtensa-esp-elf/xtensa-esp-elf --with-native-system-header-dir=/include --with-newlib --enable-threads=no --disable-shared --with-pkgversion='crosstool-NG esp-14.2.0_20241119' --disable-__cxa_atexit --enable-cxx-flags=-ffunction-sections --disable-libgomp --disable-libmudflap --disable-libmpx --disable-libssp --disable-libquadmath --disable-libquadmath-support --disable-libstdcxx-verbose --with-gmp=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --with-mpfr=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --with-mpc=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --with-isl=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --enable-lto --enable-target-optspace --without-long-double-128 --disable-nls --enable-multiarch --enable-languages=c c++ --disable-libstdcxx-verbose --enable-threads=posix --enable-gcov-custom-rtio --enable-libstdcxx-time=yes] + ignore line: [Thread model: posix] + ignore line: [Supported LTO compression algorithms: zlib zstd] + ignore line: [gcc version 14.2.0 (crosstool-NG esp-14.2.0_20241119) ] + ignore line: [COMPILER_PATH=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/bin/] + ignore line: [LIBRARY_PATH=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/esp32/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib/esp32/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib/:/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-mdynconfig=xtensa_esp32.so' '-mlongcalls' '-Wno-frame-address' '-fno-builtin-memcpy' '-fno-builtin-memset' '-fno-builtin-bzero' '-fno-builtin-stpcpy' '-fno-builtin-strncpy' '-v' '-o' 'cmTC_e3d88' '-dumpdir' 'cmTC_e3d88.'] + link line: [ /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/collect2 -plugin /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/liblto_plugin.so -plugin-opt=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/lto-wrapper -plugin-opt=-fresolution=/tmp/ccyBUDvB.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lnosys -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc --sysroot=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf --dynconfig=xtensa_esp32.so -o cmTC_e3d88 /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/esp32/crt0.o /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crti.o /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtbegin.o -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32 -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/esp32 -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib/esp32 -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0 -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib -L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/usr/lib CMakeFiles/cmTC_e3d88.dir/CMakeCXXCompilerABI.cpp.obj -lstdc++ -lm -lgcc -lc -lnosys -lc -lgcc /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtend.o /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtn.o] + arg [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/collect2] ==> ignore + arg [-plugin] ==> ignore + arg [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/liblto_plugin.so] ==> ignore + arg [-plugin-opt=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/14.2.0/lto-wrapper] ==> ignore + arg [-plugin-opt=-fresolution=/tmp/ccyBUDvB.res] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lc] ==> ignore + arg [-plugin-opt=-pass-through=-lnosys] ==> ignore + arg [-plugin-opt=-pass-through=-lc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [--sysroot=/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf] ==> ignore + arg [--dynconfig=xtensa_esp32.so] ==> ignore + arg [-o] ==> ignore + arg [cmTC_e3d88] ==> ignore + arg [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/esp32/crt0.o] ==> obj [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/esp32/crt0.o] + arg [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crti.o] ==> obj [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crti.o] + arg [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtbegin.o] ==> obj [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtbegin.o] + arg [-L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32] ==> dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32] + arg [-L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/esp32] ==> dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/esp32] + arg [-L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib/esp32] ==> dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib/esp32] + arg [-L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0] ==> dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0] + arg [-L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc] ==> dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc] + arg [-L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib] ==> dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib] + arg [-L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib] ==> dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib] + arg [-L/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/usr/lib] ==> dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/usr/lib] + arg [CMakeFiles/cmTC_e3d88.dir/CMakeCXXCompilerABI.cpp.obj] ==> ignore + arg [-lstdc++] ==> lib [stdc++] + arg [-lm] ==> lib [m] + arg [-lgcc] ==> lib [gcc] + arg [-lc] ==> lib [c] + arg [-lnosys] ==> lib [nosys] + arg [-lc] ==> lib [c] + arg [-lgcc] ==> lib [gcc] + arg [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtend.o] ==> obj [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtend.o] + arg [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtn.o] ==> obj [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtn.o] + ignore line: [COLLECT_GCC_OPTIONS='-mdynconfig=xtensa_esp32.so' '-mlongcalls' '-Wno-frame-address' '-fno-builtin-memcpy' '-fno-builtin-memset' '-fno-builtin-bzero' '-fno-builtin-stpcpy' '-fno-builtin-strncpy' '-v' '-o' 'cmTC_e3d88' '-dumpdir' 'cmTC_e3d88.'] + ignore line: [] + ignore line: [] + collapse obj [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/esp32/crt0.o] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/lib/esp32/crt0.o] + collapse obj [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crti.o] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/esp32/crti.o] + collapse obj [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtbegin.o] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtbegin.o] + collapse obj [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtend.o] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtend.o] + collapse obj [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtn.o] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtn.o] + collapse library dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/esp32] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/esp32] + collapse library dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib/esp32] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/lib/esp32] + collapse library dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib/esp32] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/lib/esp32] + collapse library dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0] + collapse library dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc] + collapse library dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/lib] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/lib] + collapse library dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/lib] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/lib] + collapse library dir [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../xtensa-esp-elf/usr/lib] ==> [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/usr/lib] + implicit libs: [stdc++;m;gcc;c;nosys;c;gcc] + implicit objs: [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/lib/esp32/crt0.o;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/esp32/crti.o;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtbegin.o;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtend.o;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/esp32/crtn.o] + implicit dirs: [/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0/esp32;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/lib/esp32;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc/xtensa-esp-elf/14.2.0;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/lib/gcc;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/lib;/home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/xtensa-esp-elf/usr/lib] + implicit fwks: [] + + + - + kind: "try_compile-v1" + backtrace: + - "/usr/share/cmake-3.31/Modules/Internal/CheckSourceCompiles.cmake:108 (try_compile)" + - "/usr/share/cmake-3.31/Modules/CheckCSourceCompiles.cmake:58 (cmake_check_source_compiles)" + - "/usr/share/cmake-3.31/Modules/FindThreads.cmake:97 (CHECK_C_SOURCE_COMPILES)" + - "/usr/share/cmake-3.31/Modules/FindThreads.cmake:163 (_threads_check_libc)" + - "/home/abobkov/esp/v5.4.1/esp-idf/components/mbedtls/mbedtls/CMakeLists.txt:136 (find_package)" + checks: + - "Performing Test CMAKE_HAVE_LIBC_PTHREAD" + directories: + source: "/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/CMakeScratch/TryCompile-i0Waj0" + binary: "/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/CMakeScratch/TryCompile-i0Waj0" + cmakeVariables: + CMAKE_C_FLAGS: "-mlongcalls -Wno-frame-address -fno-builtin-memcpy -fno-builtin-memset -fno-builtin-bzero -fno-builtin-stpcpy -fno-builtin-strncpy" + CMAKE_C_FLAGS_DEBUG: "-g" + CMAKE_EXE_LINKER_FLAGS: "" + CMAKE_MODULE_PATH: "/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities;/home/abobkov/esp/v5.4.1/esp-idf/tools/cmake;/home/abobkov/esp/v5.4.1/esp-idf/tools/cmake/third_party" + buildResult: + variable: "CMAKE_HAVE_LIBC_PTHREAD" + cached: true + stdout: | + Change Dir: '/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/CMakeScratch/TryCompile-i0Waj0' + + Run Build Command(s): /usr/bin/ninja -v cmTC_ebf17 + [1/2] /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-gcc -DCMAKE_HAVE_LIBC_PTHREAD -mlongcalls -Wno-frame-address -fno-builtin-memcpy -fno-builtin-memset -fno-builtin-bzero -fno-builtin-stpcpy -fno-builtin-strncpy -o CMakeFiles/cmTC_ebf17.dir/src.c.obj -c /home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/CMakeScratch/TryCompile-i0Waj0/src.c + [2/2] : && /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-gcc -mlongcalls -Wno-frame-address -fno-builtin-memcpy -fno-builtin-memset -fno-builtin-bzero -fno-builtin-stpcpy -fno-builtin-strncpy CMakeFiles/cmTC_ebf17.dir/src.c.obj -o cmTC_ebf17 && : + /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/bin/ld: CMakeFiles/cmTC_ebf17.dir/src.c.obj:(.literal+0x14): warning: pthread_atfork is not implemented and will always fail + /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/bin/ld: CMakeFiles/cmTC_ebf17.dir/src.c.obj:(.literal+0xc): warning: pthread_cancel is not implemented and will always fail + /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/bin/ld: CMakeFiles/cmTC_ebf17.dir/src.c.obj:(.literal+0x4): warning: pthread_create is not implemented and will always fail + /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/bin/ld: CMakeFiles/cmTC_ebf17.dir/src.c.obj:(.literal+0x8): warning: pthread_detach is not implemented and will always fail + /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/bin/ld: CMakeFiles/cmTC_ebf17.dir/src.c.obj:(.literal+0x18): warning: pthread_exit is not implemented and will always fail + /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/bin/ld: CMakeFiles/cmTC_ebf17.dir/src.c.obj:(.literal+0x10): warning: pthread_join is not implemented and will always fail + + exitCode: 0 + - + kind: "try_compile-v1" + backtrace: + - "/usr/share/cmake-3.31/Modules/Internal/CheckSourceCompiles.cmake:108 (try_compile)" + - "/usr/share/cmake-3.31/Modules/Internal/CheckCompilerFlag.cmake:18 (cmake_check_source_compiles)" + - "/usr/share/cmake-3.31/Modules/CheckCCompilerFlag.cmake:56 (cmake_check_compiler_flag)" + - "/home/abobkov/esp/v5.4.1/esp-idf/components/mbedtls/mbedtls/CMakeLists.txt:219 (CHECK_C_COMPILER_FLAG)" + checks: + - "Performing Test C_COMPILER_SUPPORTS_WFORMAT_SIGNEDNESS" + directories: + source: "/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/CMakeScratch/TryCompile-CCTCnS" + binary: "/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/CMakeScratch/TryCompile-CCTCnS" + cmakeVariables: + CMAKE_C_FLAGS: "-mlongcalls -Wno-frame-address -fno-builtin-memcpy -fno-builtin-memset -fno-builtin-bzero -fno-builtin-stpcpy -fno-builtin-strncpy -Wall -Wextra -Wwrite-strings -Wmissing-prototypes -Wformat=2 -Wno-format-nonliteral -Wvla -Wlogical-op -Wshadow" + CMAKE_C_FLAGS_DEBUG: "-g" + CMAKE_EXE_LINKER_FLAGS: "" + CMAKE_MODULE_PATH: "/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities;/home/abobkov/esp/v5.4.1/esp-idf/tools/cmake;/home/abobkov/esp/v5.4.1/esp-idf/tools/cmake/third_party" + buildResult: + variable: "C_COMPILER_SUPPORTS_WFORMAT_SIGNEDNESS" + cached: true + stdout: | + Change Dir: '/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/CMakeScratch/TryCompile-CCTCnS' + + Run Build Command(s): /usr/bin/ninja -v cmTC_5c95c + [1/2] /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-gcc -DC_COMPILER_SUPPORTS_WFORMAT_SIGNEDNESS -mlongcalls -Wno-frame-address -fno-builtin-memcpy -fno-builtin-memset -fno-builtin-bzero -fno-builtin-stpcpy -fno-builtin-strncpy -Wall -Wextra -Wwrite-strings -Wmissing-prototypes -Wformat=2 -Wno-format-nonliteral -Wvla -Wlogical-op -Wshadow -Wformat-signedness -o CMakeFiles/cmTC_5c95c.dir/src.c.obj -c /home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/CMakeScratch/TryCompile-CCTCnS/src.c + [2/2] : && /home/abobkov/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32-elf-gcc -mlongcalls -Wno-frame-address -fno-builtin-memcpy -fno-builtin-memset -fno-builtin-bzero -fno-builtin-stpcpy -fno-builtin-strncpy -Wall -Wextra -Wwrite-strings -Wmissing-prototypes -Wformat=2 -Wno-format-nonliteral -Wvla -Wlogical-op -Wshadow CMakeFiles/cmTC_5c95c.dir/src.c.obj -o cmTC_5c95c && : + + exitCode: 0 +... diff --git a/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/git-data/HEAD b/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/git-data/HEAD index b3440b61b..b870d8262 100644 --- a/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/git-data/HEAD +++ b/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/git-data/HEAD @@ -1 +1 @@ -4c2820d377d1375e787bcef612f0c32c1427d183 +ref: refs/heads/main diff --git a/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/git-data/grabRef.cmake b/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/git-data/grabRef.cmake index cd6762de7..37a56f7a3 100644 --- a/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/git-data/grabRef.cmake +++ b/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/git-data/grabRef.cmake @@ -18,7 +18,7 @@ set(HEAD_HASH) file(READ "/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/git-data/HEAD" HEAD_CONTENTS LIMIT 1024) string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS) -set(GIT_DIR "/home/abobkov/esp/v5.4.1/esp-idf/.git") +set(GIT_DIR "/home/abobkov/MyProjects/ESP-Nodes/.git") # handle git-worktree if(EXISTS "${GIT_DIR}/commondir") file(READ "${GIT_DIR}/commondir" GIT_DIR_NEW LIMIT 1024) diff --git a/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/git-data/head-ref b/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/git-data/head-ref index b3440b61b..219c687e3 100644 --- a/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/git-data/head-ref +++ b/ESP32-IDF_Temperture-Node-v2/build/CMakeFiles/git-data/head-ref @@ -1 +1 @@ -4c2820d377d1375e787bcef612f0c32c1427d183 +7c4ee89b567a1d850bedf2d436d460ae129d68a7 diff --git a/ESP32-IDF_Temperture-Node-v2/build/bootloader-prefix/src/bootloader-stamp/bootloader-patch-info.txt b/ESP32-IDF_Temperture-Node-v2/build/bootloader-prefix/src/bootloader-stamp/bootloader-patch-info.txt new file mode 100644 index 000000000..53e1e1e68 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/build/bootloader-prefix/src/bootloader-stamp/bootloader-patch-info.txt @@ -0,0 +1,6 @@ +# This is a generated file and its contents are an internal implementation detail. +# The update step will be re-executed if anything in this file changes. +# No other meaning or use of this file is supported. + +command= +work_dir= diff --git a/ESP32-IDF_Temperture-Node-v2/build/bootloader-prefix/src/bootloader-stamp/bootloader-source_dirinfo.txt b/ESP32-IDF_Temperture-Node-v2/build/bootloader-prefix/src/bootloader-stamp/bootloader-source_dirinfo.txt new file mode 100644 index 000000000..5d3d1389d --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/build/bootloader-prefix/src/bootloader-stamp/bootloader-source_dirinfo.txt @@ -0,0 +1,9 @@ +# This is a generated file and its contents are an internal implementation detail. +# The download step will be re-executed if anything in this file changes. +# No other meaning or use of this file is supported. + +method=source_dir +command= +source_dir=/home/abobkov/esp/v5.4.1/esp-idf/components/bootloader/subproject +work_dir= + diff --git a/ESP32-IDF_Temperture-Node-v2/build/bootloader-prefix/src/bootloader-stamp/bootloader-update-info.txt b/ESP32-IDF_Temperture-Node-v2/build/bootloader-prefix/src/bootloader-stamp/bootloader-update-info.txt new file mode 100644 index 000000000..31617d15d --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/build/bootloader-prefix/src/bootloader-stamp/bootloader-update-info.txt @@ -0,0 +1,7 @@ +# This is a generated file and its contents are an internal implementation detail. +# The patch step will be re-executed if anything in this file changes. +# No other meaning or use of this file is supported. + +command (connected)= +command (disconnected)= +work_dir= diff --git a/ESP32-IDF_Temperture-Node-v2/build/bootloader-prefix/tmp/bootloader-cfgcmd.txt b/ESP32-IDF_Temperture-Node-v2/build/bootloader-prefix/tmp/bootloader-cfgcmd.txt new file mode 100644 index 000000000..3ec754aab --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/build/bootloader-prefix/tmp/bootloader-cfgcmd.txt @@ -0,0 +1 @@ +cmd='/usr/bin/cmake;-DSDKCONFIG=/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/sdkconfig;-DIDF_PATH=/home/abobkov/esp/v5.4.1/esp-idf;-DIDF_TARGET=esp32;-DPYTHON_DEPS_CHECKED=1;-DPYTHON=/home/abobkov/.espressif/python_env/idf5.4_py3.13_env/bin/python;-DEXTRA_COMPONENT_DIRS=/home/abobkov/esp/v5.4.1/esp-idf/components/bootloader;-DPROJECT_SOURCE_DIR=/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2;-DIGNORE_EXTRA_COMPONENT=;-GNinja;-S;;-B;' diff --git a/ESP32-IDF_Temperture-Node-v2/build/bootloader-prefix/tmp/bootloader-mkdirs.cmake b/ESP32-IDF_Temperture-Node-v2/build/bootloader-prefix/tmp/bootloader-mkdirs.cmake new file mode 100644 index 000000000..9372eb1db --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/build/bootloader-prefix/tmp/bootloader-mkdirs.cmake @@ -0,0 +1,27 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +cmake_minimum_required(VERSION ${CMAKE_VERSION}) # this file comes with cmake + +# If CMAKE_DISABLE_SOURCE_CHANGES is set to true and the source directory is an +# existing directory in our source tree, calling file(MAKE_DIRECTORY) on it +# would cause a fatal error, even though it would be a no-op. +if(NOT EXISTS "/home/abobkov/esp/v5.4.1/esp-idf/components/bootloader/subproject") + file(MAKE_DIRECTORY "/home/abobkov/esp/v5.4.1/esp-idf/components/bootloader/subproject") +endif() +file(MAKE_DIRECTORY + "/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/build/bootloader" + "/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/build/bootloader-prefix" + "/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/build/bootloader-prefix/tmp" + "/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/build/bootloader-prefix/src/bootloader-stamp" + "/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/build/bootloader-prefix/src" + "/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/build/bootloader-prefix/src/bootloader-stamp" +) + +set(configSubDirs ) +foreach(subDir IN LISTS configSubDirs) + file(MAKE_DIRECTORY "/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/build/bootloader-prefix/src/bootloader-stamp/${subDir}") +endforeach() +if(cfgdir) + file(MAKE_DIRECTORY "/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/build/bootloader-prefix/src/bootloader-stamp${cfgdir}") # cfgdir has leading slash +endif() diff --git a/ESP32-IDF_Temperture-Node-v2/build/config.env b/ESP32-IDF_Temperture-Node-v2/build/config.env new file mode 100644 index 000000000..737549384 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/build/config.env @@ -0,0 +1,12 @@ +{ + "COMPONENT_KCONFIGS": "/home/abobkov/esp/v5.4.1/esp-idf/components/app_trace/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/bt/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/console/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/driver/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/efuse/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp-tls/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_adc/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_coex/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_common/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_ana_cmpr/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_cam/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_dac/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_gpio/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_gptimer/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_i2c/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_i2s/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_isp/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_jpeg/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_ledc/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_mcpwm/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_parlio/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_pcnt/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_rmt/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_sdm/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_spi/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_touch_sens/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_tsens/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_uart/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_usb_serial_jtag/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_eth/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_event/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_gdbstub/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_hid/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_http_client/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_http_server/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_https_ota/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_https_server/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_hw_support/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_lcd/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_mm/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_netif/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_partition/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_phy/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_pm/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_psram/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_ringbuf/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_security/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_system/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_timer/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_wifi/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/espcoredump/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/fatfs/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/freertos/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/hal/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/heap/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/ieee802154/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/log/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/lwip/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/mbedtls/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/newlib/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/nvs_flash/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/nvs_sec_provider/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/openthread/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/protocomm/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/pthread/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/soc/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/spi_flash/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/spiffs/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/tcp_transport/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/ulp/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/unity/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/usb/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/vfs/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/wear_levelling/Kconfig;/home/abobkov/esp/v5.4.1/esp-idf/components/wifi_provisioning/Kconfig;/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/Kconfig;/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/Kconfig;/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/Kconfig", + "COMPONENT_KCONFIGS_PROJBUILD": "/home/abobkov/esp/v5.4.1/esp-idf/components/bootloader/Kconfig.projbuild;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_app_format/Kconfig.projbuild;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_rom/Kconfig.projbuild;/home/abobkov/esp/v5.4.1/esp-idf/components/esptool_py/Kconfig.projbuild;/home/abobkov/esp/v5.4.1/esp-idf/components/partition_table/Kconfig.projbuild", + "COMPONENT_SDKCONFIG_RENAMES": "/home/abobkov/esp/v5.4.1/esp-idf/components/app_trace/sdkconfig.rename;/home/abobkov/esp/v5.4.1/esp-idf/components/bootloader/sdkconfig.rename;/home/abobkov/esp/v5.4.1/esp-idf/components/bt/sdkconfig.rename;/home/abobkov/esp/v5.4.1/esp-idf/components/driver/sdkconfig.rename;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_coex/sdkconfig.rename;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_event/sdkconfig.rename;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_gdbstub/sdkconfig.rename;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_https_ota/sdkconfig.rename;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_hw_support/sdkconfig.rename;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_hw_support/sdkconfig.rename.esp32;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_phy/sdkconfig.rename;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_pm/sdkconfig.rename;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_system/sdkconfig.rename;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_system/sdkconfig.rename.esp32;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_timer/sdkconfig.rename;/home/abobkov/esp/v5.4.1/esp-idf/components/esp_wifi/sdkconfig.rename;/home/abobkov/esp/v5.4.1/esp-idf/components/espcoredump/sdkconfig.rename;/home/abobkov/esp/v5.4.1/esp-idf/components/esptool_py/sdkconfig.rename;/home/abobkov/esp/v5.4.1/esp-idf/components/freertos/sdkconfig.rename;/home/abobkov/esp/v5.4.1/esp-idf/components/hal/sdkconfig.rename;/home/abobkov/esp/v5.4.1/esp-idf/components/lwip/sdkconfig.rename;/home/abobkov/esp/v5.4.1/esp-idf/components/newlib/sdkconfig.rename.esp32;/home/abobkov/esp/v5.4.1/esp-idf/components/pthread/sdkconfig.rename;/home/abobkov/esp/v5.4.1/esp-idf/components/spi_flash/sdkconfig.rename;/home/abobkov/esp/v5.4.1/esp-idf/components/ulp/sdkconfig.rename.esp32;/home/abobkov/esp/v5.4.1/esp-idf/components/vfs/sdkconfig.rename", + "IDF_TARGET": "esp32", + "IDF_TOOLCHAIN": "gcc", + "IDF_VERSION": "5.4.1", + "IDF_ENV_FPGA": "", + "IDF_PATH": "/home/abobkov/esp/v5.4.1/esp-idf", + "COMPONENT_KCONFIGS_SOURCE_FILE": "/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/build/kconfigs.in", + "COMPONENT_KCONFIGS_PROJBUILD_SOURCE_FILE": "/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/build/kconfigs_projbuild.in" +} diff --git a/ESP32-IDF_Temperture-Node-v2/build/config/kconfig_menus.json b/ESP32-IDF_Temperture-Node-v2/build/config/kconfig_menus.json new file mode 100644 index 000000000..30d7dca95 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/build/config/kconfig_menus.json @@ -0,0 +1,30319 @@ +[ + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_BROWNOUT_RESET_SUPPORTED", + "name": "SOC_BROWNOUT_RESET_SUPPORTED", + "range": null, + "title": null, + "type": "string" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_TWAI_BRP_DIV_SUPPORTED", + "name": "SOC_TWAI_BRP_DIV_SUPPORTED", + "range": null, + "title": null, + "type": "string" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_DPORT_WORKAROUND", + "name": "SOC_DPORT_WORKAROUND", + "range": null, + "title": null, + "type": "string" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_CAPS_ECO_VER_MAX", + "name": "SOC_CAPS_ECO_VER_MAX", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_ADC_SUPPORTED", + "name": "SOC_ADC_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_DAC_SUPPORTED", + "name": "SOC_DAC_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_UART_SUPPORTED", + "name": "SOC_UART_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_MCPWM_SUPPORTED", + "name": "SOC_MCPWM_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_GPTIMER_SUPPORTED", + "name": "SOC_GPTIMER_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SDMMC_HOST_SUPPORTED", + "name": "SOC_SDMMC_HOST_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_BT_SUPPORTED", + "name": "SOC_BT_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_PCNT_SUPPORTED", + "name": "SOC_PCNT_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_PHY_SUPPORTED", + "name": "SOC_PHY_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_WIFI_SUPPORTED", + "name": "SOC_WIFI_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SDIO_SLAVE_SUPPORTED", + "name": "SOC_SDIO_SLAVE_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_TWAI_SUPPORTED", + "name": "SOC_TWAI_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_EFUSE_SUPPORTED", + "name": "SOC_EFUSE_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_EMAC_SUPPORTED", + "name": "SOC_EMAC_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_ULP_SUPPORTED", + "name": "SOC_ULP_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_CCOMP_TIMER_SUPPORTED", + "name": "SOC_CCOMP_TIMER_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_RTC_FAST_MEM_SUPPORTED", + "name": "SOC_RTC_FAST_MEM_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_RTC_SLOW_MEM_SUPPORTED", + "name": "SOC_RTC_SLOW_MEM_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_RTC_MEM_SUPPORTED", + "name": "SOC_RTC_MEM_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_I2S_SUPPORTED", + "name": "SOC_I2S_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_RMT_SUPPORTED", + "name": "SOC_RMT_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SDM_SUPPORTED", + "name": "SOC_SDM_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_GPSPI_SUPPORTED", + "name": "SOC_GPSPI_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_LEDC_SUPPORTED", + "name": "SOC_LEDC_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_I2C_SUPPORTED", + "name": "SOC_I2C_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SUPPORT_COEXISTENCE", + "name": "SOC_SUPPORT_COEXISTENCE", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_AES_SUPPORTED", + "name": "SOC_AES_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_MPI_SUPPORTED", + "name": "SOC_MPI_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SHA_SUPPORTED", + "name": "SOC_SHA_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_FLASH_ENC_SUPPORTED", + "name": "SOC_FLASH_ENC_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SECURE_BOOT_SUPPORTED", + "name": "SOC_SECURE_BOOT_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_TOUCH_SENSOR_SUPPORTED", + "name": "SOC_TOUCH_SENSOR_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_BOD_SUPPORTED", + "name": "SOC_BOD_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_ULP_FSM_SUPPORTED", + "name": "SOC_ULP_FSM_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_CLK_TREE_SUPPORTED", + "name": "SOC_CLK_TREE_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_MPU_SUPPORTED", + "name": "SOC_MPU_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_WDT_SUPPORTED", + "name": "SOC_WDT_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SPI_FLASH_SUPPORTED", + "name": "SOC_SPI_FLASH_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_RNG_SUPPORTED", + "name": "SOC_RNG_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_LIGHT_SLEEP_SUPPORTED", + "name": "SOC_LIGHT_SLEEP_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_DEEP_SLEEP_SUPPORTED", + "name": "SOC_DEEP_SLEEP_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_LP_PERIPH_SHARE_INTERRUPT", + "name": "SOC_LP_PERIPH_SHARE_INTERRUPT", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_PM_SUPPORTED", + "name": "SOC_PM_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_DPORT_WORKAROUND_DIS_INTERRUPT_LVL", + "name": "SOC_DPORT_WORKAROUND_DIS_INTERRUPT_LVL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_XTAL_SUPPORT_26M", + "name": "SOC_XTAL_SUPPORT_26M", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_XTAL_SUPPORT_40M", + "name": "SOC_XTAL_SUPPORT_40M", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_XTAL_SUPPORT_AUTO_DETECT", + "name": "SOC_XTAL_SUPPORT_AUTO_DETECT", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_ADC_RTC_CTRL_SUPPORTED", + "name": "SOC_ADC_RTC_CTRL_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_ADC_DIG_CTRL_SUPPORTED", + "name": "SOC_ADC_DIG_CTRL_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_ADC_DMA_SUPPORTED", + "name": "SOC_ADC_DMA_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_ADC_PERIPH_NUM", + "name": "SOC_ADC_PERIPH_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_ADC_MAX_CHANNEL_NUM", + "name": "SOC_ADC_MAX_CHANNEL_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_ADC_ATTEN_NUM", + "name": "SOC_ADC_ATTEN_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_ADC_DIGI_CONTROLLER_NUM", + "name": "SOC_ADC_DIGI_CONTROLLER_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_ADC_PATT_LEN_MAX", + "name": "SOC_ADC_PATT_LEN_MAX", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_ADC_DIGI_MIN_BITWIDTH", + "name": "SOC_ADC_DIGI_MIN_BITWIDTH", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_ADC_DIGI_MAX_BITWIDTH", + "name": "SOC_ADC_DIGI_MAX_BITWIDTH", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_ADC_DIGI_RESULT_BYTES", + "name": "SOC_ADC_DIGI_RESULT_BYTES", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_ADC_DIGI_DATA_BYTES_PER_CONV", + "name": "SOC_ADC_DIGI_DATA_BYTES_PER_CONV", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_ADC_DIGI_MONITOR_NUM", + "name": "SOC_ADC_DIGI_MONITOR_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_ADC_SAMPLE_FREQ_THRES_HIGH", + "name": "SOC_ADC_SAMPLE_FREQ_THRES_HIGH", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_ADC_SAMPLE_FREQ_THRES_LOW", + "name": "SOC_ADC_SAMPLE_FREQ_THRES_LOW", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_ADC_RTC_MIN_BITWIDTH", + "name": "SOC_ADC_RTC_MIN_BITWIDTH", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_ADC_RTC_MAX_BITWIDTH", + "name": "SOC_ADC_RTC_MAX_BITWIDTH", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_ADC_SHARED_POWER", + "name": "SOC_ADC_SHARED_POWER", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SHARED_IDCACHE_SUPPORTED", + "name": "SOC_SHARED_IDCACHE_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_IDCACHE_PER_CORE", + "name": "SOC_IDCACHE_PER_CORE", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_CPU_CORES_NUM", + "name": "SOC_CPU_CORES_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_CPU_INTR_NUM", + "name": "SOC_CPU_INTR_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_CPU_HAS_FPU", + "name": "SOC_CPU_HAS_FPU", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_HP_CPU_HAS_MULTIPLE_CORES", + "name": "SOC_HP_CPU_HAS_MULTIPLE_CORES", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_CPU_BREAKPOINTS_NUM", + "name": "SOC_CPU_BREAKPOINTS_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_CPU_WATCHPOINTS_NUM", + "name": "SOC_CPU_WATCHPOINTS_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_CPU_WATCHPOINT_MAX_REGION_SIZE", + "name": "SOC_CPU_WATCHPOINT_MAX_REGION_SIZE", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_DAC_CHAN_NUM", + "name": "SOC_DAC_CHAN_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_DAC_RESOLUTION", + "name": "SOC_DAC_RESOLUTION", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_DAC_DMA_16BIT_ALIGN", + "name": "SOC_DAC_DMA_16BIT_ALIGN", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_GPIO_PORT", + "name": "SOC_GPIO_PORT", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_GPIO_PIN_COUNT", + "name": "SOC_GPIO_PIN_COUNT", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_GPIO_VALID_GPIO_MASK", + "name": "SOC_GPIO_VALID_GPIO_MASK", + "range": null, + "title": null, + "type": "hex" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_GPIO_IN_RANGE_MAX", + "name": "SOC_GPIO_IN_RANGE_MAX", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_GPIO_OUT_RANGE_MAX", + "name": "SOC_GPIO_OUT_RANGE_MAX", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK", + "name": "SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK", + "range": null, + "title": null, + "type": "hex" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_GPIO_CLOCKOUT_BY_IO_MUX", + "name": "SOC_GPIO_CLOCKOUT_BY_IO_MUX", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_GPIO_CLOCKOUT_CHANNEL_NUM", + "name": "SOC_GPIO_CLOCKOUT_CHANNEL_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_GPIO_SUPPORT_HOLD_IO_IN_DSLP", + "name": "SOC_GPIO_SUPPORT_HOLD_IO_IN_DSLP", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_I2C_NUM", + "name": "SOC_I2C_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_HP_I2C_NUM", + "name": "SOC_HP_I2C_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_I2C_FIFO_LEN", + "name": "SOC_I2C_FIFO_LEN", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_I2C_CMD_REG_NUM", + "name": "SOC_I2C_CMD_REG_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_I2C_SUPPORT_SLAVE", + "name": "SOC_I2C_SUPPORT_SLAVE", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_I2C_SUPPORT_APB", + "name": "SOC_I2C_SUPPORT_APB", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_I2C_SUPPORT_10BIT_ADDR", + "name": "SOC_I2C_SUPPORT_10BIT_ADDR", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_I2C_STOP_INDEPENDENT", + "name": "SOC_I2C_STOP_INDEPENDENT", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_I2S_NUM", + "name": "SOC_I2S_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_I2S_HW_VERSION_1", + "name": "SOC_I2S_HW_VERSION_1", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_I2S_SUPPORTS_APLL", + "name": "SOC_I2S_SUPPORTS_APLL", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_I2S_SUPPORTS_PLL_F160M", + "name": "SOC_I2S_SUPPORTS_PLL_F160M", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_I2S_SUPPORTS_PDM", + "name": "SOC_I2S_SUPPORTS_PDM", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_I2S_SUPPORTS_PDM_TX", + "name": "SOC_I2S_SUPPORTS_PDM_TX", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_I2S_PDM_MAX_TX_LINES", + "name": "SOC_I2S_PDM_MAX_TX_LINES", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_I2S_SUPPORTS_PDM_RX", + "name": "SOC_I2S_SUPPORTS_PDM_RX", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_I2S_PDM_MAX_RX_LINES", + "name": "SOC_I2S_PDM_MAX_RX_LINES", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_I2S_SUPPORTS_ADC_DAC", + "name": "SOC_I2S_SUPPORTS_ADC_DAC", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_I2S_SUPPORTS_ADC", + "name": "SOC_I2S_SUPPORTS_ADC", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_I2S_SUPPORTS_DAC", + "name": "SOC_I2S_SUPPORTS_DAC", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_I2S_SUPPORTS_LCD_CAMERA", + "name": "SOC_I2S_SUPPORTS_LCD_CAMERA", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_I2S_MAX_DATA_WIDTH", + "name": "SOC_I2S_MAX_DATA_WIDTH", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_I2S_TRANS_SIZE_ALIGN_WORD", + "name": "SOC_I2S_TRANS_SIZE_ALIGN_WORD", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_I2S_LCD_I80_VARIANT", + "name": "SOC_I2S_LCD_I80_VARIANT", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_LCD_I80_SUPPORTED", + "name": "SOC_LCD_I80_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_LCD_I80_BUSES", + "name": "SOC_LCD_I80_BUSES", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_LCD_I80_BUS_WIDTH", + "name": "SOC_LCD_I80_BUS_WIDTH", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_LEDC_HAS_TIMER_SPECIFIC_MUX", + "name": "SOC_LEDC_HAS_TIMER_SPECIFIC_MUX", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_LEDC_SUPPORT_APB_CLOCK", + "name": "SOC_LEDC_SUPPORT_APB_CLOCK", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_LEDC_SUPPORT_REF_TICK", + "name": "SOC_LEDC_SUPPORT_REF_TICK", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_LEDC_SUPPORT_HS_MODE", + "name": "SOC_LEDC_SUPPORT_HS_MODE", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_LEDC_TIMER_NUM", + "name": "SOC_LEDC_TIMER_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_LEDC_CHANNEL_NUM", + "name": "SOC_LEDC_CHANNEL_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_LEDC_TIMER_BIT_WIDTH", + "name": "SOC_LEDC_TIMER_BIT_WIDTH", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_MCPWM_GROUPS", + "name": "SOC_MCPWM_GROUPS", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_MCPWM_TIMERS_PER_GROUP", + "name": "SOC_MCPWM_TIMERS_PER_GROUP", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_MCPWM_OPERATORS_PER_GROUP", + "name": "SOC_MCPWM_OPERATORS_PER_GROUP", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_MCPWM_COMPARATORS_PER_OPERATOR", + "name": "SOC_MCPWM_COMPARATORS_PER_OPERATOR", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_MCPWM_GENERATORS_PER_OPERATOR", + "name": "SOC_MCPWM_GENERATORS_PER_OPERATOR", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_MCPWM_TRIGGERS_PER_OPERATOR", + "name": "SOC_MCPWM_TRIGGERS_PER_OPERATOR", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_MCPWM_GPIO_FAULTS_PER_GROUP", + "name": "SOC_MCPWM_GPIO_FAULTS_PER_GROUP", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP", + "name": "SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER", + "name": "SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP", + "name": "SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_MMU_PERIPH_NUM", + "name": "SOC_MMU_PERIPH_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_MMU_LINEAR_ADDRESS_REGION_NUM", + "name": "SOC_MMU_LINEAR_ADDRESS_REGION_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_MPU_CONFIGURABLE_REGIONS_SUPPORTED", + "name": "SOC_MPU_CONFIGURABLE_REGIONS_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_MPU_MIN_REGION_SIZE", + "name": "SOC_MPU_MIN_REGION_SIZE", + "range": null, + "title": null, + "type": "hex" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_MPU_REGIONS_MAX_NUM", + "name": "SOC_MPU_REGIONS_MAX_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_MPU_REGION_RO_SUPPORTED", + "name": "SOC_MPU_REGION_RO_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_MPU_REGION_WO_SUPPORTED", + "name": "SOC_MPU_REGION_WO_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_PCNT_GROUPS", + "name": "SOC_PCNT_GROUPS", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_PCNT_UNITS_PER_GROUP", + "name": "SOC_PCNT_UNITS_PER_GROUP", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_PCNT_CHANNELS_PER_UNIT", + "name": "SOC_PCNT_CHANNELS_PER_UNIT", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_PCNT_THRES_POINT_PER_UNIT", + "name": "SOC_PCNT_THRES_POINT_PER_UNIT", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_RMT_GROUPS", + "name": "SOC_RMT_GROUPS", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_RMT_TX_CANDIDATES_PER_GROUP", + "name": "SOC_RMT_TX_CANDIDATES_PER_GROUP", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_RMT_RX_CANDIDATES_PER_GROUP", + "name": "SOC_RMT_RX_CANDIDATES_PER_GROUP", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_RMT_CHANNELS_PER_GROUP", + "name": "SOC_RMT_CHANNELS_PER_GROUP", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_RMT_MEM_WORDS_PER_CHANNEL", + "name": "SOC_RMT_MEM_WORDS_PER_CHANNEL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_RMT_SUPPORT_REF_TICK", + "name": "SOC_RMT_SUPPORT_REF_TICK", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_RMT_SUPPORT_APB", + "name": "SOC_RMT_SUPPORT_APB", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_RMT_CHANNEL_CLK_INDEPENDENT", + "name": "SOC_RMT_CHANNEL_CLK_INDEPENDENT", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_RTCIO_PIN_COUNT", + "name": "SOC_RTCIO_PIN_COUNT", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_RTCIO_INPUT_OUTPUT_SUPPORTED", + "name": "SOC_RTCIO_INPUT_OUTPUT_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_RTCIO_HOLD_SUPPORTED", + "name": "SOC_RTCIO_HOLD_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_RTCIO_WAKE_SUPPORTED", + "name": "SOC_RTCIO_WAKE_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SDM_GROUPS", + "name": "SOC_SDM_GROUPS", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SDM_CHANNELS_PER_GROUP", + "name": "SOC_SDM_CHANNELS_PER_GROUP", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SDM_CLK_SUPPORT_APB", + "name": "SOC_SDM_CLK_SUPPORT_APB", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SPI_HD_BOTH_INOUT_SUPPORTED", + "name": "SOC_SPI_HD_BOTH_INOUT_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SPI_AS_CS_SUPPORTED", + "name": "SOC_SPI_AS_CS_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SPI_PERIPH_NUM", + "name": "SOC_SPI_PERIPH_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SPI_DMA_CHAN_NUM", + "name": "SOC_SPI_DMA_CHAN_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SPI_MAX_CS_NUM", + "name": "SOC_SPI_MAX_CS_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SPI_SUPPORT_CLK_APB", + "name": "SOC_SPI_SUPPORT_CLK_APB", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SPI_MAXIMUM_BUFFER_SIZE", + "name": "SOC_SPI_MAXIMUM_BUFFER_SIZE", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SPI_MAX_PRE_DIVIDER", + "name": "SOC_SPI_MAX_PRE_DIVIDER", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED", + "name": "SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED", + "name": "SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_MEMSPI_SRC_FREQ_26M_SUPPORTED", + "name": "SOC_MEMSPI_SRC_FREQ_26M_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED", + "name": "SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_TIMER_GROUPS", + "name": "SOC_TIMER_GROUPS", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_TIMER_GROUP_TIMERS_PER_GROUP", + "name": "SOC_TIMER_GROUP_TIMERS_PER_GROUP", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_TIMER_GROUP_COUNTER_BIT_WIDTH", + "name": "SOC_TIMER_GROUP_COUNTER_BIT_WIDTH", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_TIMER_GROUP_TOTAL_TIMERS", + "name": "SOC_TIMER_GROUP_TOTAL_TIMERS", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_TIMER_GROUP_SUPPORT_APB", + "name": "SOC_TIMER_GROUP_SUPPORT_APB", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_LP_TIMER_BIT_WIDTH_LO", + "name": "SOC_LP_TIMER_BIT_WIDTH_LO", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_LP_TIMER_BIT_WIDTH_HI", + "name": "SOC_LP_TIMER_BIT_WIDTH_HI", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_TOUCH_SENSOR_VERSION", + "name": "SOC_TOUCH_SENSOR_VERSION", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_TOUCH_SENSOR_NUM", + "name": "SOC_TOUCH_SENSOR_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_TOUCH_SAMPLE_CFG_NUM", + "name": "SOC_TOUCH_SAMPLE_CFG_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_TWAI_CONTROLLER_NUM", + "name": "SOC_TWAI_CONTROLLER_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_TWAI_BRP_MIN", + "name": "SOC_TWAI_BRP_MIN", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_TWAI_CLK_SUPPORT_APB", + "name": "SOC_TWAI_CLK_SUPPORT_APB", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_TWAI_SUPPORT_MULTI_ADDRESS_LAYOUT", + "name": "SOC_TWAI_SUPPORT_MULTI_ADDRESS_LAYOUT", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_UART_NUM", + "name": "SOC_UART_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_UART_HP_NUM", + "name": "SOC_UART_HP_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_UART_SUPPORT_APB_CLK", + "name": "SOC_UART_SUPPORT_APB_CLK", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_UART_SUPPORT_REF_TICK", + "name": "SOC_UART_SUPPORT_REF_TICK", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_UART_FIFO_LEN", + "name": "SOC_UART_FIFO_LEN", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_UART_BITRATE_MAX", + "name": "SOC_UART_BITRATE_MAX", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SPIRAM_SUPPORTED", + "name": "SOC_SPIRAM_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE", + "name": "SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SHA_SUPPORT_PARALLEL_ENG", + "name": "SOC_SHA_SUPPORT_PARALLEL_ENG", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SHA_ENDIANNESS_BE", + "name": "SOC_SHA_ENDIANNESS_BE", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SHA_SUPPORT_SHA1", + "name": "SOC_SHA_SUPPORT_SHA1", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SHA_SUPPORT_SHA256", + "name": "SOC_SHA_SUPPORT_SHA256", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SHA_SUPPORT_SHA384", + "name": "SOC_SHA_SUPPORT_SHA384", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SHA_SUPPORT_SHA512", + "name": "SOC_SHA_SUPPORT_SHA512", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_MPI_MEM_BLOCKS_NUM", + "name": "SOC_MPI_MEM_BLOCKS_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_MPI_OPERATIONS_NUM", + "name": "SOC_MPI_OPERATIONS_NUM", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_RSA_MAX_BIT_LEN", + "name": "SOC_RSA_MAX_BIT_LEN", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_AES_SUPPORT_AES_128", + "name": "SOC_AES_SUPPORT_AES_128", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_AES_SUPPORT_AES_192", + "name": "SOC_AES_SUPPORT_AES_192", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_AES_SUPPORT_AES_256", + "name": "SOC_AES_SUPPORT_AES_256", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SECURE_BOOT_V1", + "name": "SOC_SECURE_BOOT_V1", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS", + "name": "SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX", + "name": "SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_PHY_DIG_REGS_MEM_SIZE", + "name": "SOC_PHY_DIG_REGS_MEM_SIZE", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_PM_SUPPORT_EXT0_WAKEUP", + "name": "SOC_PM_SUPPORT_EXT0_WAKEUP", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_PM_SUPPORT_EXT1_WAKEUP", + "name": "SOC_PM_SUPPORT_EXT1_WAKEUP", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_PM_SUPPORT_EXT_WAKEUP", + "name": "SOC_PM_SUPPORT_EXT_WAKEUP", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_PM_SUPPORT_TOUCH_SENSOR_WAKEUP", + "name": "SOC_PM_SUPPORT_TOUCH_SENSOR_WAKEUP", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_PM_SUPPORT_RTC_PERIPH_PD", + "name": "SOC_PM_SUPPORT_RTC_PERIPH_PD", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_PM_SUPPORT_RTC_FAST_MEM_PD", + "name": "SOC_PM_SUPPORT_RTC_FAST_MEM_PD", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_PM_SUPPORT_RTC_SLOW_MEM_PD", + "name": "SOC_PM_SUPPORT_RTC_SLOW_MEM_PD", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_PM_SUPPORT_RC_FAST_PD", + "name": "SOC_PM_SUPPORT_RC_FAST_PD", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_PM_SUPPORT_VDDSDIO_PD", + "name": "SOC_PM_SUPPORT_VDDSDIO_PD", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_PM_SUPPORT_MODEM_PD", + "name": "SOC_PM_SUPPORT_MODEM_PD", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_CONFIGURABLE_VDDSDIO_SUPPORTED", + "name": "SOC_CONFIGURABLE_VDDSDIO_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_PM_MODEM_PD_BY_SW", + "name": "SOC_PM_MODEM_PD_BY_SW", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_CLK_APLL_SUPPORTED", + "name": "SOC_CLK_APLL_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_CLK_RC_FAST_D256_SUPPORTED", + "name": "SOC_CLK_RC_FAST_D256_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256", + "name": "SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_CLK_RC_FAST_SUPPORT_CALIBRATION", + "name": "SOC_CLK_RC_FAST_SUPPORT_CALIBRATION", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_CLK_XTAL32K_SUPPORTED", + "name": "SOC_CLK_XTAL32K_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SDMMC_USE_IOMUX", + "name": "SOC_SDMMC_USE_IOMUX", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_SDMMC_NUM_SLOTS", + "name": "SOC_SDMMC_NUM_SLOTS", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_WIFI_WAPI_SUPPORT", + "name": "SOC_WIFI_WAPI_SUPPORT", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_WIFI_CSI_SUPPORT", + "name": "SOC_WIFI_CSI_SUPPORT", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_WIFI_MESH_SUPPORT", + "name": "SOC_WIFI_MESH_SUPPORT", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_WIFI_SUPPORT_VARIABLE_BEACON_WINDOW", + "name": "SOC_WIFI_SUPPORT_VARIABLE_BEACON_WINDOW", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_WIFI_NAN_SUPPORT", + "name": "SOC_WIFI_NAN_SUPPORT", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_BLE_SUPPORTED", + "name": "SOC_BLE_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_BLE_MESH_SUPPORTED", + "name": "SOC_BLE_MESH_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_BT_CLASSIC_SUPPORTED", + "name": "SOC_BT_CLASSIC_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_BLE_DEVICE_PRIVACY_SUPPORTED", + "name": "SOC_BLE_DEVICE_PRIVACY_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_BLUFI_SUPPORTED", + "name": "SOC_BLUFI_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_BT_H2C_ENC_KEY_CTRL_ENH_VSC_SUPPORTED", + "name": "SOC_BT_H2C_ENC_KEY_CTRL_ENH_VSC_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_ULP_HAS_ADC", + "name": "SOC_ULP_HAS_ADC", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_PHY_COMBO_MODULE", + "name": "SOC_PHY_COMBO_MODULE", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SOC_EMAC_RMII_CLK_OUT_INTERNAL_LOOPBACK", + "name": "SOC_EMAC_RMII_CLK_OUT_INTERNAL_LOOPBACK", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "IDF_CMAKE", + "name": "IDF_CMAKE", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "- This option is for internal use only.\n- Enabling this option will help enable all FPGA support so as to\n run ESP-IDF on an FPGA. This can help reproduce some issues that\n only happens on FPGA condition, or when you have to burn some\n efuses multiple times.", + "id": "IDF_ENV_FPGA", + "name": "IDF_ENV_FPGA", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "- This option is ONLY used when doing new chip bringup.\n- This option will only enable necessary hw / sw settings for running\n a hello_world application.", + "id": "IDF_ENV_BRINGUP", + "name": "IDF_ENV_BRINGUP", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "IDF_CI_BUILD", + "name": "IDF_CI_BUILD", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "IDF_DOC_BUILD", + "name": "IDF_DOC_BUILD", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "IDF_TOOLCHAIN", + "name": "IDF_TOOLCHAIN", + "range": null, + "title": null, + "type": "string" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "IDF_TOOLCHAIN_CLANG", + "name": "IDF_TOOLCHAIN_CLANG", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "IDF_TOOLCHAIN_GCC", + "name": "IDF_TOOLCHAIN_GCC", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "IDF_TARGET_ARCH_RISCV", + "name": "IDF_TARGET_ARCH_RISCV", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "IDF_TARGET_ARCH_XTENSA", + "name": "IDF_TARGET_ARCH_XTENSA", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "IDF_TARGET_ARCH", + "name": "IDF_TARGET_ARCH", + "range": null, + "title": null, + "type": "string" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "IDF_TARGET", + "name": "IDF_TARGET", + "range": null, + "title": null, + "type": "string" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "IDF_INIT_VERSION", + "name": "IDF_INIT_VERSION", + "range": null, + "title": null, + "type": "string" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "IDF_TARGET_ESP32", + "name": "IDF_TARGET_ESP32", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "IDF_TARGET_ESP32S2", + "name": "IDF_TARGET_ESP32S2", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "IDF_TARGET_ESP32S3", + "name": "IDF_TARGET_ESP32S3", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "IDF_TARGET_ESP32C3", + "name": "IDF_TARGET_ESP32C3", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "IDF_TARGET_ESP32C2", + "name": "IDF_TARGET_ESP32C2", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "IDF_TARGET_ESP32C6", + "name": "IDF_TARGET_ESP32C6", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "IDF_TARGET_ESP32C5", + "name": "IDF_TARGET_ESP32C5", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "IDF_TARGET_ESP32P4", + "name": "IDF_TARGET_ESP32P4", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "IDF_TARGET_ESP32H2", + "name": "IDF_TARGET_ESP32H2", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "IDF_TARGET_ESP32C61", + "name": "IDF_TARGET_ESP32C61", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "IDF_TARGET_LINUX", + "name": "IDF_TARGET_LINUX", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "IDF_FIRMWARE_CHIP_ID", + "name": "IDF_FIRMWARE_CHIP_ID", + "range": null, + "title": null, + "type": "hex" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "!IDF_TARGET_LINUX && ", + "help": null, + "id": "APP_BUILD_TYPE_APP_2NDBOOT", + "name": "APP_BUILD_TYPE_APP_2NDBOOT", + "range": null, + "title": "Default (binary application + 2nd stage bootloader)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "APP_BUILD_TYPE_RAM", + "name": "APP_BUILD_TYPE_RAM", + "range": null, + "title": "Build app runs entirely in RAM (EXPERIMENTAL)", + "type": "bool" + } + ], + "depends_on": null, + "help": "Select the way the application is built.\n\nBy default, the application is built as a binary file in a format compatible with\nthe ESP-IDF bootloader. In addition to this application, 2nd stage bootloader is\nalso built. Application and bootloader binaries can be written into flash and\nloaded/executed from there.\n\nAnother option, useful for only very small and limited applications, is to only link\nthe .elf file of the application, such that it can be loaded directly into RAM over\nJTAG or UART. Note that since IRAM and DRAM sizes are very limited, it is not possible\nto build any complex application this way. However for some kinds of testing and debugging,\nthis option may provide faster iterations, since the application does not need to be\nwritten into flash.\n\nNote: when APP_BUILD_TYPE_RAM is selected and loaded with JTAG, ESP-IDF does not contain\nall the startup code required to initialize the CPUs and ROM memory (data/bss).\nTherefore it is necessary to execute a bit of ROM code prior to executing the application.\nA gdbinit file may look as follows (for ESP32):\n\n # Connect to a running instance of OpenOCD\n target remote :3333\n # Reset and halt the target\n mon reset halt\n # Run to a specific point in ROM code,\n # where most of initialization is complete.\n thb *0x40007d54\n c\n # Load the application into RAM\n load\n # Run till app_main\n tb app_main\n c\n\nExecute this gdbinit file as follows:\n\n xtensa-esp32-elf-gdb build/app-name.elf -x gdbinit\n\nExample gdbinit files for other targets can be found in tools/test_apps/system/gdb_loadable_elf/\n\nWhen loading the BIN with UART, the ROM will jump to ram and run the app after finishing the ROM\nstartup code, so there's no additional startup initialization required. You can use the\n`load_ram` in esptool.py to load the generated .bin file into ram and execute.\n\nExample:\n esptool.py --chip {chip} -p {port} -b {baud} --no-stub load_ram {app.bin}\n\nRecommended sdkconfig.defaults for building loadable ELF files is as follows.\nCONFIG_APP_BUILD_TYPE_RAM is required, other options help reduce application\nmemory footprint.\n\n CONFIG_APP_BUILD_TYPE_RAM=y\n CONFIG_VFS_SUPPORT_TERMIOS=\n CONFIG_NEWLIB_NANO_FORMAT=y\n CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT=y\n CONFIG_ESP_DEBUG_STUBS_ENABLE=\n CONFIG_ESP_ERR_TO_NAME_LOOKUP=", + "id": "build-type-application-build-type", + "name": "APP_BUILD_TYPE", + "title": "Application build type", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "APP_BUILD_GENERATE_BINARIES", + "name": "APP_BUILD_GENERATE_BINARIES", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "APP_BUILD_BOOTLOADER", + "name": "APP_BUILD_BOOTLOADER", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "APP_BUILD_TYPE_RAM", + "help": "If this option is enabled, external memory and related peripherals, such as Cache, MMU,\nFlash and PSRAM, won't be initialized. Corresponding drivers won't be introduced either.\nComponents that depend on the spi_flash component will also be unavailable, such as\napp_update, etc. When this option is enabled, about 26KB of RAM space can be saved.", + "id": "APP_BUILD_TYPE_PURE_RAM_APP", + "name": "APP_BUILD_TYPE_PURE_RAM_APP", + "range": null, + "title": "Build app without SPI_FLASH/PSRAM support (saves ram)", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "APP_BUILD_USE_FLASH_SECTIONS", + "name": "APP_BUILD_USE_FLASH_SECTIONS", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "If enabled, all date, time, and path information would be eliminated. A .gdbinit file would be create\nautomatically. (or will be append if you have one already)", + "id": "APP_REPRODUCIBLE_BUILD", + "name": "APP_REPRODUCIBLE_BUILD", + "range": null, + "title": "Enable reproducible build", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "If enabled, this disables the linking of binary libraries in the application build. Note\nthat after enabling this Wi-Fi/Bluetooth will not work.", + "id": "APP_NO_BLOBS", + "name": "APP_NO_BLOBS", + "range": null, + "title": "No Binary Blobs", + "type": "bool" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ESP32", + "help": "Bootloaders before ESP-IDF v2.1 did less initialisation of the\nsystem clock. This setting needs to be enabled to build an app\nwhich can be booted by these older bootloaders.\n\nIf this setting is enabled, the app can be booted by any bootloader\nfrom IDF v1.0 up to the current version.\n\nIf this setting is disabled, the app can only be booted by bootloaders\nfrom IDF v2.1 or newer.\n\nEnabling this setting adds approximately 1KB to the app's IRAM usage.", + "id": "APP_COMPATIBLE_PRE_V2_1_BOOTLOADERS", + "name": "APP_COMPATIBLE_PRE_V2_1_BOOTLOADERS", + "range": null, + "title": "App compatible with bootloaders before ESP-IDF v2.1", + "type": "bool" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ESP32", + "help": "Partition tables before ESP-IDF V3.1 do not contain an MD5 checksum\nfield, and the bootloader before ESP-IDF v3.1 cannot read a partition\ntable that contains an MD5 checksum field.\n\nEnable this option only if your app needs to boot on a bootloader and/or\npartition table that was generated from a version *before* ESP-IDF v3.1.\n\nIf this option and Flash Encryption are enabled at the same time, and any\ndata partitions in the partition table are marked Encrypted, then the\npartition encrypted flag should be manually verified in the app before accessing\nthe partition (see CVE-2021-27926).", + "id": "APP_COMPATIBLE_PRE_V3_1_BOOTLOADERS", + "name": "APP_COMPATIBLE_PRE_V3_1_BOOTLOADERS", + "range": null, + "title": "App compatible with bootloader and partition table before ESP-IDF v3.1", + "type": "bool" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ESP32", + "help": null, + "id": "APP_INIT_CLK", + "name": "APP_INIT_CLK", + "range": null, + "title": null, + "type": "bool" + } + ], + "depends_on": null, + "id": "build-type", + "title": "Build type", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "!APP_REPRODUCIBLE_BUILD", + "help": "If set, then the bootloader will be built with the current time/date stamp.\nIt is stored in the bootloader description\nstructure. If not set, time/date stamp will be excluded from bootloader image.\nThis can be useful for getting the\nsame binary image files made from the same source, but at different times.", + "id": "BOOTLOADER_COMPILE_TIME_DATE", + "name": "BOOTLOADER_COMPILE_TIME_DATE", + "range": null, + "title": "Use time/date stamp for bootloader", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Project version. It is placed in \"version\" field of the esp_bootloader_desc structure.\nThe type of this field is \"uint32_t\".", + "id": "BOOTLOADER_PROJECT_VER", + "name": "BOOTLOADER_PROJECT_VER", + "range": [ + 0, + 4294967295 + ], + "title": "Project version", + "type": "int" + } + ], + "depends_on": null, + "id": "bootloader-config-bootloader-manager", + "title": "Bootloader manager", + "type": "menu" + }, + { + "children": [], + "depends_on": null, + "help": "Offset address that 2nd bootloader will be flashed to.\nThe value is determined by the ROM bootloader.\nIt's not configurable in ESP-IDF.", + "id": "BOOTLOADER_OFFSET_IN_FLASH", + "name": "BOOTLOADER_OFFSET_IN_FLASH", + "range": null, + "title": null, + "type": "hex" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BOOTLOADER_COMPILER_OPTIMIZATION_SIZE", + "name": "BOOTLOADER_COMPILER_OPTIMIZATION_SIZE", + "range": null, + "title": "Size (-Os with GCC, -Oz with Clang)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG", + "name": "BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG", + "range": null, + "title": "Debug (-Og)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BOOTLOADER_COMPILER_OPTIMIZATION_PERF", + "name": "BOOTLOADER_COMPILER_OPTIMIZATION_PERF", + "range": null, + "title": "Optimize for performance (-O2)", + "type": "bool" + }, + { + "children": [], + "depends_on": "(IDF_TARGET_ARCH_XTENSA || IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32C2) && ", + "help": null, + "id": "BOOTLOADER_COMPILER_OPTIMIZATION_NONE", + "name": "BOOTLOADER_COMPILER_OPTIMIZATION_NONE", + "range": null, + "title": "Debug without optimization (-O0) (Deprecated, will be removed in IDF v6.0)", + "type": "bool" + } + ], + "depends_on": null, + "help": "This option sets compiler optimization level (gcc -O argument)\nfor the bootloader.\n\n- The default \"Size\" setting will add the -Os (-Oz with clang) flag to CFLAGS.\n- The \"Debug\" setting will add the -Og flag to CFLAGS.\n- The \"Performance\" setting will add the -O2 flag to CFLAGS.\n\nNote that custom optimization levels may be unsupported.", + "id": "bootloader-config-bootloader-optimization-level", + "name": "BOOTLOADER_COMPILER_OPTIMIZATION", + "title": "Bootloader optimization Level", + "type": "choice" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BOOTLOADER_LOG_LEVEL_NONE", + "name": "BOOTLOADER_LOG_LEVEL_NONE", + "range": null, + "title": "No output", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BOOTLOADER_LOG_LEVEL_ERROR", + "name": "BOOTLOADER_LOG_LEVEL_ERROR", + "range": null, + "title": "Error", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BOOTLOADER_LOG_LEVEL_WARN", + "name": "BOOTLOADER_LOG_LEVEL_WARN", + "range": null, + "title": "Warning", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BOOTLOADER_LOG_LEVEL_INFO", + "name": "BOOTLOADER_LOG_LEVEL_INFO", + "range": null, + "title": "Info", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BOOTLOADER_LOG_LEVEL_DEBUG", + "name": "BOOTLOADER_LOG_LEVEL_DEBUG", + "range": null, + "title": "Debug", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BOOTLOADER_LOG_LEVEL_VERBOSE", + "name": "BOOTLOADER_LOG_LEVEL_VERBOSE", + "range": null, + "title": "Verbose", + "type": "bool" + } + ], + "depends_on": null, + "help": "Specify how much output to see in bootloader logs.", + "id": "bootloader-config-log-bootloader-log-verbosity", + "name": "BOOTLOADER_LOG_LEVEL", + "title": "Bootloader log verbosity", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "BOOTLOADER_LOG_LEVEL", + "name": "BOOTLOADER_LOG_LEVEL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "Use ANSI terminal colors in log output\nEnable ANSI terminal color codes.\nIn order to view these, your terminal program must support ANSI color codes.", + "id": "BOOTLOADER_LOG_COLORS", + "name": "BOOTLOADER_LOG_COLORS", + "range": null, + "title": "Color", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "NO_SYMBOL && ", + "help": null, + "id": "BOOTLOADER_LOG_TIMESTAMP_SOURCE_NONE", + "name": "BOOTLOADER_LOG_TIMESTAMP_SOURCE_NONE", + "range": null, + "title": "None", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BOOTLOADER_LOG_TIMESTAMP_SOURCE_CPU_TICKS", + "name": "BOOTLOADER_LOG_TIMESTAMP_SOURCE_CPU_TICKS", + "range": null, + "title": "Milliseconds Since Boot", + "type": "bool" + } + ], + "depends_on": null, + "help": "Choose what sort of timestamp is displayed in the log output:\n\n- \"None\" - The log will only contain the actual log messages themselves\n without any time-related information. Avoiding timestamps can help conserve\n processing power and memory. It might useful when you\n perform log analysis or debugging, sometimes it's more straightforward\n to work with logs that lack timestamps, especially if the time of occurrence\n is not critical for understanding the issues.\n \"I log_test: info message\"\n\n- \"Milliseconds since boot\" is calculated from the RTOS tick count multiplied\n by the tick period. This time will reset after a software reboot.\n \"I (112500) log_test: info message\"", + "id": "bootloader-config-log-format-timestamp", + "name": "BOOTLOADER_LOG_TIMESTAMP_SOURCE", + "title": "Timestamp", + "type": "choice" + } + ], + "depends_on": null, + "id": "bootloader-config-log-format", + "title": "Format", + "type": "menu" + } + ], + "depends_on": null, + "id": "bootloader-config-log", + "title": "Log", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "IDF_TARGET_ESP32 && (ESPTOOLPY_FLASHMODE_QIO || ESPTOOLPY_FLASHMODE_QOUT)", + "help": "This setting is only used if the SPI flash pins have been overridden by setting the eFuses\nSPI_PAD_CONFIG_xxx, and the SPI flash mode is QIO or QOUT.\n\nWhen this is the case, the eFuse config only defines 3 of the 4 Quad I/O data pins. The WP pin (aka\nESP32 pin \"SD_DATA_3\" or SPI flash pin \"IO2\") is not specified in eFuse. The same pin is also used\nfor external SPIRAM if it is enabled.\n\nIf this config item is set to N (default), the correct WP pin will be automatically used for any\nEspressif chip or module with integrated flash. If a custom setting is needed, set this config item to\nY and specify the GPIO number connected to the WP.", + "id": "BOOTLOADER_SPI_CUSTOM_WP_PIN", + "name": "BOOTLOADER_SPI_CUSTOM_WP_PIN", + "range": null, + "title": "Use custom SPI Flash WP Pin when flash pins set in eFuse (read help)", + "type": "bool" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ESP32 && (ESPTOOLPY_FLASHMODE_QIO || ESPTOOLPY_FLASHMODE_QOUT)", + "help": "The option \"Use custom SPI Flash WP Pin\" must be set or this value is ignored\n\nIf burning a customized set of SPI flash pins in eFuse and using QIO or QOUT mode for flash, set this\nvalue to the GPIO number of the SPI flash WP pin.", + "id": "BOOTLOADER_SPI_WP_PIN", + "name": "BOOTLOADER_SPI_WP_PIN", + "range": null, + "title": "Custom SPI Flash WP Pin", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "This will force 2nd bootloader to be loaded by DOUT mode, and will restore Dummy Cycle setting by\nresetting the Flash", + "id": "BOOTLOADER_FLASH_DC_AWARE", + "name": "BOOTLOADER_FLASH_DC_AWARE", + "range": null, + "title": "Allow app adjust Dummy Cycle bits in SPI Flash for higher frequency (READ HELP FIRST)", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Perform the startup flow recommended by XMC. Please consult XMC for the details of this flow.\nXMC chips will be forbidden to be used, when this option is disabled.\n\nDON'T DISABLE THIS UNLESS YOU KNOW WHAT YOU ARE DOING.\n\ncomment \"Features below require specific hardware (READ DOCS FIRST!)\"", + "id": "BOOTLOADER_FLASH_XMC_SUPPORT", + "name": "BOOTLOADER_FLASH_XMC_SUPPORT", + "range": null, + "title": "Enable the support for flash chips of XMC (READ DOCS FIRST)", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "This is a helper config for 32bits address flash. Invisible for users.", + "id": "BOOTLOADER_FLASH_32BIT_ADDR", + "name": "BOOTLOADER_FLASH_32BIT_ADDR", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "This is a helper config for 32bits address flash. Invisible for users.", + "id": "BOOTLOADER_FLASH_NEEDS_32BIT_FEAT", + "name": "BOOTLOADER_FLASH_NEEDS_32BIT_FEAT", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "This is a helper config for 32bits address quad flash. Invisible for users.", + "id": "BOOTLOADER_FLASH_NEEDS_32BIT_ADDR_QUAD_FLASH", + "name": "BOOTLOADER_FLASH_NEEDS_32BIT_ADDR_QUAD_FLASH", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "BOOTLOADER_FLASH_NEEDS_32BIT_ADDR_QUAD_FLASH && IDF_EXPERIMENTAL_FEATURES", + "help": "Enabling this option allows the CPU to access 32-bit-address flash beyond 16M range.\n1. This option only valid for 4-line flash. Octal flash doesn't need this.\n2. This option is experimental, which means it can\u2019t use on all flash chips stable, for more\ninformation, please contact Espressif Business support.", + "id": "BOOTLOADER_CACHE_32BIT_ADDR_QUAD_FLASH", + "name": "BOOTLOADER_CACHE_32BIT_ADDR_QUAD_FLASH", + "range": null, + "title": "Enable cache access to 32-bit-address (over 16MB) range of SPI Flash (READ DOCS FIRST)", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "BOOTLOADER_CACHE_32BIT_ADDR_OCTAL_FLASH", + "name": "BOOTLOADER_CACHE_32BIT_ADDR_OCTAL_FLASH", + "range": null, + "title": null, + "type": "bool" + } + ], + "depends_on": null, + "id": "bootloader-config-serial-flash-configurations", + "title": "Serial Flash Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "!ESPTOOLPY_FLASHFREQ_80M && ", + "help": null, + "id": "BOOTLOADER_VDDSDIO_BOOST_1_8V", + "name": "BOOTLOADER_VDDSDIO_BOOST_1_8V", + "range": null, + "title": "1.8V", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BOOTLOADER_VDDSDIO_BOOST_1_9V", + "name": "BOOTLOADER_VDDSDIO_BOOST_1_9V", + "range": null, + "title": "1.9V", + "type": "bool" + } + ], + "depends_on": "SOC_CONFIGURABLE_VDDSDIO_SUPPORTED", + "help": "If this option is enabled, and VDDSDIO LDO is set to 1.8V (using eFuse\nor MTDI bootstrapping pin), bootloader will change LDO settings to\noutput 1.9V instead. This helps prevent flash chip from browning out\nduring flash programming operations.\n\nThis option has no effect if VDDSDIO is set to 3.3V, or if the internal\nVDDSDIO regulator is disabled via eFuse.", + "id": "bootloader-config-vddsdio-ldo-voltage", + "name": "BOOTLOADER_VDDSDIO_BOOST", + "title": "VDDSDIO LDO voltage", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "BOOTLOADER_FACTORY_RESET", + "help": "The selected GPIO will be configured as an input with internal pull-up enabled. To trigger a factory\nreset, this GPIO must be held high or low (as configured) on startup.\n\nNote that on some SoCs not all pins have an internal pull-up and certain pins are already\nused by ROM bootloader as bootstrapping. Refer to the technical reference manual for further\ndetails on the selected SoC.", + "id": "BOOTLOADER_NUM_PIN_FACTORY_RESET", + "name": "BOOTLOADER_NUM_PIN_FACTORY_RESET", + "range": null, + "title": "Number of the GPIO input for factory reset", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BOOTLOADER_FACTORY_RESET_PIN_LOW", + "name": "BOOTLOADER_FACTORY_RESET_PIN_LOW", + "range": null, + "title": "Reset on GPIO low", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BOOTLOADER_FACTORY_RESET_PIN_HIGH", + "name": "BOOTLOADER_FACTORY_RESET_PIN_HIGH", + "range": null, + "title": "Reset on GPIO high", + "type": "bool" + } + ], + "depends_on": "BOOTLOADER_FACTORY_RESET", + "help": "Pin level for factory reset, can be triggered on low or high.", + "id": "bootloader-config-gpio-triggers-factory-reset-factory-reset-gpio-level", + "name": "BOOTLOADER_FACTORY_RESET_PIN_LEVEL", + "title": "Factory reset GPIO level", + "type": "choice" + }, + { + "children": [], + "depends_on": "BOOTLOADER_FACTORY_RESET", + "help": "The device will boot from \"factory\" partition (or OTA slot 0 if no factory partition is present) after a\nfactory reset.", + "id": "BOOTLOADER_OTA_DATA_ERASE", + "name": "BOOTLOADER_OTA_DATA_ERASE", + "range": null, + "title": "Clear OTA data on factory reset (select factory partition)", + "type": "bool" + }, + { + "children": [], + "depends_on": "BOOTLOADER_FACTORY_RESET", + "help": "Allows customers to select which data partitions will be erased while factory reset.\n\nSpecify the names of partitions as a comma-delimited with optional spaces for readability. (Like this:\n\"nvs, phy_init, ...\")\nMake sure that the name specified in the partition table and here are the same.\nPartitions of type \"app\" cannot be specified here.", + "id": "BOOTLOADER_DATA_FACTORY_RESET", + "name": "BOOTLOADER_DATA_FACTORY_RESET", + "range": null, + "title": "Comma-separated names of partitions to clear on factory reset", + "type": "string" + } + ], + "depends_on": null, + "help": "Allows to reset the device to factory settings:\n- clear one or more data partitions;\n- boot from \"factory\" partition.\nThe factory reset will occur if there is a GPIO input held at the configured level while\ndevice starts up. See settings below.", + "id": "BOOTLOADER_FACTORY_RESET", + "name": "BOOTLOADER_FACTORY_RESET", + "range": null, + "title": "GPIO triggers factory reset", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BOOTLOADER_APP_TEST", + "help": "The selected GPIO will be configured as an input with internal pull-up enabled.\nTo trigger a test app, this GPIO must be pulled low on reset.\nAfter the GPIO input is deactivated and the device reboots, the old application will boot.\n(factory or OTA[x]).\n\nNote that on some SoCs not all pins have an internal pull-up and certain pins are already\nused by ROM bootloader as bootstrapping. Refer to the technical reference manual for further\ndetails on the selected SoC.", + "id": "BOOTLOADER_NUM_PIN_APP_TEST", + "name": "BOOTLOADER_NUM_PIN_APP_TEST", + "range": null, + "title": "Number of the GPIO input to boot TEST partition", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BOOTLOADER_APP_TEST_PIN_LOW", + "name": "BOOTLOADER_APP_TEST_PIN_LOW", + "range": null, + "title": "Enter test app on GPIO low", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BOOTLOADER_APP_TEST_PIN_HIGH", + "name": "BOOTLOADER_APP_TEST_PIN_HIGH", + "range": null, + "title": "Enter test app on GPIO high", + "type": "bool" + } + ], + "depends_on": "BOOTLOADER_APP_TEST", + "help": "Pin level for app test, can be triggered on low or high.", + "id": "bootloader-config-gpio-triggers-boot-from-test-app-partition-app-test-gpio-level", + "name": "BOOTLOADER_APP_TEST_PIN_LEVEL", + "title": "App test GPIO level", + "type": "choice" + } + ], + "depends_on": "!BOOTLOADER_APP_ANTI_ROLLBACK", + "help": "Allows to run the test app from \"TEST\" partition.\nA boot from \"test\" partition will occur if there is a GPIO input pulled low while device starts up.\nSee settings below.", + "id": "BOOTLOADER_APP_TEST", + "name": "BOOTLOADER_APP_TEST", + "range": null, + "title": "GPIO triggers boot from test app partition", + "type": "bool" + }, + { + "children": [], + "depends_on": "BOOTLOADER_FACTORY_RESET || BOOTLOADER_APP_TEST", + "help": "The GPIO must be held low continuously for this period of time after reset\nbefore a factory reset or test partition boot (as applicable) is performed.", + "id": "BOOTLOADER_HOLD_TIME_GPIO", + "name": "BOOTLOADER_HOLD_TIME_GPIO", + "range": null, + "title": "Hold time of GPIO for reset/test mode (seconds)", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Protects the unmapped memory regions of the entire address space from unintended accesses.\nThis will ensure that an exception will be triggered whenever the CPU performs a memory\noperation on unmapped regions of the address space.\nNOTE: Disabling this config on some targets (ESP32-C6, ESP32-H2, ESP32-C5) would not generate\nan exception when reading from or writing to 0x0.", + "id": "BOOTLOADER_REGION_PROTECTION_ENABLE", + "name": "BOOTLOADER_REGION_PROTECTION_ENABLE", + "range": null, + "title": "Enable protection for unmapped memory regions", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BOOTLOADER_WDT_ENABLE", + "help": "If this option is set, the ESP-IDF app must explicitly reset, feed, or disable the rtc_wdt in\nthe app's own code.\nIf this option is not set (default), then rtc_wdt will be disabled by ESP-IDF before calling\nthe app_main() function.\n\nUse function wdt_hal_feed() for resetting counter of RTC_WDT.\nFor esp32/s2 you can also use rtc_wdt_feed().\n\nUse function wdt_hal_disable() for disabling RTC_WDT.\nFor esp32/s2 you can also use rtc_wdt_disable().", + "id": "BOOTLOADER_WDT_DISABLE_IN_USER_CODE", + "name": "BOOTLOADER_WDT_DISABLE_IN_USER_CODE", + "range": null, + "title": "Allows RTC watchdog disable in user code", + "type": "bool" + }, + { + "children": [], + "depends_on": "BOOTLOADER_WDT_ENABLE", + "help": "Verify that this parameter is correct and more then the execution time.\nPay attention to options such as reset to factory, trigger test partition and encryption on boot\n- these options can increase the execution time.\nNote: RTC_WDT will reset while encryption operations will be performed.", + "id": "BOOTLOADER_WDT_TIME_MS", + "name": "BOOTLOADER_WDT_TIME_MS", + "range": [ + 0, + 120000 + ], + "title": "Timeout for RTC watchdog (ms)", + "type": "int" + } + ], + "depends_on": null, + "help": "Tracks the execution time of startup code.\nIf the execution time is exceeded, the RTC_WDT will restart system.\nIt is also useful to prevent a lock up in start code caused by an unstable power source.\nNOTE: Tracks the execution time starts from the bootloader code - re-set timeout, while selecting the\nsource for slow_clk - and ends calling app_main.\nRe-set timeout is needed due to WDT uses a SLOW_CLK clock source. After changing a frequency slow_clk a\ntime of WDT needs to re-set for new frequency.\nslow_clk depends on RTC_CLK_SRC (INTERNAL_RC or EXTERNAL_CRYSTAL).", + "id": "BOOTLOADER_WDT_ENABLE", + "name": "BOOTLOADER_WDT_ENABLE", + "range": null, + "title": "Use RTC watchdog in start code", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "BOOTLOADER_APP_ANTI_ROLLBACK", + "help": "The secure version is the sequence number stored in the header of each firmware.\nThe security version is set in the bootloader, version is recorded in the eFuse field\nas the number of set ones. The allocated number of bits in the efuse field\nfor storing the security version is limited (see BOOTLOADER_APP_SEC_VER_SIZE_EFUSE_FIELD option).\n\nBootloader: When bootloader selects an app to boot, an app is selected that has\na security version greater or equal that recorded in eFuse field.\nThe app is booted with a higher (or equal) secure version.\n\nThe security version is worth increasing if in previous versions there is\na significant vulnerability and their use is not acceptable.\n\nYour partition table should has a scheme with ota_0 + ota_1 (without factory).", + "id": "BOOTLOADER_APP_SECURE_VERSION", + "name": "BOOTLOADER_APP_SECURE_VERSION", + "range": null, + "title": "eFuse secure version of app", + "type": "int" + }, + { + "children": [], + "depends_on": "BOOTLOADER_APP_ANTI_ROLLBACK", + "help": "The size of the efuse secure version field.\nIts length is limited to 32 bits for ESP32 and 16 bits for ESP32-S2.\nThis determines how many times the security version can be increased.", + "id": "BOOTLOADER_APP_SEC_VER_SIZE_EFUSE_FIELD", + "name": "BOOTLOADER_APP_SEC_VER_SIZE_EFUSE_FIELD", + "range": null, + "title": "Size of the efuse secure version field", + "type": "int" + }, + { + "children": [], + "depends_on": "BOOTLOADER_APP_ANTI_ROLLBACK", + "help": "This option allows to emulate read/write operations with all eFuses and efuse secure version.\nIt allows to test anti-rollback implementation without permanent write eFuse bits.\nThere should be an entry in partition table with following details: `emul_efuse, data, efuse, , 0x2000`.\n\nThis option enables: EFUSE_VIRTUAL and EFUSE_VIRTUAL_KEEP_IN_FLASH.", + "id": "BOOTLOADER_EFUSE_SECURE_VERSION_EMULATE", + "name": "BOOTLOADER_EFUSE_SECURE_VERSION_EMULATE", + "range": null, + "title": "Emulate operations with efuse secure version(only test)", + "type": "bool" + } + ], + "depends_on": "BOOTLOADER_APP_ROLLBACK_ENABLE", + "help": "This option prevents rollback to previous firmware/application image with lower security version.", + "id": "BOOTLOADER_APP_ANTI_ROLLBACK", + "name": "BOOTLOADER_APP_ANTI_ROLLBACK", + "range": null, + "title": "Enable app anti-rollback support", + "type": "bool" + } + ], + "depends_on": null, + "help": "After updating the app, the bootloader runs a new app with the \"ESP_OTA_IMG_PENDING_VERIFY\" state set.\nThis state prevents the re-run of this app. After the first boot of the new app in the user code, the\nfunction should be called to confirm the operability of the app or vice versa about its non-operability.\nIf the app is working, then it is marked as valid. Otherwise, it is marked as not valid and rolls back to\nthe previous working app. A reboot is performed, and the app is booted before the software update.\nNote: If during the first boot a new app the power goes out or the WDT works, then roll back will happen.\nRollback is possible only between the apps with the same security versions.", + "id": "BOOTLOADER_APP_ROLLBACK_ENABLE", + "name": "BOOTLOADER_APP_ROLLBACK_ENABLE", + "range": null, + "title": "Enable app rollback support", + "type": "bool" + }, + { + "children": [], + "depends_on": "(SECURE_BOOT && SECURE_BOOT_INSECURE) || !SECURE_BOOT", + "help": "This option disables the normal validation of an image coming out of\ndeep sleep (checksums, SHA256, and signature). This is a trade-off\nbetween wakeup performance from deep sleep, and image integrity checks.\n\nOnly enable this if you know what you are doing. It should not be used\nin conjunction with using deep_sleep() entry and changing the active OTA\npartition as this would skip the validation upon first load of the new\nOTA partition.\n\nIt is possible to enable this option with Secure Boot if \"allow insecure\noptions\" is enabled, however it's strongly recommended to NOT enable it as\nit may allow a Secure Boot bypass.", + "id": "BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP", + "name": "BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP", + "range": null, + "title": "Skip image validation when exiting deep sleep", + "type": "bool" + }, + { + "children": [], + "depends_on": "!SECURE_SIGNED_ON_BOOT", + "help": "Some applications need to boot very quickly from power on. By default, the entire app binary\nis read from flash and verified which takes up a significant portion of the boot time.\n\nEnabling this option will skip validation of the app when the SoC boots from power on.\nNote that in this case it's not possible for the bootloader to detect if an app image is\ncorrupted in the flash, therefore it's not possible to safely fall back to a different app\npartition. Flash corruption of this kind is unlikely but can happen if there is a serious\nfirmware bug or physical damage.\n\nFollowing other reset types, the bootloader will still validate the app image. This increases\nthe chances that flash corruption resulting in a crash can be detected following soft reset, and\nthe bootloader will fall back to a valid app image. To increase the chances of successfully recovering\nfrom a flash corruption event, keep the option BOOTLOADER_WDT_ENABLE enabled and consider also enabling\nBOOTLOADER_WDT_DISABLE_IN_USER_CODE - then manually disable the RTC Watchdog once the app is running.\nIn addition, enable both the Task and Interrupt watchdog timers with reset options set.", + "id": "BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON", + "name": "BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON", + "range": null, + "title": "Skip image validation from power on reset (READ HELP FIRST)", + "type": "bool" + }, + { + "children": [], + "depends_on": "!SECURE_SIGNED_ON_BOOT", + "help": "Selecting this option prevents the bootloader from ever validating the app image before\nbooting it. Any flash corruption of the selected app partition will make the entire SoC\nunbootable.\n\nAlthough flash corruption is a very rare case, it is not recommended to select this option.\nConsider selecting \"Skip image validation from power on reset\" instead. However, if boot time\nis the only important factor then it can be enabled.", + "id": "BOOTLOADER_SKIP_VALIDATE_ALWAYS", + "name": "BOOTLOADER_SKIP_VALIDATE_ALWAYS", + "range": null, + "title": "Skip image validation always (READ HELP FIRST)", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_RTC_FAST_MEM_SUPPORTED", + "help": "Reserve RTC FAST memory for Skip image validation. This option in bytes.\nThis option reserves an area in the RTC FAST memory (access only PRO_CPU).\nUsed to save the addresses of the selected application.\nWhen a wakeup occurs (from Deep sleep), the bootloader retrieves it and\nloads the application without validation.", + "id": "BOOTLOADER_RESERVE_RTC_SIZE", + "name": "BOOTLOADER_RESERVE_RTC_SIZE", + "range": null, + "title": null, + "type": "hex" + }, + { + "children": [ + { + "children": [], + "depends_on": "BOOTLOADER_CUSTOM_RESERVE_RTC", + "help": "This option allows the customer to use the legacy bootloader behavior when the\nRTC FAST memory CRC calculation takes place. When this option is enabled, the\nallocated user custom data will be taken into account in the CRC calculation.\nThis means that any change to the custom data would need a CRC update to prevent\nthe bootloader from marking this data as corrupted.\nIf this option is disabled, the custom data will not be taken into account when\ncalculating the RTC FAST memory CRC. The user custom data can be changed freely,\nwithout the need to update the CRC.\nTHIS OPTION MUST BE THE SAME FOR BOTH THE BOOTLOADER AND THE APPLICATION BUILDS.", + "id": "BOOTLOADER_CUSTOM_RESERVE_RTC_IN_CRC", + "name": "BOOTLOADER_CUSTOM_RESERVE_RTC_IN_CRC", + "range": null, + "title": "Include custom memory in the CRC calculation", + "type": "bool" + }, + { + "children": [], + "depends_on": "BOOTLOADER_CUSTOM_RESERVE_RTC", + "help": "This option reserves in RTC FAST memory the area for custom purposes.\nIf you want to create your own bootloader and save more information\nin this area of memory, you can increase it. It must be a multiple of 4 bytes.\nThis area (rtc_retain_mem_t) is reserved and has access from the bootloader and an application.", + "id": "BOOTLOADER_CUSTOM_RESERVE_RTC_SIZE", + "name": "BOOTLOADER_CUSTOM_RESERVE_RTC_SIZE", + "range": null, + "title": "Size in bytes for custom purposes", + "type": "hex" + } + ], + "depends_on": "SOC_RTC_FAST_MEM_SUPPORTED", + "help": "This option allows the customer to place data in the RTC FAST memory,\nthis area remains valid when rebooted, except for power loss.\nThis memory is located at a fixed address and is available\nfor both the bootloader and the application.\n(The application and bootloader must be compiled with the same option).\nThe RTC FAST memory has access only through PRO_CPU.", + "id": "BOOTLOADER_CUSTOM_RESERVE_RTC", + "name": "BOOTLOADER_CUSTOM_RESERVE_RTC", + "range": null, + "title": "Reserve RTC FAST memory for custom purposes", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_RTC_FAST_MEM_SUPPORTED", + "help": "This option reserves an area in RTC FAST memory for the following features:\n- \"Skip image validation when exiting deep sleep\"\n- \"Reserve RTC FAST memory for custom purposes\"\n- \"GPIO triggers factory reset\"", + "id": "BOOTLOADER_RESERVE_RTC_MEM", + "name": "BOOTLOADER_RESERVE_RTC_MEM", + "range": null, + "title": null, + "type": "bool" + } + ], + "depends_on": null, + "id": "bootloader-config", + "title": "Bootloader config", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SECURE_BOOT || SECURE_SIGNED_ON_BOOT_NO_SECURE_BOOT", + "help": null, + "id": "SECURE_SIGNED_ON_BOOT", + "name": "SECURE_SIGNED_ON_BOOT", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "SECURE_BOOT || SECURE_SIGNED_ON_UPDATE_NO_SECURE_BOOT", + "help": null, + "id": "SECURE_SIGNED_ON_UPDATE", + "name": "SECURE_SIGNED_ON_UPDATE", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "SECURE_SIGNED_ON_BOOT || SECURE_SIGNED_ON_UPDATE", + "help": null, + "id": "SECURE_SIGNED_APPS", + "name": "SECURE_SIGNED_APPS", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "(IDF_TARGET_ESP32 && ESP32_REV_MIN_FULL >= 300) || SOC_SECURE_BOOT_V2_RSA", + "help": null, + "id": "SECURE_BOOT_V2_RSA_SUPPORTED", + "name": "SECURE_BOOT_V2_RSA_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_SECURE_BOOT_V2_ECC", + "help": null, + "id": "SECURE_BOOT_V2_ECC_SUPPORTED", + "name": "SECURE_BOOT_V2_ECC_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_SECURE_BOOT_V1", + "help": null, + "id": "SECURE_BOOT_V1_SUPPORTED", + "name": "SECURE_BOOT_V1_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP32_REV_MIN_FULL >= 300", + "help": null, + "id": "SECURE_BOOT_V2_PREFERRED", + "name": "SECURE_BOOT_V2_PREFERRED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SECURE_BOOT_V2_ECDSA_ENABLED", + "name": "SECURE_BOOT_V2_ECDSA_ENABLED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SECURE_BOOT_V2_RSA_ENABLED", + "name": "SECURE_BOOT_V2_RSA_ENABLED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SECURE_BOOT_FLASH_ENC_KEYS_BURN_TOGETHER", + "name": "SECURE_BOOT_FLASH_ENC_KEYS_BURN_TOGETHER", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "!SECURE_BOOT", + "help": "Require apps to be signed to verify their integrity.\n\nThis option uses the same app signature scheme as hardware secure boot, but unlike hardware secure boot it\ndoes not prevent the bootloader from being physically updated. This means that the device can be secured\nagainst remote network access, but not physical access. Compared to using hardware Secure Boot this option\nis much simpler to implement.", + "id": "SECURE_SIGNED_APPS_NO_SECURE_BOOT", + "name": "SECURE_SIGNED_APPS_NO_SECURE_BOOT", + "range": null, + "title": "Require signed app images", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "SECURE_BOOT_V1_SUPPORTED && (SECURE_SIGNED_APPS_NO_SECURE_BOOT || SECURE_BOOT_V1_ENABLED) && ", + "help": "Embeds the ECDSA public key in the bootloader and signs the application with an ECDSA key.\nRefer to the documentation before enabling.", + "id": "SECURE_SIGNED_APPS_ECDSA_SCHEME", + "name": "SECURE_SIGNED_APPS_ECDSA_SCHEME", + "range": null, + "title": "ECDSA", + "type": "bool" + }, + { + "children": [], + "depends_on": "SECURE_BOOT_V2_RSA_SUPPORTED && (SECURE_SIGNED_APPS_NO_SECURE_BOOT || SECURE_BOOT_V2_ENABLED) && ", + "help": "Appends the RSA-3072 based Signature block to the application.\nRefer to before enabling.", + "id": "SECURE_SIGNED_APPS_RSA_SCHEME", + "name": "SECURE_SIGNED_APPS_RSA_SCHEME", + "range": null, + "title": "RSA", + "type": "bool" + }, + { + "children": [], + "depends_on": "SECURE_BOOT_V2_ECC_SUPPORTED && (SECURE_SIGNED_APPS_NO_SECURE_BOOT || SECURE_BOOT_V2_ENABLED) && ", + "help": "For Secure boot V2 (e.g., ESP32-C2 SoC), appends ECDSA based signature block to the application.\nRefer to documentation before enabling.", + "id": "SECURE_SIGNED_APPS_ECDSA_V2_SCHEME", + "name": "SECURE_SIGNED_APPS_ECDSA_V2_SCHEME", + "range": null, + "title": "ECDSA (V2)", + "type": "bool" + } + ], + "depends_on": "SECURE_BOOT || SECURE_SIGNED_APPS_NO_SECURE_BOOT", + "help": "Select the Secure App signing scheme. Depends on the Chip Revision.\nThere are two secure boot versions:\n\n1. Secure boot V1\n - Legacy custom secure boot scheme. Supported in ESP32 SoC.\n\n2. Secure boot V2\n - RSA based secure boot scheme.\n Supported in ESP32-ECO3 (ESP32 Chip Revision 3 onwards), ESP32-S2, ESP32-C3, ESP32-S3 SoCs.\n\n - ECDSA based secure boot scheme. Supported in ESP32-C2 SoC.", + "id": "security-features-app-signing-scheme", + "name": "SECURE_SIGNED_APPS_SCHEME", + "title": "App Signing Scheme", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "SECURE_SIGNED_APPS_ECDSA_V2_SCHEME && ", + "help": null, + "id": "SECURE_BOOT_ECDSA_KEY_LEN_192_BITS", + "name": "SECURE_BOOT_ECDSA_KEY_LEN_192_BITS", + "range": null, + "title": "Using ECC curve NISTP192", + "type": "bool" + }, + { + "children": [], + "depends_on": "SECURE_SIGNED_APPS_ECDSA_V2_SCHEME && ", + "help": null, + "id": "SECURE_BOOT_ECDSA_KEY_LEN_256_BITS", + "name": "SECURE_BOOT_ECDSA_KEY_LEN_256_BITS", + "range": null, + "title": "Using ECC curve NISTP256 (Recommended)", + "type": "bool" + } + ], + "depends_on": "SECURE_SIGNED_APPS_ECDSA_V2_SCHEME", + "help": "Select the ECDSA key size. Two key sizes are supported\n\n- 192 bit key using NISTP192 curve\n- 256 bit key using NISTP256 curve (Recommended)\n\nThe advantage of using 256 bit key is the extra randomness which makes it difficult to be\nbruteforced compared to 192 bit key.\nAt present, both key sizes are practically implausible to bruteforce.", + "id": "security-features-ecdsa-key-size", + "name": "SECURE_BOOT_ECDSA_KEY_LEN_SIZE", + "title": "ECDSA key size", + "type": "choice" + }, + { + "children": [], + "depends_on": "SECURE_SIGNED_APPS_NO_SECURE_BOOT && SECURE_SIGNED_APPS_ECDSA_SCHEME", + "help": "If this option is set, the bootloader will be compiled with code to verify that an app is signed before\nbooting it.\n\nIf hardware secure boot is enabled, this option is always enabled and cannot be disabled.\nIf hardware secure boot is not enabled, this option doesn't add significant security by itself so most\nusers will want to leave it disabled.", + "id": "SECURE_SIGNED_ON_BOOT_NO_SECURE_BOOT", + "name": "SECURE_SIGNED_ON_BOOT_NO_SECURE_BOOT", + "range": null, + "title": "Bootloader verifies app signatures", + "type": "bool" + }, + { + "children": [], + "depends_on": "SECURE_SIGNED_APPS_NO_SECURE_BOOT", + "help": "If this option is set, any OTA updated apps will have the signature verified before being considered valid.\n\nWhen enabled, the signature is automatically checked whenever the esp_ota_ops.h APIs are used for OTA\nupdates, or esp_image_format.h APIs are used to verify apps.\n\nIf hardware secure boot is enabled, this option is always enabled and cannot be disabled.\nIf hardware secure boot is not enabled, this option still adds significant security against network-based\nattackers by preventing spoofing of OTA updates.", + "id": "SECURE_SIGNED_ON_UPDATE_NO_SECURE_BOOT", + "name": "SECURE_SIGNED_ON_UPDATE_NO_SECURE_BOOT", + "range": null, + "title": "Verify app signature on update", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "SECURE_BOOT_V1_SUPPORTED && ", + "help": "Build a bootloader which enables secure boot version 1 on first boot.\nRefer to the Secure Boot section of the ESP-IDF Programmer's Guide for this version before enabling.", + "id": "SECURE_BOOT_V1_ENABLED", + "name": "SECURE_BOOT_V1_ENABLED", + "range": null, + "title": "Enable Secure Boot version 1", + "type": "bool" + }, + { + "children": [], + "depends_on": "(SECURE_BOOT_V2_RSA_SUPPORTED || SECURE_BOOT_V2_ECC_SUPPORTED) && ", + "help": "Build a bootloader which enables Secure Boot version 2 on first boot.\nRefer to Secure Boot V2 section of the ESP-IDF Programmer's Guide for this version before enabling.", + "id": "SECURE_BOOT_V2_ENABLED", + "name": "SECURE_BOOT_V2_ENABLED", + "range": null, + "title": "Enable Secure Boot version 2", + "type": "bool" + } + ], + "depends_on": "SECURE_BOOT", + "help": "Select the Secure Boot Version. Depends on the Chip Revision.\nSecure Boot V2 is the new RSA / ECDSA based secure boot scheme.\n\n - RSA based scheme is supported in ESP32 (Revision 3 onwards), ESP32-S2, ESP32-C3 (ECO3), ESP32-S3.\n - ECDSA based scheme is supported in ESP32-C2 SoC.\n\nPlease note that, RSA or ECDSA secure boot is property of specific SoC based on its HW design, supported\ncrypto accelerators, die-size, cost and similar parameters. Please note that RSA scheme has requirement\nfor bigger key sizes but at the same time it is comparatively faster than ECDSA verification.\n\nSecure Boot V1 is the AES based (custom) secure boot scheme supported in ESP32 SoC.", + "id": "security-features-enable-hardware-secure-boot-in-bootloader-read-docs-first--select-secure-boot-version", + "name": "SECURE_BOOT_VERSION", + "title": "Select secure boot version", + "type": "choice" + } + ], + "depends_on": "SOC_SECURE_BOOT_SUPPORTED && !(IDF_TARGET_ESP32C3 && ESP32C3_REV_MIN_FULL < 3)", + "help": "Build a bootloader which enables Secure Boot on first boot.\n\nOnce enabled, Secure Boot will not boot a modified bootloader. The bootloader will only load a partition\ntable or boot an app if the data has a verified digital signature. There are implications for reflashing\nupdated apps once secure boot is enabled.\n\nWhen enabling secure boot, JTAG and ROM BASIC Interpreter are permanently disabled by default.", + "id": "SECURE_BOOT", + "name": "SECURE_BOOT", + "range": null, + "title": "Enable hardware Secure Boot in bootloader (READ DOCS FIRST)", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": "On first boot, the bootloader will generate a key which is not readable externally or by software. A\ndigest is generated from the bootloader image itself. This digest will be verified on each subsequent\nboot.\n\nEnabling this option means that the bootloader cannot be changed after the first time it is booted.", + "id": "SECURE_BOOTLOADER_ONE_TIME_FLASH", + "name": "SECURE_BOOTLOADER_ONE_TIME_FLASH", + "range": null, + "title": "One-time flash", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "Generate a reusable secure bootloader key, derived (via SHA-256) from the secure boot signing key.\n\nThis allows the secure bootloader to be re-flashed by anyone with access to the secure boot signing\nkey.\n\nThis option is less secure than one-time flash, because a leak of the digest key from one device\nallows reflashing of any device that uses it.", + "id": "SECURE_BOOTLOADER_REFLASHABLE", + "name": "SECURE_BOOTLOADER_REFLASHABLE", + "range": null, + "title": "Reflashable", + "type": "bool" + } + ], + "depends_on": "SECURE_BOOT_V1_ENABLED", + "help": null, + "id": "security-features-secure-bootloader-mode", + "name": "SECURE_BOOTLOADER_MODE", + "title": "Secure bootloader mode", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "SECURE_BOOT_BUILD_SIGNED_BINARIES", + "help": "Path to the key file used to sign app images.\n\nKey file is an ECDSA private key (NIST256p curve) in PEM format for Secure Boot V1.\nKey file is an RSA private key in PEM format for Secure Boot V2.\n\nPath is evaluated relative to the project directory.\n\nYou can generate a new signing key by running the following command:\nespsecure.py generate_signing_key secure_boot_signing_key.pem\n\nSee the Secure Boot section of the ESP-IDF Programmer's Guide for this version for details.", + "id": "SECURE_BOOT_SIGNING_KEY", + "name": "SECURE_BOOT_SIGNING_KEY", + "range": null, + "title": "Secure boot private signing key", + "type": "string" + } + ], + "depends_on": "SECURE_SIGNED_APPS", + "help": "Once secure boot or signed app requirement is enabled, app images are required to be signed.\n\nIf enabled (default), these binary files are signed as part of the build process. The file named in\n\"Secure boot private signing key\" will be used to sign the image.\n\nIf disabled, unsigned app/partition data will be built. They must be signed manually using espsecure.py.\nVersion 1 to enable ECDSA Based Secure Boot and Version 2 to enable RSA based Secure Boot.\n(for example, on a remote signing server.)", + "id": "SECURE_BOOT_BUILD_SIGNED_BINARIES", + "name": "SECURE_BOOT_BUILD_SIGNED_BINARIES", + "range": null, + "title": "Sign binaries during build", + "type": "bool" + }, + { + "children": [], + "depends_on": "SECURE_SIGNED_APPS && SECURE_SIGNED_APPS_ECDSA_SCHEME && !SECURE_BOOT_BUILD_SIGNED_BINARIES", + "help": "Path to a public key file used to verify signed images.\nSecure Boot V1: This ECDSA public key is compiled into the bootloader and/or\napp, to verify app images.\n\nKey file is in raw binary format, and can be extracted from a\nPEM formatted private key using the espsecure.py\nextract_public_key command.\n\nRefer to the Secure Boot section of the ESP-IDF Programmer's Guide for this version before enabling.", + "id": "SECURE_BOOT_VERIFICATION_KEY", + "name": "SECURE_BOOT_VERIFICATION_KEY", + "range": null, + "title": "Secure boot public signature verification key", + "type": "string" + }, + { + "children": [], + "depends_on": "SECURE_BOOT && SOC_SUPPORT_SECURE_BOOT_REVOKE_KEY", + "help": "If this option is set, ROM bootloader will revoke the public key digest burned in efuse block\nif it fails to verify the signature of software bootloader with it.\nRevocation of keys does not happen when enabling secure boot. Once secure boot is enabled,\nkey revocation checks will be done on subsequent boot-up, while verifying the software bootloader\n\nThis feature provides a strong resistance against physical attacks on the device.\n\nNOTE: Once a digest slot is revoked, it can never be used again to verify an image\nThis can lead to permanent bricking of the device, in case all keys are revoked\nbecause of signature verification failure.", + "id": "SECURE_BOOT_ENABLE_AGGRESSIVE_KEY_REVOKE", + "name": "SECURE_BOOT_ENABLE_AGGRESSIVE_KEY_REVOKE", + "range": null, + "title": "Enable Aggressive key revoke strategy", + "type": "bool" + }, + { + "children": [], + "depends_on": "SECURE_BOOT_V2_ENABLED", + "help": "If not set (default, recommended), on first boot the bootloader will burn the WR_DIS_RD_DIS\nefuse when Secure Boot is enabled. This prevents any more efuses from being read protected.\n\nIf this option is set, it will remain possible to write the EFUSE_RD_DIS efuse field after Secure\nBoot is enabled. This may allow an attacker to read-protect the BLK2 efuse (for ESP32) and\nBLOCK4-BLOCK10 (i.e. BLOCK_KEY0-BLOCK_KEY5)(for other chips) holding the secure boot public key digest,\ncausing an immediate denial of service and possibly allowing an additional fault injection attack to\nbypass the signature protection.\n\nThe option must be set when you need to program any read-protected key type into the efuses,\ne.g., HMAC, ECDSA etc. after secure boot has already been enabled on the device.\nPlease refer to secure boot V2 documentation guide for more details.\n\nNOTE: Once a BLOCK is read-protected, the application will read all zeros from that block\n\nNOTE: If \"UART ROM download mode (Permanently disabled (recommended))\" or\n\"UART ROM download mode (Permanently switch to Secure mode (recommended))\" is set,\nthen it is __NOT__ possible to read/write efuses using espefuse.py utility.\nHowever, efuse can be read/written from the application\n\nPlease refer to the Secure Boot V2 documentation guide for more information.", + "id": "SECURE_BOOT_V2_ALLOW_EFUSE_RD_DIS", + "name": "SECURE_BOOT_V2_ALLOW_EFUSE_RD_DIS", + "range": null, + "title": "Do not disable the ability to further read protect eFuses", + "type": "bool" + }, + { + "children": [], + "depends_on": "SECURE_BOOT_V2_ENABLED && SECURE_BOOT_BUILD_SIGNED_BINARIES", + "help": "When Secure Boot V2 is enabled, by default the bootloader is not flashed along with other artifacts\nlike the application and the partition table images, i.e. bootloader has to be separately flashed\nusing the command `idf.py bootloader flash`, whereas, the application and partition table can be flashed\nusing the command `idf.py flash` itself.\nEnabling this option allows flashing the bootloader along with the other artifacts\nby invocation of the command `idf.py flash`.\n\nIf this option is enabled make sure that even the bootloader is signed using the correct secure boot key,\notherwise the bootloader signature verification would fail, as hash of the public key which is present in\nthe bootloader signature would not match with the digest stored into the efuses\nand thus the device will not be able to boot up.", + "id": "SECURE_BOOT_FLASH_BOOTLOADER_DEFAULT", + "name": "SECURE_BOOT_FLASH_BOOTLOADER_DEFAULT", + "range": null, + "title": "Flash bootloader along with other artifacts when using the default flash command", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "SECURE_BOOTLOADER_KEY_ENCODING_256BIT", + "name": "SECURE_BOOTLOADER_KEY_ENCODING_256BIT", + "range": null, + "title": "No encoding (256 bit key)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "SECURE_BOOTLOADER_KEY_ENCODING_192BIT", + "name": "SECURE_BOOTLOADER_KEY_ENCODING_192BIT", + "range": null, + "title": "3/4 encoding (192 bit key)", + "type": "bool" + } + ], + "depends_on": "SECURE_BOOTLOADER_REFLASHABLE", + "help": "In reflashable secure bootloader mode, a hardware key is derived from the signing key (with SHA-256) and\ncan be written to eFuse with espefuse.py.\n\nNormally this is a 256-bit key, but if 3/4 Coding Scheme is used on the device then the eFuse key is\ntruncated to 192 bits.\n\nThis configuration item doesn't change any firmware code, it only changes the size of key binary which is\ngenerated at build time.", + "id": "security-features-hardware-key-encoding", + "name": "SECURE_BOOTLOADER_KEY_ENCODING", + "title": "Hardware Key Encoding", + "type": "choice" + }, + { + "children": [], + "depends_on": "SECURE_BOOT", + "help": "You can disable some of the default protections offered by secure boot, in order to enable testing or a\ncustom combination of security features.\n\nOnly enable these options if you are very sure.\n\nRefer to the Secure Boot section of the ESP-IDF Programmer's Guide for this version before enabling.", + "id": "SECURE_BOOT_INSECURE", + "name": "SECURE_BOOT_INSECURE", + "range": null, + "title": "Allow potentially insecure options", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "SOC_FLASH_ENCRYPTION_XTS_AES_128_DERIVED && ", + "help": null, + "id": "SECURE_FLASH_ENCRYPTION_AES128_DERIVED", + "name": "SECURE_FLASH_ENCRYPTION_AES128_DERIVED", + "range": null, + "title": "AES-128 key derived from 128 bits (SHA256(128 bits))", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_FLASH_ENCRYPTION_XTS_AES_128 && !(IDF_TARGET_ESP32C2 && SECURE_BOOT) && ", + "help": null, + "id": "SECURE_FLASH_ENCRYPTION_AES128", + "name": "SECURE_FLASH_ENCRYPTION_AES128", + "range": null, + "title": "AES-128 (256-bit key)", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_FLASH_ENCRYPTION_XTS_AES_256 && ", + "help": null, + "id": "SECURE_FLASH_ENCRYPTION_AES256", + "name": "SECURE_FLASH_ENCRYPTION_AES256", + "range": null, + "title": "AES-256 (512-bit key)", + "type": "bool" + } + ], + "depends_on": "SOC_FLASH_ENCRYPTION_XTS_AES_OPTIONS && SECURE_FLASH_ENC_ENABLED", + "help": "Size of generated XTS-AES key.\n\n- AES-128 uses a 256-bit key (32 bytes) derived from 128 bits (16 bytes) burned in half Efuse key block.\n Internally, it calculates SHA256(128 bits)\n- AES-128 uses a 256-bit key (32 bytes) which occupies one Efuse key block.\n- AES-256 uses a 512-bit key (64 bytes) which occupies two Efuse key blocks.\n\nThis setting is ignored if either type of key is already burned to Efuse before the first boot.\nIn this case, the pre-burned key is used and no new key is generated.", + "id": "security-features-enable-flash-encryption-on-boot-read-docs-first--size-of-generated-xts-aes-key", + "name": "SECURE_FLASH_ENCRYPTION_KEYSIZE", + "title": "Size of generated XTS-AES key", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "SECURE_FLASH_ENCRYPTION_MODE_DEVELOPMENT", + "name": "SECURE_FLASH_ENCRYPTION_MODE_DEVELOPMENT", + "range": null, + "title": "Development (NOT SECURE)", + "type": "bool" + }, + { + "children": [], + "depends_on": "(!EFUSE_VIRTUAL || IDF_CI_BUILD) && ", + "help": null, + "id": "SECURE_FLASH_ENCRYPTION_MODE_RELEASE", + "name": "SECURE_FLASH_ENCRYPTION_MODE_RELEASE", + "range": null, + "title": "Release", + "type": "bool" + } + ], + "depends_on": "SECURE_FLASH_ENC_ENABLED", + "help": "By default Development mode is enabled which allows ROM download mode to perform flash encryption\noperations (plaintext is sent to the device, and it encrypts it internally and writes ciphertext\nto flash.) This mode is not secure, it's possible for an attacker to write their own chosen plaintext\nto flash.\n\nRelease mode should always be selected for production or manufacturing. Once enabled it's no longer\npossible for the device in ROM Download Mode to use the flash encryption hardware.\n\nWhen EFUSE_VIRTUAL is enabled, SECURE_FLASH_ENCRYPTION_MODE_RELEASE is not available.\nFor CI tests we use IDF_CI_BUILD to bypass it (\"export IDF_CI_BUILD=1\").\nWe do not recommend bypassing it for other purposes.\n\nRefer to the Flash Encryption section of the ESP-IDF Programmer's Guide for details.", + "id": "security-features-enable-flash-encryption-on-boot-read-docs-first--enable-usage-mode", + "name": "SECURE_FLASH_ENCRYPTION_MODE", + "title": "Enable usage mode", + "type": "choice" + } + ], + "depends_on": null, + "help": "If this option is set, flash contents will be encrypted by the bootloader on first boot.\n\nNote: After first boot, the system will be permanently encrypted. Re-flashing an encrypted\nsystem is complicated and not always possible.\n\nRead https://docs.espressif.com/projects/esp-idf/en/latest/security/flash-encryption.html\nbefore enabling.", + "id": "SECURE_FLASH_ENC_ENABLED", + "name": "SECURE_FLASH_ENC_ENABLED", + "range": null, + "title": "Enable flash encryption on boot (READ DOCS FIRST)", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SECURE_FLASH_HAS_WRITE_PROTECTION_CACHE", + "name": "SECURE_FLASH_HAS_WRITE_PROTECTION_CACHE", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "(SECURE_BOOT_INSECURE || SECURE_FLASH_ENCRYPTION_MODE_DEVELOPMENT) && IDF_TARGET_ESP32", + "help": "By default, the BASIC ROM Console starts on reset if no valid bootloader is\nread from the flash.\n\nWhen either flash encryption or secure boot are enabled, the default is to\ndisable this BASIC fallback mode permanently via eFuse.\n\nIf this option is set, this eFuse is not burned and the BASIC ROM Console may\nremain accessible. Only set this option in testing environments.", + "id": "SECURE_BOOT_ALLOW_ROM_BASIC", + "name": "SECURE_BOOT_ALLOW_ROM_BASIC", + "range": null, + "title": "Leave ROM BASIC Interpreter available on reset", + "type": "bool" + }, + { + "children": [], + "depends_on": "SECURE_BOOT_INSECURE || SECURE_FLASH_ENCRYPTION_MODE_DEVELOPMENT", + "help": "If not set (default), the bootloader will permanently disable JTAG (across entire chip) on first boot\nwhen either secure boot or flash encryption is enabled.\n\nSetting this option leaves JTAG on for debugging, which negates all protections of flash encryption\nand some of the protections of secure boot.\n\nOnly set this option in testing environments.", + "id": "SECURE_BOOT_ALLOW_JTAG", + "name": "SECURE_BOOT_ALLOW_JTAG", + "range": null, + "title": "Allow JTAG Debugging", + "type": "bool" + }, + { + "children": [], + "depends_on": "SECURE_BOOT_INSECURE || SECURE_SIGNED_ON_UPDATE_NO_SECURE_BOOT", + "help": "If not set (default), app partition size must be a multiple of 64KB. App images are padded to 64KB\nlength, and the bootloader checks any trailing bytes after the signature (before the next 64KB\nboundary) have not been written. This is because flash cache maps entire 64KB pages into the address\nspace. This prevents an attacker from appending unverified data after the app image in the flash,\ncausing it to be mapped into the address space.\n\nSetting this option allows the app partition length to be unaligned, and disables padding of the app\nimage to this length. It is generally not recommended to set this option, unless you have a legacy\npartitioning scheme which doesn't support 64KB aligned partition lengths.", + "id": "SECURE_BOOT_ALLOW_SHORT_APP_PARTITION", + "name": "SECURE_BOOT_ALLOW_SHORT_APP_PARTITION", + "range": null, + "title": "Allow app partition length not 64KB aligned", + "type": "bool" + }, + { + "children": [], + "depends_on": "SECURE_BOOT_INSECURE && SOC_EFUSE_REVOKE_BOOT_KEY_DIGESTS", + "help": "If not set (default), during startup in the app all unused digest slots will be revoked.\nTo revoke unused slot will be called esp_efuse_set_digest_revoke(num_digest) for each digest.\nRevoking unused digest slots makes ensures that no trusted keys can be added later by an attacker.\nIf set, it means that you have a plan to use unused digests slots later.\n\nNote that if you plan to enable secure boot during the first boot up, the bootloader will intentionally\nrevoke the unused digest slots while enabling secure boot, even if the above config is enabled because\nkeeping the unused key slots un-revoked would a security hazard.\nIn case for any development workflow if you need to avoid this revocation, you should enable\nsecure boot externally (host based mechanism) rather than enabling it during the boot up,\nso that the bootloader would not need to enable secure boot and thus you could avoid its revocation\nstrategy.", + "id": "SECURE_BOOT_ALLOW_UNUSED_DIGEST_SLOTS", + "name": "SECURE_BOOT_ALLOW_UNUSED_DIGEST_SLOTS", + "range": null, + "title": "Leave unused digest slots available (not revoke)", + "type": "bool" + }, + { + "children": [], + "depends_on": "SECURE_FLASH_ENCRYPTION_MODE_DEVELOPMENT", + "help": "If not set (default), the bootloader will permanently disable UART bootloader encryption access on\nfirst boot. If set, the UART bootloader will still be able to access hardware encryption.\n\nIt is recommended to only set this option in testing environments.", + "id": "SECURE_FLASH_UART_BOOTLOADER_ALLOW_ENC", + "name": "SECURE_FLASH_UART_BOOTLOADER_ALLOW_ENC", + "range": null, + "title": "Leave UART bootloader encryption enabled", + "type": "bool" + }, + { + "children": [], + "depends_on": "SECURE_FLASH_ENCRYPTION_MODE_DEVELOPMENT && IDF_TARGET_ESP32", + "help": "If not set (default), the bootloader will permanently disable UART bootloader decryption access on\nfirst boot. If set, the UART bootloader will still be able to access hardware decryption.\n\nOnly set this option in testing environments. Setting this option allows complete bypass of flash\nencryption.", + "id": "SECURE_FLASH_UART_BOOTLOADER_ALLOW_DEC", + "name": "SECURE_FLASH_UART_BOOTLOADER_ALLOW_DEC", + "range": null, + "title": "Leave UART bootloader decryption enabled", + "type": "bool" + }, + { + "children": [], + "depends_on": "SECURE_FLASH_ENCRYPTION_MODE_DEVELOPMENT && (IDF_TARGET_ESP32 || SOC_EFUSE_DIS_DOWNLOAD_ICACHE || SOC_EFUSE_DIS_DOWNLOAD_DCACHE)", + "help": "If not set (default), the bootloader will permanently disable UART bootloader flash cache access on\nfirst boot. If set, the UART bootloader will still be able to access the flash cache.\n\nOnly set this option in testing environments.", + "id": "SECURE_FLASH_UART_BOOTLOADER_ALLOW_CACHE", + "name": "SECURE_FLASH_UART_BOOTLOADER_ALLOW_CACHE", + "range": null, + "title": "Leave UART bootloader flash cache enabled", + "type": "bool" + }, + { + "children": [], + "depends_on": "SECURE_FLASH_ENCRYPTION_MODE_DEVELOPMENT", + "help": "If not set (default), and flash encryption is not yet enabled in eFuses, the 2nd stage bootloader\nwill enable flash encryption: generate the flash encryption key and program eFuses.\nIf this option is set, and flash encryption is not yet enabled, the bootloader will error out and\nreboot.\nIf flash encryption is enabled in eFuses, this option does not change the bootloader behavior.\n\nOnly use this option in testing environments, to avoid accidentally enabling flash encryption on\nthe wrong device. The device needs to have flash encryption already enabled using espefuse.py.", + "id": "SECURE_FLASH_REQUIRE_ALREADY_ENABLED", + "name": "SECURE_FLASH_REQUIRE_ALREADY_ENABLED", + "range": null, + "title": "Require flash encryption to be already enabled", + "type": "bool" + }, + { + "children": [], + "depends_on": "SECURE_FLASH_HAS_WRITE_PROTECTION_CACHE", + "help": "If not set (default, recommended), on the first boot the bootloader will burn the write-protection of\nDIS_CACHE(for ESP32) or DIS_ICACHE/DIS_DCACHE(for other chips) eFuse when Flash Encryption is enabled.\nWrite protection for cache disable efuse prevents the chip from being blocked if it is set by accident.\nApp and bootloader use cache so disabling it makes the chip useless for IDF.\nDue to other eFuses are linked with the same write protection bit (see the list below) then\nwrite-protection will not be done if these SECURE_FLASH_UART_BOOTLOADER_ALLOW_ENC,\nSECURE_BOOT_ALLOW_JTAG or SECURE_FLASH_UART_BOOTLOADER_ALLOW_CACHE options are selected\nto give a chance to turn on the chip into the release mode later.\n\nList of eFuses with the same write protection bit:\nESP32: MAC, MAC_CRC, DISABLE_APP_CPU, DISABLE_BT, DIS_CACHE, VOL_LEVEL_HP_INV.\n\nESP32-C3: DIS_ICACHE, DIS_USB_JTAG, DIS_DOWNLOAD_ICACHE, DIS_USB_SERIAL_JTAG,\nDIS_FORCE_DOWNLOAD, DIS_TWAI, JTAG_SEL_ENABLE, DIS_PAD_JTAG, DIS_DOWNLOAD_MANUAL_ENCRYPT.\n\nESP32-C6: SWAP_UART_SDIO_EN, DIS_ICACHE, DIS_USB_JTAG, DIS_DOWNLOAD_ICACHE,\nDIS_USB_SERIAL_JTAG, DIS_FORCE_DOWNLOAD, DIS_TWAI, JTAG_SEL_ENABLE,\nDIS_PAD_JTAG, DIS_DOWNLOAD_MANUAL_ENCRYPT.\n\nESP32-H2: DIS_ICACHE, DIS_USB_JTAG, POWERGLITCH_EN, DIS_FORCE_DOWNLOAD, SPI_DOWNLOAD_MSPI_DIS,\nDIS_TWAI, JTAG_SEL_ENABLE, DIS_PAD_JTAG, DIS_DOWNLOAD_MANUAL_ENCRYPT.\n\nESP32-S2: DIS_ICACHE, DIS_DCACHE, DIS_DOWNLOAD_ICACHE, DIS_DOWNLOAD_DCACHE,\nDIS_FORCE_DOWNLOAD, DIS_USB, DIS_TWAI, DIS_BOOT_REMAP, SOFT_DIS_JTAG,\nHARD_DIS_JTAG, DIS_DOWNLOAD_MANUAL_ENCRYPT.\n\nESP32-S3: DIS_ICACHE, DIS_DCACHE, DIS_DOWNLOAD_ICACHE, DIS_DOWNLOAD_DCACHE,\nDIS_FORCE_DOWNLOAD, DIS_USB_OTG, DIS_TWAI, DIS_APP_CPU, DIS_PAD_JTAG,\nDIS_DOWNLOAD_MANUAL_ENCRYPT, DIS_USB_JTAG, DIS_USB_SERIAL_JTAG, STRAP_JTAG_SEL, USB_PHY_SEL.", + "id": "SECURE_FLASH_SKIP_WRITE_PROTECTION_CACHE", + "name": "SECURE_FLASH_SKIP_WRITE_PROTECTION_CACHE", + "range": null, + "title": "Skip write-protection of DIS_CACHE (DIS_ICACHE, DIS_DCACHE)", + "type": "bool" + } + ], + "depends_on": null, + "id": "security-features-potentially-insecure-options", + "title": "Potentially insecure options", + "type": "menu" + }, + { + "children": [], + "depends_on": "SECURE_FLASH_ENC_ENABLED && !SECURE_FLASH_REQUIRE_ALREADY_ENABLED", + "help": "If set (default), optimise encryption time for the partition of type APP,\nby only encrypting the app image that is present in the partition,\ninstead of the whole partition.\nThe image length used for encryption is derived from the image metadata, which\nincludes the size of the app image, checksum, hash and also the signature sector\nwhen secure boot is enabled.\n\nIf not set, the whole partition of type APP would be encrypted,\nwhich increases the encryption time but might be useful if there\nis any custom data appended to the firmware image.", + "id": "SECURE_FLASH_ENCRYPT_ONLY_IMAGE_LEN_IN_APP_PART", + "name": "SECURE_FLASH_ENCRYPT_ONLY_IMAGE_LEN_IN_APP_PART", + "range": null, + "title": "Encrypt only the app image that is present in the partition of type app", + "type": "bool" + }, + { + "children": [], + "depends_on": "SECURE_FLASH_ENC_ENABLED", + "help": "If set (default), in an app during startup code,\nthere is a check of the flash encryption eFuse bit is on\n(as the bootloader should already have set it).\nThe app requires this bit is on to continue work otherwise abort.\n\nIf not set, the app does not care if the flash encryption eFuse bit is set or not.", + "id": "SECURE_FLASH_CHECK_ENC_EN_IN_APP", + "name": "SECURE_FLASH_CHECK_ENC_EN_IN_APP", + "range": null, + "title": "Check Flash Encryption enabled on app startup", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "SECURE_FLASH_PSEUDO_ROUND_FUNC_STRENGTH_LOW", + "name": "SECURE_FLASH_PSEUDO_ROUND_FUNC_STRENGTH_LOW", + "range": null, + "title": "Low", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "SECURE_FLASH_PSEUDO_ROUND_FUNC_STRENGTH_MEDIUM", + "name": "SECURE_FLASH_PSEUDO_ROUND_FUNC_STRENGTH_MEDIUM", + "range": null, + "title": "Medium", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "SECURE_FLASH_PSEUDO_ROUND_FUNC_STRENGTH_HIGH", + "name": "SECURE_FLASH_PSEUDO_ROUND_FUNC_STRENGTH_HIGH", + "range": null, + "title": "High", + "type": "bool" + } + ], + "depends_on": "SECURE_FLASH_PSEUDO_ROUND_FUNC", + "help": "The strength of the pseudo rounds functions can be configured to low, medium and high,\neach denoting the values that would be stored in the efuses field.\nBy default the value to set to low.\nYou can configure the strength of the pseudo rounds functions according to your use cases,\nfor example, increasing the strength would provide higher security but would slow down the\nflash encryption/decryption operations.\nFor more info regarding the performance impact, please checkout the pseudo round function section of the\nsecurity guide documentation.", + "id": "security-features-permanently-enable-xts-aes-s-pseudo-rounds-function-strength-of-the-pseudo-rounds-function", + "name": "SECURE_FLASH_PSEUDO_ROUND_FUNC_STRENGTH", + "title": "Strength of the pseudo rounds function", + "type": "choice" + } + ], + "depends_on": "SECURE_FLASH_ENCRYPTION_MODE_RELEASE && SOC_FLASH_ENCRYPTION_XTS_AES_SUPPORT_PSEUDO_ROUND", + "help": "If set (default), the bootloader will permanently enable the XTS-AES peripheral's pseudo rounds function.\nNote: Enabling this config would burn an efuse.", + "id": "SECURE_FLASH_PSEUDO_ROUND_FUNC", + "name": "SECURE_FLASH_PSEUDO_ROUND_FUNC", + "range": null, + "title": "Permanently enable XTS-AES's pseudo rounds function", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SECURE_FLASH_PSEUDO_ROUND_FUNC_STRENGTH", + "name": "SECURE_FLASH_PSEUDO_ROUND_FUNC_STRENGTH", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "SECURE_ROM_DL_MODE_ENABLED", + "name": "SECURE_ROM_DL_MODE_ENABLED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": "If set, during startup the app will burn an eFuse bit to permanently disable the UART ROM\nDownload Mode. This prevents any future use of esptool.py, espefuse.py and similar tools.\n\nOnce disabled, if the SoC is booted with strapping pins set for ROM Download Mode\nthen an error is printed instead.\n\nIt is recommended to enable this option in any production application where Flash\nEncryption and/or Secure Boot is enabled and access to Download Mode is not required.\n\nIt is also possible to permanently disable Download Mode by calling\nesp_efuse_disable_rom_download_mode() at runtime.", + "id": "SECURE_DISABLE_ROM_DL_MODE", + "name": "SECURE_DISABLE_ROM_DL_MODE", + "range": null, + "title": "UART ROM download mode (Permanently disabled (recommended))", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_SUPPORTS_SECURE_DL_MODE && ", + "help": "If set, during startup the app will burn an eFuse bit to permanently switch the UART ROM\nDownload Mode into a separate Secure Download mode. This option can only work if\nDownload Mode is not already disabled by eFuse.\n\nSecure Download mode limits the use of Download Mode functions to update SPI config,\nchanging baud rate, basic flash write and a command to return a summary of currently\nenabled security features (`get_security_info`).\n\nSecure Download mode is not compatible with the esptool.py flasher stub feature,\nespefuse.py, read/writing memory or registers, encrypted download, or any other\nfeatures that interact with unsupported Download Mode commands.\n\nSecure Download mode should be enabled in any application where Flash Encryption\nand/or Secure Boot is enabled. Disabling this option does not immediately cancel\nthe benefits of the security features, but it increases the potential \"attack\nsurface\" for an attacker to try and bypass them with a successful physical attack.\n\nIt is also possible to enable secure download mode at runtime by calling\nesp_efuse_enable_rom_secure_download_mode()\n\nNote: Secure Download mode is not available for ESP32 (includes revisions till ECO3).", + "id": "SECURE_ENABLE_SECURE_ROM_DL_MODE", + "name": "SECURE_ENABLE_SECURE_ROM_DL_MODE", + "range": null, + "title": "UART ROM download mode (Permanently switch to Secure mode (recommended))", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "This is a potentially insecure option.\nEnabling this option will allow the full UART download mode to stay enabled.\nThis option SHOULD NOT BE ENABLED for production use cases.", + "id": "SECURE_INSECURE_ALLOW_DL_MODE", + "name": "SECURE_INSECURE_ALLOW_DL_MODE", + "range": null, + "title": "UART ROM download mode (Enabled (not recommended))", + "type": "bool" + } + ], + "depends_on": "(SECURE_BOOT_V2_ENABLED || SECURE_FLASH_ENC_ENABLED) && !(IDF_TARGET_ESP32 && ESP32_REV_MIN_FULL < 300)", + "help": null, + "id": "security-features-uart-rom-download-mode", + "name": "SECURE_UART_ROM_DL_MODE", + "title": "UART ROM download mode", + "type": "choice" + } + ], + "depends_on": null, + "id": "security-features", + "title": "Security features", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "!APP_REPRODUCIBLE_BUILD", + "help": "If set, then the app will be built with the current time/date stamp. It is stored in the app description\nstructure. If not set, time/date stamp will be excluded from app image. This can be useful for getting the\nsame binary image files made from the same source, but at different times.", + "id": "APP_COMPILE_TIME_DATE", + "name": "APP_COMPILE_TIME_DATE", + "range": null, + "title": "Use time/date stamp for app", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "The PROJECT_VER variable from the build system will not affect the firmware image.\nThis value will not be contained in the esp_app_desc structure.", + "id": "APP_EXCLUDE_PROJECT_VER_VAR", + "name": "APP_EXCLUDE_PROJECT_VER_VAR", + "range": null, + "title": "Exclude PROJECT_VER from firmware image", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "The PROJECT_NAME variable from the build system will not affect the firmware image.\nThis value will not be contained in the esp_app_desc structure.", + "id": "APP_EXCLUDE_PROJECT_NAME_VAR", + "name": "APP_EXCLUDE_PROJECT_NAME_VAR", + "range": null, + "title": "Exclude PROJECT_NAME from firmware image", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "APP_PROJECT_VER_FROM_CONFIG", + "help": "Project version", + "id": "APP_PROJECT_VER", + "name": "APP_PROJECT_VER", + "range": null, + "title": "Project version", + "type": "string" + } + ], + "depends_on": null, + "help": "If this is enabled, then config item APP_PROJECT_VER will be used for the variable PROJECT_VER.\nOther ways to set PROJECT_VER will be ignored.", + "id": "APP_PROJECT_VER_FROM_CONFIG", + "name": "APP_PROJECT_VER_FROM_CONFIG", + "range": null, + "title": "Get the project version from Kconfig", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "At startup, the app will read the embedded APP ELF SHA-256 hash value from flash\nand convert it into a string and store it in a RAM buffer.\nThis ensures the panic handler and core dump will be able to print this string\neven when cache is disabled.\nThe size of the buffer is APP_RETRIEVE_LEN_ELF_SHA plus the null terminator.\nChanging this value will change the size of this buffer, in bytes.", + "id": "APP_RETRIEVE_LEN_ELF_SHA", + "name": "APP_RETRIEVE_LEN_ELF_SHA", + "range": [ + 8, + 64 + ], + "title": "The length of APP ELF SHA is stored in RAM(chars)", + "type": "int" + } + ], + "depends_on": null, + "id": "application-manager", + "title": "Application manager", + "type": "menu" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_ROM_HAS_CRC_LE", + "name": "ESP_ROM_HAS_CRC_LE", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_ROM_HAS_CRC_BE", + "name": "ESP_ROM_HAS_CRC_BE", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_ROM_HAS_MZ_CRC32", + "name": "ESP_ROM_HAS_MZ_CRC32", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_ROM_HAS_JPEG_DECODE", + "name": "ESP_ROM_HAS_JPEG_DECODE", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_ROM_HAS_UART_BUF_SWITCH", + "name": "ESP_ROM_HAS_UART_BUF_SWITCH", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_ROM_NEEDS_SWSETUP_WORKAROUND", + "name": "ESP_ROM_NEEDS_SWSETUP_WORKAROUND", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_ROM_HAS_NEWLIB", + "name": "ESP_ROM_HAS_NEWLIB", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_ROM_HAS_NEWLIB_NANO_FORMAT", + "name": "ESP_ROM_HAS_NEWLIB_NANO_FORMAT", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_ROM_HAS_NEWLIB_32BIT_TIME", + "name": "ESP_ROM_HAS_NEWLIB_32BIT_TIME", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_ROM_HAS_SW_FLOAT", + "name": "ESP_ROM_HAS_SW_FLOAT", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_ROM_USB_OTG_NUM", + "name": "ESP_ROM_USB_OTG_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_ROM_USB_SERIAL_DEVICE_NUM", + "name": "ESP_ROM_USB_SERIAL_DEVICE_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB", + "name": "ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_ROM_HAS_OUTPUT_PUTC_FUNC", + "name": "ESP_ROM_HAS_OUTPUT_PUTC_FUNC", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": "Always print ROM logs, this is the default behavior.", + "id": "BOOT_ROM_LOG_ALWAYS_ON", + "name": "BOOT_ROM_LOG_ALWAYS_ON", + "range": null, + "title": "Always Log", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "Don't print ROM logs.", + "id": "BOOT_ROM_LOG_ALWAYS_OFF", + "name": "BOOT_ROM_LOG_ALWAYS_OFF", + "range": null, + "title": "Permanently disable logging", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "Print ROM logs when GPIO level is high during start up.\nThe GPIO number is chip dependent,\ne.g. on ESP32-S2, the control GPIO is GPIO46.", + "id": "BOOT_ROM_LOG_ON_GPIO_HIGH", + "name": "BOOT_ROM_LOG_ON_GPIO_HIGH", + "range": null, + "title": "Log on GPIO High", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "Print ROM logs when GPIO level is low during start up.\nThe GPIO number is chip dependent,\ne.g. on ESP32-S2, the control GPIO is GPIO46.", + "id": "BOOT_ROM_LOG_ON_GPIO_LOW", + "name": "BOOT_ROM_LOG_ON_GPIO_LOW", + "range": null, + "title": "Log on GPIO Low", + "type": "bool" + } + ], + "depends_on": "!IDF_TARGET_ESP32", + "help": "Controls the Boot ROM log behavior.\nThe rom log behavior can only be changed for once,\nspecific eFuse bit(s) will be burned at app boot stage.", + "id": "boot-rom-behavior-permanently-change-boot-rom-output", + "name": "BOOT_ROM_LOG_SCHEME", + "title": "Permanently change Boot ROM output", + "type": "choice" + } + ], + "depends_on": null, + "id": "boot-rom-behavior", + "title": "Boot ROM Behavior", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "The flasher tool sends a precompiled download stub first by default. That stub allows things\nlike compressed downloads and more. Usually you should not need to disable that feature", + "id": "ESPTOOLPY_NO_STUB", + "name": "ESPTOOLPY_NO_STUB", + "range": null, + "title": "Disable download stub", + "type": "bool" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ESP32S3 && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": null, + "id": "ESPTOOLPY_OCT_FLASH", + "name": "ESPTOOLPY_OCT_FLASH", + "range": null, + "title": "Enable Octal Flash", + "type": "bool" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ESP32S3 && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "This config option helps decide whether flash is Quad or Octal, but please note some limitations:\n\n1. If the flash chip is an Octal one, even if one of \"QIO\", \"QOUT\", \"DIO\", \"DOUT\" options is\n selected in `ESPTOOLPY_FLASHMODE`, our code will automatically change the\n mode to \"OPI\" and the sample mode will be STR.\n2. If the flash chip is a Quad one, even if \"OPI\" is selected in `ESPTOOLPY_FLASHMODE`, our code will\n automatically change the mode to \"DIO\".\n3. This option is mainly to improve the out-of-box experience of developers. It doesn't guarantee\n the feature-complete. Some code still rely on `ESPTOOLPY_OCT_FLASH`. Please do not rely on this option\n when you are pretty sure that you are using Octal flash.\n In this case, please enable `ESPTOOLPY_OCT_FLASH` option, then you can choose `DTR` sample mode\n in `ESPTOOLPY_FLASH_SAMPLE_MODE`. Otherwise, only `STR` mode is available.\n4. Enabling this feature reduces available internal RAM size (around 900 bytes).\n If your IRAM space is insufficient and you're aware of your flash type,\n disable this option and select corresponding flash type options.", + "id": "ESPTOOLPY_FLASH_MODE_AUTO_DETECT", + "name": "ESPTOOLPY_FLASH_MODE_AUTO_DETECT", + "range": null, + "title": "Choose flash mode automatically (please read help)", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "!ESPTOOLPY_OCT_FLASH && ", + "help": null, + "id": "ESPTOOLPY_FLASHMODE_QIO", + "name": "ESPTOOLPY_FLASHMODE_QIO", + "range": null, + "title": "QIO", + "type": "bool" + }, + { + "children": [], + "depends_on": "!ESPTOOLPY_OCT_FLASH && ", + "help": null, + "id": "ESPTOOLPY_FLASHMODE_QOUT", + "name": "ESPTOOLPY_FLASHMODE_QOUT", + "range": null, + "title": "QOUT", + "type": "bool" + }, + { + "children": [], + "depends_on": "!ESPTOOLPY_OCT_FLASH && ", + "help": null, + "id": "ESPTOOLPY_FLASHMODE_DIO", + "name": "ESPTOOLPY_FLASHMODE_DIO", + "range": null, + "title": "DIO", + "type": "bool" + }, + { + "children": [], + "depends_on": "!ESPTOOLPY_OCT_FLASH && ", + "help": null, + "id": "ESPTOOLPY_FLASHMODE_DOUT", + "name": "ESPTOOLPY_FLASHMODE_DOUT", + "range": null, + "title": "DOUT", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESPTOOLPY_OCT_FLASH && ", + "help": null, + "id": "ESPTOOLPY_FLASHMODE_OPI", + "name": "ESPTOOLPY_FLASHMODE_OPI", + "range": null, + "title": "OPI", + "type": "bool" + } + ], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "Mode the flash chip is flashed in, as well as the default mode for the\nbinary to run in.", + "id": "serial-flasher-config-flash-spi-mode", + "name": "ESPTOOLPY_FLASHMODE", + "title": "Flash SPI mode", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESPTOOLPY_FLASH_SAMPLE_MODE_STR", + "name": "ESPTOOLPY_FLASH_SAMPLE_MODE_STR", + "range": null, + "title": "STR Mode", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESPTOOLPY_OCT_FLASH && ", + "help": null, + "id": "ESPTOOLPY_FLASH_SAMPLE_MODE_DTR", + "name": "ESPTOOLPY_FLASH_SAMPLE_MODE_DTR", + "range": null, + "title": "DTR Mode", + "type": "bool" + } + ], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": null, + "id": "serial-flasher-config-flash-sampling-mode", + "name": "ESPTOOLPY_FLASH_SAMPLE_MODE", + "title": "Flash Sampling Mode", + "type": "choice" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": null, + "id": "ESPTOOLPY_FLASHMODE", + "name": "ESPTOOLPY_FLASHMODE", + "range": null, + "title": null, + "type": "string" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESPTOOLPY_FLASHFREQ_80M", + "name": "ESPTOOLPY_FLASHFREQ_80M", + "range": null, + "title": "80 MHz", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESPTOOLPY_FLASHFREQ_40M", + "name": "ESPTOOLPY_FLASHFREQ_40M", + "range": null, + "title": "40 MHz", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESPTOOLPY_FLASHFREQ_26M", + "name": "ESPTOOLPY_FLASHFREQ_26M", + "range": null, + "title": "26 MHz", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESPTOOLPY_FLASHFREQ_20M", + "name": "ESPTOOLPY_FLASHFREQ_20M", + "range": null, + "title": "20 MHz", + "type": "bool" + } + ], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": null, + "id": "serial-flasher-config-flash-spi-speed", + "name": "ESPTOOLPY_FLASHFREQ", + "title": "Flash SPI speed", + "type": "choice" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": null, + "id": "ESPTOOLPY_FLASHFREQ", + "name": "ESPTOOLPY_FLASHFREQ", + "range": null, + "title": null, + "type": "string" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESPTOOLPY_FLASHSIZE_1MB", + "name": "ESPTOOLPY_FLASHSIZE_1MB", + "range": null, + "title": "1 MB", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESPTOOLPY_FLASHSIZE_2MB", + "name": "ESPTOOLPY_FLASHSIZE_2MB", + "range": null, + "title": "2 MB", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESPTOOLPY_FLASHSIZE_4MB", + "name": "ESPTOOLPY_FLASHSIZE_4MB", + "range": null, + "title": "4 MB", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESPTOOLPY_FLASHSIZE_8MB", + "name": "ESPTOOLPY_FLASHSIZE_8MB", + "range": null, + "title": "8 MB", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESPTOOLPY_FLASHSIZE_16MB", + "name": "ESPTOOLPY_FLASHSIZE_16MB", + "range": null, + "title": "16 MB", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESPTOOLPY_FLASHSIZE_32MB", + "name": "ESPTOOLPY_FLASHSIZE_32MB", + "range": null, + "title": "32 MB", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESPTOOLPY_FLASHSIZE_64MB", + "name": "ESPTOOLPY_FLASHSIZE_64MB", + "range": null, + "title": "64 MB", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESPTOOLPY_FLASHSIZE_128MB", + "name": "ESPTOOLPY_FLASHSIZE_128MB", + "range": null, + "title": "128 MB", + "type": "bool" + } + ], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "SPI flash size, in megabytes", + "id": "serial-flasher-config-flash-size", + "name": "ESPTOOLPY_FLASHSIZE", + "title": "Flash size", + "type": "choice" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": null, + "id": "ESPTOOLPY_FLASHSIZE", + "name": "ESPTOOLPY_FLASHSIZE", + "range": null, + "title": null, + "type": "string" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "If this option is set, flashing the project will automatically detect\nthe flash size of the target chip and update the bootloader image\nbefore it is flashed.\n\nEnabling this option turns off the image protection against corruption\nby a SHA256 digest. Updating the bootloader image before flashing would\ninvalidate the digest.", + "id": "ESPTOOLPY_HEADER_FLASHSIZE_UPDATE", + "name": "ESPTOOLPY_HEADER_FLASHSIZE_UPDATE", + "range": null, + "title": "Detect flash size when flashing bootloader", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESPTOOLPY_BEFORE_RESET", + "name": "ESPTOOLPY_BEFORE_RESET", + "range": null, + "title": "Reset to bootloader", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESPTOOLPY_BEFORE_NORESET", + "name": "ESPTOOLPY_BEFORE_NORESET", + "range": null, + "title": "No reset", + "type": "bool" + } + ], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "Configure whether esptool.py should reset the ESP32 before flashing.\n\nAutomatic resetting depends on the RTS & DTR signals being\nwired from the serial port to the ESP32. Most USB development\nboards do this internally.", + "id": "serial-flasher-config-before-flashing", + "name": "ESPTOOLPY_BEFORE", + "title": "Before flashing", + "type": "choice" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": null, + "id": "ESPTOOLPY_BEFORE", + "name": "ESPTOOLPY_BEFORE", + "range": null, + "title": null, + "type": "string" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESPTOOLPY_AFTER_RESET", + "name": "ESPTOOLPY_AFTER_RESET", + "range": null, + "title": "Reset after flashing", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESPTOOLPY_AFTER_NORESET", + "name": "ESPTOOLPY_AFTER_NORESET", + "range": null, + "title": "Stay in bootloader", + "type": "bool" + } + ], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "Configure whether esptool.py should reset the ESP32 after flashing.\n\nAutomatic resetting depends on the RTS & DTR signals being\nwired from the serial port to the ESP32. Most USB development\nboards do this internally.", + "id": "serial-flasher-config-after-flashing", + "name": "ESPTOOLPY_AFTER", + "title": "After flashing", + "type": "choice" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": null, + "id": "ESPTOOLPY_AFTER", + "name": "ESPTOOLPY_AFTER", + "range": null, + "title": null, + "type": "string" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": null, + "id": "ESPTOOLPY_MONITOR_BAUD", + "name": "ESPTOOLPY_MONITOR_BAUD", + "range": null, + "title": null, + "type": "int" + } + ], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "id": "serial-flasher-config", + "title": "Serial flasher config", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": "This is the default partition table, designed to fit into a 2MB or\nlarger flash with a single 1MB app partition.\n\nThe corresponding CSV file in the IDF directory is\ncomponents/partition_table/partitions_singleapp.csv\n\nThis partition table is not suitable for an app that needs OTA\n(over the air update) capability.", + "id": "PARTITION_TABLE_SINGLE_APP", + "name": "PARTITION_TABLE_SINGLE_APP", + "range": null, + "title": "Single factory app, no OTA", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "This is a variation of the default partition table, that expands\nthe 1MB app partition size to 1.5MB to fit more code.\n\nThe corresponding CSV file in the IDF directory is\ncomponents/partition_table/partitions_singleapp_large.csv\n\nThis partition table is not suitable for an app that needs OTA\n(over the air update) capability.", + "id": "PARTITION_TABLE_SINGLE_APP_LARGE", + "name": "PARTITION_TABLE_SINGLE_APP_LARGE", + "range": null, + "title": "Single factory app (large), no OTA", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "This is a basic OTA-enabled partition table with a factory app\npartition plus two OTA app partitions. All are 1MB, so this\npartition table requires 4MB or larger flash size.\n\nThe corresponding CSV file in the IDF directory is\ncomponents/partition_table/partitions_two_ota.csv", + "id": "PARTITION_TABLE_TWO_OTA", + "name": "PARTITION_TABLE_TWO_OTA", + "range": null, + "title": "Factory app, two OTA definitions", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "This is a basic OTA-enabled partition table with\ntwo OTA app partitions. Both app partition sizes are 1700K,\nso this partition table requires 4MB or larger flash size.\n\nThe corresponding CSV file in the IDF directory is\ncomponents/partition_table/partitions_two_ota_large.csv", + "id": "PARTITION_TABLE_TWO_OTA_LARGE", + "name": "PARTITION_TABLE_TWO_OTA_LARGE", + "range": null, + "title": "Two large size OTA partitions", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "Specify the path to the partition table CSV to use for your project.\n\nConsult the Partition Table section in the ESP-IDF Programmers Guide\nfor more information.", + "id": "PARTITION_TABLE_CUSTOM", + "name": "PARTITION_TABLE_CUSTOM", + "range": null, + "title": "Custom partition table CSV", + "type": "bool" + }, + { + "children": [], + "depends_on": "!ESP32_COREDUMP_ENABLE_TO_FLASH && NVS_SEC_KEY_PROTECT_USING_FLASH_ENC && ", + "help": "This is a variation of the default \"Single factory app, no OTA\" partition table\nthat supports encrypted NVS when using flash encryption. See the Flash Encryption section\nin the ESP-IDF Programmers Guide for more information.\n\nThe corresponding CSV file in the IDF directory is\ncomponents/partition_table/partitions_singleapp_encr_nvs.csv", + "id": "PARTITION_TABLE_SINGLE_APP_ENCRYPTED_NVS", + "name": "PARTITION_TABLE_SINGLE_APP_ENCRYPTED_NVS", + "range": null, + "title": "Single factory app, no OTA, encrypted NVS", + "type": "bool" + }, + { + "children": [], + "depends_on": "!ESP32_COREDUMP_ENABLE_TO_FLASH && NVS_SEC_KEY_PROTECT_USING_FLASH_ENC && ", + "help": "This is a variation of the \"Single factory app (large), no OTA\" partition table\nthat supports encrypted NVS when using flash encryption. See the Flash Encryption section\nin the ESP-IDF Programmers Guide for more information.\n\nThe corresponding CSV file in the IDF directory is\ncomponents/partition_table/partitions_singleapp_large_encr_nvs.csv", + "id": "PARTITION_TABLE_SINGLE_APP_LARGE_ENC_NVS", + "name": "PARTITION_TABLE_SINGLE_APP_LARGE_ENC_NVS", + "range": null, + "title": "Single factory app (large), no OTA, encrypted NVS", + "type": "bool" + }, + { + "children": [], + "depends_on": "!ESP_COREDUMP_ENABLE_TO_FLASH && NVS_SEC_KEY_PROTECT_USING_FLASH_ENC && ", + "help": "This is a variation of the \"Factory app, two OTA definitions\" partition table\nthat supports encrypted NVS when using flash encryption. See the Flash Encryption section\nin the ESP-IDF Programmers Guide for more information.\n\nThe corresponding CSV file in the IDF directory is\ncomponents/partition_table/partitions_two_ota_encr_nvs.csv", + "id": "PARTITION_TABLE_TWO_OTA_ENCRYPTED_NVS", + "name": "PARTITION_TABLE_TWO_OTA_ENCRYPTED_NVS", + "range": null, + "title": "Factory app, two OTA definitions, encrypted NVS", + "type": "bool" + } + ], + "depends_on": null, + "help": "The partition table to flash to the ESP32. The partition table\ndetermines where apps, data and other resources are expected to\nbe found.\n\nThe predefined partition table CSV descriptions can be found\nin the components/partition_table directory. These are mostly intended\nfor example and development use, it's expect that for production use you\nwill copy one of these CSV files and create a custom partition CSV for\nyour application.", + "id": "partition-table-partition-table", + "name": "PARTITION_TABLE_TYPE", + "title": "Partition Table", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": "Name of the custom partition CSV filename.\nThis path is evaluated relative to the project root directory by default.\nHowever, if the absolute path for the CSV file is provided, then the absolute path is configured.", + "id": "PARTITION_TABLE_CUSTOM_FILENAME", + "name": "PARTITION_TABLE_CUSTOM_FILENAME", + "range": null, + "title": "Custom partition CSV file", + "type": "string" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "PARTITION_TABLE_FILENAME", + "name": "PARTITION_TABLE_FILENAME", + "range": null, + "title": null, + "type": "string" + }, + { + "children": [], + "depends_on": null, + "help": "The address of partition table (by default 0x8000).\nAllows you to move the partition table, it gives more space for the bootloader.\nNote that the bootloader and app will both need to be compiled with the same PARTITION_TABLE_OFFSET value.\n\nThis number should be a multiple of 0x1000.\n\nNote that partition offsets in the partition table CSV file may need to be changed if this value is set to\na higher value. To have each partition offset adapt to the configured partition table offset, leave all\npartition offsets blank in the CSV file.", + "id": "PARTITION_TABLE_OFFSET", + "name": "PARTITION_TABLE_OFFSET", + "range": null, + "title": "Offset of partition table", + "type": "hex" + }, + { + "children": [], + "depends_on": "!APP_COMPATIBLE_PRE_V3_1_BOOTLOADERS && !IDF_TARGET_LINUX", + "help": "Generate an MD5 checksum for the partition table for protecting the\nintegrity of the table. The generation should be turned off for legacy\nbootloaders which cannot recognize the MD5 checksum in the partition\ntable.", + "id": "PARTITION_TABLE_MD5", + "name": "PARTITION_TABLE_MD5", + "range": null, + "title": "Generate an MD5 checksum for the partition table", + "type": "bool" + } + ], + "depends_on": null, + "id": "partition-table", + "title": "Partition Table", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "COMPILER_OPTIMIZATION_DEBUG", + "name": "COMPILER_OPTIMIZATION_DEBUG", + "range": null, + "title": "Debug (-Og)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "COMPILER_OPTIMIZATION_SIZE", + "name": "COMPILER_OPTIMIZATION_SIZE", + "range": null, + "title": "Optimize for size (-Os with GCC, -Oz with Clang)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "COMPILER_OPTIMIZATION_PERF", + "name": "COMPILER_OPTIMIZATION_PERF", + "range": null, + "title": "Optimize for performance (-O2)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "COMPILER_OPTIMIZATION_NONE", + "name": "COMPILER_OPTIMIZATION_NONE", + "range": null, + "title": "Debug without optimization (-O0)", + "type": "bool" + } + ], + "depends_on": null, + "help": "This option sets compiler optimization level (gcc -O argument) for the app.\n\n- The \"Debug\" setting will add the -Og flag to CFLAGS.\n- The \"Size\" setting will add the -Os flag to CFLAGS (-Oz with Clang).\n- The \"Performance\" setting will add the -O2 flag to CFLAGS.\n- The \"None\" setting will add the -O0 flag to CFLAGS.\n\nThe \"Size\" setting cause the compiled code to be smaller and faster, but\nmay lead to difficulties of correlating code addresses to source file\nlines when debugging.\n\nThe \"Performance\" setting causes the compiled code to be larger and faster,\nbut will be easier to correlated code addresses to source file lines.\n\n\"None\" with -O0 produces compiled code without optimization.\n\nNote that custom optimization levels may be unsupported.\n\nCompiler optimization for the IDF bootloader is set separately,\nsee the BOOTLOADER_COMPILER_OPTIMIZATION setting.", + "id": "compiler-options-optimization-level", + "name": "COMPILER_OPTIMIZATION", + "title": "Optimization Level", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": "Enable assertions. Assertion content and line number will be printed on failure.", + "id": "COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE", + "name": "COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE", + "range": null, + "title": "Enabled", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "Enable silent assertions. Failed assertions will abort(), user needs to\nuse the aborting address to find the line number with the failed assertion.", + "id": "COMPILER_OPTIMIZATION_ASSERTIONS_SILENT", + "name": "COMPILER_OPTIMIZATION_ASSERTIONS_SILENT", + "range": null, + "title": "Silent (saves code size)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "If assertions are disabled, -DNDEBUG is added to CPPFLAGS.", + "id": "COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE", + "name": "COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE", + "range": null, + "title": "Disabled (sets -DNDEBUG)", + "type": "bool" + } + ], + "depends_on": null, + "help": "Assertions can be:\n\n- Enabled. Failure will print verbose assertion details. This is the default.\n\n- Set to \"silent\" to save code size (failed assertions will abort() but user\n needs to use the aborting address to find the line number with the failed assertion.)\n\n- Disabled entirely (not recommended for most configurations.) -DNDEBUG is added\n to CPPFLAGS in this case.", + "id": "compiler-options-assertion-level", + "name": "COMPILER_OPTIMIZATION_ASSERTION_LEVEL", + "title": "Assertion level", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": "When NDEBUG is set, assert(X) will not cause code to trigger an assertion.\nWith this option set, assert(X) will still evaluate the expression X, though\nthe result will never cause an assertion. This means that if X is a function\nthen the function will be called.\n\nThis is not according to the standard, which states that the assert(X) should\nbe replaced with ((void)0) if NDEBUG is defined.\n\nIn ESP-IDF v6.0 the default behavior will change to \"no\" to be in line with the\nstandard.", + "id": "COMPILER_ASSERT_NDEBUG_EVALUATE", + "name": "COMPILER_ASSERT_NDEBUG_EVALUATE", + "range": null, + "title": "Enable the evaluation of the expression inside assert(X) when NDEBUG is set", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "COMPILER_FLOAT_LIB_FROM_GCCLIB", + "name": "COMPILER_FLOAT_LIB_FROM_GCCLIB", + "range": null, + "title": "libgcc", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_ROM_HAS_RVFPLIB && ", + "help": null, + "id": "COMPILER_FLOAT_LIB_FROM_RVFPLIB", + "name": "COMPILER_FLOAT_LIB_FROM_RVFPLIB", + "range": null, + "title": "librvfp", + "type": "bool" + } + ], + "depends_on": null, + "help": "In the soft-fp part of libgcc, riscv version is written in C,\nand handles all edge cases in IEEE754, which makes it larger\nand performance is slow.\n\nRVfplib is an optimized RISC-V library for FP arithmetic on 32-bit\ninteger processors, for single and double-precision FP.\nRVfplib is \"fast\", but it has a few exceptions from IEEE 754 compliance.", + "id": "compiler-options-compiler-float-lib-source", + "name": "COMPILER_FLOAT_LIB_FROM", + "title": "Compiler float lib source", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "COMPILER_OPTIMIZATION_ASSERTION_LEVEL", + "name": "COMPILER_OPTIMIZATION_ASSERTION_LEVEL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "If enabled, the error messages will be discarded in following check macros:\n- ESP_RETURN_ON_ERROR\n- ESP_EXIT_ON_ERROR\n- ESP_RETURN_ON_FALSE\n- ESP_EXIT_ON_FALSE", + "id": "COMPILER_OPTIMIZATION_CHECKS_SILENT", + "name": "COMPILER_OPTIMIZATION_CHECKS_SILENT", + "range": null, + "title": "Disable messages in ESP_RETURN_ON_* and ESP_EXIT_ON_* macros", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "When expanding the __FILE__ and __BASE_FILE__ macros, replace paths inside ESP-IDF\nwith paths relative to the placeholder string \"IDF\", and convert paths inside the\nproject directory to relative paths.\n\nThis allows building the project with assertions or other code that embeds file paths,\nwithout the binary containing the exact path to the IDF or project directories.\n\nThis option passes -fmacro-prefix-map options to the GCC command line. To replace additional\npaths in your binaries, modify the project CMakeLists.txt file to pass custom -fmacro-prefix-map or\n-ffile-prefix-map arguments.", + "id": "COMPILER_HIDE_PATHS_MACROS", + "is_menuconfig": true, + "name": "COMPILER_HIDE_PATHS_MACROS", + "range": null, + "title": "Replace ESP-IDF and project paths in binaries", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "COMPILER_CXX_EXCEPTIONS", + "help": "Size (in bytes) of the emergency memory pool for C++ exceptions. This pool will be used to allocate\nmemory for thrown exceptions when there is not enough memory on the heap.", + "id": "COMPILER_CXX_EXCEPTIONS_EMG_POOL_SIZE", + "name": "COMPILER_CXX_EXCEPTIONS_EMG_POOL_SIZE", + "range": null, + "title": "Emergency Pool Size", + "type": "int" + } + ], + "depends_on": null, + "help": "Enabling this option compiles all IDF C++ files with exception support enabled.\n\nDisabling this option disables C++ exception support in all compiled files, and any libstdc++ code\nwhich throws an exception will abort instead.\n\nEnabling this option currently adds an additional ~500 bytes of heap overhead\nwhen an exception is thrown in user code for the first time.", + "id": "COMPILER_CXX_EXCEPTIONS", + "is_menuconfig": true, + "name": "COMPILER_CXX_EXCEPTIONS", + "range": null, + "title": "Enable C++ exceptions", + "type": "menu" + }, + { + "children": [], + "depends_on": null, + "help": "Enabling this option compiles all C++ files with RTTI support enabled.\nThis increases binary size (typically by tens of kB) but allows using\ndynamic_cast conversion and typeid operator.", + "id": "COMPILER_CXX_RTTI", + "name": "COMPILER_CXX_RTTI", + "range": null, + "title": "Enable C++ run-time type info (RTTI)", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "COMPILER_STACK_CHECK_MODE_NONE", + "name": "COMPILER_STACK_CHECK_MODE_NONE", + "range": null, + "title": "None", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "COMPILER_STACK_CHECK_MODE_NORM", + "name": "COMPILER_STACK_CHECK_MODE_NORM", + "range": null, + "title": "Normal", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "COMPILER_STACK_CHECK_MODE_STRONG", + "name": "COMPILER_STACK_CHECK_MODE_STRONG", + "range": null, + "title": "Strong", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "COMPILER_STACK_CHECK_MODE_ALL", + "name": "COMPILER_STACK_CHECK_MODE_ALL", + "range": null, + "title": "Overall", + "type": "bool" + } + ], + "depends_on": null, + "help": "Stack smashing protection mode. Emit extra code to check for buffer overflows, such as stack\nsmashing attacks. This is done by adding a guard variable to functions with vulnerable objects.\nThe guards are initialized when a function is entered and then checked when the function exits.\nIf a guard check fails, program is halted. Protection has the following modes:\n\n- In NORMAL mode (GCC flag: -fstack-protector) only functions that call alloca, and functions with\n buffers larger than 8 bytes are protected.\n\n- STRONG mode (GCC flag: -fstack-protector-strong) is like NORMAL, but includes additional functions\n to be protected -- those that have local array definitions, or have references to local frame\n addresses.\n\n- In OVERALL mode (GCC flag: -fstack-protector-all) all functions are protected.\n\nModes have the following impact on code performance and coverage:\n\n- performance: NORMAL > STRONG > OVERALL\n\n- coverage: NORMAL < STRONG < OVERALL\n\nThe performance impact includes increasing the amount of stack memory required for each task.", + "id": "compiler-options-stack-smashing-protection-mode", + "name": "COMPILER_STACK_CHECK_MODE", + "title": "Stack smashing protection mode", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": "Stack smashing protection.", + "id": "COMPILER_STACK_CHECK", + "name": "COMPILER_STACK_CHECK", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "IDF_TOOLCHAIN_GCC", + "help": "Disable merging identical constants (string/floating-point) across compilation units.\nThis helps in better size analysis of the application binary as the rodata section\ndistribution is more uniform across libraries. On downside, it may increase\nthe binary size and hence should be used during development phase only.", + "id": "COMPILER_NO_MERGE_CONSTANTS", + "name": "COMPILER_NO_MERGE_CONSTANTS", + "range": null, + "title": "Disable merging const sections", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Adds -Wwrite-strings flag for the C/C++ compilers.\n\nFor C, this gives string constants the type ``const char[]`` so that\ncopying the address of one into a non-const ``char *`` pointer\nproduces a warning. This warning helps to find at compile time code\nthat tries to write into a string constant.\n\nFor C++, this warns about the deprecated conversion from string\nliterals to ``char *``.", + "id": "COMPILER_WARN_WRITE_STRINGS", + "name": "COMPILER_WARN_WRITE_STRINGS", + "range": null, + "title": "Enable -Wwrite-strings warning flag", + "type": "bool" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ARCH_RISCV", + "help": "Adds -msave-restore to C/C++ compilation flags.\n\nWhen this flag is enabled, compiler will call library functions to\nsave/restore registers in function prologues/epilogues. This results\nin lower overall code size, at the expense of slightly reduced performance.\n\nThis option can be enabled for RISC-V targets only.", + "id": "COMPILER_SAVE_RESTORE_LIBCALLS", + "name": "COMPILER_SAVE_RESTORE_LIBCALLS", + "range": null, + "title": "Enable -msave-restore flag to reduce code size", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enable this option if you do not want default warnings to be considered as errors,\nespecially when updating IDF.\n\nThis is a temporary flag that could help to allow upgrade while having\nsome time to address the warnings raised by those default warnings.\nAlternatives are:\n1) fix code (preferred),\n2) remove specific warnings,\n3) do not consider specific warnings as error.", + "id": "COMPILER_DISABLE_DEFAULT_ERRORS", + "name": "COMPILER_DISABLE_DEFAULT_ERRORS", + "range": null, + "title": "Disable errors for default warnings", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enable this option if use GCC 12 or newer, and want to disable warnings which don't appear with\nGCC 11.", + "id": "COMPILER_DISABLE_GCC12_WARNINGS", + "name": "COMPILER_DISABLE_GCC12_WARNINGS", + "range": null, + "title": "Disable new warnings introduced in GCC 12", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enable this option if use GCC 13 or newer, and want to disable warnings which don't appear with\nGCC 12.", + "id": "COMPILER_DISABLE_GCC13_WARNINGS", + "name": "COMPILER_DISABLE_GCC13_WARNINGS", + "range": null, + "title": "Disable new warnings introduced in GCC 13", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enable this option if use GCC 14 or newer, and want to disable warnings which don't appear with\nGCC 13.", + "id": "COMPILER_DISABLE_GCC14_WARNINGS", + "name": "COMPILER_DISABLE_GCC14_WARNINGS", + "range": null, + "title": "Disable new warnings introduced in GCC 14", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "If enabled, RTL files will be produced during compilation. These files\ncan be used by other tools, for example to calculate call graphs.", + "id": "COMPILER_DUMP_RTL_FILES", + "name": "COMPILER_DUMP_RTL_FILES", + "range": null, + "title": "Dump RTL files during compilation", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "!IDF_TARGET_LINUX && ", + "help": null, + "id": "COMPILER_RT_LIB_GCCLIB", + "name": "COMPILER_RT_LIB_GCCLIB", + "range": null, + "title": "libgcc", + "type": "bool" + }, + { + "children": [], + "depends_on": "IDF_TOOLCHAIN_CLANG && !IDF_TARGET_LINUX && ", + "help": null, + "id": "COMPILER_RT_LIB_CLANGRT", + "name": "COMPILER_RT_LIB_CLANGRT", + "range": null, + "title": "libclang_rt", + "type": "bool" + }, + { + "children": [], + "depends_on": "IDF_TARGET_LINUX && ", + "help": null, + "id": "COMPILER_RT_LIB_HOST", + "name": "COMPILER_RT_LIB_HOST", + "range": null, + "title": "Host", + "type": "bool" + } + ], + "depends_on": null, + "help": "Select runtime library to be used by compiler.\n- GCC toolchain supports libgcc only.\n- Clang allows to choose between libgcc or libclang_rt.\n- For host builds (\"linux\" target), uses the default library.", + "id": "compiler-options-compiler-runtime-library", + "name": "COMPILER_RT_LIB", + "title": "Compiler runtime library", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "COMPILER_RT_LIB_NAME", + "name": "COMPILER_RT_LIB_NAME", + "range": null, + "title": null, + "type": "string" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": "Places orphan sections with a warning message.", + "id": "COMPILER_ORPHAN_SECTIONS_WARNING", + "name": "COMPILER_ORPHAN_SECTIONS_WARNING", + "range": null, + "title": "Place with warning", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "Places orphan sections without a warning/error message.", + "id": "COMPILER_ORPHAN_SECTIONS_PLACE", + "name": "COMPILER_ORPHAN_SECTIONS_PLACE", + "range": null, + "title": "Place silently", + "type": "bool" + } + ], + "depends_on": "!IDF_TARGET_LINUX", + "help": "If the linker finds orphan sections, it attempts to place orphan sections after sections of the same\nattribute such as code vs data, loadable vs non-loadable, etc.\nThat means that orphan sections could placed between sections defined in IDF linker scripts.\nThis could lead to corruption of the binary image. Configure the linker action here.", + "id": "compiler-options-orphan-sections-handling", + "name": "COMPILER_ORPHAN_SECTIONS", + "title": "Orphan sections handling", + "type": "choice" + }, + { + "children": [], + "depends_on": "IDF_TOOLCHAIN_GCC", + "help": "Enable compiler static analyzer. This may produce false-positive results and increases compile time.", + "id": "COMPILER_STATIC_ANALYZER", + "name": "COMPILER_STATIC_ANALYZER", + "range": null, + "title": "Enable compiler static analyzer", + "type": "bool" + } + ], + "depends_on": null, + "id": "compiler-options", + "title": "Compiler options", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "APPTRACE_DEST_JTAG", + "name": "APPTRACE_DEST_JTAG", + "range": null, + "title": "JTAG", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "APPTRACE_DEST_NONE", + "name": "APPTRACE_DEST_NONE", + "range": null, + "title": "None", + "type": "bool" + } + ], + "depends_on": null, + "help": "Select destination for application trace: JTAG or none (to disable).", + "id": "component-config-application-level-tracing-data-destination-1", + "name": "APPTRACE_DESTINATION1", + "title": "Data Destination 1", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "APPTRACE_DEST_UART", + "name": "APPTRACE_DEST_UART", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "APPTRACE_DEST_UART_NOUSB", + "name": "APPTRACE_DEST_UART_NOUSB", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_CONSOLE_UART_NUM != 0 && ", + "help": null, + "id": "APPTRACE_DEST_UART0", + "name": "APPTRACE_DEST_UART0", + "range": null, + "title": "UART0", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_CONSOLE_UART_NUM != 1 && ", + "help": null, + "id": "APPTRACE_DEST_UART1", + "name": "APPTRACE_DEST_UART1", + "range": null, + "title": "UART1", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_CONSOLE_UART_NUM != 2 && SOC_UART_NUM > 2 && ", + "help": null, + "id": "APPTRACE_DEST_UART2", + "name": "APPTRACE_DEST_UART2", + "range": null, + "title": "UART2", + "type": "bool" + }, + { + "children": [], + "depends_on": "!ESP_CONSOLE_USB_CDC && (IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32S3) && !USB_ENABLED && ", + "help": null, + "id": "APPTRACE_DEST_USB_CDC", + "name": "APPTRACE_DEST_USB_CDC", + "range": null, + "title": "USB_CDC", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "APPTRACE_DEST_UART_NONE", + "name": "APPTRACE_DEST_UART_NONE", + "range": null, + "title": "None", + "type": "bool" + } + ], + "depends_on": null, + "help": "Select destination for application trace: UART(XX) or none (to disable).", + "id": "component-config-application-level-tracing-data-destination-2", + "name": "APPTRACE_DESTINATION2", + "title": "Data Destination 2", + "type": "choice" + }, + { + "children": [], + "depends_on": "APPTRACE_DEST_UART_NOUSB", + "help": "This GPIO is used for UART TX pin.", + "id": "APPTRACE_UART_TX_GPIO", + "name": "APPTRACE_UART_TX_GPIO", + "range": null, + "title": "UART TX on GPIO", + "type": "int" + }, + { + "children": [], + "depends_on": "APPTRACE_DEST_UART_NOUSB", + "help": "This GPIO is used for UART RX pin.", + "id": "APPTRACE_UART_RX_GPIO", + "name": "APPTRACE_UART_RX_GPIO", + "range": null, + "title": "UART RX on GPIO", + "type": "int" + }, + { + "children": [], + "depends_on": "APPTRACE_DEST_UART", + "help": "This baud rate is used for UART.\n\nThe app's maximum baud rate depends on the UART clock source. If Power Management is disabled,\nthe UART clock source is the APB clock and all baud rates in the available range will be sufficiently\naccurate. If Power Management is enabled, REF_TICK clock source is used so the baud rate is divided\nfrom 1MHz. Baud rates above 1Mbps are not possible and values between 500Kbps and 1Mbps may not be\naccurate.", + "id": "APPTRACE_UART_BAUDRATE", + "name": "APPTRACE_UART_BAUDRATE", + "range": null, + "title": "UART baud rate", + "type": "int" + }, + { + "children": [], + "depends_on": "APPTRACE_DEST_UART", + "help": "Size of the UART input ring buffer.\nThis size related to the baudrate, system tick frequency and amount of data to transfer.\nThe data placed to this buffer before sent out to the interface.", + "id": "APPTRACE_UART_RX_BUFF_SIZE", + "name": "APPTRACE_UART_RX_BUFF_SIZE", + "range": null, + "title": "UART RX ring buffer size", + "type": "int" + }, + { + "children": [], + "depends_on": "APPTRACE_DEST_UART", + "help": "Size of the UART output ring buffer.\nThis size related to the baudrate, system tick frequency and amount of data to transfer.", + "id": "APPTRACE_UART_TX_BUFF_SIZE", + "name": "APPTRACE_UART_TX_BUFF_SIZE", + "range": null, + "title": "UART TX ring buffer size", + "type": "int" + }, + { + "children": [], + "depends_on": "APPTRACE_DEST_UART", + "help": "Maximum size of the single message to transfer.", + "id": "APPTRACE_UART_TX_MSG_SIZE", + "name": "APPTRACE_UART_TX_MSG_SIZE", + "range": null, + "title": "UART TX message size", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "UART task priority. In case of high events rate,\nthis parameter could be changed up to (configMAX_PRIORITIES-1).", + "id": "APPTRACE_UART_TASK_PRIO", + "name": "APPTRACE_UART_TASK_PRIO", + "range": [ + 1, + 32 + ], + "title": "UART Task Priority", + "type": "int" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ARCH_XTENSA && !ESP32_TRAX && !ESP32S2_TRAX && !ESP32S3_TRAX", + "help": "Enables/disable TRAX tracing HW.", + "id": "APPTRACE_DEST_TRAX", + "name": "APPTRACE_DEST_TRAX", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enables/disable swapping memory buffers tracing protocol.", + "id": "APPTRACE_MEMBUFS_APPTRACE_PROTO_ENABLE", + "name": "APPTRACE_MEMBUFS_APPTRACE_PROTO_ENABLE", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enables/disable application tracing module.", + "id": "APPTRACE_ENABLE", + "name": "APPTRACE_ENABLE", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enables/disable application tracing module internal sync lock.", + "id": "APPTRACE_LOCK_ENABLE", + "name": "APPTRACE_LOCK_ENABLE", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "APPTRACE_ENABLE", + "help": "Timeout for flushing last trace data to host in case of panic. In ms.\nUse -1 to disable timeout and wait forever.", + "id": "APPTRACE_ONPANIC_HOST_FLUSH_TMO", + "name": "APPTRACE_ONPANIC_HOST_FLUSH_TMO", + "range": null, + "title": "Timeout for flushing last trace data to host on panic", + "type": "int" + }, + { + "children": [], + "depends_on": "APPTRACE_ENABLE", + "help": "Threshold for flushing last trace data to host on panic in post-mortem mode.\nThis is minimal amount of data needed to perform flush. In bytes.", + "id": "APPTRACE_POSTMORTEM_FLUSH_THRESH", + "name": "APPTRACE_POSTMORTEM_FLUSH_THRESH", + "range": null, + "title": "Threshold for flushing last trace data to host on panic", + "type": "int" + }, + { + "children": [], + "depends_on": "APPTRACE_MEMBUFS_APPTRACE_PROTO_ENABLE && !APPTRACE_DEST_TRAX", + "help": "Size of the memory buffer for trace data in bytes.", + "id": "APPTRACE_BUF_SIZE", + "name": "APPTRACE_BUF_SIZE", + "range": null, + "title": "Size of the apptrace buffer", + "type": "int" + }, + { + "children": [], + "depends_on": "APPTRACE_MEMBUFS_APPTRACE_PROTO_ENABLE", + "help": "Size of the buffer for events in bytes. It is useful for buffering events from\nthe time critical code (scheduler, ISRs etc). If this parameter is 0 then\nevents will be discarded when main HW buffer is full.", + "id": "APPTRACE_PENDING_DATA_SIZE_MAX", + "name": "APPTRACE_PENDING_DATA_SIZE_MAX", + "range": null, + "title": "Size of the pending data buffer", + "type": "int" + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "!PM_ENABLE && !APPTRACE_DEST_NONE && ", + "help": "Send SEGGER SystemView events through JTAG interface.", + "id": "APPTRACE_SV_DEST_JTAG", + "name": "APPTRACE_SV_DEST_JTAG", + "range": null, + "title": "Data destination JTAG", + "type": "bool" + }, + { + "children": [], + "depends_on": "APPTRACE_DEST_UART && ", + "help": "Send SEGGER SystemView events through UART interface.", + "id": "APPTRACE_SV_DEST_UART", + "name": "APPTRACE_SV_DEST_UART", + "range": null, + "title": "Data destination UART", + "type": "bool" + } + ], + "depends_on": "APPTRACE_SV_ENABLE && APPTRACE_ENABLE", + "help": "SystemView will transfer data through the defined interface.", + "id": "component-config-application-level-tracing-freertos-systemview-tracing-systemview-tracing-enable-systemview-destination", + "name": "APPTRACE_SV_DEST", + "title": "SystemView destination", + "type": "choice" + } + ], + "depends_on": "APPTRACE_ENABLE && APPTRACE_ENABLE", + "help": "Enables supporrt for SEGGER SystemView tracing functionality.", + "id": "APPTRACE_SV_ENABLE", + "name": "APPTRACE_SV_ENABLE", + "range": null, + "title": "SystemView Tracing Enable", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": "Send SEGGER SystemView events for Pro CPU.", + "id": "APPTRACE_SV_DEST_CPU_0", + "name": "APPTRACE_SV_DEST_CPU_0", + "range": null, + "title": "CPU0", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "Send SEGGER SystemView events for App CPU.", + "id": "APPTRACE_SV_DEST_CPU_1", + "name": "APPTRACE_SV_DEST_CPU_1", + "range": null, + "title": "CPU1", + "type": "bool" + } + ], + "depends_on": "APPTRACE_SV_DEST_UART && !ESP_SYSTEM_SINGLE_CORE_MODE && APPTRACE_ENABLE", + "help": "Define the CPU to trace by SystemView.", + "id": "component-config-application-level-tracing-freertos-systemview-tracing-cpu-to-trace", + "name": "APPTRACE_SV_CPU", + "title": "CPU to trace", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_SYSTEM_SINGLE_CORE_MODE && !PM_ENABLE && !IDF_TARGET_ESP32C3 && ", + "help": null, + "id": "APPTRACE_SV_TS_SOURCE_CCOUNT", + "name": "APPTRACE_SV_TS_SOURCE_CCOUNT", + "range": null, + "title": "CPU cycle counter (CCOUNT)", + "type": "bool" + }, + { + "children": [], + "depends_on": "!PM_ENABLE && !IDF_TARGET_ESP32C3 && ", + "help": null, + "id": "APPTRACE_SV_TS_SOURCE_GPTIMER", + "name": "APPTRACE_SV_TS_SOURCE_GPTIMER", + "range": null, + "title": "General Purpose Timer (Timer Group)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "APPTRACE_SV_TS_SOURCE_ESP_TIMER", + "name": "APPTRACE_SV_TS_SOURCE_ESP_TIMER", + "range": null, + "title": "esp_timer high resolution timer", + "type": "bool" + } + ], + "depends_on": "APPTRACE_SV_ENABLE && APPTRACE_ENABLE", + "help": "SystemView needs to use a hardware timer as the source of timestamps\nwhen tracing. This option selects the timer for it.", + "id": "component-config-application-level-tracing-freertos-systemview-tracing-timer-to-use-as-timestamp-source", + "name": "APPTRACE_SV_TS_SOURCE", + "title": "Timer to use as timestamp source", + "type": "choice" + }, + { + "children": [], + "depends_on": "APPTRACE_SV_ENABLE && APPTRACE_ENABLE", + "help": "Configures maximum supported tasks in sysview debug", + "id": "APPTRACE_SV_MAX_TASKS", + "name": "APPTRACE_SV_MAX_TASKS", + "range": null, + "title": "Maximum supported tasks", + "type": "int" + }, + { + "children": [], + "depends_on": "APPTRACE_SV_ENABLE && APPTRACE_ENABLE", + "help": "Configures timeout (in us) to wait for free space in trace buffer.\nSet to -1 to wait forever and avoid lost events.", + "id": "APPTRACE_SV_BUF_WAIT_TMO", + "name": "APPTRACE_SV_BUF_WAIT_TMO", + "range": null, + "title": "Trace buffer wait timeout", + "type": "int" + }, + { + "children": [], + "depends_on": "APPTRACE_SV_ENABLE && APPTRACE_ENABLE", + "help": "Enables \"Trace Buffer Overflow\" event.", + "id": "APPTRACE_SV_EVT_OVERFLOW_ENABLE", + "name": "APPTRACE_SV_EVT_OVERFLOW_ENABLE", + "range": null, + "title": "Trace Buffer Overflow Event", + "type": "bool" + }, + { + "children": [], + "depends_on": "APPTRACE_SV_ENABLE && APPTRACE_ENABLE", + "help": "Enables \"ISR Enter\" event.", + "id": "APPTRACE_SV_EVT_ISR_ENTER_ENABLE", + "name": "APPTRACE_SV_EVT_ISR_ENTER_ENABLE", + "range": null, + "title": "ISR Enter Event", + "type": "bool" + }, + { + "children": [], + "depends_on": "APPTRACE_SV_ENABLE && APPTRACE_ENABLE", + "help": "Enables \"ISR Exit\" event.", + "id": "APPTRACE_SV_EVT_ISR_EXIT_ENABLE", + "name": "APPTRACE_SV_EVT_ISR_EXIT_ENABLE", + "range": null, + "title": "ISR Exit Event", + "type": "bool" + }, + { + "children": [], + "depends_on": "APPTRACE_SV_ENABLE && APPTRACE_ENABLE", + "help": "Enables \"ISR to Scheduler\" event.", + "id": "APPTRACE_SV_EVT_ISR_TO_SCHED_ENABLE", + "name": "APPTRACE_SV_EVT_ISR_TO_SCHED_ENABLE", + "range": null, + "title": "ISR Exit to Scheduler Event", + "type": "bool" + }, + { + "children": [], + "depends_on": "APPTRACE_SV_ENABLE && APPTRACE_ENABLE", + "help": "Enables \"Task Start Execution\" event.", + "id": "APPTRACE_SV_EVT_TASK_START_EXEC_ENABLE", + "name": "APPTRACE_SV_EVT_TASK_START_EXEC_ENABLE", + "range": null, + "title": "Task Start Execution Event", + "type": "bool" + }, + { + "children": [], + "depends_on": "APPTRACE_SV_ENABLE && APPTRACE_ENABLE", + "help": "Enables \"Task Stop Execution\" event.", + "id": "APPTRACE_SV_EVT_TASK_STOP_EXEC_ENABLE", + "name": "APPTRACE_SV_EVT_TASK_STOP_EXEC_ENABLE", + "range": null, + "title": "Task Stop Execution Event", + "type": "bool" + }, + { + "children": [], + "depends_on": "APPTRACE_SV_ENABLE && APPTRACE_ENABLE", + "help": "Enables \"Task Start Ready State\" event.", + "id": "APPTRACE_SV_EVT_TASK_START_READY_ENABLE", + "name": "APPTRACE_SV_EVT_TASK_START_READY_ENABLE", + "range": null, + "title": "Task Start Ready State Event", + "type": "bool" + }, + { + "children": [], + "depends_on": "APPTRACE_SV_ENABLE && APPTRACE_ENABLE", + "help": "Enables \"Task Stop Ready State\" event.", + "id": "APPTRACE_SV_EVT_TASK_STOP_READY_ENABLE", + "name": "APPTRACE_SV_EVT_TASK_STOP_READY_ENABLE", + "range": null, + "title": "Task Stop Ready State Event", + "type": "bool" + }, + { + "children": [], + "depends_on": "APPTRACE_SV_ENABLE && APPTRACE_ENABLE", + "help": "Enables \"Task Create\" event.", + "id": "APPTRACE_SV_EVT_TASK_CREATE_ENABLE", + "name": "APPTRACE_SV_EVT_TASK_CREATE_ENABLE", + "range": null, + "title": "Task Create Event", + "type": "bool" + }, + { + "children": [], + "depends_on": "APPTRACE_SV_ENABLE && APPTRACE_ENABLE", + "help": "Enables \"Task Terminate\" event.", + "id": "APPTRACE_SV_EVT_TASK_TERMINATE_ENABLE", + "name": "APPTRACE_SV_EVT_TASK_TERMINATE_ENABLE", + "range": null, + "title": "Task Terminate Event", + "type": "bool" + }, + { + "children": [], + "depends_on": "APPTRACE_SV_ENABLE && APPTRACE_ENABLE", + "help": "Enables \"System Idle\" event.", + "id": "APPTRACE_SV_EVT_IDLE_ENABLE", + "name": "APPTRACE_SV_EVT_IDLE_ENABLE", + "range": null, + "title": "System Idle Event", + "type": "bool" + }, + { + "children": [], + "depends_on": "APPTRACE_SV_ENABLE && APPTRACE_ENABLE", + "help": "Enables \"Timer Enter\" event.", + "id": "APPTRACE_SV_EVT_TIMER_ENTER_ENABLE", + "name": "APPTRACE_SV_EVT_TIMER_ENTER_ENABLE", + "range": null, + "title": "Timer Enter Event", + "type": "bool" + }, + { + "children": [], + "depends_on": "APPTRACE_SV_ENABLE && APPTRACE_ENABLE", + "help": "Enables \"Timer Exit\" event.", + "id": "APPTRACE_SV_EVT_TIMER_EXIT_ENABLE", + "name": "APPTRACE_SV_EVT_TIMER_EXIT_ENABLE", + "range": null, + "title": "Timer Exit Event", + "type": "bool" + } + ], + "depends_on": "APPTRACE_ENABLE", + "id": "component-config-application-level-tracing-freertos-systemview-tracing", + "title": "FreeRTOS SystemView Tracing", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "APPTRACE_GCOV_ENABLE", + "help": "Configures stack size of Gcov dump task", + "id": "APPTRACE_GCOV_DUMP_TASK_STACK_SIZE", + "name": "APPTRACE_GCOV_DUMP_TASK_STACK_SIZE", + "range": null, + "title": "Gcov dump task stack size", + "type": "int" + } + ], + "depends_on": "APPTRACE_ENABLE && !APPTRACE_SV_ENABLE", + "help": "Enables support for GCOV data transfer to host.", + "id": "APPTRACE_GCOV_ENABLE", + "name": "APPTRACE_GCOV_ENABLE", + "range": null, + "title": "GCOV to Host Enable", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-application-level-tracing", + "title": "Application Level Tracing", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": "This option is recommended for classic Bluetooth or for dual-mode\nusecases", + "id": "BT_BLUEDROID_ENABLED", + "name": "BT_BLUEDROID_ENABLED", + "range": null, + "title": "Bluedroid - Dual-mode", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "This option is recommended for BLE only usecases to save on memory", + "id": "BT_NIMBLE_ENABLED", + "name": "BT_NIMBLE_ENABLED", + "range": null, + "title": "NimBLE - BLE only", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_BT_SUPPORTED && ", + "help": "This option is recommended when you want to communicate directly with the\ncontroller (without any host) or when you are using any other host stack\nnot supported by Espressif (not mentioned here).", + "id": "BT_CONTROLLER_ONLY", + "name": "BT_CONTROLLER_ONLY", + "range": null, + "title": "Disabled", + "type": "bool" + } + ], + "depends_on": "BT_ENABLED", + "help": "This helps to choose Bluetooth host stack", + "id": "component-config-bluetooth-bluetooth-host", + "name": "BT_HOST", + "title": "Host", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_BT_SUPPORTED && ", + "help": "This option is recommended for Bluetooth controller usecases", + "id": "BT_CONTROLLER_ENABLED", + "name": "BT_CONTROLLER_ENABLED", + "range": null, + "title": "Enabled", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "This option is recommended for Bluetooth Host only usecases", + "id": "BT_CONTROLLER_DISABLED", + "name": "BT_CONTROLLER_DISABLED", + "range": null, + "title": "Disabled", + "type": "bool" + } + ], + "depends_on": "BT_ENABLED", + "help": "This helps to choose Bluetooth controller stack", + "id": "component-config-bluetooth-bluetooth-controller", + "name": "BT_CONTROLLER", + "title": "Controller", + "type": "choice" + } + ], + "depends_on": "!APP_NO_BLOBS", + "help": "Select this option to enable Bluetooth and show the submenu with Bluetooth configuration choices.", + "id": "BT_ENABLED", + "name": "BT_ENABLED", + "range": null, + "title": "Bluetooth", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED", + "help": "This select btc task stack size", + "id": "BT_BTC_TASK_STACK_SIZE", + "name": "BT_BTC_TASK_STACK_SIZE", + "range": null, + "title": "Bluetooth event (callback to application) task stack size", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_BLUEDROID_PINNED_TO_CORE_0", + "name": "BT_BLUEDROID_PINNED_TO_CORE_0", + "range": null, + "title": "Core 0 (PRO CPU)", + "type": "bool" + }, + { + "children": [], + "depends_on": "!FREERTOS_UNICORE && ", + "help": null, + "id": "BT_BLUEDROID_PINNED_TO_CORE_1", + "name": "BT_BLUEDROID_PINNED_TO_CORE_1", + "range": null, + "title": "Core 1 (APP CPU)", + "type": "bool" + } + ], + "depends_on": "BT_BLUEDROID_ENABLED && !FREERTOS_UNICORE && BT_BLUEDROID_ENABLED", + "help": "Which the cpu core to run Bluedroid. Can choose core0 and core1.\nCan not specify no-affinity.", + "id": "component-config-bluetooth-bluedroid-options-the-cpu-core-which-bluedroid-run", + "name": "BT_BLUEDROID_PINNED_TO_CORE_CHOICE", + "title": "The cpu core which Bluedroid run", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED", + "help": null, + "id": "BT_BLUEDROID_PINNED_TO_CORE", + "name": "BT_BLUEDROID_PINNED_TO_CORE", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED", + "help": "This select btu task stack size", + "id": "BT_BTU_TASK_STACK_SIZE", + "name": "BT_BTU_TASK_STACK_SIZE", + "range": null, + "title": "Bluetooth Bluedroid Host Stack task stack size", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED", + "help": "Bluedroid memory debug", + "id": "BT_BLUEDROID_MEM_DEBUG", + "name": "BT_BLUEDROID_MEM_DEBUG", + "range": null, + "title": "Bluedroid memory debug", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED", + "help": "Enable Espressif Vendor-specific HCI commands for coexist status configuration", + "id": "BT_BLUEDROID_ESP_COEX_VSC", + "name": "BT_BLUEDROID_ESP_COEX_VSC", + "range": null, + "title": "Enable Espressif Vendor-specific HCI commands for coexist status configuration", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "(BT_CONTROLLER_DISABLED || (BT_CONTROLLER_ENABLED && SOC_BT_H2C_ENC_KEY_CTRL_ENH_STD_SUPPORTED)) && ", + "help": null, + "id": "BT_ENC_KEY_SIZE_CTRL_STD", + "name": "BT_ENC_KEY_SIZE_CTRL_STD", + "range": null, + "title": "Supported by standard HCI command", + "type": "bool" + }, + { + "children": [], + "depends_on": "(BT_CONTROLLER_DISABLED || (BT_CONTROLLER_ENABLED && SOC_BT_H2C_ENC_KEY_CTRL_ENH_VSC_SUPPORTED)) && ", + "help": null, + "id": "BT_ENC_KEY_SIZE_CTRL_VSC", + "name": "BT_ENC_KEY_SIZE_CTRL_VSC", + "range": null, + "title": "Supported by Vendor-specific HCI command", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_ENC_KEY_SIZE_CTRL_NONE", + "name": "BT_ENC_KEY_SIZE_CTRL_NONE", + "range": null, + "title": "Not supported", + "type": "bool" + } + ], + "depends_on": "BT_CLASSIC_ENABLED && BT_BLUEDROID_ENABLED", + "help": "This chooses the support status of configuring encryption key size", + "id": "component-config-bluetooth-bluedroid-options-classic-bluetooth-configure-encryption-key-size", + "name": "BT_ENC_KEY_SIZE_CTRL_ENABLED", + "title": "configure encryption key size", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_CLASSIC_ENABLED && BT_BLUEDROID_ENABLED", + "help": "This enables functionalities of Host qualification for Classic Bluetooth.", + "id": "BT_CLASSIC_BQB_ENABLED", + "name": "BT_CLASSIC_BQB_ENABLED", + "range": null, + "title": "Host Qualitifcation support for Classic Bluetooth", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BT_A2DP_ENABLE && BT_BLUEDROID_ENABLED", + "help": "Audio/Video Remote Control Profile, AVRCP and A2DP are coupled in Bluedroid,\nAVRCP still controlled by A2DP option, this is a dummy option currently", + "id": "BT_AVRCP_ENABLED", + "name": "BT_AVRCP_ENABLED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BT_AVRCP_ENABLED && BT_BLUEDROID_ENABLED", + "help": "This enable Cover Art feature of AVRCP CT role", + "id": "BT_AVRCP_CT_COVER_ART_ENABLED", + "name": "BT_AVRCP_CT_COVER_ART_ENABLED", + "range": null, + "title": "AVRCP CT Cover Art", + "type": "bool" + } + ], + "depends_on": "BT_AVRCP_ENABLED && BT_BLUEDROID_ENABLED", + "id": "component-config-bluetooth-bluedroid-options-classic-bluetooth-a2dp-avrcp-features", + "title": "AVRCP Features", + "type": "menu" + } + ], + "depends_on": "BT_CLASSIC_ENABLED && BT_BLUEDROID_ENABLED", + "help": "Advanced Audio Distribution Profile", + "id": "BT_A2DP_ENABLE", + "name": "BT_A2DP_ENABLE", + "range": null, + "title": "A2DP", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_CLASSIC_ENABLED && BT_BLUEDROID_ENABLED", + "help": "This enables the Serial Port Profile", + "id": "BT_SPP_ENABLED", + "name": "BT_SPP_ENABLED", + "range": null, + "title": "SPP", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_CLASSIC_ENABLED && BT_BLUEDROID_ENABLED", + "help": "This enables the Logical Link Control and Adaptation Layer Protocol.\nOnly supported classic bluetooth.", + "id": "BT_L2CAP_ENABLED", + "name": "BT_L2CAP_ENABLED", + "range": null, + "title": "BT L2CAP", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_CLASSIC_ENABLED && BT_BLUEDROID_ENABLED", + "help": "This enables common SDP operation, such as SDP record creation and deletion.", + "id": "BT_SDP_COMMON_ENABLED", + "name": "BT_SDP_COMMON_ENABLED", + "range": null, + "title": "BT SDP COMMON", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BT_HFP_ENABLE && BT_BLUEDROID_ENABLED", + "help": null, + "id": "BT_HFP_CLIENT_ENABLE", + "name": "BT_HFP_CLIENT_ENABLE", + "range": null, + "title": "Hands Free Unit", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_HFP_ENABLE && BT_BLUEDROID_ENABLED", + "help": null, + "id": "BT_HFP_AG_ENABLE", + "name": "BT_HFP_AG_ENABLE", + "range": null, + "title": "Audio Gateway", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_HFP_AUDIO_DATA_PATH_PCM", + "name": "BT_HFP_AUDIO_DATA_PATH_PCM", + "range": null, + "title": "PCM", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_HFP_AUDIO_DATA_PATH_HCI", + "name": "BT_HFP_AUDIO_DATA_PATH_HCI", + "range": null, + "title": "HCI", + "type": "bool" + } + ], + "depends_on": "BT_HFP_ENABLE && BT_BLUEDROID_ENABLED", + "help": "SCO data path, i.e. HCI or PCM. This option is set using API\n\"esp_bredr_sco_datapath_set\" in Bluetooth host. Default SCO data\npath can also be set in Bluetooth Controller.", + "id": "component-config-bluetooth-bluedroid-options-classic-bluetooth-hands-free-handset-profile-audio-sco-data-path", + "name": "BT_HFP_AUDIO_DATA_PATH", + "title": "audio(SCO) data path", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_HFP_ENABLE && BT_HFP_AUDIO_DATA_PATH_HCI && BT_BLUEDROID_ENABLED", + "help": "This enables Wide Band Speech. Should disable it when SCO data path is PCM.\nOtherwise there will be no data transmitted via GPIOs.", + "id": "BT_HFP_WBS_ENABLE", + "name": "BT_HFP_WBS_ENABLE", + "range": null, + "title": "Wide Band Speech", + "type": "bool" + } + ], + "depends_on": "BT_CLASSIC_ENABLED && BT_BLUEDROID_ENABLED", + "help": "Hands Free Unit and Audio Gateway can be included simultaneously\nbut they cannot run simultaneously due to internal limitations.", + "id": "BT_HFP_ENABLE", + "is_menuconfig": true, + "name": "BT_HFP_ENABLE", + "range": null, + "title": "Hands Free/Handset Profile", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "BT_HID_ENABLED && BT_BLUEDROID_ENABLED", + "help": "This enables the BT HID Host", + "id": "BT_HID_HOST_ENABLED", + "name": "BT_HID_HOST_ENABLED", + "range": null, + "title": "Classic BT HID Host", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_HID_ENABLED && BT_BLUEDROID_ENABLED", + "help": "This enables the BT HID Device", + "id": "BT_HID_DEVICE_ENABLED", + "name": "BT_HID_DEVICE_ENABLED", + "range": null, + "title": "Classic BT HID Device", + "type": "bool" + } + ], + "depends_on": "BT_CLASSIC_ENABLED && BT_BLUEDROID_ENABLED", + "help": "This enables the BT HID functionalities", + "id": "BT_HID_ENABLED", + "is_menuconfig": true, + "name": "BT_HID_ENABLED", + "range": null, + "title": "Classic BT HID", + "type": "menu" + }, + { + "children": [], + "depends_on": "BT_CLASSIC_ENABLED && BT_BLUEDROID_ENABLED", + "help": "This enables the BT GOEP Profile Client role", + "id": "BT_GOEPC_ENABLED", + "name": "BT_GOEPC_ENABLED", + "range": null, + "title": null, + "type": "bool" + } + ], + "depends_on": "BT_BLUEDROID_ENABLED && ((BT_CONTROLLER_ENABLED && SOC_BT_CLASSIC_SUPPORTED) || BT_CONTROLLER_DISABLED) && BT_BLUEDROID_ENABLED", + "help": "For now this option needs \"SMP_ENABLE\" to be set to yes", + "id": "BT_CLASSIC_ENABLED", + "name": "BT_CLASSIC_ENABLED", + "range": null, + "title": "Classic Bluetooth", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "BT_GATTS_ENABLE && BT_BLUEDROID_ENABLED", + "help": "This enables \"Peripheral Preferred Connection Parameters\" characteristic (UUID: 0x2A04) in GAP service that has\nconnection parameters like min/max connection interval, slave latency and supervision timeout multiplier", + "id": "BT_GATTS_PPCP_CHAR_GAP", + "name": "BT_GATTS_PPCP_CHAR_GAP", + "range": null, + "title": "Enable Peripheral Preferred Connection Parameters characteristic in GAP service", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_GATTS_ENABLE && BT_BLUEDROID_ENABLED", + "help": "This option can be close when the app does not require blufi function.", + "id": "BT_BLE_BLUFI_ENABLE", + "name": "BT_BLE_BLUFI_ENABLE", + "range": null, + "title": "Include blufi function", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_GATTS_ENABLE && BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED", + "help": "Maximum GATT Server Profiles Count", + "id": "BT_GATT_MAX_SR_PROFILES", + "name": "BT_GATT_MAX_SR_PROFILES", + "range": null, + "title": "Max GATT Server Profiles", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_GATTS_ENABLE && BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED", + "help": "Maximum GATT Service Attributes Count", + "id": "BT_GATT_MAX_SR_ATTRIBUTES", + "name": "BT_GATT_MAX_SR_ATTRIBUTES", + "range": null, + "title": "Max GATT Service Attributes", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": "Manually send service change indication through API esp_ble_gatts_send_service_change_indication()", + "id": "BT_GATTS_SEND_SERVICE_CHANGE_MANUAL", + "name": "BT_GATTS_SEND_SERVICE_CHANGE_MANUAL", + "range": null, + "title": "GATTS manually send service change indication", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "Let Bluedroid handle the service change indication internally", + "id": "BT_GATTS_SEND_SERVICE_CHANGE_AUTO", + "name": "BT_GATTS_SEND_SERVICE_CHANGE_AUTO", + "range": null, + "title": "GATTS automatically send service change indication", + "type": "bool" + } + ], + "depends_on": "BT_GATTS_ENABLE && BT_BLUEDROID_ENABLED", + "help": "Service change indication mode for GATT Server.", + "id": "component-config-bluetooth-bluedroid-options-bluetooth-low-energy-include-gatt-server-module-gatts--gatts-service-change-mode", + "name": "BT_GATTS_SEND_SERVICE_CHANGE_MODE", + "title": "GATTS Service Change Mode", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_GATTS_ENABLE && BT_BLUEDROID_ENABLED", + "help": null, + "id": "BT_GATTS_SEND_SERVICE_CHANGE_MODE", + "name": "BT_GATTS_SEND_SERVICE_CHANGE_MODE", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "BT_GATTS_ENABLE && BT_BLUEDROID_ENABLED", + "help": "This option enables the GATT robust caching feature on the server.\nif turned on, the Client Supported Features characteristic, Database Hash characteristic,\nand Server Supported Features characteristic will be included in the GAP SERVICE.", + "id": "BT_GATTS_ROBUST_CACHING_ENABLED", + "name": "BT_GATTS_ROBUST_CACHING_ENABLED", + "range": null, + "title": "Enable Robust Caching on Server Side", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_GATTS_ENABLE && BT_BLUEDROID_ENABLED", + "help": "Enabling this option allows remote GATT clients to write device name", + "id": "BT_GATTS_DEVICE_NAME_WRITABLE", + "name": "BT_GATTS_DEVICE_NAME_WRITABLE", + "range": null, + "title": "Allow to write device name by GATT clients", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_GATTS_ENABLE && BT_BLUEDROID_ENABLED", + "help": "Enabling this option allows remote GATT clients to write appearance", + "id": "BT_GATTS_APPEARANCE_WRITABLE", + "name": "BT_GATTS_APPEARANCE_WRITABLE", + "range": null, + "title": "Allow to write appearance by GATT clients", + "type": "bool" + } + ], + "depends_on": "BT_BLE_ENABLED && BT_BLUEDROID_ENABLED", + "help": "This option can be disabled when the app work only on gatt client mode", + "id": "BT_GATTS_ENABLE", + "name": "BT_GATTS_ENABLE", + "range": null, + "title": "Include GATT server module(GATTS)", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BT_GATTC_ENABLE && BT_BLUEDROID_ENABLED", + "help": "Maximum GATTC cache characteristic count", + "id": "BT_GATTC_MAX_CACHE_CHAR", + "name": "BT_GATTC_MAX_CACHE_CHAR", + "range": null, + "title": "Max gattc cache characteristic for discover", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_GATTC_ENABLE && BT_BLUEDROID_ENABLED", + "help": "Maximum GATTC notify(indication) register number", + "id": "BT_GATTC_NOTIF_REG_MAX", + "name": "BT_GATTC_NOTIF_REG_MAX", + "range": null, + "title": "Max gattc notify(indication) register number", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_GATTC_ENABLE && BT_BLUEDROID_ENABLED", + "help": "This select can save gattc cache data to nvs flash", + "id": "BT_GATTC_CACHE_NVS_FLASH", + "name": "BT_GATTC_CACHE_NVS_FLASH", + "range": null, + "title": "Save gattc cache data to nvs flash", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_GATTC_ENABLE && BT_BLUEDROID_ENABLED", + "help": "The number of attempts to reconnect if the connection establishment failed", + "id": "BT_GATTC_CONNECT_RETRY_COUNT", + "name": "BT_GATTC_CONNECT_RETRY_COUNT", + "range": null, + "title": "The number of attempts to reconnect if the connection establishment failed", + "type": "int" + } + ], + "depends_on": "BT_BLE_ENABLED && BT_BLUEDROID_ENABLED", + "help": "This option can be close when the app work only on gatt server mode", + "id": "BT_GATTC_ENABLE", + "name": "BT_GATTC_ENABLE", + "range": null, + "title": "Include GATT client module(GATTC)", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BT_BLE_SMP_ENABLE && BT_BLUEDROID_ENABLED", + "help": "In order to reduce the pairing time, slave actively initiates connection parameters\nupdate during pairing.", + "id": "BT_SMP_SLAVE_CON_PARAMS_UPD_ENABLE", + "name": "BT_SMP_SLAVE_CON_PARAMS_UPD_ENABLE", + "range": null, + "title": "Slave enable connection parameters update during pairing", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_BLE_SMP_ENABLE && BT_BLUEDROID_ENABLED", + "help": "There are tracking risks associated with using a fixed or static IRK.\nIf enabled this option, Bluedroid will assign a new randomly-generated IRK\nwhen all pairing and bonding records are deleted. This would decrease the ability\nof a previously paired peer to be used to determine whether a device\nwith which it previously shared an IRK is within range.", + "id": "BT_BLE_SMP_ID_RESET_ENABLE", + "name": "BT_BLE_SMP_ID_RESET_ENABLE", + "range": null, + "title": "Reset device identity when all bonding records are deleted", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_BLE_SMP_ENABLE && BT_BLUEDROID_ENABLED", + "help": "This select can save SMP bonding keys to nvs flash", + "id": "BT_BLE_SMP_BOND_NVS_FLASH", + "name": "BT_BLE_SMP_BOND_NVS_FLASH", + "range": null, + "title": "Save SMP bonding keys to nvs flash", + "type": "bool" + } + ], + "depends_on": "BT_BLE_ENABLED && BT_BLUEDROID_ENABLED", + "help": "This option can be close when the app not used the ble security connect.", + "id": "BT_BLE_SMP_ENABLE", + "name": "BT_BLE_SMP_ENABLE", + "range": null, + "title": "Include BLE security module(SMP)", + "type": "bool" + } + ], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED", + "help": "This enables Bluetooth Low Energy", + "id": "BT_BLE_ENABLED", + "name": "BT_BLE_ENABLED", + "range": null, + "title": "Bluetooth Low Energy", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED", + "help": "This select can save the rodata code size", + "id": "BT_STACK_NO_LOG", + "name": "BT_STACK_NO_LOG", + "range": null, + "title": "Disable BT debug logs (minimize bin size)", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_HCI_TRACE_LEVEL_NONE", + "name": "BT_LOG_HCI_TRACE_LEVEL_NONE", + "range": null, + "title": "NONE", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_HCI_TRACE_LEVEL_ERROR", + "name": "BT_LOG_HCI_TRACE_LEVEL_ERROR", + "range": null, + "title": "ERROR", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_HCI_TRACE_LEVEL_WARNING", + "name": "BT_LOG_HCI_TRACE_LEVEL_WARNING", + "range": null, + "title": "WARNING", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_HCI_TRACE_LEVEL_API", + "name": "BT_LOG_HCI_TRACE_LEVEL_API", + "range": null, + "title": "API", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_HCI_TRACE_LEVEL_EVENT", + "name": "BT_LOG_HCI_TRACE_LEVEL_EVENT", + "range": null, + "title": "EVENT", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_HCI_TRACE_LEVEL_DEBUG", + "name": "BT_LOG_HCI_TRACE_LEVEL_DEBUG", + "range": null, + "title": "DEBUG", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_HCI_TRACE_LEVEL_VERBOSE", + "name": "BT_LOG_HCI_TRACE_LEVEL_VERBOSE", + "range": null, + "title": "VERBOSE", + "type": "bool" + } + ], + "depends_on": "BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": "Define BT trace level for HCI layer", + "id": "component-config-bluetooth-bluedroid-options-bt-debug-log-level-hci-layer", + "name": "BT_LOG_HCI_TRACE_LEVEL", + "title": "HCI layer", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": null, + "id": "BT_LOG_HCI_TRACE_LEVEL", + "name": "BT_LOG_HCI_TRACE_LEVEL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BTM_TRACE_LEVEL_NONE", + "name": "BT_LOG_BTM_TRACE_LEVEL_NONE", + "range": null, + "title": "NONE", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BTM_TRACE_LEVEL_ERROR", + "name": "BT_LOG_BTM_TRACE_LEVEL_ERROR", + "range": null, + "title": "ERROR", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BTM_TRACE_LEVEL_WARNING", + "name": "BT_LOG_BTM_TRACE_LEVEL_WARNING", + "range": null, + "title": "WARNING", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BTM_TRACE_LEVEL_API", + "name": "BT_LOG_BTM_TRACE_LEVEL_API", + "range": null, + "title": "API", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BTM_TRACE_LEVEL_EVENT", + "name": "BT_LOG_BTM_TRACE_LEVEL_EVENT", + "range": null, + "title": "EVENT", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BTM_TRACE_LEVEL_DEBUG", + "name": "BT_LOG_BTM_TRACE_LEVEL_DEBUG", + "range": null, + "title": "DEBUG", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BTM_TRACE_LEVEL_VERBOSE", + "name": "BT_LOG_BTM_TRACE_LEVEL_VERBOSE", + "range": null, + "title": "VERBOSE", + "type": "bool" + } + ], + "depends_on": "BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": "Define BT trace level for BTM layer", + "id": "component-config-bluetooth-bluedroid-options-bt-debug-log-level-btm-layer", + "name": "BT_LOG_BTM_TRACE_LEVEL", + "title": "BTM layer", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": null, + "id": "BT_LOG_BTM_TRACE_LEVEL", + "name": "BT_LOG_BTM_TRACE_LEVEL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_L2CAP_TRACE_LEVEL_NONE", + "name": "BT_LOG_L2CAP_TRACE_LEVEL_NONE", + "range": null, + "title": "NONE", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_L2CAP_TRACE_LEVEL_ERROR", + "name": "BT_LOG_L2CAP_TRACE_LEVEL_ERROR", + "range": null, + "title": "ERROR", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_L2CAP_TRACE_LEVEL_WARNING", + "name": "BT_LOG_L2CAP_TRACE_LEVEL_WARNING", + "range": null, + "title": "WARNING", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_L2CAP_TRACE_LEVEL_API", + "name": "BT_LOG_L2CAP_TRACE_LEVEL_API", + "range": null, + "title": "API", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_L2CAP_TRACE_LEVEL_EVENT", + "name": "BT_LOG_L2CAP_TRACE_LEVEL_EVENT", + "range": null, + "title": "EVENT", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_L2CAP_TRACE_LEVEL_DEBUG", + "name": "BT_LOG_L2CAP_TRACE_LEVEL_DEBUG", + "range": null, + "title": "DEBUG", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_L2CAP_TRACE_LEVEL_VERBOSE", + "name": "BT_LOG_L2CAP_TRACE_LEVEL_VERBOSE", + "range": null, + "title": "VERBOSE", + "type": "bool" + } + ], + "depends_on": "BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": "Define BT trace level for L2CAP layer", + "id": "component-config-bluetooth-bluedroid-options-bt-debug-log-level-l2cap-layer", + "name": "BT_LOG_L2CAP_TRACE_LEVEL", + "title": "L2CAP layer", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": null, + "id": "BT_LOG_L2CAP_TRACE_LEVEL", + "name": "BT_LOG_L2CAP_TRACE_LEVEL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_RFCOMM_TRACE_LEVEL_NONE", + "name": "BT_LOG_RFCOMM_TRACE_LEVEL_NONE", + "range": null, + "title": "NONE", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_RFCOMM_TRACE_LEVEL_ERROR", + "name": "BT_LOG_RFCOMM_TRACE_LEVEL_ERROR", + "range": null, + "title": "ERROR", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_RFCOMM_TRACE_LEVEL_WARNING", + "name": "BT_LOG_RFCOMM_TRACE_LEVEL_WARNING", + "range": null, + "title": "WARNING", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_RFCOMM_TRACE_LEVEL_API", + "name": "BT_LOG_RFCOMM_TRACE_LEVEL_API", + "range": null, + "title": "API", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_RFCOMM_TRACE_LEVEL_EVENT", + "name": "BT_LOG_RFCOMM_TRACE_LEVEL_EVENT", + "range": null, + "title": "EVENT", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_RFCOMM_TRACE_LEVEL_DEBUG", + "name": "BT_LOG_RFCOMM_TRACE_LEVEL_DEBUG", + "range": null, + "title": "DEBUG", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_RFCOMM_TRACE_LEVEL_VERBOSE", + "name": "BT_LOG_RFCOMM_TRACE_LEVEL_VERBOSE", + "range": null, + "title": "VERBOSE", + "type": "bool" + } + ], + "depends_on": "BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": "Define BT trace level for RFCOMM layer", + "id": "component-config-bluetooth-bluedroid-options-bt-debug-log-level-rfcomm-layer", + "name": "BT_LOG_RFCOMM_TRACE_LEVEL", + "title": "RFCOMM layer", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": null, + "id": "BT_LOG_RFCOMM_TRACE_LEVEL", + "name": "BT_LOG_RFCOMM_TRACE_LEVEL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_SDP_TRACE_LEVEL_NONE", + "name": "BT_LOG_SDP_TRACE_LEVEL_NONE", + "range": null, + "title": "NONE", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_SDP_TRACE_LEVEL_ERROR", + "name": "BT_LOG_SDP_TRACE_LEVEL_ERROR", + "range": null, + "title": "ERROR", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_SDP_TRACE_LEVEL_WARNING", + "name": "BT_LOG_SDP_TRACE_LEVEL_WARNING", + "range": null, + "title": "WARNING", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_SDP_TRACE_LEVEL_API", + "name": "BT_LOG_SDP_TRACE_LEVEL_API", + "range": null, + "title": "API", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_SDP_TRACE_LEVEL_EVENT", + "name": "BT_LOG_SDP_TRACE_LEVEL_EVENT", + "range": null, + "title": "EVENT", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_SDP_TRACE_LEVEL_DEBUG", + "name": "BT_LOG_SDP_TRACE_LEVEL_DEBUG", + "range": null, + "title": "DEBUG", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_SDP_TRACE_LEVEL_VERBOSE", + "name": "BT_LOG_SDP_TRACE_LEVEL_VERBOSE", + "range": null, + "title": "VERBOSE", + "type": "bool" + } + ], + "depends_on": "BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": "Define BT trace level for SDP layer", + "id": "component-config-bluetooth-bluedroid-options-bt-debug-log-level-sdp-layer", + "name": "BT_LOG_SDP_TRACE_LEVEL", + "title": "SDP layer", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": null, + "id": "BT_LOG_SDP_TRACE_LEVEL", + "name": "BT_LOG_SDP_TRACE_LEVEL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_GAP_TRACE_LEVEL_NONE", + "name": "BT_LOG_GAP_TRACE_LEVEL_NONE", + "range": null, + "title": "NONE", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_GAP_TRACE_LEVEL_ERROR", + "name": "BT_LOG_GAP_TRACE_LEVEL_ERROR", + "range": null, + "title": "ERROR", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_GAP_TRACE_LEVEL_WARNING", + "name": "BT_LOG_GAP_TRACE_LEVEL_WARNING", + "range": null, + "title": "WARNING", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_GAP_TRACE_LEVEL_API", + "name": "BT_LOG_GAP_TRACE_LEVEL_API", + "range": null, + "title": "API", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_GAP_TRACE_LEVEL_EVENT", + "name": "BT_LOG_GAP_TRACE_LEVEL_EVENT", + "range": null, + "title": "EVENT", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_GAP_TRACE_LEVEL_DEBUG", + "name": "BT_LOG_GAP_TRACE_LEVEL_DEBUG", + "range": null, + "title": "DEBUG", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_GAP_TRACE_LEVEL_VERBOSE", + "name": "BT_LOG_GAP_TRACE_LEVEL_VERBOSE", + "range": null, + "title": "VERBOSE", + "type": "bool" + } + ], + "depends_on": "BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": "Define BT trace level for GAP layer", + "id": "component-config-bluetooth-bluedroid-options-bt-debug-log-level-gap-layer", + "name": "BT_LOG_GAP_TRACE_LEVEL", + "title": "GAP layer", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": null, + "id": "BT_LOG_GAP_TRACE_LEVEL", + "name": "BT_LOG_GAP_TRACE_LEVEL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BNEP_TRACE_LEVEL_NONE", + "name": "BT_LOG_BNEP_TRACE_LEVEL_NONE", + "range": null, + "title": "NONE", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BNEP_TRACE_LEVEL_ERROR", + "name": "BT_LOG_BNEP_TRACE_LEVEL_ERROR", + "range": null, + "title": "ERROR", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BNEP_TRACE_LEVEL_WARNING", + "name": "BT_LOG_BNEP_TRACE_LEVEL_WARNING", + "range": null, + "title": "WARNING", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BNEP_TRACE_LEVEL_API", + "name": "BT_LOG_BNEP_TRACE_LEVEL_API", + "range": null, + "title": "API", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BNEP_TRACE_LEVEL_EVENT", + "name": "BT_LOG_BNEP_TRACE_LEVEL_EVENT", + "range": null, + "title": "EVENT", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BNEP_TRACE_LEVEL_DEBUG", + "name": "BT_LOG_BNEP_TRACE_LEVEL_DEBUG", + "range": null, + "title": "DEBUG", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BNEP_TRACE_LEVEL_VERBOSE", + "name": "BT_LOG_BNEP_TRACE_LEVEL_VERBOSE", + "range": null, + "title": "VERBOSE", + "type": "bool" + } + ], + "depends_on": "BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": "Define BT trace level for BNEP layer", + "id": "component-config-bluetooth-bluedroid-options-bt-debug-log-level-bnep-layer", + "name": "BT_LOG_BNEP_TRACE_LEVEL", + "title": "BNEP layer", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": null, + "id": "BT_LOG_BNEP_TRACE_LEVEL", + "name": "BT_LOG_BNEP_TRACE_LEVEL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_PAN_TRACE_LEVEL_NONE", + "name": "BT_LOG_PAN_TRACE_LEVEL_NONE", + "range": null, + "title": "NONE", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_PAN_TRACE_LEVEL_ERROR", + "name": "BT_LOG_PAN_TRACE_LEVEL_ERROR", + "range": null, + "title": "ERROR", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_PAN_TRACE_LEVEL_WARNING", + "name": "BT_LOG_PAN_TRACE_LEVEL_WARNING", + "range": null, + "title": "WARNING", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_PAN_TRACE_LEVEL_API", + "name": "BT_LOG_PAN_TRACE_LEVEL_API", + "range": null, + "title": "API", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_PAN_TRACE_LEVEL_EVENT", + "name": "BT_LOG_PAN_TRACE_LEVEL_EVENT", + "range": null, + "title": "EVENT", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_PAN_TRACE_LEVEL_DEBUG", + "name": "BT_LOG_PAN_TRACE_LEVEL_DEBUG", + "range": null, + "title": "DEBUG", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_PAN_TRACE_LEVEL_VERBOSE", + "name": "BT_LOG_PAN_TRACE_LEVEL_VERBOSE", + "range": null, + "title": "VERBOSE", + "type": "bool" + } + ], + "depends_on": "BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": "Define BT trace level for PAN layer", + "id": "component-config-bluetooth-bluedroid-options-bt-debug-log-level-pan-layer", + "name": "BT_LOG_PAN_TRACE_LEVEL", + "title": "PAN layer", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": null, + "id": "BT_LOG_PAN_TRACE_LEVEL", + "name": "BT_LOG_PAN_TRACE_LEVEL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_A2D_TRACE_LEVEL_NONE", + "name": "BT_LOG_A2D_TRACE_LEVEL_NONE", + "range": null, + "title": "NONE", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_A2D_TRACE_LEVEL_ERROR", + "name": "BT_LOG_A2D_TRACE_LEVEL_ERROR", + "range": null, + "title": "ERROR", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_A2D_TRACE_LEVEL_WARNING", + "name": "BT_LOG_A2D_TRACE_LEVEL_WARNING", + "range": null, + "title": "WARNING", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_A2D_TRACE_LEVEL_API", + "name": "BT_LOG_A2D_TRACE_LEVEL_API", + "range": null, + "title": "API", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_A2D_TRACE_LEVEL_EVENT", + "name": "BT_LOG_A2D_TRACE_LEVEL_EVENT", + "range": null, + "title": "EVENT", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_A2D_TRACE_LEVEL_DEBUG", + "name": "BT_LOG_A2D_TRACE_LEVEL_DEBUG", + "range": null, + "title": "DEBUG", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_A2D_TRACE_LEVEL_VERBOSE", + "name": "BT_LOG_A2D_TRACE_LEVEL_VERBOSE", + "range": null, + "title": "VERBOSE", + "type": "bool" + } + ], + "depends_on": "BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": "Define BT trace level for A2D layer", + "id": "component-config-bluetooth-bluedroid-options-bt-debug-log-level-a2d-layer", + "name": "BT_LOG_A2D_TRACE_LEVEL", + "title": "A2D layer", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": null, + "id": "BT_LOG_A2D_TRACE_LEVEL", + "name": "BT_LOG_A2D_TRACE_LEVEL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_AVDT_TRACE_LEVEL_NONE", + "name": "BT_LOG_AVDT_TRACE_LEVEL_NONE", + "range": null, + "title": "NONE", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_AVDT_TRACE_LEVEL_ERROR", + "name": "BT_LOG_AVDT_TRACE_LEVEL_ERROR", + "range": null, + "title": "ERROR", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_AVDT_TRACE_LEVEL_WARNING", + "name": "BT_LOG_AVDT_TRACE_LEVEL_WARNING", + "range": null, + "title": "WARNING", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_AVDT_TRACE_LEVEL_API", + "name": "BT_LOG_AVDT_TRACE_LEVEL_API", + "range": null, + "title": "API", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_AVDT_TRACE_LEVEL_EVENT", + "name": "BT_LOG_AVDT_TRACE_LEVEL_EVENT", + "range": null, + "title": "EVENT", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_AVDT_TRACE_LEVEL_DEBUG", + "name": "BT_LOG_AVDT_TRACE_LEVEL_DEBUG", + "range": null, + "title": "DEBUG", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_AVDT_TRACE_LEVEL_VERBOSE", + "name": "BT_LOG_AVDT_TRACE_LEVEL_VERBOSE", + "range": null, + "title": "VERBOSE", + "type": "bool" + } + ], + "depends_on": "BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": "Define BT trace level for AVDT layer", + "id": "component-config-bluetooth-bluedroid-options-bt-debug-log-level-avdt-layer", + "name": "BT_LOG_AVDT_TRACE_LEVEL", + "title": "AVDT layer", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": null, + "id": "BT_LOG_AVDT_TRACE_LEVEL", + "name": "BT_LOG_AVDT_TRACE_LEVEL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_AVCT_TRACE_LEVEL_NONE", + "name": "BT_LOG_AVCT_TRACE_LEVEL_NONE", + "range": null, + "title": "NONE", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_AVCT_TRACE_LEVEL_ERROR", + "name": "BT_LOG_AVCT_TRACE_LEVEL_ERROR", + "range": null, + "title": "ERROR", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_AVCT_TRACE_LEVEL_WARNING", + "name": "BT_LOG_AVCT_TRACE_LEVEL_WARNING", + "range": null, + "title": "WARNING", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_AVCT_TRACE_LEVEL_API", + "name": "BT_LOG_AVCT_TRACE_LEVEL_API", + "range": null, + "title": "API", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_AVCT_TRACE_LEVEL_EVENT", + "name": "BT_LOG_AVCT_TRACE_LEVEL_EVENT", + "range": null, + "title": "EVENT", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_AVCT_TRACE_LEVEL_DEBUG", + "name": "BT_LOG_AVCT_TRACE_LEVEL_DEBUG", + "range": null, + "title": "DEBUG", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_AVCT_TRACE_LEVEL_VERBOSE", + "name": "BT_LOG_AVCT_TRACE_LEVEL_VERBOSE", + "range": null, + "title": "VERBOSE", + "type": "bool" + } + ], + "depends_on": "BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": "Define BT trace level for AVCT layer", + "id": "component-config-bluetooth-bluedroid-options-bt-debug-log-level-avct-layer", + "name": "BT_LOG_AVCT_TRACE_LEVEL", + "title": "AVCT layer", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": null, + "id": "BT_LOG_AVCT_TRACE_LEVEL", + "name": "BT_LOG_AVCT_TRACE_LEVEL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_AVRC_TRACE_LEVEL_NONE", + "name": "BT_LOG_AVRC_TRACE_LEVEL_NONE", + "range": null, + "title": "NONE", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_AVRC_TRACE_LEVEL_ERROR", + "name": "BT_LOG_AVRC_TRACE_LEVEL_ERROR", + "range": null, + "title": "ERROR", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_AVRC_TRACE_LEVEL_WARNING", + "name": "BT_LOG_AVRC_TRACE_LEVEL_WARNING", + "range": null, + "title": "WARNING", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_AVRC_TRACE_LEVEL_API", + "name": "BT_LOG_AVRC_TRACE_LEVEL_API", + "range": null, + "title": "API", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_AVRC_TRACE_LEVEL_EVENT", + "name": "BT_LOG_AVRC_TRACE_LEVEL_EVENT", + "range": null, + "title": "EVENT", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_AVRC_TRACE_LEVEL_DEBUG", + "name": "BT_LOG_AVRC_TRACE_LEVEL_DEBUG", + "range": null, + "title": "DEBUG", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_AVRC_TRACE_LEVEL_VERBOSE", + "name": "BT_LOG_AVRC_TRACE_LEVEL_VERBOSE", + "range": null, + "title": "VERBOSE", + "type": "bool" + } + ], + "depends_on": "BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": "Define BT trace level for AVRC layer", + "id": "component-config-bluetooth-bluedroid-options-bt-debug-log-level-avrc-layer", + "name": "BT_LOG_AVRC_TRACE_LEVEL", + "title": "AVRC layer", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": null, + "id": "BT_LOG_AVRC_TRACE_LEVEL", + "name": "BT_LOG_AVRC_TRACE_LEVEL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_MCA_TRACE_LEVEL_NONE", + "name": "BT_LOG_MCA_TRACE_LEVEL_NONE", + "range": null, + "title": "NONE", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_MCA_TRACE_LEVEL_ERROR", + "name": "BT_LOG_MCA_TRACE_LEVEL_ERROR", + "range": null, + "title": "ERROR", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_MCA_TRACE_LEVEL_WARNING", + "name": "BT_LOG_MCA_TRACE_LEVEL_WARNING", + "range": null, + "title": "WARNING", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_MCA_TRACE_LEVEL_API", + "name": "BT_LOG_MCA_TRACE_LEVEL_API", + "range": null, + "title": "API", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_MCA_TRACE_LEVEL_EVENT", + "name": "BT_LOG_MCA_TRACE_LEVEL_EVENT", + "range": null, + "title": "EVENT", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_MCA_TRACE_LEVEL_DEBUG", + "name": "BT_LOG_MCA_TRACE_LEVEL_DEBUG", + "range": null, + "title": "DEBUG", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_MCA_TRACE_LEVEL_VERBOSE", + "name": "BT_LOG_MCA_TRACE_LEVEL_VERBOSE", + "range": null, + "title": "VERBOSE", + "type": "bool" + } + ], + "depends_on": "BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": "Define BT trace level for MCA layer", + "id": "component-config-bluetooth-bluedroid-options-bt-debug-log-level-mca-layer", + "name": "BT_LOG_MCA_TRACE_LEVEL", + "title": "MCA layer", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": null, + "id": "BT_LOG_MCA_TRACE_LEVEL", + "name": "BT_LOG_MCA_TRACE_LEVEL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_HID_TRACE_LEVEL_NONE", + "name": "BT_LOG_HID_TRACE_LEVEL_NONE", + "range": null, + "title": "NONE", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_HID_TRACE_LEVEL_ERROR", + "name": "BT_LOG_HID_TRACE_LEVEL_ERROR", + "range": null, + "title": "ERROR", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_HID_TRACE_LEVEL_WARNING", + "name": "BT_LOG_HID_TRACE_LEVEL_WARNING", + "range": null, + "title": "WARNING", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_HID_TRACE_LEVEL_API", + "name": "BT_LOG_HID_TRACE_LEVEL_API", + "range": null, + "title": "API", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_HID_TRACE_LEVEL_EVENT", + "name": "BT_LOG_HID_TRACE_LEVEL_EVENT", + "range": null, + "title": "EVENT", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_HID_TRACE_LEVEL_DEBUG", + "name": "BT_LOG_HID_TRACE_LEVEL_DEBUG", + "range": null, + "title": "DEBUG", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_HID_TRACE_LEVEL_VERBOSE", + "name": "BT_LOG_HID_TRACE_LEVEL_VERBOSE", + "range": null, + "title": "VERBOSE", + "type": "bool" + } + ], + "depends_on": "BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": "Define BT trace level for HID layer", + "id": "component-config-bluetooth-bluedroid-options-bt-debug-log-level-hid-layer", + "name": "BT_LOG_HID_TRACE_LEVEL", + "title": "HID layer", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": null, + "id": "BT_LOG_HID_TRACE_LEVEL", + "name": "BT_LOG_HID_TRACE_LEVEL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_APPL_TRACE_LEVEL_NONE", + "name": "BT_LOG_APPL_TRACE_LEVEL_NONE", + "range": null, + "title": "NONE", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_APPL_TRACE_LEVEL_ERROR", + "name": "BT_LOG_APPL_TRACE_LEVEL_ERROR", + "range": null, + "title": "ERROR", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_APPL_TRACE_LEVEL_WARNING", + "name": "BT_LOG_APPL_TRACE_LEVEL_WARNING", + "range": null, + "title": "WARNING", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_APPL_TRACE_LEVEL_API", + "name": "BT_LOG_APPL_TRACE_LEVEL_API", + "range": null, + "title": "API", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_APPL_TRACE_LEVEL_EVENT", + "name": "BT_LOG_APPL_TRACE_LEVEL_EVENT", + "range": null, + "title": "EVENT", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_APPL_TRACE_LEVEL_DEBUG", + "name": "BT_LOG_APPL_TRACE_LEVEL_DEBUG", + "range": null, + "title": "DEBUG", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_APPL_TRACE_LEVEL_VERBOSE", + "name": "BT_LOG_APPL_TRACE_LEVEL_VERBOSE", + "range": null, + "title": "VERBOSE", + "type": "bool" + } + ], + "depends_on": "BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": "Define BT trace level for APPL layer", + "id": "component-config-bluetooth-bluedroid-options-bt-debug-log-level-appl-layer", + "name": "BT_LOG_APPL_TRACE_LEVEL", + "title": "APPL layer", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": null, + "id": "BT_LOG_APPL_TRACE_LEVEL", + "name": "BT_LOG_APPL_TRACE_LEVEL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_GATT_TRACE_LEVEL_NONE", + "name": "BT_LOG_GATT_TRACE_LEVEL_NONE", + "range": null, + "title": "NONE", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_GATT_TRACE_LEVEL_ERROR", + "name": "BT_LOG_GATT_TRACE_LEVEL_ERROR", + "range": null, + "title": "ERROR", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_GATT_TRACE_LEVEL_WARNING", + "name": "BT_LOG_GATT_TRACE_LEVEL_WARNING", + "range": null, + "title": "WARNING", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_GATT_TRACE_LEVEL_API", + "name": "BT_LOG_GATT_TRACE_LEVEL_API", + "range": null, + "title": "API", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_GATT_TRACE_LEVEL_EVENT", + "name": "BT_LOG_GATT_TRACE_LEVEL_EVENT", + "range": null, + "title": "EVENT", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_GATT_TRACE_LEVEL_DEBUG", + "name": "BT_LOG_GATT_TRACE_LEVEL_DEBUG", + "range": null, + "title": "DEBUG", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_GATT_TRACE_LEVEL_VERBOSE", + "name": "BT_LOG_GATT_TRACE_LEVEL_VERBOSE", + "range": null, + "title": "VERBOSE", + "type": "bool" + } + ], + "depends_on": "BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": "Define BT trace level for GATT layer", + "id": "component-config-bluetooth-bluedroid-options-bt-debug-log-level-gatt-layer", + "name": "BT_LOG_GATT_TRACE_LEVEL", + "title": "GATT layer", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": null, + "id": "BT_LOG_GATT_TRACE_LEVEL", + "name": "BT_LOG_GATT_TRACE_LEVEL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_SMP_TRACE_LEVEL_NONE", + "name": "BT_LOG_SMP_TRACE_LEVEL_NONE", + "range": null, + "title": "NONE", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_SMP_TRACE_LEVEL_ERROR", + "name": "BT_LOG_SMP_TRACE_LEVEL_ERROR", + "range": null, + "title": "ERROR", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_SMP_TRACE_LEVEL_WARNING", + "name": "BT_LOG_SMP_TRACE_LEVEL_WARNING", + "range": null, + "title": "WARNING", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_SMP_TRACE_LEVEL_API", + "name": "BT_LOG_SMP_TRACE_LEVEL_API", + "range": null, + "title": "API", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_SMP_TRACE_LEVEL_EVENT", + "name": "BT_LOG_SMP_TRACE_LEVEL_EVENT", + "range": null, + "title": "EVENT", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_SMP_TRACE_LEVEL_DEBUG", + "name": "BT_LOG_SMP_TRACE_LEVEL_DEBUG", + "range": null, + "title": "DEBUG", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_SMP_TRACE_LEVEL_VERBOSE", + "name": "BT_LOG_SMP_TRACE_LEVEL_VERBOSE", + "range": null, + "title": "VERBOSE", + "type": "bool" + } + ], + "depends_on": "BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": "Define BT trace level for SMP layer", + "id": "component-config-bluetooth-bluedroid-options-bt-debug-log-level-smp-layer", + "name": "BT_LOG_SMP_TRACE_LEVEL", + "title": "SMP layer", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": null, + "id": "BT_LOG_SMP_TRACE_LEVEL", + "name": "BT_LOG_SMP_TRACE_LEVEL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BTIF_TRACE_LEVEL_NONE", + "name": "BT_LOG_BTIF_TRACE_LEVEL_NONE", + "range": null, + "title": "NONE", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BTIF_TRACE_LEVEL_ERROR", + "name": "BT_LOG_BTIF_TRACE_LEVEL_ERROR", + "range": null, + "title": "ERROR", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BTIF_TRACE_LEVEL_WARNING", + "name": "BT_LOG_BTIF_TRACE_LEVEL_WARNING", + "range": null, + "title": "WARNING", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BTIF_TRACE_LEVEL_API", + "name": "BT_LOG_BTIF_TRACE_LEVEL_API", + "range": null, + "title": "API", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BTIF_TRACE_LEVEL_EVENT", + "name": "BT_LOG_BTIF_TRACE_LEVEL_EVENT", + "range": null, + "title": "EVENT", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BTIF_TRACE_LEVEL_DEBUG", + "name": "BT_LOG_BTIF_TRACE_LEVEL_DEBUG", + "range": null, + "title": "DEBUG", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BTIF_TRACE_LEVEL_VERBOSE", + "name": "BT_LOG_BTIF_TRACE_LEVEL_VERBOSE", + "range": null, + "title": "VERBOSE", + "type": "bool" + } + ], + "depends_on": "BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": "Define BT trace level for BTIF layer", + "id": "component-config-bluetooth-bluedroid-options-bt-debug-log-level-btif-layer", + "name": "BT_LOG_BTIF_TRACE_LEVEL", + "title": "BTIF layer", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": null, + "id": "BT_LOG_BTIF_TRACE_LEVEL", + "name": "BT_LOG_BTIF_TRACE_LEVEL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BTC_TRACE_LEVEL_NONE", + "name": "BT_LOG_BTC_TRACE_LEVEL_NONE", + "range": null, + "title": "NONE", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BTC_TRACE_LEVEL_ERROR", + "name": "BT_LOG_BTC_TRACE_LEVEL_ERROR", + "range": null, + "title": "ERROR", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BTC_TRACE_LEVEL_WARNING", + "name": "BT_LOG_BTC_TRACE_LEVEL_WARNING", + "range": null, + "title": "WARNING", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BTC_TRACE_LEVEL_API", + "name": "BT_LOG_BTC_TRACE_LEVEL_API", + "range": null, + "title": "API", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BTC_TRACE_LEVEL_EVENT", + "name": "BT_LOG_BTC_TRACE_LEVEL_EVENT", + "range": null, + "title": "EVENT", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BTC_TRACE_LEVEL_DEBUG", + "name": "BT_LOG_BTC_TRACE_LEVEL_DEBUG", + "range": null, + "title": "DEBUG", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BTC_TRACE_LEVEL_VERBOSE", + "name": "BT_LOG_BTC_TRACE_LEVEL_VERBOSE", + "range": null, + "title": "VERBOSE", + "type": "bool" + } + ], + "depends_on": "BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": "Define BT trace level for BTC layer", + "id": "component-config-bluetooth-bluedroid-options-bt-debug-log-level-btc-layer", + "name": "BT_LOG_BTC_TRACE_LEVEL", + "title": "BTC layer", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": null, + "id": "BT_LOG_BTC_TRACE_LEVEL", + "name": "BT_LOG_BTC_TRACE_LEVEL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_OSI_TRACE_LEVEL_NONE", + "name": "BT_LOG_OSI_TRACE_LEVEL_NONE", + "range": null, + "title": "NONE", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_OSI_TRACE_LEVEL_ERROR", + "name": "BT_LOG_OSI_TRACE_LEVEL_ERROR", + "range": null, + "title": "ERROR", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_OSI_TRACE_LEVEL_WARNING", + "name": "BT_LOG_OSI_TRACE_LEVEL_WARNING", + "range": null, + "title": "WARNING", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_OSI_TRACE_LEVEL_API", + "name": "BT_LOG_OSI_TRACE_LEVEL_API", + "range": null, + "title": "API", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_OSI_TRACE_LEVEL_EVENT", + "name": "BT_LOG_OSI_TRACE_LEVEL_EVENT", + "range": null, + "title": "EVENT", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_OSI_TRACE_LEVEL_DEBUG", + "name": "BT_LOG_OSI_TRACE_LEVEL_DEBUG", + "range": null, + "title": "DEBUG", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_OSI_TRACE_LEVEL_VERBOSE", + "name": "BT_LOG_OSI_TRACE_LEVEL_VERBOSE", + "range": null, + "title": "VERBOSE", + "type": "bool" + } + ], + "depends_on": "BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": "Define BT trace level for OSI layer", + "id": "component-config-bluetooth-bluedroid-options-bt-debug-log-level-osi-layer", + "name": "BT_LOG_OSI_TRACE_LEVEL", + "title": "OSI layer", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": null, + "id": "BT_LOG_OSI_TRACE_LEVEL", + "name": "BT_LOG_OSI_TRACE_LEVEL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BLUFI_TRACE_LEVEL_NONE", + "name": "BT_LOG_BLUFI_TRACE_LEVEL_NONE", + "range": null, + "title": "NONE", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BLUFI_TRACE_LEVEL_ERROR", + "name": "BT_LOG_BLUFI_TRACE_LEVEL_ERROR", + "range": null, + "title": "ERROR", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BLUFI_TRACE_LEVEL_WARNING", + "name": "BT_LOG_BLUFI_TRACE_LEVEL_WARNING", + "range": null, + "title": "WARNING", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BLUFI_TRACE_LEVEL_API", + "name": "BT_LOG_BLUFI_TRACE_LEVEL_API", + "range": null, + "title": "API", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BLUFI_TRACE_LEVEL_EVENT", + "name": "BT_LOG_BLUFI_TRACE_LEVEL_EVENT", + "range": null, + "title": "EVENT", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BLUFI_TRACE_LEVEL_DEBUG", + "name": "BT_LOG_BLUFI_TRACE_LEVEL_DEBUG", + "range": null, + "title": "DEBUG", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_LOG_BLUFI_TRACE_LEVEL_VERBOSE", + "name": "BT_LOG_BLUFI_TRACE_LEVEL_VERBOSE", + "range": null, + "title": "VERBOSE", + "type": "bool" + } + ], + "depends_on": "BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": "Define BT trace level for BLUFI layer", + "id": "component-config-bluetooth-bluedroid-options-bt-debug-log-level-blufi-layer", + "name": "BT_LOG_BLUFI_TRACE_LEVEL", + "title": "BLUFI layer", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "help": null, + "id": "BT_LOG_BLUFI_TRACE_LEVEL", + "name": "BT_LOG_BLUFI_TRACE_LEVEL", + "range": null, + "title": null, + "type": "int" + } + ], + "depends_on": "BT_BLUEDROID_ENABLED && !BT_STACK_NO_LOG && BT_BLUEDROID_ENABLED", + "id": "component-config-bluetooth-bluedroid-options-bt-debug-log-level", + "title": "BT DEBUG LOG LEVEL", + "type": "menu" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED", + "help": "Maximum BT/BLE connection count. The ESP32-C3/S3 chip supports a maximum of 10 instances,\nincluding ADV, SCAN and connections. The ESP32-C3/S3 chip can connect up to 9 devices if\nADV or SCAN uses only one. If ADV and SCAN are both used, The ESP32-C3/S3 chip is connected\nto a maximum of 8 devices. Because Bluetooth cannot reclaim used instances once ADV or SCAN\nis used.", + "id": "BT_ACL_CONNECTIONS", + "name": "BT_ACL_CONNECTIONS", + "range": null, + "title": "BT/BLE MAX ACL CONNECTIONS(1~9)", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_BLE_ENABLED && BT_BLUEDROID_ENABLED", + "help": "Enable this option if there are multiple connections", + "id": "BT_MULTI_CONNECTION_ENBALE", + "name": "BT_MULTI_CONNECTION_ENBALE", + "range": null, + "title": "Enable BLE multi-connections", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED", + "help": "This select can save the internal RAM if there have the PSRAM", + "id": "BT_ALLOCATION_FROM_SPIRAM_FIRST", + "name": "BT_ALLOCATION_FROM_SPIRAM_FIRST", + "range": null, + "title": "BT/BLE will first malloc the memory from the PSRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED", + "help": "This select can make the allocation of memory will become more flexible", + "id": "BT_BLE_DYNAMIC_ENV_MEMORY", + "name": "BT_BLE_DYNAMIC_ENV_MEMORY", + "range": null, + "title": "Use dynamic memory allocation in BT/BLE stack", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_BLE_ENABLED && BT_BLUEDROID_ENABLED", + "help": "When scanning and scan duplicate is not enabled, if there are a lot of adv packets around\nor application layer handling adv packets is slow, it will cause the controller memory\nto run out. if enabled, adv packets will be lost when host queue is congested.", + "id": "BT_BLE_HOST_QUEUE_CONG_CHECK", + "name": "BT_BLE_HOST_QUEUE_CONG_CHECK", + "range": null, + "title": "BLE queue congestion check", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED", + "help": null, + "id": "BT_SMP_ENABLE", + "name": "BT_SMP_ENABLE", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_SMP_ENABLE && BT_BLUEDROID_ENABLED", + "help": "The number of security records for peer devices.", + "id": "BT_SMP_MAX_BONDS", + "name": "BT_SMP_MAX_BONDS", + "range": null, + "title": "BT/BLE maximum bond device count", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLE_ENABLED && BT_BLUEDROID_ENABLED", + "help": "Originally, when doing BLE active scan, Bluedroid will not report adv to application layer\nuntil receive scan response. This option is used to disable the behavior. When enable this option,\nBluedroid will report adv data or scan response to application layer immediately.\n\n# Memory reserved at start of DRAM for Bluetooth stack", + "id": "BT_BLE_ACT_SCAN_REP_ADV_SCAN", + "name": "BT_BLE_ACT_SCAN_REP_ADV_SCAN", + "range": null, + "title": "Report adv data and scan response individually when BLE active scan", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_BLE_ENABLED && BT_BLUEDROID_ENABLED", + "help": "Bluetooth Connection establishment maximum time, if connection time exceeds this value, the connection\nestablishment fails, ESP_GATTC_OPEN_EVT or ESP_GATTS_OPEN_EVT is triggered.", + "id": "BT_BLE_ESTAB_LINK_CONN_TOUT", + "name": "BT_BLE_ESTAB_LINK_CONN_TOUT", + "range": null, + "title": "Timeout of BLE connection establishment", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED", + "help": "Bluetooth Device name length shall be no larger than 248 octets, If the broadcast data cannot contain\nthe complete device name, then only the shortname will be displayed, the rest parts that can't fit in\nwill be truncated.", + "id": "BT_MAX_DEVICE_NAME_LEN", + "name": "BT_MAX_DEVICE_NAME_LEN", + "range": null, + "title": "length of bluetooth device name", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && ((BT_CONTROLLER_ENABLED && !SOC_BLE_DEVICE_PRIVACY_SUPPORTED) || BT_CONTROLLER_DISABLED) && BT_BLUEDROID_ENABLED", + "help": "This enables controller RPA list function.\nFor ESP32, ESP32 only support network privacy mode. If this option is enabled, ESP32 will only accept\nadvertising packets from peer devices that contain private address, HW will not receive the advertising\npackets contain identity address after IRK changed. If this option is disabled, address resolution will\nbe performed in the host, so the functions that require controller to resolve address in the white list\ncannot be used. This option is disabled by default on ESP32, please enable or disable this option according\nto your own needs.\n\nFor other BLE chips, devices support network privacy mode and device privacy mode,\nusers can switch the two modes according to their own needs. So this option is enabled by default.", + "id": "BT_BLE_RPA_SUPPORTED", + "name": "BT_BLE_RPA_SUPPORTED", + "range": null, + "title": "Update RPA to Controller", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_BLE_ENABLED && BT_BLUEDROID_ENABLED", + "help": "This set RPA timeout of Controller and Host.\nDefault is 900 s (15 minutes). Range is 1 s to 1 hour (3600 s).", + "id": "BT_BLE_RPA_TIMEOUT", + "name": "BT_BLE_RPA_TIMEOUT", + "range": null, + "title": "Timeout of resolvable private address", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_BLE_ENABLED && ((BT_CONTROLLER_ENABLED && SOC_BLE_50_SUPPORTED) || BT_CONTROLLER_DISABLED) && BT_BLUEDROID_ENABLED", + "help": "Enabling this option activates BLE 5.0 features.\nThis option is universally supported in chips that support BLE, except for ESP32.\nBLE 4.2 and BLE 5.0 cannot be used simultaneously.", + "id": "BT_BLE_50_FEATURES_SUPPORTED", + "name": "BT_BLE_50_FEATURES_SUPPORTED", + "range": null, + "title": "Enable BLE 5.0 features(please disable BLE 4.2 if enable BLE 5.0)", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_BLE_ENABLED && ((BT_CONTROLLER_ENABLED && SOC_BLE_50_SUPPORTED) || BT_CONTROLLER_DISABLED) && BT_BLUEDROID_ENABLED", + "help": "This enables BLE 4.2 features.\nThis option is universally supported by all ESP chips with BLE capabilities.\nBLE 4.2 and BLE 5.0 cannot be used simultaneously.", + "id": "BT_BLE_42_FEATURES_SUPPORTED", + "name": "BT_BLE_42_FEATURES_SUPPORTED", + "range": null, + "title": "Enable BLE 4.2 features(please disable BLE 5.0 if enable BLE 4.2)", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLE_50_FEATURES_SUPPORTED && ((BT_CONTROLLER_ENABLED && SOC_ESP_NIMBLE_CONTROLLER) || BT_CONTROLLER_DISABLED) && BT_BLUEDROID_ENABLED", + "help": "This enables BLE periodic advertising sync transfer feature", + "id": "BT_BLE_FEAT_PERIODIC_ADV_SYNC_TRANSFER", + "name": "BT_BLE_FEAT_PERIODIC_ADV_SYNC_TRANSFER", + "range": null, + "title": "Enable BLE periodic advertising sync transfer feature", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLE_50_FEATURES_SUPPORTED && ((BT_CONTROLLER_ENABLED && SOC_ESP_NIMBLE_CONTROLLER) || BT_CONTROLLER_DISABLED) && BT_BLUEDROID_ENABLED", + "help": "Enable the periodic advertising enhancements", + "id": "BT_BLE_FEAT_PERIODIC_ADV_ENH", + "name": "BT_BLE_FEAT_PERIODIC_ADV_ENH", + "range": null, + "title": "Enable periodic adv enhancements(adi support)", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLE_50_FEATURES_SUPPORTED && ((BT_CONTROLLER_ENABLED && SOC_ESP_NIMBLE_CONTROLLER) || BT_CONTROLLER_DISABLED) && BT_BLUEDROID_ENABLED", + "help": "Enable the create sync enhancements", + "id": "BT_BLE_FEAT_CREATE_SYNC_ENH", + "name": "BT_BLE_FEAT_CREATE_SYNC_ENH", + "range": null, + "title": "Enable create sync enhancements(reporting disable and duplicate filtering enable support)", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_BLE_ENABLED && BT_BLUEDROID_ENABLED", + "help": "This enable BLE high duty advertising interval feature", + "id": "BT_BLE_HIGH_DUTY_ADV_INTERVAL", + "name": "BT_BLE_HIGH_DUTY_ADV_INTERVAL", + "range": null, + "title": "Enable BLE high duty advertising interval feature", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_BLUEDROID_ENABLED && BT_BLUEDROID_ENABLED", + "help": "This enables abort when memory allocation fails", + "id": "BT_ABORT_WHEN_ALLOCATION_FAILS", + "name": "BT_ABORT_WHEN_ALLOCATION_FAILS", + "range": null, + "title": "Abort when memory allocation fails in BT/BLE stack", + "type": "bool" + } + ], + "depends_on": "BT_BLUEDROID_ENABLED", + "id": "component-config-bluetooth-bluedroid-options", + "title": "Bluedroid Options", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_NIMBLE_MEM_ALLOC_MODE_INTERNAL", + "name": "BT_NIMBLE_MEM_ALLOC_MODE_INTERNAL", + "range": null, + "title": "Internal memory", + "type": "bool" + }, + { + "children": [], + "depends_on": "(SPIRAM_USE_CAPS_ALLOC || SPIRAM_USE_MALLOC) && ", + "help": null, + "id": "BT_NIMBLE_MEM_ALLOC_MODE_EXTERNAL", + "name": "BT_NIMBLE_MEM_ALLOC_MODE_EXTERNAL", + "range": null, + "title": "External SPIRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_NIMBLE_MEM_ALLOC_MODE_DEFAULT", + "name": "BT_NIMBLE_MEM_ALLOC_MODE_DEFAULT", + "range": null, + "title": "Default alloc mode", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP32_IRAM_AS_8BIT_ACCESSIBLE_MEMORY && ", + "help": "Allows to use IRAM memory region as 8bit accessible region.\n\nEvery unaligned (8bit or 16bit) access will result in an exception\nand incur penalty of certain clock cycles per unaligned read/write.", + "id": "BT_NIMBLE_MEM_ALLOC_MODE_IRAM_8BIT", + "name": "BT_NIMBLE_MEM_ALLOC_MODE_IRAM_8BIT", + "range": null, + "title": "Internal IRAM", + "type": "bool" + } + ], + "depends_on": "BT_NIMBLE_ENABLED", + "help": "Allocation strategy for NimBLE host stack, essentially provides ability to\nallocate all required dynamic allocations from,\n\n- Internal DRAM memory only\n- External SPIRAM memory only\n- Either internal or external memory based on default malloc()\n behavior in ESP-IDF\n- Internal IRAM memory wherever applicable else internal DRAM", + "id": "component-config-bluetooth-nimble-options-memory-allocation-strategy", + "name": "BT_NIMBLE_MEM_ALLOC_MODE", + "title": "Memory allocation strategy", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_NIMBLE_LOG_LEVEL_NONE", + "name": "BT_NIMBLE_LOG_LEVEL_NONE", + "range": null, + "title": "No logs", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_NIMBLE_LOG_LEVEL_ERROR", + "name": "BT_NIMBLE_LOG_LEVEL_ERROR", + "range": null, + "title": "Error logs", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_NIMBLE_LOG_LEVEL_WARNING", + "name": "BT_NIMBLE_LOG_LEVEL_WARNING", + "range": null, + "title": "Warning logs", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_NIMBLE_LOG_LEVEL_INFO", + "name": "BT_NIMBLE_LOG_LEVEL_INFO", + "range": null, + "title": "Info logs", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_NIMBLE_LOG_LEVEL_DEBUG", + "name": "BT_NIMBLE_LOG_LEVEL_DEBUG", + "range": null, + "title": "Debug logs", + "type": "bool" + } + ], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Select NimBLE log level. Please make a note that the selected NimBLE log\nverbosity can not exceed the level set in \"Component config --> Log output\n--> Default log verbosity\".", + "id": "component-config-bluetooth-nimble-options-nimble-host-log-verbosity", + "name": "BT_NIMBLE_LOG_LEVEL", + "title": "NimBLE Host log verbosity", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED", + "help": null, + "id": "BT_NIMBLE_LOG_LEVEL", + "name": "BT_NIMBLE_LOG_LEVEL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Defines maximum number of concurrent BLE connections. For ESP32, user\nis expected to configure BTDM_CTRL_BLE_MAX_CONN from controller menu\nalong with this option. Similarly for ESP32-C3 or ESP32-S3, user is expected to\nconfigure BT_CTRL_BLE_MAX_ACT from controller menu.\nFor ESP32C2, ESP32C6 and ESP32H2, each connection will take about 1k DRAM.", + "id": "BT_NIMBLE_MAX_CONNECTIONS", + "name": "BT_NIMBLE_MAX_CONNECTIONS", + "range": null, + "title": "Maximum number of concurrent connections", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Defines maximum number of bonds to save for peer security and our security", + "id": "BT_NIMBLE_MAX_BONDS", + "name": "BT_NIMBLE_MAX_BONDS", + "range": null, + "title": "Maximum number of bonds to save across reboots", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Defines maximum number of CCC descriptors to save", + "id": "BT_NIMBLE_MAX_CCCDS", + "name": "BT_NIMBLE_MAX_CCCDS", + "range": null, + "title": "Maximum number of CCC descriptors to save across reboots", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Defines maximum number of BLE Connection Oriented Channels. When set to (0), BLE COC is not compiled in", + "id": "BT_NIMBLE_L2CAP_COC_MAX_NUM", + "name": "BT_NIMBLE_L2CAP_COC_MAX_NUM", + "range": null, + "title": "Maximum number of connection oriented channels", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_L2CAP_COC_MAX_NUM >= 1 && BT_NIMBLE_ENABLED", + "help": "Enable Enhanced Credit Based Flow Control Mode", + "id": "BT_NIMBLE_L2CAP_ENHANCED_COC", + "name": "BT_NIMBLE_L2CAP_ENHANCED_COC", + "range": null, + "title": "L2CAP Enhanced Connection Oriented Channel", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_NIMBLE_PINNED_TO_CORE_0", + "name": "BT_NIMBLE_PINNED_TO_CORE_0", + "range": null, + "title": "Core 0 (PRO CPU)", + "type": "bool" + }, + { + "children": [], + "depends_on": "!FREERTOS_UNICORE && ", + "help": null, + "id": "BT_NIMBLE_PINNED_TO_CORE_1", + "name": "BT_NIMBLE_PINNED_TO_CORE_1", + "range": null, + "title": "Core 1 (APP CPU)", + "type": "bool" + } + ], + "depends_on": "BT_NIMBLE_ENABLED && !FREERTOS_UNICORE && BT_NIMBLE_ENABLED", + "help": "The CPU core on which NimBLE host will run. You can choose Core 0 or Core 1.\nCannot specify no-affinity", + "id": "component-config-bluetooth-nimble-options-the-cpu-core-on-which-nimble-host-will-run", + "name": "BT_NIMBLE_PINNED_TO_CORE_CHOICE", + "title": "The CPU core on which NimBLE host will run", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": null, + "id": "BT_NIMBLE_PINNED_TO_CORE", + "name": "BT_NIMBLE_PINNED_TO_CORE", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "This configures stack size of NimBLE host task", + "id": "BT_NIMBLE_HOST_TASK_STACK_SIZE", + "name": "BT_NIMBLE_HOST_TASK_STACK_SIZE", + "range": null, + "title": "NimBLE Host task stack size", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Enables central role", + "id": "BT_NIMBLE_ROLE_CENTRAL", + "name": "BT_NIMBLE_ROLE_CENTRAL", + "range": null, + "title": "Enable BLE Central role", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Enable peripheral role", + "id": "BT_NIMBLE_ROLE_PERIPHERAL", + "name": "BT_NIMBLE_ROLE_PERIPHERAL", + "range": null, + "title": "Enable BLE Peripheral role", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Enables broadcaster role", + "id": "BT_NIMBLE_ROLE_BROADCASTER", + "name": "BT_NIMBLE_ROLE_BROADCASTER", + "range": null, + "title": "Enable BLE Broadcaster role", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Enables observer role", + "id": "BT_NIMBLE_ROLE_OBSERVER", + "name": "BT_NIMBLE_ROLE_OBSERVER", + "range": null, + "title": "Enable BLE Observer role", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Enable this flag to make bonding persistent across device reboots", + "id": "BT_NIMBLE_NVS_PERSIST", + "name": "BT_NIMBLE_NVS_PERSIST", + "range": null, + "title": "Persist the BLE Bonding keys in NVS", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED", + "help": "There are tracking risks associated with using a fixed or static IRK.\nIf enabled this option, NimBLE will assign a new randomly-generated IRK\nwhen all pairing and bonding records are deleted. This would decrease the ability\nof a previously paired peer to be used to determine whether a device\nwith which it previously shared an IRK is within range.", + "id": "BT_NIMBLE_SMP_ID_RESET", + "name": "BT_NIMBLE_SMP_ID_RESET", + "range": null, + "title": "Reset device identity when all bonding records are deleted", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BT_NIMBLE_SECURITY_ENABLE && BT_NIMBLE_ENABLED", + "help": "Enable security manager legacy pairing", + "id": "BT_NIMBLE_SM_LEGACY", + "name": "BT_NIMBLE_SM_LEGACY", + "range": null, + "title": "Security manager legacy pairing", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BT_NIMBLE_SECURITY_ENABLE && BT_NIMBLE_SM_SC && BT_NIMBLE_ENABLED", + "help": "If this option is enabled, SM uses predefined DH key pair as described\nin Core Specification, Vol. 3, Part H, 2.3.5.6.1. This allows to\ndecrypt air traffic easily and thus should only be used for debugging.", + "id": "BT_NIMBLE_SM_SC_DEBUG_KEYS", + "name": "BT_NIMBLE_SM_SC_DEBUG_KEYS", + "range": null, + "title": "Use predefined public-private key pair", + "type": "bool" + } + ], + "depends_on": "BT_NIMBLE_SECURITY_ENABLE && BT_NIMBLE_ENABLED", + "help": "Enable security manager secure connections", + "id": "BT_NIMBLE_SM_SC", + "name": "BT_NIMBLE_SM_SC", + "range": null, + "title": "Security manager secure connections (4.2)", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_SECURITY_ENABLE && BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Enable encryption connection", + "id": "BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION", + "name": "BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION", + "range": null, + "title": "Enable LE encryption", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_SECURITY_ENABLE && BT_NIMBLE_ENABLED", + "help": "LE Security Mode 1 Levels:\n1. No Security\n2. Unauthenticated pairing with encryption\n3. Authenticated pairing with encryption\n4. Authenticated LE Secure Connections pairing with encryption using a 128-bit strength encryption key.", + "id": "BT_NIMBLE_SM_LVL", + "name": "BT_NIMBLE_SM_LVL", + "range": null, + "title": "Security level", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_SECURITY_ENABLE && BT_NIMBLE_ENABLED", + "help": "Enable Secure Connections Only Mode", + "id": "BT_NIMBLE_SM_SC_ONLY", + "name": "BT_NIMBLE_SM_SC_ONLY", + "range": null, + "title": "Enable Secure Connections Only Mode", + "type": "int" + } + ], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Enable BLE sm feature", + "id": "BT_NIMBLE_SECURITY_ENABLE", + "is_menuconfig": true, + "name": "BT_NIMBLE_SECURITY_ENABLE", + "range": null, + "title": "Enable BLE SM feature", + "type": "menu" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "This enables extra runtime asserts and host debugging", + "id": "BT_NIMBLE_DEBUG", + "name": "BT_NIMBLE_DEBUG", + "range": null, + "title": "Enable extra runtime asserts and host debugging", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "This enables user to add/remove Gatt services at runtime", + "id": "BT_NIMBLE_DYNAMIC_SERVICE", + "name": "BT_NIMBLE_DYNAMIC_SERVICE", + "range": null, + "title": "Enable dynamic services", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "The Device Name characteristic shall contain the name of the device as an UTF-8 string.\nThis name can be changed by using API ble_svc_gap_device_name_set()", + "id": "BT_NIMBLE_SVC_GAP_DEVICE_NAME", + "name": "BT_NIMBLE_SVC_GAP_DEVICE_NAME", + "range": null, + "title": "BLE GAP default device name", + "type": "string" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Device Name characteristic value shall be 0 to 248 octets in length", + "id": "BT_NIMBLE_GAP_DEVICE_NAME_MAX_LEN", + "name": "BT_NIMBLE_GAP_DEVICE_NAME_MAX_LEN", + "range": null, + "title": "Maximum length of BLE device name in octets", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "This is the default value of ATT MTU indicated by the device during an ATT MTU exchange.\nThis value can be changed using API ble_att_set_preferred_mtu()", + "id": "BT_NIMBLE_ATT_PREFERRED_MTU", + "name": "BT_NIMBLE_ATT_PREFERRED_MTU", + "range": null, + "title": "Preferred MTU size in octets", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Standard BLE GAP Appearance value in HEX format e.g. 0x02C0", + "id": "BT_NIMBLE_SVC_GAP_APPEARANCE", + "name": "BT_NIMBLE_SVC_GAP_APPEARANCE", + "range": null, + "title": "External appearance of the device", + "type": "hex" + }, + { + "children": [ + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED", + "help": "MSYS is a system level mbuf registry. For prepare write & prepare\nresponses MBUFs are allocated out of msys_1 pool. For NIMBLE_MESH\nenabled cases, this block count is increased by 8 than user defined\ncount.", + "id": "BT_NIMBLE_MSYS_1_BLOCK_COUNT", + "name": "BT_NIMBLE_MSYS_1_BLOCK_COUNT", + "range": null, + "title": "MSYS_1 Block Count", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED", + "help": "Dynamic memory size of block 1", + "id": "BT_NIMBLE_MSYS_1_BLOCK_SIZE", + "name": "BT_NIMBLE_MSYS_1_BLOCK_SIZE", + "range": null, + "title": "MSYS_1 Block Size", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED", + "help": "Dynamic memory count", + "id": "BT_NIMBLE_MSYS_2_BLOCK_COUNT", + "name": "BT_NIMBLE_MSYS_2_BLOCK_COUNT", + "range": null, + "title": "MSYS_2 Block Count", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED", + "help": "Dynamic memory size of block 2", + "id": "BT_NIMBLE_MSYS_2_BLOCK_SIZE", + "name": "BT_NIMBLE_MSYS_2_BLOCK_SIZE", + "range": null, + "title": "MSYS_2 Block Size", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_LE_MSYS_INIT_IN_CONTROLLER && BT_NIMBLE_ENABLED", + "help": "This option sets the source of the shared msys mbuf memory between\nthe Host and the Controller. Allocate the memory from the heap if\nthis option is sets, from the mempool otherwise.", + "id": "BT_NIMBLE_MSYS_BUF_FROM_HEAP", + "name": "BT_NIMBLE_MSYS_BUF_FROM_HEAP", + "range": null, + "title": "Get Msys Mbuf from heap", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "The number of ACL data buffers allocated for host.", + "id": "BT_NIMBLE_TRANSPORT_ACL_FROM_LL_COUNT", + "name": "BT_NIMBLE_TRANSPORT_ACL_FROM_LL_COUNT", + "range": null, + "title": "ACL Buffer count", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "This is the maximum size of the data portion of HCI ACL data packets.\nIt does not include the HCI data header (of 4 bytes)", + "id": "BT_NIMBLE_TRANSPORT_ACL_SIZE", + "name": "BT_NIMBLE_TRANSPORT_ACL_SIZE", + "range": null, + "title": "Transport ACL Buffer size", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "This is the size of each HCI event buffer in bytes. In case of\nextended advertising, packets can be fragmented. 257 bytes is the\nmaximum size of a packet.", + "id": "BT_NIMBLE_TRANSPORT_EVT_SIZE", + "name": "BT_NIMBLE_TRANSPORT_EVT_SIZE", + "range": null, + "title": "Transport Event Buffer size", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "This is the high priority HCI events' buffer size. High-priority\nevent buffers are for everything except advertising reports. If there\nare no free high-priority event buffers then host will try to allocate a\nlow-priority buffer instead", + "id": "BT_NIMBLE_TRANSPORT_EVT_COUNT", + "name": "BT_NIMBLE_TRANSPORT_EVT_COUNT", + "range": null, + "title": "Transport Event Buffer count", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "This is the low priority HCI events' buffer size. Low-priority event\nbuffers are only used for advertising reports. If there are no free\nlow-priority event buffers, then an incoming advertising report will\nget dropped", + "id": "BT_NIMBLE_TRANSPORT_EVT_DISCARD_COUNT", + "name": "BT_NIMBLE_TRANSPORT_EVT_DISCARD_COUNT", + "range": null, + "title": "Discardable Transport Event Buffer count", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "This is the service data unit buffer count for l2cap coc.", + "id": "BT_NIMBLE_L2CAP_COC_SDU_BUFF_COUNT", + "name": "BT_NIMBLE_L2CAP_COC_SDU_BUFF_COUNT", + "range": null, + "title": "L2cap coc Service Data Unit Buffer count", + "type": "int" + } + ], + "depends_on": "BT_NIMBLE_ENABLED", + "id": "component-config-bluetooth-nimble-options-memory-settings", + "title": "Memory Settings", + "type": "menu" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Maximum number of GATT client procedures that can be executed.", + "id": "BT_NIMBLE_GATT_MAX_PROCS", + "name": "BT_NIMBLE_GATT_MAX_PROCS", + "range": null, + "title": "Maximum number of GATT client procedures", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "BT_NIMBLE_HS_FLOW_CTRL && BT_NIMBLE_ENABLED", + "help": "Host flow control interval in msecs", + "id": "BT_NIMBLE_HS_FLOW_CTRL_ITVL", + "name": "BT_NIMBLE_HS_FLOW_CTRL_ITVL", + "range": null, + "title": "Host Flow control interval", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_HS_FLOW_CTRL && BT_NIMBLE_ENABLED", + "help": "Host flow control threshold, if the number of free buffers are at or\nbelow this threshold, send an immediate number-of-completed-packets\nevent", + "id": "BT_NIMBLE_HS_FLOW_CTRL_THRESH", + "name": "BT_NIMBLE_HS_FLOW_CTRL_THRESH", + "range": null, + "title": "Host Flow control threshold", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_HS_FLOW_CTRL && BT_NIMBLE_ENABLED", + "help": "Enable this option to send number-of-completed-packets event to\ncontroller after disconnection", + "id": "BT_NIMBLE_HS_FLOW_CTRL_TX_ON_DISCONNECT", + "name": "BT_NIMBLE_HS_FLOW_CTRL_TX_ON_DISCONNECT", + "range": null, + "title": "Host Flow control on disconnect", + "type": "bool" + } + ], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Enable Host Flow control", + "id": "BT_NIMBLE_HS_FLOW_CTRL", + "name": "BT_NIMBLE_HS_FLOW_CTRL", + "range": null, + "title": "Enable Host Flow control", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Time interval between RPA address change.", + "id": "BT_NIMBLE_RPA_TIMEOUT", + "name": "BT_NIMBLE_RPA_TIMEOUT", + "range": null, + "title": "RPA timeout in seconds", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "BT_NIMBLE_MESH && BT_NIMBLE_ENABLED", + "help": "Enable proxy. This is automatically set whenever NIMBLE_MESH_PB_GATT or\nNIMBLE_MESH_GATT_PROXY is set", + "id": "BT_NIMBLE_MESH_PROXY", + "name": "BT_NIMBLE_MESH_PROXY", + "range": null, + "title": "Enable mesh proxy functionality", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BT_NIMBLE_MESH_PROV && BT_NIMBLE_ENABLED", + "help": "Enable this option to allow the device to be provisioned over\nthe advertising bearer", + "id": "BT_NIMBLE_MESH_PB_ADV", + "name": "BT_NIMBLE_MESH_PB_ADV", + "range": null, + "title": "Enable mesh provisioning over advertising bearer", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_MESH_PROV && BT_NIMBLE_ENABLED", + "help": "Enable this option to allow the device to be provisioned over the GATT\nbearer", + "id": "BT_NIMBLE_MESH_PB_GATT", + "name": "BT_NIMBLE_MESH_PB_GATT", + "range": null, + "title": "Enable mesh provisioning over GATT bearer", + "type": "bool" + } + ], + "depends_on": "BT_NIMBLE_MESH && BT_NIMBLE_ENABLED", + "help": "Enable mesh provisioning", + "id": "BT_NIMBLE_MESH_PROV", + "name": "BT_NIMBLE_MESH_PROV", + "range": null, + "title": "Enable BLE mesh provisioning", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_MESH && BT_NIMBLE_ENABLED", + "help": "This option enables support for the Mesh GATT Proxy Service,\ni.e. the ability to act as a proxy between a Mesh GATT Client\nand a Mesh network", + "id": "BT_NIMBLE_MESH_GATT_PROXY", + "name": "BT_NIMBLE_MESH_GATT_PROXY", + "range": null, + "title": "Enable GATT Proxy functionality", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_MESH && BT_NIMBLE_ENABLED", + "help": "Support for acting as a Mesh Relay Node", + "id": "BT_NIMBLE_MESH_RELAY", + "name": "BT_NIMBLE_MESH_RELAY", + "range": null, + "title": "Enable mesh relay functionality", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_MESH && BT_NIMBLE_ENABLED", + "help": "Enable this option to be able to act as a Low Power Node", + "id": "BT_NIMBLE_MESH_LOW_POWER", + "name": "BT_NIMBLE_MESH_LOW_POWER", + "range": null, + "title": "Enable mesh low power mode", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_MESH && BT_NIMBLE_ENABLED", + "help": "Enable this option to be able to act as a Friend Node", + "id": "BT_NIMBLE_MESH_FRIEND", + "name": "BT_NIMBLE_MESH_FRIEND", + "range": null, + "title": "Enable mesh friend functionality", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_MESH && BT_NIMBLE_ENABLED", + "help": "This value defines Bluetooth Mesh device/node name", + "id": "BT_NIMBLE_MESH_DEVICE_NAME", + "name": "BT_NIMBLE_MESH_DEVICE_NAME", + "range": null, + "title": "Set mesh device name", + "type": "string" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_MESH && BT_NIMBLE_ENABLED", + "help": "Defines mesh node count.", + "id": "BT_NIMBLE_MESH_NODE_COUNT", + "name": "BT_NIMBLE_MESH_NODE_COUNT", + "range": null, + "title": "Set mesh node count", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_MESH && BT_NIMBLE_ENABLED", + "help": "Enable mesh provisioner.", + "id": "BT_NIMBLE_MESH_PROVISIONER", + "name": "BT_NIMBLE_MESH_PROVISIONER", + "range": null, + "title": "Enable BLE mesh provisioner", + "type": "bool" + } + ], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Enable BLE Mesh example present in upstream mynewt-nimble and not maintained by Espressif.\n\nIDF maintains ESP-BLE-MESH as the official Mesh solution. Please refer to ESP-BLE-MESH guide at:\n`https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/esp-ble-mesh/ble-mesh-index.html`", + "id": "BT_NIMBLE_MESH", + "is_menuconfig": true, + "name": "BT_NIMBLE_MESH", + "range": null, + "title": "Enable BLE mesh functionality", + "type": "menu" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Enable this option to choose mbedTLS instead of TinyCrypt for crypto\ncomputations.", + "id": "BT_NIMBLE_CRYPTO_STACK_MBEDTLS", + "name": "BT_NIMBLE_CRYPTO_STACK_MBEDTLS", + "range": null, + "title": "Override TinyCrypt with mbedTLS for crypto computations", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "BLE Host stop procedure timeout in milliseconds.", + "id": "BT_NIMBLE_HS_STOP_TIMEOUT_MS", + "name": "BT_NIMBLE_HS_STOP_TIMEOUT_MS", + "range": null, + "title": "BLE host stop timeout in msec", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && IDF_TARGET_ESP32 && BT_NIMBLE_ENABLED", + "help": "Use this option to do host based Random Private Address resolution.\nIf this option is disabled then controller based privacy is used.", + "id": "BT_NIMBLE_HOST_BASED_PRIVACY", + "name": "BT_NIMBLE_HOST_BASED_PRIVACY", + "range": null, + "title": "Enable host based privacy for random address.", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLE_CONN_REATTEMPT && BT_NIMBLE_ENABLED", + "help": "Defines maximum number of connection reattempts.", + "id": "BT_NIMBLE_MAX_CONN_REATTEMPT", + "name": "BT_NIMBLE_MAX_CONN_REATTEMPT", + "range": null, + "title": "Maximum number connection reattempts", + "type": "int" + } + ], + "depends_on": "BT_NIMBLE_ENABLED", + "help": "Enable to make the NimBLE host to reattempt GAP connection on connection\nestablishment failure.", + "id": "BT_NIMBLE_ENABLE_CONN_REATTEMPT", + "name": "BT_NIMBLE_ENABLE_CONN_REATTEMPT", + "range": null, + "title": "Enable connection reattempts on connection establishment error", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BT_NIMBLE_50_FEATURE_SUPPORT && BT_NIMBLE_50_FEATURE_SUPPORT && BT_NIMBLE_ENABLED", + "help": "Enable 2M-PHY", + "id": "BT_NIMBLE_LL_CFG_FEAT_LE_2M_PHY", + "name": "BT_NIMBLE_LL_CFG_FEAT_LE_2M_PHY", + "range": null, + "title": "Enable 2M Phy", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_50_FEATURE_SUPPORT && BT_NIMBLE_50_FEATURE_SUPPORT && BT_NIMBLE_ENABLED", + "help": "Enable coded-PHY", + "id": "BT_NIMBLE_LL_CFG_FEAT_LE_CODED_PHY", + "name": "BT_NIMBLE_LL_CFG_FEAT_LE_CODED_PHY", + "range": null, + "title": "Enable coded Phy", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BT_NIMBLE_EXT_ADV && BT_NIMBLE_EXT_ADV && BT_NIMBLE_50_FEATURE_SUPPORT && BT_NIMBLE_ENABLED", + "help": "Change this option to set maximum number of extended advertising\ninstances. Minimum there is always one instance of\nadvertising. Enter how many more advertising instances you\nwant.\nFor ESP32C2, ESP32C6 and ESP32H2, each extended advertising instance\nwill take about 0.5k DRAM.", + "id": "BT_NIMBLE_MAX_EXT_ADV_INSTANCES", + "name": "BT_NIMBLE_MAX_EXT_ADV_INSTANCES", + "range": null, + "title": "Maximum number of extended advertising instances.", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_EXT_ADV && BT_NIMBLE_EXT_ADV && BT_NIMBLE_50_FEATURE_SUPPORT && BT_NIMBLE_ENABLED", + "help": "Defines the length of the extended adv data. The value should not\nexceed 1650.", + "id": "BT_NIMBLE_EXT_ADV_MAX_SIZE", + "name": "BT_NIMBLE_EXT_ADV_MAX_SIZE", + "range": null, + "title": "Maximum length of the advertising data.", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLE_PERIODIC_ADV && SOC_BLE_PERIODIC_ADV_ENH_SUPPORTED && BT_NIMBLE_EXT_ADV && BT_NIMBLE_50_FEATURE_SUPPORT && BT_NIMBLE_ENABLED", + "help": "Enable the periodic advertising enhancements", + "id": "BT_NIMBLE_PERIODIC_ADV_ENH", + "name": "BT_NIMBLE_PERIODIC_ADV_ENH", + "range": null, + "title": "Periodic adv enhancements(adi support)", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLE_PERIODIC_ADV && BT_NIMBLE_EXT_ADV && BT_NIMBLE_50_FEATURE_SUPPORT && BT_NIMBLE_ENABLED", + "help": "This enables controller transfer periodic sync events to host", + "id": "BT_NIMBLE_PERIODIC_ADV_SYNC_TRANSFER", + "name": "BT_NIMBLE_PERIODIC_ADV_SYNC_TRANSFER", + "range": null, + "title": "Enable Transfer Sync Events", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLE_PERIODIC_ADV && BT_NIMBLE_EXT_ADV && BT_NIMBLE_50_FEATURE_SUPPORT && BT_NIMBLE_ENABLED", + "help": "This enables controller PAwR (Periodic Advertisement with Response).", + "id": "BT_NIMBLE_PERIODIC_ADV_WITH_RESPONSES", + "name": "BT_NIMBLE_PERIODIC_ADV_WITH_RESPONSES", + "range": null, + "title": "Enable Periodic Advertisement with Response (EXPERIMENTAL)", + "type": "bool" + } + ], + "depends_on": "BT_NIMBLE_EXT_ADV && BT_NIMBLE_EXT_ADV && BT_NIMBLE_50_FEATURE_SUPPORT && BT_NIMBLE_ENABLED", + "help": "Enable this option to start periodic advertisement.", + "id": "BT_NIMBLE_ENABLE_PERIODIC_ADV", + "name": "BT_NIMBLE_ENABLE_PERIODIC_ADV", + "range": null, + "title": "Enable periodic advertisement.", + "type": "bool" + } + ], + "depends_on": "BT_NIMBLE_50_FEATURE_SUPPORT && BT_NIMBLE_50_FEATURE_SUPPORT && BT_NIMBLE_ENABLED", + "help": "Enable this option to do extended advertising. Extended advertising\nwill be supported from BLE 5.0 onwards.", + "id": "BT_NIMBLE_EXT_ADV", + "name": "BT_NIMBLE_EXT_ADV", + "range": null, + "title": "Enable extended advertising", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLE_PERIODIC_SYNC && BT_NIMBLE_50_FEATURE_SUPPORT && BT_NIMBLE_ENABLED", + "help": "Set this option to set the upper limit for number of periodic sync\nconnections. This should be less than maximum connections allowed by\ncontroller.", + "id": "BT_NIMBLE_MAX_PERIODIC_SYNCS", + "name": "BT_NIMBLE_MAX_PERIODIC_SYNCS", + "range": null, + "title": "Maximum number of periodic advertising syncs", + "type": "int" + }, + { + "children": [], + "depends_on": "SOC_ESP_NIMBLE_CONTROLLER && BT_NIMBLE_ENABLE_PERIODIC_SYNC && BT_NIMBLE_50_FEATURE_SUPPORT && BT_NIMBLE_ENABLED", + "help": "Set this option to set the upper limit for number of periodic advertiser list.", + "id": "BT_NIMBLE_MAX_PERIODIC_ADVERTISER_LIST", + "name": "BT_NIMBLE_MAX_PERIODIC_ADVERTISER_LIST", + "range": null, + "title": "Maximum number of periodic advertiser list", + "type": "int" + } + ], + "depends_on": "BT_NIMBLE_EXT_SCAN && BT_NIMBLE_50_FEATURE_SUPPORT && BT_NIMBLE_ENABLED", + "help": "Enable this option to receive periodic advertisement.", + "id": "BT_NIMBLE_ENABLE_PERIODIC_SYNC", + "name": "BT_NIMBLE_ENABLE_PERIODIC_SYNC", + "range": null, + "title": "Enable periodic sync", + "type": "bool" + } + ], + "depends_on": "BT_NIMBLE_50_FEATURE_SUPPORT && BT_NIMBLE_ROLE_OBSERVER && BT_NIMBLE_50_FEATURE_SUPPORT && BT_NIMBLE_ENABLED", + "help": "Enable this option to do extended scanning.", + "id": "BT_NIMBLE_EXT_SCAN", + "name": "BT_NIMBLE_EXT_SCAN", + "range": null, + "title": "Enable extended scanning", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_50_FEATURE_SUPPORT && SOC_BLE_POWER_CONTROL_SUPPORTED && BT_NIMBLE_50_FEATURE_SUPPORT && BT_NIMBLE_ENABLED", + "help": "Set this option to enable the Power Control feature", + "id": "BT_NIMBLE_BLE_POWER_CONTROL", + "name": "BT_NIMBLE_BLE_POWER_CONTROL", + "range": null, + "title": "Enable support for BLE Power Control", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_50_FEATURE_SUPPORT && (BT_CONTROLLER_DISABLED || SOC_BLE_CTE_SUPPORTED) && BT_NIMBLE_50_FEATURE_SUPPORT && BT_NIMBLE_ENABLED", + "help": "Enable support for Connectionless and Connection Oriented Direction Finding", + "id": "BT_NIMBLE_AOA_AOD", + "name": "BT_NIMBLE_AOA_AOD", + "range": null, + "title": "Direction Finding", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BT_NIMBLE_GATT_CACHING && BT_NIMBLE_50_FEATURE_SUPPORT && BT_NIMBLE_ENABLED", + "help": "Set this option to set the upper limit on number of connections to be cached.", + "id": "BT_NIMBLE_GATT_CACHING_MAX_CONNS", + "name": "BT_NIMBLE_GATT_CACHING_MAX_CONNS", + "range": null, + "title": "Maximum connections to be cached", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_GATT_CACHING && BT_NIMBLE_50_FEATURE_SUPPORT && BT_NIMBLE_ENABLED", + "help": "Set this option to set the upper limit on number of services per connection to be cached.", + "id": "BT_NIMBLE_GATT_CACHING_MAX_SVCS", + "name": "BT_NIMBLE_GATT_CACHING_MAX_SVCS", + "range": null, + "title": "Maximum number of services per connection", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_GATT_CACHING && BT_NIMBLE_50_FEATURE_SUPPORT && BT_NIMBLE_ENABLED", + "help": "Set this option to set the upper limit on number of characteristics per connection to be cached.", + "id": "BT_NIMBLE_GATT_CACHING_MAX_CHRS", + "name": "BT_NIMBLE_GATT_CACHING_MAX_CHRS", + "range": null, + "title": "Maximum number of characteristics per connection", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_GATT_CACHING && BT_NIMBLE_50_FEATURE_SUPPORT && BT_NIMBLE_ENABLED", + "help": "Set this option to set the upper limit on number of descriptors per connection to be cached.", + "id": "BT_NIMBLE_GATT_CACHING_MAX_DSCS", + "name": "BT_NIMBLE_GATT_CACHING_MAX_DSCS", + "range": null, + "title": "Maximum number of descriptors per connection", + "type": "int" + } + ], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_50_FEATURE_SUPPORT && BT_NIMBLE_50_FEATURE_SUPPORT && BT_NIMBLE_ENABLED", + "help": "Enable GATT caching", + "id": "BT_NIMBLE_GATT_CACHING", + "is_menuconfig": true, + "name": "BT_NIMBLE_GATT_CACHING", + "range": null, + "title": "Enable GATT caching", + "type": "menu" + } + ], + "depends_on": "BT_NIMBLE_ENABLED && (SOC_BLE_50_SUPPORTED || !BT_CONTROLLER_ENABLED) && BT_NIMBLE_ENABLED", + "help": "Enable BLE 5 feature", + "id": "BT_NIMBLE_50_FEATURE_SUPPORT", + "is_menuconfig": true, + "name": "BT_NIMBLE_50_FEATURE_SUPPORT", + "range": null, + "title": "Enable BLE 5 feature", + "type": "menu" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_GATT_CACHING && BT_NIMBLE_ENABLED", + "help": "When client receives ATT out-of-sync error message, it will not automatically start the discovery procedure\nto correct the invalid cache.", + "id": "BT_NIMBLE_GATT_CACHING_DISABLE_AUTO", + "name": "BT_NIMBLE_GATT_CACHING_DISABLE_AUTO", + "range": null, + "title": "Do not start discovery procedure automatically upon receiving Out of Sync", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "BLE list size", + "id": "BT_NIMBLE_WHITELIST_SIZE", + "name": "BT_NIMBLE_WHITELIST_SIZE", + "range": null, + "title": "BLE white list size", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED", + "help": "Enable the throughput test mode", + "id": "BT_NIMBLE_TEST_THROUGHPUT_TEST", + "name": "BT_NIMBLE_TEST_THROUGHPUT_TEST", + "range": null, + "title": "Throughput Test Mode enable", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Set this option to enable blufi functionality.", + "id": "BT_NIMBLE_BLUFI_ENABLE", + "name": "BT_NIMBLE_BLUFI_ENABLE", + "range": null, + "title": "Enable blufi functionality", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED", + "help": "Set this option to use Esp Timer which has higher priority timer instead of FreeRTOS timer", + "id": "BT_NIMBLE_USE_ESP_TIMER", + "name": "BT_NIMBLE_USE_ESP_TIMER", + "range": null, + "title": "Enable Esp Timer for Nimble", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED", + "help": "This option is used to distinguish whether a previous version of VHCI is being used", + "id": "BT_NIMBLE_LEGACY_VHCI_ENABLE", + "name": "BT_NIMBLE_LEGACY_VHCI_ENABLE", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED", + "help": "This option is used when data to be sent is more than 512 bytes. For peripheral role,\nBT_NIMBLE_MSYS_1_BLOCK_COUNT needs to be increased according to the need.", + "id": "BT_NIMBLE_BLE_GATT_BLOB_TRANSFER", + "name": "BT_NIMBLE_BLE_GATT_BLOB_TRANSFER", + "range": null, + "title": "Blob transfer", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "BT_NIMBLE_SVC_GAP_APPEAR_WRITE && BT_NIMBLE_ENABLED", + "help": "Enable write with encryption permission (BLE_GATT_CHR_F_WRITE_ENC)", + "id": "BT_NIMBLE_SVC_GAP_APPEAR_WRITE_ENC", + "name": "BT_NIMBLE_SVC_GAP_APPEAR_WRITE_ENC", + "range": null, + "title": "Write with encryption", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_SVC_GAP_APPEAR_WRITE && BT_NIMBLE_ENABLED", + "help": "Enable write with authentication permission (BLE_GATT_CHR_F_WRITE_AUTHEN)", + "id": "BT_NIMBLE_SVC_GAP_APPEAR_WRITE_AUTHEN", + "name": "BT_NIMBLE_SVC_GAP_APPEAR_WRITE_AUTHEN", + "range": null, + "title": "Write with authentication", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_SVC_GAP_APPEAR_WRITE && BT_NIMBLE_ENABLED", + "help": "Enable write with authorisation permission (BLE_GATT_CHR_F_WRITE_AUTHOR)", + "id": "BT_NIMBLE_SVC_GAP_APPEAR_WRITE_AUTHOR", + "name": "BT_NIMBLE_SVC_GAP_APPEAR_WRITE_AUTHOR", + "range": null, + "title": "Write with authorisation", + "type": "bool" + } + ], + "depends_on": "BT_NIMBLE_ENABLED", + "help": "Enable write permission (BLE_GATT_CHR_F_WRITE)", + "id": "BT_NIMBLE_SVC_GAP_APPEAR_WRITE", + "name": "BT_NIMBLE_SVC_GAP_APPEAR_WRITE", + "range": null, + "title": "Write", + "type": "bool" + } + ], + "depends_on": "BT_NIMBLE_ENABLED", + "id": "component-config-bluetooth-nimble-options-gap-service-gap-appearance-write-permissions", + "title": "GAP Appearance write permissions", + "type": "menu" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED", + "help": null, + "id": "BT_NIMBLE_SVC_GAP_APPEAR_WRITE_PERM", + "name": "BT_NIMBLE_SVC_GAP_APPEAR_WRITE_PERM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED", + "help": null, + "id": "BT_NIMBLE_SVC_GAP_APPEAR_WRITE_PERM_ENC", + "name": "BT_NIMBLE_SVC_GAP_APPEAR_WRITE_PERM_ENC", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED", + "help": null, + "id": "BT_NIMBLE_SVC_GAP_APPEAR_WRITE_PERM_ATHN", + "name": "BT_NIMBLE_SVC_GAP_APPEAR_WRITE_PERM_ATHN", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED", + "help": null, + "id": "BT_NIMBLE_SVC_GAP_APPEAR_WRITE_PERM_ATHR", + "name": "BT_NIMBLE_SVC_GAP_APPEAR_WRITE_PERM_ATHR", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_NIMBLE_SVC_GAP_CAR_CHAR_NOT_SUPP", + "name": "BT_NIMBLE_SVC_GAP_CAR_CHAR_NOT_SUPP", + "range": null, + "title": "Characteristic not supported", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_NIMBLE_SVC_GAP_CAR_NOT_SUPP", + "name": "BT_NIMBLE_SVC_GAP_CAR_NOT_SUPP", + "range": null, + "title": "Central Address Resolution not supported", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BT_NIMBLE_SVC_GAP_CAR_SUPP", + "name": "BT_NIMBLE_SVC_GAP_CAR_SUPP", + "range": null, + "title": "Central Address Resolution supported", + "type": "bool" + } + ], + "depends_on": "BT_NIMBLE_ENABLED", + "help": "Weather or not Central Address Resolution characteristic is supported on\nthe device, and if supported, weather or not Central Address Resolution\nis supported.\n\n- Central Address Resolution characteristic not supported\n- Central Address Resolution not supported\n- Central Address Resolution supported", + "id": "component-config-bluetooth-nimble-options-gap-service-gap-characteristic-central-address-resolution", + "name": "BT_NIMBLE_SVC_GAP_CENT_ADDR_RESOLUTION", + "title": "GAP Characteristic - Central Address Resolution", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED", + "help": null, + "id": "BT_NIMBLE_SVC_GAP_CENT_ADDR_RESOLUTION", + "name": "BT_NIMBLE_SVC_GAP_CENT_ADDR_RESOLUTION", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "BT_NIMBLE_SVC_GAP_NAME_WRITE && BT_NIMBLE_ENABLED", + "help": "Enable write with encryption permission (BLE_GATT_CHR_F_WRITE_ENC)", + "id": "BT_NIMBLE_SVC_GAP_NAME_WRITE_ENC", + "name": "BT_NIMBLE_SVC_GAP_NAME_WRITE_ENC", + "range": null, + "title": "Write with encryption", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_SVC_GAP_NAME_WRITE && BT_NIMBLE_ENABLED", + "help": "Enable write with authentication permission (BLE_GATT_CHR_F_WRITE_AUTHEN)", + "id": "BT_NIMBLE_SVC_GAP_NAME_WRITE_AUTHEN", + "name": "BT_NIMBLE_SVC_GAP_NAME_WRITE_AUTHEN", + "range": null, + "title": "Write with authentication", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_SVC_GAP_NAME_WRITE && BT_NIMBLE_ENABLED", + "help": "Enable write with authorisation permission (BLE_GATT_CHR_F_WRITE_AUTHOR)", + "id": "BT_NIMBLE_SVC_GAP_NAME_WRITE_AUTHOR", + "name": "BT_NIMBLE_SVC_GAP_NAME_WRITE_AUTHOR", + "range": null, + "title": "Write with authorisation", + "type": "bool" + } + ], + "depends_on": "BT_NIMBLE_ENABLED", + "help": "Enable write permission (BLE_GATT_CHR_F_WRITE)", + "id": "BT_NIMBLE_SVC_GAP_NAME_WRITE", + "name": "BT_NIMBLE_SVC_GAP_NAME_WRITE", + "range": null, + "title": "Write", + "type": "bool" + } + ], + "depends_on": "BT_NIMBLE_ENABLED", + "id": "component-config-bluetooth-nimble-options-gap-service-gap-device-name-write-permissions", + "title": "GAP device name write permissions", + "type": "menu" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED", + "help": null, + "id": "BT_NIMBLE_SVC_GAP_NAME_WRITE_PERM", + "name": "BT_NIMBLE_SVC_GAP_NAME_WRITE_PERM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED", + "help": null, + "id": "BT_NIMBLE_SVC_GAP_NAME_WRITE_PERM_ENC", + "name": "BT_NIMBLE_SVC_GAP_NAME_WRITE_PERM_ENC", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED", + "help": null, + "id": "BT_NIMBLE_SVC_GAP_NAME_WRITE_PERM_AUTHEN", + "name": "BT_NIMBLE_SVC_GAP_NAME_WRITE_PERM_AUTHEN", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED", + "help": null, + "id": "BT_NIMBLE_SVC_GAP_NAME_WRITE_PERM_AUTHOR", + "name": "BT_NIMBLE_SVC_GAP_NAME_WRITE_PERM_AUTHOR", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ROLE_PERIPHERAL && BT_NIMBLE_ENABLED", + "help": "Peripheral Preferred Connection Parameter: Connection Interval maximum value\nInterval Max = value * 1.25 ms", + "id": "BT_NIMBLE_SVC_GAP_PPCP_MAX_CONN_INTERVAL", + "name": "BT_NIMBLE_SVC_GAP_PPCP_MAX_CONN_INTERVAL", + "range": null, + "title": "PPCP Connection Interval Max (Unit: 1.25 ms)", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ROLE_PERIPHERAL && BT_NIMBLE_ENABLED", + "help": "Peripheral Preferred Connection Parameter: Connection Interval minimum value\nInterval Min = value * 1.25 ms", + "id": "BT_NIMBLE_SVC_GAP_PPCP_MIN_CONN_INTERVAL", + "name": "BT_NIMBLE_SVC_GAP_PPCP_MIN_CONN_INTERVAL", + "range": null, + "title": "PPCP Connection Interval Min (Unit: 1.25 ms)", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED", + "help": "Peripheral Preferred Connection Parameter: Slave Latency", + "id": "BT_NIMBLE_SVC_GAP_PPCP_SLAVE_LATENCY", + "name": "BT_NIMBLE_SVC_GAP_PPCP_SLAVE_LATENCY", + "range": null, + "title": "PPCP Slave Latency", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED", + "help": "Peripheral Preferred Connection Parameter: Supervision Timeout\nTimeout = Value * 10 ms", + "id": "BT_NIMBLE_SVC_GAP_PPCP_SUPERVISION_TMO", + "name": "BT_NIMBLE_SVC_GAP_PPCP_SUPERVISION_TMO", + "range": null, + "title": "PPCP Supervision Timeout (Uint: 10 ms)", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED", + "help": "Enable the LE GATT Security Level Characteristic", + "id": "BT_NIMBLE_SVC_GAP_GATT_SECURITY_LEVEL", + "name": "BT_NIMBLE_SVC_GAP_GATT_SECURITY_LEVEL", + "range": null, + "title": "LE GATT Security Level Characteristic", + "type": "bool" + } + ], + "depends_on": "BT_NIMBLE_ENABLED", + "id": "component-config-bluetooth-nimble-options-gap-service", + "title": "GAP Service", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "BT_NIMBLE_HID_SERVICE && BT_NIMBLE_ENABLED", + "help": "Defines maximum number of HID service instances", + "id": "BT_NIMBLE_SVC_HID_MAX_INSTANCES", + "name": "BT_NIMBLE_SVC_HID_MAX_INSTANCES", + "range": null, + "title": "Maximum HID service instances", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_HID_SERVICE && BT_NIMBLE_ENABLED", + "help": "Defines maximum number of report characteristics per service instance", + "id": "BT_NIMBLE_SVC_HID_MAX_RPTS", + "name": "BT_NIMBLE_SVC_HID_MAX_RPTS", + "range": null, + "title": "Maximum HID Report characteristics per service instance", + "type": "int" + } + ], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Enable HID service support", + "id": "BT_NIMBLE_HID_SERVICE", + "is_menuconfig": true, + "name": "BT_NIMBLE_HID_SERVICE", + "range": null, + "title": "HID service", + "type": "menu" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Enable/Disable notifications on BAS Battery Level Characteristic", + "id": "BT_NIMBLE_SVC_BAS_BATTERY_LEVEL_NOTIFY", + "name": "BT_NIMBLE_SVC_BAS_BATTERY_LEVEL_NOTIFY", + "range": null, + "title": "BAS Battery Level NOTIFY permission", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Enable the DIS characteristic Manufacturer Name String characteristic", + "id": "BT_NIMBLE_SVC_DIS_MANUFACTURER_NAME", + "name": "BT_NIMBLE_SVC_DIS_MANUFACTURER_NAME", + "range": null, + "title": "Manufacturer Name", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Enable the DIS Serial Number characteristic", + "id": "BT_NIMBLE_SVC_DIS_SERIAL_NUMBER", + "name": "BT_NIMBLE_SVC_DIS_SERIAL_NUMBER", + "range": null, + "title": "Serial Number", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Enable the DIS Hardware Revision characteristic", + "id": "BT_NIMBLE_SVC_DIS_HARDWARE_REVISION", + "name": "BT_NIMBLE_SVC_DIS_HARDWARE_REVISION", + "range": null, + "title": "Hardware Revision", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Enable the DIS Firmware Revision characteristic", + "id": "BT_NIMBLE_SVC_DIS_FIRMWARE_REVISION", + "name": "BT_NIMBLE_SVC_DIS_FIRMWARE_REVISION", + "range": null, + "title": "Firmware Revision", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Enable the DIS Software Revision characteristic", + "id": "BT_NIMBLE_SVC_DIS_SOFTWARE_REVISION", + "name": "BT_NIMBLE_SVC_DIS_SOFTWARE_REVISION", + "range": null, + "title": "Software Revision", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Enable the DIS System ID characteristic", + "id": "BT_NIMBLE_SVC_DIS_SYSTEM_ID", + "name": "BT_NIMBLE_SVC_DIS_SYSTEM_ID", + "range": null, + "title": "System ID", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Enable the DIS PnP ID characteristic", + "id": "BT_NIMBLE_SVC_DIS_PNP_ID", + "name": "BT_NIMBLE_SVC_DIS_PNP_ID", + "range": null, + "title": "PnP ID", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Use DIS as an included service", + "id": "BT_NIMBLE_SVC_DIS_INCLUDED", + "name": "BT_NIMBLE_SVC_DIS_INCLUDED", + "range": null, + "title": "DIS as an Included Service", + "type": "bool" + } + ], + "depends_on": "BT_NIMBLE_ENABLED", + "id": "component-config-bluetooth-nimble-options-ble-services-device-information-service", + "title": "Device Information Service", + "type": "menu" + } + ], + "depends_on": "BT_NIMBLE_ENABLED", + "id": "component-config-bluetooth-nimble-options-ble-services", + "title": "BLE Services", + "type": "menu" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED", + "help": "This option is used to enable support for sending Vendor Specific HCI commands and handling\nVendor Specific HCI Events.", + "id": "BT_NIMBLE_VS_SUPPORT", + "name": "BT_NIMBLE_VS_SUPPORT", + "range": null, + "title": "Enable support for VSC and VSE", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_BLE_MULTI_CONN_OPTIMIZATION && BT_NIMBLE_ENABLED", + "help": "This option enables the use of vendor-specific APIs for multi-connections, which can\ngreatly enhance the stability of coexistence between numerous central and peripheral\ndevices. It will prohibit the usage of standard APIs.", + "id": "BT_NIMBLE_OPTIMIZE_MULTI_CONN", + "name": "BT_NIMBLE_OPTIMIZE_MULTI_CONN", + "range": null, + "title": "Enable the optimization of multi-connection", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENC_ADV_DATA && BT_NIMBLE_ENABLED", + "help": "Defines maximum number of encrypted advertising data key material to save", + "id": "BT_NIMBLE_MAX_EADS", + "name": "BT_NIMBLE_MAX_EADS", + "range": null, + "title": "Maximum number of EAD devices to save across reboots", + "type": "int" + } + ], + "depends_on": "BT_NIMBLE_ENABLED", + "help": "This option is used to enable encrypted advertising data.", + "id": "BT_NIMBLE_ENC_ADV_DATA", + "name": "BT_NIMBLE_ENC_ADV_DATA", + "range": null, + "title": "Encrypted Advertising Data", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "This enable BLE high duty advertising interval feature", + "id": "BT_NIMBLE_HIGH_DUTY_ADV_ITVL", + "name": "BT_NIMBLE_HIGH_DUTY_ADV_ITVL", + "range": null, + "title": "Enable BLE high duty advertising interval feature", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && (IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32S3) && BT_NIMBLE_ENABLED", + "help": "This enables support for user to initiate a new connection with scan in progress", + "id": "BT_NIMBLE_HOST_ALLOW_CONNECT_WITH_SCAN", + "name": "BT_NIMBLE_HOST_ALLOW_CONNECT_WITH_SCAN", + "range": null, + "title": "Allow Connections with scanning in progress", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "When scanning and scan duplicate is not enabled, if there are a lot of adv packets around\nor application layer handling adv packets is slow, it will cause the controller memory\nto run out. if enabled, adv packets will be lost when host queue is congested.", + "id": "BT_NIMBLE_HOST_QUEUE_CONG_CHECK", + "name": "BT_NIMBLE_HOST_QUEUE_CONG_CHECK", + "range": null, + "title": "BLE queue congestion check", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "When BLE and Wireless protocol/IEEE 802.15.4 operate in coexistence, BLE preemption\ncan disrupt the GATT context,causing the service discovery callback to not be invoked.\nA temporary list is maintained to preserve the GATT context and use it in case of preemption.", + "id": "BT_NIMBLE_GATTC_PROC_PREEMPTION_PROTECT", + "name": "BT_NIMBLE_GATTC_PROC_PREEMPTION_PROTECT", + "range": null, + "title": "Gatt-proc preemption protect check", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "BT_CONTROLLER_DISABLED && BT_NIMBLE_TRANSPORT_UART && BT_NIMBLE_ENABLED", + "help": "Uart port", + "id": "BT_NIMBLE_TRANSPORT_UART_PORT", + "name": "BT_NIMBLE_TRANSPORT_UART_PORT", + "range": null, + "title": "Uart port", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "UART_BAUDRATE_115200", + "name": "UART_BAUDRATE_115200", + "range": null, + "title": "115200", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "UART_BAUDRATE_230400", + "name": "UART_BAUDRATE_230400", + "range": null, + "title": "230400", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "UART_BAUDRATE_460800", + "name": "UART_BAUDRATE_460800", + "range": null, + "title": "460800", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "UART_BAUDRATE_921600", + "name": "UART_BAUDRATE_921600", + "range": null, + "title": "921600", + "type": "bool" + } + ], + "depends_on": "BT_CONTROLLER_DISABLED && BT_NIMBLE_TRANSPORT_UART && BT_NIMBLE_ENABLED", + "help": "Uart Baud Rate", + "id": "component-config-bluetooth-nimble-options-host-controller-transport-enable-uart-transport-uart-hci-baud-rate", + "name": "BT_NIMBLE_HCI_USE_UART_BAUDRATE", + "title": "Uart Hci Baud Rate", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_CONTROLLER_DISABLED && BT_NIMBLE_TRANSPORT_UART && BT_NIMBLE_ENABLED", + "help": null, + "id": "BT_NIMBLE_HCI_UART_BAUDRATE", + "name": "BT_NIMBLE_HCI_UART_BAUDRATE", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "UART_PARITY_NONE", + "name": "UART_PARITY_NONE", + "range": null, + "title": "None", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "UART_PARITY_ODD", + "name": "UART_PARITY_ODD", + "range": null, + "title": "Odd", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "UART_PARITY_EVEN", + "name": "UART_PARITY_EVEN", + "range": null, + "title": "Even", + "type": "bool" + } + ], + "depends_on": "BT_CONTROLLER_DISABLED && BT_NIMBLE_TRANSPORT_UART && BT_NIMBLE_ENABLED", + "help": "Uart Parity", + "id": "component-config-bluetooth-nimble-options-host-controller-transport-enable-uart-transport-uart-parity", + "name": "BT_NIMBLE_USE_HCI_UART_PARITY", + "title": "Uart PARITY", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_CONTROLLER_DISABLED && BT_NIMBLE_TRANSPORT_UART && BT_NIMBLE_ENABLED", + "help": null, + "id": "BT_NIMBLE_TRANSPORT_UART_PARITY_NONE", + "name": "BT_NIMBLE_TRANSPORT_UART_PARITY_NONE", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "BT_CONTROLLER_DISABLED && BT_NIMBLE_TRANSPORT_UART && BT_NIMBLE_ENABLED", + "help": null, + "id": "BT_NIMBLE_TRANSPORT_UART_PARITY_ODD", + "name": "BT_NIMBLE_TRANSPORT_UART_PARITY_ODD", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "BT_CONTROLLER_DISABLED && BT_NIMBLE_TRANSPORT_UART && BT_NIMBLE_ENABLED", + "help": null, + "id": "BT_NIMBLE_TRANSPORT_UART_PARITY_EVEN", + "name": "BT_NIMBLE_TRANSPORT_UART_PARITY_EVEN", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "BT_CONTROLLER_DISABLED && BT_NIMBLE_TRANSPORT_UART && BT_NIMBLE_ENABLED", + "help": "Rx pin for Nimble Transport", + "id": "BT_NIMBLE_UART_RX_PIN", + "name": "BT_NIMBLE_UART_RX_PIN", + "range": null, + "title": "UART Rx pin", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_CONTROLLER_DISABLED && BT_NIMBLE_TRANSPORT_UART && BT_NIMBLE_ENABLED", + "help": "Tx pin for Nimble Transport", + "id": "BT_NIMBLE_UART_TX_PIN", + "name": "BT_NIMBLE_UART_TX_PIN", + "range": null, + "title": "UART Tx pin", + "type": "int" + } + ], + "depends_on": "BT_CONTROLLER_DISABLED && BT_NIMBLE_ENABLED", + "help": "Use UART transport", + "id": "BT_NIMBLE_TRANSPORT_UART", + "name": "BT_NIMBLE_TRANSPORT_UART", + "range": null, + "title": "Enable Uart Transport", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "UART_HW_FLOWCTRL_DISABLE", + "name": "UART_HW_FLOWCTRL_DISABLE", + "range": null, + "title": "Disable", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "UART_HW_FLOWCTRL_CTS_RTS", + "name": "UART_HW_FLOWCTRL_CTS_RTS", + "range": null, + "title": "Enable hardware flow control", + "type": "bool" + } + ], + "depends_on": "BT_NIMBLE_ENABLED", + "help": "Uart Flow Control", + "id": "component-config-bluetooth-nimble-options-host-controller-transport-uart-flow-control", + "name": "BT_NIMBLE_USE_HCI_UART_FLOW_CTRL", + "title": "Uart Flow Control", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED", + "help": null, + "id": "BT_NIMBLE_HCI_UART_FLOW_CTRL", + "name": "BT_NIMBLE_HCI_UART_FLOW_CTRL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED", + "help": "UART HCI RTS pin", + "id": "BT_NIMBLE_HCI_UART_RTS_PIN", + "name": "BT_NIMBLE_HCI_UART_RTS_PIN", + "range": null, + "title": "UART Rts Pin", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED", + "help": "UART HCI CTS pin", + "id": "BT_NIMBLE_HCI_UART_CTS_PIN", + "name": "BT_NIMBLE_HCI_UART_CTS_PIN", + "range": null, + "title": "UART Cts Pin", + "type": "int" + } + ], + "depends_on": "BT_NIMBLE_ENABLED", + "id": "component-config-bluetooth-nimble-options-host-controller-transport", + "title": "Host-controller Transport", + "type": "menu" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Defines the number of channels EATT bearers can use", + "id": "BT_NIMBLE_EATT_CHAN_NUM", + "name": "BT_NIMBLE_EATT_CHAN_NUM", + "range": null, + "title": "Maximum number of EATT channels", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED && BT_NIMBLE_ENABLED", + "help": "Enable connection subrate change feature", + "id": "BT_NIMBLE_SUBRATE", + "name": "BT_NIMBLE_SUBRATE", + "range": null, + "title": "Enable Subrate Change", + "type": "bool" + } + ], + "depends_on": "BT_NIMBLE_ENABLED", + "id": "component-config-bluetooth-nimble-options", + "title": "NimBLE Options", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BTDM_CTRL_MODE_BLE_ONLY", + "name": "BTDM_CTRL_MODE_BLE_ONLY", + "range": null, + "title": "BLE Only", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BTDM_CTRL_MODE_BR_EDR_ONLY", + "name": "BTDM_CTRL_MODE_BR_EDR_ONLY", + "range": null, + "title": "BR/EDR Only", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BTDM_CTRL_MODE_BTDM", + "name": "BTDM_CTRL_MODE_BTDM", + "range": null, + "title": "Bluetooth Dual Mode", + "type": "bool" + } + ], + "depends_on": "BT_CONTROLLER_ENABLED", + "help": "Specify the bluetooth controller mode (BR/EDR, BLE or dual mode).", + "id": "component-config-bluetooth-controller-options-bluetooth-controller-mode-br-edr-ble-dualmode-", + "name": "BTDM_CTRL_MODE", + "title": "Bluetooth controller mode (BR/EDR/BLE/DUALMODE)", + "type": "choice" + }, + { + "children": [], + "depends_on": "(BTDM_CTRL_MODE_BLE_ONLY || BTDM_CTRL_MODE_BTDM) && BT_CONTROLLER_ENABLED", + "help": "BLE maximum connections of bluetooth controller.\nEach connection uses 1KB static DRAM whenever the BT controller is enabled.", + "id": "BTDM_CTRL_BLE_MAX_CONN", + "name": "BTDM_CTRL_BLE_MAX_CONN", + "range": null, + "title": "BLE Max Connections", + "type": "int" + }, + { + "children": [], + "depends_on": "(BTDM_CTRL_MODE_BR_EDR_ONLY || BTDM_CTRL_MODE_BTDM) && BT_CONTROLLER_ENABLED", + "help": "BR/EDR default minimum size of encryption key when start encryption.", + "id": "BTDM_CTRL_BR_EDR_MIN_ENC_KEY_SZ_DFT", + "name": "BTDM_CTRL_BR_EDR_MIN_ENC_KEY_SZ_DFT", + "range": null, + "title": "BR/EDR default minimum size of encryption key", + "type": "int" + }, + { + "children": [], + "depends_on": "(BTDM_CTRL_MODE_BR_EDR_ONLY || BTDM_CTRL_MODE_BTDM) && BT_CONTROLLER_ENABLED", + "help": "BR/EDR ACL maximum connections of bluetooth controller.\nEach connection uses 1.2 KB DRAM whenever the BT controller is enabled.", + "id": "BTDM_CTRL_BR_EDR_MAX_ACL_CONN", + "name": "BTDM_CTRL_BR_EDR_MAX_ACL_CONN", + "range": null, + "title": "BR/EDR ACL Max Connections", + "type": "int" + }, + { + "children": [], + "depends_on": "(BTDM_CTRL_MODE_BR_EDR_ONLY || BTDM_CTRL_MODE_BTDM) && BT_CONTROLLER_ENABLED", + "help": "BR/EDR Synchronize maximum connections of bluetooth controller.\nEach connection uses 2 KB DRAM whenever the BT controller is enabled.", + "id": "BTDM_CTRL_BR_EDR_MAX_SYNC_CONN", + "name": "BTDM_CTRL_BR_EDR_MAX_SYNC_CONN", + "range": null, + "title": "BR/EDR Sync(SCO/eSCO) Max Connections", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BTDM_CTRL_BR_EDR_SCO_DATA_PATH_HCI", + "name": "BTDM_CTRL_BR_EDR_SCO_DATA_PATH_HCI", + "range": null, + "title": "HCI", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BTDM_CTRL_BR_EDR_SCO_DATA_PATH_PCM", + "name": "BTDM_CTRL_BR_EDR_SCO_DATA_PATH_PCM", + "range": null, + "title": "PCM", + "type": "bool" + } + ], + "depends_on": "(BTDM_CTRL_MODE_BR_EDR_ONLY || BTDM_CTRL_MODE_BTDM) && BT_CONTROLLER_ENABLED", + "help": "SCO data path, i.e. HCI or PCM.\nSCO data can be sent/received through HCI synchronous packets, or the data\ncan be routed to on-chip PCM module on ESP32. PCM input/output signals can\nbe \"matrixed\" to GPIOs. The default data path can also be set using API\n\"esp_bredr_sco_datapath_set\"", + "id": "component-config-bluetooth-controller-options-br-edr-sync-sco-esco-default-data-path", + "name": "BTDM_CTRL_BR_EDR_SCO_DATA_PATH", + "title": "BR/EDR Sync(SCO/eSCO) default data path", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_CONTROLLER_ENABLED", + "help": null, + "id": "BTDM_CTRL_BR_EDR_SCO_DATA_PATH_EFF", + "name": "BTDM_CTRL_BR_EDR_SCO_DATA_PATH_EFF", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BTDM_CTRL_PCM_ROLE_MASTER", + "name": "BTDM_CTRL_PCM_ROLE_MASTER", + "range": null, + "title": "PCM Master", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BTDM_CTRL_PCM_ROLE_SLAVE", + "name": "BTDM_CTRL_PCM_ROLE_SLAVE", + "range": null, + "title": "PCM Slave", + "type": "bool" + } + ], + "depends_on": "BTDM_CTRL_PCM_ROLE_EDGE_CONFIG && BT_CONTROLLER_ENABLED", + "help": "PCM role can be configured as PCM master or PCM slave", + "id": "component-config-bluetooth-controller-options-pcm-signal-configurations-role-polar-and-channel-mode-stereo-mono--pcm-role", + "name": "BTDM_CTRL_PCM_ROLE", + "title": "PCM Role", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BTDM_CTRL_PCM_POLAR_FALLING_EDGE", + "name": "BTDM_CTRL_PCM_POLAR_FALLING_EDGE", + "range": null, + "title": "Falling Edge", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BTDM_CTRL_PCM_POLAR_RISING_EDGE", + "name": "BTDM_CTRL_PCM_POLAR_RISING_EDGE", + "range": null, + "title": "Rising Edge", + "type": "bool" + } + ], + "depends_on": "BTDM_CTRL_PCM_ROLE_EDGE_CONFIG && BT_CONTROLLER_ENABLED", + "help": "PCM polarity can be configured as Falling Edge or Rising Edge", + "id": "component-config-bluetooth-controller-options-pcm-signal-configurations-role-polar-and-channel-mode-stereo-mono--pcm-polar", + "name": "BTDM_CTRL_PCM_POLAR", + "title": "PCM Polar", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": "Stereo Mode(Dual channel): FSYNC and DOUT signals both change simultaneously on the edge of CLK.\nThe FSYNC signal continues until the end of the current channel-data transmission.\n(There is a waveform graph under the path examples/bluetooth/bluedroid/classic_bt/hfp_ag/image)", + "id": "BTDM_CTRL_PCM_FSYNCSHP_STEREO_MODE", + "name": "BTDM_CTRL_PCM_FSYNCSHP_STEREO_MODE", + "range": null, + "title": "Stereo Mode", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "Mono Mode 1(Single channel): FSYNC signal starts to change a CLK clock cycle earlier than the DOUT signal.\nThe FSYNC signal continues for one extra CLK clock cycle.\n(There is a waveform graph under the path examples/bluetooth/bluedroid/classic_bt/hfp_ag/image)", + "id": "BTDM_CTRL_PCM_FSYNCSHP_MONO_MODE_LF", + "name": "BTDM_CTRL_PCM_FSYNCSHP_MONO_MODE_LF", + "range": null, + "title": "Mono Mode 1", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "Mono Mode 2(Single channel): FSYNC and DOUT signals both change simultaneously on the edge of CLK.\nThe FSYNC signal continues for one extra CLK clock cycle.\n(There is a waveform graph under the path examples/bluetooth/bluedroid/classic_bt/hfp_ag/image)", + "id": "BTDM_CTRL_PCM_FSYNCSHP_MONO_MODE_FF", + "name": "BTDM_CTRL_PCM_FSYNCSHP_MONO_MODE_FF", + "range": null, + "title": "Mono Mode 2", + "type": "bool" + } + ], + "depends_on": "BTDM_CTRL_PCM_ROLE_EDGE_CONFIG && BT_CONTROLLER_ENABLED", + "help": "PCM frame synchronization signal shape can be configured as Stereo Mode or Mono Mode.\n(There are detailed instructions under the path examples/bluetooth/bluedroid/classic_bt/hfp_ag/README.md)", + "id": "component-config-bluetooth-controller-options-pcm-signal-configurations-role-polar-and-channel-mode-stereo-mono--channel-mode-stereo-mono-", + "name": "BTDM_CTRL_PCM_FSYNCSHP", + "title": "Channel Mode(Stereo/Mono)", + "type": "choice" + } + ], + "depends_on": "BTDM_CTRL_BR_EDR_SCO_DATA_PATH_PCM && BT_CONTROLLER_ENABLED", + "help": null, + "id": "BTDM_CTRL_PCM_ROLE_EDGE_CONFIG", + "is_menuconfig": true, + "name": "BTDM_CTRL_PCM_ROLE_EDGE_CONFIG", + "range": null, + "title": "PCM Signal Configurations: Role, Polar and Channel Mode(Stereo/Mono)", + "type": "menu" + }, + { + "children": [], + "depends_on": "BT_CONTROLLER_ENABLED", + "help": null, + "id": "BTDM_CTRL_PCM_ROLE_EFF", + "name": "BTDM_CTRL_PCM_ROLE_EFF", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "BT_CONTROLLER_ENABLED", + "help": null, + "id": "BTDM_CTRL_PCM_POLAR_EFF", + "name": "BTDM_CTRL_PCM_POLAR_EFF", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "BT_CONTROLLER_ENABLED", + "help": null, + "id": "BTDM_CTRL_PCM_FSYNCSHP_EFF", + "name": "BTDM_CTRL_PCM_FSYNCSHP_EFF", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "BTDM_CTRL_MODE_BTDM && BT_CONTROLLER_ENABLED", + "help": "BLE auto latency, used to enhance classic BT performance\nwhile classic BT and BLE are enabled at the same time.", + "id": "BTDM_CTRL_AUTO_LATENCY", + "name": "BTDM_CTRL_AUTO_LATENCY", + "range": null, + "title": "Auto latency", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_CONTROLLER_ENABLED", + "help": null, + "id": "BTDM_CTRL_AUTO_LATENCY_EFF", + "name": "BTDM_CTRL_AUTO_LATENCY_EFF", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "(BTDM_CTRL_MODE_BR_EDR_ONLY || BTDM_CTRL_MODE_BTDM) && BT_CONTROLLER_ENABLED", + "help": "To protect from BIAS attack during Legacy authentication,\nLegacy authentication Vendor specific event should be enabled", + "id": "BTDM_CTRL_LEGACY_AUTH_VENDOR_EVT", + "name": "BTDM_CTRL_LEGACY_AUTH_VENDOR_EVT", + "range": null, + "title": "Legacy Authentication Vendor Specific Event Enable", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_CONTROLLER_ENABLED", + "help": null, + "id": "BTDM_CTRL_LEGACY_AUTH_VENDOR_EVT_EFF", + "name": "BTDM_CTRL_LEGACY_AUTH_VENDOR_EVT_EFF", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_CONTROLLER_ENABLED", + "help": null, + "id": "BTDM_CTRL_BLE_MAX_CONN_EFF", + "name": "BTDM_CTRL_BLE_MAX_CONN_EFF", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "BT_CONTROLLER_ENABLED", + "help": null, + "id": "BTDM_CTRL_BR_EDR_MIN_ENC_KEY_SZ_DFT_EFF", + "name": "BTDM_CTRL_BR_EDR_MIN_ENC_KEY_SZ_DFT_EFF", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "BT_CONTROLLER_ENABLED", + "help": null, + "id": "BTDM_CTRL_BR_EDR_MAX_ACL_CONN_EFF", + "name": "BTDM_CTRL_BR_EDR_MAX_ACL_CONN_EFF", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "BT_CONTROLLER_ENABLED", + "help": null, + "id": "BTDM_CTRL_BR_EDR_MAX_SYNC_CONN_EFF", + "name": "BTDM_CTRL_BR_EDR_MAX_SYNC_CONN_EFF", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BTDM_CTRL_PINNED_TO_CORE_0", + "name": "BTDM_CTRL_PINNED_TO_CORE_0", + "range": null, + "title": "Core 0 (PRO CPU)", + "type": "bool" + }, + { + "children": [], + "depends_on": "!FREERTOS_UNICORE && ", + "help": null, + "id": "BTDM_CTRL_PINNED_TO_CORE_1", + "name": "BTDM_CTRL_PINNED_TO_CORE_1", + "range": null, + "title": "Core 1 (APP CPU)", + "type": "bool" + } + ], + "depends_on": "!FREERTOS_UNICORE && BT_CONTROLLER_ENABLED", + "help": "Specify the cpu core to run bluetooth controller.\nCan not specify no-affinity.", + "id": "component-config-bluetooth-controller-options-the-cpu-core-which-bluetooth-controller-run", + "name": "BTDM_CTRL_PINNED_TO_CORE_CHOICE", + "title": "The cpu core which bluetooth controller run", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_CONTROLLER_ENABLED", + "help": null, + "id": "BTDM_CTRL_PINNED_TO_CORE", + "name": "BTDM_CTRL_PINNED_TO_CORE", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": "Normal option. Mostly, choose this VHCI when bluetooth host run on ESP32, too.", + "id": "BTDM_CTRL_HCI_MODE_VHCI", + "name": "BTDM_CTRL_HCI_MODE_VHCI", + "range": null, + "title": "VHCI", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "If use external bluetooth host which run on other hardware and use UART as the HCI interface,\nchoose this option.", + "id": "BTDM_CTRL_HCI_MODE_UART_H4", + "name": "BTDM_CTRL_HCI_MODE_UART_H4", + "range": null, + "title": "UART(H4)", + "type": "bool" + } + ], + "depends_on": "BT_CONTROLLER_ENABLED", + "help": "Specify HCI mode as VHCI or UART(H4)", + "id": "component-config-bluetooth-controller-options-hci-mode", + "name": "BTDM_CTRL_HCI_MODE_CHOICE", + "title": "HCI mode", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "BTDM_CTRL_HCI_MODE_UART_H4 && BT_CONTROLLER_ENABLED", + "help": "Uart number for HCI. The available uart is UART1 and UART2.", + "id": "BTDM_CTRL_HCI_UART_NO", + "name": "BTDM_CTRL_HCI_UART_NO", + "range": null, + "title": "UART Number for HCI", + "type": "int" + }, + { + "children": [], + "depends_on": "BTDM_CTRL_HCI_MODE_UART_H4 && BT_CONTROLLER_ENABLED", + "help": "UART Baudrate for HCI. Please use standard baudrate.", + "id": "BTDM_CTRL_HCI_UART_BAUDRATE", + "name": "BTDM_CTRL_HCI_UART_BAUDRATE", + "range": null, + "title": "UART Baudrate for HCI", + "type": "int" + }, + { + "children": [], + "depends_on": "BTDM_CTRL_HCI_MODE_UART_H4 && BT_CONTROLLER_ENABLED", + "help": null, + "id": "BTDM_CTRL_HCI_UART_FLOW_CTRL_EN", + "name": "BTDM_CTRL_HCI_UART_FLOW_CTRL_EN", + "range": null, + "title": "Enable UART flow control", + "type": "bool" + } + ], + "depends_on": "BT_CONTROLLER_ENABLED", + "id": "component-config-bluetooth-controller-options-hci-uart-h4-options", + "title": "HCI UART(H4) Options", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": "ORIG mode is a bluetooth sleep mode that can be used for dual mode controller. In this mode,\nbluetooth controller sleeps between BR/EDR frames and BLE events. A low power clock is used to\nmaintain bluetooth reference clock.", + "id": "BTDM_CTRL_MODEM_SLEEP_MODE_ORIG", + "name": "BTDM_CTRL_MODEM_SLEEP_MODE_ORIG", + "range": null, + "title": "ORIG Mode(sleep with low power clock)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "EVED mode is for BLE only and is only for internal test. Do not use it for production. this\nmode is not compatible with DFS nor light sleep", + "id": "BTDM_CTRL_MODEM_SLEEP_MODE_EVED", + "name": "BTDM_CTRL_MODEM_SLEEP_MODE_EVED", + "range": null, + "title": "EVED Mode(For internal test only)", + "type": "bool" + } + ], + "depends_on": "BTDM_CTRL_MODEM_SLEEP && BT_CONTROLLER_ENABLED", + "help": "To select which strategy to use for modem sleep", + "id": "component-config-bluetooth-controller-options-modem-sleep-options-bluetooth-modem-sleep-bluetooth-modem-sleep-mode", + "name": "BTDM_CTRL_MODEM_SLEEP_MODE", + "title": "Bluetooth Modem sleep mode", + "type": "choice" + } + ], + "depends_on": "BT_CONTROLLER_ENABLED", + "help": "Enable/disable bluetooth controller low power mode.", + "id": "BTDM_CTRL_MODEM_SLEEP", + "name": "BTDM_CTRL_MODEM_SLEEP", + "range": null, + "title": "Bluetooth modem sleep", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": "Main crystal can be used as low power clock for bluetooth modem sleep. If this option is\nselected, bluetooth modem sleep can work under Dynamic Frequency Scaling(DFS) enabled, but\ncannot work when light sleep is enabled. Main crystal has a good performance in accuracy as\nthe bluetooth low power clock source.", + "id": "BTDM_CTRL_LPCLK_SEL_MAIN_XTAL", + "name": "BTDM_CTRL_LPCLK_SEL_MAIN_XTAL", + "range": null, + "title": "Main crystal", + "type": "bool" + }, + { + "children": [], + "depends_on": "(RTC_CLK_SRC_EXT_CRYS || RTC_CLK_SRC_EXT_OSC) && ", + "help": "External 32kHz crystal/oscillator has a nominal frequency of 32.768kHz and provides good frequency\nstability. If used as Bluetooth low power clock, External 32kHz can support Bluetooth\nmodem sleep to be used with both DFS and light sleep.", + "id": "BTDM_CTRL_LPCLK_SEL_EXT_32K_XTAL", + "name": "BTDM_CTRL_LPCLK_SEL_EXT_32K_XTAL", + "range": null, + "title": "External 32kHz crystal/oscillator", + "type": "bool" + } + ], + "depends_on": "BTDM_CTRL_MODEM_SLEEP_MODE_ORIG && BT_CONTROLLER_ENABLED", + "help": "Select the low power clock source for bluetooth controller. Bluetooth low power clock is\nthe clock source to maintain time in sleep mode.\n\n- \"Main crystal\" option provides good accuracy and can support Dynamic Frequency Scaling\n to be used with Bluetooth modem sleep. Light sleep is not supported.\n- \"External 32kHz crystal\" option allows user to use a 32.768kHz crystal as Bluetooth low\n power clock. This option is allowed as long as External 32kHz crystal is configured as\n the system RTC clock source. This option provides good accuracy and supports Bluetooth\n modem sleep to be used alongside Dynamic Frequency Scaling or light sleep.", + "id": "component-config-bluetooth-controller-options-modem-sleep-options-bluetooth-low-power-clock", + "name": "BTDM_CTRL_LOW_POWER_CLOCK", + "title": "Bluetooth low power clock", + "type": "choice" + } + ], + "depends_on": "BT_CONTROLLER_ENABLED", + "id": "component-config-bluetooth-controller-options-modem-sleep-options", + "title": "MODEM SLEEP Options", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "BTDM_CTRL_LPCLK_SEL_EXT_32K_XTAL && BTDM_CTRL_MODE_BLE_ONLY && ", + "help": null, + "id": "BTDM_BLE_DEFAULT_SCA_500PPM", + "name": "BTDM_BLE_DEFAULT_SCA_500PPM", + "range": null, + "title": "251ppm to 500ppm", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BTDM_BLE_DEFAULT_SCA_250PPM", + "name": "BTDM_BLE_DEFAULT_SCA_250PPM", + "range": null, + "title": "151ppm to 250ppm", + "type": "bool" + } + ], + "depends_on": "(BTDM_CTRL_MODE_BLE_ONLY || BTDM_CTRL_MODE_BTDM) && BT_CONTROLLER_ENABLED", + "help": "BLE Sleep Clock Accuracy(SCA) for the local device is used to estimate window widening in BLE\nconnection events. With a lower level of clock accuracy(e.g. 500ppm over 250ppm), the slave\nneeds a larger RX window to synchronize with master in each anchor point, thus resulting in an\nincrease of power consumption but a higher level of robustness in keeping connected. According\nto the requirements of Bluetooth Core specification 4.2, the worst-case accuracy of Classic\nBluetooth Low Power Oscillator (LPO) is +/-250ppm in STANDBY and in low power modes such as\nsniff. For BLE the worst-case SCA is +/-500ppm.\n\n- \"151ppm to 250ppm\" option is the default value for Bluetooth Dual mode\n- \"251ppm to 500ppm\" option can be used in BLE only mode when using external 32kHz crystal as\n low power clock. This option is provided in case that BLE sleep clock has a lower level of\n accuracy, or other error sources contribute to the inaccurate timing during sleep.", + "id": "component-config-bluetooth-controller-options-ble-sleep-clock-accuracy", + "name": "BTDM_BLE_SLEEP_CLOCK_ACCURACY", + "title": "BLE Sleep Clock Accuracy", + "type": "choice" + }, + { + "children": [], + "depends_on": "BT_CONTROLLER_ENABLED", + "help": null, + "id": "BTDM_BLE_SLEEP_CLOCK_ACCURACY_INDEX_EFF", + "name": "BTDM_BLE_SLEEP_CLOCK_ACCURACY_INDEX_EFF", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": "This way is to use advertiser address filtering. The adv packet of the same address is only\nallowed to be reported once", + "id": "BTDM_SCAN_DUPL_TYPE_DEVICE", + "name": "BTDM_SCAN_DUPL_TYPE_DEVICE", + "range": null, + "title": "Scan Duplicate By Device Address", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "This way is to use advertising data filtering. All same advertising data only allow to be reported\nonce even though they are from different devices.", + "id": "BTDM_SCAN_DUPL_TYPE_DATA", + "name": "BTDM_SCAN_DUPL_TYPE_DATA", + "range": null, + "title": "Scan Duplicate By Advertising Data", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "This way is to use advertising data and device address filtering. All different adv packets with\nthe same address are allowed to be reported.", + "id": "BTDM_SCAN_DUPL_TYPE_DATA_DEVICE", + "name": "BTDM_SCAN_DUPL_TYPE_DATA_DEVICE", + "range": null, + "title": "Scan Duplicate By Device Address And Advertising Data", + "type": "bool" + } + ], + "depends_on": "BTDM_BLE_SCAN_DUPL && BT_CONTROLLER_ENABLED", + "help": "Scan duplicate have three ways. one is \"Scan Duplicate By Device Address\", This way is to use\nadvertiser address filtering. The adv packet of the same address is only allowed to be reported once.\nAnother way is \"Scan Duplicate By Device Address And Advertising Data\". This way is to use advertising\ndata and device address filtering. All different adv packets with the same address are allowed to be\nreported. The last way is \"Scan Duplicate By Advertising Data\". This way is to use advertising data\nfiltering. All same advertising data only allow to be reported once even though they are from\ndifferent devices.", + "id": "component-config-bluetooth-controller-options-ble-scan-duplicate-options-scan-duplicate-type", + "name": "BTDM_SCAN_DUPL_TYPE", + "title": "Scan Duplicate Type", + "type": "choice" + }, + { + "children": [], + "depends_on": "BTDM_BLE_SCAN_DUPL && BT_CONTROLLER_ENABLED", + "help": null, + "id": "BTDM_SCAN_DUPL_TYPE", + "name": "BTDM_SCAN_DUPL_TYPE", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "BTDM_BLE_SCAN_DUPL && BT_CONTROLLER_ENABLED", + "help": "Maximum number of devices which can be recorded in scan duplicate filter.\nWhen the maximum amount of device in the filter is reached, the oldest device will be refreshed.", + "id": "BTDM_SCAN_DUPL_CACHE_SIZE", + "name": "BTDM_SCAN_DUPL_CACHE_SIZE", + "range": null, + "title": "Maximum number of devices in scan duplicate filter", + "type": "int" + }, + { + "children": [], + "depends_on": "BTDM_BLE_SCAN_DUPL && BT_CONTROLLER_ENABLED", + "help": "If the period value is non-zero, the controller will periodically clear the device information\nstored in the scan duuplicate filter. If it is 0, the scan duuplicate filter will not be cleared\nuntil the scanning is disabled. Duplicate advertisements for this period should not be sent to the\nHost in advertising report events.\nThere are two scenarios where the ADV packet will be repeatedly reported:\n1. The duplicate scan cache is full, the controller will delete the oldest device information and\nadd new device information.\n2. When the refresh period is up, the controller will clear all device information and start filtering\nagain.", + "id": "BTDM_SCAN_DUPL_CACHE_REFRESH_PERIOD", + "name": "BTDM_SCAN_DUPL_CACHE_REFRESH_PERIOD", + "range": null, + "title": "Duplicate scan list refresh period (seconds)", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "BTDM_BLE_MESH_SCAN_DUPL_EN && BT_CONTROLLER_ENABLED", + "help": "Maximum number of adv packets which can be recorded in duplicate scan cache for BLE Mesh.\nWhen the maximum amount of device in the filter is reached, the cache will be refreshed.", + "id": "BTDM_MESH_DUPL_SCAN_CACHE_SIZE", + "name": "BTDM_MESH_DUPL_SCAN_CACHE_SIZE", + "range": null, + "title": "Maximum number of Mesh adv packets in scan duplicate filter", + "type": "int" + } + ], + "depends_on": "BTDM_BLE_SCAN_DUPL && BT_CONTROLLER_ENABLED", + "help": "This enables the BLE scan duplicate for special BLE Mesh scan.", + "id": "BTDM_BLE_MESH_SCAN_DUPL_EN", + "name": "BTDM_BLE_MESH_SCAN_DUPL_EN", + "range": null, + "title": "Special duplicate scan mechanism for BLE Mesh scan", + "type": "bool" + } + ], + "depends_on": "(BTDM_CTRL_MODE_BTDM || BTDM_CTRL_MODE_BLE_ONLY) && BT_CONTROLLER_ENABLED", + "help": "This select enables parameters setting of BLE scan duplicate.", + "id": "BTDM_BLE_SCAN_DUPL", + "name": "BTDM_BLE_SCAN_DUPL", + "range": null, + "title": "BLE Scan Duplicate Options", + "type": "bool" + }, + { + "children": [], + "depends_on": "(BTDM_CTRL_MODE_BLE_ONLY || BTDM_CTRL_MODE_BTDM) && BT_CONTROLLER_ENABLED", + "help": "The full scan function is mainly used to provide BLE scan performance.\nThis is required for scenes with high scan performance requirements, such as BLE Mesh scenes.", + "id": "BTDM_CTRL_FULL_SCAN_SUPPORTED", + "name": "BTDM_CTRL_FULL_SCAN_SUPPORTED", + "range": null, + "title": "BLE full scan feature supported", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_CONTROLLER_ENABLED", + "help": "Disable active scan backoff. The bluetooth spec requires that scanners should run a backoff procedure to\nminimize collision of scan request PDUs from nultiple scanners. If scan backoff is disabled, in active\nscanning, scan request PDU will be sent every time when HW receives scannable ADV PDU.", + "id": "BTDM_CTRL_SCAN_BACKOFF_UPPERLIMITMAX", + "name": "BTDM_CTRL_SCAN_BACKOFF_UPPERLIMITMAX", + "range": null, + "title": "Disable active scan backoff", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_CONTROLLER_ENABLED", + "help": "Enabling this option will add stricter verification of the Access Address in the CONNECT_IND PDU.\nThis improves security by ensuring that only connection requests with valid Access Addresses are accepted.\nIf disabled, only basic checks are applied, improving compatibility.", + "id": "BTDM_CTRL_CHECK_CONNECT_IND_ACCESS_ADDRESS", + "name": "BTDM_CTRL_CHECK_CONNECT_IND_ACCESS_ADDRESS", + "range": null, + "title": "Enable enhanced Access Address check in CONNECT_IND", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BTDM_BLE_ADV_REPORT_FLOW_CTRL_SUPP && BT_CONTROLLER_ENABLED", + "help": "The number of unprocessed advertising report that Bluedroid can save.If you set\n`BTDM_BLE_ADV_REPORT_FLOW_CTRL_NUM` to a small value, this may cause adv packets lost.\nIf you set `BTDM_BLE_ADV_REPORT_FLOW_CTRL_NUM` to a large value, Bluedroid may cache a\nlot of adv packets and this may cause system memory run out. For example, if you set\nit to 50, the maximum memory consumed by host is 35 * 50 bytes. Please set\n`BTDM_BLE_ADV_REPORT_FLOW_CTRL_NUM` according to your system free memory and handle adv\npackets as fast as possible, otherwise it will cause adv packets lost.", + "id": "BTDM_BLE_ADV_REPORT_FLOW_CTRL_NUM", + "name": "BTDM_BLE_ADV_REPORT_FLOW_CTRL_NUM", + "range": null, + "title": "BLE adv report flow control number", + "type": "int" + }, + { + "children": [], + "depends_on": "BTDM_BLE_ADV_REPORT_FLOW_CTRL_SUPP && BT_CONTROLLER_ENABLED", + "help": "When adv report flow control is enabled, The ADV lost event will be generated when the number\nof ADV packets lost in the controller reaches this threshold. It is better to set a larger value.\nIf you set `BTDM_BLE_ADV_REPORT_DISCARD_THRSHOLD` to a small value or printf every adv lost event, it\nmay cause adv packets lost more.", + "id": "BTDM_BLE_ADV_REPORT_DISCARD_THRSHOLD", + "name": "BTDM_BLE_ADV_REPORT_DISCARD_THRSHOLD", + "range": null, + "title": "BLE adv lost event threshold value", + "type": "int" + } + ], + "depends_on": "(BTDM_CTRL_MODE_BTDM || BTDM_CTRL_MODE_BLE_ONLY) && BT_CONTROLLER_ENABLED", + "help": "The function is mainly used to enable flow control for advertising reports. When it is enabled,\nadvertising reports will be discarded by the controller if the number of unprocessed advertising\nreports exceeds the size of BLE adv report flow control.", + "id": "BTDM_BLE_ADV_REPORT_FLOW_CTRL_SUPP", + "name": "BTDM_BLE_ADV_REPORT_FLOW_CTRL_SUPP", + "range": null, + "title": "BLE adv report flow control supported", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "(BTDM_CTRL_MODE_BLE_ONLY || BTDM_CTRL_MODE_BTDM) && BT_CONTROLLER_ENABLED", + "help": "If this option is enabled, Controller will terminate the connection\nwhen Instant Passed (0x28) error occurs during connection update procedure.", + "id": "BTDM_BLE_LLCP_CONN_UPDATE", + "name": "BTDM_BLE_LLCP_CONN_UPDATE", + "range": null, + "title": "BLE ACL connection update procedure", + "type": "bool" + }, + { + "children": [], + "depends_on": "(BTDM_CTRL_MODE_BLE_ONLY || BTDM_CTRL_MODE_BTDM) && BT_CONTROLLER_ENABLED", + "help": "If this option is enabled, Controller will terminate the connection\nwhen Instant Passed (0x28) error occurs in channel map update procedure.", + "id": "BTDM_BLE_LLCP_CHAN_MAP_UPDATE", + "name": "BTDM_BLE_LLCP_CHAN_MAP_UPDATE", + "range": null, + "title": "BLE ACL channel map update procedure", + "type": "bool" + } + ], + "depends_on": "BT_CONTROLLER_ENABLED", + "id": "component-config-bluetooth-controller-options-ble-disconnects-when-instant-passed-0x28-occurs", + "title": "BLE disconnects when Instant Passed (0x28) occurs", + "type": "menu" + }, + { + "children": [], + "depends_on": "(BTDM_CTRL_MODE_BLE_ONLY || BTDM_CTRL_MODE_BTDM) && BT_CONTROLLER_ENABLED", + "help": "If this option is enabled, The Controller will records the communication quality\nfor each channel and then start a timer to check and update the channel map every 4 seconds.", + "id": "BTDM_BLE_CHAN_ASS_EN", + "name": "BTDM_BLE_CHAN_ASS_EN", + "range": null, + "title": "Enable channel assessment", + "type": "bool" + }, + { + "children": [], + "depends_on": "(BTDM_CTRL_MODE_BTDM || BTDM_CTRL_MODE_BLE_ONLY) && BT_CONTROLLER_ENABLED", + "help": "If this option is disabled, The Controller will not start the LE authenticated payload timer.\nThis option is used for some compatibility problems related to LE ping procedure.", + "id": "BTDM_BLE_PING_EN", + "name": "BTDM_BLE_PING_EN", + "range": null, + "title": "Enable LE Ping procedure", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_ENABLED && BT_CONTROLLER_ENABLED", + "help": "Enables specific debugging features for the Bluetooth controller.\nThis option is strictly for internal debugging purposes and should not be enabled in production environments,\nas it may impact performance and stability.", + "id": "BTDM_CTRL_CONTROLLER_DEBUG_MODE_1", + "name": "BTDM_CTRL_CONTROLLER_DEBUG_MODE_1", + "range": null, + "title": "Enable Bluetooth controller debugging mode 1 (for internal use only)", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_CONTROLLER_ENABLED", + "help": null, + "id": "BTDM_RESERVE_DRAM", + "name": "BTDM_RESERVE_DRAM", + "range": null, + "title": null, + "type": "hex" + }, + { + "children": [], + "depends_on": "BT_ENABLED && BT_CONTROLLER_ENABLED", + "help": "Using Level 4 interrupt for Bluetooth.", + "id": "BTDM_CTRL_HLI", + "name": "BTDM_CTRL_HLI", + "range": null, + "title": "High level interrupt", + "type": "bool" + } + ], + "depends_on": "BT_CONTROLLER_ENABLED", + "id": "component-config-bluetooth-controller-options", + "title": "Controller Options", + "type": "menu" + }, + { + "children": [], + "depends_on": "BT_ENABLED && BT_LE_RELEASE_IRAM_SUPPORTED", + "help": "This option release Bluetooth text section and merge Bluetooth data, bss & text into\na large free heap region when esp_bt_mem_release is called, total saving ~21kB or more of IRAM.\nESP32-C2 only 3 configurable PMP entries available, rest of them are hard-coded.\nWe cannot split the memory into 3 different regions (IRAM, BLE-IRAM, DRAM).\nSo this option will disable the PMP (ESP_SYSTEM_PMP_IDRAM_SPLIT)", + "id": "BT_RELEASE_IRAM", + "name": "BT_RELEASE_IRAM", + "range": null, + "title": "Release Bluetooth text (READ DOCS FIRST)", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "This option decides the maximum number of alarms which\ncould be used by Bluetooth host.", + "id": "BT_ALARM_MAX_NUM", + "name": "BT_ALARM_MAX_NUM", + "range": null, + "title": "Maximum number of Bluetooth alarms", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "BT_BLE_LOG_SPI_OUT_ENABLED", + "help": "The number of ble log async SPI output queues", + "id": "BT_BLE_LOG_SPI_OUT_QUEUE_SIZE", + "name": "BT_BLE_LOG_SPI_OUT_QUEUE_SIZE", + "range": null, + "title": "Number of ble log async SPI output queues", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_BLE_LOG_SPI_OUT_ENABLED", + "help": "The size of ble log async SPI output transaction buffer size", + "id": "BT_BLE_LOG_SPI_OUT_TRANS_BUF_SIZE", + "name": "BT_BLE_LOG_SPI_OUT_TRANS_BUF_SIZE", + "range": null, + "title": "Size of ble log async SPI output transaction buffer size", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_BLE_LOG_SPI_OUT_ENABLED", + "help": "GPIO number of SPI MOSI", + "id": "BT_BLE_LOG_SPI_OUT_MOSI_IO_NUM", + "name": "BT_BLE_LOG_SPI_OUT_MOSI_IO_NUM", + "range": null, + "title": "GPIO number of SPI MOSI", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_BLE_LOG_SPI_OUT_ENABLED", + "help": "GPIO number of SPI SCLK", + "id": "BT_BLE_LOG_SPI_OUT_SCLK_IO_NUM", + "name": "BT_BLE_LOG_SPI_OUT_SCLK_IO_NUM", + "range": null, + "title": "GPIO number of SPI SCLK", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_BLE_LOG_SPI_OUT_ENABLED", + "help": "GPIO number of SPI CS", + "id": "BT_BLE_LOG_SPI_OUT_CS_IO_NUM", + "name": "BT_BLE_LOG_SPI_OUT_CS_IO_NUM", + "range": null, + "title": "GPIO number of SPI CS", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "BT_BLE_LOG_SPI_OUT_TS_SYNC_ENABLED", + "help": "GPIO number of SYNC IO", + "id": "BT_BLE_LOG_SPI_OUT_SYNC_IO_NUM", + "name": "BT_BLE_LOG_SPI_OUT_SYNC_IO_NUM", + "range": null, + "title": "GPIO number of SYNC IO", + "type": "int" + } + ], + "depends_on": "BT_BLE_LOG_SPI_OUT_ENABLED", + "help": "Enable ble log & logic analyzer log time sync", + "id": "BT_BLE_LOG_SPI_OUT_TS_SYNC_ENABLED", + "name": "BT_BLE_LOG_SPI_OUT_TS_SYNC_ENABLED", + "range": null, + "title": "Enable ble log & logic analyzer log time sync", + "type": "bool" + } + ], + "depends_on": null, + "help": "Output ble logs to SPI bus", + "id": "BT_BLE_LOG_SPI_OUT_ENABLED", + "name": "BT_BLE_LOG_SPI_OUT_ENABLED", + "range": null, + "title": "Output ble logs to SPI bus (Experimental)", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-bluetooth-common-options", + "title": "Common Options", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "BT_HCI_LOG_DEBUG_EN", + "help": "This option is to configure the buffer size of the hci data steam cache in hci debug mode.\nThis is a ring buffer, the new data will overwrite the oldest data if the buffer is full.", + "id": "BT_HCI_LOG_DATA_BUFFER_SIZE", + "name": "BT_HCI_LOG_DATA_BUFFER_SIZE", + "range": null, + "title": "Size of the cache used for HCI data in Bluetooth HCI debug mode (N*1024 bytes)", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_HCI_LOG_DEBUG_EN", + "help": "This option is to configure the buffer size of the hci adv report cache in hci debug mode.\nThis is a ring buffer, the new data will overwrite the oldest data if the buffer is full.", + "id": "BT_HCI_LOG_ADV_BUFFER_SIZE", + "name": "BT_HCI_LOG_ADV_BUFFER_SIZE", + "range": null, + "title": "Size of the cache used for adv report in Bluetooth HCI debug mode (N*1024 bytes)", + "type": "int" + } + ], + "depends_on": "BT_BLUEDROID_ENABLED || BT_NIMBLE_ENABLED", + "help": "This option is used to enable bluetooth debug mode, which saves the hci layer data stream.", + "id": "BT_HCI_LOG_DEBUG_EN", + "name": "BT_HCI_LOG_DEBUG_EN", + "range": null, + "title": "Enable Bluetooth HCI debug mode", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-bluetooth", + "title": "Bluetooth", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "BLE_MESH", + "help": "It is a temporary solution and needs further modifications.", + "id": "BLE_MESH_HCI_5_0", + "name": "BLE_MESH_HCI_5_0", + "range": null, + "title": "Support sending 20ms non-connectable adv packets", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Support BLE Mesh v1.1 features", + "id": "BLE_MESH_V11_SUPPORT", + "name": "BLE_MESH_V11_SUPPORT", + "range": null, + "title": "Support ESP BLE Mesh v1.1 features (Preview)", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable this option to allow using random advertising interval\nfor mesh packets. And this could help avoid collision of\nadvertising packets.", + "id": "BLE_MESH_RANDOM_ADV_INTERVAL", + "name": "BLE_MESH_RANDOM_ADV_INTERVAL", + "range": null, + "title": "Support using random adv interval for mesh packets", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable this option to allow using specific duplicate scan filter\nin BLE Mesh, and Scan Duplicate Type must be set by choosing the\noption in the Bluetooth Controller section in menuconfig, which is\n\"Scan Duplicate By Device Address and Advertising Data\".", + "id": "BLE_MESH_USE_DUPLICATE_SCAN", + "name": "BLE_MESH_USE_DUPLICATE_SCAN", + "range": null, + "title": "Support Duplicate Scan in BLE Mesh", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Enable this option to allow using BLE Active Scan for BLE Mesh.", + "id": "BLE_MESH_ACTIVE_SCAN", + "name": "BLE_MESH_ACTIVE_SCAN", + "range": null, + "title": "Support Active Scan in BLE Mesh", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BLE_MESH_MEM_ALLOC_MODE_INTERNAL", + "name": "BLE_MESH_MEM_ALLOC_MODE_INTERNAL", + "range": null, + "title": "Internal DRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "(SPIRAM_USE_CAPS_ALLOC || SPIRAM_USE_MALLOC) && ", + "help": null, + "id": "BLE_MESH_MEM_ALLOC_MODE_EXTERNAL", + "name": "BLE_MESH_MEM_ALLOC_MODE_EXTERNAL", + "range": null, + "title": "External SPIRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "Enable this option to use the default memory allocation strategy when\nexternal SPIRAM is enabled. See the SPIRAM options for more details.", + "id": "BLE_MESH_MEM_ALLOC_MODE_DEFAULT", + "name": "BLE_MESH_MEM_ALLOC_MODE_DEFAULT", + "range": null, + "title": "Default alloc mode", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP32_IRAM_AS_8BIT_ACCESSIBLE_MEMORY && ", + "help": "Allows to use IRAM memory region as 8bit accessible region. Every\nunaligned (8bit or 16bit) access will result in an exception and\nincur penalty of certain clock cycles per unaligned read/write.", + "id": "BLE_MESH_MEM_ALLOC_MODE_IRAM_8BIT", + "name": "BLE_MESH_MEM_ALLOC_MODE_IRAM_8BIT", + "range": null, + "title": "Internal IRAM", + "type": "bool" + } + ], + "depends_on": "BLE_MESH", + "help": "Allocation strategy for BLE Mesh stack, essentially provides ability to\nallocate all required dynamic allocations from,\n\n- Internal DRAM memory only\n- External SPIRAM memory only\n- Either internal or external memory based on default malloc()\n behavior in ESP-IDF\n- Internal IRAM memory wherever applicable else internal DRAM\n\nRecommended mode here is always internal (*), since that is most preferred\nfrom security perspective. But if application requirement does not\nallow sufficient free internal memory then alternate mode can be\nselected.\n\n(*) In case of ESP32-S2/ESP32-S3, hardware allows encryption of external\nSPIRAM contents provided hardware flash encryption feature is enabled.\nIn that case, using external SPIRAM allocation strategy is also safe choice\nfrom security perspective.", + "id": "component-config-esp-ble-mesh-support-memory-allocation-strategy", + "name": "BLE_MESH_MEM_ALLOC_MODE", + "title": "Memory allocation strategy", + "type": "choice" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "IDF_TARGET_ESP32 && SPIRAM && ", + "help": "If enabled, BLE Mesh allocates dynamic memory from external SPIRAM for\nFreeRTOS objects, i.e. mutex, queue, and task stack. External SPIRAM\ncan only be used for task stack when SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY\nis enabled. See the SPIRAM options for more details.", + "id": "BLE_MESH_FREERTOS_STATIC_ALLOC_EXTERNAL", + "name": "BLE_MESH_FREERTOS_STATIC_ALLOC_EXTERNAL", + "range": null, + "title": "External SPIRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP32_IRAM_AS_8BIT_ACCESSIBLE_MEMORY && ", + "help": "If enabled, BLE Mesh allocates dynamic memory from internal IRAM for\nFreeRTOS objects, i.e. mutex, queue. Note: IRAM region cannot be used\nas task stack.", + "id": "BLE_MESH_FREERTOS_STATIC_ALLOC_IRAM_8BIT", + "name": "BLE_MESH_FREERTOS_STATIC_ALLOC_IRAM_8BIT", + "range": null, + "title": "Internal IRAM", + "type": "bool" + } + ], + "depends_on": "BLE_MESH_FREERTOS_STATIC_ALLOC && BLE_MESH", + "help": "Choose the memory to be used for FreeRTOS objects.", + "id": "component-config-esp-ble-mesh-support-enable-freertos-static-allocation-memory-allocation-for-freertos-objects", + "name": "BLE_MESH_FREERTOS_STATIC_ALLOC_MODE", + "title": "Memory allocation for FreeRTOS objects", + "type": "choice" + } + ], + "depends_on": "FREERTOS_SUPPORT_STATIC_ALLOCATION && ((IDF_TARGET_ESP32 && SPIRAM) || ESP32_IRAM_AS_8BIT_ACCESSIBLE_MEMORY) && BLE_MESH", + "help": "Enable this option to use FreeRTOS static allocation APIs for BLE Mesh,\nwhich provides the ability to use different dynamic memory (i.e. SPIRAM\nor IRAM) for FreeRTOS objects.\nIf this option is disabled, the FreeRTOS static allocation APIs will not\nbe used, and internal DRAM will be allocated for FreeRTOS objects.", + "id": "BLE_MESH_FREERTOS_STATIC_ALLOC", + "name": "BLE_MESH_FREERTOS_STATIC_ALLOC", + "range": null, + "title": "Enable FreeRTOS static allocation", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "If enabled, users can use the function esp_ble_mesh_deinit() to de-initialize\nthe whole BLE Mesh stack.", + "id": "BLE_MESH_DEINIT", + "name": "BLE_MESH_DEINIT", + "range": null, + "title": "Support de-initialize BLE Mesh stack", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "BLE_MESH_SUPPORT_BLE_ADV && BLE_MESH", + "help": "Number of advertising buffers for BLE packets available.", + "id": "BLE_MESH_BLE_ADV_BUF_COUNT", + "name": "BLE_MESH_BLE_ADV_BUF_COUNT", + "range": null, + "title": "Number of advertising buffers for BLE advertising packets", + "type": "int" + } + ], + "depends_on": "BLE_MESH", + "help": "When selected, users can send normal BLE advertising packets\nwith specific API.", + "id": "BLE_MESH_SUPPORT_BLE_ADV", + "name": "BLE_MESH_SUPPORT_BLE_ADV", + "range": null, + "title": "Support sending normal BLE advertising packets", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "When selected, users can register a callback and receive normal BLE\nadvertising packets in the application layer.", + "id": "BLE_MESH_SUPPORT_BLE_SCAN", + "name": "BLE_MESH_SUPPORT_BLE_SCAN", + "range": null, + "title": "Support scanning normal BLE advertising packets", + "type": "bool" + } + ], + "depends_on": "BLE_MESH", + "id": "component-config-esp-ble-mesh-support-ble-mesh-and-ble-coexistence-support", + "title": "BLE Mesh and BLE coexistence support", + "type": "menu" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable this option to allow BLE Mesh fast provisioning solution to be used.\nWhen there are multiple unprovisioned devices around, fast provisioning can\ngreatly reduce the time consumption of the whole provisioning process.\nWhen this option is enabled, and after an unprovisioned device is provisioned\ninto a node successfully, it can be changed to a temporary Provisioner.", + "id": "BLE_MESH_FAST_PROV", + "name": "BLE_MESH_FAST_PROV", + "range": null, + "title": "Enable BLE Mesh Fast Provisioning", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable the device to be provisioned into a node. This option should be\nenabled when an unprovisioned device is going to be provisioned into a\nnode and communicate with other nodes in the BLE Mesh network.", + "id": "BLE_MESH_NODE", + "name": "BLE_MESH_NODE", + "range": null, + "title": "Support for BLE Mesh Node", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BLE_MESH_PROVISIONER && BLE_MESH", + "help": "This option specifies how many unprovisioned devices can be added to device\nqueue for provisioning. Users can use this option to define the size of the\nqueue in the bottom layer which is used to store unprovisioned device\ninformation (e.g. Device UUID, address).", + "id": "BLE_MESH_WAIT_FOR_PROV_MAX_DEV_NUM", + "name": "BLE_MESH_WAIT_FOR_PROV_MAX_DEV_NUM", + "range": null, + "title": "Maximum number of unprovisioned devices that can be added to device queue", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH_PROVISIONER && BLE_MESH", + "help": "This option specifies how many devices can be provisioned by a Provisioner.\nThis value indicates the maximum number of unprovisioned devices which can be\nprovisioned by a Provisioner. For instance, if the value is 6, it means the\nProvisioner can provision up to 6 unprovisioned devices.\nTheoretically a Provisioner without the limitation of its memory can provision\nup to 32766 unprovisioned devices, here we limit the maximum number to 100\njust to limit the memory used by a Provisioner. The bigger the value is, the\nmore memory it will cost by a Provisioner to store the information of nodes.", + "id": "BLE_MESH_MAX_PROV_NODES", + "name": "BLE_MESH_MAX_PROV_NODES", + "range": null, + "title": "Maximum number of devices that can be provisioned by Provisioner", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH_PB_ADV && BLE_MESH_PROVISIONER && BLE_MESH", + "help": "This option specifies how many devices can be provisioned at the same time\nusing PB-ADV. For examples, if the value is 2, it means a Provisioner can\nprovision two unprovisioned devices with PB-ADV at the same time.", + "id": "BLE_MESH_PBA_SAME_TIME", + "name": "BLE_MESH_PBA_SAME_TIME", + "range": null, + "title": "Maximum number of PB-ADV running at the same time by Provisioner", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH_PB_GATT && BLE_MESH_PROVISIONER && BLE_MESH", + "help": "This option specifies how many devices can be provisioned at the same\ntime using PB-GATT. For example, if the value is 2, it means a Provisioner\ncan provision two unprovisioned devices with PB-GATT at the same time.", + "id": "BLE_MESH_PBG_SAME_TIME", + "name": "BLE_MESH_PBG_SAME_TIME", + "range": null, + "title": "Maximum number of PB-GATT running at the same time by Provisioner", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH_PROVISIONER && BLE_MESH", + "help": "This option specifies how many subnets per network a Provisioner can create.\nIndeed, this value decides the number of network keys which can be added by a Provisioner.", + "id": "BLE_MESH_PROVISIONER_SUBNET_COUNT", + "name": "BLE_MESH_PROVISIONER_SUBNET_COUNT", + "range": null, + "title": "Maximum number of mesh subnets that can be created by Provisioner", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH_PROVISIONER && BLE_MESH", + "help": "This option specifies how many application keys the Provisioner can have.\nIndeed, this value decides the number of the application keys which can be added by a Provisioner.", + "id": "BLE_MESH_PROVISIONER_APP_KEY_COUNT", + "name": "BLE_MESH_PROVISIONER_APP_KEY_COUNT", + "range": null, + "title": "Maximum number of application keys that can be owned by Provisioner", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "BLE_MESH_PROVISIONER_RECV_HB && BLE_MESH_PROVISIONER && BLE_MESH", + "help": "This option specifies how many heartbeat filter entries Provisioner supports.\nThe heartbeat filter (acceptlist or rejectlist) entries are used to store a\nlist of SRC and DST which can be used to decide if a heartbeat message will\nbe processed and notified to the application layer by Provisioner.\nNote: The filter is an empty rejectlist by default.", + "id": "BLE_MESH_PROVISIONER_RECV_HB_FILTER_SIZE", + "name": "BLE_MESH_PROVISIONER_RECV_HB_FILTER_SIZE", + "range": null, + "title": "Maximum number of filter entries for receiving Heartbeat messages", + "type": "int" + } + ], + "depends_on": "BLE_MESH_PROVISIONER && BLE_MESH", + "help": "When this option is enabled, Provisioner can call specific functions to enable\nor disable receiving Heartbeat messages and notify them to the application layer.", + "id": "BLE_MESH_PROVISIONER_RECV_HB", + "name": "BLE_MESH_PROVISIONER_RECV_HB", + "range": null, + "title": "Support receiving Heartbeat messages", + "type": "bool" + } + ], + "depends_on": "BLE_MESH", + "help": "Enable the device to be a Provisioner. The option should be enabled when\na device is going to act as a Provisioner and provision unprovisioned\ndevices into the BLE Mesh network.", + "id": "BLE_MESH_PROVISIONER", + "name": "BLE_MESH_PROVISIONER", + "range": null, + "title": "Support for BLE Mesh Provisioner", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BLE_MESH_PROV && BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Enable this option to support BLE Mesh enhanced provisioning authentication\nfunctionality. This option can increase the security level of provisioning.\nIt is recommended to enable this option.", + "id": "BLE_MESH_PROV_EPA", + "name": "BLE_MESH_PROV_EPA", + "range": null, + "title": "BLE Mesh enhanced provisioning authentication", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BLE_MESH_CERT_BASED_PROV && BLE_MESH", + "help": "This option sets the maximum size of the provisioning record fragment that the\nProvisioner can receive. The range depends on provisioning bearer.", + "id": "BLE_MESH_RECORD_FRAG_MAX_SIZE", + "name": "BLE_MESH_RECORD_FRAG_MAX_SIZE", + "range": null, + "title": "Maximum size of the provisioning record fragment that Provisioner can receive", + "type": "int" + } + ], + "depends_on": "BLE_MESH_PROV && BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Enable this option to support BLE Mesh Certificate-Based Provisioning.", + "id": "BLE_MESH_CERT_BASED_PROV", + "name": "BLE_MESH_CERT_BASED_PROV", + "range": null, + "title": "Support Certificate-based provisioning", + "type": "bool" + } + ], + "depends_on": "BLE_MESH", + "help": "Enable this option to support BLE Mesh Provisioning functionality. For\nBLE Mesh, this option should be always enabled.", + "id": "BLE_MESH_PROV", + "name": "BLE_MESH_PROV", + "range": null, + "title": "BLE Mesh Provisioning support", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BLE_MESH_NODE && BLE_MESH_PB_ADV && BLE_MESH", + "help": "This option specifies the interval of sending two consecutive unprovisioned\ndevice beacon, users can use this option to change the frequency of sending\nunprovisioned device beacon. For example, if the value is 5, it means the\nunprovisioned device beacon will send every 5 seconds. When the option of\nBLE_MESH_FAST_PROV is selected, the value is better to be 3 seconds, or less.", + "id": "BLE_MESH_UNPROVISIONED_BEACON_INTERVAL", + "name": "BLE_MESH_UNPROVISIONED_BEACON_INTERVAL", + "range": null, + "title": "Interval between two consecutive Unprovisioned Device Beacon", + "type": "int" + } + ], + "depends_on": "BLE_MESH", + "help": "Enable this option to allow the device to be provisioned over the\nadvertising bearer. This option should be enabled if PB-ADV is\ngoing to be used during provisioning procedure.", + "id": "BLE_MESH_PB_ADV", + "name": "BLE_MESH_PB_ADV", + "range": null, + "title": "Provisioning support using the advertising bearer (PB-ADV)", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable this option to allow the device to be provisioned over GATT.\nThis option should be enabled if PB-GATT is going to be used during\nprovisioning procedure.\n\n# Virtual option enabled whenever any Proxy protocol is needed", + "id": "BLE_MESH_PB_GATT", + "name": "BLE_MESH_PB_GATT", + "range": null, + "title": "Provisioning support using GATT (PB-GATT)", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable this option to support BLE Mesh Proxy protocol used by PB-GATT\nand other proxy pdu transmission.", + "id": "BLE_MESH_PROXY", + "name": "BLE_MESH_PROXY", + "range": null, + "title": "BLE Mesh Proxy protocol support", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BLE_MESH_GATT_PROXY_SERVER && BLE_MESH", + "help": "This option determines for how long the local node advertises using\nNode Identity. The given value is in seconds. The specification limits\nthis to 60 seconds and lists it as the recommended value as well.\nSo leaving the default value is the safest option.\nWhen an unprovisioned device is provisioned successfully and becomes a\nnode, it will start to advertise using Node Identity during the time\nset by this option. And after that, Network ID will be advertised.", + "id": "BLE_MESH_NODE_ID_TIMEOUT", + "name": "BLE_MESH_NODE_ID_TIMEOUT", + "range": null, + "title": "Node Identity advertising timeout", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH_GATT_PROXY_SERVER && BLE_MESH", + "help": "This option specifies how many Proxy Filter entries the local node supports.\nThe entries of Proxy filter (whitelist or blacklist) are used to store a\nlist of addresses which can be used to decide which messages will be forwarded\nto the Proxy Client by the Proxy Server.", + "id": "BLE_MESH_PROXY_FILTER_SIZE", + "name": "BLE_MESH_PROXY_FILTER_SIZE", + "range": null, + "title": "Maximum number of filter entries per Proxy Client", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH_PRB_SRV && BLE_MESH_GATT_PROXY_SERVER && BLE_MESH", + "help": "The Proxy Privacy parameter controls the privacy of the Proxy Server\nover the connection. The value of the Proxy Privacy parameter is\ncontrolled by the type of proxy connection, which is dependent on the\nbearer used by the proxy connection.", + "id": "BLE_MESH_PROXY_PRIVACY", + "name": "BLE_MESH_PROXY_PRIVACY", + "range": null, + "title": "Support Proxy Privacy", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BLE_MESH_PROXY_SOLIC_PDU_RX && BLE_MESH", + "help": "This option specifies the maximum capacity of the solicitation replay\nprotection list. The solicitation replay protection list is used to\nreject Solicitation PDUs that were already processed by a node, which\nwill store the solicitation src and solicitation sequence number of\nthe received Solicitation PDU message.", + "id": "BLE_MESH_PROXY_SOLIC_RX_CRPL", + "name": "BLE_MESH_PROXY_SOLIC_RX_CRPL", + "range": null, + "title": "Maximum capacity of solicitation replay protection list", + "type": "int" + } + ], + "depends_on": "BLE_MESH_GATT_PROXY_SERVER && BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Enable this option to support receiving Proxy Solicitation PDU.", + "id": "BLE_MESH_PROXY_SOLIC_PDU_RX", + "name": "BLE_MESH_PROXY_SOLIC_PDU_RX", + "range": null, + "title": "Support receiving Proxy Solicitation PDU", + "type": "bool" + } + ], + "depends_on": "BLE_MESH_NODE && BLE_MESH", + "help": "This option enables support for Mesh GATT Proxy Service, i.e. the\nability to act as a proxy between a Mesh GATT Client and a Mesh network.\nThis option should be enabled if a node is going to be a Proxy Server.", + "id": "BLE_MESH_GATT_PROXY_SERVER", + "name": "BLE_MESH_GATT_PROXY_SERVER", + "range": null, + "title": "BLE Mesh GATT Proxy Server", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "BLE_MESH_PROXY_SOLIC_PDU_TX && BLE_MESH", + "help": "This option specifies the maximum number of Solicitation Source (SSRC)\nthat can be used by Proxy Client for sending a Solicitation PDU.\nA Proxy Client may use the primary address or any of the secondary\naddresses as the SSRC for a Solicitation PDU.\nSo for a Proxy Client, it's better to choose the value based on its\nown element count.", + "id": "BLE_MESH_PROXY_SOLIC_TX_SRC_COUNT", + "name": "BLE_MESH_PROXY_SOLIC_TX_SRC_COUNT", + "range": null, + "title": "Maximum number of SSRC that can be used by Proxy Client", + "type": "int" + } + ], + "depends_on": "BLE_MESH_GATT_PROXY_CLIENT && BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Enable this option to support sending Proxy Solicitation PDU.", + "id": "BLE_MESH_PROXY_SOLIC_PDU_TX", + "name": "BLE_MESH_PROXY_SOLIC_PDU_TX", + "range": null, + "title": "Support sending Proxy Solicitation PDU", + "type": "bool" + } + ], + "depends_on": "BLE_MESH", + "help": "This option enables support for Mesh GATT Proxy Client. The Proxy Client\ncan use the GATT bearer to send mesh messages to a node that supports the\nadvertising bearer.", + "id": "BLE_MESH_GATT_PROXY_CLIENT", + "name": "BLE_MESH_GATT_PROXY_CLIENT", + "range": null, + "title": "BLE Mesh GATT Proxy Client", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable BLE Mesh net buffer pool tracking. This option is used to introduce another\nvariable in the bottom layer to record the usage of advertising buffers of BLE Mesh\ndevices. Recommend to enable this option as default.", + "id": "BLE_MESH_NET_BUF_POOL_USAGE", + "name": "BLE_MESH_NET_BUF_POOL_USAGE", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BLE_MESH_SETTINGS && BLE_MESH", + "help": "This value defines in seconds how soon any pending changes are actually\nwritten into persistent storage (flash) after a change occurs.\nThe option allows nodes to delay a certain period of time to save proper\ninformation to flash. The default value is 0, which means information\nwill be stored immediately once there are updates.", + "id": "BLE_MESH_STORE_TIMEOUT", + "name": "BLE_MESH_STORE_TIMEOUT", + "range": null, + "title": "Delay (in seconds) before storing anything persistently", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH_SETTINGS && BLE_MESH", + "help": "This value defines how often the local sequence number gets updated in\npersistent storage (i.e. flash). e.g. a value of 100 means that the\nsequence number will be stored to flash on every 100th increment.\nIf the node sends messages very frequently a higher value makes more\nsense, whereas if the node sends infrequently a value as low as 0\n(update storage for every increment) can make sense. When the stack\ngets initialized it will add sequence number to the last stored one,\nso that it starts off with a value that's guaranteed to be larger than\nthe last one used before power off.", + "id": "BLE_MESH_SEQ_STORE_RATE", + "name": "BLE_MESH_SEQ_STORE_RATE", + "range": null, + "title": "How often the sequence number gets updated in storage", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH_SETTINGS && BLE_MESH", + "help": "This value defines in seconds how soon the RPL (Replay Protection List)\ngets written to persistent storage after a change occurs. If the node\nreceives messages frequently, then a large value is recommended. If the\nnode receives messages rarely, then the value can be as low as 0 (which\nmeans the RPL is written into the storage immediately).\nNote that if the node operates in a security-sensitive case, and there is\na risk of sudden power-off, then a value of 0 is strongly recommended.\nOtherwise, a power loss before RPL being written into the storage may\nintroduce message replay attacks and system security will be in a\nvulnerable state.", + "id": "BLE_MESH_RPL_STORE_TIMEOUT", + "name": "BLE_MESH_RPL_STORE_TIMEOUT", + "range": null, + "title": "Minimum frequency that the RPL gets updated in storage", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH_NODE && BLE_MESH_SETTINGS && BLE_MESH", + "help": "This option is created to solve the issue of failure in recovering\nnode information after mesh stack updates. In the old version mesh\nstack, there is no key of \"mesh/role\" in nvs. In the new version\nmesh stack, key of \"mesh/role\" is added in nvs, recovering node\ninformation needs to check \"mesh/role\" key in nvs and implements\nselective recovery of mesh node information. Therefore, there may\nbe failure in recovering node information during node restarting\nafter OTA.\n\nThe new version mesh stack adds the option of \"mesh/role\" because\nwe have added the support of storing Provisioner information, while\nthe old version only supports storing node information.\n\nIf users are updating their nodes from old version to new version,\nwe recommend enabling this option, so that system could set the flag\nin advance before recovering node information and make sure the node\ninformation recovering could work as expected.", + "id": "BLE_MESH_SETTINGS_BACKWARD_COMPATIBILITY", + "name": "BLE_MESH_SETTINGS_BACKWARD_COMPATIBILITY", + "range": null, + "title": "A specific option for settings backward compatibility", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BLE_MESH_SPECIFIC_PARTITION && BLE_MESH_SETTINGS && BLE_MESH", + "help": "This value defines the name of the specified NVS partition used by the\nmesh stack.", + "id": "BLE_MESH_PARTITION_NAME", + "name": "BLE_MESH_PARTITION_NAME", + "range": null, + "title": "Name of the NVS partition for BLE Mesh", + "type": "string" + } + ], + "depends_on": "BLE_MESH_SETTINGS && BLE_MESH", + "help": "When selected, the mesh stack will use a specified NVS partition instead of\ndefault NVS partition. Note that the specified partition must be registered\nwith NVS using nvs_flash_init_partition() API, and the partition must exists\nin the csv file.\nWhen Provisioner needs to store a large amount of nodes' information in the\nflash (e.g. more than 20), this option is recommended to be enabled.", + "id": "BLE_MESH_SPECIFIC_PARTITION", + "name": "BLE_MESH_SPECIFIC_PARTITION", + "range": null, + "title": "Use a specific NVS partition for BLE Mesh", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BLE_MESH_USE_MULTIPLE_NAMESPACE && BLE_MESH_SETTINGS && BLE_MESH", + "help": "This option specifies the maximum NVS namespaces supported by Provisioner.", + "id": "BLE_MESH_MAX_NVS_NAMESPACE", + "name": "BLE_MESH_MAX_NVS_NAMESPACE", + "range": null, + "title": "Maximum number of NVS namespaces", + "type": "int" + } + ], + "depends_on": "BLE_MESH_PROVISIONER && BLE_MESH_SETTINGS && BLE_MESH", + "help": "When selected, Provisioner can use different NVS namespaces to store\ndifferent instances of mesh information.\nFor example, if in the first room, Provisioner uses NetKey A, AppKey\nA and provisions three devices, these information will be treated as\nmesh information instance A. When the Provisioner moves to the second\nroom, it uses NetKey B, AppKey B and provisions two devices, then the\ninformation will be treated as mesh information instance B.\nHere instance A and instance B will be stored in different namespaces.\nWith this option enabled, Provisioner needs to use specific functions\nto open the corresponding NVS namespace, restore the mesh information,\nrelease the mesh information or erase the mesh information.", + "id": "BLE_MESH_USE_MULTIPLE_NAMESPACE", + "name": "BLE_MESH_USE_MULTIPLE_NAMESPACE", + "range": null, + "title": "Support using multiple NVS namespaces by Provisioner", + "type": "bool" + } + ], + "depends_on": "BLE_MESH", + "help": "When selected, the BLE Mesh stack will take care of storing/restoring the BLE\nMesh configuration persistently in flash.\nIf the device is a BLE Mesh node, when this option is enabled, the configuration\nof the device will be stored persistently, including unicast address, NetKey,\nAppKey, etc.\nAnd if the device is a BLE Mesh Provisioner, the information of the device will\nbe stored persistently, including the information of provisioned nodes, NetKey,\nAppKey, etc.", + "id": "BLE_MESH_SETTINGS", + "name": "BLE_MESH_SETTINGS", + "range": null, + "title": "Store BLE Mesh configuration persistently", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "This option specifies how many subnets a Mesh network can have at the same time.\nIndeed, this value decides the number of the network keys which can be owned by a node.", + "id": "BLE_MESH_SUBNET_COUNT", + "name": "BLE_MESH_SUBNET_COUNT", + "range": null, + "title": "Maximum number of mesh subnets per network", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "This option specifies how many application keys the device can store per network.\nIndeed, this value decides the number of the application keys which can be owned by a node.", + "id": "BLE_MESH_APP_KEY_COUNT", + "name": "BLE_MESH_APP_KEY_COUNT", + "range": null, + "title": "Maximum number of application keys per network", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "This option specifies the maximum number of application keys to which each model\ncan be bound.", + "id": "BLE_MESH_MODEL_KEY_COUNT", + "name": "BLE_MESH_MODEL_KEY_COUNT", + "range": null, + "title": "Maximum number of application keys per model", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "This option specifies the maximum number of addresses to which each model can\nbe subscribed.", + "id": "BLE_MESH_MODEL_GROUP_COUNT", + "name": "BLE_MESH_MODEL_GROUP_COUNT", + "range": null, + "title": "Maximum number of group address subscriptions per model", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "This option specifies how many Label UUIDs can be stored.\nIndeed, this value decides the number of the Virtual Addresses can be supported by a node.", + "id": "BLE_MESH_LABEL_COUNT", + "name": "BLE_MESH_LABEL_COUNT", + "range": null, + "title": "Maximum number of Label UUIDs used for Virtual Addresses", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "This option specifies the maximum capacity of the replay protection list.\nIt is similar to Network message cache size, but has a different purpose.\nThe replay protection list is used to prevent a node from replay attack,\nwhich will store the source address and sequence number of the received\nmesh messages.\nFor Provisioner, the replay protection list size should not be smaller than\nthe maximum number of nodes whose information can be stored. And the element\nnumber of each node should also be taken into consideration. For example, if\nProvisioner can provision up to 20 nodes and each node contains two elements,\nthen the replay protection list size of Provisioner should be at least 40.", + "id": "BLE_MESH_CRPL", + "name": "BLE_MESH_CRPL", + "range": null, + "title": "Maximum capacity of the replay protection list", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH_EXPERIMENTAL && BLE_MESH", + "help": "There may be many expired messages in a complex mesh network that would be\nconsidered replayed messages.\nEnable this option will refuse to relay such messages, which could help to\nreduce invalid packets in the mesh network.\nHowever, it should be noted that enabling this option may result in packet\nloss in certain environments.\nTherefore, users need to decide whether to enable this option according to\nthe actual usage situation.", + "id": "BLE_MESH_NOT_RELAY_REPLAY_MSG", + "name": "BLE_MESH_NOT_RELAY_REPLAY_MSG", + "range": null, + "title": "Not relay replayed messages in a mesh network", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Number of messages that are cached for the network. This helps prevent\nunnecessary decryption operations and unnecessary relays. This option\nis similar to Replay protection list, but has a different purpose.\nA node is not required to cache the entire Network PDU and may cache\nonly part of it for tracking, such as values for SRC/SEQ or others.", + "id": "BLE_MESH_MSG_CACHE_SIZE", + "name": "BLE_MESH_MSG_CACHE_SIZE", + "range": null, + "title": "Network message cache size", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Number of advertising buffers available. The transport layer reserves\nADV_BUF_COUNT - 3 buffers for outgoing segments. The maximum outgoing\nSDU size is 12 times this value (out of which 4 or 8 bytes are used\nfor the Transport Layer MIC). For example, 5 segments means the maximum\nSDU size is 60 bytes, which leaves 56 bytes for application layer data\nusing a 4-byte MIC, or 52 bytes using an 8-byte MIC.", + "id": "BLE_MESH_ADV_BUF_COUNT", + "name": "BLE_MESH_ADV_BUF_COUNT", + "range": null, + "title": "Number of advertising buffers", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "When the IV Update state enters Normal operation or IV Update\nin Progress, we need to keep track of how many hours has passed\nin the state, since the specification requires us to remain in\nthe state at least for 96 hours (Update in Progress has an\nadditional upper limit of 144 hours).\n\nIn order to fulfill the above requirement, even if the node might\nbe powered off once in a while, we need to store persistently\nhow many hours the node has been in the state. This doesn't\nnecessarily need to happen every hour (thanks to the flexible\nduration range). The exact cadence will depend a lot on the\nways that the node will be used and what kind of power source it\nhas.\n\nSince there is no single optimal answer, this configuration\noption allows specifying a divider, i.e. how many intervals\nthe 96 hour minimum gets split into. After each interval the\nduration that the node has been in the current state gets\nstored to flash. E.g. the default value of 4 means that the\nstate is saved every 24 hours (96 / 4).", + "id": "BLE_MESH_IVU_DIVIDER", + "name": "BLE_MESH_IVU_DIVIDER", + "range": null, + "title": "Divider for IV Update state refresh timer", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "According to Section 3.10.5 of Mesh Specification v1.0.1.\nIf a node in Normal Operation receives a Secure Network beacon with an IV index\nequal to the last known IV index+1 and the IV Update Flag set to 0, the node may\nupdate its IV without going to the IV Update in Progress state, or it may initiate\nan IV Index Recovery procedure (Section 3.10.6), or it may ignore the Secure\nNetwork beacon. The node makes the choice depending on the time since last IV\nupdate and the likelihood that the node has missed the Secure Network beacons\nwith the IV update Flag.\nWhen the above situation is encountered, this option can be used to decide whether\nto perform the IV index recovery procedure.", + "id": "BLE_MESH_IVU_RECOVERY_IVI", + "name": "BLE_MESH_IVU_RECOVERY_IVI", + "range": null, + "title": "Recovery the IV index when the latest whole IV update procedure is missed", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Enable this option to use the enhanced segmentation and reassembly\nmechanism introduced in Bluetooth Mesh Protocol 1.1.", + "id": "BLE_MESH_SAR_ENHANCEMENT", + "name": "BLE_MESH_SAR_ENHANCEMENT", + "range": null, + "title": "Segmentation and reassembly enhancement", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Maximum number of simultaneous outgoing multi-segment and/or reliable messages.\nThe default value is 1, which means the device can only send one segmented\nmessage at a time. And if another segmented message is going to be sent, it\nshould wait for the completion of the previous one.\nIf users are going to send multiple segmented messages at the same time, this\nvalue should be configured properly.", + "id": "BLE_MESH_TX_SEG_MSG_COUNT", + "name": "BLE_MESH_TX_SEG_MSG_COUNT", + "range": null, + "title": "Maximum number of simultaneous outgoing segmented messages", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Maximum number of simultaneous incoming multi-segment and/or reliable messages.\nThe default value is 1, which means the device can only receive one segmented\nmessage at a time. And if another segmented message is going to be received,\nit should wait for the completion of the previous one.\nIf users are going to receive multiple segmented messages at the same time, this\nvalue should be configured properly.", + "id": "BLE_MESH_RX_SEG_MSG_COUNT", + "name": "BLE_MESH_RX_SEG_MSG_COUNT", + "range": null, + "title": "Maximum number of simultaneous incoming segmented messages", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Maximum incoming Upper Transport Access PDU length. Leave this to the default\nvalue, unless you really need to optimize memory usage.", + "id": "BLE_MESH_RX_SDU_MAX", + "name": "BLE_MESH_RX_SDU_MAX", + "range": null, + "title": "Maximum incoming Upper Transport Access PDU length", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Maximum number of segments supported for outgoing messages.\nThis value should typically be fine-tuned based on what\nmodels the local node supports, i.e. what's the largest\nmessage payload that the node needs to be able to send.\nThis value affects memory and call stack consumption, which\nis why the default is lower than the maximum that the\nspecification would allow (32 segments).\n\nThe maximum outgoing SDU size is 12 times this number (out of\nwhich 4 or 8 bytes is used for the Transport Layer MIC). For\nexample, 5 segments means the maximum SDU size is 60 bytes,\nwhich leaves 56 bytes for application layer data using a\n4-byte MIC and 52 bytes using an 8-byte MIC.\n\nBe sure to specify a sufficient number of advertising buffers\nwhen setting this option to a higher value. There must be at\nleast three more advertising buffers (BLE_MESH_ADV_BUF_COUNT)\nas there are outgoing segments.", + "id": "BLE_MESH_TX_SEG_MAX", + "name": "BLE_MESH_TX_SEG_MAX", + "range": null, + "title": "Maximum number of segments in outgoing messages", + "type": "int" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "BLE_MESH_RELAY_ADV_BUF && BLE_MESH_RELAY && BLE_MESH", + "help": "Number of advertising buffers for relay packets available.", + "id": "BLE_MESH_RELAY_ADV_BUF_COUNT", + "name": "BLE_MESH_RELAY_ADV_BUF_COUNT", + "range": null, + "title": "Number of advertising buffers for relay packets", + "type": "int" + } + ], + "depends_on": "BLE_MESH_RELAY && BLE_MESH", + "help": "When selected, self-send packets will be put in a high-priority\nqueue and relay packets will be put in a low-priority queue.", + "id": "BLE_MESH_RELAY_ADV_BUF", + "name": "BLE_MESH_RELAY_ADV_BUF", + "range": null, + "title": "Use separate advertising buffers for relay packets", + "type": "bool" + } + ], + "depends_on": "BLE_MESH_NODE && BLE_MESH", + "help": "Support for acting as a Mesh Relay Node. Enabling this option will allow\na node to support the Relay feature, and the Relay feature can still\nbe enabled or disabled by proper configuration messages. Disabling this\noption will let a node not support the Relay feature.", + "id": "BLE_MESH_RELAY", + "name": "BLE_MESH_RELAY", + "range": null, + "title": "Relay support", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BLE_MESH_LOW_POWER && BLE_MESH", + "help": "Perform the Friendship establishment using low power with the help of a\nreduced scan duty cycle. The downside of this is that the node may miss\nout on messages intended for it until it has successfully set up Friendship\nwith a Friend node.\nWhen this option is enabled, the node will stop scanning for a period of\ntime after a Friend Request or Friend Poll is sent, so as to reduce more\npower consumption.", + "id": "BLE_MESH_LPN_ESTABLISHMENT", + "name": "BLE_MESH_LPN_ESTABLISHMENT", + "range": null, + "title": "Perform Friendship establishment using low power", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BLE_MESH_LPN_AUTO && BLE_MESH_LOW_POWER && BLE_MESH", + "help": "Time in seconds from the last received message, that the node waits out\nbefore starting to look for Friend nodes.", + "id": "BLE_MESH_LPN_AUTO_TIMEOUT", + "name": "BLE_MESH_LPN_AUTO_TIMEOUT", + "range": null, + "title": "Time from last received message before going to LPN mode", + "type": "int" + } + ], + "depends_on": "BLE_MESH_LOW_POWER && BLE_MESH", + "help": "Once provisioned, automatically enable LPN functionality and start looking\nfor Friend nodes. If this option is disabled LPN mode needs to be manually\nenabled by calling bt_mesh_lpn_set(true).\nWhen an unprovisioned device is provisioned successfully and becomes a node,\nenabling this option will trigger the node starts to send Friend Request at\na certain period until it finds a proper Friend node.", + "id": "BLE_MESH_LPN_AUTO", + "name": "BLE_MESH_LPN_AUTO", + "range": null, + "title": "Automatically start looking for Friend nodes once provisioned", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_LOW_POWER && BLE_MESH", + "help": "Time in seconds between Friend Requests, if a previous Friend Request did\nnot yield any acceptable Friend Offers.", + "id": "BLE_MESH_LPN_RETRY_TIMEOUT", + "name": "BLE_MESH_LPN_RETRY_TIMEOUT", + "range": null, + "title": "Retry timeout for Friend requests", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH_LOW_POWER && BLE_MESH", + "help": "The contribution of the RSSI, measured by the Friend node, used in Friend\nOffer Delay calculations. 0 = 1, 1 = 1.5, 2 = 2, 3 = 2.5.\nRSSIFactor, one of the parameters carried by Friend Request sent by Low Power\nnode, which is used to calculate the Friend Offer Delay.", + "id": "BLE_MESH_LPN_RSSI_FACTOR", + "name": "BLE_MESH_LPN_RSSI_FACTOR", + "range": null, + "title": "RSSIFactor, used in Friend Offer Delay calculation", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH_LOW_POWER && BLE_MESH", + "help": "The contribution of the supported Receive Window used in Friend Offer\nDelay calculations. 0 = 1, 1 = 1.5, 2 = 2, 3 = 2.5.\nReceiveWindowFactor, one of the parameters carried by Friend Request sent by\nLow Power node, which is used to calculate the Friend Offer Delay.", + "id": "BLE_MESH_LPN_RECV_WIN_FACTOR", + "name": "BLE_MESH_LPN_RECV_WIN_FACTOR", + "range": null, + "title": "ReceiveWindowFactor, used in Friend Offer Delay calculation", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH_LOW_POWER && BLE_MESH", + "help": "The MinQueueSizeLog field is defined as log_2(N), where N is the minimum\nnumber of maximum size Lower Transport PDUs that the Friend node can store\nin its Friend Queue. As an example, MinQueueSizeLog value 1 gives N = 2,\nand value 7 gives N = 128.", + "id": "BLE_MESH_LPN_MIN_QUEUE_SIZE", + "name": "BLE_MESH_LPN_MIN_QUEUE_SIZE", + "range": null, + "title": "Minimum size of the acceptable friend queue (MinQueueSizeLog)", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH_LOW_POWER && BLE_MESH", + "help": "The ReceiveDelay is the time between the Low Power node sending a\nrequest and listening for a response. This delay allows the Friend\nnode time to prepare the response. The value is in units of milliseconds.", + "id": "BLE_MESH_LPN_RECV_DELAY", + "name": "BLE_MESH_LPN_RECV_DELAY", + "range": null, + "title": "Receive delay requested by the local node", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH_LOW_POWER && BLE_MESH", + "help": "PollTimeout timer is used to measure time between two consecutive\nrequests sent by a Low Power node. If no requests are received\nthe Friend node before the PollTimeout timer expires, then the\nfriendship is considered terminated. The value is in units of 100\nmilliseconds, so e.g. a value of 300 means 30 seconds.\nThe smaller the value, the faster the Low Power node tries to get\nmessages from corresponding Friend node and vice versa.", + "id": "BLE_MESH_LPN_POLL_TIMEOUT", + "name": "BLE_MESH_LPN_POLL_TIMEOUT", + "range": null, + "title": "The value of the PollTimeout timer", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH_LOW_POWER && BLE_MESH", + "help": "The initial value of the PollTimeout timer when Friendship is to be\nestablished for the first time. After this, the timeout gradually\ngrows toward the actual PollTimeout, doubling in value for each iteration.\nThe value is in units of 100 milliseconds, so e.g. a value of 300 means\n30 seconds.", + "id": "BLE_MESH_LPN_INIT_POLL_TIMEOUT", + "name": "BLE_MESH_LPN_INIT_POLL_TIMEOUT", + "range": null, + "title": "The starting value of the PollTimeout timer", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH_LOW_POWER && BLE_MESH", + "help": "Latency (in milliseconds) is the time it takes to enable scanning. In\npractice, it means how much time in advance of the Receive Window, the\nrequest to enable scanning is made.", + "id": "BLE_MESH_LPN_SCAN_LATENCY", + "name": "BLE_MESH_LPN_SCAN_LATENCY", + "range": null, + "title": "Latency for enabling scanning", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH_LOW_POWER && BLE_MESH", + "help": "Maximum number of groups to which the LPN can subscribe.", + "id": "BLE_MESH_LPN_GROUPS", + "name": "BLE_MESH_LPN_GROUPS", + "range": null, + "title": "Number of groups the LPN can subscribe to", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH_LOW_POWER && BLE_MESH", + "help": "Automatically subscribe all nodes address when friendship\nestablished.", + "id": "BLE_MESH_LPN_SUB_ALL_NODES_ADDR", + "name": "BLE_MESH_LPN_SUB_ALL_NODES_ADDR", + "range": null, + "title": "Automatically subscribe all nodes address", + "type": "bool" + } + ], + "depends_on": "BLE_MESH_NODE && BLE_MESH", + "help": "Enable this option to operate as a Low Power Node. If low power consumption\nis required by a node, this option should be enabled. And once the node\nenters the mesh network, it will try to find a Friend node and establish a\nfriendship.", + "id": "BLE_MESH_LOW_POWER", + "name": "BLE_MESH_LOW_POWER", + "range": null, + "title": "Support for Low Power features", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BLE_MESH_FRIEND && BLE_MESH", + "help": "Receive Window in milliseconds supported by the Friend node.", + "id": "BLE_MESH_FRIEND_RECV_WIN", + "name": "BLE_MESH_FRIEND_RECV_WIN", + "range": null, + "title": "Friend Receive Window", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH_FRIEND && BLE_MESH", + "help": "Minimum number of buffers available to be stored for each local Friend Queue.\nThis option decides the size of each buffer which can be used by a Friend node\nto store messages for each Low Power node.", + "id": "BLE_MESH_FRIEND_QUEUE_SIZE", + "name": "BLE_MESH_FRIEND_QUEUE_SIZE", + "range": null, + "title": "Minimum number of buffers supported per Friend Queue", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH_FRIEND && BLE_MESH", + "help": "Size of the Subscription List that can be supported by a Friend node for a\nLow Power node. And Low Power node can send Friend Subscription List Add or\nFriend Subscription List Remove messages to the Friend node to add or remove\nsubscription addresses.", + "id": "BLE_MESH_FRIEND_SUB_LIST_SIZE", + "name": "BLE_MESH_FRIEND_SUB_LIST_SIZE", + "range": null, + "title": "Friend Subscription List Size", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH_FRIEND && BLE_MESH", + "help": "Number of Low Power Nodes with which a Friend can have Friendship simultaneously.\nA Friend node can have friendship with multiple Low Power nodes at the same time,\nwhile a Low Power node can only establish friendship with only one Friend node at\nthe same time.", + "id": "BLE_MESH_FRIEND_LPN_COUNT", + "name": "BLE_MESH_FRIEND_LPN_COUNT", + "range": null, + "title": "Number of supported LPN nodes", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH_FRIEND && BLE_MESH", + "help": "Number of incomplete segment lists tracked for each Friends' LPN.\nIn other words, this determines from how many elements can segmented\nmessages destined for the Friend queue be received simultaneously.", + "id": "BLE_MESH_FRIEND_SEG_RX", + "name": "BLE_MESH_FRIEND_SEG_RX", + "range": null, + "title": "Number of incomplete segment lists per LPN", + "type": "int" + } + ], + "depends_on": "BLE_MESH", + "help": "Enable this option to be able to act as a Friend Node.", + "id": "BLE_MESH_FRIEND", + "name": "BLE_MESH_FRIEND", + "range": null, + "title": "Support for Friend feature", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH && BLE_MESH", + "help": "Select this to save the BLE Mesh related rodata code size. Enabling this option\nwill disable the output of BLE Mesh debug log.", + "id": "BLE_MESH_NO_LOG", + "name": "BLE_MESH_NO_LOG", + "range": null, + "title": "Disable BLE Mesh debug logs (minimize bin size)", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BLE_MESH_TRACE_LEVEL_NONE", + "name": "BLE_MESH_TRACE_LEVEL_NONE", + "range": null, + "title": "NONE", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BLE_MESH_TRACE_LEVEL_ERROR", + "name": "BLE_MESH_TRACE_LEVEL_ERROR", + "range": null, + "title": "ERROR", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BLE_MESH_TRACE_LEVEL_WARNING", + "name": "BLE_MESH_TRACE_LEVEL_WARNING", + "range": null, + "title": "WARNING", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BLE_MESH_TRACE_LEVEL_INFO", + "name": "BLE_MESH_TRACE_LEVEL_INFO", + "range": null, + "title": "INFO", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BLE_MESH_TRACE_LEVEL_DEBUG", + "name": "BLE_MESH_TRACE_LEVEL_DEBUG", + "range": null, + "title": "DEBUG", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BLE_MESH_TRACE_LEVEL_VERBOSE", + "name": "BLE_MESH_TRACE_LEVEL_VERBOSE", + "range": null, + "title": "VERBOSE", + "type": "bool" + } + ], + "depends_on": "BLE_MESH && !BLE_MESH_NO_LOG && BLE_MESH && !BLE_MESH_NO_LOG && BLE_MESH", + "help": "Define BLE Mesh trace level for BLE Mesh stack.", + "id": "component-config-esp-ble-mesh-support-ble-mesh-stack-debug-log-level-ble_mesh_stack", + "name": "BLE_MESH_STACK_TRACE_LEVEL", + "title": "BLE_MESH_STACK", + "type": "choice" + }, + { + "children": [], + "depends_on": "BLE_MESH && BLE_MESH && !BLE_MESH_NO_LOG && BLE_MESH", + "help": null, + "id": "BLE_MESH_STACK_TRACE_LEVEL", + "name": "BLE_MESH_STACK_TRACE_LEVEL", + "range": null, + "title": null, + "type": "int" + } + ], + "depends_on": "BLE_MESH && !BLE_MESH_NO_LOG && BLE_MESH", + "id": "component-config-esp-ble-mesh-support-ble-mesh-stack-debug-log-level", + "title": "BLE Mesh STACK DEBUG LOG LEVEL", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "BLE_MESH_NET_BUF_TRACE_LEVEL_NONE", + "name": "BLE_MESH_NET_BUF_TRACE_LEVEL_NONE", + "range": null, + "title": "NONE", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BLE_MESH_NET_BUF_TRACE_LEVEL_ERROR", + "name": "BLE_MESH_NET_BUF_TRACE_LEVEL_ERROR", + "range": null, + "title": "ERROR", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BLE_MESH_NET_BUF_TRACE_LEVEL_WARNING", + "name": "BLE_MESH_NET_BUF_TRACE_LEVEL_WARNING", + "range": null, + "title": "WARNING", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BLE_MESH_NET_BUF_TRACE_LEVEL_INFO", + "name": "BLE_MESH_NET_BUF_TRACE_LEVEL_INFO", + "range": null, + "title": "INFO", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BLE_MESH_NET_BUF_TRACE_LEVEL_DEBUG", + "name": "BLE_MESH_NET_BUF_TRACE_LEVEL_DEBUG", + "range": null, + "title": "DEBUG", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "BLE_MESH_NET_BUF_TRACE_LEVEL_VERBOSE", + "name": "BLE_MESH_NET_BUF_TRACE_LEVEL_VERBOSE", + "range": null, + "title": "VERBOSE", + "type": "bool" + } + ], + "depends_on": "BLE_MESH && !BLE_MESH_NO_LOG && BLE_MESH && !BLE_MESH_NO_LOG && BLE_MESH", + "help": "Define BLE Mesh trace level for BLE Mesh net buffer.", + "id": "component-config-esp-ble-mesh-support-ble-mesh-net-buf-debug-log-level-ble_mesh_net_buf", + "name": "BLE_MESH_NET_BUF_TRACE_LEVEL", + "title": "BLE_MESH_NET_BUF", + "type": "choice" + }, + { + "children": [], + "depends_on": "BLE_MESH && BLE_MESH && !BLE_MESH_NO_LOG && BLE_MESH", + "help": null, + "id": "BLE_MESH_NET_BUF_TRACE_LEVEL", + "name": "BLE_MESH_NET_BUF_TRACE_LEVEL", + "range": null, + "title": null, + "type": "int" + } + ], + "depends_on": "BLE_MESH && !BLE_MESH_NO_LOG && BLE_MESH", + "id": "component-config-esp-ble-mesh-support-ble-mesh-net-buf-debug-log-level", + "title": "BLE Mesh NET BUF DEBUG LOG LEVEL", + "type": "menu" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Timeout value used by the node to get response of the acknowledged\nmessage which is sent by the client model.\nThis value indicates the maximum time that a client model waits for\nthe response of the sent acknowledged messages. If a client model\nuses 0 as the timeout value when sending acknowledged messages, then\nthe default value will be used which is four seconds.", + "id": "BLE_MESH_CLIENT_MSG_TIMEOUT", + "name": "BLE_MESH_CLIENT_MSG_TIMEOUT", + "range": null, + "title": "Timeout(ms) for client message response", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable support for Configuration Client model.", + "id": "BLE_MESH_CFG_CLI", + "name": "BLE_MESH_CFG_CLI", + "range": null, + "title": "Configuration Client model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable support for Health Client model.", + "id": "BLE_MESH_HEALTH_CLI", + "name": "BLE_MESH_HEALTH_CLI", + "range": null, + "title": "Health Client model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable support for Health Server model.", + "id": "BLE_MESH_HEALTH_SRV", + "name": "BLE_MESH_HEALTH_SRV", + "range": null, + "title": "Health Server model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Enable support for Bridge Configuration Client model.", + "id": "BLE_MESH_BRC_CLI", + "name": "BLE_MESH_BRC_CLI", + "range": null, + "title": "Bridge Configuration Client model", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BLE_MESH_BRC_SRV && BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Maximum number of Bridging Table entries that the Bridge Configuration Server can support.", + "id": "BLE_MESH_MAX_BRIDGING_TABLE_ENTRY_COUNT", + "name": "BLE_MESH_MAX_BRIDGING_TABLE_ENTRY_COUNT", + "range": null, + "title": "Maximum number of Bridging Table entries", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH_BRC_SRV && BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "This option specifies the maximum capacity of the bridge replay\nprotection list. The bridge replay protection list is used to\nprevent a bridged subnet from replay attack, which will store the\nsource address and sequence number of the received bridge messages.", + "id": "BLE_MESH_BRIDGE_CRPL", + "name": "BLE_MESH_BRIDGE_CRPL", + "range": null, + "title": "Maximum capacity of bridge replay protection list", + "type": "int" + } + ], + "depends_on": "BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Enable support for Bridge Configuration Server model.", + "id": "BLE_MESH_BRC_SRV", + "name": "BLE_MESH_BRC_SRV", + "range": null, + "title": "Bridge Configuration Server model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Enable support for Mesh Private Beacon Client model.", + "id": "BLE_MESH_PRB_CLI", + "name": "BLE_MESH_PRB_CLI", + "range": null, + "title": "Mesh Private Beacon Client model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Enable support for Mesh Private Beacon Server model.", + "id": "BLE_MESH_PRB_SRV", + "name": "BLE_MESH_PRB_SRV", + "range": null, + "title": "Mesh Private Beacon Server model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Enable support for On-Demand Private Proxy Client model.", + "id": "BLE_MESH_ODP_CLI", + "name": "BLE_MESH_ODP_CLI", + "range": null, + "title": "On-Demand Private Proxy Client model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_PROXY_SOLIC_PDU_RX && BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Enable support for On-Demand Private Proxy Server model.", + "id": "BLE_MESH_ODP_SRV", + "name": "BLE_MESH_ODP_SRV", + "range": null, + "title": "On-Demand Private Proxy Server model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Enable support for Solicitation PDU RPL Configuration Client model.", + "id": "BLE_MESH_SRPL_CLI", + "name": "BLE_MESH_SRPL_CLI", + "range": null, + "title": "Solicitation PDU RPL Configuration Client model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_PROXY_SOLIC_PDU_RX && BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Enable support for Solicitation PDU RPL Configuration Server model.\nNote:\nThis option depends on the functionality of receiving Solicitation\nPDU. If the device doesn't support receiving Solicitation PDU, then\nthere is no need to enable this server model.", + "id": "BLE_MESH_SRPL_SRV", + "name": "BLE_MESH_SRPL_SRV", + "range": null, + "title": "Solicitation PDU RPL Configuration Server model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Enable support for Opcodes Aggregator Client model.", + "id": "BLE_MESH_AGG_CLI", + "name": "BLE_MESH_AGG_CLI", + "range": null, + "title": "Opcodes Aggregator Client model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Enable support for Opcodes Aggregator Server model.", + "id": "BLE_MESH_AGG_SRV", + "name": "BLE_MESH_AGG_SRV", + "range": null, + "title": "Opcodes Aggregator Server model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Enable support for SAR Configuration Client model.", + "id": "BLE_MESH_SAR_CLI", + "name": "BLE_MESH_SAR_CLI", + "range": null, + "title": "SAR Configuration Client model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Enable support for SAR Configuration Server model.", + "id": "BLE_MESH_SAR_SRV", + "name": "BLE_MESH_SAR_SRV", + "range": null, + "title": "SAR Configuration Server model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Composition Data Page 1 contains information about the relationships\namong models.\nEach model either can be a root model or can extend other models.", + "id": "BLE_MESH_COMP_DATA_1", + "name": "BLE_MESH_COMP_DATA_1", + "range": null, + "title": "Support Composition Data Page 1", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Composition Data Page 128 is used to indicate the structure of\nelements, features, and models of a node after the successful\nexecution of the Node Address Refresh procedure or the Node\nComposition Refresh procedure, or after the execution of the\nNode Removal procedure followed by the provisioning process.\nComposition Data Page 128 shall be present if the node supports\nthe Remote Provisioning Server model; otherwise it is optional.", + "id": "BLE_MESH_COMP_DATA_128", + "name": "BLE_MESH_COMP_DATA_128", + "range": null, + "title": "Support Composition Data Page 128", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BLE_MESH_MODELS_METADATA_0 && BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "The Models Metadata state contains metadata of a node\u2019s models.\nThe Models Metadata state is composed of a number of pages of\ninformation.\nModels Metadata Page 128 contains metadata for the node\u2019s models\nafter the successful execution of the Node Address Refresh\nprocedure or the Node Composition Refresh procedure, or after\nthe execution of the Node Removal procedure followed by the\nprovisioning process.\nModels Metadata Page 128 shall be present if the node supports\nthe Remote Provisioning Server model and the node supports the\nLarge Composition Data Server model.", + "id": "BLE_MESH_MODELS_METADATA_128", + "name": "BLE_MESH_MODELS_METADATA_128", + "range": null, + "title": "Support Models Metadata Page 128", + "type": "bool" + } + ], + "depends_on": "BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "The Models Metadata state contains metadata of a node\u2019s models.\nThe Models Metadata state is composed of a number of pages of\ninformation.\nModels Metadata Page 0 shall be present if the node supports\nthe Large Composition Data Server model.", + "id": "BLE_MESH_MODELS_METADATA_0", + "name": "BLE_MESH_MODELS_METADATA_0", + "range": null, + "title": "Support Models Metadata Page 0", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Enable support for Large Composition Data Client model.", + "id": "BLE_MESH_LCD_CLI", + "name": "BLE_MESH_LCD_CLI", + "range": null, + "title": "Large Composition Data Client model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Enable support for Large Composition Data Server model.", + "id": "BLE_MESH_LCD_SRV", + "name": "BLE_MESH_LCD_SRV", + "range": null, + "title": "Large Composition Data Server model", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BLE_MESH_RPR_CLI && BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "This option specifies how many devices can be provisioned at the same time\nusing PB-REMOTE. For example, if the value is 2, it means a Provisioner can\nprovision two unprovisioned devices with PB-REMOTE at the same time.", + "id": "BLE_MESH_RPR_CLI_PROV_SAME_TIME", + "name": "BLE_MESH_RPR_CLI_PROV_SAME_TIME", + "range": null, + "title": "Maximum number of PB-Remote running at the same time by Provisioner", + "type": "int" + } + ], + "depends_on": "BLE_MESH_PROVISIONER && BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Enable support for Remote Provisioning Client model", + "id": "BLE_MESH_RPR_CLI", + "name": "BLE_MESH_RPR_CLI", + "range": null, + "title": "Remote Provisioning Client model", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BLE_MESH_RPR_SRV && BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "This option specifies how many device information can a Remote\nProvisioning Server store each time while scanning.", + "id": "BLE_MESH_RPR_SRV_MAX_SCANNED_ITEMS", + "name": "BLE_MESH_RPR_SRV_MAX_SCANNED_ITEMS", + "range": null, + "title": "Maximum number of device information can be scanned", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH_RPR_SRV && BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Enable this option to support Active Scan for remote provisioning.", + "id": "BLE_MESH_RPR_SRV_ACTIVE_SCAN", + "name": "BLE_MESH_RPR_SRV_ACTIVE_SCAN", + "range": null, + "title": "Support Active Scan for remote provisioning", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_RPR_SRV && BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "This option specifies how many extended scan procedures can be\nstarted by the Remote Provisioning Server.", + "id": "BLE_MESH_RPR_SRV_MAX_EXT_SCAN", + "name": "BLE_MESH_RPR_SRV_MAX_EXT_SCAN", + "range": null, + "title": "Maximum number of extended scan procedures", + "type": "int" + } + ], + "depends_on": "BLE_MESH_NODE && BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Enable support for Remote Provisioning Server model", + "id": "BLE_MESH_RPR_SRV", + "name": "BLE_MESH_RPR_SRV", + "range": null, + "title": "Remote Provisioning Server model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Enable support for Directed Forwarding Configuration Client model.", + "id": "BLE_MESH_DF_CLI", + "name": "BLE_MESH_DF_CLI", + "range": null, + "title": "Directed Forwarding Configuration Client model", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BLE_MESH_DF_SRV && BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Maximum number of Discovery Table entries supported by the node in a given subnet.", + "id": "BLE_MESH_MAX_DISC_TABLE_ENTRY_COUNT", + "name": "BLE_MESH_MAX_DISC_TABLE_ENTRY_COUNT", + "range": null, + "title": "Maximum number of discovery table entries in a given subnet", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH_DF_SRV && BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Maximum number of Forward Table entries supported by the node in a given subnet.", + "id": "BLE_MESH_MAX_FORWARD_TABLE_ENTRY_COUNT", + "name": "BLE_MESH_MAX_FORWARD_TABLE_ENTRY_COUNT", + "range": null, + "title": "Maximum number of forward table entries in a given subnet", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH_DF_SRV && BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Maximum size of dependent nodes list supported by each forward table entry.", + "id": "BLE_MESH_MAX_DEPS_NODES_PER_PATH", + "name": "BLE_MESH_MAX_DEPS_NODES_PER_PATH", + "range": null, + "title": "Maximum number of dependent nodes per path", + "type": "int" + }, + { + "children": [], + "depends_on": "BLE_MESH_DF_SRV && BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "The option only removes the Path Use timer; all other behavior of the\ndevice is not changed.\nIf Path Monitoring test mode is going to be used, this option should\nbe enabled.", + "id": "BLE_MESH_PATH_MONITOR_TEST", + "name": "BLE_MESH_PATH_MONITOR_TEST", + "range": null, + "title": "Enable Path Monitoring test mode", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_GATT_PROXY_SERVER && BLE_MESH_DF_SRV && BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Support Directed Proxy functionality.", + "id": "BLE_MESH_SUPPORT_DIRECTED_PROXY", + "name": "BLE_MESH_SUPPORT_DIRECTED_PROXY", + "range": null, + "title": "Enable Directed Proxy functionality", + "type": "bool" + } + ], + "depends_on": "BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Enable support for Directed Forwarding Configuration Server model.", + "id": "BLE_MESH_DF_SRV", + "name": "BLE_MESH_DF_SRV", + "range": null, + "title": "Directed Forwarding Configuration Server model", + "type": "bool" + } + ], + "depends_on": "BLE_MESH", + "id": "component-config-esp-ble-mesh-support-support-for-ble-mesh-foundation-models", + "title": "Support for BLE Mesh Foundation models", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable support for Generic OnOff Client model.", + "id": "BLE_MESH_GENERIC_ONOFF_CLI", + "name": "BLE_MESH_GENERIC_ONOFF_CLI", + "range": null, + "title": "Generic OnOff Client model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable support for Generic Level Client model.", + "id": "BLE_MESH_GENERIC_LEVEL_CLI", + "name": "BLE_MESH_GENERIC_LEVEL_CLI", + "range": null, + "title": "Generic Level Client model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable support for Generic Default Transition Time Client model.", + "id": "BLE_MESH_GENERIC_DEF_TRANS_TIME_CLI", + "name": "BLE_MESH_GENERIC_DEF_TRANS_TIME_CLI", + "range": null, + "title": "Generic Default Transition Time Client model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable support for Generic Power OnOff Client model.", + "id": "BLE_MESH_GENERIC_POWER_ONOFF_CLI", + "name": "BLE_MESH_GENERIC_POWER_ONOFF_CLI", + "range": null, + "title": "Generic Power OnOff Client model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable support for Generic Power Level Client model.", + "id": "BLE_MESH_GENERIC_POWER_LEVEL_CLI", + "name": "BLE_MESH_GENERIC_POWER_LEVEL_CLI", + "range": null, + "title": "Generic Power Level Client model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable support for Generic Battery Client model.", + "id": "BLE_MESH_GENERIC_BATTERY_CLI", + "name": "BLE_MESH_GENERIC_BATTERY_CLI", + "range": null, + "title": "Generic Battery Client model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable support for Generic Location Client model.", + "id": "BLE_MESH_GENERIC_LOCATION_CLI", + "name": "BLE_MESH_GENERIC_LOCATION_CLI", + "range": null, + "title": "Generic Location Client model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable support for Generic Property Client model.", + "id": "BLE_MESH_GENERIC_PROPERTY_CLI", + "name": "BLE_MESH_GENERIC_PROPERTY_CLI", + "range": null, + "title": "Generic Property Client model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable support for Sensor Client model.", + "id": "BLE_MESH_SENSOR_CLI", + "name": "BLE_MESH_SENSOR_CLI", + "range": null, + "title": "Sensor Client model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable support for Time Client model.", + "id": "BLE_MESH_TIME_CLI", + "name": "BLE_MESH_TIME_CLI", + "range": null, + "title": "Time Client model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable support for Scene Client model.", + "id": "BLE_MESH_SCENE_CLI", + "name": "BLE_MESH_SCENE_CLI", + "range": null, + "title": "Scene Client model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable support for Scheduler Client model.", + "id": "BLE_MESH_SCHEDULER_CLI", + "name": "BLE_MESH_SCHEDULER_CLI", + "range": null, + "title": "Scheduler Client model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable support for Light Lightness Client model.", + "id": "BLE_MESH_LIGHT_LIGHTNESS_CLI", + "name": "BLE_MESH_LIGHT_LIGHTNESS_CLI", + "range": null, + "title": "Light Lightness Client model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable support for Light CTL Client model.", + "id": "BLE_MESH_LIGHT_CTL_CLI", + "name": "BLE_MESH_LIGHT_CTL_CLI", + "range": null, + "title": "Light CTL Client model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable support for Light HSL Client model.", + "id": "BLE_MESH_LIGHT_HSL_CLI", + "name": "BLE_MESH_LIGHT_HSL_CLI", + "range": null, + "title": "Light HSL Client model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable support for Light XYL Client model.", + "id": "BLE_MESH_LIGHT_XYL_CLI", + "name": "BLE_MESH_LIGHT_XYL_CLI", + "range": null, + "title": "Light XYL Client model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable support for Light LC Client model.", + "id": "BLE_MESH_LIGHT_LC_CLI", + "name": "BLE_MESH_LIGHT_LC_CLI", + "range": null, + "title": "Light LC Client model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable support for Generic server models.", + "id": "BLE_MESH_GENERIC_SERVER", + "name": "BLE_MESH_GENERIC_SERVER", + "range": null, + "title": "Generic server models", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable support for Sensor server models.", + "id": "BLE_MESH_SENSOR_SERVER", + "name": "BLE_MESH_SENSOR_SERVER", + "range": null, + "title": "Sensor server models", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable support for Time and Scenes server models.", + "id": "BLE_MESH_TIME_SCENE_SERVER", + "name": "BLE_MESH_TIME_SCENE_SERVER", + "range": null, + "title": "Time and Scenes server models", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Enable support for Lighting server models.", + "id": "BLE_MESH_LIGHTING_SERVER", + "name": "BLE_MESH_LIGHTING_SERVER", + "range": null, + "title": "Lighting server models", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BLE_MESH_MBT_CLI && BLE_MESH", + "help": "Maximum number of BLOB Transfer Server models that can participating\nin the BLOB transfer with a BLOB Transfer Client model.", + "id": "BLE_MESH_MAX_BLOB_RECEIVERS", + "name": "BLE_MESH_MAX_BLOB_RECEIVERS", + "range": null, + "title": "Maximum number of simultaneous blob receivers", + "type": "int" + } + ], + "depends_on": "BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Enable support for BLOB Transfer Client model.", + "id": "BLE_MESH_MBT_CLI", + "name": "BLE_MESH_MBT_CLI", + "range": null, + "title": "BLOB Transfer Client model", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_V11_SUPPORT && BLE_MESH", + "help": "Enable support for BLOB Transfer Server model.", + "id": "BLE_MESH_MBT_SRV", + "name": "BLE_MESH_MBT_SRV", + "range": null, + "title": "BLOB Transfer Server model", + "type": "bool" + } + ], + "depends_on": "BLE_MESH", + "id": "component-config-esp-ble-mesh-support-support-for-ble-mesh-client-server-models", + "title": "Support for BLE Mesh Client/Server models", + "type": "menu" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "This option removes the 96 hour limit of the IV Update Procedure and\nlets the state to be changed at any time.\nIf IV Update test mode is going to be used, this option should be enabled.", + "id": "BLE_MESH_IV_UPDATE_TEST", + "name": "BLE_MESH_IV_UPDATE_TEST", + "range": null, + "title": "Test the IV Update Procedure", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "This option is used to decide whether discarding the old SeqAuth when\nreceiving a segmented message.", + "id": "BLE_MESH_DISCARD_OLD_SEQ_AUTH", + "name": "BLE_MESH_DISCARD_OLD_SEQ_AUTH", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BLE_MESH", + "help": "This option adds extra self-tests which are run every time BLE Mesh\nnetworking is initialized.", + "id": "BLE_MESH_SELF_TEST", + "name": "BLE_MESH_SELF_TEST", + "range": null, + "title": "Perform BLE Mesh self-tests", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BLE_MESH_BQB_TEST && BLE_MESH", + "help": "This option is used to enable the log of auto-pts test.", + "id": "BLE_MESH_BQB_TEST_LOG", + "name": "BLE_MESH_BQB_TEST_LOG", + "range": null, + "title": null, + "type": "bool" + } + ], + "depends_on": "BLE_MESH", + "help": "This option is used to enable some internal functions for auto-pts test.", + "id": "BLE_MESH_BQB_TEST", + "name": "BLE_MESH_BQB_TEST", + "range": null, + "title": "Enable BLE Mesh specific internal test", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_SELF_TEST && BLE_MESH", + "help": "With this option enabled, an unprovisioned device can automatically\nenters mesh network using a specific test function without the pro-\nvisioning procedure. And on the Provisioner side, a test function\nneeds to be invoked to add the node information into the mesh stack.", + "id": "BLE_MESH_TEST_AUTO_ENTER_NETWORK", + "name": "BLE_MESH_TEST_AUTO_ENTER_NETWORK", + "range": null, + "title": "Unprovisioned device enters mesh network automatically", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_SELF_TEST && BLE_MESH", + "help": "With this option enabled, users can use white list to filter mesh\nadvertising packets while scanning.", + "id": "BLE_MESH_TEST_USE_WHITE_LIST", + "name": "BLE_MESH_TEST_USE_WHITE_LIST", + "range": null, + "title": "Use white list to filter mesh advertising packets", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Activate shell module that provides BLE Mesh commands to the console.", + "id": "BLE_MESH_SHELL", + "name": "BLE_MESH_SHELL", + "range": null, + "title": "Enable BLE Mesh shell", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "BLE_MESH_DEBUG && BLE_MESH", + "help": "Enable Network layer debug logs for the BLE Mesh functionality.", + "id": "BLE_MESH_DEBUG_NET", + "name": "BLE_MESH_DEBUG_NET", + "range": null, + "title": "Network layer debug", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_DEBUG && BLE_MESH", + "help": "Enable Transport layer debug logs for the BLE Mesh functionality.", + "id": "BLE_MESH_DEBUG_TRANS", + "name": "BLE_MESH_DEBUG_TRANS", + "range": null, + "title": "Transport layer debug", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_DEBUG && BLE_MESH", + "help": "Enable Beacon-related debug logs for the BLE Mesh functionality.", + "id": "BLE_MESH_DEBUG_BEACON", + "name": "BLE_MESH_DEBUG_BEACON", + "range": null, + "title": "Beacon debug", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_DEBUG && BLE_MESH", + "help": "Enable cryptographic debug logs for the BLE Mesh functionality.", + "id": "BLE_MESH_DEBUG_CRYPTO", + "name": "BLE_MESH_DEBUG_CRYPTO", + "range": null, + "title": "Crypto debug", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_DEBUG && BLE_MESH", + "help": "Enable Provisioning debug logs for the BLE Mesh functionality.", + "id": "BLE_MESH_DEBUG_PROV", + "name": "BLE_MESH_DEBUG_PROV", + "range": null, + "title": "Provisioning debug", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_DEBUG && BLE_MESH", + "help": "Enable Access layer debug logs for the BLE Mesh functionality.", + "id": "BLE_MESH_DEBUG_ACCESS", + "name": "BLE_MESH_DEBUG_ACCESS", + "range": null, + "title": "Access layer debug", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_DEBUG && BLE_MESH", + "help": "Enable Foundation Models debug logs for the BLE Mesh functionality.", + "id": "BLE_MESH_DEBUG_MODEL", + "name": "BLE_MESH_DEBUG_MODEL", + "range": null, + "title": "Foundation model debug", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_DEBUG && BLE_MESH", + "help": "Enable advertising debug logs for the BLE Mesh functionality.", + "id": "BLE_MESH_DEBUG_ADV", + "name": "BLE_MESH_DEBUG_ADV", + "range": null, + "title": "Advertising debug", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_DEBUG && BLE_MESH", + "help": "Enable Low Power debug logs for the BLE Mesh functionality.", + "id": "BLE_MESH_DEBUG_LOW_POWER", + "name": "BLE_MESH_DEBUG_LOW_POWER", + "range": null, + "title": "Low Power debug", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_DEBUG && BLE_MESH", + "help": "Enable Friend debug logs for the BLE Mesh functionality.", + "id": "BLE_MESH_DEBUG_FRIEND", + "name": "BLE_MESH_DEBUG_FRIEND", + "range": null, + "title": "Friend debug", + "type": "bool" + }, + { + "children": [], + "depends_on": "BLE_MESH_PROXY && BLE_MESH_DEBUG && BLE_MESH", + "help": "Enable Proxy protocol debug logs for the BLE Mesh functionality.", + "id": "BLE_MESH_DEBUG_PROXY", + "name": "BLE_MESH_DEBUG_PROXY", + "range": null, + "title": "Proxy debug", + "type": "bool" + } + ], + "depends_on": "BLE_MESH", + "help": "Enable debug logs for the BLE Mesh functionality.", + "id": "BLE_MESH_DEBUG", + "name": "BLE_MESH_DEBUG", + "range": null, + "title": "Enable BLE Mesh debug logs", + "type": "bool" + } + ], + "depends_on": "BLE_MESH", + "id": "component-config-esp-ble-mesh-support-ble-mesh-specific-test-option", + "title": "BLE Mesh specific test option", + "type": "menu" + }, + { + "children": [], + "depends_on": "BLE_MESH", + "help": "Make BLE Mesh Experimental features visible.\nExperimental features list:\n- CONFIG_BLE_MESH_NOT_RELAY_REPLAY_MSG", + "id": "BLE_MESH_EXPERIMENTAL", + "name": "BLE_MESH_EXPERIMENTAL", + "range": null, + "title": "Make BLE Mesh experimental features visible", + "type": "bool" + } + ], + "depends_on": "BT_ENABLED", + "help": "This option enables ESP BLE Mesh support. The specific features that are\navailable may depend on other features that have been enabled in the\nstack, such as Bluetooth Support, Bluedroid Support & GATT support.", + "id": "BLE_MESH", + "is_menuconfig": true, + "name": "BLE_MESH", + "range": null, + "title": "ESP BLE Mesh Support", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "Instead of listing the commands in the order of registration, the help command lists\nthe available commands in sorted order, if this option is enabled.", + "id": "CONSOLE_SORTED_HELP", + "name": "CONSOLE_SORTED_HELP", + "range": null, + "title": "Enable sorted help", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-console-library", + "title": "Console Library", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "SOC_TWAI_SUPPORTED", + "help": "Place the TWAI ISR in to IRAM. This will allow the ISR to avoid\ncache misses, and also be able to run whilst the cache is disabled\n(such as when writing to SPI Flash).\nNote that if this option is enabled:\n- Users should also set the ESP_INTR_FLAG_IRAM in the driver\nconfiguration structure when installing the driver (see docs for\nspecifics).\n- Alert logging (i.e., setting of the TWAI_ALERT_AND_LOG flag)\nwill have no effect.", + "id": "TWAI_ISR_IN_IRAM", + "name": "TWAI_ISR_IN_IRAM", + "range": null, + "title": "Place TWAI ISR function into IRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ESP32 && SOC_TWAI_SUPPORTED", + "help": "When the bus-off condition is reached, the REC should be reset to 0 and frozen (via LOM) by the\ndriver's ISR. However on the ESP32, there is an edge case where the REC will increase before the\ndriver's ISR can respond in time (e.g., due to the rapid occurrence of bus errors), thus causing the\nREC to be non-zero after bus-off. A non-zero REC can prevent bus-off recovery as the bus-off recovery\ncondition is that both TEC and REC become 0. Enabling this option will add a workaround in the driver\nto forcibly reset REC to zero on reaching bus-off.", + "id": "TWAI_ERRATA_FIX_BUS_OFF_REC", + "name": "TWAI_ERRATA_FIX_BUS_OFF_REC", + "range": null, + "title": "Add SW workaround for REC change during bus-off", + "type": "bool" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ESP32 && SOC_TWAI_SUPPORTED", + "help": "On the ESP32, when a transmit interrupt occurs, and interrupt register is read on the same APB clock\ncycle, the transmit interrupt could be lost. Enabling this option will add a workaround that checks the\ntransmit buffer status bit to recover any lost transmit interrupt.", + "id": "TWAI_ERRATA_FIX_TX_INTR_LOST", + "name": "TWAI_ERRATA_FIX_TX_INTR_LOST", + "range": null, + "title": "Add SW workaround for TX interrupt lost errata", + "type": "bool" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ESP32 && SOC_TWAI_SUPPORTED", + "help": "On the ESP32, when receiving a data or remote frame, if a bus error occurs in the data or CRC field,\nthe data of the next received frame could be invalid. Enabling this option will add a workaround that\nwill reset the peripheral on detection of this errata condition. Note that if a frame is transmitted on\nthe bus whilst the reset is ongoing, the message will not be receive by the peripheral sent on the bus\nduring the reset, the message will be lost.", + "id": "TWAI_ERRATA_FIX_RX_FRAME_INVALID", + "name": "TWAI_ERRATA_FIX_RX_FRAME_INVALID", + "range": null, + "title": "Add SW workaround for invalid RX frame errata", + "type": "bool" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ESP32 && SOC_TWAI_SUPPORTED", + "help": "On the ESP32, when the RX FIFO overruns and the RX message counter maxes out at 64 messages, the entire\nRX FIFO is no longer recoverable. Enabling this option will add a workaround that resets the peripheral\non detection of this errata condition. Note that if a frame is being sent on the bus during the reset\nbus during the reset, the message will be lost.", + "id": "TWAI_ERRATA_FIX_RX_FIFO_CORRUPT", + "name": "TWAI_ERRATA_FIX_RX_FIFO_CORRUPT", + "range": null, + "title": "Add SW workaround for RX FIFO corruption errata", + "type": "bool" + }, + { + "children": [], + "depends_on": "(IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32S3 || IDF_TARGET_ESP32C3) && SOC_TWAI_SUPPORTED", + "help": "When in the listen only mode, the TWAI controller must not influence the TWAI bus (i.e., must not send\nany dominant bits). However, while in listen only mode on the ESP32/ESP32-S2/ESP32-S3/ESP32-C3, the\nTWAI controller will still transmit dominant bits when it detects an error (i.e., as part of an active\nerror frame). Enabling this option will add a workaround that forces the TWAI controller into an error\npassive state on initialization, thus preventing any dominant bits from being sent.", + "id": "TWAI_ERRATA_FIX_LISTEN_ONLY_DOM", + "name": "TWAI_ERRATA_FIX_LISTEN_ONLY_DOM", + "range": null, + "title": "Add SW workaround for listen only transmits dominant bit errata", + "type": "bool" + } + ], + "depends_on": "SOC_TWAI_SUPPORTED", + "id": "component-config-driver-configurations-twai-configuration", + "title": "TWAI Configuration", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_DAC_SUPPORTED", + "help": "If this is set, the ADC2 driver will disable the output of the DAC corresponding to the specified\nchannel. This is the default value.\n\nFor testing, disable this option so that we can measure the output of DAC by internal ADC.", + "id": "ADC_DISABLE_DAC", + "name": "ADC_DISABLE_DAC", + "range": null, + "title": "Disable DAC when ADC2 is used on GPIO 25 and 26", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Whether to suppress the deprecation warnings when using legacy adc driver (driver/adc.h).\nIf you want to continue using the legacy driver, and don't want to see related deprecation warnings,\nyou can enable this option.", + "id": "ADC_SUPPRESS_DEPRECATE_WARN", + "name": "ADC_SUPPRESS_DEPRECATE_WARN", + "range": null, + "title": "Suppress legacy driver deprecated warning", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "This configuration option allows the user to bypass the conflict check mechanism with legacy code.", + "id": "ADC_SKIP_LEGACY_CONFLICT_CHECK", + "name": "ADC_SKIP_LEGACY_CONFLICT_CHECK", + "range": null, + "title": "Skip legacy conflict check", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "IDF_TARGET_ESP32", + "help": "Some ESP32s have Two Point calibration values burned into eFuse BLOCK3.\nThis option will allow the ADC calibration component to characterize the\nADC-Voltage curve using Two Point values if they are available.", + "id": "ADC_CAL_EFUSE_TP_ENABLE", + "name": "ADC_CAL_EFUSE_TP_ENABLE", + "range": null, + "title": "Use Two Point Values", + "type": "bool" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ESP32", + "help": "Some ESP32s have Vref burned into eFuse BLOCK0. This option will allow\nthe ADC calibration component to characterize the ADC-Voltage curve using\neFuse Vref if it is available.", + "id": "ADC_CAL_EFUSE_VREF_ENABLE", + "name": "ADC_CAL_EFUSE_VREF_ENABLE", + "range": null, + "title": "Use eFuse Vref", + "type": "bool" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ESP32", + "help": "This option will allow the ADC calibration component to use Lookup Tables\nto correct for non-linear behavior in 11db attenuation. Other attenuations\ndo not exhibit non-linear behavior hence will not be affected by this option.", + "id": "ADC_CAL_LUT_ENABLE", + "name": "ADC_CAL_LUT_ENABLE", + "range": null, + "title": "Use Lookup Tables", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Whether to suppress the deprecation warnings when using legacy adc calibration\ndriver (esp_adc_cal.h).\nIf you want to continue using the legacy driver, and don't want to see related\ndeprecation warnings, you can enable this option.", + "id": "ADC_CALI_SUPPRESS_DEPRECATE_WARN", + "name": "ADC_CALI_SUPPRESS_DEPRECATE_WARN", + "range": null, + "title": "Suppress legacy driver deprecated warning", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-driver-configurations-legacy-adc-driver-configuration-legacy-adc-calibration-configuration", + "title": "Legacy ADC Calibration Configuration", + "type": "menu" + } + ], + "depends_on": null, + "id": "component-config-driver-configurations-legacy-adc-driver-configuration", + "title": "Legacy ADC Driver Configuration", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_DAC_SUPPORTED", + "help": "Whether to suppress the deprecation warnings when using legacy dac driver (driver/dac.h).\nIf you want to continue using the legacy driver, and don't want to see related deprecation warnings,\nyou can enable this option.", + "id": "DAC_SUPPRESS_DEPRECATE_WARN", + "name": "DAC_SUPPRESS_DEPRECATE_WARN", + "range": null, + "title": "Suppress legacy driver deprecated warning", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_DAC_SUPPORTED", + "help": "This configuration option allows the user to bypass the conflict check mechanism with legacy code.", + "id": "DAC_SKIP_LEGACY_CONFLICT_CHECK", + "name": "DAC_SKIP_LEGACY_CONFLICT_CHECK", + "range": null, + "title": "Skip legacy conflict check", + "type": "bool" + } + ], + "depends_on": "SOC_DAC_SUPPORTED", + "id": "component-config-driver-configurations-legacy-dac-driver-configurations", + "title": "Legacy DAC Driver Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_MCPWM_SUPPORTED", + "help": "Whether to suppress the deprecation warnings when using legacy MCPWM driver (driver/mcpwm.h).\nIf you want to continue using the legacy driver, and don't want to see related deprecation warnings,\nyou can enable this option.", + "id": "MCPWM_SUPPRESS_DEPRECATE_WARN", + "name": "MCPWM_SUPPRESS_DEPRECATE_WARN", + "range": null, + "title": "Suppress legacy driver deprecated warning", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_MCPWM_SUPPORTED", + "help": "This configuration option allows the user to bypass the conflict check mechanism with legacy code.", + "id": "MCPWM_SKIP_LEGACY_CONFLICT_CHECK", + "name": "MCPWM_SKIP_LEGACY_CONFLICT_CHECK", + "range": null, + "title": "Skip legacy conflict check", + "type": "bool" + } + ], + "depends_on": "SOC_MCPWM_SUPPORTED", + "id": "component-config-driver-configurations-legacy-mcpwm-driver-configurations", + "title": "Legacy MCPWM Driver Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_GPTIMER_SUPPORTED", + "help": "Whether to suppress the deprecation warnings when using legacy timer group driver (driver/timer.h).\nIf you want to continue using the legacy driver, and don't want to see related deprecation warnings,\nyou can enable this option.", + "id": "GPTIMER_SUPPRESS_DEPRECATE_WARN", + "name": "GPTIMER_SUPPRESS_DEPRECATE_WARN", + "range": null, + "title": "Suppress legacy driver deprecated warning", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_GPTIMER_SUPPORTED", + "help": "This configuration option allows the user to bypass the conflict check mechanism with legacy code.", + "id": "GPTIMER_SKIP_LEGACY_CONFLICT_CHECK", + "name": "GPTIMER_SKIP_LEGACY_CONFLICT_CHECK", + "range": null, + "title": "Skip legacy conflict check", + "type": "bool" + } + ], + "depends_on": "SOC_GPTIMER_SUPPORTED", + "id": "component-config-driver-configurations-legacy-timer-group-driver-configurations", + "title": "Legacy Timer Group Driver Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_RMT_SUPPORTED", + "help": "Whether to suppress the deprecation warnings when using legacy rmt driver (driver/rmt.h).\nIf you want to continue using the legacy driver, and don't want to see related deprecation warnings,\nyou can enable this option.", + "id": "RMT_SUPPRESS_DEPRECATE_WARN", + "name": "RMT_SUPPRESS_DEPRECATE_WARN", + "range": null, + "title": "Suppress legacy driver deprecated warning", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_RMT_SUPPORTED", + "help": "This configuration option allows the user to bypass the conflict check mechanism with legacy code.", + "id": "RMT_SKIP_LEGACY_CONFLICT_CHECK", + "name": "RMT_SKIP_LEGACY_CONFLICT_CHECK", + "range": null, + "title": "Skip legacy conflict check", + "type": "bool" + } + ], + "depends_on": "SOC_RMT_SUPPORTED", + "id": "component-config-driver-configurations-legacy-rmt-driver-configurations", + "title": "Legacy RMT Driver Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_I2S_SUPPORTED", + "help": "Whether to suppress the deprecation warnings when using legacy i2s driver (driver/i2s.h).\nIf you want to continue using the legacy driver, and don't want to see related deprecation warnings,\nyou can enable this option.", + "id": "I2S_SUPPRESS_DEPRECATE_WARN", + "name": "I2S_SUPPRESS_DEPRECATE_WARN", + "range": null, + "title": "Suppress legacy driver deprecated warning", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_I2S_SUPPORTED", + "help": "This configuration option allows the user to bypass the conflict check mechanism with legacy code.", + "id": "I2S_SKIP_LEGACY_CONFLICT_CHECK", + "name": "I2S_SKIP_LEGACY_CONFLICT_CHECK", + "range": null, + "title": "Skip legacy conflict check", + "type": "bool" + } + ], + "depends_on": "SOC_I2S_SUPPORTED", + "id": "component-config-driver-configurations-legacy-i2s-driver-configurations", + "title": "Legacy I2S Driver Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_PCNT_SUPPORTED", + "help": "whether to suppress the deprecation warnings when using legacy PCNT driver (driver/pcnt.h).\nIf you want to continue using the legacy driver, and don't want to see related deprecation warnings,\nyou can enable this option.", + "id": "PCNT_SUPPRESS_DEPRECATE_WARN", + "name": "PCNT_SUPPRESS_DEPRECATE_WARN", + "range": null, + "title": "Suppress legacy driver deprecated warning", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_PCNT_SUPPORTED", + "help": "This configuration option allows the user to bypass the conflict check mechanism with legacy code.", + "id": "PCNT_SKIP_LEGACY_CONFLICT_CHECK", + "name": "PCNT_SKIP_LEGACY_CONFLICT_CHECK", + "range": null, + "title": "Skip legacy conflict check", + "type": "bool" + } + ], + "depends_on": "SOC_PCNT_SUPPORTED", + "id": "component-config-driver-configurations-legacy-pcnt-driver-configurations", + "title": "Legacy PCNT Driver Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_SDM_SUPPORTED", + "help": "whether to suppress the deprecation warnings when using legacy SDM driver (driver/sigmadelta.h).\nIf you want to continue using the legacy driver, and don't want to see related deprecation warnings,\nyou can enable this option.", + "id": "SDM_SUPPRESS_DEPRECATE_WARN", + "name": "SDM_SUPPRESS_DEPRECATE_WARN", + "range": null, + "title": "Suppress legacy driver deprecated warning", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_SDM_SUPPORTED", + "help": "This configuration option allows the user to bypass the conflict check mechanism with legacy code.", + "id": "SDM_SKIP_LEGACY_CONFLICT_CHECK", + "name": "SDM_SKIP_LEGACY_CONFLICT_CHECK", + "range": null, + "title": "Skip legacy conflict check", + "type": "bool" + } + ], + "depends_on": "SOC_SDM_SUPPORTED", + "id": "component-config-driver-configurations-legacy-sdm-driver-configurations", + "title": "Legacy SDM Driver Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_TEMP_SENSOR_SUPPORTED", + "help": "whether to suppress the deprecation warnings when using legacy temperature sensor driver\n(driver/temp_sensor.h). If you want to continue using the legacy driver,\nand don't want to see related deprecation warnings, you can enable this option.", + "id": "TEMP_SENSOR_SUPPRESS_DEPRECATE_WARN", + "name": "TEMP_SENSOR_SUPPRESS_DEPRECATE_WARN", + "range": null, + "title": "Suppress legacy driver deprecated warning", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_TEMP_SENSOR_SUPPORTED", + "help": "This configuration option allows the user to bypass the conflict check mechanism with legacy code.", + "id": "TEMP_SENSOR_SKIP_LEGACY_CONFLICT_CHECK", + "name": "TEMP_SENSOR_SKIP_LEGACY_CONFLICT_CHECK", + "range": null, + "title": "Skip legacy conflict check", + "type": "bool" + } + ], + "depends_on": "SOC_TEMP_SENSOR_SUPPORTED", + "id": "component-config-driver-configurations-legacy-temperature-sensor-driver-configurations", + "title": "Legacy Temperature Sensor Driver Configurations", + "type": "menu" + } + ], + "depends_on": null, + "id": "component-config-driver-configurations", + "title": "Driver Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "EFUSE_CUSTOM_TABLE", + "help": "Name of the custom eFuse CSV filename. This path is evaluated\nrelative to the project root directory.", + "id": "EFUSE_CUSTOM_TABLE_FILENAME", + "name": "EFUSE_CUSTOM_TABLE_FILENAME", + "range": null, + "title": "Custom eFuse CSV file", + "type": "string" + } + ], + "depends_on": null, + "help": "Allows to generate a structure for eFuse from the CSV file.", + "id": "EFUSE_CUSTOM_TABLE", + "name": "EFUSE_CUSTOM_TABLE", + "range": null, + "title": "Use custom eFuse table", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "EFUSE_VIRTUAL && !IDF_TARGET_LINUX", + "help": "In addition to the \"Simulate eFuse operations in RAM\" option, this option just adds\na feature to keep eFuses after reboots in flash memory. To use this mode the partition_table\nshould have the `efuse` partition. partition.csv: \"efuse_em, data, efuse, , 0x2000,\"\n\nDuring startup, the eFuses are copied from flash or,\nin case if flash is empty, from real eFuse to RAM and then update flash.\nThis mode is useful when need to keep changes after reboot\n(testing secure_boot and flash_encryption).", + "id": "EFUSE_VIRTUAL_KEEP_IN_FLASH", + "name": "EFUSE_VIRTUAL_KEEP_IN_FLASH", + "range": null, + "title": "Keep eFuses in flash", + "type": "bool" + }, + { + "children": [], + "depends_on": "EFUSE_VIRTUAL", + "help": "If enabled, log efuse burns. This shows changes that would be made.", + "id": "EFUSE_VIRTUAL_LOG_ALL_WRITES", + "name": "EFUSE_VIRTUAL_LOG_ALL_WRITES", + "range": null, + "title": "Log all virtual writes", + "type": "bool" + } + ], + "depends_on": null, + "help": "If \"n\" - No virtual mode. All eFuse operations are real and use eFuse registers.\nIf \"y\" - The virtual mode is enabled and all eFuse operations (read and write) are redirected\nto RAM instead of eFuse registers, all permanent changes (via eFuse) are disabled.\nLog output will state changes that would be applied, but they will not be.\n\nIf it is \"y\", then SECURE_FLASH_ENCRYPTION_MODE_RELEASE cannot be used.\nBecause the EFUSE VIRT mode is for testing only.\n\nDuring startup, the eFuses are copied into RAM. This mode is useful for fast tests.", + "id": "EFUSE_VIRTUAL", + "name": "EFUSE_VIRTUAL", + "range": null, + "title": "Simulate eFuse operations in RAM", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "EFUSE_CODE_SCHEME_COMPAT_NONE", + "name": "EFUSE_CODE_SCHEME_COMPAT_NONE", + "range": null, + "title": "None Only", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "EFUSE_CODE_SCHEME_COMPAT_3_4", + "name": "EFUSE_CODE_SCHEME_COMPAT_3_4", + "range": null, + "title": "3/4 and None", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "EFUSE_CODE_SCHEME_COMPAT_REPEAT", + "name": "EFUSE_CODE_SCHEME_COMPAT_REPEAT", + "range": null, + "title": "Repeat, 3/4 and None (common table does not support it)", + "type": "bool" + } + ], + "depends_on": "IDF_TARGET_ESP32", + "help": "Selector eFuse code scheme.", + "id": "component-config-efuse-bit-manager-coding-scheme-compatibility", + "name": "EFUSE_CODE_SCHEME_SELECTOR", + "title": "Coding Scheme Compatibility", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "EFUSE_MAX_BLK_LEN", + "name": "EFUSE_MAX_BLK_LEN", + "range": null, + "title": null, + "type": "int" + } + ], + "depends_on": null, + "id": "component-config-efuse-bit-manager", + "title": "eFuse Bit Manager", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_TLS_USING_MBEDTLS", + "name": "ESP_TLS_USING_MBEDTLS", + "range": null, + "title": "mbedTLS", + "type": "bool" + }, + { + "children": [], + "depends_on": "TLS_STACK_WOLFSSL && ", + "help": null, + "id": "ESP_TLS_USING_WOLFSSL", + "name": "ESP_TLS_USING_WOLFSSL", + "range": null, + "title": "wolfSSL (License info in wolfSSL directory README)", + "type": "bool" + } + ], + "depends_on": null, + "help": "The ESP-TLS APIs support multiple backend TLS libraries. Currently mbedTLS and WolfSSL are\nsupported. Different TLS libraries may support different features and have different resource\nusage. Consult the ESP-TLS documentation in ESP-IDF Programming guide for more details.", + "id": "component-config-esp-tls-choose-ssl-tls-library-for-esp-tls-see-help-for-more-info-", + "name": "ESP_TLS_LIBRARY_CHOOSE", + "title": "Choose SSL/TLS library for ESP-TLS (See help for more Info)", + "type": "choice" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ESP32 && ESP_TLS_USING_MBEDTLS", + "help": "Enable use of Secure Element for ESP-TLS, this enables internal support for\nATECC608A peripheral, which can be used for TLS connection.", + "id": "ESP_TLS_USE_SECURE_ELEMENT", + "name": "ESP_TLS_USE_SECURE_ELEMENT", + "range": null, + "title": "Use Secure Element (ATECC608A) with ESP-TLS", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_TLS_USING_MBEDTLS && SOC_DIG_SIGN_SUPPORTED", + "help": "Enable use of the Digital Signature Peripheral for ESP-TLS.The DS peripheral\ncan only be used when it is appropriately configured for TLS.\nConsult the ESP-TLS documentation in ESP-IDF Programming Guide for more details.", + "id": "ESP_TLS_USE_DS_PERIPHERAL", + "name": "ESP_TLS_USE_DS_PERIPHERAL", + "range": null, + "title": "Use Digital Signature (DS) Peripheral with ESP-TLS", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_TLS_USING_MBEDTLS && MBEDTLS_CLIENT_SSL_SESSION_TICKETS", + "help": "Enable session ticket support as specified in RFC5077.", + "id": "ESP_TLS_CLIENT_SESSION_TICKETS", + "name": "ESP_TLS_CLIENT_SESSION_TICKETS", + "range": null, + "title": "Enable client session tickets", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_TLS_SERVER_SESSION_TICKETS", + "help": "Sets the session ticket timeout used in the tls server.", + "id": "ESP_TLS_SERVER_SESSION_TICKET_TIMEOUT", + "name": "ESP_TLS_SERVER_SESSION_TICKET_TIMEOUT", + "range": null, + "title": "Server session ticket timeout in seconds", + "type": "int" + } + ], + "depends_on": "ESP_TLS_USING_MBEDTLS && MBEDTLS_SERVER_SSL_SESSION_TICKETS", + "help": "Enable session ticket support as specified in RFC5077", + "id": "ESP_TLS_SERVER_SESSION_TICKETS", + "name": "ESP_TLS_SERVER_SESSION_TICKETS", + "range": null, + "title": "Enable server session tickets", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_TLS_USING_MBEDTLS", + "help": "Ability to configure and use a certificate selection callback during server handshake,\nto select a certificate to present to the client based on the TLS extensions supplied in\nthe client hello (alpn, sni, etc).", + "id": "ESP_TLS_SERVER_CERT_SELECT_HOOK", + "name": "ESP_TLS_SERVER_CERT_SELECT_HOOK", + "range": null, + "title": "Certificate selection hook", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_TLS_USING_MBEDTLS", + "help": "When this option is enabled, the peer (here, the client) certificate is checked by the server,\nhowever the handshake continues even if verification failed. By default, the\npeer certificate is not checked and ignored by the server.\n\nmbedtls_ssl_get_verify_result() can be called after the handshake is complete to\nretrieve status of verification.", + "id": "ESP_TLS_SERVER_MIN_AUTH_MODE_OPTIONAL", + "name": "ESP_TLS_SERVER_MIN_AUTH_MODE_OPTIONAL", + "range": null, + "title": "ESP-TLS Server: Set minimum Certificate Verification mode to Optional", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enable support for pre shared key ciphers, supported for both mbedTLS as well as\nwolfSSL TLS library.", + "id": "ESP_TLS_PSK_VERIFICATION", + "name": "ESP_TLS_PSK_VERIFICATION", + "range": null, + "title": "Enable PSK verification", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_TLS_INSECURE", + "help": "After enabling this option the esp-tls client will skip the server certificate verification\nby default. Note that this option will only modify the default behaviour of esp-tls client\nregarding server cert verification. The default behaviour should only be applicable when\nno other option regarding the server cert verification is opted in the esp-tls config\n(e.g. crt_bundle_attach, use_global_ca_store etc.).\nWARNING : Enabling this option comes with a potential risk of establishing a TLS connection\nwith a server which has a fake identity, provided that the server certificate\nis not provided either through API or other mechanism like ca_store etc.", + "id": "ESP_TLS_SKIP_SERVER_CERT_VERIFY", + "name": "ESP_TLS_SKIP_SERVER_CERT_VERIFY", + "range": null, + "title": "Skip server certificate verification by default (WARNING: ONLY FOR TESTING PURPOSE, READ HELP)", + "type": "bool" + } + ], + "depends_on": null, + "help": "You can enable some potentially insecure options. These options should only be used for testing pusposes.\nOnly enable these options if you are very sure.", + "id": "ESP_TLS_INSECURE", + "name": "ESP_TLS_INSECURE", + "range": null, + "title": "Allow potentially insecure options", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_TLS_USING_WOLFSSL", + "help": "Enable detailed debug prints for wolfSSL SSL library.", + "id": "ESP_DEBUG_WOLFSSL", + "name": "ESP_DEBUG_WOLFSSL", + "range": null, + "title": "Enable debug logs for wolfSSL", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_TLS_USING_WOLFSSL", + "help": "Enable a fuller set of OCSP checks: checking revocation status of intermediate certificates,\noptional fallbacks to CRLs, etc.", + "id": "ESP_TLS_OCSP_CHECKALL", + "name": "ESP_TLS_OCSP_CHECKALL", + "range": null, + "title": "Enabled full OCSP checks for ESP-TLS", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-esp-tls", + "title": "ESP-TLS", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "Place ISR version ADC oneshot mode read function into IRAM.", + "id": "ADC_ONESHOT_CTRL_FUNC_IN_IRAM", + "name": "ADC_ONESHOT_CTRL_FUNC_IN_IRAM", + "range": null, + "title": "Place ISR version ADC oneshot mode read function into IRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_ADC_DMA_SUPPORTED", + "help": "Ensure the ADC continuous mode ISR is IRAM-Safe. When enabled, the ISR handler\nwill be available when the cache is disabled.", + "id": "ADC_CONTINUOUS_ISR_IRAM_SAFE", + "name": "ADC_CONTINUOUS_ISR_IRAM_SAFE", + "range": null, + "title": "ADC continuous mode driver ISR IRAM-Safe", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "IDF_TARGET_ESP32", + "help": "Some ESP32s have Two Point calibration values burned into eFuse BLOCK3.\nThis option will allow the ADC calibration component to characterize the\nADC-Voltage curve using Two Point values if they are available.", + "id": "ADC_CALI_EFUSE_TP_ENABLE", + "name": "ADC_CALI_EFUSE_TP_ENABLE", + "range": null, + "title": "Use Two Point Values", + "type": "bool" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ESP32", + "help": "Some ESP32s have Vref burned into eFuse BLOCK0. This option will allow\nthe ADC calibration component to characterize the ADC-Voltage curve using\neFuse Vref if it is available.", + "id": "ADC_CALI_EFUSE_VREF_ENABLE", + "name": "ADC_CALI_EFUSE_VREF_ENABLE", + "range": null, + "title": "Use eFuse Vref", + "type": "bool" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ESP32", + "help": "This option will allow the ADC calibration component to use Lookup Tables\nto correct for non-linear behavior in 11db attenuation. Other attenuations\ndo not exhibit non-linear behavior hence will not be affected by this option.", + "id": "ADC_CALI_LUT_ENABLE", + "name": "ADC_CALI_LUT_ENABLE", + "range": null, + "title": "Use Lookup Tables", + "type": "bool" + } + ], + "depends_on": "IDF_TARGET_ESP32", + "id": "component-config-adc-and-adc-calibration-adc-calibration-configurations", + "title": "ADC Calibration Configurations", + "type": "menu" + }, + { + "children": [], + "depends_on": "SOC_DAC_SUPPORTED", + "help": "By default, this is set. The ADC oneshot driver will disable the output of the\ncorresponding DAC channels:\nESP32: IO25 and IO26\nESP32S2: IO17 and IO18\n\nDisable this option so as to measure the output of DAC by internal ADC, for test usage.", + "id": "ADC_DISABLE_DAC_OUTPUT", + "name": "ADC_DISABLE_DAC_OUTPUT", + "range": null, + "title": "Disable DAC when ADC2 is in use", + "type": "bool" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32S3", + "help": "On ESP32C3 and ESP32S3, ADC2 Digital Controller is not stable. Therefore,\nADC2 continuous mode is not suggested on ESP32S3 and ESP32C3\n\nIf you stick to this, you can enable this option to force use ADC2 under above conditions.\nFor more details, you can search for errata on espressif website.", + "id": "ADC_CONTINUOUS_FORCE_USE_ADC2_ON_C3_S3", + "name": "ADC_CONTINUOUS_FORCE_USE_ADC2_ON_C3_S3", + "range": null, + "title": "Force use ADC2 continumous mode on ESP32S3 or ESP32C3", + "type": "bool" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ESP32C3", + "help": "On ESP32C3, ADC2 Digital Controller is not stable. Therefore,\nADC2 oneshot mode is not suggested on ESP32C3\n\nIf you stick to this, you can enable this option to force use ADC2 under above conditions.\nFor more details, you can search for errata on espressif website.", + "id": "ADC_ONESHOT_FORCE_USE_ADC2_ON_C3", + "name": "ADC_ONESHOT_FORCE_USE_ADC2_ON_C3", + "range": null, + "title": "Force use ADC2 oneshot mode on ESP32C3", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "whether to enable the debug log message for ADC driver.\nNote that this option only controls the ADC driver log, will not affect other drivers.\n\nnote: This cannot be used in the ADC legacy driver.", + "id": "ADC_ENABLE_DEBUG_LOG", + "name": "ADC_ENABLE_DEBUG_LOG", + "range": null, + "title": "Enable ADC debug log", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-adc-and-adc-calibration", + "title": "ADC and ADC Calibration", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_COEX_ENABLED", + "name": "ESP_COEX_ENABLED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "((ESP_WIFI_ENABLED && BT_ENABLED) || (ESP_WIFI_ENABLED && IEEE802154_ENABLED) || (IEEE802154_ENABLED && BT_ENABLED)) && ESP_COEX_ENABLED", + "help": "If enabled, WiFi & Bluetooth coexistence is controlled by software rather than hardware.\nRecommended for heavy traffic scenarios. Both coexistence configuration options are\nautomatically managed, no user intervention is required.\nIf only Bluetooth is used, it is recommended to disable this option to reduce binary file\nsize.", + "id": "ESP_COEX_SW_COEXIST_ENABLE", + "name": "ESP_COEX_SW_COEXIST_ENABLE", + "range": null, + "title": "Software controls WiFi/Bluetooth coexistence", + "type": "bool" + }, + { + "children": [], + "depends_on": "!(BT_ENABLED || NIMBLE_ENABLED) && !IDF_TARGET_ESP32 && ESP_COEX_ENABLED", + "help": "If enabled, HW External coexistence arbitration is managed by GPIO pins.\nIt can support three types of wired combinations so far which are 1-wired/2-wired/3-wired.\nUser can select GPIO pins in application code with configure interfaces.\n\nThis function depends on BT-off\nbecause currently we do not support external coex and internal coex simultaneously.", + "id": "ESP_COEX_EXTERNAL_COEXIST_ENABLE", + "name": "ESP_COEX_EXTERNAL_COEXIST_ENABLE", + "range": null, + "title": "External Coexistence", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_COEX_SW_COEXIST_ENABLE && ESP_COEX_ENABLED", + "help": "If enabled, coexist power management will be enabled.", + "id": "ESP_COEX_POWER_MANAGEMENT", + "name": "ESP_COEX_POWER_MANAGEMENT", + "range": null, + "title": "Support power management under coexistence", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_COEX_GPIO_DEBUG_DIAG_GENERAL", + "name": "ESP_COEX_GPIO_DEBUG_DIAG_GENERAL", + "range": null, + "title": "General", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_COEX_GPIO_DEBUG_DIAG_WIFI", + "name": "ESP_COEX_GPIO_DEBUG_DIAG_WIFI", + "range": null, + "title": "Wi-Fi", + "type": "bool" + } + ], + "depends_on": "ESP_COEX_GPIO_DEBUG", + "help": "Select type of debugging diagram", + "id": "component-config-wireless-coexistence-gpio-debugging-for-coexistence-debugging-diagram", + "name": "ESP_COEX_GPIO_DEBUG_DIAG", + "title": "Debugging Diagram", + "type": "choice" + }, + { + "children": [], + "depends_on": "ESP_COEX_GPIO_DEBUG", + "help": null, + "id": "ESP_COEX_GPIO_DEBUG_IO_COUNT", + "name": "ESP_COEX_GPIO_DEBUG_IO_COUNT", + "range": null, + "title": "Max number of debugging GPIOs", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_COEX_GPIO_DEBUG_IO_COUNT > 0 && ESP_COEX_GPIO_DEBUG", + "help": null, + "id": "ESP_COEX_GPIO_DEBUG_IO_IDX0", + "name": "ESP_COEX_GPIO_DEBUG_IO_IDX0", + "range": null, + "title": "Actual IO num for Debug IO ID0", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_COEX_GPIO_DEBUG_IO_COUNT > 1 && ESP_COEX_GPIO_DEBUG", + "help": null, + "id": "ESP_COEX_GPIO_DEBUG_IO_IDX1", + "name": "ESP_COEX_GPIO_DEBUG_IO_IDX1", + "range": null, + "title": "Actual IO num for Debug IO ID1", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_COEX_GPIO_DEBUG_IO_COUNT > 2 && ESP_COEX_GPIO_DEBUG", + "help": null, + "id": "ESP_COEX_GPIO_DEBUG_IO_IDX2", + "name": "ESP_COEX_GPIO_DEBUG_IO_IDX2", + "range": null, + "title": "Actual IO num for Debug IO ID2", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_COEX_GPIO_DEBUG_IO_COUNT > 3 && ESP_COEX_GPIO_DEBUG", + "help": null, + "id": "ESP_COEX_GPIO_DEBUG_IO_IDX3", + "name": "ESP_COEX_GPIO_DEBUG_IO_IDX3", + "range": null, + "title": "Actual IO num for Debug IO ID3", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_COEX_GPIO_DEBUG_IO_COUNT > 4 && ESP_COEX_GPIO_DEBUG", + "help": null, + "id": "ESP_COEX_GPIO_DEBUG_IO_IDX4", + "name": "ESP_COEX_GPIO_DEBUG_IO_IDX4", + "range": null, + "title": "Actual IO num for Debug IO ID4", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_COEX_GPIO_DEBUG_IO_COUNT > 5 && ESP_COEX_GPIO_DEBUG", + "help": null, + "id": "ESP_COEX_GPIO_DEBUG_IO_IDX5", + "name": "ESP_COEX_GPIO_DEBUG_IO_IDX5", + "range": null, + "title": "Actual IO num for Debug IO ID5", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_COEX_GPIO_DEBUG_IO_COUNT > 6 && ESP_COEX_GPIO_DEBUG", + "help": null, + "id": "ESP_COEX_GPIO_DEBUG_IO_IDX6", + "name": "ESP_COEX_GPIO_DEBUG_IO_IDX6", + "range": null, + "title": "Actual IO num for Debug IO ID6", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_COEX_GPIO_DEBUG_IO_COUNT > 7 && ESP_COEX_GPIO_DEBUG", + "help": null, + "id": "ESP_COEX_GPIO_DEBUG_IO_IDX7", + "name": "ESP_COEX_GPIO_DEBUG_IO_IDX7", + "range": null, + "title": "Actual IO num for Debug IO ID7", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_COEX_GPIO_DEBUG_IO_COUNT > 8 && ESP_COEX_GPIO_DEBUG", + "help": null, + "id": "ESP_COEX_GPIO_DEBUG_IO_IDX8", + "name": "ESP_COEX_GPIO_DEBUG_IO_IDX8", + "range": null, + "title": "Actual IO num for Debug IO ID8", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_COEX_GPIO_DEBUG_IO_COUNT > 9 && ESP_COEX_GPIO_DEBUG", + "help": null, + "id": "ESP_COEX_GPIO_DEBUG_IO_IDX9", + "name": "ESP_COEX_GPIO_DEBUG_IO_IDX9", + "range": null, + "title": "Actual IO num for Debug IO ID9", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_COEX_GPIO_DEBUG_IO_COUNT > 10 && ESP_COEX_GPIO_DEBUG", + "help": null, + "id": "ESP_COEX_GPIO_DEBUG_IO_IDX10", + "name": "ESP_COEX_GPIO_DEBUG_IO_IDX10", + "range": null, + "title": "Actual IO num for Debug IO ID10", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_COEX_GPIO_DEBUG_IO_COUNT > 11 && ESP_COEX_GPIO_DEBUG", + "help": null, + "id": "ESP_COEX_GPIO_DEBUG_IO_IDX11", + "name": "ESP_COEX_GPIO_DEBUG_IO_IDX11", + "range": null, + "title": "Actual IO num for Debug IO ID11", + "type": "int" + } + ], + "depends_on": "!PM_SLP_DISABLE_GPIO && !PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP", + "help": "Support coexistence GPIO debugging", + "id": "ESP_COEX_GPIO_DEBUG", + "name": "ESP_COEX_GPIO_DEBUG", + "range": null, + "title": "GPIO debugging for coexistence", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-wireless-coexistence", + "title": "Wireless Coexistence", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "Functions esp_err_to_name() and esp_err_to_name_r() return string representations of error codes from a\npre-generated lookup table. This option can be used to turn off the use of the look-up table in order to\nsave memory but this comes at the price of sacrificing distinguishable (meaningful) output string\nrepresentations.", + "id": "ESP_ERR_TO_NAME_LOOKUP", + "name": "ESP_ERR_TO_NAME_LOOKUP", + "range": null, + "title": "Enable lookup of error code strings", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_ALLOW_BSS_SEG_EXTERNAL_MEMORY", + "name": "ESP_ALLOW_BSS_SEG_EXTERNAL_MEMORY", + "range": null, + "title": null, + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-common-esp-related", + "title": "Common ESP-related", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_ANA_CMPR_SUPPORTED", + "help": "Ensure the Analog Comparator interrupt is IRAM-Safe by allowing the interrupt handler to be\nexecutable when the cache is disabled (e.g. SPI Flash write).", + "id": "ANA_CMPR_ISR_IRAM_SAFE", + "name": "ANA_CMPR_ISR_IRAM_SAFE", + "range": null, + "title": "Analog comparator ISR IRAM-Safe", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_ANA_CMPR_SUPPORTED", + "help": "Place Analog Comparator control functions (like ana_cmpr_set_internal_reference) into IRAM,\nso that these functions can be IRAM-safe and able to be called in an IRAM interrupt context.\nEnabling this option can improve driver performance as well.", + "id": "ANA_CMPR_CTRL_FUNC_IN_IRAM", + "name": "ANA_CMPR_CTRL_FUNC_IN_IRAM", + "range": null, + "title": "Place Analog Comparator control functions into IRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_ANA_CMPR_SUPPORTED", + "help": "whether to enable the debug log message for Analog Comparator driver.\nNote that, this option only controls the Analog Comparator driver log, won't affect other drivers.", + "id": "ANA_CMPR_ENABLE_DEBUG_LOG", + "name": "ANA_CMPR_ENABLE_DEBUG_LOG", + "range": null, + "title": "Enable debug log", + "type": "bool" + } + ], + "depends_on": "SOC_ANA_CMPR_SUPPORTED", + "id": "component-config-esp-driver-analog-comparator-configurations", + "title": "ESP-Driver:Analog Comparator Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_MIPI_CSI_SUPPORTED && (SOC_MIPI_CSI_SUPPORTED || SOC_LCDCAM_CAM_SUPPORTED)", + "help": "Ensure the CSI driver ISR is IRAM-Safe. When enabled, the ISR handler\nwill be available when the cache is disabled.", + "id": "CAM_CTLR_MIPI_CSI_ISR_IRAM_SAFE", + "name": "CAM_CTLR_MIPI_CSI_ISR_IRAM_SAFE", + "range": null, + "title": "CSI ISR IRAM-Safe", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_MIPI_CSI_SUPPORTED || SOC_LCDCAM_CAM_SUPPORTED", + "help": "Ensure the ISP_DVP driver ISR is IRAM-Safe. When enabled, the ISR handler\nwill be available when the cache is disabled.", + "id": "CAM_CTLR_ISP_DVP_ISR_IRAM_SAFE", + "name": "CAM_CTLR_ISP_DVP_ISR_IRAM_SAFE", + "range": null, + "title": "ISP_DVP ISR IRAM-Safe", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_LCDCAM_CAM_SUPPORTED && (SOC_MIPI_CSI_SUPPORTED || SOC_LCDCAM_CAM_SUPPORTED)", + "help": "Ensure the DVP driver ISR is IRAM-Safe. When enabled, the ISR handler\nwill be available when the cache is disabled.", + "id": "CAM_CTLR_DVP_CAM_ISR_IRAM_SAFE", + "name": "CAM_CTLR_DVP_CAM_ISR_IRAM_SAFE", + "range": null, + "title": "DVP ISR IRAM-Safe", + "type": "bool" + } + ], + "depends_on": "SOC_MIPI_CSI_SUPPORTED || SOC_LCDCAM_CAM_SUPPORTED", + "id": "component-config-esp-driver-camera-controller-configurations", + "title": "ESP-Driver:Camera Controller Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_DAC_SUPPORTED", + "help": "Place DAC control functions (e.g. 'dac_oneshot_output_voltage') into IRAM,\nso that this function can be IRAM-safe and able to be called in the other IRAM interrupt context.\nEnabling this option can improve driver performance as well.", + "id": "DAC_CTRL_FUNC_IN_IRAM", + "name": "DAC_CTRL_FUNC_IN_IRAM", + "range": null, + "title": "Place DAC control functions into IRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_DAC_SUPPORTED", + "help": "Ensure the DAC interrupt is IRAM-Safe by allowing the interrupt handler to be\nexecutable when the cache is disabled (e.g. SPI Flash write).", + "id": "DAC_ISR_IRAM_SAFE", + "name": "DAC_ISR_IRAM_SAFE", + "range": null, + "title": "DAC ISR IRAM-Safe", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_DAC_SUPPORTED", + "help": "whether to enable the debug log message for DAC driver.\nNote that, this option only controls the DAC driver log, won't affect other drivers.", + "id": "DAC_ENABLE_DEBUG_LOG", + "name": "DAC_ENABLE_DEBUG_LOG", + "range": null, + "title": "Enable debug log", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_DAC_DMA_16BIT_ALIGN && SOC_DAC_SUPPORTED", + "help": "Whether to left shift the continuous data to align every bytes to 16 bits in the driver.\nOn ESP32, although the DAC resolution is only 8 bits,\nthe hardware requires 16 bits data in continuous mode.\nBy enabling this option, the driver will left shift 8 bits for the input data automatically.\nOnly disable this option when you decide to do this step by yourself.\nNote that the driver will allocate a new piece of memory to save the converted data.", + "id": "DAC_DMA_AUTO_16BIT_ALIGN", + "name": "DAC_DMA_AUTO_16BIT_ALIGN", + "range": null, + "title": "Align the continuous data to 16 bit automatically", + "type": "bool" + } + ], + "depends_on": "SOC_DAC_SUPPORTED", + "id": "component-config-esp-driver-dac-configurations", + "title": "ESP-Driver:DAC Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "IDF_TARGET_ESP32", + "help": "This option is intended to fix the bug that ESP32 is not able to switch to configured\npullup/pulldown mode in sleep.\nIf this option is selected, chip will automatically emulate the behaviour of switching,\nand about 450B of source codes would be placed into IRAM.", + "id": "GPIO_ESP32_SUPPORT_SWITCH_SLP_PULL", + "name": "GPIO_ESP32_SUPPORT_SWITCH_SLP_PULL", + "range": null, + "title": "Support light sleep GPIO pullup/pulldown configuration for ESP32", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Place GPIO control functions (like intr_disable/set_level) into IRAM,\nso that these functions can be IRAM-safe and able to be called in the other IRAM interrupt context.", + "id": "GPIO_CTRL_FUNC_IN_IRAM", + "name": "GPIO_CTRL_FUNC_IN_IRAM", + "range": null, + "title": "Place GPIO control functions into IRAM", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-esp-driver-gpio-configurations", + "title": "ESP-Driver:GPIO Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_GPTIMER_SUPPORTED", + "help": "Place GPTimer ISR handler into IRAM for better performance and fewer cache misses.", + "id": "GPTIMER_ISR_HANDLER_IN_IRAM", + "name": "GPTIMER_ISR_HANDLER_IN_IRAM", + "range": null, + "title": "Place GPTimer ISR handler into IRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_GPTIMER_SUPPORTED", + "help": "Place GPTimer control functions (like start/stop) into IRAM,\nso that these functions can be IRAM-safe and able to be called in the other IRAM interrupt context.\nEnabling this option can improve driver performance as well.", + "id": "GPTIMER_CTRL_FUNC_IN_IRAM", + "name": "GPTIMER_CTRL_FUNC_IN_IRAM", + "range": null, + "title": "Place GPTimer control functions into IRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_GPTIMER_SUPPORTED", + "help": "Ensure the GPTimer interrupt is IRAM-Safe by allowing the interrupt handler to be\nexecutable when the cache is disabled (e.g. SPI Flash write).", + "id": "GPTIMER_ISR_IRAM_SAFE", + "name": "GPTIMER_ISR_IRAM_SAFE", + "range": null, + "title": "GPTimer ISR IRAM-Safe", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_GPTIMER_SUPPORTED", + "help": "whether to enable the debug log message for GPTimer driver.\nNote that, this option only controls the GPTimer driver log, won't affect other drivers.", + "id": "GPTIMER_ENABLE_DEBUG_LOG", + "name": "GPTIMER_ENABLE_DEBUG_LOG", + "range": null, + "title": "Enable debug log", + "type": "bool" + } + ], + "depends_on": "SOC_GPTIMER_SUPPORTED", + "id": "component-config-esp-driver-gptimer-configurations", + "title": "ESP-Driver:GPTimer Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_I2C_SUPPORTED", + "help": "Ensure the I2C interrupt is IRAM-Safe by allowing the interrupt handler to be\nexecutable when the cache is disabled (e.g. SPI Flash write).\nnote: This cannot be used in the I2C legacy driver.", + "id": "I2C_ISR_IRAM_SAFE", + "name": "I2C_ISR_IRAM_SAFE", + "range": null, + "title": "I2C ISR IRAM-Safe", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_I2C_SUPPORTED", + "help": "whether to enable the debug log message for I2C driver.\nNote that this option only controls the I2C driver log, will not affect other drivers.\n\nnote: This cannot be used in the I2C legacy driver.", + "id": "I2C_ENABLE_DEBUG_LOG", + "name": "I2C_ENABLE_DEBUG_LOG", + "range": null, + "title": "Enable I2C debug log", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_I2C_SUPPORTED", + "help": "I2C slave version 2 solves some existing known issues. Such as write/read workflow, stretch handling, etc.", + "id": "I2C_ENABLE_SLAVE_DRIVER_VERSION_2", + "name": "I2C_ENABLE_SLAVE_DRIVER_VERSION_2", + "range": null, + "title": "Enable I2C slave driver version 2", + "type": "bool" + } + ], + "depends_on": "SOC_I2C_SUPPORTED", + "id": "component-config-esp-driver-i2c-configurations", + "title": "ESP-Driver:I2C Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_I2S_SUPPORTED", + "help": "Ensure the I2S interrupt is IRAM-Safe by allowing the interrupt handler to be\nexecutable when the cache is disabled (e.g. SPI Flash write).", + "id": "I2S_ISR_IRAM_SAFE", + "name": "I2S_ISR_IRAM_SAFE", + "range": null, + "title": "I2S ISR IRAM-Safe", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_I2S_SUPPORTED", + "help": "whether to enable the debug log message for I2S driver.\nNote that, this option only controls the I2S driver log, will not affect other drivers.", + "id": "I2S_ENABLE_DEBUG_LOG", + "name": "I2S_ENABLE_DEBUG_LOG", + "range": null, + "title": "Enable I2S debug log", + "type": "bool" + } + ], + "depends_on": "SOC_I2S_SUPPORTED", + "id": "component-config-esp-driver-i2s-configurations", + "title": "ESP-Driver:I2S Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_ISP_SUPPORTED", + "help": "Ensure the ISP driver ISR is IRAM-Safe. When enabled, the ISR handler\nwill be available when the cache is disabled.", + "id": "ISP_ISR_IRAM_SAFE", + "name": "ISP_ISR_IRAM_SAFE", + "range": null, + "title": "ISP driver ISR IRAM-Safe", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_ISP_SUPPORTED", + "help": "Place ISP control functions into IRAM,\nso that these functions can be IRAM-safe and able to be called in the other IRAM interrupt context.\nEnabling this option can improve driver performance as well.\n\nFunction list:\n- `esp_isp_sharpen_configure`", + "id": "ISP_CTRL_FUNC_IN_IRAM", + "name": "ISP_CTRL_FUNC_IN_IRAM", + "range": null, + "title": "Place ISP control functions into IRAM", + "type": "bool" + } + ], + "depends_on": "SOC_ISP_SUPPORTED", + "id": "component-config-esp-driver-isp-configurations", + "title": "ESP-Driver:ISP Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_JPEG_CODEC_SUPPORTED", + "help": "whether to enable the debug log message for JPEG driver.\nNote that, this option only controls the JPEG driver log, won't affect other drivers.\nPlease also note, enable this option will make jpeg codec process speed much slower.", + "id": "JPEG_ENABLE_DEBUG_LOG", + "name": "JPEG_ENABLE_DEBUG_LOG", + "range": null, + "title": "Enable debug log", + "type": "bool" + } + ], + "depends_on": "SOC_JPEG_CODEC_SUPPORTED", + "id": "component-config-esp-driver-jpeg-codec-configurations", + "title": "ESP-Driver:JPEG-Codec Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "Place LEDC control functions (ledc_update_duty and ledc_stop) into IRAM,\nso that these functions can be IRAM-safe and able to be called in an IRAM context.\nEnabling this option can improve driver performance as well.", + "id": "LEDC_CTRL_FUNC_IN_IRAM", + "name": "LEDC_CTRL_FUNC_IN_IRAM", + "range": null, + "title": "Place LEDC control functions into IRAM", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-esp-driver-ledc-configurations", + "title": "ESP-Driver:LEDC Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_MCPWM_SUPPORTED", + "help": "This will ensure the MCPWM interrupt handle is IRAM-Safe, allow to avoid flash\ncache misses, and also be able to run whilst the cache is disabled.\n(e.g. SPI Flash write)", + "id": "MCPWM_ISR_IRAM_SAFE", + "name": "MCPWM_ISR_IRAM_SAFE", + "range": null, + "title": "Place MCPWM ISR function into IRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_MCPWM_SUPPORTED", + "help": "Place MCPWM control functions (like set_compare_value) into IRAM,\nso that these functions can be IRAM-safe and able to be called in the other IRAM interrupt context.\nEnabling this option can improve driver performance as well.", + "id": "MCPWM_CTRL_FUNC_IN_IRAM", + "name": "MCPWM_CTRL_FUNC_IN_IRAM", + "range": null, + "title": "Place MCPWM control functions into IRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_MCPWM_SUPPORTED", + "help": "whether to enable the debug log message for MCPWM driver.\nNote that, this option only controls the MCPWM driver log, won't affect other drivers.", + "id": "MCPWM_ENABLE_DEBUG_LOG", + "name": "MCPWM_ENABLE_DEBUG_LOG", + "range": null, + "title": "Enable debug log", + "type": "bool" + } + ], + "depends_on": "SOC_MCPWM_SUPPORTED", + "id": "component-config-esp-driver-mcpwm-configurations", + "title": "ESP-Driver:MCPWM Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_PARLIO_SUPPORTED", + "help": "whether to enable the debug log message for parallel IO driver.\nNote that, this option only controls the parallel IO driver log, won't affect other drivers.", + "id": "PARLIO_ENABLE_DEBUG_LOG", + "name": "PARLIO_ENABLE_DEBUG_LOG", + "range": null, + "title": "Enable debug log", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_PARLIO_SUPPORTED", + "help": "Ensure the Parallel IO interrupt is IRAM-Safe by allowing the interrupt handler to be\nexecutable when the cache is disabled (e.g. SPI Flash write).", + "id": "PARLIO_ISR_IRAM_SAFE", + "name": "PARLIO_ISR_IRAM_SAFE", + "range": null, + "title": "Parallel IO ISR IRAM-Safe", + "type": "bool" + } + ], + "depends_on": "SOC_PARLIO_SUPPORTED", + "id": "component-config-esp-driver-parallel-io-configurations", + "title": "ESP-Driver:Parallel IO Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_PCNT_SUPPORTED", + "help": "Place PCNT control functions (like start/stop) into IRAM,\nso that these functions can be IRAM-safe and able to be called in the other IRAM interrupt context.\nEnabling this option can improve driver performance as well.", + "id": "PCNT_CTRL_FUNC_IN_IRAM", + "name": "PCNT_CTRL_FUNC_IN_IRAM", + "range": null, + "title": "Place PCNT control functions into IRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_PCNT_SUPPORTED", + "help": "Ensure the PCNT interrupt is IRAM-Safe by allowing the interrupt handler to be\nexecutable when the cache is disabled (e.g. SPI Flash write).", + "id": "PCNT_ISR_IRAM_SAFE", + "name": "PCNT_ISR_IRAM_SAFE", + "range": null, + "title": "PCNT ISR IRAM-Safe", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_PCNT_SUPPORTED", + "help": "whether to enable the debug log message for PCNT driver.\nNote that, this option only controls the PCNT driver log, won't affect other drivers.", + "id": "PCNT_ENABLE_DEBUG_LOG", + "name": "PCNT_ENABLE_DEBUG_LOG", + "range": null, + "title": "Enable debug log", + "type": "bool" + } + ], + "depends_on": "SOC_PCNT_SUPPORTED", + "id": "component-config-esp-driver-pcnt-configurations", + "title": "ESP-Driver:PCNT Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_RMT_SUPPORTED", + "help": "Ensure the RMT interrupt is IRAM-Safe by allowing the interrupt handler to be\nexecutable when the cache is disabled (e.g. SPI Flash write).", + "id": "RMT_ISR_IRAM_SAFE", + "name": "RMT_ISR_IRAM_SAFE", + "range": null, + "title": "RMT ISR IRAM-Safe", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_RMT_SUPPORTED", + "help": "Place RMT receive function into IRAM,\nso that the receive function can be IRAM-safe and able to be called when the flash cache is disabled.\nEnabling this option can improve driver performance as well.", + "id": "RMT_RECV_FUNC_IN_IRAM", + "name": "RMT_RECV_FUNC_IN_IRAM", + "range": null, + "title": "Place RMT receive function into IRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_RMT_SUPPORTED", + "help": "whether to enable the debug log message for RMT driver.\nNote that, this option only controls the RMT driver log, won't affect other drivers.", + "id": "RMT_ENABLE_DEBUG_LOG", + "name": "RMT_ENABLE_DEBUG_LOG", + "range": null, + "title": "Enable debug log", + "type": "bool" + } + ], + "depends_on": "SOC_RMT_SUPPORTED", + "id": "component-config-esp-driver-rmt-configurations", + "title": "ESP-Driver:RMT Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_SDM_SUPPORTED", + "help": "Place SDM control functions (like set_duty) into IRAM,\nso that these functions can be IRAM-safe and able to be called in the other IRAM interrupt context.\nEnabling this option can improve driver performance as well.", + "id": "SDM_CTRL_FUNC_IN_IRAM", + "name": "SDM_CTRL_FUNC_IN_IRAM", + "range": null, + "title": "Place SDM control functions into IRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_SDM_SUPPORTED", + "help": "whether to enable the debug log message for SDM driver.\nNote that, this option only controls the SDM driver log, won't affect other drivers.", + "id": "SDM_ENABLE_DEBUG_LOG", + "name": "SDM_ENABLE_DEBUG_LOG", + "range": null, + "title": "Enable debug log", + "type": "bool" + } + ], + "depends_on": "SOC_SDM_SUPPORTED", + "id": "component-config-esp-driver-sigma-delta-modulator-configurations", + "title": "ESP-Driver:Sigma Delta Modulator Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "!FREERTOS_PLACE_FUNCTIONS_INTO_FLASH && SOC_GPSPI_SUPPORTED", + "help": "Normally only the ISR of SPI master is placed in the IRAM, so that it\ncan work without the flash when interrupt is triggered.\nFor other functions, there's some possibility that the flash cache\nmiss when running inside and out of SPI functions, which may increase\nthe interval of SPI transactions.\nEnable this to put ``queue_trans``, ``get_trans_result`` and\n``transmit`` functions into the IRAM to avoid possible cache miss.\n\nThis configuration won't be available if `CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH` is enabled.\n\nDuring unit test, this is enabled to measure the ideal case of api.", + "id": "SPI_MASTER_IN_IRAM", + "name": "SPI_MASTER_IN_IRAM", + "range": null, + "title": "Place transmitting functions of SPI master into IRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "!HEAP_PLACE_FUNCTION_INTO_FLASH && SOC_GPSPI_SUPPORTED", + "help": "Place the SPI master ISR in to IRAM to avoid possible cache miss.\n\nEnabling this configuration is possible only when HEAP_PLACE_FUNCTION_INTO_FLASH\nis disabled since the spi master uses can allocate transactions buffers into DMA\nmemory section using the heap component API that ipso facto has to be placed in IRAM.\n\nAlso you can forbid the ISR being disabled during flash writing\naccess, by add ESP_INTR_FLAG_IRAM when initializing the driver.", + "id": "SPI_MASTER_ISR_IN_IRAM", + "name": "SPI_MASTER_ISR_IN_IRAM", + "range": null, + "title": "Place SPI master ISR function into IRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_GPSPI_SUPPORTED", + "help": "Normally only the ISR of SPI slave is placed in the IRAM, so that it\ncan work without the flash when interrupt is triggered.\nFor other functions, there's some possibility that the flash cache\nmiss when running inside and out of SPI functions, which may increase\nthe interval of SPI transactions.\nEnable this to put ``queue_trans``, ``get_trans_result`` and\n``transmit`` functions into the IRAM to avoid possible cache miss.", + "id": "SPI_SLAVE_IN_IRAM", + "name": "SPI_SLAVE_IN_IRAM", + "range": null, + "title": "Place transmitting functions of SPI slave into IRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_GPSPI_SUPPORTED", + "help": "Place the SPI slave ISR in to IRAM to avoid possible cache miss.\n\nAlso you can forbid the ISR being disabled during flash writing\naccess, by add ESP_INTR_FLAG_IRAM when initializing the driver.", + "id": "SPI_SLAVE_ISR_IN_IRAM", + "name": "SPI_SLAVE_ISR_IN_IRAM", + "range": null, + "title": "Place SPI slave ISR function into IRAM", + "type": "bool" + } + ], + "depends_on": "SOC_GPSPI_SUPPORTED", + "id": "component-config-esp-driver-spi-configurations", + "title": "ESP-Driver:SPI Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_TOUCH_SENSOR_SUPPORTED", + "help": "Place touch sensor oneshot scanning and continuous scanning functions into IRAM,\nso that these function can be IRAM-safe and able to be called when the flash cache is disabled.\nEnabling this option can improve driver performance as well.", + "id": "TOUCH_CTRL_FUNC_IN_IRAM", + "name": "TOUCH_CTRL_FUNC_IN_IRAM", + "range": null, + "title": "Place touch sensor control functions into IRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_TOUCH_SENSOR_SUPPORTED", + "help": "Ensure the touch sensor interrupt is IRAM-Safe by allowing the interrupt handler to be\nexecutable when the cache is disabled (e.g. SPI Flash write).", + "id": "TOUCH_ISR_IRAM_SAFE", + "name": "TOUCH_ISR_IRAM_SAFE", + "range": null, + "title": "Touch sensor ISR IRAM-Safe", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_TOUCH_SENSOR_SUPPORTED", + "help": "Whether to enable the debug log message for touch driver.\nNote that, this option only controls the touch driver log, won't affect other drivers.", + "id": "TOUCH_ENABLE_DEBUG_LOG", + "name": "TOUCH_ENABLE_DEBUG_LOG", + "range": null, + "title": "Enable debug log", + "type": "bool" + } + ], + "depends_on": "SOC_TOUCH_SENSOR_SUPPORTED", + "id": "component-config-esp-driver-touch-sensor-configurations", + "title": "ESP-Driver:Touch Sensor Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_TEMP_SENSOR_SUPPORTED", + "help": "whether to enable the debug log message for temperature sensor driver.\nNote that, this option only controls the temperature sensor driver log, won't affect other drivers.", + "id": "TEMP_SENSOR_ENABLE_DEBUG_LOG", + "name": "TEMP_SENSOR_ENABLE_DEBUG_LOG", + "range": null, + "title": "Enable debug log", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_TEMPERATURE_SENSOR_INTR_SUPPORT && SOC_TEMP_SENSOR_SUPPORTED", + "help": "Ensure the Temperature Sensor interrupt is IRAM-Safe by allowing the interrupt handler to be\nexecutable when the cache is disabled (e.g. SPI Flash write).", + "id": "TEMP_SENSOR_ISR_IRAM_SAFE", + "name": "TEMP_SENSOR_ISR_IRAM_SAFE", + "range": null, + "title": "Temperature sensor ISR IRAM-Safe", + "type": "bool" + } + ], + "depends_on": "SOC_TEMP_SENSOR_SUPPORTED", + "id": "component-config-esp-driver-temperature-sensor-configurations", + "title": "ESP-Driver:Temperature Sensor Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "!RINGBUF_PLACE_ISR_FUNCTIONS_INTO_FLASH", + "help": "If this option is not selected, UART interrupt will be disabled for a long time and\nmay cause data lost when doing spi flash operation.", + "id": "UART_ISR_IN_IRAM", + "name": "UART_ISR_IN_IRAM", + "range": null, + "title": "Place UART ISR function into IRAM", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-esp-driver-uart-configurations", + "title": "ESP-Driver:UART Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "PM_ENABLE && ESP_CONSOLE_USB_SERIAL_JTAG_ENABLED && !SOC_USB_SERIAL_JTAG_SUPPORT_LIGHT_SLEEP && USJ_ENABLE_USB_SERIAL_JTAG && SOC_USB_SERIAL_JTAG_SUPPORTED", + "help": "If enabled, the chip will constantly monitor the connection status of the USB Serial/JTAG port. As long\nas the USB Serial/JTAG is connected, a ESP_PM_NO_LIGHT_SLEEP power management lock will be acquired to\nprevent the system from entering light sleep.\nThis option can be useful if serial monitoring is needed via USB Serial/JTAG while power management is\nenabled, as the USB Serial/JTAG cannot work under light sleep and after waking up from light sleep.\nNote. This option can only control the automatic Light-Sleep behavior. If esp_light_sleep_start() is\ncalled manually from the program, enabling this option will not prevent light sleep entry even if the\nUSB Serial/JTAG is in use.", + "id": "USJ_NO_AUTO_LS_ON_CONNECTION", + "name": "USJ_NO_AUTO_LS_ON_CONNECTION", + "range": null, + "title": "Don't enter the automatic light sleep when USB Serial/JTAG port is connected", + "type": "bool" + } + ], + "depends_on": "SOC_USB_SERIAL_JTAG_SUPPORTED", + "help": "The USB-Serial-JTAG module on ESP chips is turned on by default after power-on.\nIf your application does not need it and not rely on it to be used as system\nconsole or use the built-in JTAG for debugging, you can disable this option,\nthen the clock of this module will be disabled at startup, which will save\nsome power consumption.", + "id": "USJ_ENABLE_USB_SERIAL_JTAG", + "name": "USJ_ENABLE_USB_SERIAL_JTAG", + "range": null, + "title": "Enable USB-Serial-JTAG Module", + "type": "bool" + } + ], + "depends_on": "SOC_USB_SERIAL_JTAG_SUPPORTED", + "id": "component-config-esp-driver-usb-serial-jtag-configuration", + "title": "ESP-Driver:USB Serial/JTAG Configuration", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": null, + "id": "ETH_ENABLED", + "name": "ETH_ENABLED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "ETH_PHY_INTERFACE_RMII", + "name": "ETH_PHY_INTERFACE_RMII", + "range": null, + "title": "Reduced Media Independent Interface (RMII)", + "type": "bool" + } + ], + "depends_on": "ETH_USE_ESP32_EMAC", + "help": "Select the communication interface between MAC and PHY chip.", + "id": "component-config-ethernet-support-esp32-internal-emac-controller-phy-interface", + "name": "ETH_PHY_INTERFACE", + "title": "PHY interface", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": "MAC will get RMII clock from outside.\nNote that ESP32 only supports GPIO0 to input the RMII clock.", + "id": "ETH_RMII_CLK_INPUT", + "name": "ETH_RMII_CLK_INPUT", + "range": null, + "title": "Input RMII clock from external", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "ESP32 can generate RMII clock by internal APLL.\nThis clock can be routed to the external PHY device.\nESP32 supports to route the RMII clock to GPIO0/16/17.", + "id": "ETH_RMII_CLK_OUTPUT", + "name": "ETH_RMII_CLK_OUTPUT", + "range": null, + "title": "Output RMII clock from internal", + "type": "bool" + } + ], + "depends_on": "IDF_TARGET_ESP32 && ETH_PHY_INTERFACE_RMII && ETH_USE_ESP32_EMAC", + "help": "Select external or internal RMII clock.", + "id": "component-config-ethernet-support-esp32-internal-emac-controller-rmii-clock-mode", + "name": "ETH_RMII_CLK_MODE", + "title": "RMII clock mode", + "type": "choice" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ESP32 && ETH_RMII_CLK_INPUT && ETH_USE_ESP32_EMAC", + "help": "ESP32 only supports GPIO0 to input the RMII clock.", + "id": "ETH_RMII_CLK_IN_GPIO", + "name": "ETH_RMII_CLK_IN_GPIO", + "range": [ + 0, + 0 + ], + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ESP32 && ETH_RMII_CLK_OUTPUT && ETH_USE_ESP32_EMAC", + "help": "GPIO0 can be set to output a pre-divided PLL clock. Enabling this option will configure\nGPIO0 to output a 50MHz clock. In fact this clock doesn't have directly relationship with\nEMAC peripheral. Sometimes this clock may not work well with your PHY chip.\nWARNING: If you want the Ethernet to work with WiFi, don\u2019t select ESP32 as RMII CLK output\nas it would result in clock instability!", + "id": "ETH_RMII_CLK_OUTPUT_GPIO0", + "name": "ETH_RMII_CLK_OUTPUT_GPIO0", + "range": null, + "title": "Output RMII clock from GPIO0 (Experimental!)", + "type": "bool" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ESP32 && !ETH_RMII_CLK_OUTPUT_GPIO0 && ETH_RMII_CLK_OUTPUT && ETH_USE_ESP32_EMAC", + "help": "Set the GPIO number to output RMII Clock.\nWARNING: If you want the Ethernet to work with WiFi, don\u2019t select ESP32 as RMII CLK output\nas it would result in clock instability!", + "id": "ETH_RMII_CLK_OUT_GPIO", + "name": "ETH_RMII_CLK_OUT_GPIO", + "range": null, + "title": "RMII clock GPIO number", + "type": "int" + }, + { + "children": [], + "depends_on": "ETH_USE_ESP32_EMAC", + "help": "Set the size of each buffer used by Ethernet MAC DMA.\n!! Important !! Make sure it is 64B aligned for ESP32P4!", + "id": "ETH_DMA_BUFFER_SIZE", + "name": "ETH_DMA_BUFFER_SIZE", + "range": [ + 256, + 1600 + ], + "title": "Ethernet DMA buffer size (Byte)", + "type": "int" + }, + { + "children": [], + "depends_on": "ETH_USE_ESP32_EMAC", + "help": "Number of DMA receive buffers. Each buffer's size is ETH_DMA_BUFFER_SIZE.\nLarger number of buffers could increase throughput somehow.", + "id": "ETH_DMA_RX_BUFFER_NUM", + "name": "ETH_DMA_RX_BUFFER_NUM", + "range": [ + 3, + 30 + ], + "title": "Amount of Ethernet DMA Rx buffers", + "type": "int" + }, + { + "children": [], + "depends_on": "ETH_USE_ESP32_EMAC", + "help": "Number of DMA transmit buffers. Each buffer's size is ETH_DMA_BUFFER_SIZE.\nLarger number of buffers could increase throughput somehow.", + "id": "ETH_DMA_TX_BUFFER_NUM", + "name": "ETH_DMA_TX_BUFFER_NUM", + "range": [ + 3, + 30 + ], + "title": "Amount of Ethernet DMA Tx buffers", + "type": "int" + }, + { + "children": [], + "depends_on": "ETH_DMA_RX_BUFFER_NUM > 15 && ETH_USE_ESP32_EMAC", + "help": "Ethernet MAC engine on ESP32 doesn't feature a flow control logic.\nThe MAC driver can perform a software flow control if you enable this option.\nNote that, if the RX buffer number is small, enabling software flow control will\ncause obvious performance loss.", + "id": "ETH_SOFT_FLOW_CONTROL", + "name": "ETH_SOFT_FLOW_CONTROL", + "range": null, + "title": "Enable software flow control", + "type": "bool" + }, + { + "children": [], + "depends_on": "ETH_USE_ESP32_EMAC", + "help": "If enabled, functions related to RX/TX are placed into IRAM. It can improve Ethernet throughput.\nIf disabled, all functions are placed into FLASH.", + "id": "ETH_IRAM_OPTIMIZATION", + "name": "ETH_IRAM_OPTIMIZATION", + "range": null, + "title": "Enable IRAM optimization", + "type": "bool" + } + ], + "depends_on": "SOC_EMAC_SUPPORTED", + "help": "ESP32 integrates a 10/100M Ethernet MAC controller.", + "id": "ETH_USE_ESP32_EMAC", + "is_menuconfig": true, + "name": "ETH_USE_ESP32_EMAC", + "range": null, + "title": "Support ESP32 internal EMAC controller", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "ETH_USE_SPI_ETHERNET", + "help": "DM9051 is a fast Ethernet controller with an SPI interface.\nIt's also integrated with a 10/100M PHY and MAC.\nSelect this to enable DM9051 driver.", + "id": "ETH_SPI_ETHERNET_DM9051", + "name": "ETH_SPI_ETHERNET_DM9051", + "range": null, + "title": "Use DM9051", + "type": "bool" + }, + { + "children": [], + "depends_on": "ETH_USE_SPI_ETHERNET", + "help": "W5500 is a HW TCP/IP embedded Ethernet controller.\nTCP/IP stack, 10/100 Ethernet MAC and PHY are embedded in a single chip.\nHowever the driver in ESP-IDF only enables the RAW MAC mode,\nmaking it compatible with the software TCP/IP stack.\nSay yes to enable W5500 driver.", + "id": "ETH_SPI_ETHERNET_W5500", + "name": "ETH_SPI_ETHERNET_W5500", + "range": null, + "title": "Use W5500 (MAC RAW)", + "type": "bool" + }, + { + "children": [], + "depends_on": "ETH_USE_SPI_ETHERNET", + "help": "The KSZ8851SNL is a single-chip Fast Ethernet controller consisting of\na 10/100 physical layer transceiver (PHY), a MAC, and a Serial Peripheral Interface (SPI).\nSelect this to enable KSZ8851SNL driver.", + "id": "ETH_SPI_ETHERNET_KSZ8851SNL", + "name": "ETH_SPI_ETHERNET_KSZ8851SNL", + "range": null, + "title": "Use KSZ8851SNL", + "type": "bool" + } + ], + "depends_on": null, + "help": "ESP-IDF can also support some SPI-Ethernet modules.", + "id": "ETH_USE_SPI_ETHERNET", + "is_menuconfig": true, + "name": "ETH_USE_SPI_ETHERNET", + "range": null, + "title": "Support SPI to Ethernet Module", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "ETH_USE_OPENETH", + "help": "Number of DMA receive buffers, each buffer is 1600 bytes.", + "id": "ETH_OPENETH_DMA_RX_BUFFER_NUM", + "name": "ETH_OPENETH_DMA_RX_BUFFER_NUM", + "range": null, + "title": "Number of Ethernet DMA Rx buffers", + "type": "int" + }, + { + "children": [], + "depends_on": "ETH_USE_OPENETH", + "help": "Number of DMA transmit buffers, each buffer is 1600 bytes.", + "id": "ETH_OPENETH_DMA_TX_BUFFER_NUM", + "name": "ETH_OPENETH_DMA_TX_BUFFER_NUM", + "range": null, + "title": "Number of Ethernet DMA Tx buffers", + "type": "int" + } + ], + "depends_on": null, + "help": "OpenCores Ethernet MAC driver can be used when an ESP-IDF application\nis executed in QEMU. This driver is not supported when running on a\nreal chip.", + "id": "ETH_USE_OPENETH", + "is_menuconfig": true, + "name": "ETH_USE_OPENETH", + "range": null, + "title": "Support OpenCores Ethernet MAC (for use with QEMU)", + "type": "menu" + }, + { + "children": [], + "depends_on": "ETH_ENABLED", + "help": "Prevents multiple accesses when Ethernet interface is used as shared resource and multiple\nfunctionalities might try to access it at a time.", + "id": "ETH_TRANSMIT_MUTEX", + "name": "ETH_TRANSMIT_MUTEX", + "range": null, + "title": "Enable Transmit Mutex", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-ethernet", + "title": "Ethernet", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "Enables collections of statistics in the event loop library such as the number of events posted\nto/recieved by an event loop, number of callbacks involved, number of events dropped to to a full event\nloop queue, run time of event handlers, and number of times/run time of each event handler.", + "id": "ESP_EVENT_LOOP_PROFILING", + "name": "ESP_EVENT_LOOP_PROFILING", + "range": null, + "title": "Enable event loop profiling", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_EVENT_POST_FROM_ISR", + "help": "Enable posting events from interrupt handlers placed in IRAM. Enabling this option places API functions\nesp_event_post and esp_event_post_to in IRAM.", + "id": "ESP_EVENT_POST_FROM_IRAM_ISR", + "name": "ESP_EVENT_POST_FROM_IRAM_ISR", + "range": null, + "title": "Support posting events from ISRs placed in IRAM", + "type": "bool" + } + ], + "depends_on": null, + "help": "Enable posting events from interrupt handlers.", + "id": "ESP_EVENT_POST_FROM_ISR", + "name": "ESP_EVENT_POST_FROM_ISR", + "range": null, + "title": "Support posting events from ISRs", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-event-loop-library", + "title": "Event Loop Library", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_GDBSTUB_ENABLED", + "name": "ESP_GDBSTUB_ENABLED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enable builtin GDBStub.\nThis allows to debug the target device using serial port:\n- Run 'idf.py monitor'.\n- Wait for the device to initialize.\n- Press Ctrl+C to interrupt the execution and enter GDB attached to your device for debugging.\nNOTE: all UART input will be handled by GDBStub.", + "id": "ESP_SYSTEM_GDBSTUB_RUNTIME", + "name": "ESP_SYSTEM_GDBSTUB_RUNTIME", + "range": null, + "title": "GDBStub at runtime", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_GDBSTUB_SUPPORT_TASKS", + "help": "Set the number of tasks which GDB Stub will support.", + "id": "ESP_GDBSTUB_MAX_TASKS", + "name": "ESP_GDBSTUB_MAX_TASKS", + "range": null, + "title": "Maximum number of tasks supported by GDB Stub", + "type": "int" + } + ], + "depends_on": "ESP_GDBSTUB_ENABLED", + "help": "If enabled, GDBStub can supply the list of FreeRTOS tasks to GDB.\nThread list can be queried from GDB using 'info threads' command.\nNote that if GDB task lists were corrupted, this feature may not work.\nIf GDBStub fails, try disabling this feature.", + "id": "ESP_GDBSTUB_SUPPORT_TASKS", + "name": "ESP_GDBSTUB_SUPPORT_TASKS", + "range": null, + "title": "Enable listing FreeRTOS tasks through GDB Stub", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-gdb-stub", + "title": "GDB Stub", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "This is the stack size for the BT HID task.\nDefault is 2048 bytes.", + "id": "ESPHID_TASK_SIZE_BT", + "name": "ESPHID_TASK_SIZE_BT", + "range": [ + 2048, + 10240 + ], + "title": "Task stack size for ESP HID BR/EDR", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "This is the stack size for the BLE HID task.\nDefault is 4096 bytes.", + "id": "ESPHID_TASK_SIZE_BLE", + "name": "ESPHID_TASK_SIZE_BLE", + "range": [ + 2048, + 10240 + ], + "title": "Task stack size for ESP HID BLE", + "type": "int" + } + ], + "depends_on": null, + "id": "component-config-esp-hid", + "title": "ESP HID", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "This option will enable https protocol by linking esp-tls library and initializing SSL transport", + "id": "ESP_HTTP_CLIENT_ENABLE_HTTPS", + "name": "ESP_HTTP_CLIENT_ENABLE_HTTPS", + "range": null, + "title": "Enable https", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "This option will enable HTTP Basic Authentication. It is disabled by default as Basic\nauth uses unencrypted encoding, so it introduces a vulnerability when not using TLS", + "id": "ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH", + "name": "ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH", + "range": null, + "title": "Enable HTTP Basic Authentication", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "This option will enable HTTP Digest Authentication. It is enabled by default, but use of this\nconfiguration is not recommended as the password can be derived from the exchange, so it introduces\na vulnerability when not using TLS", + "id": "ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH", + "name": "ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH", + "range": null, + "title": "Enable HTTP Digest Authentication", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "This option will enable injection of a custom tcp_transport handle, so the http operation\nwill be performed on top of the user defined transport abstraction (if configured)", + "id": "ESP_HTTP_CLIENT_ENABLE_CUSTOM_TRANSPORT", + "name": "ESP_HTTP_CLIENT_ENABLE_CUSTOM_TRANSPORT", + "range": null, + "title": "Enable custom transport", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "This config option helps in setting the time in millisecond to wait for event to be posted to the\nsystem default event loop. Set it to -1 if you need to set timeout to portMAX_DELAY.", + "id": "ESP_HTTP_CLIENT_EVENT_POST_TIMEOUT", + "name": "ESP_HTTP_CLIENT_EVENT_POST_TIMEOUT", + "range": null, + "title": "Time in millisecond to wait for posting event", + "type": "int" + } + ], + "depends_on": null, + "id": "component-config-esp-http-client", + "title": "ESP HTTP client", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "This sets the maximum supported size of headers section in HTTP request packet to be processed by the\nserver", + "id": "HTTPD_MAX_REQ_HDR_LEN", + "name": "HTTPD_MAX_REQ_HDR_LEN", + "range": null, + "title": "Max HTTP Request Header Length", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "This sets the maximum supported size of HTTP request URI to be processed by the server", + "id": "HTTPD_MAX_URI_LEN", + "name": "HTTPD_MAX_URI_LEN", + "range": null, + "title": "Max HTTP URI Length", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Using TCP_NODEALY socket option ensures that HTTP error response reaches the client before the\nunderlying socket is closed. Please note that turning this off may cause multiple test failures", + "id": "HTTPD_ERR_RESP_NO_DELAY", + "name": "HTTPD_ERR_RESP_NO_DELAY", + "range": null, + "title": "Use TCP_NODELAY socket option when sending HTTP error responses", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "This sets the size of the temporary buffer used to receive and discard any remaining data that is\nreceived from the HTTP client in the request, but not processed as part of the server HTTP request\nhandler.\n\nIf the remaining data is larger than the available buffer size, the buffer will be filled in multiple\niterations. The buffer should be small enough to fit on the stack, but large enough to avoid excessive\niterations.", + "id": "HTTPD_PURGE_BUF_LEN", + "name": "HTTPD_PURGE_BUF_LEN", + "range": null, + "title": "Length of temporary buffer for purging data", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Enabling this will log discarded binary HTTP request data at Debug level.\nFor large content data this may not be desirable as it will clutter the log.", + "id": "HTTPD_LOG_PURGE_DATA", + "name": "HTTPD_LOG_PURGE_DATA", + "range": null, + "title": "Log purged content data at Debug level", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "This sets the WebSocket server support.", + "id": "HTTPD_WS_SUPPORT", + "name": "HTTPD_WS_SUPPORT", + "range": null, + "title": "WebSocket server support", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "This makes httpd_queue_work() API to wait until a message space is available on UDP control socket.\nIt internally uses a counting semaphore with count set to `LWIP_UDP_RECVMBOX_SIZE` to achieve this.\nThis config will slightly change API behavior to block until message gets delivered on control socket.", + "id": "HTTPD_QUEUE_WORK_BLOCKING", + "name": "HTTPD_QUEUE_WORK_BLOCKING", + "range": null, + "title": "httpd_queue_work as blocking API", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "This config option helps in setting the time in millisecond to wait for event to be posted to the\nsystem default event loop. Set it to -1 if you need to set timeout to portMAX_DELAY.", + "id": "HTTPD_SERVER_EVENT_POST_TIMEOUT", + "name": "HTTPD_SERVER_EVENT_POST_TIMEOUT", + "range": null, + "title": "Time in millisecond to wait for posting event", + "type": "int" + } + ], + "depends_on": null, + "id": "component-config-http-server", + "title": "HTTP Server", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "Exposes an additional callback whereby firmware data could be decrypted\nbefore being processed by OTA update component. This can help to integrate\nexternal encryption related format and removal of such encapsulation layer\nfrom firmware image.", + "id": "ESP_HTTPS_OTA_DECRYPT_CB", + "name": "ESP_HTTPS_OTA_DECRYPT_CB", + "range": null, + "title": "Provide decryption callback", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "It is highly recommended to keep HTTPS (along with server certificate validation) enabled.\nEnabling this option comes with potential risk of:\n- Non-encrypted communication channel with server\n- Accepting firmware upgrade image from server with fake identity", + "id": "ESP_HTTPS_OTA_ALLOW_HTTP", + "name": "ESP_HTTPS_OTA_ALLOW_HTTP", + "range": null, + "title": "Allow HTTP for OTA (WARNING: ONLY FOR TESTING PURPOSE, READ HELP)", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "This config option helps in setting the time in millisecond to wait for event to be posted to the\nsystem default event loop. Set it to -1 if you need to set timeout to portMAX_DELAY.", + "id": "ESP_HTTPS_OTA_EVENT_POST_TIMEOUT", + "name": "ESP_HTTPS_OTA_EVENT_POST_TIMEOUT", + "range": null, + "title": "Time in millisecond to wait for posting event", + "type": "int" + } + ], + "depends_on": null, + "id": "component-config-esp-https-ota", + "title": "ESP HTTPS OTA", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_TLS_USING_MBEDTLS && MBEDTLS_TLS_SERVER", + "help": "Enable ESP HTTPS server component", + "id": "ESP_HTTPS_SERVER_ENABLE", + "name": "ESP_HTTPS_SERVER_ENABLE", + "range": null, + "title": "Enable ESP_HTTPS_SERVER component", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "This config option helps in setting the time in millisecond to wait for event to be posted to the\nsystem default event loop. Set it to -1 if you need to set timeout to portMAX_DELAY.", + "id": "ESP_HTTPS_SERVER_EVENT_POST_TIMEOUT", + "name": "ESP_HTTPS_SERVER_EVENT_POST_TIMEOUT", + "range": null, + "title": "Time in millisecond to wait for posting event", + "type": "int" + } + ], + "depends_on": null, + "id": "component-config-esp-https-server", + "title": "ESP HTTPS server", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP32_REV_MIN_0", + "name": "ESP32_REV_MIN_0", + "range": null, + "title": "Rev v0.0 (ECO0)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP32_REV_MIN_1", + "name": "ESP32_REV_MIN_1", + "range": null, + "title": "Rev v1.0 (ECO1)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP32_REV_MIN_1_1", + "name": "ESP32_REV_MIN_1_1", + "range": null, + "title": "Rev v1.1 (ECO1.1)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP32_REV_MIN_2", + "name": "ESP32_REV_MIN_2", + "range": null, + "title": "Rev v2.0 (ECO2)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP32_REV_MIN_3", + "name": "ESP32_REV_MIN_3", + "range": null, + "title": "Rev v3.0 (ECO3)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP32_REV_MIN_3_1", + "name": "ESP32_REV_MIN_3_1", + "range": null, + "title": "Rev v3.1 (ECO4)", + "type": "bool" + } + ], + "depends_on": null, + "help": "Required minimum chip revision. ESP-IDF will check for it and\nreject to boot if the chip revision fails the check.\nThis ensures the chip used will have some modifications (features, or bugfixes).\n\nThe complied binary will only support chips above this revision,\nthis will also help to reduce binary size.", + "id": "component-config-hardware-settings-chip-revision-minimum-supported-esp32-revision", + "name": "ESP32_REV_MIN", + "title": "Minimum Supported ESP32 Revision", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP32_REV_MIN", + "name": "ESP32_REV_MIN", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP32_REV_MIN_FULL", + "name": "ESP32_REV_MIN_FULL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_REV_MIN_FULL", + "name": "ESP_REV_MIN_FULL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP32_REV_MAX_FULL", + "name": "ESP32_REV_MAX_FULL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_REV_MAX_FULL", + "name": "ESP_REV_MAX_FULL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Required minimum eFuse Block revision. ESP-IDF will check it at the 2nd bootloader stage\nwhether the current image can work correctly for this eFuse Block revision.\nSo that to avoid running an incompatible image on a SoC that contains breaking change in the eFuse Block.\nIf you want to update this value to run the image that not compatible with the current eFuse Block revision,\nplease contact to Espressif's business team for details:\nhttps://www.espressif.com.cn/en/contact-us/sales-questions", + "id": "ESP_EFUSE_BLOCK_REV_MIN_FULL", + "name": "ESP_EFUSE_BLOCK_REV_MIN_FULL", + "range": null, + "title": "Minimum Supported ESP32 eFuse Block Revision", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_EFUSE_BLOCK_REV_MAX_FULL", + "name": "ESP_EFUSE_BLOCK_REV_MAX_FULL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "IDF_CI_BUILD", + "help": "For internal chip testing, a small number of new versions chips didn't\nupdate the version field in eFuse, you can enable this option to force the\nsoftware recognize the chip version based on the rev selected in menuconfig.", + "id": "ESP_REV_NEW_CHIP_TEST", + "name": "ESP_REV_NEW_CHIP_TEST", + "range": null, + "title": "Internal test mode", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-hardware-settings-chip-revision", + "title": "Chip revision", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_MAC_ADDR_UNIVERSE_WIFI_STA", + "name": "ESP_MAC_ADDR_UNIVERSE_WIFI_STA", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_MAC_ADDR_UNIVERSE_WIFI_AP", + "name": "ESP_MAC_ADDR_UNIVERSE_WIFI_AP", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_MAC_ADDR_UNIVERSE_BT", + "name": "ESP_MAC_ADDR_UNIVERSE_BT", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_MAC_ADDR_UNIVERSE_ETH", + "name": "ESP_MAC_ADDR_UNIVERSE_ETH", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_MAC_ADDR_UNIVERSE_IEEE802154", + "name": "ESP_MAC_ADDR_UNIVERSE_IEEE802154", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_MAC_UNIVERSAL_MAC_ADDRESSES_ONE", + "name": "ESP_MAC_UNIVERSAL_MAC_ADDRESSES_ONE", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_MAC_UNIVERSAL_MAC_ADDRESSES_TWO", + "name": "ESP_MAC_UNIVERSAL_MAC_ADDRESSES_TWO", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR", + "name": "ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_MAC_UNIVERSAL_MAC_ADDRESSES", + "name": "ESP_MAC_UNIVERSAL_MAC_ADDRESSES", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP32_UNIVERSAL_MAC_ADDRESSES_TWO", + "name": "ESP32_UNIVERSAL_MAC_ADDRESSES_TWO", + "range": null, + "title": "Two", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP32_UNIVERSAL_MAC_ADDRESSES_FOUR", + "name": "ESP32_UNIVERSAL_MAC_ADDRESSES_FOUR", + "range": null, + "title": "Four", + "type": "bool" + } + ], + "depends_on": null, + "help": "Configure the number of universally administered (by IEEE) MAC addresses.\nDuring initialization, MAC addresses for each network interface are generated or derived from a\nsingle base MAC address.\nIf the number of universal MAC addresses is four, all four interfaces (WiFi station, WiFi softap,\nBluetooth and Ethernet) receive a universally administered MAC address. These are generated\nsequentially by adding 0, 1, 2 and 3 (respectively) to the final octet of the base MAC address.\nIf the number of universal MAC addresses is two, only two interfaces (WiFi station and Bluetooth)\nreceive a universally administered MAC address. These are generated sequentially by adding 0\nand 1 (respectively) to the base MAC address. The remaining two interfaces (WiFi softap and Ethernet)\nreceive local MAC addresses. These are derived from the universal WiFi station and Bluetooth MAC\naddresses, respectively.\nWhen using the default (Espressif-assigned) base MAC address, either setting can be used. When using\na custom universal MAC address range, the correct setting will depend on the allocation of MAC\naddresses in this range (either 2 or 4 per device.)", + "id": "component-config-hardware-settings-mac-config-number-of-universally-administered-by-ieee-mac-address", + "name": "ESP32_UNIVERSAL_MAC_ADDRESSES", + "title": "Number of universally administered (by IEEE) MAC address", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP32_UNIVERSAL_MAC_ADDRESSES", + "name": "ESP32_UNIVERSAL_MAC_ADDRESSES", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ESP32", + "help": "If you have an invalid MAC CRC (ESP_ERR_INVALID_CRC) problem\nand you still want to use this chip, you can enable this option to bypass such an error.\nThis applies to both MAC_FACTORY and CUSTOM_MAC efuses.", + "id": "ESP_MAC_IGNORE_MAC_CRC_ERROR", + "name": "ESP_MAC_IGNORE_MAC_CRC_ERROR", + "range": null, + "title": "Ignore MAC CRC error (not recommended)", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "When this configuration is enabled, the user can invoke `esp_read_mac` to obtain the desired type of\nMAC using a custom MAC as the base MAC.", + "id": "ESP_MAC_USE_CUSTOM_MAC_AS_BASE_MAC", + "name": "ESP_MAC_USE_CUSTOM_MAC_AS_BASE_MAC", + "range": null, + "title": "Enable using custom mac as base mac", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-hardware-settings-mac-config", + "title": "MAC Config", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "(!SPIRAM || ESP_LDO_RESERVE_PSRAM) && !(IDF_TARGET_ESP32P4 && ESP32P4_REV_MIN_FULL < 100)", + "help": "If enabled, chip will try to power down flash as part of esp_light_sleep_start(), which costs\nmore time when chip wakes up. Can only be enabled if there is no SPIRAM configured.\n\nThis option will power down flash under a strict but relatively safe condition. Also, it is possible to\npower down flash under a relaxed condition by using esp_sleep_pd_config() to set ESP_PD_DOMAIN_VDDSDIO\nto ESP_PD_OPTION_OFF. It should be noted that there is a risk in powering down flash, you can refer\n`ESP-IDF Programming Guide/API Reference/System API/Sleep Modes/Power-down of Flash` for more details.", + "id": "ESP_SLEEP_POWER_DOWN_FLASH", + "name": "ESP_SLEEP_POWER_DOWN_FLASH", + "range": null, + "title": "Power down flash in light sleep when there is no SPIRAM or SPIRAM has independent power supply", + "type": "bool" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "All IOs will be set to isolate(floating) state by default during sleep.\nSince the power supply of SPI Flash is not lost during lightsleep, if its CS pin is recognized as\nlow level(selected state) in the floating state, there will be a large current leakage, and the\ndata in Flash may be corrupted by random signals on other SPI pins.\nSelect this option will set the CS pin of Flash to PULL-UP state during sleep, but this will\nincrease the sleep current about 10 uA.\nIf you are developing with esp32xx modules, you must select this option, but if you are developing\nwith chips, you can also pull up the CS pin of SPI Flash in the external circuit to save power\nconsumption caused by internal pull-up during sleep.\n(!!! Don't deselect this option if you don't have external SPI Flash CS pin pullups.)", + "id": "ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND", + "name": "ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND", + "range": null, + "title": "Pull-up Flash CS pin in light sleep", + "type": "bool" + }, + { + "children": [], + "depends_on": "SPIRAM", + "help": "All IOs will be set to isolate(floating) state by default during sleep.\nSince the power supply of PSRAM is not lost during lightsleep, if its CS pin is recognized as\nlow level(selected state) in the floating state, there will be a large current leakage, and the\ndata in PSRAM may be corrupted by random signals on other SPI pins.\nSelect this option will set the CS pin of PSRAM to PULL-UP state during sleep, but this will\nincrease the sleep current about 10 uA.\nIf you are developing with esp32xx modules, you must select this option, but if you are developing\nwith chips, you can also pull up the CS pin of PSRAM in the external circuit to save power\nconsumption caused by internal pull-up during sleep.\n(!!! Don't deselect this option if you don't have external PSRAM CS pin pullups.)", + "id": "ESP_SLEEP_PSRAM_LEAKAGE_WORKAROUND", + "name": "ESP_SLEEP_PSRAM_LEAKAGE_WORKAROUND", + "range": null, + "title": "Pull-up PSRAM CS pin in light sleep", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_SLEEP_PSRAM_LEAKAGE_WORKAROUND || ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND", + "help": "To reduce leakage current, some types of SPI Flash/RAM only need to pull up the CS pin\nduring light sleep. But there are also some kinds of SPI Flash/RAM that need to pull up\nall pins. It depends on the SPI Flash/RAM chip used.", + "id": "ESP_SLEEP_MSPI_NEED_ALL_IO_PU", + "name": "ESP_SLEEP_MSPI_NEED_ALL_IO_PU", + "range": null, + "title": "Pull-up all SPI pins in light sleep", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_SLEEP_RTC_BUS_ISO_WORKAROUND", + "name": "ESP_SLEEP_RTC_BUS_ISO_WORKAROUND", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "esp32c2, esp32c3, esp32s3, esp32c5, esp32c6 and esp32h2 will reset at wake-up if GPIO is received\na small electrostatic pulse during light sleep, with specific condition\n\n- GPIO needs to be configured as input-mode only\n- The pin receives a small electrostatic pulse, and reset occurs when the pulse\n voltage is higher than 6 V\n\nFor GPIO set to input mode only, it is not a good practice to leave it open/floating,\nThe hardware design needs to controlled it with determined supply or ground voltage\nis necessary.\n\nThis option provides a software workaround for this issue. Configure to isolate all\nGPIO pins in sleep state.", + "id": "ESP_SLEEP_GPIO_RESET_WORKAROUND", + "name": "ESP_SLEEP_GPIO_RESET_WORKAROUND", + "range": null, + "title": "light sleep GPIO reset workaround", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "When the chip exits sleep, the CPU and the flash chip are powered on at the same time.\nCPU will run rom code (deepsleep) or ram code (lightsleep) first, and then load or execute\ncode from flash.\n\nSome flash chips need sufficient time to pass between power on and first read operation.\nBy default, without any extra delay, this time is approximately 900us, although\nsome flash chip types need more than that.\n\n(!!! Please adjust this value according to the Data Sheet of SPI Flash used in your project.)\nIn Flash Data Sheet, the parameters that define the Flash ready timing after power-up (minimum\ntime from Vcc(min) to CS activeare) usually named tVSL in ELECTRICAL CHARACTERISTICS chapter,\nand the configuration value here should be:\nESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY = tVSL - 900\n\nFor esp32 and esp32s3, the default extra delay is set to 2000us. When optimizing startup time\nfor applications which require it, this value may be reduced.\n\nIf you are seeing \"flash read err, 1000\" message printed to the console after deep sleep reset\non esp32, or triggered RTC_WDT/LP_WDT after lightsleep wakeup, try increasing this value.\n(For esp32, the delay will be executed in both deep sleep and light sleep wake up flow.\nFor chips after esp32, the delay will be executed only in light sleep flow, the delay\ncontrolled by the EFUSE_FLASH_TPUW in ROM will be executed in deepsleep wake up flow.)", + "id": "ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY", + "name": "ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY", + "range": [ + 0, + 5000 + ], + "title": "Extra delay (in us) after flash powerdown sleep wakeup to wait flash ready", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Enabling it will check the cache safety of the code before the flash power is ready after\nlight sleep wakeup, and check PM_SLP_IRAM_OPT related code cache safety. This option is\nonly for code quality inspection. Enabling it will increase the time overhead of entering\nand exiting sleep. It is not recommended to enable it in the release version.", + "id": "ESP_SLEEP_CACHE_SAFE_ASSERTION", + "name": "ESP_SLEEP_CACHE_SAFE_ASSERTION", + "range": null, + "title": "Check the cache safety of the sleep wakeup code in sleep process", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enable esp sleep debug.", + "id": "ESP_SLEEP_DEBUG", + "name": "ESP_SLEEP_DEBUG", + "range": null, + "title": "esp sleep debug", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "When using rtc gpio wakeup source during deepsleep without external pull-up/downs, you may want to\nmake use of the internal ones.", + "id": "ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS", + "name": "ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS", + "range": null, + "title": "Allow to enable internal pull-up/downs for the Deep-Sleep wakeup IOs", + "type": "bool" + }, + { + "children": [], + "depends_on": "FREERTOS_USE_TICKLESS_IDLE", + "help": "If enabled, it allows user to register sleep event callbacks. It is primarily designed for internal\ndevelopers and customers can use PM_LIGHT_SLEEP_CALLBACKS as an alternative.\n\nNOTE: These callbacks are executed from the IDLE task context hence you cannot have any blocking calls\nin your callbacks.\n\nNOTE: Enabling these callbacks may change sleep duration calculations based on time spent in\ncallback and hence it is highly recommended to keep them as short as possible.", + "id": "ESP_SLEEP_EVENT_CALLBACKS", + "name": "ESP_SLEEP_EVENT_CALLBACKS", + "range": null, + "title": "Enable registration of sleep event callbacks", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-hardware-settings-sleep-config", + "title": "Sleep Config", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "RTC_CLK_SRC_INT_RC", + "name": "RTC_CLK_SRC_INT_RC", + "range": null, + "title": "Internal 150 kHz RC oscillator", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "RTC_CLK_SRC_EXT_CRYS", + "name": "RTC_CLK_SRC_EXT_CRYS", + "range": null, + "title": "External 32kHz crystal", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "RTC_CLK_SRC_EXT_OSC", + "name": "RTC_CLK_SRC_EXT_OSC", + "range": null, + "title": "External 32kHz oscillator at 32K_XN pin", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "RTC_CLK_SRC_INT_8MD256", + "name": "RTC_CLK_SRC_INT_8MD256", + "range": null, + "title": "Internal 8.5MHz oscillator, divided by 256 (~33kHz)", + "type": "bool" + } + ], + "depends_on": null, + "help": "Choose which clock is used as RTC clock source.\n\n- \"Internal 150kHz oscillator\" option provides lowest deep sleep current\n consumption, and does not require extra external components. However\n frequency stability with respect to temperature is poor, so time may\n drift in deep/light sleep modes.\n- \"External 32kHz crystal\" provides better frequency stability, at the\n expense of slightly higher (1uA) deep sleep current consumption.\n- \"External 32kHz oscillator\" allows using 32kHz clock generated by an\n external circuit. In this case, external clock signal must be connected\n to 32K_XN pin. Amplitude should be <1.2V in case of sine wave signal,\n and <1V in case of square wave signal. Common mode voltage should be\n 0.1 < Vcm < 0.5Vamp, where Vamp is the signal amplitude.\n Additionally, 1nF capacitor must be connected between 32K_XP pin and\n ground. 32K_XP pin can not be used as a GPIO in this case.\n- \"Internal 8.5MHz oscillator divided by 256\" option results in higher\n deep sleep current (by 5uA) but has better frequency stability than\n the internal 150kHz oscillator. It does not require external components.", + "id": "component-config-hardware-settings-rtc-clock-config-rtc-clock-source", + "name": "RTC_CLK_SRC", + "title": "RTC clock source", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "RTC_EXT_CRYST_ADDIT_CURRENT_NONE", + "name": "RTC_EXT_CRYST_ADDIT_CURRENT_NONE", + "range": null, + "title": "None", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "RTC_EXT_CRYST_ADDIT_CURRENT", + "name": "RTC_EXT_CRYST_ADDIT_CURRENT", + "range": null, + "title": "Method 1", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "RTC_EXT_CRYST_ADDIT_CURRENT_V2", + "name": "RTC_EXT_CRYST_ADDIT_CURRENT_V2", + "range": null, + "title": "Method 2", + "type": "bool" + } + ], + "depends_on": "RTC_CLK_SRC_EXT_CRYS && ESP32_REV_MIN_FULL < 200", + "help": "With some 32kHz crystal configurations, the X32N and X32P pins may not have enough\ndrive strength to keep the crystal oscillating. Choose the method to provide\nadditional current from touchpad 9 to the external 32kHz crystal. Note that\nthe deep sleep current is slightly high (4-5uA) and the touchpad and the\nwakeup sources of both touchpad and ULP are not available in method 1 and method 2.\n\nThis problem is fixed in ESP32 ECO 3, so this workaround is not needed. Setting the\nproject configuration to minimum revision ECO3 will disable this option, , allow\nall wakeup sources, and save some code size.\n\n- \"None\" option will not provide additional current to external crystal\n- \"Method 1\" option can't ensure 100% to solve the external 32k crystal start failed\n issue, but the touchpad can work in this method.\n- \"Method 2\" option can solve the external 32k issue, but the touchpad can't work\n in this method.", + "id": "component-config-hardware-settings-rtc-clock-config-additional-current-for-external-32khz-crystal", + "name": "RTC_EXT_CRYST_ADDIT_CURRENT_METHOD", + "title": "Additional current for external 32kHz crystal", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": "When the startup code initializes RTC_SLOW_CLK, it can perform\ncalibration by comparing the RTC_SLOW_CLK frequency with main XTAL\nfrequency. This option sets the number of RTC_SLOW_CLK cycles measured\nby the calibration routine. Higher numbers increase calibration\nprecision, which may be important for applications which spend a lot of\ntime in deep sleep. Lower numbers reduce startup time.\n\nWhen this option is set to 0, clock calibration will not be performed at\nstartup, and approximate clock frequencies will be assumed:\n\n- 150000 Hz if internal RC oscillator is used as clock source. For this use value 1024.\n- 32768 Hz if the 32k crystal oscillator is used. For this use value 3000 or more.\n In case more value will help improve the definition of the launch of the crystal.\n If the crystal could not start, it will be switched to internal RC.", + "id": "RTC_CLK_CAL_CYCLES", + "name": "RTC_CLK_CAL_CYCLES", + "range": [ + 0, + 32766 + ], + "title": "Number of cycles for RTC_SLOW_CLK calibration", + "type": "int" + }, + { + "children": [], + "depends_on": "RTC_CLK_SRC_EXT_CRYS", + "help": "Number of attempts to repeat 32k XTAL calibration\nbefore giving up and switching to the internal RC.\nIncrease this option if the 32k crystal oscillator\ndoes not start and switches to internal RC.", + "id": "RTC_XTAL_CAL_RETRY", + "name": "RTC_XTAL_CAL_RETRY", + "range": null, + "title": "Number of attempts to repeat 32k XTAL calibration", + "type": "int" + } + ], + "depends_on": null, + "id": "component-config-hardware-settings-rtc-clock-config", + "title": "RTC Clock Config", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "Place peripheral control functions (e.g. periph_module_reset) into IRAM,\nso that these functions can be IRAM-safe and able to be called in the other IRAM interrupt context.", + "id": "PERIPH_CTRL_FUNC_IN_IRAM", + "name": "PERIPH_CTRL_FUNC_IN_IRAM", + "range": null, + "title": "Place peripheral control functions into IRAM", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-hardware-settings-peripheral-control", + "title": "Peripheral Control", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_ETM_SUPPORTED", + "help": "whether to enable the debug log message for ETM core driver.\nNote that, this option only controls the ETM related driver log, won't affect other drivers.", + "id": "ETM_ENABLE_DEBUG_LOG", + "name": "ETM_ENABLE_DEBUG_LOG", + "range": null, + "title": "Enable debug log", + "type": "bool" + } + ], + "depends_on": "SOC_ETM_SUPPORTED", + "id": "component-config-hardware-settings-etm-configuration", + "title": "ETM Configuration", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_GDMA_SUPPORTED", + "help": "Place GDMA control functions (like start/stop/append/reset) into IRAM,\nso that these functions can be IRAM-safe and able to be called in the other IRAM interrupt context.", + "id": "GDMA_CTRL_FUNC_IN_IRAM", + "name": "GDMA_CTRL_FUNC_IN_IRAM", + "range": null, + "title": "Place GDMA control functions in IRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_GDMA_SUPPORTED", + "help": "This will ensure the GDMA interrupt handler is IRAM-Safe, allow to avoid flash\ncache misses, and also be able to run whilst the cache is disabled.\n(e.g. SPI Flash write).", + "id": "GDMA_ISR_IRAM_SAFE", + "name": "GDMA_ISR_IRAM_SAFE", + "range": null, + "title": "GDMA ISR IRAM-Safe", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_GDMA_SUPPORTED", + "help": "Whether to enable the debug log message for GDMA driver.\nNote that, this option only controls the GDMA driver log, won't affect other drivers.", + "id": "GDMA_ENABLE_DEBUG_LOG", + "name": "GDMA_ENABLE_DEBUG_LOG", + "range": null, + "title": "Enable debug log", + "type": "bool" + } + ], + "depends_on": "SOC_GDMA_SUPPORTED", + "id": "component-config-hardware-settings-gdma-configurations", + "title": "GDMA Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_DW_GDMA_SUPPORTED", + "help": "Place DW_GDMA control functions (e.g. dw_gdma_channel_continue) into IRAM,\nso that these functions can be IRAM-safe and able to be called in the other IRAM interrupt context.", + "id": "DW_GDMA_CTRL_FUNC_IN_IRAM", + "name": "DW_GDMA_CTRL_FUNC_IN_IRAM", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_DW_GDMA_SUPPORTED", + "help": "Place DW_GDMA setter functions (e.g. dw_gdma_channel_set_block_markers) into IRAM,\nso that these functions can be IRAM-safe and able to be called in the other IRAM interrupt context.", + "id": "DW_GDMA_SETTER_FUNC_IN_IRAM", + "name": "DW_GDMA_SETTER_FUNC_IN_IRAM", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_DW_GDMA_SUPPORTED", + "help": "Place DW_GDMA getter functions (e.g. dw_gdma_link_list_get_item) into IRAM,\nso that these functions can be IRAM-safe and able to be called in the other IRAM interrupt context.", + "id": "DW_GDMA_GETTER_FUNC_IN_IRAM", + "name": "DW_GDMA_GETTER_FUNC_IN_IRAM", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_DW_GDMA_SUPPORTED", + "help": "This will ensure the DW_GDMA interrupt handler is IRAM-Safe, allow to avoid flash\ncache misses, and also be able to run whilst the cache is disabled.\n(e.g. SPI Flash write).", + "id": "DW_GDMA_ISR_IRAM_SAFE", + "name": "DW_GDMA_ISR_IRAM_SAFE", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_DW_GDMA_SUPPORTED", + "help": "This will ensure the DW_GDMA object is DRAM-Safe, allow to avoid external memory\ncache misses, and also be accessible whilst the cache is disabled.", + "id": "DW_GDMA_OBJ_DRAM_SAFE", + "name": "DW_GDMA_OBJ_DRAM_SAFE", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_DW_GDMA_SUPPORTED", + "help": "Whether to enable the debug log message for DW_GDMA driver.\nNote that, this option only controls the DW_GDMA driver log, won't affect other drivers.", + "id": "DW_GDMA_ENABLE_DEBUG_LOG", + "name": "DW_GDMA_ENABLE_DEBUG_LOG", + "range": null, + "title": "Enable debug log", + "type": "bool" + } + ], + "depends_on": "SOC_DW_GDMA_SUPPORTED", + "id": "component-config-hardware-settings-dw_gdma-configurations", + "title": "DW_GDMA Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_DMA2D_SUPPORTED", + "help": "Place 2D-DMA all operation functions, including control functions (e.g. start/stop/append/reset) and setter\nfunctions (e.g. connect/strategy/callback registration) into IRAM, so that these functions can be IRAM-safe\nand able to be called in the other IRAM interrupt context. It also helps optimizing the performance.", + "id": "DMA2D_OPERATION_FUNC_IN_IRAM", + "name": "DMA2D_OPERATION_FUNC_IN_IRAM", + "range": null, + "title": "Place 2D-DMA operation functions into IRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_DMA2D_SUPPORTED", + "help": "This will ensure the 2D-DMA interrupt handler is IRAM-Safe, allow to avoid flash\ncache misses, and also be able to run whilst the cache is disabled.\n(e.g. SPI Flash write).", + "id": "DMA2D_ISR_IRAM_SAFE", + "name": "DMA2D_ISR_IRAM_SAFE", + "range": null, + "title": "2D-DMA ISR IRAM-Safe", + "type": "bool" + } + ], + "depends_on": "SOC_DMA2D_SUPPORTED", + "id": "component-config-hardware-settings-2d-dma-configurations", + "title": "2D-DMA Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "XTAL_FREQ_26", + "name": "XTAL_FREQ_26", + "range": null, + "title": "26 MHz", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "XTAL_FREQ_32", + "name": "XTAL_FREQ_32", + "range": null, + "title": "32 MHz", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "XTAL_FREQ_40", + "name": "XTAL_FREQ_40", + "range": null, + "title": "40 MHz", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "XTAL_FREQ_AUTO", + "name": "XTAL_FREQ_AUTO", + "range": null, + "title": "Autodetect", + "type": "bool" + } + ], + "depends_on": null, + "help": "This option selects the operating frequency of the XTAL (crystal) clock used to drive the ESP target.\nThe selected value MUST reflect the frequency of the given hardware.\n\nNote: On ESP32, the XTAL_FREQ_AUTO option allows the ESP target to automatically estimating XTAL clock's\noperating frequency. The ESP32 uses the internal 8MHZ as a reference when estimating. Due to the internal\noscillator's frequency being temperature dependent, usage of the XTAL_FREQ_AUTO is not recommended in\napplications that operate in high ambient temperatures or use high-temperature qualified chips and modules.", + "id": "component-config-hardware-settings-main-xtal-config-main-xtal-frequency", + "name": "XTAL_FREQ", + "title": "Main XTAL frequency", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "XTAL_FREQ", + "name": "XTAL_FREQ", + "range": null, + "title": null, + "type": "int" + } + ], + "depends_on": null, + "id": "component-config-hardware-settings-main-xtal-config", + "title": "Main XTAL Config", + "type": "menu" + }, + { + "children": [], + "depends_on": null, + "help": "This option is only used for new chip bringup, when\nclock support isn't done yet. So with this option,\nwe use xtal on FPGA as the clock source.", + "id": "ESP_BRINGUP_BYPASS_CPU_CLK_SETTING", + "name": "ESP_BRINGUP_BYPASS_CPU_CLK_SETTING", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "This option is only used for new chip bringup, when\nRNG isn't done yet. So with this option, we use 0x5A\nto fill the random buffers", + "id": "ESP_BRINGUP_BYPASS_RANDOM_SETTING", + "name": "ESP_BRINGUP_BYPASS_RANDOM_SETTING", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_SPI_BUS_LOCK_ISR_FUNCS_IN_IRAM", + "name": "ESP_SPI_BUS_LOCK_ISR_FUNCS_IN_IRAM", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_SPI_BUS_LOCK_FUNCS_IN_IRAM", + "name": "ESP_SPI_BUS_LOCK_FUNCS_IN_IRAM", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Due to the poor low-temperature characteristics of\nRC32K (it cannot operate below -40 degrees Celsius),\nplease avoid using it whenever possible", + "id": "ESP_CLK_RC32K_NOT_TO_USE", + "name": "ESP_CLK_RC32K_NOT_TO_USE", + "range": null, + "title": null, + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-hardware-settings", + "title": "Hardware Settings", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "whether to enable the debug log message for LCD driver.\nNote that, this option only controls the LCD driver log, won't affect other drivers.", + "id": "LCD_ENABLE_DEBUG_LOG", + "name": "LCD_ENABLE_DEBUG_LOG", + "range": null, + "title": "Enable debug log", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_LCD_RGB_SUPPORTED", + "help": "Ensure the LCD interrupt is IRAM-Safe by allowing the interrupt handler to be\nexecutable when the cache is disabled (e.g. SPI Flash write).\nIf you want the LCD driver to keep flushing the screen even when cache ops disabled,\nyou can enable this option. Note, this will also increase the IRAM usage.", + "id": "LCD_RGB_ISR_IRAM_SAFE", + "name": "LCD_RGB_ISR_IRAM_SAFE", + "range": null, + "title": "RGB LCD ISR IRAM-Safe", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_LCD_RGB_SUPPORTED", + "help": "Reset the GDMA channel every VBlank to stop permanent desyncs from happening.\nOnly need to enable it when in your application, the DMA can't deliver data\nas fast as the LCD consumes it.", + "id": "LCD_RGB_RESTART_IN_VSYNC", + "name": "LCD_RGB_RESTART_IN_VSYNC", + "range": null, + "title": "Always restart RGB LCD transmission in VSYNC", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_MIPI_DSI_SUPPORTED", + "help": "Ensure the LCD interrupt is IRAM-Safe by allowing the interrupt handler to be\nexecutable when the cache is disabled (e.g. SPI Flash write).\nIf you want the LCD driver to keep flushing the screen even when cache ops disabled,\nyou can enable this option. Note, this will also increase the IRAM usage.", + "id": "LCD_DSI_ISR_IRAM_SAFE", + "name": "LCD_DSI_ISR_IRAM_SAFE", + "range": null, + "title": "DSI LCD ISR IRAM-Safe", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-esp-driver-lcd-controller-configurations", + "title": "ESP-Driver:LCD Controller Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "ESP_MM_CACHE_MSYNC_C2M_CHUNKED_OPS", + "help": "Max len in bytes per C2M chunk, operations with size over the max len will be\nsliced into multiple chunks.", + "id": "ESP_MM_CACHE_MSYNC_C2M_CHUNKED_OPS_MAX_LEN", + "name": "ESP_MM_CACHE_MSYNC_C2M_CHUNKED_OPS_MAX_LEN", + "range": null, + "title": "Max len in bytes per C2M chunk", + "type": "hex" + } + ], + "depends_on": "SOC_CACHE_WRITEBACK_SUPPORTED", + "help": "`esp_cache_msync` C2M direction takes critical sections, which means during\nthe operation, the interrupts are disabled. Whereas Cache writebacks for\nlarge buffers could be especially time intensive, and might cause interrupts\nto be disabled for a significant amount of time.\n\nSometimes you want other ISRs to be responded during this C2M process.\nThis option is to slice one C2M operation into multiple chunks,\nwith CONFIG_ESP_MM_CACHE_MSYNC_C2M_CHUNKED_OPS_MAX_LEN max len. This will give you\na breath during the C2M process as sometimes the C2M process is quite long.\n\nNote if the buffer processed by the `esp_cache_msync` (C2M sliced) is interrupted by an ISR,\nand this ISR also accesses this buffer, this may lead to data coherence issue.", + "id": "ESP_MM_CACHE_MSYNC_C2M_CHUNKED_OPS", + "name": "ESP_MM_CACHE_MSYNC_C2M_CHUNKED_OPS", + "range": null, + "title": "Enable esp_cache_msync C2M chunked operation", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-esp-mm-memory-management-configurations", + "title": "ESP-MM: Memory Management Configurations", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "The value of 0 indicates the IP lost timer is disabled, otherwise the timer is enabled.\n\nThe IP address may be lost because of some reasons, e.g. when the station disconnects\nfrom soft-AP, or when DHCP IP renew fails etc. If the IP lost timer is enabled, it will\nbe started every time the IP is lost. Event SYSTEM_EVENT_STA_LOST_IP will be raised if\nthe timer expires. The IP lost timer is stopped if the station get the IP again before\nthe timer expires.", + "id": "ESP_NETIF_IP_LOST_TIMER_INTERVAL", + "name": "ESP_NETIF_IP_LOST_TIMER_INTERVAL", + "range": [ + 0, + 65535 + ], + "title": "IP Address lost timer interval (seconds)", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "No implementation of ESP-NETIF functions is provided.\nThis option is used for adding a custom TCP/IP stack and defining related\nesp_netif functionality", + "id": "ESP_NETIF_PROVIDE_CUSTOM_IMPLEMENTATION", + "name": "ESP_NETIF_PROVIDE_CUSTOM_IMPLEMENTATION", + "range": null, + "title": "Use only ESP-NETIF headers", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "LWIP_ENABLE && ", + "help": "lwIP is a small independent implementation of the TCP/IP protocol suite.", + "id": "ESP_NETIF_TCPIP_LWIP", + "name": "ESP_NETIF_TCPIP_LWIP", + "range": null, + "title": "LwIP", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "Dummy implementation of esp-netif functionality which connects driver transmit\nto receive function. This option is for testing purpose only", + "id": "ESP_NETIF_LOOPBACK", + "name": "ESP_NETIF_LOOPBACK", + "range": null, + "title": "Loopback", + "type": "bool" + } + ], + "depends_on": "!ESP_NETIF_PROVIDE_CUSTOM_IMPLEMENTATION", + "help": "Choose the TCP/IP Stack to work, for example, LwIP, uIP, etc.", + "id": "component-config-esp-netif-adapter-tcp-ip-stack-library", + "name": "ESP_NETIF_USE_TCPIP_STACK_LIB", + "title": "TCP/IP Stack Library", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_NETIF_USES_TCPIP_WITH_BSD_API", + "name": "ESP_NETIF_USES_TCPIP_WITH_BSD_API", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enable if esp_netif_transmit() and esp_netif_receive() should generate events. This can be useful\nto blink data traffic indication lights.", + "id": "ESP_NETIF_REPORT_DATA_TRAFFIC", + "name": "ESP_NETIF_REPORT_DATA_TRAFFIC", + "range": null, + "title": "Report data traffic via events", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enable if esp_netif_receive() should return error code. This is useful to inform upper layers\nthat packet input to TCP/IP stack failed, so the upper layers could implement flow control.\nThis option is disabled by default due to backward compatibility and will be enabled in v6.0 (IDF-7194)", + "id": "ESP_NETIF_RECEIVE_REPORT_ERRORS", + "name": "ESP_NETIF_RECEIVE_REPORT_ERRORS", + "range": null, + "title": "Use esp_err_t to report errors from esp_netif_receive", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_NETIF_L2_TAP", + "help": "Maximum number of opened File descriptors (FD's) associated with ESP TAP device. ESP TAP FD's take up\na certain amount of memory, and allowing fewer FD's to be opened at the same time conserves memory.", + "id": "ESP_NETIF_L2_TAP_MAX_FDS", + "name": "ESP_NETIF_L2_TAP_MAX_FDS", + "range": null, + "title": "Maximum number of opened L2 TAP File descriptors", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_NETIF_L2_TAP", + "help": "Maximum number of frames queued in opened File descriptor. Once the queue is full, the newly arriving\nframes are dropped until the queue has enough room to accept incoming traffic (Tail Drop queue\nmanagement).", + "id": "ESP_NETIF_L2_TAP_RX_QUEUE_SIZE", + "name": "ESP_NETIF_L2_TAP_RX_QUEUE_SIZE", + "range": null, + "title": "Size of L2 TAP Rx queue", + "type": "int" + } + ], + "depends_on": null, + "help": "A user program can read/write link layer (L2) frames from/to ESP TAP device.\nThe ESP TAP device can be currently associated only with Ethernet physical interfaces.", + "id": "ESP_NETIF_L2_TAP", + "name": "ESP_NETIF_L2_TAP", + "range": null, + "title": "Enable netif L2 TAP support", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_NETIF_TCPIP_LWIP", + "help": "Enable LwIP IEEE 802.1D bridge support in ESP-NETIF. Note that \"Number of clients store data in netif\"\n(LWIP_NUM_NETIF_CLIENT_DATA) option needs to be properly configured to be LwIP bridge available!", + "id": "ESP_NETIF_BRIDGE_EN", + "name": "ESP_NETIF_BRIDGE_EN", + "range": null, + "title": "Enable LwIP IEEE 802.1D bridge", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enable this option to use the DNS server which belongs to the selected default network interface.\nThis feature collects DNS server and netif information from LWIP core modules.\nWhenever a new default netif is selected, global DNS servers in LWIP are updated with the netif\nrelated servers.", + "id": "ESP_NETIF_SET_DNS_PER_DEFAULT_NETIF", + "name": "ESP_NETIF_SET_DNS_PER_DEFAULT_NETIF", + "range": null, + "title": "Enable DNS server per interface", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-esp-netif-adapter", + "title": "ESP NETIF Adapter", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "IDF_TARGET_LINUX", + "help": "This option enables gathering host test statistics and SPI flash wear levelling simulation.", + "id": "ESP_PARTITION_ENABLE_STATS", + "name": "ESP_PARTITION_ENABLE_STATS", + "range": null, + "title": "Host test statistics enabled", + "type": "bool" + }, + { + "children": [], + "depends_on": "IDF_TARGET_LINUX", + "help": "This option controls whether the partition implementation checks\nif the flash is erased before writing to it.\nThis is necessary for SPIFFS, which expects to be able to write without erasing first.", + "id": "ESP_PARTITION_ERASE_CHECK", + "name": "ESP_PARTITION_ERASE_CHECK", + "range": null, + "title": "Check if flash is erased before writing", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-partition-api-configuration", + "title": "Partition API Configuration", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_PHY_ENABLED", + "name": "ESP_PHY_ENABLED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_PHY_ENABLED", + "help": "If this option is enabled, NVS will be initialized and calibration data will be loaded from there.\nPHY calibration will be skipped on deep sleep wakeup. If calibration data is not found, full\ncalibration will be performed and stored in NVS. Normally, only partial calibration will be performed.\nIf this option is disabled, full calibration will be performed.\n\nIf it's easy that your board calibrate bad data, choose 'n'.\nTwo cases for example, you should choose 'n':\n1.If your board is easy to be booted up with antenna disconnected.\n2.Because of your board design, each time when you do calibration, the result are too unstable.\nIf unsure, choose 'y'.", + "id": "ESP_PHY_CALIBRATION_AND_DATA_STORAGE", + "name": "ESP_PHY_CALIBRATION_AND_DATA_STORAGE", + "range": null, + "title": "Store phy calibration data in NVS", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_PHY_INIT_DATA_IN_PARTITION && ESP_PHY_ENABLED", + "help": "If enabled, PHY init data will be restored to default if\nit cannot be verified successfully to avoid endless bootloops.\n\nIf unsure, choose 'n'.", + "id": "ESP_PHY_DEFAULT_INIT_IF_INVALID", + "name": "ESP_PHY_DEFAULT_INIT_IF_INVALID", + "range": null, + "title": "Reset default PHY init data if invalid", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_PHY_MULTIPLE_INIT_DATA_BIN && ESP_PHY_INIT_DATA_IN_PARTITION && ESP_PHY_ENABLED", + "help": "If enabled, multiple phy init data bin will embedded into app bin\nIf not enabled, multiple phy init data bin will still leave alone, and need to be flashed by users.", + "id": "ESP_PHY_MULTIPLE_INIT_DATA_BIN_EMBED", + "name": "ESP_PHY_MULTIPLE_INIT_DATA_BIN_EMBED", + "range": null, + "title": "Support embedded multiple phy init data bin to app bin", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_PHY_MULTIPLE_INIT_DATA_BIN && ESP_PHY_INIT_DATA_IN_PARTITION && ESP_PHY_ENABLED", + "help": "If enabled, when an error occurs while the PHY init data is updated,\nthe program will terminate and restart.\nIf not enabled, the PHY init data will not be updated when an error occurs.", + "id": "ESP_PHY_INIT_DATA_ERROR", + "name": "ESP_PHY_INIT_DATA_ERROR", + "range": null, + "title": "Terminate operation when PHY init data error", + "type": "bool" + } + ], + "depends_on": "ESP_PHY_INIT_DATA_IN_PARTITION && ESP_PHY_INIT_DATA_IN_PARTITION && ESP_PHY_ENABLED", + "help": "If enabled, the corresponding PHY init data type can be automatically switched\naccording to the country code. China's PHY init data bin is used by default.\nCan be modified by country information in API esp_wifi_set_country().\nThe priority of switching the PHY init data type is:\n1. Country configured by API esp_wifi_set_country()\nand the parameter policy is WIFI_COUNTRY_POLICY_MANUAL.\n2. Country notified by the connected AP.\n3. Country configured by API esp_wifi_set_country()\nand the parameter policy is WIFI_COUNTRY_POLICY_AUTO.", + "id": "ESP_PHY_MULTIPLE_INIT_DATA_BIN", + "name": "ESP_PHY_MULTIPLE_INIT_DATA_BIN", + "range": null, + "title": "Support multiple PHY init data bin", + "type": "bool" + } + ], + "depends_on": "SOC_WIFI_SUPPORTED && ESP_PHY_ENABLED", + "help": "If enabled, PHY init data will be loaded from a partition.\nWhen using a custom partition table, make sure that PHY data\npartition is included (type: 'data', subtype: 'phy').\nWith default partition tables, this is done automatically.\nIf PHY init data is stored in a partition, it has to be flashed there,\notherwise runtime error will occur.\n\nIf this option is not enabled, PHY init data will be embedded\ninto the application binary.\n\nIf unsure, choose 'n'.", + "id": "ESP_PHY_INIT_DATA_IN_PARTITION", + "is_menuconfig": true, + "name": "ESP_PHY_INIT_DATA_IN_PARTITION", + "range": null, + "title": "Use a partition to store PHY init data", + "type": "menu" + }, + { + "children": [], + "depends_on": "ESP_PHY_ENABLED", + "help": "Set maximum transmit power for WiFi radio. Actual transmit power for high\ndata rates may be lower than this setting.", + "id": "ESP_PHY_MAX_WIFI_TX_POWER", + "name": "ESP_PHY_MAX_WIFI_TX_POWER", + "range": [ + 10, + 20 + ], + "title": "Max WiFi TX power (dBm)", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_PHY_ENABLED", + "help": null, + "id": "ESP_PHY_MAX_TX_POWER", + "name": "ESP_PHY_MAX_TX_POWER", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "SOC_PM_SUPPORT_MAC_BB_PD && FREERTOS_USE_TICKLESS_IDLE && ESP_PHY_ENABLED", + "help": "If enabled, the MAC and baseband of Wi-Fi and Bluetooth will be powered\ndown when PHY is disabled. Enabling this setting reduces power consumption\nby a small amount but increases RAM use by approximately 4 KB(Wi-Fi only),\n2 KB(Bluetooth only) or 5.3 KB(Wi-Fi + Bluetooth).", + "id": "ESP_PHY_MAC_BB_PD", + "name": "ESP_PHY_MAC_BB_PD", + "range": null, + "title": "Power down MAC and baseband of Wi-Fi and Bluetooth when PHY is disabled", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_BROWNOUT_DET && ESP_PHY_ENABLED", + "help": "When brownout reset occurs, reduce PHY TX power to keep the code running.", + "id": "ESP_PHY_REDUCE_TX_POWER", + "name": "ESP_PHY_REDUCE_TX_POWER", + "range": null, + "title": "Reduce PHY TX power when brownout reset", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_WIFI_PHY_NEEDS_USB_WORKAROUND && ESP_PHY_ENABLED", + "help": "On some ESP targets, the USB PHY can interfere with WiFi thus lowering WiFi performance.\nAs a result, on those affected ESP targets, the ESP PHY library's initialization will automatically\ndisable the USB PHY to get best WiFi performance.\nThis option controls whether or not the ESP PHY library will keep the USB PHY enabled on\ninitialization.\n\nNote: This option can be disabled to increase WiFi performance. However, disabling this option will\nalso mean that the USB PHY cannot be used while WiFi is enabled.", + "id": "ESP_PHY_ENABLE_USB", + "name": "ESP_PHY_ENABLE_USB", + "range": null, + "title": "Keep the USB PHY enabled when initializing WiFi", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_PHY_ENABLED", + "help": "If enabled, you can use RF certification test APIs.", + "id": "ESP_PHY_ENABLE_CERT_TEST", + "name": "ESP_PHY_ENABLE_CERT_TEST", + "range": null, + "title": "Enable RF certification test functions", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_PHY_RF_CAL_PARTIAL", + "name": "ESP_PHY_RF_CAL_PARTIAL", + "range": null, + "title": "Calibration partial", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_PHY_RF_CAL_NONE", + "name": "ESP_PHY_RF_CAL_NONE", + "range": null, + "title": "Calibration none", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_PHY_RF_CAL_FULL", + "name": "ESP_PHY_RF_CAL_FULL", + "range": null, + "title": "Calibration full", + "type": "bool" + } + ], + "depends_on": "ESP_PHY_ENABLED", + "help": "Select PHY calibration mode. During RF initialization, the partial calibration\nmethod is used by default for RF calibration. Full calibration takes about 100ms\nmore than partial calibration. If boot duration is not critical, it is suggested\nto use the full calibration method. No calibration method is only used when the\ndevice wakes up from deep sleep.", + "id": "component-config-phy-calibration-mode", + "name": "ESP_PHY_CALIBRATION_MODE", + "title": "Calibration mode", + "type": "choice" + }, + { + "children": [], + "depends_on": "ESP_PHY_ENABLED", + "help": null, + "id": "ESP_PHY_CALIBRATION_MODE", + "name": "ESP_PHY_CALIBRATION_MODE", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "SOC_PHY_IMPROVE_RX_11B && ESP_PHY_ENABLED", + "help": "This is a workaround to improve Wi-Fi receive 11b pkts for some modules using AC-DC power supply with\nhigh interference, enable this option will sacrifice Wi-Fi OFDM receive performance.\nBut to guarantee 11b receive performance serves as a bottom line in this case.", + "id": "ESP_PHY_IMPROVE_RX_11B", + "name": "ESP_PHY_IMPROVE_RX_11B", + "range": null, + "title": "Improve Wi-Fi receive 11b pkts", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_PHY_ENABLED", + "help": "If enabled, there will be some logs while pll tracking", + "id": "ESP_PHY_PLL_TRACK_DEBUG", + "name": "ESP_PHY_PLL_TRACK_DEBUG", + "range": null, + "title": "Enable pll track logging", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_PHY_ENABLED", + "help": "Select to support record and query phy used time.", + "id": "ESP_PHY_RECORD_USED_TIME", + "name": "ESP_PHY_RECORD_USED_TIME", + "range": null, + "title": "Record PHY used time", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-phy", + "title": "PHY", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "PM_ENABLE", + "help": "If enabled, startup code configures dynamic frequency scaling.\nMax CPU frequency is set to DEFAULT_CPU_FREQ_MHZ setting,\nmin frequency is set to XTAL frequency.\nIf disabled, DFS will not be active until the application\nconfigures it using esp_pm_configure function.", + "id": "PM_DFS_INIT_AUTO", + "name": "PM_DFS_INIT_AUTO", + "range": null, + "title": "Enable dynamic frequency scaling (DFS) at startup", + "type": "bool" + }, + { + "children": [], + "depends_on": "PM_ENABLE", + "help": "If enabled, esp_pm_* functions will keep track of the amount of time\neach of the power management locks has been held, and esp_pm_dump_locks\nfunction will print this information.\nThis feature can be used to analyze which locks are preventing the chip\nfrom going into a lower power state, and see what time the chip spends\nin each power saving mode. This feature does incur some run-time\noverhead, so should typically be disabled in production builds.", + "id": "PM_PROFILING", + "name": "PM_PROFILING", + "range": null, + "title": "Enable profiling counters for PM locks", + "type": "bool" + }, + { + "children": [], + "depends_on": "PM_ENABLE", + "help": "If enabled, some GPIOs will be used to signal events such as RTOS ticks,\nfrequency switching, entry/exit from idle state. Refer to pm_trace.c\nfile for the list of GPIOs.\nThis feature is intended to be used when analyzing/debugging behavior\nof power management implementation, and should be kept disabled in\napplications.", + "id": "PM_TRACE", + "name": "PM_TRACE", + "range": null, + "title": "Enable debug tracing of PM using GPIOs", + "type": "bool" + } + ], + "depends_on": "(!FREERTOS_SMP && SOC_PM_SUPPORTED) || __DOXYGEN__", + "help": "If enabled, application is compiled with support for power management.\nThis option has run-time overhead (increased interrupt latency,\nlonger time to enter idle state), and it also reduces accuracy of\nRTOS ticks and timers used for timekeeping.\nEnable this option if application uses power management APIs.", + "id": "PM_ENABLE", + "name": "PM_ENABLE", + "range": null, + "title": "Support for power management", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_LIGHT_SLEEP_SUPPORTED", + "help": "If enabled, about 2.1KB of lightsleep related source code would be in IRAM and chip would sleep\nlonger for 310us at 160MHz CPU frequency most each time.\nThis feature is intended to be used when lower power consumption is needed\nwhile there is enough place in IRAM to place source code.", + "id": "PM_SLP_IRAM_OPT", + "name": "PM_SLP_IRAM_OPT", + "range": null, + "title": "Put lightsleep related codes in internal RAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "FREERTOS_USE_TICKLESS_IDLE", + "help": "If enabled, about 180Bytes of RTOS_IDLE related source code would be in IRAM and chip would sleep\nlonger for 20us at 160MHz CPU frequency most each time.\nThis feature is intended to be used when lower power consumption is needed\nwhile there is enough place in IRAM to place source code.", + "id": "PM_RTOS_IDLE_OPT", + "name": "PM_RTOS_IDLE_OPT", + "range": null, + "title": "Put RTOS IDLE related codes in internal RAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "FREERTOS_USE_TICKLESS_IDLE", + "help": "This feature is intended to disable all GPIO pins at automantic sleep to get a lower power mode.\nIf enabled, chips will disable all GPIO pins at automantic sleep to reduce about 200~300 uA current.\nIf you want to specifically use some pins normally as chip wakes when chip sleeps,\nyou can call 'gpio_sleep_sel_dis' to disable this feature on those pins.\nYou can also keep this feature on and call 'gpio_sleep_set_direction' and 'gpio_sleep_set_pull_mode'\nto have a different GPIO configuration at sleep.\nWarning: If you want to enable this option on ESP32, you should enable `GPIO_ESP32_SUPPORT_SWITCH_SLP_PULL`\nat first, otherwise you will not be able to switch pullup/pulldown mode.", + "id": "PM_SLP_DISABLE_GPIO", + "name": "PM_SLP_DISABLE_GPIO", + "range": null, + "title": "Disable all GPIO when chip at sleep", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "PM_SLP_DEFAULT_PARAMS_OPT", + "name": "PM_SLP_DEFAULT_PARAMS_OPT", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP || (SOC_CPU_IN_TOP_DOMAIN && PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP)", + "help": "This option is invisible to users, and it is only used for ci testing,\nenabling it in the application will increase the sleep and wake-up time overhead", + "id": "PM_CHECK_SLEEP_RETENTION_FRAME", + "name": "PM_CHECK_SLEEP_RETENTION_FRAME", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "PM_ENABLE", + "help": "The value of this option determines the calibration interval of the RTC_FAST/SLOW clock during sleep when\npower management is enabled. When it is configured as N, the RTC_FAST/SLOW clock will be calibrated\nevery N times of lightsleep.\nDecreasing this value will increase the time the chip is in the active state, thereby increasing the\naverage power consumption of the chip.\nIncreasing this value can reduce the average power consumption, but when the external environment changes\ndrastically and the chip RTC_FAST/SLOW oscillator frequency drifts, it may cause system instability.", + "id": "PM_LIGHTSLEEP_RTC_OSC_CAL_INTERVAL", + "name": "PM_LIGHTSLEEP_RTC_OSC_CAL_INTERVAL", + "range": null, + "title": "Calibrate the RTC_FAST/SLOW clock every N times of light sleep", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "IDF_TARGET_ESP32S3 && PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP", + "help": "Cache tag memory and CPU both belong to the CPU power domain.\nESP chips supports saving and restoring Cache tag memory before and after sleep,\nthis feature supports accesses to the external memory that was cached before sleep still\nbe cached when the CPU wakes up from a powerdowned CPU lightsleep.\nThis option controls the restore method for Cache tag memory in lightsleep.\nIf this option is enabled, the I/D-cache tag memory will be backuped to the internal RAM\nbefore sleep and restored upon wakeup.\nDepending on the the cache configuration, if this option is enabled,\nit will consume up to 9 KB of internal RAM.\nIf this option is disabled, all cached data won't be kept after sleep,\nthe DCache will be writeback before sleep and invalid all cached data after sleep,\nall accesses to external memory(Flash/PSRAM) will be cache missed after waking up,\nresulting in performance degradation due to increased memory accesses latency.", + "id": "PM_RESTORE_CACHE_TAGMEM_AFTER_LIGHT_SLEEP", + "name": "PM_RESTORE_CACHE_TAGMEM_AFTER_LIGHT_SLEEP", + "range": null, + "title": "Restore I/D-cache tag memory after power down CPU light sleep", + "type": "bool" + } + ], + "depends_on": "SOC_PM_SUPPORT_CPU_PD", + "help": "If enabled, the CPU will be powered down in light sleep,\nESP chips supports saving and restoring CPU's running context before and after light sleep,\nthe feature provides applications with seamless CPU powerdowned lightsleep without user awareness.\nBut this will takes up some internal memory.\nOn esp32c3 soc, enabling this option will consume 1.68 KB of internal RAM\nand will reduce sleep current consumption by about 100 uA.\nOn esp32s3 soc, enabling this option will consume 8.58 KB of internal RAM\nand will reduce sleep current consumption by about 650 uA.", + "id": "PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP", + "name": "PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP", + "range": null, + "title": "Power down CPU in light sleep", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_PM_SUPPORT_TOP_PD && SOC_PAU_SUPPORTED", + "help": "If enabled, digital peripherals will be powered down in light sleep, it will reduce sleep\ncurrent consumption by about 100 uA. Chip will save/restore register context at sleep/wake\ntime to keep the system running. Enabling this option will increase static RAM and heap usage,\nthe actual cost depends on the peripherals you have initialized. In order to save/restore the\ncontext of the necessary hardware for FreeRTOS to run, it will need at least 4.55 KB free heap\nat sleep time. Otherwise sleep will not power down the peripherals.\n\nNote1: Please use this option with caution, the current IDF does not support the retention of\nall peripherals. When the digital peripherals are powered off and a sleep and wake-up is completed,\nthe peripherals that have not saved the running context are equivalent to performing a reset.\n!!! Please confirm the peripherals used in your application and their sleep retention support status\nbefore enabling this option, peripherals sleep retention driver support status is tracked in\npower_management.rst\n\nNote2: When this option is enabled simultaneously with FREERTOS_USE_TICKLESS_IDLE, since the UART will\nbe powered down, the uart FIFO will be flushed before sleep to avoid data loss, however, this has the\npotential to block the sleep process and cause the wakeup time to be skipped, which will cause the tick\nof freertos to not be compensated correctly when returning from sleep and cause the system to crash.\nTo avoid this, you can increase FREERTOS_IDLE_TIME_BEFORE_SLEEP threshold in menuconfig.", + "id": "PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP", + "name": "PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP", + "range": null, + "title": "Power down Digital Peripheral in light sleep (EXPERIMENTAL)", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "PM_UPDATE_CCOMPARE_HLI_WORKAROUND", + "name": "PM_UPDATE_CCOMPARE_HLI_WORKAROUND", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "FREERTOS_USE_TICKLESS_IDLE", + "help": "If enabled, it allows user to register entry and exit callbacks which are called before and after\nentering auto light sleep.\n\nNOTE: These callbacks are executed from the IDLE task context hence you cannot have any blocking calls\nin your callbacks.\n\nNOTE: Enabling these callbacks may change sleep duration calculations based on time spent in callback and\nhence it is highly recommended to keep them as short as possible", + "id": "PM_LIGHT_SLEEP_CALLBACKS", + "name": "PM_LIGHT_SLEEP_CALLBACKS", + "range": null, + "title": "Enable registration of pm light sleep callbacks", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-power-management", + "title": "Power Management", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": null, + "id": "SPIRAM_MODE_QUAD", + "name": "SPIRAM_MODE_QUAD", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "SPIRAM_TYPE_AUTO", + "name": "SPIRAM_TYPE_AUTO", + "range": null, + "title": "Auto-detect", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "SPIRAM_TYPE_ESPPSRAM16", + "name": "SPIRAM_TYPE_ESPPSRAM16", + "range": null, + "title": "ESP-PSRAM16 or APS1604", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "SPIRAM_TYPE_ESPPSRAM32", + "name": "SPIRAM_TYPE_ESPPSRAM32", + "range": null, + "title": "ESP-PSRAM32", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "SPIRAM_TYPE_ESPPSRAM64", + "name": "SPIRAM_TYPE_ESPPSRAM64", + "range": null, + "title": "ESP-PSRAM64 or LY68L6400", + "type": "bool" + } + ], + "depends_on": "SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": null, + "id": "component-config-esp-psram-support-for-external-spi-connected-ram-spi-ram-config-type-of-spi-ram-chip-in-use", + "name": "SPIRAM_TYPE", + "title": "Type of SPI RAM chip in use", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "SPIRAM_SPEED_40M", + "name": "SPIRAM_SPEED_40M", + "range": null, + "title": "40MHz clock speed", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESPTOOLPY_FLASHFREQ_80M && ", + "help": null, + "id": "SPIRAM_SPEED_80M", + "name": "SPIRAM_SPEED_80M", + "range": null, + "title": "80MHz clock speed", + "type": "bool" + } + ], + "depends_on": "SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "Select the speed for the SPI RAM chip.\nIf SPI RAM is enabled, we only support three combinations of SPI speed mode we supported now:\n\n1. Flash SPI running at 40Mhz and RAM SPI running at 40Mhz\n2. Flash SPI running at 80Mhz and RAM SPI running at 40Mhz\n3. Flash SPI running at 80Mhz and RAM SPI running at 80Mhz\n\nNote: If the third mode(80Mhz+80Mhz) is enabled for SPI RAM of type 32MBit, one of the HSPI/VSPI host\nwill be occupied by the system. Which SPI host to use can be selected by the config item\nSPIRAM_OCCUPY_SPI_HOST. Application code should never touch HSPI/VSPI hardware in this case. The\noption to select 80MHz will only be visible if the flash SPI speed is also 80MHz.\n(ESPTOOLPY_FLASHFREQ_80M is true)", + "id": "component-config-esp-psram-support-for-external-spi-connected-ram-spi-ram-config-set-ram-clock-speed", + "name": "SPIRAM_SPEED", + "title": "Set RAM clock speed", + "type": "choice" + }, + { + "children": [], + "depends_on": "SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": null, + "id": "SPIRAM_SPEED", + "name": "SPIRAM_SPEED", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "SPIRAM_BOOT_INIT && !SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY && !SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "Normally, if psram initialization is enabled during compile time but not found at runtime, it\nis seen as an error making the CPU panic. If this is enabled, booting will complete\nbut no PSRAM will be available. In particular, it is important to note that when SPIRAM_IGNORE_NOTFOUND\nis enabled, some WIFI related configs will be set to the default value used when SPIRAM is disabled.\nIt can be assumed that by enabling this config, WIFI and LWIP will assume that the current chip does not\nhave SPIRAM. SPIRAM_TRY_ALLOCATE_WIFI_LWIP will not work, buffers in WIFI and LWIP will be set to smaller\nranges and default values. WIFI_CACHE_TX_BUFFER_NUM and ESP_WIFI_AMSDU_TX_ENABLED will be disabled,\nESP_WIFI_TX_BUFFER will be set to ESP_WIFI_DYNAMIC_TX_BUFFER.", + "id": "SPIRAM_IGNORE_NOTFOUND", + "name": "SPIRAM_IGNORE_NOTFOUND", + "range": null, + "title": "Ignore PSRAM when not found", + "type": "bool" + } + ], + "depends_on": "SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "If this is enabled, the SPI RAM will be enabled during initial boot. Unless you\nhave specific requirements, you'll want to leave this enabled so memory allocated\nduring boot-up can also be placed in SPI RAM.", + "id": "SPIRAM_BOOT_INIT", + "name": "SPIRAM_BOOT_INIT", + "range": null, + "title": "Initialize SPI RAM during startup", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "SPIRAM_USE_MEMMAP", + "name": "SPIRAM_USE_MEMMAP", + "range": null, + "title": "Integrate RAM into memory map", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "SPIRAM_USE_CAPS_ALLOC", + "name": "SPIRAM_USE_CAPS_ALLOC", + "range": null, + "title": "Make RAM allocatable using heap_caps_malloc(..., MALLOC_CAP_SPIRAM)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "SPIRAM_USE_MALLOC", + "name": "SPIRAM_USE_MALLOC", + "range": null, + "title": "Make RAM allocatable using malloc() as well", + "type": "bool" + } + ], + "depends_on": "SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "The SPI RAM can be accessed in multiple methods: by just having it available as an unmanaged\nmemory region in the CPU's memory map, by integrating it in the heap as 'special' memory\nneeding heap_caps_malloc to allocate, or by fully integrating it making malloc() also able to\nreturn SPI RAM pointers.", + "id": "component-config-esp-psram-support-for-external-spi-connected-ram-spi-ram-config-spi-ram-access-method", + "name": "SPIRAM_USE", + "title": "SPI RAM access method", + "type": "choice" + }, + { + "children": [], + "depends_on": "SPIRAM_BOOT_INIT && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "Runs a rudimentary memory test on initialization. Aborts when memory test fails. Disable this for\nslightly faster startup.", + "id": "SPIRAM_MEMTEST", + "name": "SPIRAM_MEMTEST", + "range": null, + "title": "Run memory test on SPI RAM initialization", + "type": "bool" + }, + { + "children": [], + "depends_on": "SPIRAM_USE_MALLOC && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "If malloc() is capable of also allocating SPI-connected ram, its allocation strategy will prefer to\nallocate chunks less than this size in internal memory, while allocations larger than this will be\ndone from external RAM. If allocation from the preferred region fails, an attempt is made to allocate\nfrom the non-preferred region instead, so malloc() will not suddenly fail when either internal or\nexternal memory is full.", + "id": "SPIRAM_MALLOC_ALWAYSINTERNAL", + "name": "SPIRAM_MALLOC_ALWAYSINTERNAL", + "range": null, + "title": "Maximum malloc() size, in bytes, to always put in internal memory", + "type": "int" + }, + { + "children": [], + "depends_on": "(SPIRAM_USE_CAPS_ALLOC || SPIRAM_USE_MALLOC) && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "Try to allocate memories of WiFi and LWIP in SPIRAM firstly. If failed, try to allocate internal\nmemory then.", + "id": "SPIRAM_TRY_ALLOCATE_WIFI_LWIP", + "name": "SPIRAM_TRY_ALLOCATE_WIFI_LWIP", + "range": null, + "title": "Try to allocate memories of WiFi and LWIP in SPIRAM firstly. If failed, allocate internal memory", + "type": "bool" + }, + { + "children": [], + "depends_on": "SPIRAM_USE_MALLOC && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "Because the external/internal RAM allocation strategy is not always perfect, it sometimes may happen\nthat the internal memory is entirely filled up. This causes allocations that are specifically done in\ninternal memory, for example the stack for new tasks or memory to service DMA or have memory that's\nalso available when SPI cache is down, to fail. This option reserves a pool specifically for requests\nlike that; the memory in this pool is not given out when a normal malloc() is called.\n\nSet this to 0 to disable this feature.\n\nNote that because FreeRTOS stacks are forced to internal memory, they will also use this memory pool;\nbe sure to keep this in mind when adjusting this value.\n\nNote also that the DMA reserved pool may not be one single contiguous memory region, depending on the\nconfigured size and the static memory usage of the app.", + "id": "SPIRAM_MALLOC_RESERVE_INTERNAL", + "name": "SPIRAM_MALLOC_RESERVE_INTERNAL", + "range": null, + "title": "Reserve this amount of bytes for data that specifically needs to be in DMA or internal memory", + "type": "int" + }, + { + "children": [], + "depends_on": "SPIRAM && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "If enabled, variables with EXT_RAM_BSS_ATTR attribute will be placed in SPIRAM instead of internal DRAM.\nBSS section of `lwip`, `net80211`, `pp`, `bt` libraries will be automatically placed\nin SPIRAM. BSS sections from other object files and libraries can also be placed in SPIRAM through\nlinker fragment scheme `extram_bss`.\n\nNote that the variables placed in SPIRAM using EXT_RAM_BSS_ATTR will be zero initialized.", + "id": "SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY", + "name": "SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY", + "range": null, + "title": "Allow .bss segment placed in external memory", + "type": "bool" + }, + { + "children": [], + "depends_on": "SPIRAM && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "If enabled, noinit variables can be placed in PSRAM using EXT_RAM_NOINIT_ATTR.\n\nNote the values placed into this section will not be initialized at startup and should keep its value\nafter software restart.", + "id": "SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY", + "name": "SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY", + "range": null, + "title": "Allow .noinit segment placed in external memory", + "type": "bool" + }, + { + "children": [], + "depends_on": "(SPIRAM_USE_MEMMAP || SPIRAM_USE_CAPS_ALLOC || SPIRAM_USE_MALLOC) && ESP32_REV_MIN_FULL < 300 && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "Revision 1 of the ESP32 has a bug that can cause a write to PSRAM not to take place in some situations\nwhen the cache line needs to be fetched from external RAM and an interrupt occurs. This enables a\nfix in the compiler (-mfix-esp32-psram-cache-issue) that makes sure the specific code that is\nvulnerable to this will not be emitted.\n\nThis will also not use any bits of newlib that are located in ROM, opting for a version that is\ncompiled with the workaround and located in flash instead.\n\nThe workaround is not required for ESP32 revision 3 and above.", + "id": "SPIRAM_CACHE_WORKAROUND", + "name": "SPIRAM_CACHE_WORKAROUND", + "range": null, + "title": "Enable workaround for bug in SPI RAM cache for Rev1 ESP32s", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "SPIRAM_CACHE_WORKAROUND_STRATEGY_MEMW", + "name": "SPIRAM_CACHE_WORKAROUND_STRATEGY_MEMW", + "range": null, + "title": "Insert memw after vulnerable instructions (default)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "SPIRAM_CACHE_WORKAROUND_STRATEGY_DUPLDST", + "name": "SPIRAM_CACHE_WORKAROUND_STRATEGY_DUPLDST", + "range": null, + "title": "Duplicate LD/ST for 32-bit, memw for 8/16 bit", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "SPIRAM_CACHE_WORKAROUND_STRATEGY_NOPS", + "name": "SPIRAM_CACHE_WORKAROUND_STRATEGY_NOPS", + "range": null, + "title": "Insert nops between vulnerable loads/stores (old strategy, obsolete)", + "type": "bool" + } + ], + "depends_on": "SPIRAM_CACHE_WORKAROUND && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "Select the workaround strategy. Note that the strategy for precompiled\nlibraries (libgcc, newlib, bt, wifi) is not affected by this selection.\n\nUnless you know you need a different strategy, it's suggested you stay\nwith the default MEMW strategy. Note that DUPLDST can interfere with hardware\nencryption and this will be automatically disabled if this workaround is selected.\n'Insert nops' is the workaround that was used in older esp-idf versions. This workaround\nstill can cause faulty data transfers from/to SPI RAM in some situation.", + "id": "component-config-esp-psram-support-for-external-spi-connected-ram-spi-ram-config-spiram-cache-workaround-debugging-workaround-strategy", + "name": "SPIRAM_CACHE_WORKAROUND_STRATEGY", + "title": "Workaround strategy", + "type": "choice" + }, + { + "children": [], + "depends_on": "SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": null, + "id": "SPIRAM_WORKAROUND_NEED_VOLATILE_SPINLOCK", + "name": "SPIRAM_WORKAROUND_NEED_VOLATILE_SPINLOCK", + "range": null, + "title": null, + "type": "bool" + } + ], + "depends_on": "SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "id": "component-config-esp-psram-support-for-external-spi-connected-ram-spi-ram-config-spiram-cache-workaround-debugging", + "title": "SPIRAM cache workaround debugging", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SPIRAM_CACHE_WORKAROUND && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "The functions affected by this option are: longjmp and setjmp.\nPutting these function in IRAM will allow them to be called when flash cache is disabled\nbut it will also reduce the available size of free IRAM for the user application.", + "id": "SPIRAM_CACHE_LIBJMP_IN_IRAM", + "name": "SPIRAM_CACHE_LIBJMP_IN_IRAM", + "range": null, + "title": "Put libc's jump related functions in IRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "SPIRAM_CACHE_WORKAROUND && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "The functions affected by this option are: abs, div, labs, ldiv, quorem, fpclassify,\nand nan.\nPutting these function in IRAM will allow them to be called when flash cache is disabled\nbut it will also reduce the available size of free IRAM for the user application.", + "id": "SPIRAM_CACHE_LIBMATH_IN_IRAM", + "name": "SPIRAM_CACHE_LIBMATH_IN_IRAM", + "range": null, + "title": "Put libc's math related functions in IRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "SPIRAM_CACHE_WORKAROUND && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "The functions affected by this option are: utoa, itoa, atoi, atol, strtol, and strtoul.\nPutting these function in IRAM will allow them to be called when flash cache is disabled\nbut it will also reduce the available size of free IRAM for the user application.", + "id": "SPIRAM_CACHE_LIBNUMPARSER_IN_IRAM", + "name": "SPIRAM_CACHE_LIBNUMPARSER_IN_IRAM", + "range": null, + "title": "Put libc's number parsing related functions in IRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "SPIRAM_CACHE_WORKAROUND && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "The functions affected by this option are: wcrtomb, fvwrite, wbuf, wsetup, fputwc, wctomb_r,\nungetc, makebuf, fflush, refill, and sccl.\nPutting these function in IRAM will allow them to be called when flash cache is disabled\nbut it will also reduce the available size of free IRAM for the user application.", + "id": "SPIRAM_CACHE_LIBIO_IN_IRAM", + "name": "SPIRAM_CACHE_LIBIO_IN_IRAM", + "range": null, + "title": "Put libc's I/O related functions in IRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "SPIRAM_CACHE_WORKAROUND && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "The functions affected by this option are: asctime, asctime_r, ctime, ctime_r, lcltime, lcltime_r,\ngmtime, gmtime_r, strftime, mktime, tzset_r, tzset, time, gettzinfo, systimes, month_lengths,\ntimelocal, tzvars, tzlock, tzcalc_limits, and strptime.\nPutting these function in IRAM will allow them to be called when flash cache is disabled\nbut it will also reduce the available size of free IRAM for the user application.", + "id": "SPIRAM_CACHE_LIBTIME_IN_IRAM", + "name": "SPIRAM_CACHE_LIBTIME_IN_IRAM", + "range": null, + "title": "Put libc's time related functions in IRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "SPIRAM_CACHE_WORKAROUND && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "The functions affected by this option are: ctype_, toupper, tolower, toascii, strupr, bzero,\nisalnum, isalpha, isascii, isblank, iscntrl, isdigit, isgraph, islower, isprint, ispunct,\nisspace, and isupper.\nPutting these function in IRAM will allow them to be called when flash cache is disabled\nbut it will also reduce the available size of free IRAM for the user application.", + "id": "SPIRAM_CACHE_LIBCHAR_IN_IRAM", + "name": "SPIRAM_CACHE_LIBCHAR_IN_IRAM", + "range": null, + "title": "Put libc's characters related functions in IRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "SPIRAM_CACHE_WORKAROUND && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "The functions affected by this option are: memccpy, memchr memmove, and memrchr.\nPutting these function in IRAM will allow them to be called when flash cache is disabled\nbut it will also reduce the available size of free IRAM for the user application.", + "id": "SPIRAM_CACHE_LIBMEM_IN_IRAM", + "name": "SPIRAM_CACHE_LIBMEM_IN_IRAM", + "range": null, + "title": "Put libc's memory related functions in IRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "SPIRAM_CACHE_WORKAROUND && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "The functions affected by this option are: strcasecmp, strcasestr, strchr, strcoll,\nstrcpy, strcspn, strdup, strdup_r, strlcat, strlcpy, strlen, strlwr, strncasecmp,\nstrncat, strncmp, strncpy, strndup, strndup_r, strrchr, strsep, strspn, strstr,\nstrtok_r, and strupr.\nPutting these function in IRAM will allow them to be called when flash cache is disabled\nbut it will also reduce the available size of free IRAM for the user application.", + "id": "SPIRAM_CACHE_LIBSTR_IN_IRAM", + "name": "SPIRAM_CACHE_LIBSTR_IN_IRAM", + "range": null, + "title": "Put libc's string related functions in IRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "SPIRAM_CACHE_WORKAROUND && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "The functions affected by this option are: srand, rand, and rand_r.\nPutting these function in IRAM will allow them to be called when flash cache is disabled\nbut it will also reduce the available size of free IRAM for the user application.", + "id": "SPIRAM_CACHE_LIBRAND_IN_IRAM", + "name": "SPIRAM_CACHE_LIBRAND_IN_IRAM", + "range": null, + "title": "Put libc's random related functions in IRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "SPIRAM_CACHE_WORKAROUND && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "The functions affected by this option are: environ, envlock, and getenv_r.\nPutting these function in IRAM will allow them to be called when flash cache is disabled\nbut it will also reduce the available size of free IRAM for the user application.", + "id": "SPIRAM_CACHE_LIBENV_IN_IRAM", + "name": "SPIRAM_CACHE_LIBENV_IN_IRAM", + "range": null, + "title": "Put libc's environment related functions in IRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "SPIRAM_CACHE_WORKAROUND && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "The functions affected by this option are: lock, isatty, fclose, open, close, creat, read,\nrshift, sbrk, stdio, syssbrk, sysclose, sysopen, creat, sysread, syswrite, impure, fwalk,\nand findfp.\nPutting these function in IRAM will allow them to be called when flash cache is disabled\nbut it will also reduce the available size of free IRAM for the user application.", + "id": "SPIRAM_CACHE_LIBFILE_IN_IRAM", + "name": "SPIRAM_CACHE_LIBFILE_IN_IRAM", + "range": null, + "title": "Put libc's file related functions in IRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "SPIRAM_CACHE_WORKAROUND && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "The functions affected by this option are: raise and system\nPutting these function in IRAM will allow them to be called when flash cache is disabled\nbut it will also reduce the available size of free IRAM for the user application.", + "id": "SPIRAM_CACHE_LIBMISC_IN_IRAM", + "name": "SPIRAM_CACHE_LIBMISC_IN_IRAM", + "range": null, + "title": "Put libc's miscellaneous functions in IRAM, see help", + "type": "bool" + } + ], + "depends_on": "SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "id": "component-config-esp-psram-support-for-external-spi-connected-ram-spi-ram-config-spiram-workaround-libraries-placement", + "title": "SPIRAM workaround libraries placement", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SPIRAM_BANKSWITCH_ENABLE && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "Select the amount of banks reserved for bank switching. Note that the amount of RAM allocatable with\nmalloc/esp_heap_alloc_caps will decrease by 32K for each page reserved here.\n\nNote that this reservation is only actually done if your program actually uses the himem API. Without\nany himem calls, the reservation is not done and the original amount of memory will be available\nto malloc/esp_heap_alloc_caps.", + "id": "SPIRAM_BANKSWITCH_RESERVE", + "name": "SPIRAM_BANKSWITCH_RESERVE", + "range": null, + "title": "Amount of 32K pages to reserve for bank switching", + "type": "int" + } + ], + "depends_on": "(SPIRAM_USE_MEMMAP || SPIRAM_USE_CAPS_ALLOC || SPIRAM_USE_MALLOC) && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "The ESP32 only supports 4MiB of external RAM in its address space. The hardware does support larger\nmemories, but these have to be bank-switched in and out of this address space. Enabling this allows you\nto reserve some MMU pages for this, which allows the use of the esp_himem api to manage these banks.\n\n#Note that this is limited to 62 banks, as esp_psram_extram_writeback_cache needs some kind of mapping of\n#some banks below that mark to work. We cannot at this moment guarantee this to exist when himem is\n#enabled.\n\nIf spiram 2T mode is enabled, the size of 64Mbit psram will be changed as 32Mbit, so himem will be\nunusable.", + "id": "SPIRAM_BANKSWITCH_ENABLE", + "name": "SPIRAM_BANKSWITCH_ENABLE", + "range": null, + "title": "Enable bank switching for >4MiB external RAM", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "SPIRAM_OCCUPY_HSPI_HOST", + "name": "SPIRAM_OCCUPY_HSPI_HOST", + "range": null, + "title": "HSPI host (SPI2)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "SPIRAM_OCCUPY_VSPI_HOST", + "name": "SPIRAM_OCCUPY_VSPI_HOST", + "range": null, + "title": "VSPI host (SPI3)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "SPIRAM_OCCUPY_NO_HOST", + "name": "SPIRAM_OCCUPY_NO_HOST", + "range": null, + "title": "Will not try to use any host, will abort if not able to use the PSRAM", + "type": "bool" + } + ], + "depends_on": "SPIRAM_SPEED_80M && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "When both flash and PSRAM is working under 80MHz, and the PSRAM is of type 32MBit, one of the HSPI/VSPI\nhost will be used to output the clock. Select which one to use here.", + "id": "component-config-esp-psram-support-for-external-spi-connected-ram-spi-ram-config-spi-host-to-use-for-32mbit-psram", + "name": "SPIRAM_OCCUPY_SPI_HOST", + "title": "SPI host to use for 32MBit PSRAM", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "SPIRAM && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "The PSRAM CLOCK IO can be any unused GPIO, user can config it based on hardware design. If user use\n1.8V flash and 1.8V psram, this value can only be one of 6, 7, 8, 9, 10, 11, 16, 17.\n\nIf configured to the same pin as Flash, PSRAM shouldn't be rev0. Contact Espressif for more\ninformation.", + "id": "D0WD_PSRAM_CLK_IO", + "name": "D0WD_PSRAM_CLK_IO", + "range": null, + "title": "PSRAM CLK IO number", + "type": "int" + }, + { + "children": [], + "depends_on": "SPIRAM && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "The PSRAM CS IO can be any unused GPIO, user can config it based on hardware design. If user use\n1.8V flash and 1.8V psram, this value can only be one of 6, 7, 8, 9, 10, 11, 16, 17.", + "id": "D0WD_PSRAM_CS_IO", + "name": "D0WD_PSRAM_CS_IO", + "range": null, + "title": "PSRAM CS IO number", + "type": "int" + } + ], + "depends_on": "SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "id": "component-config-esp-psram-support-for-external-spi-connected-ram-spi-ram-config-psram-clock-and-cs-io-for-esp32-dowd", + "title": "PSRAM clock and cs IO for ESP32-DOWD", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SPIRAM && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "User can config it based on hardware design. For ESP32-D2WD chip, the psram can only be 1.8V psram,\nso this value can only be one of 6, 7, 8, 9, 10, 11, 16, 17.\n\nIf configured to the same pin (GPIO6) as Flash, PSRAM shouldn't be rev0. Contact Espressif for more\ninformation.", + "id": "D2WD_PSRAM_CLK_IO", + "name": "D2WD_PSRAM_CLK_IO", + "range": null, + "title": "PSRAM CLK IO number", + "type": "int" + }, + { + "children": [], + "depends_on": "SPIRAM && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "User can config it based on hardware design. For ESP32-D2WD chip, the psram can only be 1.8V psram,\nso this value can only be one of 6, 7, 8, 9, 10, 11, 16, 17.", + "id": "D2WD_PSRAM_CS_IO", + "name": "D2WD_PSRAM_CS_IO", + "range": null, + "title": "PSRAM CS IO number", + "type": "int" + } + ], + "depends_on": "SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "id": "component-config-esp-psram-support-for-external-spi-connected-ram-spi-ram-config-psram-clock-and-cs-io-for-esp32-d2wd", + "title": "PSRAM clock and cs IO for ESP32-D2WD", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SPIRAM && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "The PSRAM CS IO can be any unused GPIO, user can config it based on hardware design.\n\nFor ESP32-PICO chip, the psram share clock with flash, so user do not need to configure the clock\nIO.\nFor the reference hardware design, please refer to\nhttps://www.espressif.com/sites/default/files/documentation/esp32-pico-d4_datasheet_en.pdf", + "id": "PICO_PSRAM_CS_IO", + "name": "PICO_PSRAM_CS_IO", + "range": null, + "title": "PSRAM CS IO number", + "type": "int" + } + ], + "depends_on": "SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "id": "component-config-esp-psram-support-for-external-spi-connected-ram-spi-ram-config-psram-clock-and-cs-io-for-esp32-pico-d4", + "title": "PSRAM clock and cs IO for ESP32-PICO-D4", + "type": "menu" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ESP32 && (ESPTOOLPY_FLASHMODE_DIO || ESPTOOLPY_FLASHMODE_DOUT) && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "This setting is only used if the SPI flash pins have been overridden by setting the eFuses\nSPI_PAD_CONFIG_xxx, and the SPI flash mode is DIO or DOUT.\n\nWhen this is the case, the eFuse config only defines 3 of the 4 Quad I/O data pins. The WP pin (aka\nESP32 pin \"SD_DATA_3\" or SPI flash pin \"IO2\") is not specified in eFuse. The psram only has QPI\nmode, so a WP pin setting is necessary.\n\nIf this config item is set to N (default), the correct WP pin will be automatically used for any\nEspressif chip or module with integrated flash. If a custom setting is needed, set this config item\nto Y and specify the GPIO number connected to the WP pin.\n\nWhen flash mode is set to QIO or QOUT, the PSRAM WP pin will be set the same as the SPI Flash WP pin\nconfigured in the bootloader.", + "id": "SPIRAM_CUSTOM_SPIWP_SD3_PIN", + "name": "SPIRAM_CUSTOM_SPIWP_SD3_PIN", + "range": null, + "title": "Use custom SPI PSRAM WP(SD3) Pin when flash pins set in eFuse (read help)", + "type": "bool" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ESP32 && (ESPTOOLPY_FLASHMODE_DIO || ESPTOOLPY_FLASHMODE_DOUT) && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "The option \"Use custom SPI PSRAM WP(SD3) pin\" must be set or this value is ignored\n\nIf burning a customized set of SPI flash pins in eFuse and using DIO or DOUT mode for flash, set this\nvalue to the GPIO number of the SPIRAM WP pin.", + "id": "SPIRAM_SPIWP_SD3_PIN", + "name": "SPIRAM_SPIWP_SD3_PIN", + "range": null, + "title": "Custom SPI PSRAM WP(SD3) Pin", + "type": "int" + }, + { + "children": [], + "depends_on": "SPIRAM && SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "Enable this option to fix single bit errors inside 64Mbit PSRAM.\n\nSome 64Mbit PSRAM chips have a hardware issue in the RAM which causes bit errors at multiple\nfixed bit positions.\n\nNote: If this option is enabled, the 64Mbit PSRAM chip will appear to be 32Mbit in size.\nApplications will not be affected unless the use the esp_himem APIs, which are not supported\nin 2T mode.", + "id": "SPIRAM_2T_MODE", + "name": "SPIRAM_2T_MODE", + "range": null, + "title": "Enable SPI PSRAM 2T mode", + "type": "bool" + } + ], + "depends_on": "SPIRAM && !APP_BUILD_TYPE_PURE_RAM_APP", + "id": "component-config-esp-psram-support-for-external-spi-connected-ram-spi-ram-config", + "title": "SPI RAM config", + "type": "menu" + } + ], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "This enables support for an external SPI RAM chip, connected in parallel with the\nmain SPI flash chip.", + "id": "SPIRAM", + "name": "SPIRAM", + "range": null, + "title": "Support for external, SPI-connected RAM", + "type": "bool" + } + ], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "id": "component-config-esp-psram", + "title": "ESP PSRAM", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "RINGBUF_PLACE_FUNCTIONS_INTO_FLASH", + "help": "Place ISR ringbuf functions (like xRingbufferSendFromISR/xRingbufferReceiveFromISR) into flash.\nThis frees up IRAM, but the functions can no longer be called when the cache is disabled\nor from an IRAM interrupt context.\n\nThis option is not compatible with ESP-IDF drivers which are configured to\nrun the ISR from an IRAM context, e.g. CONFIG_UART_ISR_IN_IRAM.", + "id": "RINGBUF_PLACE_ISR_FUNCTIONS_INTO_FLASH", + "name": "RINGBUF_PLACE_ISR_FUNCTIONS_INTO_FLASH", + "range": null, + "title": "Place ISR ringbuf functions into flash", + "type": "bool" + } + ], + "depends_on": null, + "help": "Place non-ISR ringbuf functions (like xRingbufferCreate/xRingbufferSend) into flash.\nThis frees up IRAM, but the functions can no longer be called when the cache is disabled.", + "id": "RINGBUF_PLACE_FUNCTIONS_INTO_FLASH", + "name": "RINGBUF_PLACE_FUNCTIONS_INTO_FLASH", + "range": null, + "title": "Place non-ISR ringbuf functions into flash", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-esp-ringbuf", + "title": "ESP Ringbuf", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_CRYPTO_DPA_PROTECTION_LEVEL_LOW", + "name": "ESP_CRYPTO_DPA_PROTECTION_LEVEL_LOW", + "range": null, + "title": "Security level low", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_CRYPTO_DPA_PROTECTION_LEVEL_MEDIUM", + "name": "ESP_CRYPTO_DPA_PROTECTION_LEVEL_MEDIUM", + "range": null, + "title": "Security level medium", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_CRYPTO_DPA_PROTECTION_LEVEL_HIGH", + "name": "ESP_CRYPTO_DPA_PROTECTION_LEVEL_HIGH", + "range": null, + "title": "Security level high", + "type": "bool" + } + ], + "depends_on": "ESP_CRYPTO_DPA_PROTECTION_AT_STARTUP && SOC_CRYPTO_DPA_PROTECTION_SUPPORTED", + "help": "Configure the DPA protection security level", + "id": "component-config-esp-security-specific-crypto-dpa-protection-enable-crypto-dpa-protection-at-startup-dpa-protection-level", + "name": "ESP_CRYPTO_DPA_PROTECTION_LEVEL", + "title": "DPA protection level", + "type": "choice" + } + ], + "depends_on": "SOC_CRYPTO_DPA_PROTECTION_SUPPORTED", + "help": "This config controls the DPA (Differential Power Analysis) protection\nknob for the crypto peripherals. DPA protection dynamically adjusts\nclock frequency of the crypto peripheral. DPA protection helps to make it\ndifficult to perform SCA attacks on the crypto peripherals. However,\nthere is also associated performance impact based on the security level\nset. Please refer to the TRM for more details.", + "id": "ESP_CRYPTO_DPA_PROTECTION_AT_STARTUP", + "name": "ESP_CRYPTO_DPA_PROTECTION_AT_STARTUP", + "range": null, + "title": "Enable crypto DPA protection at startup", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_CRYPTO_DPA_PROTECTION_SUPPORTED", + "help": null, + "id": "ESP_CRYPTO_DPA_PROTECTION_LEVEL", + "name": "ESP_CRYPTO_DPA_PROTECTION_LEVEL", + "range": null, + "title": null, + "type": "int" + } + ], + "depends_on": "SOC_CRYPTO_DPA_PROTECTION_SUPPORTED", + "id": "component-config-esp-security-specific-crypto-dpa-protection", + "title": "Crypto DPA Protection", + "type": "menu" + }, + { + "children": [], + "depends_on": "SOC_ECC_CONSTANT_TIME_POINT_MUL", + "help": "If enabled, the app startup code will burn the ECC_FORCE_CONST_TIME efuse bit to force the\nECC peripheral to always perform constant time point multiplication operations,\nirrespective of the ECC_MULT_SECURITY_MODE status bit that is present in the ECC_MULT_CONF_REG\nregister. By default, ESP-IDF configures the ECC peripheral to perform constant time point\nmultiplication operations, so enabling this config would provide security enhancement only in\nthe cases when trusted boot is not enabled and the attacker tries carrying out non-constant\ntime point multiplication operations by changing the default ESP-IDF configurations.\nPerforming constant time operations protect the ECC multiplication operations from timing attacks.", + "id": "ESP_CRYPTO_FORCE_ECC_CONSTANT_TIME_POINT_MUL", + "name": "ESP_CRYPTO_FORCE_ECC_CONSTANT_TIME_POINT_MUL", + "range": null, + "title": "Forcefully enable ECC constant time point multiplication operations", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-esp-security-specific", + "title": "ESP Security Specific", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "IDF_ENV_FPGA && ", + "help": null, + "id": "ESP_DEFAULT_CPU_FREQ_MHZ_40", + "name": "ESP_DEFAULT_CPU_FREQ_MHZ_40", + "range": null, + "title": "40 MHz", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_DEFAULT_CPU_FREQ_MHZ_80", + "name": "ESP_DEFAULT_CPU_FREQ_MHZ_80", + "range": null, + "title": "80 MHz", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_DEFAULT_CPU_FREQ_MHZ_160", + "name": "ESP_DEFAULT_CPU_FREQ_MHZ_160", + "range": null, + "title": "160 MHz", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_DEFAULT_CPU_FREQ_MHZ_240", + "name": "ESP_DEFAULT_CPU_FREQ_MHZ_240", + "range": null, + "title": "240 MHz", + "type": "bool" + } + ], + "depends_on": null, + "help": "CPU frequency to be set on application startup.", + "id": "component-config-esp-system-settings-cpu-frequency", + "name": "ESP_DEFAULT_CPU_FREQ_MHZ", + "title": "CPU frequency", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_DEFAULT_CPU_FREQ_MHZ", + "name": "ESP_DEFAULT_CPU_FREQ_MHZ", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_SYSTEM_SINGLE_CORE_MODE", + "help": "This option allows to place .rtc_data and .rtc_rodata sections into\nRTC fast memory segment to free the slow memory region for ULP programs.\nThis option depends on the CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE option because RTC fast memory\ncan be accessed only by PRO_CPU core.", + "id": "ESP32_RTCDATA_IN_FAST_MEM", + "name": "ESP32_RTCDATA_IN_FAST_MEM", + "range": null, + "title": "Place RTC_DATA_ATTR and RTC_RODATA_ATTR variables into RTC fast memory segment", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP32_USE_FIXED_STATIC_RAM_SIZE", + "help": "RAM size dedicated for static variables (.data & .bss sections).\nPlease note that the actual length will be reduced by BTDM_RESERVE_DRAM if Bluetooth\ncontroller is enabled.", + "id": "ESP32_FIXED_STATIC_RAM_SIZE", + "name": "ESP32_FIXED_STATIC_RAM_SIZE", + "range": null, + "title": "Fixed Static RAM size", + "type": "hex" + } + ], + "depends_on": null, + "help": "If this option is disabled, the DRAM part of the heap starts right after the .bss section,\nwithin the dram0_0 region. As a result, adding or removing some static variables\nwill change the available heap size.\n\nIf this option is enabled, the DRAM part of the heap starts right after the dram0_0 region,\nwhere its length is set with ESP32_FIXED_STATIC_RAM_SIZE", + "id": "ESP32_USE_FIXED_STATIC_RAM_SIZE", + "name": "ESP32_USE_FIXED_STATIC_RAM_SIZE", + "range": null, + "title": "Use fixed static RAM size", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_SYSTEM_SINGLE_CORE_MODE", + "help": "If enabled, application can use IRAM as byte accessible region for storing data\n(Note: IRAM region cannot be used as task stack)\n\nThis is possible due to handling of exceptions `LoadStoreError (3)` and `LoadStoreAlignmentError (9)`\nEach unaligned read/write access will incur a penalty of maximum of 167 CPU cycles.", + "id": "ESP32_IRAM_AS_8BIT_ACCESSIBLE_MEMORY", + "name": "ESP32_IRAM_AS_8BIT_ACCESSIBLE_MEMORY", + "range": null, + "title": "Enable IRAM as 8 bit accessible memory", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "!ESP32_TRAX", + "help": "Reserve parts of SRAM1 for app IRAM which was previously reserved for bootloader DRAM.\nIf booting an app on an older bootloader from before this option was introduced, the app will fail\nto boot due to not recognizing the new IRAM memory area.\n\nIf this is the case please test carefully before pushing out any OTA updates.", + "id": "ESP_SYSTEM_ESP32_SRAM1_REGION_AS_IRAM", + "name": "ESP_SYSTEM_ESP32_SRAM1_REGION_AS_IRAM", + "range": null, + "title": "Reserve parts of SRAM1 for app IRAM (WARNING, read help before enabling)", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-esp-system-settings-memory-non-backward-compatible-options", + "title": "Non-backward compatible options", + "type": "menu" + } + ], + "depends_on": null, + "id": "component-config-esp-system-settings-memory", + "title": "Memory", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP32_MEMMAP_TRACEMEM", + "name": "ESP32_MEMMAP_TRACEMEM", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP32_MEMMAP_TRACEMEM_TWOBANKS", + "name": "ESP32_MEMMAP_TRACEMEM_TWOBANKS", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP32_TRAX && !ESP_SYSTEM_SINGLE_CORE_MODE", + "help": "The ESP32 contains a feature which allows you to trace the execution path the processor\nhas taken through the program. This is stored in a chunk of 32K (16K for single-processor)\nof memory that can't be used for general purposes anymore. Disable this if you do not know\nwhat this is.\n\n# Memory to reverse for trace, used in linker script", + "id": "ESP32_TRAX_TWOBANKS", + "name": "ESP32_TRAX_TWOBANKS", + "range": null, + "title": "Reserve memory for tracing both pro as well as app cpu execution", + "type": "bool" + } + ], + "depends_on": null, + "help": "The ESP32 contains a feature which allows you to trace the execution path the processor\nhas taken through the program. This is stored in a chunk of 32K (16K for single-processor)\nof memory that can't be used for general purposes anymore. Disable this if you do not know\nwhat this is.", + "id": "ESP32_TRAX", + "name": "ESP32_TRAX", + "range": null, + "title": "Use TRAX tracing feature", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP32_TRACEMEM_RESERVE_DRAM", + "name": "ESP32_TRACEMEM_RESERVE_DRAM", + "range": null, + "title": null, + "type": "hex" + } + ], + "depends_on": null, + "id": "component-config-esp-system-settings-trace-memory", + "title": "Trace memory", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "!ESP_SYSTEM_GDBSTUB_RUNTIME && ", + "help": "Outputs the relevant registers over the serial port and halt the\nprocessor. Needs a manual reset to restart.", + "id": "ESP_SYSTEM_PANIC_PRINT_HALT", + "name": "ESP_SYSTEM_PANIC_PRINT_HALT", + "range": null, + "title": "Print registers and halt", + "type": "bool" + }, + { + "children": [], + "depends_on": "!ESP_SYSTEM_GDBSTUB_RUNTIME && ", + "help": "Outputs the relevant registers over the serial port and immediately\nreset the processor.", + "id": "ESP_SYSTEM_PANIC_PRINT_REBOOT", + "name": "ESP_SYSTEM_PANIC_PRINT_REBOOT", + "range": null, + "title": "Print registers and reboot", + "type": "bool" + }, + { + "children": [], + "depends_on": "!ESP_SYSTEM_GDBSTUB_RUNTIME && ", + "help": "Just resets the processor without outputting anything", + "id": "ESP_SYSTEM_PANIC_SILENT_REBOOT", + "name": "ESP_SYSTEM_PANIC_SILENT_REBOOT", + "range": null, + "title": "Silent reboot", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_GDBSTUB_ENABLED && ", + "help": "Invoke gdbstub on the serial port, allowing for gdb to attach to it to do a postmortem\nof the crash.", + "id": "ESP_SYSTEM_PANIC_GDBSTUB", + "name": "ESP_SYSTEM_PANIC_GDBSTUB", + "range": null, + "title": "GDBStub on panic", + "type": "bool" + } + ], + "depends_on": null, + "help": "If FreeRTOS detects unexpected behaviour or an unhandled exception, the panic handler is\ninvoked. Configure the panic handler's action here.", + "id": "component-config-esp-system-settings-panic-handler-behaviour", + "name": "ESP_SYSTEM_PANIC", + "title": "Panic handler behaviour", + "type": "choice" + }, + { + "children": [], + "depends_on": "ESP_SYSTEM_PANIC_PRINT_REBOOT", + "help": "After the panic handler executes, you can specify a number of seconds to\nwait before the device reboots.", + "id": "ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS", + "name": "ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS", + "range": [ + 0, + 99 + ], + "title": "Panic reboot delay (Seconds)", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Only initialize and use the main core.", + "id": "ESP_SYSTEM_SINGLE_CORE_MODE", + "name": "ESP_SYSTEM_SINGLE_CORE_MODE", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_SYSTEM_RTC_EXT_XTAL", + "name": "ESP_SYSTEM_RTC_EXT_XTAL", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_SYSTEM_RTC_EXT_OSC", + "name": "ESP_SYSTEM_RTC_EXT_OSC", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_SYSTEM_RTC_EXT_XTAL", + "help": "To reduce the startup time of an external RTC crystal,\nwe bootstrap it with a 32kHz square wave for a fixed number of cycles.\nSetting 0 will disable bootstrapping (if disabled, the crystal may take\nlonger to start up or fail to oscillate under some conditions).\n\nIf this value is too high, a faulty crystal may initially start and then fail.\nIf this value is too low, an otherwise good crystal may not start.\n\nTo accurately determine if the crystal has started,\nset a larger \"Number of cycles for RTC_SLOW_CLK calibration\" (about 3000).", + "id": "ESP_SYSTEM_RTC_EXT_XTAL_BOOTSTRAP_CYCLES", + "name": "ESP_SYSTEM_RTC_EXT_XTAL_BOOTSTRAP_CYCLES", + "range": null, + "title": "Bootstrap cycles for external 32kHz crystal", + "type": "int" + }, + { + "children": [], + "depends_on": "SOC_RTC_FAST_MEM_SUPPORTED", + "help": null, + "id": "ESP_SYSTEM_RTC_FAST_MEM_AS_HEAP_DEPCHECK", + "name": "ESP_SYSTEM_RTC_FAST_MEM_AS_HEAP_DEPCHECK", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_SYSTEM_RTC_FAST_MEM_AS_HEAP_DEPCHECK", + "help": "This config option allows to add RTC fast memory region to system heap with capability\nsimilar to that of DRAM region but without DMA. Speed wise RTC fast memory operates on\nAPB clock and hence does not have much performance impact.", + "id": "ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP", + "name": "ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP", + "range": null, + "title": "Enable RTC fast memory for dynamic allocations", + "type": "bool" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ARCH_RISCV", + "help": "Generate DWARF information for each function of the project. These information will parsed and used to\nperform backtracing when panics occur. Activating this option will activate asynchronous frame unwinding\nand generation of both .eh_frame and .eh_frame_hdr sections, resulting in a bigger binary size (20% to\n100% larger). The main purpose of this option is to be able to have a backtrace parsed and printed by\nthe program itself, regardless of the serial monitor used.\nThis option shall NOT be used for production.", + "id": "ESP_SYSTEM_USE_EH_FRAME", + "name": "ESP_SYSTEM_USE_EH_FRAME", + "range": null, + "title": "Generate and use eh_frame for backtracing", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "IDF_TARGET_ARCH_RISCV && SOC_LP_CORE_SUPPORTED && ESP_SYSTEM_PMP_IDRAM_SPLIT", + "help": "If enabled, user can run code available in LP Core image.\n\nWarning: on ESP32-P4 this will also mark the memory area used for BOOTLOADER_RESERVE_RTC_MEM\nas executable. If you consider this a security risk then do not activate this option.", + "id": "ESP_SYSTEM_PMP_LP_CORE_RESERVE_MEM_EXECUTABLE", + "name": "ESP_SYSTEM_PMP_LP_CORE_RESERVE_MEM_EXECUTABLE", + "range": null, + "title": "Make LP core reserved memory executable from HP core", + "type": "bool" + } + ], + "depends_on": "SOC_CPU_IDRAM_SPLIT_USING_PMP", + "help": "If enabled, the CPU watches all the memory access and raises an exception in case\nof any memory violation. This feature automatically splits\nthe SRAM memory, using PMP, into data and instruction segments and sets Read/Execute permissions\nfor the instruction part (below given splitting address) and Read/Write permissions\nfor the data part (above the splitting address). The memory protection is effective\non all access through the IRAM0 and DRAM0 buses.", + "id": "ESP_SYSTEM_PMP_IDRAM_SPLIT", + "name": "ESP_SYSTEM_PMP_IDRAM_SPLIT", + "range": null, + "title": "Enable IRAM/DRAM split protection", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_SYSTEM_MEMPROT_FEATURE", + "help": "Once locked, memory protection settings cannot be changed anymore.\nThe lock is reset only on the chip startup.", + "id": "ESP_SYSTEM_MEMPROT_FEATURE_LOCK", + "name": "ESP_SYSTEM_MEMPROT_FEATURE_LOCK", + "range": null, + "title": "Lock memory protection settings", + "type": "bool" + } + ], + "depends_on": "SOC_MEMPROT_SUPPORTED", + "help": "If enabled, the permission control module watches all the memory access and fires the panic handler\nif a permission violation is detected. This feature automatically splits\nthe SRAM memory into data and instruction segments and sets Read/Execute permissions\nfor the instruction part (below given splitting address) and Read/Write permissions\nfor the data part (above the splitting address). The memory protection is effective\non all access through the IRAM0 and DRAM0 buses.", + "id": "ESP_SYSTEM_MEMPROT_FEATURE", + "name": "ESP_SYSTEM_MEMPROT_FEATURE", + "range": null, + "title": "Enable memory protection", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-esp-system-settings-memory-protection", + "title": "Memory protection", + "type": "menu" + }, + { + "children": [], + "depends_on": null, + "help": "Config system event queue size in different application.", + "id": "ESP_SYSTEM_EVENT_QUEUE_SIZE", + "name": "ESP_SYSTEM_EVENT_QUEUE_SIZE", + "range": null, + "title": "System event queue size", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Config system event task stack size in different application.", + "id": "ESP_SYSTEM_EVENT_TASK_STACK_SIZE", + "name": "ESP_SYSTEM_EVENT_TASK_STACK_SIZE", + "range": null, + "title": "Event loop task stack size", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Configure the \"main task\" stack size. This is the stack of the task\nwhich calls app_main(). If app_main() returns then this task is deleted\nand its stack memory is freed.", + "id": "ESP_MAIN_TASK_STACK_SIZE", + "name": "ESP_MAIN_TASK_STACK_SIZE", + "range": null, + "title": "Main task stack size", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_MAIN_TASK_AFFINITY_CPU0", + "name": "ESP_MAIN_TASK_AFFINITY_CPU0", + "range": null, + "title": "CPU0", + "type": "bool" + }, + { + "children": [], + "depends_on": "!FREERTOS_UNICORE && ", + "help": null, + "id": "ESP_MAIN_TASK_AFFINITY_CPU1", + "name": "ESP_MAIN_TASK_AFFINITY_CPU1", + "range": null, + "title": "CPU1", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_MAIN_TASK_AFFINITY_NO_AFFINITY", + "name": "ESP_MAIN_TASK_AFFINITY_NO_AFFINITY", + "range": null, + "title": "No affinity", + "type": "bool" + } + ], + "depends_on": null, + "help": "Configure the \"main task\" core affinity. This is the used core of the task\nwhich calls app_main(). If app_main() returns then this task is deleted.", + "id": "component-config-esp-system-settings-main-task-core-affinity", + "name": "ESP_MAIN_TASK_AFFINITY", + "title": "Main task core affinity", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_MAIN_TASK_AFFINITY", + "name": "ESP_MAIN_TASK_AFFINITY", + "range": null, + "title": null, + "type": "hex" + }, + { + "children": [], + "depends_on": null, + "help": "Minimal value of size, in bytes, accepted to execute a expression\nwith shared stack.", + "id": "ESP_MINIMAL_SHARED_STACK_SIZE", + "name": "ESP_MINIMAL_SHARED_STACK_SIZE", + "range": null, + "title": "Minimal allowed size for shared stack", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_CONSOLE_UART_DEFAULT", + "name": "ESP_CONSOLE_UART_DEFAULT", + "range": null, + "title": "Default: UART0", + "type": "bool" + }, + { + "children": [], + "depends_on": "(IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32S3) && !TINY_USB && ", + "help": null, + "id": "ESP_CONSOLE_USB_CDC", + "name": "ESP_CONSOLE_USB_CDC", + "range": null, + "title": "USB CDC", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_USB_SERIAL_JTAG_SUPPORTED && ", + "help": null, + "id": "ESP_CONSOLE_USB_SERIAL_JTAG", + "name": "ESP_CONSOLE_USB_SERIAL_JTAG", + "range": null, + "title": "USB Serial/JTAG Controller", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_CONSOLE_UART_CUSTOM", + "name": "ESP_CONSOLE_UART_CUSTOM", + "range": null, + "title": "Custom UART", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_CONSOLE_NONE", + "name": "ESP_CONSOLE_NONE", + "range": null, + "title": "None", + "type": "bool" + } + ], + "depends_on": null, + "help": "Select where to send console output (through stdout and stderr).\n\n- Default is to use UART0 on pre-defined GPIOs.\n- If \"Custom\" is selected, UART0 or UART1 can be chosen,\n and any pins can be selected.\n- If \"None\" is selected, there will be no console output on any UART, except\n for initial output from ROM bootloader. This ROM output can be suppressed by\n GPIO strapping or EFUSE, refer to chip datasheet for details.\n- On chips with USB OTG peripheral, \"USB CDC\" option redirects output to the\n CDC port. This option uses the CDC driver in the chip ROM.\n This option is incompatible with TinyUSB stack.\n- On chips with an USB serial/JTAG debug controller, selecting the option\n for that redirects output to the CDC/ACM (serial port emulation) component\n of that device.", + "id": "component-config-esp-system-settings-channel-for-console-output", + "name": "ESP_CONSOLE_UART", + "title": "Channel for console output", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_CONSOLE_SECONDARY_NONE", + "name": "ESP_CONSOLE_SECONDARY_NONE", + "range": null, + "title": "No secondary console", + "type": "bool" + }, + { + "children": [], + "depends_on": "!ESP_CONSOLE_USB_SERIAL_JTAG && ", + "help": "This option supports output through USB_SERIAL_JTAG port when the UART0 port is not connected.\nThe output currently only supports non-blocking mode without using the console.\nIf you want to output in blocking mode with REPL or input through USB_SERIAL_JTAG port,\nplease change the primary config to ESP_CONSOLE_USB_SERIAL_JTAG above.", + "id": "ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG", + "name": "ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG", + "range": null, + "title": "USB_SERIAL_JTAG PORT", + "type": "bool" + } + ], + "depends_on": "SOC_USB_SERIAL_JTAG_SUPPORTED", + "help": "This secondary option supports output through other specific port like USB_SERIAL_JTAG\nwhen UART0 port as a primary is selected but not connected. This secondary output currently only supports\nnon-blocking mode without using REPL. If you want to output in blocking mode with REPL or\ninput through this secondary port, please change the primary config to this port\nin `Channel for console output` menu.", + "id": "component-config-esp-system-settings-channel-for-console-secondary-output", + "name": "ESP_CONSOLE_SECONDARY", + "title": "Channel for console secondary output", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_CONSOLE_USB_SERIAL_JTAG_ENABLED", + "name": "ESP_CONSOLE_USB_SERIAL_JTAG_ENABLED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_CONSOLE_UART", + "name": "ESP_CONSOLE_UART", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_CONSOLE_UART_CUSTOM_NUM_0", + "name": "ESP_CONSOLE_UART_CUSTOM_NUM_0", + "range": null, + "title": "UART0", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_CONSOLE_UART_CUSTOM_NUM_1", + "name": "ESP_CONSOLE_UART_CUSTOM_NUM_1", + "range": null, + "title": "UART1", + "type": "bool" + } + ], + "depends_on": "ESP_CONSOLE_UART_CUSTOM", + "help": "This UART peripheral is used for console output from the ESP-IDF Bootloader and the app.\n\nIf the configuration is different in the Bootloader binary compared to the app binary, UART\nis reconfigured after the bootloader exits and the app starts.\n\nDue to an ESP32 ROM bug, UART2 is not supported for console output\nvia esp_rom_printf.", + "id": "component-config-esp-system-settings-uart-peripheral-to-use-for-console-output-0-1-", + "name": "ESP_CONSOLE_UART_NUM", + "title": "UART peripheral to use for console output (0-1)", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_CONSOLE_UART_NUM", + "name": "ESP_CONSOLE_UART_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_CONSOLE_ROM_SERIAL_PORT_NUM", + "name": "ESP_CONSOLE_ROM_SERIAL_PORT_NUM", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_CONSOLE_UART_CUSTOM", + "help": "This GPIO is used for console UART TX output in the ESP-IDF Bootloader and the app (including\nboot log output and default standard output and standard error of the app). Value -1 means to\ncontinue using the default console UART TX pin.\n\nIf the configuration is different in the Bootloader binary compared to the app binary, UART\nis reconfigured after the bootloader exits and the app starts.", + "id": "ESP_CONSOLE_UART_TX_GPIO", + "name": "ESP_CONSOLE_UART_TX_GPIO", + "range": null, + "title": "UART TX on GPIO", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_CONSOLE_UART_CUSTOM", + "help": "This GPIO is used for console UART RX input in the ESP-IDF Bootloader and the app (including\ndefault standard input of the app). Value -1 means to continue using the default console UART\nRX pin.\n\nNote: The default ESP-IDF Bootloader configures this pin but doesn't read anything from the UART.\n\nIf the configuration is different in the Bootloader binary compared to the app binary, UART\nis reconfigured after the bootloader exits and the app starts.", + "id": "ESP_CONSOLE_UART_RX_GPIO", + "name": "ESP_CONSOLE_UART_RX_GPIO", + "range": null, + "title": "UART RX on GPIO", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_CONSOLE_UART", + "help": "This baud rate is used by both the ESP-IDF Bootloader and the app (including\nboot log output and default standard input/output/error of the app).\n\nThe app's maximum baud rate depends on the UART clock source. If Power Management is disabled,\nthe UART clock source is the APB clock and all baud rates in the available range will be sufficiently\naccurate. If Power Management is enabled, REF_TICK clock source is used so the baud rate is divided\nfrom 1MHz. Baud rates above 1Mbps are not possible and values between 500Kbps and 1Mbps may not be\naccurate.\n\nIf the configuration is different in the Bootloader binary compared to the app binary, UART\nis reconfigured after the bootloader exits and the app starts.", + "id": "ESP_CONSOLE_UART_BAUDRATE", + "name": "ESP_CONSOLE_UART_BAUDRATE", + "range": [ + 1200, + 4000000 + ], + "title": "UART console baud rate", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_CONSOLE_USB_CDC", + "help": "Set the size of USB CDC RX buffer. Increase the buffer size if your application\nis often receiving data over USB CDC.", + "id": "ESP_CONSOLE_USB_CDC_RX_BUF_SIZE", + "name": "ESP_CONSOLE_USB_CDC_RX_BUF_SIZE", + "range": null, + "title": "Size of USB CDC RX buffer", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_CONSOLE_USB_CDC", + "help": "If enabled, esp_rom_printf and ESP_EARLY_LOG output will also be sent over USB CDC.\nDisabling this option saves about 1kB or RAM.", + "id": "ESP_CONSOLE_USB_CDC_SUPPORT_ETS_PRINTF", + "name": "ESP_CONSOLE_USB_CDC_SUPPORT_ETS_PRINTF", + "range": null, + "title": "Enable esp_rom_printf / ESP_EARLY_LOG via USB CDC", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_INT_WDT", + "help": "The timeout of the watchdog, in milliseconds. Make this higher than the FreeRTOS tick rate.", + "id": "ESP_INT_WDT_TIMEOUT_MS", + "name": "ESP_INT_WDT_TIMEOUT_MS", + "range": [ + 10, + 10000 + ], + "title": "Interrupt watchdog timeout (ms)", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_INT_WDT && !FREERTOS_UNICORE", + "help": "Also detect if interrupts on CPU 1 are disabled for too long.", + "id": "ESP_INT_WDT_CHECK_CPU1", + "name": "ESP_INT_WDT_CHECK_CPU1", + "range": null, + "title": "Also watch CPU1 tick interrupt", + "type": "bool" + } + ], + "depends_on": null, + "help": "This watchdog timer can detect if the FreeRTOS tick interrupt has not been called for a certain time,\neither because a task turned off interrupts and did not turn them on for a long time, or because an\ninterrupt handler did not return. It will try to invoke the panic handler first and failing that\nreset the SoC.", + "id": "ESP_INT_WDT", + "name": "ESP_INT_WDT", + "range": null, + "title": "Interrupt watchdog", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_TASK_WDT_EN", + "help": null, + "id": "ESP_TASK_WDT_USE_ESP_TIMER", + "name": "ESP_TASK_WDT_USE_ESP_TIMER", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_TASK_WDT_INIT", + "help": "If this option is enabled, the Task Watchdog Timer will be configured to\ntrigger the panic handler when it times out. This can also be configured\nat run time (see Task Watchdog Timer API Reference)", + "id": "ESP_TASK_WDT_PANIC", + "name": "ESP_TASK_WDT_PANIC", + "range": null, + "title": "Invoke panic handler on Task Watchdog timeout", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_TASK_WDT_INIT", + "help": "Timeout period configuration for the Task Watchdog Timer in seconds.\nThis is also configurable at run time (see Task Watchdog Timer API Reference)", + "id": "ESP_TASK_WDT_TIMEOUT_S", + "name": "ESP_TASK_WDT_TIMEOUT_S", + "range": [ + 1, + 60 + ], + "title": "Task Watchdog timeout period (seconds)", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_TASK_WDT_INIT", + "help": "If this option is enabled, the Task Watchdog Timer will watch the CPU0\nIdle Task. Having the Task Watchdog watch the Idle Task allows for detection\nof CPU starvation as the Idle Task not being called is usually a symptom of\nCPU starvation. Starvation of the Idle Task is detrimental as FreeRTOS household\ntasks depend on the Idle Task getting some runtime every now and then.", + "id": "ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0", + "name": "ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0", + "range": null, + "title": "Watch CPU0 Idle Task", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_TASK_WDT_INIT && !FREERTOS_UNICORE", + "help": "If this option is enabled, the Task Watchdog Timer will wach the CPU1\nIdle Task.", + "id": "ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1", + "name": "ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1", + "range": null, + "title": "Watch CPU1 Idle Task", + "type": "bool" + } + ], + "depends_on": "ESP_TASK_WDT_EN", + "help": "Enabling this option will cause the Task Watchdog Timer to be initialized\nautomatically at startup.", + "id": "ESP_TASK_WDT_INIT", + "name": "ESP_TASK_WDT_INIT", + "range": null, + "title": "Initialize Task Watchdog Timer on startup", + "type": "bool" + } + ], + "depends_on": null, + "help": "The Task Watchdog Timer can be used to make sure individual tasks are still\nrunning. Enabling this option will enable the Task Watchdog Timer. It can be\neither initialized automatically at startup or initialized after startup\n(see Task Watchdog Timer API Reference)", + "id": "ESP_TASK_WDT_EN", + "name": "ESP_TASK_WDT_EN", + "range": null, + "title": "Enable Task Watchdog Timer", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_XT_WDT", + "help": "Timeout period configuration for the XTAL32K watchdog timer based on RTC_CLK.", + "id": "ESP_XT_WDT_TIMEOUT", + "name": "ESP_XT_WDT_TIMEOUT", + "range": null, + "title": "XTAL32K watchdog timeout period", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_XT_WDT", + "help": "Enable this to automatically switch to BACKUP32K_CLK as the source of RTC_SLOW_CLK when\nthe watchdog timer expires.", + "id": "ESP_XT_WDT_BACKUP_CLK_ENABLE", + "name": "ESP_XT_WDT_BACKUP_CLK_ENABLE", + "range": null, + "title": "Automatically switch to BACKUP32K_CLK when timer expires", + "type": "bool" + } + ], + "depends_on": "SOC_XT_WDT_SUPPORTED && (ESP_SYSTEM_RTC_EXT_OSC || ESP_SYSTEM_RTC_EXT_XTAL)", + "help": "This watchdog timer can detect oscillation failure of the XTAL32K_CLK. When such a failure\nis detected the hardware can be set up to automatically switch to BACKUP32K_CLK and generate\nan interrupt.", + "id": "ESP_XT_WDT", + "name": "ESP_XT_WDT", + "range": null, + "title": "Initialize XTAL32K watchdog timer on startup", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "If this option is disabled (default), the panic handler code is placed in flash not IRAM.\nThis means that if ESP-IDF crashes while flash cache is disabled, the panic handler will\nautomatically re-enable flash cache before running GDB Stub or Core Dump. This adds some minor\nrisk, if the flash cache status is also corrupted during the crash.\n\nIf this option is enabled, the panic handler code (including required UART functions) is placed\nin IRAM. This may be necessary to debug some complex issues with crashes while flash cache is\ndisabled (for example, when writing to SPI flash) or when flash cache is corrupted when an exception\nis triggered.", + "id": "ESP_PANIC_HANDLER_IRAM", + "name": "ESP_PANIC_HANDLER_IRAM", + "range": null, + "title": "Place panic handler code in IRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "!ESP32_TRAX && !ESP32S2_TRAX && !ESP32S3_TRAX", + "help": "Debug stubs are used by OpenOCD to execute pre-compiled onboard code\nwhich does some useful debugging stuff, e.g. GCOV data dump.", + "id": "ESP_DEBUG_STUBS_ENABLE", + "name": "ESP_DEBUG_STUBS_ENABLE", + "range": null, + "title": "OpenOCD debug stubs", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_DEBUG_HAVE_OCD_STUB_BINS", + "help": "OpenOCD uses stub code to access flash during programming or when inserting and removing\nSW flash breakpoints.\nTo execute stub code, OpenOCD allocates memory on the target device, backs up the existing memory,\nloads the stub binary, runs the binary, and then restores the original memory.\nThis process can be time-consuming, especially when using USB serial JTAG.\nBy enabling this option, 8K of memory in RAM will be preallocated with the stub code,\neliminating the need to back up and restore the memory region.", + "id": "ESP_DEBUG_INCLUDE_OCD_STUB_BINS", + "name": "ESP_DEBUG_INCLUDE_OCD_STUB_BINS", + "range": null, + "title": "Preload OpenOCD stub binaries to speed up debugging. 8K memory will be reserved", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "The FreeRTOS panic and unhandled exception handers can detect a JTAG OCD debugger and\ninstead of panicking, have the debugger stop on the offending instruction.", + "id": "ESP_DEBUG_OCDAWARE", + "name": "ESP_DEBUG_OCDAWARE", + "range": null, + "title": "Make exception and panic handlers JTAG/OCD aware", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "IDF_TARGET_ESP32 && ", + "help": "Using level 5 interrupt for Interrupt Watchdog, IPC_ISR and other system checks.", + "id": "ESP_SYSTEM_CHECK_INT_LEVEL_5", + "name": "ESP_SYSTEM_CHECK_INT_LEVEL_5", + "range": null, + "title": "Level 5 interrupt", + "type": "bool" + }, + { + "children": [], + "depends_on": "!BTDM_CTRL_HLI && ", + "help": "Using level 4 interrupt for Interrupt Watchdog, IPC_ISR and other system checks.", + "id": "ESP_SYSTEM_CHECK_INT_LEVEL_4", + "name": "ESP_SYSTEM_CHECK_INT_LEVEL_4", + "range": null, + "title": "Level 4 interrupt", + "type": "bool" + } + ], + "depends_on": null, + "help": "Interrupt level to use for Interrupt Watchdog, IPC_ISR and other system checks.", + "id": "component-config-esp-system-settings-interrupt-level-to-use-for-interrupt-watchdog-and-other-system-checks", + "name": "ESP_SYSTEM_CHECK_INT_LEVEL", + "title": "Interrupt level to use for Interrupt Watchdog and other system checks", + "type": "choice" + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_BROWNOUT_DET_LVL_SEL_0", + "name": "ESP_BROWNOUT_DET_LVL_SEL_0", + "range": null, + "title": "2.43V +/- 0.05", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_BROWNOUT_DET_LVL_SEL_1", + "name": "ESP_BROWNOUT_DET_LVL_SEL_1", + "range": null, + "title": "2.48V +/- 0.05", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_BROWNOUT_DET_LVL_SEL_2", + "name": "ESP_BROWNOUT_DET_LVL_SEL_2", + "range": null, + "title": "2.58V +/- 0.05", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_BROWNOUT_DET_LVL_SEL_3", + "name": "ESP_BROWNOUT_DET_LVL_SEL_3", + "range": null, + "title": "2.62V +/- 0.05", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_BROWNOUT_DET_LVL_SEL_4", + "name": "ESP_BROWNOUT_DET_LVL_SEL_4", + "range": null, + "title": "2.67V +/- 0.05", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_BROWNOUT_DET_LVL_SEL_5", + "name": "ESP_BROWNOUT_DET_LVL_SEL_5", + "range": null, + "title": "2.70V +/- 0.05", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_BROWNOUT_DET_LVL_SEL_6", + "name": "ESP_BROWNOUT_DET_LVL_SEL_6", + "range": null, + "title": "2.77V +/- 0.05", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_BROWNOUT_DET_LVL_SEL_7", + "name": "ESP_BROWNOUT_DET_LVL_SEL_7", + "range": null, + "title": "2.80V +/- 0.05", + "type": "bool" + } + ], + "depends_on": "ESP_BROWNOUT_DET", + "help": "The brownout detector will reset the chip when the supply voltage is approximately\nbelow this level. Note that there may be some variation of brownout voltage level\nbetween each ESP chip.\n\n#The voltage levels here are estimates, more work needs to be done to figure out the exact voltages\n#of the brownout threshold levels.", + "id": "component-config-esp-system-settings-brownout-detector-hardware-brownout-detect-reset-brownout-voltage-level", + "name": "ESP_BROWNOUT_DET_LVL_SEL", + "title": "Brownout voltage level", + "type": "choice" + } + ], + "depends_on": "!IDF_ENV_FPGA", + "help": "The ESP has a built-in brownout detector which can detect if the voltage is lower than\na specific value. If this happens, it will reset the chip in order to prevent unintended\nbehaviour.", + "id": "ESP_BROWNOUT_DET", + "name": "ESP_BROWNOUT_DET", + "range": null, + "title": "Hardware brownout detect & reset", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_BROWNOUT_DET_LVL", + "name": "ESP_BROWNOUT_DET_LVL", + "range": null, + "title": null, + "type": "int" + } + ], + "depends_on": null, + "id": "component-config-esp-system-settings-brownout-detector", + "title": "Brownout Detector", + "type": "menu" + }, + { + "children": [], + "depends_on": null, + "help": "If set, the first time the app boots it will disable the BASIC ROM Console\npermanently (by burning an eFuse).\n\nOtherwise, the BASIC ROM Console starts on reset if no valid bootloader is\nread from the flash.\n\n(Enabling secure boot also disables the BASIC ROM Console by default.)", + "id": "ESP32_DISABLE_BASIC_ROM_CONSOLE", + "name": "ESP32_DISABLE_BASIC_ROM_CONSOLE", + "range": null, + "title": "Permanently disable BASIC ROM Console", + "type": "bool" + }, + { + "children": [], + "depends_on": "!ESP_SYSTEM_SINGLE_CORE_MODE && SPIRAM", + "help": null, + "id": "ESP32_ECO3_CACHE_LOCK_FIX", + "name": "ESP32_ECO3_CACHE_LOCK_FIX", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "This config allows to trigger an interrupt when brownout detected. Software restart will be done\nat the end of the default callback.\nTwo occasions need to restart the chip with interrupt so far.\n(1). For ESP32 version 1, brown-out reset function doesn't work (see ESP32 errata 3.4).\n So that we must restart from interrupt.\n(2). For special workflow, the chip needs do more things instead of restarting directly. This part\n needs to be done in callback function of interrupt.", + "id": "ESP_SYSTEM_BROWNOUT_INTR", + "name": "ESP_SYSTEM_BROWNOUT_INTR", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_ASSIST_DEBUG_SUPPORTED", + "help": "This config allows to trigger a panic interrupt when Stack Pointer register goes out of allocated stack\nmemory bounds.", + "id": "ESP_SYSTEM_HW_STACK_GUARD", + "name": "ESP_SYSTEM_HW_STACK_GUARD", + "range": null, + "title": "Hardware stack guard", + "type": "bool" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ESP32C2 || IDF_TARGET_ESP32S3 || IDF_TARGET_ESP32C6 || IDF_TARGET_ESP32H2", + "help": "This configuration helps to address an BBPLL inaccurate issue when boot from certain bootloader version,\nwhich may increase about the boot-up time by about 200 us. Disable this when your bootloader is built with\nESP-IDF version v5.2 and above.", + "id": "ESP_SYSTEM_BBPLL_RECALIB", + "name": "ESP_SYSTEM_BBPLL_RECALIB", + "range": null, + "title": "Re-calibration BBPLL at startup", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_ASSIST_DEBUG_SUPPORTED", + "help": "This option will enable the PC recording function of assist_debug module. The PC value of the CPU will be\nrecorded to PC record register in assist_debug module in real time. When an exception occurs and the CPU\nis reset, this register will be kept, then we can use the recorded PC to debug the causes of the reset.", + "id": "ESP_SYSTEM_HW_PC_RECORD", + "name": "ESP_SYSTEM_HW_PC_RECORD", + "range": null, + "title": "Hardware PC recording", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-esp-system-settings", + "title": "ESP System Settings", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "Configure the IPC tasks stack size. An IPC task runs on each core (in dual core mode), and allows for\ncross-core function calls. See IPC documentation for more details. The default IPC stack size should be\nenough for most common simple use cases. However, users can increase/decrease the stack size to their\nneeds.", + "id": "ESP_IPC_TASK_STACK_SIZE", + "name": "ESP_IPC_TASK_STACK_SIZE", + "range": [ + 512, + 65536 + ], + "title": "Inter-Processor Call (IPC) task stack size", + "type": "int" + }, + { + "children": [], + "depends_on": "!FREERTOS_UNICORE", + "help": "If this option is not enabled then the IPC task will keep behavior same as prior to that of ESP-IDF v4.0,\nhence IPC task will run at (configMAX_PRIORITIES - 1) priority.", + "id": "ESP_IPC_USES_CALLERS_PRIORITY", + "name": "ESP_IPC_USES_CALLERS_PRIORITY", + "range": null, + "title": "IPC runs at caller's priority", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "The IPC ISR feature is similar to the IPC feature except that the callback function is executed in the\ncontext of a High Priority Interrupt. The IPC ISR feature is intended for low latency execution of simple\ncallbacks written in assembly on another CPU. Due to being run in a High Priority Interrupt, the assembly\ncallbacks must be written with particular restrictions (see \"IPC\" and \"High-Level Interrupt\" docs for more\ndetails).", + "id": "ESP_IPC_ISR_ENABLE", + "name": "ESP_IPC_ISR_ENABLE", + "range": null, + "title": null, + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-ipc-inter-processor-call-", + "title": "IPC (Inter-Processor Call)", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "If enabled, esp_timer_dump will dump information such as number of times the timer was started,\nnumber of times the timer has triggered, and the total time it took for the callback to run.\nThis option has some effect on timer performance and the amount of memory used for timer\nstorage, and should only be used for debugging/testing purposes.", + "id": "ESP_TIMER_PROFILING", + "name": "ESP_TIMER_PROFILING", + "range": null, + "title": "Enable esp_timer profiling features", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_TIME_FUNCS_USE_RTC_TIMER", + "name": "ESP_TIME_FUNCS_USE_RTC_TIMER", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_TIME_FUNCS_USE_ESP_TIMER", + "name": "ESP_TIME_FUNCS_USE_ESP_TIMER", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_TIME_FUNCS_USE_NONE", + "name": "ESP_TIME_FUNCS_USE_NONE", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Configure the stack size of \"timer_task\" task. This task is used\nto dispatch callbacks of timers created using ets_timer and esp_timer\nAPIs. If you are seing stack overflow errors in timer task, increase\nthis value.\n\nNote that this is not the same as FreeRTOS timer task. To configure\nFreeRTOS timer task size, see \"FreeRTOS timer task stack size\" option\nin \"FreeRTOS\".", + "id": "ESP_TIMER_TASK_STACK_SIZE", + "name": "ESP_TIMER_TASK_STACK_SIZE", + "range": [ + 2048, + 65536 + ], + "title": "High-resolution timer task stack size", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "This sets the interrupt priority level for esp_timer ISR.\nA higher value reduces interrupt latency by minimizing the timer processing delay.", + "id": "ESP_TIMER_INTERRUPT_LEVEL", + "name": "ESP_TIMER_INTERRUPT_LEVEL", + "range": [ + 1, + 3 + ], + "title": "Interrupt level", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "This shows some hidden features of esp_timer.\nNote that they may break other features, use them with care.", + "id": "ESP_TIMER_SHOW_EXPERIMENTAL", + "name": "ESP_TIMER_SHOW_EXPERIMENTAL", + "range": null, + "title": "show esp_timer's experimental features", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_TIMER_TASK_AFFINITY", + "name": "ESP_TIMER_TASK_AFFINITY", + "range": null, + "title": null, + "type": "hex" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_TIMER_TASK_AFFINITY_CPU0", + "name": "ESP_TIMER_TASK_AFFINITY_CPU0", + "range": null, + "title": "CPU0", + "type": "bool" + }, + { + "children": [], + "depends_on": "!FREERTOS_UNICORE && ESP_TIMER_SHOW_EXPERIMENTAL && ", + "help": null, + "id": "ESP_TIMER_TASK_AFFINITY_CPU1", + "name": "ESP_TIMER_TASK_AFFINITY_CPU1", + "range": null, + "title": "CPU1", + "type": "bool" + }, + { + "children": [], + "depends_on": "!FREERTOS_UNICORE && ESP_TIMER_SHOW_EXPERIMENTAL && ", + "help": null, + "id": "ESP_TIMER_TASK_AFFINITY_NO_AFFINITY", + "name": "ESP_TIMER_TASK_AFFINITY_NO_AFFINITY", + "range": null, + "title": "No affinity", + "type": "bool" + } + ], + "depends_on": null, + "help": "The default settings: timer TASK on CPU0 and timer ISR on CPU0.\nOther settings may help in certain cases, but note that they may break\nother features, use them with care.\n- \"CPU0\": (default) esp_timer task is processed by CPU0.\n- \"CPU1\": esp_timer task is processed by CPU1.\n- \"No affinity\": esp_timer task can be processed by any CPU.", + "id": "component-config-esp-timer-high-resolution-timer--esp_timer-task-core-affinity", + "name": "ESP_TIMER_TASK_AFFINITY", + "title": "esp_timer task core affinity", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_TIMER_ISR_AFFINITY_CPU0", + "name": "ESP_TIMER_ISR_AFFINITY_CPU0", + "range": null, + "title": "CPU0", + "type": "bool" + }, + { + "children": [], + "depends_on": "!FREERTOS_UNICORE && ESP_TIMER_SHOW_EXPERIMENTAL && ", + "help": null, + "id": "ESP_TIMER_ISR_AFFINITY_CPU1", + "name": "ESP_TIMER_ISR_AFFINITY_CPU1", + "range": null, + "title": "CPU1", + "type": "bool" + }, + { + "children": [], + "depends_on": "!FREERTOS_UNICORE && ESP_TIMER_SHOW_EXPERIMENTAL && ", + "help": null, + "id": "ESP_TIMER_ISR_AFFINITY_NO_AFFINITY", + "name": "ESP_TIMER_ISR_AFFINITY_NO_AFFINITY", + "range": null, + "title": "No affinity", + "type": "bool" + } + ], + "depends_on": null, + "help": "The default settings: timer TASK on CPU0 and timer ISR on CPU0.\nOther settings may help in certain cases, but note that they may break\nother features, use them with care.\n- \"CPU0\": (default) timer interrupt is processed by CPU0.\n- \"CPU1\": timer interrupt is processed by CPU1.\n- \"No affinity\": timer interrupt can be processed by any CPU. It helps\nto reduce latency but there is a disadvantage it leads to the timer ISR\nrunning on every core. It increases the CPU time usage for timer ISRs\nby N on an N-core system.", + "id": "component-config-esp-timer-high-resolution-timer--timer-interrupt-core-affinity", + "name": "ESP_TIMER_ISR_AFFINITY", + "title": "timer interrupt core affinity", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": "Allows using ESP_TIMER_ISR dispatch method (ESP_TIMER_TASK dispatch method is also avalible).\n- ESP_TIMER_TASK - Timer callbacks are dispatched from a high-priority esp_timer task.\n- ESP_TIMER_ISR - Timer callbacks are dispatched directly from the timer interrupt handler.\nThe ISR dispatch can be used, in some cases, when a callback is very simple\nor need a lower-latency.", + "id": "ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD", + "name": "ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD", + "range": null, + "title": "Support ISR dispatch method", + "type": "bool" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ESP32", + "help": null, + "id": "ESP_TIMER_IMPL_TG0_LAC", + "name": "ESP_TIMER_IMPL_TG0_LAC", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "!IDF_TARGET_ESP32", + "help": null, + "id": "ESP_TIMER_IMPL_SYSTIMER", + "name": "ESP_TIMER_IMPL_SYSTIMER", + "range": null, + "title": null, + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-esp-timer-high-resolution-timer-", + "title": "ESP Timer (High Resolution Timer)", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_WIFI_ENABLED", + "name": "ESP_WIFI_ENABLED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_HOST_WIFI_ENABLED", + "help": null, + "id": "ESP_WIFI_CONTROLLER_TARGET", + "name": "ESP_WIFI_CONTROLLER_TARGET", + "range": null, + "title": null, + "type": "string" + }, + { + "children": [], + "depends_on": "ESP_HOST_WIFI_ENABLED", + "help": null, + "id": "ESP_WIFI_TARGET_ESP32", + "name": "ESP_WIFI_TARGET_ESP32", + "range": null, + "title": null, + "type": "bool" + } + ], + "depends_on": "SOC_WIRELESS_HOST_SUPPORTED", + "help": null, + "id": "ESP_HOST_WIFI_ENABLED", + "name": "ESP_HOST_WIFI_ENABLED", + "range": null, + "title": "Host WiFi Enable", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Set the number of WiFi static RX buffers. Each buffer takes approximately 1.6KB of RAM.\nThe static rx buffers are allocated when esp_wifi_init is called, they are not freed\nuntil esp_wifi_deinit is called.\n\nWiFi hardware use these buffers to receive all 802.11 frames.\nA higher number may allow higher throughput but increases memory use. If ESP_WIFI_AMPDU_RX_ENABLED\nis enabled, this value is recommended to set equal or bigger than ESP_WIFI_RX_BA_WIN in order to\nachieve better throughput and compatibility with both stations and APs.", + "id": "ESP_WIFI_STATIC_RX_BUFFER_NUM", + "name": "ESP_WIFI_STATIC_RX_BUFFER_NUM", + "range": [ + 2, + 25 + ], + "title": "Max number of WiFi static RX buffers", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Set the number of WiFi dynamic RX buffers, 0 means unlimited RX buffers will be allocated\n(provided sufficient free RAM). The size of each dynamic RX buffer depends on the size of\nthe received data frame.\n\nFor each received data frame, the WiFi driver makes a copy to an RX buffer and then delivers\nit to the high layer TCP/IP stack. The dynamic RX buffer is freed after the higher layer has\nsuccessfully received the data frame.\n\nFor some applications, WiFi data frames may be received faster than the application can\nprocess them. In these cases we may run out of memory if RX buffer number is unlimited (0).\n\nIf a dynamic RX buffer limit is set, it should be at least the number of static RX buffers.", + "id": "ESP_WIFI_DYNAMIC_RX_BUFFER_NUM", + "name": "ESP_WIFI_DYNAMIC_RX_BUFFER_NUM", + "range": [ + 0, + 128 + ], + "title": "Max number of WiFi dynamic RX buffers", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_WIFI_STATIC_TX_BUFFER", + "name": "ESP_WIFI_STATIC_TX_BUFFER", + "range": null, + "title": "Static", + "type": "bool" + }, + { + "children": [], + "depends_on": "!(SPIRAM_TRY_ALLOCATE_WIFI_LWIP && !SPIRAM_IGNORE_NOTFOUND) && ", + "help": null, + "id": "ESP_WIFI_DYNAMIC_TX_BUFFER", + "name": "ESP_WIFI_DYNAMIC_TX_BUFFER", + "range": null, + "title": "Dynamic", + "type": "bool" + } + ], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Select type of WiFi TX buffers:\n\nIf \"Static\" is selected, WiFi TX buffers are allocated when WiFi is initialized and released\nwhen WiFi is de-initialized. The size of each static TX buffer is fixed to about 1.6KB.\n\nIf \"Dynamic\" is selected, each WiFi TX buffer is allocated as needed when a data frame is\ndelivered to the Wifi driver from the TCP/IP stack. The buffer is freed after the data frame\nhas been sent by the WiFi driver. The size of each dynamic TX buffer depends on the length\nof each data frame sent by the TCP/IP layer.\n\nIf PSRAM is enabled, \"Static\" should be selected to guarantee enough WiFi TX buffers.\nIf PSRAM is disabled, \"Dynamic\" should be selected to improve the utilization of RAM.", + "id": "component-config-wi-fi-type-of-wifi-tx-buffers", + "name": "ESP_WIFI_TX_BUFFER", + "title": "Type of WiFi TX buffers", + "type": "choice" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": null, + "id": "ESP_WIFI_TX_BUFFER_TYPE", + "name": "ESP_WIFI_TX_BUFFER_TYPE", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_WIFI_STATIC_TX_BUFFER && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Set the number of WiFi static TX buffers. Each buffer takes approximately 1.6KB of RAM.\nThe static RX buffers are allocated when esp_wifi_init() is called, they are not released\nuntil esp_wifi_deinit() is called.\n\nFor each transmitted data frame from the higher layer TCP/IP stack, the WiFi driver makes a\ncopy of it in a TX buffer. For some applications especially UDP applications, the upper\nlayer can deliver frames faster than WiFi layer can transmit. In these cases, we may run out\nof TX buffers.", + "id": "ESP_WIFI_STATIC_TX_BUFFER_NUM", + "name": "ESP_WIFI_STATIC_TX_BUFFER_NUM", + "range": null, + "title": "Max number of WiFi static TX buffers", + "type": "int" + }, + { + "children": [], + "depends_on": "SPIRAM_TRY_ALLOCATE_WIFI_LWIP && !SPIRAM_IGNORE_NOTFOUND && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Set the number of WiFi cache TX buffer number.\n\nFor each TX packet from uplayer, such as LWIP etc, WiFi driver needs to allocate a static TX\nbuffer and makes a copy of uplayer packet. If WiFi driver fails to allocate the static TX buffer,\nit caches the uplayer packets to a dedicated buffer queue, this option is used to configure the\nsize of the cached TX queue.", + "id": "ESP_WIFI_CACHE_TX_BUFFER_NUM", + "name": "ESP_WIFI_CACHE_TX_BUFFER_NUM", + "range": null, + "title": "Max number of WiFi cache TX buffers", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_WIFI_DYNAMIC_TX_BUFFER && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Set the number of WiFi dynamic TX buffers. The size of each dynamic TX buffer is not fixed,\nit depends on the size of each transmitted data frame.\n\nFor each transmitted frame from the higher layer TCP/IP stack, the WiFi driver makes a copy\nof it in a TX buffer. For some applications, especially UDP applications, the upper layer\ncan deliver frames faster than WiFi layer can transmit. In these cases, we may run out of TX\nbuffers.", + "id": "ESP_WIFI_DYNAMIC_TX_BUFFER_NUM", + "name": "ESP_WIFI_DYNAMIC_TX_BUFFER_NUM", + "range": [ + 1, + 128 + ], + "title": "Max number of WiFi dynamic TX buffers", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_WIFI_STATIC_RX_MGMT_BUFFER", + "name": "ESP_WIFI_STATIC_RX_MGMT_BUFFER", + "range": null, + "title": "Static", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_WIFI_DYNAMIC_RX_MGMT_BUFFER", + "name": "ESP_WIFI_DYNAMIC_RX_MGMT_BUFFER", + "range": null, + "title": "Dynamic", + "type": "bool" + } + ], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Select type of WiFi RX MGMT buffers:\n\nIf \"Static\" is selected, WiFi RX MGMT buffers are allocated when WiFi is initialized and released\nwhen WiFi is de-initialized. The size of each static RX MGMT buffer is fixed to about 500 Bytes.\n\nIf \"Dynamic\" is selected, each WiFi RX MGMT buffer is allocated as needed when a MGMT data frame is\nreceived. The MGMT buffer is freed after the MGMT data frame has been processed by the WiFi driver.", + "id": "component-config-wi-fi-type-of-wifi-rx-mgmt-buffers", + "name": "ESP_WIFI_MGMT_RX_BUFFER", + "title": "Type of WiFi RX MGMT buffers", + "type": "choice" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": null, + "id": "ESP_WIFI_DYNAMIC_RX_MGMT_BUF", + "name": "ESP_WIFI_DYNAMIC_RX_MGMT_BUF", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Set the number of WiFi RX_MGMT buffers.\n\nFor Management buffers, the number of dynamic and static management buffers is the same.\nIn order to prevent memory fragmentation, the management buffer type should be set to static first.", + "id": "ESP_WIFI_RX_MGMT_BUF_NUM_DEF", + "name": "ESP_WIFI_RX_MGMT_BUF_NUM_DEF", + "range": [ + 1, + 10 + ], + "title": "Max number of WiFi RX MGMT buffers", + "type": "int" + }, + { + "children": [], + "depends_on": "SOC_WIFI_CSI_SUPPORT && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Select this option to enable CSI(Channel State Information) feature. CSI takes about\nCONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM KB of RAM. If CSI is not used, it is better to disable\nthis feature in order to save memory.", + "id": "ESP_WIFI_CSI_ENABLED", + "name": "ESP_WIFI_CSI_ENABLED", + "range": null, + "title": "WiFi CSI(Channel State Information)", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_WIFI_AMPDU_TX_ENABLED && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Set the size of WiFi Block Ack TX window. Generally a bigger value means higher throughput but\nmore memory. Most of time we should NOT change the default value unless special reason, e.g.\ntest the maximum UDP TX throughput with iperf etc. For iperf test in shieldbox, the recommended\nvalue is 9~12.", + "id": "ESP_WIFI_TX_BA_WIN", + "name": "ESP_WIFI_TX_BA_WIN", + "range": [ + 2, + 32 + ], + "title": "WiFi AMPDU TX BA window size", + "type": "int" + } + ], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Select this option to enable AMPDU TX feature", + "id": "ESP_WIFI_AMPDU_TX_ENABLED", + "name": "ESP_WIFI_AMPDU_TX_ENABLED", + "range": null, + "title": "WiFi AMPDU TX", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_WIFI_AMPDU_RX_ENABLED && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Set the size of WiFi Block Ack RX window. Generally a bigger value means higher throughput and better\ncompatibility but more memory. Most of time we should NOT change the default value unless special\nreason, e.g. test the maximum UDP RX throughput with iperf etc. For iperf test in shieldbox, the\nrecommended value is 9~12. If PSRAM is used and WiFi memory is preferred to allocate in PSRAM first,\nthe default and minimum value should be 16 to achieve better throughput and compatibility with both\nstations and APs.", + "id": "ESP_WIFI_RX_BA_WIN", + "name": "ESP_WIFI_RX_BA_WIN", + "range": [ + 2, + 32 + ], + "title": "WiFi AMPDU RX BA window size", + "type": "int" + } + ], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Select this option to enable AMPDU RX feature", + "id": "ESP_WIFI_AMPDU_RX_ENABLED", + "name": "ESP_WIFI_AMPDU_RX_ENABLED", + "range": null, + "title": "WiFi AMPDU RX", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_WIFI_CACHE_TX_BUFFER_NUM >= 2 && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Select this option to enable AMSDU TX feature", + "id": "ESP_WIFI_AMSDU_TX_ENABLED", + "name": "ESP_WIFI_AMSDU_TX_ENABLED", + "range": null, + "title": "WiFi AMSDU TX", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Select this option to enable WiFi NVS flash", + "id": "ESP_WIFI_NVS_ENABLED", + "name": "ESP_WIFI_NVS_ENABLED", + "range": null, + "title": "WiFi NVS flash", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_WIFI_TASK_PINNED_TO_CORE_0", + "name": "ESP_WIFI_TASK_PINNED_TO_CORE_0", + "range": null, + "title": "Core 0", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_WIFI_TASK_PINNED_TO_CORE_1", + "name": "ESP_WIFI_TASK_PINNED_TO_CORE_1", + "range": null, + "title": "Core 1", + "type": "bool" + } + ], + "depends_on": "!FREERTOS_UNICORE && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Pinned WiFi task to core 0 or core 1.", + "id": "component-config-wi-fi-wifi-task-core-id", + "name": "ESP_WIFI_TASK_CORE_ID", + "title": "WiFi Task Core ID", + "type": "choice" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "ESP-MESH utilizes beacon frames to detect and resolve root node conflicts (see documentation). However\nthe default length of a beacon frame can simultaneously hold only five root node identifier structures,\nmeaning that a root node conflict of up to five nodes can be detected at one time. In the occurrence of\nmore root nodes conflict involving more than five root nodes, the conflict resolution process will\ndetect five of the root nodes, resolve the conflict, and re-detect more root nodes. This process will\nrepeat until all root node conflicts are resolved. However this process can generally take a very long\ntime.\n\nTo counter this situation, the beacon frame length can be increased such that more root nodes can be\ndetected simultaneously. Each additional root node will require 36 bytes and should be added on top of\nthe default beacon frame length of\n752 bytes. For example, if you want to detect 10 root nodes simultaneously, you need to set the beacon\nframe length as\n932 (752+36*5).\n\nSetting a longer beacon length also assists with debugging as the conflicting root nodes can be\nidentified more quickly.", + "id": "ESP_WIFI_SOFTAP_BEACON_MAX_LEN", + "name": "ESP_WIFI_SOFTAP_BEACON_MAX_LEN", + "range": [ + 752, + 1256 + ], + "title": "Max length of WiFi SoftAP Beacon", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Set the maximum number of Wi-Fi management short buffers. These buffers are dynamically allocated,\nwith their size determined by the length of the management packet to be sent. When a management\npacket is less than 64 bytes, the Wi-Fi driver classifies it as a short management packet and\nassigns it to one of these buffers.", + "id": "ESP_WIFI_MGMT_SBUF_NUM", + "name": "ESP_WIFI_MGMT_SBUF_NUM", + "range": [ + 6, + 32 + ], + "title": "WiFi mgmt short buffer number", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Select this option to place frequently called Wi-Fi library functions in IRAM.\nWhen this option is disabled, more than 10Kbytes of IRAM memory will be saved\nbut Wi-Fi throughput will be reduced.", + "id": "ESP_WIFI_IRAM_OPT", + "name": "ESP_WIFI_IRAM_OPT", + "range": null, + "title": "WiFi IRAM speed optimization", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Select this option to place additional frequently called Wi-Fi library functions\nin IRAM. When this option is disabled, more than 5Kbytes of IRAM memory will be saved\nbut Wi-Fi throughput will be reduced.", + "id": "ESP_WIFI_EXTRA_IRAM_OPT", + "name": "ESP_WIFI_EXTRA_IRAM_OPT", + "range": null, + "title": "WiFi EXTRA IRAM speed optimization", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Select this option to place frequently called Wi-Fi library RX functions in IRAM.\nWhen this option is disabled, more than 17Kbytes of IRAM memory will be saved\nbut Wi-Fi performance will be reduced.", + "id": "ESP_WIFI_RX_IRAM_OPT", + "name": "ESP_WIFI_RX_IRAM_OPT", + "range": null, + "title": "WiFi RX IRAM speed optimization", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_WIFI_ENABLE_WPA3_SAE && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Select this option to enable SAE-PK", + "id": "ESP_WIFI_ENABLE_SAE_PK", + "name": "ESP_WIFI_ENABLE_SAE_PK", + "range": null, + "title": "Enable SAE-PK", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLE_WPA3_SAE && ESP_WIFI_SOFTAP_SUPPORT && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Select this option to enable SAE support in softAP mode.", + "id": "ESP_WIFI_SOFTAP_SAE_SUPPORT", + "name": "ESP_WIFI_SOFTAP_SAE_SUPPORT", + "range": null, + "title": "Enable WPA3 Personal(SAE) SoftAP", + "type": "bool" + } + ], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Select this option to allow the device to establish a WPA3-Personal connection with eligible AP's.\nPMF (Protected Management Frames) is a prerequisite feature for a WPA3 connection, it needs to be\nexplicitly configured before attempting connection. Please refer to the Wi-Fi Driver API Guide\nfor details.", + "id": "ESP_WIFI_ENABLE_WPA3_SAE", + "name": "ESP_WIFI_ENABLE_WPA3_SAE", + "range": null, + "title": "Enable WPA3-Personal", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Select this option to allow the device to establish OWE connection with eligible AP's.\nPMF (Protected Management Frames) is a prerequisite feature for a WPA3 connection, it needs to be\nexplicitly configured before attempting connection. Please refer to the Wi-Fi Driver API Guide\nfor details.", + "id": "ESP_WIFI_ENABLE_WPA3_OWE_STA", + "name": "ESP_WIFI_ENABLE_WPA3_OWE_STA", + "range": null, + "title": "Enable OWE STA", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Select this option to place called Wi-Fi library TBTT process and receive beacon functions in IRAM.\nSome functions can be put in IRAM either by ESP_WIFI_IRAM_OPT and ESP_WIFI_RX_IRAM_OPT, or this one.\nIf already enabled ESP_WIFI_IRAM_OPT, the other 7.3KB IRAM memory would be taken by this option.\nIf already enabled ESP_WIFI_RX_IRAM_OPT, the other 1.3KB IRAM memory would be taken by this option.\nIf neither of them are enabled, the other 7.4KB IRAM memory would be taken by this option.\nWi-Fi power-save mode average current would be reduced if this option is enabled.", + "id": "ESP_WIFI_SLP_IRAM_OPT", + "name": "ESP_WIFI_SLP_IRAM_OPT", + "range": null, + "title": "WiFi SLP IRAM speed optimization", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Only for station in WIFI_PS_MIN_MODEM or WIFI_PS_MAX_MODEM. When the station enters the active state,\nit will work for at least ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME. If a data packet is received or sent\nduring this period, the time will be refreshed. If the time is up, but the station still has packets\nto receive or send, the time will also be refreshed. unit: milliseconds.", + "id": "ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME", + "name": "ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME", + "range": [ + 8, + 60 + ], + "title": "Minimum active time", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Only for station in WIFI_PS_MIN_MODEM or WIFI_PS_MAX_MODEM. If no packet has been\nsent within ESP_WIFI_SLP_DEFAULT_MAX_ACTIVE_TIME, a null data packet will be sent\nto maintain the connection with the AP. unit: seconds.", + "id": "ESP_WIFI_SLP_DEFAULT_MAX_ACTIVE_TIME", + "name": "ESP_WIFI_SLP_DEFAULT_MAX_ACTIVE_TIME", + "range": [ + 10, + 60 + ], + "title": "Maximum keep alive time", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Only for station in WIFI_PS_MIN_MODEM or WIFI_PS_MAX_MODEM. When the station knows through the beacon\nthat AP will send broadcast packet, it will wait for ESP_WIFI_SLP_DEFAULT_WAIT_BROADCAST_DATA_TIME\nbefore entering the sleep process. If a broadcast packet is received with more data bits, the time\nwill refreshed. unit: milliseconds.", + "id": "ESP_WIFI_SLP_DEFAULT_WAIT_BROADCAST_DATA_TIME", + "name": "ESP_WIFI_SLP_DEFAULT_WAIT_BROADCAST_DATA_TIME", + "range": [ + 10, + 30 + ], + "title": "Minimum wait broadcast data time", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_WIFI_FTM_ENABLE && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": null, + "id": "ESP_WIFI_FTM_INITIATOR_SUPPORT", + "name": "ESP_WIFI_FTM_INITIATOR_SUPPORT", + "range": null, + "title": "FTM Initiator support", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_WIFI_FTM_ENABLE && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": null, + "id": "ESP_WIFI_FTM_RESPONDER_SUPPORT", + "name": "ESP_WIFI_FTM_RESPONDER_SUPPORT", + "range": null, + "title": "FTM Responder support", + "type": "bool" + } + ], + "depends_on": "SOC_WIFI_FTM_SUPPORT && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Enable feature Fine Timing Measurement for calculating WiFi Round-Trip-Time (RTT).", + "id": "ESP_WIFI_FTM_ENABLE", + "name": "ESP_WIFI_FTM_ENABLE", + "range": null, + "title": "WiFi FTM", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Select this option to enable power_management for station when disconnected.\nChip will do modem-sleep when rf module is not in use any more.", + "id": "ESP_WIFI_STA_DISCONNECTED_PM_ENABLE", + "name": "ESP_WIFI_STA_DISCONNECTED_PM_ENABLE", + "range": null, + "title": "Power Management for station at disconnected", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_WIFI_GCMP_SUPPORT && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Select this option to enable GCMP support. GCMP support is compulsory for WiFi Suite-B support.", + "id": "ESP_WIFI_GCMP_SUPPORT", + "name": "ESP_WIFI_GCMP_SUPPORT", + "range": null, + "title": "WiFi GCMP Support(GCMP128 and GCMP256)", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Select this option to enable GMAC support. GMAC support is compulsory for WiFi 192 bit certification.", + "id": "ESP_WIFI_GMAC_SUPPORT", + "name": "ESP_WIFI_GMAC_SUPPORT", + "range": null, + "title": "WiFi GMAC Support(GMAC128 and GMAC256)", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "WiFi module can be compiled without SoftAP to save code size.", + "id": "ESP_WIFI_SOFTAP_SUPPORT", + "name": "ESP_WIFI_SOFTAP_SUPPORT", + "range": null, + "title": "WiFi SoftAP Support", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_PHY_MAC_BB_PD && SOC_PM_SUPPORT_BEACON_WAKEUP && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "The wifi modem automatically receives the beacon frame during light sleep.", + "id": "ESP_WIFI_ENHANCED_LIGHT_SLEEP", + "name": "ESP_WIFI_ENHANCED_LIGHT_SLEEP", + "range": null, + "title": "WiFi modem automatically receives the beacon", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_WIFI_SLP_BEACON_LOST_OPT && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Timeout time for close rf phy when beacon loss occurs, Unit: 1024 microsecond.", + "id": "ESP_WIFI_SLP_BEACON_LOST_TIMEOUT", + "name": "ESP_WIFI_SLP_BEACON_LOST_TIMEOUT", + "range": null, + "title": "Beacon loss timeout", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_WIFI_SLP_BEACON_LOST_OPT && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Maximum number of consecutive lost beacons allowed, WiFi keeps Rx state when\nthe number of consecutive beacons lost is greater than the given threshold.", + "id": "ESP_WIFI_SLP_BEACON_LOST_THRESHOLD", + "name": "ESP_WIFI_SLP_BEACON_LOST_THRESHOLD", + "range": null, + "title": "Maximum number of consecutive lost beacons allowed", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_WIFI_SLP_BEACON_LOST_OPT && SOC_WIFI_SUPPORT_VARIABLE_BEACON_WINDOW && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Delta early time for rf phy on, When the beacon is lost, the next rf phy on will\nbe earlier the time specified by the configuration item, Unit: 32 microsecond.", + "id": "ESP_WIFI_SLP_PHY_ON_DELTA_EARLY_TIME", + "name": "ESP_WIFI_SLP_PHY_ON_DELTA_EARLY_TIME", + "range": null, + "title": "Delta early time for RF PHY on", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_WIFI_SLP_BEACON_LOST_OPT && SOC_WIFI_SUPPORT_VARIABLE_BEACON_WINDOW && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Delta timeout time for rf phy off, When the beacon is lost, the next rf phy off will\nbe delayed for the time specified by the configuration item. Unit: 1024 microsecond.", + "id": "ESP_WIFI_SLP_PHY_OFF_DELTA_TIMEOUT_TIME", + "name": "ESP_WIFI_SLP_PHY_OFF_DELTA_TIMEOUT_TIME", + "range": null, + "title": "Delta timeout time for RF PHY off", + "type": "int" + } + ], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Enable wifi sleep optimization when beacon loss occurs and immediately enter\nsleep mode when the WiFi module detects beacon loss.", + "id": "ESP_WIFI_SLP_BEACON_LOST_OPT", + "name": "ESP_WIFI_SLP_BEACON_LOST_OPT", + "range": null, + "title": "Wifi sleep optimize when beacon lost", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Maximum number of encrypted peers supported by espnow.\nThe number of hardware keys for encryption is fixed. And the espnow and SoftAP share the same\nhardware keys. So this configuration will affect the maximum connection number of SoftAP.\nMaximum espnow encrypted peers number + maximum number of connections of SoftAP = Max hardware\nkeys number. When using ESP mesh, this value should be set to a maximum of 6.", + "id": "ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM", + "name": "ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM", + "range": [ + 0, + 17 + ], + "title": "Maximum espnow encrypt peers number", + "type": "int" + }, + { + "children": [], + "depends_on": "SOC_WIFI_NAN_SUPPORT && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Enable WiFi Aware (NAN) feature.", + "id": "ESP_WIFI_NAN_ENABLE", + "name": "ESP_WIFI_NAN_ENABLE", + "range": null, + "title": "WiFi Aware", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "ESP_WIFI_MBEDTLS_TLS_CLIENT && IDF_EXPERIMENTAL_FEATURES && ESP_WIFI_MBEDTLS_CRYPTO && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Select this option to support EAP with TLS v1.3.\nThis configuration still supports compatibility with EAP-TLS v1.2.\nPlease note that enabling this configuration will cause every application which\nuses TLS go for TLS1.3 if server supports that. TLS1.3 is still in development in mbedtls\nand there may be interoperability issues with this. Please modify your application to set\nmax version as TLS1.2 if you want to enable TLS1.3 only for WiFi connection.", + "id": "ESP_WIFI_EAP_TLS1_3", + "name": "ESP_WIFI_EAP_TLS1_3", + "range": null, + "title": "Enable EAP-TLS v1.3 Support for WiFi Enterprise connection", + "type": "bool" + } + ], + "depends_on": "ESP_WIFI_ENTERPRISE_SUPPORT && ESP_WIFI_MBEDTLS_CRYPTO && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Select this option to use MbedTLS TLS client for WPA2 enterprise connection.\nPlease note that from MbedTLS-3.0 onwards, MbedTLS does not support SSL-3.0\nTLS-v1.0, TLS-v1.1 versions. In case your server is using one of these version,\nit is advisable to update your server.\nPlease disable this option for compatibility with older TLS versions.", + "id": "ESP_WIFI_MBEDTLS_TLS_CLIENT", + "name": "ESP_WIFI_MBEDTLS_TLS_CLIENT", + "range": null, + "title": "Use MbedTLS TLS client for WiFi Enterprise connection", + "type": "bool" + } + ], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Select this option to enable the use of MbedTLS crypto APIs.\nThe internal crypto support within the supplicant is limited\nand may not suffice for all new security features, including WPA3.\n\nIt is recommended to always keep this option enabled. Additionally,\nnote that MbedTLS can leverage hardware acceleration if available,\nresulting in significantly faster cryptographic operations.", + "id": "ESP_WIFI_MBEDTLS_CRYPTO", + "name": "ESP_WIFI_MBEDTLS_CRYPTO", + "range": null, + "title": "Use MbedTLS crypto APIs", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_WIFI_WAPI_SUPPORT && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Select this option to enable WAPI-PSK\nwhich is a Chinese National Standard Encryption for Wireless LANs (GB 15629.11-2003).", + "id": "ESP_WIFI_WAPI_PSK", + "name": "ESP_WIFI_WAPI_PSK", + "range": null, + "title": "Enable WAPI PSK support", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_WIFI_GCMP_SUPPORT && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Select this option to enable 192 bit NSA suite-B.\nThis is necessary to support WPA3 192 bit security.", + "id": "ESP_WIFI_SUITE_B_192", + "name": "ESP_WIFI_SUITE_B_192", + "range": null, + "title": "Enable NSA suite B support with 192 bit key", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_WIFI_11KV_SUPPORT && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Select this option to enable 802.11k APIs(RRM support).\nOnly APIs which are helpful for network assisted roaming\nare supported for now.\nEnable this option with RRM enabled in sta config\nto make device ready for network assisted roaming.\nRRM: Radio measurements enable STAs to understand the radio environment,\nit enables STAs to observe and gather data on radio link performance\nand on the radio environment. Current implementation adds beacon report,\nlink measurement, neighbor report.", + "id": "ESP_WIFI_RRM_SUPPORT", + "name": "ESP_WIFI_RRM_SUPPORT", + "range": null, + "title": "Enable 802.11k APIs Support", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_WIFI_11KV_SUPPORT && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Select this option to enable 802.11v APIs(BTM support).\nOnly APIs which are helpful for network assisted roaming\nare supported for now.\nEnable this option with BTM enabled in sta config\nto make device ready for network assisted roaming.\nBTM: BSS transition management enables an AP to request a station to transition\nto a specific AP, or to indicate to a station a set of preferred APs.", + "id": "ESP_WIFI_WNM_SUPPORT", + "name": "ESP_WIFI_WNM_SUPPORT", + "range": null, + "title": "Enable 802.11v APIs Support", + "type": "bool" + } + ], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Select this option to enable 802.11k 802.11v APIs(RRM and BTM support).", + "id": "ESP_WIFI_11KV_SUPPORT", + "name": "ESP_WIFI_11KV_SUPPORT", + "range": null, + "title": "Enable 802.11k, 802.11v APIs Support", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_WIFI_RRM_SUPPORT && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Keep scan results in cache, if not enabled, those\nwill be flushed immediately.", + "id": "ESP_WIFI_SCAN_CACHE", + "name": "ESP_WIFI_SCAN_CACHE", + "range": null, + "title": "Keep scan results in cache", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Select this option to enable WiFi Multiband operation certification support.", + "id": "ESP_WIFI_MBO_SUPPORT", + "name": "ESP_WIFI_MBO_SUPPORT", + "range": null, + "title": "Enable Multi Band Operation Certification Support", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "ESP_WIFI_ROAMING_LOW_RSSI_ROAMING && ESP_WIFI_ENABLE_ROAMING_APP && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "WiFi RSSI threshold to trigger roaming value in dBm (-99 to -1). Values under -30 dbm\nmight lead to a flood of low rssi events. This interferes with normal functioning and\nTX/Rx performance.", + "id": "ESP_WIFI_ROAMING_LOW_RSSI_THRESHOLD", + "name": "ESP_WIFI_ROAMING_LOW_RSSI_THRESHOLD", + "range": null, + "title": "WiFi RSSI threshold to trigger roaming", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ROAMING_LOW_RSSI_ROAMING && ESP_WIFI_ENABLE_ROAMING_APP && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Decide the offset by which to decrease the Low RSSI threshold set by ESP_WIFI_ROAMING_LOW_RSSI_THRESHOLD\nafter each failed attempt to roam. This allows for the station to keep scanning for better AP's after\nthe Low RSSI threshold is reached in a stepped manner, rather than only attempting to roam the first time\nthe current AP's RSSI breaches the set RSSI threshold.\nSetting 0 here may cause station to be flooded with low rssi events,\ntherefore that's not recommended to be kept.", + "id": "ESP_WIFI_ROAMING_LOW_RSSI_OFFSET", + "name": "ESP_WIFI_ROAMING_LOW_RSSI_OFFSET", + "range": null, + "title": "Offset by which to reset the RSSI Threshold after attempt to roam.", + "type": "int" + } + ], + "depends_on": "ESP_WIFI_ENABLE_ROAMING_APP && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Enable to use a RSSI threshold to trigger roaming.", + "id": "ESP_WIFI_ROAMING_LOW_RSSI_ROAMING", + "name": "ESP_WIFI_ROAMING_LOW_RSSI_ROAMING", + "range": null, + "title": "Use Low RSSI to trigger roaming.", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_WIFI_ROAMING_PERIODIC_SCAN_MONITOR && ESP_WIFI_ENABLE_ROAMING_APP && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Threshold at which the station will begin scanning to find an AP with better RSSI.", + "id": "ESP_WIFI_ROAMING_PERIODIC_SCAN_THRESHOLD", + "name": "ESP_WIFI_ROAMING_PERIODIC_SCAN_THRESHOLD", + "range": null, + "title": "Threshold at which to begin periodic scanning for a better AP.", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ROAMING_PERIODIC_SCAN_MONITOR && ESP_WIFI_ENABLE_ROAMING_APP && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Intervals at which station will periodically scan to check if better AP is available", + "id": "ESP_WIFI_ROAMING_SCAN_MONITOR_INTERVAL", + "name": "ESP_WIFI_ROAMING_SCAN_MONITOR_INTERVAL", + "range": null, + "title": "Time intervals (in seconds) at which station will initiate a scan", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ROAMING_PERIODIC_SCAN_MONITOR && ESP_WIFI_ENABLE_ROAMING_APP && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Minimum RSSI difference b/w current AP and a potential roaming candidate AP\nto trigger a roaming attempt.", + "id": "ESP_WIFI_ROAMING_SCAN_ROAM_RSSI_DIFF", + "name": "ESP_WIFI_ROAMING_SCAN_ROAM_RSSI_DIFF", + "range": null, + "title": "RSSI difference b/w current AP and candidate AP to initiate connection", + "type": "int" + } + ], + "depends_on": "ESP_WIFI_ENABLE_ROAMING_APP && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Conduct periodic scans periodically to check if a better AP is available.", + "id": "ESP_WIFI_ROAMING_PERIODIC_SCAN_MONITOR", + "name": "ESP_WIFI_ROAMING_PERIODIC_SCAN_MONITOR", + "range": null, + "title": "Conduct periodic scans to check if a better AP is available", + "type": "bool" + } + ], + "depends_on": "ESP_WIFI_ENABLE_ROAMING_APP && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "id": "component-config-wi-fi-advanced-support-for-wi-fi-roaming-experimental--configure-roaming-app-roaming-triggers", + "title": "Roaming triggers", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_WIFI_ENABLE_ROAMING_APP && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Roaming between APs that do not support 802.11v.\nThis will allow station to roam even when connection is not BTM supported,\nby forcefully disconnecting from current AP and connecting to better AP.", + "id": "ESP_WIFI_ROAMING_LEGACY_ROAMING", + "name": "ESP_WIFI_ROAMING_LEGACY_ROAMING", + "range": null, + "title": "Support Legacy roaming approach", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_WIFI_ROAMING_NETWORK_ASSISTED_ROAM && ESP_WIFI_ROAMING_LEGACY_ROAMING && ESP_WIFI_ENABLE_ROAMING_APP && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Retry threshold after which the station should stop using Network Assisted\nroaming methods and start using legacy roaming instead.", + "id": "ESP_WIFI_NETWORK_ASSISTED_ROAMING_RETRY_COUNT", + "name": "ESP_WIFI_NETWORK_ASSISTED_ROAMING_RETRY_COUNT", + "range": null, + "title": "Retry count after which to switch to legacy roaming", + "type": "int" + } + ], + "depends_on": "ESP_WIFI_WNM_SUPPORT && ESP_WIFI_ENABLE_ROAMING_APP && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Roaming between APs using network assisted Roaming.\nThis involves BSS Transition Management mechanisms outlined in 802.11v.\nNote that this moves the responsibility to the AP's network, and hence isn't\nguaranteed to cause the station to attempt to roam each time.", + "id": "ESP_WIFI_ROAMING_NETWORK_ASSISTED_ROAM", + "name": "ESP_WIFI_ROAMING_NETWORK_ASSISTED_ROAM", + "range": null, + "title": "Support Network Assisted roaming using 802.11v", + "type": "bool" + } + ], + "depends_on": "ESP_WIFI_ENABLE_ROAMING_APP && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "id": "component-config-wi-fi-advanced-support-for-wi-fi-roaming-experimental--configure-roaming-app-roaming-methods", + "title": "Roaming Methods", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_WIFI_ENABLE_ROAMING_APP && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Minimum duration of active scanning per channel in milliseconds.", + "id": "ESP_WIFI_ROAMING_SCAN_MIN_SCAN_TIME", + "name": "ESP_WIFI_ROAMING_SCAN_MIN_SCAN_TIME", + "range": null, + "title": "Minimum duration (in milliseconds) of station's per channel active scan", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLE_ROAMING_APP && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Maximum duration of active scanning per channel in milliseconds.", + "id": "ESP_WIFI_ROAMING_SCAN_MAX_SCAN_TIME", + "name": "ESP_WIFI_ROAMING_SCAN_MAX_SCAN_TIME", + "range": null, + "title": "Maximum duration (in milliseconds) of station's per channel active scan time", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLE_ROAMING_APP && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "If connected, duration for which the station will return to it's home channel for Tx/Rx of\nframes stored in buffers between scanning on consecutive channels.", + "id": "ESP_WIFI_ROAMING_HOME_CHANNEL_DWELL_TIME", + "name": "ESP_WIFI_ROAMING_HOME_CHANNEL_DWELL_TIME", + "range": null, + "title": "Home channel dwell time scanning between consecutive channels", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLE_ROAMING_APP && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Channels your wireless network operates on to allow for faster scanning.\nSpecify the channels(between 1-14) in a comma separated manner.", + "id": "ESP_WIFI_ROAMING_SCAN_CHAN_LIST", + "name": "ESP_WIFI_ROAMING_SCAN_CHAN_LIST", + "range": null, + "title": "Preferred channel list for scanning", + "type": "string" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLE_ROAMING_APP && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Duration for which the results from the most recent scans can be used\nby the roaming app for determining the roaming candidates.", + "id": "ESP_WIFI_ROAMING_SCAN_EXPIRY_WINDOW", + "name": "ESP_WIFI_ROAMING_SCAN_EXPIRY_WINDOW", + "range": null, + "title": "Scan results expiry window (in seconds)", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLE_ROAMING_APP && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Max candidates that can be considered while scanning as a part of the\nnetwork at one time.", + "id": "ESP_WIFI_ROAMING_MAX_CANDIDATES", + "name": "ESP_WIFI_ROAMING_MAX_CANDIDATES", + "range": null, + "title": "Max Candidates in the network", + "type": "int" + } + ], + "depends_on": "ESP_WIFI_ENABLE_ROAMING_APP && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "id": "component-config-wi-fi-advanced-support-for-wi-fi-roaming-experimental--configure-roaming-app-scan-configuration", + "title": "Scan Configuration", + "type": "menu" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLE_ROAMING_APP && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Time to wait (in seconds) by station before registering for the RSSI event again\nor start continuous montoring to find better AP.", + "id": "ESP_WIFI_ROAMING_BACKOFF_TIME", + "name": "ESP_WIFI_ROAMING_BACKOFF_TIME", + "range": null, + "title": "Default time to wait between subsequent roaming attempts.", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_WIFI_ROAMING_PERIODIC_RRM_MONITORING && ESP_WIFI_ENABLE_ROAMING_APP && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Enable this to send periodic neighbor report requests to the AP.\nThese neighbor report requests provide information about other APs in the same managed\nnetwork. This information is used for more intelligent roaming.", + "id": "ESP_WIFI_ROAMING_RRM_MONITOR_TIME", + "name": "ESP_WIFI_ROAMING_RRM_MONITOR_TIME", + "range": null, + "title": "Time interval (in seconds) between neighbor report requests to an AP", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ROAMING_PERIODIC_RRM_MONITORING && ESP_WIFI_ENABLE_ROAMING_APP && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "The RSSI threshold beyond which we start sending periodic neighbor report requests.", + "id": "ESP_WIFI_ROAMING_RRM_MONITOR_THRESHOLD", + "name": "ESP_WIFI_ROAMING_RRM_MONITOR_THRESHOLD", + "range": null, + "title": "Threshold for sending periodic neighbor report requests", + "type": "int" + } + ], + "depends_on": "ESP_WIFI_RRM_SUPPORT && ESP_WIFI_ENABLE_ROAMING_APP && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "This option will enable station to keep sending RRM neighbor list request to AP and\nupdate its internal list.", + "id": "ESP_WIFI_ROAMING_PERIODIC_RRM_MONITORING", + "name": "ESP_WIFI_ROAMING_PERIODIC_RRM_MONITORING", + "range": null, + "title": "Send periodic neighbor report request to AP for internal list updation", + "type": "bool" + } + ], + "depends_on": "ESP_WIFI_ENABLE_ROAMING_APP && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "id": "component-config-wi-fi-advanced-support-for-wi-fi-roaming-experimental--configure-roaming-app", + "title": "Configure roaming App", + "type": "menu" + } + ], + "depends_on": "IDF_EXPERIMENTAL_FEATURES && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Enable Espressif's roaming app to allow for efficient Wi-Fi roaming.\nThis includes configurable periodic environment scans, maintaining a cache of the\nbest APs, handling low rssi events etc.\n\nRisk Warning\nPlease note that this feature is still experimental and enabling this potentially can\nlead to unpredictable scanning, connection and roaming attempts.\nWe are still working on tuning and optimising this feature to ensure reliable and stable use.", + "id": "ESP_WIFI_ENABLE_ROAMING_APP", + "name": "ESP_WIFI_ENABLE_ROAMING_APP", + "range": null, + "title": "Advanced support for Wi-Fi Roaming (Experimental)", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Select this option to enable WiFi Easy Connect Support.", + "id": "ESP_WIFI_DPP_SUPPORT", + "name": "ESP_WIFI_DPP_SUPPORT", + "range": null, + "title": "Enable DPP support", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Select this option to enable WiFi Fast Transition Support.", + "id": "ESP_WIFI_11R_SUPPORT", + "name": "ESP_WIFI_11R_SUPPORT", + "range": null, + "title": "Enable 802.11R (Fast Transition) Support", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_WIFI_SOFTAP_SUPPORT && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Select this option to enable WPS registrar support in softAP mode.", + "id": "ESP_WIFI_WPS_SOFTAP_REGISTRAR", + "name": "ESP_WIFI_WPS_SOFTAP_REGISTRAR", + "range": null, + "title": "Add WPS Registrar support in SoftAP mode", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_WIFI_HE_SUPPORT && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Enable Wi-Fi transmission statistics. Total support 4 access category. Each access category\nwill use 346 bytes memory.", + "id": "ESP_WIFI_ENABLE_WIFI_TX_STATS", + "name": "ESP_WIFI_ENABLE_WIFI_TX_STATS", + "range": null, + "title": "Enable Wi-Fi transmission statistics", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_WIFI_ENABLE_WIFI_RX_STATS && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Enable Wi-Fi DL MU-MIMO and DL OFDMA reception statistics. Will use 10932 bytes memory.", + "id": "ESP_WIFI_ENABLE_WIFI_RX_MU_STATS", + "name": "ESP_WIFI_ENABLE_WIFI_RX_MU_STATS", + "range": null, + "title": "Enable Wi-Fi DL MU-MIMO and DL OFDMA reception statistics", + "type": "bool" + } + ], + "depends_on": "SOC_WIFI_HE_SUPPORT && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Enable Wi-Fi reception statistics. Total support 2 access category. Each access category\nwill use 190 bytes memory.", + "id": "ESP_WIFI_ENABLE_WIFI_RX_STATS", + "name": "ESP_WIFI_ENABLE_WIFI_RX_STATS", + "range": null, + "title": "Enable Wi-Fi reception statistics", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_WIFI_HE_SUPPORT && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Set the maximum number of queue that can be aggregated by the STA in the A-MPDU carried in the\nHE TB PPDU.", + "id": "ESP_WIFI_TX_HETB_QUEUE_NUM", + "name": "ESP_WIFI_TX_HETB_QUEUE_NUM", + "range": null, + "title": "WiFi TX HE TB QUEUE number for STA HE TB PPDU transmission", + "type": "int" + }, + { + "children": [], + "depends_on": "SOC_WIFI_SUPPORT_5G && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Enable Wi-Fi dump HE-SIGB which is contained in DL HE MU PPDUs.", + "id": "ESP_WIFI_ENABLE_DUMP_HESIGB", + "name": "ESP_WIFI_ENABLE_DUMP_HESIGB", + "range": null, + "title": "Enable Wi-Fi dump HE-SIGB which is contained in DL HE MU PPDUs", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_WIFI_SUPPORT_5G && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Enable Wi-Fi dump MU CFO.", + "id": "ESP_WIFI_ENABLE_DUMP_MU_CFO", + "name": "ESP_WIFI_ENABLE_DUMP_MU_CFO", + "range": null, + "title": "Enable Wi-Fi dump MU CFO", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_WIFI_SUPPORT_5G && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Enable Wi-Fi dump NDPA frames.", + "id": "ESP_WIFI_ENABLE_DUMP_CTRL_NDPA", + "name": "ESP_WIFI_ENABLE_DUMP_CTRL_NDPA", + "range": null, + "title": "Enable Wi-Fi dump NDPA frames", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_WIFI_SUPPORT_5G && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Enable Wi-Fi dump BFRP frames.", + "id": "ESP_WIFI_ENABLE_DUMP_CTRL_BFRP", + "name": "ESP_WIFI_ENABLE_DUMP_CTRL_BFRP", + "range": null, + "title": "Enable Wi-Fi dump BFRP frames", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Select this option to enable validate each WPS attribute\nrigorously. Disabling this add the workarounds with various APs.\nEnabling this may cause inter operability issues with some APs.", + "id": "ESP_WIFI_WPS_STRICT", + "name": "ESP_WIFI_WPS_STRICT", + "range": null, + "title": "Strictly validate all WPS attributes", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Select this option to get passphrase during WPS configuration.\nThis option fakes the virtual display capabilities to get the\nconfiguration in passphrase mode.\nNot recommended to be used since WPS credentials should not\nbe shared to other devices, making it in readable format increases\nthat risk, also passphrase requires pbkdf2 to convert in psk.", + "id": "ESP_WIFI_WPS_PASSPHRASE", + "name": "ESP_WIFI_WPS_PASSPHRASE", + "range": null, + "title": "Get WPA2 passphrase in WPS config", + "type": "bool" + } + ], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "id": "component-config-wi-fi-wps-configuration-options", + "title": "WPS Configuration Options", + "type": "menu" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Select this option to print logging information from WPA supplicant,\nthis includes handshake information and key hex dumps depending\non the project logging level.\n\nEnabling this could increase the build size ~60kb\ndepending on the project logging level.", + "id": "ESP_WIFI_DEBUG_PRINT", + "name": "ESP_WIFI_DEBUG_PRINT", + "range": null, + "title": "Print debug messages from WPA Supplicant", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Select this to enable unity test for DPP.", + "id": "ESP_WIFI_TESTING_OPTIONS", + "name": "ESP_WIFI_TESTING_OPTIONS", + "range": null, + "title": "Add DPP testing code", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "ESP_WIFI_ENTERPRISE_SUPPORT && (ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED)", + "help": "Select this configuration to free dynamic buffers during WiFi enterprise connection.\nThis will enable chip to reduce heap consumption during WiFi enterprise connection.", + "id": "ESP_WIFI_ENT_FREE_DYNAMIC_BUFFER", + "name": "ESP_WIFI_ENT_FREE_DYNAMIC_BUFFER", + "range": null, + "title": "Free dynamic buffers during WiFi enterprise connection", + "type": "bool" + } + ], + "depends_on": "ESP_WIFI_ENABLED || ESP_HOST_WIFI_ENABLED", + "help": "Select this to enable/disable enterprise connection support.\n\ndisabling this will reduce binary size.\ndisabling this will disable the use of any esp_wifi_sta_wpa2_ent_* (as APIs will be meaningless)\n\nNote that when using bigger certificates on low-power chips without crypto\nhardware acceleration, it is recommended to adjust the task watchdog timer (TWDT)\nif it is enabled. For precise information on timing requirements, you can check\nperformance numbers at https://github.com/espressif/mbedtls/wiki/Performance-Numbers.", + "id": "ESP_WIFI_ENTERPRISE_SUPPORT", + "name": "ESP_WIFI_ENTERPRISE_SUPPORT", + "range": null, + "title": "Enable enterprise option", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-wi-fi", + "title": "Wi-Fi", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_COREDUMP_ENABLE_TO_FLASH", + "name": "ESP_COREDUMP_ENABLE_TO_FLASH", + "range": null, + "title": "Flash", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_COREDUMP_ENABLE_TO_UART", + "name": "ESP_COREDUMP_ENABLE_TO_UART", + "range": null, + "title": "UART", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_COREDUMP_ENABLE_TO_NONE", + "name": "ESP_COREDUMP_ENABLE_TO_NONE", + "range": null, + "title": "None", + "type": "bool" + } + ], + "depends_on": null, + "help": "Select place to store core dump: flash, uart or none (to disable core dumps generation).\n\nCore dumps to Flash are not available if PSRAM is used for task stacks.\n\nIf core dump is configured to be stored in flash and custom partition table is used add\ncorresponding entry to your CSV. For examples, please see predefined partition table CSV descriptions\nin the components/partition_table directory.", + "id": "component-config-core-dump-data-destination", + "name": "ESP_COREDUMP_TO_FLASH_OR_UART", + "title": "Data destination", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_COREDUMP_DATA_FORMAT_BIN", + "name": "ESP_COREDUMP_DATA_FORMAT_BIN", + "range": null, + "title": "Binary format", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_COREDUMP_DATA_FORMAT_ELF", + "name": "ESP_COREDUMP_DATA_FORMAT_ELF", + "range": null, + "title": "ELF format", + "type": "bool" + } + ], + "depends_on": "!ESP_COREDUMP_ENABLE_TO_NONE", + "help": "Select the data format for core dump.", + "id": "component-config-core-dump-core-dump-data-format", + "name": "ESP_COREDUMP_DATA_FORMAT", + "title": "Core dump data format", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_COREDUMP_CHECKSUM_CRC32", + "name": "ESP_COREDUMP_CHECKSUM_CRC32", + "range": null, + "title": "Use CRC32 for integrity verification", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_COREDUMP_DATA_FORMAT_ELF && ", + "help": null, + "id": "ESP_COREDUMP_CHECKSUM_SHA256", + "name": "ESP_COREDUMP_CHECKSUM_SHA256", + "range": null, + "title": "Use SHA256 for integrity verification", + "type": "bool" + } + ], + "depends_on": "!ESP_COREDUMP_ENABLE_TO_NONE", + "help": "Select the integrity check for the core dump.", + "id": "component-config-core-dump-core-dump-data-integrity-check", + "name": "ESP_COREDUMP_CHECKSUM", + "title": "Core dump data integrity check", + "type": "choice" + }, + { + "children": [], + "depends_on": "ESP_COREDUMP_DATA_FORMAT_ELF", + "help": "Storing these sections can help with easier debugging and troubleshooting.\nHowever, additional storage space will be required in the core dump partition.\nAt least 128KB should be reserved, but the actual amount required may vary based\non the application's DRAM usage.\nNote that sections located in external RAM will not be stored.", + "id": "ESP_COREDUMP_CAPTURE_DRAM", + "name": "ESP_COREDUMP_CAPTURE_DRAM", + "range": null, + "title": "Include whole .bss and .data sections and heap data into core dump file", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_COREDUMP_ENABLE_TO_FLASH", + "help": "When enabled, if any data are found on the flash core dump partition,\nthey will be checked by calculating their checksum.", + "id": "ESP_COREDUMP_CHECK_BOOT", + "name": "ESP_COREDUMP_CHECK_BOOT", + "range": null, + "title": "Check core dump data integrity on boot", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enables/disable core dump module.", + "id": "ESP_COREDUMP_ENABLE", + "name": "ESP_COREDUMP_ENABLE", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_COREDUMP_ENABLE", + "help": "Enable/disable coredump logs. Logs strings from espcoredump component are\nplaced in DRAM. Disabling these helps to save ~5KB of internal memory.", + "id": "ESP_COREDUMP_LOGS", + "name": "ESP_COREDUMP_LOGS", + "range": null, + "title": "Enable coredump logs for debugging", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_COREDUMP_ENABLE", + "help": "Maximum number of tasks snapshots in core dump.", + "id": "ESP_COREDUMP_MAX_TASKS_NUM", + "name": "ESP_COREDUMP_MAX_TASKS_NUM", + "range": null, + "title": "Maximum number of tasks", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_COREDUMP_ENABLE_TO_UART", + "help": "Config delay (in ms) before printing core dump to UART.\nDelay can be interrupted by pressing Enter key.", + "id": "ESP_COREDUMP_UART_DELAY", + "name": "ESP_COREDUMP_UART_DELAY", + "range": null, + "title": "Delay before print to UART", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_COREDUMP_ENABLE_TO_FLASH", + "help": "Don't overwrite an existing core dump already present in flash.\nEnable this option to only keep the first of multiple core dumps.\n\nIf enabled, the core dump partition must be erased before the first\ncore dump can be written.", + "id": "ESP_COREDUMP_FLASH_NO_OVERWRITE", + "name": "ESP_COREDUMP_FLASH_NO_OVERWRITE", + "range": null, + "title": "Don't overwrite existing core dump", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Force the use of a custom DRAM stack for coredump when Task stacks can be in PSRAM.", + "id": "ESP_COREDUMP_USE_STACK_SIZE", + "name": "ESP_COREDUMP_USE_STACK_SIZE", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_COREDUMP_ENABLE", + "help": "Size of the memory to be reserved for core dump stack. If 0 core dump process will run on\nthe stack of crashed task/ISR, otherwise special stack will be allocated.\nTo ensure that core dump itself will not overflow task/ISR stack set this to the value around 1300-1800\ndepending on the chosen checksum calculation method. SHA256 method needs more stack space than CRC32.\nNOTE: It eats DRAM.", + "id": "ESP_COREDUMP_STACK_SIZE", + "name": "ESP_COREDUMP_STACK_SIZE", + "range": null, + "title": "Reserved stack size", + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_COREDUMP_DATA_FORMAT_ELF && ESP_COREDUMP_ENABLE_TO_FLASH && IDF_TARGET_ARCH_RISCV", + "help": "Size of the buffer that would be reserved for extracting backtrace info summary.\nThis buffer will contain the stack dump of the crashed task. This dump is useful in generating backtrace", + "id": "ESP_COREDUMP_SUMMARY_STACKDUMP_SIZE", + "name": "ESP_COREDUMP_SUMMARY_STACKDUMP_SIZE", + "range": null, + "title": "Size of the stack dump buffer", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_COREDUMP_DECODE_INFO", + "name": "ESP_COREDUMP_DECODE_INFO", + "range": null, + "title": "Decode and show summary (info_corefile)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "ESP_COREDUMP_DECODE_DISABLE", + "name": "ESP_COREDUMP_DECODE_DISABLE", + "range": null, + "title": "Don't decode", + "type": "bool" + } + ], + "depends_on": "ESP_COREDUMP_ENABLE_TO_UART", + "help": null, + "id": "component-config-core-dump-handling-of-uart-core-dumps-in-idf-monitor", + "name": "ESP_COREDUMP_DECODE", + "title": "Handling of UART core dumps in IDF Monitor", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "ESP_COREDUMP_DECODE", + "name": "ESP_COREDUMP_DECODE", + "range": null, + "title": null, + "type": "string" + } + ], + "depends_on": null, + "id": "component-config-core-dump", + "title": "Core dump", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "Number of volumes (logical drives) to use.", + "id": "FATFS_VOLUME_COUNT", + "name": "FATFS_VOLUME_COUNT", + "range": [ + 1, + 10 + ], + "title": "Number of volumes", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_LFN_NONE", + "name": "FATFS_LFN_NONE", + "range": null, + "title": "No long filenames", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_LFN_HEAP", + "name": "FATFS_LFN_HEAP", + "range": null, + "title": "Long filename buffer in heap", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_LFN_STACK", + "name": "FATFS_LFN_STACK", + "range": null, + "title": "Long filename buffer on stack", + "type": "bool" + } + ], + "depends_on": null, + "help": "Support long filenames in FAT. Long filename data increases\nmemory usage. FATFS can be configured to store the buffer for\nlong filename data in stack or heap.", + "id": "component-config-fat-filesystem-support-long-filename-support", + "name": "FATFS_LONG_FILENAMES", + "title": "Long filename support", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_SECTOR_512", + "name": "FATFS_SECTOR_512", + "range": null, + "title": "512", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_SECTOR_4096", + "name": "FATFS_SECTOR_4096", + "range": null, + "title": "4096", + "type": "bool" + } + ], + "depends_on": null, + "help": "Specify the size of the sector in bytes for FATFS partition generator.", + "id": "component-config-fat-filesystem-support-sector-size", + "name": "FATFS_SECTOR_SIZE", + "title": "Sector size", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_CODEPAGE_DYNAMIC", + "name": "FATFS_CODEPAGE_DYNAMIC", + "range": null, + "title": "Dynamic (all code pages supported)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_CODEPAGE_437", + "name": "FATFS_CODEPAGE_437", + "range": null, + "title": "US (CP437)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_CODEPAGE_720", + "name": "FATFS_CODEPAGE_720", + "range": null, + "title": "Arabic (CP720)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_CODEPAGE_737", + "name": "FATFS_CODEPAGE_737", + "range": null, + "title": "Greek (CP737)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_CODEPAGE_771", + "name": "FATFS_CODEPAGE_771", + "range": null, + "title": "KBL (CP771)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_CODEPAGE_775", + "name": "FATFS_CODEPAGE_775", + "range": null, + "title": "Baltic (CP775)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_CODEPAGE_850", + "name": "FATFS_CODEPAGE_850", + "range": null, + "title": "Latin 1 (CP850)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_CODEPAGE_852", + "name": "FATFS_CODEPAGE_852", + "range": null, + "title": "Latin 2 (CP852)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_CODEPAGE_855", + "name": "FATFS_CODEPAGE_855", + "range": null, + "title": "Cyrillic (CP855)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_CODEPAGE_857", + "name": "FATFS_CODEPAGE_857", + "range": null, + "title": "Turkish (CP857)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_CODEPAGE_860", + "name": "FATFS_CODEPAGE_860", + "range": null, + "title": "Portuguese (CP860)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_CODEPAGE_861", + "name": "FATFS_CODEPAGE_861", + "range": null, + "title": "Icelandic (CP861)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_CODEPAGE_862", + "name": "FATFS_CODEPAGE_862", + "range": null, + "title": "Hebrew (CP862)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_CODEPAGE_863", + "name": "FATFS_CODEPAGE_863", + "range": null, + "title": "Canadian French (CP863)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_CODEPAGE_864", + "name": "FATFS_CODEPAGE_864", + "range": null, + "title": "Arabic (CP864)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_CODEPAGE_865", + "name": "FATFS_CODEPAGE_865", + "range": null, + "title": "Nordic (CP865)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_CODEPAGE_866", + "name": "FATFS_CODEPAGE_866", + "range": null, + "title": "Russian (CP866)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_CODEPAGE_869", + "name": "FATFS_CODEPAGE_869", + "range": null, + "title": "Greek 2 (CP869)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_CODEPAGE_932", + "name": "FATFS_CODEPAGE_932", + "range": null, + "title": "Japanese (DBCS) (CP932)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_CODEPAGE_936", + "name": "FATFS_CODEPAGE_936", + "range": null, + "title": "Simplified Chinese (DBCS) (CP936)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_CODEPAGE_949", + "name": "FATFS_CODEPAGE_949", + "range": null, + "title": "Korean (DBCS) (CP949)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_CODEPAGE_950", + "name": "FATFS_CODEPAGE_950", + "range": null, + "title": "Traditional Chinese (DBCS) (CP950)", + "type": "bool" + } + ], + "depends_on": null, + "help": "OEM code page used for file name encodings.\n\nIf \"Dynamic\" is selected, code page can be chosen at runtime using\nf_setcp function. Note that choosing this option will increase\napplication size by ~480kB.", + "id": "component-config-fat-filesystem-support-oem-code-page", + "name": "FATFS_CHOOSE_CODEPAGE", + "title": "OEM Code Page", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "FATFS_CODEPAGE", + "name": "FATFS_CODEPAGE", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "!FATFS_LFN_NONE", + "help": "Maximum long filename length. Can be reduced to save RAM.", + "id": "FATFS_MAX_LFN", + "name": "FATFS_MAX_LFN", + "range": null, + "title": "Max long filename length", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_API_ENCODING_ANSI_OEM", + "name": "FATFS_API_ENCODING_ANSI_OEM", + "range": null, + "title": "API uses ANSI/OEM encoding", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_API_ENCODING_UTF_8", + "name": "FATFS_API_ENCODING_UTF_8", + "range": null, + "title": "API uses UTF-8 encoding", + "type": "bool" + } + ], + "depends_on": "!FATFS_LFN_NONE", + "help": "Choose encoding for character and string arguments/returns when using\nFATFS APIs. The encoding of arguments will usually depend on text\neditor settings.", + "id": "component-config-fat-filesystem-support-api-character-encoding", + "name": "FATFS_API_ENCODING", + "title": "API character encoding", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": "This option sets the FATFS configuration value _FS_LOCK.\nThe option _FS_LOCK switches file lock function to control duplicated file open\nand illegal operation to open objects.\n\n* 0: Disable file lock function. To avoid volume corruption, application\nshould avoid illegal open, remove and rename to the open objects.\n\n* >0: Enable file lock function. The value defines how many files/sub-directories\ncan be opened simultaneously under file lock control.\n\nNote that the file lock control is independent of re-entrancy.", + "id": "FATFS_FS_LOCK", + "name": "FATFS_FS_LOCK", + "range": [ + 0, + 65535 + ], + "title": "Number of simultaneously open files protected by lock function", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "This option sets FATFS configuration value _FS_TIMEOUT, scaled to milliseconds.\nSets the number of milliseconds FATFS will wait to acquire a mutex when\noperating on an open file. For example, if one task is performing a lengthy\noperation, another task will wait for the first task to release the lock,\nand time out after amount of time set by this option.", + "id": "FATFS_TIMEOUT_MS", + "name": "FATFS_TIMEOUT_MS", + "range": null, + "title": "Timeout for acquiring a file lock, ms", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "This option affects FATFS configuration value _FS_TINY.\n\nIf this option is set, _FS_TINY is 0, and each open file has its own cache,\nsize of the cache is equal to the _MAX_SS variable (512 or 4096 bytes).\nThis option uses more RAM if more than 1 file is open, but needs less reads\nand writes to the storage for some operations.\n\nIf this option is not set, _FS_TINY is 1, and single cache is used for\nall open files, size is also equal to _MAX_SS variable. This reduces the\namount of heap used when multiple files are open, but increases the number\nof read and write operations which FATFS needs to make.", + "id": "FATFS_PER_FILE_CACHE", + "name": "FATFS_PER_FILE_CACHE", + "range": null, + "title": "Use separate cache for each file", + "type": "bool" + }, + { + "children": [], + "depends_on": "SPIRAM_USE_CAPS_ALLOC || SPIRAM_USE_MALLOC", + "help": "When the option is enabled, internal buffers used by FATFS will be allocated\nfrom external RAM. If the allocation from external RAM fails, the buffer will\nbe allocated from the internal RAM.\nDisable this option if optimizing for performance. Enable this option if\noptimizing for internal memory size.", + "id": "FATFS_ALLOC_PREFER_EXTRAM", + "name": "FATFS_ALLOC_PREFER_EXTRAM", + "range": null, + "title": "Prefer external RAM when allocating FATFS buffers", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "The fast seek feature enables fast backward/long seek operations without\nFAT access by using an in-memory CLMT (cluster link map table).\nPlease note, fast-seek is only allowed for read-mode files, if a\nfile is opened in write-mode, the seek mechanism will automatically fallback\nto the default implementation.", + "id": "FATFS_USE_FASTSEEK", + "name": "FATFS_USE_FASTSEEK", + "range": null, + "title": "Enable fast seek algorithm when using lseek function through VFS FAT", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_USE_STRFUNC_NONE", + "name": "FATFS_USE_STRFUNC_NONE", + "range": null, + "title": "0:Disable", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_USE_STRFUNC_WITHOUT_CRLF_CONV", + "name": "FATFS_USE_STRFUNC_WITHOUT_CRLF_CONV", + "range": null, + "title": "1:Enable without LF-CRLF conversion", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_USE_STRFUNC_WITH_CRLF_CONV", + "name": "FATFS_USE_STRFUNC_WITH_CRLF_CONV", + "range": null, + "title": "2:Enable with LF-CRLF conversion", + "type": "bool" + } + ], + "depends_on": null, + "help": "These are specialized alternatives to stdio functions for working\ndirectly with FATFS without VFS. Legacy code may need functions,\nbut for new development, it is advised to use stdio under VFS.\n\n0: Disable. FF_PRINT_LLI, FF_PRINT_FLOAT and FF_STRF_ENCODE have no effect.\n1: Enable without LF-CRLF conversion.\n2: Enable with LF-CRLF conversion.", + "id": "component-config-fat-filesystem-support-enable-string-functions-f_gets-f_putc-f_puts-and-f_printf-", + "name": "FATFS_USE_STRFUNC_CHOICE", + "title": "Enable string functions, f_gets(), f_putc(), f_puts() and f_printf()", + "type": "choice" + }, + { + "children": [], + "depends_on": "!FATFS_USE_STRFUNC_NONE", + "help": null, + "id": "FATFS_PRINT_LLI", + "name": "FATFS_PRINT_LLI", + "range": null, + "title": "Make fatfs f_printf() support long long argument", + "type": "bool" + }, + { + "children": [], + "depends_on": "!FATFS_USE_STRFUNC_NONE", + "help": null, + "id": "FATFS_PRINT_FLOAT", + "name": "FATFS_PRINT_FLOAT", + "range": null, + "title": "Make fatfs f_printf() support floating point argument", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_STRF_ENCODE_ANSI", + "name": "FATFS_STRF_ENCODE_ANSI", + "range": null, + "title": "0:ANSI/OEM in current CP", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_STRF_ENCODE_UTF16LE", + "name": "FATFS_STRF_ENCODE_UTF16LE", + "range": null, + "title": "1:Unicode in UTF-16LE", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_STRF_ENCODE_UTF16BE", + "name": "FATFS_STRF_ENCODE_UTF16BE", + "range": null, + "title": "2:Unicode in UTF-16BE", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FATFS_STRF_ENCODE_UTF8", + "name": "FATFS_STRF_ENCODE_UTF8", + "range": null, + "title": "3:Unicode in UTF-8", + "type": "bool" + } + ], + "depends_on": "!FATFS_LFN_NONE && !FATFS_USE_STRFUNC_NONE", + "help": "When FF_LFN_UNICODE >= 1 with LFN enabled, string functions convert the character\nencoding in it. FF_STRF_ENCODE selects assumption of character encoding ON THE FILE\nto be read/written via those functions.\n0: ANSI/OEM in current CP\n1: Unicode in UTF-16LE\n2: Unicode in UTF-16BE\n3: Unicode in UTF-8", + "id": "component-config-fat-filesystem-support-fatfs-string-functions-convert-character-encoding", + "name": "FATFS_STRF_ENCODE_CHOICE", + "title": "FatFS string functions: convert character encoding", + "type": "choice" + }, + { + "children": [], + "depends_on": "FATFS_USE_FASTSEEK", + "help": "If fast seek algorithm is enabled, this defines the size of\nCLMT buffer used by this algorithm in 32-bit word units.\nThis value should be chosen based on prior knowledge of\nmaximum elements of each file entry would store.", + "id": "FATFS_FAST_SEEK_BUFFER_SIZE", + "name": "FATFS_FAST_SEEK_BUFFER_SIZE", + "range": null, + "title": "Fast seek CLMT buffer size", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "If set to 0, the 'newlib' library's default size (BLKSIZ) is used (128 B).\nIf set to a non-zero value, the value is used as the block size.\nDefault file buffer size is set to this value\nand the buffer is allocated when first attempt of reading/writing to a file is made.\nIncreasing this value improves fread() speed, however the heap usage is increased as well.\n\nNOTE: The block size value is shared by all the filesystem functions\naccessing target media for given file descriptor!\nSee 'Improving I/O performance' section of 'Maximizing Execution Speed' documentation page\nfor more details.", + "id": "FATFS_VFS_FSTAT_BLKSIZE", + "name": "FATFS_VFS_FSTAT_BLKSIZE", + "range": null, + "title": "Default block size", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Enables automatic calling of f_sync() to flush recent file changes after each call of vfs_fat_write(),\nvfs_fat_pwrite(), vfs_fat_link(), vfs_fat_truncate() and vfs_fat_ftruncate() functions.\nThis feature improves file-consistency and size reporting accuracy for the FatFS,\nat a price on decreased performance due to frequent disk operations", + "id": "FATFS_IMMEDIATE_FSYNC", + "name": "FATFS_IMMEDIATE_FSYNC", + "range": null, + "title": "Enable automatic f_sync", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Allows FATFS volume label to be specified using f_setlabel", + "id": "FATFS_USE_LABEL", + "name": "FATFS_USE_LABEL", + "range": null, + "title": "Use FATFS volume label", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "If enabled, the whole link operation (including file copying) is performed under lock.\nThis ensures that the link operation is atomic, but may cause performance for large files.\nIt may create less fragmented file copy.", + "id": "FATFS_LINK_LOCK", + "name": "FATFS_LINK_LOCK", + "range": null, + "title": "Perform the whole link operation under lock", + "type": "bool" + }, + { + "children": [], + "depends_on": "CONFIG_WL_SECTOR_SIZE_4096", + "help": "If enabled, the buffers used by FATFS will be allocated separately from the rest of the structure.\nThis option is useful when using multiple FATFS instances with different\nsector sizes, as the buffers will be allocated according to the sector size.\nIf disabled, the greatest sector size will be used for all FATFS instances.\n(In most cases, this would be the sector size of Wear Levelling library)\nThis might cause more memory to be used than necessary.", + "id": "FATFS_USE_DYN_BUFFERS", + "name": "FATFS_USE_DYN_BUFFERS", + "range": null, + "title": "Use dynamic buffers", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-fat-filesystem-support", + "title": "FAT Filesystem support", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "!IDF_TARGET_ESP32P4", + "help": "Amazon has released an SMP version of the FreeRTOS Kernel which can be found via the following link:\nhttps://github.com/FreeRTOS/FreeRTOS-Kernel/tree/smp\n\nIDF has added an experimental port of this SMP kernel located in\ncomponents/freertos/FreeRTOS-Kernel-SMP. Enabling this option will cause IDF to use the Amazon SMP\nkernel. Note that THIS FEATURE IS UNDER ACTIVE DEVELOPMENT, users use this at their own risk.\n\nLeaving this option disabled will mean the IDF FreeRTOS kernel is used instead, which is located in:\ncomponents/freertos/FreeRTOS-Kernel. Both kernel versions are SMP capable, but differ in\ntheir implementation and features.", + "id": "FREERTOS_SMP", + "name": "FREERTOS_SMP", + "range": null, + "title": "Run the Amazon SMP FreeRTOS kernel instead (FEATURE UNDER DEVELOPMENT)", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "This version of FreeRTOS normally takes control of all cores of the CPU. Select this if you only want\nto start it on the first core. This is needed when e.g. another process needs complete control over the\nsecond core.", + "id": "FREERTOS_UNICORE", + "name": "FREERTOS_UNICORE", + "range": null, + "title": "Run FreeRTOS only on first core", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Sets the FreeRTOS tick interrupt frequency in Hz (see configTICK_RATE_HZ documentation for more\ndetails).", + "id": "FREERTOS_HZ", + "name": "FREERTOS_HZ", + "range": [ + 1, + 1000 + ], + "title": "configTICK_RATE_HZ", + "type": "int" + }, + { + "children": [], + "depends_on": "FREERTOS_UNICORE && !FREERTOS_SMP", + "help": "Enables port specific task selection method. This option can speed up the search of ready tasks\nwhen scheduling (see configUSE_PORT_OPTIMISED_TASK_SELECTION documentation for more details).", + "id": "FREERTOS_OPTIMIZED_SCHEDULER", + "name": "FREERTOS_OPTIMIZED_SCHEDULER", + "range": null, + "title": "configUSE_PORT_OPTIMISED_TASK_SELECTION", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": "Do not check for stack overflows (configCHECK_FOR_STACK_OVERFLOW = 0)", + "id": "FREERTOS_CHECK_STACKOVERFLOW_NONE", + "name": "FREERTOS_CHECK_STACKOVERFLOW_NONE", + "range": null, + "title": "No checking", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "Check for stack overflows on each context switch by checking if the stack pointer is in a valid\nrange. Quick but does not detect stack overflows that happened between context switches\n(configCHECK_FOR_STACK_OVERFLOW = 1)", + "id": "FREERTOS_CHECK_STACKOVERFLOW_PTRVAL", + "name": "FREERTOS_CHECK_STACKOVERFLOW_PTRVAL", + "range": null, + "title": "Check by stack pointer value (Method 1)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "Places some magic bytes at the end of the stack area and on each context switch, check if these\nbytes are still intact. More thorough than just checking the pointer, but also slightly slower.\n(configCHECK_FOR_STACK_OVERFLOW = 2)", + "id": "FREERTOS_CHECK_STACKOVERFLOW_CANARY", + "name": "FREERTOS_CHECK_STACKOVERFLOW_CANARY", + "range": null, + "title": "Check using canary bytes (Method 2)", + "type": "bool" + } + ], + "depends_on": null, + "help": "Enables FreeRTOS to check for stack overflows (see configCHECK_FOR_STACK_OVERFLOW documentation for\nmore details).\n\nNote: If users do not provide their own ``vApplicationStackOverflowHook()`` function, a default\nfunction will be provided by ESP-IDF.", + "id": "component-config-freertos-kernel-configcheck_for_stack_overflow", + "name": "FREERTOS_CHECK_STACKOVERFLOW", + "title": "configCHECK_FOR_STACK_OVERFLOW", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": "Set the number of thread local storage pointers in each task (see\nconfigNUM_THREAD_LOCAL_STORAGE_POINTERS documentation for more details).\n\nNote: In ESP-IDF, this value must be at least 1. Index 0 is reserved for use by the pthreads API\nthread-local-storage. Other indexes can be used for any desired purpose.", + "id": "FREERTOS_THREAD_LOCAL_STORAGE_POINTERS", + "name": "FREERTOS_THREAD_LOCAL_STORAGE_POINTERS", + "range": [ + 1, + 256 + ], + "title": "configNUM_THREAD_LOCAL_STORAGE_POINTERS", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Sets the idle task stack size in bytes (see configMINIMAL_STACK_SIZE documentation for more details).\n\nNote:\n\n- ESP-IDF specifies stack sizes in bytes instead of words.\n- The default size is enough for most use cases.\n- The stack size may need to be increased above the default if the app installs idle or thread local\n storage cleanup hooks that use a lot of stack memory.\n- Conversely, the stack size can be reduced to the minimum if non of the idle features are used.", + "id": "FREERTOS_IDLE_TASK_STACKSIZE", + "name": "FREERTOS_IDLE_TASK_STACKSIZE", + "range": [ + 768, + 32768 + ], + "title": "configMINIMAL_STACK_SIZE (Idle task stack size)", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Enables the idle task application hook (see configUSE_IDLE_HOOK documentation for more details).\n\nNote:\n\n- The application must provide the hook function ``void vApplicationIdleHook( void );``\n- ``vApplicationIdleHook()`` is called from FreeRTOS idle task(s)\n- The FreeRTOS idle hook is NOT the same as the ESP-IDF Idle Hook, but both can be enabled\n simultaneously.", + "id": "FREERTOS_USE_IDLE_HOOK", + "name": "FREERTOS_USE_IDLE_HOOK", + "range": null, + "title": "configUSE_IDLE_HOOK", + "type": "bool" + }, + { + "children": [], + "depends_on": "FREERTOS_SMP", + "help": "Enables the minimal idle task application hook (see configUSE_IDLE_HOOK documentation for more\ndetails).\n\nNote:\n\n- The application must provide the hook function ``void vApplicationPassiveIdleHook( void );``\n- ``vApplicationPassiveIdleHook()`` is called from FreeRTOS minimal idle task(s)", + "id": "FREERTOS_USE_PASSIVE_IDLE_HOOK", + "name": "FREERTOS_USE_PASSIVE_IDLE_HOOK", + "range": null, + "title": "Use FreeRTOS minimal idle hook", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enables the tick hook (see configUSE_TICK_HOOK documentation for more details).\n\nNote:\n\n- The application must provide the hook function ``void vApplicationTickHook( void );``\n- ``vApplicationTickHook()`` is called from FreeRTOS's tick handling function ``xTaskIncrementTick()``\n- The FreeRTOS tick hook is NOT the same as the ESP-IDF Tick Interrupt Hook, but both can be enabled\n simultaneously.", + "id": "FREERTOS_USE_TICK_HOOK", + "name": "FREERTOS_USE_TICK_HOOK", + "range": null, + "title": "configUSE_TICK_HOOK", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Sets the maximum number of characters for task names (see configMAX_TASK_NAME_LEN documentation for\nmore details).\n\nNote: For most uses, the default of 16 characters is sufficient.", + "id": "FREERTOS_MAX_TASK_NAME_LEN", + "name": "FREERTOS_MAX_TASK_NAME_LEN", + "range": [ + 1, + 256 + ], + "title": "configMAX_TASK_NAME_LEN", + "type": "int" + }, + { + "children": [], + "depends_on": "!IDF_TARGET_LINUX", + "help": "Enable backward compatibility with APIs prior to FreeRTOS v8.0.0. (see\nconfigENABLE_BACKWARD_COMPATIBILITY documentation for more details).", + "id": "FREERTOS_ENABLE_BACKWARD_COMPATIBILITY", + "name": "FREERTOS_ENABLE_BACKWARD_COMPATIBILITY", + "range": null, + "title": "configENABLE_BACKWARD_COMPATIBILITY", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "FREERTOS_USE_TIMERS", + "help": "Sets the timer task's name (see configTIMER_SERVICE_TASK_NAME documentation for more details).", + "id": "FREERTOS_TIMER_SERVICE_TASK_NAME", + "name": "FREERTOS_TIMER_SERVICE_TASK_NAME", + "range": null, + "title": "configTIMER_SERVICE_TASK_NAME", + "type": "string" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "FREERTOS_TIMER_TASK_AFFINITY_CPU0", + "name": "FREERTOS_TIMER_TASK_AFFINITY_CPU0", + "range": null, + "title": "CPU0", + "type": "bool" + }, + { + "children": [], + "depends_on": "!FREERTOS_UNICORE && ", + "help": null, + "id": "FREERTOS_TIMER_TASK_AFFINITY_CPU1", + "name": "FREERTOS_TIMER_TASK_AFFINITY_CPU1", + "range": null, + "title": "CPU1", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "FREERTOS_TIMER_TASK_NO_AFFINITY", + "name": "FREERTOS_TIMER_TASK_NO_AFFINITY", + "range": null, + "title": "No affinity", + "type": "bool" + } + ], + "depends_on": "FREERTOS_USE_TIMERS", + "help": "Sets the timer task's core affinity\n(see configTIMER_SERVICE_TASK_CORE_AFFINITY documentation for more details).", + "id": "component-config-freertos-kernel-configuse_timers-configtimer_service_task_core_affinity", + "name": "FREERTOS_TIMER_SERVICE_TASK_CORE_AFFINITY", + "title": "configTIMER_SERVICE_TASK_CORE_AFFINITY", + "type": "choice" + }, + { + "children": [], + "depends_on": "FREERTOS_USE_TIMERS", + "help": null, + "id": "FREERTOS_TIMER_SERVICE_TASK_CORE_AFFINITY", + "name": "FREERTOS_TIMER_SERVICE_TASK_CORE_AFFINITY", + "range": null, + "title": null, + "type": "hex" + }, + { + "children": [], + "depends_on": "FREERTOS_USE_TIMERS", + "help": "Sets the timer task's priority (see configTIMER_TASK_PRIORITY documentation for more details).", + "id": "FREERTOS_TIMER_TASK_PRIORITY", + "name": "FREERTOS_TIMER_TASK_PRIORITY", + "range": [ + 1, + 25 + ], + "title": "configTIMER_TASK_PRIORITY", + "type": "int" + }, + { + "children": [], + "depends_on": "FREERTOS_USE_TIMERS", + "help": "Set the timer task's stack size (see configTIMER_TASK_STACK_DEPTH documentation for more details).", + "id": "FREERTOS_TIMER_TASK_STACK_DEPTH", + "name": "FREERTOS_TIMER_TASK_STACK_DEPTH", + "range": [ + 1536, + 32768 + ], + "title": "configTIMER_TASK_STACK_DEPTH", + "type": "int" + }, + { + "children": [], + "depends_on": "FREERTOS_USE_TIMERS", + "help": "Set the timer task's command queue length (see configTIMER_QUEUE_LENGTH documentation for more\ndetails).", + "id": "FREERTOS_TIMER_QUEUE_LENGTH", + "name": "FREERTOS_TIMER_QUEUE_LENGTH", + "range": [ + 5, + 20 + ], + "title": "configTIMER_QUEUE_LENGTH", + "type": "int" + } + ], + "depends_on": null, + "help": "Enable FreeRTOS Software Timers. Normally the timer task will only get pulled into the build\nand created if any software timer related functions are used. This is achieved through IDF\ndefining a weak empty function for xTimerCreateTimerTask, which should take effect if timers.c\nis not pulled into the build.\n\nIn certain special cases (if you use configUSE_TRACE_FACILITY=y and event groups) the linker will\nstill pull in the xTimerCreateTimerTask from timers.c even if the function that utilized it gets\ndiscarded due to not being used.\n\nIn these cases you can use this option to force the timer task to be disabled.", + "id": "FREERTOS_USE_TIMERS", + "name": "FREERTOS_USE_TIMERS", + "range": null, + "title": "configUSE_TIMERS", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Set the size of the queue registry (see configQUEUE_REGISTRY_SIZE documentation for more details).\n\nNote: A value of 0 will disable queue registry functionality", + "id": "FREERTOS_QUEUE_REGISTRY_SIZE", + "name": "FREERTOS_QUEUE_REGISTRY_SIZE", + "range": [ + 0, + 20 + ], + "title": "configQUEUE_REGISTRY_SIZE", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Set the size of the task notification array of each task. When increasing this value, keep in\nmind that this means additional memory for each and every task on the system.\nHowever, task notifications in general are more light weight compared to alternatives\nsuch as semaphores.", + "id": "FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES", + "name": "FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES", + "range": [ + 1, + 32 + ], + "title": "configTASK_NOTIFICATION_ARRAY_ENTRIES", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "FREERTOS_USE_TRACE_FACILITY", + "help": "Set configUSE_TRACE_FACILITY and configUSE_STATS_FORMATTING_FUNCTIONS to 1 to include the\n``vTaskList()`` and ``vTaskGetRunTimeStats()`` functions in the build (see\nconfigUSE_STATS_FORMATTING_FUNCTIONS documentation for more details).", + "id": "FREERTOS_USE_STATS_FORMATTING_FUNCTIONS", + "name": "FREERTOS_USE_STATS_FORMATTING_FUNCTIONS", + "range": null, + "title": "configUSE_STATS_FORMATTING_FUNCTIONS", + "type": "bool" + } + ], + "depends_on": null, + "help": "Enables additional structure members and functions to assist with execution visualization and tracing\n(see configUSE_TRACE_FACILITY documentation for more details).", + "id": "FREERTOS_USE_TRACE_FACILITY", + "name": "FREERTOS_USE_TRACE_FACILITY", + "range": null, + "title": "configUSE_TRACE_FACILITY", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enable list integrity checker\n(see configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES documentation for more details).", + "id": "FREERTOS_USE_LIST_DATA_INTEGRITY_CHECK_BYTES", + "name": "FREERTOS_USE_LIST_DATA_INTEGRITY_CHECK_BYTES", + "range": null, + "title": "configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES", + "type": "bool" + }, + { + "children": [], + "depends_on": "!FREERTOS_SMP && FREERTOS_USE_STATS_FORMATTING_FUNCTIONS", + "help": "If enabled, this will include an extra column when vTaskList is called to display the CoreID the task\nis pinned to (0,1) or -1 if not pinned.", + "id": "FREERTOS_VTASKLIST_INCLUDE_COREID", + "name": "FREERTOS_VTASKLIST_INCLUDE_COREID", + "range": null, + "title": "Enable display of xCoreID in vTaskList", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": "configRUN_TIME_COUNTER_TYPE is set to uint32_t", + "id": "FREERTOS_RUN_TIME_COUNTER_TYPE_U32", + "name": "FREERTOS_RUN_TIME_COUNTER_TYPE_U32", + "range": null, + "title": "uint32_t", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "configRUN_TIME_COUNTER_TYPE is set to uint64_t", + "id": "FREERTOS_RUN_TIME_COUNTER_TYPE_U64", + "name": "FREERTOS_RUN_TIME_COUNTER_TYPE_U64", + "range": null, + "title": "uint64_t", + "type": "bool" + } + ], + "depends_on": "FREERTOS_GENERATE_RUN_TIME_STATS && !FREERTOS_SMP", + "help": "Sets the data type used for the FreeRTOS run time stats. A larger data type can be used to reduce the\nfrequency of the counter overflowing.", + "id": "component-config-freertos-kernel-configgenerate_run_time_stats-configrun_time_counter_type", + "name": "FREERTOS_RUN_TIME_COUNTER_TYPE", + "title": "configRUN_TIME_COUNTER_TYPE", + "type": "choice" + } + ], + "depends_on": null, + "help": "Enables collection of run time statistics for each task (see configGENERATE_RUN_TIME_STATS\ndocumentation for more details).\n\nNote: The clock used for run time statistics can be configured in FREERTOS_RUN_TIME_STATS_CLK.", + "id": "FREERTOS_GENERATE_RUN_TIME_STATS", + "name": "FREERTOS_GENERATE_RUN_TIME_STATS", + "range": null, + "title": "configGENERATE_RUN_TIME_STATS", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "FREERTOS_USE_TICKLESS_IDLE", + "help": "FreeRTOS will enter light sleep mode if no tasks need to run for this number of ticks.\nYou can enable PM_PROFILING feature in esp_pm components and dump the sleep status with\nesp_pm_dump_locks, if the proportion of rejected sleeps is too high, please increase\nthis value to improve scheduling efficiency", + "id": "FREERTOS_IDLE_TIME_BEFORE_SLEEP", + "name": "FREERTOS_IDLE_TIME_BEFORE_SLEEP", + "range": null, + "title": "configEXPECTED_IDLE_TIME_BEFORE_SLEEP", + "type": "int" + } + ], + "depends_on": "PM_ENABLE", + "help": "If power management support is enabled, FreeRTOS will be able to put the system into light sleep mode\nwhen no tasks need to run for a number of ticks. This number can be set using\nFREERTOS_IDLE_TIME_BEFORE_SLEEP option. This feature is also known as \"automatic light sleep\".\n\nNote that timers created using esp_timer APIs may prevent the system from entering sleep mode, even\nwhen no tasks need to run. To skip unnecessary wake-up initialize a timer with the\n\"skip_unhandled_events\" option as true.\n\nIf disabled, automatic light sleep support will be disabled.", + "id": "FREERTOS_USE_TICKLESS_IDLE", + "name": "FREERTOS_USE_TICKLESS_IDLE", + "range": null, + "title": "configUSE_TICKLESS_IDLE", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enables task tagging functionality and its associated API (see configUSE_APPLICATION_TASK_TAG\ndocumentation for more details).", + "id": "FREERTOS_USE_APPLICATION_TASK_TAG", + "name": "FREERTOS_USE_APPLICATION_TASK_TAG", + "range": null, + "title": "configUSE_APPLICATION_TASK_TAG", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-freertos-kernel", + "title": "Kernel", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "COMPILER_OPTIMIZATION_DEBUG || ESP_COREDUMP_ENABLE || ESP_SYSTEM_PANIC_GDBSTUB || ESP_SYSTEM_GDBSTUB_RUNTIME", + "help": "If enabled, all FreeRTOS task functions will be enclosed in a wrapper function. If a task function\nmistakenly returns (i.e. does not delete), the call flow will return to the wrapper function. The\nwrapper function will then log an error and abort the application. This option is also required for GDB\nbacktraces and C++ exceptions to work correctly inside top-level task functions.", + "id": "FREERTOS_TASK_FUNCTION_WRAPPER", + "name": "FREERTOS_TASK_FUNCTION_WRAPPER", + "range": null, + "title": "Wrap task functions", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "FreeRTOS can check if a stack has overflown its bounds by checking either the value of the stack\npointer or by checking the integrity of canary bytes. (See FREERTOS_CHECK_STACKOVERFLOW for more\ninformation.) These checks only happen on a context switch, and the situation that caused the stack\noverflow may already be long gone by then. This option will use the last debug memory watchpoint to\nallow breaking into the debugger (or panic'ing) as soon as any of the last 32 bytes on the stack of a\ntask are overwritten. The side effect is that using gdb, you effectively have one hardware watchpoint\nless because the last one is overwritten as soon as a task switch happens.\n\nAnother consequence is that due to alignment requirements of the watchpoint, the usable stack size\ndecreases by up to 60 bytes. This is because the watchpoint region has to be aligned to its size and\nthe size for the stack watchpoint in IDF is 32 bytes.\n\nThis check only triggers if the stack overflow writes within 32 bytes near the end of the stack, rather\nthan overshooting further, so it is worth combining this approach with one of the other stack overflow\ncheck methods.\n\nWhen this watchpoint is hit, gdb will stop with a SIGTRAP message. When no JTAG OCD is attached,\nesp-idf will panic on an unhandled debug exception.", + "id": "FREERTOS_WATCHPOINT_END_OF_STACK", + "name": "FREERTOS_WATCHPOINT_END_OF_STACK", + "range": null, + "title": "Enable stack overflow debug watchpoint", + "type": "bool" + }, + { + "children": [], + "depends_on": "FREERTOS_THREAD_LOCAL_STORAGE_POINTERS > 0", + "help": "ESP-IDF provides users with the ability to free TLSP memory by registering TLSP deletion callbacks.\nThese callbacks are automatically called by FreeRTOS when a task is deleted. When this option is turned\non, the memory reserved for TLSPs in the TCB is doubled to make space for storing the deletion\ncallbacks. If the user does not wish to use TLSP deletion callbacks then this option could be turned\noff to save space in the TCB memory.", + "id": "FREERTOS_TLSP_DELETION_CALLBACKS", + "name": "FREERTOS_TLSP_DELETION_CALLBACKS", + "range": null, + "title": "Enable thread local storage pointers deletion callbacks", + "type": "bool" + }, + { + "children": [], + "depends_on": "!FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP", + "help": "Enable this option to make FreeRTOS call a user provided hook function right before it deletes a task\n(i.e., frees/releases a dynamically/statically allocated task's memory). This is useful if users want\nto know when a task is actually deleted (in case the task's deletion is delegated to the IDLE task).\n\nIf this config option is enabled, users must define a ``void vTaskPreDeletionHook( void * pxTCB )``\nhook function in their application.", + "id": "FREERTOS_TASK_PRE_DELETION_HOOK", + "name": "FREERTOS_TASK_PRE_DELETION_HOOK", + "range": null, + "title": "Enable task pre-deletion hook", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "THIS OPTION IS DEPRECATED. Use FREERTOS_TASK_PRE_DELETION_HOOK instead.\n\nEnable this option to make FreeRTOS call the static task clean up hook when a task is deleted.\n\nNote: Users will need to provide a ``void vPortCleanUpTCB ( void *pxTCB )`` callback", + "id": "FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP", + "name": "FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP", + "range": null, + "title": "Enable static task clean up hook (DEPRECATED)", + "type": "bool" + }, + { + "children": [], + "depends_on": "!FREERTOS_SMP", + "help": "If enabled, assert that when a mutex semaphore is given, the task giving the semaphore is the task\nwhich is currently holding the mutex.", + "id": "FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER", + "name": "FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER", + "range": null, + "title": "Check that mutex semaphore is given by owner task", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "The interrupt handlers have their own stack. The size of the stack can be defined here. Each processor\nhas its own stack, so the total size occupied will be twice this.", + "id": "FREERTOS_ISR_STACKSIZE", + "name": "FREERTOS_ISR_STACKSIZE", + "range": [ + 1536, + 32768 + ], + "title": "ISR stack size", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "If this option is enabled, interrupt stack frame will be modified to point to the code of the\ninterrupted task as its return address. This helps the debugger (or the panic handler) show a backtrace\nfrom the interrupt to the task which was interrupted. This also works for nested interrupts: higher\nlevel interrupt stack can be traced back to the lower level interrupt. This option adds 4 instructions\nto the interrupt dispatching code.", + "id": "FREERTOS_INTERRUPT_BACKTRACE", + "name": "FREERTOS_INTERRUPT_BACKTRACE", + "range": null, + "title": "Enable backtrace from interrupt to task context", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_CPU_HAS_FPU && (IDF_TARGET_ESP32 || IDF_TARGET_ESP32S3)", + "help": "When enabled, the usage of float type is allowed inside Level 1 ISRs. Note that usage of float types in\nhigher level interrupts is still not permitted.", + "id": "FREERTOS_FPU_IN_ISR", + "name": "FREERTOS_FPU_IN_ISR", + "range": null, + "title": "Use float in Level 1 ISR", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "FREERTOS_TICK_SUPPORT_CORETIMER", + "name": "FREERTOS_TICK_SUPPORT_CORETIMER", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "FREERTOS_TICK_SUPPORT_SYSTIMER", + "name": "FREERTOS_TICK_SUPPORT_SYSTIMER", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "FREERTOS_TICK_SUPPORT_CORETIMER && ", + "help": "Select this to use timer 0", + "id": "FREERTOS_CORETIMER_0", + "name": "FREERTOS_CORETIMER_0", + "range": null, + "title": "Timer 0 (int 6, level 1)", + "type": "bool" + }, + { + "children": [], + "depends_on": "FREERTOS_TICK_SUPPORT_CORETIMER && ", + "help": "Select this to use timer 1", + "id": "FREERTOS_CORETIMER_1", + "name": "FREERTOS_CORETIMER_1", + "range": null, + "title": "Timer 1 (int 15, level 3)", + "type": "bool" + }, + { + "children": [], + "depends_on": "FREERTOS_TICK_SUPPORT_SYSTIMER && ", + "help": "Select this to use systimer with the 1 interrupt priority.", + "id": "FREERTOS_CORETIMER_SYSTIMER_LVL1", + "name": "FREERTOS_CORETIMER_SYSTIMER_LVL1", + "range": null, + "title": "SYSTIMER 0 (level 1)", + "type": "bool" + }, + { + "children": [], + "depends_on": "FREERTOS_TICK_SUPPORT_SYSTIMER && ", + "help": "Select this to use systimer with the 3 interrupt priority.", + "id": "FREERTOS_CORETIMER_SYSTIMER_LVL3", + "name": "FREERTOS_CORETIMER_SYSTIMER_LVL3", + "range": null, + "title": "SYSTIMER 0 (level 3)", + "type": "bool" + } + ], + "depends_on": null, + "help": "FreeRTOS needs a timer with an associated interrupt to use as the main tick source to increase\ncounters, run timers and do pre-emptive multitasking with. There are multiple timers available to do\nthis, with different interrupt priorities.", + "id": "component-config-freertos-port-tick-timer-source-xtensa-only-", + "name": "FREERTOS_CORETIMER", + "title": "Tick timer source (Xtensa Only)", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "FREERTOS_SYSTICK_USES_SYSTIMER", + "name": "FREERTOS_SYSTICK_USES_SYSTIMER", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "FREERTOS_SYSTICK_USES_CCOUNT", + "name": "FREERTOS_SYSTICK_USES_CCOUNT", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": "ESP Timer will be used as the clock source for FreeRTOS run time stats. The ESP Timer runs at a\nfrequency of 1MHz regardless of Dynamic Frequency Scaling. Therefore the ESP Timer will overflow in\napproximately 4290 seconds.", + "id": "FREERTOS_RUN_TIME_STATS_USING_ESP_TIMER", + "name": "FREERTOS_RUN_TIME_STATS_USING_ESP_TIMER", + "range": null, + "title": "Use ESP TIMER for run time stats", + "type": "bool" + }, + { + "children": [], + "depends_on": "FREERTOS_SYSTICK_USES_CCOUNT && ", + "help": "CPU Clock will be used as the clock source for the generation of run time stats. The CPU Clock has\na frequency dependent on ESP_DEFAULT_CPU_FREQ_MHZ and Dynamic Frequency Scaling (DFS). Therefore\nthe CPU Clock frequency can fluctuate between 80 to 240MHz. Run time stats generated using the CPU\nClock represents the number of CPU cycles each task is allocated and DOES NOT reflect the amount of\ntime each task runs for (as CPU clock frequency can change). If the CPU clock consistently runs at\nthe maximum frequency of 240MHz, it will overflow in approximately 17 seconds.", + "id": "FREERTOS_RUN_TIME_STATS_USING_CPU_CLK", + "name": "FREERTOS_RUN_TIME_STATS_USING_CPU_CLK", + "range": null, + "title": "Use CPU Clock for run time stats", + "type": "bool" + } + ], + "depends_on": "FREERTOS_GENERATE_RUN_TIME_STATS", + "help": "Choose the clock source for FreeRTOS run time stats. Options are CPU0's CPU Clock or the ESP Timer.\nBoth clock sources are 32 bits. The CPU Clock can run at a higher frequency hence provide a finer\nresolution but will overflow much quicker. Note that run time stats are only valid until the clock\nsource overflows.", + "id": "component-config-freertos-port-choose-the-clock-source-for-run-time-stats", + "name": "FREERTOS_RUN_TIME_STATS_CLK", + "title": "Choose the clock source for run time stats", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": "When enabled the selected Non-ISR FreeRTOS functions will be placed into Flash memory instead of IRAM.\nThis saves up to 8KB of IRAM depending on which functions are used.", + "id": "FREERTOS_PLACE_FUNCTIONS_INTO_FLASH", + "name": "FREERTOS_PLACE_FUNCTIONS_INTO_FLASH", + "range": null, + "title": "Place FreeRTOS functions into Flash", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "If enabled, context of port*_CRITICAL calls (ISR or Non-ISR) would be checked to be in compliance with\nVanilla FreeRTOS. e.g Calling port*_CRITICAL from ISR context would cause assert failure", + "id": "FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE", + "name": "FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE", + "range": null, + "title": "Tests compliance with Vanilla FreeRTOS port*_CRITICAL calls", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-freertos-port", + "title": "Port", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SPIRAM && FREERTOS_SUPPORT_STATIC_ALLOCATION", + "help": "Accessing memory in PSRAM has certain restrictions, so task stacks allocated by xTaskCreate\nare by default allocated from internal RAM.\n\nThis option allows for passing memory allocated from SPIRAM to be passed to xTaskCreateStatic.\nThis should only be used for tasks where the stack is never accessed while the cache is disabled.\n\nExtra notes for ESP32:\n\nBecause some bits of the ESP32 code environment cannot be recompiled with the cache workaround,\nnormally tasks cannot be safely run with their stack residing in external memory; for this reason\nxTaskCreate (and related task creation functions) always allocate stack in internal memory and\nxTaskCreateStatic will check if the memory passed to it is in internal memory.\nIf you have a task that needs a large amount of stack and does not call on ROM code in any way\n(no direct calls, but also no Bluetooth/WiFi), you can try enable this to\ncause xTaskCreateStatic to allow tasks stack in external memory.", + "id": "FREERTOS_TASK_CREATE_ALLOW_EXT_MEM", + "name": "FREERTOS_TASK_CREATE_ALLOW_EXT_MEM", + "range": null, + "title": "Allow external memory as an argument to xTaskCreateStatic (READ HELP)", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-freertos-extra", + "title": "Extra", + "type": "menu" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "FREERTOS_PORT", + "name": "FREERTOS_PORT", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "FREERTOS_NO_AFFINITY", + "name": "FREERTOS_NO_AFFINITY", + "range": null, + "title": null, + "type": "hex" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "FREERTOS_SUPPORT_STATIC_ALLOCATION", + "name": "FREERTOS_SUPPORT_STATIC_ALLOCATION", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Hidden option, gets selected by CONFIG_ESP_DEBUG_OCDAWARE", + "id": "FREERTOS_DEBUG_OCDAWARE", + "name": "FREERTOS_DEBUG_OCDAWARE", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "FREERTOS_ENABLE_TASK_SNAPSHOT", + "name": "FREERTOS_ENABLE_TASK_SNAPSHOT", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "!ESP_PANIC_HANDLER_IRAM", + "help": null, + "id": "FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH", + "name": "FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "FREERTOS_NUMBER_OF_CORES", + "name": "FREERTOS_NUMBER_OF_CORES", + "range": [ + 1, + 2 + ], + "title": null, + "type": "int" + } + ], + "depends_on": null, + "id": "component-config-freertos", + "title": "FreeRTOS", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "HAL_ASSERTION_EQUALS_SYSTEM", + "name": "HAL_ASSERTION_EQUALS_SYSTEM", + "range": null, + "title": "Same as system assertion level", + "type": "bool" + }, + { + "children": [], + "depends_on": "COMPILER_OPTIMIZATION_ASSERTION_LEVEL >= 0 && ", + "help": null, + "id": "HAL_ASSERTION_DISABLE", + "name": "HAL_ASSERTION_DISABLE", + "range": null, + "title": "Disabled", + "type": "bool" + }, + { + "children": [], + "depends_on": "COMPILER_OPTIMIZATION_ASSERTION_LEVEL >= 1 && ", + "help": null, + "id": "HAL_ASSERTION_SILENT", + "name": "HAL_ASSERTION_SILENT", + "range": null, + "title": "Silent", + "type": "bool" + }, + { + "children": [], + "depends_on": "COMPILER_OPTIMIZATION_ASSERTION_LEVEL >= 2 && ", + "help": null, + "id": "HAL_ASSERTION_ENABLE", + "name": "HAL_ASSERTION_ENABLE", + "range": null, + "title": "Enabled", + "type": "bool" + } + ], + "depends_on": null, + "help": "Set the assert behavior / level for HAL component.\nHAL component assert level can be set separately,\nbut the level can't exceed the system assertion level.\ne.g. If the system assertion is disabled, then the HAL\nassertion can't be enabled either. If the system assertion\nis enable, then the HAL assertion can still be disabled\nby this Kconfig option.", + "id": "component-config-hardware-abstraction-layer-hal-and-low-level-ll--default-hal-assertion-level", + "name": "HAL_DEFAULT_ASSERTION_LEVEL", + "title": "Default HAL assertion level", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "HAL_DEFAULT_ASSERTION_LEVEL", + "name": "HAL_DEFAULT_ASSERTION_LEVEL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "HAL_LOG_LEVEL_NONE", + "name": "HAL_LOG_LEVEL_NONE", + "range": null, + "title": "No output", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "HAL_LOG_LEVEL_ERROR", + "name": "HAL_LOG_LEVEL_ERROR", + "range": null, + "title": "Error", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "HAL_LOG_LEVEL_WARN", + "name": "HAL_LOG_LEVEL_WARN", + "range": null, + "title": "Warning", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "HAL_LOG_LEVEL_INFO", + "name": "HAL_LOG_LEVEL_INFO", + "range": null, + "title": "Info", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "HAL_LOG_LEVEL_DEBUG", + "name": "HAL_LOG_LEVEL_DEBUG", + "range": null, + "title": "Debug", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "HAL_LOG_LEVEL_VERBOSE", + "name": "HAL_LOG_LEVEL_VERBOSE", + "range": null, + "title": "Verbose", + "type": "bool" + } + ], + "depends_on": "!LOG_DEFAULT_LEVEL_NONE && !LOG_DEFAULT_LEVEL_ERROR && !LOG_DEFAULT_LEVEL_WARN && !LOG_DEFAULT_LEVEL_INFO && !LOG_DEFAULT_LEVEL_DEBUG && !LOG_DEFAULT_LEVEL_VERBOSE", + "help": "Specify how much output to see in HAL logs.", + "id": "component-config-hardware-abstraction-layer-hal-and-low-level-ll--hal-layer-log-verbosity", + "name": "HAL_LOG_LEVEL", + "title": "HAL layer log verbosity", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "HAL_LOG_LEVEL", + "name": "HAL_LOG_LEVEL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "ESP_ROM_HAS_HAL_SYSTIMER", + "help": "Enable this flag to use HAL functions from ROM instead of ESP-IDF.\n\nIf keeping this as \"n\" in your project, you will have less free IRAM.\nIf making this as \"y\" in your project, you will increase free IRAM,\nbut you will lose the possibility to debug this module, and some new\nfeatures will be added and bugs will be fixed in the IDF source\nbut cannot be synced to ROM.", + "id": "HAL_SYSTIMER_USE_ROM_IMPL", + "name": "HAL_SYSTIMER_USE_ROM_IMPL", + "range": null, + "title": "Use ROM implementation of SysTimer HAL driver", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_ROM_HAS_HAL_WDT", + "help": "Enable this flag to use HAL functions from ROM instead of ESP-IDF.\n\nIf keeping this as \"n\" in your project, you will have less free IRAM.\nIf making this as \"y\" in your project, you will increase free IRAM,\nbut you will lose the possibility to debug this module, and some new\nfeatures will be added and bugs will be fixed in the IDF source\nbut cannot be synced to ROM.", + "id": "HAL_WDT_USE_ROM_IMPL", + "name": "HAL_WDT_USE_ROM_IMPL", + "range": null, + "title": "Use ROM implementation of WDT HAL driver", + "type": "bool" + }, + { + "children": [], + "depends_on": "SPI_MASTER_ISR_IN_IRAM", + "help": "Enable this option to place SPI master hal layer functions into IRAM.", + "id": "HAL_SPI_MASTER_FUNC_IN_IRAM", + "name": "HAL_SPI_MASTER_FUNC_IN_IRAM", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "SPI_SLAVE_ISR_IN_IRAM", + "help": "Enable this option to place SPI slave hal layer functions into IRAM.", + "id": "HAL_SPI_SLAVE_FUNC_IN_IRAM", + "name": "HAL_SPI_SLAVE_FUNC_IN_IRAM", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ESP32H2", + "help": "Enable this option to apply the countermeasure for ECDSA signature operation\nThis countermeasure masks the real ECDSA sign operation\nunder dummy sign operations to add randomness in the generated power signature.\nThis countermeasure is only necessary for ESP32-H2 < v1.2.", + "id": "HAL_ECDSA_GEN_SIG_CM", + "name": "HAL_ECDSA_GEN_SIG_CM", + "range": null, + "title": "Enable countermeasure for ECDSA signature generation", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-hardware-abstraction-layer-hal-and-low-level-ll-", + "title": "Hardware Abstraction Layer (HAL) and Low Level (LL)", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "HEAP_POISONING_DISABLED", + "name": "HEAP_POISONING_DISABLED", + "range": null, + "title": "Basic (no poisoning)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "HEAP_POISONING_LIGHT", + "name": "HEAP_POISONING_LIGHT", + "range": null, + "title": "Light impact", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "HEAP_POISONING_COMPREHENSIVE", + "name": "HEAP_POISONING_COMPREHENSIVE", + "range": null, + "title": "Comprehensive", + "type": "bool" + } + ], + "depends_on": null, + "help": "Enable heap poisoning features to detect heap corruption caused by out-of-bounds access to heap memory.\n\nSee the \"Heap Memory Debugging\" page of the IDF documentation\nfor a description of each level of heap corruption detection.", + "id": "component-config-heap-memory-debugging-heap-corruption-detection", + "name": "HEAP_CORRUPTION_DETECTION", + "title": "Heap corruption detection", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "HEAP_TRACING_OFF", + "name": "HEAP_TRACING_OFF", + "range": null, + "title": "Disabled", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "HEAP_TRACING_STANDALONE", + "name": "HEAP_TRACING_STANDALONE", + "range": null, + "title": "Standalone", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "HEAP_TRACING_TOHOST", + "name": "HEAP_TRACING_TOHOST", + "range": null, + "title": "Host-based", + "type": "bool" + } + ], + "depends_on": null, + "help": "Enables the heap tracing API defined in esp_heap_trace.h.\n\nThis function causes a moderate increase in IRAM code side and a minor increase in heap function\n(malloc/free/realloc) CPU overhead, even when the tracing feature is not used.\nSo it's best to keep it disabled unless tracing is being used.", + "id": "component-config-heap-memory-debugging-heap-tracing", + "name": "HEAP_TRACING_DEST", + "title": "Heap tracing", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": "Enables/disables heap tracing API.", + "id": "HEAP_TRACING", + "name": "HEAP_TRACING", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "HEAP_TRACING", + "help": "Number of stack frames to save when tracing heap operation callers.\n\nMore stack frames uses more memory in the heap trace buffer (and slows down allocation), but\ncan provide useful information.", + "id": "HEAP_TRACING_STACK_DEPTH", + "name": "HEAP_TRACING_STACK_DEPTH", + "range": null, + "title": "Heap tracing stack depth", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Enable the user to implement function hooks triggered for each successful allocation and free.", + "id": "HEAP_USE_HOOKS", + "name": "HEAP_USE_HOOKS", + "range": null, + "title": "Use allocation and free hooks", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enables tracking the task responsible for each heap allocation.\n\nThis function depends on heap poisoning being enabled and adds four more bytes of overhead for each block\nallocated.", + "id": "HEAP_TASK_TRACKING", + "name": "HEAP_TASK_TRACKING", + "range": null, + "title": "Enable heap task tracking", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "HEAP_TRACE_HASH_MAP", + "help": "When enabled this configuration forces the hash map to be placed in external RAM.", + "id": "HEAP_TRACE_HASH_MAP_IN_EXT_RAM", + "name": "HEAP_TRACE_HASH_MAP_IN_EXT_RAM", + "range": null, + "title": "Place hash map in external RAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "HEAP_TRACE_HASH_MAP", + "help": "Defines the number of entries in the heap trace hashmap. Each entry takes 8 bytes.\nThe bigger this number is, the better the performance. Recommended range: 200 - 2000.", + "id": "HEAP_TRACE_HASH_MAP_SIZE", + "name": "HEAP_TRACE_HASH_MAP_SIZE", + "range": null, + "title": "The number of entries in the hash map", + "type": "int" + } + ], + "depends_on": "HEAP_TRACING_STANDALONE", + "help": "Enable this flag to use a hash map to increase performance in handling\nheap trace records.\n\nHeap trace standalone supports storing records as a list, or a list + hash map.\n\nUsing only a list takes less memory, but calls to 'free' will get slower as the\nlist grows. This is particularly affected when using HEAP_TRACE_ALL mode.\n\nBy using a list + hash map, calls to 'free' remain fast, at the cost of\nadditional memory to store the hash map.", + "id": "HEAP_TRACE_HASH_MAP", + "name": "HEAP_TRACE_HASH_MAP", + "range": null, + "title": "Use hash map mechanism to access heap trace records", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "When enabled, if a memory allocation operation fails it will cause a system abort.", + "id": "HEAP_ABORT_WHEN_ALLOCATION_FAILS", + "name": "HEAP_ABORT_WHEN_ALLOCATION_FAILS", + "range": null, + "title": "Abort if memory allocation fails", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_ROM_HAS_HEAP_TLSF", + "help": "Enable this flag to use heap functions from ROM instead of ESP-IDF.\n\nIf keeping this as \"n\" in your project, you will have less free IRAM.\nIf making this as \"y\" in your project, you will increase free IRAM,\nbut you will lose the possibility to debug this module, and some new\nfeatures will be added and bugs will be fixed in the IDF source\nbut cannot be synced to ROM.", + "id": "HEAP_TLSF_USE_ROM_IMPL", + "name": "HEAP_TLSF_USE_ROM_IMPL", + "range": null, + "title": "Use ROM implementation of heap tlsf library", + "type": "bool" + }, + { + "children": [], + "depends_on": "!HEAP_TLSF_USE_ROM_IMPL", + "help": "Enable this flag to save up RAM space by placing the heap component in the flash memory\n\nNote that it is only safe to enable this configuration if no functions from esp_heap_caps.h\nor esp_heap_trace.h are called from ISR.", + "id": "HEAP_PLACE_FUNCTION_INTO_FLASH", + "name": "HEAP_PLACE_FUNCTION_INTO_FLASH", + "range": null, + "title": "Force the entire heap component to be placed in flash memory", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-heap-memory-debugging", + "title": "Heap memory debugging", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "IEEE802154_ENABLED", + "help": "The number of 802.15.4 receive buffers", + "id": "IEEE802154_RX_BUFFER_SIZE", + "name": "IEEE802154_RX_BUFFER_SIZE", + "range": null, + "title": "The number of 802.15.4 receive buffers", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": "configure the CCA mode to Carrier sense only", + "id": "IEEE802154_CCA_CARRIER", + "name": "IEEE802154_CCA_CARRIER", + "range": null, + "title": "Carrier sense only", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "configure the CCA mode to Energy above threshold", + "id": "IEEE802154_CCA_ED", + "name": "IEEE802154_CCA_ED", + "range": null, + "title": "Energy above threshold", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "configure the CCA mode to Carrier sense OR energy above threshold", + "id": "IEEE802154_CCA_CARRIER_OR_ED", + "name": "IEEE802154_CCA_CARRIER_OR_ED", + "range": null, + "title": "Carrier sense OR energy above threshold", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "configure the CCA mode to Carrier sense AND energy above threshold", + "id": "IEEE802154_CCA_CARRIER_AND_ED", + "name": "IEEE802154_CCA_CARRIER_AND_ED", + "range": null, + "title": "Carrier sense AND energy above threshold", + "type": "bool" + } + ], + "depends_on": "IEEE802154_ENABLED", + "help": "configure the CCA mode", + "id": "component-config-ieee-802-15-4-ieee802154-enable-clear-channel-assessment-cca-mode", + "name": "IEEE802154_CCA_MODE", + "title": "Clear Channel Assessment (CCA) mode", + "type": "choice" + }, + { + "children": [], + "depends_on": "IEEE802154_ENABLED", + "help": null, + "id": "IEEE802154_CCA_MODE", + "name": "IEEE802154_CCA_MODE", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "IEEE802154_ENABLED", + "help": "set the CCA threshold, in dB", + "id": "IEEE802154_CCA_THRESHOLD", + "name": "IEEE802154_CCA_THRESHOLD", + "range": null, + "title": "CCA detection threshold", + "type": "int" + }, + { + "children": [], + "depends_on": "IEEE802154_ENABLED", + "help": "set the pending table size", + "id": "IEEE802154_PENDING_TABLE_SIZE", + "name": "IEEE802154_PENDING_TABLE_SIZE", + "range": null, + "title": "Pending table size", + "type": "int" + }, + { + "children": [], + "depends_on": "IEEE802154_ENABLED", + "help": "Enable IEEE802154 multi-pan", + "id": "IEEE802154_MULTI_PAN_ENABLE", + "name": "IEEE802154_MULTI_PAN_ENABLE", + "range": null, + "title": "Enable multi-pan feature for frame filter", + "type": "bool" + }, + { + "children": [], + "depends_on": "IEEE802154_ENABLED", + "help": "Enabling this option increases throughput by ~5% at the expense of ~2.1k\nIRAM code size increase.", + "id": "IEEE802154_TIMING_OPTIMIZATION", + "name": "IEEE802154_TIMING_OPTIMIZATION", + "range": null, + "title": "Enable throughput optimization", + "type": "bool" + }, + { + "children": [], + "depends_on": "PM_ENABLE && IEEE802154_ENABLED", + "help": "Enabling this option allows the IEEE802.15.4 module to be powered down during automatic light sleep,\nwhich reduces current consumption.", + "id": "IEEE802154_SLEEP_ENABLE", + "name": "IEEE802154_SLEEP_ENABLE", + "range": null, + "title": "Enable IEEE802154 light sleep", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "IEEE802154_DEBUG", + "help": "Enabling this option to count IEEE802154 rx buffer when allocating or freeing.", + "id": "IEEE802154_RX_BUFFER_STATISTIC", + "name": "IEEE802154_RX_BUFFER_STATISTIC", + "range": null, + "title": "Rx buffer statistic", + "type": "bool" + }, + { + "children": [], + "depends_on": "IEEE802154_DEBUG", + "help": "Enabling this option to print more information when assert.", + "id": "IEEE802154_ASSERT", + "name": "IEEE802154_ASSERT", + "range": null, + "title": "Enrich the assert information", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "IEEE802154_RECORD_EVENT", + "help": "set the record event table size", + "id": "IEEE802154_RECORD_EVENT_SIZE", + "name": "IEEE802154_RECORD_EVENT_SIZE", + "range": null, + "title": "Record event table size", + "type": "int" + } + ], + "depends_on": "IEEE802154_RECORD", + "help": "Enabling this option to record event, when assert, the recorded event will be printed.", + "id": "IEEE802154_RECORD_EVENT", + "name": "IEEE802154_RECORD_EVENT", + "range": null, + "title": "Enable record event information for debugging", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "IEEE802154_RECORD_STATE", + "help": "set the record state table size", + "id": "IEEE802154_RECORD_STATE_SIZE", + "name": "IEEE802154_RECORD_STATE_SIZE", + "range": null, + "title": "Record state table size", + "type": "int" + } + ], + "depends_on": "IEEE802154_RECORD", + "help": "Enabling this option to record state, when assert, the recorded state will be printed.", + "id": "IEEE802154_RECORD_STATE", + "name": "IEEE802154_RECORD_STATE", + "range": null, + "title": "Enable record state information for debugging", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "IEEE802154_RECORD_CMD", + "help": "set the record command table size", + "id": "IEEE802154_RECORD_CMD_SIZE", + "name": "IEEE802154_RECORD_CMD_SIZE", + "range": null, + "title": "Record command table size", + "type": "int" + } + ], + "depends_on": "IEEE802154_RECORD", + "help": "Enabling this option to record the command, when assert, the recorded\ncommand will be printed.", + "id": "IEEE802154_RECORD_CMD", + "name": "IEEE802154_RECORD_CMD", + "range": null, + "title": "Enable record command information for debugging", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "IEEE802154_RECORD_ABORT", + "help": "set the record abort table size", + "id": "IEEE802154_RECORD_ABORT_SIZE", + "name": "IEEE802154_RECORD_ABORT_SIZE", + "range": null, + "title": "Record abort table size", + "type": "int" + } + ], + "depends_on": "IEEE802154_RECORD", + "help": "Enabling this option to record the abort, when assert, the recorded\nabort will be printed.", + "id": "IEEE802154_RECORD_ABORT", + "name": "IEEE802154_RECORD_ABORT", + "range": null, + "title": "Enable record abort information for debugging", + "type": "bool" + } + ], + "depends_on": "IEEE802154_DEBUG", + "help": "Enabling this option to add some probe codes in the driver, and record these information.", + "id": "IEEE802154_RECORD", + "name": "IEEE802154_RECORD", + "range": null, + "title": "Record the information with IEEE802154 state and event", + "type": "bool" + }, + { + "children": [], + "depends_on": "IEEE802154_DEBUG", + "help": "Enabling this option to record the tx and rx", + "id": "IEEE802154_TXRX_STATISTIC", + "name": "IEEE802154_TXRX_STATISTIC", + "range": null, + "title": "Enable record tx/rx packets information for debugging", + "type": "bool" + } + ], + "depends_on": "IEEE802154_ENABLED", + "help": "Enabling this option allows different kinds of IEEE802154 debug output.\nAll IEEE802154 debug features increase the size of the final binary.", + "id": "IEEE802154_DEBUG", + "is_menuconfig": true, + "name": "IEEE802154_DEBUG", + "range": null, + "title": "Enable IEEE802154 Debug", + "type": "menu" + } + ], + "depends_on": null, + "help": null, + "id": "IEEE802154_ENABLED", + "name": "IEEE802154_ENABLED", + "range": null, + "title": "IEEE802154 Enable", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-ieee-802-15-4", + "title": "IEEE 802.15.4", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "LOG_DEFAULT_LEVEL_NONE", + "name": "LOG_DEFAULT_LEVEL_NONE", + "range": null, + "title": "No output", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "LOG_DEFAULT_LEVEL_ERROR", + "name": "LOG_DEFAULT_LEVEL_ERROR", + "range": null, + "title": "Error", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "LOG_DEFAULT_LEVEL_WARN", + "name": "LOG_DEFAULT_LEVEL_WARN", + "range": null, + "title": "Warning", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "LOG_DEFAULT_LEVEL_INFO", + "name": "LOG_DEFAULT_LEVEL_INFO", + "range": null, + "title": "Info", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "LOG_DEFAULT_LEVEL_DEBUG", + "name": "LOG_DEFAULT_LEVEL_DEBUG", + "range": null, + "title": "Debug", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "LOG_DEFAULT_LEVEL_VERBOSE", + "name": "LOG_DEFAULT_LEVEL_VERBOSE", + "range": null, + "title": "Verbose", + "type": "bool" + } + ], + "depends_on": null, + "help": "Specify how much output to see in logs by default.\nYou can set lower verbosity level at runtime using\nesp_log_level_set() function if LOG_DYNAMIC_LEVEL_CONTROL\nis enabled.\n\nBy default, this setting limits which log statements\nare compiled into the program. For example, selecting\n\"Warning\" would mean that changing log level to \"Debug\"\nat runtime will not be possible. To allow increasing log\nlevel above the default at runtime, see the next option.", + "id": "component-config-log-log-level-default-log-verbosity", + "name": "LOG_DEFAULT_LEVEL", + "title": "Default log verbosity", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "LOG_DEFAULT_LEVEL", + "name": "LOG_DEFAULT_LEVEL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "LOG_MAXIMUM_EQUALS_DEFAULT", + "name": "LOG_MAXIMUM_EQUALS_DEFAULT", + "range": null, + "title": "Same as default", + "type": "bool" + }, + { + "children": [], + "depends_on": "LOG_DEFAULT_LEVEL < 1 && ", + "help": null, + "id": "LOG_MAXIMUM_LEVEL_ERROR", + "name": "LOG_MAXIMUM_LEVEL_ERROR", + "range": null, + "title": "Error", + "type": "bool" + }, + { + "children": [], + "depends_on": "LOG_DEFAULT_LEVEL < 2 && ", + "help": null, + "id": "LOG_MAXIMUM_LEVEL_WARN", + "name": "LOG_MAXIMUM_LEVEL_WARN", + "range": null, + "title": "Warning", + "type": "bool" + }, + { + "children": [], + "depends_on": "LOG_DEFAULT_LEVEL < 3 && ", + "help": null, + "id": "LOG_MAXIMUM_LEVEL_INFO", + "name": "LOG_MAXIMUM_LEVEL_INFO", + "range": null, + "title": "Info", + "type": "bool" + }, + { + "children": [], + "depends_on": "LOG_DEFAULT_LEVEL < 4 && ", + "help": null, + "id": "LOG_MAXIMUM_LEVEL_DEBUG", + "name": "LOG_MAXIMUM_LEVEL_DEBUG", + "range": null, + "title": "Debug", + "type": "bool" + }, + { + "children": [], + "depends_on": "LOG_DEFAULT_LEVEL < 5 && ", + "help": null, + "id": "LOG_MAXIMUM_LEVEL_VERBOSE", + "name": "LOG_MAXIMUM_LEVEL_VERBOSE", + "range": null, + "title": "Verbose", + "type": "bool" + } + ], + "depends_on": null, + "help": "This config option sets the highest log verbosity that it's possible to select\nat runtime by calling esp_log_level_set(). This level may be higher than\nthe default verbosity level which is set when the app starts up.\n\nThis can be used enable debugging output only at a critical point, for a particular\ntag, or to minimize startup time but then enable more logs once the firmware has\nloaded.\n\nNote that increasing the maximum available log level will increase the firmware\nbinary size.\n\nThis option only applies to logging from the app, the bootloader log level is\nfixed at compile time to the separate \"Bootloader log verbosity\" setting.", + "id": "component-config-log-log-level-maximum-log-verbosity", + "name": "LOG_MAXIMUM_LEVEL", + "title": "Maximum log verbosity", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "LOG_MAXIMUM_LEVEL", + "name": "LOG_MAXIMUM_LEVEL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "Enables an additional global \"master\" log level check that occurs before a log tag cache\nlookup. This is useful if you want to compile in a lot of logs that are selectable at\nruntime, but avoid the performance hit during periods where you don't want log output.\n\nExamples include remote log forwarding, or disabling logs during a time-critical or\nCPU-intensive section and re-enabling them later. Results in larger program size\ndepending on number of logs compiled in.\n\nIf enabled, defaults to LOG_DEFAULT_LEVEL and can be set using\nesp_log_set_level_master(). This check takes precedence over ESP_LOG_LEVEL_LOCAL.", + "id": "LOG_MASTER_LEVEL", + "name": "LOG_MASTER_LEVEL", + "range": null, + "title": "Enable global master log level", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enabling this option allows dynamic changes to the log level at runtime\n(using esp_log_level_set()), providing the ability to increase or decrease\nthe log level during program execution.\nIf disabled, the log level remains static once set at compile-time and calling\nesp_log_level_set() will have no effect.\nIf binary size is a critical consideration and dynamic log level changes are not needed,\nconsider disabling this option when LOG_TAG_LEVEL_IMPL_NONE=y to minimize program size.", + "id": "LOG_DYNAMIC_LEVEL_CONTROL", + "name": "LOG_DYNAMIC_LEVEL_CONTROL", + "range": null, + "title": "Enable dynamic log level changes at runtime", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": "This option disables the ability to set the log level per tag.\nThe ability to change the log level at runtime depends on LOG_DYNAMIC_LEVEL_CONTROL.\nIf LOG_DYNAMIC_LEVEL_CONTROL is disabled, then changing the log level at runtime\nusing `esp_log_level_set()` is not possible.\nThis implementation is suitable for highly constrained environments.", + "id": "LOG_TAG_LEVEL_IMPL_NONE", + "name": "LOG_TAG_LEVEL_IMPL_NONE", + "range": null, + "title": "None", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "Select this option to use the linked list-only implementation (no cache) for log level retrieval.\nThis approach searches the linked list of all tags for the log level, which may be slower\nfor a large number of tags but may have lower memory requirements than the CACHE approach.\nThe linked list approach compares the whole strings of log tags for finding the log level.", + "id": "LOG_TAG_LEVEL_IMPL_LINKED_LIST", + "name": "LOG_TAG_LEVEL_IMPL_LINKED_LIST", + "range": null, + "title": "Linked List", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "Select this option to use a hybrid mode: cache in combination with the linked list\nfor log tag level checks. This hybrid approach offers a balance between speed and memory usage.\n\nThe cache stores recently accessed log tags and their corresponding log levels, providing\nfaster lookups for frequently used tags. The cache approach compares the tag pointers, which is\nfaster than comparing the whole strings.\n\nFor less frequently used tags, the linked list is used to search for the log level, which may be\nslower for a large number of tags but has lower memory requirements compared to a full cache.\n\nThis hybrid approach aims to improve the efficiency of log level retrieval by combining the benefits\nof both cache and linked list implementations.", + "id": "LOG_TAG_LEVEL_IMPL_CACHE_AND_LINKED_LIST", + "name": "LOG_TAG_LEVEL_IMPL_CACHE_AND_LINKED_LIST", + "range": null, + "title": "Cache + Linked List", + "type": "bool" + } + ], + "depends_on": null, + "help": "Choose the per-tag log level implementation for the log library. This functionality is used\nto enable/disable logs for a particular tag at run time. Applicable only for\napplication logs (i.e., not bootloader logs).", + "id": "component-config-log-log-level-level-settings-method-of-tag-level-checks", + "name": "LOG_TAG_LEVEL_IMPL", + "title": "Method of tag level checks", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": "This option enables the use of a simple array-based cache implementation for storing and\nretrieving log tag levels. There is no additional code that reorders the cache for fast lookups.\nSuitable for projects where memory usage optimization is crucial and the simplicity of implementation\nis preferred.", + "id": "LOG_TAG_LEVEL_CACHE_ARRAY", + "name": "LOG_TAG_LEVEL_CACHE_ARRAY", + "range": null, + "title": "Array", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "This option enables the use of a binary min-heap-based cache implementation for efficient\nstorage and retrieval of log tag levels. It does automatically optimizing cache for fast lookups.\nSuitable for projects where speed of lookup is critical and memory usage can accommodate\nthe overhead of maintaining a binary min-heap structure.", + "id": "LOG_TAG_LEVEL_CACHE_BINARY_MIN_HEAP", + "name": "LOG_TAG_LEVEL_CACHE_BINARY_MIN_HEAP", + "range": null, + "title": "Binary Min-Heap", + "type": "bool" + } + ], + "depends_on": "LOG_TAG_LEVEL_IMPL_CACHE_AND_LINKED_LIST", + "help": "The cache stores recently accessed log tags (address of tag) and their corresponding log levels,\nproviding faster lookups for frequently used tags. Cache size can be configured using the\nLOG_TAG_LEVEL_IMPL_CACHE_SIZE option. The cache approach compares the tag pointers, which is\nfaster than comparing the whole strings.", + "id": "component-config-log-log-level-level-settings-cache-implementation", + "name": "LOG_TAG_LEVEL_CACHE_IMPL", + "title": "Cache implementation", + "type": "choice" + }, + { + "children": [], + "depends_on": "LOG_TAG_LEVEL_CACHE_ARRAY || LOG_TAG_LEVEL_CACHE_BINARY_MIN_HEAP", + "help": "This option sets the size of the cache used for log tag entries. The cache stores recently accessed\nlog tags and their corresponding log levels, which helps improve the efficiency of log level retrieval.\nThe value must be a power of 2 minus 1 (e.g., 1, 3, 7, 15, 31, 63, 127, 255, ...)\nto ensure proper cache behavior. For LOG_TAG_LEVEL_CACHE_ARRAY option the value can be any,\nwithout restrictions.\n\nNote: A larger cache size can improve lookup performance for frequently used log tags but may consume\nmore memory. Conversely, a smaller cache size reduces memory usage but may lead to more frequent cache\nevictions for less frequently used log tags.", + "id": "LOG_TAG_LEVEL_IMPL_CACHE_SIZE", + "name": "LOG_TAG_LEVEL_IMPL_CACHE_SIZE", + "range": null, + "title": "Log Tag Cache Size", + "type": "int" + } + ], + "depends_on": null, + "id": "component-config-log-log-level-level-settings", + "title": "Level Settings", + "type": "menu" + } + ], + "depends_on": null, + "id": "component-config-log-log-level", + "title": "Log Level", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "Enable ANSI terminal color codes.\nIn order to view these, your terminal program must support ANSI color codes.", + "id": "LOG_COLORS", + "name": "LOG_COLORS", + "range": null, + "title": "Color", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "NO_SYMBOL && ", + "help": null, + "id": "LOG_TIMESTAMP_SOURCE_NONE", + "name": "LOG_TIMESTAMP_SOURCE_NONE", + "range": null, + "title": "None", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "LOG_TIMESTAMP_SOURCE_RTOS", + "name": "LOG_TIMESTAMP_SOURCE_RTOS", + "range": null, + "title": "Milliseconds Since Boot", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "LOG_TIMESTAMP_SOURCE_SYSTEM", + "name": "LOG_TIMESTAMP_SOURCE_SYSTEM", + "range": null, + "title": "System Time (HH:MM:SS.sss)", + "type": "bool" + }, + { + "children": [], + "depends_on": "NO_SYMBOL && ", + "help": null, + "id": "LOG_TIMESTAMP_SOURCE_SYSTEM_FULL", + "name": "LOG_TIMESTAMP_SOURCE_SYSTEM_FULL", + "range": null, + "title": "System Time (YY-MM-DD HH:MM:SS.sss)", + "type": "bool" + } + ], + "depends_on": null, + "help": "Choose what sort of timestamp is displayed in the log output:\n\n- \"None\" - The log will only contain the actual log messages themselves\n without any time-related information. Avoiding timestamps can help conserve\n processing power and memory. It might useful when you\n perform log analysis or debugging, sometimes it's more straightforward\n to work with logs that lack timestamps, especially if the time of occurrence\n is not critical for understanding the issues.\n\n- \"Milliseconds since boot\" is calculated from the RTOS tick count multiplied\n by the tick period. This time will reset after a software reboot.\n e.g. (90000)\n\n- \"System time (HH:MM:SS.sss)\" is taken from POSIX time functions which use the chip's\n RTC and high resolution timers to maintain an accurate time. The system time is\n initialized to 0 on startup, it can be set with an SNTP sync, or with\n POSIX time functions. This time will not reset after a software reboot.\n e.g. (00:01:30.000)\n\n- \"System time (YY-MM-DD HH:MM:SS.sss)\" it is the same as the above,\n but also prints the date as well.\n\n- NOTE: Currently this will not get used in logging from binary blobs\n (i.e WiFi & Bluetooth libraries), these will always print\n milliseconds since boot.", + "id": "component-config-log-format-timestamp", + "name": "LOG_TIMESTAMP_SOURCE", + "title": "Timestamp", + "type": "choice" + } + ], + "depends_on": null, + "id": "component-config-log-format", + "title": "Format", + "type": "menu" + } + ], + "depends_on": null, + "id": "component-config-log", + "title": "Log", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "Builds normally if selected. Excludes LwIP from build if unselected, even if it is a\ndependency of a component or application.\nSome applications can switch their IP stacks, e.g., when switching between chip\nand Linux targets (LwIP stack vs. Linux IP stack). Since the LwIP dependency cannot\neasily be excluded based on a Kconfig option, it has to be a dependency in all cases.\nThis switch allows the LwIP stack to be built selectively, even if it is a dependency.", + "id": "LWIP_ENABLE", + "name": "LWIP_ENABLE", + "range": null, + "title": "Enable LwIP stack", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "The default name this device will report to other devices on the network.\nCould be updated at runtime with esp_netif_set_hostname()", + "id": "LWIP_LOCAL_HOSTNAME", + "name": "LWIP_LOCAL_HOSTNAME", + "range": null, + "title": "Local netif hostname", + "type": "string" + }, + { + "children": [], + "depends_on": null, + "help": "If this feature is enabled, standard POSIX APIs: if_indextoname(), if_nametoindex()\ncould be used to convert network interface index to name\ninstead of IDF specific esp-netif APIs (such as esp_netif_get_netif_impl_name())", + "id": "LWIP_NETIF_API", + "name": "LWIP_NETIF_API", + "range": null, + "title": "Enable usage of standard POSIX APIs in LWIP", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "LWIP tcpip task priority. In case of high throughput, this parameter\ncould be changed up to (configMAX_PRIORITIES-1).", + "id": "LWIP_TCPIP_TASK_PRIO", + "name": "LWIP_TCPIP_TASK_PRIO", + "range": [ + 1, + 24 + ], + "title": "LWIP TCP/IP Task Priority", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "LWIP_TCPIP_CORE_LOCKING", + "help": "when LWIP_TCPIP_CORE_LOCKING is enabled, this lets tcpip_input() grab the\nmutex for input packets as well, instead of allocating a message and passing\nit to tcpip_thread.", + "id": "LWIP_TCPIP_CORE_LOCKING_INPUT", + "name": "LWIP_TCPIP_CORE_LOCKING_INPUT", + "range": null, + "title": "Enable tcpip core locking input", + "type": "bool" + } + ], + "depends_on": null, + "help": "If Enable tcpip core locking,Creates a global mutex that is held\nduring TCPIP thread operations.Can be locked by client code to perform\nlwIP operations without changing into TCPIP thread using callbacks.\nSee LOCK_TCPIP_CORE() and UNLOCK_TCPIP_CORE().\n\nIf disable tcpip core locking,TCP IP will perform tasks through context switching", + "id": "LWIP_TCPIP_CORE_LOCKING", + "name": "LWIP_TCPIP_CORE_LOCKING", + "range": null, + "title": "Enable tcpip core locking", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enable to check that the project does not violate lwip thread safety.\nIf enabled, all lwip functions that require thread awareness run an assertion\nto verify that the TCP/IP core functionality is either locked or accessed\nfrom the correct thread.", + "id": "LWIP_CHECK_THREAD_SAFETY", + "name": "LWIP_CHECK_THREAD_SAFETY", + "range": null, + "title": "Checks that lwip API runs in expected context", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "If this feature is enabled, standard API such as gethostbyname\nsupport .local addresses by sending one shot multicast mDNS\nquery", + "id": "LWIP_DNS_SUPPORT_MDNS_QUERIES", + "name": "LWIP_DNS_SUPPORT_MDNS_QUERIES", + "range": null, + "title": "Enable mDNS queries in resolving host name", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "If this feature is enabled, all traffic from layer2(WIFI Driver) will be\ncopied to a new buffer before sending it to layer3(LWIP stack), freeing\nthe layer2 buffer.\nPlease be notified that the total layer2 receiving buffer is fixed and\nESP32 currently supports 25 layer2 receiving buffer, when layer2 buffer\nruns out of memory, then the incoming packets will be dropped in hardware.\nThe layer3 buffer is allocated from the heap, so the total layer3 receiving\nbuffer depends on the available heap size, when heap runs out of memory,\nno copy will be sent to layer3 and packet will be dropped in layer2.\nPlease make sure you fully understand the impact of this feature before\nenabling it.", + "id": "LWIP_L2_TO_L3_COPY", + "name": "LWIP_L2_TO_L3_COPY", + "range": null, + "title": "Enable copy between Layer2 and Layer3 packets", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "If this feature is enabled, some functions relating to RX/TX in LWIP will be\nput into IRAM, it can improve UDP/TCP throughput by >10% for single core mode,\nit doesn't help too much for dual core mode. On the other hand, it needs about\n10KB IRAM for these optimizations.\n\nIf this feature is disabled, all lwip functions will be put into FLASH.", + "id": "LWIP_IRAM_OPTIMIZATION", + "name": "LWIP_IRAM_OPTIMIZATION", + "range": null, + "title": "Enable LWIP IRAM optimization", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "If this feature is enabled, some tcp part functions relating to RX/TX in LWIP will be\nput into IRAM, it can improve TCP throughput. On the other hand, it needs about 17KB\nIRAM for these optimizations.", + "id": "LWIP_EXTRA_IRAM_OPTIMIZATION", + "name": "LWIP_EXTRA_IRAM_OPTIMIZATION", + "range": null, + "title": "Enable LWIP IRAM optimization for TCP part", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "If this feature is enabled, IGMP and MLD6 timers will be activated only\nwhen joining groups or receiving QUERY packets.\n\nThis feature will reduce the power consumption for applications which do not\nuse IGMP and MLD6.", + "id": "LWIP_TIMERS_ONDEMAND", + "name": "LWIP_TIMERS_ONDEMAND", + "range": null, + "title": "Enable LWIP Timers on demand", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "LWIP_ND6", + "help": "This option is used to set the the router flag for the NA packets.\nWhen enabled, the router flag in NA packet will always set to 1,\notherwise, never set router flag for NA packets.", + "id": "LWIP_FORCE_ROUTER_FORWARDING", + "name": "LWIP_FORCE_ROUTER_FORWARDING", + "range": null, + "title": "LWIP Force Router Forwarding Enable/Disable", + "type": "bool" + } + ], + "depends_on": "LWIP_IPV6", + "help": "This option is used to disable the Network Discovery Protocol (NDP) if it is not required.\nPlease use this option with caution, as the NDP is essential for IPv6 functionality within a local network.", + "id": "LWIP_ND6", + "name": "LWIP_ND6", + "range": null, + "title": "LWIP NDP6 Enable/Disable", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "The practical maximum limit is\ndetermined by available heap memory at runtime.\n\nSockets take up a certain amount of memory, and allowing fewer\nsockets to be open at the same time conserves memory. Specify\nthe maximum amount of sockets here. The valid value is from 1\nto 253. If using value above 61, update CMakeLists defining\nFD_SETSIZE to the number of sockets used plus the\nexpected open files (minimum of +3 for stdout, stderr and stdin).", + "id": "LWIP_MAX_SOCKETS", + "name": "LWIP_MAX_SOCKETS", + "range": [ + 1, + 253 + ], + "title": "Max number of open sockets", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "This option is deprecated. Do not use this option, use VFS_SUPPORT_SELECT instead.", + "id": "LWIP_USE_ONLY_LWIP_SELECT", + "name": "LWIP_USE_ONLY_LWIP_SELECT", + "range": null, + "title": "Support LWIP socket select() only (DEPRECATED)", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enabling this option allows SO_LINGER processing.\nl_onoff = 1,l_linger can set the timeout.\n\nIf l_linger=0, When a connection is closed, TCP will terminate the connection.\nThis means that TCP will discard any data packets stored in the socket send buffer\nand send an RST to the peer.\n\nIf l_linger!=0,Then closesocket() calls to block the process until\nthe remaining data packets has been sent or timed out.", + "id": "LWIP_SO_LINGER", + "name": "LWIP_SO_LINGER", + "range": null, + "title": "Enable SO_LINGER processing", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "LWIP_SO_REUSE", + "help": "Enabling this option means that any incoming broadcast or multicast\npacket will be copied to all of the local sockets that it matches\n(may be more than one if SO_REUSEADDR is set on the socket.)\n\nThis increases memory overhead as the packets need to be copied,\nhowever they are only copied per matching socket. You can safely\ndisable it if you don't plan to receive broadcast or multicast\ntraffic on more than one socket at a time.", + "id": "LWIP_SO_REUSE_RXTOALL", + "name": "LWIP_SO_REUSE_RXTOALL", + "range": null, + "title": "SO_REUSEADDR copies broadcast/multicast to all matches", + "type": "bool" + } + ], + "depends_on": null, + "help": "Enabling this option allows binding to a port which remains in\nTIME_WAIT.", + "id": "LWIP_SO_REUSE", + "name": "LWIP_SO_REUSE", + "range": null, + "title": "Enable SO_REUSEADDR option", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enabling this option allows checking for available data on a netconn.", + "id": "LWIP_SO_RCVBUF", + "name": "LWIP_SO_RCVBUF", + "range": null, + "title": "Enable SO_RCVBUF option", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enabling this option allows checking for the destination address\nof a received IPv4 Packet.", + "id": "LWIP_NETBUF_RECVINFO", + "name": "LWIP_NETBUF_RECVINFO", + "range": null, + "title": "Enable IP_PKTINFO option", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Set value for Time-To-Live used by transport layers.", + "id": "LWIP_IP_DEFAULT_TTL", + "name": "LWIP_IP_DEFAULT_TTL", + "range": [ + 1, + 255 + ], + "title": "The value for Time-To-Live used by transport layers", + "type": "int" + }, + { + "children": [], + "depends_on": "LWIP_IPV4", + "help": "Enabling this option allows fragmenting outgoing IP4 packets if their size\nexceeds MTU.", + "id": "LWIP_IP4_FRAG", + "name": "LWIP_IP4_FRAG", + "range": null, + "title": "Enable fragment outgoing IP4 packets", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_IPV6", + "help": "Enabling this option allows fragmenting outgoing IP6 packets if their size\nexceeds MTU.", + "id": "LWIP_IP6_FRAG", + "name": "LWIP_IP6_FRAG", + "range": null, + "title": "Enable fragment outgoing IP6 packets", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_IPV4", + "help": "Enabling this option allows reassemblying incoming fragmented IP4 packets.", + "id": "LWIP_IP4_REASSEMBLY", + "name": "LWIP_IP4_REASSEMBLY", + "range": null, + "title": "Enable reassembly incoming fragmented IP4 packets", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_IPV6", + "help": "Enabling this option allows reassemblying incoming fragmented IP6 packets.", + "id": "LWIP_IP6_REASSEMBLY", + "name": "LWIP_IP6_REASSEMBLY", + "range": null, + "title": "Enable reassembly incoming fragmented IP6 packets", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Set the maximum amount of pbufs waiting to be reassembled.", + "id": "LWIP_IP_REASS_MAX_PBUFS", + "name": "LWIP_IP_REASS_MAX_PBUFS", + "range": [ + 10, + 100 + ], + "title": "The maximum amount of pbufs waiting to be reassembled", + "type": "int" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "LWIP_IPV4_NAPT", + "help": "Enabling this option allows Port Forwarding or Port mapping.", + "id": "LWIP_IPV4_NAPT_PORTMAP", + "name": "LWIP_IPV4_NAPT_PORTMAP", + "range": null, + "title": "Enable NAT Port Mapping", + "type": "bool" + } + ], + "depends_on": "LWIP_IP_FORWARD", + "help": "Enabling this option allows Network Address and Port Translation.", + "id": "LWIP_IPV4_NAPT", + "name": "LWIP_IPV4_NAPT", + "range": null, + "title": "Enable NAT", + "type": "bool" + } + ], + "depends_on": null, + "help": "Enabling this option allows packets forwarding across multiple interfaces.", + "id": "LWIP_IP_FORWARD", + "name": "LWIP_IP_FORWARD", + "range": null, + "title": "Enable IP forwarding", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enabling this option allows LWIP statistics", + "id": "LWIP_STATS", + "name": "LWIP_STATS", + "range": null, + "title": "Enable LWIP statistics", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "LWIP_ESP_GRATUITOUS_ARP", + "help": "Set the timer interval for gratuitous ARP. The default value is 60s", + "id": "LWIP_GARP_TMR_INTERVAL", + "name": "LWIP_GARP_TMR_INTERVAL", + "range": null, + "title": "GARP timer interval(seconds)", + "type": "int" + } + ], + "depends_on": "LWIP_IPV4", + "help": "Enable this option allows to send gratuitous ARP periodically.\n\nThis option solve the compatibility issues.If the ARP table of the AP is old, and the AP\ndoesn't send ARP request to update it's ARP table, this will lead to the STA sending IP packet fail.\nThus we send gratuitous ARP periodically to let AP update it's ARP table.", + "id": "LWIP_ESP_GRATUITOUS_ARP", + "name": "LWIP_ESP_GRATUITOUS_ARP", + "range": null, + "title": "Send gratuitous ARP periodically", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "LWIP_ESP_MLDV6_REPORT", + "help": "Set the timer interval for mldv6 report. The default value is 30s", + "id": "LWIP_MLDV6_TMR_INTERVAL", + "name": "LWIP_MLDV6_TMR_INTERVAL", + "range": null, + "title": "mldv6 report timer interval(seconds)", + "type": "int" + } + ], + "depends_on": "LWIP_IPV6", + "help": "Enable this option allows to send mldv6 report periodically.\n\nThis option solve the issue that failed to receive multicast data.\nSome routers fail to forward multicast packets.\nTo solve this problem, send multicast mdlv6 report to routers regularly.", + "id": "LWIP_ESP_MLDV6_REPORT", + "name": "LWIP_ESP_MLDV6_REPORT", + "range": null, + "title": "Send mldv6 report periodically", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Set TCPIP task receive mail box size. Generally bigger value means higher throughput\nbut more memory. The value should be bigger than UDP/TCP mail box size.", + "id": "LWIP_TCPIP_RECVMBOX_SIZE", + "name": "LWIP_TCPIP_RECVMBOX_SIZE", + "range": [ + 6, + 64 + ], + "title": "TCPIP task receive mail box size", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "!LWIP_AUTOIP && ", + "help": null, + "id": "LWIP_DHCP_DOES_ARP_CHECK", + "name": "LWIP_DHCP_DOES_ARP_CHECK", + "range": null, + "title": "DHCP provides simple ARP check", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "LWIP_DHCP_DOES_ACD_CHECK", + "name": "LWIP_DHCP_DOES_ACD_CHECK", + "range": null, + "title": "DHCP provides Address Conflict Detection (ACD)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "LWIP_DHCP_DOES_NOT_CHECK_OFFERED_IP", + "name": "LWIP_DHCP_DOES_NOT_CHECK_OFFERED_IP", + "range": null, + "title": "DHCP does not detect conflict on the offered IP", + "type": "bool" + } + ], + "depends_on": "LWIP_IPV4", + "help": "Choose the preferred way of DHCP client to check if the offered address\nis available:\n* Using Address Conflict Detection (ACD) module assures that the offered IP address\nis properly probed and announced before binding in DHCP. This conforms to RFC5227,\nbut takes several seconds.\n* Using ARP check, we only send two ARP requests to check for replies. This process\nlasts 1 - 2 seconds.\n* No conflict detection: We directly bind the offered address.", + "id": "component-config-lwip-choose-how-dhcp-validates-offered-ip", + "name": "LWIP_DHCP_CHECKS_OFFERED_ADDRESS", + "title": "Choose how DHCP validates offered IP", + "type": "choice" + }, + { + "children": [], + "depends_on": "LWIP_IPV4", + "help": "This option could be used to disable DHCP client identification with its MAC address.\n(Client id is used by DHCP servers to uniquely identify clients and are included\nin the DHCP packets as an option 61)\nSet this option to \"y\" in order to exclude option 61 from DHCP packets.", + "id": "LWIP_DHCP_DISABLE_CLIENT_ID", + "name": "LWIP_DHCP_DISABLE_CLIENT_ID", + "range": null, + "title": "DHCP: Disable Use of HW address as client identification", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_IPV4", + "help": "This option could be used to disable DHCP client vendor class identification.\nSet this option to \"y\" in order to exclude option 60 from DHCP packets.", + "id": "LWIP_DHCP_DISABLE_VENDOR_CLASS_ID", + "name": "LWIP_DHCP_DISABLE_VENDOR_CLASS_ID", + "range": null, + "title": "DHCP: Disable Use of vendor class identification", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_IPV4", + "help": "When this option is enabled, DHCP client tries to re-obtain last valid IP address obtained from DHCP\nserver. Last valid DHCP configuration is stored in nvs and restored after reset/power-up. If IP is still\navailable, there is no need for sending discovery message to DHCP server and save some time.", + "id": "LWIP_DHCP_RESTORE_LAST_IP", + "name": "LWIP_DHCP_RESTORE_LAST_IP", + "range": null, + "title": "DHCP: Restore last IP obtained from DHCP server", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_IPV4", + "help": "Set total length of outgoing DHCP option msg. Generally bigger value means it can carry more\noptions and values. If your code meets LWIP_ASSERT due to option value is too long.\nPlease increase the LWIP_DHCP_OPTIONS_LEN value.", + "id": "LWIP_DHCP_OPTIONS_LEN", + "name": "LWIP_DHCP_OPTIONS_LEN", + "range": [ + 68, + 255 + ], + "title": "DHCP total option length", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Number of clients that may store data in client_data member array of struct netif.", + "id": "LWIP_NUM_NETIF_CLIENT_DATA", + "name": "LWIP_NUM_NETIF_CLIENT_DATA", + "range": [ + 0, + 256 + ], + "title": "Number of clients store data in netif", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Set DHCP coarse interval in seconds.\nA higher value will be less precise but cost less power consumption.", + "id": "LWIP_DHCP_COARSE_TIMER_SECS", + "name": "LWIP_DHCP_COARSE_TIMER_SECS", + "range": [ + 1, + 10 + ], + "title": "DHCP coarse timer interval(s)", + "type": "int" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "LWIP_DHCPS", + "help": "The DHCP server is calculating lease time multiplying the sent\nand received times by this number of seconds per unit.\nThe default is 60, that equals one minute.", + "id": "LWIP_DHCPS_LEASE_UNIT", + "name": "LWIP_DHCPS_LEASE_UNIT", + "range": [ + 1, + 3600 + ], + "title": "Multiplier for lease time, in seconds", + "type": "int" + }, + { + "children": [], + "depends_on": "LWIP_DHCPS", + "help": "The maximum number of DHCP clients that are connected to the server.\nAfter this number is exceeded, DHCP server removes of the oldest device\nfrom it's address pool, without notification.", + "id": "LWIP_DHCPS_MAX_STATION_NUM", + "name": "LWIP_DHCPS_MAX_STATION_NUM", + "range": [ + 1, + 64 + ], + "title": "Maximum number of stations", + "type": "int" + }, + { + "children": [], + "depends_on": "LWIP_DHCPS", + "help": "Enabling this option allows DHCP server to support temporary static ARP entries\nfor DHCP Client. This will help the DHCP server to send the DHCP OFFER and DHCP ACK using IP unicast.", + "id": "LWIP_DHCPS_STATIC_ENTRIES", + "name": "LWIP_DHCPS_STATIC_ENTRIES", + "range": null, + "title": "Enable ARP static entries", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_DHCPS", + "help": "This allows the DNS option to be optional in the DHCP offers,\ndepending on the server's runtime configuration.\nWhen enabled, the DHCP server will always add the DNS option to DHCP responses.\nIf a DNS server is not explicitly configured, the server's IP address will be used\nas the fallback for the DNS option.\nWhen disabled, the DHCP server will only include the DNS option in responses\nif a DNS server has been explicitly configured.\nThis option will be removed in IDF v6.x", + "id": "LWIP_DHCPS_ADD_DNS", + "name": "LWIP_DHCPS_ADD_DNS", + "range": null, + "title": "Always add DNS option in DHCP responses", + "type": "bool" + } + ], + "depends_on": "LWIP_IPV4", + "help": "Enabling this option allows the device to run the DHCP server\n(to dynamically assign IPv4 addresses to clients).", + "id": "LWIP_DHCPS", + "name": "LWIP_DHCPS", + "range": null, + "title": "DHCPS: Enable IPv4 Dynamic Host Configuration Protocol Server (DHCPS)", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-lwip-dhcp-server", + "title": "DHCP server", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "LWIP_AUTOIP", + "help": "DHCP client will send this many probes before self-assigning a\nlink local address.\n\nFrom LWIP help: \"This can be set as low as 1 to get an AutoIP\naddress very quickly, but you should be prepared to handle a\nchanging IP address when DHCP overrides AutoIP.\" (In the case of\nESP-IDF, this means multiple SYSTEM_EVENT_STA_GOT_IP events.)", + "id": "LWIP_AUTOIP_TRIES", + "name": "LWIP_AUTOIP_TRIES", + "range": null, + "title": "DHCP Probes before self-assigning IPv4 LL address", + "type": "int" + }, + { + "children": [], + "depends_on": "LWIP_AUTOIP", + "help": "If the AUTOIP functionality detects this many IP conflicts while\nself-assigning an address, it will go into a rate limited mode.", + "id": "LWIP_AUTOIP_MAX_CONFLICTS", + "name": "LWIP_AUTOIP_MAX_CONFLICTS", + "range": null, + "title": "Max IP conflicts before rate limiting", + "type": "int" + }, + { + "children": [], + "depends_on": "LWIP_AUTOIP", + "help": "If rate limiting self-assignment requests, wait this long between\neach request.", + "id": "LWIP_AUTOIP_RATE_LIMIT_INTERVAL", + "name": "LWIP_AUTOIP_RATE_LIMIT_INTERVAL", + "range": null, + "title": "Rate limited interval (seconds)", + "type": "int" + } + ], + "depends_on": "LWIP_IPV4", + "help": "Enabling this option allows the device to self-assign an address\nin the 169.256/16 range if none is assigned statically or via DHCP.\n\nSee RFC 3927.", + "id": "LWIP_AUTOIP", + "is_menuconfig": true, + "name": "LWIP_AUTOIP", + "range": null, + "title": "Enable IPV4 Link-Local Addressing (AUTOIP)", + "type": "menu" + }, + { + "children": [], + "depends_on": null, + "help": "Enable IPv4 stack. If you want to use IPv6 only TCP/IP stack, disable this.", + "id": "LWIP_IPV4", + "name": "LWIP_IPV4", + "range": null, + "title": "Enable IPv4", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "LWIP_IPV6", + "help": "Enabling this option allows the devices to IPV6 stateless address autoconfiguration (SLAAC).\n\nSee RFC 4862.", + "id": "LWIP_IPV6_AUTOCONFIG", + "name": "LWIP_IPV6_AUTOCONFIG", + "range": null, + "title": "Enable IPV6 stateless address autoconfiguration (SLAAC)", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_IPV6", + "help": "The maximum number of IPv6 addresses on each interface. Any additional\naddresses will be discarded.", + "id": "LWIP_IPV6_NUM_ADDRESSES", + "name": "LWIP_IPV6_NUM_ADDRESSES", + "range": null, + "title": "Number of IPv6 addresses on each network interface", + "type": "int" + }, + { + "children": [], + "depends_on": "LWIP_IPV6", + "help": "Forwarding IPv6 packets between interfaces is only required when acting as\na router.", + "id": "LWIP_IPV6_FORWARD", + "name": "LWIP_IPV6_FORWARD", + "range": null, + "title": "Enable IPv6 forwarding between interfaces", + "type": "bool" + } + ], + "depends_on": null, + "help": "Enable IPv6 function. If not use IPv6 function, set this option to n.\nIf disabling LWIP_IPV6 then some other components (asio) will\nno longer be available.", + "id": "LWIP_IPV6", + "name": "LWIP_IPV6", + "range": null, + "title": "Enable IPv6", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_IPV6_AUTOCONFIG", + "help": "Use IPv6 Router Advertisement Recursive DNS Server Option (as per RFC 6106) to\ncopy a defined maximum number of DNS servers to the DNS module.\nSet this option to a number of desired DNS servers advertised in the RA protocol.\nThis feature is disabled when set to 0.", + "id": "LWIP_IPV6_RDNSS_MAX_DNS_SERVERS", + "name": "LWIP_IPV6_RDNSS_MAX_DNS_SERVERS", + "range": null, + "title": "Use IPv6 Router Advertisement Recursive DNS Server Option", + "type": "int" + }, + { + "children": [], + "depends_on": "LWIP_IPV6_AUTOCONFIG", + "help": "Enable DHCPv6 for IPv6 stateless address autoconfiguration.\nNote that the dhcpv6 client has to be started using dhcp6_enable_stateless(netif);\nNote that the stateful address autoconfiguration is not supported.", + "id": "LWIP_IPV6_DHCP6", + "name": "LWIP_IPV6_DHCP6", + "range": null, + "title": "Enable DHCPv6 stateless address autoconfiguration", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enable callbacks when the network interface is up/down and addresses are changed.", + "id": "LWIP_NETIF_STATUS_CALLBACK", + "name": "LWIP_NETIF_STATUS_CALLBACK", + "range": null, + "title": "Enable status callback for network interfaces", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "LWIP_NETIF_LOOPBACK", + "help": "Configure the maximum number of packets which can be queued for\nloopback on a given interface. Reducing this number may cause packets\nto be dropped, but will avoid filling memory with queued packet data.", + "id": "LWIP_LOOPBACK_MAX_PBUFS", + "name": "LWIP_LOOPBACK_MAX_PBUFS", + "range": [ + 0, + 16 + ], + "title": "Max queued loopback packets per interface", + "type": "int" + } + ], + "depends_on": null, + "help": "Enabling this option means that if a packet is sent with a destination\naddress equal to the interface's own IP address, it will \"loop back\" and\nbe received by this interface.\nDisabling this option disables support of loopback interface in lwIP", + "id": "LWIP_NETIF_LOOPBACK", + "is_menuconfig": true, + "name": "LWIP_NETIF_LOOPBACK", + "range": null, + "title": "Support per-interface loopback", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "The maximum number of simultaneously active TCP\nconnections. The practical maximum limit is\ndetermined by available heap memory at runtime.\n\nChanging this value by itself does not substantially\nchange the memory usage of LWIP, except for preventing\nnew TCP connections after the limit is reached.", + "id": "LWIP_MAX_ACTIVE_TCP", + "name": "LWIP_MAX_ACTIVE_TCP", + "range": [ + 1, + 1024 + ], + "title": "Maximum active TCP Connections", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "The maximum number of simultaneously listening TCP\nconnections. The practical maximum limit is\ndetermined by available heap memory at runtime.\n\nChanging this value by itself does not substantially\nchange the memory usage of LWIP, except for preventing\nnew listening TCP connections after the limit is reached.", + "id": "LWIP_MAX_LISTENING_TCP", + "name": "LWIP_MAX_LISTENING_TCP", + "range": [ + 1, + 1024 + ], + "title": "Maximum listening TCP Connections", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Speed up the TCP retransmission interval. If disabled,\nit is recommended to change the number of SYN retransmissions to 6,\nand TCP initial rto time to 3000.", + "id": "LWIP_TCP_HIGH_SPEED_RETRANSMISSION", + "name": "LWIP_TCP_HIGH_SPEED_RETRANSMISSION", + "range": null, + "title": "TCP high speed retransmissions", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Set maximum number of retransmissions of data segments.", + "id": "LWIP_TCP_MAXRTX", + "name": "LWIP_TCP_MAXRTX", + "range": [ + 3, + 12 + ], + "title": "Maximum number of retransmissions of data segments", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Set maximum number of retransmissions of SYN segments.", + "id": "LWIP_TCP_SYNMAXRTX", + "name": "LWIP_TCP_SYNMAXRTX", + "range": [ + 3, + 12 + ], + "title": "Maximum number of retransmissions of SYN segments", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Set maximum segment size for TCP transmission.\n\nCan be set lower to save RAM, the default value 1460(ipv4)/1440(ipv6) will give best throughput.\nIPv4 TCP_MSS Range: 576 <= TCP_MSS <= 1460\nIPv6 TCP_MSS Range: 1220<= TCP_MSS <= 1440", + "id": "LWIP_TCP_MSS", + "name": "LWIP_TCP_MSS", + "range": [ + 536, + 1460 + ], + "title": "Maximum Segment Size (MSS)", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Set TCP timer interval in milliseconds.\n\nCan be used to speed connections on bad networks.\nA lower value will redeliver unacked packets faster.", + "id": "LWIP_TCP_TMR_INTERVAL", + "name": "LWIP_TCP_TMR_INTERVAL", + "range": null, + "title": "TCP timer interval(ms)", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Set maximum segment lifetime in milliseconds.", + "id": "LWIP_TCP_MSL", + "name": "LWIP_TCP_MSL", + "range": null, + "title": "Maximum segment lifetime (MSL)", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Set maximum segment lifetime in milliseconds.", + "id": "LWIP_TCP_FIN_WAIT_TIMEOUT", + "name": "LWIP_TCP_FIN_WAIT_TIMEOUT", + "range": null, + "title": "Maximum FIN segment lifetime", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Set default send buffer size for new TCP sockets.\n\nPer-socket send buffer size can be changed at runtime\nwith lwip_setsockopt(s, TCP_SNDBUF, ...).\n\nThis value must be at least 2x the MSS size, and the default\nis 4x the default MSS size.\n\nSetting a smaller default SNDBUF size can save some RAM, but\nwill decrease performance.", + "id": "LWIP_TCP_SND_BUF_DEFAULT", + "name": "LWIP_TCP_SND_BUF_DEFAULT", + "range": [ + 2440, + 65535 + ], + "title": "Default send buffer size", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Set default TCP receive window size for new TCP sockets.\n\nPer-socket receive window size can be changed at runtime\nwith lwip_setsockopt(s, TCP_WINDOW, ...).\n\nSetting a smaller default receive window size can save some RAM,\nbut will significantly decrease performance.", + "id": "LWIP_TCP_WND_DEFAULT", + "name": "LWIP_TCP_WND_DEFAULT", + "range": [ + 2440, + 65535 + ], + "title": "Default receive window size", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Set TCP receive mail box size. Generally bigger value means higher throughput\nbut more memory. The recommended value is: LWIP_TCP_WND_DEFAULT/TCP_MSS + 2, e.g. if\nLWIP_TCP_WND_DEFAULT=14360, TCP_MSS=1436, then the recommended receive mail box size is\n(14360/1436 + 2) = 12.\n\nTCP receive mail box is a per socket mail box, when the application receives packets\nfrom TCP socket, LWIP core firstly posts the packets to TCP receive mail box and the\napplication then fetches the packets from mail box. It means LWIP can caches maximum\nLWIP_TCP_RECCVMBOX_SIZE packets for each TCP socket, so the maximum possible cached TCP packets\nfor all TCP sockets is LWIP_TCP_RECCVMBOX_SIZE multiples the maximum TCP socket number. In other\nwords, the bigger LWIP_TCP_RECVMBOX_SIZE means more memory.\nOn the other hand, if the receive mail box is too small, the mail box may be full. If the\nmail box is full, the LWIP drops the packets. So generally we need to make sure the TCP\nreceive mail box is big enough to avoid packet drop between LWIP core and application.", + "id": "LWIP_TCP_RECVMBOX_SIZE", + "name": "LWIP_TCP_RECVMBOX_SIZE", + "range": [ + 6, + 64 + ], + "title": "Default TCP receive mail box size", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Set TCP accept mail box size. Generally bigger value means supporting larger backlogs\nbut more memory. The recommended value is 6, but applications can set it to a lower value\nif listening servers are meant to have a smaller backlog.\n\nTCP accept mail box is a per socket mail box, when the application listens for connections\nwith a given listening TCP socket. If the mailbox is full, LWIP will send a RST packet and\nthe client will fail to connect.", + "id": "LWIP_TCP_ACCEPTMBOX_SIZE", + "name": "LWIP_TCP_ACCEPTMBOX_SIZE", + "range": [ + 1, + 64 + ], + "title": "Default TCP accept mail box size", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "LWIP_TCP_QUEUE_OOSEQ", + "help": "The timeout value is TCP_OOSEQ_TIMEOUT * RTO.", + "id": "LWIP_TCP_OOSEQ_TIMEOUT", + "name": "LWIP_TCP_OOSEQ_TIMEOUT", + "range": [ + 1, + 30 + ], + "title": "Timeout for each pbuf queued in TCP OOSEQ, in RTOs.", + "type": "int" + }, + { + "children": [], + "depends_on": "LWIP_TCP_QUEUE_OOSEQ", + "help": "If LWIP_TCP_OOSEQ_MAX_PBUFS = 0, TCP will not control the number of OOSEQ pbufs.\n\nIn a poor network environment, many out-of-order tcp pbufs will be received.\nThese out-of-order pbufs will be cached in the TCP out-of-order queue which will\ncause Wi-Fi/Ethernet fail to release RX buffer in time.\nIt is possible that all RX buffers for MAC layer are used by OOSEQ.\n\nControl the number of out-of-order pbufs to ensure\nthat the MAC layer has enough RX buffer to receive packets.\n\nIn the Wi-Fi scenario, recommended OOSEQ PBUFS Range:\n0 <= TCP_OOSEQ_MAX_PBUFS <= CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM/(MAX_TCP_NUMBER + 1)\n\nIn the Ethernet scenario,recommended Ethernet OOSEQ PBUFS Range:\n0 <= TCP_OOSEQ_MAX_PBUFS <= CONFIG_ETH_DMA_RX_BUFFER_NUM/(MAX_TCP_NUMBER + 1)\n\nWithin the recommended value range, the larger the value, the better the performance.\n\nMAX_TCP_NUMBER represent Maximum number of TCP connections in Wi-Fi(STA+SoftAP) and Ethernet scenario.", + "id": "LWIP_TCP_OOSEQ_MAX_PBUFS", + "name": "LWIP_TCP_OOSEQ_MAX_PBUFS", + "range": [ + 0, + 12 + ], + "title": "The maximum number of pbufs queued on OOSEQ per pcb", + "type": "int" + }, + { + "children": [], + "depends_on": "LWIP_TCP_QUEUE_OOSEQ", + "help": "TCP will support sending selective acknowledgements (SACKs).", + "id": "LWIP_TCP_SACK_OUT", + "name": "LWIP_TCP_SACK_OUT", + "range": null, + "title": "Support sending selective acknowledgements", + "type": "bool" + } + ], + "depends_on": null, + "help": "Queue incoming out-of-order segments for later use.\n\nDisable this option to save some RAM during TCP sessions, at the expense\nof increased retransmissions if segments arrive out of order.", + "id": "LWIP_TCP_QUEUE_OOSEQ", + "name": "LWIP_TCP_QUEUE_OOSEQ", + "range": null, + "title": "Queue incoming out-of-order segments", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "LWIP_TCP_OVERSIZE_MSS", + "name": "LWIP_TCP_OVERSIZE_MSS", + "range": null, + "title": "MSS", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "LWIP_TCP_OVERSIZE_QUARTER_MSS", + "name": "LWIP_TCP_OVERSIZE_QUARTER_MSS", + "range": null, + "title": "25% MSS", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "LWIP_TCP_OVERSIZE_DISABLE", + "name": "LWIP_TCP_OVERSIZE_DISABLE", + "range": null, + "title": "Disabled", + "type": "bool" + } + ], + "depends_on": null, + "help": "Allows enabling \"oversize\" allocation of TCP transmission pbufs ahead of time,\nwhich can reduce the length of pbuf chains used for transmission.\n\nThis will not make a difference to sockets where Nagle's algorithm\nis disabled.\n\nDefault value of MSS is fine for most applications, 25% MSS may save\nsome RAM when only transmitting small amounts of data. Disabled will\nhave worst performance and fragmentation characteristics, but uses\nleast RAM overall.", + "id": "component-config-lwip-tcp-pre-allocate-transmit-pbuf-size", + "name": "LWIP_TCP_OVERSIZE", + "title": "Pre-allocate transmit PBUF size", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "LWIP_WND_SCALE", + "help": "Enable this feature to support TCP window scaling.", + "id": "LWIP_TCP_RCV_SCALE", + "name": "LWIP_TCP_RCV_SCALE", + "range": null, + "title": "Set TCP receiving window scaling factor", + "type": "int" + } + ], + "depends_on": "SPIRAM_TRY_ALLOCATE_WIFI_LWIP && !SPIRAM_IGNORE_NOTFOUND", + "help": "Enable this feature to support TCP window scaling.", + "id": "LWIP_WND_SCALE", + "name": "LWIP_WND_SCALE", + "range": null, + "title": "Support TCP window scale", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Set default TCP rto time for a reasonable initial rto.\nIn bad network environment, recommend set value of rto time to 1500.", + "id": "LWIP_TCP_RTO_TIME", + "name": "LWIP_TCP_RTO_TIME", + "range": null, + "title": "Default TCP rto time", + "type": "int" + } + ], + "depends_on": null, + "id": "component-config-lwip-tcp", + "title": "TCP", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "The maximum number of active UDP \"connections\" (ie\nUDP sockets sending/receiving data).\nThe practical maximum limit is determined by available\nheap memory at runtime.", + "id": "LWIP_MAX_UDP_PCBS", + "name": "LWIP_MAX_UDP_PCBS", + "range": [ + 1, + 1024 + ], + "title": "Maximum active UDP control blocks", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Set UDP receive mail box size. The recommended value is 6.\n\nUDP receive mail box is a per socket mail box, when the application receives packets\nfrom UDP socket, LWIP core firstly posts the packets to UDP receive mail box and the\napplication then fetches the packets from mail box. It means LWIP can caches maximum\nUDP_RECCVMBOX_SIZE packets for each UDP socket, so the maximum possible cached UDP packets\nfor all UDP sockets is UDP_RECCVMBOX_SIZE multiples the maximum UDP socket number. In other\nwords, the bigger UDP_RECVMBOX_SIZE means more memory.\nOn the other hand, if the receive mail box is too small, the mail box may be full. If the\nmail box is full, the LWIP drops the packets. So generally we need to make sure the UDP\nreceive mail box is big enough to avoid packet drop between LWIP core and application.", + "id": "LWIP_UDP_RECVMBOX_SIZE", + "name": "LWIP_UDP_RECVMBOX_SIZE", + "range": [ + 6, + 64 + ], + "title": "Default UDP receive mail box size", + "type": "int" + } + ], + "depends_on": null, + "id": "component-config-lwip-udp", + "title": "UDP", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "Enable checksum checking for received IP messages", + "id": "LWIP_CHECKSUM_CHECK_IP", + "name": "LWIP_CHECKSUM_CHECK_IP", + "range": null, + "title": "Enable LWIP IP checksums", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enable checksum checking for received UDP messages", + "id": "LWIP_CHECKSUM_CHECK_UDP", + "name": "LWIP_CHECKSUM_CHECK_UDP", + "range": null, + "title": "Enable LWIP UDP checksums", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enable checksum checking for received ICMP messages", + "id": "LWIP_CHECKSUM_CHECK_ICMP", + "name": "LWIP_CHECKSUM_CHECK_ICMP", + "range": null, + "title": "Enable LWIP ICMP checksums", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-lwip-checksums", + "title": "Checksums", + "type": "menu" + }, + { + "children": [], + "depends_on": null, + "help": "Configure TCP/IP task stack size, used by LWIP to process multi-threaded TCP/IP operations.\nSetting this stack too small will result in stack overflow crashes.", + "id": "LWIP_TCPIP_TASK_STACK_SIZE", + "name": "LWIP_TCPIP_TASK_STACK_SIZE", + "range": [ + 2048, + 65536 + ], + "title": "TCP/IP Task Stack Size", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY", + "name": "LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY", + "range": null, + "title": "No affinity", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "LWIP_TCPIP_TASK_AFFINITY_CPU0", + "name": "LWIP_TCPIP_TASK_AFFINITY_CPU0", + "range": null, + "title": "CPU0", + "type": "bool" + }, + { + "children": [], + "depends_on": "!FREERTOS_UNICORE && ", + "help": null, + "id": "LWIP_TCPIP_TASK_AFFINITY_CPU1", + "name": "LWIP_TCPIP_TASK_AFFINITY_CPU1", + "range": null, + "title": "CPU1", + "type": "bool" + } + ], + "depends_on": null, + "help": "Allows setting LwIP tasks affinity, i.e. whether the task is pinned to\nCPU0, pinned to CPU1, or allowed to run on any CPU.\nCurrently this applies to \"TCP/IP\" task and \"Ping\" task.", + "id": "component-config-lwip-tcp-ip-task-affinity", + "name": "LWIP_TCPIP_TASK_AFFINITY", + "title": "TCP/IP task affinity", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "LWIP_TCPIP_TASK_AFFINITY", + "name": "LWIP_TCPIP_TASK_AFFINITY", + "range": null, + "title": null, + "type": "hex" + }, + { + "children": [], + "depends_on": "LWIP_IPV6", + "help": "Config max number of IPv6 packets to queue during MAC resolution.", + "id": "LWIP_IPV6_MEMP_NUM_ND6_QUEUE", + "name": "LWIP_IPV6_MEMP_NUM_ND6_QUEUE", + "range": [ + 3, + 20 + ], + "title": "Max number of IPv6 packets to queue during MAC resolution", + "type": "int" + }, + { + "children": [], + "depends_on": "LWIP_IPV6", + "help": "Config max number of entries in IPv6 neighbor cache", + "id": "LWIP_IPV6_ND6_NUM_NEIGHBORS", + "name": "LWIP_IPV6_ND6_NUM_NEIGHBORS", + "range": [ + 3, + 10 + ], + "title": "Max number of entries in IPv6 neighbor cache", + "type": "int" + }, + { + "children": [], + "depends_on": "LWIP_IPV6", + "help": "Maximum number of entries in IPv6 on-link prefixes cache", + "id": "LWIP_IPV6_ND6_NUM_PREFIXES", + "name": "LWIP_IPV6_ND6_NUM_PREFIXES", + "range": null, + "title": "Max number of entries in IPv6 on-link prefixes cache", + "type": "int" + }, + { + "children": [], + "depends_on": "LWIP_IPV6", + "help": "Maximum number of entries in IPv6 default routers cache", + "id": "LWIP_IPV6_ND6_NUM_ROUTERS", + "name": "LWIP_IPV6_ND6_NUM_ROUTERS", + "range": null, + "title": "Max number of entries in IPv6 default routers cache", + "type": "int" + }, + { + "children": [], + "depends_on": "LWIP_IPV6", + "help": "Maximum number of entries in IPv6 destinations cache", + "id": "LWIP_IPV6_ND6_NUM_DESTINATIONS", + "name": "LWIP_IPV6_ND6_NUM_DESTINATIONS", + "range": null, + "title": "Max number of entries in IPv6 destinations cache", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "LWIP_PPP_SUPPORT && LWIP_IPV4", + "help": "Enable IPCP protocol in PPP negotiations, which assigns IPv4 addresses to the PPP client,\nas well as IPv4 DNS servers.\nYou can disable this if your modem supports IPv6 only.", + "id": "LWIP_PPP_ENABLE_IPV4", + "name": "LWIP_PPP_ENABLE_IPV4", + "range": null, + "title": "Enable IPV4 support for PPP connections (IPCP)", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_PPP_SUPPORT && LWIP_IPV6", + "help": "Enable IPV6 support in PPP for the local link between the DTE (processor) and DCE (modem).\nThere are some modems which do not support the IPV6 addressing in the local link.\nIf they are requested for IPV6CP negotiation, they may time out.\nThis would in turn fail the configuration for the whole link.\nIf your modem is not responding correctly to PPP Phase Network, try to disable IPV6 support.", + "id": "LWIP_PPP_ENABLE_IPV6", + "name": "LWIP_PPP_ENABLE_IPV6", + "range": null, + "title": "Enable IPV6 support for PPP connections (IPV6CP)", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_PPP_SUPPORT", + "help": "Enable to set a callback which is called on change of the internal PPP state machine.", + "id": "LWIP_PPP_NOTIFY_PHASE_SUPPORT", + "name": "LWIP_PPP_NOTIFY_PHASE_SUPPORT", + "range": null, + "title": "Enable Notify Phase Callback", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_PPP_SUPPORT", + "help": "Enable Password Authentication Protocol (PAP) support", + "id": "LWIP_PPP_PAP_SUPPORT", + "name": "LWIP_PPP_PAP_SUPPORT", + "range": null, + "title": "Enable PAP support", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_PPP_SUPPORT", + "help": "Enable Challenge Handshake Authentication Protocol (CHAP) support", + "id": "LWIP_PPP_CHAP_SUPPORT", + "name": "LWIP_PPP_CHAP_SUPPORT", + "range": null, + "title": "Enable CHAP support", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_PPP_SUPPORT", + "help": "Enable Microsoft version of the Challenge-Handshake Authentication Protocol (MSCHAP) support", + "id": "LWIP_PPP_MSCHAP_SUPPORT", + "name": "LWIP_PPP_MSCHAP_SUPPORT", + "range": null, + "title": "Enable MSCHAP support", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_PPP_SUPPORT", + "help": "Enable Microsoft Point-to-Point Encryption (MPPE) support", + "id": "LWIP_PPP_MPPE_SUPPORT", + "name": "LWIP_PPP_MPPE_SUPPORT", + "range": null, + "title": "Enable MPPE support", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_PPP_SUPPORT", + "help": "Enable to use PPP server", + "id": "LWIP_PPP_SERVER_SUPPORT", + "name": "LWIP_PPP_SERVER_SUPPORT", + "range": null, + "title": "Enable PPP server support", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_PPP_SUPPORT", + "help": "Enable support for VJ header compression.\nPlease disable this if you're using NAPT on PPP interface,\nsince the compressed IP header might not be correctly interpreted\nin NAT causing the compressed packet to be dropped.", + "id": "LWIP_PPP_VJ_HEADER_COMPRESSION", + "name": "LWIP_PPP_VJ_HEADER_COMPRESSION", + "range": null, + "title": "Enable VJ IP Header compression", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "LWIP_ENABLE_LCP_ECHO", + "help": "Interval in seconds between keepalive LCP echo requests, 0 to disable.", + "id": "LWIP_LCP_ECHOINTERVAL", + "name": "LWIP_LCP_ECHOINTERVAL", + "range": null, + "title": "Echo interval (s)", + "type": "int" + }, + { + "children": [], + "depends_on": "LWIP_ENABLE_LCP_ECHO", + "help": "Number of consecutive unanswered echo requests before failure is indicated.", + "id": "LWIP_LCP_MAXECHOFAILS", + "name": "LWIP_LCP_MAXECHOFAILS", + "range": null, + "title": "Maximum echo failures", + "type": "int" + } + ], + "depends_on": "LWIP_PPP_SUPPORT", + "help": "Enable LCP echo keepalive requests", + "id": "LWIP_ENABLE_LCP_ECHO", + "name": "LWIP_ENABLE_LCP_ECHO", + "range": null, + "title": "Enable LCP ECHO", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_PPP_SUPPORT", + "help": "Enable PPP debug log output", + "id": "LWIP_PPP_DEBUG_ON", + "name": "LWIP_PPP_DEBUG_ON", + "range": null, + "title": "Enable PPP debug log output", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_PPP_SUPPORT && !LWIP_PPP_MPPE_SUPPORT && !LWIP_PPP_MSCHAP_SUPPORT", + "help": "This option uses mbedTLS crypto functions (instead of internal PolarSSL\nimplementation) for PPP authentication modes (PAP, CHAP, etc.).\nYou can use this option to address symbol duplication issues, since\nthe internal functions are not namespaced (e.g. md5_init()).", + "id": "LWIP_USE_EXTERNAL_MBEDTLS", + "name": "LWIP_USE_EXTERNAL_MBEDTLS", + "range": null, + "title": "Use mbedTLS instead of internal polarSSL", + "type": "bool" + } + ], + "depends_on": null, + "help": "Enable PPP stack. Now only PPP over serial is possible.", + "id": "LWIP_PPP_SUPPORT", + "is_menuconfig": true, + "name": "LWIP_PPP_SUPPORT", + "range": null, + "title": "Enable PPP support", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "LWIP_SLIP_SUPPORT", + "help": "Enable SLIP debug log output", + "id": "LWIP_SLIP_DEBUG_ON", + "name": "LWIP_SLIP_DEBUG_ON", + "range": null, + "title": "Enable SLIP debug log output", + "type": "bool" + } + ], + "depends_on": null, + "help": "Enable SLIP stack. Now only SLIP over serial is possible.\n\nSLIP over serial support is experimental and unsupported.", + "id": "LWIP_SLIP_SUPPORT", + "is_menuconfig": true, + "name": "LWIP_SLIP_SUPPORT", + "range": null, + "title": "Enable SLIP support (new/experimental)", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "Enable ICMP module for check network stability", + "id": "LWIP_ICMP", + "name": "LWIP_ICMP", + "range": null, + "title": "ICMP: Enable ICMP", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_ICMP6 || LWIP_ICMP", + "help": null, + "id": "LWIP_MULTICAST_PING", + "name": "LWIP_MULTICAST_PING", + "range": null, + "title": "Respond to multicast pings", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_ICMP", + "help": null, + "id": "LWIP_BROADCAST_PING", + "name": "LWIP_BROADCAST_PING", + "range": null, + "title": "Respond to broadcast pings", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-lwip-icmp", + "title": "ICMP", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "The maximum number of simultaneously active LWIP\nRAW protocol control blocks. The practical maximum\nlimit is determined by available heap memory at runtime.", + "id": "LWIP_MAX_RAW_PCBS", + "name": "LWIP_MAX_RAW_PCBS", + "range": [ + 1, + 1024 + ], + "title": "Maximum LWIP RAW PCBs", + "type": "int" + } + ], + "depends_on": null, + "id": "component-config-lwip-lwip-raw-api", + "title": "LWIP RAW API", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "Set maximum number of NTP servers used by LwIP SNTP module.\nFirst argument of sntp_setserver/sntp_setservername functions\nis limited to this value.", + "id": "LWIP_SNTP_MAX_SERVERS", + "name": "LWIP_SNTP_MAX_SERVERS", + "range": [ + 1, + 16 + ], + "title": "Maximum number of NTP servers", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "LWIP_DHCP_GET_NTP_SRV", + "help": "Set maximum number of NTP servers acquired via DHCP-offer.\nShould be less or equal to \"Maximum number of NTP servers\", any extra servers would be just ignored.", + "id": "LWIP_DHCP_MAX_NTP_SERVERS", + "name": "LWIP_DHCP_MAX_NTP_SERVERS", + "range": null, + "title": "Maximum number of NTP servers acquired via DHCP", + "type": "int" + } + ], + "depends_on": null, + "help": "If enabled, LWIP will add 'NTP' to Parameter-Request Option sent via DHCP-request.\nDHCP server might reply with an NTP server address in option 42.\nSNTP callback for such replies should be set accordingly (see sntp_servermode_dhcp() func.)", + "id": "LWIP_DHCP_GET_NTP_SRV", + "name": "LWIP_DHCP_GET_NTP_SRV", + "range": null, + "title": "Request NTP servers from DHCP", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "This option allows you to set the time update period via SNTP.\nDefault is 1 hour. Must not be below 15 seconds by specification.\n(SNTPv4 RFC 4330 enforces a minimum update time of 15 seconds).", + "id": "LWIP_SNTP_UPDATE_DELAY", + "name": "LWIP_SNTP_UPDATE_DELAY", + "range": [ + 15000, + 4294967295 + ], + "title": "Request interval to update time (ms)", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "LWIP_SNTP_STARTUP_DELAY", + "help": "RFC 4330 recommends a startup delay before sending the initial request.\nLWIP calculates this delay to a random number of milliseconds between 0 and this value.", + "id": "LWIP_SNTP_MAXIMUM_STARTUP_DELAY", + "name": "LWIP_SNTP_MAXIMUM_STARTUP_DELAY", + "range": [ + 100, + 300000 + ], + "title": "Maximum startup delay (ms)", + "type": "int" + } + ], + "depends_on": null, + "help": "It is recommended (RFC 4330) to delay the initial request after by a random timeout from 1 to 5 minutes\nto reduce potential load of NTP servers after simultaneous power-up of many devices.\nThis option disables this initial delay. Please use this option with care, it could improve\na single device responsiveness but might cause peaks on the network after reset.\nAnother option to address responsiveness of devices while using the initial random delay\nis to adjust LWIP_SNTP_MAXIMUM_STARTUP_DELAY.", + "id": "LWIP_SNTP_STARTUP_DELAY", + "name": "LWIP_SNTP_STARTUP_DELAY", + "range": null, + "title": "Enable SNTP startup delay", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-lwip-sntp", + "title": "SNTP", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "Maximum number of IP addresses that can be returned by DNS queries for a single host.", + "id": "LWIP_DNS_MAX_HOST_IP", + "name": "LWIP_DNS_MAX_HOST_IP", + "range": null, + "title": "Maximum number of IP addresses per host", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Set maximum number of DNS servers.\nIf fallback DNS servers are supported,\nthe number of DNS servers needs to be greater than or equal to 3.", + "id": "LWIP_DNS_MAX_SERVERS", + "name": "LWIP_DNS_MAX_SERVERS", + "range": [ + 1, + 4 + ], + "title": "Maximum number of DNS servers", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "LWIP_FALLBACK_DNS_SERVER_SUPPORT", + "help": "This option allows you to config dns fallback server address.", + "id": "LWIP_FALLBACK_DNS_SERVER_ADDRESS", + "name": "LWIP_FALLBACK_DNS_SERVER_ADDRESS", + "range": null, + "title": "DNS fallback server address", + "type": "string" + } + ], + "depends_on": "LWIP_DNS_MAX_SERVERS >= 3", + "help": "Enable this feature to support DNS fallback server.", + "id": "LWIP_FALLBACK_DNS_SERVER_SUPPORT", + "name": "LWIP_FALLBACK_DNS_SERVER_SUPPORT", + "range": null, + "title": "Enable DNS fallback server support", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "This option allows collecting DNS server settings per netif using\nconfigurable callback function.\nIt's typically used with CONFIG_ESP_NETIF_SET_DNS_PER_DEFAULT_NETIF\nwhich configures a callback to collect the DNS info on esp_netif layer.", + "id": "LWIP_DNS_SETSERVER_WITH_NETIF", + "name": "LWIP_DNS_SETSERVER_WITH_NETIF", + "range": null, + "title": "Enable DNS server settings with netif", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-lwip-dns", + "title": "DNS", + "type": "menu" + }, + { + "children": [], + "depends_on": null, + "help": "Set maximum number of ports a bridge can consists of.", + "id": "LWIP_BRIDGEIF_MAX_PORTS", + "name": "LWIP_BRIDGEIF_MAX_PORTS", + "range": [ + 1, + 63 + ], + "title": "Maximum number of bridge ports", + "type": "int" + }, + { + "children": [], + "depends_on": "!COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE", + "help": "Enable this option keeps LWIP assertion checks enabled.\nIt is recommended to keep this option enabled.\n\nIf asserts are disabled for the entire project, they are also disabled\nfor LWIP and this option is ignored.", + "id": "LWIP_ESP_LWIP_ASSERT", + "name": "LWIP_ESP_LWIP_ASSERT", + "range": null, + "title": "Enable LWIP ASSERT checks", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "LWIP_HOOK_TCP_ISN_NONE", + "name": "LWIP_HOOK_TCP_ISN_NONE", + "range": null, + "title": "No hook declared", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "LWIP_HOOK_TCP_ISN_DEFAULT", + "name": "LWIP_HOOK_TCP_ISN_DEFAULT", + "range": null, + "title": "Default implementation", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "LWIP_HOOK_TCP_ISN_CUSTOM", + "name": "LWIP_HOOK_TCP_ISN_CUSTOM", + "range": null, + "title": "Custom implementation", + "type": "bool" + } + ], + "depends_on": null, + "help": "Enables to define a TCP ISN hook to randomize initial sequence\nnumber in TCP connection.\nThe default TCP ISN algorithm used in IDF (standardized in RFC 6528)\nproduces ISN by combining an MD5 of the new TCP id and a stable\nsecret with the current time.\nThis is because the lwIP implementation (`tcp_next_iss`) is not\nvery strong, as it does not take into consideration any platform\nspecific entropy source.\n\nSet to LWIP_HOOK_TCP_ISN_CUSTOM to provide custom implementation.\nSet to LWIP_HOOK_TCP_ISN_NONE to use lwIP implementation.", + "id": "component-config-lwip-hooks-tcp-isn-hook", + "name": "LWIP_HOOK_TCP_ISN", + "title": "TCP ISN Hook", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "LWIP_HOOK_IP6_ROUTE_NONE", + "name": "LWIP_HOOK_IP6_ROUTE_NONE", + "range": null, + "title": "No hook declared", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "LWIP_HOOK_IP6_ROUTE_DEFAULT", + "name": "LWIP_HOOK_IP6_ROUTE_DEFAULT", + "range": null, + "title": "Default (weak) implementation", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "LWIP_HOOK_IP6_ROUTE_CUSTOM", + "name": "LWIP_HOOK_IP6_ROUTE_CUSTOM", + "range": null, + "title": "Custom implementation", + "type": "bool" + } + ], + "depends_on": "LWIP_IPV6", + "help": "Enables custom IPv6 route hook.\nSetting this to \"default\" provides weak implementation\nstub that could be overwritten in application code.\nSetting this to \"custom\" provides hook's declaration\nonly and expects the application to implement it.", + "id": "component-config-lwip-hooks-ipv6-route-hook", + "name": "LWIP_HOOK_IP6_ROUTE", + "title": "IPv6 route Hook", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "LWIP_HOOK_ND6_GET_GW_NONE", + "name": "LWIP_HOOK_ND6_GET_GW_NONE", + "range": null, + "title": "No hook declared", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "LWIP_HOOK_ND6_GET_GW_DEFAULT", + "name": "LWIP_HOOK_ND6_GET_GW_DEFAULT", + "range": null, + "title": "Default (weak) implementation", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "LWIP_HOOK_ND6_GET_GW_CUSTOM", + "name": "LWIP_HOOK_ND6_GET_GW_CUSTOM", + "range": null, + "title": "Custom implementation", + "type": "bool" + } + ], + "depends_on": "LWIP_IPV6", + "help": "Enables custom IPv6 route hook.\nSetting this to \"default\" provides weak implementation\nstub that could be overwritten in application code.\nSetting this to \"custom\" provides hook's declaration\nonly and expects the application to implement it.", + "id": "component-config-lwip-hooks-ipv6-get-gateway-hook", + "name": "LWIP_HOOK_ND6_GET_GW", + "title": "IPv6 get gateway Hook", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "LWIP_HOOK_IP6_SELECT_SRC_ADDR_NONE", + "name": "LWIP_HOOK_IP6_SELECT_SRC_ADDR_NONE", + "range": null, + "title": "No hook declared", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "LWIP_HOOK_IP6_SELECT_SRC_ADDR_DEFAULT", + "name": "LWIP_HOOK_IP6_SELECT_SRC_ADDR_DEFAULT", + "range": null, + "title": "Default (weak) implementation", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM", + "name": "LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM", + "range": null, + "title": "Custom implementation", + "type": "bool" + } + ], + "depends_on": "LWIP_IPV6", + "help": "Enables custom IPv6 source address selection.\nSetting this to \"default\" provides weak implementation\nstub that could be overwritten in application code.\nSetting this to \"custom\" provides hook's declaration\nonly and expects the application to implement it.", + "id": "component-config-lwip-hooks-ipv6-source-address-selection-hook", + "name": "LWIP_HOOK_IP6_SELECT_SRC_ADDR", + "title": "IPv6 source address selection Hook", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE", + "name": "LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE", + "range": null, + "title": "No hook declared", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT", + "name": "LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT", + "range": null, + "title": "Default (weak) implementation", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM", + "name": "LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM", + "range": null, + "title": "Custom implementation", + "type": "bool" + } + ], + "depends_on": null, + "help": "Enables custom DNS resolve hook (without callback).\nSetting this to \"default\" provides weak implementation\nstub that could be overwritten in application code.\nSetting this to \"custom\" provides hook's declaration\nonly and expects the application to implement it.", + "id": "component-config-lwip-hooks-netconn-external-resolve-hook", + "name": "LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE", + "title": "Netconn external resolve Hook", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": "This hidden option helps configure the DNS external resolve\nhook for external components like OpenThread. It ensures that\n`LWIP_HOOK_DNS_EXT_RESOLVE_CUSTOM` is selected without directly\nadding a dependency in the choice construct.", + "id": "LWIP_HOOK_DNS_EXTERNAL_RESOLVE_SELECT_CUSTOM", + "name": "LWIP_HOOK_DNS_EXTERNAL_RESOLVE_SELECT_CUSTOM", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "LWIP_HOOK_DNS_EXT_RESOLVE_NONE", + "name": "LWIP_HOOK_DNS_EXT_RESOLVE_NONE", + "range": null, + "title": "No hook declared", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "LWIP_HOOK_DNS_EXT_RESOLVE_CUSTOM", + "name": "LWIP_HOOK_DNS_EXT_RESOLVE_CUSTOM", + "range": null, + "title": "Custom implementation", + "type": "bool" + } + ], + "depends_on": null, + "help": "Enables custom DNS resolve hook (with callback).\nSetting this to \"custom\" provides hook's declaration\nonly and expects the application to implement it.", + "id": "component-config-lwip-hooks-dns-external-resolve-hook", + "name": "LWIP_HOOK_DNS_EXTERNAL_RESOLVE", + "title": "DNS external resolve Hook", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "LWIP_HOOK_IP6_INPUT_NONE", + "name": "LWIP_HOOK_IP6_INPUT_NONE", + "range": null, + "title": "No hook declared", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "LWIP_HOOK_IP6_INPUT_DEFAULT", + "name": "LWIP_HOOK_IP6_INPUT_DEFAULT", + "range": null, + "title": "Default (weak) implementation", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "LWIP_HOOK_IP6_INPUT_CUSTOM", + "name": "LWIP_HOOK_IP6_INPUT_CUSTOM", + "range": null, + "title": "Custom implementation", + "type": "bool" + } + ], + "depends_on": "LWIP_IPV6", + "help": "Enables custom IPv6 packet input.\nSetting this to \"default\" provides weak IDF implementation,\nwhich drops all incoming IPv6 traffic if the interface has no link local address.\n(this default implementation is \"weak\" and could be still overwritten\nin the application if some additional IPv6 input packet filtering is needed)\nSetting this to \"none\" removes this default filter and conforms to the lwIP\nimplementation (which accepts multicasts even if the interface has no link local address)\nSetting this to \"custom\" provides hook's declaration\nonly and expects the application to implement it.", + "id": "component-config-lwip-hooks-ipv6-packet-input", + "name": "LWIP_HOOK_IP6_INPUT", + "title": "IPv6 packet input", + "type": "choice" + } + ], + "depends_on": null, + "id": "component-config-lwip-hooks", + "title": "Hooks", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "LWIP_DEBUG", + "help": "Enabling this option routes all enabled LWIP debugs through ESP_LOGD.", + "id": "LWIP_DEBUG_ESP_LOG", + "name": "LWIP_DEBUG_ESP_LOG", + "range": null, + "title": "Route LWIP debugs through ESP_LOG interface", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_DEBUG", + "help": null, + "id": "LWIP_NETIF_DEBUG", + "name": "LWIP_NETIF_DEBUG", + "range": null, + "title": "Enable netif debug messages", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_DEBUG", + "help": null, + "id": "LWIP_PBUF_DEBUG", + "name": "LWIP_PBUF_DEBUG", + "range": null, + "title": "Enable pbuf debug messages", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_DEBUG", + "help": null, + "id": "LWIP_ETHARP_DEBUG", + "name": "LWIP_ETHARP_DEBUG", + "range": null, + "title": "Enable etharp debug messages", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_DEBUG", + "help": null, + "id": "LWIP_API_LIB_DEBUG", + "name": "LWIP_API_LIB_DEBUG", + "range": null, + "title": "Enable api lib debug messages", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_DEBUG", + "help": null, + "id": "LWIP_SOCKETS_DEBUG", + "name": "LWIP_SOCKETS_DEBUG", + "range": null, + "title": "Enable socket debug messages", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_DEBUG", + "help": null, + "id": "LWIP_IP_DEBUG", + "name": "LWIP_IP_DEBUG", + "range": null, + "title": "Enable IP debug messages", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_DEBUG && LWIP_ICMP", + "help": null, + "id": "LWIP_ICMP_DEBUG", + "name": "LWIP_ICMP_DEBUG", + "range": null, + "title": "Enable ICMP debug messages", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_DEBUG", + "help": null, + "id": "LWIP_DHCP_STATE_DEBUG", + "name": "LWIP_DHCP_STATE_DEBUG", + "range": null, + "title": "Enable DHCP state tracking", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_DEBUG", + "help": null, + "id": "LWIP_DHCP_DEBUG", + "name": "LWIP_DHCP_DEBUG", + "range": null, + "title": "Enable DHCP debug messages", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_DEBUG", + "help": null, + "id": "LWIP_IP6_DEBUG", + "name": "LWIP_IP6_DEBUG", + "range": null, + "title": "Enable IP6 debug messages", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_DEBUG", + "help": null, + "id": "LWIP_ICMP6_DEBUG", + "name": "LWIP_ICMP6_DEBUG", + "range": null, + "title": "Enable ICMP6 debug messages", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_DEBUG", + "help": null, + "id": "LWIP_TCP_DEBUG", + "name": "LWIP_TCP_DEBUG", + "range": null, + "title": "Enable TCP debug messages", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_DEBUG", + "help": null, + "id": "LWIP_UDP_DEBUG", + "name": "LWIP_UDP_DEBUG", + "range": null, + "title": "Enable UDP debug messages", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_DEBUG", + "help": null, + "id": "LWIP_SNTP_DEBUG", + "name": "LWIP_SNTP_DEBUG", + "range": null, + "title": "Enable SNTP debug messages", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_DEBUG", + "help": null, + "id": "LWIP_DNS_DEBUG", + "name": "LWIP_DNS_DEBUG", + "range": null, + "title": "Enable DNS debug messages", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_DEBUG && LWIP_IPV4_NAPT", + "help": null, + "id": "LWIP_NAPT_DEBUG", + "name": "LWIP_NAPT_DEBUG", + "range": null, + "title": "Enable NAPT debug messages", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_DEBUG", + "help": null, + "id": "LWIP_BRIDGEIF_DEBUG", + "name": "LWIP_BRIDGEIF_DEBUG", + "range": null, + "title": "Enable bridge generic debug messages", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_DEBUG", + "help": null, + "id": "LWIP_BRIDGEIF_FDB_DEBUG", + "name": "LWIP_BRIDGEIF_FDB_DEBUG", + "range": null, + "title": "Enable bridge FDB debug messages", + "type": "bool" + }, + { + "children": [], + "depends_on": "LWIP_DEBUG", + "help": null, + "id": "LWIP_BRIDGEIF_FW_DEBUG", + "name": "LWIP_BRIDGEIF_FW_DEBUG", + "range": null, + "title": "Enable bridge forwarding debug messages", + "type": "bool" + } + ], + "depends_on": null, + "help": "Enabling this option allows different kinds of lwIP debug output.\n\nAll lwIP debug features increase the size of the final binary.", + "id": "LWIP_DEBUG", + "is_menuconfig": true, + "name": "LWIP_DEBUG", + "range": null, + "title": "Enable LWIP Debug", + "type": "menu" + } + ], + "depends_on": null, + "id": "component-config-lwip", + "title": "LWIP", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "MBEDTLS_INTERNAL_MEM_ALLOC", + "name": "MBEDTLS_INTERNAL_MEM_ALLOC", + "range": null, + "title": "Internal memory", + "type": "bool" + }, + { + "children": [], + "depends_on": "(SPIRAM_USE_CAPS_ALLOC || SPIRAM_USE_MALLOC) && ", + "help": null, + "id": "MBEDTLS_EXTERNAL_MEM_ALLOC", + "name": "MBEDTLS_EXTERNAL_MEM_ALLOC", + "range": null, + "title": "External SPIRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "MBEDTLS_DEFAULT_MEM_ALLOC", + "name": "MBEDTLS_DEFAULT_MEM_ALLOC", + "range": null, + "title": "Default alloc mode", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "MBEDTLS_CUSTOM_MEM_ALLOC", + "name": "MBEDTLS_CUSTOM_MEM_ALLOC", + "range": null, + "title": "Custom alloc mode", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP32_IRAM_AS_8BIT_ACCESSIBLE_MEMORY && ", + "help": "Allows to use IRAM memory region as 8bit accessible region.\n\nTLS input and output buffers will be allocated in IRAM section which is 32bit aligned\nmemory. Every unaligned (8bit or 16bit) access will result in an exception\nand incur penalty of certain clock cycles per unaligned read/write.", + "id": "MBEDTLS_IRAM_8BIT_MEM_ALLOC", + "name": "MBEDTLS_IRAM_8BIT_MEM_ALLOC", + "range": null, + "title": "Internal IRAM", + "type": "bool" + } + ], + "depends_on": null, + "help": "Allocation strategy for mbedTLS, essentially provides ability to\nallocate all required dynamic allocations from,\n\n- Internal DRAM memory only\n- External SPIRAM memory only\n- Either internal or external memory based on default malloc()\n behavior in ESP-IDF\n- Custom allocation mode, by overwriting calloc()/free() using\n mbedtls_platform_set_calloc_free() function\n- Internal IRAM memory wherever applicable else internal DRAM\n\nRecommended mode here is always internal (*), since that is most preferred\nfrom security perspective. But if application requirement does not\nallow sufficient free internal memory then alternate mode can be\nselected.\n\n(*) In case of ESP32-S2/ESP32-S3, hardware allows encryption of external\nSPIRAM contents provided hardware flash encryption feature is enabled.\nIn that case, using external SPIRAM allocation strategy is also safe choice\nfrom security perspective.", + "id": "component-config-mbedtls-memory-allocation-strategy", + "name": "MBEDTLS_MEM_ALLOC_MODE", + "title": "Memory allocation strategy", + "type": "choice" + }, + { + "children": [], + "depends_on": "!MBEDTLS_ASYMMETRIC_CONTENT_LEN", + "help": "Maximum TLS message length (in bytes) supported by mbedTLS.\n\n16384 is the default and this value is required to comply\nfully with TLS standards.\n\nHowever you can set a lower value in order to save RAM. This\nis safe if the other end of the connection supports Maximum\nFragment Length Negotiation Extension (max_fragment_length,\nsee RFC6066) or you know for certain that it will never send a\nmessage longer than a certain number of bytes.\n\nIf the value is set too low, symptoms are a failed TLS\nhandshake or a return value of MBEDTLS_ERR_SSL_INVALID_RECORD\n(-0x7200).", + "id": "MBEDTLS_SSL_MAX_CONTENT_LEN", + "name": "MBEDTLS_SSL_MAX_CONTENT_LEN", + "range": null, + "title": "TLS maximum message content length", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "MBEDTLS_ASYMMETRIC_CONTENT_LEN", + "help": "This defines maximum incoming fragment length, overriding default\nmaximum content length (MBEDTLS_SSL_MAX_CONTENT_LEN).", + "id": "MBEDTLS_SSL_IN_CONTENT_LEN", + "name": "MBEDTLS_SSL_IN_CONTENT_LEN", + "range": [ + 512, + 16384 + ], + "title": "TLS maximum incoming fragment length", + "type": "int" + }, + { + "children": [], + "depends_on": "MBEDTLS_ASYMMETRIC_CONTENT_LEN", + "help": "This defines maximum outgoing fragment length, overriding default\nmaximum content length (MBEDTLS_SSL_MAX_CONTENT_LEN).", + "id": "MBEDTLS_SSL_OUT_CONTENT_LEN", + "name": "MBEDTLS_SSL_OUT_CONTENT_LEN", + "range": [ + 512, + 16384 + ], + "title": "TLS maximum outgoing fragment length", + "type": "int" + } + ], + "depends_on": null, + "help": "If enabled, this option allows customizing TLS in/out fragment length\nin asymmetric way. Please note that enabling this with default values\nsaves 12KB of dynamic memory per TLS connection.", + "id": "MBEDTLS_ASYMMETRIC_CONTENT_LEN", + "name": "MBEDTLS_ASYMMETRIC_CONTENT_LEN", + "range": null, + "title": "Asymmetric in/out fragment length", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "MBEDTLS_DYNAMIC_FREE_CONFIG_DATA", + "help": "Free CA certificate after its usage in the handshake process.\nThis option will decrease the heap footprint for the TLS handshake, but may lead to a problem:\nIf the respective ssl object needs to perform the TLS handshake again,\nthe CA certificate should once again be registered to the ssl object.", + "id": "MBEDTLS_DYNAMIC_FREE_CA_CERT", + "name": "MBEDTLS_DYNAMIC_FREE_CA_CERT", + "range": null, + "title": "Free SSL CA certificate after its usage", + "type": "bool" + } + ], + "depends_on": "MBEDTLS_DYNAMIC_BUFFER", + "help": "Free private key and DHM data after its usage in handshake process.\n\nThe option will decrease heap cost when handshake, but also lead to problem:\n\nBecause all certificate, private key and DHM data are freed so users should register\ncertificate and private key to ssl config object again.", + "id": "MBEDTLS_DYNAMIC_FREE_CONFIG_DATA", + "name": "MBEDTLS_DYNAMIC_FREE_CONFIG_DATA", + "range": null, + "title": "Free private key and DHM data after its usage", + "type": "bool" + } + ], + "depends_on": "!IDF_TARGET_LINUX && !MBEDTLS_SSL_PROTO_DTLS && !MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH", + "help": "Using dynamic TX/RX buffer. After enabling this option, mbedTLS will\nallocate TX buffer when need to send data and then free it if all data\nis sent, allocate RX buffer when need to receive data and then free it\nwhen all data is used or read by upper layer.\n\nBy default, when SSL is initialized, mbedTLS also allocate TX and\nRX buffer with the default value of \"MBEDTLS_SSL_OUT_CONTENT_LEN\" or\n\"MBEDTLS_SSL_IN_CONTENT_LEN\", so to save more heap, users can set\nthe options to be an appropriate value.", + "id": "MBEDTLS_DYNAMIC_BUFFER", + "name": "MBEDTLS_DYNAMIC_BUFFER", + "range": null, + "title": "Using dynamic TX/RX buffer", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "MBEDTLS_DEBUG_LEVEL_WARN", + "name": "MBEDTLS_DEBUG_LEVEL_WARN", + "range": null, + "title": "Warning", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "MBEDTLS_DEBUG_LEVEL_INFO", + "name": "MBEDTLS_DEBUG_LEVEL_INFO", + "range": null, + "title": "Info", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "MBEDTLS_DEBUG_LEVEL_DEBUG", + "name": "MBEDTLS_DEBUG_LEVEL_DEBUG", + "range": null, + "title": "Debug", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "MBEDTLS_DEBUG_LEVEL_VERBOSE", + "name": "MBEDTLS_DEBUG_LEVEL_VERBOSE", + "range": null, + "title": "Verbose", + "type": "bool" + } + ], + "depends_on": "MBEDTLS_DEBUG", + "help": "Set mbedTLS debugging level", + "id": "component-config-mbedtls-enable-mbedtls-debugging-set-mbedtls-debugging-level", + "name": "MBEDTLS_DEBUG_LEVEL", + "title": "Set mbedTLS debugging level", + "type": "choice" + } + ], + "depends_on": null, + "help": "Enable mbedTLS debugging functions at compile time.\n\nIf this option is enabled, you can include\n\"mbedtls/esp_debug.h\" and call mbedtls_esp_enable_debug_log()\nat runtime in order to enable mbedTLS debug output via the ESP\nlog mechanism.", + "id": "MBEDTLS_DEBUG", + "name": "MBEDTLS_DEBUG", + "range": null, + "title": "Enable mbedTLS debugging", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "MBEDTLS_DEBUG_LEVEL", + "name": "MBEDTLS_DEBUG_LEVEL", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "MBEDTLS_SSL_PROTO_TLS1_3", + "help": null, + "id": "MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE", + "name": "MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE", + "range": null, + "title": "TLS 1.3 middlebox compatibility mode", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_SSL_PROTO_TLS1_3", + "help": null, + "id": "MBEDTLS_SSL_TLS1_3_KEXM_PSK", + "name": "MBEDTLS_SSL_TLS1_3_KEXM_PSK", + "range": null, + "title": "TLS 1.3 PSK key exchange mode", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_SSL_PROTO_TLS1_3", + "help": null, + "id": "MBEDTLS_SSL_TLS1_3_KEXM_EPHEMERAL", + "name": "MBEDTLS_SSL_TLS1_3_KEXM_EPHEMERAL", + "range": null, + "title": "TLS 1.3 ephemeral key exchange mode", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_SSL_PROTO_TLS1_3", + "help": null, + "id": "MBEDTLS_SSL_TLS1_3_KEXM_PSK_EPHEMERAL", + "name": "MBEDTLS_SSL_TLS1_3_KEXM_PSK_EPHEMERAL", + "range": null, + "title": "TLS 1.3 PSK ephemeral key exchange mode", + "type": "bool" + } + ], + "depends_on": "MBEDTLS_SSL_PROTO_TLS1_3", + "id": "component-config-mbedtls-mbedtls-v3-x-related-support-tls-1-3-protocol-tls-1-3-related-configurations", + "title": "TLS 1.3 related configurations", + "type": "menu" + } + ], + "depends_on": "MBEDTLS_TLS_ENABLED && MBEDTLS_SSL_KEEP_PEER_CERTIFICATE && !MBEDTLS_DYNAMIC_BUFFER", + "help": null, + "id": "MBEDTLS_SSL_PROTO_TLS1_3", + "name": "MBEDTLS_SSL_PROTO_TLS1_3", + "range": null, + "title": "Support TLS 1.3 protocol", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "This enables the SSL buffer to be resized automatically\nbased on the negotiated maximum fragment length in each direction.", + "id": "MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH", + "name": "MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH", + "range": null, + "title": "Variable SSL buffer length", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_ECDH_C && MBEDTLS_ECP_RESTARTABLE", + "help": "Use the legacy ECDH context format.\nDefine this option only if you enable MBEDTLS_ECP_RESTARTABLE or if you\nwant to access ECDH context fields directly.", + "id": "MBEDTLS_ECDH_LEGACY_CONTEXT", + "name": "MBEDTLS_ECDH_LEGACY_CONTEXT", + "range": null, + "title": "Use a backward compatible ECDH context (Experimental)", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enables users to configure the set of trusted certificates\nthrough a callback instead of a linked list.\n\nSee mbedTLS documentation for required API and more details.", + "id": "MBEDTLS_X509_TRUSTED_CERT_CALLBACK", + "name": "MBEDTLS_X509_TRUSTED_CERT_CALLBACK", + "range": null, + "title": "Enable trusted certificate callbacks", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_GCM_C || MBEDTLS_CCM_C || MBEDTLS_CHACHAPOLY_C", + "help": "Enable serialization of the TLS context structures\nThis is a local optimization in handling a single, potentially long-lived connection.\n\nSee mbedTLS documentation for required API and more details.\nDisabling this option will save some code size.", + "id": "MBEDTLS_SSL_CONTEXT_SERIALIZATION", + "name": "MBEDTLS_SSL_CONTEXT_SERIALIZATION", + "range": null, + "title": "Enable serialization of the TLS context structures", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Keep the peer's certificate after completion of the handshake.\nDisabling this option will save about 4kB of heap and some code size.\n\nSee mbedTLS documentation for required API and more details.", + "id": "MBEDTLS_SSL_KEEP_PEER_CERTIFICATE", + "name": "MBEDTLS_SSL_KEEP_PEER_CERTIFICATE", + "range": null, + "title": "Keep peer certificate after handshake completion", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_X509_CRL_PARSE_C", + "help": "Enable PKCS number 7 core for using PKCS number 7-formatted signatures.", + "id": "MBEDTLS_PKCS7_C", + "name": "MBEDTLS_PKCS7_C", + "range": null, + "title": "Enable PKCS number 7", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_SSL_PROTO_TLS1_3 || MBEDTLS_SSL_DTLS_CONNECTION_ID", + "help": "Controls the use of record plaintext padding in TLS 1.3 and\nwhen using the Connection ID extension in DTLS 1.2.\n\nThe padding will always be chosen so that the length of the\npadded plaintext is a multiple of the value of this option.\n\nNotes:\n A value of 1 means that no padding will be used for outgoing records.\n On systems lacking division instructions, a power of two should be preferred.", + "id": "MBEDTLS_SSL_CID_PADDING_GRANULARITY", + "name": "MBEDTLS_SSL_CID_PADDING_GRANULARITY", + "range": null, + "title": "Record plaintext padding", + "type": "int" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "MBEDTLS_SSL_DTLS_CONNECTION_ID && MBEDTLS_SSL_PROTO_DTLS", + "help": "Maximum length of CIDs used for incoming DTLS messages", + "id": "MBEDTLS_SSL_CID_IN_LEN_MAX", + "name": "MBEDTLS_SSL_CID_IN_LEN_MAX", + "range": null, + "title": "Maximum length of CIDs used for incoming DTLS messages", + "type": "int" + }, + { + "children": [], + "depends_on": "MBEDTLS_SSL_DTLS_CONNECTION_ID && MBEDTLS_SSL_PROTO_DTLS", + "help": "Maximum length of CIDs used for outgoing DTLS messages", + "id": "MBEDTLS_SSL_CID_OUT_LEN_MAX", + "name": "MBEDTLS_SSL_CID_OUT_LEN_MAX", + "range": null, + "title": "Maximum length of CIDs used for outgoing DTLS messages", + "type": "int" + } + ], + "depends_on": "MBEDTLS_SSL_PROTO_DTLS", + "help": "Enable support for the DTLS Connection ID extension which allows to\nidentify DTLS connections across changes in the underlying transport.", + "id": "MBEDTLS_SSL_DTLS_CONNECTION_ID", + "name": "MBEDTLS_SSL_DTLS_CONNECTION_ID", + "range": null, + "title": "Support for the DTLS Connection ID extension", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_SSL_PROTO_DTLS", + "help": "Enable support for negotiation of DTLS-SRTP (RFC 5764) through the use_srtp extension.\n\nSee mbedTLS documentation for required API and more details.\nDisabling this option will save some code size.", + "id": "MBEDTLS_SSL_DTLS_SRTP", + "name": "MBEDTLS_SSL_DTLS_SRTP", + "range": null, + "title": "Enable support for negotiation of DTLS-SRTP (RFC 5764)", + "type": "bool" + } + ], + "depends_on": "MBEDTLS_SSL_PROTO_DTLS", + "id": "component-config-mbedtls-mbedtls-v3-x-related-dtls-based-configurations", + "title": "DTLS-based configurations", + "type": "menu" + } + ], + "depends_on": null, + "id": "component-config-mbedtls-mbedtls-v3-x-related", + "title": "mbedTLS v3.x related", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL", + "name": "MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL", + "range": null, + "title": "Use the full default certificate bundle", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "Use only the most common certificates from the default bundles, reducing the size with 50%,\nwhile still having around 99% coverage.", + "id": "MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN", + "name": "MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN", + "range": null, + "title": "Use only the most common certificates from the default bundles", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE", + "name": "MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE", + "range": null, + "title": "Do not use the default certificate bundle", + "type": "bool" + } + ], + "depends_on": "MBEDTLS_CERTIFICATE_BUNDLE", + "help": null, + "id": "component-config-mbedtls-certificate-bundle-enable-trusted-root-certificate-bundle-default-certificate-bundle-options", + "name": "MBEDTLS_DEFAULT_CERTIFICATE_BUNDLE", + "title": "Default certificate bundle options", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE", + "help": "Name of the custom certificate directory or file. This path is evaluated\nrelative to the project root directory.", + "id": "MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE_PATH", + "name": "MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE_PATH", + "range": null, + "title": "Custom certificate bundle path", + "type": "string" + } + ], + "depends_on": "MBEDTLS_CERTIFICATE_BUNDLE", + "help": null, + "id": "MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE", + "name": "MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE", + "range": null, + "title": "Add custom certificates to the default bundle", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_CERTIFICATE_BUNDLE && !MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE", + "help": "Include the deprecated list of root certificates in the bundle.\nThis list gets updated when a certificate is removed from the Mozilla's\nNSS root certificate store. This config can be enabled if you would like\nto ensure that none of the certificates that were deployed in the product\nare affected because of the update to bundle. In turn, enabling this\nconfig keeps expired, retracted certificates in the bundle and it may\npose a security risk.\n\n- Deprecated cert list may grow based based on sync with upstream bundle\n- Deprecated certs would be be removed in ESP-IDF (next) major release", + "id": "MBEDTLS_CERTIFICATE_BUNDLE_DEPRECATED_LIST", + "name": "MBEDTLS_CERTIFICATE_BUNDLE_DEPRECATED_LIST", + "range": null, + "title": "Add deprecated root certificates", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_CERTIFICATE_BUNDLE", + "help": null, + "id": "MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS", + "name": "MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS", + "range": null, + "title": "Maximum no of certificates allowed in certificate bundle", + "type": "int" + } + ], + "depends_on": null, + "help": "Enable support for large number of default root certificates\n\nWhen enabled this option allows user to store default as well\nas customer specific root certificates in compressed format rather\nthan storing full certificate. For the root certificates the public key and the subject name\nwill be stored.", + "id": "MBEDTLS_CERTIFICATE_BUNDLE", + "name": "MBEDTLS_CERTIFICATE_BUNDLE", + "range": null, + "title": "Enable trusted root certificate bundle", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-mbedtls-certificate-bundle", + "title": "Certificate Bundle", + "type": "menu" + }, + { + "children": [], + "depends_on": "MBEDTLS_ECP_C", + "help": "Enable \"non-blocking\" ECC operations that can return early and be resumed.", + "id": "MBEDTLS_ECP_RESTARTABLE", + "name": "MBEDTLS_ECP_RESTARTABLE", + "range": null, + "title": "Enable mbedTLS ecp restartable", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_AES_C || MBEDTLS_DES_C", + "help": "Enable the CMAC (Cipher-based Message Authentication Code) mode for\nblock ciphers.", + "id": "MBEDTLS_CMAC_C", + "name": "MBEDTLS_CMAC_C", + "range": null, + "title": "Enable CMAC mode for block ciphers", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "MBEDTLS_AES_USE_INTERRUPT", + "help": "This config helps to set the interrupt priority level for the AES peripheral.\nValue 0 (default) means that there is no preference regarding the interrupt\npriority level and any level from 1 to 3 can be selected (based on the availability).\nNote: Higher value indicates high interrupt priority.", + "id": "MBEDTLS_AES_INTERRUPT_LEVEL", + "name": "MBEDTLS_AES_INTERRUPT_LEVEL", + "range": null, + "title": "AES hardware interrupt level", + "type": "int" + } + ], + "depends_on": "!IDF_TARGET_ESP32 && MBEDTLS_HARDWARE_AES", + "help": "Use an interrupt to coordinate long AES operations.\n\nThis allows other code to run on the CPU while an AES operation is pending.\nOtherwise the CPU busy-waits.", + "id": "MBEDTLS_AES_USE_INTERRUPT", + "name": "MBEDTLS_AES_USE_INTERRUPT", + "range": null, + "title": "Use interrupt for long AES operations", + "type": "bool" + } + ], + "depends_on": "!SPIRAM_CACHE_WORKAROUND_STRATEGY_DUPLDST && SOC_AES_SUPPORTED", + "help": "Enable hardware accelerated AES encryption & decryption.\n\nNote that if the ESP32 CPU is running at 240MHz, hardware AES does not\noffer any speed boost over software AES.", + "id": "MBEDTLS_HARDWARE_AES", + "name": "MBEDTLS_HARDWARE_AES", + "range": null, + "title": "Enable hardware AES acceleration", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "MBEDTLS_AES_USE_PSEUDO_ROUND_FUNC_STRENGTH_LOW", + "name": "MBEDTLS_AES_USE_PSEUDO_ROUND_FUNC_STRENGTH_LOW", + "range": null, + "title": "Low", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "MBEDTLS_AES_USE_PSEUDO_ROUND_FUNC_STRENGTH_MEDIUM", + "name": "MBEDTLS_AES_USE_PSEUDO_ROUND_FUNC_STRENGTH_MEDIUM", + "range": null, + "title": "Medium", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "MBEDTLS_AES_USE_PSEUDO_ROUND_FUNC_STRENGTH_HIGH", + "name": "MBEDTLS_AES_USE_PSEUDO_ROUND_FUNC_STRENGTH_HIGH", + "range": null, + "title": "High", + "type": "bool" + } + ], + "depends_on": "MBEDTLS_AES_USE_PSEUDO_ROUND_FUNC", + "help": "The strength of the pseudo rounds functions can be configured to low, medium and high.\nYou can configure the strength of the pseudo rounds functions according to your use cases,\nfor example, increasing the strength would provide higher security but would slow down the\nhardware AES encryption/decryption operations.", + "id": "component-config-mbedtls-enable-aes-hardware-s-pseudo-round-function-strength-of-the-pseudo-rounds-function", + "name": "MBEDTLS_AES_USE_PSEUDO_ROUND_FUNC_STRENGTH", + "title": "Strength of the pseudo rounds function", + "type": "choice" + } + ], + "depends_on": "SOC_AES_SUPPORT_PSEUDO_ROUND_FUNCTION", + "help": "Enables the pseudo round function of the AES peripheral.\nEnabling this would impact the performance of the AES operations.\nFor more info regarding the performance impact, please checkout the pseudo round function section of the\nsecurity guide.", + "id": "MBEDTLS_AES_USE_PSEUDO_ROUND_FUNC", + "name": "MBEDTLS_AES_USE_PSEUDO_ROUND_FUNC", + "range": null, + "title": "Enable AES hardware's pseudo round function", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "MBEDTLS_AES_USE_PSEUDO_ROUND_FUNC_STRENGTH", + "name": "MBEDTLS_AES_USE_PSEUDO_ROUND_FUNC_STRENGTH", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "SOC_AES_SUPPORT_GCM && MBEDTLS_HARDWARE_AES", + "help": "Enable partially hardware accelerated GCM. GHASH calculation is still done\nin software.\n\nIf MBEDTLS_HARDWARE_GCM is disabled and MBEDTLS_HARDWARE_AES is enabled then\nmbedTLS will still use the hardware accelerated AES block operation, but\non a single block at a time.", + "id": "MBEDTLS_HARDWARE_GCM", + "name": "MBEDTLS_HARDWARE_GCM", + "range": null, + "title": "Enable partially hardware accelerated GCM", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_HARDWARE_AES", + "help": "Enable this config to support fallback to software definitions for a non-AES\ncipher GCM operation as we support hardware acceleration only for AES cipher.\nSome of the non-AES ciphers used in a GCM operation are DES, ARIA, CAMELLIA,\nCHACHA20, BLOWFISH.\n\nIf this config is disabled, performing a non-AES cipher GCM operation with\nthe config MBEDTLS_HARDWARE_AES enabled will result in calculation of an\nAES-GCM operation instead for the given input values and thus could lead\nto failure in certificate validation which would ultimately lead to a SSL\nhandshake failure.\n\nThis config being by-default enabled leads to an increase in binary size\nfootprint of ~2.5KB.\nIn case you are sure that your use case (for example, client and server\nconfigurations in case of a TLS handshake) would not involve any GCM\noperations using a non-AES cipher, you can safely disable this config,\nleading to reduction in binary size footprint.", + "id": "MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER", + "name": "MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER", + "range": null, + "title": "Enable support for non-AES ciphers in GCM operation", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "MBEDTLS_HARDWARE_MPI", + "help": "Fallback to software implementation for RSA key lengths\nlarger than SOC_RSA_MAX_BIT_LEN. If this is not active\nthen the ESP will be unable to process keys greater\nthan SOC_RSA_MAX_BIT_LEN.", + "id": "MBEDTLS_LARGE_KEY_SOFTWARE_MPI", + "name": "MBEDTLS_LARGE_KEY_SOFTWARE_MPI", + "range": null, + "title": "Fallback to software implementation for larger MPI values", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "MBEDTLS_MPI_USE_INTERRUPT", + "help": "This config helps to set the interrupt priority level for the MPI peripheral.\nValue 0 (default) means that there is no preference regarding the interrupt\npriority level and any level from 1 to 3 can be selected (based on the availability).\nNote: Higher value indicates high interrupt priority.", + "id": "MBEDTLS_MPI_INTERRUPT_LEVEL", + "name": "MBEDTLS_MPI_INTERRUPT_LEVEL", + "range": null, + "title": "MPI hardware interrupt level", + "type": "int" + } + ], + "depends_on": "!IDF_TARGET_ESP32 && MBEDTLS_HARDWARE_MPI", + "help": "Use an interrupt to coordinate long MPI operations.\n\nThis allows other code to run on the CPU while an MPI operation is pending.\nOtherwise the CPU busy-waits.", + "id": "MBEDTLS_MPI_USE_INTERRUPT", + "name": "MBEDTLS_MPI_USE_INTERRUPT", + "range": null, + "title": "Use interrupt for MPI exp-mod operations", + "type": "bool" + } + ], + "depends_on": "!SPIRAM_CACHE_WORKAROUND_STRATEGY_DUPLDST && SOC_MPI_SUPPORTED", + "help": "Enable hardware accelerated multiple precision integer operations.\n\nHardware accelerated multiplication, modulo multiplication,\nand modular exponentiation for up to SOC_RSA_MAX_BIT_LEN bit results.\n\nThese operations are used by RSA.", + "id": "MBEDTLS_HARDWARE_MPI", + "name": "MBEDTLS_HARDWARE_MPI", + "range": null, + "title": "Enable hardware MPI (bignum) acceleration", + "type": "bool" + }, + { + "children": [], + "depends_on": "!SPIRAM_CACHE_WORKAROUND_STRATEGY_DUPLDST && SOC_SHA_SUPPORTED", + "help": "Enable hardware accelerated SHA1, SHA256, SHA384 & SHA512 in mbedTLS.\n\nDue to a hardware limitation, on the ESP32 hardware acceleration is only\nguaranteed if SHA digests are calculated one at a time. If more\nthan one SHA digest is calculated at the same time, one will\nbe calculated fully in hardware and the rest will be calculated\n(at least partially calculated) in software. This happens automatically.\n\nSHA hardware acceleration is faster than software in some situations but\nslower in others. You should benchmark to find the best setting for you.", + "id": "MBEDTLS_HARDWARE_SHA", + "name": "MBEDTLS_HARDWARE_SHA", + "range": null, + "title": "Enable hardware SHA acceleration", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "MBEDTLS_HARDWARE_ECC", + "help": "Fallback to software implementation of ECC point multiplication and point verification\nfor curves not supported in hardware.", + "id": "MBEDTLS_ECC_OTHER_CURVES_SOFT_FALLBACK", + "name": "MBEDTLS_ECC_OTHER_CURVES_SOFT_FALLBACK", + "range": null, + "title": "Fallback to software implementation for curves not supported in hardware", + "type": "bool" + } + ], + "depends_on": "SOC_ECC_SUPPORTED", + "help": "Enable hardware accelerated ECC point multiplication and point verification for points\non curve SECP192R1 and SECP256R1 in mbedTLS", + "id": "MBEDTLS_HARDWARE_ECC", + "name": "MBEDTLS_HARDWARE_ECC", + "range": null, + "title": "Enable hardware ECC acceleration", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Use ROM MD5 in mbedTLS.", + "id": "MBEDTLS_ROM_MD5", + "name": "MBEDTLS_ROM_MD5", + "range": null, + "title": "Use MD5 implementation in ROM", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "MBEDTLS_HARDWARE_ECDSA_SIGN && IDF_TARGET_ESP32H2", + "help": "The ECDSA peripheral before ESP32-H2 v1.2 does not offer constant time ECDSA sign operation.\nThis time can be observed through power profiling of the device,\nmaking the ECDSA private key vulnerable to side-channel timing attacks.\nThis countermeasure masks the real ECDSA sign operation\nunder dummy sign operations to add randomness in the generated power signature.\nIt is highly recommended to also enable Secure Boot for the device in addition to this countermeasure\nso that only trusted software can execute on the device.\nThis countermeasure can be safely disabled for ESP32-H2 v1.2 and above.", + "id": "MBEDTLS_HARDWARE_ECDSA_SIGN_MASKING_CM", + "name": "MBEDTLS_HARDWARE_ECDSA_SIGN_MASKING_CM", + "range": null, + "title": "Mask original ECDSA sign operation under dummy sign operations", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_HARDWARE_ECDSA_SIGN && IDF_TARGET_ESP32H2", + "help": "This option adds a delay after the actual ECDSA signature operation\nso that the entire operation appears to be constant time for the software.\nThis fix helps in protecting the device only in case of remote timing attack on the ECDSA private key.\nFor e.g., When an interface is exposed by the device to perform ECDSA signature\nof an arbitrary message.\nThe signature time would appear to be constant to the external entity after enabling\nthis option.\nThis countermeasure can be safely disabled for ESP32-H2 v1.2 and above.", + "id": "MBEDTLS_HARDWARE_ECDSA_SIGN_CONSTANT_TIME_CM", + "name": "MBEDTLS_HARDWARE_ECDSA_SIGN_CONSTANT_TIME_CM", + "range": null, + "title": "Make ECDSA signature operation pseudo constant time for software", + "type": "bool" + } + ], + "depends_on": "MBEDTLS_HARDWARE_ECDSA_SIGN && IDF_TARGET_ESP32H2", + "id": "component-config-mbedtls-enable-ecdsa-signing-using-on-chip-ecdsa-peripheral-enable-software-countermeasure-for-ecdsa-signing-using-on-chip-ecdsa-peripheral", + "title": "Enable Software Countermeasure for ECDSA signing using on-chip ECDSA peripheral", + "type": "menu" + } + ], + "depends_on": "SOC_ECDSA_SUPPORTED", + "help": "Enable hardware accelerated ECDSA peripheral to sign data\non curve SECP192R1 and SECP256R1 in mbedTLS.\n\nNote that for signing, the private key has to be burnt in an efuse key block\nwith key purpose set to ECDSA_KEY.\nIf no key is burnt, it will report an error\n\nThe key should be burnt in little endian format. espefuse.py utility handles it internally\nbut care needs to be taken while burning using esp_efuse APIs", + "id": "MBEDTLS_HARDWARE_ECDSA_SIGN", + "name": "MBEDTLS_HARDWARE_ECDSA_SIGN", + "range": null, + "title": "Enable ECDSA signing using on-chip ECDSA peripheral", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_ECDSA_SUPPORTED", + "help": "Enable hardware accelerated ECDSA peripheral to verify signature\non curve SECP192R1 and SECP256R1 in mbedTLS.", + "id": "MBEDTLS_HARDWARE_ECDSA_VERIFY", + "name": "MBEDTLS_HARDWARE_ECDSA_VERIFY", + "range": null, + "title": "Enable ECDSA signature verification using on-chip ECDSA peripheral", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "This option enables hardware acceleration for ECDSA sign function, only\nwhen using ATECC608A cryptoauth chip.", + "id": "MBEDTLS_ATCA_HW_ECDSA_SIGN", + "name": "MBEDTLS_ATCA_HW_ECDSA_SIGN", + "range": null, + "title": "Enable hardware ECDSA sign acceleration when using ATECC608A", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "This option enables hardware acceleration for ECDSA sign function, only\nwhen using ATECC608A cryptoauth chip.", + "id": "MBEDTLS_ATCA_HW_ECDSA_VERIFY", + "name": "MBEDTLS_ATCA_HW_ECDSA_VERIFY", + "range": null, + "title": "Enable hardware ECDSA verify acceleration when using ATECC608A", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "MBEDTLS_HAVE_TIME", + "help": "Enabling this config will provide users with a function\n\"mbedtls_platform_set_time()\" that allows to set an alternative\ntime function pointer.", + "id": "MBEDTLS_PLATFORM_TIME_ALT", + "name": "MBEDTLS_PLATFORM_TIME_ALT", + "range": null, + "title": "Enable mbedtls time support: platform-specific", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_HAVE_TIME", + "help": "Enables X.509 certificate expiry checks in mbedTLS.\n\nIf this option is disabled (default) then X.509 certificate\n\"valid from\" and \"valid to\" timestamp fields are ignored.\n\nIf this option is enabled, these fields are compared with the\ncurrent system date and time. The time is retrieved using the\nstandard time() and gmtime() functions. If the certificate is not\nvalid for the current system time then verification will fail with\ncode MBEDTLS_X509_BADCERT_FUTURE or MBEDTLS_X509_BADCERT_EXPIRED.\n\nEnabling this option requires adding functionality in the firmware\nto set the system clock to a valid timestamp before using TLS. The\nrecommended way to do this is via ESP-IDF's SNTP functionality, but\nany method can be used.\n\nIn the case where only a small number of certificates are trusted by\nthe device, please carefully consider the tradeoffs of enabling this\noption. There may be undesired consequences, for example if all\ntrusted certificates expire while the device is offline and a TLS\nconnection is required to update. Or if an issue with the SNTP\nserver means that the system time is invalid for an extended period\nafter a reset.", + "id": "MBEDTLS_HAVE_TIME_DATE", + "name": "MBEDTLS_HAVE_TIME_DATE", + "range": null, + "title": "Enable mbedtls certificate expiry check", + "type": "bool" + } + ], + "depends_on": "!ESP_TIME_FUNCS_USE_NONE", + "help": "Enable use of time.h functions (time() and gmtime()) by mbedTLS.\n\nThis option doesn't require the system time to be correct, but enables\nfunctionality that requires relative timekeeping - for example periodic\nexpiry of TLS session tickets or session cache entries.\n\nDisabling this option will save some firmware size, particularly if\nthe rest of the firmware doesn't call any standard timekeeeping\nfunctions.", + "id": "MBEDTLS_HAVE_TIME", + "name": "MBEDTLS_HAVE_TIME", + "range": null, + "title": "Enable mbedtls time support", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Standard ECDSA is \"fragile\" in the sense that lack of entropy when signing\nmay result in a compromise of the long-term signing key.", + "id": "MBEDTLS_ECDSA_DETERMINISTIC", + "name": "MBEDTLS_ECDSA_DETERMINISTIC", + "range": null, + "title": "Enable deterministic ECDSA", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enable MBEDTLS_SHA512_C adds support for SHA-384 and SHA-512.", + "id": "MBEDTLS_SHA512_C", + "name": "MBEDTLS_SHA512_C", + "range": null, + "title": "Enable the SHA-384 and SHA-512 cryptographic hash algorithms", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enabling MBEDTLS_SHA3_C adds support for SHA3.\nEnabling this configuration option increases the flash footprint\nby almost 4KB.", + "id": "MBEDTLS_SHA3_C", + "name": "MBEDTLS_SHA3_C", + "range": null, + "title": "Enable the SHA3 cryptographic hash algorithm", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "MBEDTLS_TLS_SERVER_AND_CLIENT", + "name": "MBEDTLS_TLS_SERVER_AND_CLIENT", + "range": null, + "title": "Server & Client", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "MBEDTLS_TLS_SERVER_ONLY", + "name": "MBEDTLS_TLS_SERVER_ONLY", + "range": null, + "title": "Server", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "MBEDTLS_TLS_CLIENT_ONLY", + "name": "MBEDTLS_TLS_CLIENT_ONLY", + "range": null, + "title": "Client", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "MBEDTLS_TLS_DISABLED", + "name": "MBEDTLS_TLS_DISABLED", + "range": null, + "title": "None", + "type": "bool" + } + ], + "depends_on": null, + "help": "mbedTLS can be compiled with protocol support for the TLS\nserver, TLS client, or both server and client.\n\nReducing the number of TLS roles supported saves code size.", + "id": "component-config-mbedtls-tls-protocol-role", + "name": "MBEDTLS_TLS_MODE", + "title": "TLS Protocol Role", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "MBEDTLS_TLS_SERVER", + "name": "MBEDTLS_TLS_SERVER", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "MBEDTLS_TLS_CLIENT", + "name": "MBEDTLS_TLS_CLIENT", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "MBEDTLS_TLS_ENABLED", + "name": "MBEDTLS_TLS_ENABLED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "MBEDTLS_PSK_MODES && MBEDTLS_TLS_ENABLED", + "help": "Enable to support symmetric key PSK (pre-shared-key) TLS key exchange modes.", + "id": "MBEDTLS_KEY_EXCHANGE_PSK", + "name": "MBEDTLS_KEY_EXCHANGE_PSK", + "range": null, + "title": "Enable PSK based ciphersuite modes", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_PSK_MODES && MBEDTLS_DHM_C && MBEDTLS_TLS_ENABLED", + "help": "Enable to support Diffie-Hellman PSK (pre-shared-key) TLS authentication modes.", + "id": "MBEDTLS_KEY_EXCHANGE_DHE_PSK", + "name": "MBEDTLS_KEY_EXCHANGE_DHE_PSK", + "range": null, + "title": "Enable DHE-PSK based ciphersuite modes", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_PSK_MODES && MBEDTLS_ECDH_C && MBEDTLS_TLS_ENABLED", + "help": "Enable to support Elliptic-Curve-Diffie-Hellman PSK (pre-shared-key) TLS authentication modes.", + "id": "MBEDTLS_KEY_EXCHANGE_ECDHE_PSK", + "name": "MBEDTLS_KEY_EXCHANGE_ECDHE_PSK", + "range": null, + "title": "Enable ECDHE-PSK based ciphersuite modes", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_PSK_MODES && MBEDTLS_TLS_ENABLED", + "help": "Enable to support RSA PSK (pre-shared-key) TLS authentication modes.", + "id": "MBEDTLS_KEY_EXCHANGE_RSA_PSK", + "name": "MBEDTLS_KEY_EXCHANGE_RSA_PSK", + "range": null, + "title": "Enable RSA-PSK based ciphersuite modes", + "type": "bool" + } + ], + "depends_on": "MBEDTLS_TLS_ENABLED", + "help": "Enable to show configuration for different types of pre-shared-key TLS authentatication methods.\n\nLeaving this options disabled will save code size if they are not used.", + "id": "MBEDTLS_PSK_MODES", + "name": "MBEDTLS_PSK_MODES", + "range": null, + "title": "Enable pre-shared-key ciphersuites", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_TLS_ENABLED", + "help": "Enable to support ciphersuites with prefix TLS-RSA-WITH-", + "id": "MBEDTLS_KEY_EXCHANGE_RSA", + "name": "MBEDTLS_KEY_EXCHANGE_RSA", + "range": null, + "title": "Enable RSA-only based ciphersuite modes", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_DHM_C && MBEDTLS_TLS_ENABLED", + "help": "Enable to support ciphersuites with prefix TLS-DHE-RSA-WITH-", + "id": "MBEDTLS_KEY_EXCHANGE_DHE_RSA", + "name": "MBEDTLS_KEY_EXCHANGE_DHE_RSA", + "range": null, + "title": "Enable DHE-RSA based ciphersuite modes", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE && MBEDTLS_ECDH_C && MBEDTLS_TLS_ENABLED", + "help": "Enable to support ciphersuites with prefix TLS-ECDHE-RSA-WITH-", + "id": "MBEDTLS_KEY_EXCHANGE_ECDHE_RSA", + "name": "MBEDTLS_KEY_EXCHANGE_ECDHE_RSA", + "range": null, + "title": "Enable ECDHE-RSA based ciphersuite modes", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE && MBEDTLS_ECDH_C && MBEDTLS_ECDSA_C && MBEDTLS_TLS_ENABLED", + "help": "Enable to support ciphersuites with prefix TLS-ECDHE-ECDSA-WITH-", + "id": "MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA", + "name": "MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA", + "range": null, + "title": "Enable ECDHE-ECDSA based ciphersuite modes", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE && MBEDTLS_ECDH_C && MBEDTLS_ECDSA_C && MBEDTLS_TLS_ENABLED", + "help": "Enable to support ciphersuites with prefix TLS-ECDH-ECDSA-WITH-", + "id": "MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA", + "name": "MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA", + "range": null, + "title": "Enable ECDH-ECDSA based ciphersuite modes", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE && MBEDTLS_ECDH_C && MBEDTLS_TLS_ENABLED", + "help": "Enable to support ciphersuites with prefix TLS-ECDH-RSA-WITH-", + "id": "MBEDTLS_KEY_EXCHANGE_ECDH_RSA", + "name": "MBEDTLS_KEY_EXCHANGE_ECDH_RSA", + "range": null, + "title": "Enable ECDH-RSA based ciphersuite modes", + "type": "bool" + } + ], + "depends_on": "MBEDTLS_ECP_C && MBEDTLS_TLS_ENABLED", + "help": "Enable to show Elliptic Curve based ciphersuite mode options.\n\nDisabling all Elliptic Curve ciphersuites saves code size and\ncan give slightly faster TLS handshakes, provided the server supports\nRSA-only ciphersuite modes.", + "id": "MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE", + "name": "MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE", + "range": null, + "title": "Support Elliptic Curve based ciphersuites", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_ECJPAKE_C && MBEDTLS_ECP_DP_SECP256R1_ENABLED && MBEDTLS_TLS_ENABLED", + "help": "Enable to support ciphersuites with prefix TLS-ECJPAKE-WITH-", + "id": "MBEDTLS_KEY_EXCHANGE_ECJPAKE", + "name": "MBEDTLS_KEY_EXCHANGE_ECJPAKE", + "range": null, + "title": "Enable ECJPAKE based ciphersuite modes", + "type": "bool" + } + ], + "depends_on": "MBEDTLS_TLS_ENABLED", + "id": "component-config-mbedtls-tls-key-exchange-methods", + "title": "TLS Key Exchange Methods", + "type": "menu" + }, + { + "children": [], + "depends_on": "MBEDTLS_TLS_ENABLED && MBEDTLS_SSL_PROTO_TLS1_2", + "help": "The two main uses of renegotiation are (1) refresh keys on long-lived\nconnections and (2) client authentication after the initial handshake.\nIf you don't need renegotiation, disabling it will save code size and\nreduce the possibility of abuse/vulnerability.", + "id": "MBEDTLS_SSL_RENEGOTIATION", + "name": "MBEDTLS_SSL_RENEGOTIATION", + "range": null, + "title": "Support TLS renegotiation", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_TLS_ENABLED", + "help": null, + "id": "MBEDTLS_SSL_PROTO_TLS1_2", + "name": "MBEDTLS_SSL_PROTO_TLS1_2", + "range": null, + "title": "Support TLS 1.2 protocol", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_TLS_ENABLED", + "help": "Provisions for GM/T SSL 1.1 support", + "id": "MBEDTLS_SSL_PROTO_GMTSSL1_1", + "name": "MBEDTLS_SSL_PROTO_GMTSSL1_1", + "range": null, + "title": "Support GM/T SSL 1.1 protocol", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_SSL_PROTO_TLS1_2", + "help": "Requires TLS 1.2 to be enabled for DTLS 1.2", + "id": "MBEDTLS_SSL_PROTO_DTLS", + "name": "MBEDTLS_SSL_PROTO_DTLS", + "range": null, + "title": "Support DTLS protocol (all versions)", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_TLS_ENABLED", + "help": "Disabling this option will save some code size if it is not needed.", + "id": "MBEDTLS_SSL_ALPN", + "name": "MBEDTLS_SSL_ALPN", + "range": null, + "title": "Support ALPN (Application Layer Protocol Negotiation)", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_TLS_ENABLED", + "help": "Client support for RFC 5077 session tickets. See mbedTLS documentation for more details.\nDisabling this option will save some code size.", + "id": "MBEDTLS_CLIENT_SSL_SESSION_TICKETS", + "name": "MBEDTLS_CLIENT_SSL_SESSION_TICKETS", + "range": null, + "title": "TLS: Client Support for RFC 5077 SSL session tickets", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_TLS_ENABLED && (MBEDTLS_GCM_C || MBEDTLS_CCM_C || MBEDTLS_CHACHAPOLY_C)", + "help": "Server support for RFC 5077 session tickets. See mbedTLS documentation for more details.\nDisabling this option will save some code size.", + "id": "MBEDTLS_SERVER_SSL_SESSION_TICKETS", + "name": "MBEDTLS_SERVER_SSL_SESSION_TICKETS", + "range": null, + "title": "TLS: Server Support for RFC 5077 SSL session tickets", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": null, + "id": "MBEDTLS_AES_C", + "name": "MBEDTLS_AES_C", + "range": null, + "title": "AES block cipher", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "MBEDTLS_CAMELLIA_C", + "name": "MBEDTLS_CAMELLIA_C", + "range": null, + "title": "Camellia block cipher", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enables the DES block cipher to support 3DES-based TLS ciphersuites.\n\n3DES is vulnerable to the Sweet32 attack and should only be enabled\nif absolutely necessary.", + "id": "MBEDTLS_DES_C", + "name": "MBEDTLS_DES_C", + "range": null, + "title": "DES block cipher (legacy, insecure)", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enables the Blowfish block cipher (not used for TLS sessions.)\n\nThe Blowfish cipher is not used for mbedTLS TLS sessions but can be\nused for other purposes. Read up on the limitations of Blowfish (including\nSweet32) before enabling.", + "id": "MBEDTLS_BLOWFISH_C", + "name": "MBEDTLS_BLOWFISH_C", + "range": null, + "title": "Blowfish block cipher (read help)", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enables the XTEA block cipher.", + "id": "MBEDTLS_XTEA_C", + "name": "MBEDTLS_XTEA_C", + "range": null, + "title": "XTEA block cipher", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_AES_C || MBEDTLS_CAMELLIA_C", + "help": "Enable Counter with CBC-MAC (CCM) modes for AES and/or Camellia ciphers.\n\nDisabling this option saves some code size.", + "id": "MBEDTLS_CCM_C", + "name": "MBEDTLS_CCM_C", + "range": null, + "title": "CCM (Counter with CBC-MAC) block cipher modes", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_AES_C || MBEDTLS_CAMELLIA_C", + "help": "Enable Galois/Counter Mode for AES and/or Camellia ciphers.\n\nThis option is generally faster than CCM.", + "id": "MBEDTLS_GCM_C", + "name": "MBEDTLS_GCM_C", + "range": null, + "title": "GCM (Galois/Counter) block cipher modes", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_AES_C", + "help": "Enable NIST key wrapping and key wrapping padding.", + "id": "MBEDTLS_NIST_KW_C", + "name": "MBEDTLS_NIST_KW_C", + "range": null, + "title": "NIST key wrapping (KW) and KW padding (KWP)", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-mbedtls-symmetric-ciphers", + "title": "Symmetric Ciphers", + "type": "menu" + }, + { + "children": [], + "depends_on": null, + "help": "Enable the RIPEMD-160 hash algorithm.", + "id": "MBEDTLS_RIPEMD160_C", + "name": "MBEDTLS_RIPEMD160_C", + "range": null, + "title": "Enable RIPEMD-160 hash algorithm", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "Enable decoding/parsing of PEM formatted certificates.\n\nIf your certificates are all in the simpler DER format, disabling\nthis option will save some code size.", + "id": "MBEDTLS_PEM_PARSE_C", + "name": "MBEDTLS_PEM_PARSE_C", + "range": null, + "title": "Read & Parse PEM formatted certificates", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enable writing of PEM formatted certificates.\n\nIf writing certificate data only in DER format, disabling this\noption will save some code size.", + "id": "MBEDTLS_PEM_WRITE_C", + "name": "MBEDTLS_PEM_WRITE_C", + "range": null, + "title": "Write PEM formatted certificates", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Support for parsing X.509 Certificate Revocation Lists.", + "id": "MBEDTLS_X509_CRL_PARSE_C", + "name": "MBEDTLS_X509_CRL_PARSE_C", + "range": null, + "title": "X.509 CRL parsing", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Support for parsing X.509 Certificate Signing Requests", + "id": "MBEDTLS_X509_CSR_PARSE_C", + "name": "MBEDTLS_X509_CSR_PARSE_C", + "range": null, + "title": "X.509 CSR parsing", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-mbedtls-certificates", + "title": "Certificates", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "MBEDTLS_ECP_C", + "help": "Enhance support for reading EC keys using variants of SEC1 not allowed by\nRFC 5915 and RFC 5480.", + "id": "MBEDTLS_PK_PARSE_EC_EXTENDED", + "name": "MBEDTLS_PK_PARSE_EC_EXTENDED", + "range": null, + "title": "Enhance support for reading EC keys", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_ECP_C", + "help": "Enable the support for parsing public keys of type Short Weierstrass\n(MBEDTLS_ECP_DP_SECP_XXX and MBEDTLS_ECP_DP_BP_XXX) which are using the\ncompressed point format. This parsing is done through ECP module's functions.", + "id": "MBEDTLS_PK_PARSE_EC_COMPRESSED", + "name": "MBEDTLS_PK_PARSE_EC_COMPRESSED", + "range": null, + "title": "Enable the support for parsing public keys of type Short Weierstrass", + "type": "bool" + } + ], + "depends_on": null, + "help": null, + "id": "MBEDTLS_ECP_C", + "is_menuconfig": true, + "name": "MBEDTLS_ECP_C", + "range": null, + "title": "Elliptic Curve Ciphers", + "type": "menu" + }, + { + "children": [], + "depends_on": null, + "help": "Enable DHM. Needed to use DHE-xxx TLS ciphersuites.\n\nNote that the security of Diffie-Hellman key exchanges depends on\na suitable prime being used for the exchange. Please see detailed\nwarning text about this in file `mbedtls/dhm.h` file.", + "id": "MBEDTLS_DHM_C", + "name": "MBEDTLS_DHM_C", + "range": null, + "title": "Diffie-Hellman-Merkle key exchange (DHM)", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "MBEDTLS_ECDH_C", + "help": "Enable ECDSA. Needed to use ECDSA-xxx TLS ciphersuites.", + "id": "MBEDTLS_ECDSA_C", + "name": "MBEDTLS_ECDSA_C", + "range": null, + "title": "Elliptic Curve DSA", + "type": "bool" + } + ], + "depends_on": "MBEDTLS_ECP_C", + "help": "Enable ECDH. Needed to use ECDHE-xxx TLS ciphersuites.", + "id": "MBEDTLS_ECDH_C", + "name": "MBEDTLS_ECDH_C", + "range": null, + "title": "Elliptic Curve Diffie-Hellman (ECDH)", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_ECP_C", + "help": "Enable ECJPAKE. Needed to use ECJPAKE-xxx TLS ciphersuites.", + "id": "MBEDTLS_ECJPAKE_C", + "name": "MBEDTLS_ECJPAKE_C", + "range": null, + "title": "Elliptic curve J-PAKE", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_ECP_C", + "help": "Enable support for SECP192R1 Elliptic Curve.", + "id": "MBEDTLS_ECP_DP_SECP192R1_ENABLED", + "name": "MBEDTLS_ECP_DP_SECP192R1_ENABLED", + "range": null, + "title": "Enable SECP192R1 curve", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_ECP_C", + "help": "Enable support for SECP224R1 Elliptic Curve.", + "id": "MBEDTLS_ECP_DP_SECP224R1_ENABLED", + "name": "MBEDTLS_ECP_DP_SECP224R1_ENABLED", + "range": null, + "title": "Enable SECP224R1 curve", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_ECP_C", + "help": "Enable support for SECP256R1 Elliptic Curve.", + "id": "MBEDTLS_ECP_DP_SECP256R1_ENABLED", + "name": "MBEDTLS_ECP_DP_SECP256R1_ENABLED", + "range": null, + "title": "Enable SECP256R1 curve", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_ECP_C", + "help": "Enable support for SECP384R1 Elliptic Curve.", + "id": "MBEDTLS_ECP_DP_SECP384R1_ENABLED", + "name": "MBEDTLS_ECP_DP_SECP384R1_ENABLED", + "range": null, + "title": "Enable SECP384R1 curve", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_ECP_C", + "help": "Enable support for SECP521R1 Elliptic Curve.", + "id": "MBEDTLS_ECP_DP_SECP521R1_ENABLED", + "name": "MBEDTLS_ECP_DP_SECP521R1_ENABLED", + "range": null, + "title": "Enable SECP521R1 curve", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_ECP_C", + "help": "Enable support for SECP192K1 Elliptic Curve.", + "id": "MBEDTLS_ECP_DP_SECP192K1_ENABLED", + "name": "MBEDTLS_ECP_DP_SECP192K1_ENABLED", + "range": null, + "title": "Enable SECP192K1 curve", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_ECP_C", + "help": "Enable support for SECP224K1 Elliptic Curve.", + "id": "MBEDTLS_ECP_DP_SECP224K1_ENABLED", + "name": "MBEDTLS_ECP_DP_SECP224K1_ENABLED", + "range": null, + "title": "Enable SECP224K1 curve", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_ECP_C", + "help": "Enable support for SECP256K1 Elliptic Curve.", + "id": "MBEDTLS_ECP_DP_SECP256K1_ENABLED", + "name": "MBEDTLS_ECP_DP_SECP256K1_ENABLED", + "range": null, + "title": "Enable SECP256K1 curve", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_ECP_C", + "help": "support for DP Elliptic Curve.", + "id": "MBEDTLS_ECP_DP_BP256R1_ENABLED", + "name": "MBEDTLS_ECP_DP_BP256R1_ENABLED", + "range": null, + "title": "Enable BP256R1 curve", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_ECP_C", + "help": "support for DP Elliptic Curve.", + "id": "MBEDTLS_ECP_DP_BP384R1_ENABLED", + "name": "MBEDTLS_ECP_DP_BP384R1_ENABLED", + "range": null, + "title": "Enable BP384R1 curve", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_ECP_C", + "help": "support for DP Elliptic Curve.", + "id": "MBEDTLS_ECP_DP_BP512R1_ENABLED", + "name": "MBEDTLS_ECP_DP_BP512R1_ENABLED", + "range": null, + "title": "Enable BP512R1 curve", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_ECP_C", + "help": "Enable support for CURVE25519 Elliptic Curve.", + "id": "MBEDTLS_ECP_DP_CURVE25519_ENABLED", + "name": "MBEDTLS_ECP_DP_CURVE25519_ENABLED", + "range": null, + "title": "Enable CURVE25519 curve", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_ECP_C", + "help": "NIST 'modulo p' optimisations increase Elliptic Curve operation performance.\n\nDisabling this option saves some code size.", + "id": "MBEDTLS_ECP_NIST_OPTIM", + "name": "MBEDTLS_ECP_NIST_OPTIM", + "range": null, + "title": "NIST 'modulo p' optimisations", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_ECP_C", + "help": "This configuration option enables optimizations to speedup (about 3 ~ 4 times) the ECP\nfixed point multiplication using pre-computed tables in the flash memory.\nEnabling this configuration option increases the flash footprint\n(about 29KB if all Elliptic Curve selected) in the application binary.\n\n# end of Elliptic Curve options", + "id": "MBEDTLS_ECP_FIXED_POINT_OPTIM", + "name": "MBEDTLS_ECP_FIXED_POINT_OPTIM", + "range": null, + "title": "Enable fixed-point multiplication optimisations", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enable support for Poly1305 MAC algorithm.", + "id": "MBEDTLS_POLY1305_C", + "name": "MBEDTLS_POLY1305_C", + "range": null, + "title": "Poly1305 MAC algorithm", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "MBEDTLS_CHACHA20_C && MBEDTLS_POLY1305_C", + "help": "Enable support for ChaCha20-Poly1305 AEAD algorithm.", + "id": "MBEDTLS_CHACHAPOLY_C", + "name": "MBEDTLS_CHACHAPOLY_C", + "range": null, + "title": "ChaCha20-Poly1305 AEAD algorithm", + "type": "bool" + } + ], + "depends_on": null, + "help": "Enable support for Chacha20 stream cipher.", + "id": "MBEDTLS_CHACHA20_C", + "name": "MBEDTLS_CHACHA20_C", + "range": null, + "title": "Chacha20 stream cipher", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enable support for the Hashed Message Authentication Code\n(HMAC)-based key derivation function (HKDF).", + "id": "MBEDTLS_HKDF_C", + "name": "MBEDTLS_HKDF_C", + "range": null, + "title": "HKDF algorithm (RFC 5869)", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "MBEDTLS_THREADING_C", + "help": "Enable threading alt to allow your own alternate threading implementation.", + "id": "MBEDTLS_THREADING_ALT", + "name": "MBEDTLS_THREADING_ALT", + "range": null, + "title": "Enable threading alternate implementation", + "type": "bool" + }, + { + "children": [], + "depends_on": "MBEDTLS_THREADING_C", + "help": "Enable the pthread wrapper layer for the threading layer.", + "id": "MBEDTLS_THREADING_PTHREAD", + "name": "MBEDTLS_THREADING_PTHREAD", + "range": null, + "title": "Enable threading pthread implementation", + "type": "bool" + } + ], + "depends_on": null, + "help": "If you do intend to use contexts between threads, you will need to enable\nthis layer to prevent race conditions.", + "id": "MBEDTLS_THREADING_C", + "name": "MBEDTLS_THREADING_C", + "range": null, + "title": "Enable the threading abstraction layer", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enables mbedtls_strerror() for converting error codes to error strings.\nDisabling this config can save some code/rodata size as the error\nstring conversion implementation is replaced with an empty stub.", + "id": "MBEDTLS_ERROR_STRINGS", + "name": "MBEDTLS_ERROR_STRINGS", + "range": null, + "title": "Enable error code to error string conversion", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_ROM_HAS_MBEDTLS_CRYPTO_LIB", + "help": "Enable this flag to use mbedtls crypto algorithm from ROM instead of ESP-IDF.\n\nThis configuration option saves flash footprint in the application binary.\nNote that the version of mbedtls crypto algorithm library in ROM(ECO1~ECO3) is v2.16.12,\nand the version of mbedtls crypto algorithm library in ROM(ECO4) is v3.6.0.\nWe have done the security analysis of the mbedtls revision in ROM (ECO1~ECO4)\nand ensured that affected symbols have been patched (removed). If in the future\nmbedtls revisions there are security issues that also affects the version in\nROM (ECO1~ECO4) then we shall patch the relevant symbols. This would increase\nthe flash footprint and hence care must be taken to keep some reserved space\nfor the application binary in flash layout.", + "id": "MBEDTLS_USE_CRYPTO_ROM_IMPL", + "name": "MBEDTLS_USE_CRYPTO_ROM_IMPL", + "range": null, + "title": "Use ROM implementation of the crypto algorithm", + "type": "bool" + }, + { + "children": [], + "depends_on": "(VFS_SUPPORT_IO && VFS_SUPPORT_DIR) || IDF_TARGET_LINUX", + "help": "This option enables functions in mbedTLS that use the filesystem.\nIt uses the default filesystem support for the target,\nwhich is added through vfs component for ESP32 based targets or by\nthe host system when the target is Linux.", + "id": "MBEDTLS_FS_IO", + "name": "MBEDTLS_FS_IO", + "range": null, + "title": "Enable functions that use the filesystem", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-mbedtls", + "title": "mbedTLS", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "NEWLIB_STDOUT_LINE_ENDING_CRLF", + "name": "NEWLIB_STDOUT_LINE_ENDING_CRLF", + "range": null, + "title": "CRLF", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "NEWLIB_STDOUT_LINE_ENDING_LF", + "name": "NEWLIB_STDOUT_LINE_ENDING_LF", + "range": null, + "title": "LF", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "NEWLIB_STDOUT_LINE_ENDING_CR", + "name": "NEWLIB_STDOUT_LINE_ENDING_CR", + "range": null, + "title": "CR", + "type": "bool" + } + ], + "depends_on": null, + "help": "This option allows configuring the desired line endings sent to UART\nwhen a newline ('\\n', LF) appears on stdout.\nThree options are possible:\n\nCRLF: whenever LF is encountered, prepend it with CR\n\nLF: no modification is applied, stdout is sent as is\n\nCR: each occurrence of LF is replaced with CR\n\nThis option doesn't affect behavior of the UART driver (drivers/uart.h).", + "id": "component-config-newlib-line-ending-for-uart-output", + "name": "NEWLIB_STDOUT_LINE_ENDING", + "title": "Line ending for UART output", + "type": "choice" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "NEWLIB_STDIN_LINE_ENDING_CRLF", + "name": "NEWLIB_STDIN_LINE_ENDING_CRLF", + "range": null, + "title": "CRLF", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "NEWLIB_STDIN_LINE_ENDING_LF", + "name": "NEWLIB_STDIN_LINE_ENDING_LF", + "range": null, + "title": "LF", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "NEWLIB_STDIN_LINE_ENDING_CR", + "name": "NEWLIB_STDIN_LINE_ENDING_CR", + "range": null, + "title": "CR", + "type": "bool" + } + ], + "depends_on": null, + "help": "This option allows configuring which input sequence on UART produces\na newline ('\\n', LF) on stdin.\nThree options are possible:\n\nCRLF: CRLF is converted to LF\n\nLF: no modification is applied, input is sent to stdin as is\n\nCR: each occurrence of CR is replaced with LF\n\nThis option doesn't affect behavior of the UART driver (drivers/uart.h).", + "id": "component-config-newlib-line-ending-for-uart-input", + "name": "NEWLIB_STDIN_LINE_ENDING", + "title": "Line ending for UART input", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": "In most chips the ROM contains parts of newlib C library, including printf/scanf family\nof functions. These functions have been compiled with so-called \"nano\"\nformatting option. This option doesn't support 64-bit integer formats and C99\nfeatures, such as positional arguments.\n\nFor more details about \"nano\" formatting option, please see newlib readme file,\nsearch for '--enable-newlib-nano-formatted-io':\nhttps://sourceware.org/git/?p=newlib-cygwin.git;a=blob_plain;f=newlib/README;hb=HEAD\n\nIf this option is enabled and the ROM contains functions from newlib-nano, the build system\nwill use functions available in ROM, reducing the application binary size.\nFunctions available in ROM run faster than functions which run from flash. Functions available\nin ROM can also run when flash instruction cache is disabled.\n\nSome chips (e.g. ESP32-C6) has the full formatting versions of printf/scanf in ROM instead of\nthe nano versions and in this building with newlib nano might actually increase the size of\nthe binary. Which functions are present in ROM can be seen from ROM caps:\nESP_ROM_HAS_NEWLIB_NANO_FORMAT and ESP_ROM_HAS_NEWLIB_NORMAL_FORMAT.\n\nIf you need 64-bit integer formatting support or C99 features, keep this\noption disabled.", + "id": "NEWLIB_NANO_FORMAT", + "name": "NEWLIB_NANO_FORMAT", + "range": null, + "title": "Enable 'nano' formatting options for printf/scanf family", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "NEWLIB_TIME_SYSCALL_USE_RTC_HRT", + "name": "NEWLIB_TIME_SYSCALL_USE_RTC_HRT", + "range": null, + "title": "RTC and high-resolution timer", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "NEWLIB_TIME_SYSCALL_USE_RTC", + "name": "NEWLIB_TIME_SYSCALL_USE_RTC", + "range": null, + "title": "RTC", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "NEWLIB_TIME_SYSCALL_USE_HRT", + "name": "NEWLIB_TIME_SYSCALL_USE_HRT", + "range": null, + "title": "High-resolution timer", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "NEWLIB_TIME_SYSCALL_USE_NONE", + "name": "NEWLIB_TIME_SYSCALL_USE_NONE", + "range": null, + "title": "None", + "type": "bool" + } + ], + "depends_on": null, + "help": "This setting defines which hardware timers are used to\nimplement 'gettimeofday' and 'time' functions in C library.\n\n- If both high-resolution (systimer for all targets except ESP32)\n and RTC timers are used, timekeeping will continue in deep sleep.\n Time will be reported at 1 microsecond resolution.\n This is the default, and the recommended option.\n- If only high-resolution timer (systimer) is used, gettimeofday will\n provide time at microsecond resolution.\n Time will not be preserved when going into deep sleep mode.\n- If only RTC timer is used, timekeeping will continue in\n deep sleep, but time will be measured at 6.(6) microsecond\n resolution. Also the gettimeofday function itself may take\n longer to run.\n- If no timers are used, gettimeofday and time functions\n return -1 and set errno to ENOSYS; they are defined as weak,\n so they could be overridden.\n If you want to customize gettimeofday() and other time functions,\n please choose this option and refer to the 'time.c' source file\n for the exact prototypes of these functions.\n\n- When RTC is used for timekeeping, two RTC_STORE registers are\n used to keep time in deep sleep mode.", + "id": "component-config-newlib-timers-used-for-gettimeofday-function", + "name": "NEWLIB_TIME_SYSCALL", + "title": "Timers used for gettimeofday function", + "type": "choice" + } + ], + "depends_on": null, + "id": "component-config-newlib", + "title": "Newlib", + "type": "menu" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "STDATOMIC_S32C1I_SPIRAM_WORKAROUND", + "name": "STDATOMIC_S32C1I_SPIRAM_WORKAROUND", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "SECURE_FLASH_ENC_ENABLED || SOC_HMAC_SUPPORTED", + "help": "This option enables encryption for NVS. When enabled, XTS-AES is used to encrypt\nthe complete NVS data, except the page headers. It requires XTS encryption keys\nto be stored in an encrypted partition (enabling flash encryption is mandatory here)\nor to be derived from an HMAC key burnt in eFuse.", + "id": "NVS_ENCRYPTION", + "name": "NVS_ENCRYPTION", + "range": null, + "title": "Enable NVS encryption", + "type": "bool" + }, + { + "children": [], + "depends_on": "SECURE_FLASH_ENC_ENABLED", + "help": "Enabling this will ignore \"encrypted\" flag for NVS partitions. NVS encryption\nscheme is different than hardware flash encryption and hence it is not recommended\nto have \"encrypted\" flag for NVS partitions. This was not being checked in pre v4.3\nIDF. Hence, if you have any devices where this flag is kept enabled in partition\ntable then enabling this config will allow to have same behavior as pre v4.3 IDF.", + "id": "NVS_COMPATIBLE_PRE_V4_3_ENCRYPTION_FLAG", + "name": "NVS_COMPATIBLE_PRE_V4_3_ENCRYPTION_FLAG", + "range": null, + "title": "NVS partition encrypted flag compatible with ESP-IDF before v4.3", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "This option switches error checking type between assertions (y) or return codes (n).", + "id": "NVS_ASSERT_ERROR_CHECK", + "name": "NVS_ASSERT_ERROR_CHECK", + "range": null, + "title": "Use assertions for error checking", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enabling this option will switch the nvs_set() family of functions to the legacy mode:\nwhen called repeatedly with the same key but different data type, the existing value\nin the NVS remains active and the new value is just stored, actually not accessible through\ncorresponding nvs_get() call for the key given. Use this option only when your application\nrelies on such NVS API behaviour.", + "id": "NVS_LEGACY_DUP_KEYS_COMPATIBILITY", + "name": "NVS_LEGACY_DUP_KEYS_COMPATIBILITY", + "range": null, + "title": "Enable legacy nvs_set function behavior when same key is reused with different data types", + "type": "bool" + }, + { + "children": [], + "depends_on": "SPIRAM && (SPIRAM_USE_CAPS_ALLOC || SPIRAM_USE_MALLOC)", + "help": "Enabling this option lets NVS library try to allocate page cache and key hash list in SPIRAM\ninstead of internal RAM. It can help applications using large nvs partitions or large number\nof keys to save heap space in internal RAM. SPIRAM heap allocation negatively impacts speed\nof NVS operations as the CPU accesses NVS cache via SPI instead of direct access to the internal RAM.", + "id": "NVS_ALLOCATE_CACHE_IN_SPIRAM", + "name": "NVS_ALLOCATE_CACHE_IN_SPIRAM", + "range": null, + "title": "Prefers allocation of in-memory cache structures in SPI connected PSRAM", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-nvs", + "title": "NVS", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "SECURE_FLASH_ENC_ENABLED && ", + "help": "Protect the NVS Encryption Keys using Flash Encryption\nRequires a separate 'nvs_keys' partition (which will be encrypted by flash encryption)\nfor storing the NVS encryption keys", + "id": "NVS_SEC_KEY_PROTECT_USING_FLASH_ENC", + "name": "NVS_SEC_KEY_PROTECT_USING_FLASH_ENC", + "range": null, + "title": "Using Flash Encryption", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_HMAC_SUPPORTED && ", + "help": "Derive and protect the NVS Encryption Keys using the HMAC peripheral\nRequires the specified eFuse block (NVS_SEC_HMAC_EFUSE_KEY_ID or the v2 API argument)\nto be empty or pre-written with a key with the purpose ESP_EFUSE_KEY_PURPOSE_HMAC_UP", + "id": "NVS_SEC_KEY_PROTECT_USING_HMAC", + "name": "NVS_SEC_KEY_PROTECT_USING_HMAC", + "range": null, + "title": "Using HMAC peripheral", + "type": "bool" + } + ], + "depends_on": "NVS_ENCRYPTION", + "help": "This choice defines the default NVS encryption keys protection scheme;\nwhich will be used for the default NVS partition.\nUsers can use the corresponding scheme registration APIs to register other\nschemes for the default as well as other NVS partitions.", + "id": "component-config-nvs-security-provider-nvs-encryption-key-protection-scheme", + "name": "NVS_SEC_KEY_PROTECTION_SCHEME", + "title": "NVS Encryption: Key Protection Scheme", + "type": "choice" + }, + { + "children": [], + "depends_on": "NVS_SEC_KEY_PROTECT_USING_HMAC", + "help": "eFuse block key ID storing the HMAC key for deriving the NVS encryption keys\n\nNote: The eFuse block key ID required by the HMAC scheme\n(CONFIG_NVS_SEC_KEY_PROTECT_USING_HMAC) is set using this config when the default\nNVS partition is initialized with nvs_flash_init(). The eFuse block key ID can\nalso be set at runtime by passing the appropriate value to the NVS security scheme\nregistration APIs.", + "id": "NVS_SEC_HMAC_EFUSE_KEY_ID", + "name": "NVS_SEC_HMAC_EFUSE_KEY_ID", + "range": null, + "title": "eFuse key ID storing the HMAC key", + "type": "int" + } + ], + "depends_on": null, + "id": "component-config-nvs-security-provider", + "title": "NVS Security Provider", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "OPENTHREAD_ENABLED", + "help": "The OpenThread package name.", + "id": "OPENTHREAD_PACKAGE_NAME", + "name": "OPENTHREAD_PACKAGE_NAME", + "range": null, + "title": "OpenThread package name", + "type": "string" + }, + { + "children": [], + "depends_on": "OPENTHREAD_ENABLED", + "help": "The OpenThread platform information.", + "id": "OPENTHREAD_PLATFORM_INFO", + "name": "OPENTHREAD_PLATFORM_INFO", + "range": null, + "title": "platform information", + "type": "string" + } + ], + "depends_on": "OPENTHREAD_ENABLED", + "id": "component-config-openthread-openthread-thread-version-message", + "title": "Thread Version Message", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "(ESP_CONSOLE_UART_DEFAULT || ESP_CONSOLE_UART_CUSTOM) && ", + "help": null, + "id": "OPENTHREAD_CONSOLE_TYPE_UART", + "name": "OPENTHREAD_CONSOLE_TYPE_UART", + "range": null, + "title": "OpenThread console type UART", + "type": "bool" + }, + { + "children": [], + "depends_on": "(ESP_CONSOLE_USB_SERIAL_JTAG || ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG) && ", + "help": null, + "id": "OPENTHREAD_CONSOLE_TYPE_USB_SERIAL_JTAG", + "name": "OPENTHREAD_CONSOLE_TYPE_USB_SERIAL_JTAG", + "range": null, + "title": "OpenThread console type USB Serial/JTAG Controller", + "type": "bool" + } + ], + "depends_on": "OPENTHREAD_ENABLED", + "help": "Select OpenThread console type", + "id": "component-config-openthread-openthread-thread-console-openthread-console-type", + "name": "OPENTHREAD_CONSOLE_TYPE", + "title": "OpenThread console type", + "type": "choice" + }, + { + "children": [], + "depends_on": "OPENTHREAD_ENABLED", + "help": "Select this option to enable Command-Line Interface in OpenThread.", + "id": "OPENTHREAD_CLI", + "name": "OPENTHREAD_CLI", + "range": null, + "title": "Enable Openthread Command-Line Interface", + "type": "bool" + } + ], + "depends_on": "OPENTHREAD_ENABLED", + "id": "component-config-openthread-openthread-thread-console", + "title": "Thread Console", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "OPENTHREAD_ENABLED", + "help": null, + "id": "OPENTHREAD_NETWORK_NAME", + "name": "OPENTHREAD_NETWORK_NAME", + "range": null, + "title": "OpenThread network name", + "type": "string" + }, + { + "children": [], + "depends_on": "OPENTHREAD_ENABLED", + "help": "A string in the format \"
/\", where `
` is an IPv6\naddress and `` is a prefix length. For example \"fd00:db8:a0:0::/64\"", + "id": "OPENTHREAD_MESH_LOCAL_PREFIX", + "name": "OPENTHREAD_MESH_LOCAL_PREFIX", + "range": null, + "title": "OpenThread mesh local prefix, format
/", + "type": "string" + }, + { + "children": [], + "depends_on": "OPENTHREAD_ENABLED", + "help": null, + "id": "OPENTHREAD_NETWORK_CHANNEL", + "name": "OPENTHREAD_NETWORK_CHANNEL", + "range": null, + "title": "OpenThread network channel", + "type": "int" + }, + { + "children": [], + "depends_on": "OPENTHREAD_ENABLED", + "help": null, + "id": "OPENTHREAD_NETWORK_PANID", + "name": "OPENTHREAD_NETWORK_PANID", + "range": null, + "title": "OpenThread network pan id", + "type": "hex" + }, + { + "children": [], + "depends_on": "OPENTHREAD_ENABLED", + "help": "The OpenThread network extended pan id in hex string format", + "id": "OPENTHREAD_NETWORK_EXTPANID", + "name": "OPENTHREAD_NETWORK_EXTPANID", + "range": null, + "title": "OpenThread extended pan id", + "type": "string" + }, + { + "children": [], + "depends_on": "OPENTHREAD_ENABLED", + "help": "The OpenThread network network key in hex string format", + "id": "OPENTHREAD_NETWORK_MASTERKEY", + "name": "OPENTHREAD_NETWORK_MASTERKEY", + "range": null, + "title": "OpenThread network key", + "type": "string" + }, + { + "children": [], + "depends_on": "OPENTHREAD_ENABLED", + "help": "The OpenThread pre-shared commissioner key in hex string format", + "id": "OPENTHREAD_NETWORK_PSKC", + "name": "OPENTHREAD_NETWORK_PSKC", + "range": null, + "title": "OpenThread pre-shared commissioner key", + "type": "string" + } + ], + "depends_on": "OPENTHREAD_ENABLED", + "id": "component-config-openthread-openthread-thread-core-features-thread-operational-dataset", + "title": "Thread Operational Dataset", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": "Select this to enable Full Thread Device which can act as router and leader in a Thread network.", + "id": "OPENTHREAD_FTD", + "name": "OPENTHREAD_FTD", + "range": null, + "title": "Full Thread Device", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "Select this to enable Minimal Thread Device which can only act as end device in a Thread network.\nThis will reduce the code size of the OpenThread stack.", + "id": "OPENTHREAD_MTD", + "name": "OPENTHREAD_MTD", + "range": null, + "title": "Minimal Thread Device", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "Select this to enable Radio Only Device which can only forward 15.4 packets to the host.\nThe OpenThread stack will be run on the host and OpenThread will have minimal footprint on the\nradio only device.", + "id": "OPENTHREAD_RADIO", + "name": "OPENTHREAD_RADIO", + "range": null, + "title": "Radio Only Device", + "type": "bool" + } + ], + "depends_on": "OPENTHREAD_ENABLED", + "help": "OpenThread can be configured to different device types (FTD, MTD, Radio)", + "id": "component-config-openthread-openthread-thread-core-features-thread-device-type", + "name": "OPENTHREAD_DEVICE_TYPE", + "title": "Thread device type", + "type": "choice" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "OPENTHREAD_RADIO_TREL && (EXAMPLE_CONNECT_WIFI || EXAMPLE_CONNECT_ETHERNET) && OPENTHREAD_ENABLED", + "help": "Configure the port number of TREL service.", + "id": "OPENTHREAD_TREL_PORT", + "name": "OPENTHREAD_TREL_PORT", + "range": null, + "title": "The port of openthread trel service", + "type": "int" + } + ], + "depends_on": "(EXAMPLE_CONNECT_WIFI || EXAMPLE_CONNECT_ETHERNET) && OPENTHREAD_ENABLED", + "help": "Select this option to enable Thread Radio Encapsulation Link.", + "id": "OPENTHREAD_RADIO_TREL", + "name": "OPENTHREAD_RADIO_TREL", + "range": null, + "title": "Enable Thread Radio Encapsulation Link (TREL)", + "type": "bool" + } + ], + "depends_on": "(EXAMPLE_CONNECT_WIFI || EXAMPLE_CONNECT_ETHERNET) && OPENTHREAD_ENABLED", + "id": "component-config-openthread-openthread-thread-core-features-thread-trel-radio-link", + "title": "Thread Trel Radio Link", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": "Select this to use the native 15.4 radio.", + "id": "OPENTHREAD_RADIO_NATIVE", + "name": "OPENTHREAD_RADIO_NATIVE", + "range": null, + "title": "Native 15.4 radio", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "Select this to connect to a Radio Co-Processor via UART.", + "id": "OPENTHREAD_RADIO_SPINEL_UART", + "name": "OPENTHREAD_RADIO_SPINEL_UART", + "range": null, + "title": "Connect via UART", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "Select this to connect to a Radio Co-Processor via SPI.", + "id": "OPENTHREAD_RADIO_SPINEL_SPI", + "name": "OPENTHREAD_RADIO_SPINEL_SPI", + "range": null, + "title": "Connect via SPI", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "Select this to disable the Thread radio based on 15.4 link.", + "id": "OPENTHREAD_RADIO_154_NONE", + "name": "OPENTHREAD_RADIO_154_NONE", + "range": null, + "title": "Disable the Thread radio based on 15.4 link", + "type": "bool" + } + ], + "depends_on": "OPENTHREAD_ENABLED", + "help": "Configure how OpenThread connects to the 15.4 radio", + "id": "component-config-openthread-openthread-thread-core-features-thread-15-4-radio-link-config-the-thread-radio-type-with-15-4-link", + "name": "OPENTHREAD_RADIO_TYPE", + "title": "Config the Thread radio type with 15.4 link", + "type": "choice" + } + ], + "depends_on": "OPENTHREAD_ENABLED", + "id": "component-config-openthread-openthread-thread-core-features-thread-15-4-radio-link", + "title": "Thread 15.4 Radio Link", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": "Select this to enable UART connection to host.", + "id": "OPENTHREAD_RCP_UART", + "name": "OPENTHREAD_RCP_UART", + "range": null, + "title": "UART RCP", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "Select this to enable SPI connection to host.", + "id": "OPENTHREAD_RCP_SPI", + "name": "OPENTHREAD_RCP_SPI", + "range": null, + "title": "SPI RCP", + "type": "bool" + } + ], + "depends_on": "OPENTHREAD_RADIO && OPENTHREAD_ENABLED", + "help": null, + "id": "component-config-openthread-openthread-thread-core-features-thread-radio-co-processor-feature-the-rcp-transport-type", + "name": "OPENTHREAD_RCP_TRANSPORT", + "title": "The RCP transport type", + "type": "choice" + }, + { + "children": [], + "depends_on": "OPENTHREAD_RADIO && OPENTHREAD_ENABLED", + "help": "Select this to enable OpenThread NCP vendor commands.", + "id": "OPENTHREAD_NCP_VENDOR_HOOK", + "name": "OPENTHREAD_NCP_VENDOR_HOOK", + "range": null, + "title": "Enable vendor command for RCP", + "type": "bool" + } + ], + "depends_on": "OPENTHREAD_RADIO && OPENTHREAD_ENABLED", + "id": "component-config-openthread-openthread-thread-core-features-thread-radio-co-processor-feature", + "title": "Thread Radio Co-Processor Feature", + "type": "menu" + }, + { + "children": [], + "depends_on": "OPENTHREAD_FTD && OPENTHREAD_ENABLED", + "help": "Select this option to enable border router features in OpenThread.", + "id": "OPENTHREAD_BORDER_ROUTER", + "name": "OPENTHREAD_BORDER_ROUTER", + "range": null, + "title": "Enable Border Router", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "OPENTHREAD_COMMISSIONER && OPENTHREAD_ENABLED", + "help": null, + "id": "OPENTHREAD_COMM_MAX_JOINER_ENTRIES", + "name": "OPENTHREAD_COMM_MAX_JOINER_ENTRIES", + "range": null, + "title": "The size of max commissioning joiner entries", + "type": "int" + } + ], + "depends_on": "OPENTHREAD_COMMISSIONER && OPENTHREAD_ENABLED", + "id": "component-config-openthread-openthread-thread-core-features-enable-commissioner-commissioner-configurations", + "title": "Commissioner Configurations", + "type": "menu" + } + ], + "depends_on": "OPENTHREAD_ENABLED", + "help": "Select this option to enable commissioner in OpenThread. This will enable the device to act as a\ncommissioner in the Thread network. A commissioner checks the pre-shared key from a joining device\nwith the Thread commissioning protocol and shares the network parameter with the joining device\nupon success.", + "id": "OPENTHREAD_COMMISSIONER", + "name": "OPENTHREAD_COMMISSIONER", + "range": null, + "title": "Enable Commissioner", + "type": "bool" + }, + { + "children": [], + "depends_on": "OPENTHREAD_ENABLED", + "help": "Select this option to enable Joiner in OpenThread. This allows a device to join the\nThread network with a pre-shared key using the Thread commissioning protocol.", + "id": "OPENTHREAD_JOINER", + "name": "OPENTHREAD_JOINER", + "range": null, + "title": "Enable Joiner", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "OPENTHREAD_SRP_CLIENT && OPENTHREAD_ENABLED", + "help": "Set the max buffer size of service entries in the SRP client service pool.", + "id": "OPENTHREAD_SRP_CLIENT_MAX_SERVICES", + "name": "OPENTHREAD_SRP_CLIENT_MAX_SERVICES", + "range": null, + "title": "Specifies number of service entries in the SRP client service pool", + "type": "int" + } + ], + "depends_on": "OPENTHREAD_SRP_CLIENT && OPENTHREAD_ENABLED", + "id": "component-config-openthread-openthread-thread-core-features-enable-srp-client-srp-client-configurations", + "title": "SRP Client Configurations", + "type": "menu" + } + ], + "depends_on": "OPENTHREAD_ENABLED", + "help": "Select this option to enable SRP Client in OpenThread.\nThis allows a device to register SRP services to SRP Server.", + "id": "OPENTHREAD_SRP_CLIENT", + "name": "OPENTHREAD_SRP_CLIENT", + "range": null, + "title": "Enable SRP Client", + "type": "bool" + }, + { + "children": [], + "depends_on": "OPENTHREAD_ENABLED", + "help": "Select this option to enable DNS Client in OpenThread.", + "id": "OPENTHREAD_DNS_CLIENT", + "name": "OPENTHREAD_DNS_CLIENT", + "range": null, + "title": "Enable DNS Client", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "OPENTHREAD_DNS64_CLIENT && OPENTHREAD_ENABLED", + "help": "Set the DNS server IPv4 address.", + "id": "OPENTHREAD_DNS_SERVER_ADDR", + "name": "OPENTHREAD_DNS_SERVER_ADDR", + "range": null, + "title": "DNS server address (IPv4)", + "type": "string" + } + ], + "depends_on": "OPENTHREAD_DNS64_CLIENT && OPENTHREAD_ENABLED", + "id": "component-config-openthread-openthread-thread-core-features-enable-dns64-client-dns64-client-configurations", + "title": "DNS64 Client Configurations", + "type": "menu" + } + ], + "depends_on": "LWIP_IPV4 && OPENTHREAD_ENABLED", + "help": "Select this option to acquire NAT64 address from dns servers.", + "id": "OPENTHREAD_DNS64_CLIENT", + "name": "OPENTHREAD_DNS64_CLIENT", + "range": null, + "title": "Enable DNS64 Client", + "type": "bool" + }, + { + "children": [], + "depends_on": "OPENTHREAD_ENABLED", + "help": "Select this option to enable link metrics feature", + "id": "OPENTHREAD_LINK_METRICS", + "name": "OPENTHREAD_LINK_METRICS", + "range": null, + "title": "Enable link metrics feature", + "type": "bool" + }, + { + "children": [], + "depends_on": "OPENTHREAD_ENABLED", + "help": "Select this option to enable mac filter feature", + "id": "OPENTHREAD_MACFILTER_ENABLE", + "name": "OPENTHREAD_MACFILTER_ENABLE", + "range": null, + "title": "Enable mac filter feature", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "OPENTHREAD_CSL_ENABLE && OPENTHREAD_ENABLED", + "help": "The current accuracy of the clock used for scheduling CSL operations", + "id": "OPENTHREAD_CSL_ACCURACY", + "name": "OPENTHREAD_CSL_ACCURACY", + "range": null, + "title": "The current CSL rx/tx scheduling drift, in units of \u00b1 ppm", + "type": "int" + }, + { + "children": [], + "depends_on": "OPENTHREAD_CSL_ENABLE && OPENTHREAD_ENABLED", + "help": "The fixed uncertainty of the Device for scheduling CSL Transmissions in units of 10 microseconds.", + "id": "OPENTHREAD_CSL_UNCERTAIN", + "name": "OPENTHREAD_CSL_UNCERTAIN", + "range": null, + "title": "The CSL Uncertainty in units of 10 us.", + "type": "int" + }, + { + "children": [], + "depends_on": "OPENTHREAD_CSL_ENABLE && OPENTHREAD_ENABLED", + "help": "Select this option to set rx on when sleep in CSL feature, only for debug", + "id": "OPENTHREAD_CSL_DEBUG_ENABLE", + "name": "OPENTHREAD_CSL_DEBUG_ENABLE", + "range": null, + "title": "Enable CSL debug", + "type": "bool" + } + ], + "depends_on": "OPENTHREAD_CSL_ENABLE && OPENTHREAD_ENABLED", + "id": "component-config-openthread-openthread-thread-core-features-enable-csl-feature-csl-configurations", + "title": "CSL Configurations", + "type": "menu" + } + ], + "depends_on": "OPENTHREAD_ENABLED", + "help": "Select this option to enable CSL feature", + "id": "OPENTHREAD_CSL_ENABLE", + "name": "OPENTHREAD_CSL_ENABLE", + "range": null, + "title": "Enable CSL feature", + "type": "bool" + }, + { + "children": [], + "depends_on": "OPENTHREAD_ENABLED", + "help": "Select this option to enable time synchronization feature, the devices in the same Thread network could\nsync to the same network time.", + "id": "OPENTHREAD_TIME_SYNC", + "name": "OPENTHREAD_TIME_SYNC", + "range": null, + "title": "Enable the time synchronization service feature", + "type": "bool" + }, + { + "children": [], + "depends_on": "(OPENTHREAD_FTD || OPENTHREAD_MTD) && OPENTHREAD_ENABLED", + "help": "Select this option to enable the radio statistics feature, you can use radio\ncommand to print some radio Statistics information.", + "id": "OPENTHREAD_RADIO_STATS_ENABLE", + "name": "OPENTHREAD_RADIO_STATS_ENABLE", + "range": null, + "title": "Enable Radio Statistics feature", + "type": "bool" + }, + { + "children": [], + "depends_on": "OPENTHREAD_ENABLED", + "help": "Select this option to enable OpenThread radio capability rx on when idle.\nDo not support this feature when SW coexistence is enabled.", + "id": "OPENTHREAD_RX_ON_WHEN_IDLE", + "name": "OPENTHREAD_RX_ON_WHEN_IDLE", + "range": null, + "title": "Enable OpenThread radio capability rx on when idle", + "type": "bool" + }, + { + "children": [], + "depends_on": "OPENTHREAD_ENABLED", + "help": "Select this option to enable Diag in OpenThread. This will enable diag mode and a series of diag\ncommands in the OpenThread command line. These commands allow users to manipulate low-level\nfeatures of the storage and 15.4 radio.", + "id": "OPENTHREAD_DIAG", + "name": "OPENTHREAD_DIAG", + "range": null, + "title": "Enable diag", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "(SPIRAM_USE_CAPS_ALLOC || SPIRAM_USE_MALLOC) && OPENTHREAD_ENABLED", + "help": "Select this option to allocate buffer from PSRAM for Thread", + "id": "OPENTHREAD_PLATFORM_MALLOC_CAP_SPIRAM", + "name": "OPENTHREAD_PLATFORM_MALLOC_CAP_SPIRAM", + "range": null, + "title": "Allocate memory from PSRAM", + "type": "bool" + }, + { + "children": [], + "depends_on": "(SPIRAM_USE_CAPS_ALLOC || SPIRAM_USE_MALLOC) && OPENTHREAD_ENABLED", + "help": "If enabled, the message pool is managed by platform defined logic.", + "id": "OPENTHREAD_PLATFORM_MSGPOOL_MANAGEMENT", + "name": "OPENTHREAD_PLATFORM_MSGPOOL_MANAGEMENT", + "range": null, + "title": "Allocate message pool buffer from PSRAM", + "type": "bool" + } + ], + "depends_on": "(SPIRAM_USE_CAPS_ALLOC || SPIRAM_USE_MALLOC) && OPENTHREAD_ENABLED", + "id": "component-config-openthread-openthread-thread-core-features-thread-memory-allocation", + "title": "Thread Memory Allocation", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "(OPENTHREAD_FTD || OPENTHREAD_MTD) && OPENTHREAD_ENABLED", + "help": null, + "id": "OPENTHREAD_ADDRESS_QUERY_TIMEOUT", + "name": "OPENTHREAD_ADDRESS_QUERY_TIMEOUT", + "range": null, + "title": "Timeout (in seconds) for a address notification response after sending an address query.", + "type": "int" + }, + { + "children": [], + "depends_on": "(OPENTHREAD_FTD || OPENTHREAD_MTD) && OPENTHREAD_ENABLED", + "help": null, + "id": "OPENTHREAD_ADDRESS_QUERY_RETRY_DELAY", + "name": "OPENTHREAD_ADDRESS_QUERY_RETRY_DELAY", + "range": null, + "title": "Initial retry delay for address query (in seconds).", + "type": "int" + }, + { + "children": [], + "depends_on": "(OPENTHREAD_FTD || OPENTHREAD_MTD) && OPENTHREAD_ENABLED", + "help": null, + "id": "OPENTHREAD_ADDRESS_QUERY_MAX_RETRY_DELAY", + "name": "OPENTHREAD_ADDRESS_QUERY_MAX_RETRY_DELAY", + "range": null, + "title": "Maximum retry delay for address query (in seconds).", + "type": "int" + } + ], + "depends_on": "OPENTHREAD_ENABLED", + "id": "component-config-openthread-openthread-thread-core-features-openthread-stack-parameters-thread-address-query-config", + "title": "Thread Address Query Config", + "type": "menu" + }, + { + "children": [], + "depends_on": "OPENTHREAD_ENABLED", + "help": null, + "id": "OPENTHREAD_PREFERRED_CHANNEL_MASK", + "name": "OPENTHREAD_PREFERRED_CHANNEL_MASK", + "range": null, + "title": "Preferred channel mask", + "type": "hex" + }, + { + "children": [], + "depends_on": "OPENTHREAD_ENABLED", + "help": null, + "id": "OPENTHREAD_SUPPORTED_CHANNEL_MASK", + "name": "OPENTHREAD_SUPPORTED_CHANNEL_MASK", + "range": null, + "title": "Supported channel mask", + "type": "hex" + }, + { + "children": [], + "depends_on": "OPENTHREAD_ENABLED", + "help": null, + "id": "OPENTHREAD_NUM_MESSAGE_BUFFERS", + "name": "OPENTHREAD_NUM_MESSAGE_BUFFERS", + "range": null, + "title": "The number of openthread message buffers", + "type": "int" + }, + { + "children": [], + "depends_on": "OPENTHREAD_ENABLED", + "help": "The device's XTAL accuracy, in ppm.", + "id": "OPENTHREAD_XTAL_ACCURACY", + "name": "OPENTHREAD_XTAL_ACCURACY", + "range": null, + "title": "The accuracy of the XTAL", + "type": "int" + }, + { + "children": [], + "depends_on": "OPENTHREAD_ENABLED", + "help": null, + "id": "OPENTHREAD_MLE_MAX_CHILDREN", + "name": "OPENTHREAD_MLE_MAX_CHILDREN", + "range": null, + "title": "The size of max MLE children entries", + "type": "int" + }, + { + "children": [], + "depends_on": "OPENTHREAD_ENABLED", + "help": null, + "id": "OPENTHREAD_TMF_ADDR_CACHE_ENTRIES", + "name": "OPENTHREAD_TMF_ADDR_CACHE_ENTRIES", + "range": null, + "title": "The size of max TMF address cache entries", + "type": "int" + }, + { + "children": [], + "depends_on": "OPENTHREAD_ENABLED", + "help": "Set the OpenThread UART buffer size.", + "id": "OPENTHREAD_UART_BUFFER_SIZE", + "name": "OPENTHREAD_UART_BUFFER_SIZE", + "range": null, + "title": "The uart received buffer size of openthread", + "type": "int" + }, + { + "children": [], + "depends_on": "OPENTHREAD_ENABLED", + "help": "The maximum number of backoffs the CSMA-CA algorithm will attempt before declaring a channel access\nfailure.", + "id": "OPENTHREAD_MAC_MAX_CSMA_BACKOFFS_DIRECT", + "name": "OPENTHREAD_MAC_MAX_CSMA_BACKOFFS_DIRECT", + "range": null, + "title": "Maximum backoffs times before declaring a channel access failure.", + "type": "int" + } + ], + "depends_on": "OPENTHREAD_ENABLED", + "id": "component-config-openthread-openthread-thread-core-features-openthread-stack-parameters", + "title": "OpenThread Stack Parameters", + "type": "menu" + } + ], + "depends_on": "OPENTHREAD_ENABLED", + "id": "component-config-openthread-openthread-thread-core-features", + "title": "Thread Core Features", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "OPENTHREAD_ENABLED", + "help": "Select this option to enable dynamic log level control for OpenThread", + "id": "OPENTHREAD_LOG_LEVEL_DYNAMIC", + "name": "OPENTHREAD_LOG_LEVEL_DYNAMIC", + "range": null, + "title": "Enable dynamic log level control", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "OPENTHREAD_LOG_LEVEL_NONE", + "name": "OPENTHREAD_LOG_LEVEL_NONE", + "range": null, + "title": "No logs", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "OPENTHREAD_LOG_LEVEL_CRIT", + "name": "OPENTHREAD_LOG_LEVEL_CRIT", + "range": null, + "title": "Error logs", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "OPENTHREAD_LOG_LEVEL_WARN", + "name": "OPENTHREAD_LOG_LEVEL_WARN", + "range": null, + "title": "Warning logs", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "OPENTHREAD_LOG_LEVEL_NOTE", + "name": "OPENTHREAD_LOG_LEVEL_NOTE", + "range": null, + "title": "Notice logs", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "OPENTHREAD_LOG_LEVEL_INFO", + "name": "OPENTHREAD_LOG_LEVEL_INFO", + "range": null, + "title": "Info logs", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "OPENTHREAD_LOG_LEVEL_DEBG", + "name": "OPENTHREAD_LOG_LEVEL_DEBG", + "range": null, + "title": "Debug logs", + "type": "bool" + } + ], + "depends_on": "!OPENTHREAD_LOG_LEVEL_DYNAMIC && OPENTHREAD_ENABLED", + "help": "Select OpenThread log level.", + "id": "component-config-openthread-openthread-thread-log-openthread-log-verbosity", + "name": "OPENTHREAD_LOG_LEVEL", + "title": "OpenThread log verbosity", + "type": "choice" + }, + { + "children": [], + "depends_on": "!OPENTHREAD_LOG_LEVEL_DYNAMIC && OPENTHREAD_ENABLED", + "help": null, + "id": "OPENTHREAD_LOG_LEVEL", + "name": "OPENTHREAD_LOG_LEVEL", + "range": null, + "title": null, + "type": "int" + } + ], + "depends_on": "OPENTHREAD_ENABLED", + "id": "component-config-openthread-openthread-thread-log", + "title": "Thread Log", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "OPENTHREAD_HEADER_CUSTOM && OPENTHREAD_HEADER_CUSTOM && OPENTHREAD_ENABLED", + "help": "Please use relative paths with respect to the project folder.", + "id": "OPENTHREAD_CUSTOM_HEADER_PATH", + "name": "OPENTHREAD_CUSTOM_HEADER_PATH", + "range": null, + "title": "Path of custom header file", + "type": "string" + }, + { + "children": [], + "depends_on": "OPENTHREAD_HEADER_CUSTOM && OPENTHREAD_HEADER_CUSTOM && OPENTHREAD_ENABLED", + "help": "Name of custom header file.", + "id": "OPENTHREAD_CUSTOM_HEADER_FILE_NAME", + "name": "OPENTHREAD_CUSTOM_HEADER_FILE_NAME", + "range": null, + "title": "Name of custom header file", + "type": "string" + } + ], + "depends_on": "OPENTHREAD_HEADER_CUSTOM && OPENTHREAD_ENABLED", + "id": "component-config-openthread-openthread-thread-extensioned-features-use-a-header-file-defined-by-customer-openthread-custom-header-config", + "title": "OpenThread Custom Header Config", + "type": "menu" + } + ], + "depends_on": "OPENTHREAD_ENABLED", + "help": "This option allows users to tailor the values of openthread macros according to their requirements.\nThe openthread submodule contains numerous macros, each with a default value set. In the Kconfig of\nESP openthread, users can set specific openthread parameters, which will be applied for certain\nopenthread macros in the openthread-core-esp32x-xxx-config.h file. During compilation, the values\nspecified in openthread-core-esp32x-xxx-config.h will replace the default settings in the openthread\nsubmodule. However, Kconfig does not cover all openthread macros, particularly those typically\nusing default values. For such macros, users can enable the OPENTHREAD_HEADER_CUSTOM option in the\nKconfig and provide a custom header file. Macros defined in the custom header file will have the\nhighest priority.", + "id": "OPENTHREAD_HEADER_CUSTOM", + "name": "OPENTHREAD_HEADER_CUSTOM", + "range": null, + "title": "Use a header file defined by customer", + "type": "bool" + } + ], + "depends_on": "OPENTHREAD_ENABLED", + "id": "component-config-openthread-openthread-thread-extensioned-features", + "title": "Thread Extensioned Features", + "type": "menu" + } + ], + "depends_on": null, + "help": "Select this option to enable OpenThread and show the submenu with OpenThread configuration choices.", + "id": "OPENTHREAD_ENABLED", + "name": "OPENTHREAD_ENABLED", + "range": null, + "title": "OpenThread", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "Select this option to enable the OpenThread Radio Spinel for external protocol stack, such as Zigbee.", + "id": "OPENTHREAD_SPINEL_ONLY", + "name": "OPENTHREAD_SPINEL_ONLY", + "range": null, + "title": "Enable OpenThread External Radio Spinel feature", + "type": "bool" + }, + { + "children": [], + "depends_on": "OPENTHREAD_ENABLED || OPENTHREAD_SPINEL_ONLY", + "help": null, + "id": "OPENTHREAD_SPINEL_RX_FRAME_BUFFER_SIZE", + "name": "OPENTHREAD_SPINEL_RX_FRAME_BUFFER_SIZE", + "range": null, + "title": "The size of openthread spinel rx frame buffer", + "type": "int" + }, + { + "children": [], + "depends_on": "OPENTHREAD_SPINEL_ONLY", + "help": "The maximum number of backoffs the CSMA-CA algorithm will attempt before declaring a channel access\nfailure.", + "id": "OPENTHREAD_SPINEL_MAC_MAX_CSMA_BACKOFFS_DIRECT", + "name": "OPENTHREAD_SPINEL_MAC_MAX_CSMA_BACKOFFS_DIRECT", + "range": null, + "title": "Maximum backoffs times before declaring a channel access failure.", + "type": "int" + } + ], + "depends_on": null, + "id": "component-config-openthread-openthread-spinel", + "title": "OpenThread Spinel", + "type": "menu" + } + ], + "depends_on": null, + "id": "component-config-openthread", + "title": "OpenThread", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "Enable support of security version 0.\nDisabling this option saves some code size.\nConsult the Enabling protocomm security version section of the\nProtocomm documentation in ESP-IDF Programming guide for more details.", + "id": "ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_0", + "name": "ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_0", + "range": null, + "title": "Support protocomm security version 0 (no security)", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enable support of security version 1.\nDisabling this option saves some code size.\nConsult the Enabling protocomm security version section of the\nProtocomm documentation in ESP-IDF Programming guide for more details.", + "id": "ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_1", + "name": "ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_1", + "range": null, + "title": "Support protocomm security version 1 (Curve25519 key exchange + AES-CTR encryption/decryption)", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enable support of security version 2.\nDisabling this option saves some code size.\nConsult the Enabling protocomm security version section of the\nProtocomm documentation in ESP-IDF Programming guide for more details.", + "id": "ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_2", + "name": "ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_2", + "range": null, + "title": "Support protocomm security version 2 (SRP6a-based key exchange + AES-GCM encryption/decryption)", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enable support of security patch version. This is a hidden config option\nkept for external components like \"network_provisioning\" to find out if\nprotocomm component support security patch version. This config option\nalso indicates availability of a new API `protocomm_get_sec_version`.\nPlease refer to Protocomm documentation in ESP-IDF Programming guide for\nmore details.", + "id": "ESP_PROTOCOMM_SUPPORT_SECURITY_PATCH_VERSION", + "name": "ESP_PROTOCOMM_SUPPORT_SECURITY_PATCH_VERSION", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_ENABLED", + "help": "Keep BT on after calling protocomm_ble_stop", + "id": "ESP_PROTOCOMM_KEEP_BLE_ON_AFTER_BLE_STOP", + "name": "ESP_PROTOCOMM_KEEP_BLE_ON_AFTER_BLE_STOP", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_PROTOCOMM_KEEP_BLE_ON_AFTER_BLE_STOP", + "help": "Terminate connection after calling protocomm_ble_stop", + "id": "ESP_PROTOCOMM_DISCONNECT_AFTER_BLE_STOP", + "name": "ESP_PROTOCOMM_DISCONNECT_AFTER_BLE_STOP", + "range": null, + "title": null, + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-protocomm", + "title": "Protocomm", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "Priority used to create new tasks with default pthread parameters.", + "id": "PTHREAD_TASK_PRIO_DEFAULT", + "name": "PTHREAD_TASK_PRIO_DEFAULT", + "range": [ + 0, + 255 + ], + "title": "Default task priority", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Stack size used to create new tasks with default pthread parameters.", + "id": "PTHREAD_TASK_STACK_SIZE_DEFAULT", + "name": "PTHREAD_TASK_STACK_SIZE_DEFAULT", + "range": null, + "title": "Default task stack size", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Minimum allowed pthread stack size set in attributes passed to pthread_create", + "id": "PTHREAD_STACK_MIN", + "name": "PTHREAD_STACK_MIN", + "range": null, + "title": "Minimum allowed pthread stack size", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "PTHREAD_DEFAULT_CORE_NO_AFFINITY", + "name": "PTHREAD_DEFAULT_CORE_NO_AFFINITY", + "range": null, + "title": "No affinity", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "PTHREAD_DEFAULT_CORE_0", + "name": "PTHREAD_DEFAULT_CORE_0", + "range": null, + "title": "Core 0", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "PTHREAD_DEFAULT_CORE_1", + "name": "PTHREAD_DEFAULT_CORE_1", + "range": null, + "title": "Core 1", + "type": "bool" + } + ], + "depends_on": "!FREERTOS_UNICORE", + "help": "The default core to which pthreads are pinned.", + "id": "component-config-pthreads-default-pthread-core-affinity", + "name": "PTHREAD_TASK_CORE_DEFAULT", + "title": "Default pthread core affinity", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "PTHREAD_TASK_CORE_DEFAULT", + "name": "PTHREAD_TASK_CORE_DEFAULT", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "The default name of pthreads.", + "id": "PTHREAD_TASK_NAME_DEFAULT", + "name": "PTHREAD_TASK_NAME_DEFAULT", + "range": null, + "title": "Default name of pthreads", + "type": "string" + } + ], + "depends_on": null, + "id": "component-config-pthreads", + "title": "PThreads", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "SOC_MMU_PAGE_SIZE_8KB_SUPPORTED", + "help": null, + "id": "MMU_PAGE_SIZE_8KB", + "name": "MMU_PAGE_SIZE_8KB", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "MMU_PAGE_SIZE_16KB", + "name": "MMU_PAGE_SIZE_16KB", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "MMU_PAGE_SIZE_32KB", + "name": "MMU_PAGE_SIZE_32KB", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "MMU_PAGE_SIZE_64KB", + "name": "MMU_PAGE_SIZE_64KB", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "MMU_PAGE_MODE", + "name": "MMU_PAGE_MODE", + "range": null, + "title": null, + "type": "string" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "MMU_PAGE_SIZE", + "name": "MMU_PAGE_SIZE", + "range": null, + "title": null, + "type": "hex" + } + ], + "depends_on": null, + "id": "component-config-soc-settings-mmu-config", + "title": "MMU Config", + "type": "menu" + } + ], + "depends_on": null, + "id": "component-config-soc-settings", + "title": "SoC Settings", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "When this option is selected, the patch will be enabled for XMC.\nFollow the recommended flow by XMC for better stability.\n\nDO NOT DISABLE UNLESS YOU KNOW WHAT YOU ARE DOING.", + "id": "SPI_FLASH_BROWNOUT_RESET_XMC", + "name": "SPI_FLASH_BROWNOUT_RESET_XMC", + "range": null, + "title": "Enable sending reset when brownout for XMC flash chips", + "type": "bool" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "When brownout happens during flash erase/write operations,\nsend reset command to stop the flash operations to improve stability.", + "id": "SPI_FLASH_BROWNOUT_RESET", + "name": "SPI_FLASH_BROWNOUT_RESET", + "range": null, + "title": null, + "type": "bool" + } + ], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "id": "component-config-main-flash-configuration-spi-flash-behavior-when-brownout", + "title": "SPI Flash behavior when brownout", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "This is a helper config for HPM. Invisible for users.", + "id": "SPI_FLASH_UNDER_HIGH_FREQ", + "name": "SPI_FLASH_UNDER_HIGH_FREQ", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "SPI_FLASH_HPM_ENA", + "name": "SPI_FLASH_HPM_ENA", + "range": null, + "title": "Enable", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "SPI_FLASH_HPM_AUTO", + "name": "SPI_FLASH_HPM_AUTO", + "range": null, + "title": "Auto (Not recommended)", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "SPI_FLASH_HPM_DIS", + "name": "SPI_FLASH_HPM_DIS", + "range": null, + "title": "Disabled", + "type": "bool" + } + ], + "depends_on": "IDF_TARGET_ESP32S3 && !ESPTOOLPY_OCT_FLASH && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "Whether the High Performance Mode of Flash is enabled. As an optional feature, user needs to manually\nenable this option as a confirmation. To be back-compatible with earlier IDF version, this option is\nautomatically enabled with warning when Flash running > 80Mhz.", + "id": "component-config-main-flash-configuration-optional-and-experimental-features-read-docs-first--high-performance-mode-read-docs-first-80mhz-", + "name": "SPI_FLASH_HPM", + "title": "High Performance Mode (READ DOCS FIRST, > 80MHz)", + "type": "choice" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "This option is invisible, and will be selected automatically\nwhen ``ESPTOOLPY_FLASHFREQ_120M`` is selected.", + "id": "SPI_FLASH_HPM_ON", + "name": "SPI_FLASH_HPM_ON", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "SPI_FLASH_HPM_DC_AUTO", + "name": "SPI_FLASH_HPM_DC_AUTO", + "range": null, + "title": "Auto (Enable when bootloader support enabled (BOOTLOADER_FLASH_DC_AWARE))", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "SPI_FLASH_HPM_DC_DISABLE", + "name": "SPI_FLASH_HPM_DC_DISABLE", + "range": null, + "title": "Disable (READ DOCS FIRST)", + "type": "bool" + } + ], + "depends_on": "SPI_FLASH_HPM_ON && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "This feature needs your bootloader to be compiled DC-aware (BOOTLOADER_FLASH_DC_AWARE=y). Otherwise the\nchip will not be able to boot after a reset.", + "id": "component-config-main-flash-configuration-optional-and-experimental-features-read-docs-first--support-hpm-using-dc-read-docs-first-", + "name": "SPI_FLASH_HPM_DC", + "title": "Support HPM using DC (READ DOCS FIRST)", + "type": "choice" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "This is a helper config for HPM. Whether HPM-DC is enabled is also determined by bootloader.\nInvisible for users.", + "id": "SPI_FLASH_HPM_DC_ON", + "name": "SPI_FLASH_HPM_DC_ON", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_SPI_MEM_SUPPORT_AUTO_SUSPEND && !SPI_FLASH_ROM_IMPL && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "This option is disabled by default because it is supported only\nfor specific flash chips and for specific Espressif chips.\nTo evaluate if you can use this feature refer to\n`Optional Features for Flash` > `Auto Suspend & Resume` of the `ESP-IDF Programming Guide`.\n\nCAUTION: If you want to OTA to an app with this feature turned on, please make\nsure the bootloader has the support for it. (later than IDF v4.3)\n\nIf you are using an official Espressif module, please contact Espressif Business support\nto check if the module has the flash that support this feature installed.\nAlso refer to `Concurrency Constraints for Flash on SPI1` > `Flash Auto Suspend Feature`\nbefore enabling this option.", + "id": "SPI_FLASH_AUTO_SUSPEND", + "name": "SPI_FLASH_AUTO_SUSPEND", + "range": null, + "title": "Auto suspend long erase/write operations (READ DOCS FIRST)", + "type": "bool" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "This config is used for setting Tsus parameter. Tsus means CS# high to next command after\nsuspend. You can refer to the chapter of AC CHARACTERISTICS of flash datasheet.", + "id": "SPI_FLASH_SUSPEND_TSUS_VAL_US", + "name": "SPI_FLASH_SUSPEND_TSUS_VAL_US", + "range": [ + 20, + 100 + ], + "title": "SPI flash tSUS value (refer to chapter AC CHARACTERISTICS)", + "type": "int" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "XMC-C series is regarded as not qualified for the Suspend feature, since its specification\nhas a tRS >= 1ms restriction. We strongly do not suggest using it for the Suspend feature.\nHowever, if your product in field has enabled this feature, you may still enable this\nconfig option to keep the legacy behavior.\n\nFor new users, DO NOT enable this config.", + "id": "SPI_FLASH_FORCE_ENABLE_XMC_C_SUSPEND", + "name": "SPI_FLASH_FORCE_ENABLE_XMC_C_SUSPEND", + "range": null, + "title": "Enable XMC-C series flash chip suspend feature anyway", + "type": "bool" + }, + { + "children": [], + "depends_on": "SPI_FLASH_AUTO_SUSPEND && FREERTOS_UNICORE && IDF_EXPERIMENTAL_FEATURES && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "Enable this config will disable auto-resume from hardware. Thus the software will resume the chip\nafter any higher priority task/interrupt which suspend the chip. The benefit is that the suspend-resume\nwill not disturb the higher priority task and interrupt.\n\nThis currently is only valid on single core chip.", + "id": "SPI_FLASH_SOFTWARE_RESUME", + "name": "SPI_FLASH_SOFTWARE_RESUME", + "range": null, + "title": "Resume flash program/erase form suspend state by software control", + "type": "bool" + }, + { + "children": [], + "depends_on": "SPI_FLASH_AUTO_SUSPEND && FREERTOS_UNICORE && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "Disable freertos task scheduler when CONFIG_SPI_FLASH_AUTO_SUSPEND is enabled.\nThus only interrupt can trigger a suspend. When SPI_FLASH_AUTO_SUSPEND is enabled,\ndefault behavior is not disable the task scheduler, so both interrupt and high priority\ntask can suspend the erase/program operation. When this option is enabled, task\nscheduler is disabled, only interrupt can suspend erase/program operation.", + "id": "SPI_FLASH_DISABLE_SCHEDULER_IN_SUSPEND", + "name": "SPI_FLASH_DISABLE_SCHEDULER_IN_SUSPEND", + "range": null, + "title": "Disable task scheduler when suspend is enabled when SPI1 operation is ongoing", + "type": "bool" + }, + { + "children": [], + "depends_on": "SPI_FLASH_AUTO_SUSPEND && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "Majority flash supports to use flash register to judge if flash suspend status is\ndone or not. So enable this config, the behavior would use flash register WIP bit to judge\nwhether suspend is valid instead of waiting for a specific long time, which can save a\nlot of time and benefit for performance improvement.", + "id": "SPI_FLASH_AUTO_CHECK_SUSPEND_STATUS", + "name": "SPI_FLASH_AUTO_CHECK_SUSPEND_STATUS", + "range": null, + "title": "Check flash status automatically after flash suspend", + "type": "bool" + } + ], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "id": "component-config-main-flash-configuration-optional-and-experimental-features-read-docs-first-", + "title": "Optional and Experimental Features (READ DOCS FIRST)", + "type": "menu" + } + ], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "id": "component-config-main-flash-configuration", + "title": "Main Flash configuration", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "SPI_FLASH_VERIFY_WRITE && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "If this option is enabled, if SPI flash write verification fails then a log error line\nwill be written with the address, expected & actual values. This can be useful when\ndebugging hardware SPI flash problems.", + "id": "SPI_FLASH_LOG_FAILED_WRITE", + "name": "SPI_FLASH_LOG_FAILED_WRITE", + "range": null, + "title": "Log errors if verification fails", + "type": "bool" + }, + { + "children": [], + "depends_on": "SPI_FLASH_VERIFY_WRITE && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "If this option is enabled, any SPI flash write which tries to set zero bits in the flash to\nones will log a warning. Such writes will not result in the requested data appearing identically\nin flash once written, as SPI NOR flash can only set bits to one when an entire sector is erased.\nAfter erasing, individual bits can only be written from one to zero.\n\nNote that some software (such as SPIFFS) which is aware of SPI NOR flash may write one bits as an\noptimisation, relying on the data in flash becoming a bitwise AND of the new data and any existing data.\nSuch software will log spurious warnings if this option is enabled.", + "id": "SPI_FLASH_WARN_SETTING_ZERO_TO_ONE", + "name": "SPI_FLASH_WARN_SETTING_ZERO_TO_ONE", + "range": null, + "title": "Log warning if writing zero bits to ones", + "type": "bool" + } + ], + "depends_on": "!SPI_FLASH_ROM_IMPL && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "If this option is enabled, any time SPI flash is written then the data will be read\nback and verified. This can catch hardware problems with SPI flash, or flash which\nwas not erased before verification.", + "id": "SPI_FLASH_VERIFY_WRITE", + "name": "SPI_FLASH_VERIFY_WRITE", + "range": null, + "title": "Verify SPI flash writes", + "type": "bool" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "This option enables the following APIs:\n\n- esp_flash_reset_counters\n- esp_flash_dump_counters\n- esp_flash_get_counters\n\nThese APIs may be used to collect performance data for spi_flash APIs\nand to help understand behaviour of libraries which use SPI flash.", + "id": "SPI_FLASH_ENABLE_COUNTERS", + "name": "SPI_FLASH_ENABLE_COUNTERS", + "range": null, + "title": "Enable operation counters", + "type": "bool" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "Enable this flag to use patched versions of SPI flash ROM driver functions.\nThis option should be enabled, if any one of the following is true: (1) need to write\nto flash on ESP32-D2WD; (2) main SPI flash is connected to non-default pins; (3) main\nSPI flash chip is manufactured by ISSI.", + "id": "SPI_FLASH_ROM_DRIVER_PATCH", + "name": "SPI_FLASH_ROM_DRIVER_PATCH", + "range": null, + "title": "Enable SPI flash ROM driver patched functions", + "type": "bool" + }, + { + "children": [], + "depends_on": "ESP_ROM_HAS_SPI_FLASH && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "Enable this flag to use new SPI flash driver functions from ROM instead of ESP-IDF.\n\nIf keeping this as \"n\" in your project, you will have less free IRAM.\nBut you can use all of our flash features.\n\nIf making this as \"y\" in your project, you will increase free IRAM.\nBut you may miss out on some flash features and support for new flash chips.\n\nCurrently the ROM cannot support the following features:\n\n- SPI_FLASH_AUTO_SUSPEND (C3, S3)", + "id": "SPI_FLASH_ROM_IMPL", + "name": "SPI_FLASH_ROM_IMPL", + "range": null, + "title": "Use esp_flash implementation in ROM", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "SPI_FLASH_DANGEROUS_WRITE_ABORTS", + "name": "SPI_FLASH_DANGEROUS_WRITE_ABORTS", + "range": null, + "title": "Aborts", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "SPI_FLASH_DANGEROUS_WRITE_FAILS", + "name": "SPI_FLASH_DANGEROUS_WRITE_FAILS", + "range": null, + "title": "Fails", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "SPI_FLASH_DANGEROUS_WRITE_ALLOWED", + "name": "SPI_FLASH_DANGEROUS_WRITE_ALLOWED", + "range": null, + "title": "Allowed", + "type": "bool" + } + ], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "SPI flash APIs can optionally abort or return a failure code\nif erasing or writing addresses that fall at the beginning\nof flash (covering the bootloader and partition table) or that\noverlap the app partition that contains the running app.\n\nIt is not recommended to ever write to these regions from an IDF app,\nand this check prevents logic errors or corrupted firmware memory from\ndamaging these regions.\n\nNote that this feature *does not* check calls to the esp_rom_xxx SPI flash\nROM functions. These functions should not be called directly from IDF\napplications.", + "id": "component-config-spi-flash-driver-writing-to-dangerous-flash-regions", + "name": "SPI_FLASH_DANGEROUS_WRITE", + "title": "Writing to dangerous flash regions", + "type": "choice" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ESP32 && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "Each SPI bus needs a lock for arbitration among devices. This allows multiple\ndevices on a same bus, but may reduce the speed of esp_flash driver access to the\nmain flash chip.\n\nIf you only need to use esp_flash driver to access the main flash chip, disable\nthis option, and the lock will be bypassed on SPI1 bus. Otherwise if extra devices\nare needed to attach to SPI1 bus, enable this option.", + "id": "SPI_FLASH_SHARE_SPI1_BUS", + "name": "SPI_FLASH_SHARE_SPI1_BUS", + "range": null, + "title": "Support other devices attached to SPI1 bus", + "type": "bool" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "Some flash chips can have very high \"max\" erase times, especially for block erase (32KB or 64KB).\nThis option allows to bypass \"block erase\" and always do sector erase commands.\nThis will be much slower overall in most cases, but improves latency for other code to run.", + "id": "SPI_FLASH_BYPASS_BLOCK_ERASE", + "name": "SPI_FLASH_BYPASS_BLOCK_ERASE", + "range": null, + "title": "Bypass a block erase and always do sector erase", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "SPI_FLASH_YIELD_DURING_ERASE && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "If a duration of one erase command is large\nthen it will yield CPUs after finishing a current command.", + "id": "SPI_FLASH_ERASE_YIELD_DURATION_MS", + "name": "SPI_FLASH_ERASE_YIELD_DURATION_MS", + "range": null, + "title": "Duration of erasing to yield CPUs (ms)", + "type": "int" + }, + { + "children": [], + "depends_on": "SPI_FLASH_YIELD_DURING_ERASE && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "Defines how many ticks will be before returning to continue a erasing.", + "id": "SPI_FLASH_ERASE_YIELD_TICKS", + "name": "SPI_FLASH_ERASE_YIELD_TICKS", + "range": null, + "title": "CPU release time (tick) for an erase operation", + "type": "int" + } + ], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "This allows to yield the CPUs between erase commands.\nPrevents starvation of other tasks.\nPlease use this configuration together with ``SPI_FLASH_ERASE_YIELD_DURATION_MS`` and\n``SPI_FLASH_ERASE_YIELD_TICKS`` after carefully checking flash datasheet to avoid a\nwatchdog timeout.\nFor more information, please check `SPI Flash API` reference documentation\nunder section `OS Function`.", + "id": "SPI_FLASH_YIELD_DURING_ERASE", + "name": "SPI_FLASH_YIELD_DURING_ERASE", + "range": null, + "title": "Enables yield operation during flash erase", + "type": "bool" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "Flash write is broken down in terms of multiple (smaller) write operations.\nThis configuration options helps to set individual write chunk size, smaller\nvalue here ensures that cache (and non-IRAM resident interrupts) remains\ndisabled for shorter duration.", + "id": "SPI_FLASH_WRITE_CHUNK_SIZE", + "name": "SPI_FLASH_WRITE_CHUNK_SIZE", + "range": [ + 256, + 8192 + ], + "title": "Flash write chunk size", + "type": "int" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "SPI Flash driver uses the flash size configured in bootloader header by default.\nEnable this option to override flash size with latest ESPTOOLPY_FLASHSIZE value from\nthe app header if the size in the bootloader header is incorrect.", + "id": "SPI_FLASH_SIZE_OVERRIDE", + "name": "SPI_FLASH_SIZE_OVERRIDE", + "range": null, + "title": "Override flash size in bootloader header by ESPTOOLPY_FLASHSIZE", + "type": "bool" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "This option is helpful if you are using a flash chip whose timeout is quite large or unpredictable.", + "id": "SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED", + "name": "SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED", + "range": null, + "title": "Flash timeout checkout disabled", + "type": "bool" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "This option allows the chip driver list to be customized, instead of using the default list provided by\nESP-IDF.\n\nWhen this option is enabled, the default list is no longer compiled or linked. Instead, the\n`default_registered_chips` structure must be provided by the user.\n\nSee example: custom_chip_driver under examples/storage for more details.", + "id": "SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST", + "name": "SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST", + "range": null, + "title": "Override default chip driver list", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": null, + "id": "SPI_FLASH_VENDOR_XMC_SUPPORTED", + "name": "SPI_FLASH_VENDOR_XMC_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": null, + "id": "SPI_FLASH_VENDOR_GD_SUPPORTED", + "name": "SPI_FLASH_VENDOR_GD_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": null, + "id": "SPI_FLASH_VENDOR_ISSI_SUPPORTED", + "name": "SPI_FLASH_VENDOR_ISSI_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": null, + "id": "SPI_FLASH_VENDOR_MXIC_SUPPORTED", + "name": "SPI_FLASH_VENDOR_MXIC_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": null, + "id": "SPI_FLASH_VENDOR_WINBOND_SUPPORTED", + "name": "SPI_FLASH_VENDOR_WINBOND_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "Enable this to support auto detection of ISSI chips if chip vendor not directly\ngiven by ``chip_drv`` member of the chip struct. This adds support for variant\nchips, however will extend detecting time.", + "id": "SPI_FLASH_SUPPORT_ISSI_CHIP", + "name": "SPI_FLASH_SUPPORT_ISSI_CHIP", + "range": null, + "title": "ISSI", + "type": "bool" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "Enable this to support auto detection of MXIC chips if chip vendor not directly\ngiven by ``chip_drv`` member of the chip struct. This adds support for variant\nchips, however will extend detecting time.", + "id": "SPI_FLASH_SUPPORT_MXIC_CHIP", + "name": "SPI_FLASH_SUPPORT_MXIC_CHIP", + "range": null, + "title": "MXIC", + "type": "bool" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "Enable this to support auto detection of GD (GigaDevice) chips if chip vendor not\ndirectly given by ``chip_drv`` member of the chip struct. If you are using Wrover\nmodules, please don't disable this, otherwise your flash may not work in 4-bit\nmode.\n\nThis adds support for variant chips, however will extend detecting time and image\nsize. Note that the default chip driver supports the GD chips with product ID\n60H.", + "id": "SPI_FLASH_SUPPORT_GD_CHIP", + "name": "SPI_FLASH_SUPPORT_GD_CHIP", + "range": null, + "title": "GigaDevice", + "type": "bool" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "Enable this to support auto detection of Winbond chips if chip vendor not directly\ngiven by ``chip_drv`` member of the chip struct. This adds support for variant\nchips, however will extend detecting time.", + "id": "SPI_FLASH_SUPPORT_WINBOND_CHIP", + "name": "SPI_FLASH_SUPPORT_WINBOND_CHIP", + "range": null, + "title": "Winbond", + "type": "bool" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "Enable this to support auto detection of BOYA chips if chip vendor not directly\ngiven by ``chip_drv`` member of the chip struct. This adds support for variant\nchips, however will extend detecting time.", + "id": "SPI_FLASH_SUPPORT_BOYA_CHIP", + "name": "SPI_FLASH_SUPPORT_BOYA_CHIP", + "range": null, + "title": "BOYA", + "type": "bool" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "Enable this to support auto detection of TH chips if chip vendor not directly\ngiven by ``chip_drv`` member of the chip struct. This adds support for variant\nchips, however will extend detecting time.", + "id": "SPI_FLASH_SUPPORT_TH_CHIP", + "name": "SPI_FLASH_SUPPORT_TH_CHIP", + "range": null, + "title": "TH", + "type": "bool" + }, + { + "children": [], + "depends_on": "IDF_TARGET_ESP32S3 && !APP_BUILD_TYPE_PURE_RAM_APP", + "help": "Enable this to support auto detection of Octal MXIC chips if chip vendor not directly\ngiven by ``chip_drv`` member of the chip struct. This adds support for variant\nchips, however will extend detecting time.", + "id": "SPI_FLASH_SUPPORT_MXIC_OPI_CHIP", + "name": "SPI_FLASH_SUPPORT_MXIC_OPI_CHIP", + "range": null, + "title": "mxic (opi)", + "type": "bool" + } + ], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "id": "component-config-spi-flash-driver-auto-detect-flash-chips", + "title": "Auto-detect flash chips", + "type": "menu" + }, + { + "children": [], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "help": "This option enables flash read/write operations to encrypted partition/s. This option\nis kept enabled irrespective of state of flash encryption feature. However, in case\napplication is not using flash encryption feature and is in need of some additional\nmemory from IRAM region (~1KB) then this config can be disabled.", + "id": "SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE", + "name": "SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE", + "range": null, + "title": "Enable encrypted partition read/write operations", + "type": "bool" + } + ], + "depends_on": "!APP_BUILD_TYPE_PURE_RAM_APP", + "id": "component-config-spi-flash-driver", + "title": "SPI Flash driver", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "Define maximum number of partitions that can be mounted.", + "id": "SPIFFS_MAX_PARTITIONS", + "name": "SPIFFS_MAX_PARTITIONS", + "range": [ + 1, + 10 + ], + "title": "Maximum Number of Partitions", + "type": "int" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "SPIFFS_CACHE", + "help": "Enables memory write caching for file descriptors in hydrogen.", + "id": "SPIFFS_CACHE_WR", + "name": "SPIFFS_CACHE_WR", + "range": null, + "title": "Enable SPIFFS Write Caching", + "type": "bool" + }, + { + "children": [], + "depends_on": "SPIFFS_CACHE", + "help": "Enable/disable statistics on caching. Debug/test purpose only.", + "id": "SPIFFS_CACHE_STATS", + "name": "SPIFFS_CACHE_STATS", + "range": null, + "title": "Enable SPIFFS Cache Statistics", + "type": "bool" + } + ], + "depends_on": null, + "help": "Enables/disable memory read caching of nucleus file system\noperations.", + "id": "SPIFFS_CACHE", + "name": "SPIFFS_CACHE", + "range": null, + "title": "Enable SPIFFS Cache", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-spiffs-configuration-spiffs-cache-configuration", + "title": "SPIFFS Cache Configuration", + "type": "menu" + }, + { + "children": [], + "depends_on": null, + "help": "Always check header of each accessed page to ensure consistent state.\nIf enabled it will increase number of reads from flash, especially\nif cache is disabled.", + "id": "SPIFFS_PAGE_CHECK", + "name": "SPIFFS_PAGE_CHECK", + "range": null, + "title": "Enable SPIFFS Page Check", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Define maximum number of GC runs to perform to reach desired free pages.", + "id": "SPIFFS_GC_MAX_RUNS", + "name": "SPIFFS_GC_MAX_RUNS", + "range": [ + 1, + 10000 + ], + "title": "Set Maximum GC Runs", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Enable/disable statistics on gc. Debug/test purpose only.", + "id": "SPIFFS_GC_STATS", + "name": "SPIFFS_GC_STATS", + "range": null, + "title": "Enable SPIFFS GC Statistics", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Logical page size of SPIFFS partition, in bytes. Must be multiple\nof flash page size (which is usually 256 bytes).\nLarger page sizes reduce overhead when storing large files, and\nimprove filesystem performance when reading large files.\nSmaller page sizes reduce overhead when storing small (< page size)\nfiles.", + "id": "SPIFFS_PAGE_SIZE", + "name": "SPIFFS_PAGE_SIZE", + "range": [ + 256, + 1024 + ], + "title": "SPIFFS logical page size", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Object name maximum length. Note that this length include the\nzero-termination character, meaning maximum string of characters\ncan at most be SPIFFS_OBJ_NAME_LEN - 1.\n\nSPIFFS_OBJ_NAME_LEN + SPIFFS_META_LENGTH should not exceed\nSPIFFS_PAGE_SIZE - 64.", + "id": "SPIFFS_OBJ_NAME_LEN", + "name": "SPIFFS_OBJ_NAME_LEN", + "range": [ + 1, + 256 + ], + "title": "Set SPIFFS Maximum Name Length", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "If this option is enabled, symbolic links are taken into account\nduring partition image creation.", + "id": "SPIFFS_FOLLOW_SYMLINKS", + "name": "SPIFFS_FOLLOW_SYMLINKS", + "range": null, + "title": "Enable symbolic links for image creation", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "SPIFFS_USE_MAGIC", + "help": "If this option is enabled, the magic will also be dependent\non the length of the filesystem. For example, a filesystem\nconfigured and formatted for 4 megabytes will not be accepted\nfor mounting with a configuration defining the filesystem as 2 megabytes.", + "id": "SPIFFS_USE_MAGIC_LENGTH", + "name": "SPIFFS_USE_MAGIC_LENGTH", + "range": null, + "title": "Enable SPIFFS Filesystem Length Magic", + "type": "bool" + } + ], + "depends_on": null, + "help": "Enable this to have an identifiable spiffs filesystem.\nThis will look for a magic in all sectors to determine if this\nis a valid spiffs system or not at mount time.", + "id": "SPIFFS_USE_MAGIC", + "name": "SPIFFS_USE_MAGIC", + "range": null, + "title": "Enable SPIFFS Filesystem Magic", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "This option sets the number of extra bytes stored in the file header.\nThese bytes can be used in an application-specific manner.\nSet this to at least 4 bytes to enable support for saving file\nmodification time.\n\nSPIFFS_OBJ_NAME_LEN + SPIFFS_META_LENGTH should not exceed\nSPIFFS_PAGE_SIZE - 64.", + "id": "SPIFFS_META_LENGTH", + "name": "SPIFFS_META_LENGTH", + "range": null, + "title": "Size of per-file metadata field", + "type": "int" + }, + { + "children": [], + "depends_on": "SPIFFS_META_LENGTH >= 4", + "help": "If enabled, then the first 4 bytes of per-file metadata will be used\nto store file modification time (mtime), accessible through\nstat/fstat functions.\nModification time is updated when the file is opened.", + "id": "SPIFFS_USE_MTIME", + "name": "SPIFFS_USE_MTIME", + "range": null, + "title": "Save file modification time", + "type": "bool" + }, + { + "children": [], + "depends_on": "SPIFFS_META_LENGTH >= 8", + "help": "If this option is not set, the time field is 32 bits (up to 2106 year),\notherwise it is 64 bits and make sure it matches SPIFFS_META_LENGTH.\nIf the chip already has the spiffs image with the time field = 32 bits\nthen this option cannot be applied in this case.\nErase it first before using this option.\nTo resolve the Y2K38 problem for the spiffs, use a toolchain with\n64-bit time_t support.", + "id": "SPIFFS_MTIME_WIDE_64_BITS", + "name": "SPIFFS_MTIME_WIDE_64_BITS", + "range": null, + "title": "The time field occupies 64 bits in the image instead of 32 bits", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "Enabling this option will print general debug messages to the console.", + "id": "SPIFFS_DBG", + "name": "SPIFFS_DBG", + "range": null, + "title": "Enable general SPIFFS debug", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enabling this option will print API debug messages to the console.", + "id": "SPIFFS_API_DBG", + "name": "SPIFFS_API_DBG", + "range": null, + "title": "Enable SPIFFS API debug", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enabling this option will print GC debug messages to the console.", + "id": "SPIFFS_GC_DBG", + "name": "SPIFFS_GC_DBG", + "range": null, + "title": "Enable SPIFFS Garbage Cleaner debug", + "type": "bool" + }, + { + "children": [], + "depends_on": "SPIFFS_CACHE", + "help": "Enabling this option will print cache debug messages to the console.", + "id": "SPIFFS_CACHE_DBG", + "name": "SPIFFS_CACHE_DBG", + "range": null, + "title": "Enable SPIFFS Cache debug", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enabling this option will print Filesystem Check debug messages\nto the console.", + "id": "SPIFFS_CHECK_DBG", + "name": "SPIFFS_CHECK_DBG", + "range": null, + "title": "Enable SPIFFS Filesystem Check debug", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enable this option to enable SPIFFS_vis function in the API.", + "id": "SPIFFS_TEST_VISUALISATION", + "name": "SPIFFS_TEST_VISUALISATION", + "range": null, + "title": "Enable SPIFFS Filesystem Visualization", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-spiffs-configuration-debug-configuration", + "title": "Debug Configuration", + "type": "menu" + } + ], + "depends_on": null, + "id": "component-config-spiffs-configuration", + "title": "SPIFFS Configuration", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "WS_TRANSPORT", + "help": "Size of the buffer used for constructing the HTTP Upgrade request during connect", + "id": "WS_BUFFER_SIZE", + "name": "WS_BUFFER_SIZE", + "range": null, + "title": "Websocket transport buffer size", + "type": "int" + }, + { + "children": [], + "depends_on": "WS_TRANSPORT", + "help": "If enable this option, websocket transport buffer will be freed after connection\nsucceed to save more heap.", + "id": "WS_DYNAMIC_BUFFER", + "name": "WS_DYNAMIC_BUFFER", + "range": null, + "title": "Using dynamic websocket transport buffer", + "type": "bool" + } + ], + "depends_on": null, + "help": "Enable support for creating websocket transport.", + "id": "WS_TRANSPORT", + "name": "WS_TRANSPORT", + "range": null, + "title": "Enable Websocket Transport", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-tcp-transport-websocket", + "title": "Websocket", + "type": "menu" + } + ], + "depends_on": null, + "id": "component-config-tcp-transport", + "title": "TCP Transport", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "SOC_ULP_FSM_SUPPORTED && ", + "help": null, + "id": "ULP_COPROC_TYPE_FSM", + "name": "ULP_COPROC_TYPE_FSM", + "range": null, + "title": "ULP FSM (Finite State Machine)", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_RISCV_COPROC_SUPPORTED && ", + "help": null, + "id": "ULP_COPROC_TYPE_RISCV", + "name": "ULP_COPROC_TYPE_RISCV", + "range": null, + "title": "ULP RISC-V", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_LP_CORE_SUPPORTED && ", + "help": null, + "id": "ULP_COPROC_TYPE_LP_CORE", + "name": "ULP_COPROC_TYPE_LP_CORE", + "range": null, + "title": "LP core RISC-V", + "type": "bool" + } + ], + "depends_on": "ULP_COPROC_ENABLED && (SOC_ULP_SUPPORTED || SOC_RISCV_COPROC_SUPPORTED || SOC_LP_CORE_SUPPORTED)", + "help": "Choose the ULP Coprocessor type: ULP FSM (Finite State Machine) or ULP RISC-V.", + "id": "component-config-ultra-low-power-ulp-co-processor-enable-ultra-low-power-ulp-co-processor-ulp-co-processor-type", + "name": "ULP_COPROC_TYPE", + "title": "ULP Co-processor type", + "type": "choice" + }, + { + "children": [], + "depends_on": "ULP_COPROC_ENABLED && (SOC_ULP_SUPPORTED || SOC_RISCV_COPROC_SUPPORTED || SOC_LP_CORE_SUPPORTED)", + "help": "Bytes of memory to reserve for ULP Co-processor firmware & data.\nData is reserved at the beginning of RTC slow memory.", + "id": "ULP_COPROC_RESERVE_MEM", + "name": "ULP_COPROC_RESERVE_MEM", + "range": null, + "title": "RTC slow memory reserved for coprocessor", + "type": "int" + } + ], + "depends_on": "SOC_ULP_SUPPORTED || SOC_RISCV_COPROC_SUPPORTED || SOC_LP_CORE_SUPPORTED", + "help": "Enable this feature if you plan to use the ULP Co-processor.\nOnce this option is enabled, further ULP co-processor configuration will appear in the menu.", + "id": "ULP_COPROC_ENABLED", + "name": "ULP_COPROC_ENABLED", + "range": null, + "title": "Enable Ultra Low Power (ULP) Co-processor", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "ULP_COPROC_TYPE_RISCV && (SOC_ULP_SUPPORTED || SOC_RISCV_COPROC_SUPPORTED || SOC_LP_CORE_SUPPORTED)", + "help": "Turn on this setting to enabled interrupts on the ULP RISC-V core.", + "id": "ULP_RISCV_INTERRUPT_ENABLE", + "name": "ULP_RISCV_INTERRUPT_ENABLE", + "range": null, + "title": "Enable ULP RISC-V interrupts", + "type": "bool" + }, + { + "children": [], + "depends_on": "ULP_COPROC_TYPE_RISCV && (SOC_ULP_SUPPORTED || SOC_RISCV_COPROC_SUPPORTED || SOC_LP_CORE_SUPPORTED)", + "help": "The accuracy of the bitbanged UART driver is limited, it is not\nrecommend to increase the value above 19200.", + "id": "ULP_RISCV_UART_BAUDRATE", + "name": "ULP_RISCV_UART_BAUDRATE", + "range": null, + "title": "Baudrate used by the bitbanged ULP RISC-V UART driver", + "type": "int" + }, + { + "children": [], + "depends_on": "ULP_COPROC_TYPE_RISCV && (SOC_ULP_SUPPORTED || SOC_RISCV_COPROC_SUPPORTED || SOC_LP_CORE_SUPPORTED)", + "help": "Set the ULP RISC-V I2C read/write timeout. Set this value to -1\nif the ULP RISC-V I2C read and write APIs should wait forever.\nPlease note that the tick rate of the ULP co-processor would be\ndifferent than the OS tick rate of the main core and therefore\ncan have different timeout value depending on which core the API\nis invoked on.", + "id": "ULP_RISCV_I2C_RW_TIMEOUT", + "name": "ULP_RISCV_I2C_RW_TIMEOUT", + "range": null, + "title": "Set timeout for ULP RISC-V I2C transaction timeout in ticks.", + "type": "int" + } + ], + "depends_on": "ULP_COPROC_TYPE_RISCV && (SOC_ULP_SUPPORTED || SOC_RISCV_COPROC_SUPPORTED || SOC_LP_CORE_SUPPORTED)", + "id": "component-config-ultra-low-power-ulp-co-processor-ulp-risc-v-settings", + "title": "ULP RISC-V Settings", + "type": "menu" + }, + { + "children": [], + "depends_on": "ULP_COPROC_TYPE_LP_CORE && (SOC_ULP_SUPPORTED || SOC_RISCV_COPROC_SUPPORTED || SOC_LP_CORE_SUPPORTED)", + "help": "Size of the shared memory defined in ulp_lp_core_memory_shared.c.\nSize should be kept in-sync with the size of the struct defined there.", + "id": "ULP_SHARED_MEM", + "name": "ULP_SHARED_MEM", + "range": null, + "title": null, + "type": "hex" + }, + { + "children": [], + "depends_on": "ULP_COPROC_TYPE_LP_CORE && ESP_ROM_HAS_LP_ROM && (SOC_ULP_SUPPORTED || SOC_RISCV_COPROC_SUPPORTED || SOC_LP_CORE_SUPPORTED)", + "help": "Set this option to enable printf functionality from LP ROM. This option\ncan help reduce the LP core binary size by not linking printf functionality\nfrom RAM code.\nNote: For LP ROM prints to work properly, make sure that the LP core boots\nfrom the LP ROM.", + "id": "ULP_ROM_PRINT_ENABLE", + "name": "ULP_ROM_PRINT_ENABLE", + "range": null, + "title": "Enable print utilities from LP ROM", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "ULP_COPROC_TYPE_LP_CORE && SOC_ULP_LP_UART_SUPPORTED && (SOC_ULP_SUPPORTED || SOC_RISCV_COPROC_SUPPORTED || SOC_LP_CORE_SUPPORTED)", + "help": "Set this option to enable panic handler functionality. If this option is\nenabled then the LP Core will output a panic dump over LP UART,\nsimilar to what the main core does. Output depends on LP UART already being\ninitialized and configured.\nDisabling this option will reduce the LP core binary size by not\nlinking in panic handler functionality.", + "id": "ULP_PANIC_OUTPUT_ENABLE", + "name": "ULP_PANIC_OUTPUT_ENABLE", + "range": null, + "title": "Enable panic handler which outputs over LP UART", + "type": "bool" + }, + { + "children": [], + "depends_on": "ULP_COPROC_TYPE_LP_CORE && (SOC_ULP_SUPPORTED || SOC_RISCV_COPROC_SUPPORTED || SOC_LP_CORE_SUPPORTED)", + "help": "Set this option to route lp_core_printf to the console HP-UART.\nThis allows you to easily view print outputs from the LP core, without\nhaving to connect to the LP-UART. This option comes with the following\nlimitations:\n\n1. There is no mutual exclusion between the HP-Core and the LP-Core accessing\nthe HP-UART, which means that if both cores are logging heavily the output\nstrings might get mangled together.\n2. The HP-UART can only work while the HP-Core is running, which means that\nif the HP-Core is in deep sleep, the LP-Core will not be able to print to the\nconsole HP-UART.\n\nDue to these limitations it is only recommended to use this option for easy debugging.\nFor more serious use-cases you should use the LP-UART.", + "id": "ULP_HP_UART_CONSOLE_PRINT", + "name": "ULP_HP_UART_CONSOLE_PRINT", + "range": null, + "title": "Route lp_core_printf to the console HP-UART", + "type": "bool" + }, + { + "children": [], + "depends_on": "ULP_COPROC_TYPE_LP_CORE && (SOC_ULP_SUPPORTED || SOC_RISCV_COPROC_SUPPORTED || SOC_LP_CORE_SUPPORTED)", + "help": "Enable this feature to avoid resetting LP core in sleep mode when debugger is attached,\notherwise configured HW breakpoints and dcsr.ebreak* bits will be missed.\nThis is a workaround until it will be fixed in HW.", + "id": "ULP_NORESET_UNDER_DEBUG", + "name": "ULP_NORESET_UNDER_DEBUG", + "range": null, + "title": "Avoid resetting LP core when debugger is attached", + "type": "bool" + } + ], + "depends_on": "SOC_ULP_SUPPORTED || SOC_RISCV_COPROC_SUPPORTED || SOC_LP_CORE_SUPPORTED", + "id": "component-config-ultra-low-power-ulp-co-processor-ulp-debugging-options", + "title": "ULP Debugging Options", + "type": "menu" + } + ], + "depends_on": "SOC_ULP_SUPPORTED || SOC_RISCV_COPROC_SUPPORTED || SOC_LP_CORE_SUPPORTED", + "id": "component-config-ultra-low-power-ulp-co-processor", + "title": "Ultra Low Power (ULP) Co-processor", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "If not set, assertions on float arguments will not be available.", + "id": "UNITY_ENABLE_FLOAT", + "name": "UNITY_ENABLE_FLOAT", + "range": null, + "title": "Support for float type", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "If not set, assertions on double arguments will not be available.", + "id": "UNITY_ENABLE_DOUBLE", + "name": "UNITY_ENABLE_DOUBLE", + "range": null, + "title": "Support for double type", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "If not set, assertions on 64-bit integer types will always fail.\nIf this feature is enabled, take care not to pass pointers (which are 32 bit)\nto UNITY_ASSERT_EQUAL, as that will cause pointer-to-int-cast warnings.", + "id": "UNITY_ENABLE_64BIT", + "name": "UNITY_ENABLE_64BIT", + "range": null, + "title": "Support for 64-bit integer types", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "If set, Unity will colorize test results using console escape sequences.", + "id": "UNITY_ENABLE_COLOR", + "name": "UNITY_ENABLE_COLOR", + "range": null, + "title": "Colorize test output", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "If set, then the following features will be available:\n\n- TEST_CASE macro which performs automatic registration of test functions\n- Functions to run registered test functions: unity_run_all_tests,\n unity_run_tests_with_filter, unity_run_single_test_by_name.\n- Interactive menu which lists test cases and allows choosing the tests to\n be run, available via unity_run_menu function.\n\nDisable if a different test registration mechanism is used.", + "id": "UNITY_ENABLE_IDF_TEST_RUNNER", + "name": "UNITY_ENABLE_IDF_TEST_RUNNER", + "range": null, + "title": "Include ESP-IDF test registration/running helpers", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "If set, unity_fixture.h header file and associated source files are part of\nthe build. These provide an optional set of macros and functions to\nimplement test groups.", + "id": "UNITY_ENABLE_FIXTURE", + "name": "UNITY_ENABLE_FIXTURE", + "range": null, + "title": "Include Unity test fixture", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "If set, the unity framework will print the backtrace information before\njumping back to the test menu. The jumping is usually occurs in assert\nfunctions such as TEST_ASSERT, TEST_FAIL etc.", + "id": "UNITY_ENABLE_BACKTRACE_ON_FAIL", + "name": "UNITY_ENABLE_BACKTRACE_ON_FAIL", + "range": null, + "title": "Print a backtrace when a unit test fails", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-unity-unit-testing-library", + "title": "Unity unit testing library", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "SOC_USB_OTG_SUPPORTED", + "help": "Each USB device attached is allocated a dedicated buffer for its OUT/IN transfers to/from the device's\ncontrol endpoint. The maximum size of that buffer is determined by this option. The limited size of the\ntransfer buffer have the following implications:\n- The maximum length of control transfers is limited\n- Device's with configuration descriptors larger than this limit cannot be supported", + "id": "USB_HOST_CONTROL_TRANSFER_MAX_SIZE", + "name": "USB_HOST_CONTROL_TRANSFER_MAX_SIZE", + "range": null, + "title": "Largest size (in bytes) of transfers to/from default endpoints", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "USB_HOST_HW_BUFFER_BIAS_BALANCED", + "name": "USB_HOST_HW_BUFFER_BIAS_BALANCED", + "range": null, + "title": "Balanced", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "USB_HOST_HW_BUFFER_BIAS_IN", + "name": "USB_HOST_HW_BUFFER_BIAS_IN", + "range": null, + "title": "Bias IN", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "USB_HOST_HW_BUFFER_BIAS_PERIODIC_OUT", + "name": "USB_HOST_HW_BUFFER_BIAS_PERIODIC_OUT", + "range": null, + "title": "Periodic OUT", + "type": "bool" + } + ], + "depends_on": "SOC_USB_OTG_SUPPORTED", + "help": "The underlying hardware has size adjustable FIFOs to cache USB packets on reception (IN) or for\ntransmission (OUT). The size of these FIFOs will affect the largest MPS (maximum packet size) and the\nmaximum number of packets that can be cached at any one time. The hardware contains the following\nFIFOS: RX (for all IN packets), Non-periodic TX (for Bulk and Control OUT packets), and Periodic TX\n(for Interrupt and Isochronous OUT packets). This configuration option allows biasing the FIFO sizes\ntowards a particular use case, which may be necessary for devices that have endpoints with large MPS.\nThe MPS limits for each biasing are listed below:\n\nBalanced:\n- IN (all transfer types), 408 bytes\n- OUT non-periodic (Bulk/Control), 192 bytes (i.e., 3 x 64 byte packets)\n- OUT periodic (Interrupt/Isochronous), 192 bytes\n\nBias IN:\n- IN (all transfer types), 600 bytes\n- OUT non-periodic (Bulk/Control), 64 bytes (i.e., 1 x 64 byte packets)\n- OUT periodic (Interrupt/Isochronous), 128 bytes\n\nBias Periodic OUT:\n- IN (all transfer types), 128 bytes\n- OUT non-periodic (Bulk/Control), 64 bytes (i.e., 1 x 64 byte packets)\n- OUT periodic (Interrupt/Isochronous), 600 bytes", + "id": "component-config-usb-otg-hardware-fifo-size-biasing", + "name": "USB_HOST_HW_BUFFER_BIAS", + "title": "Hardware FIFO size biasing", + "type": "choice" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "SOC_USB_OTG_SUPPORTED", + "help": "On connection of a USB device, the USB 2.0 specification requires\na \"debounce interval with a minimum duration of 100ms\" to allow the connection to stabilize\n(see USB 2.0 chapter 7.1.7.3 for more details).\nDuring the debounce interval, no new connection/disconnection events are registered.\n\nThe default value is set to 250 ms to be safe.", + "id": "USB_HOST_DEBOUNCE_DELAY_MS", + "name": "USB_HOST_DEBOUNCE_DELAY_MS", + "range": null, + "title": "Debounce delay in ms", + "type": "int" + }, + { + "children": [], + "depends_on": "SOC_USB_OTG_SUPPORTED", + "help": "The reset signaling can be generated on any Hub or Host Controller port by request from\nthe USB System Software. The USB 2.0 specification requires that \"the reset signaling must\nbe driven for a minimum of 10ms\" (see USB 2.0 chapter 7.1.7.5 for more details).\nAfter the reset, the hub port will transition to the Enabled state (refer to Section 11.5).\n\nThe default value is set to 30 ms to be safe.", + "id": "USB_HOST_RESET_HOLD_MS", + "name": "USB_HOST_RESET_HOLD_MS", + "range": null, + "title": "Reset hold in ms", + "type": "int" + }, + { + "children": [], + "depends_on": "SOC_USB_OTG_SUPPORTED", + "help": "After a port stops driving the reset signal, the USB 2.0 specification requires that\nthe \"USB System Software guarantees a minimum of 10 ms for reset recovery\" before the\nattached device is expected to respond to data transfers (see USB 2.0 chapter 7.1.7.3 for\nmore details).\nThe device may ignore any data transfers during the recovery interval.\n\nThe default value is set to 30 ms to be safe.", + "id": "USB_HOST_RESET_RECOVERY_MS", + "name": "USB_HOST_RESET_RECOVERY_MS", + "range": null, + "title": "Reset recovery delay in ms", + "type": "int" + }, + { + "children": [], + "depends_on": "SOC_USB_OTG_SUPPORTED", + "help": "\"After successful completion of the Status stage, the device is allowed a SetAddress()\nrecovery interval of 2 ms. At the end of this interval, the device must be able to accept\nSetup packets addressed to the new address. Also, at the end of the recovery interval, the\ndevice must not respond to tokens sent to the old address (unless, of course, the old and new\naddress is the same).\" See USB 2.0 chapter 9.2.6.3 for more details.\n\nThe default value is set to 10 ms to be safe.", + "id": "USB_HOST_SET_ADDR_RECOVERY_MS", + "name": "USB_HOST_SET_ADDR_RECOVERY_MS", + "range": null, + "title": "SetAddress() recovery time in ms", + "type": "int" + } + ], + "depends_on": "SOC_USB_OTG_SUPPORTED", + "id": "component-config-usb-otg-hub-driver-configuration-root-port-configuration", + "title": "Root Port configuration", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": "USB_HOST_HUBS_SUPPORTED && SOC_USB_OTG_SUPPORTED", + "help": "Enables support for connecting multiple Hubs simultaneously.", + "id": "USB_HOST_HUB_MULTI_LEVEL", + "name": "USB_HOST_HUB_MULTI_LEVEL", + "range": null, + "title": "Support multiple Hubs", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "IDF_EXPERIMENTAL_FEATURES && USB_HOST_HUBS_SUPPORTED && SOC_USB_OTG_SUPPORTED", + "help": "Enables support of Low-speed devices, connected through the external Hub.", + "id": "USB_HOST_EXT_PORT_SUPPORT_LS", + "name": "USB_HOST_EXT_PORT_SUPPORT_LS", + "range": null, + "title": "Support LS", + "type": "bool" + }, + { + "children": [], + "depends_on": "IDF_EXPERIMENTAL_FEATURES && USB_HOST_HUBS_SUPPORTED && SOC_USB_OTG_SUPPORTED", + "help": "Amount of attempts to reset the device.\n\nThe default value is 1.", + "id": "USB_HOST_EXT_PORT_RESET_ATTEMPTS", + "name": "USB_HOST_EXT_PORT_RESET_ATTEMPTS", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [], + "depends_on": "USB_HOST_HUBS_SUPPORTED && SOC_USB_OTG_SUPPORTED", + "help": "After a port stops driving the reset signal, the USB 2.0 specification requires that\nthe \"USB System Software guarantees a minimum of 10 ms for reset recovery\" before the\nattached device is expected to respond to data transfers (see USB 2.0 chapter 7.1.7.3 for\nmore details).\nThe device may ignore any data transfers during the recovery interval.\n\nThe default value is set to 30 ms to be safe.", + "id": "USB_HOST_EXT_PORT_RESET_RECOVERY_DELAY_MS", + "name": "USB_HOST_EXT_PORT_RESET_RECOVERY_DELAY_MS", + "range": null, + "title": "Reset recovery delay in ms", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "USB_HOST_EXT_PORT_CUSTOM_POWER_ON_DELAY_ENABLE && USB_HOST_HUBS_SUPPORTED && SOC_USB_OTG_SUPPORTED", + "help": "Custom value of delay from the time the power-on sequence begins on a port\nuntil power is good on that port.\nValue 0 is used for a hub with no power switches.\n\nThe default value is 100 ms.", + "id": "USB_HOST_EXT_PORT_CUSTOM_POWER_ON_DELAY_MS", + "name": "USB_HOST_EXT_PORT_CUSTOM_POWER_ON_DELAY_MS", + "range": null, + "title": "PwrOn2PwrGood delay in ms", + "type": "int" + } + ], + "depends_on": "USB_HOST_HUBS_SUPPORTED && SOC_USB_OTG_SUPPORTED", + "help": "Enables the possibility to configure custom time for the power-on sequence on a port\nuntil power is good on that port.\n\nWhen enabled, applies the custom PwrOn2PwrGood delay.\nWhen disabled, applies the PwrOn2PwrGood value from the Hub Descriptor.", + "id": "USB_HOST_EXT_PORT_CUSTOM_POWER_ON_DELAY_ENABLE", + "name": "USB_HOST_EXT_PORT_CUSTOM_POWER_ON_DELAY_ENABLE", + "range": null, + "title": "Custom bPwrOn2PwrGood value", + "type": "bool" + } + ], + "depends_on": "USB_HOST_HUBS_SUPPORTED && SOC_USB_OTG_SUPPORTED", + "id": "component-config-usb-otg-hub-driver-configuration-support-hubs-downstream-port-configuration", + "title": "Downstream Port configuration", + "type": "menu" + } + ], + "depends_on": "SOC_USB_OTG_SUPPORTED", + "help": "Enables support of external Hubs.", + "id": "USB_HOST_HUBS_SUPPORTED", + "name": "USB_HOST_HUBS_SUPPORTED", + "range": null, + "title": "Support Hubs", + "type": "bool" + } + ], + "depends_on": "SOC_USB_OTG_SUPPORTED", + "id": "component-config-usb-otg-hub-driver-configuration", + "title": "Hub Driver Configuration", + "type": "menu" + }, + { + "children": [], + "depends_on": "SOC_USB_OTG_SUPPORTED", + "help": "The enumeration filter callback is called before enumeration of each newly attached device.\nThis callback allows users to control whether a device should be enumerated, and what configuration\nnumber to use when enumerating a device.\n\nIf enabled, the enumeration filter callback can be set via 'usb_host_config_t' when calling\n'usb_host_install()'.", + "id": "USB_HOST_ENABLE_ENUM_FILTER_CALLBACK", + "name": "USB_HOST_ENABLE_ENUM_FILTER_CALLBACK", + "range": null, + "title": "Enable enumeration filter callback", + "type": "bool" + }, + { + "children": [], + "depends_on": "SOC_USB_OTG_SUPPORTED", + "help": null, + "id": "USB_OTG_SUPPORTED", + "name": "USB_OTG_SUPPORTED", + "range": null, + "title": null, + "type": "bool" + } + ], + "depends_on": "SOC_USB_OTG_SUPPORTED", + "id": "component-config-usb-otg", + "title": "USB-OTG", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "VFS_SUPPORT_IO", + "help": "If enabled, the following functions are provided by the VFS component.\n\nstat, link, unlink, rename, utime, access, truncate, rmdir, mkdir,\nopendir, closedir, readdir, readdir_r, seekdir, telldir, rewinddir\n\nFilesystem drivers can then be registered to handle these functions\nfor specific paths.\n\nDisabling this option can save memory when the support for these functions\nis not required.", + "id": "VFS_SUPPORT_DIR", + "name": "VFS_SUPPORT_DIR", + "range": null, + "title": "Provide directory related functions", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "VFS_SUPPORT_SELECT", + "help": "Select() related functions might produce an inconveniently lot of\ndebug outputs when one sets the default log level to DEBUG or higher.\nIt is possible to suppress these debug outputs by enabling this\noption.", + "id": "VFS_SUPPRESS_SELECT_DEBUG_OUTPUT", + "name": "VFS_SUPPRESS_SELECT_DEBUG_OUTPUT", + "range": null, + "title": "Suppress select() related debug outputs", + "type": "bool" + }, + { + "children": [], + "depends_on": "VFS_SUPPORT_SELECT", + "help": "If enabled, VFS driver select() callback function will be placed in IRAM.", + "id": "VFS_SELECT_IN_RAM", + "name": "VFS_SELECT_IN_RAM", + "range": null, + "title": "Make VFS driver select() callbacks IRAM-safe", + "type": "bool" + } + ], + "depends_on": "VFS_SUPPORT_IO && !LWIP_USE_ONLY_LWIP_SELECT", + "help": "If enabled, select function is provided by the VFS component, and can be used\non peripheral file descriptors (such as UART) and sockets at the same time.\n\nIf disabled, the default select implementation will be provided by LWIP for\nsockets only.\n\nDisabling this option can reduce code size if support for \"select\" on UART file\ndescriptors is not required.", + "id": "VFS_SUPPORT_SELECT", + "name": "VFS_SUPPORT_SELECT", + "range": null, + "title": "Provide select function", + "type": "bool" + }, + { + "children": [], + "depends_on": "VFS_SUPPORT_IO", + "help": "Disabling this option can save memory when the support for termios.h is not required.", + "id": "VFS_SUPPORT_TERMIOS", + "name": "VFS_SUPPORT_TERMIOS", + "range": null, + "title": "Provide termios.h functions", + "type": "bool" + }, + { + "children": [], + "depends_on": "VFS_SUPPORT_IO", + "help": "Define maximum number of virtual filesystems that can be registered.", + "id": "VFS_MAX_COUNT", + "name": "VFS_MAX_COUNT", + "range": [ + 1, + 20 + ], + "title": "Maximum Number of Virtual Filesystems", + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "VFS_SUPPORT_IO", + "help": "Define maximum number of host filesystem mount points.", + "id": "VFS_SEMIHOSTFS_MAX_MOUNT_POINTS", + "name": "VFS_SEMIHOSTFS_MAX_MOUNT_POINTS", + "range": null, + "title": "Host FS: Maximum number of the host filesystem mount points", + "type": "int" + } + ], + "depends_on": "VFS_SUPPORT_IO", + "id": "component-config-virtual-file-system-provide-basic-i-o-functions-host-file-system-i-o-semihosting-", + "title": "Host File System I/O (Semihosting)", + "type": "menu" + }, + { + "children": [], + "depends_on": "VFS_SUPPORT_IO", + "help": "If enabled, /dev/null VFS will be automatically initialized at startup.", + "id": "VFS_INITIALIZE_DEV_NULL", + "name": "VFS_INITIALIZE_DEV_NULL", + "range": null, + "title": "Initialize /dev/null VFS", + "type": "bool" + } + ], + "depends_on": null, + "help": "If enabled, the following functions are provided by the VFS component.\n\nopen, close, read, write, pread, pwrite, lseek, fstat, fsync, ioctl, fcntl\n\nFilesystem drivers can then be registered to handle these functions\nfor specific paths.\n\nDisabling this option can save memory when the support for these functions\nis not required.\n\nNote that the following functions can still be used with socket file descriptors\nwhen this option is disabled:\n\nclose, read, write, ioctl, fcntl.", + "id": "VFS_SUPPORT_IO", + "name": "VFS_SUPPORT_IO", + "range": null, + "title": "Provide basic I/O functions", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-virtual-file-system", + "title": "Virtual file system", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "WL_SECTOR_SIZE_512", + "name": "WL_SECTOR_SIZE_512", + "range": null, + "title": "512", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "WL_SECTOR_SIZE_4096", + "name": "WL_SECTOR_SIZE_4096", + "range": null, + "title": "4096", + "type": "bool" + } + ], + "depends_on": null, + "help": "Sector size used by wear levelling library.\nYou can set default sector size or size that will\nfit to the flash device sector size.\n\nWith sector size set to 4096 bytes, wear levelling library is more\nefficient. However if FAT filesystem is used on top of wear levelling\nlibrary, it will need more temporary storage: 4096 bytes for each\nmounted filesystem and 4096 bytes for each opened file.\n\nWith sector size set to 512 bytes, wear levelling library will perform\nmore operations with flash memory, but less RAM will be used by FAT\nfilesystem library (512 bytes for the filesystem and 512 bytes for each\nfile opened).", + "id": "component-config-wear-levelling-wear-levelling-library-sector-size", + "name": "WL_SECTOR_SIZE", + "title": "Wear Levelling library sector size", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "WL_SECTOR_SIZE", + "name": "WL_SECTOR_SIZE", + "range": null, + "title": null, + "type": "int" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "WL_SECTOR_MODE_PERF", + "name": "WL_SECTOR_MODE_PERF", + "range": null, + "title": "Performance", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "WL_SECTOR_MODE_SAFE", + "name": "WL_SECTOR_MODE_SAFE", + "range": null, + "title": "Safety", + "type": "bool" + } + ], + "depends_on": "WL_SECTOR_SIZE_512", + "help": "Specify the mode to store data into flash:\n\n- In Performance mode a data will be stored to the RAM and then\n stored back to the flash. Compared to the Safety mode, this operation is\n faster, but if power will be lost when erase sector operation is in\n progress, then the data from complete flash device sector will be lost.\n\n- In Safety mode data from complete flash device sector will be read from\n flash, modified, and then stored back to flash.\n Compared to the Performance mode, this operation is slower, but if\n power is lost during erase sector operation, then the data from full\n flash device sector will not be lost.", + "id": "component-config-wear-levelling-sector-store-mode", + "name": "WL_SECTOR_MODE", + "title": "Sector store mode", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": null, + "id": "WL_SECTOR_MODE", + "name": "WL_SECTOR_MODE", + "range": null, + "title": null, + "type": "int" + } + ], + "depends_on": null, + "id": "component-config-wear-levelling", + "title": "Wear Levelling", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "This sets the maximum number of entries of Wi-Fi scan results that will be kept by the provisioning manager", + "id": "WIFI_PROV_SCAN_MAX_ENTRIES", + "name": "WIFI_PROV_SCAN_MAX_ENTRIES", + "range": [ + 1, + 255 + ], + "title": "Max Wi-Fi Scan Result Entries", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Time (in seconds) after which the Wi-Fi provisioning manager will auto-stop after connecting to\na Wi-Fi network successfully.", + "id": "WIFI_PROV_AUTOSTOP_TIMEOUT", + "name": "WIFI_PROV_AUTOSTOP_TIMEOUT", + "range": [ + 5, + 600 + ], + "title": "Provisioning auto-stop timeout", + "type": "int" + }, + { + "children": [], + "depends_on": "BT_ENABLED", + "help": "This option is applicable only when provisioning transport is BLE.", + "id": "WIFI_PROV_BLE_BONDING", + "name": "WIFI_PROV_BLE_BONDING", + "range": null, + "title": "Enable BLE bonding", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_NIMBLE_ENABLED", + "help": "Used to enable Secure connection support when provisioning transport is BLE.", + "id": "WIFI_PROV_BLE_SEC_CONN", + "name": "WIFI_PROV_BLE_SEC_CONN", + "range": null, + "title": "Enable BLE Secure connection flag", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_ENABLED", + "help": "Used to enforce link encryption when attempting to read / write characteristic", + "id": "WIFI_PROV_BLE_FORCE_ENCRYPTION", + "name": "WIFI_PROV_BLE_FORCE_ENCRYPTION", + "range": null, + "title": "Force Link Encryption during characteristic Read / Write", + "type": "bool" + }, + { + "children": [], + "depends_on": "BT_ENABLED", + "help": "Used to enable support Notification in BLE descriptors of prov* characteristics", + "id": "WIFI_PROV_BLE_NOTIFY", + "name": "WIFI_PROV_BLE_NOTIFY", + "range": null, + "title": "Add support for Notification for provisioning BLE descriptors", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "WIFI_PROV_KEEP_BLE_ON_AFTER_PROV", + "help": null, + "id": "WIFI_PROV_DISCONNECT_AFTER_PROV", + "name": "WIFI_PROV_DISCONNECT_AFTER_PROV", + "range": null, + "title": "Terminate connection after provisioning is done", + "type": "bool" + } + ], + "depends_on": "BT_ENABLED", + "help": null, + "id": "WIFI_PROV_KEEP_BLE_ON_AFTER_PROV", + "name": "WIFI_PROV_KEEP_BLE_ON_AFTER_PROV", + "range": null, + "title": "Keep BT on after provisioning is done", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": "Scan will end after scanning the entire channel. This option is useful in Mesh WiFi Systems.", + "id": "WIFI_PROV_STA_ALL_CHANNEL_SCAN", + "name": "WIFI_PROV_STA_ALL_CHANNEL_SCAN", + "range": null, + "title": "All Channel Scan", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": "Scan will end after an AP matching with the SSID has been detected.", + "id": "WIFI_PROV_STA_FAST_SCAN", + "name": "WIFI_PROV_STA_FAST_SCAN", + "range": null, + "title": "Fast Scan", + "type": "bool" + } + ], + "depends_on": null, + "help": null, + "id": "component-config-wi-fi-provisioning-manager-wifi-provisioning-scan-method", + "name": "WIFI_PROV_STA_SCAN_METHOD", + "title": "Wifi Provisioning Scan Method", + "type": "choice" + } + ], + "depends_on": null, + "id": "component-config-wi-fi-provisioning-manager", + "title": "Wi-Fi Provisioning Manager", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "CU_RELINKER_ENABLE", + "help": "\"Enable this option to print error information instead of\n throwing exception when missing function\"", + "id": "CU_RELINKER_ENABLE_PRINT_ERROR_INFO_WHEN_MISSING_FUNCTION", + "name": "CU_RELINKER_ENABLE_PRINT_ERROR_INFO_WHEN_MISSING_FUNCTION", + "range": null, + "title": "Print error information when missing function", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "CU_RELINKER_ENABLE_CUSTOMIZED_CONFIGURATION_FILES && CU_RELINKER_ENABLE", + "help": "\"Customized relinker configuration files path. This path is\nevaluated relative to the project root directory.\"", + "id": "CU_RELINKER_CUSTOMIZED_CONFIGURATION_FILES_PATH", + "name": "CU_RELINKER_CUSTOMIZED_CONFIGURATION_FILES_PATH", + "range": null, + "title": "Customized relinker configuration files path", + "type": "string" + } + ], + "depends_on": "CU_RELINKER_ENABLE", + "help": "\"Enable this option to use customized relinker configuration\nfiles instead of default ones\"", + "id": "CU_RELINKER_ENABLE_CUSTOMIZED_CONFIGURATION_FILES", + "name": "CU_RELINKER_ENABLE_CUSTOMIZED_CONFIGURATION_FILES", + "range": null, + "title": "Enable customized relinker configuration files", + "type": "bool" + } + ], + "depends_on": null, + "help": "\"Enable relinker to linker some IRAM functions to Flash\"", + "id": "CU_RELINKER_ENABLE", + "name": "CU_RELINKER_ENABLE", + "range": null, + "title": "Enable relinker", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "CU_DIAGNOSTICS_COLOR_NEVER", + "name": "CU_DIAGNOSTICS_COLOR_NEVER", + "range": null, + "title": "never", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "CU_DIAGNOSTICS_COLOR_ALWAYS", + "name": "CU_DIAGNOSTICS_COLOR_ALWAYS", + "range": null, + "title": "always", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "CU_DIAGNOSTICS_COLOR_AUTO", + "name": "CU_DIAGNOSTICS_COLOR_AUTO", + "range": null, + "title": "auto", + "type": "bool" + } + ], + "depends_on": null, + "help": "Use color in diagnostics. \"never\", \"always\", or \"auto\". If \"always\", GCC will output\nwith color defined in GCC_COLORS environment variable. If \"never\", only output plain\ntext. If \"auto\", only output with color when the standard error is a terminal and when\nnot executing in an emacs shell.", + "id": "component-config-cmake-utilities-color-in-diagnostics", + "name": "CU_DIAGNOSTICS_COLOR", + "title": "Color in diagnostics", + "type": "choice" + }, + { + "children": [], + "depends_on": null, + "help": "\"Enable this option, users can enable GCC link time optimization(LTO)\n feature for target components or dependencies.", + "id": "CU_GCC_LTO_ENABLE", + "name": "CU_GCC_LTO_ENABLE", + "range": null, + "title": "Enable GCC link time optimization(LTO)", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "\"Enable this option, user can make string in designated components align\n by 1-byte instead 1-word(4-byte), this can reduce unnecessary filled data\n so that to reduce firmware size.\"", + "id": "CU_GCC_STRING_1BYTE_ALIGN", + "name": "CU_GCC_STRING_1BYTE_ALIGN", + "range": null, + "title": "GCC string 1-byte align", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-cmake-utilities", + "title": "CMake Utilities", + "type": "menu" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "If enable, i2c_bus will dynamically check configs and re-install i2c driver before each transfer,\nhence multiple devices with different configs on a single bus can be supported.", + "id": "I2C_BUS_DYNAMIC_CONFIG", + "name": "I2C_BUS_DYNAMIC_CONFIG", + "range": null, + "title": "enable dynamic configuration", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "task block time when try to take the bus, unit:milliseconds", + "id": "I2C_MS_TO_WAIT", + "name": "I2C_MS_TO_WAIT", + "range": [ + 50, + 5000 + ], + "title": "mutex block time", + "type": "int" + }, + { + "children": [], + "depends_on": null, + "help": "Enable this option for backward compatibility with the old I2C driver (only valid in IDF v5.3 and above).", + "id": "I2C_BUS_BACKWARD_CONFIG", + "name": "I2C_BUS_BACKWARD_CONFIG", + "range": null, + "title": "Enable backward compatibility for the I2C driver (force use of the old i2c_driver above v5.3)", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "I2C_BUS_SUPPORT_SOFTWARE", + "help": "Set the maximum number of software I2C ports that can be used. This option is only applicable when\nsoftware I2C support is enabled.", + "id": "I2C_BUS_SOFTWARE_MAX_PORT", + "name": "I2C_BUS_SOFTWARE_MAX_PORT", + "range": null, + "title": "Maximum number of software I2C ports", + "type": "int" + } + ], + "depends_on": null, + "help": "Enable this option to use a software-implemented I2C driver. This can be useful for scenarios where\nhardware I2C is unavailable or additional I2C buses are needed beyond the hardware support.", + "id": "I2C_BUS_SUPPORT_SOFTWARE", + "name": "I2C_BUS_SUPPORT_SOFTWARE", + "range": null, + "title": "Enable software I2C support", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enable this option to disable NULL_MEM_ADDR. This allows any register address to be sent.", + "id": "I2C_BUS_REMOVE_NULL_MEM_ADDR", + "name": "I2C_BUS_REMOVE_NULL_MEM_ADDR", + "range": null, + "title": "Remove the limitation of NULL_MEM_ADDR, any register address will be sent", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-bus-options-i2c-bus-options", + "title": "I2C Bus Options", + "type": "menu" + } + ], + "depends_on": null, + "id": "component-config-bus-options", + "title": "Bus Options", + "type": "menu" + }, + { + "children": [ + { + "children": [], + "depends_on": null, + "help": "If not, this library will use MQTT protocol 3.1", + "id": "MQTT_PROTOCOL_311", + "name": "MQTT_PROTOCOL_311", + "range": null, + "title": "Enable MQTT protocol 3.1.1", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "If not, this library will not support MQTT 5.0", + "id": "MQTT_PROTOCOL_5", + "name": "MQTT_PROTOCOL_5", + "range": null, + "title": "Enable MQTT protocol 5.0", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Enable MQTT transport over SSL with mbedtls", + "id": "MQTT_TRANSPORT_SSL", + "name": "MQTT_TRANSPORT_SSL", + "range": null, + "title": "Enable MQTT over SSL", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "MQTT_TRANSPORT_WEBSOCKET && MQTT_TRANSPORT_SSL", + "help": "Enable MQTT transport over Websocket Secure.", + "id": "MQTT_TRANSPORT_WEBSOCKET_SECURE", + "name": "MQTT_TRANSPORT_WEBSOCKET_SECURE", + "range": null, + "title": "Enable MQTT over Websocket Secure", + "type": "bool" + } + ], + "depends_on": "WS_TRANSPORT", + "help": "Enable MQTT transport over Websocket.", + "id": "MQTT_TRANSPORT_WEBSOCKET", + "name": "MQTT_TRANSPORT_WEBSOCKET", + "range": null, + "title": "Enable MQTT over Websocket", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Set this to true for the message id (2.3.1 Packet Identifier) to be generated\nas an incremental number rather then a random value (used by default)", + "id": "MQTT_MSG_ID_INCREMENTAL", + "name": "MQTT_MSG_ID_INCREMENTAL", + "range": null, + "title": "Use Incremental Message Id", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Set this to true to avoid publishing (enqueueing messages) if the client is disconnected.\nThe MQTT client tries to publish all messages by default, even in the disconnected state\n(where the qos1 and qos2 packets are stored in the internal outbox to be published later)\nThe MQTT_SKIP_PUBLISH_IF_DISCONNECTED option allows applications to override this behaviour\nand not enqueue publish packets in the disconnected state.", + "id": "MQTT_SKIP_PUBLISH_IF_DISCONNECTED", + "name": "MQTT_SKIP_PUBLISH_IF_DISCONNECTED", + "range": null, + "title": "Skip publish if disconnected", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Set this to true to post events for all messages which were deleted from the outbox\nbefore being correctly sent and confirmed.", + "id": "MQTT_REPORT_DELETED_MESSAGES", + "name": "MQTT_REPORT_DELETED_MESSAGES", + "range": null, + "title": "Report deleted messages", + "type": "bool" + }, + { + "children": [ + { + "children": [], + "depends_on": "MQTT_USE_CUSTOM_CONFIG", + "help": "Default MQTT over TCP port", + "id": "MQTT_TCP_DEFAULT_PORT", + "name": "MQTT_TCP_DEFAULT_PORT", + "range": null, + "title": "Default MQTT over TCP port", + "type": "int" + }, + { + "children": [], + "depends_on": "MQTT_USE_CUSTOM_CONFIG && MQTT_TRANSPORT_SSL", + "help": "Default MQTT over SSL port", + "id": "MQTT_SSL_DEFAULT_PORT", + "name": "MQTT_SSL_DEFAULT_PORT", + "range": null, + "title": "Default MQTT over SSL port", + "type": "int" + }, + { + "children": [], + "depends_on": "MQTT_USE_CUSTOM_CONFIG && MQTT_TRANSPORT_WEBSOCKET", + "help": "Default MQTT over Websocket port", + "id": "MQTT_WS_DEFAULT_PORT", + "name": "MQTT_WS_DEFAULT_PORT", + "range": null, + "title": "Default MQTT over Websocket port", + "type": "int" + }, + { + "children": [], + "depends_on": "MQTT_USE_CUSTOM_CONFIG && MQTT_TRANSPORT_WEBSOCKET && MQTT_TRANSPORT_WEBSOCKET_SECURE", + "help": "Default MQTT over Websocket Secure port", + "id": "MQTT_WSS_DEFAULT_PORT", + "name": "MQTT_WSS_DEFAULT_PORT", + "range": null, + "title": "Default MQTT over Websocket Secure port", + "type": "int" + }, + { + "children": [], + "depends_on": "MQTT_USE_CUSTOM_CONFIG", + "help": "This buffer size using for both transmit and receive", + "id": "MQTT_BUFFER_SIZE", + "name": "MQTT_BUFFER_SIZE", + "range": null, + "title": "Default MQTT Buffer Size", + "type": "int" + }, + { + "children": [], + "depends_on": "MQTT_USE_CUSTOM_CONFIG", + "help": "MQTT task stack size", + "id": "MQTT_TASK_STACK_SIZE", + "name": "MQTT_TASK_STACK_SIZE", + "range": null, + "title": "MQTT task stack size", + "type": "int" + }, + { + "children": [], + "depends_on": "MQTT_USE_CUSTOM_CONFIG", + "help": "Default config employs API locks to protect internal structures. It is possible to disable\nthese locks if the user code doesn't access MQTT API from multiple concurrent tasks", + "id": "MQTT_DISABLE_API_LOCKS", + "name": "MQTT_DISABLE_API_LOCKS", + "range": null, + "title": "Disable API locks", + "type": "bool" + }, + { + "children": [], + "depends_on": "MQTT_USE_CUSTOM_CONFIG", + "help": "MQTT task priority. Higher number denotes higher priority.", + "id": "MQTT_TASK_PRIORITY", + "name": "MQTT_TASK_PRIORITY", + "range": null, + "title": "MQTT task priority", + "type": "int" + }, + { + "children": [], + "depends_on": "MQTT_USE_CUSTOM_CONFIG", + "help": "Timeout when polling underlying transport for read.", + "id": "MQTT_POLL_READ_TIMEOUT_MS", + "name": "MQTT_POLL_READ_TIMEOUT_MS", + "range": null, + "title": "MQTT transport poll read timeut", + "type": "int" + }, + { + "children": [], + "depends_on": "MQTT_USE_CUSTOM_CONFIG", + "help": "A value higher than 1 enables multiple queued events.", + "id": "MQTT_EVENT_QUEUE_SIZE", + "name": "MQTT_EVENT_QUEUE_SIZE", + "range": null, + "title": "Number of queued events.", + "type": "int" + } + ], + "depends_on": null, + "help": "Custom MQTT configurations.", + "id": "MQTT_USE_CUSTOM_CONFIG", + "name": "MQTT_USE_CUSTOM_CONFIG", + "range": null, + "title": "MQTT Using custom configurations", + "type": "bool" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "depends_on": "", + "help": null, + "id": "MQTT_USE_CORE_0", + "name": "MQTT_USE_CORE_0", + "range": null, + "title": "Core 0", + "type": "bool" + }, + { + "children": [], + "depends_on": "", + "help": null, + "id": "MQTT_USE_CORE_1", + "name": "MQTT_USE_CORE_1", + "range": null, + "title": "Core 1", + "type": "bool" + } + ], + "depends_on": "MQTT_TASK_CORE_SELECTION_ENABLED", + "help": null, + "id": "component-config-esp-mqtt-configurations-enable-mqtt-task-core-selection-core-to-use-", + "name": "MQTT_TASK_CORE_SELECTION", + "title": "Core to use ?", + "type": "choice" + } + ], + "depends_on": null, + "help": "This will enable core selection", + "id": "MQTT_TASK_CORE_SELECTION_ENABLED", + "name": "MQTT_TASK_CORE_SELECTION_ENABLED", + "range": null, + "title": "Enable MQTT task core selection", + "type": "bool" + }, + { + "children": [], + "depends_on": "MQTT_USE_CUSTOM_CONFIG", + "help": "Set to true to use external memory for outbox data.", + "id": "MQTT_OUTBOX_DATA_ON_EXTERNAL_MEMORY", + "name": "MQTT_OUTBOX_DATA_ON_EXTERNAL_MEMORY", + "range": null, + "title": "Use external memory for outbox data", + "type": "bool" + }, + { + "children": [], + "depends_on": null, + "help": "Set to true if a specific implementation of message outbox is needed (e.g. persistent outbox in NVM or\nsimilar).\nNote: Implementation of the custom outbox must be added to the mqtt component. These CMake commands\ncould be used to append the custom implementation to lib-mqtt sources:\nidf_component_get_property(mqtt mqtt COMPONENT_LIB)\nset_property(TARGET ${mqtt} PROPERTY SOURCES ${PROJECT_DIR}/custom_outbox.c APPEND)", + "id": "MQTT_CUSTOM_OUTBOX", + "name": "MQTT_CUSTOM_OUTBOX", + "range": null, + "title": "Enable custom outbox implementation", + "type": "bool" + }, + { + "children": [], + "depends_on": "MQTT_USE_CUSTOM_CONFIG", + "help": "Messages which stays in the outbox longer than this value before being published will be discarded.", + "id": "MQTT_OUTBOX_EXPIRED_TIMEOUT_MS", + "name": "MQTT_OUTBOX_EXPIRED_TIMEOUT_MS", + "range": null, + "title": "Outbox message expired timeout[ms]", + "type": "int" + }, + { + "children": [], + "depends_on": "MQTT_USE_CUSTOM_CONFIG", + "help": "Set to true to have publish topic in all data events. This changes the behaviour\nwhen the message is bigger than the receive buffer size. The first event of the sequence\nalways have the topic.\nNote: This will allocate memory to store the topic only in case of messge bigger than the buffer size.", + "id": "MQTT_TOPIC_PRESENT_ALL_DATA_EVENTS", + "name": "MQTT_TOPIC_PRESENT_ALL_DATA_EVENTS", + "range": null, + "title": "Enable publish topic in all data events", + "type": "bool" + } + ], + "depends_on": null, + "id": "component-config-esp-mqtt-configurations", + "title": "ESP-MQTT Configurations", + "type": "menu" + } + ], + "depends_on": null, + "id": "component-config", + "title": "Component config", + "type": "menu" + }, + { + "children": [], + "depends_on": null, + "help": "By enabling this option, ESP-IDF experimental feature options will be visible.\n\nNote you should still enable a certain experimental feature option to use it, and you\nshould read the corresponding risk warning and known issue list carefully.\n\nCurrent experimental feature list:\n\n- CONFIG_ESPTOOLPY_FLASHFREQ_120M && CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_DTR\n- CONFIG_SPIRAM_SPEED_120M && CONFIG_SPIRAM_MODE_OCT\n- CONFIG_BOOTLOADER_CACHE_32BIT_ADDR_QUAD_FLASH\n- CONFIG_ESP_WIFI_EAP_TLS1_3\n- CONFIG_ESP_WIFI_ENABLE_ROAMING_APP\n- CONFIG_USB_HOST_EXT_PORT_SUPPORT_LS\n- CONFIG_USB_HOST_EXT_PORT_RESET_ATTEMPTS", + "id": "IDF_EXPERIMENTAL_FEATURES", + "name": "IDF_EXPERIMENTAL_FEATURES", + "range": null, + "title": "Make experimental features visible", + "type": "bool" + } +] \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/build/config/sdkconfig.cmake b/ESP32-IDF_Temperture-Node-v2/build/config/sdkconfig.cmake new file mode 100644 index 000000000..84514fd5d --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/build/config/sdkconfig.cmake @@ -0,0 +1,1416 @@ +# + # Automatically generated file. DO NOT EDIT. + # Espressif IoT Development Framework (ESP-IDF) Configuration cmake include file + # +set(CONFIG_SOC_BROWNOUT_RESET_SUPPORTED "Not determined") +set(CONFIG_SOC_TWAI_BRP_DIV_SUPPORTED "Not determined") +set(CONFIG_SOC_DPORT_WORKAROUND "Not determined") +set(CONFIG_SOC_CAPS_ECO_VER_MAX "301") +set(CONFIG_SOC_ADC_SUPPORTED "y") +set(CONFIG_SOC_DAC_SUPPORTED "y") +set(CONFIG_SOC_UART_SUPPORTED "y") +set(CONFIG_SOC_MCPWM_SUPPORTED "y") +set(CONFIG_SOC_GPTIMER_SUPPORTED "y") +set(CONFIG_SOC_SDMMC_HOST_SUPPORTED "y") +set(CONFIG_SOC_BT_SUPPORTED "y") +set(CONFIG_SOC_PCNT_SUPPORTED "y") +set(CONFIG_SOC_PHY_SUPPORTED "y") +set(CONFIG_SOC_WIFI_SUPPORTED "y") +set(CONFIG_SOC_SDIO_SLAVE_SUPPORTED "y") +set(CONFIG_SOC_TWAI_SUPPORTED "y") +set(CONFIG_SOC_EFUSE_SUPPORTED "y") +set(CONFIG_SOC_EMAC_SUPPORTED "y") +set(CONFIG_SOC_ULP_SUPPORTED "y") +set(CONFIG_SOC_CCOMP_TIMER_SUPPORTED "y") +set(CONFIG_SOC_RTC_FAST_MEM_SUPPORTED "y") +set(CONFIG_SOC_RTC_SLOW_MEM_SUPPORTED "y") +set(CONFIG_SOC_RTC_MEM_SUPPORTED "y") +set(CONFIG_SOC_I2S_SUPPORTED "y") +set(CONFIG_SOC_RMT_SUPPORTED "y") +set(CONFIG_SOC_SDM_SUPPORTED "y") +set(CONFIG_SOC_GPSPI_SUPPORTED "y") +set(CONFIG_SOC_LEDC_SUPPORTED "y") +set(CONFIG_SOC_I2C_SUPPORTED "y") +set(CONFIG_SOC_SUPPORT_COEXISTENCE "y") +set(CONFIG_SOC_AES_SUPPORTED "y") +set(CONFIG_SOC_MPI_SUPPORTED "y") +set(CONFIG_SOC_SHA_SUPPORTED "y") +set(CONFIG_SOC_FLASH_ENC_SUPPORTED "y") +set(CONFIG_SOC_SECURE_BOOT_SUPPORTED "y") +set(CONFIG_SOC_TOUCH_SENSOR_SUPPORTED "y") +set(CONFIG_SOC_BOD_SUPPORTED "y") +set(CONFIG_SOC_ULP_FSM_SUPPORTED "y") +set(CONFIG_SOC_CLK_TREE_SUPPORTED "y") +set(CONFIG_SOC_MPU_SUPPORTED "y") +set(CONFIG_SOC_WDT_SUPPORTED "y") +set(CONFIG_SOC_SPI_FLASH_SUPPORTED "y") +set(CONFIG_SOC_RNG_SUPPORTED "y") +set(CONFIG_SOC_LIGHT_SLEEP_SUPPORTED "y") +set(CONFIG_SOC_DEEP_SLEEP_SUPPORTED "y") +set(CONFIG_SOC_LP_PERIPH_SHARE_INTERRUPT "y") +set(CONFIG_SOC_PM_SUPPORTED "y") +set(CONFIG_SOC_DPORT_WORKAROUND_DIS_INTERRUPT_LVL "5") +set(CONFIG_SOC_XTAL_SUPPORT_26M "y") +set(CONFIG_SOC_XTAL_SUPPORT_40M "y") +set(CONFIG_SOC_XTAL_SUPPORT_AUTO_DETECT "y") +set(CONFIG_SOC_ADC_RTC_CTRL_SUPPORTED "y") +set(CONFIG_SOC_ADC_DIG_CTRL_SUPPORTED "y") +set(CONFIG_SOC_ADC_DMA_SUPPORTED "y") +set(CONFIG_SOC_ADC_PERIPH_NUM "2") +set(CONFIG_SOC_ADC_MAX_CHANNEL_NUM "10") +set(CONFIG_SOC_ADC_ATTEN_NUM "4") +set(CONFIG_SOC_ADC_DIGI_CONTROLLER_NUM "2") +set(CONFIG_SOC_ADC_PATT_LEN_MAX "16") +set(CONFIG_SOC_ADC_DIGI_MIN_BITWIDTH "9") +set(CONFIG_SOC_ADC_DIGI_MAX_BITWIDTH "12") +set(CONFIG_SOC_ADC_DIGI_RESULT_BYTES "2") +set(CONFIG_SOC_ADC_DIGI_DATA_BYTES_PER_CONV "4") +set(CONFIG_SOC_ADC_DIGI_MONITOR_NUM "0") +set(CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH "2") +set(CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW "20") +set(CONFIG_SOC_ADC_RTC_MIN_BITWIDTH "9") +set(CONFIG_SOC_ADC_RTC_MAX_BITWIDTH "12") +set(CONFIG_SOC_ADC_SHARED_POWER "y") +set(CONFIG_SOC_SHARED_IDCACHE_SUPPORTED "y") +set(CONFIG_SOC_IDCACHE_PER_CORE "y") +set(CONFIG_SOC_CPU_CORES_NUM "2") +set(CONFIG_SOC_CPU_INTR_NUM "32") +set(CONFIG_SOC_CPU_HAS_FPU "y") +set(CONFIG_SOC_HP_CPU_HAS_MULTIPLE_CORES "y") +set(CONFIG_SOC_CPU_BREAKPOINTS_NUM "2") +set(CONFIG_SOC_CPU_WATCHPOINTS_NUM "2") +set(CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE "64") +set(CONFIG_SOC_DAC_CHAN_NUM "2") +set(CONFIG_SOC_DAC_RESOLUTION "8") +set(CONFIG_SOC_DAC_DMA_16BIT_ALIGN "y") +set(CONFIG_SOC_GPIO_PORT "1") +set(CONFIG_SOC_GPIO_PIN_COUNT "40") +set(CONFIG_SOC_GPIO_VALID_GPIO_MASK "0xffffffffff") +set(CONFIG_SOC_GPIO_IN_RANGE_MAX "39") +set(CONFIG_SOC_GPIO_OUT_RANGE_MAX "33") +set(CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK "0xef0fea") +set(CONFIG_SOC_GPIO_CLOCKOUT_BY_IO_MUX "y") +set(CONFIG_SOC_GPIO_CLOCKOUT_CHANNEL_NUM "3") +set(CONFIG_SOC_GPIO_SUPPORT_HOLD_IO_IN_DSLP "y") +set(CONFIG_SOC_I2C_NUM "2") +set(CONFIG_SOC_HP_I2C_NUM "2") +set(CONFIG_SOC_I2C_FIFO_LEN "32") +set(CONFIG_SOC_I2C_CMD_REG_NUM "16") +set(CONFIG_SOC_I2C_SUPPORT_SLAVE "y") +set(CONFIG_SOC_I2C_SUPPORT_APB "y") +set(CONFIG_SOC_I2C_SUPPORT_10BIT_ADDR "y") +set(CONFIG_SOC_I2C_STOP_INDEPENDENT "y") +set(CONFIG_SOC_I2S_NUM "2") +set(CONFIG_SOC_I2S_HW_VERSION_1 "y") +set(CONFIG_SOC_I2S_SUPPORTS_APLL "y") +set(CONFIG_SOC_I2S_SUPPORTS_PLL_F160M "y") +set(CONFIG_SOC_I2S_SUPPORTS_PDM "y") +set(CONFIG_SOC_I2S_SUPPORTS_PDM_TX "y") +set(CONFIG_SOC_I2S_PDM_MAX_TX_LINES "1") +set(CONFIG_SOC_I2S_SUPPORTS_PDM_RX "y") +set(CONFIG_SOC_I2S_PDM_MAX_RX_LINES "1") +set(CONFIG_SOC_I2S_SUPPORTS_ADC_DAC "y") +set(CONFIG_SOC_I2S_SUPPORTS_ADC "y") +set(CONFIG_SOC_I2S_SUPPORTS_DAC "y") +set(CONFIG_SOC_I2S_SUPPORTS_LCD_CAMERA "y") +set(CONFIG_SOC_I2S_MAX_DATA_WIDTH "24") +set(CONFIG_SOC_I2S_TRANS_SIZE_ALIGN_WORD "y") +set(CONFIG_SOC_I2S_LCD_I80_VARIANT "y") +set(CONFIG_SOC_LCD_I80_SUPPORTED "y") +set(CONFIG_SOC_LCD_I80_BUSES "2") +set(CONFIG_SOC_LCD_I80_BUS_WIDTH "24") +set(CONFIG_SOC_LEDC_HAS_TIMER_SPECIFIC_MUX "y") +set(CONFIG_SOC_LEDC_SUPPORT_APB_CLOCK "y") +set(CONFIG_SOC_LEDC_SUPPORT_REF_TICK "y") +set(CONFIG_SOC_LEDC_SUPPORT_HS_MODE "y") +set(CONFIG_SOC_LEDC_TIMER_NUM "4") +set(CONFIG_SOC_LEDC_CHANNEL_NUM "8") +set(CONFIG_SOC_LEDC_TIMER_BIT_WIDTH "20") +set(CONFIG_SOC_MCPWM_GROUPS "2") +set(CONFIG_SOC_MCPWM_TIMERS_PER_GROUP "3") +set(CONFIG_SOC_MCPWM_OPERATORS_PER_GROUP "3") +set(CONFIG_SOC_MCPWM_COMPARATORS_PER_OPERATOR "2") +set(CONFIG_SOC_MCPWM_GENERATORS_PER_OPERATOR "2") +set(CONFIG_SOC_MCPWM_TRIGGERS_PER_OPERATOR "2") +set(CONFIG_SOC_MCPWM_GPIO_FAULTS_PER_GROUP "3") +set(CONFIG_SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP "y") +set(CONFIG_SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER "3") +set(CONFIG_SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP "3") +set(CONFIG_SOC_MMU_PERIPH_NUM "2") +set(CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM "3") +set(CONFIG_SOC_MPU_MIN_REGION_SIZE "0x20000000") +set(CONFIG_SOC_MPU_REGIONS_MAX_NUM "8") +set(CONFIG_SOC_PCNT_GROUPS "1") +set(CONFIG_SOC_PCNT_UNITS_PER_GROUP "8") +set(CONFIG_SOC_PCNT_CHANNELS_PER_UNIT "2") +set(CONFIG_SOC_PCNT_THRES_POINT_PER_UNIT "2") +set(CONFIG_SOC_RMT_GROUPS "1") +set(CONFIG_SOC_RMT_TX_CANDIDATES_PER_GROUP "8") +set(CONFIG_SOC_RMT_RX_CANDIDATES_PER_GROUP "8") +set(CONFIG_SOC_RMT_CHANNELS_PER_GROUP "8") +set(CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL "64") +set(CONFIG_SOC_RMT_SUPPORT_REF_TICK "y") +set(CONFIG_SOC_RMT_SUPPORT_APB "y") +set(CONFIG_SOC_RMT_CHANNEL_CLK_INDEPENDENT "y") +set(CONFIG_SOC_RTCIO_PIN_COUNT "18") +set(CONFIG_SOC_RTCIO_INPUT_OUTPUT_SUPPORTED "y") +set(CONFIG_SOC_RTCIO_HOLD_SUPPORTED "y") +set(CONFIG_SOC_RTCIO_WAKE_SUPPORTED "y") +set(CONFIG_SOC_SDM_GROUPS "1") +set(CONFIG_SOC_SDM_CHANNELS_PER_GROUP "8") +set(CONFIG_SOC_SDM_CLK_SUPPORT_APB "y") +set(CONFIG_SOC_SPI_HD_BOTH_INOUT_SUPPORTED "y") +set(CONFIG_SOC_SPI_AS_CS_SUPPORTED "y") +set(CONFIG_SOC_SPI_PERIPH_NUM "3") +set(CONFIG_SOC_SPI_DMA_CHAN_NUM "2") +set(CONFIG_SOC_SPI_MAX_CS_NUM "3") +set(CONFIG_SOC_SPI_SUPPORT_CLK_APB "y") +set(CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE "64") +set(CONFIG_SOC_SPI_MAX_PRE_DIVIDER "8192") +set(CONFIG_SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED "y") +set(CONFIG_SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED "y") +set(CONFIG_SOC_MEMSPI_SRC_FREQ_26M_SUPPORTED "y") +set(CONFIG_SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED "y") +set(CONFIG_SOC_TIMER_GROUPS "2") +set(CONFIG_SOC_TIMER_GROUP_TIMERS_PER_GROUP "2") +set(CONFIG_SOC_TIMER_GROUP_COUNTER_BIT_WIDTH "64") +set(CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS "4") +set(CONFIG_SOC_TIMER_GROUP_SUPPORT_APB "y") +set(CONFIG_SOC_LP_TIMER_BIT_WIDTH_LO "32") +set(CONFIG_SOC_LP_TIMER_BIT_WIDTH_HI "16") +set(CONFIG_SOC_TOUCH_SENSOR_VERSION "1") +set(CONFIG_SOC_TOUCH_SENSOR_NUM "10") +set(CONFIG_SOC_TOUCH_SAMPLE_CFG_NUM "1") +set(CONFIG_SOC_TWAI_CONTROLLER_NUM "1") +set(CONFIG_SOC_TWAI_BRP_MIN "2") +set(CONFIG_SOC_TWAI_CLK_SUPPORT_APB "y") +set(CONFIG_SOC_TWAI_SUPPORT_MULTI_ADDRESS_LAYOUT "y") +set(CONFIG_SOC_UART_NUM "3") +set(CONFIG_SOC_UART_HP_NUM "3") +set(CONFIG_SOC_UART_SUPPORT_APB_CLK "y") +set(CONFIG_SOC_UART_SUPPORT_REF_TICK "y") +set(CONFIG_SOC_UART_FIFO_LEN "128") +set(CONFIG_SOC_UART_BITRATE_MAX "5000000") +set(CONFIG_SOC_SPIRAM_SUPPORTED "y") +set(CONFIG_SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE "y") +set(CONFIG_SOC_SHA_SUPPORT_PARALLEL_ENG "y") +set(CONFIG_SOC_SHA_ENDIANNESS_BE "y") +set(CONFIG_SOC_SHA_SUPPORT_SHA1 "y") +set(CONFIG_SOC_SHA_SUPPORT_SHA256 "y") +set(CONFIG_SOC_SHA_SUPPORT_SHA384 "y") +set(CONFIG_SOC_SHA_SUPPORT_SHA512 "y") +set(CONFIG_SOC_MPI_MEM_BLOCKS_NUM "4") +set(CONFIG_SOC_MPI_OPERATIONS_NUM "y") +set(CONFIG_SOC_RSA_MAX_BIT_LEN "4096") +set(CONFIG_SOC_AES_SUPPORT_AES_128 "y") +set(CONFIG_SOC_AES_SUPPORT_AES_192 "y") +set(CONFIG_SOC_AES_SUPPORT_AES_256 "y") +set(CONFIG_SOC_SECURE_BOOT_V1 "y") +set(CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS "y") +set(CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX "32") +set(CONFIG_SOC_PHY_DIG_REGS_MEM_SIZE "21") +set(CONFIG_SOC_PM_SUPPORT_EXT0_WAKEUP "y") +set(CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP "y") +set(CONFIG_SOC_PM_SUPPORT_EXT_WAKEUP "y") +set(CONFIG_SOC_PM_SUPPORT_TOUCH_SENSOR_WAKEUP "y") +set(CONFIG_SOC_PM_SUPPORT_RTC_PERIPH_PD "y") +set(CONFIG_SOC_PM_SUPPORT_RTC_FAST_MEM_PD "y") +set(CONFIG_SOC_PM_SUPPORT_RTC_SLOW_MEM_PD "y") +set(CONFIG_SOC_PM_SUPPORT_RC_FAST_PD "y") +set(CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD "y") +set(CONFIG_SOC_PM_SUPPORT_MODEM_PD "y") +set(CONFIG_SOC_CONFIGURABLE_VDDSDIO_SUPPORTED "y") +set(CONFIG_SOC_PM_MODEM_PD_BY_SW "y") +set(CONFIG_SOC_CLK_APLL_SUPPORTED "y") +set(CONFIG_SOC_CLK_RC_FAST_D256_SUPPORTED "y") +set(CONFIG_SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256 "y") +set(CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION "y") +set(CONFIG_SOC_CLK_XTAL32K_SUPPORTED "y") +set(CONFIG_SOC_SDMMC_USE_IOMUX "y") +set(CONFIG_SOC_SDMMC_NUM_SLOTS "2") +set(CONFIG_SOC_WIFI_WAPI_SUPPORT "y") +set(CONFIG_SOC_WIFI_CSI_SUPPORT "y") +set(CONFIG_SOC_WIFI_MESH_SUPPORT "y") +set(CONFIG_SOC_WIFI_SUPPORT_VARIABLE_BEACON_WINDOW "y") +set(CONFIG_SOC_WIFI_NAN_SUPPORT "y") +set(CONFIG_SOC_BLE_SUPPORTED "y") +set(CONFIG_SOC_BLE_MESH_SUPPORTED "y") +set(CONFIG_SOC_BT_CLASSIC_SUPPORTED "y") +set(CONFIG_SOC_BLUFI_SUPPORTED "y") +set(CONFIG_SOC_BT_H2C_ENC_KEY_CTRL_ENH_VSC_SUPPORTED "y") +set(CONFIG_SOC_ULP_HAS_ADC "y") +set(CONFIG_SOC_PHY_COMBO_MODULE "y") +set(CONFIG_SOC_EMAC_RMII_CLK_OUT_INTERNAL_LOOPBACK "y") +set(CONFIG_IDF_CMAKE "y") +set(CONFIG_IDF_TOOLCHAIN "gcc") +set(CONFIG_IDF_TOOLCHAIN_GCC "y") +set(CONFIG_IDF_TARGET_ARCH_XTENSA "y") +set(CONFIG_IDF_TARGET_ARCH "xtensa") +set(CONFIG_IDF_TARGET "esp32") +set(CONFIG_IDF_INIT_VERSION "5.4.1") +set(CONFIG_IDF_TARGET_ESP32 "y") +set(CONFIG_IDF_FIRMWARE_CHIP_ID "0x0") +set(CONFIG_APP_BUILD_TYPE_APP_2NDBOOT "y") +set(CONFIG_APP_BUILD_TYPE_RAM "") +set(CONFIG_APP_BUILD_GENERATE_BINARIES "y") +set(CONFIG_APP_BUILD_BOOTLOADER "y") +set(CONFIG_APP_BUILD_USE_FLASH_SECTIONS "y") +set(CONFIG_APP_REPRODUCIBLE_BUILD "") +set(CONFIG_APP_NO_BLOBS "") +set(CONFIG_APP_COMPATIBLE_PRE_V2_1_BOOTLOADERS "") +set(CONFIG_APP_COMPATIBLE_PRE_V3_1_BOOTLOADERS "") +set(CONFIG_BOOTLOADER_COMPILE_TIME_DATE "y") +set(CONFIG_BOOTLOADER_PROJECT_VER "1") +set(CONFIG_BOOTLOADER_OFFSET_IN_FLASH "0x1000") +set(CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE "y") +set(CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG "") +set(CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF "") +set(CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_NONE "") +set(CONFIG_BOOTLOADER_LOG_LEVEL_NONE "") +set(CONFIG_BOOTLOADER_LOG_LEVEL_ERROR "") +set(CONFIG_BOOTLOADER_LOG_LEVEL_WARN "") +set(CONFIG_BOOTLOADER_LOG_LEVEL_INFO "y") +set(CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG "") +set(CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE "") +set(CONFIG_BOOTLOADER_LOG_LEVEL "3") +set(CONFIG_BOOTLOADER_LOG_COLORS "") +set(CONFIG_BOOTLOADER_LOG_TIMESTAMP_SOURCE_CPU_TICKS "y") +set(CONFIG_BOOTLOADER_FLASH_DC_AWARE "") +set(CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT "y") +set(CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_8V "") +set(CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V "y") +set(CONFIG_BOOTLOADER_FACTORY_RESET "") +set(CONFIG_BOOTLOADER_APP_TEST "") +set(CONFIG_BOOTLOADER_REGION_PROTECTION_ENABLE "y") +set(CONFIG_BOOTLOADER_WDT_ENABLE "y") +set(CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE "") +set(CONFIG_BOOTLOADER_WDT_TIME_MS "9000") +set(CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE "") +set(CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP "") +set(CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON "") +set(CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS "") +set(CONFIG_BOOTLOADER_RESERVE_RTC_SIZE "0x0") +set(CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC "") +set(CONFIG_SECURE_BOOT_V1_SUPPORTED "y") +set(CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT "") +set(CONFIG_SECURE_BOOT "") +set(CONFIG_SECURE_FLASH_ENC_ENABLED "") +set(CONFIG_APP_COMPILE_TIME_DATE "y") +set(CONFIG_APP_EXCLUDE_PROJECT_VER_VAR "") +set(CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR "") +set(CONFIG_APP_PROJECT_VER_FROM_CONFIG "") +set(CONFIG_APP_RETRIEVE_LEN_ELF_SHA "9") +set(CONFIG_ESP_ROM_HAS_CRC_LE "y") +set(CONFIG_ESP_ROM_HAS_CRC_BE "y") +set(CONFIG_ESP_ROM_HAS_MZ_CRC32 "y") +set(CONFIG_ESP_ROM_HAS_JPEG_DECODE "y") +set(CONFIG_ESP_ROM_HAS_UART_BUF_SWITCH "y") +set(CONFIG_ESP_ROM_NEEDS_SWSETUP_WORKAROUND "y") +set(CONFIG_ESP_ROM_HAS_NEWLIB "y") +set(CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT "y") +set(CONFIG_ESP_ROM_HAS_NEWLIB_32BIT_TIME "y") +set(CONFIG_ESP_ROM_HAS_SW_FLOAT "y") +set(CONFIG_ESP_ROM_USB_OTG_NUM "-1") +set(CONFIG_ESP_ROM_USB_SERIAL_DEVICE_NUM "-1") +set(CONFIG_ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB "y") +set(CONFIG_ESP_ROM_HAS_OUTPUT_PUTC_FUNC "y") +set(CONFIG_ESPTOOLPY_NO_STUB "") +set(CONFIG_ESPTOOLPY_FLASHMODE_QIO "") +set(CONFIG_ESPTOOLPY_FLASHMODE_QOUT "") +set(CONFIG_ESPTOOLPY_FLASHMODE_DIO "y") +set(CONFIG_ESPTOOLPY_FLASHMODE_DOUT "") +set(CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_STR "y") +set(CONFIG_ESPTOOLPY_FLASHMODE "dio") +set(CONFIG_ESPTOOLPY_FLASHFREQ_80M "") +set(CONFIG_ESPTOOLPY_FLASHFREQ_40M "y") +set(CONFIG_ESPTOOLPY_FLASHFREQ_26M "") +set(CONFIG_ESPTOOLPY_FLASHFREQ_20M "") +set(CONFIG_ESPTOOLPY_FLASHFREQ "40m") +set(CONFIG_ESPTOOLPY_FLASHSIZE_1MB "") +set(CONFIG_ESPTOOLPY_FLASHSIZE_2MB "y") +set(CONFIG_ESPTOOLPY_FLASHSIZE_4MB "") +set(CONFIG_ESPTOOLPY_FLASHSIZE_8MB "") +set(CONFIG_ESPTOOLPY_FLASHSIZE_16MB "") +set(CONFIG_ESPTOOLPY_FLASHSIZE_32MB "") +set(CONFIG_ESPTOOLPY_FLASHSIZE_64MB "") +set(CONFIG_ESPTOOLPY_FLASHSIZE_128MB "") +set(CONFIG_ESPTOOLPY_FLASHSIZE "2MB") +set(CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE "") +set(CONFIG_ESPTOOLPY_BEFORE_RESET "y") +set(CONFIG_ESPTOOLPY_BEFORE_NORESET "") +set(CONFIG_ESPTOOLPY_BEFORE "default_reset") +set(CONFIG_ESPTOOLPY_AFTER_RESET "y") +set(CONFIG_ESPTOOLPY_AFTER_NORESET "") +set(CONFIG_ESPTOOLPY_AFTER "hard_reset") +set(CONFIG_ESPTOOLPY_MONITOR_BAUD "115200") +set(CONFIG_PARTITION_TABLE_SINGLE_APP "y") +set(CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE "") +set(CONFIG_PARTITION_TABLE_TWO_OTA "") +set(CONFIG_PARTITION_TABLE_TWO_OTA_LARGE "") +set(CONFIG_PARTITION_TABLE_CUSTOM "") +set(CONFIG_PARTITION_TABLE_CUSTOM_FILENAME "partitions.csv") +set(CONFIG_PARTITION_TABLE_FILENAME "partitions_singleapp.csv") +set(CONFIG_PARTITION_TABLE_OFFSET "0x8000") +set(CONFIG_PARTITION_TABLE_MD5 "y") +set(CONFIG_COMPILER_OPTIMIZATION_DEBUG "y") +set(CONFIG_COMPILER_OPTIMIZATION_SIZE "") +set(CONFIG_COMPILER_OPTIMIZATION_PERF "") +set(CONFIG_COMPILER_OPTIMIZATION_NONE "") +set(CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE "y") +set(CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT "") +set(CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE "") +set(CONFIG_COMPILER_ASSERT_NDEBUG_EVALUATE "y") +set(CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB "y") +set(CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL "2") +set(CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT "") +set(CONFIG_COMPILER_HIDE_PATHS_MACROS "y") +set(CONFIG_COMPILER_CXX_EXCEPTIONS "") +set(CONFIG_COMPILER_CXX_RTTI "") +set(CONFIG_COMPILER_STACK_CHECK_MODE_NONE "y") +set(CONFIG_COMPILER_STACK_CHECK_MODE_NORM "") +set(CONFIG_COMPILER_STACK_CHECK_MODE_STRONG "") +set(CONFIG_COMPILER_STACK_CHECK_MODE_ALL "") +set(CONFIG_COMPILER_NO_MERGE_CONSTANTS "") +set(CONFIG_COMPILER_WARN_WRITE_STRINGS "") +set(CONFIG_COMPILER_DISABLE_DEFAULT_ERRORS "y") +set(CONFIG_COMPILER_DISABLE_GCC12_WARNINGS "") +set(CONFIG_COMPILER_DISABLE_GCC13_WARNINGS "") +set(CONFIG_COMPILER_DISABLE_GCC14_WARNINGS "") +set(CONFIG_COMPILER_DUMP_RTL_FILES "") +set(CONFIG_COMPILER_RT_LIB_GCCLIB "y") +set(CONFIG_COMPILER_RT_LIB_NAME "gcc") +set(CONFIG_COMPILER_ORPHAN_SECTIONS_WARNING "y") +set(CONFIG_COMPILER_ORPHAN_SECTIONS_PLACE "") +set(CONFIG_COMPILER_STATIC_ANALYZER "") +set(CONFIG_APPTRACE_DEST_JTAG "") +set(CONFIG_APPTRACE_DEST_NONE "y") +set(CONFIG_APPTRACE_DEST_UART1 "") +set(CONFIG_APPTRACE_DEST_UART2 "") +set(CONFIG_APPTRACE_DEST_UART_NONE "y") +set(CONFIG_APPTRACE_UART_TASK_PRIO "1") +set(CONFIG_APPTRACE_LOCK_ENABLE "y") +set(CONFIG_BT_ENABLED "") +set(CONFIG_BT_ALARM_MAX_NUM "50") +set(CONFIG_CONSOLE_SORTED_HELP "") +set(CONFIG_TWAI_ISR_IN_IRAM "") +set(CONFIG_TWAI_ERRATA_FIX_BUS_OFF_REC "y") +set(CONFIG_TWAI_ERRATA_FIX_TX_INTR_LOST "y") +set(CONFIG_TWAI_ERRATA_FIX_RX_FRAME_INVALID "y") +set(CONFIG_TWAI_ERRATA_FIX_RX_FIFO_CORRUPT "y") +set(CONFIG_TWAI_ERRATA_FIX_LISTEN_ONLY_DOM "y") +set(CONFIG_ADC_DISABLE_DAC "y") +set(CONFIG_ADC_SUPPRESS_DEPRECATE_WARN "") +set(CONFIG_ADC_SKIP_LEGACY_CONFLICT_CHECK "") +set(CONFIG_ADC_CAL_EFUSE_TP_ENABLE "y") +set(CONFIG_ADC_CAL_EFUSE_VREF_ENABLE "y") +set(CONFIG_ADC_CAL_LUT_ENABLE "y") +set(CONFIG_ADC_CALI_SUPPRESS_DEPRECATE_WARN "") +set(CONFIG_DAC_SUPPRESS_DEPRECATE_WARN "") +set(CONFIG_DAC_SKIP_LEGACY_CONFLICT_CHECK "") +set(CONFIG_MCPWM_SUPPRESS_DEPRECATE_WARN "") +set(CONFIG_MCPWM_SKIP_LEGACY_CONFLICT_CHECK "") +set(CONFIG_GPTIMER_SUPPRESS_DEPRECATE_WARN "") +set(CONFIG_GPTIMER_SKIP_LEGACY_CONFLICT_CHECK "") +set(CONFIG_RMT_SUPPRESS_DEPRECATE_WARN "") +set(CONFIG_RMT_SKIP_LEGACY_CONFLICT_CHECK "") +set(CONFIG_I2S_SUPPRESS_DEPRECATE_WARN "") +set(CONFIG_I2S_SKIP_LEGACY_CONFLICT_CHECK "") +set(CONFIG_PCNT_SUPPRESS_DEPRECATE_WARN "") +set(CONFIG_PCNT_SKIP_LEGACY_CONFLICT_CHECK "") +set(CONFIG_SDM_SUPPRESS_DEPRECATE_WARN "") +set(CONFIG_SDM_SKIP_LEGACY_CONFLICT_CHECK "") +set(CONFIG_EFUSE_CUSTOM_TABLE "") +set(CONFIG_EFUSE_VIRTUAL "") +set(CONFIG_EFUSE_CODE_SCHEME_COMPAT_NONE "") +set(CONFIG_EFUSE_CODE_SCHEME_COMPAT_3_4 "y") +set(CONFIG_EFUSE_CODE_SCHEME_COMPAT_REPEAT "") +set(CONFIG_EFUSE_MAX_BLK_LEN "192") +set(CONFIG_ESP_TLS_USING_MBEDTLS "y") +set(CONFIG_ESP_TLS_USE_SECURE_ELEMENT "") +set(CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS "") +set(CONFIG_ESP_TLS_SERVER_SESSION_TICKETS "") +set(CONFIG_ESP_TLS_SERVER_CERT_SELECT_HOOK "") +set(CONFIG_ESP_TLS_SERVER_MIN_AUTH_MODE_OPTIONAL "") +set(CONFIG_ESP_TLS_PSK_VERIFICATION "") +set(CONFIG_ESP_TLS_INSECURE "") +set(CONFIG_ADC_ONESHOT_CTRL_FUNC_IN_IRAM "") +set(CONFIG_ADC_CONTINUOUS_ISR_IRAM_SAFE "") +set(CONFIG_ADC_CALI_EFUSE_TP_ENABLE "y") +set(CONFIG_ADC_CALI_EFUSE_VREF_ENABLE "y") +set(CONFIG_ADC_CALI_LUT_ENABLE "y") +set(CONFIG_ADC_DISABLE_DAC_OUTPUT "y") +set(CONFIG_ADC_ENABLE_DEBUG_LOG "") +set(CONFIG_ESP_COEX_ENABLED "y") +set(CONFIG_ESP_COEX_GPIO_DEBUG "") +set(CONFIG_ESP_ERR_TO_NAME_LOOKUP "y") +set(CONFIG_DAC_CTRL_FUNC_IN_IRAM "") +set(CONFIG_DAC_ISR_IRAM_SAFE "") +set(CONFIG_DAC_ENABLE_DEBUG_LOG "") +set(CONFIG_DAC_DMA_AUTO_16BIT_ALIGN "y") +set(CONFIG_GPIO_ESP32_SUPPORT_SWITCH_SLP_PULL "") +set(CONFIG_GPIO_CTRL_FUNC_IN_IRAM "") +set(CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM "y") +set(CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM "") +set(CONFIG_GPTIMER_ISR_IRAM_SAFE "") +set(CONFIG_GPTIMER_ENABLE_DEBUG_LOG "") +set(CONFIG_I2C_ISR_IRAM_SAFE "") +set(CONFIG_I2C_ENABLE_DEBUG_LOG "") +set(CONFIG_I2C_ENABLE_SLAVE_DRIVER_VERSION_2 "") +set(CONFIG_I2S_ISR_IRAM_SAFE "") +set(CONFIG_I2S_ENABLE_DEBUG_LOG "") +set(CONFIG_LEDC_CTRL_FUNC_IN_IRAM "") +set(CONFIG_MCPWM_ISR_IRAM_SAFE "") +set(CONFIG_MCPWM_CTRL_FUNC_IN_IRAM "") +set(CONFIG_MCPWM_ENABLE_DEBUG_LOG "") +set(CONFIG_PCNT_CTRL_FUNC_IN_IRAM "") +set(CONFIG_PCNT_ISR_IRAM_SAFE "") +set(CONFIG_PCNT_ENABLE_DEBUG_LOG "") +set(CONFIG_RMT_ISR_IRAM_SAFE "") +set(CONFIG_RMT_RECV_FUNC_IN_IRAM "") +set(CONFIG_RMT_ENABLE_DEBUG_LOG "") +set(CONFIG_SDM_CTRL_FUNC_IN_IRAM "") +set(CONFIG_SDM_ENABLE_DEBUG_LOG "") +set(CONFIG_SPI_MASTER_IN_IRAM "") +set(CONFIG_SPI_MASTER_ISR_IN_IRAM "y") +set(CONFIG_SPI_SLAVE_IN_IRAM "") +set(CONFIG_SPI_SLAVE_ISR_IN_IRAM "y") +set(CONFIG_TOUCH_CTRL_FUNC_IN_IRAM "") +set(CONFIG_TOUCH_ISR_IRAM_SAFE "") +set(CONFIG_TOUCH_ENABLE_DEBUG_LOG "") +set(CONFIG_UART_ISR_IN_IRAM "") +set(CONFIG_ETH_ENABLED "y") +set(CONFIG_ETH_USE_ESP32_EMAC "y") +set(CONFIG_ETH_PHY_INTERFACE_RMII "y") +set(CONFIG_ETH_RMII_CLK_INPUT "y") +set(CONFIG_ETH_RMII_CLK_OUTPUT "") +set(CONFIG_ETH_RMII_CLK_IN_GPIO "0") +set(CONFIG_ETH_DMA_BUFFER_SIZE "512") +set(CONFIG_ETH_DMA_RX_BUFFER_NUM "10") +set(CONFIG_ETH_DMA_TX_BUFFER_NUM "10") +set(CONFIG_ETH_IRAM_OPTIMIZATION "") +set(CONFIG_ETH_USE_SPI_ETHERNET "y") +set(CONFIG_ETH_SPI_ETHERNET_DM9051 "") +set(CONFIG_ETH_SPI_ETHERNET_W5500 "") +set(CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL "") +set(CONFIG_ETH_USE_OPENETH "") +set(CONFIG_ETH_TRANSMIT_MUTEX "") +set(CONFIG_ESP_EVENT_LOOP_PROFILING "") +set(CONFIG_ESP_EVENT_POST_FROM_ISR "y") +set(CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR "y") +set(CONFIG_ESP_GDBSTUB_ENABLED "y") +set(CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME "") +set(CONFIG_ESP_GDBSTUB_SUPPORT_TASKS "y") +set(CONFIG_ESP_GDBSTUB_MAX_TASKS "32") +set(CONFIG_ESPHID_TASK_SIZE_BT "2048") +set(CONFIG_ESPHID_TASK_SIZE_BLE "4096") +set(CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS "y") +set(CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH "") +set(CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH "") +set(CONFIG_ESP_HTTP_CLIENT_ENABLE_CUSTOM_TRANSPORT "") +set(CONFIG_ESP_HTTP_CLIENT_EVENT_POST_TIMEOUT "2000") +set(CONFIG_HTTPD_MAX_REQ_HDR_LEN "512") +set(CONFIG_HTTPD_MAX_URI_LEN "512") +set(CONFIG_HTTPD_ERR_RESP_NO_DELAY "y") +set(CONFIG_HTTPD_PURGE_BUF_LEN "32") +set(CONFIG_HTTPD_LOG_PURGE_DATA "") +set(CONFIG_HTTPD_WS_SUPPORT "") +set(CONFIG_HTTPD_QUEUE_WORK_BLOCKING "") +set(CONFIG_HTTPD_SERVER_EVENT_POST_TIMEOUT "2000") +set(CONFIG_ESP_HTTPS_OTA_DECRYPT_CB "") +set(CONFIG_ESP_HTTPS_OTA_ALLOW_HTTP "") +set(CONFIG_ESP_HTTPS_OTA_EVENT_POST_TIMEOUT "2000") +set(CONFIG_ESP_HTTPS_SERVER_ENABLE "") +set(CONFIG_ESP_HTTPS_SERVER_EVENT_POST_TIMEOUT "2000") +set(CONFIG_ESP32_REV_MIN_0 "y") +set(CONFIG_ESP32_REV_MIN_1 "") +set(CONFIG_ESP32_REV_MIN_1_1 "") +set(CONFIG_ESP32_REV_MIN_2 "") +set(CONFIG_ESP32_REV_MIN_3 "") +set(CONFIG_ESP32_REV_MIN_3_1 "") +set(CONFIG_ESP32_REV_MIN "0") +set(CONFIG_ESP32_REV_MIN_FULL "0") +set(CONFIG_ESP_REV_MIN_FULL "0") +set(CONFIG_ESP32_REV_MAX_FULL "399") +set(CONFIG_ESP_REV_MAX_FULL "399") +set(CONFIG_ESP_EFUSE_BLOCK_REV_MIN_FULL "0") +set(CONFIG_ESP_EFUSE_BLOCK_REV_MAX_FULL "99") +set(CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA "y") +set(CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP "y") +set(CONFIG_ESP_MAC_ADDR_UNIVERSE_BT "y") +set(CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH "y") +set(CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR "y") +set(CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES "4") +set(CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_TWO "") +set(CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_FOUR "y") +set(CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES "4") +set(CONFIG_ESP_MAC_IGNORE_MAC_CRC_ERROR "") +set(CONFIG_ESP_MAC_USE_CUSTOM_MAC_AS_BASE_MAC "") +set(CONFIG_ESP_SLEEP_POWER_DOWN_FLASH "") +set(CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND "y") +set(CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU "") +set(CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND "y") +set(CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND "") +set(CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY "2000") +set(CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION "") +set(CONFIG_ESP_SLEEP_DEBUG "") +set(CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS "y") +set(CONFIG_RTC_CLK_SRC_INT_RC "y") +set(CONFIG_RTC_CLK_SRC_EXT_CRYS "") +set(CONFIG_RTC_CLK_SRC_EXT_OSC "") +set(CONFIG_RTC_CLK_SRC_INT_8MD256 "") +set(CONFIG_RTC_CLK_CAL_CYCLES "1024") +set(CONFIG_PERIPH_CTRL_FUNC_IN_IRAM "y") +set(CONFIG_XTAL_FREQ_26 "") +set(CONFIG_XTAL_FREQ_32 "") +set(CONFIG_XTAL_FREQ_40 "y") +set(CONFIG_XTAL_FREQ_AUTO "") +set(CONFIG_XTAL_FREQ "40") +set(CONFIG_ESP_SPI_BUS_LOCK_ISR_FUNCS_IN_IRAM "y") +set(CONFIG_LCD_ENABLE_DEBUG_LOG "") +set(CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL "120") +set(CONFIG_ESP_NETIF_PROVIDE_CUSTOM_IMPLEMENTATION "") +set(CONFIG_ESP_NETIF_TCPIP_LWIP "y") +set(CONFIG_ESP_NETIF_LOOPBACK "") +set(CONFIG_ESP_NETIF_USES_TCPIP_WITH_BSD_API "y") +set(CONFIG_ESP_NETIF_REPORT_DATA_TRAFFIC "y") +set(CONFIG_ESP_NETIF_RECEIVE_REPORT_ERRORS "") +set(CONFIG_ESP_NETIF_L2_TAP "") +set(CONFIG_ESP_NETIF_BRIDGE_EN "") +set(CONFIG_ESP_NETIF_SET_DNS_PER_DEFAULT_NETIF "") +set(CONFIG_ESP_PHY_ENABLED "y") +set(CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE "y") +set(CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION "") +set(CONFIG_ESP_PHY_MAX_WIFI_TX_POWER "20") +set(CONFIG_ESP_PHY_MAX_TX_POWER "20") +set(CONFIG_ESP_PHY_REDUCE_TX_POWER "") +set(CONFIG_ESP_PHY_ENABLE_CERT_TEST "") +set(CONFIG_ESP_PHY_RF_CAL_PARTIAL "y") +set(CONFIG_ESP_PHY_RF_CAL_NONE "") +set(CONFIG_ESP_PHY_RF_CAL_FULL "") +set(CONFIG_ESP_PHY_CALIBRATION_MODE "0") +set(CONFIG_ESP_PHY_PLL_TRACK_DEBUG "") +set(CONFIG_ESP_PHY_RECORD_USED_TIME "") +set(CONFIG_PM_ENABLE "") +set(CONFIG_PM_SLP_IRAM_OPT "") +set(CONFIG_SPIRAM "") +set(CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH "") +set(CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80 "") +set(CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160 "y") +set(CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240 "") +set(CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ "160") +set(CONFIG_ESP32_USE_FIXED_STATIC_RAM_SIZE "") +set(CONFIG_ESP_SYSTEM_ESP32_SRAM1_REGION_AS_IRAM "") +set(CONFIG_ESP32_TRAX "") +set(CONFIG_ESP32_TRACEMEM_RESERVE_DRAM "0x0") +set(CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT "") +set(CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT "y") +set(CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT "") +set(CONFIG_ESP_SYSTEM_PANIC_GDBSTUB "") +set(CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS "0") +set(CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE "32") +set(CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE "2304") +set(CONFIG_ESP_MAIN_TASK_STACK_SIZE "3584") +set(CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0 "y") +set(CONFIG_ESP_MAIN_TASK_AFFINITY_CPU1 "") +set(CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY "") +set(CONFIG_ESP_MAIN_TASK_AFFINITY "0x0") +set(CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE "2048") +set(CONFIG_ESP_CONSOLE_UART_DEFAULT "y") +set(CONFIG_ESP_CONSOLE_UART_CUSTOM "") +set(CONFIG_ESP_CONSOLE_NONE "") +set(CONFIG_ESP_CONSOLE_UART "y") +set(CONFIG_ESP_CONSOLE_UART_NUM "0") +set(CONFIG_ESP_CONSOLE_ROM_SERIAL_PORT_NUM "0") +set(CONFIG_ESP_CONSOLE_UART_BAUDRATE "115200") +set(CONFIG_ESP_INT_WDT "y") +set(CONFIG_ESP_INT_WDT_TIMEOUT_MS "300") +set(CONFIG_ESP_INT_WDT_CHECK_CPU1 "y") +set(CONFIG_ESP_TASK_WDT_EN "y") +set(CONFIG_ESP_TASK_WDT_INIT "y") +set(CONFIG_ESP_TASK_WDT_PANIC "") +set(CONFIG_ESP_TASK_WDT_TIMEOUT_S "5") +set(CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0 "y") +set(CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1 "y") +set(CONFIG_ESP_PANIC_HANDLER_IRAM "") +set(CONFIG_ESP_DEBUG_STUBS_ENABLE "") +set(CONFIG_ESP_DEBUG_OCDAWARE "y") +set(CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5 "") +set(CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4 "y") +set(CONFIG_ESP_BROWNOUT_DET "y") +set(CONFIG_ESP_BROWNOUT_DET_LVL_SEL_0 "y") +set(CONFIG_ESP_BROWNOUT_DET_LVL_SEL_1 "") +set(CONFIG_ESP_BROWNOUT_DET_LVL_SEL_2 "") +set(CONFIG_ESP_BROWNOUT_DET_LVL_SEL_3 "") +set(CONFIG_ESP_BROWNOUT_DET_LVL_SEL_4 "") +set(CONFIG_ESP_BROWNOUT_DET_LVL_SEL_5 "") +set(CONFIG_ESP_BROWNOUT_DET_LVL_SEL_6 "") +set(CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7 "") +set(CONFIG_ESP_BROWNOUT_DET_LVL "0") +set(CONFIG_ESP32_DISABLE_BASIC_ROM_CONSOLE "") +set(CONFIG_ESP_SYSTEM_BROWNOUT_INTR "y") +set(CONFIG_ESP_IPC_TASK_STACK_SIZE "1024") +set(CONFIG_ESP_IPC_USES_CALLERS_PRIORITY "y") +set(CONFIG_ESP_IPC_ISR_ENABLE "y") +set(CONFIG_ESP_TIMER_PROFILING "") +set(CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER "y") +set(CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER "y") +set(CONFIG_ESP_TIMER_TASK_STACK_SIZE "3584") +set(CONFIG_ESP_TIMER_INTERRUPT_LEVEL "1") +set(CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL "") +set(CONFIG_ESP_TIMER_TASK_AFFINITY "0x0") +set(CONFIG_ESP_TIMER_TASK_AFFINITY_CPU0 "y") +set(CONFIG_ESP_TIMER_ISR_AFFINITY_CPU0 "y") +set(CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD "") +set(CONFIG_ESP_TIMER_IMPL_TG0_LAC "y") +set(CONFIG_ESP_WIFI_ENABLED "y") +set(CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM "10") +set(CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM "32") +set(CONFIG_ESP_WIFI_STATIC_TX_BUFFER "") +set(CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER "y") +set(CONFIG_ESP_WIFI_TX_BUFFER_TYPE "1") +set(CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER_NUM "32") +set(CONFIG_ESP_WIFI_STATIC_RX_MGMT_BUFFER "y") +set(CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUFFER "") +set(CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF "0") +set(CONFIG_ESP_WIFI_RX_MGMT_BUF_NUM_DEF "5") +set(CONFIG_ESP_WIFI_CSI_ENABLED "") +set(CONFIG_ESP_WIFI_AMPDU_TX_ENABLED "y") +set(CONFIG_ESP_WIFI_TX_BA_WIN "6") +set(CONFIG_ESP_WIFI_AMPDU_RX_ENABLED "y") +set(CONFIG_ESP_WIFI_RX_BA_WIN "6") +set(CONFIG_ESP_WIFI_NVS_ENABLED "y") +set(CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_0 "y") +set(CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_1 "") +set(CONFIG_ESP_WIFI_SOFTAP_BEACON_MAX_LEN "752") +set(CONFIG_ESP_WIFI_MGMT_SBUF_NUM "32") +set(CONFIG_ESP_WIFI_IRAM_OPT "y") +set(CONFIG_ESP_WIFI_EXTRA_IRAM_OPT "") +set(CONFIG_ESP_WIFI_RX_IRAM_OPT "y") +set(CONFIG_ESP_WIFI_ENABLE_WPA3_SAE "y") +set(CONFIG_ESP_WIFI_ENABLE_SAE_PK "y") +set(CONFIG_ESP_WIFI_SOFTAP_SAE_SUPPORT "y") +set(CONFIG_ESP_WIFI_ENABLE_WPA3_OWE_STA "y") +set(CONFIG_ESP_WIFI_SLP_IRAM_OPT "") +set(CONFIG_ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME "50") +set(CONFIG_ESP_WIFI_SLP_DEFAULT_MAX_ACTIVE_TIME "10") +set(CONFIG_ESP_WIFI_SLP_DEFAULT_WAIT_BROADCAST_DATA_TIME "15") +set(CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE "y") +set(CONFIG_ESP_WIFI_GMAC_SUPPORT "y") +set(CONFIG_ESP_WIFI_SOFTAP_SUPPORT "y") +set(CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT "") +set(CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM "7") +set(CONFIG_ESP_WIFI_NAN_ENABLE "") +set(CONFIG_ESP_WIFI_MBEDTLS_CRYPTO "y") +set(CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT "y") +set(CONFIG_ESP_WIFI_WAPI_PSK "") +set(CONFIG_ESP_WIFI_11KV_SUPPORT "") +set(CONFIG_ESP_WIFI_MBO_SUPPORT "") +set(CONFIG_ESP_WIFI_DPP_SUPPORT "") +set(CONFIG_ESP_WIFI_11R_SUPPORT "") +set(CONFIG_ESP_WIFI_WPS_SOFTAP_REGISTRAR "") +set(CONFIG_ESP_WIFI_WPS_STRICT "") +set(CONFIG_ESP_WIFI_WPS_PASSPHRASE "") +set(CONFIG_ESP_WIFI_DEBUG_PRINT "") +set(CONFIG_ESP_WIFI_TESTING_OPTIONS "") +set(CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT "y") +set(CONFIG_ESP_WIFI_ENT_FREE_DYNAMIC_BUFFER "") +set(CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH "") +set(CONFIG_ESP_COREDUMP_ENABLE_TO_UART "") +set(CONFIG_ESP_COREDUMP_ENABLE_TO_NONE "y") +set(CONFIG_FATFS_VOLUME_COUNT "2") +set(CONFIG_FATFS_LFN_NONE "y") +set(CONFIG_FATFS_LFN_HEAP "") +set(CONFIG_FATFS_LFN_STACK "") +set(CONFIG_FATFS_SECTOR_512 "") +set(CONFIG_FATFS_SECTOR_4096 "y") +set(CONFIG_FATFS_CODEPAGE_DYNAMIC "") +set(CONFIG_FATFS_CODEPAGE_437 "y") +set(CONFIG_FATFS_CODEPAGE_720 "") +set(CONFIG_FATFS_CODEPAGE_737 "") +set(CONFIG_FATFS_CODEPAGE_771 "") +set(CONFIG_FATFS_CODEPAGE_775 "") +set(CONFIG_FATFS_CODEPAGE_850 "") +set(CONFIG_FATFS_CODEPAGE_852 "") +set(CONFIG_FATFS_CODEPAGE_855 "") +set(CONFIG_FATFS_CODEPAGE_857 "") +set(CONFIG_FATFS_CODEPAGE_860 "") +set(CONFIG_FATFS_CODEPAGE_861 "") +set(CONFIG_FATFS_CODEPAGE_862 "") +set(CONFIG_FATFS_CODEPAGE_863 "") +set(CONFIG_FATFS_CODEPAGE_864 "") +set(CONFIG_FATFS_CODEPAGE_865 "") +set(CONFIG_FATFS_CODEPAGE_866 "") +set(CONFIG_FATFS_CODEPAGE_869 "") +set(CONFIG_FATFS_CODEPAGE_932 "") +set(CONFIG_FATFS_CODEPAGE_936 "") +set(CONFIG_FATFS_CODEPAGE_949 "") +set(CONFIG_FATFS_CODEPAGE_950 "") +set(CONFIG_FATFS_CODEPAGE "437") +set(CONFIG_FATFS_FS_LOCK "0") +set(CONFIG_FATFS_TIMEOUT_MS "10000") +set(CONFIG_FATFS_PER_FILE_CACHE "y") +set(CONFIG_FATFS_USE_FASTSEEK "") +set(CONFIG_FATFS_USE_STRFUNC_NONE "y") +set(CONFIG_FATFS_USE_STRFUNC_WITHOUT_CRLF_CONV "") +set(CONFIG_FATFS_USE_STRFUNC_WITH_CRLF_CONV "") +set(CONFIG_FATFS_VFS_FSTAT_BLKSIZE "0") +set(CONFIG_FATFS_IMMEDIATE_FSYNC "") +set(CONFIG_FATFS_USE_LABEL "") +set(CONFIG_FATFS_LINK_LOCK "y") +set(CONFIG_FREERTOS_SMP "") +set(CONFIG_FREERTOS_UNICORE "") +set(CONFIG_FREERTOS_HZ "100") +set(CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE "") +set(CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL "") +set(CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY "y") +set(CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS "1") +set(CONFIG_FREERTOS_IDLE_TASK_STACKSIZE "1536") +set(CONFIG_FREERTOS_USE_IDLE_HOOK "") +set(CONFIG_FREERTOS_USE_TICK_HOOK "") +set(CONFIG_FREERTOS_MAX_TASK_NAME_LEN "16") +set(CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY "") +set(CONFIG_FREERTOS_USE_TIMERS "y") +set(CONFIG_FREERTOS_TIMER_SERVICE_TASK_NAME "Tmr Svc") +set(CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU0 "") +set(CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU1 "") +set(CONFIG_FREERTOS_TIMER_TASK_NO_AFFINITY "y") +set(CONFIG_FREERTOS_TIMER_SERVICE_TASK_CORE_AFFINITY "0x7fffffff") +set(CONFIG_FREERTOS_TIMER_TASK_PRIORITY "1") +set(CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH "2048") +set(CONFIG_FREERTOS_TIMER_QUEUE_LENGTH "10") +set(CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE "0") +set(CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES "1") +set(CONFIG_FREERTOS_USE_TRACE_FACILITY "") +set(CONFIG_FREERTOS_USE_LIST_DATA_INTEGRITY_CHECK_BYTES "") +set(CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS "") +set(CONFIG_FREERTOS_USE_APPLICATION_TASK_TAG "") +set(CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER "y") +set(CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK "") +set(CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS "y") +set(CONFIG_FREERTOS_TASK_PRE_DELETION_HOOK "") +set(CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP "") +set(CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER "y") +set(CONFIG_FREERTOS_ISR_STACKSIZE "1536") +set(CONFIG_FREERTOS_INTERRUPT_BACKTRACE "y") +set(CONFIG_FREERTOS_FPU_IN_ISR "") +set(CONFIG_FREERTOS_TICK_SUPPORT_CORETIMER "y") +set(CONFIG_FREERTOS_CORETIMER_0 "y") +set(CONFIG_FREERTOS_CORETIMER_1 "") +set(CONFIG_FREERTOS_SYSTICK_USES_CCOUNT "y") +set(CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH "") +set(CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE "") +set(CONFIG_FREERTOS_PORT "y") +set(CONFIG_FREERTOS_NO_AFFINITY "0x7fffffff") +set(CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION "y") +set(CONFIG_FREERTOS_DEBUG_OCDAWARE "y") +set(CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT "y") +set(CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH "y") +set(CONFIG_FREERTOS_NUMBER_OF_CORES "2") +set(CONFIG_HAL_ASSERTION_EQUALS_SYSTEM "y") +set(CONFIG_HAL_ASSERTION_DISABLE "") +set(CONFIG_HAL_ASSERTION_SILENT "") +set(CONFIG_HAL_ASSERTION_ENABLE "") +set(CONFIG_HAL_DEFAULT_ASSERTION_LEVEL "2") +set(CONFIG_HAL_SPI_MASTER_FUNC_IN_IRAM "y") +set(CONFIG_HAL_SPI_SLAVE_FUNC_IN_IRAM "y") +set(CONFIG_HEAP_POISONING_DISABLED "y") +set(CONFIG_HEAP_POISONING_LIGHT "") +set(CONFIG_HEAP_POISONING_COMPREHENSIVE "") +set(CONFIG_HEAP_TRACING_OFF "y") +set(CONFIG_HEAP_TRACING_STANDALONE "") +set(CONFIG_HEAP_TRACING_TOHOST "") +set(CONFIG_HEAP_USE_HOOKS "") +set(CONFIG_HEAP_TASK_TRACKING "") +set(CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS "") +set(CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH "") +set(CONFIG_LOG_DEFAULT_LEVEL_NONE "") +set(CONFIG_LOG_DEFAULT_LEVEL_ERROR "") +set(CONFIG_LOG_DEFAULT_LEVEL_WARN "") +set(CONFIG_LOG_DEFAULT_LEVEL_INFO "y") +set(CONFIG_LOG_DEFAULT_LEVEL_DEBUG "") +set(CONFIG_LOG_DEFAULT_LEVEL_VERBOSE "") +set(CONFIG_LOG_DEFAULT_LEVEL "3") +set(CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT "y") +set(CONFIG_LOG_MAXIMUM_LEVEL_DEBUG "") +set(CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE "") +set(CONFIG_LOG_MAXIMUM_LEVEL "3") +set(CONFIG_LOG_MASTER_LEVEL "") +set(CONFIG_LOG_DYNAMIC_LEVEL_CONTROL "y") +set(CONFIG_LOG_TAG_LEVEL_IMPL_NONE "") +set(CONFIG_LOG_TAG_LEVEL_IMPL_LINKED_LIST "") +set(CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_AND_LINKED_LIST "y") +set(CONFIG_LOG_TAG_LEVEL_CACHE_ARRAY "") +set(CONFIG_LOG_TAG_LEVEL_CACHE_BINARY_MIN_HEAP "y") +set(CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_SIZE "31") +set(CONFIG_LOG_COLORS "") +set(CONFIG_LOG_TIMESTAMP_SOURCE_RTOS "y") +set(CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM "") +set(CONFIG_LWIP_ENABLE "y") +set(CONFIG_LWIP_LOCAL_HOSTNAME "espressif") +set(CONFIG_LWIP_NETIF_API "") +set(CONFIG_LWIP_TCPIP_TASK_PRIO "18") +set(CONFIG_LWIP_TCPIP_CORE_LOCKING "") +set(CONFIG_LWIP_CHECK_THREAD_SAFETY "") +set(CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES "y") +set(CONFIG_LWIP_L2_TO_L3_COPY "") +set(CONFIG_LWIP_IRAM_OPTIMIZATION "") +set(CONFIG_LWIP_EXTRA_IRAM_OPTIMIZATION "") +set(CONFIG_LWIP_TIMERS_ONDEMAND "y") +set(CONFIG_LWIP_ND6 "y") +set(CONFIG_LWIP_FORCE_ROUTER_FORWARDING "") +set(CONFIG_LWIP_MAX_SOCKETS "10") +set(CONFIG_LWIP_USE_ONLY_LWIP_SELECT "") +set(CONFIG_LWIP_SO_LINGER "") +set(CONFIG_LWIP_SO_REUSE "y") +set(CONFIG_LWIP_SO_REUSE_RXTOALL "y") +set(CONFIG_LWIP_SO_RCVBUF "") +set(CONFIG_LWIP_NETBUF_RECVINFO "") +set(CONFIG_LWIP_IP_DEFAULT_TTL "64") +set(CONFIG_LWIP_IP4_FRAG "y") +set(CONFIG_LWIP_IP6_FRAG "y") +set(CONFIG_LWIP_IP4_REASSEMBLY "") +set(CONFIG_LWIP_IP6_REASSEMBLY "") +set(CONFIG_LWIP_IP_REASS_MAX_PBUFS "10") +set(CONFIG_LWIP_IP_FORWARD "") +set(CONFIG_LWIP_STATS "") +set(CONFIG_LWIP_ESP_GRATUITOUS_ARP "y") +set(CONFIG_LWIP_GARP_TMR_INTERVAL "60") +set(CONFIG_LWIP_ESP_MLDV6_REPORT "y") +set(CONFIG_LWIP_MLDV6_TMR_INTERVAL "40") +set(CONFIG_LWIP_TCPIP_RECVMBOX_SIZE "32") +set(CONFIG_LWIP_DHCP_DOES_ARP_CHECK "y") +set(CONFIG_LWIP_DHCP_DOES_ACD_CHECK "") +set(CONFIG_LWIP_DHCP_DOES_NOT_CHECK_OFFERED_IP "") +set(CONFIG_LWIP_DHCP_DISABLE_CLIENT_ID "") +set(CONFIG_LWIP_DHCP_DISABLE_VENDOR_CLASS_ID "y") +set(CONFIG_LWIP_DHCP_RESTORE_LAST_IP "") +set(CONFIG_LWIP_DHCP_OPTIONS_LEN "68") +set(CONFIG_LWIP_NUM_NETIF_CLIENT_DATA "0") +set(CONFIG_LWIP_DHCP_COARSE_TIMER_SECS "1") +set(CONFIG_LWIP_DHCPS "y") +set(CONFIG_LWIP_DHCPS_LEASE_UNIT "60") +set(CONFIG_LWIP_DHCPS_MAX_STATION_NUM "8") +set(CONFIG_LWIP_DHCPS_STATIC_ENTRIES "y") +set(CONFIG_LWIP_DHCPS_ADD_DNS "y") +set(CONFIG_LWIP_AUTOIP "") +set(CONFIG_LWIP_IPV4 "y") +set(CONFIG_LWIP_IPV6 "y") +set(CONFIG_LWIP_IPV6_AUTOCONFIG "") +set(CONFIG_LWIP_IPV6_NUM_ADDRESSES "3") +set(CONFIG_LWIP_IPV6_FORWARD "") +set(CONFIG_LWIP_NETIF_STATUS_CALLBACK "") +set(CONFIG_LWIP_NETIF_LOOPBACK "y") +set(CONFIG_LWIP_LOOPBACK_MAX_PBUFS "8") +set(CONFIG_LWIP_MAX_ACTIVE_TCP "16") +set(CONFIG_LWIP_MAX_LISTENING_TCP "16") +set(CONFIG_LWIP_TCP_HIGH_SPEED_RETRANSMISSION "y") +set(CONFIG_LWIP_TCP_MAXRTX "12") +set(CONFIG_LWIP_TCP_SYNMAXRTX "12") +set(CONFIG_LWIP_TCP_MSS "1440") +set(CONFIG_LWIP_TCP_TMR_INTERVAL "250") +set(CONFIG_LWIP_TCP_MSL "60000") +set(CONFIG_LWIP_TCP_FIN_WAIT_TIMEOUT "20000") +set(CONFIG_LWIP_TCP_SND_BUF_DEFAULT "5760") +set(CONFIG_LWIP_TCP_WND_DEFAULT "5760") +set(CONFIG_LWIP_TCP_RECVMBOX_SIZE "6") +set(CONFIG_LWIP_TCP_ACCEPTMBOX_SIZE "6") +set(CONFIG_LWIP_TCP_QUEUE_OOSEQ "y") +set(CONFIG_LWIP_TCP_OOSEQ_TIMEOUT "6") +set(CONFIG_LWIP_TCP_OOSEQ_MAX_PBUFS "4") +set(CONFIG_LWIP_TCP_SACK_OUT "") +set(CONFIG_LWIP_TCP_OVERSIZE_MSS "y") +set(CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS "") +set(CONFIG_LWIP_TCP_OVERSIZE_DISABLE "") +set(CONFIG_LWIP_TCP_RTO_TIME "1500") +set(CONFIG_LWIP_MAX_UDP_PCBS "16") +set(CONFIG_LWIP_UDP_RECVMBOX_SIZE "6") +set(CONFIG_LWIP_CHECKSUM_CHECK_IP "") +set(CONFIG_LWIP_CHECKSUM_CHECK_UDP "") +set(CONFIG_LWIP_CHECKSUM_CHECK_ICMP "y") +set(CONFIG_LWIP_TCPIP_TASK_STACK_SIZE "3072") +set(CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY "y") +set(CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 "") +set(CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU1 "") +set(CONFIG_LWIP_TCPIP_TASK_AFFINITY "0x7fffffff") +set(CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE "3") +set(CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS "5") +set(CONFIG_LWIP_IPV6_ND6_NUM_PREFIXES "5") +set(CONFIG_LWIP_IPV6_ND6_NUM_ROUTERS "3") +set(CONFIG_LWIP_IPV6_ND6_NUM_DESTINATIONS "10") +set(CONFIG_LWIP_PPP_SUPPORT "") +set(CONFIG_LWIP_SLIP_SUPPORT "") +set(CONFIG_LWIP_ICMP "y") +set(CONFIG_LWIP_MULTICAST_PING "") +set(CONFIG_LWIP_BROADCAST_PING "") +set(CONFIG_LWIP_MAX_RAW_PCBS "16") +set(CONFIG_LWIP_SNTP_MAX_SERVERS "1") +set(CONFIG_LWIP_DHCP_GET_NTP_SRV "") +set(CONFIG_LWIP_SNTP_UPDATE_DELAY "3600000") +set(CONFIG_LWIP_SNTP_STARTUP_DELAY "y") +set(CONFIG_LWIP_SNTP_MAXIMUM_STARTUP_DELAY "5000") +set(CONFIG_LWIP_DNS_MAX_HOST_IP "1") +set(CONFIG_LWIP_DNS_MAX_SERVERS "3") +set(CONFIG_LWIP_FALLBACK_DNS_SERVER_SUPPORT "") +set(CONFIG_LWIP_DNS_SETSERVER_WITH_NETIF "") +set(CONFIG_LWIP_BRIDGEIF_MAX_PORTS "7") +set(CONFIG_LWIP_ESP_LWIP_ASSERT "y") +set(CONFIG_LWIP_HOOK_TCP_ISN_NONE "") +set(CONFIG_LWIP_HOOK_TCP_ISN_DEFAULT "y") +set(CONFIG_LWIP_HOOK_TCP_ISN_CUSTOM "") +set(CONFIG_LWIP_HOOK_IP6_ROUTE_NONE "y") +set(CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT "") +set(CONFIG_LWIP_HOOK_IP6_ROUTE_CUSTOM "") +set(CONFIG_LWIP_HOOK_ND6_GET_GW_NONE "y") +set(CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT "") +set(CONFIG_LWIP_HOOK_ND6_GET_GW_CUSTOM "") +set(CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_NONE "y") +set(CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_DEFAULT "") +set(CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM "") +set(CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE "y") +set(CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT "") +set(CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM "") +set(CONFIG_LWIP_HOOK_DNS_EXT_RESOLVE_NONE "y") +set(CONFIG_LWIP_HOOK_DNS_EXT_RESOLVE_CUSTOM "") +set(CONFIG_LWIP_HOOK_IP6_INPUT_NONE "") +set(CONFIG_LWIP_HOOK_IP6_INPUT_DEFAULT "y") +set(CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM "") +set(CONFIG_LWIP_DEBUG "") +set(CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC "y") +set(CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC "") +set(CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC "") +set(CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN "y") +set(CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN "16384") +set(CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN "4096") +set(CONFIG_MBEDTLS_DYNAMIC_BUFFER "") +set(CONFIG_MBEDTLS_DEBUG "") +set(CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 "") +set(CONFIG_MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH "") +set(CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK "") +set(CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION "") +set(CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE "y") +set(CONFIG_MBEDTLS_PKCS7_C "y") +set(CONFIG_MBEDTLS_CERTIFICATE_BUNDLE "y") +set(CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL "y") +set(CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN "") +set(CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE "") +set(CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE "") +set(CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEPRECATED_LIST "") +set(CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS "200") +set(CONFIG_MBEDTLS_ECP_RESTARTABLE "") +set(CONFIG_MBEDTLS_CMAC_C "y") +set(CONFIG_MBEDTLS_HARDWARE_AES "y") +set(CONFIG_MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER "y") +set(CONFIG_MBEDTLS_HARDWARE_MPI "y") +set(CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI "") +set(CONFIG_MBEDTLS_HARDWARE_SHA "y") +set(CONFIG_MBEDTLS_ROM_MD5 "y") +set(CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN "") +set(CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY "") +set(CONFIG_MBEDTLS_HAVE_TIME "y") +set(CONFIG_MBEDTLS_PLATFORM_TIME_ALT "") +set(CONFIG_MBEDTLS_HAVE_TIME_DATE "") +set(CONFIG_MBEDTLS_ECDSA_DETERMINISTIC "y") +set(CONFIG_MBEDTLS_SHA512_C "y") +set(CONFIG_MBEDTLS_SHA3_C "") +set(CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT "y") +set(CONFIG_MBEDTLS_TLS_SERVER_ONLY "") +set(CONFIG_MBEDTLS_TLS_CLIENT_ONLY "") +set(CONFIG_MBEDTLS_TLS_DISABLED "") +set(CONFIG_MBEDTLS_TLS_SERVER "y") +set(CONFIG_MBEDTLS_TLS_CLIENT "y") +set(CONFIG_MBEDTLS_TLS_ENABLED "y") +set(CONFIG_MBEDTLS_PSK_MODES "") +set(CONFIG_MBEDTLS_KEY_EXCHANGE_RSA "y") +set(CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE "y") +set(CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA "y") +set(CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA "y") +set(CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA "y") +set(CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA "y") +set(CONFIG_MBEDTLS_SSL_RENEGOTIATION "y") +set(CONFIG_MBEDTLS_SSL_PROTO_TLS1_2 "y") +set(CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 "") +set(CONFIG_MBEDTLS_SSL_PROTO_DTLS "") +set(CONFIG_MBEDTLS_SSL_ALPN "y") +set(CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS "y") +set(CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS "y") +set(CONFIG_MBEDTLS_AES_C "y") +set(CONFIG_MBEDTLS_CAMELLIA_C "") +set(CONFIG_MBEDTLS_DES_C "") +set(CONFIG_MBEDTLS_BLOWFISH_C "") +set(CONFIG_MBEDTLS_XTEA_C "") +set(CONFIG_MBEDTLS_CCM_C "y") +set(CONFIG_MBEDTLS_GCM_C "y") +set(CONFIG_MBEDTLS_NIST_KW_C "") +set(CONFIG_MBEDTLS_RIPEMD160_C "") +set(CONFIG_MBEDTLS_PEM_PARSE_C "y") +set(CONFIG_MBEDTLS_PEM_WRITE_C "y") +set(CONFIG_MBEDTLS_X509_CRL_PARSE_C "y") +set(CONFIG_MBEDTLS_X509_CSR_PARSE_C "y") +set(CONFIG_MBEDTLS_ECP_C "y") +set(CONFIG_MBEDTLS_PK_PARSE_EC_EXTENDED "y") +set(CONFIG_MBEDTLS_PK_PARSE_EC_COMPRESSED "y") +set(CONFIG_MBEDTLS_DHM_C "") +set(CONFIG_MBEDTLS_ECDH_C "y") +set(CONFIG_MBEDTLS_ECDSA_C "y") +set(CONFIG_MBEDTLS_ECJPAKE_C "") +set(CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED "y") +set(CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED "y") +set(CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED "y") +set(CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED "y") +set(CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED "y") +set(CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED "y") +set(CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED "y") +set(CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED "y") +set(CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED "y") +set(CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED "y") +set(CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED "y") +set(CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED "y") +set(CONFIG_MBEDTLS_ECP_NIST_OPTIM "y") +set(CONFIG_MBEDTLS_ECP_FIXED_POINT_OPTIM "") +set(CONFIG_MBEDTLS_POLY1305_C "") +set(CONFIG_MBEDTLS_CHACHA20_C "") +set(CONFIG_MBEDTLS_HKDF_C "") +set(CONFIG_MBEDTLS_THREADING_C "") +set(CONFIG_MBEDTLS_ERROR_STRINGS "y") +set(CONFIG_MBEDTLS_FS_IO "y") +set(CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF "y") +set(CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF "") +set(CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR "") +set(CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF "") +set(CONFIG_NEWLIB_STDIN_LINE_ENDING_LF "") +set(CONFIG_NEWLIB_STDIN_LINE_ENDING_CR "y") +set(CONFIG_NEWLIB_NANO_FORMAT "") +set(CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT "y") +set(CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC "") +set(CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT "") +set(CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE "") +set(CONFIG_NVS_ASSERT_ERROR_CHECK "") +set(CONFIG_NVS_LEGACY_DUP_KEYS_COMPATIBILITY "") +set(CONFIG_OPENTHREAD_ENABLED "") +set(CONFIG_OPENTHREAD_SPINEL_ONLY "") +set(CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_0 "y") +set(CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_1 "y") +set(CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_2 "y") +set(CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_PATCH_VERSION "y") +set(CONFIG_PTHREAD_TASK_PRIO_DEFAULT "5") +set(CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT "3072") +set(CONFIG_PTHREAD_STACK_MIN "768") +set(CONFIG_PTHREAD_DEFAULT_CORE_NO_AFFINITY "y") +set(CONFIG_PTHREAD_DEFAULT_CORE_0 "") +set(CONFIG_PTHREAD_DEFAULT_CORE_1 "") +set(CONFIG_PTHREAD_TASK_CORE_DEFAULT "-1") +set(CONFIG_PTHREAD_TASK_NAME_DEFAULT "pthread") +set(CONFIG_MMU_PAGE_SIZE_64KB "y") +set(CONFIG_MMU_PAGE_MODE "64KB") +set(CONFIG_MMU_PAGE_SIZE "0x10000") +set(CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC "y") +set(CONFIG_SPI_FLASH_BROWNOUT_RESET "y") +set(CONFIG_SPI_FLASH_SUSPEND_TSUS_VAL_US "50") +set(CONFIG_SPI_FLASH_FORCE_ENABLE_XMC_C_SUSPEND "") +set(CONFIG_SPI_FLASH_VERIFY_WRITE "") +set(CONFIG_SPI_FLASH_ENABLE_COUNTERS "") +set(CONFIG_SPI_FLASH_ROM_DRIVER_PATCH "y") +set(CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS "y") +set(CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS "") +set(CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED "") +set(CONFIG_SPI_FLASH_SHARE_SPI1_BUS "") +set(CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE "") +set(CONFIG_SPI_FLASH_YIELD_DURING_ERASE "y") +set(CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS "20") +set(CONFIG_SPI_FLASH_ERASE_YIELD_TICKS "1") +set(CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE "8192") +set(CONFIG_SPI_FLASH_SIZE_OVERRIDE "") +set(CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED "") +set(CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST "") +set(CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORTED "y") +set(CONFIG_SPI_FLASH_VENDOR_GD_SUPPORTED "y") +set(CONFIG_SPI_FLASH_VENDOR_ISSI_SUPPORTED "y") +set(CONFIG_SPI_FLASH_VENDOR_MXIC_SUPPORTED "y") +set(CONFIG_SPI_FLASH_VENDOR_WINBOND_SUPPORTED "y") +set(CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP "y") +set(CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP "y") +set(CONFIG_SPI_FLASH_SUPPORT_GD_CHIP "y") +set(CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP "y") +set(CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP "") +set(CONFIG_SPI_FLASH_SUPPORT_TH_CHIP "") +set(CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE "y") +set(CONFIG_SPIFFS_MAX_PARTITIONS "3") +set(CONFIG_SPIFFS_CACHE "y") +set(CONFIG_SPIFFS_CACHE_WR "y") +set(CONFIG_SPIFFS_CACHE_STATS "") +set(CONFIG_SPIFFS_PAGE_CHECK "y") +set(CONFIG_SPIFFS_GC_MAX_RUNS "10") +set(CONFIG_SPIFFS_GC_STATS "") +set(CONFIG_SPIFFS_PAGE_SIZE "256") +set(CONFIG_SPIFFS_OBJ_NAME_LEN "32") +set(CONFIG_SPIFFS_FOLLOW_SYMLINKS "") +set(CONFIG_SPIFFS_USE_MAGIC "y") +set(CONFIG_SPIFFS_USE_MAGIC_LENGTH "y") +set(CONFIG_SPIFFS_META_LENGTH "4") +set(CONFIG_SPIFFS_USE_MTIME "y") +set(CONFIG_SPIFFS_DBG "") +set(CONFIG_SPIFFS_API_DBG "") +set(CONFIG_SPIFFS_GC_DBG "") +set(CONFIG_SPIFFS_CACHE_DBG "") +set(CONFIG_SPIFFS_CHECK_DBG "") +set(CONFIG_SPIFFS_TEST_VISUALISATION "") +set(CONFIG_WS_TRANSPORT "y") +set(CONFIG_WS_BUFFER_SIZE "1024") +set(CONFIG_WS_DYNAMIC_BUFFER "") +set(CONFIG_ULP_COPROC_ENABLED "") +set(CONFIG_UNITY_ENABLE_FLOAT "y") +set(CONFIG_UNITY_ENABLE_DOUBLE "y") +set(CONFIG_UNITY_ENABLE_64BIT "") +set(CONFIG_UNITY_ENABLE_COLOR "") +set(CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER "y") +set(CONFIG_UNITY_ENABLE_FIXTURE "") +set(CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL "") +set(CONFIG_VFS_SUPPORT_IO "y") +set(CONFIG_VFS_SUPPORT_DIR "y") +set(CONFIG_VFS_SUPPORT_SELECT "y") +set(CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT "y") +set(CONFIG_VFS_SELECT_IN_RAM "") +set(CONFIG_VFS_SUPPORT_TERMIOS "y") +set(CONFIG_VFS_MAX_COUNT "8") +set(CONFIG_VFS_SEMIHOSTFS_MAX_MOUNT_POINTS "1") +set(CONFIG_VFS_INITIALIZE_DEV_NULL "y") +set(CONFIG_WL_SECTOR_SIZE_512 "") +set(CONFIG_WL_SECTOR_SIZE_4096 "y") +set(CONFIG_WL_SECTOR_SIZE "4096") +set(CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES "16") +set(CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT "30") +set(CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN "y") +set(CONFIG_WIFI_PROV_STA_FAST_SCAN "") +set(CONFIG_CU_RELINKER_ENABLE "") +set(CONFIG_CU_DIAGNOSTICS_COLOR_NEVER "") +set(CONFIG_CU_DIAGNOSTICS_COLOR_ALWAYS "y") +set(CONFIG_CU_DIAGNOSTICS_COLOR_AUTO "") +set(CONFIG_CU_GCC_LTO_ENABLE "") +set(CONFIG_CU_GCC_STRING_1BYTE_ALIGN "") +set(CONFIG_I2C_BUS_DYNAMIC_CONFIG "y") +set(CONFIG_I2C_MS_TO_WAIT "200") +set(CONFIG_I2C_BUS_BACKWARD_CONFIG "") +set(CONFIG_I2C_BUS_SUPPORT_SOFTWARE "") +set(CONFIG_I2C_BUS_REMOVE_NULL_MEM_ADDR "") +set(CONFIG_MQTT_PROTOCOL_311 "y") +set(CONFIG_MQTT_PROTOCOL_5 "") +set(CONFIG_MQTT_TRANSPORT_SSL "y") +set(CONFIG_MQTT_TRANSPORT_WEBSOCKET "y") +set(CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE "y") +set(CONFIG_MQTT_MSG_ID_INCREMENTAL "") +set(CONFIG_MQTT_SKIP_PUBLISH_IF_DISCONNECTED "") +set(CONFIG_MQTT_REPORT_DELETED_MESSAGES "") +set(CONFIG_MQTT_USE_CUSTOM_CONFIG "") +set(CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED "") +set(CONFIG_MQTT_CUSTOM_OUTBOX "") +set(CONFIG_IDF_EXPERIMENTAL_FEATURES "") +set(CONFIGS_LIST CONFIG_SOC_BROWNOUT_RESET_SUPPORTED;CONFIG_SOC_TWAI_BRP_DIV_SUPPORTED;CONFIG_SOC_DPORT_WORKAROUND;CONFIG_SOC_CAPS_ECO_VER_MAX;CONFIG_SOC_ADC_SUPPORTED;CONFIG_SOC_DAC_SUPPORTED;CONFIG_SOC_UART_SUPPORTED;CONFIG_SOC_MCPWM_SUPPORTED;CONFIG_SOC_GPTIMER_SUPPORTED;CONFIG_SOC_SDMMC_HOST_SUPPORTED;CONFIG_SOC_BT_SUPPORTED;CONFIG_SOC_PCNT_SUPPORTED;CONFIG_SOC_PHY_SUPPORTED;CONFIG_SOC_WIFI_SUPPORTED;CONFIG_SOC_SDIO_SLAVE_SUPPORTED;CONFIG_SOC_TWAI_SUPPORTED;CONFIG_SOC_EFUSE_SUPPORTED;CONFIG_SOC_EMAC_SUPPORTED;CONFIG_SOC_ULP_SUPPORTED;CONFIG_SOC_CCOMP_TIMER_SUPPORTED;CONFIG_SOC_RTC_FAST_MEM_SUPPORTED;CONFIG_SOC_RTC_SLOW_MEM_SUPPORTED;CONFIG_SOC_RTC_MEM_SUPPORTED;CONFIG_SOC_I2S_SUPPORTED;CONFIG_SOC_RMT_SUPPORTED;CONFIG_SOC_SDM_SUPPORTED;CONFIG_SOC_GPSPI_SUPPORTED;CONFIG_SOC_LEDC_SUPPORTED;CONFIG_SOC_I2C_SUPPORTED;CONFIG_SOC_SUPPORT_COEXISTENCE;CONFIG_SOC_AES_SUPPORTED;CONFIG_SOC_MPI_SUPPORTED;CONFIG_SOC_SHA_SUPPORTED;CONFIG_SOC_FLASH_ENC_SUPPORTED;CONFIG_SOC_SECURE_BOOT_SUPPORTED;CONFIG_SOC_TOUCH_SENSOR_SUPPORTED;CONFIG_SOC_BOD_SUPPORTED;CONFIG_SOC_ULP_FSM_SUPPORTED;CONFIG_SOC_CLK_TREE_SUPPORTED;CONFIG_SOC_MPU_SUPPORTED;CONFIG_SOC_WDT_SUPPORTED;CONFIG_SOC_SPI_FLASH_SUPPORTED;CONFIG_SOC_RNG_SUPPORTED;CONFIG_SOC_LIGHT_SLEEP_SUPPORTED;CONFIG_SOC_DEEP_SLEEP_SUPPORTED;CONFIG_SOC_LP_PERIPH_SHARE_INTERRUPT;CONFIG_SOC_PM_SUPPORTED;CONFIG_SOC_DPORT_WORKAROUND_DIS_INTERRUPT_LVL;CONFIG_SOC_XTAL_SUPPORT_26M;CONFIG_SOC_XTAL_SUPPORT_40M;CONFIG_SOC_XTAL_SUPPORT_AUTO_DETECT;CONFIG_SOC_ADC_RTC_CTRL_SUPPORTED;CONFIG_SOC_ADC_DIG_CTRL_SUPPORTED;CONFIG_SOC_ADC_DMA_SUPPORTED;CONFIG_SOC_ADC_PERIPH_NUM;CONFIG_SOC_ADC_MAX_CHANNEL_NUM;CONFIG_SOC_ADC_ATTEN_NUM;CONFIG_SOC_ADC_DIGI_CONTROLLER_NUM;CONFIG_SOC_ADC_PATT_LEN_MAX;CONFIG_SOC_ADC_DIGI_MIN_BITWIDTH;CONFIG_SOC_ADC_DIGI_MAX_BITWIDTH;CONFIG_SOC_ADC_DIGI_RESULT_BYTES;CONFIG_SOC_ADC_DIGI_DATA_BYTES_PER_CONV;CONFIG_SOC_ADC_DIGI_MONITOR_NUM;CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH;CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW;CONFIG_SOC_ADC_RTC_MIN_BITWIDTH;CONFIG_SOC_ADC_RTC_MAX_BITWIDTH;CONFIG_SOC_ADC_SHARED_POWER;CONFIG_SOC_SHARED_IDCACHE_SUPPORTED;CONFIG_SOC_IDCACHE_PER_CORE;CONFIG_SOC_CPU_CORES_NUM;CONFIG_SOC_CPU_INTR_NUM;CONFIG_SOC_CPU_HAS_FPU;CONFIG_SOC_HP_CPU_HAS_MULTIPLE_CORES;CONFIG_SOC_CPU_BREAKPOINTS_NUM;CONFIG_SOC_CPU_WATCHPOINTS_NUM;CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE;CONFIG_SOC_DAC_CHAN_NUM;CONFIG_SOC_DAC_RESOLUTION;CONFIG_SOC_DAC_DMA_16BIT_ALIGN;CONFIG_SOC_GPIO_PORT;CONFIG_SOC_GPIO_PIN_COUNT;CONFIG_SOC_GPIO_VALID_GPIO_MASK;CONFIG_SOC_GPIO_IN_RANGE_MAX;CONFIG_SOC_GPIO_OUT_RANGE_MAX;CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK;CONFIG_SOC_GPIO_CLOCKOUT_BY_IO_MUX;CONFIG_SOC_GPIO_CLOCKOUT_CHANNEL_NUM;CONFIG_SOC_GPIO_SUPPORT_HOLD_IO_IN_DSLP;CONFIG_SOC_I2C_NUM;CONFIG_SOC_HP_I2C_NUM;CONFIG_SOC_I2C_FIFO_LEN;CONFIG_SOC_I2C_CMD_REG_NUM;CONFIG_SOC_I2C_SUPPORT_SLAVE;CONFIG_SOC_I2C_SUPPORT_APB;CONFIG_SOC_I2C_SUPPORT_10BIT_ADDR;CONFIG_SOC_I2C_STOP_INDEPENDENT;CONFIG_SOC_I2S_NUM;CONFIG_SOC_I2S_HW_VERSION_1;CONFIG_SOC_I2S_SUPPORTS_APLL;CONFIG_SOC_I2S_SUPPORTS_PLL_F160M;CONFIG_SOC_I2S_SUPPORTS_PDM;CONFIG_SOC_I2S_SUPPORTS_PDM_TX;CONFIG_SOC_I2S_PDM_MAX_TX_LINES;CONFIG_SOC_I2S_SUPPORTS_PDM_RX;CONFIG_SOC_I2S_PDM_MAX_RX_LINES;CONFIG_SOC_I2S_SUPPORTS_ADC_DAC;CONFIG_SOC_I2S_SUPPORTS_ADC;CONFIG_SOC_I2S_SUPPORTS_DAC;CONFIG_SOC_I2S_SUPPORTS_LCD_CAMERA;CONFIG_SOC_I2S_MAX_DATA_WIDTH;CONFIG_SOC_I2S_TRANS_SIZE_ALIGN_WORD;CONFIG_SOC_I2S_LCD_I80_VARIANT;CONFIG_SOC_LCD_I80_SUPPORTED;CONFIG_SOC_LCD_I80_BUSES;CONFIG_SOC_LCD_I80_BUS_WIDTH;CONFIG_SOC_LEDC_HAS_TIMER_SPECIFIC_MUX;CONFIG_SOC_LEDC_SUPPORT_APB_CLOCK;CONFIG_SOC_LEDC_SUPPORT_REF_TICK;CONFIG_SOC_LEDC_SUPPORT_HS_MODE;CONFIG_SOC_LEDC_TIMER_NUM;CONFIG_SOC_LEDC_CHANNEL_NUM;CONFIG_SOC_LEDC_TIMER_BIT_WIDTH;CONFIG_SOC_MCPWM_GROUPS;CONFIG_SOC_MCPWM_TIMERS_PER_GROUP;CONFIG_SOC_MCPWM_OPERATORS_PER_GROUP;CONFIG_SOC_MCPWM_COMPARATORS_PER_OPERATOR;CONFIG_SOC_MCPWM_GENERATORS_PER_OPERATOR;CONFIG_SOC_MCPWM_TRIGGERS_PER_OPERATOR;CONFIG_SOC_MCPWM_GPIO_FAULTS_PER_GROUP;CONFIG_SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP;CONFIG_SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER;CONFIG_SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP;CONFIG_SOC_MMU_PERIPH_NUM;CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM;CONFIG_SOC_MPU_MIN_REGION_SIZE;CONFIG_SOC_MPU_REGIONS_MAX_NUM;CONFIG_SOC_PCNT_GROUPS;CONFIG_SOC_PCNT_UNITS_PER_GROUP;CONFIG_SOC_PCNT_CHANNELS_PER_UNIT;CONFIG_SOC_PCNT_THRES_POINT_PER_UNIT;CONFIG_SOC_RMT_GROUPS;CONFIG_SOC_RMT_TX_CANDIDATES_PER_GROUP;CONFIG_SOC_RMT_RX_CANDIDATES_PER_GROUP;CONFIG_SOC_RMT_CHANNELS_PER_GROUP;CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL;CONFIG_SOC_RMT_SUPPORT_REF_TICK;CONFIG_SOC_RMT_SUPPORT_APB;CONFIG_SOC_RMT_CHANNEL_CLK_INDEPENDENT;CONFIG_SOC_RTCIO_PIN_COUNT;CONFIG_SOC_RTCIO_INPUT_OUTPUT_SUPPORTED;CONFIG_SOC_RTCIO_HOLD_SUPPORTED;CONFIG_SOC_RTCIO_WAKE_SUPPORTED;CONFIG_SOC_SDM_GROUPS;CONFIG_SOC_SDM_CHANNELS_PER_GROUP;CONFIG_SOC_SDM_CLK_SUPPORT_APB;CONFIG_SOC_SPI_HD_BOTH_INOUT_SUPPORTED;CONFIG_SOC_SPI_AS_CS_SUPPORTED;CONFIG_SOC_SPI_PERIPH_NUM;CONFIG_SOC_SPI_DMA_CHAN_NUM;CONFIG_SOC_SPI_MAX_CS_NUM;CONFIG_SOC_SPI_SUPPORT_CLK_APB;CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE;CONFIG_SOC_SPI_MAX_PRE_DIVIDER;CONFIG_SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED;CONFIG_SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED;CONFIG_SOC_MEMSPI_SRC_FREQ_26M_SUPPORTED;CONFIG_SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED;CONFIG_SOC_TIMER_GROUPS;CONFIG_SOC_TIMER_GROUP_TIMERS_PER_GROUP;CONFIG_SOC_TIMER_GROUP_COUNTER_BIT_WIDTH;CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS;CONFIG_SOC_TIMER_GROUP_SUPPORT_APB;CONFIG_SOC_LP_TIMER_BIT_WIDTH_LO;CONFIG_SOC_LP_TIMER_BIT_WIDTH_HI;CONFIG_SOC_TOUCH_SENSOR_VERSION;CONFIG_SOC_TOUCH_SENSOR_NUM;CONFIG_SOC_TOUCH_SAMPLE_CFG_NUM;CONFIG_SOC_TWAI_CONTROLLER_NUM;CONFIG_SOC_TWAI_BRP_MIN;CONFIG_SOC_TWAI_CLK_SUPPORT_APB;CONFIG_SOC_TWAI_SUPPORT_MULTI_ADDRESS_LAYOUT;CONFIG_SOC_UART_NUM;CONFIG_SOC_UART_HP_NUM;CONFIG_SOC_UART_SUPPORT_APB_CLK;CONFIG_SOC_UART_SUPPORT_REF_TICK;CONFIG_SOC_UART_FIFO_LEN;CONFIG_SOC_UART_BITRATE_MAX;CONFIG_SOC_SPIRAM_SUPPORTED;CONFIG_SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE;CONFIG_SOC_SHA_SUPPORT_PARALLEL_ENG;CONFIG_SOC_SHA_ENDIANNESS_BE;CONFIG_SOC_SHA_SUPPORT_SHA1;CONFIG_SOC_SHA_SUPPORT_SHA256;CONFIG_SOC_SHA_SUPPORT_SHA384;CONFIG_SOC_SHA_SUPPORT_SHA512;CONFIG_SOC_MPI_MEM_BLOCKS_NUM;CONFIG_SOC_MPI_OPERATIONS_NUM;CONFIG_SOC_RSA_MAX_BIT_LEN;CONFIG_SOC_AES_SUPPORT_AES_128;CONFIG_SOC_AES_SUPPORT_AES_192;CONFIG_SOC_AES_SUPPORT_AES_256;CONFIG_SOC_SECURE_BOOT_V1;CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS;CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX;CONFIG_SOC_PHY_DIG_REGS_MEM_SIZE;CONFIG_SOC_PM_SUPPORT_EXT0_WAKEUP;CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP;CONFIG_SOC_PM_SUPPORT_EXT_WAKEUP;CONFIG_SOC_PM_SUPPORT_TOUCH_SENSOR_WAKEUP;CONFIG_SOC_PM_SUPPORT_RTC_PERIPH_PD;CONFIG_SOC_PM_SUPPORT_RTC_FAST_MEM_PD;CONFIG_SOC_PM_SUPPORT_RTC_SLOW_MEM_PD;CONFIG_SOC_PM_SUPPORT_RC_FAST_PD;CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD;CONFIG_SOC_PM_SUPPORT_MODEM_PD;CONFIG_SOC_CONFIGURABLE_VDDSDIO_SUPPORTED;CONFIG_SOC_PM_MODEM_PD_BY_SW;CONFIG_SOC_CLK_APLL_SUPPORTED;CONFIG_SOC_CLK_RC_FAST_D256_SUPPORTED;CONFIG_SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256;CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION;CONFIG_SOC_CLK_XTAL32K_SUPPORTED;CONFIG_SOC_SDMMC_USE_IOMUX;CONFIG_SOC_SDMMC_NUM_SLOTS;CONFIG_SOC_WIFI_WAPI_SUPPORT;CONFIG_SOC_WIFI_CSI_SUPPORT;CONFIG_SOC_WIFI_MESH_SUPPORT;CONFIG_SOC_WIFI_SUPPORT_VARIABLE_BEACON_WINDOW;CONFIG_SOC_WIFI_NAN_SUPPORT;CONFIG_SOC_BLE_SUPPORTED;CONFIG_SOC_BLE_MESH_SUPPORTED;CONFIG_SOC_BT_CLASSIC_SUPPORTED;CONFIG_SOC_BLUFI_SUPPORTED;CONFIG_SOC_BT_H2C_ENC_KEY_CTRL_ENH_VSC_SUPPORTED;CONFIG_SOC_ULP_HAS_ADC;CONFIG_SOC_PHY_COMBO_MODULE;CONFIG_SOC_EMAC_RMII_CLK_OUT_INTERNAL_LOOPBACK;CONFIG_IDF_CMAKE;CONFIG_IDF_TOOLCHAIN;CONFIG_IDF_TOOLCHAIN_GCC;CONFIG_IDF_TARGET_ARCH_XTENSA;CONFIG_IDF_TARGET_ARCH;CONFIG_IDF_TARGET;CONFIG_IDF_INIT_VERSION;CONFIG_IDF_TARGET_ESP32;CONFIG_IDF_FIRMWARE_CHIP_ID;CONFIG_APP_BUILD_TYPE_APP_2NDBOOT;CONFIG_APP_BUILD_TYPE_RAM;CONFIG_APP_BUILD_TYPE_ELF_RAM;CONFIG_APP_BUILD_GENERATE_BINARIES;CONFIG_APP_BUILD_BOOTLOADER;CONFIG_APP_BUILD_USE_FLASH_SECTIONS;CONFIG_APP_REPRODUCIBLE_BUILD;CONFIG_APP_NO_BLOBS;CONFIG_NO_BLOBS;CONFIG_ESP32_NO_BLOBS;CONFIG_APP_COMPATIBLE_PRE_V2_1_BOOTLOADERS;CONFIG_ESP32_COMPATIBLE_PRE_V2_1_BOOTLOADERS;CONFIG_APP_COMPATIBLE_PRE_V3_1_BOOTLOADERS;CONFIG_ESP32_COMPATIBLE_PRE_V3_1_BOOTLOADERS;CONFIG_BOOTLOADER_COMPILE_TIME_DATE;CONFIG_BOOTLOADER_PROJECT_VER;CONFIG_BOOTLOADER_OFFSET_IN_FLASH;CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE;CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG;CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF;CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_NONE;CONFIG_BOOTLOADER_LOG_LEVEL_NONE;CONFIG_LOG_BOOTLOADER_LEVEL_NONE;CONFIG_BOOTLOADER_LOG_LEVEL_ERROR;CONFIG_LOG_BOOTLOADER_LEVEL_ERROR;CONFIG_BOOTLOADER_LOG_LEVEL_WARN;CONFIG_LOG_BOOTLOADER_LEVEL_WARN;CONFIG_BOOTLOADER_LOG_LEVEL_INFO;CONFIG_LOG_BOOTLOADER_LEVEL_INFO;CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG;CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG;CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE;CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE;CONFIG_BOOTLOADER_LOG_LEVEL;CONFIG_LOG_BOOTLOADER_LEVEL;CONFIG_BOOTLOADER_LOG_COLORS;CONFIG_BOOTLOADER_LOG_TIMESTAMP_SOURCE_CPU_TICKS;CONFIG_BOOTLOADER_FLASH_DC_AWARE;CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT;CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_8V;CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V;CONFIG_BOOTLOADER_FACTORY_RESET;CONFIG_BOOTLOADER_APP_TEST;CONFIG_BOOTLOADER_REGION_PROTECTION_ENABLE;CONFIG_BOOTLOADER_WDT_ENABLE;CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE;CONFIG_BOOTLOADER_WDT_TIME_MS;CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE;CONFIG_APP_ROLLBACK_ENABLE;CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP;CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON;CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS;CONFIG_BOOTLOADER_RESERVE_RTC_SIZE;CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC;CONFIG_SECURE_BOOT_V1_SUPPORTED;CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT;CONFIG_SECURE_BOOT;CONFIG_SECURE_FLASH_ENC_ENABLED;CONFIG_FLASH_ENCRYPTION_ENABLED;CONFIG_APP_COMPILE_TIME_DATE;CONFIG_APP_EXCLUDE_PROJECT_VER_VAR;CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR;CONFIG_APP_PROJECT_VER_FROM_CONFIG;CONFIG_APP_RETRIEVE_LEN_ELF_SHA;CONFIG_ESP_ROM_HAS_CRC_LE;CONFIG_ESP_ROM_HAS_CRC_BE;CONFIG_ESP_ROM_HAS_MZ_CRC32;CONFIG_ESP_ROM_HAS_JPEG_DECODE;CONFIG_ESP_ROM_HAS_UART_BUF_SWITCH;CONFIG_ESP_ROM_NEEDS_SWSETUP_WORKAROUND;CONFIG_ESP_ROM_HAS_NEWLIB;CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT;CONFIG_ESP_ROM_HAS_NEWLIB_32BIT_TIME;CONFIG_ESP_ROM_HAS_SW_FLOAT;CONFIG_ESP_ROM_USB_OTG_NUM;CONFIG_ESP_ROM_USB_SERIAL_DEVICE_NUM;CONFIG_ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB;CONFIG_ESP_ROM_HAS_OUTPUT_PUTC_FUNC;CONFIG_ESPTOOLPY_NO_STUB;CONFIG_ESPTOOLPY_FLASHMODE_QIO;CONFIG_FLASHMODE_QIO;CONFIG_ESPTOOLPY_FLASHMODE_QOUT;CONFIG_FLASHMODE_QOUT;CONFIG_ESPTOOLPY_FLASHMODE_DIO;CONFIG_FLASHMODE_DIO;CONFIG_ESPTOOLPY_FLASHMODE_DOUT;CONFIG_FLASHMODE_DOUT;CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_STR;CONFIG_ESPTOOLPY_FLASHMODE;CONFIG_ESPTOOLPY_FLASHFREQ_80M;CONFIG_ESPTOOLPY_FLASHFREQ_40M;CONFIG_ESPTOOLPY_FLASHFREQ_26M;CONFIG_ESPTOOLPY_FLASHFREQ_20M;CONFIG_ESPTOOLPY_FLASHFREQ;CONFIG_ESPTOOLPY_FLASHSIZE_1MB;CONFIG_ESPTOOLPY_FLASHSIZE_2MB;CONFIG_ESPTOOLPY_FLASHSIZE_4MB;CONFIG_ESPTOOLPY_FLASHSIZE_8MB;CONFIG_ESPTOOLPY_FLASHSIZE_16MB;CONFIG_ESPTOOLPY_FLASHSIZE_32MB;CONFIG_ESPTOOLPY_FLASHSIZE_64MB;CONFIG_ESPTOOLPY_FLASHSIZE_128MB;CONFIG_ESPTOOLPY_FLASHSIZE;CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE;CONFIG_ESPTOOLPY_BEFORE_RESET;CONFIG_ESPTOOLPY_BEFORE_NORESET;CONFIG_ESPTOOLPY_BEFORE;CONFIG_ESPTOOLPY_AFTER_RESET;CONFIG_ESPTOOLPY_AFTER_NORESET;CONFIG_ESPTOOLPY_AFTER;CONFIG_ESPTOOLPY_MONITOR_BAUD;CONFIG_MONITOR_BAUD;CONFIG_PARTITION_TABLE_SINGLE_APP;CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE;CONFIG_PARTITION_TABLE_TWO_OTA;CONFIG_PARTITION_TABLE_TWO_OTA_LARGE;CONFIG_PARTITION_TABLE_CUSTOM;CONFIG_PARTITION_TABLE_CUSTOM_FILENAME;CONFIG_PARTITION_TABLE_FILENAME;CONFIG_PARTITION_TABLE_OFFSET;CONFIG_PARTITION_TABLE_MD5;CONFIG_COMPILER_OPTIMIZATION_DEBUG;CONFIG_OPTIMIZATION_LEVEL_DEBUG;CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG;CONFIG_COMPILER_OPTIMIZATION_DEFAULT;CONFIG_COMPILER_OPTIMIZATION_SIZE;CONFIG_OPTIMIZATION_LEVEL_RELEASE;CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE;CONFIG_COMPILER_OPTIMIZATION_PERF;CONFIG_COMPILER_OPTIMIZATION_NONE;CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE;CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED;CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT;CONFIG_OPTIMIZATION_ASSERTIONS_SILENT;CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE;CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED;CONFIG_COMPILER_ASSERT_NDEBUG_EVALUATE;CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB;CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL;CONFIG_OPTIMIZATION_ASSERTION_LEVEL;CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT;CONFIG_COMPILER_HIDE_PATHS_MACROS;CONFIG_COMPILER_CXX_EXCEPTIONS;CONFIG_CXX_EXCEPTIONS;CONFIG_COMPILER_CXX_RTTI;CONFIG_COMPILER_STACK_CHECK_MODE_NONE;CONFIG_STACK_CHECK_NONE;CONFIG_COMPILER_STACK_CHECK_MODE_NORM;CONFIG_STACK_CHECK_NORM;CONFIG_COMPILER_STACK_CHECK_MODE_STRONG;CONFIG_STACK_CHECK_STRONG;CONFIG_COMPILER_STACK_CHECK_MODE_ALL;CONFIG_STACK_CHECK_ALL;CONFIG_COMPILER_NO_MERGE_CONSTANTS;CONFIG_COMPILER_WARN_WRITE_STRINGS;CONFIG_WARN_WRITE_STRINGS;CONFIG_COMPILER_DISABLE_DEFAULT_ERRORS;CONFIG_COMPILER_DISABLE_GCC12_WARNINGS;CONFIG_COMPILER_DISABLE_GCC13_WARNINGS;CONFIG_COMPILER_DISABLE_GCC14_WARNINGS;CONFIG_COMPILER_DUMP_RTL_FILES;CONFIG_COMPILER_RT_LIB_GCCLIB;CONFIG_COMPILER_RT_LIB_NAME;CONFIG_COMPILER_ORPHAN_SECTIONS_WARNING;CONFIG_COMPILER_ORPHAN_SECTIONS_PLACE;CONFIG_COMPILER_STATIC_ANALYZER;CONFIG_APPTRACE_DEST_JTAG;CONFIG_ESP32_APPTRACE_DEST_TRAX;CONFIG_APPTRACE_DEST_NONE;CONFIG_ESP32_APPTRACE_DEST_NONE;CONFIG_APPTRACE_DEST_UART1;CONFIG_APPTRACE_DEST_UART2;CONFIG_APPTRACE_DEST_UART_NONE;CONFIG_APPTRACE_UART_TASK_PRIO;CONFIG_APPTRACE_LOCK_ENABLE;CONFIG_ESP32_APPTRACE_LOCK_ENABLE;CONFIG_BT_ENABLED;CONFIG_BT_ALARM_MAX_NUM;CONFIG_CONSOLE_SORTED_HELP;CONFIG_TWAI_ISR_IN_IRAM;CONFIG_TWAI_ERRATA_FIX_BUS_OFF_REC;CONFIG_TWAI_ERRATA_FIX_TX_INTR_LOST;CONFIG_TWAI_ERRATA_FIX_RX_FRAME_INVALID;CONFIG_TWAI_ERRATA_FIX_RX_FIFO_CORRUPT;CONFIG_TWAI_ERRATA_FIX_LISTEN_ONLY_DOM;CONFIG_ADC_DISABLE_DAC;CONFIG_ADC2_DISABLE_DAC;CONFIG_ADC_SUPPRESS_DEPRECATE_WARN;CONFIG_ADC_SKIP_LEGACY_CONFLICT_CHECK;CONFIG_ADC_CAL_EFUSE_TP_ENABLE;CONFIG_ADC_CAL_EFUSE_VREF_ENABLE;CONFIG_ADC_CAL_LUT_ENABLE;CONFIG_ADC_CALI_SUPPRESS_DEPRECATE_WARN;CONFIG_DAC_SUPPRESS_DEPRECATE_WARN;CONFIG_DAC_SKIP_LEGACY_CONFLICT_CHECK;CONFIG_MCPWM_SUPPRESS_DEPRECATE_WARN;CONFIG_MCPWM_SKIP_LEGACY_CONFLICT_CHECK;CONFIG_GPTIMER_SUPPRESS_DEPRECATE_WARN;CONFIG_GPTIMER_SKIP_LEGACY_CONFLICT_CHECK;CONFIG_RMT_SUPPRESS_DEPRECATE_WARN;CONFIG_RMT_SKIP_LEGACY_CONFLICT_CHECK;CONFIG_I2S_SUPPRESS_DEPRECATE_WARN;CONFIG_I2S_SKIP_LEGACY_CONFLICT_CHECK;CONFIG_PCNT_SUPPRESS_DEPRECATE_WARN;CONFIG_PCNT_SKIP_LEGACY_CONFLICT_CHECK;CONFIG_SDM_SUPPRESS_DEPRECATE_WARN;CONFIG_SDM_SKIP_LEGACY_CONFLICT_CHECK;CONFIG_EFUSE_CUSTOM_TABLE;CONFIG_EFUSE_VIRTUAL;CONFIG_EFUSE_CODE_SCHEME_COMPAT_NONE;CONFIG_EFUSE_CODE_SCHEME_COMPAT_3_4;CONFIG_EFUSE_CODE_SCHEME_COMPAT_REPEAT;CONFIG_EFUSE_MAX_BLK_LEN;CONFIG_ESP_TLS_USING_MBEDTLS;CONFIG_ESP_TLS_USE_SECURE_ELEMENT;CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS;CONFIG_ESP_TLS_SERVER_SESSION_TICKETS;CONFIG_ESP_TLS_SERVER_CERT_SELECT_HOOK;CONFIG_ESP_TLS_SERVER_MIN_AUTH_MODE_OPTIONAL;CONFIG_ESP_TLS_PSK_VERIFICATION;CONFIG_ESP_TLS_INSECURE;CONFIG_ADC_ONESHOT_CTRL_FUNC_IN_IRAM;CONFIG_ADC_CONTINUOUS_ISR_IRAM_SAFE;CONFIG_ADC_CALI_EFUSE_TP_ENABLE;CONFIG_ADC_CALI_EFUSE_VREF_ENABLE;CONFIG_ADC_CALI_LUT_ENABLE;CONFIG_ADC_DISABLE_DAC_OUTPUT;CONFIG_ADC_ENABLE_DEBUG_LOG;CONFIG_ESP_COEX_ENABLED;CONFIG_ESP_COEX_GPIO_DEBUG;CONFIG_ESP_ERR_TO_NAME_LOOKUP;CONFIG_DAC_CTRL_FUNC_IN_IRAM;CONFIG_DAC_ISR_IRAM_SAFE;CONFIG_DAC_ENABLE_DEBUG_LOG;CONFIG_DAC_DMA_AUTO_16BIT_ALIGN;CONFIG_GPIO_ESP32_SUPPORT_SWITCH_SLP_PULL;CONFIG_GPIO_CTRL_FUNC_IN_IRAM;CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM;CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM;CONFIG_GPTIMER_ISR_IRAM_SAFE;CONFIG_GPTIMER_ENABLE_DEBUG_LOG;CONFIG_I2C_ISR_IRAM_SAFE;CONFIG_I2C_ENABLE_DEBUG_LOG;CONFIG_I2C_ENABLE_SLAVE_DRIVER_VERSION_2;CONFIG_I2S_ISR_IRAM_SAFE;CONFIG_I2S_ENABLE_DEBUG_LOG;CONFIG_LEDC_CTRL_FUNC_IN_IRAM;CONFIG_MCPWM_ISR_IRAM_SAFE;CONFIG_MCPWM_ISR_IN_IRAM;CONFIG_MCPWM_CTRL_FUNC_IN_IRAM;CONFIG_MCPWM_ENABLE_DEBUG_LOG;CONFIG_PCNT_CTRL_FUNC_IN_IRAM;CONFIG_PCNT_ISR_IRAM_SAFE;CONFIG_PCNT_ENABLE_DEBUG_LOG;CONFIG_RMT_ISR_IRAM_SAFE;CONFIG_RMT_RECV_FUNC_IN_IRAM;CONFIG_RMT_ENABLE_DEBUG_LOG;CONFIG_SDM_CTRL_FUNC_IN_IRAM;CONFIG_SDM_ENABLE_DEBUG_LOG;CONFIG_SPI_MASTER_IN_IRAM;CONFIG_SPI_MASTER_ISR_IN_IRAM;CONFIG_SPI_SLAVE_IN_IRAM;CONFIG_SPI_SLAVE_ISR_IN_IRAM;CONFIG_TOUCH_CTRL_FUNC_IN_IRAM;CONFIG_TOUCH_ISR_IRAM_SAFE;CONFIG_TOUCH_ENABLE_DEBUG_LOG;CONFIG_UART_ISR_IN_IRAM;CONFIG_ETH_ENABLED;CONFIG_ETH_USE_ESP32_EMAC;CONFIG_ETH_PHY_INTERFACE_RMII;CONFIG_ETH_RMII_CLK_INPUT;CONFIG_ETH_RMII_CLK_OUTPUT;CONFIG_ETH_RMII_CLK_IN_GPIO;CONFIG_ETH_DMA_BUFFER_SIZE;CONFIG_ETH_DMA_RX_BUFFER_NUM;CONFIG_ETH_DMA_TX_BUFFER_NUM;CONFIG_ETH_IRAM_OPTIMIZATION;CONFIG_ETH_USE_SPI_ETHERNET;CONFIG_ETH_SPI_ETHERNET_DM9051;CONFIG_ETH_SPI_ETHERNET_W5500;CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL;CONFIG_ETH_USE_OPENETH;CONFIG_ETH_TRANSMIT_MUTEX;CONFIG_ESP_EVENT_LOOP_PROFILING;CONFIG_EVENT_LOOP_PROFILING;CONFIG_ESP_EVENT_POST_FROM_ISR;CONFIG_POST_EVENTS_FROM_ISR;CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR;CONFIG_POST_EVENTS_FROM_IRAM_ISR;CONFIG_ESP_GDBSTUB_ENABLED;CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME;CONFIG_ESP_GDBSTUB_SUPPORT_TASKS;CONFIG_GDBSTUB_SUPPORT_TASKS;CONFIG_ESP_GDBSTUB_MAX_TASKS;CONFIG_GDBSTUB_MAX_TASKS;CONFIG_ESPHID_TASK_SIZE_BT;CONFIG_ESPHID_TASK_SIZE_BLE;CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS;CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH;CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH;CONFIG_ESP_HTTP_CLIENT_ENABLE_CUSTOM_TRANSPORT;CONFIG_ESP_HTTP_CLIENT_EVENT_POST_TIMEOUT;CONFIG_HTTPD_MAX_REQ_HDR_LEN;CONFIG_HTTPD_MAX_URI_LEN;CONFIG_HTTPD_ERR_RESP_NO_DELAY;CONFIG_HTTPD_PURGE_BUF_LEN;CONFIG_HTTPD_LOG_PURGE_DATA;CONFIG_HTTPD_WS_SUPPORT;CONFIG_HTTPD_QUEUE_WORK_BLOCKING;CONFIG_HTTPD_SERVER_EVENT_POST_TIMEOUT;CONFIG_ESP_HTTPS_OTA_DECRYPT_CB;CONFIG_ESP_HTTPS_OTA_ALLOW_HTTP;CONFIG_OTA_ALLOW_HTTP;CONFIG_ESP_HTTPS_OTA_EVENT_POST_TIMEOUT;CONFIG_ESP_HTTPS_SERVER_ENABLE;CONFIG_ESP_HTTPS_SERVER_EVENT_POST_TIMEOUT;CONFIG_ESP32_REV_MIN_0;CONFIG_ESP32_REV_MIN_1;CONFIG_ESP32_REV_MIN_1_1;CONFIG_ESP32_REV_MIN_2;CONFIG_ESP32_REV_MIN_3;CONFIG_ESP32_REV_MIN_3_1;CONFIG_ESP32_REV_MIN;CONFIG_ESP32_REV_MIN_FULL;CONFIG_ESP_REV_MIN_FULL;CONFIG_ESP32_REV_MAX_FULL;CONFIG_ESP_REV_MAX_FULL;CONFIG_ESP_EFUSE_BLOCK_REV_MIN_FULL;CONFIG_ESP_EFUSE_BLOCK_REV_MAX_FULL;CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA;CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP;CONFIG_ESP_MAC_ADDR_UNIVERSE_BT;CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH;CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR;CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES;CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_TWO;CONFIG_TWO_UNIVERSAL_MAC_ADDRESS;CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_FOUR;CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS;CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES;CONFIG_NUMBER_OF_UNIVERSAL_MAC_ADDRESS;CONFIG_ESP_MAC_IGNORE_MAC_CRC_ERROR;CONFIG_ESP_MAC_USE_CUSTOM_MAC_AS_BASE_MAC;CONFIG_ESP_SLEEP_POWER_DOWN_FLASH;CONFIG_ESP_SYSTEM_PD_FLASH;CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND;CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU;CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND;CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND;CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY;CONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAY;CONFIG_ESP_SLEEP_DEEP_SLEEP_WAKEUP_DELAY;CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION;CONFIG_ESP_SLEEP_DEBUG;CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS;CONFIG_RTC_CLK_SRC_INT_RC;CONFIG_ESP32_RTC_CLK_SRC_INT_RC;CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC;CONFIG_RTC_CLK_SRC_EXT_CRYS;CONFIG_ESP32_RTC_CLK_SRC_EXT_CRYS;CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_CRYSTAL;CONFIG_RTC_CLK_SRC_EXT_OSC;CONFIG_ESP32_RTC_CLK_SRC_EXT_OSC;CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_OSC;CONFIG_RTC_CLK_SRC_INT_8MD256;CONFIG_ESP32_RTC_CLK_SRC_INT_8MD256;CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_8MD256;CONFIG_RTC_CLK_CAL_CYCLES;CONFIG_ESP32_RTC_CLK_CAL_CYCLES;CONFIG_PERIPH_CTRL_FUNC_IN_IRAM;CONFIG_XTAL_FREQ_26;CONFIG_ESP32_XTAL_FREQ_26;CONFIG_XTAL_FREQ_32;CONFIG_XTAL_FREQ_40;CONFIG_ESP32_XTAL_FREQ_40;CONFIG_XTAL_FREQ_AUTO;CONFIG_ESP32_XTAL_FREQ_AUTO;CONFIG_XTAL_FREQ;CONFIG_ESP32_XTAL_FREQ;CONFIG_ESP_SPI_BUS_LOCK_ISR_FUNCS_IN_IRAM;CONFIG_LCD_ENABLE_DEBUG_LOG;CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL;CONFIG_ESP_NETIF_PROVIDE_CUSTOM_IMPLEMENTATION;CONFIG_ESP_NETIF_TCPIP_LWIP;CONFIG_ESP_NETIF_LOOPBACK;CONFIG_ESP_NETIF_USES_TCPIP_WITH_BSD_API;CONFIG_ESP_NETIF_REPORT_DATA_TRAFFIC;CONFIG_ESP_NETIF_RECEIVE_REPORT_ERRORS;CONFIG_ESP_NETIF_L2_TAP;CONFIG_ESP_NETIF_BRIDGE_EN;CONFIG_ESP_NETIF_SET_DNS_PER_DEFAULT_NETIF;CONFIG_ESP_PHY_ENABLED;CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE;CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE;CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION;CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION;CONFIG_ESP_PHY_MAX_WIFI_TX_POWER;CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER;CONFIG_ESP_PHY_MAX_TX_POWER;CONFIG_ESP32_PHY_MAX_TX_POWER;CONFIG_ESP_PHY_REDUCE_TX_POWER;CONFIG_REDUCE_PHY_TX_POWER;CONFIG_ESP32_REDUCE_PHY_TX_POWER;CONFIG_ESP_PHY_ENABLE_CERT_TEST;CONFIG_ESP_PHY_RF_CAL_PARTIAL;CONFIG_ESP_PHY_RF_CAL_NONE;CONFIG_ESP_PHY_RF_CAL_FULL;CONFIG_ESP_PHY_CALIBRATION_MODE;CONFIG_ESP_PHY_PLL_TRACK_DEBUG;CONFIG_ESP_PHY_RECORD_USED_TIME;CONFIG_PM_ENABLE;CONFIG_PM_SLP_IRAM_OPT;CONFIG_SPIRAM;CONFIG_SPIRAM_SUPPORT;CONFIG_ESP32_SPIRAM_SUPPORT;CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH;CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80;CONFIG_ESP32_DEFAULT_CPU_FREQ_80;CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160;CONFIG_ESP32_DEFAULT_CPU_FREQ_160;CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240;CONFIG_ESP32_DEFAULT_CPU_FREQ_240;CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ;CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ;CONFIG_ESP32_USE_FIXED_STATIC_RAM_SIZE;CONFIG_ESP_SYSTEM_ESP32_SRAM1_REGION_AS_IRAM;CONFIG_ESP32_TRAX;CONFIG_ESP32_TRACEMEM_RESERVE_DRAM;CONFIG_TRACEMEM_RESERVE_DRAM;CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT;CONFIG_ESP32_PANIC_PRINT_HALT;CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT;CONFIG_ESP32_PANIC_PRINT_REBOOT;CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT;CONFIG_ESP32_PANIC_SILENT_REBOOT;CONFIG_ESP_SYSTEM_PANIC_GDBSTUB;CONFIG_ESP32_PANIC_GDBSTUB;CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS;CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE;CONFIG_SYSTEM_EVENT_QUEUE_SIZE;CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE;CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE;CONFIG_ESP_MAIN_TASK_STACK_SIZE;CONFIG_MAIN_TASK_STACK_SIZE;CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0;CONFIG_ESP_MAIN_TASK_AFFINITY_CPU1;CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY;CONFIG_ESP_MAIN_TASK_AFFINITY;CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE;CONFIG_ESP_CONSOLE_UART_DEFAULT;CONFIG_CONSOLE_UART_DEFAULT;CONFIG_ESP_CONSOLE_UART_CUSTOM;CONFIG_CONSOLE_UART_CUSTOM;CONFIG_ESP_CONSOLE_NONE;CONFIG_CONSOLE_UART_NONE;CONFIG_ESP_CONSOLE_UART_NONE;CONFIG_ESP_CONSOLE_UART;CONFIG_CONSOLE_UART;CONFIG_ESP_CONSOLE_UART_NUM;CONFIG_CONSOLE_UART_NUM;CONFIG_ESP_CONSOLE_ROM_SERIAL_PORT_NUM;CONFIG_ESP_CONSOLE_UART_BAUDRATE;CONFIG_CONSOLE_UART_BAUDRATE;CONFIG_ESP_INT_WDT;CONFIG_INT_WDT;CONFIG_ESP_INT_WDT_TIMEOUT_MS;CONFIG_INT_WDT_TIMEOUT_MS;CONFIG_ESP_INT_WDT_CHECK_CPU1;CONFIG_INT_WDT_CHECK_CPU1;CONFIG_ESP_TASK_WDT_EN;CONFIG_ESP_TASK_WDT_INIT;CONFIG_TASK_WDT;CONFIG_ESP_TASK_WDT;CONFIG_ESP_TASK_WDT_PANIC;CONFIG_TASK_WDT_PANIC;CONFIG_ESP_TASK_WDT_TIMEOUT_S;CONFIG_TASK_WDT_TIMEOUT_S;CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0;CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0;CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1;CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1;CONFIG_ESP_PANIC_HANDLER_IRAM;CONFIG_ESP_DEBUG_STUBS_ENABLE;CONFIG_ESP32_DEBUG_STUBS_ENABLE;CONFIG_ESP_DEBUG_OCDAWARE;CONFIG_ESP32_DEBUG_OCDAWARE;CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5;CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4;CONFIG_ESP_BROWNOUT_DET;CONFIG_BROWNOUT_DET;CONFIG_ESP32_BROWNOUT_DET;CONFIG_ESP_BROWNOUT_DET_LVL_SEL_0;CONFIG_BROWNOUT_DET_LVL_SEL_0;CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_0;CONFIG_ESP_BROWNOUT_DET_LVL_SEL_1;CONFIG_BROWNOUT_DET_LVL_SEL_1;CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_1;CONFIG_ESP_BROWNOUT_DET_LVL_SEL_2;CONFIG_BROWNOUT_DET_LVL_SEL_2;CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_2;CONFIG_ESP_BROWNOUT_DET_LVL_SEL_3;CONFIG_BROWNOUT_DET_LVL_SEL_3;CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_3;CONFIG_ESP_BROWNOUT_DET_LVL_SEL_4;CONFIG_BROWNOUT_DET_LVL_SEL_4;CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_4;CONFIG_ESP_BROWNOUT_DET_LVL_SEL_5;CONFIG_BROWNOUT_DET_LVL_SEL_5;CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_5;CONFIG_ESP_BROWNOUT_DET_LVL_SEL_6;CONFIG_BROWNOUT_DET_LVL_SEL_6;CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_6;CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7;CONFIG_BROWNOUT_DET_LVL_SEL_7;CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_7;CONFIG_ESP_BROWNOUT_DET_LVL;CONFIG_BROWNOUT_DET_LVL;CONFIG_ESP32_BROWNOUT_DET_LVL;CONFIG_ESP32_DISABLE_BASIC_ROM_CONSOLE;CONFIG_DISABLE_BASIC_ROM_CONSOLE;CONFIG_ESP_SYSTEM_BROWNOUT_INTR;CONFIG_ESP_IPC_TASK_STACK_SIZE;CONFIG_IPC_TASK_STACK_SIZE;CONFIG_ESP_IPC_USES_CALLERS_PRIORITY;CONFIG_ESP_IPC_ISR_ENABLE;CONFIG_ESP_TIMER_PROFILING;CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER;CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER;CONFIG_ESP_TIMER_TASK_STACK_SIZE;CONFIG_TIMER_TASK_STACK_SIZE;CONFIG_ESP_TIMER_INTERRUPT_LEVEL;CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL;CONFIG_ESP_TIMER_TASK_AFFINITY;CONFIG_ESP_TIMER_TASK_AFFINITY_CPU0;CONFIG_ESP_TIMER_ISR_AFFINITY_CPU0;CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD;CONFIG_ESP_TIMER_IMPL_TG0_LAC;CONFIG_ESP_WIFI_ENABLED;CONFIG_ESP32_WIFI_ENABLED;CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM;CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM;CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM;CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM;CONFIG_ESP_WIFI_STATIC_TX_BUFFER;CONFIG_ESP32_WIFI_STATIC_TX_BUFFER;CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER;CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER;CONFIG_ESP_WIFI_TX_BUFFER_TYPE;CONFIG_ESP32_WIFI_TX_BUFFER_TYPE;CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER_NUM;CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM;CONFIG_ESP_WIFI_STATIC_RX_MGMT_BUFFER;CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUFFER;CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF;CONFIG_ESP_WIFI_RX_MGMT_BUF_NUM_DEF;CONFIG_ESP_WIFI_CSI_ENABLED;CONFIG_ESP32_WIFI_CSI_ENABLED;CONFIG_ESP_WIFI_AMPDU_TX_ENABLED;CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED;CONFIG_ESP_WIFI_TX_BA_WIN;CONFIG_ESP32_WIFI_TX_BA_WIN;CONFIG_ESP_WIFI_AMPDU_RX_ENABLED;CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED;CONFIG_ESP_WIFI_RX_BA_WIN;CONFIG_ESP32_WIFI_RX_BA_WIN;CONFIG_ESP_WIFI_NVS_ENABLED;CONFIG_ESP32_WIFI_NVS_ENABLED;CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_0;CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0;CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_1;CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1;CONFIG_ESP_WIFI_SOFTAP_BEACON_MAX_LEN;CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN;CONFIG_ESP_WIFI_MGMT_SBUF_NUM;CONFIG_ESP32_WIFI_MGMT_SBUF_NUM;CONFIG_ESP_WIFI_IRAM_OPT;CONFIG_ESP32_WIFI_IRAM_OPT;CONFIG_ESP_WIFI_EXTRA_IRAM_OPT;CONFIG_ESP_WIFI_RX_IRAM_OPT;CONFIG_ESP32_WIFI_RX_IRAM_OPT;CONFIG_ESP_WIFI_ENABLE_WPA3_SAE;CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE;CONFIG_ESP_WIFI_ENABLE_SAE_PK;CONFIG_ESP_WIFI_SOFTAP_SAE_SUPPORT;CONFIG_ESP_WIFI_ENABLE_WPA3_OWE_STA;CONFIG_ESP32_WIFI_ENABLE_WPA3_OWE_STA;CONFIG_ESP_WIFI_SLP_IRAM_OPT;CONFIG_ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME;CONFIG_ESP_WIFI_SLP_DEFAULT_MAX_ACTIVE_TIME;CONFIG_ESP_WIFI_SLP_DEFAULT_WAIT_BROADCAST_DATA_TIME;CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE;CONFIG_ESP_WIFI_GMAC_SUPPORT;CONFIG_ESP_WIFI_SOFTAP_SUPPORT;CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT;CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM;CONFIG_ESP_WIFI_NAN_ENABLE;CONFIG_ESP_WIFI_MBEDTLS_CRYPTO;CONFIG_WPA_MBEDTLS_CRYPTO;CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT;CONFIG_WPA_MBEDTLS_TLS_CLIENT;CONFIG_ESP_WIFI_WAPI_PSK;CONFIG_WPA_WAPI_PSK;CONFIG_ESP_WIFI_11KV_SUPPORT;CONFIG_WPA_11KV_SUPPORT;CONFIG_ESP_WIFI_MBO_SUPPORT;CONFIG_WPA_MBO_SUPPORT;CONFIG_ESP_WIFI_DPP_SUPPORT;CONFIG_WPA_DPP_SUPPORT;CONFIG_ESP_WIFI_11R_SUPPORT;CONFIG_WPA_11R_SUPPORT;CONFIG_ESP_WIFI_WPS_SOFTAP_REGISTRAR;CONFIG_WPA_WPS_SOFTAP_REGISTRAR;CONFIG_ESP_WIFI_WPS_STRICT;CONFIG_WPA_WPS_STRICT;CONFIG_ESP_WIFI_WPS_PASSPHRASE;CONFIG_ESP_WIFI_DEBUG_PRINT;CONFIG_WPA_DEBUG_PRINT;CONFIG_ESP_WIFI_TESTING_OPTIONS;CONFIG_WPA_TESTING_OPTIONS;CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT;CONFIG_ESP_WIFI_ENT_FREE_DYNAMIC_BUFFER;CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH;CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH;CONFIG_ESP_COREDUMP_ENABLE_TO_UART;CONFIG_ESP32_ENABLE_COREDUMP_TO_UART;CONFIG_ESP_COREDUMP_ENABLE_TO_NONE;CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE;CONFIG_FATFS_VOLUME_COUNT;CONFIG_FATFS_LFN_NONE;CONFIG_FATFS_LFN_HEAP;CONFIG_FATFS_LFN_STACK;CONFIG_FATFS_SECTOR_512;CONFIG_FATFS_SECTOR_4096;CONFIG_FATFS_CODEPAGE_DYNAMIC;CONFIG_FATFS_CODEPAGE_437;CONFIG_FATFS_CODEPAGE_720;CONFIG_FATFS_CODEPAGE_737;CONFIG_FATFS_CODEPAGE_771;CONFIG_FATFS_CODEPAGE_775;CONFIG_FATFS_CODEPAGE_850;CONFIG_FATFS_CODEPAGE_852;CONFIG_FATFS_CODEPAGE_855;CONFIG_FATFS_CODEPAGE_857;CONFIG_FATFS_CODEPAGE_860;CONFIG_FATFS_CODEPAGE_861;CONFIG_FATFS_CODEPAGE_862;CONFIG_FATFS_CODEPAGE_863;CONFIG_FATFS_CODEPAGE_864;CONFIG_FATFS_CODEPAGE_865;CONFIG_FATFS_CODEPAGE_866;CONFIG_FATFS_CODEPAGE_869;CONFIG_FATFS_CODEPAGE_932;CONFIG_FATFS_CODEPAGE_936;CONFIG_FATFS_CODEPAGE_949;CONFIG_FATFS_CODEPAGE_950;CONFIG_FATFS_CODEPAGE;CONFIG_FATFS_FS_LOCK;CONFIG_FATFS_TIMEOUT_MS;CONFIG_FATFS_PER_FILE_CACHE;CONFIG_FATFS_USE_FASTSEEK;CONFIG_FATFS_USE_STRFUNC_NONE;CONFIG_FATFS_USE_STRFUNC_WITHOUT_CRLF_CONV;CONFIG_FATFS_USE_STRFUNC_WITH_CRLF_CONV;CONFIG_FATFS_VFS_FSTAT_BLKSIZE;CONFIG_FATFS_IMMEDIATE_FSYNC;CONFIG_FATFS_USE_LABEL;CONFIG_FATFS_LINK_LOCK;CONFIG_FREERTOS_SMP;CONFIG_FREERTOS_UNICORE;CONFIG_FREERTOS_HZ;CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE;CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL;CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY;CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS;CONFIG_FREERTOS_IDLE_TASK_STACKSIZE;CONFIG_FREERTOS_USE_IDLE_HOOK;CONFIG_FREERTOS_USE_TICK_HOOK;CONFIG_FREERTOS_MAX_TASK_NAME_LEN;CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY;CONFIG_FREERTOS_USE_TIMERS;CONFIG_FREERTOS_TIMER_SERVICE_TASK_NAME;CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU0;CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU1;CONFIG_FREERTOS_TIMER_TASK_NO_AFFINITY;CONFIG_FREERTOS_TIMER_SERVICE_TASK_CORE_AFFINITY;CONFIG_FREERTOS_TIMER_TASK_PRIORITY;CONFIG_TIMER_TASK_PRIORITY;CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH;CONFIG_TIMER_TASK_STACK_DEPTH;CONFIG_FREERTOS_TIMER_QUEUE_LENGTH;CONFIG_TIMER_QUEUE_LENGTH;CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE;CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES;CONFIG_FREERTOS_USE_TRACE_FACILITY;CONFIG_FREERTOS_USE_LIST_DATA_INTEGRITY_CHECK_BYTES;CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS;CONFIG_FREERTOS_USE_APPLICATION_TASK_TAG;CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER;CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK;CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS;CONFIG_FREERTOS_TASK_PRE_DELETION_HOOK;CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP;CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK;CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER;CONFIG_FREERTOS_ISR_STACKSIZE;CONFIG_FREERTOS_INTERRUPT_BACKTRACE;CONFIG_FREERTOS_FPU_IN_ISR;CONFIG_FREERTOS_TICK_SUPPORT_CORETIMER;CONFIG_FREERTOS_CORETIMER_0;CONFIG_FREERTOS_CORETIMER_1;CONFIG_FREERTOS_SYSTICK_USES_CCOUNT;CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH;CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE;CONFIG_FREERTOS_PORT;CONFIG_FREERTOS_NO_AFFINITY;CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION;CONFIG_FREERTOS_DEBUG_OCDAWARE;CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT;CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH;CONFIG_FREERTOS_NUMBER_OF_CORES;CONFIG_HAL_ASSERTION_EQUALS_SYSTEM;CONFIG_HAL_ASSERTION_DISABLE;CONFIG_HAL_ASSERTION_SILENT;CONFIG_HAL_ASSERTION_SILIENT;CONFIG_HAL_ASSERTION_ENABLE;CONFIG_HAL_DEFAULT_ASSERTION_LEVEL;CONFIG_HAL_SPI_MASTER_FUNC_IN_IRAM;CONFIG_HAL_SPI_SLAVE_FUNC_IN_IRAM;CONFIG_HEAP_POISONING_DISABLED;CONFIG_HEAP_POISONING_LIGHT;CONFIG_HEAP_POISONING_COMPREHENSIVE;CONFIG_HEAP_TRACING_OFF;CONFIG_HEAP_TRACING_STANDALONE;CONFIG_HEAP_TRACING_TOHOST;CONFIG_HEAP_USE_HOOKS;CONFIG_HEAP_TASK_TRACKING;CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS;CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH;CONFIG_LOG_DEFAULT_LEVEL_NONE;CONFIG_LOG_DEFAULT_LEVEL_ERROR;CONFIG_LOG_DEFAULT_LEVEL_WARN;CONFIG_LOG_DEFAULT_LEVEL_INFO;CONFIG_LOG_DEFAULT_LEVEL_DEBUG;CONFIG_LOG_DEFAULT_LEVEL_VERBOSE;CONFIG_LOG_DEFAULT_LEVEL;CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT;CONFIG_LOG_MAXIMUM_LEVEL_DEBUG;CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE;CONFIG_LOG_MAXIMUM_LEVEL;CONFIG_LOG_MASTER_LEVEL;CONFIG_LOG_DYNAMIC_LEVEL_CONTROL;CONFIG_LOG_TAG_LEVEL_IMPL_NONE;CONFIG_LOG_TAG_LEVEL_IMPL_LINKED_LIST;CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_AND_LINKED_LIST;CONFIG_LOG_TAG_LEVEL_CACHE_ARRAY;CONFIG_LOG_TAG_LEVEL_CACHE_BINARY_MIN_HEAP;CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_SIZE;CONFIG_LOG_COLORS;CONFIG_LOG_TIMESTAMP_SOURCE_RTOS;CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM;CONFIG_LWIP_ENABLE;CONFIG_LWIP_LOCAL_HOSTNAME;CONFIG_LWIP_NETIF_API;CONFIG_LWIP_TCPIP_TASK_PRIO;CONFIG_LWIP_TCPIP_CORE_LOCKING;CONFIG_LWIP_CHECK_THREAD_SAFETY;CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES;CONFIG_LWIP_L2_TO_L3_COPY;CONFIG_L2_TO_L3_COPY;CONFIG_LWIP_IRAM_OPTIMIZATION;CONFIG_LWIP_EXTRA_IRAM_OPTIMIZATION;CONFIG_LWIP_TIMERS_ONDEMAND;CONFIG_LWIP_ND6;CONFIG_LWIP_FORCE_ROUTER_FORWARDING;CONFIG_LWIP_MAX_SOCKETS;CONFIG_LWIP_USE_ONLY_LWIP_SELECT;CONFIG_LWIP_SO_LINGER;CONFIG_LWIP_SO_REUSE;CONFIG_LWIP_SO_REUSE_RXTOALL;CONFIG_LWIP_SO_RCVBUF;CONFIG_LWIP_NETBUF_RECVINFO;CONFIG_LWIP_IP_DEFAULT_TTL;CONFIG_LWIP_IP4_FRAG;CONFIG_LWIP_IP6_FRAG;CONFIG_LWIP_IP4_REASSEMBLY;CONFIG_LWIP_IP6_REASSEMBLY;CONFIG_LWIP_IP_REASS_MAX_PBUFS;CONFIG_LWIP_IP_FORWARD;CONFIG_LWIP_STATS;CONFIG_LWIP_ESP_GRATUITOUS_ARP;CONFIG_ESP_GRATUITOUS_ARP;CONFIG_LWIP_GARP_TMR_INTERVAL;CONFIG_GARP_TMR_INTERVAL;CONFIG_LWIP_ESP_MLDV6_REPORT;CONFIG_LWIP_MLDV6_TMR_INTERVAL;CONFIG_LWIP_TCPIP_RECVMBOX_SIZE;CONFIG_TCPIP_RECVMBOX_SIZE;CONFIG_LWIP_DHCP_DOES_ARP_CHECK;CONFIG_LWIP_DHCP_DOES_ACD_CHECK;CONFIG_LWIP_DHCP_DOES_NOT_CHECK_OFFERED_IP;CONFIG_LWIP_DHCP_DISABLE_CLIENT_ID;CONFIG_LWIP_DHCP_DISABLE_VENDOR_CLASS_ID;CONFIG_LWIP_DHCP_RESTORE_LAST_IP;CONFIG_LWIP_DHCP_OPTIONS_LEN;CONFIG_LWIP_NUM_NETIF_CLIENT_DATA;CONFIG_LWIP_DHCP_COARSE_TIMER_SECS;CONFIG_LWIP_DHCPS;CONFIG_LWIP_DHCPS_LEASE_UNIT;CONFIG_LWIP_DHCPS_MAX_STATION_NUM;CONFIG_LWIP_DHCPS_STATIC_ENTRIES;CONFIG_LWIP_DHCPS_ADD_DNS;CONFIG_LWIP_AUTOIP;CONFIG_LWIP_IPV4;CONFIG_LWIP_IPV6;CONFIG_LWIP_IPV6_AUTOCONFIG;CONFIG_LWIP_IPV6_NUM_ADDRESSES;CONFIG_LWIP_IPV6_FORWARD;CONFIG_LWIP_NETIF_STATUS_CALLBACK;CONFIG_LWIP_NETIF_LOOPBACK;CONFIG_LWIP_LOOPBACK_MAX_PBUFS;CONFIG_LWIP_MAX_ACTIVE_TCP;CONFIG_LWIP_MAX_LISTENING_TCP;CONFIG_LWIP_TCP_HIGH_SPEED_RETRANSMISSION;CONFIG_LWIP_TCP_MAXRTX;CONFIG_TCP_MAXRTX;CONFIG_LWIP_TCP_SYNMAXRTX;CONFIG_TCP_SYNMAXRTX;CONFIG_LWIP_TCP_MSS;CONFIG_TCP_MSS;CONFIG_LWIP_TCP_TMR_INTERVAL;CONFIG_LWIP_TCP_MSL;CONFIG_TCP_MSL;CONFIG_LWIP_TCP_FIN_WAIT_TIMEOUT;CONFIG_LWIP_TCP_SND_BUF_DEFAULT;CONFIG_TCP_SND_BUF_DEFAULT;CONFIG_LWIP_TCP_WND_DEFAULT;CONFIG_TCP_WND_DEFAULT;CONFIG_LWIP_TCP_RECVMBOX_SIZE;CONFIG_TCP_RECVMBOX_SIZE;CONFIG_LWIP_TCP_ACCEPTMBOX_SIZE;CONFIG_LWIP_TCP_QUEUE_OOSEQ;CONFIG_TCP_QUEUE_OOSEQ;CONFIG_LWIP_TCP_OOSEQ_TIMEOUT;CONFIG_LWIP_TCP_OOSEQ_MAX_PBUFS;CONFIG_LWIP_TCP_SACK_OUT;CONFIG_LWIP_TCP_OVERSIZE_MSS;CONFIG_TCP_OVERSIZE_MSS;CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS;CONFIG_TCP_OVERSIZE_QUARTER_MSS;CONFIG_LWIP_TCP_OVERSIZE_DISABLE;CONFIG_TCP_OVERSIZE_DISABLE;CONFIG_LWIP_TCP_RTO_TIME;CONFIG_LWIP_MAX_UDP_PCBS;CONFIG_LWIP_UDP_RECVMBOX_SIZE;CONFIG_UDP_RECVMBOX_SIZE;CONFIG_LWIP_CHECKSUM_CHECK_IP;CONFIG_LWIP_CHECKSUM_CHECK_UDP;CONFIG_LWIP_CHECKSUM_CHECK_ICMP;CONFIG_LWIP_TCPIP_TASK_STACK_SIZE;CONFIG_TCPIP_TASK_STACK_SIZE;CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY;CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY;CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0;CONFIG_TCPIP_TASK_AFFINITY_CPU0;CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU1;CONFIG_TCPIP_TASK_AFFINITY_CPU1;CONFIG_LWIP_TCPIP_TASK_AFFINITY;CONFIG_TCPIP_TASK_AFFINITY;CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE;CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS;CONFIG_LWIP_IPV6_ND6_NUM_PREFIXES;CONFIG_LWIP_IPV6_ND6_NUM_ROUTERS;CONFIG_LWIP_IPV6_ND6_NUM_DESTINATIONS;CONFIG_LWIP_PPP_SUPPORT;CONFIG_PPP_SUPPORT;CONFIG_LWIP_SLIP_SUPPORT;CONFIG_LWIP_ICMP;CONFIG_LWIP_MULTICAST_PING;CONFIG_LWIP_BROADCAST_PING;CONFIG_LWIP_MAX_RAW_PCBS;CONFIG_LWIP_SNTP_MAX_SERVERS;CONFIG_LWIP_DHCP_GET_NTP_SRV;CONFIG_LWIP_SNTP_UPDATE_DELAY;CONFIG_LWIP_SNTP_STARTUP_DELAY;CONFIG_LWIP_SNTP_MAXIMUM_STARTUP_DELAY;CONFIG_LWIP_DNS_MAX_HOST_IP;CONFIG_LWIP_DNS_MAX_SERVERS;CONFIG_LWIP_FALLBACK_DNS_SERVER_SUPPORT;CONFIG_LWIP_DNS_SETSERVER_WITH_NETIF;CONFIG_LWIP_BRIDGEIF_MAX_PORTS;CONFIG_LWIP_ESP_LWIP_ASSERT;CONFIG_LWIP_HOOK_TCP_ISN_NONE;CONFIG_LWIP_HOOK_TCP_ISN_DEFAULT;CONFIG_LWIP_HOOK_TCP_ISN_CUSTOM;CONFIG_LWIP_HOOK_IP6_ROUTE_NONE;CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT;CONFIG_LWIP_HOOK_IP6_ROUTE_CUSTOM;CONFIG_LWIP_HOOK_ND6_GET_GW_NONE;CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT;CONFIG_LWIP_HOOK_ND6_GET_GW_CUSTOM;CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_NONE;CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_DEFAULT;CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM;CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE;CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT;CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM;CONFIG_LWIP_HOOK_DNS_EXT_RESOLVE_NONE;CONFIG_LWIP_HOOK_DNS_EXT_RESOLVE_CUSTOM;CONFIG_LWIP_HOOK_IP6_INPUT_NONE;CONFIG_LWIP_HOOK_IP6_INPUT_DEFAULT;CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM;CONFIG_LWIP_DEBUG;CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC;CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC;CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC;CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN;CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN;CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN;CONFIG_MBEDTLS_DYNAMIC_BUFFER;CONFIG_MBEDTLS_DEBUG;CONFIG_MBEDTLS_SSL_PROTO_TLS1_3;CONFIG_MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH;CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK;CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION;CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE;CONFIG_MBEDTLS_PKCS7_C;CONFIG_MBEDTLS_CERTIFICATE_BUNDLE;CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL;CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN;CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE;CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE;CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEPRECATED_LIST;CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS;CONFIG_MBEDTLS_ECP_RESTARTABLE;CONFIG_MBEDTLS_CMAC_C;CONFIG_MBEDTLS_HARDWARE_AES;CONFIG_MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER;CONFIG_MBEDTLS_HARDWARE_MPI;CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI;CONFIG_MBEDTLS_HARDWARE_SHA;CONFIG_MBEDTLS_ROM_MD5;CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN;CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY;CONFIG_MBEDTLS_HAVE_TIME;CONFIG_MBEDTLS_PLATFORM_TIME_ALT;CONFIG_MBEDTLS_HAVE_TIME_DATE;CONFIG_MBEDTLS_ECDSA_DETERMINISTIC;CONFIG_MBEDTLS_SHA512_C;CONFIG_MBEDTLS_SHA3_C;CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT;CONFIG_MBEDTLS_TLS_SERVER_ONLY;CONFIG_MBEDTLS_TLS_CLIENT_ONLY;CONFIG_MBEDTLS_TLS_DISABLED;CONFIG_MBEDTLS_TLS_SERVER;CONFIG_MBEDTLS_TLS_CLIENT;CONFIG_MBEDTLS_TLS_ENABLED;CONFIG_MBEDTLS_PSK_MODES;CONFIG_MBEDTLS_KEY_EXCHANGE_RSA;CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE;CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA;CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA;CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA;CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA;CONFIG_MBEDTLS_SSL_RENEGOTIATION;CONFIG_MBEDTLS_SSL_PROTO_TLS1_2;CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1;CONFIG_MBEDTLS_SSL_PROTO_DTLS;CONFIG_MBEDTLS_SSL_ALPN;CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS;CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS;CONFIG_MBEDTLS_AES_C;CONFIG_MBEDTLS_CAMELLIA_C;CONFIG_MBEDTLS_DES_C;CONFIG_MBEDTLS_BLOWFISH_C;CONFIG_MBEDTLS_XTEA_C;CONFIG_MBEDTLS_CCM_C;CONFIG_MBEDTLS_GCM_C;CONFIG_MBEDTLS_NIST_KW_C;CONFIG_MBEDTLS_RIPEMD160_C;CONFIG_MBEDTLS_PEM_PARSE_C;CONFIG_MBEDTLS_PEM_WRITE_C;CONFIG_MBEDTLS_X509_CRL_PARSE_C;CONFIG_MBEDTLS_X509_CSR_PARSE_C;CONFIG_MBEDTLS_ECP_C;CONFIG_MBEDTLS_PK_PARSE_EC_EXTENDED;CONFIG_MBEDTLS_PK_PARSE_EC_COMPRESSED;CONFIG_MBEDTLS_DHM_C;CONFIG_MBEDTLS_ECDH_C;CONFIG_MBEDTLS_ECDSA_C;CONFIG_MBEDTLS_ECJPAKE_C;CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED;CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED;CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED;CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED;CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED;CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED;CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED;CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED;CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED;CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED;CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED;CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED;CONFIG_MBEDTLS_ECP_NIST_OPTIM;CONFIG_MBEDTLS_ECP_FIXED_POINT_OPTIM;CONFIG_MBEDTLS_POLY1305_C;CONFIG_MBEDTLS_CHACHA20_C;CONFIG_MBEDTLS_HKDF_C;CONFIG_MBEDTLS_THREADING_C;CONFIG_MBEDTLS_ERROR_STRINGS;CONFIG_MBEDTLS_FS_IO;CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF;CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF;CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR;CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF;CONFIG_NEWLIB_STDIN_LINE_ENDING_LF;CONFIG_NEWLIB_STDIN_LINE_ENDING_CR;CONFIG_NEWLIB_NANO_FORMAT;CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT;CONFIG_ESP32_TIME_SYSCALL_USE_RTC_HRT;CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1;CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC;CONFIG_ESP32_TIME_SYSCALL_USE_RTC;CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT;CONFIG_ESP32_TIME_SYSCALL_USE_HRT;CONFIG_ESP32_TIME_SYSCALL_USE_FRC1;CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE;CONFIG_ESP32_TIME_SYSCALL_USE_NONE;CONFIG_NVS_ASSERT_ERROR_CHECK;CONFIG_NVS_LEGACY_DUP_KEYS_COMPATIBILITY;CONFIG_OPENTHREAD_ENABLED;CONFIG_OPENTHREAD_SPINEL_ONLY;CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_0;CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_1;CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_2;CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_PATCH_VERSION;CONFIG_PTHREAD_TASK_PRIO_DEFAULT;CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT;CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT;CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT;CONFIG_PTHREAD_STACK_MIN;CONFIG_ESP32_PTHREAD_STACK_MIN;CONFIG_PTHREAD_DEFAULT_CORE_NO_AFFINITY;CONFIG_ESP32_DEFAULT_PTHREAD_CORE_NO_AFFINITY;CONFIG_PTHREAD_DEFAULT_CORE_0;CONFIG_ESP32_DEFAULT_PTHREAD_CORE_0;CONFIG_PTHREAD_DEFAULT_CORE_1;CONFIG_ESP32_DEFAULT_PTHREAD_CORE_1;CONFIG_PTHREAD_TASK_CORE_DEFAULT;CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT;CONFIG_PTHREAD_TASK_NAME_DEFAULT;CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT;CONFIG_MMU_PAGE_SIZE_64KB;CONFIG_MMU_PAGE_MODE;CONFIG_MMU_PAGE_SIZE;CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC;CONFIG_SPI_FLASH_BROWNOUT_RESET;CONFIG_SPI_FLASH_SUSPEND_TSUS_VAL_US;CONFIG_SPI_FLASH_FORCE_ENABLE_XMC_C_SUSPEND;CONFIG_SPI_FLASH_VERIFY_WRITE;CONFIG_SPI_FLASH_ENABLE_COUNTERS;CONFIG_SPI_FLASH_ROM_DRIVER_PATCH;CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS;CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS;CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS;CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS;CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED;CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED;CONFIG_SPI_FLASH_SHARE_SPI1_BUS;CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE;CONFIG_SPI_FLASH_YIELD_DURING_ERASE;CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS;CONFIG_SPI_FLASH_ERASE_YIELD_TICKS;CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE;CONFIG_SPI_FLASH_SIZE_OVERRIDE;CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED;CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST;CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORTED;CONFIG_SPI_FLASH_VENDOR_GD_SUPPORTED;CONFIG_SPI_FLASH_VENDOR_ISSI_SUPPORTED;CONFIG_SPI_FLASH_VENDOR_MXIC_SUPPORTED;CONFIG_SPI_FLASH_VENDOR_WINBOND_SUPPORTED;CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP;CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP;CONFIG_SPI_FLASH_SUPPORT_GD_CHIP;CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP;CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP;CONFIG_SPI_FLASH_SUPPORT_TH_CHIP;CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE;CONFIG_SPIFFS_MAX_PARTITIONS;CONFIG_SPIFFS_CACHE;CONFIG_SPIFFS_CACHE_WR;CONFIG_SPIFFS_CACHE_STATS;CONFIG_SPIFFS_PAGE_CHECK;CONFIG_SPIFFS_GC_MAX_RUNS;CONFIG_SPIFFS_GC_STATS;CONFIG_SPIFFS_PAGE_SIZE;CONFIG_SPIFFS_OBJ_NAME_LEN;CONFIG_SPIFFS_FOLLOW_SYMLINKS;CONFIG_SPIFFS_USE_MAGIC;CONFIG_SPIFFS_USE_MAGIC_LENGTH;CONFIG_SPIFFS_META_LENGTH;CONFIG_SPIFFS_USE_MTIME;CONFIG_SPIFFS_DBG;CONFIG_SPIFFS_API_DBG;CONFIG_SPIFFS_GC_DBG;CONFIG_SPIFFS_CACHE_DBG;CONFIG_SPIFFS_CHECK_DBG;CONFIG_SPIFFS_TEST_VISUALISATION;CONFIG_WS_TRANSPORT;CONFIG_WS_BUFFER_SIZE;CONFIG_WS_DYNAMIC_BUFFER;CONFIG_ULP_COPROC_ENABLED;CONFIG_ESP32_ULP_COPROC_ENABLED;CONFIG_UNITY_ENABLE_FLOAT;CONFIG_UNITY_ENABLE_DOUBLE;CONFIG_UNITY_ENABLE_64BIT;CONFIG_UNITY_ENABLE_COLOR;CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER;CONFIG_UNITY_ENABLE_FIXTURE;CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL;CONFIG_VFS_SUPPORT_IO;CONFIG_VFS_SUPPORT_DIR;CONFIG_VFS_SUPPORT_SELECT;CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT;CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT;CONFIG_VFS_SELECT_IN_RAM;CONFIG_VFS_SUPPORT_TERMIOS;CONFIG_SUPPORT_TERMIOS;CONFIG_VFS_MAX_COUNT;CONFIG_VFS_SEMIHOSTFS_MAX_MOUNT_POINTS;CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS;CONFIG_VFS_INITIALIZE_DEV_NULL;CONFIG_WL_SECTOR_SIZE_512;CONFIG_WL_SECTOR_SIZE_4096;CONFIG_WL_SECTOR_SIZE;CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES;CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT;CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN;CONFIG_WIFI_PROV_STA_FAST_SCAN;CONFIG_CU_RELINKER_ENABLE;CONFIG_CU_DIAGNOSTICS_COLOR_NEVER;CONFIG_CU_DIAGNOSTICS_COLOR_ALWAYS;CONFIG_CU_DIAGNOSTICS_COLOR_AUTO;CONFIG_CU_GCC_LTO_ENABLE;CONFIG_CU_GCC_STRING_1BYTE_ALIGN;CONFIG_I2C_BUS_DYNAMIC_CONFIG;CONFIG_I2C_MS_TO_WAIT;CONFIG_I2C_BUS_BACKWARD_CONFIG;CONFIG_I2C_BUS_SUPPORT_SOFTWARE;CONFIG_I2C_BUS_REMOVE_NULL_MEM_ADDR;CONFIG_MQTT_PROTOCOL_311;CONFIG_MQTT_PROTOCOL_5;CONFIG_MQTT_TRANSPORT_SSL;CONFIG_MQTT_TRANSPORT_WEBSOCKET;CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE;CONFIG_MQTT_MSG_ID_INCREMENTAL;CONFIG_MQTT_SKIP_PUBLISH_IF_DISCONNECTED;CONFIG_MQTT_REPORT_DELETED_MESSAGES;CONFIG_MQTT_USE_CUSTOM_CONFIG;CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED;CONFIG_MQTT_CUSTOM_OUTBOX;CONFIG_IDF_EXPERIMENTAL_FEATURES) +# List of deprecated options for backward compatibility +set(CONFIG_APP_BUILD_TYPE_ELF_RAM "") +set(CONFIG_NO_BLOBS "") +set(CONFIG_ESP32_NO_BLOBS "") +set(CONFIG_ESP32_COMPATIBLE_PRE_V2_1_BOOTLOADERS "") +set(CONFIG_ESP32_COMPATIBLE_PRE_V3_1_BOOTLOADERS "") +set(CONFIG_LOG_BOOTLOADER_LEVEL_NONE "") +set(CONFIG_LOG_BOOTLOADER_LEVEL_ERROR "") +set(CONFIG_LOG_BOOTLOADER_LEVEL_WARN "") +set(CONFIG_LOG_BOOTLOADER_LEVEL_INFO "y") +set(CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG "") +set(CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE "") +set(CONFIG_LOG_BOOTLOADER_LEVEL "3") +set(CONFIG_APP_ROLLBACK_ENABLE "") +set(CONFIG_FLASH_ENCRYPTION_ENABLED "") +set(CONFIG_FLASHMODE_QIO "") +set(CONFIG_FLASHMODE_QOUT "") +set(CONFIG_FLASHMODE_DIO "y") +set(CONFIG_FLASHMODE_DOUT "") +set(CONFIG_MONITOR_BAUD "115200") +set(CONFIG_OPTIMIZATION_LEVEL_DEBUG "y") +set(CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG "y") +set(CONFIG_COMPILER_OPTIMIZATION_DEFAULT "y") +set(CONFIG_OPTIMIZATION_LEVEL_RELEASE "") +set(CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE "") +set(CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED "y") +set(CONFIG_OPTIMIZATION_ASSERTIONS_SILENT "") +set(CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED "") +set(CONFIG_OPTIMIZATION_ASSERTION_LEVEL "2") +set(CONFIG_CXX_EXCEPTIONS "") +set(CONFIG_STACK_CHECK_NONE "y") +set(CONFIG_STACK_CHECK_NORM "") +set(CONFIG_STACK_CHECK_STRONG "") +set(CONFIG_STACK_CHECK_ALL "") +set(CONFIG_WARN_WRITE_STRINGS "") +set(CONFIG_ESP32_APPTRACE_DEST_TRAX "") +set(CONFIG_ESP32_APPTRACE_DEST_NONE "y") +set(CONFIG_ESP32_APPTRACE_LOCK_ENABLE "y") +set(CONFIG_ADC2_DISABLE_DAC "y") +set(CONFIG_MCPWM_ISR_IN_IRAM "") +set(CONFIG_EVENT_LOOP_PROFILING "") +set(CONFIG_POST_EVENTS_FROM_ISR "y") +set(CONFIG_POST_EVENTS_FROM_IRAM_ISR "y") +set(CONFIG_GDBSTUB_SUPPORT_TASKS "y") +set(CONFIG_GDBSTUB_MAX_TASKS "32") +set(CONFIG_OTA_ALLOW_HTTP "") +set(CONFIG_TWO_UNIVERSAL_MAC_ADDRESS "") +set(CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS "y") +set(CONFIG_NUMBER_OF_UNIVERSAL_MAC_ADDRESS "4") +set(CONFIG_ESP_SYSTEM_PD_FLASH "") +set(CONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAY "2000") +set(CONFIG_ESP_SLEEP_DEEP_SLEEP_WAKEUP_DELAY "2000") +set(CONFIG_ESP32_RTC_CLK_SRC_INT_RC "y") +set(CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC "y") +set(CONFIG_ESP32_RTC_CLK_SRC_EXT_CRYS "") +set(CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_CRYSTAL "") +set(CONFIG_ESP32_RTC_CLK_SRC_EXT_OSC "") +set(CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_OSC "") +set(CONFIG_ESP32_RTC_CLK_SRC_INT_8MD256 "") +set(CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_8MD256 "") +set(CONFIG_ESP32_RTC_CLK_CAL_CYCLES "1024") +set(CONFIG_ESP32_XTAL_FREQ_26 "") +set(CONFIG_ESP32_XTAL_FREQ_40 "y") +set(CONFIG_ESP32_XTAL_FREQ_AUTO "") +set(CONFIG_ESP32_XTAL_FREQ "40") +set(CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE "y") +set(CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION "") +set(CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER "20") +set(CONFIG_ESP32_PHY_MAX_TX_POWER "20") +set(CONFIG_REDUCE_PHY_TX_POWER "") +set(CONFIG_ESP32_REDUCE_PHY_TX_POWER "") +set(CONFIG_SPIRAM_SUPPORT "") +set(CONFIG_ESP32_SPIRAM_SUPPORT "") +set(CONFIG_ESP32_DEFAULT_CPU_FREQ_80 "") +set(CONFIG_ESP32_DEFAULT_CPU_FREQ_160 "y") +set(CONFIG_ESP32_DEFAULT_CPU_FREQ_240 "") +set(CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ "160") +set(CONFIG_TRACEMEM_RESERVE_DRAM "0x0") +set(CONFIG_ESP32_PANIC_PRINT_HALT "") +set(CONFIG_ESP32_PANIC_PRINT_REBOOT "y") +set(CONFIG_ESP32_PANIC_SILENT_REBOOT "") +set(CONFIG_ESP32_PANIC_GDBSTUB "") +set(CONFIG_SYSTEM_EVENT_QUEUE_SIZE "32") +set(CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE "2304") +set(CONFIG_MAIN_TASK_STACK_SIZE "3584") +set(CONFIG_CONSOLE_UART_DEFAULT "y") +set(CONFIG_CONSOLE_UART_CUSTOM "") +set(CONFIG_CONSOLE_UART_NONE "") +set(CONFIG_ESP_CONSOLE_UART_NONE "") +set(CONFIG_CONSOLE_UART "y") +set(CONFIG_CONSOLE_UART_NUM "0") +set(CONFIG_CONSOLE_UART_BAUDRATE "115200") +set(CONFIG_INT_WDT "y") +set(CONFIG_INT_WDT_TIMEOUT_MS "300") +set(CONFIG_INT_WDT_CHECK_CPU1 "y") +set(CONFIG_TASK_WDT "y") +set(CONFIG_ESP_TASK_WDT "y") +set(CONFIG_TASK_WDT_PANIC "") +set(CONFIG_TASK_WDT_TIMEOUT_S "5") +set(CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0 "y") +set(CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1 "y") +set(CONFIG_ESP32_DEBUG_STUBS_ENABLE "") +set(CONFIG_ESP32_DEBUG_OCDAWARE "y") +set(CONFIG_BROWNOUT_DET "y") +set(CONFIG_ESP32_BROWNOUT_DET "y") +set(CONFIG_BROWNOUT_DET_LVL_SEL_0 "y") +set(CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_0 "y") +set(CONFIG_BROWNOUT_DET_LVL_SEL_1 "") +set(CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_1 "") +set(CONFIG_BROWNOUT_DET_LVL_SEL_2 "") +set(CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_2 "") +set(CONFIG_BROWNOUT_DET_LVL_SEL_3 "") +set(CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_3 "") +set(CONFIG_BROWNOUT_DET_LVL_SEL_4 "") +set(CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_4 "") +set(CONFIG_BROWNOUT_DET_LVL_SEL_5 "") +set(CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_5 "") +set(CONFIG_BROWNOUT_DET_LVL_SEL_6 "") +set(CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_6 "") +set(CONFIG_BROWNOUT_DET_LVL_SEL_7 "") +set(CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_7 "") +set(CONFIG_BROWNOUT_DET_LVL "0") +set(CONFIG_ESP32_BROWNOUT_DET_LVL "0") +set(CONFIG_DISABLE_BASIC_ROM_CONSOLE "") +set(CONFIG_IPC_TASK_STACK_SIZE "1024") +set(CONFIG_TIMER_TASK_STACK_SIZE "3584") +set(CONFIG_ESP32_WIFI_ENABLED "y") +set(CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM "10") +set(CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM "32") +set(CONFIG_ESP32_WIFI_STATIC_TX_BUFFER "") +set(CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER "y") +set(CONFIG_ESP32_WIFI_TX_BUFFER_TYPE "1") +set(CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM "32") +set(CONFIG_ESP32_WIFI_CSI_ENABLED "") +set(CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED "y") +set(CONFIG_ESP32_WIFI_TX_BA_WIN "6") +set(CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED "y") +set(CONFIG_ESP32_WIFI_RX_BA_WIN "6") +set(CONFIG_ESP32_WIFI_NVS_ENABLED "y") +set(CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0 "y") +set(CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1 "") +set(CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN "752") +set(CONFIG_ESP32_WIFI_MGMT_SBUF_NUM "32") +set(CONFIG_ESP32_WIFI_IRAM_OPT "y") +set(CONFIG_ESP32_WIFI_RX_IRAM_OPT "y") +set(CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE "y") +set(CONFIG_ESP32_WIFI_ENABLE_WPA3_OWE_STA "y") +set(CONFIG_WPA_MBEDTLS_CRYPTO "y") +set(CONFIG_WPA_MBEDTLS_TLS_CLIENT "y") +set(CONFIG_WPA_WAPI_PSK "") +set(CONFIG_WPA_11KV_SUPPORT "") +set(CONFIG_WPA_MBO_SUPPORT "") +set(CONFIG_WPA_DPP_SUPPORT "") +set(CONFIG_WPA_11R_SUPPORT "") +set(CONFIG_WPA_WPS_SOFTAP_REGISTRAR "") +set(CONFIG_WPA_WPS_STRICT "") +set(CONFIG_WPA_DEBUG_PRINT "") +set(CONFIG_WPA_TESTING_OPTIONS "") +set(CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH "") +set(CONFIG_ESP32_ENABLE_COREDUMP_TO_UART "") +set(CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE "y") +set(CONFIG_TIMER_TASK_PRIORITY "1") +set(CONFIG_TIMER_TASK_STACK_DEPTH "2048") +set(CONFIG_TIMER_QUEUE_LENGTH "10") +set(CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK "") +set(CONFIG_HAL_ASSERTION_SILIENT "") +set(CONFIG_L2_TO_L3_COPY "") +set(CONFIG_ESP_GRATUITOUS_ARP "y") +set(CONFIG_GARP_TMR_INTERVAL "60") +set(CONFIG_TCPIP_RECVMBOX_SIZE "32") +set(CONFIG_TCP_MAXRTX "12") +set(CONFIG_TCP_SYNMAXRTX "12") +set(CONFIG_TCP_MSS "1440") +set(CONFIG_TCP_MSL "60000") +set(CONFIG_TCP_SND_BUF_DEFAULT "5760") +set(CONFIG_TCP_WND_DEFAULT "5760") +set(CONFIG_TCP_RECVMBOX_SIZE "6") +set(CONFIG_TCP_QUEUE_OOSEQ "y") +set(CONFIG_TCP_OVERSIZE_MSS "y") +set(CONFIG_TCP_OVERSIZE_QUARTER_MSS "") +set(CONFIG_TCP_OVERSIZE_DISABLE "") +set(CONFIG_UDP_RECVMBOX_SIZE "6") +set(CONFIG_TCPIP_TASK_STACK_SIZE "3072") +set(CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY "y") +set(CONFIG_TCPIP_TASK_AFFINITY_CPU0 "") +set(CONFIG_TCPIP_TASK_AFFINITY_CPU1 "") +set(CONFIG_TCPIP_TASK_AFFINITY "0x7fffffff") +set(CONFIG_PPP_SUPPORT "") +set(CONFIG_ESP32_TIME_SYSCALL_USE_RTC_HRT "y") +set(CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1 "y") +set(CONFIG_ESP32_TIME_SYSCALL_USE_RTC "") +set(CONFIG_ESP32_TIME_SYSCALL_USE_HRT "") +set(CONFIG_ESP32_TIME_SYSCALL_USE_FRC1 "") +set(CONFIG_ESP32_TIME_SYSCALL_USE_NONE "") +set(CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT "5") +set(CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT "3072") +set(CONFIG_ESP32_PTHREAD_STACK_MIN "768") +set(CONFIG_ESP32_DEFAULT_PTHREAD_CORE_NO_AFFINITY "y") +set(CONFIG_ESP32_DEFAULT_PTHREAD_CORE_0 "") +set(CONFIG_ESP32_DEFAULT_PTHREAD_CORE_1 "") +set(CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT "-1") +set(CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT "pthread") +set(CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS "y") +set(CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS "") +set(CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED "") +set(CONFIG_ESP32_ULP_COPROC_ENABLED "") +set(CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT "y") +set(CONFIG_SUPPORT_TERMIOS "y") +set(CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS "1") diff --git a/ESP32-IDF_Temperture-Node-v2/build/config/sdkconfig.h b/ESP32-IDF_Temperture-Node-v2/build/config/sdkconfig.h new file mode 100644 index 000000000..067b3305c --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/build/config/sdkconfig.h @@ -0,0 +1,854 @@ +/* + * Automatically generated file. DO NOT EDIT. + * Espressif IoT Development Framework (ESP-IDF) 5.4.1 Configuration Header + */ +#pragma once +#define CONFIG_SOC_BROWNOUT_RESET_SUPPORTED "Not determined" +#define CONFIG_SOC_TWAI_BRP_DIV_SUPPORTED "Not determined" +#define CONFIG_SOC_DPORT_WORKAROUND "Not determined" +#define CONFIG_SOC_CAPS_ECO_VER_MAX 301 +#define CONFIG_SOC_ADC_SUPPORTED 1 +#define CONFIG_SOC_DAC_SUPPORTED 1 +#define CONFIG_SOC_UART_SUPPORTED 1 +#define CONFIG_SOC_MCPWM_SUPPORTED 1 +#define CONFIG_SOC_GPTIMER_SUPPORTED 1 +#define CONFIG_SOC_SDMMC_HOST_SUPPORTED 1 +#define CONFIG_SOC_BT_SUPPORTED 1 +#define CONFIG_SOC_PCNT_SUPPORTED 1 +#define CONFIG_SOC_PHY_SUPPORTED 1 +#define CONFIG_SOC_WIFI_SUPPORTED 1 +#define CONFIG_SOC_SDIO_SLAVE_SUPPORTED 1 +#define CONFIG_SOC_TWAI_SUPPORTED 1 +#define CONFIG_SOC_EFUSE_SUPPORTED 1 +#define CONFIG_SOC_EMAC_SUPPORTED 1 +#define CONFIG_SOC_ULP_SUPPORTED 1 +#define CONFIG_SOC_CCOMP_TIMER_SUPPORTED 1 +#define CONFIG_SOC_RTC_FAST_MEM_SUPPORTED 1 +#define CONFIG_SOC_RTC_SLOW_MEM_SUPPORTED 1 +#define CONFIG_SOC_RTC_MEM_SUPPORTED 1 +#define CONFIG_SOC_I2S_SUPPORTED 1 +#define CONFIG_SOC_RMT_SUPPORTED 1 +#define CONFIG_SOC_SDM_SUPPORTED 1 +#define CONFIG_SOC_GPSPI_SUPPORTED 1 +#define CONFIG_SOC_LEDC_SUPPORTED 1 +#define CONFIG_SOC_I2C_SUPPORTED 1 +#define CONFIG_SOC_SUPPORT_COEXISTENCE 1 +#define CONFIG_SOC_AES_SUPPORTED 1 +#define CONFIG_SOC_MPI_SUPPORTED 1 +#define CONFIG_SOC_SHA_SUPPORTED 1 +#define CONFIG_SOC_FLASH_ENC_SUPPORTED 1 +#define CONFIG_SOC_SECURE_BOOT_SUPPORTED 1 +#define CONFIG_SOC_TOUCH_SENSOR_SUPPORTED 1 +#define CONFIG_SOC_BOD_SUPPORTED 1 +#define CONFIG_SOC_ULP_FSM_SUPPORTED 1 +#define CONFIG_SOC_CLK_TREE_SUPPORTED 1 +#define CONFIG_SOC_MPU_SUPPORTED 1 +#define CONFIG_SOC_WDT_SUPPORTED 1 +#define CONFIG_SOC_SPI_FLASH_SUPPORTED 1 +#define CONFIG_SOC_RNG_SUPPORTED 1 +#define CONFIG_SOC_LIGHT_SLEEP_SUPPORTED 1 +#define CONFIG_SOC_DEEP_SLEEP_SUPPORTED 1 +#define CONFIG_SOC_LP_PERIPH_SHARE_INTERRUPT 1 +#define CONFIG_SOC_PM_SUPPORTED 1 +#define CONFIG_SOC_DPORT_WORKAROUND_DIS_INTERRUPT_LVL 5 +#define CONFIG_SOC_XTAL_SUPPORT_26M 1 +#define CONFIG_SOC_XTAL_SUPPORT_40M 1 +#define CONFIG_SOC_XTAL_SUPPORT_AUTO_DETECT 1 +#define CONFIG_SOC_ADC_RTC_CTRL_SUPPORTED 1 +#define CONFIG_SOC_ADC_DIG_CTRL_SUPPORTED 1 +#define CONFIG_SOC_ADC_DMA_SUPPORTED 1 +#define CONFIG_SOC_ADC_PERIPH_NUM 2 +#define CONFIG_SOC_ADC_MAX_CHANNEL_NUM 10 +#define CONFIG_SOC_ADC_ATTEN_NUM 4 +#define CONFIG_SOC_ADC_DIGI_CONTROLLER_NUM 2 +#define CONFIG_SOC_ADC_PATT_LEN_MAX 16 +#define CONFIG_SOC_ADC_DIGI_MIN_BITWIDTH 9 +#define CONFIG_SOC_ADC_DIGI_MAX_BITWIDTH 12 +#define CONFIG_SOC_ADC_DIGI_RESULT_BYTES 2 +#define CONFIG_SOC_ADC_DIGI_DATA_BYTES_PER_CONV 4 +#define CONFIG_SOC_ADC_DIGI_MONITOR_NUM 0 +#define CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH 2 +#define CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW 20 +#define CONFIG_SOC_ADC_RTC_MIN_BITWIDTH 9 +#define CONFIG_SOC_ADC_RTC_MAX_BITWIDTH 12 +#define CONFIG_SOC_ADC_SHARED_POWER 1 +#define CONFIG_SOC_SHARED_IDCACHE_SUPPORTED 1 +#define CONFIG_SOC_IDCACHE_PER_CORE 1 +#define CONFIG_SOC_CPU_CORES_NUM 2 +#define CONFIG_SOC_CPU_INTR_NUM 32 +#define CONFIG_SOC_CPU_HAS_FPU 1 +#define CONFIG_SOC_HP_CPU_HAS_MULTIPLE_CORES 1 +#define CONFIG_SOC_CPU_BREAKPOINTS_NUM 2 +#define CONFIG_SOC_CPU_WATCHPOINTS_NUM 2 +#define CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE 64 +#define CONFIG_SOC_DAC_CHAN_NUM 2 +#define CONFIG_SOC_DAC_RESOLUTION 8 +#define CONFIG_SOC_DAC_DMA_16BIT_ALIGN 1 +#define CONFIG_SOC_GPIO_PORT 1 +#define CONFIG_SOC_GPIO_PIN_COUNT 40 +#define CONFIG_SOC_GPIO_VALID_GPIO_MASK 0xFFFFFFFFFF +#define CONFIG_SOC_GPIO_IN_RANGE_MAX 39 +#define CONFIG_SOC_GPIO_OUT_RANGE_MAX 33 +#define CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK 0xEF0FEA +#define CONFIG_SOC_GPIO_CLOCKOUT_BY_IO_MUX 1 +#define CONFIG_SOC_GPIO_CLOCKOUT_CHANNEL_NUM 3 +#define CONFIG_SOC_GPIO_SUPPORT_HOLD_IO_IN_DSLP 1 +#define CONFIG_SOC_I2C_NUM 2 +#define CONFIG_SOC_HP_I2C_NUM 2 +#define CONFIG_SOC_I2C_FIFO_LEN 32 +#define CONFIG_SOC_I2C_CMD_REG_NUM 16 +#define CONFIG_SOC_I2C_SUPPORT_SLAVE 1 +#define CONFIG_SOC_I2C_SUPPORT_APB 1 +#define CONFIG_SOC_I2C_SUPPORT_10BIT_ADDR 1 +#define CONFIG_SOC_I2C_STOP_INDEPENDENT 1 +#define CONFIG_SOC_I2S_NUM 2 +#define CONFIG_SOC_I2S_HW_VERSION_1 1 +#define CONFIG_SOC_I2S_SUPPORTS_APLL 1 +#define CONFIG_SOC_I2S_SUPPORTS_PLL_F160M 1 +#define CONFIG_SOC_I2S_SUPPORTS_PDM 1 +#define CONFIG_SOC_I2S_SUPPORTS_PDM_TX 1 +#define CONFIG_SOC_I2S_PDM_MAX_TX_LINES 1 +#define CONFIG_SOC_I2S_SUPPORTS_PDM_RX 1 +#define CONFIG_SOC_I2S_PDM_MAX_RX_LINES 1 +#define CONFIG_SOC_I2S_SUPPORTS_ADC_DAC 1 +#define CONFIG_SOC_I2S_SUPPORTS_ADC 1 +#define CONFIG_SOC_I2S_SUPPORTS_DAC 1 +#define CONFIG_SOC_I2S_SUPPORTS_LCD_CAMERA 1 +#define CONFIG_SOC_I2S_MAX_DATA_WIDTH 24 +#define CONFIG_SOC_I2S_TRANS_SIZE_ALIGN_WORD 1 +#define CONFIG_SOC_I2S_LCD_I80_VARIANT 1 +#define CONFIG_SOC_LCD_I80_SUPPORTED 1 +#define CONFIG_SOC_LCD_I80_BUSES 2 +#define CONFIG_SOC_LCD_I80_BUS_WIDTH 24 +#define CONFIG_SOC_LEDC_HAS_TIMER_SPECIFIC_MUX 1 +#define CONFIG_SOC_LEDC_SUPPORT_APB_CLOCK 1 +#define CONFIG_SOC_LEDC_SUPPORT_REF_TICK 1 +#define CONFIG_SOC_LEDC_SUPPORT_HS_MODE 1 +#define CONFIG_SOC_LEDC_TIMER_NUM 4 +#define CONFIG_SOC_LEDC_CHANNEL_NUM 8 +#define CONFIG_SOC_LEDC_TIMER_BIT_WIDTH 20 +#define CONFIG_SOC_MCPWM_GROUPS 2 +#define CONFIG_SOC_MCPWM_TIMERS_PER_GROUP 3 +#define CONFIG_SOC_MCPWM_OPERATORS_PER_GROUP 3 +#define CONFIG_SOC_MCPWM_COMPARATORS_PER_OPERATOR 2 +#define CONFIG_SOC_MCPWM_GENERATORS_PER_OPERATOR 2 +#define CONFIG_SOC_MCPWM_TRIGGERS_PER_OPERATOR 2 +#define CONFIG_SOC_MCPWM_GPIO_FAULTS_PER_GROUP 3 +#define CONFIG_SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP 1 +#define CONFIG_SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER 3 +#define CONFIG_SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP 3 +#define CONFIG_SOC_MMU_PERIPH_NUM 2 +#define CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM 3 +#define CONFIG_SOC_MPU_MIN_REGION_SIZE 0x20000000 +#define CONFIG_SOC_MPU_REGIONS_MAX_NUM 8 +#define CONFIG_SOC_PCNT_GROUPS 1 +#define CONFIG_SOC_PCNT_UNITS_PER_GROUP 8 +#define CONFIG_SOC_PCNT_CHANNELS_PER_UNIT 2 +#define CONFIG_SOC_PCNT_THRES_POINT_PER_UNIT 2 +#define CONFIG_SOC_RMT_GROUPS 1 +#define CONFIG_SOC_RMT_TX_CANDIDATES_PER_GROUP 8 +#define CONFIG_SOC_RMT_RX_CANDIDATES_PER_GROUP 8 +#define CONFIG_SOC_RMT_CHANNELS_PER_GROUP 8 +#define CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL 64 +#define CONFIG_SOC_RMT_SUPPORT_REF_TICK 1 +#define CONFIG_SOC_RMT_SUPPORT_APB 1 +#define CONFIG_SOC_RMT_CHANNEL_CLK_INDEPENDENT 1 +#define CONFIG_SOC_RTCIO_PIN_COUNT 18 +#define CONFIG_SOC_RTCIO_INPUT_OUTPUT_SUPPORTED 1 +#define CONFIG_SOC_RTCIO_HOLD_SUPPORTED 1 +#define CONFIG_SOC_RTCIO_WAKE_SUPPORTED 1 +#define CONFIG_SOC_SDM_GROUPS 1 +#define CONFIG_SOC_SDM_CHANNELS_PER_GROUP 8 +#define CONFIG_SOC_SDM_CLK_SUPPORT_APB 1 +#define CONFIG_SOC_SPI_HD_BOTH_INOUT_SUPPORTED 1 +#define CONFIG_SOC_SPI_AS_CS_SUPPORTED 1 +#define CONFIG_SOC_SPI_PERIPH_NUM 3 +#define CONFIG_SOC_SPI_DMA_CHAN_NUM 2 +#define CONFIG_SOC_SPI_MAX_CS_NUM 3 +#define CONFIG_SOC_SPI_SUPPORT_CLK_APB 1 +#define CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE 64 +#define CONFIG_SOC_SPI_MAX_PRE_DIVIDER 8192 +#define CONFIG_SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED 1 +#define CONFIG_SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED 1 +#define CONFIG_SOC_MEMSPI_SRC_FREQ_26M_SUPPORTED 1 +#define CONFIG_SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED 1 +#define CONFIG_SOC_TIMER_GROUPS 2 +#define CONFIG_SOC_TIMER_GROUP_TIMERS_PER_GROUP 2 +#define CONFIG_SOC_TIMER_GROUP_COUNTER_BIT_WIDTH 64 +#define CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS 4 +#define CONFIG_SOC_TIMER_GROUP_SUPPORT_APB 1 +#define CONFIG_SOC_LP_TIMER_BIT_WIDTH_LO 32 +#define CONFIG_SOC_LP_TIMER_BIT_WIDTH_HI 16 +#define CONFIG_SOC_TOUCH_SENSOR_VERSION 1 +#define CONFIG_SOC_TOUCH_SENSOR_NUM 10 +#define CONFIG_SOC_TOUCH_SAMPLE_CFG_NUM 1 +#define CONFIG_SOC_TWAI_CONTROLLER_NUM 1 +#define CONFIG_SOC_TWAI_BRP_MIN 2 +#define CONFIG_SOC_TWAI_CLK_SUPPORT_APB 1 +#define CONFIG_SOC_TWAI_SUPPORT_MULTI_ADDRESS_LAYOUT 1 +#define CONFIG_SOC_UART_NUM 3 +#define CONFIG_SOC_UART_HP_NUM 3 +#define CONFIG_SOC_UART_SUPPORT_APB_CLK 1 +#define CONFIG_SOC_UART_SUPPORT_REF_TICK 1 +#define CONFIG_SOC_UART_FIFO_LEN 128 +#define CONFIG_SOC_UART_BITRATE_MAX 5000000 +#define CONFIG_SOC_SPIRAM_SUPPORTED 1 +#define CONFIG_SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE 1 +#define CONFIG_SOC_SHA_SUPPORT_PARALLEL_ENG 1 +#define CONFIG_SOC_SHA_ENDIANNESS_BE 1 +#define CONFIG_SOC_SHA_SUPPORT_SHA1 1 +#define CONFIG_SOC_SHA_SUPPORT_SHA256 1 +#define CONFIG_SOC_SHA_SUPPORT_SHA384 1 +#define CONFIG_SOC_SHA_SUPPORT_SHA512 1 +#define CONFIG_SOC_MPI_MEM_BLOCKS_NUM 4 +#define CONFIG_SOC_MPI_OPERATIONS_NUM 1 +#define CONFIG_SOC_RSA_MAX_BIT_LEN 4096 +#define CONFIG_SOC_AES_SUPPORT_AES_128 1 +#define CONFIG_SOC_AES_SUPPORT_AES_192 1 +#define CONFIG_SOC_AES_SUPPORT_AES_256 1 +#define CONFIG_SOC_SECURE_BOOT_V1 1 +#define CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS 1 +#define CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX 32 +#define CONFIG_SOC_PHY_DIG_REGS_MEM_SIZE 21 +#define CONFIG_SOC_PM_SUPPORT_EXT0_WAKEUP 1 +#define CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP 1 +#define CONFIG_SOC_PM_SUPPORT_EXT_WAKEUP 1 +#define CONFIG_SOC_PM_SUPPORT_TOUCH_SENSOR_WAKEUP 1 +#define CONFIG_SOC_PM_SUPPORT_RTC_PERIPH_PD 1 +#define CONFIG_SOC_PM_SUPPORT_RTC_FAST_MEM_PD 1 +#define CONFIG_SOC_PM_SUPPORT_RTC_SLOW_MEM_PD 1 +#define CONFIG_SOC_PM_SUPPORT_RC_FAST_PD 1 +#define CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD 1 +#define CONFIG_SOC_PM_SUPPORT_MODEM_PD 1 +#define CONFIG_SOC_CONFIGURABLE_VDDSDIO_SUPPORTED 1 +#define CONFIG_SOC_PM_MODEM_PD_BY_SW 1 +#define CONFIG_SOC_CLK_APLL_SUPPORTED 1 +#define CONFIG_SOC_CLK_RC_FAST_D256_SUPPORTED 1 +#define CONFIG_SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256 1 +#define CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION 1 +#define CONFIG_SOC_CLK_XTAL32K_SUPPORTED 1 +#define CONFIG_SOC_SDMMC_USE_IOMUX 1 +#define CONFIG_SOC_SDMMC_NUM_SLOTS 2 +#define CONFIG_SOC_WIFI_WAPI_SUPPORT 1 +#define CONFIG_SOC_WIFI_CSI_SUPPORT 1 +#define CONFIG_SOC_WIFI_MESH_SUPPORT 1 +#define CONFIG_SOC_WIFI_SUPPORT_VARIABLE_BEACON_WINDOW 1 +#define CONFIG_SOC_WIFI_NAN_SUPPORT 1 +#define CONFIG_SOC_BLE_SUPPORTED 1 +#define CONFIG_SOC_BLE_MESH_SUPPORTED 1 +#define CONFIG_SOC_BT_CLASSIC_SUPPORTED 1 +#define CONFIG_SOC_BLUFI_SUPPORTED 1 +#define CONFIG_SOC_BT_H2C_ENC_KEY_CTRL_ENH_VSC_SUPPORTED 1 +#define CONFIG_SOC_ULP_HAS_ADC 1 +#define CONFIG_SOC_PHY_COMBO_MODULE 1 +#define CONFIG_SOC_EMAC_RMII_CLK_OUT_INTERNAL_LOOPBACK 1 +#define CONFIG_IDF_CMAKE 1 +#define CONFIG_IDF_TOOLCHAIN "gcc" +#define CONFIG_IDF_TOOLCHAIN_GCC 1 +#define CONFIG_IDF_TARGET_ARCH_XTENSA 1 +#define CONFIG_IDF_TARGET_ARCH "xtensa" +#define CONFIG_IDF_TARGET "esp32" +#define CONFIG_IDF_INIT_VERSION "5.4.1" +#define CONFIG_IDF_TARGET_ESP32 1 +#define CONFIG_IDF_FIRMWARE_CHIP_ID 0x0000 +#define CONFIG_APP_BUILD_TYPE_APP_2NDBOOT 1 +#define CONFIG_APP_BUILD_GENERATE_BINARIES 1 +#define CONFIG_APP_BUILD_BOOTLOADER 1 +#define CONFIG_APP_BUILD_USE_FLASH_SECTIONS 1 +#define CONFIG_BOOTLOADER_COMPILE_TIME_DATE 1 +#define CONFIG_BOOTLOADER_PROJECT_VER 1 +#define CONFIG_BOOTLOADER_OFFSET_IN_FLASH 0x1000 +#define CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE 1 +#define CONFIG_BOOTLOADER_LOG_LEVEL_INFO 1 +#define CONFIG_BOOTLOADER_LOG_LEVEL 3 +#define CONFIG_BOOTLOADER_LOG_TIMESTAMP_SOURCE_CPU_TICKS 1 +#define CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT 1 +#define CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V 1 +#define CONFIG_BOOTLOADER_REGION_PROTECTION_ENABLE 1 +#define CONFIG_BOOTLOADER_WDT_ENABLE 1 +#define CONFIG_BOOTLOADER_WDT_TIME_MS 9000 +#define CONFIG_BOOTLOADER_RESERVE_RTC_SIZE 0x0 +#define CONFIG_SECURE_BOOT_V1_SUPPORTED 1 +#define CONFIG_APP_COMPILE_TIME_DATE 1 +#define CONFIG_APP_RETRIEVE_LEN_ELF_SHA 9 +#define CONFIG_ESP_ROM_HAS_CRC_LE 1 +#define CONFIG_ESP_ROM_HAS_CRC_BE 1 +#define CONFIG_ESP_ROM_HAS_MZ_CRC32 1 +#define CONFIG_ESP_ROM_HAS_JPEG_DECODE 1 +#define CONFIG_ESP_ROM_HAS_UART_BUF_SWITCH 1 +#define CONFIG_ESP_ROM_NEEDS_SWSETUP_WORKAROUND 1 +#define CONFIG_ESP_ROM_HAS_NEWLIB 1 +#define CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT 1 +#define CONFIG_ESP_ROM_HAS_NEWLIB_32BIT_TIME 1 +#define CONFIG_ESP_ROM_HAS_SW_FLOAT 1 +#define CONFIG_ESP_ROM_USB_OTG_NUM -1 +#define CONFIG_ESP_ROM_USB_SERIAL_DEVICE_NUM -1 +#define CONFIG_ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB 1 +#define CONFIG_ESP_ROM_HAS_OUTPUT_PUTC_FUNC 1 +#define CONFIG_ESPTOOLPY_FLASHMODE_DIO 1 +#define CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_STR 1 +#define CONFIG_ESPTOOLPY_FLASHMODE "dio" +#define CONFIG_ESPTOOLPY_FLASHFREQ_40M 1 +#define CONFIG_ESPTOOLPY_FLASHFREQ "40m" +#define CONFIG_ESPTOOLPY_FLASHSIZE_2MB 1 +#define CONFIG_ESPTOOLPY_FLASHSIZE "2MB" +#define CONFIG_ESPTOOLPY_BEFORE_RESET 1 +#define CONFIG_ESPTOOLPY_BEFORE "default_reset" +#define CONFIG_ESPTOOLPY_AFTER_RESET 1 +#define CONFIG_ESPTOOLPY_AFTER "hard_reset" +#define CONFIG_ESPTOOLPY_MONITOR_BAUD 115200 +#define CONFIG_PARTITION_TABLE_SINGLE_APP 1 +#define CONFIG_PARTITION_TABLE_CUSTOM_FILENAME "partitions.csv" +#define CONFIG_PARTITION_TABLE_FILENAME "partitions_singleapp.csv" +#define CONFIG_PARTITION_TABLE_OFFSET 0x8000 +#define CONFIG_PARTITION_TABLE_MD5 1 +#define CONFIG_COMPILER_OPTIMIZATION_DEBUG 1 +#define CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE 1 +#define CONFIG_COMPILER_ASSERT_NDEBUG_EVALUATE 1 +#define CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB 1 +#define CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL 2 +#define CONFIG_COMPILER_HIDE_PATHS_MACROS 1 +#define CONFIG_COMPILER_STACK_CHECK_MODE_NONE 1 +#define CONFIG_COMPILER_DISABLE_DEFAULT_ERRORS 1 +#define CONFIG_COMPILER_RT_LIB_GCCLIB 1 +#define CONFIG_COMPILER_RT_LIB_NAME "gcc" +#define CONFIG_COMPILER_ORPHAN_SECTIONS_WARNING 1 +#define CONFIG_APPTRACE_DEST_NONE 1 +#define CONFIG_APPTRACE_DEST_UART_NONE 1 +#define CONFIG_APPTRACE_UART_TASK_PRIO 1 +#define CONFIG_APPTRACE_LOCK_ENABLE 1 +#define CONFIG_BT_ALARM_MAX_NUM 50 +#define CONFIG_TWAI_ERRATA_FIX_BUS_OFF_REC 1 +#define CONFIG_TWAI_ERRATA_FIX_TX_INTR_LOST 1 +#define CONFIG_TWAI_ERRATA_FIX_RX_FRAME_INVALID 1 +#define CONFIG_TWAI_ERRATA_FIX_RX_FIFO_CORRUPT 1 +#define CONFIG_TWAI_ERRATA_FIX_LISTEN_ONLY_DOM 1 +#define CONFIG_ADC_DISABLE_DAC 1 +#define CONFIG_ADC_CAL_EFUSE_TP_ENABLE 1 +#define CONFIG_ADC_CAL_EFUSE_VREF_ENABLE 1 +#define CONFIG_ADC_CAL_LUT_ENABLE 1 +#define CONFIG_EFUSE_CODE_SCHEME_COMPAT_3_4 1 +#define CONFIG_EFUSE_MAX_BLK_LEN 192 +#define CONFIG_ESP_TLS_USING_MBEDTLS 1 +#define CONFIG_ADC_CALI_EFUSE_TP_ENABLE 1 +#define CONFIG_ADC_CALI_EFUSE_VREF_ENABLE 1 +#define CONFIG_ADC_CALI_LUT_ENABLE 1 +#define CONFIG_ADC_DISABLE_DAC_OUTPUT 1 +#define CONFIG_ESP_COEX_ENABLED 1 +#define CONFIG_ESP_ERR_TO_NAME_LOOKUP 1 +#define CONFIG_DAC_DMA_AUTO_16BIT_ALIGN 1 +#define CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM 1 +#define CONFIG_SPI_MASTER_ISR_IN_IRAM 1 +#define CONFIG_SPI_SLAVE_ISR_IN_IRAM 1 +#define CONFIG_ETH_ENABLED 1 +#define CONFIG_ETH_USE_ESP32_EMAC 1 +#define CONFIG_ETH_PHY_INTERFACE_RMII 1 +#define CONFIG_ETH_RMII_CLK_INPUT 1 +#define CONFIG_ETH_RMII_CLK_IN_GPIO 0 +#define CONFIG_ETH_DMA_BUFFER_SIZE 512 +#define CONFIG_ETH_DMA_RX_BUFFER_NUM 10 +#define CONFIG_ETH_DMA_TX_BUFFER_NUM 10 +#define CONFIG_ETH_USE_SPI_ETHERNET 1 +#define CONFIG_ESP_EVENT_POST_FROM_ISR 1 +#define CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR 1 +#define CONFIG_ESP_GDBSTUB_ENABLED 1 +#define CONFIG_ESP_GDBSTUB_SUPPORT_TASKS 1 +#define CONFIG_ESP_GDBSTUB_MAX_TASKS 32 +#define CONFIG_ESPHID_TASK_SIZE_BT 2048 +#define CONFIG_ESPHID_TASK_SIZE_BLE 4096 +#define CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS 1 +#define CONFIG_ESP_HTTP_CLIENT_EVENT_POST_TIMEOUT 2000 +#define CONFIG_HTTPD_MAX_REQ_HDR_LEN 512 +#define CONFIG_HTTPD_MAX_URI_LEN 512 +#define CONFIG_HTTPD_ERR_RESP_NO_DELAY 1 +#define CONFIG_HTTPD_PURGE_BUF_LEN 32 +#define CONFIG_HTTPD_SERVER_EVENT_POST_TIMEOUT 2000 +#define CONFIG_ESP_HTTPS_OTA_EVENT_POST_TIMEOUT 2000 +#define CONFIG_ESP_HTTPS_SERVER_EVENT_POST_TIMEOUT 2000 +#define CONFIG_ESP32_REV_MIN_0 1 +#define CONFIG_ESP32_REV_MIN 0 +#define CONFIG_ESP32_REV_MIN_FULL 0 +#define CONFIG_ESP_REV_MIN_FULL 0 +#define CONFIG_ESP32_REV_MAX_FULL 399 +#define CONFIG_ESP_REV_MAX_FULL 399 +#define CONFIG_ESP_EFUSE_BLOCK_REV_MIN_FULL 0 +#define CONFIG_ESP_EFUSE_BLOCK_REV_MAX_FULL 99 +#define CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA 1 +#define CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP 1 +#define CONFIG_ESP_MAC_ADDR_UNIVERSE_BT 1 +#define CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH 1 +#define CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR 1 +#define CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES 4 +#define CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_FOUR 1 +#define CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES 4 +#define CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND 1 +#define CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND 1 +#define CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY 2000 +#define CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS 1 +#define CONFIG_RTC_CLK_SRC_INT_RC 1 +#define CONFIG_RTC_CLK_CAL_CYCLES 1024 +#define CONFIG_PERIPH_CTRL_FUNC_IN_IRAM 1 +#define CONFIG_XTAL_FREQ_40 1 +#define CONFIG_XTAL_FREQ 40 +#define CONFIG_ESP_SPI_BUS_LOCK_ISR_FUNCS_IN_IRAM 1 +#define CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL 120 +#define CONFIG_ESP_NETIF_TCPIP_LWIP 1 +#define CONFIG_ESP_NETIF_USES_TCPIP_WITH_BSD_API 1 +#define CONFIG_ESP_NETIF_REPORT_DATA_TRAFFIC 1 +#define CONFIG_ESP_PHY_ENABLED 1 +#define CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE 1 +#define CONFIG_ESP_PHY_MAX_WIFI_TX_POWER 20 +#define CONFIG_ESP_PHY_MAX_TX_POWER 20 +#define CONFIG_ESP_PHY_RF_CAL_PARTIAL 1 +#define CONFIG_ESP_PHY_CALIBRATION_MODE 0 +#define CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160 1 +#define CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ 160 +#define CONFIG_ESP32_TRACEMEM_RESERVE_DRAM 0x0 +#define CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT 1 +#define CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS 0 +#define CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE 32 +#define CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE 2304 +#define CONFIG_ESP_MAIN_TASK_STACK_SIZE 3584 +#define CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0 1 +#define CONFIG_ESP_MAIN_TASK_AFFINITY 0x0 +#define CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE 2048 +#define CONFIG_ESP_CONSOLE_UART_DEFAULT 1 +#define CONFIG_ESP_CONSOLE_UART 1 +#define CONFIG_ESP_CONSOLE_UART_NUM 0 +#define CONFIG_ESP_CONSOLE_ROM_SERIAL_PORT_NUM 0 +#define CONFIG_ESP_CONSOLE_UART_BAUDRATE 115200 +#define CONFIG_ESP_INT_WDT 1 +#define CONFIG_ESP_INT_WDT_TIMEOUT_MS 300 +#define CONFIG_ESP_INT_WDT_CHECK_CPU1 1 +#define CONFIG_ESP_TASK_WDT_EN 1 +#define CONFIG_ESP_TASK_WDT_INIT 1 +#define CONFIG_ESP_TASK_WDT_TIMEOUT_S 5 +#define CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0 1 +#define CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1 1 +#define CONFIG_ESP_DEBUG_OCDAWARE 1 +#define CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4 1 +#define CONFIG_ESP_BROWNOUT_DET 1 +#define CONFIG_ESP_BROWNOUT_DET_LVL_SEL_0 1 +#define CONFIG_ESP_BROWNOUT_DET_LVL 0 +#define CONFIG_ESP_SYSTEM_BROWNOUT_INTR 1 +#define CONFIG_ESP_IPC_TASK_STACK_SIZE 1024 +#define CONFIG_ESP_IPC_USES_CALLERS_PRIORITY 1 +#define CONFIG_ESP_IPC_ISR_ENABLE 1 +#define CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER 1 +#define CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER 1 +#define CONFIG_ESP_TIMER_TASK_STACK_SIZE 3584 +#define CONFIG_ESP_TIMER_INTERRUPT_LEVEL 1 +#define CONFIG_ESP_TIMER_TASK_AFFINITY 0x0 +#define CONFIG_ESP_TIMER_TASK_AFFINITY_CPU0 1 +#define CONFIG_ESP_TIMER_ISR_AFFINITY_CPU0 1 +#define CONFIG_ESP_TIMER_IMPL_TG0_LAC 1 +#define CONFIG_ESP_WIFI_ENABLED 1 +#define CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM 10 +#define CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM 32 +#define CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER 1 +#define CONFIG_ESP_WIFI_TX_BUFFER_TYPE 1 +#define CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER_NUM 32 +#define CONFIG_ESP_WIFI_STATIC_RX_MGMT_BUFFER 1 +#define CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF 0 +#define CONFIG_ESP_WIFI_RX_MGMT_BUF_NUM_DEF 5 +#define CONFIG_ESP_WIFI_AMPDU_TX_ENABLED 1 +#define CONFIG_ESP_WIFI_TX_BA_WIN 6 +#define CONFIG_ESP_WIFI_AMPDU_RX_ENABLED 1 +#define CONFIG_ESP_WIFI_RX_BA_WIN 6 +#define CONFIG_ESP_WIFI_NVS_ENABLED 1 +#define CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_0 1 +#define CONFIG_ESP_WIFI_SOFTAP_BEACON_MAX_LEN 752 +#define CONFIG_ESP_WIFI_MGMT_SBUF_NUM 32 +#define CONFIG_ESP_WIFI_IRAM_OPT 1 +#define CONFIG_ESP_WIFI_RX_IRAM_OPT 1 +#define CONFIG_ESP_WIFI_ENABLE_WPA3_SAE 1 +#define CONFIG_ESP_WIFI_ENABLE_SAE_PK 1 +#define CONFIG_ESP_WIFI_SOFTAP_SAE_SUPPORT 1 +#define CONFIG_ESP_WIFI_ENABLE_WPA3_OWE_STA 1 +#define CONFIG_ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME 50 +#define CONFIG_ESP_WIFI_SLP_DEFAULT_MAX_ACTIVE_TIME 10 +#define CONFIG_ESP_WIFI_SLP_DEFAULT_WAIT_BROADCAST_DATA_TIME 15 +#define CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE 1 +#define CONFIG_ESP_WIFI_GMAC_SUPPORT 1 +#define CONFIG_ESP_WIFI_SOFTAP_SUPPORT 1 +#define CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM 7 +#define CONFIG_ESP_WIFI_MBEDTLS_CRYPTO 1 +#define CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT 1 +#define CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT 1 +#define CONFIG_ESP_COREDUMP_ENABLE_TO_NONE 1 +#define CONFIG_FATFS_VOLUME_COUNT 2 +#define CONFIG_FATFS_LFN_NONE 1 +#define CONFIG_FATFS_SECTOR_4096 1 +#define CONFIG_FATFS_CODEPAGE_437 1 +#define CONFIG_FATFS_CODEPAGE 437 +#define CONFIG_FATFS_FS_LOCK 0 +#define CONFIG_FATFS_TIMEOUT_MS 10000 +#define CONFIG_FATFS_PER_FILE_CACHE 1 +#define CONFIG_FATFS_USE_STRFUNC_NONE 1 +#define CONFIG_FATFS_VFS_FSTAT_BLKSIZE 0 +#define CONFIG_FATFS_LINK_LOCK 1 +#define CONFIG_FREERTOS_HZ 100 +#define CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY 1 +#define CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS 1 +#define CONFIG_FREERTOS_IDLE_TASK_STACKSIZE 1536 +#define CONFIG_FREERTOS_MAX_TASK_NAME_LEN 16 +#define CONFIG_FREERTOS_USE_TIMERS 1 +#define CONFIG_FREERTOS_TIMER_SERVICE_TASK_NAME "Tmr Svc" +#define CONFIG_FREERTOS_TIMER_TASK_NO_AFFINITY 1 +#define CONFIG_FREERTOS_TIMER_SERVICE_TASK_CORE_AFFINITY 0x7FFFFFFF +#define CONFIG_FREERTOS_TIMER_TASK_PRIORITY 1 +#define CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH 2048 +#define CONFIG_FREERTOS_TIMER_QUEUE_LENGTH 10 +#define CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE 0 +#define CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES 1 +#define CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER 1 +#define CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS 1 +#define CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER 1 +#define CONFIG_FREERTOS_ISR_STACKSIZE 1536 +#define CONFIG_FREERTOS_INTERRUPT_BACKTRACE 1 +#define CONFIG_FREERTOS_TICK_SUPPORT_CORETIMER 1 +#define CONFIG_FREERTOS_CORETIMER_0 1 +#define CONFIG_FREERTOS_SYSTICK_USES_CCOUNT 1 +#define CONFIG_FREERTOS_PORT 1 +#define CONFIG_FREERTOS_NO_AFFINITY 0x7FFFFFFF +#define CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION 1 +#define CONFIG_FREERTOS_DEBUG_OCDAWARE 1 +#define CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT 1 +#define CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH 1 +#define CONFIG_FREERTOS_NUMBER_OF_CORES 2 +#define CONFIG_HAL_ASSERTION_EQUALS_SYSTEM 1 +#define CONFIG_HAL_DEFAULT_ASSERTION_LEVEL 2 +#define CONFIG_HAL_SPI_MASTER_FUNC_IN_IRAM 1 +#define CONFIG_HAL_SPI_SLAVE_FUNC_IN_IRAM 1 +#define CONFIG_HEAP_POISONING_DISABLED 1 +#define CONFIG_HEAP_TRACING_OFF 1 +#define CONFIG_LOG_DEFAULT_LEVEL_INFO 1 +#define CONFIG_LOG_DEFAULT_LEVEL 3 +#define CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT 1 +#define CONFIG_LOG_MAXIMUM_LEVEL 3 +#define CONFIG_LOG_DYNAMIC_LEVEL_CONTROL 1 +#define CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_AND_LINKED_LIST 1 +#define CONFIG_LOG_TAG_LEVEL_CACHE_BINARY_MIN_HEAP 1 +#define CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_SIZE 31 +#define CONFIG_LOG_TIMESTAMP_SOURCE_RTOS 1 +#define CONFIG_LWIP_ENABLE 1 +#define CONFIG_LWIP_LOCAL_HOSTNAME "espressif" +#define CONFIG_LWIP_TCPIP_TASK_PRIO 18 +#define CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES 1 +#define CONFIG_LWIP_TIMERS_ONDEMAND 1 +#define CONFIG_LWIP_ND6 1 +#define CONFIG_LWIP_MAX_SOCKETS 10 +#define CONFIG_LWIP_SO_REUSE 1 +#define CONFIG_LWIP_SO_REUSE_RXTOALL 1 +#define CONFIG_LWIP_IP_DEFAULT_TTL 64 +#define CONFIG_LWIP_IP4_FRAG 1 +#define CONFIG_LWIP_IP6_FRAG 1 +#define CONFIG_LWIP_IP_REASS_MAX_PBUFS 10 +#define CONFIG_LWIP_ESP_GRATUITOUS_ARP 1 +#define CONFIG_LWIP_GARP_TMR_INTERVAL 60 +#define CONFIG_LWIP_ESP_MLDV6_REPORT 1 +#define CONFIG_LWIP_MLDV6_TMR_INTERVAL 40 +#define CONFIG_LWIP_TCPIP_RECVMBOX_SIZE 32 +#define CONFIG_LWIP_DHCP_DOES_ARP_CHECK 1 +#define CONFIG_LWIP_DHCP_DISABLE_VENDOR_CLASS_ID 1 +#define CONFIG_LWIP_DHCP_OPTIONS_LEN 68 +#define CONFIG_LWIP_NUM_NETIF_CLIENT_DATA 0 +#define CONFIG_LWIP_DHCP_COARSE_TIMER_SECS 1 +#define CONFIG_LWIP_DHCPS 1 +#define CONFIG_LWIP_DHCPS_LEASE_UNIT 60 +#define CONFIG_LWIP_DHCPS_MAX_STATION_NUM 8 +#define CONFIG_LWIP_DHCPS_STATIC_ENTRIES 1 +#define CONFIG_LWIP_DHCPS_ADD_DNS 1 +#define CONFIG_LWIP_IPV4 1 +#define CONFIG_LWIP_IPV6 1 +#define CONFIG_LWIP_IPV6_NUM_ADDRESSES 3 +#define CONFIG_LWIP_NETIF_LOOPBACK 1 +#define CONFIG_LWIP_LOOPBACK_MAX_PBUFS 8 +#define CONFIG_LWIP_MAX_ACTIVE_TCP 16 +#define CONFIG_LWIP_MAX_LISTENING_TCP 16 +#define CONFIG_LWIP_TCP_HIGH_SPEED_RETRANSMISSION 1 +#define CONFIG_LWIP_TCP_MAXRTX 12 +#define CONFIG_LWIP_TCP_SYNMAXRTX 12 +#define CONFIG_LWIP_TCP_MSS 1440 +#define CONFIG_LWIP_TCP_TMR_INTERVAL 250 +#define CONFIG_LWIP_TCP_MSL 60000 +#define CONFIG_LWIP_TCP_FIN_WAIT_TIMEOUT 20000 +#define CONFIG_LWIP_TCP_SND_BUF_DEFAULT 5760 +#define CONFIG_LWIP_TCP_WND_DEFAULT 5760 +#define CONFIG_LWIP_TCP_RECVMBOX_SIZE 6 +#define CONFIG_LWIP_TCP_ACCEPTMBOX_SIZE 6 +#define CONFIG_LWIP_TCP_QUEUE_OOSEQ 1 +#define CONFIG_LWIP_TCP_OOSEQ_TIMEOUT 6 +#define CONFIG_LWIP_TCP_OOSEQ_MAX_PBUFS 4 +#define CONFIG_LWIP_TCP_OVERSIZE_MSS 1 +#define CONFIG_LWIP_TCP_RTO_TIME 1500 +#define CONFIG_LWIP_MAX_UDP_PCBS 16 +#define CONFIG_LWIP_UDP_RECVMBOX_SIZE 6 +#define CONFIG_LWIP_CHECKSUM_CHECK_ICMP 1 +#define CONFIG_LWIP_TCPIP_TASK_STACK_SIZE 3072 +#define CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY 1 +#define CONFIG_LWIP_TCPIP_TASK_AFFINITY 0x7FFFFFFF +#define CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE 3 +#define CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS 5 +#define CONFIG_LWIP_IPV6_ND6_NUM_PREFIXES 5 +#define CONFIG_LWIP_IPV6_ND6_NUM_ROUTERS 3 +#define CONFIG_LWIP_IPV6_ND6_NUM_DESTINATIONS 10 +#define CONFIG_LWIP_ICMP 1 +#define CONFIG_LWIP_MAX_RAW_PCBS 16 +#define CONFIG_LWIP_SNTP_MAX_SERVERS 1 +#define CONFIG_LWIP_SNTP_UPDATE_DELAY 3600000 +#define CONFIG_LWIP_SNTP_STARTUP_DELAY 1 +#define CONFIG_LWIP_SNTP_MAXIMUM_STARTUP_DELAY 5000 +#define CONFIG_LWIP_DNS_MAX_HOST_IP 1 +#define CONFIG_LWIP_DNS_MAX_SERVERS 3 +#define CONFIG_LWIP_BRIDGEIF_MAX_PORTS 7 +#define CONFIG_LWIP_ESP_LWIP_ASSERT 1 +#define CONFIG_LWIP_HOOK_TCP_ISN_DEFAULT 1 +#define CONFIG_LWIP_HOOK_IP6_ROUTE_NONE 1 +#define CONFIG_LWIP_HOOK_ND6_GET_GW_NONE 1 +#define CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_NONE 1 +#define CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE 1 +#define CONFIG_LWIP_HOOK_DNS_EXT_RESOLVE_NONE 1 +#define CONFIG_LWIP_HOOK_IP6_INPUT_DEFAULT 1 +#define CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC 1 +#define CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN 1 +#define CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN 16384 +#define CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN 4096 +#define CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE 1 +#define CONFIG_MBEDTLS_PKCS7_C 1 +#define CONFIG_MBEDTLS_CERTIFICATE_BUNDLE 1 +#define CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL 1 +#define CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS 200 +#define CONFIG_MBEDTLS_CMAC_C 1 +#define CONFIG_MBEDTLS_HARDWARE_AES 1 +#define CONFIG_MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER 1 +#define CONFIG_MBEDTLS_HARDWARE_MPI 1 +#define CONFIG_MBEDTLS_HARDWARE_SHA 1 +#define CONFIG_MBEDTLS_ROM_MD5 1 +#define CONFIG_MBEDTLS_HAVE_TIME 1 +#define CONFIG_MBEDTLS_ECDSA_DETERMINISTIC 1 +#define CONFIG_MBEDTLS_SHA512_C 1 +#define CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT 1 +#define CONFIG_MBEDTLS_TLS_SERVER 1 +#define CONFIG_MBEDTLS_TLS_CLIENT 1 +#define CONFIG_MBEDTLS_TLS_ENABLED 1 +#define CONFIG_MBEDTLS_KEY_EXCHANGE_RSA 1 +#define CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE 1 +#define CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA 1 +#define CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA 1 +#define CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA 1 +#define CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA 1 +#define CONFIG_MBEDTLS_SSL_RENEGOTIATION 1 +#define CONFIG_MBEDTLS_SSL_PROTO_TLS1_2 1 +#define CONFIG_MBEDTLS_SSL_ALPN 1 +#define CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS 1 +#define CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS 1 +#define CONFIG_MBEDTLS_AES_C 1 +#define CONFIG_MBEDTLS_CCM_C 1 +#define CONFIG_MBEDTLS_GCM_C 1 +#define CONFIG_MBEDTLS_PEM_PARSE_C 1 +#define CONFIG_MBEDTLS_PEM_WRITE_C 1 +#define CONFIG_MBEDTLS_X509_CRL_PARSE_C 1 +#define CONFIG_MBEDTLS_X509_CSR_PARSE_C 1 +#define CONFIG_MBEDTLS_ECP_C 1 +#define CONFIG_MBEDTLS_PK_PARSE_EC_EXTENDED 1 +#define CONFIG_MBEDTLS_PK_PARSE_EC_COMPRESSED 1 +#define CONFIG_MBEDTLS_ECDH_C 1 +#define CONFIG_MBEDTLS_ECDSA_C 1 +#define CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED 1 +#define CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED 1 +#define CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED 1 +#define CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED 1 +#define CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED 1 +#define CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED 1 +#define CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED 1 +#define CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED 1 +#define CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED 1 +#define CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED 1 +#define CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED 1 +#define CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED 1 +#define CONFIG_MBEDTLS_ECP_NIST_OPTIM 1 +#define CONFIG_MBEDTLS_ERROR_STRINGS 1 +#define CONFIG_MBEDTLS_FS_IO 1 +#define CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF 1 +#define CONFIG_NEWLIB_STDIN_LINE_ENDING_CR 1 +#define CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT 1 +#define CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_0 1 +#define CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_1 1 +#define CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_2 1 +#define CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_PATCH_VERSION 1 +#define CONFIG_PTHREAD_TASK_PRIO_DEFAULT 5 +#define CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT 3072 +#define CONFIG_PTHREAD_STACK_MIN 768 +#define CONFIG_PTHREAD_DEFAULT_CORE_NO_AFFINITY 1 +#define CONFIG_PTHREAD_TASK_CORE_DEFAULT -1 +#define CONFIG_PTHREAD_TASK_NAME_DEFAULT "pthread" +#define CONFIG_MMU_PAGE_SIZE_64KB 1 +#define CONFIG_MMU_PAGE_MODE "64KB" +#define CONFIG_MMU_PAGE_SIZE 0x10000 +#define CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC 1 +#define CONFIG_SPI_FLASH_BROWNOUT_RESET 1 +#define CONFIG_SPI_FLASH_SUSPEND_TSUS_VAL_US 50 +#define CONFIG_SPI_FLASH_ROM_DRIVER_PATCH 1 +#define CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS 1 +#define CONFIG_SPI_FLASH_YIELD_DURING_ERASE 1 +#define CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS 20 +#define CONFIG_SPI_FLASH_ERASE_YIELD_TICKS 1 +#define CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE 8192 +#define CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORTED 1 +#define CONFIG_SPI_FLASH_VENDOR_GD_SUPPORTED 1 +#define CONFIG_SPI_FLASH_VENDOR_ISSI_SUPPORTED 1 +#define CONFIG_SPI_FLASH_VENDOR_MXIC_SUPPORTED 1 +#define CONFIG_SPI_FLASH_VENDOR_WINBOND_SUPPORTED 1 +#define CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP 1 +#define CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP 1 +#define CONFIG_SPI_FLASH_SUPPORT_GD_CHIP 1 +#define CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP 1 +#define CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE 1 +#define CONFIG_SPIFFS_MAX_PARTITIONS 3 +#define CONFIG_SPIFFS_CACHE 1 +#define CONFIG_SPIFFS_CACHE_WR 1 +#define CONFIG_SPIFFS_PAGE_CHECK 1 +#define CONFIG_SPIFFS_GC_MAX_RUNS 10 +#define CONFIG_SPIFFS_PAGE_SIZE 256 +#define CONFIG_SPIFFS_OBJ_NAME_LEN 32 +#define CONFIG_SPIFFS_USE_MAGIC 1 +#define CONFIG_SPIFFS_USE_MAGIC_LENGTH 1 +#define CONFIG_SPIFFS_META_LENGTH 4 +#define CONFIG_SPIFFS_USE_MTIME 1 +#define CONFIG_WS_TRANSPORT 1 +#define CONFIG_WS_BUFFER_SIZE 1024 +#define CONFIG_UNITY_ENABLE_FLOAT 1 +#define CONFIG_UNITY_ENABLE_DOUBLE 1 +#define CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER 1 +#define CONFIG_VFS_SUPPORT_IO 1 +#define CONFIG_VFS_SUPPORT_DIR 1 +#define CONFIG_VFS_SUPPORT_SELECT 1 +#define CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT 1 +#define CONFIG_VFS_SUPPORT_TERMIOS 1 +#define CONFIG_VFS_MAX_COUNT 8 +#define CONFIG_VFS_SEMIHOSTFS_MAX_MOUNT_POINTS 1 +#define CONFIG_VFS_INITIALIZE_DEV_NULL 1 +#define CONFIG_WL_SECTOR_SIZE_4096 1 +#define CONFIG_WL_SECTOR_SIZE 4096 +#define CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES 16 +#define CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT 30 +#define CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN 1 +#define CONFIG_CU_DIAGNOSTICS_COLOR_ALWAYS 1 +#define CONFIG_I2C_BUS_DYNAMIC_CONFIG 1 +#define CONFIG_I2C_MS_TO_WAIT 200 +#define CONFIG_MQTT_PROTOCOL_311 1 +#define CONFIG_MQTT_TRANSPORT_SSL 1 +#define CONFIG_MQTT_TRANSPORT_WEBSOCKET 1 +#define CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE 1 + +/* List of deprecated options */ +#define CONFIG_ADC2_DISABLE_DAC CONFIG_ADC_DISABLE_DAC +#define CONFIG_BROWNOUT_DET CONFIG_ESP_BROWNOUT_DET +#define CONFIG_BROWNOUT_DET_LVL CONFIG_ESP_BROWNOUT_DET_LVL +#define CONFIG_BROWNOUT_DET_LVL_SEL_0 CONFIG_ESP_BROWNOUT_DET_LVL_SEL_0 +#define CONFIG_COMPILER_OPTIMIZATION_DEFAULT CONFIG_COMPILER_OPTIMIZATION_DEBUG +#define CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG CONFIG_COMPILER_OPTIMIZATION_DEBUG +#define CONFIG_CONSOLE_UART CONFIG_ESP_CONSOLE_UART +#define CONFIG_CONSOLE_UART_BAUDRATE CONFIG_ESP_CONSOLE_UART_BAUDRATE +#define CONFIG_CONSOLE_UART_DEFAULT CONFIG_ESP_CONSOLE_UART_DEFAULT +#define CONFIG_CONSOLE_UART_NUM CONFIG_ESP_CONSOLE_UART_NUM +#define CONFIG_ESP32_APPTRACE_DEST_NONE CONFIG_APPTRACE_DEST_NONE +#define CONFIG_ESP32_APPTRACE_LOCK_ENABLE CONFIG_APPTRACE_LOCK_ENABLE +#define CONFIG_ESP32_BROWNOUT_DET CONFIG_ESP_BROWNOUT_DET +#define CONFIG_ESP32_BROWNOUT_DET_LVL CONFIG_ESP_BROWNOUT_DET_LVL +#define CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_0 CONFIG_ESP_BROWNOUT_DET_LVL_SEL_0 +#define CONFIG_ESP32_DEBUG_OCDAWARE CONFIG_ESP_DEBUG_OCDAWARE +#define CONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAY CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY +#define CONFIG_ESP32_DEFAULT_CPU_FREQ_160 CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160 +#define CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ +#define CONFIG_ESP32_DEFAULT_PTHREAD_CORE_NO_AFFINITY CONFIG_PTHREAD_DEFAULT_CORE_NO_AFFINITY +#define CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE CONFIG_ESP_COREDUMP_ENABLE_TO_NONE +#define CONFIG_ESP32_PANIC_PRINT_REBOOT CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT +#define CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE +#define CONFIG_ESP32_PHY_MAX_TX_POWER CONFIG_ESP_PHY_MAX_TX_POWER +#define CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER CONFIG_ESP_PHY_MAX_WIFI_TX_POWER +#define CONFIG_ESP32_PTHREAD_STACK_MIN CONFIG_PTHREAD_STACK_MIN +#define CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT CONFIG_PTHREAD_TASK_CORE_DEFAULT +#define CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT CONFIG_PTHREAD_TASK_NAME_DEFAULT +#define CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT CONFIG_PTHREAD_TASK_PRIO_DEFAULT +#define CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT +#define CONFIG_ESP32_RTC_CLK_CAL_CYCLES CONFIG_RTC_CLK_CAL_CYCLES +#define CONFIG_ESP32_RTC_CLK_SRC_INT_RC CONFIG_RTC_CLK_SRC_INT_RC +#define CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC CONFIG_RTC_CLK_SRC_INT_RC +#define CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1 CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT +#define CONFIG_ESP32_TIME_SYSCALL_USE_RTC_HRT CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT +#define CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED CONFIG_ESP_WIFI_AMPDU_RX_ENABLED +#define CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED CONFIG_ESP_WIFI_AMPDU_TX_ENABLED +#define CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM +#define CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER +#define CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER_NUM +#define CONFIG_ESP32_WIFI_ENABLED CONFIG_ESP_WIFI_ENABLED +#define CONFIG_ESP32_WIFI_ENABLE_WPA3_OWE_STA CONFIG_ESP_WIFI_ENABLE_WPA3_OWE_STA +#define CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE CONFIG_ESP_WIFI_ENABLE_WPA3_SAE +#define CONFIG_ESP32_WIFI_IRAM_OPT CONFIG_ESP_WIFI_IRAM_OPT +#define CONFIG_ESP32_WIFI_MGMT_SBUF_NUM CONFIG_ESP_WIFI_MGMT_SBUF_NUM +#define CONFIG_ESP32_WIFI_NVS_ENABLED CONFIG_ESP_WIFI_NVS_ENABLED +#define CONFIG_ESP32_WIFI_RX_BA_WIN CONFIG_ESP_WIFI_RX_BA_WIN +#define CONFIG_ESP32_WIFI_RX_IRAM_OPT CONFIG_ESP_WIFI_RX_IRAM_OPT +#define CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN CONFIG_ESP_WIFI_SOFTAP_BEACON_MAX_LEN +#define CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM +#define CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0 CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_0 +#define CONFIG_ESP32_WIFI_TX_BA_WIN CONFIG_ESP_WIFI_TX_BA_WIN +#define CONFIG_ESP32_WIFI_TX_BUFFER_TYPE CONFIG_ESP_WIFI_TX_BUFFER_TYPE +#define CONFIG_ESP32_XTAL_FREQ CONFIG_XTAL_FREQ +#define CONFIG_ESP32_XTAL_FREQ_40 CONFIG_XTAL_FREQ_40 +#define CONFIG_ESP_GRATUITOUS_ARP CONFIG_LWIP_ESP_GRATUITOUS_ARP +#define CONFIG_ESP_SLEEP_DEEP_SLEEP_WAKEUP_DELAY CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY +#define CONFIG_ESP_TASK_WDT CONFIG_ESP_TASK_WDT_INIT +#define CONFIG_FLASHMODE_DIO CONFIG_ESPTOOLPY_FLASHMODE_DIO +#define CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_FOUR +#define CONFIG_GARP_TMR_INTERVAL CONFIG_LWIP_GARP_TMR_INTERVAL +#define CONFIG_GDBSTUB_MAX_TASKS CONFIG_ESP_GDBSTUB_MAX_TASKS +#define CONFIG_GDBSTUB_SUPPORT_TASKS CONFIG_ESP_GDBSTUB_SUPPORT_TASKS +#define CONFIG_INT_WDT CONFIG_ESP_INT_WDT +#define CONFIG_INT_WDT_CHECK_CPU1 CONFIG_ESP_INT_WDT_CHECK_CPU1 +#define CONFIG_INT_WDT_TIMEOUT_MS CONFIG_ESP_INT_WDT_TIMEOUT_MS +#define CONFIG_IPC_TASK_STACK_SIZE CONFIG_ESP_IPC_TASK_STACK_SIZE +#define CONFIG_LOG_BOOTLOADER_LEVEL CONFIG_BOOTLOADER_LOG_LEVEL +#define CONFIG_LOG_BOOTLOADER_LEVEL_INFO CONFIG_BOOTLOADER_LOG_LEVEL_INFO +#define CONFIG_MAIN_TASK_STACK_SIZE CONFIG_ESP_MAIN_TASK_STACK_SIZE +#define CONFIG_MONITOR_BAUD CONFIG_ESPTOOLPY_MONITOR_BAUD +#define CONFIG_NUMBER_OF_UNIVERSAL_MAC_ADDRESS CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES +#define CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE +#define CONFIG_OPTIMIZATION_ASSERTION_LEVEL CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL +#define CONFIG_OPTIMIZATION_LEVEL_DEBUG CONFIG_COMPILER_OPTIMIZATION_DEBUG +#define CONFIG_POST_EVENTS_FROM_IRAM_ISR CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR +#define CONFIG_POST_EVENTS_FROM_ISR CONFIG_ESP_EVENT_POST_FROM_ISR +#define CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS CONFIG_VFS_SEMIHOSTFS_MAX_MOUNT_POINTS +#define CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS +#define CONFIG_STACK_CHECK_NONE CONFIG_COMPILER_STACK_CHECK_MODE_NONE +#define CONFIG_SUPPORT_TERMIOS CONFIG_VFS_SUPPORT_TERMIOS +#define CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT +#define CONFIG_SYSTEM_EVENT_QUEUE_SIZE CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE +#define CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE +#define CONFIG_TASK_WDT CONFIG_ESP_TASK_WDT_INIT +#define CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0 CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0 +#define CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1 CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1 +#define CONFIG_TASK_WDT_TIMEOUT_S CONFIG_ESP_TASK_WDT_TIMEOUT_S +#define CONFIG_TCPIP_RECVMBOX_SIZE CONFIG_LWIP_TCPIP_RECVMBOX_SIZE +#define CONFIG_TCPIP_TASK_AFFINITY CONFIG_LWIP_TCPIP_TASK_AFFINITY +#define CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY +#define CONFIG_TCPIP_TASK_STACK_SIZE CONFIG_LWIP_TCPIP_TASK_STACK_SIZE +#define CONFIG_TCP_MAXRTX CONFIG_LWIP_TCP_MAXRTX +#define CONFIG_TCP_MSL CONFIG_LWIP_TCP_MSL +#define CONFIG_TCP_MSS CONFIG_LWIP_TCP_MSS +#define CONFIG_TCP_OVERSIZE_MSS CONFIG_LWIP_TCP_OVERSIZE_MSS +#define CONFIG_TCP_QUEUE_OOSEQ CONFIG_LWIP_TCP_QUEUE_OOSEQ +#define CONFIG_TCP_RECVMBOX_SIZE CONFIG_LWIP_TCP_RECVMBOX_SIZE +#define CONFIG_TCP_SND_BUF_DEFAULT CONFIG_LWIP_TCP_SND_BUF_DEFAULT +#define CONFIG_TCP_SYNMAXRTX CONFIG_LWIP_TCP_SYNMAXRTX +#define CONFIG_TCP_WND_DEFAULT CONFIG_LWIP_TCP_WND_DEFAULT +#define CONFIG_TIMER_QUEUE_LENGTH CONFIG_FREERTOS_TIMER_QUEUE_LENGTH +#define CONFIG_TIMER_TASK_PRIORITY CONFIG_FREERTOS_TIMER_TASK_PRIORITY +#define CONFIG_TIMER_TASK_STACK_DEPTH CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH +#define CONFIG_TIMER_TASK_STACK_SIZE CONFIG_ESP_TIMER_TASK_STACK_SIZE +#define CONFIG_TRACEMEM_RESERVE_DRAM CONFIG_ESP32_TRACEMEM_RESERVE_DRAM +#define CONFIG_UDP_RECVMBOX_SIZE CONFIG_LWIP_UDP_RECVMBOX_SIZE +#define CONFIG_WPA_MBEDTLS_CRYPTO CONFIG_ESP_WIFI_MBEDTLS_CRYPTO +#define CONFIG_WPA_MBEDTLS_TLS_CLIENT CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT diff --git a/ESP32-IDF_Temperture-Node-v2/build/config/sdkconfig.json b/ESP32-IDF_Temperture-Node-v2/build/config/sdkconfig.json new file mode 100644 index 000000000..183c2ea91 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/build/config/sdkconfig.json @@ -0,0 +1,1204 @@ +{ + "ADC_CALI_EFUSE_TP_ENABLE": true, + "ADC_CALI_EFUSE_VREF_ENABLE": true, + "ADC_CALI_LUT_ENABLE": true, + "ADC_CALI_SUPPRESS_DEPRECATE_WARN": false, + "ADC_CAL_EFUSE_TP_ENABLE": true, + "ADC_CAL_EFUSE_VREF_ENABLE": true, + "ADC_CAL_LUT_ENABLE": true, + "ADC_CONTINUOUS_ISR_IRAM_SAFE": false, + "ADC_DISABLE_DAC": true, + "ADC_DISABLE_DAC_OUTPUT": true, + "ADC_ENABLE_DEBUG_LOG": false, + "ADC_ONESHOT_CTRL_FUNC_IN_IRAM": false, + "ADC_SKIP_LEGACY_CONFLICT_CHECK": false, + "ADC_SUPPRESS_DEPRECATE_WARN": false, + "APPTRACE_DEST_JTAG": false, + "APPTRACE_DEST_NONE": true, + "APPTRACE_DEST_UART1": false, + "APPTRACE_DEST_UART2": false, + "APPTRACE_DEST_UART_NONE": true, + "APPTRACE_LOCK_ENABLE": true, + "APPTRACE_UART_TASK_PRIO": 1, + "APP_BUILD_BOOTLOADER": true, + "APP_BUILD_GENERATE_BINARIES": true, + "APP_BUILD_TYPE_APP_2NDBOOT": true, + "APP_BUILD_TYPE_RAM": false, + "APP_BUILD_USE_FLASH_SECTIONS": true, + "APP_COMPATIBLE_PRE_V2_1_BOOTLOADERS": false, + "APP_COMPATIBLE_PRE_V3_1_BOOTLOADERS": false, + "APP_COMPILE_TIME_DATE": true, + "APP_EXCLUDE_PROJECT_NAME_VAR": false, + "APP_EXCLUDE_PROJECT_VER_VAR": false, + "APP_NO_BLOBS": false, + "APP_PROJECT_VER_FROM_CONFIG": false, + "APP_REPRODUCIBLE_BUILD": false, + "APP_RETRIEVE_LEN_ELF_SHA": 9, + "BOOTLOADER_APP_ROLLBACK_ENABLE": false, + "BOOTLOADER_APP_TEST": false, + "BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG": false, + "BOOTLOADER_COMPILER_OPTIMIZATION_NONE": false, + "BOOTLOADER_COMPILER_OPTIMIZATION_PERF": false, + "BOOTLOADER_COMPILER_OPTIMIZATION_SIZE": true, + "BOOTLOADER_COMPILE_TIME_DATE": true, + "BOOTLOADER_CUSTOM_RESERVE_RTC": false, + "BOOTLOADER_FACTORY_RESET": false, + "BOOTLOADER_FLASH_DC_AWARE": false, + "BOOTLOADER_FLASH_XMC_SUPPORT": true, + "BOOTLOADER_LOG_COLORS": false, + "BOOTLOADER_LOG_LEVEL": 3, + "BOOTLOADER_LOG_LEVEL_DEBUG": false, + "BOOTLOADER_LOG_LEVEL_ERROR": false, + "BOOTLOADER_LOG_LEVEL_INFO": true, + "BOOTLOADER_LOG_LEVEL_NONE": false, + "BOOTLOADER_LOG_LEVEL_VERBOSE": false, + "BOOTLOADER_LOG_LEVEL_WARN": false, + "BOOTLOADER_LOG_TIMESTAMP_SOURCE_CPU_TICKS": true, + "BOOTLOADER_OFFSET_IN_FLASH": 4096, + "BOOTLOADER_PROJECT_VER": 1, + "BOOTLOADER_REGION_PROTECTION_ENABLE": true, + "BOOTLOADER_RESERVE_RTC_SIZE": 0, + "BOOTLOADER_SKIP_VALIDATE_ALWAYS": false, + "BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP": false, + "BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON": false, + "BOOTLOADER_VDDSDIO_BOOST_1_8V": false, + "BOOTLOADER_VDDSDIO_BOOST_1_9V": true, + "BOOTLOADER_WDT_DISABLE_IN_USER_CODE": false, + "BOOTLOADER_WDT_ENABLE": true, + "BOOTLOADER_WDT_TIME_MS": 9000, + "BT_ALARM_MAX_NUM": 50, + "BT_ENABLED": false, + "COMPILER_ASSERT_NDEBUG_EVALUATE": true, + "COMPILER_CXX_EXCEPTIONS": false, + "COMPILER_CXX_RTTI": false, + "COMPILER_DISABLE_DEFAULT_ERRORS": true, + "COMPILER_DISABLE_GCC12_WARNINGS": false, + "COMPILER_DISABLE_GCC13_WARNINGS": false, + "COMPILER_DISABLE_GCC14_WARNINGS": false, + "COMPILER_DUMP_RTL_FILES": false, + "COMPILER_FLOAT_LIB_FROM_GCCLIB": true, + "COMPILER_HIDE_PATHS_MACROS": true, + "COMPILER_NO_MERGE_CONSTANTS": false, + "COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE": false, + "COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE": true, + "COMPILER_OPTIMIZATION_ASSERTIONS_SILENT": false, + "COMPILER_OPTIMIZATION_ASSERTION_LEVEL": 2, + "COMPILER_OPTIMIZATION_CHECKS_SILENT": false, + "COMPILER_OPTIMIZATION_DEBUG": true, + "COMPILER_OPTIMIZATION_NONE": false, + "COMPILER_OPTIMIZATION_PERF": false, + "COMPILER_OPTIMIZATION_SIZE": false, + "COMPILER_ORPHAN_SECTIONS_PLACE": false, + "COMPILER_ORPHAN_SECTIONS_WARNING": true, + "COMPILER_RT_LIB_GCCLIB": true, + "COMPILER_RT_LIB_NAME": "gcc", + "COMPILER_STACK_CHECK_MODE_ALL": false, + "COMPILER_STACK_CHECK_MODE_NONE": true, + "COMPILER_STACK_CHECK_MODE_NORM": false, + "COMPILER_STACK_CHECK_MODE_STRONG": false, + "COMPILER_STATIC_ANALYZER": false, + "COMPILER_WARN_WRITE_STRINGS": false, + "CONSOLE_SORTED_HELP": false, + "CU_DIAGNOSTICS_COLOR_ALWAYS": true, + "CU_DIAGNOSTICS_COLOR_AUTO": false, + "CU_DIAGNOSTICS_COLOR_NEVER": false, + "CU_GCC_LTO_ENABLE": false, + "CU_GCC_STRING_1BYTE_ALIGN": false, + "CU_RELINKER_ENABLE": false, + "DAC_CTRL_FUNC_IN_IRAM": false, + "DAC_DMA_AUTO_16BIT_ALIGN": true, + "DAC_ENABLE_DEBUG_LOG": false, + "DAC_ISR_IRAM_SAFE": false, + "DAC_SKIP_LEGACY_CONFLICT_CHECK": false, + "DAC_SUPPRESS_DEPRECATE_WARN": false, + "EFUSE_CODE_SCHEME_COMPAT_3_4": true, + "EFUSE_CODE_SCHEME_COMPAT_NONE": false, + "EFUSE_CODE_SCHEME_COMPAT_REPEAT": false, + "EFUSE_CUSTOM_TABLE": false, + "EFUSE_MAX_BLK_LEN": 192, + "EFUSE_VIRTUAL": false, + "ESP32_DISABLE_BASIC_ROM_CONSOLE": false, + "ESP32_REV_MAX_FULL": 399, + "ESP32_REV_MIN": 0, + "ESP32_REV_MIN_0": true, + "ESP32_REV_MIN_1": false, + "ESP32_REV_MIN_1_1": false, + "ESP32_REV_MIN_2": false, + "ESP32_REV_MIN_3": false, + "ESP32_REV_MIN_3_1": false, + "ESP32_REV_MIN_FULL": 0, + "ESP32_TRACEMEM_RESERVE_DRAM": 0, + "ESP32_TRAX": false, + "ESP32_UNIVERSAL_MAC_ADDRESSES": 4, + "ESP32_UNIVERSAL_MAC_ADDRESSES_FOUR": true, + "ESP32_UNIVERSAL_MAC_ADDRESSES_TWO": false, + "ESP32_USE_FIXED_STATIC_RAM_SIZE": false, + "ESPHID_TASK_SIZE_BLE": 4096, + "ESPHID_TASK_SIZE_BT": 2048, + "ESPTOOLPY_AFTER": "hard_reset", + "ESPTOOLPY_AFTER_NORESET": false, + "ESPTOOLPY_AFTER_RESET": true, + "ESPTOOLPY_BEFORE": "default_reset", + "ESPTOOLPY_BEFORE_NORESET": false, + "ESPTOOLPY_BEFORE_RESET": true, + "ESPTOOLPY_FLASHFREQ": "40m", + "ESPTOOLPY_FLASHFREQ_20M": false, + "ESPTOOLPY_FLASHFREQ_26M": false, + "ESPTOOLPY_FLASHFREQ_40M": true, + "ESPTOOLPY_FLASHFREQ_80M": false, + "ESPTOOLPY_FLASHMODE": "dio", + "ESPTOOLPY_FLASHMODE_DIO": true, + "ESPTOOLPY_FLASHMODE_DOUT": false, + "ESPTOOLPY_FLASHMODE_QIO": false, + "ESPTOOLPY_FLASHMODE_QOUT": false, + "ESPTOOLPY_FLASHSIZE": "2MB", + "ESPTOOLPY_FLASHSIZE_128MB": false, + "ESPTOOLPY_FLASHSIZE_16MB": false, + "ESPTOOLPY_FLASHSIZE_1MB": false, + "ESPTOOLPY_FLASHSIZE_2MB": true, + "ESPTOOLPY_FLASHSIZE_32MB": false, + "ESPTOOLPY_FLASHSIZE_4MB": false, + "ESPTOOLPY_FLASHSIZE_64MB": false, + "ESPTOOLPY_FLASHSIZE_8MB": false, + "ESPTOOLPY_FLASH_SAMPLE_MODE_STR": true, + "ESPTOOLPY_HEADER_FLASHSIZE_UPDATE": false, + "ESPTOOLPY_MONITOR_BAUD": 115200, + "ESPTOOLPY_NO_STUB": false, + "ESP_BROWNOUT_DET": true, + "ESP_BROWNOUT_DET_LVL": 0, + "ESP_BROWNOUT_DET_LVL_SEL_0": true, + "ESP_BROWNOUT_DET_LVL_SEL_1": false, + "ESP_BROWNOUT_DET_LVL_SEL_2": false, + "ESP_BROWNOUT_DET_LVL_SEL_3": false, + "ESP_BROWNOUT_DET_LVL_SEL_4": false, + "ESP_BROWNOUT_DET_LVL_SEL_5": false, + "ESP_BROWNOUT_DET_LVL_SEL_6": false, + "ESP_BROWNOUT_DET_LVL_SEL_7": false, + "ESP_COEX_ENABLED": true, + "ESP_COEX_GPIO_DEBUG": false, + "ESP_CONSOLE_NONE": false, + "ESP_CONSOLE_ROM_SERIAL_PORT_NUM": 0, + "ESP_CONSOLE_UART": true, + "ESP_CONSOLE_UART_BAUDRATE": 115200, + "ESP_CONSOLE_UART_CUSTOM": false, + "ESP_CONSOLE_UART_DEFAULT": true, + "ESP_CONSOLE_UART_NUM": 0, + "ESP_COREDUMP_ENABLE_TO_FLASH": false, + "ESP_COREDUMP_ENABLE_TO_NONE": true, + "ESP_COREDUMP_ENABLE_TO_UART": false, + "ESP_DEBUG_OCDAWARE": true, + "ESP_DEBUG_STUBS_ENABLE": false, + "ESP_DEFAULT_CPU_FREQ_MHZ": 160, + "ESP_DEFAULT_CPU_FREQ_MHZ_160": true, + "ESP_DEFAULT_CPU_FREQ_MHZ_240": false, + "ESP_DEFAULT_CPU_FREQ_MHZ_80": false, + "ESP_EFUSE_BLOCK_REV_MAX_FULL": 99, + "ESP_EFUSE_BLOCK_REV_MIN_FULL": 0, + "ESP_ERR_TO_NAME_LOOKUP": true, + "ESP_EVENT_LOOP_PROFILING": false, + "ESP_EVENT_POST_FROM_IRAM_ISR": true, + "ESP_EVENT_POST_FROM_ISR": true, + "ESP_GDBSTUB_ENABLED": true, + "ESP_GDBSTUB_MAX_TASKS": 32, + "ESP_GDBSTUB_SUPPORT_TASKS": true, + "ESP_HTTPS_OTA_ALLOW_HTTP": false, + "ESP_HTTPS_OTA_DECRYPT_CB": false, + "ESP_HTTPS_OTA_EVENT_POST_TIMEOUT": 2000, + "ESP_HTTPS_SERVER_ENABLE": false, + "ESP_HTTPS_SERVER_EVENT_POST_TIMEOUT": 2000, + "ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH": false, + "ESP_HTTP_CLIENT_ENABLE_CUSTOM_TRANSPORT": false, + "ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH": false, + "ESP_HTTP_CLIENT_ENABLE_HTTPS": true, + "ESP_HTTP_CLIENT_EVENT_POST_TIMEOUT": 2000, + "ESP_INT_WDT": true, + "ESP_INT_WDT_CHECK_CPU1": true, + "ESP_INT_WDT_TIMEOUT_MS": 300, + "ESP_IPC_ISR_ENABLE": true, + "ESP_IPC_TASK_STACK_SIZE": 1024, + "ESP_IPC_USES_CALLERS_PRIORITY": true, + "ESP_MAC_ADDR_UNIVERSE_BT": true, + "ESP_MAC_ADDR_UNIVERSE_ETH": true, + "ESP_MAC_ADDR_UNIVERSE_WIFI_AP": true, + "ESP_MAC_ADDR_UNIVERSE_WIFI_STA": true, + "ESP_MAC_IGNORE_MAC_CRC_ERROR": false, + "ESP_MAC_UNIVERSAL_MAC_ADDRESSES": 4, + "ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR": true, + "ESP_MAC_USE_CUSTOM_MAC_AS_BASE_MAC": false, + "ESP_MAIN_TASK_AFFINITY": 0, + "ESP_MAIN_TASK_AFFINITY_CPU0": true, + "ESP_MAIN_TASK_AFFINITY_CPU1": false, + "ESP_MAIN_TASK_AFFINITY_NO_AFFINITY": false, + "ESP_MAIN_TASK_STACK_SIZE": 3584, + "ESP_MINIMAL_SHARED_STACK_SIZE": 2048, + "ESP_NETIF_BRIDGE_EN": false, + "ESP_NETIF_IP_LOST_TIMER_INTERVAL": 120, + "ESP_NETIF_L2_TAP": false, + "ESP_NETIF_LOOPBACK": false, + "ESP_NETIF_PROVIDE_CUSTOM_IMPLEMENTATION": false, + "ESP_NETIF_RECEIVE_REPORT_ERRORS": false, + "ESP_NETIF_REPORT_DATA_TRAFFIC": true, + "ESP_NETIF_SET_DNS_PER_DEFAULT_NETIF": false, + "ESP_NETIF_TCPIP_LWIP": true, + "ESP_NETIF_USES_TCPIP_WITH_BSD_API": true, + "ESP_PANIC_HANDLER_IRAM": false, + "ESP_PHY_CALIBRATION_AND_DATA_STORAGE": true, + "ESP_PHY_CALIBRATION_MODE": 0, + "ESP_PHY_ENABLED": true, + "ESP_PHY_ENABLE_CERT_TEST": false, + "ESP_PHY_INIT_DATA_IN_PARTITION": false, + "ESP_PHY_MAX_TX_POWER": 20, + "ESP_PHY_MAX_WIFI_TX_POWER": 20, + "ESP_PHY_PLL_TRACK_DEBUG": false, + "ESP_PHY_RECORD_USED_TIME": false, + "ESP_PHY_REDUCE_TX_POWER": false, + "ESP_PHY_RF_CAL_FULL": false, + "ESP_PHY_RF_CAL_NONE": false, + "ESP_PHY_RF_CAL_PARTIAL": true, + "ESP_PROTOCOMM_SUPPORT_SECURITY_PATCH_VERSION": true, + "ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_0": true, + "ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_1": true, + "ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_2": true, + "ESP_REV_MAX_FULL": 399, + "ESP_REV_MIN_FULL": 0, + "ESP_ROM_HAS_CRC_BE": true, + "ESP_ROM_HAS_CRC_LE": true, + "ESP_ROM_HAS_JPEG_DECODE": true, + "ESP_ROM_HAS_MZ_CRC32": true, + "ESP_ROM_HAS_NEWLIB": true, + "ESP_ROM_HAS_NEWLIB_32BIT_TIME": true, + "ESP_ROM_HAS_NEWLIB_NANO_FORMAT": true, + "ESP_ROM_HAS_OUTPUT_PUTC_FUNC": true, + "ESP_ROM_HAS_SW_FLOAT": true, + "ESP_ROM_HAS_UART_BUF_SWITCH": true, + "ESP_ROM_NEEDS_SWSETUP_WORKAROUND": true, + "ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB": true, + "ESP_ROM_USB_OTG_NUM": -1, + "ESP_ROM_USB_SERIAL_DEVICE_NUM": -1, + "ESP_SLEEP_CACHE_SAFE_ASSERTION": false, + "ESP_SLEEP_DEBUG": false, + "ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND": true, + "ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS": true, + "ESP_SLEEP_GPIO_RESET_WORKAROUND": false, + "ESP_SLEEP_MSPI_NEED_ALL_IO_PU": false, + "ESP_SLEEP_POWER_DOWN_FLASH": false, + "ESP_SLEEP_RTC_BUS_ISO_WORKAROUND": true, + "ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY": 2000, + "ESP_SPI_BUS_LOCK_ISR_FUNCS_IN_IRAM": true, + "ESP_SYSTEM_BROWNOUT_INTR": true, + "ESP_SYSTEM_CHECK_INT_LEVEL_4": true, + "ESP_SYSTEM_CHECK_INT_LEVEL_5": false, + "ESP_SYSTEM_ESP32_SRAM1_REGION_AS_IRAM": false, + "ESP_SYSTEM_EVENT_QUEUE_SIZE": 32, + "ESP_SYSTEM_EVENT_TASK_STACK_SIZE": 2304, + "ESP_SYSTEM_GDBSTUB_RUNTIME": false, + "ESP_SYSTEM_PANIC_GDBSTUB": false, + "ESP_SYSTEM_PANIC_PRINT_HALT": false, + "ESP_SYSTEM_PANIC_PRINT_REBOOT": true, + "ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS": 0, + "ESP_SYSTEM_PANIC_SILENT_REBOOT": false, + "ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0": true, + "ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1": true, + "ESP_TASK_WDT_EN": true, + "ESP_TASK_WDT_INIT": true, + "ESP_TASK_WDT_PANIC": false, + "ESP_TASK_WDT_TIMEOUT_S": 5, + "ESP_TIMER_IMPL_TG0_LAC": true, + "ESP_TIMER_INTERRUPT_LEVEL": 1, + "ESP_TIMER_ISR_AFFINITY_CPU0": true, + "ESP_TIMER_PROFILING": false, + "ESP_TIMER_SHOW_EXPERIMENTAL": false, + "ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD": false, + "ESP_TIMER_TASK_AFFINITY": 0, + "ESP_TIMER_TASK_AFFINITY_CPU0": true, + "ESP_TIMER_TASK_STACK_SIZE": 3584, + "ESP_TIME_FUNCS_USE_ESP_TIMER": true, + "ESP_TIME_FUNCS_USE_RTC_TIMER": true, + "ESP_TLS_CLIENT_SESSION_TICKETS": false, + "ESP_TLS_INSECURE": false, + "ESP_TLS_PSK_VERIFICATION": false, + "ESP_TLS_SERVER_CERT_SELECT_HOOK": false, + "ESP_TLS_SERVER_MIN_AUTH_MODE_OPTIONAL": false, + "ESP_TLS_SERVER_SESSION_TICKETS": false, + "ESP_TLS_USE_SECURE_ELEMENT": false, + "ESP_TLS_USING_MBEDTLS": true, + "ESP_WIFI_11KV_SUPPORT": false, + "ESP_WIFI_11R_SUPPORT": false, + "ESP_WIFI_AMPDU_RX_ENABLED": true, + "ESP_WIFI_AMPDU_TX_ENABLED": true, + "ESP_WIFI_CSI_ENABLED": false, + "ESP_WIFI_DEBUG_PRINT": false, + "ESP_WIFI_DPP_SUPPORT": false, + "ESP_WIFI_DYNAMIC_RX_BUFFER_NUM": 32, + "ESP_WIFI_DYNAMIC_RX_MGMT_BUF": 0, + "ESP_WIFI_DYNAMIC_RX_MGMT_BUFFER": false, + "ESP_WIFI_DYNAMIC_TX_BUFFER": true, + "ESP_WIFI_DYNAMIC_TX_BUFFER_NUM": 32, + "ESP_WIFI_ENABLED": true, + "ESP_WIFI_ENABLE_SAE_PK": true, + "ESP_WIFI_ENABLE_WPA3_OWE_STA": true, + "ESP_WIFI_ENABLE_WPA3_SAE": true, + "ESP_WIFI_ENTERPRISE_SUPPORT": true, + "ESP_WIFI_ENT_FREE_DYNAMIC_BUFFER": false, + "ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM": 7, + "ESP_WIFI_EXTRA_IRAM_OPT": false, + "ESP_WIFI_GMAC_SUPPORT": true, + "ESP_WIFI_IRAM_OPT": true, + "ESP_WIFI_MBEDTLS_CRYPTO": true, + "ESP_WIFI_MBEDTLS_TLS_CLIENT": true, + "ESP_WIFI_MBO_SUPPORT": false, + "ESP_WIFI_MGMT_SBUF_NUM": 32, + "ESP_WIFI_NAN_ENABLE": false, + "ESP_WIFI_NVS_ENABLED": true, + "ESP_WIFI_RX_BA_WIN": 6, + "ESP_WIFI_RX_IRAM_OPT": true, + "ESP_WIFI_RX_MGMT_BUF_NUM_DEF": 5, + "ESP_WIFI_SLP_BEACON_LOST_OPT": false, + "ESP_WIFI_SLP_DEFAULT_MAX_ACTIVE_TIME": 10, + "ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME": 50, + "ESP_WIFI_SLP_DEFAULT_WAIT_BROADCAST_DATA_TIME": 15, + "ESP_WIFI_SLP_IRAM_OPT": false, + "ESP_WIFI_SOFTAP_BEACON_MAX_LEN": 752, + "ESP_WIFI_SOFTAP_SAE_SUPPORT": true, + "ESP_WIFI_SOFTAP_SUPPORT": true, + "ESP_WIFI_STATIC_RX_BUFFER_NUM": 10, + "ESP_WIFI_STATIC_RX_MGMT_BUFFER": true, + "ESP_WIFI_STATIC_TX_BUFFER": false, + "ESP_WIFI_STA_DISCONNECTED_PM_ENABLE": true, + "ESP_WIFI_TASK_PINNED_TO_CORE_0": true, + "ESP_WIFI_TASK_PINNED_TO_CORE_1": false, + "ESP_WIFI_TESTING_OPTIONS": false, + "ESP_WIFI_TX_BA_WIN": 6, + "ESP_WIFI_TX_BUFFER_TYPE": 1, + "ESP_WIFI_WAPI_PSK": false, + "ESP_WIFI_WPS_PASSPHRASE": false, + "ESP_WIFI_WPS_SOFTAP_REGISTRAR": false, + "ESP_WIFI_WPS_STRICT": false, + "ETH_DMA_BUFFER_SIZE": 512, + "ETH_DMA_RX_BUFFER_NUM": 10, + "ETH_DMA_TX_BUFFER_NUM": 10, + "ETH_ENABLED": true, + "ETH_IRAM_OPTIMIZATION": false, + "ETH_PHY_INTERFACE_RMII": true, + "ETH_RMII_CLK_INPUT": true, + "ETH_RMII_CLK_IN_GPIO": 0, + "ETH_RMII_CLK_OUTPUT": false, + "ETH_SPI_ETHERNET_DM9051": false, + "ETH_SPI_ETHERNET_KSZ8851SNL": false, + "ETH_SPI_ETHERNET_W5500": false, + "ETH_TRANSMIT_MUTEX": false, + "ETH_USE_ESP32_EMAC": true, + "ETH_USE_OPENETH": false, + "ETH_USE_SPI_ETHERNET": true, + "FATFS_CODEPAGE": 437, + "FATFS_CODEPAGE_437": true, + "FATFS_CODEPAGE_720": false, + "FATFS_CODEPAGE_737": false, + "FATFS_CODEPAGE_771": false, + "FATFS_CODEPAGE_775": false, + "FATFS_CODEPAGE_850": false, + "FATFS_CODEPAGE_852": false, + "FATFS_CODEPAGE_855": false, + "FATFS_CODEPAGE_857": false, + "FATFS_CODEPAGE_860": false, + "FATFS_CODEPAGE_861": false, + "FATFS_CODEPAGE_862": false, + "FATFS_CODEPAGE_863": false, + "FATFS_CODEPAGE_864": false, + "FATFS_CODEPAGE_865": false, + "FATFS_CODEPAGE_866": false, + "FATFS_CODEPAGE_869": false, + "FATFS_CODEPAGE_932": false, + "FATFS_CODEPAGE_936": false, + "FATFS_CODEPAGE_949": false, + "FATFS_CODEPAGE_950": false, + "FATFS_CODEPAGE_DYNAMIC": false, + "FATFS_FS_LOCK": 0, + "FATFS_IMMEDIATE_FSYNC": false, + "FATFS_LFN_HEAP": false, + "FATFS_LFN_NONE": true, + "FATFS_LFN_STACK": false, + "FATFS_LINK_LOCK": true, + "FATFS_PER_FILE_CACHE": true, + "FATFS_SECTOR_4096": true, + "FATFS_SECTOR_512": false, + "FATFS_TIMEOUT_MS": 10000, + "FATFS_USE_FASTSEEK": false, + "FATFS_USE_LABEL": false, + "FATFS_USE_STRFUNC_NONE": true, + "FATFS_USE_STRFUNC_WITHOUT_CRLF_CONV": false, + "FATFS_USE_STRFUNC_WITH_CRLF_CONV": false, + "FATFS_VFS_FSTAT_BLKSIZE": 0, + "FATFS_VOLUME_COUNT": 2, + "FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER": true, + "FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE": false, + "FREERTOS_CHECK_STACKOVERFLOW_CANARY": true, + "FREERTOS_CHECK_STACKOVERFLOW_NONE": false, + "FREERTOS_CHECK_STACKOVERFLOW_PTRVAL": false, + "FREERTOS_CORETIMER_0": true, + "FREERTOS_CORETIMER_1": false, + "FREERTOS_DEBUG_OCDAWARE": true, + "FREERTOS_ENABLE_BACKWARD_COMPATIBILITY": false, + "FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP": false, + "FREERTOS_ENABLE_TASK_SNAPSHOT": true, + "FREERTOS_FPU_IN_ISR": false, + "FREERTOS_GENERATE_RUN_TIME_STATS": false, + "FREERTOS_HZ": 100, + "FREERTOS_IDLE_TASK_STACKSIZE": 1536, + "FREERTOS_INTERRUPT_BACKTRACE": true, + "FREERTOS_ISR_STACKSIZE": 1536, + "FREERTOS_MAX_TASK_NAME_LEN": 16, + "FREERTOS_NO_AFFINITY": 2147483647, + "FREERTOS_NUMBER_OF_CORES": 2, + "FREERTOS_PLACE_FUNCTIONS_INTO_FLASH": false, + "FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH": true, + "FREERTOS_PORT": true, + "FREERTOS_QUEUE_REGISTRY_SIZE": 0, + "FREERTOS_SMP": false, + "FREERTOS_SUPPORT_STATIC_ALLOCATION": true, + "FREERTOS_SYSTICK_USES_CCOUNT": true, + "FREERTOS_TASK_FUNCTION_WRAPPER": true, + "FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES": 1, + "FREERTOS_TASK_PRE_DELETION_HOOK": false, + "FREERTOS_THREAD_LOCAL_STORAGE_POINTERS": 1, + "FREERTOS_TICK_SUPPORT_CORETIMER": true, + "FREERTOS_TIMER_QUEUE_LENGTH": 10, + "FREERTOS_TIMER_SERVICE_TASK_CORE_AFFINITY": 2147483647, + "FREERTOS_TIMER_SERVICE_TASK_NAME": "Tmr Svc", + "FREERTOS_TIMER_TASK_AFFINITY_CPU0": false, + "FREERTOS_TIMER_TASK_AFFINITY_CPU1": false, + "FREERTOS_TIMER_TASK_NO_AFFINITY": true, + "FREERTOS_TIMER_TASK_PRIORITY": 1, + "FREERTOS_TIMER_TASK_STACK_DEPTH": 2048, + "FREERTOS_TLSP_DELETION_CALLBACKS": true, + "FREERTOS_UNICORE": false, + "FREERTOS_USE_APPLICATION_TASK_TAG": false, + "FREERTOS_USE_IDLE_HOOK": false, + "FREERTOS_USE_LIST_DATA_INTEGRITY_CHECK_BYTES": false, + "FREERTOS_USE_TICK_HOOK": false, + "FREERTOS_USE_TIMERS": true, + "FREERTOS_USE_TRACE_FACILITY": false, + "FREERTOS_WATCHPOINT_END_OF_STACK": false, + "GPIO_CTRL_FUNC_IN_IRAM": false, + "GPIO_ESP32_SUPPORT_SWITCH_SLP_PULL": false, + "GPTIMER_CTRL_FUNC_IN_IRAM": false, + "GPTIMER_ENABLE_DEBUG_LOG": false, + "GPTIMER_ISR_HANDLER_IN_IRAM": true, + "GPTIMER_ISR_IRAM_SAFE": false, + "GPTIMER_SKIP_LEGACY_CONFLICT_CHECK": false, + "GPTIMER_SUPPRESS_DEPRECATE_WARN": false, + "HAL_ASSERTION_DISABLE": false, + "HAL_ASSERTION_ENABLE": false, + "HAL_ASSERTION_EQUALS_SYSTEM": true, + "HAL_ASSERTION_SILENT": false, + "HAL_DEFAULT_ASSERTION_LEVEL": 2, + "HAL_SPI_MASTER_FUNC_IN_IRAM": true, + "HAL_SPI_SLAVE_FUNC_IN_IRAM": true, + "HEAP_ABORT_WHEN_ALLOCATION_FAILS": false, + "HEAP_PLACE_FUNCTION_INTO_FLASH": false, + "HEAP_POISONING_COMPREHENSIVE": false, + "HEAP_POISONING_DISABLED": true, + "HEAP_POISONING_LIGHT": false, + "HEAP_TASK_TRACKING": false, + "HEAP_TRACING_OFF": true, + "HEAP_TRACING_STANDALONE": false, + "HEAP_TRACING_TOHOST": false, + "HEAP_USE_HOOKS": false, + "HTTPD_ERR_RESP_NO_DELAY": true, + "HTTPD_LOG_PURGE_DATA": false, + "HTTPD_MAX_REQ_HDR_LEN": 512, + "HTTPD_MAX_URI_LEN": 512, + "HTTPD_PURGE_BUF_LEN": 32, + "HTTPD_QUEUE_WORK_BLOCKING": false, + "HTTPD_SERVER_EVENT_POST_TIMEOUT": 2000, + "HTTPD_WS_SUPPORT": false, + "I2C_BUS_BACKWARD_CONFIG": false, + "I2C_BUS_DYNAMIC_CONFIG": true, + "I2C_BUS_REMOVE_NULL_MEM_ADDR": false, + "I2C_BUS_SUPPORT_SOFTWARE": false, + "I2C_ENABLE_DEBUG_LOG": false, + "I2C_ENABLE_SLAVE_DRIVER_VERSION_2": false, + "I2C_ISR_IRAM_SAFE": false, + "I2C_MS_TO_WAIT": 200, + "I2S_ENABLE_DEBUG_LOG": false, + "I2S_ISR_IRAM_SAFE": false, + "I2S_SKIP_LEGACY_CONFLICT_CHECK": false, + "I2S_SUPPRESS_DEPRECATE_WARN": false, + "IDF_CMAKE": true, + "IDF_EXPERIMENTAL_FEATURES": false, + "IDF_FIRMWARE_CHIP_ID": 0, + "IDF_INIT_VERSION": "5.4.1", + "IDF_TARGET": "esp32", + "IDF_TARGET_ARCH": "xtensa", + "IDF_TARGET_ARCH_XTENSA": true, + "IDF_TARGET_ESP32": true, + "IDF_TOOLCHAIN": "gcc", + "IDF_TOOLCHAIN_GCC": true, + "LCD_ENABLE_DEBUG_LOG": false, + "LEDC_CTRL_FUNC_IN_IRAM": false, + "LOG_COLORS": false, + "LOG_DEFAULT_LEVEL": 3, + "LOG_DEFAULT_LEVEL_DEBUG": false, + "LOG_DEFAULT_LEVEL_ERROR": false, + "LOG_DEFAULT_LEVEL_INFO": true, + "LOG_DEFAULT_LEVEL_NONE": false, + "LOG_DEFAULT_LEVEL_VERBOSE": false, + "LOG_DEFAULT_LEVEL_WARN": false, + "LOG_DYNAMIC_LEVEL_CONTROL": true, + "LOG_MASTER_LEVEL": false, + "LOG_MAXIMUM_EQUALS_DEFAULT": true, + "LOG_MAXIMUM_LEVEL": 3, + "LOG_MAXIMUM_LEVEL_DEBUG": false, + "LOG_MAXIMUM_LEVEL_VERBOSE": false, + "LOG_TAG_LEVEL_CACHE_ARRAY": false, + "LOG_TAG_LEVEL_CACHE_BINARY_MIN_HEAP": true, + "LOG_TAG_LEVEL_IMPL_CACHE_AND_LINKED_LIST": true, + "LOG_TAG_LEVEL_IMPL_CACHE_SIZE": 31, + "LOG_TAG_LEVEL_IMPL_LINKED_LIST": false, + "LOG_TAG_LEVEL_IMPL_NONE": false, + "LOG_TIMESTAMP_SOURCE_RTOS": true, + "LOG_TIMESTAMP_SOURCE_SYSTEM": false, + "LWIP_AUTOIP": false, + "LWIP_BRIDGEIF_MAX_PORTS": 7, + "LWIP_BROADCAST_PING": false, + "LWIP_CHECKSUM_CHECK_ICMP": true, + "LWIP_CHECKSUM_CHECK_IP": false, + "LWIP_CHECKSUM_CHECK_UDP": false, + "LWIP_CHECK_THREAD_SAFETY": false, + "LWIP_DEBUG": false, + "LWIP_DHCPS": true, + "LWIP_DHCPS_ADD_DNS": true, + "LWIP_DHCPS_LEASE_UNIT": 60, + "LWIP_DHCPS_MAX_STATION_NUM": 8, + "LWIP_DHCPS_STATIC_ENTRIES": true, + "LWIP_DHCP_COARSE_TIMER_SECS": 1, + "LWIP_DHCP_DISABLE_CLIENT_ID": false, + "LWIP_DHCP_DISABLE_VENDOR_CLASS_ID": true, + "LWIP_DHCP_DOES_ACD_CHECK": false, + "LWIP_DHCP_DOES_ARP_CHECK": true, + "LWIP_DHCP_DOES_NOT_CHECK_OFFERED_IP": false, + "LWIP_DHCP_GET_NTP_SRV": false, + "LWIP_DHCP_OPTIONS_LEN": 68, + "LWIP_DHCP_RESTORE_LAST_IP": false, + "LWIP_DNS_MAX_HOST_IP": 1, + "LWIP_DNS_MAX_SERVERS": 3, + "LWIP_DNS_SETSERVER_WITH_NETIF": false, + "LWIP_DNS_SUPPORT_MDNS_QUERIES": true, + "LWIP_ENABLE": true, + "LWIP_ESP_GRATUITOUS_ARP": true, + "LWIP_ESP_LWIP_ASSERT": true, + "LWIP_ESP_MLDV6_REPORT": true, + "LWIP_EXTRA_IRAM_OPTIMIZATION": false, + "LWIP_FALLBACK_DNS_SERVER_SUPPORT": false, + "LWIP_FORCE_ROUTER_FORWARDING": false, + "LWIP_GARP_TMR_INTERVAL": 60, + "LWIP_HOOK_DNS_EXT_RESOLVE_CUSTOM": false, + "LWIP_HOOK_DNS_EXT_RESOLVE_NONE": true, + "LWIP_HOOK_IP6_INPUT_CUSTOM": false, + "LWIP_HOOK_IP6_INPUT_DEFAULT": true, + "LWIP_HOOK_IP6_INPUT_NONE": false, + "LWIP_HOOK_IP6_ROUTE_CUSTOM": false, + "LWIP_HOOK_IP6_ROUTE_DEFAULT": false, + "LWIP_HOOK_IP6_ROUTE_NONE": true, + "LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM": false, + "LWIP_HOOK_IP6_SELECT_SRC_ADDR_DEFAULT": false, + "LWIP_HOOK_IP6_SELECT_SRC_ADDR_NONE": true, + "LWIP_HOOK_ND6_GET_GW_CUSTOM": false, + "LWIP_HOOK_ND6_GET_GW_DEFAULT": false, + "LWIP_HOOK_ND6_GET_GW_NONE": true, + "LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM": false, + "LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT": false, + "LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE": true, + "LWIP_HOOK_TCP_ISN_CUSTOM": false, + "LWIP_HOOK_TCP_ISN_DEFAULT": true, + "LWIP_HOOK_TCP_ISN_NONE": false, + "LWIP_ICMP": true, + "LWIP_IP4_FRAG": true, + "LWIP_IP4_REASSEMBLY": false, + "LWIP_IP6_FRAG": true, + "LWIP_IP6_REASSEMBLY": false, + "LWIP_IPV4": true, + "LWIP_IPV6": true, + "LWIP_IPV6_AUTOCONFIG": false, + "LWIP_IPV6_FORWARD": false, + "LWIP_IPV6_MEMP_NUM_ND6_QUEUE": 3, + "LWIP_IPV6_ND6_NUM_DESTINATIONS": 10, + "LWIP_IPV6_ND6_NUM_NEIGHBORS": 5, + "LWIP_IPV6_ND6_NUM_PREFIXES": 5, + "LWIP_IPV6_ND6_NUM_ROUTERS": 3, + "LWIP_IPV6_NUM_ADDRESSES": 3, + "LWIP_IP_DEFAULT_TTL": 64, + "LWIP_IP_FORWARD": false, + "LWIP_IP_REASS_MAX_PBUFS": 10, + "LWIP_IRAM_OPTIMIZATION": false, + "LWIP_L2_TO_L3_COPY": false, + "LWIP_LOCAL_HOSTNAME": "espressif", + "LWIP_LOOPBACK_MAX_PBUFS": 8, + "LWIP_MAX_ACTIVE_TCP": 16, + "LWIP_MAX_LISTENING_TCP": 16, + "LWIP_MAX_RAW_PCBS": 16, + "LWIP_MAX_SOCKETS": 10, + "LWIP_MAX_UDP_PCBS": 16, + "LWIP_MLDV6_TMR_INTERVAL": 40, + "LWIP_MULTICAST_PING": false, + "LWIP_ND6": true, + "LWIP_NETBUF_RECVINFO": false, + "LWIP_NETIF_API": false, + "LWIP_NETIF_LOOPBACK": true, + "LWIP_NETIF_STATUS_CALLBACK": false, + "LWIP_NUM_NETIF_CLIENT_DATA": 0, + "LWIP_PPP_SUPPORT": false, + "LWIP_SLIP_SUPPORT": false, + "LWIP_SNTP_MAXIMUM_STARTUP_DELAY": 5000, + "LWIP_SNTP_MAX_SERVERS": 1, + "LWIP_SNTP_STARTUP_DELAY": true, + "LWIP_SNTP_UPDATE_DELAY": 3600000, + "LWIP_SO_LINGER": false, + "LWIP_SO_RCVBUF": false, + "LWIP_SO_REUSE": true, + "LWIP_SO_REUSE_RXTOALL": true, + "LWIP_STATS": false, + "LWIP_TCPIP_CORE_LOCKING": false, + "LWIP_TCPIP_RECVMBOX_SIZE": 32, + "LWIP_TCPIP_TASK_AFFINITY": 2147483647, + "LWIP_TCPIP_TASK_AFFINITY_CPU0": false, + "LWIP_TCPIP_TASK_AFFINITY_CPU1": false, + "LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY": true, + "LWIP_TCPIP_TASK_PRIO": 18, + "LWIP_TCPIP_TASK_STACK_SIZE": 3072, + "LWIP_TCP_ACCEPTMBOX_SIZE": 6, + "LWIP_TCP_FIN_WAIT_TIMEOUT": 20000, + "LWIP_TCP_HIGH_SPEED_RETRANSMISSION": true, + "LWIP_TCP_MAXRTX": 12, + "LWIP_TCP_MSL": 60000, + "LWIP_TCP_MSS": 1440, + "LWIP_TCP_OOSEQ_MAX_PBUFS": 4, + "LWIP_TCP_OOSEQ_TIMEOUT": 6, + "LWIP_TCP_OVERSIZE_DISABLE": false, + "LWIP_TCP_OVERSIZE_MSS": true, + "LWIP_TCP_OVERSIZE_QUARTER_MSS": false, + "LWIP_TCP_QUEUE_OOSEQ": true, + "LWIP_TCP_RECVMBOX_SIZE": 6, + "LWIP_TCP_RTO_TIME": 1500, + "LWIP_TCP_SACK_OUT": false, + "LWIP_TCP_SND_BUF_DEFAULT": 5760, + "LWIP_TCP_SYNMAXRTX": 12, + "LWIP_TCP_TMR_INTERVAL": 250, + "LWIP_TCP_WND_DEFAULT": 5760, + "LWIP_TIMERS_ONDEMAND": true, + "LWIP_UDP_RECVMBOX_SIZE": 6, + "LWIP_USE_ONLY_LWIP_SELECT": false, + "MBEDTLS_AES_C": true, + "MBEDTLS_ASYMMETRIC_CONTENT_LEN": true, + "MBEDTLS_ATCA_HW_ECDSA_SIGN": false, + "MBEDTLS_ATCA_HW_ECDSA_VERIFY": false, + "MBEDTLS_BLOWFISH_C": false, + "MBEDTLS_CAMELLIA_C": false, + "MBEDTLS_CCM_C": true, + "MBEDTLS_CERTIFICATE_BUNDLE": true, + "MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN": false, + "MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL": true, + "MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE": false, + "MBEDTLS_CERTIFICATE_BUNDLE_DEPRECATED_LIST": false, + "MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS": 200, + "MBEDTLS_CHACHA20_C": false, + "MBEDTLS_CLIENT_SSL_SESSION_TICKETS": true, + "MBEDTLS_CMAC_C": true, + "MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE": false, + "MBEDTLS_CUSTOM_MEM_ALLOC": false, + "MBEDTLS_DEBUG": false, + "MBEDTLS_DEFAULT_MEM_ALLOC": false, + "MBEDTLS_DES_C": false, + "MBEDTLS_DHM_C": false, + "MBEDTLS_DYNAMIC_BUFFER": false, + "MBEDTLS_ECDH_C": true, + "MBEDTLS_ECDSA_C": true, + "MBEDTLS_ECDSA_DETERMINISTIC": true, + "MBEDTLS_ECJPAKE_C": false, + "MBEDTLS_ECP_C": true, + "MBEDTLS_ECP_DP_BP256R1_ENABLED": true, + "MBEDTLS_ECP_DP_BP384R1_ENABLED": true, + "MBEDTLS_ECP_DP_BP512R1_ENABLED": true, + "MBEDTLS_ECP_DP_CURVE25519_ENABLED": true, + "MBEDTLS_ECP_DP_SECP192K1_ENABLED": true, + "MBEDTLS_ECP_DP_SECP192R1_ENABLED": true, + "MBEDTLS_ECP_DP_SECP224K1_ENABLED": true, + "MBEDTLS_ECP_DP_SECP224R1_ENABLED": true, + "MBEDTLS_ECP_DP_SECP256K1_ENABLED": true, + "MBEDTLS_ECP_DP_SECP256R1_ENABLED": true, + "MBEDTLS_ECP_DP_SECP384R1_ENABLED": true, + "MBEDTLS_ECP_DP_SECP521R1_ENABLED": true, + "MBEDTLS_ECP_FIXED_POINT_OPTIM": false, + "MBEDTLS_ECP_NIST_OPTIM": true, + "MBEDTLS_ECP_RESTARTABLE": false, + "MBEDTLS_ERROR_STRINGS": true, + "MBEDTLS_FS_IO": true, + "MBEDTLS_GCM_C": true, + "MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER": true, + "MBEDTLS_HARDWARE_AES": true, + "MBEDTLS_HARDWARE_MPI": true, + "MBEDTLS_HARDWARE_SHA": true, + "MBEDTLS_HAVE_TIME": true, + "MBEDTLS_HAVE_TIME_DATE": false, + "MBEDTLS_HKDF_C": false, + "MBEDTLS_INTERNAL_MEM_ALLOC": true, + "MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA": true, + "MBEDTLS_KEY_EXCHANGE_ECDHE_RSA": true, + "MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA": true, + "MBEDTLS_KEY_EXCHANGE_ECDH_RSA": true, + "MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE": true, + "MBEDTLS_KEY_EXCHANGE_RSA": true, + "MBEDTLS_LARGE_KEY_SOFTWARE_MPI": false, + "MBEDTLS_NIST_KW_C": false, + "MBEDTLS_PEM_PARSE_C": true, + "MBEDTLS_PEM_WRITE_C": true, + "MBEDTLS_PKCS7_C": true, + "MBEDTLS_PK_PARSE_EC_COMPRESSED": true, + "MBEDTLS_PK_PARSE_EC_EXTENDED": true, + "MBEDTLS_PLATFORM_TIME_ALT": false, + "MBEDTLS_POLY1305_C": false, + "MBEDTLS_PSK_MODES": false, + "MBEDTLS_RIPEMD160_C": false, + "MBEDTLS_ROM_MD5": true, + "MBEDTLS_SERVER_SSL_SESSION_TICKETS": true, + "MBEDTLS_SHA3_C": false, + "MBEDTLS_SHA512_C": true, + "MBEDTLS_SSL_ALPN": true, + "MBEDTLS_SSL_CONTEXT_SERIALIZATION": false, + "MBEDTLS_SSL_IN_CONTENT_LEN": 16384, + "MBEDTLS_SSL_KEEP_PEER_CERTIFICATE": true, + "MBEDTLS_SSL_OUT_CONTENT_LEN": 4096, + "MBEDTLS_SSL_PROTO_DTLS": false, + "MBEDTLS_SSL_PROTO_GMTSSL1_1": false, + "MBEDTLS_SSL_PROTO_TLS1_2": true, + "MBEDTLS_SSL_PROTO_TLS1_3": false, + "MBEDTLS_SSL_RENEGOTIATION": true, + "MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH": false, + "MBEDTLS_THREADING_C": false, + "MBEDTLS_TLS_CLIENT": true, + "MBEDTLS_TLS_CLIENT_ONLY": false, + "MBEDTLS_TLS_DISABLED": false, + "MBEDTLS_TLS_ENABLED": true, + "MBEDTLS_TLS_SERVER": true, + "MBEDTLS_TLS_SERVER_AND_CLIENT": true, + "MBEDTLS_TLS_SERVER_ONLY": false, + "MBEDTLS_X509_CRL_PARSE_C": true, + "MBEDTLS_X509_CSR_PARSE_C": true, + "MBEDTLS_X509_TRUSTED_CERT_CALLBACK": false, + "MBEDTLS_XTEA_C": false, + "MCPWM_CTRL_FUNC_IN_IRAM": false, + "MCPWM_ENABLE_DEBUG_LOG": false, + "MCPWM_ISR_IRAM_SAFE": false, + "MCPWM_SKIP_LEGACY_CONFLICT_CHECK": false, + "MCPWM_SUPPRESS_DEPRECATE_WARN": false, + "MMU_PAGE_MODE": "64KB", + "MMU_PAGE_SIZE": 65536, + "MMU_PAGE_SIZE_64KB": true, + "MQTT_CUSTOM_OUTBOX": false, + "MQTT_MSG_ID_INCREMENTAL": false, + "MQTT_PROTOCOL_311": true, + "MQTT_PROTOCOL_5": false, + "MQTT_REPORT_DELETED_MESSAGES": false, + "MQTT_SKIP_PUBLISH_IF_DISCONNECTED": false, + "MQTT_TASK_CORE_SELECTION_ENABLED": false, + "MQTT_TRANSPORT_SSL": true, + "MQTT_TRANSPORT_WEBSOCKET": true, + "MQTT_TRANSPORT_WEBSOCKET_SECURE": true, + "MQTT_USE_CUSTOM_CONFIG": false, + "NEWLIB_NANO_FORMAT": false, + "NEWLIB_STDIN_LINE_ENDING_CR": true, + "NEWLIB_STDIN_LINE_ENDING_CRLF": false, + "NEWLIB_STDIN_LINE_ENDING_LF": false, + "NEWLIB_STDOUT_LINE_ENDING_CR": false, + "NEWLIB_STDOUT_LINE_ENDING_CRLF": true, + "NEWLIB_STDOUT_LINE_ENDING_LF": false, + "NEWLIB_TIME_SYSCALL_USE_HRT": false, + "NEWLIB_TIME_SYSCALL_USE_NONE": false, + "NEWLIB_TIME_SYSCALL_USE_RTC": false, + "NEWLIB_TIME_SYSCALL_USE_RTC_HRT": true, + "NVS_ASSERT_ERROR_CHECK": false, + "NVS_LEGACY_DUP_KEYS_COMPATIBILITY": false, + "OPENTHREAD_ENABLED": false, + "OPENTHREAD_SPINEL_ONLY": false, + "PARTITION_TABLE_CUSTOM": false, + "PARTITION_TABLE_CUSTOM_FILENAME": "partitions.csv", + "PARTITION_TABLE_FILENAME": "partitions_singleapp.csv", + "PARTITION_TABLE_MD5": true, + "PARTITION_TABLE_OFFSET": 32768, + "PARTITION_TABLE_SINGLE_APP": true, + "PARTITION_TABLE_SINGLE_APP_LARGE": false, + "PARTITION_TABLE_TWO_OTA": false, + "PARTITION_TABLE_TWO_OTA_LARGE": false, + "PCNT_CTRL_FUNC_IN_IRAM": false, + "PCNT_ENABLE_DEBUG_LOG": false, + "PCNT_ISR_IRAM_SAFE": false, + "PCNT_SKIP_LEGACY_CONFLICT_CHECK": false, + "PCNT_SUPPRESS_DEPRECATE_WARN": false, + "PERIPH_CTRL_FUNC_IN_IRAM": true, + "PM_ENABLE": false, + "PM_SLP_IRAM_OPT": false, + "PTHREAD_DEFAULT_CORE_0": false, + "PTHREAD_DEFAULT_CORE_1": false, + "PTHREAD_DEFAULT_CORE_NO_AFFINITY": true, + "PTHREAD_STACK_MIN": 768, + "PTHREAD_TASK_CORE_DEFAULT": -1, + "PTHREAD_TASK_NAME_DEFAULT": "pthread", + "PTHREAD_TASK_PRIO_DEFAULT": 5, + "PTHREAD_TASK_STACK_SIZE_DEFAULT": 3072, + "RINGBUF_PLACE_FUNCTIONS_INTO_FLASH": false, + "RMT_ENABLE_DEBUG_LOG": false, + "RMT_ISR_IRAM_SAFE": false, + "RMT_RECV_FUNC_IN_IRAM": false, + "RMT_SKIP_LEGACY_CONFLICT_CHECK": false, + "RMT_SUPPRESS_DEPRECATE_WARN": false, + "RTC_CLK_CAL_CYCLES": 1024, + "RTC_CLK_SRC_EXT_CRYS": false, + "RTC_CLK_SRC_EXT_OSC": false, + "RTC_CLK_SRC_INT_8MD256": false, + "RTC_CLK_SRC_INT_RC": true, + "SDM_CTRL_FUNC_IN_IRAM": false, + "SDM_ENABLE_DEBUG_LOG": false, + "SDM_SKIP_LEGACY_CONFLICT_CHECK": false, + "SDM_SUPPRESS_DEPRECATE_WARN": false, + "SECURE_BOOT": false, + "SECURE_BOOT_V1_SUPPORTED": true, + "SECURE_FLASH_ENC_ENABLED": false, + "SECURE_SIGNED_APPS_NO_SECURE_BOOT": false, + "SOC_ADC_ATTEN_NUM": 4, + "SOC_ADC_DIGI_CONTROLLER_NUM": 2, + "SOC_ADC_DIGI_DATA_BYTES_PER_CONV": 4, + "SOC_ADC_DIGI_MAX_BITWIDTH": 12, + "SOC_ADC_DIGI_MIN_BITWIDTH": 9, + "SOC_ADC_DIGI_MONITOR_NUM": 0, + "SOC_ADC_DIGI_RESULT_BYTES": 2, + "SOC_ADC_DIG_CTRL_SUPPORTED": true, + "SOC_ADC_DMA_SUPPORTED": true, + "SOC_ADC_MAX_CHANNEL_NUM": 10, + "SOC_ADC_PATT_LEN_MAX": 16, + "SOC_ADC_PERIPH_NUM": 2, + "SOC_ADC_RTC_CTRL_SUPPORTED": true, + "SOC_ADC_RTC_MAX_BITWIDTH": 12, + "SOC_ADC_RTC_MIN_BITWIDTH": 9, + "SOC_ADC_SAMPLE_FREQ_THRES_HIGH": 2, + "SOC_ADC_SAMPLE_FREQ_THRES_LOW": 20, + "SOC_ADC_SHARED_POWER": true, + "SOC_ADC_SUPPORTED": true, + "SOC_AES_SUPPORTED": true, + "SOC_AES_SUPPORT_AES_128": true, + "SOC_AES_SUPPORT_AES_192": true, + "SOC_AES_SUPPORT_AES_256": true, + "SOC_BLE_MESH_SUPPORTED": true, + "SOC_BLE_SUPPORTED": true, + "SOC_BLUFI_SUPPORTED": true, + "SOC_BOD_SUPPORTED": true, + "SOC_BROWNOUT_RESET_SUPPORTED": "Not determined", + "SOC_BT_CLASSIC_SUPPORTED": true, + "SOC_BT_H2C_ENC_KEY_CTRL_ENH_VSC_SUPPORTED": true, + "SOC_BT_SUPPORTED": true, + "SOC_CAPS_ECO_VER_MAX": 301, + "SOC_CCOMP_TIMER_SUPPORTED": true, + "SOC_CLK_APLL_SUPPORTED": true, + "SOC_CLK_RC_FAST_D256_SUPPORTED": true, + "SOC_CLK_RC_FAST_SUPPORT_CALIBRATION": true, + "SOC_CLK_TREE_SUPPORTED": true, + "SOC_CLK_XTAL32K_SUPPORTED": true, + "SOC_CONFIGURABLE_VDDSDIO_SUPPORTED": true, + "SOC_CPU_BREAKPOINTS_NUM": 2, + "SOC_CPU_CORES_NUM": 2, + "SOC_CPU_HAS_FPU": true, + "SOC_CPU_INTR_NUM": 32, + "SOC_CPU_WATCHPOINTS_NUM": 2, + "SOC_CPU_WATCHPOINT_MAX_REGION_SIZE": 64, + "SOC_DAC_CHAN_NUM": 2, + "SOC_DAC_DMA_16BIT_ALIGN": true, + "SOC_DAC_RESOLUTION": 8, + "SOC_DAC_SUPPORTED": true, + "SOC_DEEP_SLEEP_SUPPORTED": true, + "SOC_DPORT_WORKAROUND": "Not determined", + "SOC_DPORT_WORKAROUND_DIS_INTERRUPT_LVL": 5, + "SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS": true, + "SOC_EFUSE_SUPPORTED": true, + "SOC_EMAC_RMII_CLK_OUT_INTERNAL_LOOPBACK": true, + "SOC_EMAC_SUPPORTED": true, + "SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX": 32, + "SOC_FLASH_ENC_SUPPORTED": true, + "SOC_GPIO_CLOCKOUT_BY_IO_MUX": true, + "SOC_GPIO_CLOCKOUT_CHANNEL_NUM": 3, + "SOC_GPIO_IN_RANGE_MAX": 39, + "SOC_GPIO_OUT_RANGE_MAX": 33, + "SOC_GPIO_PIN_COUNT": 40, + "SOC_GPIO_PORT": 1, + "SOC_GPIO_SUPPORT_HOLD_IO_IN_DSLP": true, + "SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK": 15667178, + "SOC_GPIO_VALID_GPIO_MASK": 1099511627775, + "SOC_GPSPI_SUPPORTED": true, + "SOC_GPTIMER_SUPPORTED": true, + "SOC_HP_CPU_HAS_MULTIPLE_CORES": true, + "SOC_HP_I2C_NUM": 2, + "SOC_I2C_CMD_REG_NUM": 16, + "SOC_I2C_FIFO_LEN": 32, + "SOC_I2C_NUM": 2, + "SOC_I2C_STOP_INDEPENDENT": true, + "SOC_I2C_SUPPORTED": true, + "SOC_I2C_SUPPORT_10BIT_ADDR": true, + "SOC_I2C_SUPPORT_APB": true, + "SOC_I2C_SUPPORT_SLAVE": true, + "SOC_I2S_HW_VERSION_1": true, + "SOC_I2S_LCD_I80_VARIANT": true, + "SOC_I2S_MAX_DATA_WIDTH": 24, + "SOC_I2S_NUM": 2, + "SOC_I2S_PDM_MAX_RX_LINES": 1, + "SOC_I2S_PDM_MAX_TX_LINES": 1, + "SOC_I2S_SUPPORTED": true, + "SOC_I2S_SUPPORTS_ADC": true, + "SOC_I2S_SUPPORTS_ADC_DAC": true, + "SOC_I2S_SUPPORTS_APLL": true, + "SOC_I2S_SUPPORTS_DAC": true, + "SOC_I2S_SUPPORTS_LCD_CAMERA": true, + "SOC_I2S_SUPPORTS_PDM": true, + "SOC_I2S_SUPPORTS_PDM_RX": true, + "SOC_I2S_SUPPORTS_PDM_TX": true, + "SOC_I2S_SUPPORTS_PLL_F160M": true, + "SOC_I2S_TRANS_SIZE_ALIGN_WORD": true, + "SOC_IDCACHE_PER_CORE": true, + "SOC_LCD_I80_BUSES": 2, + "SOC_LCD_I80_BUS_WIDTH": 24, + "SOC_LCD_I80_SUPPORTED": true, + "SOC_LEDC_CHANNEL_NUM": 8, + "SOC_LEDC_HAS_TIMER_SPECIFIC_MUX": true, + "SOC_LEDC_SUPPORTED": true, + "SOC_LEDC_SUPPORT_APB_CLOCK": true, + "SOC_LEDC_SUPPORT_HS_MODE": true, + "SOC_LEDC_SUPPORT_REF_TICK": true, + "SOC_LEDC_TIMER_BIT_WIDTH": 20, + "SOC_LEDC_TIMER_NUM": 4, + "SOC_LIGHT_SLEEP_SUPPORTED": true, + "SOC_LP_PERIPH_SHARE_INTERRUPT": true, + "SOC_LP_TIMER_BIT_WIDTH_HI": 16, + "SOC_LP_TIMER_BIT_WIDTH_LO": 32, + "SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER": 3, + "SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP": true, + "SOC_MCPWM_COMPARATORS_PER_OPERATOR": 2, + "SOC_MCPWM_GENERATORS_PER_OPERATOR": 2, + "SOC_MCPWM_GPIO_FAULTS_PER_GROUP": 3, + "SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP": 3, + "SOC_MCPWM_GROUPS": 2, + "SOC_MCPWM_OPERATORS_PER_GROUP": 3, + "SOC_MCPWM_SUPPORTED": true, + "SOC_MCPWM_TIMERS_PER_GROUP": 3, + "SOC_MCPWM_TRIGGERS_PER_OPERATOR": 2, + "SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED": true, + "SOC_MEMSPI_SRC_FREQ_26M_SUPPORTED": true, + "SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED": true, + "SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED": true, + "SOC_MMU_LINEAR_ADDRESS_REGION_NUM": 3, + "SOC_MMU_PERIPH_NUM": 2, + "SOC_MPI_MEM_BLOCKS_NUM": 4, + "SOC_MPI_OPERATIONS_NUM": true, + "SOC_MPI_SUPPORTED": true, + "SOC_MPU_MIN_REGION_SIZE": 536870912, + "SOC_MPU_REGIONS_MAX_NUM": 8, + "SOC_MPU_SUPPORTED": true, + "SOC_PCNT_CHANNELS_PER_UNIT": 2, + "SOC_PCNT_GROUPS": 1, + "SOC_PCNT_SUPPORTED": true, + "SOC_PCNT_THRES_POINT_PER_UNIT": 2, + "SOC_PCNT_UNITS_PER_GROUP": 8, + "SOC_PHY_COMBO_MODULE": true, + "SOC_PHY_DIG_REGS_MEM_SIZE": 21, + "SOC_PHY_SUPPORTED": true, + "SOC_PM_MODEM_PD_BY_SW": true, + "SOC_PM_SUPPORTED": true, + "SOC_PM_SUPPORT_EXT0_WAKEUP": true, + "SOC_PM_SUPPORT_EXT1_WAKEUP": true, + "SOC_PM_SUPPORT_EXT_WAKEUP": true, + "SOC_PM_SUPPORT_MODEM_PD": true, + "SOC_PM_SUPPORT_RC_FAST_PD": true, + "SOC_PM_SUPPORT_RTC_FAST_MEM_PD": true, + "SOC_PM_SUPPORT_RTC_PERIPH_PD": true, + "SOC_PM_SUPPORT_RTC_SLOW_MEM_PD": true, + "SOC_PM_SUPPORT_TOUCH_SENSOR_WAKEUP": true, + "SOC_PM_SUPPORT_VDDSDIO_PD": true, + "SOC_RMT_CHANNELS_PER_GROUP": 8, + "SOC_RMT_CHANNEL_CLK_INDEPENDENT": true, + "SOC_RMT_GROUPS": 1, + "SOC_RMT_MEM_WORDS_PER_CHANNEL": 64, + "SOC_RMT_RX_CANDIDATES_PER_GROUP": 8, + "SOC_RMT_SUPPORTED": true, + "SOC_RMT_SUPPORT_APB": true, + "SOC_RMT_SUPPORT_REF_TICK": true, + "SOC_RMT_TX_CANDIDATES_PER_GROUP": 8, + "SOC_RNG_SUPPORTED": true, + "SOC_RSA_MAX_BIT_LEN": 4096, + "SOC_RTCIO_HOLD_SUPPORTED": true, + "SOC_RTCIO_INPUT_OUTPUT_SUPPORTED": true, + "SOC_RTCIO_PIN_COUNT": 18, + "SOC_RTCIO_WAKE_SUPPORTED": true, + "SOC_RTC_FAST_MEM_SUPPORTED": true, + "SOC_RTC_MEM_SUPPORTED": true, + "SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256": true, + "SOC_RTC_SLOW_MEM_SUPPORTED": true, + "SOC_SDIO_SLAVE_SUPPORTED": true, + "SOC_SDMMC_HOST_SUPPORTED": true, + "SOC_SDMMC_NUM_SLOTS": 2, + "SOC_SDMMC_USE_IOMUX": true, + "SOC_SDM_CHANNELS_PER_GROUP": 8, + "SOC_SDM_CLK_SUPPORT_APB": true, + "SOC_SDM_GROUPS": 1, + "SOC_SDM_SUPPORTED": true, + "SOC_SECURE_BOOT_SUPPORTED": true, + "SOC_SECURE_BOOT_V1": true, + "SOC_SHARED_IDCACHE_SUPPORTED": true, + "SOC_SHA_ENDIANNESS_BE": true, + "SOC_SHA_SUPPORTED": true, + "SOC_SHA_SUPPORT_PARALLEL_ENG": true, + "SOC_SHA_SUPPORT_SHA1": true, + "SOC_SHA_SUPPORT_SHA256": true, + "SOC_SHA_SUPPORT_SHA384": true, + "SOC_SHA_SUPPORT_SHA512": true, + "SOC_SPIRAM_SUPPORTED": true, + "SOC_SPI_AS_CS_SUPPORTED": true, + "SOC_SPI_DMA_CHAN_NUM": 2, + "SOC_SPI_FLASH_SUPPORTED": true, + "SOC_SPI_HD_BOTH_INOUT_SUPPORTED": true, + "SOC_SPI_MAXIMUM_BUFFER_SIZE": 64, + "SOC_SPI_MAX_CS_NUM": 3, + "SOC_SPI_MAX_PRE_DIVIDER": 8192, + "SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE": true, + "SOC_SPI_PERIPH_NUM": 3, + "SOC_SPI_SUPPORT_CLK_APB": true, + "SOC_SUPPORT_COEXISTENCE": true, + "SOC_TIMER_GROUPS": 2, + "SOC_TIMER_GROUP_COUNTER_BIT_WIDTH": 64, + "SOC_TIMER_GROUP_SUPPORT_APB": true, + "SOC_TIMER_GROUP_TIMERS_PER_GROUP": 2, + "SOC_TIMER_GROUP_TOTAL_TIMERS": 4, + "SOC_TOUCH_SAMPLE_CFG_NUM": 1, + "SOC_TOUCH_SENSOR_NUM": 10, + "SOC_TOUCH_SENSOR_SUPPORTED": true, + "SOC_TOUCH_SENSOR_VERSION": 1, + "SOC_TWAI_BRP_DIV_SUPPORTED": "Not determined", + "SOC_TWAI_BRP_MIN": 2, + "SOC_TWAI_CLK_SUPPORT_APB": true, + "SOC_TWAI_CONTROLLER_NUM": 1, + "SOC_TWAI_SUPPORTED": true, + "SOC_TWAI_SUPPORT_MULTI_ADDRESS_LAYOUT": true, + "SOC_UART_BITRATE_MAX": 5000000, + "SOC_UART_FIFO_LEN": 128, + "SOC_UART_HP_NUM": 3, + "SOC_UART_NUM": 3, + "SOC_UART_SUPPORTED": true, + "SOC_UART_SUPPORT_APB_CLK": true, + "SOC_UART_SUPPORT_REF_TICK": true, + "SOC_ULP_FSM_SUPPORTED": true, + "SOC_ULP_HAS_ADC": true, + "SOC_ULP_SUPPORTED": true, + "SOC_WDT_SUPPORTED": true, + "SOC_WIFI_CSI_SUPPORT": true, + "SOC_WIFI_MESH_SUPPORT": true, + "SOC_WIFI_NAN_SUPPORT": true, + "SOC_WIFI_SUPPORTED": true, + "SOC_WIFI_SUPPORT_VARIABLE_BEACON_WINDOW": true, + "SOC_WIFI_WAPI_SUPPORT": true, + "SOC_XTAL_SUPPORT_26M": true, + "SOC_XTAL_SUPPORT_40M": true, + "SOC_XTAL_SUPPORT_AUTO_DETECT": true, + "SPIFFS_API_DBG": false, + "SPIFFS_CACHE": true, + "SPIFFS_CACHE_DBG": false, + "SPIFFS_CACHE_STATS": false, + "SPIFFS_CACHE_WR": true, + "SPIFFS_CHECK_DBG": false, + "SPIFFS_DBG": false, + "SPIFFS_FOLLOW_SYMLINKS": false, + "SPIFFS_GC_DBG": false, + "SPIFFS_GC_MAX_RUNS": 10, + "SPIFFS_GC_STATS": false, + "SPIFFS_MAX_PARTITIONS": 3, + "SPIFFS_META_LENGTH": 4, + "SPIFFS_OBJ_NAME_LEN": 32, + "SPIFFS_PAGE_CHECK": true, + "SPIFFS_PAGE_SIZE": 256, + "SPIFFS_TEST_VISUALISATION": false, + "SPIFFS_USE_MAGIC": true, + "SPIFFS_USE_MAGIC_LENGTH": true, + "SPIFFS_USE_MTIME": true, + "SPIRAM": false, + "SPI_FLASH_BROWNOUT_RESET": true, + "SPI_FLASH_BROWNOUT_RESET_XMC": true, + "SPI_FLASH_BYPASS_BLOCK_ERASE": false, + "SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED": false, + "SPI_FLASH_DANGEROUS_WRITE_ABORTS": true, + "SPI_FLASH_DANGEROUS_WRITE_ALLOWED": false, + "SPI_FLASH_DANGEROUS_WRITE_FAILS": false, + "SPI_FLASH_ENABLE_COUNTERS": false, + "SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE": true, + "SPI_FLASH_ERASE_YIELD_DURATION_MS": 20, + "SPI_FLASH_ERASE_YIELD_TICKS": 1, + "SPI_FLASH_FORCE_ENABLE_XMC_C_SUSPEND": false, + "SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST": false, + "SPI_FLASH_ROM_DRIVER_PATCH": true, + "SPI_FLASH_SHARE_SPI1_BUS": false, + "SPI_FLASH_SIZE_OVERRIDE": false, + "SPI_FLASH_SUPPORT_BOYA_CHIP": false, + "SPI_FLASH_SUPPORT_GD_CHIP": true, + "SPI_FLASH_SUPPORT_ISSI_CHIP": true, + "SPI_FLASH_SUPPORT_MXIC_CHIP": true, + "SPI_FLASH_SUPPORT_TH_CHIP": false, + "SPI_FLASH_SUPPORT_WINBOND_CHIP": true, + "SPI_FLASH_SUSPEND_TSUS_VAL_US": 50, + "SPI_FLASH_VENDOR_GD_SUPPORTED": true, + "SPI_FLASH_VENDOR_ISSI_SUPPORTED": true, + "SPI_FLASH_VENDOR_MXIC_SUPPORTED": true, + "SPI_FLASH_VENDOR_WINBOND_SUPPORTED": true, + "SPI_FLASH_VENDOR_XMC_SUPPORTED": true, + "SPI_FLASH_VERIFY_WRITE": false, + "SPI_FLASH_WRITE_CHUNK_SIZE": 8192, + "SPI_FLASH_YIELD_DURING_ERASE": true, + "SPI_MASTER_IN_IRAM": false, + "SPI_MASTER_ISR_IN_IRAM": true, + "SPI_SLAVE_IN_IRAM": false, + "SPI_SLAVE_ISR_IN_IRAM": true, + "TOUCH_CTRL_FUNC_IN_IRAM": false, + "TOUCH_ENABLE_DEBUG_LOG": false, + "TOUCH_ISR_IRAM_SAFE": false, + "TWAI_ERRATA_FIX_BUS_OFF_REC": true, + "TWAI_ERRATA_FIX_LISTEN_ONLY_DOM": true, + "TWAI_ERRATA_FIX_RX_FIFO_CORRUPT": true, + "TWAI_ERRATA_FIX_RX_FRAME_INVALID": true, + "TWAI_ERRATA_FIX_TX_INTR_LOST": true, + "TWAI_ISR_IN_IRAM": false, + "UART_ISR_IN_IRAM": false, + "ULP_COPROC_ENABLED": false, + "UNITY_ENABLE_64BIT": false, + "UNITY_ENABLE_BACKTRACE_ON_FAIL": false, + "UNITY_ENABLE_COLOR": false, + "UNITY_ENABLE_DOUBLE": true, + "UNITY_ENABLE_FIXTURE": false, + "UNITY_ENABLE_FLOAT": true, + "UNITY_ENABLE_IDF_TEST_RUNNER": true, + "VFS_INITIALIZE_DEV_NULL": true, + "VFS_MAX_COUNT": 8, + "VFS_SELECT_IN_RAM": false, + "VFS_SEMIHOSTFS_MAX_MOUNT_POINTS": 1, + "VFS_SUPPORT_DIR": true, + "VFS_SUPPORT_IO": true, + "VFS_SUPPORT_SELECT": true, + "VFS_SUPPORT_TERMIOS": true, + "VFS_SUPPRESS_SELECT_DEBUG_OUTPUT": true, + "WIFI_PROV_AUTOSTOP_TIMEOUT": 30, + "WIFI_PROV_SCAN_MAX_ENTRIES": 16, + "WIFI_PROV_STA_ALL_CHANNEL_SCAN": true, + "WIFI_PROV_STA_FAST_SCAN": false, + "WL_SECTOR_SIZE": 4096, + "WL_SECTOR_SIZE_4096": true, + "WL_SECTOR_SIZE_512": false, + "WS_BUFFER_SIZE": 1024, + "WS_DYNAMIC_BUFFER": false, + "WS_TRANSPORT": true, + "XTAL_FREQ": 40, + "XTAL_FREQ_26": false, + "XTAL_FREQ_32": false, + "XTAL_FREQ_40": true, + "XTAL_FREQ_AUTO": false +} \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/build/esp-idf/esp_system/ld/linker_script_generator.cmake b/ESP32-IDF_Temperture-Node-v2/build/esp-idf/esp_system/ld/linker_script_generator.cmake new file mode 100644 index 000000000..845c872e7 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/build/esp-idf/esp_system/ld/linker_script_generator.cmake @@ -0,0 +1,9 @@ +execute_process(COMMAND "${CC}" "-C" "-P" "-x" "c" "-E" "-I" "${CONFIG_DIR}" "-I" "${LD_DIR}" "${SOURCE}" + RESULT_VARIABLE RET_CODE + OUTPUT_VARIABLE PREPROCESSED_LINKER_SCRIPT + ERROR_VARIABLE ERROR_VAR) +if(RET_CODE AND NOT RET_CODE EQUAL 0) + message(FATAL_ERROR "Can't generate ${TARGET}\nRET_CODE: ${RET_CODE}\nERROR_MESSAGE: ${ERROR_VAR}") +endif() +string(REPLACE "\\n" "\n" TEXT "${PREPROCESSED_LINKER_SCRIPT}") +file(WRITE "${TARGET}" "${TEXT}") diff --git a/ESP32-IDF_Temperture-Node-v2/build/esp-idf/mbedtls/mbedtls/library/error.c b/ESP32-IDF_Temperture-Node-v2/build/esp-idf/mbedtls/mbedtls/library/error.c new file mode 120000 index 000000000..4f78be17c --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/build/esp-idf/mbedtls/mbedtls/library/error.c @@ -0,0 +1 @@ +/home/abobkov/esp/v5.4.1/esp-idf/components/mbedtls/mbedtls/library/error.c \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/build/esp-idf/mbedtls/mbedtls/library/psa_crypto_driver_wrappers_no_static.c b/ESP32-IDF_Temperture-Node-v2/build/esp-idf/mbedtls/mbedtls/library/psa_crypto_driver_wrappers_no_static.c new file mode 120000 index 000000000..49e003b8d --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/build/esp-idf/mbedtls/mbedtls/library/psa_crypto_driver_wrappers_no_static.c @@ -0,0 +1 @@ +/home/abobkov/esp/v5.4.1/esp-idf/components/mbedtls/mbedtls/library/psa_crypto_driver_wrappers_no_static.c \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/build/esp-idf/mbedtls/mbedtls/library/ssl_debug_helpers_generated.c b/ESP32-IDF_Temperture-Node-v2/build/esp-idf/mbedtls/mbedtls/library/ssl_debug_helpers_generated.c new file mode 120000 index 000000000..34e2b336b --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/build/esp-idf/mbedtls/mbedtls/library/ssl_debug_helpers_generated.c @@ -0,0 +1 @@ +/home/abobkov/esp/v5.4.1/esp-idf/components/mbedtls/mbedtls/library/ssl_debug_helpers_generated.c \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/build/esp-idf/mbedtls/mbedtls/library/version_features.c b/ESP32-IDF_Temperture-Node-v2/build/esp-idf/mbedtls/mbedtls/library/version_features.c new file mode 120000 index 000000000..26f967e5d --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/build/esp-idf/mbedtls/mbedtls/library/version_features.c @@ -0,0 +1 @@ +/home/abobkov/esp/v5.4.1/esp-idf/components/mbedtls/mbedtls/library/version_features.c \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/build/gdbinit/connect b/ESP32-IDF_Temperture-Node-v2/build/gdbinit/connect new file mode 100644 index 000000000..faa385731 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/build/gdbinit/connect @@ -0,0 +1,7 @@ +# Connect to the default openocd-esp port and stop on app_main() +set remotetimeout 10 +target remote :3333 +monitor reset halt +maintenance flush register-cache +thbreak app_main +continue diff --git a/ESP32-IDF_Temperture-Node-v2/build/gdbinit/gdbinit b/ESP32-IDF_Temperture-Node-v2/build/gdbinit/gdbinit new file mode 100644 index 000000000..b3a0154d6 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/build/gdbinit/gdbinit @@ -0,0 +1,2 @@ +source /home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/build/gdbinit/symbols +source /home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/build/gdbinit/connect diff --git a/ESP32-IDF_Temperture-Node-v2/build/gdbinit/prefix_map b/ESP32-IDF_Temperture-Node-v2/build/gdbinit/prefix_map new file mode 100644 index 000000000..c7842ec17 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/build/gdbinit/prefix_map @@ -0,0 +1 @@ +# There is no prefix map defined for the project. diff --git a/ESP32-IDF_Temperture-Node-v2/build/gdbinit/py_extensions b/ESP32-IDF_Temperture-Node-v2/build/gdbinit/py_extensions new file mode 100644 index 000000000..336f99571 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/build/gdbinit/py_extensions @@ -0,0 +1,7 @@ +# Add Python GDB extensions +python +try: + import freertos_gdb +except ModuleNotFoundError: + print('warning: python extension "freertos_gdb" not found.') +end diff --git a/ESP32-IDF_Temperture-Node-v2/build/gdbinit/symbols b/ESP32-IDF_Temperture-Node-v2/build/gdbinit/symbols new file mode 100644 index 000000000..69aa491a7 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/build/gdbinit/symbols @@ -0,0 +1,25 @@ +# Load esp32 ROM ELF symbols +define target hookpost-remote +set confirm off + # if $_streq((char *) 0x3ff9ea80, "Jun 8 2016") + if (*(int*) 0x3ff9ea80) == 0x206e754a && (*(int*) 0x3ff9ea84) == 0x32203820 && (*(int*) 0x3ff9ea88) == 0x363130 + add-symbol-file /home/abobkov/.espressif/tools/esp-rom-elfs/20230320/esp32_rev0_rom.elf + else + # if $_streq((char *) 0x3ff9e986, "Jul 29 2019") + if (*(int*) 0x3ff9e986) == 0x206c754a && (*(int*) 0x3ff9e98a) == 0x32203932 && (*(int*) 0x3ff9e98e) == 0x393130 + add-symbol-file /home/abobkov/.espressif/tools/esp-rom-elfs/20230320/esp32_rev300_rom.elf + else + echo Warning: Unknown esp32 ROM revision.\n + end + end +set confirm on +end + + +# Load bootloader symbols +set confirm off + add-symbol-file /home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/build/bootloader/bootloader.elf +set confirm on + +# Load application symbols +file /home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/build/ESP32-IDF_Temperture-Node-v2.elf diff --git a/ESP32-IDF_Temperture-Node-v2/build/kconfigs.in b/ESP32-IDF_Temperture-Node-v2/build/kconfigs.in new file mode 100644 index 000000000..19d293bbc --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/build/kconfigs.in @@ -0,0 +1,78 @@ +source "/home/abobkov/esp/v5.4.1/esp-idf/components/app_trace/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/bt/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/console/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/driver/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/efuse/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp-tls/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_adc/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_coex/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_common/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_ana_cmpr/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_cam/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_dac/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_gpio/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_gptimer/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_i2c/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_i2s/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_isp/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_jpeg/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_ledc/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_mcpwm/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_parlio/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_pcnt/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_rmt/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_sdm/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_spi/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_touch_sens/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_tsens/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_uart/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_driver_usb_serial_jtag/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_eth/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_event/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_gdbstub/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_hid/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_http_client/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_http_server/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_https_ota/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_https_server/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_hw_support/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_lcd/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_mm/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_netif/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_partition/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_phy/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_pm/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_psram/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_ringbuf/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_security/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_system/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_timer/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_wifi/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/espcoredump/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/fatfs/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/freertos/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/hal/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/heap/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/ieee802154/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/log/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/lwip/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/mbedtls/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/newlib/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/nvs_flash/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/nvs_sec_provider/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/openthread/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/protocomm/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/pthread/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/soc/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/spi_flash/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/spiffs/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/tcp_transport/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/ulp/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/unity/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/usb/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/vfs/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/wear_levelling/Kconfig" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/wifi_provisioning/Kconfig" +source "/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/Kconfig" +source "/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/Kconfig" +source "/home/abobkov/MyProjects/ESP-Nodes/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/Kconfig" \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/build/kconfigs_projbuild.in b/ESP32-IDF_Temperture-Node-v2/build/kconfigs_projbuild.in new file mode 100644 index 000000000..1fc5efd99 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/build/kconfigs_projbuild.in @@ -0,0 +1,5 @@ +source "/home/abobkov/esp/v5.4.1/esp-idf/components/bootloader/Kconfig.projbuild" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_app_format/Kconfig.projbuild" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esp_rom/Kconfig.projbuild" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/esptool_py/Kconfig.projbuild" +source "/home/abobkov/esp/v5.4.1/esp-idf/components/partition_table/Kconfig.projbuild" \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/.component_hash b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/.component_hash new file mode 100644 index 000000000..34b7ee670 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/.component_hash @@ -0,0 +1 @@ +873d97d0bd30004f45d1653f078a4bafe39c1767e57d4bae0f0a13bc3a4d5e3d \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/CHANGELOG.md b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/CHANGELOG.md new file mode 100644 index 000000000..4c7735ee3 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/CHANGELOG.md @@ -0,0 +1,13 @@ +# ChangeLog + +## v0.1.1 - 2024-12-23 + +### Bug Fixes: + +* Fix the issue in README.md where the usage example for bme280 lacks the default initialization. + +## v0.1.0 - 2024-11-5 + +### Enhancements: + +* Initial version \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/CHECKSUMS.json b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/CHECKSUMS.json new file mode 100644 index 000000000..d5c9c8fbc --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/CHECKSUMS.json @@ -0,0 +1 @@ +{"version": "1.0", "algorithm": "sha256", "created_at": "2025-05-21T17:09:18.488972+00:00", "files": [{"path": "CMakeLists.txt", "size": 160, "hash": "b9af3a241cecba82dda3b44e32c70b1aac28890f41eb00768f518a000f163357"}, {"path": "CHANGELOG.md", "size": 211, "hash": "d61f738a9a542e7c0f7d69fcc0b14e20c15d96688f0e4e067c943e853e3657e8"}, {"path": "idf_component.yml", "size": 580, "hash": "71fa62fa58af333761e45146271e5ed3c90e7e845740391711bfe276266b9131"}, {"path": "README.md", "size": 1713, "hash": "51df9e655bb500962a5736b65e49e6920d713216556c8bbf5d63b3132e1d3862"}, {"path": "license.txt", "size": 11358, "hash": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30"}, {"path": "bme280.c", "size": 13819, "hash": "47aac27b35df43fdad8551d1f8759d774362d291859685a77a331aa6433eb163"}, {"path": "include/bme280.h", "size": 10161, "hash": "043eda239a4686220cff149054b678bd736bf7c5f2edd290c7c703c8a1c156f9"}, {"path": "test_apps/CMakeLists.txt", "size": 350, "hash": "02be4ce8d0c8034408017c3948d13d93d3be6fdc40ada18906a5f15fc4ef0dad"}, {"path": "test_apps/sdkconfig.defaults", "size": 213, "hash": "9a34a6cb08c49ec24007587e0c5d492f44b5a862d9c0f583cf9f6f643669b564"}, {"path": "test_apps/main/CMakeLists.txt", "size": 143, "hash": "802c3b217fc1bd9ed8c615353f70d9084caf0b4216288e05fc18af11e6bf7abf"}, {"path": "test_apps/main/bme280_test.c", "size": 2447, "hash": "ee63d7fbd09167de421eb0c416acb6a9f0da44789f7d453b603b3fd74989cf4c"}]} \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/CMakeLists.txt new file mode 100644 index 000000000..f87897f56 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/CMakeLists.txt @@ -0,0 +1,5 @@ +idf_component_register(SRCS "bme280.c" + INCLUDE_DIRS include) + +include(package_manager) +cu_pkg_define_version(${CMAKE_CURRENT_LIST_DIR}) diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/README.md b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/README.md new file mode 100644 index 000000000..88253cb2a --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/README.md @@ -0,0 +1,51 @@ +# Component: BME280 + +The BME280 is as combined digital humidity, pressure and temperature sensor based on proven sensing principles. The sensor module is housed in an extremely compact metal-lid LGA package with a footprint of only 2.5 × 2.5 mm² with a height of 0.93 mm. Its small dimensions and its low power consumption allow the implementation in battery driven devices such as handsets, GPS modules or watches. + + +## Add component to your project + +Please use the component manager command `add-dependency` to add the `bme280` to your project's dependency, during the `CMake` step the component will be downloaded automatically + +``` +idf.py add-dependency "espressif/bme280=*" +``` + +## Example of BME280 usage + + +Pin assignment: + +* master: + * GPIO2 is assigned as the clock signal of i2c master port + * GPIO1 is assigned as the data signal of i2c master port +* Connection: + * connect sda of sensor with GPIO1 + * connect scl of sensor with GPIO2 + + +```c +static i2c_bus_handle_t i2c_bus = NULL; +static bme280_handle_t bme280 = NULL; + +//Step1: Init I2C bus +i2c_config_t conf = { + .mode = I2C_MODE_MASTER, + .sda_io_num = I2C_MASTER_SDA_IO, + .sda_pullup_en = GPIO_PULLUP_ENABLE, + .scl_io_num = I2C_MASTER_SCL_IO, + .scl_pullup_en = GPIO_PULLUP_ENABLE, + .master.clk_speed = I2C_MASTER_FREQ_HZ, +}; +i2c_bus = i2c_bus_create(I2C_MASTER_NUM, &conf); + +//Step2: Init bme280 +bme280 = bme280_create(i2c_bus, BME280_I2C_ADDRESS_DEFAULT); +bme280_default_init(bme280); + +//Step3: Read temperature, humidity and pressure +float temperature = 0.0, humidity = 0.0, pressure = 0.0; +bme280_read_temperature(bme280, &temperature); +bme280_read_humidity(bme280, &humidity); +bme280_read_pressure(bme280, &pressure); +``` \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/bme280.c b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/bme280.c new file mode 100644 index 000000000..6b047ce37 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/bme280.c @@ -0,0 +1,372 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include "freertos/FreeRTOS.h" +#include "i2c_bus.h" +#include "bme280.h" +#include "math.h" +#include "esp_log.h" + +bme280_handle_t bme280_create(i2c_bus_handle_t bus, uint8_t dev_addr) +{ + bme280_dev_t *sens = (bme280_dev_t *) calloc(1, sizeof(bme280_dev_t)); + sens->i2c_dev = i2c_bus_device_create(bus, dev_addr, i2c_bus_get_current_clk_speed(bus)); + if (sens->i2c_dev == NULL) { + free(sens); + return NULL; + } + sens->dev_addr = dev_addr; + return (bme280_handle_t)sens; +} + +esp_err_t bme280_delete(bme280_handle_t *sensor) +{ + if (*sensor == NULL) { + return ESP_OK; + } + bme280_dev_t *sens = (bme280_dev_t *)(*sensor); + i2c_bus_device_delete(&sens->i2c_dev); + free(sens); + *sensor = NULL; + return ESP_OK; +} + +static esp_err_t bme280_read_uint16(bme280_handle_t sensor, uint8_t addr, uint16_t *data) +{ + esp_err_t ret = ESP_FAIL; + bme280_dev_t *sens = (bme280_dev_t *) sensor; + uint8_t data0, data1; + if (i2c_bus_read_byte(sens->i2c_dev, addr, &data0) != ESP_OK) { + return ret; + } + if (i2c_bus_read_byte(sens->i2c_dev, addr + 1, &data1) != ESP_OK) { + return ret; + } + *data = (data0 << 8) | data1; + return ESP_OK; +} + +static esp_err_t bme280_read_uint16_le(bme280_handle_t sensor, uint8_t addr, uint16_t *data) +{ + esp_err_t ret = ESP_FAIL; + bme280_dev_t *sens = (bme280_dev_t *) sensor; + uint8_t data0, data1; + if (i2c_bus_read_byte(sens->i2c_dev, addr, &data0) != ESP_OK) { + return ret; + } + if (i2c_bus_read_byte(sens->i2c_dev, addr + 1, &data1) != ESP_OK) { + return ret; + } + *data = (data1 << 8) | data0; + return ESP_OK; +} + +unsigned int bme280_getconfig(bme280_handle_t sensor) +{ + bme280_dev_t *sens = (bme280_dev_t *) sensor; + return (sens->config_t.t_sb << 5) | (sens->config_t.filter << 3) | sens->config_t.spi3w_en; +} + +unsigned int bme280_getctrl_meas(bme280_handle_t sensor) +{ + bme280_dev_t *sens = (bme280_dev_t *) sensor; + return (sens->ctrl_meas_t.osrs_t << 5) | (sens->ctrl_meas_t.osrs_p << 3) | sens->ctrl_meas_t.mode; +} + +unsigned int bme280_getctrl_hum(bme280_handle_t sensor) +{ + bme280_dev_t *sens = (bme280_dev_t *) sensor; + return (sens->ctrl_hum_t.osrs_h); +} + +bool bme280_is_reading_calibration(bme280_handle_t sensor) +{ + uint8_t rstatus = 0; + bme280_dev_t *sens = (bme280_dev_t *) sensor; + if (i2c_bus_read_byte(sens->i2c_dev, BME280_REGISTER_STATUS, &rstatus) != ESP_OK) { + return false; + } + return (rstatus & (1 << 0)) != 0; +} + +esp_err_t bme280_read_coefficients(bme280_handle_t sensor) +{ + uint8_t data = 0; + uint8_t data1 = 0; + uint16_t data16 = 0; + bme280_dev_t *sens = (bme280_dev_t *) sensor; + if (bme280_read_uint16_le(sensor, BME280_REGISTER_DIG_T1, &data16) != ESP_OK) { + return ESP_FAIL; + } + sens->data_t.dig_t1 = data16; + if (bme280_read_uint16_le(sensor, BME280_REGISTER_DIG_T2, &data16) != ESP_OK) { + return ESP_FAIL; + } + sens->data_t.dig_t2 = (int16_t) data16; + if (bme280_read_uint16_le(sensor, BME280_REGISTER_DIG_T3, &data16) != ESP_OK) { + return ESP_FAIL; + } + sens->data_t.dig_t3 = (int16_t) data16; + if (bme280_read_uint16_le(sensor, BME280_REGISTER_DIG_P1, &data16) != ESP_OK) { + return ESP_FAIL; + } + sens->data_t.dig_p1 = data16; + if (bme280_read_uint16_le(sensor, BME280_REGISTER_DIG_P2, &data16) != ESP_OK) { + return ESP_FAIL; + } + sens->data_t.dig_p2 = (int16_t) data16; + if (bme280_read_uint16_le(sensor, BME280_REGISTER_DIG_P3, &data16) != ESP_OK) { + return ESP_FAIL; + } + sens->data_t.dig_p3 = (int16_t) data16; + if (bme280_read_uint16_le(sensor, BME280_REGISTER_DIG_P4, &data16) != ESP_OK) { + return ESP_FAIL; + } + sens->data_t.dig_p4 = (int16_t) data16; + if (bme280_read_uint16_le(sensor, BME280_REGISTER_DIG_P5, &data16) != ESP_OK) { + return ESP_FAIL; + } + sens->data_t.dig_p5 = (int16_t) data16; + if (bme280_read_uint16_le(sensor, BME280_REGISTER_DIG_P6, &data16) != ESP_OK) { + return ESP_FAIL; + } + sens->data_t.dig_p6 = (int16_t) data16; + if (bme280_read_uint16_le(sensor, BME280_REGISTER_DIG_P7, &data16) != ESP_OK) { + return ESP_FAIL; + } + sens->data_t.dig_p7 = (int16_t) data16; + if (bme280_read_uint16_le(sensor, BME280_REGISTER_DIG_P8, &data16) != ESP_OK) { + return ESP_FAIL; + } + sens->data_t.dig_p8 = (int16_t) data16; + if (bme280_read_uint16_le(sensor, BME280_REGISTER_DIG_P9, &data16) != ESP_OK) { + return ESP_FAIL; + } + sens->data_t.dig_p9 = (int16_t) data16; + if (i2c_bus_read_byte(sens->i2c_dev, BME280_REGISTER_DIG_H1, &data) != ESP_OK) { + return ESP_FAIL; + } + sens->data_t.dig_h1 = data; + if (bme280_read_uint16_le(sensor, BME280_REGISTER_DIG_H2, &data16) != ESP_OK) { + return ESP_FAIL; + } + sens->data_t.dig_h2 = (int16_t) data16; + if (i2c_bus_read_byte(sens->i2c_dev, BME280_REGISTER_DIG_H3, &data) != ESP_OK) { + return ESP_FAIL; + } + sens->data_t.dig_h3 = data; + if (i2c_bus_read_byte(sens->i2c_dev, BME280_REGISTER_DIG_H4, &data) != ESP_OK) { + return ESP_FAIL; + } + if (i2c_bus_read_byte(sens->i2c_dev, BME280_REGISTER_DIG_H4 + 1, &data1) != ESP_OK) { + return ESP_FAIL; + } + sens->data_t.dig_h4 = (data << 4) | (data1 & 0xF); + if (i2c_bus_read_byte(sens->i2c_dev, BME280_REGISTER_DIG_H5 + 1, &data) != ESP_OK) { + return ESP_FAIL; + } + if (i2c_bus_read_byte(sens->i2c_dev, BME280_REGISTER_DIG_H5, &data1) != ESP_OK) { + return ESP_FAIL; + } + sens->data_t.dig_h5 = (data << 4) | (data1 >> 4); + if (i2c_bus_read_byte(sens->i2c_dev, BME280_REGISTER_DIG_H6, &data) != ESP_OK) { + return ESP_FAIL; + } + sens->data_t.dig_h6 = (int8_t) data; + return ESP_OK; +} + +esp_err_t bme280_set_sampling(bme280_handle_t sensor, bme280_sensor_mode mode, bme280_sensor_sampling tempSampling, bme280_sensor_sampling pressSampling, bme280_sensor_sampling humSampling, bme280_sensor_filter filter, bme280_standby_duration duration) +{ + bme280_dev_t *sens = (bme280_dev_t *) sensor; + sens->ctrl_meas_t.mode = mode; + sens->ctrl_meas_t.osrs_t = tempSampling; + sens->ctrl_meas_t.osrs_p = pressSampling; + sens->ctrl_hum_t.osrs_h = humSampling; + sens->config_t.filter = filter; + sens->config_t.t_sb = duration; + // you must make sure to also set REGISTER_CONTROL after setting the + // CONTROLHUMID register, otherwise the values won't be applied (see DS 5.4.3) + if (i2c_bus_write_byte(sens->i2c_dev, BME280_REGISTER_CONTROLHUMID, bme280_getctrl_hum(sensor)) != ESP_OK) { + return ESP_FAIL; + } + if (i2c_bus_write_byte(sens->i2c_dev, BME280_REGISTER_CONFIG, bme280_getconfig(sensor)) != ESP_OK) { + return ESP_FAIL; + } + if (i2c_bus_write_byte(sens->i2c_dev, BME280_REGISTER_CONTROL, bme280_getctrl_meas(sensor)) != ESP_OK) { + return ESP_FAIL; + } + return ESP_OK; +} + +esp_err_t bme280_default_init(bme280_handle_t sensor) +{ + // check if sensor, i.e. the chip ID is correct + uint8_t chipid = 0; + bme280_dev_t *sens = (bme280_dev_t *) sensor; + if (i2c_bus_read_byte(sens->i2c_dev, BME280_REGISTER_CHIPID, &chipid) != ESP_OK) { + ESP_LOGI("BME280:", "bme280_default_init->bme280_read_byte ->BME280_REGISTER_CHIPID failed!!!!:%x", chipid); + return ESP_FAIL; + } + if (chipid != BME280_DEFAULT_CHIPID) { + ESP_LOGI("BME280:", "bme280_default_init->BME280_DEFAULT_CHIPID:%x", chipid); + return ESP_FAIL; + } + // reset the sens using soft-reset, this makes sure the IIR is off, etc. + if (i2c_bus_write_byte(sens->i2c_dev, BME280_REGISTER_SOFTRESET, 0xB6) != ESP_OK) { + return ESP_FAIL; + } + // wait for chip to wake up. + vTaskDelay(300 / portTICK_RATE_MS); + // if chip is still reading calibration, delay + while (bme280_is_reading_calibration(sensor)) { + vTaskDelay(100 / portTICK_RATE_MS); + } + if (bme280_read_coefficients(sensor) != ESP_OK) { // read trimming parameters, see DS 4.2.2 + return ESP_FAIL; + } + if (bme280_set_sampling(sensor, BME280_MODE_NORMAL, BME280_SAMPLING_X16, BME280_SAMPLING_X16, BME280_SAMPLING_X16, BME280_FILTER_OFF, BME280_STANDBY_MS_0_5) != ESP_OK) { // use defaults + return ESP_FAIL; + } + return ESP_OK; +} + +esp_err_t bme280_take_forced_measurement(bme280_handle_t sensor) +{ + uint8_t data = 0; + bme280_dev_t *sens = (bme280_dev_t *) sensor; + if (sens->ctrl_meas_t.mode == BME280_MODE_FORCED) { + // set to forced mode, i.e. "take next measurement" + if (i2c_bus_write_byte(sens->i2c_dev, BME280_REGISTER_CONTROL, bme280_getctrl_meas(sensor)) != ESP_OK) { + return ESP_FAIL; + } + // wait until measurement has been completed, otherwise we would read, the values from the last measurement + if (i2c_bus_read_byte(sens->i2c_dev, BME280_REGISTER_STATUS, &data) != ESP_OK) { + return ESP_FAIL; + } + while (data & 0x08) { + i2c_bus_read_byte(sens->i2c_dev, BME280_REGISTER_STATUS, &data); + vTaskDelay(10 / portTICK_RATE_MS); + } + } + return ESP_OK; +} + +esp_err_t bme280_read_temperature(bme280_handle_t sensor, float *temperature) +{ + int32_t var1, var2; + uint8_t data[3] = { 0 }; + bme280_dev_t *sens = (bme280_dev_t *) sensor; + if (i2c_bus_read_bytes(sens->i2c_dev, BME280_REGISTER_TEMPDATA, 3, data) != ESP_OK) { + return ESP_FAIL; + } + int32_t adc_T = (data[0] << 16) | (data[1] << 8) | data[2]; + if (adc_T == 0x800000) { // value in case temp measurement was disabled + return ESP_FAIL; + } + adc_T >>= 4; + + var1 = ((((adc_T >> 3) - ((int32_t) sens->data_t.dig_t1 << 1))) + * ((int32_t) sens->data_t.dig_t2)) >> 11; + + var2 = (((((adc_T >> 4) - ((int32_t) sens->data_t.dig_t1)) + * ((adc_T >> 4) - ((int32_t) sens->data_t.dig_t1))) >> 12) + * ((int32_t) sens->data_t.dig_t3)) >> 14; + + sens->t_fine = var1 + var2; + *temperature = ((sens->t_fine * 5 + 128) >> 8) / 100.0; + return ESP_OK; +} + +esp_err_t bme280_read_pressure(bme280_handle_t sensor, float *pressure) +{ + int64_t var1, var2, p; + uint8_t data[3] = { 0 }; + bme280_dev_t *sens = (bme280_dev_t *) sensor; + float temp = 0.0; + if (bme280_read_temperature(sensor, &temp) != ESP_OK) { + // must be done first to get t_fine + return ESP_FAIL; + } + if (i2c_bus_read_bytes(sens->i2c_dev, BME280_REGISTER_PRESSUREDATA, 3, data) != ESP_OK) { + return ESP_FAIL; + } + int32_t adc_P = (data[0] << 16) | (data[1] << 8) | data[2]; + if (adc_P == 0x800000) { // value in case pressure measurement was disabled + return ESP_FAIL; + } + adc_P >>= 4; + var1 = ((int64_t) sens->t_fine) - 128000; + var2 = var1 * var1 * (int64_t) sens->data_t.dig_p6; + var2 = var2 + ((var1 * (int64_t) sens->data_t.dig_p5) << 17); + var2 = var2 + (((int64_t) sens->data_t.dig_p4) << 35); + var1 = ((var1 * var1 * (int64_t) sens->data_t.dig_p3) >> 8) + ((var1 * (int64_t) sens->data_t.dig_p2) << 12); + var1 = (((((int64_t) 1) << 47) + var1)) * ((int64_t) sens->data_t.dig_p1) >> 33; + if (var1 == 0) { + return ESP_FAIL; // avoid exception caused by division by zero + } + p = 1048576 - adc_P; + p = (((p << 31) - var2) * 3125) / var1; + var1 = (((int64_t) sens->data_t.dig_p9) * (p >> 13) * (p >> 13)) >> 25; + var2 = (((int64_t) sens->data_t.dig_p8) * p) >> 19; + p = ((p + var1 + var2) >> 8) + (((int64_t) sens->data_t.dig_p7) << 4); + p = p >> 8; // /256 + *pressure = (float) p / 100; + return ESP_OK; +} + +esp_err_t bme280_read_humidity(bme280_handle_t sensor, float *humidity) +{ + uint16_t data16; + bme280_dev_t *sens = (bme280_dev_t *) sensor; + float temp = 0.0; + if (bme280_read_temperature(sensor, &temp) != ESP_OK) { + // must be done first to get t_fine + return ESP_FAIL; + } + if (bme280_read_uint16(sensor, BME280_REGISTER_HUMIDDATA, &data16) != ESP_OK) { + return ESP_FAIL; + } + int32_t adc_H = data16; + if (adc_H == 0x8000) { // value in case humidity measurement was disabled + return ESP_FAIL; + } + int32_t v_x1_u32r; + v_x1_u32r = (sens->t_fine - ((int32_t) 76800)); + v_x1_u32r = (((((adc_H << 14) - (((int32_t) sens->data_t.dig_h4) << 20) + - (((int32_t) sens->data_t.dig_h5) * v_x1_u32r)) + + ((int32_t) 16384)) >> 15) + * (((((((v_x1_u32r * ((int32_t) sens->data_t.dig_h6)) >> 10) + * (((v_x1_u32r * ((int32_t) sens->data_t.dig_h3)) >> 11) + ((int32_t) 32768))) >> 10) + ((int32_t) 2097152)) + * ((int32_t) sens->data_t.dig_h2) + 8192) >> 14)); + v_x1_u32r = (v_x1_u32r + - (((((v_x1_u32r >> 15) * (v_x1_u32r >> 15)) >> 7) + * ((int32_t) sens->data_t.dig_h1)) >> 4)); + v_x1_u32r = (v_x1_u32r < 0) ? 0 : v_x1_u32r; + v_x1_u32r = (v_x1_u32r > 419430400) ? 419430400 : v_x1_u32r; + *humidity = (v_x1_u32r >> 12) / 1024.0; + return ESP_OK; +} + +esp_err_t bme280_read_altitude(bme280_handle_t sensor, float seaLevel, float *altitude) +{ + float pressure = 0.0; + float temp = 0.0; + if (bme280_read_pressure(sensor, &temp) != ESP_OK) { + return ESP_FAIL; + } + float atmospheric = pressure / 100.0F; + *altitude = 44330.0 * (1.0 - pow(atmospheric / seaLevel, 0.1903)); + return ESP_OK; +} + +esp_err_t bme280_calculates_pressure(bme280_handle_t sensor, float altitude, + float atmospheric, float *pressure) +{ + *pressure = atmospheric / pow(1.0 - (altitude / 44330.0), 5.255); + return ESP_OK; +} diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/idf_component.yml b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/idf_component.yml new file mode 100644 index 000000000..b089a9428 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/idf_component.yml @@ -0,0 +1,14 @@ +dependencies: + cmake_utilities: 0.* + i2c_bus: + public: true + idf: '>=4.4' +description: I2C driver for BME280 preesure sensor +documentation: https://docs.espressif.com/projects/esp-iot-solution/en/latest/sensors/pressure.html +issues: https://github.com/espressif/esp-iot-solution/issues +repository: git://github.com/espressif/esp-iot-solution.git +repository_info: + commit_sha: 1f4206cfe0ff480fedd4fa7860dc41ece6768812 + path: components/sensors/pressure/bme280 +url: https://github.com/espressif/esp-iot-solution/tree/master/components/sensors/pressure/bme280 +version: 0.1.1 diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/include/bme280.h b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/include/bme280.h new file mode 100644 index 000000000..61205e3de --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/include/bme280.h @@ -0,0 +1,377 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef _BME280_H_ +#define _BME280_H_ + +#include "i2c_bus.h" + +#define BME280_I2C_ADDRESS_DEFAULT (0x76) /*The device's I2C address is either 0x76 or 0x77.*/ +#define BME280_DEFAULT_CHIPID (0x60) + +#define WRITE_BIT I2C_MASTER_WRITE /*!< I2C master write */ +#define READ_BIT I2C_MASTER_READ /*!< I2C master read */ +#define ACK_CHECK_EN 0x1 /*!< I2C master will check ack from slave*/ +#define ACK_CHECK_DIS 0x0 /*!< I2C master will not check ack from slave */ +#define ACK_VAL 0x0 /*!< I2C ack value */ +#define NACK_VAL 0x1 /*!< I2C nack value */ + +#define BME280_REGISTER_DIG_T1 0x88 +#define BME280_REGISTER_DIG_T2 0x8A +#define BME280_REGISTER_DIG_T3 0x8C + +#define BME280_REGISTER_DIG_P1 0x8E +#define BME280_REGISTER_DIG_P2 0x90 +#define BME280_REGISTER_DIG_P3 0x92 +#define BME280_REGISTER_DIG_P4 0x94 +#define BME280_REGISTER_DIG_P5 0x96 +#define BME280_REGISTER_DIG_P6 0x98 +#define BME280_REGISTER_DIG_P7 0x9A +#define BME280_REGISTER_DIG_P8 0x9C +#define BME280_REGISTER_DIG_P9 0x9E + +#define BME280_REGISTER_DIG_H1 0xA1 +#define BME280_REGISTER_DIG_H2 0xE1 +#define BME280_REGISTER_DIG_H3 0xE3 +#define BME280_REGISTER_DIG_H4 0xE4 +#define BME280_REGISTER_DIG_H5 0xE5 +#define BME280_REGISTER_DIG_H6 0xE7 + +#define BME280_REGISTER_CHIPID 0xD0 +#define BME280_REGISTER_VERSION 0xD1 +#define BME280_REGISTER_SOFTRESET 0xE0 + +#define BME280_REGISTER_CAL26 0xE1 // R calibration stored in 0xE1-0xF0 + +#define BME280_REGISTER_CONTROLHUMID 0xF2 +#define BME280_REGISTER_STATUS 0XF3 +#define BME280_REGISTER_CONTROL 0xF4 +#define BME280_REGISTER_CONFIG 0xF5 +#define BME280_REGISTER_PRESSUREDATA 0xF7 +#define BME280_REGISTER_TEMPDATA 0xFA +#define BME280_REGISTER_HUMIDDATA 0xFD + +typedef struct { + uint16_t dig_t1; + int16_t dig_t2; + int16_t dig_t3; + + uint16_t dig_p1; + int16_t dig_p2; + int16_t dig_p3; + int16_t dig_p4; + int16_t dig_p5; + int16_t dig_p6; + int16_t dig_p7; + int16_t dig_p8; + int16_t dig_p9; + + uint8_t dig_h1; + int16_t dig_h2; + uint8_t dig_h3; + int16_t dig_h4; + int16_t dig_h5; + int8_t dig_h6; +} bme280_data_t; + +typedef enum { + BME280_SAMPLING_NONE = 0b000, + BME280_SAMPLING_X1 = 0b001, + BME280_SAMPLING_X2 = 0b010, + BME280_SAMPLING_X4 = 0b011, + BME280_SAMPLING_X8 = 0b100, + BME280_SAMPLING_X16 = 0b101 +} bme280_sensor_sampling; + +typedef enum { + BME280_MODE_SLEEP = 0b00, + BME280_MODE_FORCED = 0b01, + BME280_MODE_NORMAL = 0b11 +} bme280_sensor_mode; + +typedef enum { + BME280_FILTER_OFF = 0b000, + BME280_FILTER_X2 = 0b001, + BME280_FILTER_X4 = 0b010, + BME280_FILTER_X8 = 0b011, + BME280_FILTER_X16 = 0b100 +} bme280_sensor_filter; + +// standby durations in ms +typedef enum { + BME280_STANDBY_MS_0_5 = 0b000, + BME280_STANDBY_MS_10 = 0b110, + BME280_STANDBY_MS_20 = 0b111, + BME280_STANDBY_MS_62_5 = 0b001, + BME280_STANDBY_MS_125 = 0b010, + BME280_STANDBY_MS_250 = 0b011, + BME280_STANDBY_MS_500 = 0b100, + BME280_STANDBY_MS_1000 = 0b101 +} bme280_standby_duration; + +// The config register +typedef struct config { + // inactive duration (standby time) in normal mode + // 000 = 0.5 ms + // 001 = 62.5 ms + // 010 = 125 ms + // 011 = 250 ms + // 100 = 500 ms + // 101 = 1000 ms + // 110 = 10 ms + // 111 = 20 ms + unsigned int t_sb : 3; + + // filter settings + // 000 = filter off + // 001 = 2x filter + // 010 = 4x filter + // 011 = 8x filter + // 100 and above = 16x filter + unsigned int filter : 3; + + // unused - don't set + unsigned int none : 1; + unsigned int spi3w_en : 1; +} bme280_config_t; + +// The ctrl_meas register +typedef struct ctrl_meas { + // temperature oversampling + // 000 = skipped + // 001 = x1 + // 010 = x2 + // 011 = x4 + // 100 = x8 + // 101 and above = x16 + unsigned int osrs_t : 3; + + // pressure oversampling + // 000 = skipped + // 001 = x1 + // 010 = x2 + // 011 = x4 + // 100 = x8 + // 101 and above = x16 + unsigned int osrs_p : 3; + + // device mode + // 00 = sleep + // 01 or 10 = forced + // 11 = normal + unsigned int mode : 2; +} bme280_ctrl_meas_t; + +// The ctrl_hum register +typedef struct ctrl_hum { + // unused - don't set + unsigned int none : 5; + + // pressure oversampling + // 000 = skipped + // 001 = x1 + // 010 = x2 + // 011 = x4 + // 100 = x8 + // 101 and above = x16 + unsigned int osrs_h : 3; +} bme280_ctrl_hum_t; + +typedef struct { + i2c_bus_device_handle_t i2c_dev; + uint8_t dev_addr; + bme280_data_t data_t; + bme280_config_t config_t; + bme280_ctrl_meas_t ctrl_meas_t; + bme280_ctrl_hum_t ctrl_hum_t; + int32_t t_fine; +} bme280_dev_t; + +typedef void *bme280_handle_t; /*handle of bme280*/ + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + * @brief Create bme280 handle_t + * + * @param object handle of I2C + * @param device address + * + * @return + * - bme280_handle_t + */ +bme280_handle_t bme280_create(i2c_bus_handle_t bus, uint8_t dev_addr); + +/** + * @brief delete bme280 handle_t + * + * @param point to object handle of bme280 + * @param whether delete i2c bus + * + * @return + * - ESP_OK Success + * - ESP_FAIL Fail + */ +esp_err_t bme280_delete(bme280_handle_t *sensor); + +/** + * @brief Get the value of BME280_REGISTER_CONFIG register + * + * @param sensor object handle of bme280 + * + * @return + * - unsigned int: the value of BME280_REGISTER_CONFIG register + */ +unsigned int bme280_getconfig(bme280_handle_t sensor); + +/** + * @brief Get the value of BME280_REGISTER_CONTROL measure register + * + * @param sensor object handle of bme280 + * + * @return + * - unsigned int the value of BME280_REGISTER_CONTROL register + */ +unsigned int bme280_getctrl_meas(bme280_handle_t sensor); + +/** + * @brief Get the value of BME280_REGISTER_CONTROLHUMID measure register + * + * @param sensor object handle of bme280 + * + * @return + * - unsigned int the value of BME280_REGISTER_CONTROLHUMID register + */ +unsigned int bme280_getctrl_hum(bme280_handle_t sensor); + +/** + * @brief return true if chip is busy reading cal data + * + * @param sensor object handle of bme280 + * + * @return + * - true chip is busy + * - false chip is idle or wrong + */ +bool bme280_is_reading_calibration(bme280_handle_t sensor); + +/** + * @brief Reads the factory-set coefficients + * + * @param sensor object handle of bme280 + * + * @return + * - ESP_OK Success + * - ESP_FAIL Fail + */ +esp_err_t bme280_read_coefficients(bme280_handle_t sensor); + +/** + * @brief setup sensor with gien parameters / settings + * + * @param sensor object handle of bme280 + * @param Sensor working mode + * @param the sample of temperature measure + * @param the sample of pressure measure + * @param the sample of humidity measure + * @param Sensor filter multiples + * @param standby duration of sensor + * + * @return + * - ESP_OK Success + * - ESP_FAIL Fail + */ +esp_err_t bme280_set_sampling(bme280_handle_t sensor, bme280_sensor_mode mode, + bme280_sensor_sampling tempsampling, + bme280_sensor_sampling presssampling, + bme280_sensor_sampling humsampling, bme280_sensor_filter filter, + bme280_standby_duration duration); + +/** + * @brief init bme280 device + * + * @param sensor object handle of bme280 + * + * @return + * - ESP_OK Success + * - ESP_FAIL Fail + */ +esp_err_t bme280_default_init(bme280_handle_t sensor); + +/** + * @brief Take a new measurement (only possible in forced mode) + * If we are in forced mode, the BME sensor goes back to sleep after each + * measurement and we need to set it to forced mode once at this point, so + * it will take the next measurement and then return to sleep again. + * In normal mode simply does new measurements periodically. + * + * @param sensor object handle of bme280 + * + * @return + * - ESP_OK Success + * - ESP_FAIL Fail + */ +esp_err_t bme280_take_forced_measurement(bme280_handle_t sensor); + +/** + * @brief Returns the temperature from the sensor + * + * @param sensor object handle of bme280 + * @param temperature pointer to temperature + * @return esp_err_t + */ +esp_err_t bme280_read_temperature(bme280_handle_t sensor, float *temperature); + +/** + * @brief Returns the temperature from the sensor + * + * @param sensor object handle of bme280 + * @param pressure pointer to pressure value + * @return esp_err_t + */ +esp_err_t bme280_read_pressure(bme280_handle_t sensor, float *pressure); + +/** + * @brief Returns the humidity from the sensor + * + * @param sensor object handle of bme280 + * @param humidity pointer to humidity value + * @return esp_err_t + */ +esp_err_t bme280_read_humidity(bme280_handle_t sensor, float *humidity); + +/** + * @brief Calculates the altitude (in meters) from the specified atmospheric + * pressure (in hPa), and sea-level pressure (in hPa). + * + * @param sensor object handle of bme280 + * @param seaLevel: Sea-level pressure in hPa + * @param altitude pointer to altitude value + * @return esp_err_t + */ +esp_err_t bme280_read_altitude(bme280_handle_t sensor, float seaLevel, float *altitude); + +/** + * Calculates the pressure at sea level (in hPa) from the specified altitude + * (in meters), and atmospheric pressure (in hPa). + * + * @param sensor object handle of bme280 + * @param altitude Altitude in meters + * @param atmospheric Atmospheric pressure in hPa + * @param pressure pointer to pressure value + * @return esp_err_t + */ +esp_err_t bme280_calculates_pressure(bme280_handle_t sensor, float altitude, + float atmospheric, float *pressure); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/license.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/license.txt new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/license.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/test_apps/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/test_apps/CMakeLists.txt new file mode 100644 index 000000000..eb55e7910 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/test_apps/CMakeLists.txt @@ -0,0 +1,9 @@ +# The following lines of boilerplate have to be in your project's CMakeLists +# in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.5) + +set(EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/tools/unit-test-app/components" + "../../bme280") + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(bme280_test) diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/test_apps/main/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/test_apps/main/CMakeLists.txt new file mode 100644 index 000000000..eeff39794 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/test_apps/main/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRC_DIRS "." + PRIV_INCLUDE_DIRS "." + PRIV_REQUIRES unity test_utils bme280) diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/test_apps/main/bme280_test.c b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/test_apps/main/bme280_test.c new file mode 100644 index 000000000..3b71bbbf5 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/test_apps/main/bme280_test.c @@ -0,0 +1,77 @@ +/* + * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "unity.h" +#include "esp_log.h" +#include "bme280.h" +#include "i2c_bus.h" + +#define I2C_MASTER_SCL_IO GPIO_NUM_2 /*!< gpio number for I2C master clock IO2*/ +#define I2C_MASTER_SDA_IO GPIO_NUM_1 /*!< gpio number for I2C master data IO1*/ +#define I2C_MASTER_NUM I2C_NUM_0 /*!< I2C port number for master bme280 */ +#define I2C_MASTER_TX_BUF_DISABLE 0 /*!< I2C master do not need buffer */ +#define I2C_MASTER_RX_BUF_DISABLE 0 /*!< I2C master do not need buffer */ +#define I2C_MASTER_FREQ_HZ 100000 /*!< I2C master clock frequency */ + +static i2c_bus_handle_t i2c_bus = NULL; +static bme280_handle_t bme280 = NULL; + +void bme280_test_init() +{ + i2c_config_t conf = { + .mode = I2C_MODE_MASTER, + .sda_io_num = I2C_MASTER_SDA_IO, + .sda_pullup_en = GPIO_PULLUP_ENABLE, + .scl_io_num = I2C_MASTER_SCL_IO, + .scl_pullup_en = GPIO_PULLUP_ENABLE, + .master.clk_speed = I2C_MASTER_FREQ_HZ, + }; + i2c_bus = i2c_bus_create(I2C_MASTER_NUM, &conf); + bme280 = bme280_create(i2c_bus, BME280_I2C_ADDRESS_DEFAULT); + ESP_LOGI("BME280:", "bme280_default_init:%d", bme280_default_init(bme280)); +} + +void bme280_test_deinit() +{ + bme280_delete(&bme280); + i2c_bus_delete(&i2c_bus); +} + +void bme280_test_getdata() +{ + int cnt = 10; + while (cnt--) { + float temperature = 0.0, humidity = 0.0, pressure = 0.0; + if (ESP_OK == bme280_read_temperature(bme280, &temperature)) { + ESP_LOGI("BME280", "temperature:%f ", temperature); + } + vTaskDelay(300 / portTICK_RATE_MS); + if (ESP_OK == bme280_read_humidity(bme280, &humidity)) { + ESP_LOGI("BME280", "humidity:%f ", humidity); + } + vTaskDelay(300 / portTICK_RATE_MS); + if (ESP_OK == bme280_read_pressure(bme280, &pressure)) { + ESP_LOGI("BME280", "pressure:%f\n", pressure); + } + vTaskDelay(300 / portTICK_RATE_MS); + } +} + +TEST_CASE("Device bme280 test", "[bme280][iot][device]") +{ + bme280_test_init(); + bme280_test_getdata(); + bme280_test_deinit(); +} + +void app_main(void) +{ + printf("BME280 TEST \n"); + unity_run_menu(); +} diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/test_apps/sdkconfig.defaults b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/test_apps/sdkconfig.defaults new file mode 100644 index 000000000..3778471bc --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__bme280/test_apps/sdkconfig.defaults @@ -0,0 +1,9 @@ +# For IDF 5.0 +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y +CONFIG_FREERTOS_HZ=1000 +CONFIG_ESP_TASK_WDT_EN=n + +# For IDF4.4 +CONFIG_ESP32S2_DEFAULT_CPU_FREQ_240=y +CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240=y +CONFIG_ESP_TASK_WDT=n diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/.component_hash b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/.component_hash new file mode 100644 index 000000000..b110e53cd --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/.component_hash @@ -0,0 +1 @@ +351350613ceafba240b761b4ea991e0f231ac7a9f59a9ee901f751bddc0bb18f \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/CHANGELOG.md b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/CHANGELOG.md new file mode 100644 index 000000000..26fd7eb58 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/CHANGELOG.md @@ -0,0 +1,89 @@ +## v0.5.3 - 2023-09-15 + +* fix `add_dependencies called with incorrect number of arguments` in `relinker.cmake` +* `include(cmake_utilities)` is not suggested now, to avoid cmake_utilities dependency issue + +## v0.5.2 - 2023-09-15 + +* Support work on older ESP-IDF, eg: 4.3.x + +## v0.5.1 - 2023-08-22 + +* Add string 1-byte align support + +## v0.5.0 - 2023-08-02 + +* Add GCC LTO support + +## v0.4.8 - 2023-05-24 + +* Add unit test app + +### Bugfix: + +* fix customer target redefinition issue + +## v0.4.7 - 2023-04-21 + +* gen_compressed_ota: support the addition of a v2 compressed OTA header to compressed firmware. + +## v0.4.6 - 2023-04-20 + +* relinker: add IDF v4.3.x support + +## v0.4.5 - 2023-04-17 + +* gen_compressed_ota: remove slash use in gen_custom_ota.py so that the script can be used in the Windows cmd terminal. + +## v0.4.4 - 2023-04-07 + +* relinker: suppressing the creation of `__pycache__` +* relinker: support same name objects in one library + +## v0.4.3 - 2023-03-24 + +* relinker: support decoding to get IRAM excluded libraries + +## v0.4.2 - 2023-03-20 + +### Bugfix: + +* gen_compressed_ota: Fix the number of bytes reserved in the v3 compressed image header +* gen_compressed_ota: Fix definition of MD5 length in compressed image header for different versions. + +## v0.4.1 - 2023-03-15 + +* relinker: add option to use customized configuration files +* relinker: add option to print error information instead of throwing exception when missing function +* relinker: move functions of SPI flash from IRAM to flash only when enable CONFIG_SPI_FLASH_ROM_IMPL +* relinker: move some functions of esp_timer from IRAM to flash only when disable CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD + +## v0.4.0 - 2023-03-13 + +### Feature: + +* Add command `idf.py gen_single_bin` to generate merged bin file +* Add command `idf.py flash_single_bin` to flash generated merged bin +* Add config `Color in diagnostics` to control the GCC color output + +## v0.3.0 - 2023-03-10 + +* Add gen_compressed_ota functionality, please refer to [gen_compressed_ota.md](https://github.com/espressif/esp-iot-solution/tree/master/tools/cmake_utilities/docs/gen_compressed_ota.md) + +## v0.2.1 - 2023-03-09 + +### Bugfix: + +* package manager: Fix the compile issue when the name of the component has `-`, just like esp-xxx + +## v0.2.0 - 2023-02-23 + +* Add relinker functionality, please refer to [relinker.md](https://github.com/espressif/esp-iot-solution/tree/master/tools/cmake_utilities/docs/relinker.md) + +## v0.1.0 - 2023-01-12 + +### Feature: + +* Add function cu_pkg_get_version +* Add macro cu_pkg_define_version +* Add cmake script to CMAKE_MODULE_PATH diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/CHECKSUMS.json b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/CHECKSUMS.json new file mode 100644 index 000000000..5954added --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/CHECKSUMS.json @@ -0,0 +1 @@ +{"version": "1.0", "algorithm": "sha256", "created_at": "2025-05-21T16:40:48.657779+00:00", "files": [{"path": "package_manager.cmake", "size": 2125, "hash": "1e7f6ba9cdcc8fc9f0a7dde5c5e1ec03ef699c210caf381181cc4a35f95f0ca1"}, {"path": "CMakeLists.txt", "size": 25, "hash": "1b07b2a81841a6e12fc589126fca551dfa39cd6db0646f802740972b48a2cf1b"}, {"path": "CHANGELOG.md", "size": 2592, "hash": "4779bc99678035cbd48addd07e6c5246213d7a93fb34ec469eb838fb64840c63"}, {"path": "idf_component.yml", "size": 255, "hash": "8c21ccd7648224f955d0f8e694fca3e5c469db87ceea389ebbf66b6e5c5da239"}, {"path": "Kconfig", "size": 2524, "hash": "e776e604c4395f8aa8d869a363d042e08eeea372887ff0e2b57535455f1bf3c0"}, {"path": "README.md", "size": 1340, "hash": "26229d274cc1e1add77cfe70eab0997059458894aff066ee2e227bf2c1fd9b7e"}, {"path": "project_include.cmake", "size": 354, "hash": "ca2f4fbba0ae2524cabe17844a79021d587cce6ec5fef53b36c21ae4d7257972"}, {"path": "gen_single_bin.cmake", "size": 1104, "hash": "34bc2100e339538edc47e86aa63cbeb7bc98c06a93105027a4603ba7f96b1dc2"}, {"path": "relinker.cmake", "size": 3288, "hash": "52ac755b429ee9cf6a45fd22121485d69f883d56c3b9f5d8eaa325156a070ad3"}, {"path": "license.txt", "size": 11358, "hash": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30"}, {"path": "cmake_utilities.cmake", "size": 137, "hash": "307c1feb59598ff2351967009f1c6424820178b1da6903f40cc01dd52eb703ef"}, {"path": "gen_compressed_ota.cmake", "size": 727, "hash": "8309efee996bd2e5da0f55d26a0df1d199efb9c562eba07e410d49744401659a"}, {"path": "gcc.cmake", "size": 3585, "hash": "47674577242d2be68d6bc1c71bbe664a7e1d0047170ee1fe78f71b987c810620"}, {"path": "test_apps/CMakeLists.txt", "size": 374, "hash": "a851b56d24811c45175a960701596367c9a575b34a6fa8b7ab01bc2c1334c129"}, {"path": "test_apps/pytest_cmake_utilities.py", "size": 583, "hash": "5f60d02cdcaed3503bc259c51cff9af0c267887c86be825c097ed8f57a6a13fa"}, {"path": "docs/gen_compressed_ota.md", "size": 1620, "hash": "c7779477fb4989379898ad18b70af7738ff2bffe624e5d549a3b776aa983ca0b"}, {"path": "docs/gcc.md", "size": 3494, "hash": "908f5108283c7e3d0a046711ab8215fe6ccd59f09924d55cef0bbaf6a5a4ff3a"}, {"path": "docs/relinker.md", "size": 2963, "hash": "0cbffe09354d7e66ac05cf6de02bcdcf76dd2db69072e998e15ee268a5dd2384"}, {"path": "scripts/gen_custom_ota.py", "size": 13418, "hash": "64822db67089a6fdcde610d5ec31369aaa62441441f09d2ed8d4aae2a396e353"}, {"path": "scripts/relinker/configuration.py", "size": 6406, "hash": "7f5c80c0dd3504bcab89b585786b805544a8e39b17b59fc0ef911cb0813fba09"}, {"path": "scripts/relinker/relinker.py", "size": 9978, "hash": "07c1ec82d9f1843d3a12ade88295610ab78cc21c2dd90b02fe314d88d9085eac"}, {"path": "scripts/relinker/examples/esp32c2/object.csv", "size": 6783, "hash": "761467fbbe3adbf544adcfaa50b2fca1a79208786070784b000961c43a23744d"}, {"path": "scripts/relinker/examples/esp32c2/library.csv", "size": 1156, "hash": "5ca43f2ded3f5b3e1d1398949c86080ac1ff7d06e7d147dc5ecf21d0ec034e61"}, {"path": "scripts/relinker/examples/esp32c2/function.csv", "size": 22369, "hash": "5d608e6d35d7a2a6f5ac317ea5e993443b5baef0ce788eb2464aca37246bcb29"}, {"path": "test_apps/main/CMakeLists.txt", "size": 157, "hash": "1b582805eb1d7d515bac70643308b0bacf18dccee565df745051267635b09c1a"}, {"path": "test_apps/main/test_cmake_utilities.c", "size": 1848, "hash": "6ff7025750c8c59bbd379af839def4427c6f59149e19885ac674740e45eccdac"}, {"path": "test_apps/components/TEST-component2/CMakeLists.txt", "size": 285, "hash": "441a6b60573d3146386d56ccbf12cf4451eeef01cac2905b18259bb2a1912b64"}, {"path": "test_apps/components/TEST-component2/idf_component.yml", "size": 230, "hash": "dbbd16387c7b0ea7378126e87cafdf8b3bc58fdcf472e7d853b38ea24d813a2b"}, {"path": "test_apps/components/TEST-component2/test_component2.h", "size": 213, "hash": "42a6a9a527a8b78a6373a432a1d2c8c540bae91d7c604bbc12be5f709a16fb37"}, {"path": "test_apps/components/TEST-component2/test_component2.c", "size": 256, "hash": "d949b85dd1ce045b724cd463ac6549b372db9935ed07dc3dad250660d3b3f27f"}, {"path": "test_apps/components/test_component1/CMakeLists.txt", "size": 285, "hash": "441a6b60573d3146386d56ccbf12cf4451eeef01cac2905b18259bb2a1912b64"}, {"path": "test_apps/components/test_component1/test_component1.h", "size": 213, "hash": "e77976253127f05cbbfae7a635c9455d584b66cceae69ef8f8465fd4ce85aadf"}, {"path": "test_apps/components/test_component1/idf_component.yml", "size": 230, "hash": "70631b0633adbaa92bb26785dee0369f889cc93bc9a22635f1553f864522607b"}, {"path": "test_apps/components/test_component1/test_component1.c", "size": 256, "hash": "fe9ce9a01d53cfbc1970f0a9ee9c8d382c399e0c9aeb93ce843af01bd70b5411"}]} \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/CMakeLists.txt new file mode 100644 index 000000000..a96dced59 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/CMakeLists.txt @@ -0,0 +1 @@ +idf_component_register() diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/Kconfig b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/Kconfig new file mode 100644 index 000000000..96747fdf1 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/Kconfig @@ -0,0 +1,65 @@ +menu "CMake Utilities" + + config CU_RELINKER_ENABLE + bool "Enable relinker" + default n + help + "Enable relinker to linker some IRAM functions to Flash" + + if CU_RELINKER_ENABLE + config CU_RELINKER_ENABLE_PRINT_ERROR_INFO_WHEN_MISSING_FUNCTION + bool "Print error information when missing function" + default y + help + "Enable this option to print error information instead of + throwing exception when missing function" + + config CU_RELINKER_ENABLE_CUSTOMIZED_CONFIGURATION_FILES + bool "Enable customized relinker configuration files" + default n + help + "Enable this option to use customized relinker configuration + files instead of default ones" + + if CU_RELINKER_ENABLE_CUSTOMIZED_CONFIGURATION_FILES + config CU_RELINKER_CUSTOMIZED_CONFIGURATION_FILES_PATH + string "Customized relinker configuration files path" + default "" + help + "Customized relinker configuration files path. This path is + evaluated relative to the project root directory." + endif + endif + + choice CU_DIAGNOSTICS_COLOR + prompt "Color in diagnostics" + default CU_DIAGNOSTICS_COLOR_ALWAYS + help + Use color in diagnostics. "never", "always", or "auto". If "always", GCC will output + with color defined in GCC_COLORS environment variable. If "never", only output plain + text. If "auto", only output with color when the standard error is a terminal and when + not executing in an emacs shell. + + config CU_DIAGNOSTICS_COLOR_NEVER + bool "never" + config CU_DIAGNOSTICS_COLOR_ALWAYS + bool "always" + config CU_DIAGNOSTICS_COLOR_AUTO + bool "auto" + endchoice + + config CU_GCC_LTO_ENABLE + bool "Enable GCC link time optimization(LTO)" + default n + help + "Enable this option, users can enable GCC link time optimization(LTO) + feature for target components or dependencies. + + config CU_GCC_STRING_1BYTE_ALIGN + bool "GCC string 1-byte align" + default n + help + "Enable this option, user can make string in designated components align + by 1-byte instead 1-word(4-byte), this can reduce unnecessary filled data + so that to reduce firmware size." +endmenu diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/README.md b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/README.md new file mode 100644 index 000000000..834ab7308 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/README.md @@ -0,0 +1,31 @@ +# Cmake utilities + +[![Component Registry](https://components.espressif.com/components/espressif/cmake_utilities/badge.svg)](https://components.espressif.com/components/espressif/cmake_utilities) + +This component is aiming to provide some useful CMake utilities outside of ESP-IDF. + +## Use + +1. Add dependency of this component in your component or project's idf_component.yml. + + ```yml + dependencies: + espressif/cmake_utilities: "0.*" + ``` + +2. Include the CMake file you need in your component's CMakeLists.txt after `idf_component_register`, or in your project's CMakeLists.txt + + ```cmake + // Note: should remove .cmake postfix when using include(), otherwise the requested file will not found + // Note: should place this line after `idf_component_register` function + // only include the one you needed. + include(package_manager) + ``` + +3. Then you can use the corresponding CMake function which is provided by the CMake file. + +## Supported features + +1. [relinker](https://github.com/espressif/esp-iot-solution/blob/master/tools/cmake_utilities/docs/relinker.md) +2. [gen_compressed_ota](https://github.com/espressif/esp-iot-solution/blob/master/tools/cmake_utilities/docs/gen_compressed_ota.md) +3. [GCC Optimization](https://github.com/espressif/esp-iot-solution/blob/master/tools/cmake_utilities/docs/gcc.md) diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/cmake_utilities.cmake b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/cmake_utilities.cmake new file mode 100644 index 000000000..92ba9bd0c --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/cmake_utilities.cmake @@ -0,0 +1,7 @@ +# Include all cmake modules + +include(gcc) +include(gen_compressed_ota) +include(gen_single_bin) +include(package_manager) +include(relinker) diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/docs/gcc.md b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/docs/gcc.md new file mode 100644 index 000000000..a7817fefd --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/docs/gcc.md @@ -0,0 +1,108 @@ +# Link Time Optimization(LTO) + +Link time optimization(LTO) improves the optimization effect of GCC, such as reducing binary size, increasing performance, and so on. For more details please refer to related [GCC documents](https://gcc.gnu.org/onlinedocs/gccint/LTO.html). + +## Use + +To use this feature, you need to include the required CMake file in your project's CMakeLists.txt after `project(XXXX)`. + +```cmake +include($ENV{IDF_PATH}/tools/cmake/project.cmake) + +project(XXXX) + +include(gcc) +``` + +The LTO feature is disabled by default. To use it, you should enable the option `CU_GCC_LTO_ENABLE` in menuconfig. Then specify target components or dependencies to be optimized by LTO after `include(gcc)` as follows: + +```cmake +include(gcc) + +cu_gcc_lto_set(COMPONENTS component_a component_b + DEPENDS dependence_a dependence_b) + +cu_gcc_string_1byte_align(COMPONENTS component_c component_d + DEPENDS dependence_c dependence_d) +``` + +Based on your requirement, set compiling optimization level in the option `COMPILER_OPTIMIZATION`. + +* Note + + ``` + 1. Reducing firmware size may decrease performance + 2. Increasing performance may increase firmware size + 3. Enable LTO cause compiling time cost increases a lot + 4. Enable LTO may increase task stack cost + 5. Enable string 1-byte align may decrease string process speed + ``` + +## Limitation + +At the linking stage, the LTO generates new function indexes instead of the file path as follows: + +- LTO + + ```txt + .text 0x00000000420016f4 0x6 /tmp/ccdjwYMH.ltrans51.ltrans.o + 0x00000000420016f4 app_main + ``` + +- Without LTO + + ```txt + .text.app_main 0x00000000420016f4 0x6 esp-idf/main/libmain.a(app_main.c.obj) + 0x00000000420016f4 app_main + ``` + +So tools used to relink functions between flash and IRAM can't affect these optimized components and dependencies again. It is recommended that users had better optimize application components and dependencies than kernel and hardware driver ones. + +## Example + +The example applies LTO in `light` of `esp-matter` because its application code is much larger. Add LTO configuration into project script `CMakeLists.txt` as follows: + +```cmake + +project(light) + +include(gcc) + +# Add +set(app_lto_components main chip esp_matter) +# Add +set(idf_lto_components lwip wpa_supplicant nvs_flash) +# Add +set(lto_depends mbedcrypto) + +# Add +cu_gcc_lto_set(COMPONENTS ${app_lto_components} ${idf_lto_components} + DEPENDS ${lto_depends}) +``` + +Configure `ESP32-C2` as the target platform, enable `CU_GCC_LTO_ENABLE` and `CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE`, set `COMPILER_OPTIMIZATION` to be `-Os`. +Increase the `main` task stack size to `5120` by option `ESP_MAIN_TASK_STACK_SIZE`. +Compile the project, and then you can see the firmware size decrease a lot: + +Option | Firmware size | Stask cost +|:-:|:-:|:-:| + -Os | 1,113,376 | 2508 + -Os + LTO | 1,020,640 | 4204 + +Then add `cu_gcc_string_1byte_align` after `cu_gcc_lto_set`: + +```cmake +# Add +cu_gcc_lto_set(COMPONENTS ${app_lto_components} ${idf_lto_components} + DEPENDS ${lto_depends}) + +cu_gcc_string_1byte_align(COMPONENTS ${app_lto_components} ${idf_lto_components} + DEPENDS ${lto_depends}) +``` + +Build the project and the firmware size is: + +Option | Firmware size | +|:-:|:-:| + -Os + LTO | 1,020,640 | + -Os + LTO + string 1-byte align | 1,018,340 | diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/docs/gen_compressed_ota.md b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/docs/gen_compressed_ota.md new file mode 100644 index 000000000..e3054b307 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/docs/gen_compressed_ota.md @@ -0,0 +1,41 @@ +# Gen Compressed OTA + +When using the compressed OTA, we need to generate the compressed app firmware. This document mainly describes how to generate the compressed app firmware. + +For more information about compressed OTA, refer to [bootloader_support_plus](https://github.com/espressif/esp-iot-solution/tree/master/components/bootloader_support_plus). + +## Use +In order to use this feature, you need to include the needed CMake file in your project's CMakeLists.txt after `project(XXXX)`. + +```cmake +project(XXXX) + +include(gen_compressed_ota) +``` + +Generate the compressed app firmware in an ESP-IDF "project" directory by running: + +```plaintext +idf.py gen_compressed_ota +``` + +This command will compile your project first, then it will generate the compressed app firmware. For example, run the command under the project `simple_ota_examples` folder. If there are no errors, the `custom_ota_binaries` folder will be created and contains the following files: + +```plaintext +simple_ota.bin.xz +simple_ota.bin.xz.packed +``` + +The file named `simple_ota.bin.xz.packed` is the actual compressed app binary file to be transferred. + +In addition, if [secure boot](https://docs.espressif.com/projects/esp-idf/en/latest/esp32c3/security/secure-boot-v2.html) is enabled, the command will generate the signed compressed app binary file: + +```plaintext +simple_ota.bin.xz.packed.signed +``` + +you can also use the script [gen_custom_ota.py](https://github.com/espressif/esp-iot-solution/tree/master/tools/cmake_utilities/scripts/gen_custom_ota.py) to compress the specified app: + +```plaintext +python3 gen_custom_ota.py -i simple_ota.bin +``` diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/docs/relinker.md b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/docs/relinker.md new file mode 100644 index 000000000..2b7be1829 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/docs/relinker.md @@ -0,0 +1,66 @@ +# Relinker + +In ESP-IDF, some functions are put in SRAM when link stage, the reason is that some functions are critical, we need to put them in SRAM to speed up the program, or the functions will be executed when the cache is disabled. But actually, some functions can be put into Flash, here, we provide a script to let the user set the functions which are located in SRAM by default to put them into Flash, in order to save more SRAM which can be used as heap region later. This happens in the linker stage, so we call it as relinker. + +## Use + +In order to use this feature, you need to include the needed CMake file in your project's CMakeLists.txt after `project(XXXX)`. + +```cmake +project(XXXX) + +include(relinker) +``` + +The relinker feature is disabled by default, in order to use it, you need to enable the option `CU_RELINKER_ENABLE` in menuconfig. + +Here are the default configuration files in the folder `cmake_utilities/scripts/relinker/examples/esp32c2`, it's just used as a reference. If you would like to use your own configuration files, please enable option `CU_RELINKER_ENABLE_CUSTOMIZED_CONFIGURATION_FILES` and set the path of your configuration files as following, this path is evaluated relative to the project root directory: + +``` +[*] Enable customized relinker configuration files +(path of your configuration files) Customized relinker configuration files path +``` + +> Note: Currently only esp32c2 is supported. + +## Configuration Files + +You can refer to the files in the directory of `cmake_utilities/scripts/relinker/examples/esp32c2`: + +- library.csv +- object.csv +- function.csv + +For example, if you want to link function `__getreent` from SRAM to Flash, firstly you should add it to `function.csv` file as following: + +``` +libfreertos.a,tasks.c.obj,__getreent, +``` + +This means function `__getreent` is in object file `tasks.c.obj`, and object file `tasks.c.obj` is in library `libfreertos.a`. + +If function `__getreent` depends on the option `FREERTOS_PLACE_FUNCTIONS_INTO_FLASH` in menuconfig, then it should be: + +``` +libfreertos.a,tasks.c.obj,__getreent,CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH +``` + +This means when only `FREERTOS_PLACE_FUNCTIONS_INTO_FLASH` is enabled in menuconfig, function `__getreent` will be linked from SRAM to Flash. + +Next step you should add the path of the object file to `object.csv`: + +``` +libfreertos.a,tasks.c.obj,esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/tasks.c.obj +``` + +This means the object file `tasks.c.obj` is in library `libfreertos.a` and its location is `esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/tasks.c.obj` relative to directory of `build`. + +Next step you should add path of library to `library.csv`: + +``` +libfreertos.a,./esp-idf/freertos/libfreertos.a +``` + +This means library `libfreertos.a`'s location is `./esp-idf/freertos/libfreertos.a` relative to `build`. + +If above related data has exists in corresponding files, please don't add this repeatedly. \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/gcc.cmake b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/gcc.cmake new file mode 100644 index 000000000..5fdd13ed9 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/gcc.cmake @@ -0,0 +1,84 @@ +if(CONFIG_CU_GCC_LTO_ENABLE) + # Enable cmake interprocedural optimization(IPO) support to check if GCC supports link time optimization(LTO) + cmake_policy(SET CMP0069 NEW) + include(CheckIPOSupported) + + # Compare to "ar" and "ranlib", "gcc-ar" and "gcc-ranlib" integrate GCC LTO plugin + set(CMAKE_AR ${_CMAKE_TOOLCHAIN_PREFIX}gcc-ar) + set(CMAKE_RANLIB ${_CMAKE_TOOLCHAIN_PREFIX}gcc-ranlib) + + macro(cu_gcc_lto_set) + check_ipo_supported(RESULT result) + if(result) + message(STATUS "GCC link time optimization(LTO) is enable") + + set(multi_value COMPONENTS DEPENDS) + cmake_parse_arguments(LTO "" "" "${multi_value}" ${ARGN}) + + # Use full format LTO object file + set(GCC_LTO_OBJECT_TYPE "-ffat-lto-objects") + # Set compression level 9(min:0, max:9) + set(GCC_LTO_COMPRESSION_LEVEL "-flto-compression-level=9") + # Set partition level max to removed used symbol + set(GCC_LTO_PARTITION_LEVEL "-flto-partition=max") + + # Set mode "auto" to increase compiling speed + set(GCC_LTO_COMPILE_OPTIONS "-flto=auto" + ${GCC_LTO_OBJECT_TYPE} + ${GCC_LTO_COMPRESSION_LEVEL}) + + # Enable GCC LTO and plugin when linking stage + set(GCC_LTO_LINK_OPTIONS "-flto" + "-fuse-linker-plugin" + ${GCC_LTO_OBJECT_TYPE} + ${GCC_LTO_PARTITION_LEVEL}) + + message(STATUS "GCC LTO for components: ${LTO_COMPONENTS}") + foreach(c ${LTO_COMPONENTS}) + idf_component_get_property(t ${c} COMPONENT_LIB) + target_compile_options(${t} PRIVATE ${GCC_LTO_COMPILE_OPTIONS}) + endforeach() + + message(STATUS "GCC LTO for dependencies: ${LTO_DEPENDS}") + foreach(d ${LTO_DEPENDS}) + target_compile_options(${d} PRIVATE ${GCC_LTO_COMPILE_OPTIONS}) + endforeach() + + if("${IDF_VERSION_MAJOR}.${IDF_VERSION_MINOR}" VERSION_GREATER_EQUAL "4.4") + target_link_libraries(${project_elf} PRIVATE ${GCC_LTO_LINK_OPTIONS}) + else() + target_link_libraries(${project_elf} ${GCC_LTO_LINK_OPTIONS}) + endif() + else() + message(FATAL_ERROR "GCC link time optimization(LTO) is not supported") + endif() + endmacro() +else() + macro(cu_gcc_lto_set) + message(STATUS "GCC link time optimization(LTO) is not enable") + endmacro() +endif() + +if(CONFIG_CU_GCC_STRING_1BYTE_ALIGN) + macro(cu_gcc_string_1byte_align) + message(STATUS "GCC string 1-byte align is enable") + + set(multi_value COMPONENTS DEPENDS) + cmake_parse_arguments(STR_ALIGN "" "" "${multi_value}" ${ARGN}) + + message(STATUS "GCC string 1-byte align for components: ${STR_ALIGN_COMPONENTS}") + foreach(c ${STR_ALIGN_COMPONENTS}) + idf_component_get_property(t ${c} COMPONENT_LIB) + target_compile_options(${t} PRIVATE "-malign-data=natural") + endforeach() + + message(STATUS "GCC string 1-byte align for dependencies: ${STR_ALIGN_DEPENDS}") + foreach(d ${STR_ALIGN_DEPENDS}) + target_compile_options(${d} PRIVATE "-malign-data=natural") + endforeach() + endmacro() +else() + macro(cu_gcc_string_1byte_align) + message(STATUS "GCC string 1-byte align is not enable") + endmacro() +endif() diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/gen_compressed_ota.cmake b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/gen_compressed_ota.cmake new file mode 100644 index 000000000..2bd41e5bd --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/gen_compressed_ota.cmake @@ -0,0 +1,18 @@ +if (NOT TARGET gen_compressed_ota) + add_custom_target(gen_compressed_ota) + + if (CONFIG_SECURE_SIGNED_ON_UPDATE_NO_SECURE_BOOT OR CONFIG_SECURE_BOOT_V2_ENABLED) + set(COMPRESSED_OTA_BIN_SIGN_PARA --sign_key ${PROJECT_DIR}/${CONFIG_SECURE_BOOT_SIGNING_KEY}) + else() + set(COMPRESSED_OTA_BIN_SIGN_PARA ) + endif() + + set(GEN_COMPRESSED_BIN_CMD ${CMAKE_CURRENT_LIST_DIR}/scripts/gen_custom_ota.py ${COMPRESSED_OTA_BIN_SIGN_PARA} --add_app_header) + + add_custom_command(TARGET gen_compressed_ota + POST_BUILD + COMMAND ${PYTHON} ${GEN_COMPRESSED_BIN_CMD} + COMMENT "The gen compresssed bin cmd is: ${GEN_COMPRESSED_BIN_CMD}" + ) + add_dependencies(gen_compressed_ota gen_project_binary) +endif() \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/gen_single_bin.cmake b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/gen_single_bin.cmake new file mode 100644 index 000000000..c13c665c2 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/gen_single_bin.cmake @@ -0,0 +1,27 @@ +# Extend command to idf.py + +# Generate single bin with name ${CMAKE_PROJECT_NAME}_merged.bin +if (NOT TARGET gen_single_bin) + add_custom_target( + gen_single_bin + COMMAND ${CMAKE_COMMAND} -E echo "Merge bin files to ${CMAKE_PROJECT_NAME}_merged.bin" + COMMAND ${ESPTOOLPY} --chip ${IDF_TARGET} merge_bin -o ${CMAKE_PROJECT_NAME}_merged.bin @flash_args + COMMAND ${CMAKE_COMMAND} -E echo "Merge bin done" + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + DEPENDS gen_project_binary bootloader + VERBATIM USES_TERMINAL + ) +endif() + +# Flash bin ${CMAKE_PROJECT_NAME}_merged.bin to target chip +if (NOT TARGET flash_single_bin) + add_custom_target( + flash_single_bin + COMMAND ${CMAKE_COMMAND} -E echo "Flash merged bin ${CMAKE_PROJECT_NAME}_merged.bin to address 0x0" + COMMAND ${ESPTOOLPY} --chip ${IDF_TARGET} write_flash 0x0 ${CMAKE_PROJECT_NAME}_merged.bin + COMMAND ${CMAKE_COMMAND} -E echo "Flash merged bin done" + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + DEPENDS gen_single_bin + VERBATIM USES_TERMINAL + ) +endif() diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/idf_component.yml b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/idf_component.yml new file mode 100644 index 000000000..e683f53d9 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/idf_component.yml @@ -0,0 +1,7 @@ +dependencies: + idf: + version: '>=4.1' +description: A collection of useful cmake utilities +issues: https://github.com/espressif/esp-iot-solution/issues +url: https://github.com/espressif/esp-iot-solution/tree/master/tools/cmake_utilities +version: 0.5.3 diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/license.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/license.txt new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/license.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/package_manager.cmake b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/package_manager.cmake new file mode 100644 index 000000000..caef11b7f --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/package_manager.cmake @@ -0,0 +1,45 @@ +# cu_pkg_get_version +# +# @brief Get the package's version information, the package is installed by component manager. +# +# @param[in] pkg_path the package's path, normally it's ${CMAKE_CURRENT_LIST_DIR}. +# +# @param[out] ver_major the major version of the package +# @param[out] ver_minor the minor version of the package +# @param[out] ver_patch the patch version of the package +function(cu_pkg_get_version pkg_path ver_major ver_minor ver_patch) + set(yml_file "${pkg_path}/idf_component.yml") + if(EXISTS ${yml_file}) + file(READ ${yml_file} ver) + string(REGEX MATCH "(^|\n)version: \"?([0-9]+).([0-9]+).([0-9]+)\"?" _ ${ver}) + set(${ver_major} ${CMAKE_MATCH_2} PARENT_SCOPE) + set(${ver_minor} ${CMAKE_MATCH_3} PARENT_SCOPE) + set(${ver_patch} ${CMAKE_MATCH_4} PARENT_SCOPE) + else() + message(WARNING " ${yml_file} not exist") + endif() +endfunction() + +# cu_pkg_define_version +# +# @brief Add the package's version definitions using format ${NAME}_VER_MAJOR ${NAME}_VER_MINOR ${NAME}_VER_PATCH, +# the ${NAME} will be inferred from package path, and namespace like `espressif__` will be removed if the package download from esp-registry +# eg. espressif__usb_stream and usb_stream will generate same version definitions USB_STREAM_VER_MAJOR ... +# +# @param[in] pkg_path the package's path, normally it's ${CMAKE_CURRENT_LIST_DIR}. +# +macro(cu_pkg_define_version pkg_path) + cu_pkg_get_version(${pkg_path} ver_major ver_minor ver_patch) + get_filename_component(pkg_name ${pkg_path} NAME) + string(FIND ${pkg_name} "__" pkg_name_pos) + if(pkg_name_pos GREATER -1) + math(EXPR pkg_name_pos "${pkg_name_pos} + 2") + string(SUBSTRING ${pkg_name} ${pkg_name_pos} -1 pkg_name) + endif() + string(TOUPPER ${pkg_name} pkg_name) + string(REPLACE "-" "_" pkg_name ${pkg_name}) + message(STATUS "${pkg_name}: ${ver_major}.${ver_minor}.${ver_patch}") + list(LENGTH pkg_name_list len) + target_compile_options(${COMPONENT_LIB} PUBLIC + -D${pkg_name}_VER_MAJOR=${ver_major} -D${pkg_name}_VER_MINOR=${ver_minor} -D${pkg_name}_VER_PATCH=${ver_patch}) +endmacro() diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/project_include.cmake b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/project_include.cmake new file mode 100644 index 000000000..a5de922bf --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/project_include.cmake @@ -0,0 +1,9 @@ +set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR} ${CMAKE_MODULE_PATH}) + +if(CONFIG_CU_DIAGNOSTICS_COLOR_ALWAYS) + add_compile_options(-fdiagnostics-color=always) +elseif(CONFIG_CU_DIAGNOSTICS_COLOR_AUTO) + add_compile_options(-fdiagnostics-color=auto) +elseif(CONFIG_CU_DIAGNOSTICS_COLOR_NEVER) + add_compile_options(-fdiagnostics-color=never) +endif() diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/relinker.cmake b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/relinker.cmake new file mode 100644 index 000000000..10b9aaf66 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/relinker.cmake @@ -0,0 +1,73 @@ +# @brief Link designated functions from SRAM to Flash to save SRAM +if(CONFIG_CU_RELINKER_ENABLE) + # project_elf variable is only in project.cmake + if(NOT TARGET customer_sections AND DEFINED project_elf) + message(STATUS "Relinker is enabled.") + if(CONFIG_IDF_TARGET_ESP32C2) + set(target "esp32c2") + else() + message(FATAL_ERROR "Other targets are not supported.") + endif() + + if(CONFIG_CU_RELINKER_ENABLE_CUSTOMIZED_CONFIGURATION_FILES) + idf_build_get_property(project_dir PROJECT_DIR) + get_filename_component(cfg_file_path "${CONFIG_CU_RELINKER_CUSTOMIZED_CONFIGURATION_FILES_PATH}" + ABSOLUTE BASE_DIR "${project_dir}") + + if(NOT EXISTS "${cfg_file_path}") + message(FATAL_ERROR "Relinker Configuration files path ${cfg_file_path} is not found.") + endif() + else() + set(cfg_file_path ${PROJECT_DIR}/relinker/${target}) + if(NOT EXISTS ${cfg_file_path}) + set(cfg_file_path ${CMAKE_CURRENT_LIST_DIR}/scripts/relinker/examples/${target}) + endif() + endif() + + message(STATUS "Relinker configuration files: ${cfg_file_path}") + + set(library_file "${cfg_file_path}/library.csv") + set(object_file "${cfg_file_path}/object.csv") + set(function_file "${cfg_file_path}/function.csv") + set(relinker_script "${CMAKE_CURRENT_LIST_DIR}/scripts/relinker/relinker.py") + + set(cmake_objdump "${CMAKE_OBJDUMP}") + set(link_path "${CMAKE_BINARY_DIR}/esp-idf/esp_system/ld") + set(link_src_file "${link_path}/sections.ld") + set(link_dst_file "${link_path}/customer_sections.ld") + + set(relinker_opts --input ${link_src_file} + --output ${link_dst_file} + --library ${library_file} + --object ${object_file} + --function ${function_file} + --sdkconfig ${sdkconfig} + --objdump ${cmake_objdump}) + + if(CONFIG_CU_RELINKER_ENABLE_PRINT_ERROR_INFO_WHEN_MISSING_FUNCTION) + list(APPEND relinker_opts --missing_function_info True) + endif() + + idf_build_get_property(link_depends __LINK_DEPENDS) + + add_custom_command(OUTPUT ${link_dst_file} + COMMAND ${python} -B ${relinker_script} + ${relinker_opts} + COMMAND ${CMAKE_COMMAND} -E copy + ${link_dst_file} + ${link_src_file} + COMMAND ${CMAKE_COMMAND} -E echo + /*relinker*/ >> + ${link_dst_file} + DEPENDS "${link_depends}" + "${library_file}" + "${object_file}" + "${function_file}" + VERBATIM) + + add_custom_target(customer_sections DEPENDS ${link_dst_file}) + add_dependencies(${project_elf} customer_sections) + endif() +else() + message(STATUS "Relinker isn't enabled.") +endif() diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/scripts/gen_custom_ota.py b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/scripts/gen_custom_ota.py new file mode 100644 index 000000000..00cffc64b --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/scripts/gen_custom_ota.py @@ -0,0 +1,243 @@ +#!/usr/bin/env python +# +# SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD +# +# SPDX-License-Identifier: Apache-2.0 + +import sys +import struct +import argparse +import binascii +import hashlib +import os +import subprocess +import shutil +import json +import lzma + +# src_file = 'hello-world.bin' +# compressed_file = 'hello-world.bin.xz' +# packed_compressed_file = 'hello-world.bin.xz.packed' +# siged_packed_compressed_file = 'hello-world.bin.xz.packed.signed' + +binary_compress_type = {'none': 0, 'xz':1} +header_version = {'v1': 1, 'v2': 2, 'v3': 3} + +SCRIPT_VERSION = '1.0.0' +ORIGIN_APP_IMAGE_HEADER_LEN = 288 # sizeof(esp_image_header_t) + sizeof(esp_image_segment_header_t) + sizeof(esp_app_desc_t). See esp_app_format.h +# At present, we calculate the checksum of the first 4KB data of the old app. +OLD_APP_CHECK_DATA_SIZE = 4096 + +# v1 compressed data header: +# Note: Encryption_type field is deprecated, the field is reserved for compatibility. +# |------|---------|---------|----------|------------|------------|-----------|----------|----------------|----------------|--------------|------------| +# | | Magic | header | Compress | delta | Encryption | Reserved | Firmware | The length of | The MD5 of | The CRC32 for| compressed | +# | | number | version | type | type | type | | version | compressed data| compressed data| the header | data | +# |------|---------|---------|----------|------------|------------|-----------|----------|----------------|----------------|--------------|------------| +# | Size | 4 bytes | 1 byte | 4 bits | 4 bits | 1 bytes | 1 bytes | 32 bytes | 4 bytes | 32 bytes | 4 bytes | | +# |------|---------|---------|----------|------------|------------|-----------|----------|----------------|----------------|--------------|------------| +# | Data | String | | | | | | String | little-endian | byte string | little-endian| | +# | type | ended | | | | | | ended | integer | | integer | | +# | |with ‘\0’| | | | | | with ‘\0’| | | | Binary data| +# |------|---------|---------|----------|------------|------------|-----------|----------|----------------|----------------|--------------|------------| +# | Data | “ESP” | 1 | 0/1 | 0/1 | | | | | | | | +# |------|---------|---------|----------|------------|------------|-----------|----------|----------------|----------------|--------------|------------| + +# v2 compressed data header +# Note: Encryption_type field is deprecated, the field is reserved for compatibility. +# |------|---------|---------|----------|------------|------------|-----------|----------|----------------|----------------|---------------|---------------|--------------|------------| +# | | Magic | header | Compress | delta | Encryption | Reserved | Firmware | The length of | The MD5 of | base app check| The CRC32 for | The CRC32 for| compressed | +# | | number | version | type | type | type | | version | compressed data| compressed data| data len | base app data | the header | data | +# |------|---------|---------|----------|------------|------------|-----------|----------|----------------|----------------|---------------|---------------|--------------|------------| +# | Size | 4 bytes | 1 byte | 4 bits | 4 bits | 1 bytes | 1 bytes | 32 bytes | 4 bytes | 32 bytes | 4 bytes | 4 bytes | 4 bytes | | +# |------|---------|---------|----------|------------|------------|-----------|----------|----------------|----------------|---------------|---------------|--------------|------------| +# | Data | String | | | | | | String | little-endian | byte string | little-endian | little-endian | little-endian| | +# | type | ended | | | | | | ended | integer | | integer | integer | integer | | +# | |with ‘\0’| | | | | | with ‘\0’| | | | | | Binary data| +# |------|---------|---------|----------|------------|------------|-----------|----------|----------------|----------------|---------------|---------------|--------------|------------| +# | Data | “ESP” | 1 | 0/1 | 0/1 | | | | | | | | | | +# |------|---------|---------|----------|------------|------------|-----------|----------|----------------|----------------|---------------|---------------|--------------|------------| + +# v3 compressed data header: +# |------|---------|---------|----------|------------|-----------|----------------|----------------|--------------|------------| +# | | Magic | header | Compress | Reserved | Reserved | The length of | The MD5 of | The CRC32 for| compressed | +# | | number | version | type | | | compressed data| compressed data| the header | data | +# |------|---------|---------|----------|------------|-----------|----------------|----------------|--------------|------------| +# | Size | 4 bytes | 1 byte | 4 bits | 4 bits | 8 bytes | 4 bytes | 16 bytes | 4 bytes | | +# |------|---------|---------|----------|------------|-----------|----------------|----------------|--------------|------------| +# | Data | String | integer | | | | little-endian | byte string | little-endian| | +# | type | ended | | | | | integer | | integer | | +# | |with ‘\0’| | | | | | | | Binary data| +# |------|---------|---------|----------|------------|-----------|----------------|----------------|--------------|------------| +# | Data | “ESP” | 3 | 0/1 | | | | | | | +# |------|---------|---------|----------|------------|-----------|----------------|----------------|--------------|------------| + +def xz_compress(store_directory, in_file): + compressed_file = ''.join([in_file,'.xz']) + if(os.path.exists(compressed_file)): + os.remove(compressed_file) + + xz_compressor_filter = [ + {"id": lzma.FILTER_LZMA2, "preset": 6, "dict_size": 64*1024}, + ] + with open(in_file, 'rb') as src_f: + data = src_f.read() + with lzma.open(compressed_file, "wb", format=lzma.FORMAT_XZ, check=lzma.CHECK_CRC32, filters=xz_compressor_filter) as f: + f.write(data) + f.close() + + if not os.path.exists(os.path.join(store_directory, os.path.split(compressed_file)[1])): + shutil.copy(compressed_file, store_directory) + print('copy xz file done') + +def secure_boot_sign(sign_key, in_file, out_file): + ret = subprocess.call('espsecure.py sign_data --version 2 --keyfile {} --output {} {}'.format(sign_key, out_file, in_file), shell = True) + if ret: + raise Exception('sign failed') + +def get_app_name(): + with open('flasher_args.json') as f: + try: + flasher_args = json.load(f) + return flasher_args['app']['file'] + except Exception as e: + print(e) + + return '' + +def get_script_version(): + return SCRIPT_VERSION + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('-hv', '--header_ver', nargs='?', choices = ['v1', 'v2', 'v3'], + default='v3', help='the version of the packed file header [default:v3]') + parser.add_argument('-c', '--compress_type', nargs= '?', choices = ['none', 'xz'], + default='xz', help='compressed type [default:xz]') + parser.add_argument('-i', '--in_file', nargs = '?', + default='', help='the new app firmware') + parser.add_argument('--sign_key', nargs = '?', + default='', help='the sign key used for secure boot') + parser.add_argument('-fv', '--fw_ver', nargs='?', + default='', help='the version of the compressed data(this field is deprecated in v3)') + parser.add_argument('--add_app_header', action="store_true", help='add app header to use native esp_ota_* & esp_https_ota_* APIs') + parser.add_argument('-v', '--version', action='version', version=get_script_version(), help='the version of the script') + + args = parser.parse_args() + + compress_type = args.compress_type + firmware_ver = args.fw_ver + src_file = args.in_file + sign_key = args.sign_key + header_ver = args.header_ver + add_app_header = args.add_app_header + + if src_file == '': + origin_app_name = get_app_name() + if(origin_app_name == ''): + print('get origin app name fail') + return + + if os.path.exists(origin_app_name): + src_file = origin_app_name + else: + print('origin app.bin not found') + return + + print('src file is: {}'.format(src_file)) + + # rebuild the cpmpressed_app directroy + cpmoressed_app_directory = 'custom_ota_binaries' + if os.path.exists(cpmoressed_app_directory): + shutil.rmtree(cpmoressed_app_directory) + + os.mkdir(cpmoressed_app_directory) + print('The compressed file will store in {}'.format(cpmoressed_app_directory)) + + #step1: compress + if compress_type == 'xz': + xz_compress(cpmoressed_app_directory, os.path.abspath(src_file)) + + origin_app_name = os.path.split(src_file)[1] + + compressed_file_name = ''.join([origin_app_name, '.xz']) + compressed_file = os.path.join(cpmoressed_app_directory, compressed_file_name) + else: + compressed_file = ''.join(src_file) + + print('compressed file is: {}'.format(compressed_file)) + + #step2: packet the compressed image header + with open(src_file, 'rb') as s_f: + src_image_header = bytearray(s_f.read(ORIGIN_APP_IMAGE_HEADER_LEN)) + src_image_header[1] = 0x00 + + packed_file = ''.join([compressed_file,'.packed']) + with open(compressed_file, 'rb') as src_f: + data = src_f.read() + f_len = src_f.tell() + # magic number + bin_data = struct.pack('4s', b'ESP') + # header version + bin_data += struct.pack('B', header_version[header_ver]) + # Compress type + bin_data += struct.pack('B', binary_compress_type[compress_type]) + print('compressed type: {}'.format(binary_compress_type[compress_type])) + # in header v1/v2, there is a field "Encryption type", this field has been deprecated in v3 + if (header_version[header_ver] < 3): + bin_data += struct.pack('B', 0) + # Reserved + bin_data += struct.pack('?', 0) + # Firmware version + bin_data += struct.pack('32s', firmware_ver.encode()) + else: + # Reserved + bin_data += struct.pack('10s', b'0') + # The length of the compressed data + bin_data += struct.pack(' OPT_MIN_LEN and l[0] != '#': + mo = re.match( r'(.*)=(.*)', l, re.M|re.I) + if mo: + config[mo.group(1)]=mo.group(2).replace('"', '') + self.config = config + + def index(self, i): + return self.config[i] + + def check(self, options): + options = options.replace(' ', '') + if '&&' in options: + for i in options.split('&&'): + if i[0] == '!': + i = i[1:] + if i in self.config: + return False + else: + if i not in self.config: + return False + else: + i = options + if i[0] == '!': + i = i[1:] + if i in self.config: + return False + else: + if i not in self.config: + return False + return True + +class object_c: + def read_dump_info(self, pathes): + new_env = os.environ.copy() + new_env['LC_ALL'] = 'C' + dumps = list() + print('pathes:', pathes) + for path in pathes: + try: + dump = StringIO(subprocess.check_output([espidf_objdump, '-t', path], env=new_env).decode()) + dumps.append(dump.readlines()) + except subprocess.CalledProcessError as e: + raise RuntimeError('cmd:%s result:%s'%(e.cmd, e.returncode)) + return dumps + + def get_func_section(self, dumps, func): + for dump in dumps: + for l in dump: + if ' %s'%(func) in l and '*UND*' not in l: + m = re.match(r'(\S*)\s*([glw])\s*([F|O])\s*(\S*)\s*(\S*)\s*(\S*)\s*', l, re.M|re.I) + if m and m[6] == func: + return m[4].replace('.text.', '') + if espidf_missing_function_info: + print('%s failed to find section'%(func)) + return None + else: + raise RuntimeError('%s failed to find section'%(func)) + + def __init__(self, name, pathes, libray): + self.name = name + self.libray = libray + self.funcs = dict() + self.pathes = pathes + self.dumps = self.read_dump_info(pathes) + + def append(self, func): + section = self.get_func_section(self.dumps, func) + if section != None: + self.funcs[func] = section + + def functions(self): + nlist = list() + for i in self.funcs: + nlist.append(i) + return nlist + + def sections(self): + nlist = list() + for i in self.funcs: + nlist.append(self.funcs[i]) + return nlist + +class library_c: + def __init__(self, name, path): + self.name = name + self.path = path + self.objs = dict() + + def append(self, obj, path, func): + if obj not in self.objs: + self.objs[obj] = object_c(obj, path, self.name) + self.objs[obj].append(func) + +class libraries_c: + def __init__(self): + self.libs = dict() + + def append(self, lib, lib_path, obj, obj_path, func): + if lib not in self.libs: + self.libs[lib] = library_c(lib, lib_path) + self.libs[lib].append(obj, obj_path, func) + + def dump(self): + for libname in self.libs: + lib = self.libs[libname] + for objname in lib.objs: + obj = lib.objs[objname] + print('%s, %s, %s, %s'%(libname, objname, obj.path, obj.funcs)) + +class paths_c: + def __init__(self): + self.paths = dict() + + def append(self, lib, obj, path): + if '$IDF_PATH' in path: + path = path.replace('$IDF_PATH', os.environ['IDF_PATH']) + + if lib not in self.paths: + self.paths[lib] = dict() + if obj not in self.paths[lib]: + self.paths[lib][obj] = list() + self.paths[lib][obj].append(path) + + def index(self, lib, obj): + if lib not in self.paths: + return None + if '*' in self.paths[lib]: + obj = '*' + return self.paths[lib][obj] + +def generator(library_file, object_file, function_file, sdkconfig_file, missing_function_info, objdump='riscv32-esp-elf-objdump'): + global espidf_objdump, espidf_missing_function_info + espidf_objdump = objdump + espidf_missing_function_info = missing_function_info + + sdkconfig = sdkconfig_c(sdkconfig_file) + + lib_paths = paths_c() + for p in csv.DictReader(open(library_file, 'r')): + lib_paths.append(p['library'], '*', p['path']) + + obj_paths = paths_c() + for p in csv.DictReader(open(object_file, 'r')): + obj_paths.append(p['library'], p['object'], p['path']) + + libraries = libraries_c() + for d in csv.DictReader(open(function_file, 'r')): + if d['option'] and sdkconfig.check(d['option']) == False: + print('skip %s(%s)'%(d['function'], d['option'])) + continue + lib_path = lib_paths.index(d['library'], '*') + obj_path = obj_paths.index(d['library'], d['object']) + if not obj_path: + obj_path = lib_path + libraries.append(d['library'], lib_path[0], d['object'], obj_path, d['function']) + return libraries + +def main(): + argparser = argparse.ArgumentParser(description='Libraries management') + + argparser.add_argument( + '--library', '-l', + help='Library description file', + type=str) + + argparser.add_argument( + '--object', '-b', + help='Object description file', + type=str) + + argparser.add_argument( + '--function', '-f', + help='Function description file', + type=str) + + argparser.add_argument( + '--sdkconfig', '-s', + help='sdkconfig file', + type=str) + + args = argparser.parse_args() + + libraries = generator(args.library, args.object, args.function, args.sdkconfig) + # libraries.dump() + +if __name__ == '__main__': + main() diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/scripts/relinker/examples/esp32c2/function.csv b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/scripts/relinker/examples/esp32c2/function.csv new file mode 100644 index 000000000..73c089a86 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/scripts/relinker/examples/esp32c2/function.csv @@ -0,0 +1,365 @@ +library,object,function,option +libble_app.a,ble_hw.c.o,r_ble_hw_resolv_list_get_cur_entry, +libble_app.a,ble_ll_adv.c.o,r_ble_ll_adv_set_sched, +libble_app.a,ble_ll_adv.c.o,r_ble_ll_adv_sync_pdu_make, +libble_app.a,ble_ll_adv.c.o,r_ble_ll_adv_sync_calculate, +libble_app.a,ble_ll_conn.c.o,r_ble_ll_conn_is_dev_connected, +libble_app.a,ble_ll_ctrl.c.o,r_ble_ll_ctrl_tx_done, +libble_app.a,ble_lll_adv.c.o,r_ble_lll_adv_aux_scannable_pdu_payload_len, +libble_app.a,ble_lll_adv.c.o,r_ble_lll_adv_halt, +libble_app.a,ble_lll_adv.c.o,r_ble_lll_adv_periodic_schedule_next, +libble_app.a,ble_lll_conn.c.o,r_ble_lll_conn_cth_flow_free_credit, +libble_app.a,ble_lll_conn.c.o,r_ble_lll_conn_update_encryption, +libble_app.a,ble_lll_conn.c.o,r_ble_lll_conn_set_slave_flow_control, +libble_app.a,ble_lll_conn.c.o,r_ble_lll_init_rx_pkt_isr, +libble_app.a,ble_lll_conn.c.o,r_ble_lll_conn_get_rx_mbuf, +libble_app.a,ble_lll_rfmgmt.c.o,r_ble_lll_rfmgmt_enable, +libble_app.a,ble_lll_rfmgmt.c.o,r_ble_lll_rfmgmt_timer_reschedule, +libble_app.a,ble_lll_rfmgmt.c.o,r_ble_lll_rfmgmt_timer_exp, +libble_app.a,ble_lll_scan.c.o,r_ble_lll_scan_targeta_is_matched, +libble_app.a,ble_lll_scan.c.o,r_ble_lll_scan_rx_isr_on_legacy, +libble_app.a,ble_lll_scan.c.o,r_ble_lll_scan_rx_isr_on_aux, +libble_app.a,ble_lll_scan.c.o,r_ble_lll_scan_process_rsp_in_isr, +libble_app.a,ble_lll_scan.c.o,r_ble_lll_scan_rx_pkt_isr, +libble_app.a,ble_lll_sched.c.o,r_ble_lll_sched_execute_check, +libble_app.a,ble_lll_sync.c.o,r_ble_lll_sync_event_start_cb, +libble_app.a,ble_phy.c.o,r_ble_phy_set_rxhdr, +libble_app.a,ble_phy.c.o,r_ble_phy_update_conn_sequence, +libble_app.a,ble_phy.c.o,r_ble_phy_set_sequence_mode, +libble_app.a,ble_phy.c.o,r_ble_phy_txpower_round, +libble_app.a,os_mempool.c.obj,r_os_memblock_put, +libbootloader_support.a,bootloader_flash.c.obj,bootloader_read_flash_id, +libbootloader_support.a,flash_encrypt.c.obj,esp_flash_encryption_enabled, +libbt.a,bt_osi_mem.c.obj,bt_osi_mem_calloc,CONFIG_BT_ENABLED +libbt.a,bt_osi_mem.c.obj,bt_osi_mem_malloc,CONFIG_BT_ENABLED +libbt.a,bt_osi_mem.c.obj,bt_osi_mem_malloc_internal,CONFIG_BT_ENABLED +libbt.a,bt_osi_mem.c.obj,bt_osi_mem_free,CONFIG_BT_ENABLED +libbt.a,bt.c.obj,esp_reset_rpa_moudle,CONFIG_BT_ENABLED +libbt.a,bt.c.obj,osi_assert_wrapper,CONFIG_BT_ENABLED +libbt.a,bt.c.obj,osi_random_wrapper,CONFIG_BT_ENABLED +libbt.a,nimble_port.c.obj,nimble_port_run,CONFIG_BT_NIMBLE_ENABLED +libbt.a,nimble_port.c.obj,nimble_port_get_dflt_eventq,CONFIG_BT_NIMBLE_ENABLED +libbt.a,npl_os_freertos.c.obj,os_callout_timer_cb,CONFIG_BT_ENABLED && !CONFIG_BT_NIMBLE_USE_ESP_TIMER +libbt.a,npl_os_freertos.c.obj,npl_freertos_event_run,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_callout_stop,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_time_get,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_callout_reset,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_callout_is_active,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_callout_get_ticks,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_callout_remaining_ticks,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_time_delay,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_eventq_is_empty,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_mutex_pend,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_mutex_release,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_sem_init,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_sem_pend,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_sem_release,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_callout_init,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_callout_deinit,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_event_is_queued,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_event_get_arg,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_time_ms_to_ticks32,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_time_ticks_to_ms32,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_hw_is_in_critical,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_get_time_forever,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_os_started,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_get_current_task_id,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_event_reset,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_callout_mem_reset,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_event_init,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_sem_get_count,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_eventq_remove,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_hw_exit_critical,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_mutex_init,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_hw_enter_critical,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_eventq_put,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_eventq_get,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_sem_deinit,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_mutex_deinit,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_eventq_deinit,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_eventq_init,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_event_deinit,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_time_ticks_to_ms,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_time_ms_to_ticks,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_callout_set_arg,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_event_set_arg,CONFIG_BT_ENABLED +libbt.a,npl_os_freertos.c.obj,npl_freertos_eventq_put,CONFIG_BT_ENABLED +libdriver.a,gpio.c.obj,gpio_intr_service, +libesp_app_format.a,esp_app_desc.c.obj,esp_app_get_elf_sha256, +libesp_hw_support.a,cpu.c.obj,esp_cpu_wait_for_intr, +libesp_hw_support.a,cpu.c.obj,esp_cpu_reset, +libesp_hw_support.a,esp_clk.c.obj,esp_clk_cpu_freq, +libesp_hw_support.a,esp_clk.c.obj,esp_clk_apb_freq, +libesp_hw_support.a,esp_clk.c.obj,esp_clk_xtal_freq, +libesp_hw_support.a,esp_memory_utils.c.obj,esp_ptr_byte_accessible, +libesp_hw_support.a,hw_random.c.obj,esp_random, +libesp_hw_support.a,intr_alloc.c.obj,shared_intr_isr, +libesp_hw_support.a,intr_alloc.c.obj,esp_intr_noniram_disable, +libesp_hw_support.a,intr_alloc.c.obj,esp_intr_noniram_enable, +libesp_hw_support.a,intr_alloc.c.obj,esp_intr_enable, +libesp_hw_support.a,intr_alloc.c.obj,esp_intr_disable, +libesp_hw_support.a,periph_ctrl.c.obj,wifi_bt_common_module_enable, +libesp_hw_support.a,periph_ctrl.c.obj,wifi_bt_common_module_disable, +libesp_hw_support.a,regi2c_ctrl.c.obj,regi2c_ctrl_read_reg, +libesp_hw_support.a,regi2c_ctrl.c.obj,regi2c_ctrl_read_reg_mask, +libesp_hw_support.a,regi2c_ctrl.c.obj,regi2c_ctrl_write_reg, +libesp_hw_support.a,regi2c_ctrl.c.obj,regi2c_ctrl_write_reg_mask, +libesp_hw_support.a,regi2c_ctrl.c.obj,regi2c_enter_critical, +libesp_hw_support.a,regi2c_ctrl.c.obj,regi2c_exit_critical, +libesp_hw_support.a,regi2c_ctrl.c.obj,regi2c_analog_cali_reg_read, +libesp_hw_support.a,regi2c_ctrl.c.obj,regi2c_analog_cali_reg_write, +libesp_hw_support.a,rtc_clk.c.obj,rtc_clk_32k_enable_external, +libesp_hw_support.a,rtc_clk.c.obj,rtc_clk_fast_src_set, +libesp_hw_support.a,rtc_clk.c.obj,rtc_clk_slow_freq_get_hz, +libesp_hw_support.a,rtc_clk.c.obj,rtc_clk_slow_src_get, +libesp_hw_support.a,rtc_clk.c.obj,rtc_clk_slow_src_set, +libesp_hw_support.a,rtc_clk.c.obj,rtc_dig_clk8m_disable, +libesp_hw_support.a,rtc_clk.c.obj,rtc_clk_cpu_freq_set_config_fast, +libesp_hw_support.a,rtc_clk.c.obj,rtc_clk_8m_enable, +libesp_hw_support.a,rtc_clk.c.obj,rtc_clk_8md256_enabled, +libesp_hw_support.a,rtc_clk.c.obj,rtc_clk_bbpll_configure, +libesp_hw_support.a,rtc_clk.c.obj,rtc_clk_bbpll_enable, +libesp_hw_support.a,rtc_clk.c.obj,rtc_clk_cpu_freq_get_config, +libesp_hw_support.a,rtc_clk.c.obj,rtc_clk_cpu_freq_mhz_to_config, +libesp_hw_support.a,rtc_clk.c.obj,rtc_clk_cpu_freq_set_config, +libesp_hw_support.a,rtc_clk.c.obj,rtc_clk_cpu_freq_to_8m, +libesp_hw_support.a,rtc_clk.c.obj,rtc_clk_cpu_freq_to_pll_mhz, +libesp_hw_support.a,rtc_clk.c.obj,rtc_clk_cpu_freq_set_xtal, +libesp_hw_support.a,rtc_clk.c.obj,rtc_clk_xtal_freq_get, +libesp_hw_support.a,rtc_clk.c.obj,rtc_clk_cpu_freq_to_xtal, +libesp_hw_support.a,rtc_clk.c.obj,rtc_clk_bbpll_disable, +libesp_hw_support.a,rtc_clk.c.obj,rtc_clk_apb_freq_update, +libesp_hw_support.a,rtc_clk.c.obj,clk_ll_rtc_slow_get_src,FALSE +libesp_hw_support.a,rtc_init.c.obj,rtc_vddsdio_set_config, +libesp_hw_support.a,rtc_module.c.obj,rtc_isr, +libesp_hw_support.a,rtc_module.c.obj,rtc_isr_noniram_disable, +libesp_hw_support.a,rtc_module.c.obj,rtc_isr_noniram_enable, +libesp_hw_support.a,rtc_sleep.c.obj,rtc_sleep_pu, +libesp_hw_support.a,rtc_sleep.c.obj,rtc_sleep_finish, +libesp_hw_support.a,rtc_sleep.c.obj,rtc_sleep_get_default_config, +libesp_hw_support.a,rtc_sleep.c.obj,rtc_sleep_init, +libesp_hw_support.a,rtc_sleep.c.obj,rtc_sleep_low_init, +libesp_hw_support.a,rtc_sleep.c.obj,rtc_sleep_start, +libesp_hw_support.a,rtc_time.c.obj,rtc_clk_cal, +libesp_hw_support.a,rtc_time.c.obj,rtc_clk_cal_internal, +libesp_hw_support.a,rtc_time.c.obj,rtc_time_get, +libesp_hw_support.a,rtc_time.c.obj,rtc_time_us_to_slowclk, +libesp_hw_support.a,rtc_time.c.obj,rtc_time_slowclk_to_us, +libesp_hw_support.a,sleep_modes.c.obj,periph_ll_periph_enabled, +libesp_hw_support.a,sleep_modes.c.obj,flush_uarts, +libesp_hw_support.a,sleep_modes.c.obj,suspend_uarts, +libesp_hw_support.a,sleep_modes.c.obj,resume_uarts, +libesp_hw_support.a,sleep_modes.c.obj,esp_sleep_start, +libesp_hw_support.a,sleep_modes.c.obj,esp_deep_sleep_start, +libesp_hw_support.a,sleep_modes.c.obj,esp_light_sleep_inner, +libesp_phy.a,phy_init.c.obj,esp_phy_common_clock_enable, +libesp_phy.a,phy_init.c.obj,esp_phy_common_clock_disable, +libesp_phy.a,phy_init.c.obj,esp_wifi_bt_power_domain_on, +libesp_phy.a,phy_override.c.obj,phy_i2c_enter_critical, +libesp_phy.a,phy_override.c.obj,phy_i2c_exit_critical, +libesp_pm.a,pm_locks.c.obj,esp_pm_lock_acquire, +libesp_pm.a,pm_locks.c.obj,esp_pm_lock_release, +libesp_pm.a,pm_impl.c.obj,get_lowest_allowed_mode, +libesp_pm.a,pm_impl.c.obj,esp_pm_impl_switch_mode, +libesp_pm.a,pm_impl.c.obj,on_freq_update, +libesp_pm.a,pm_impl.c.obj,vApplicationSleep,CONFIG_FREERTOS_USE_TICKLESS_IDLE +libesp_pm.a,pm_impl.c.obj,do_switch, +libesp_ringbuf.a,ringbuf.c.obj,prvCheckItemAvail, +libesp_ringbuf.a,ringbuf.c.obj,prvGetFreeSize, +libesp_ringbuf.a,ringbuf.c.obj,prvReceiveGenericFromISR, +libesp_ringbuf.a,ringbuf.c.obj,xRingbufferGetMaxItemSize, +libesp_rom.a,esp_rom_systimer.c.obj,systimer_hal_init, +libesp_rom.a,esp_rom_systimer.c.obj,systimer_hal_set_alarm_period, +libesp_rom.a,esp_rom_systimer.c.obj,systimer_hal_set_alarm_target, +libesp_rom.a,esp_rom_systimer.c.obj,systimer_hal_set_tick_rate_ops, +libesp_rom.a,esp_rom_uart.c.obj,esp_rom_uart_set_clock_baudrate, +libesp_system.a,brownout.c.obj,rtc_brownout_isr_handler, +libesp_system.a,cache_err_int.c.obj,esp_cache_err_get_cpuid, +libesp_system.a,cpu_start.c.obj,call_start_cpu0, +libesp_system.a,crosscore_int.c.obj,esp_crosscore_int_send, +libesp_system.a,crosscore_int.c.obj,esp_crosscore_int_send_yield, +libesp_system.a,esp_system.c.obj,esp_restart, +libesp_system.a,esp_system.c.obj,esp_system_abort, +libesp_system.a,reset_reason.c.obj,esp_reset_reason_set_hint, +libesp_system.a,reset_reason.c.obj,esp_reset_reason_get_hint, +libesp_system.a,ubsan.c.obj,__ubsan_include, +libesp_timer.a,esp_timer.c.obj,esp_timer_get_next_alarm_for_wake_up, +libesp_timer.a,esp_timer.c.obj,timer_list_unlock,!CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD +libesp_timer.a,esp_timer.c.obj,timer_list_lock,!CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD +libesp_timer.a,esp_timer.c.obj,timer_armed, +libesp_timer.a,esp_timer.c.obj,timer_remove, +libesp_timer.a,esp_timer.c.obj,timer_insert,!CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD +libesp_timer.a,esp_timer.c.obj,esp_timer_start_once, +libesp_timer.a,esp_timer.c.obj,esp_timer_start_periodic, +libesp_timer.a,esp_timer.c.obj,esp_timer_stop, +libesp_timer.a,esp_timer.c.obj,esp_timer_get_expiry_time, +libesp_timer.a,esp_timer_impl_systimer.c.obj,esp_timer_impl_get_time,!CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD +libesp_timer.a,esp_timer_impl_systimer.c.obj,esp_timer_impl_set_alarm_id,!CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD +libesp_timer.a,esp_timer_impl_systimer.c.obj,esp_timer_impl_update_apb_freq, +libesp_timer.a,esp_timer_impl_systimer.c.obj,esp_timer_impl_get_min_period_us, +libesp_timer.a,ets_timer_legacy.c.obj,timer_initialized, +libesp_timer.a,ets_timer_legacy.c.obj,ets_timer_arm_us, +libesp_timer.a,ets_timer_legacy.c.obj,ets_timer_arm, +libesp_timer.a,ets_timer_legacy.c.obj,ets_timer_disarm, +libesp_timer.a,system_time.c.obj,esp_system_get_time, +libesp_wifi.a,esp_adapter.c.obj,semphr_take_from_isr_wrapper, +libesp_wifi.a,esp_adapter.c.obj,wifi_realloc, +libesp_wifi.a,esp_adapter.c.obj,coex_event_duration_get_wrapper, +libesp_wifi.a,esp_adapter.c.obj,coex_schm_interval_set_wrapper, +libesp_wifi.a,esp_adapter.c.obj,esp_empty_wrapper, +libesp_wifi.a,esp_adapter.c.obj,wifi_calloc, +libesp_wifi.a,esp_adapter.c.obj,wifi_zalloc_wrapper, +libesp_wifi.a,esp_adapter.c.obj,env_is_chip_wrapper, +libesp_wifi.a,esp_adapter.c.obj,is_from_isr_wrapper, +libesp_wifi.a,esp_adapter.c.obj,semphr_give_from_isr_wrapper, +libesp_wifi.a,esp_adapter.c.obj,mutex_lock_wrapper, +libesp_wifi.a,esp_adapter.c.obj,mutex_unlock_wrapper, +libesp_wifi.a,esp_adapter.c.obj,task_ms_to_tick_wrapper, +libesp_wifi.a,esp_adapter.c.obj,wifi_apb80m_request_wrapper, +libesp_wifi.a,esp_adapter.c.obj,wifi_apb80m_release_wrapper, +libesp_wifi.a,esp_adapter.c.obj,timer_arm_wrapper, +libesp_wifi.a,esp_adapter.c.obj,wifi_malloc, +libesp_wifi.a,esp_adapter.c.obj,timer_disarm_wrapper, +libesp_wifi.a,esp_adapter.c.obj,timer_arm_us_wrapper, +libesp_wifi.a,esp_adapter.c.obj,wifi_rtc_enable_iso_wrapper, +libesp_wifi.a,esp_adapter.c.obj,wifi_rtc_disable_iso_wrapper, +libesp_wifi.a,esp_adapter.c.obj,malloc_internal_wrapper, +libesp_wifi.a,esp_adapter.c.obj,realloc_internal_wrapper, +libesp_wifi.a,esp_adapter.c.obj,calloc_internal_wrapper, +libesp_wifi.a,esp_adapter.c.obj,zalloc_internal_wrapper, +libesp_wifi.a,esp_adapter.c.obj,coex_status_get_wrapper, +libesp_wifi.a,esp_adapter.c.obj,coex_wifi_release_wrapper, +libfreertos.a,list.c.obj,uxListRemove,FALSE +libfreertos.a,list.c.obj,vListInitialise,CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH +libfreertos.a,list.c.obj,vListInitialiseItem,CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH +libfreertos.a,list.c.obj,vListInsert,CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH +libfreertos.a,list.c.obj,vListInsertEnd,FALSE +libfreertos.a,port.c.obj,vApplicationStackOverflowHook,FALSE +libfreertos.a,port.c.obj,vPortYieldOtherCore,FALSE +libfreertos.a,port.c.obj,vPortYield, +libfreertos.a,port_common.c.obj,xPortcheckValidStackMem, +libfreertos.a,port_common.c.obj,vApplicationGetTimerTaskMemory, +libfreertos.a,port_common.c.obj,esp_startup_start_app_common, +libfreertos.a,port_common.c.obj,xPortCheckValidTCBMem, +libfreertos.a,port_common.c.obj,vApplicationGetIdleTaskMemory, +libfreertos.a,port_systick.c.obj,vPortSetupTimer, +libfreertos.a,port_systick.c.obj,xPortSysTickHandler,FALSE +libfreertos.a,queue.c.obj,prvCopyDataFromQueue, +libfreertos.a,queue.c.obj,prvGetDisinheritPriorityAfterTimeout, +libfreertos.a,queue.c.obj,prvIsQueueEmpty, +libfreertos.a,queue.c.obj,prvNotifyQueueSetContainer, +libfreertos.a,queue.c.obj,xQueueReceive, +libfreertos.a,queue.c.obj,prvUnlockQueue, +libfreertos.a,queue.c.obj,xQueueSemaphoreTake, +libfreertos.a,queue.c.obj,xQueueReceiveFromISR, +libfreertos.a,queue.c.obj,uxQueueMessagesWaitingFromISR, +libfreertos.a,queue.c.obj,xQueueIsQueueEmptyFromISR, +libfreertos.a,queue.c.obj,xQueueGiveFromISR, +libfreertos.a,tasks.c.obj,__getreent,CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH +libfreertos.a,tasks.c.obj,pcTaskGetName,CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH +libfreertos.a,tasks.c.obj,prvAddCurrentTaskToDelayedList,CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH +libfreertos.a,tasks.c.obj,prvDeleteTLS,CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH +libfreertos.a,tasks.c.obj,pvTaskIncrementMutexHeldCount,CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH +libfreertos.a,tasks.c.obj,taskSelectHighestPriorityTaskSMP,FALSE +libfreertos.a,tasks.c.obj,taskYIELD_OTHER_CORE,FALSE +libfreertos.a,tasks.c.obj,vTaskGetSnapshot,CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH +libfreertos.a,tasks.c.obj,vTaskInternalSetTimeOutState,CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH +libfreertos.a,tasks.c.obj,vTaskPlaceOnEventList,CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH +libfreertos.a,tasks.c.obj,vTaskPlaceOnEventListRestricted,CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH +libfreertos.a,tasks.c.obj,vTaskPlaceOnUnorderedEventList,CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH +libfreertos.a,tasks.c.obj,vTaskPriorityDisinheritAfterTimeout,CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH +libfreertos.a,tasks.c.obj,vTaskReleaseEventListLock,CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH +libfreertos.a,tasks.c.obj,vTaskTakeEventListLock,CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH +libfreertos.a,tasks.c.obj,xTaskCheckForTimeOut,CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH +libfreertos.a,tasks.c.obj,xTaskGetCurrentTaskHandle,CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH +libfreertos.a,tasks.c.obj,xTaskGetSchedulerState,CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH +libfreertos.a,tasks.c.obj,xTaskGetTickCount,CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH +libfreertos.a,tasks.c.obj,xTaskPriorityDisinherit,FALSE +libfreertos.a,tasks.c.obj,xTaskPriorityInherit,CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH +libfreertos.a,tasks.c.obj,prvGetExpectedIdleTime,FALSE +libfreertos.a,tasks.c.obj,vTaskStepTick,FALSE +libhal.a,brownout_hal.c.obj,brownout_hal_intr_clear, +libhal.a,efuse_hal.c.obj,efuse_hal_chip_revision, +libhal.a,efuse_hal.c.obj,efuse_hal_get_major_chip_version, +libhal.a,efuse_hal.c.obj,efuse_hal_get_minor_chip_version, +libheap.a,heap_caps.c.obj,dram_alloc_to_iram_addr, +libheap.a,heap_caps.c.obj,heap_caps_free, +libheap.a,heap_caps.c.obj,heap_caps_realloc_base, +libheap.a,heap_caps.c.obj,heap_caps_realloc, +libheap.a,heap_caps.c.obj,heap_caps_calloc_base, +libheap.a,heap_caps.c.obj,heap_caps_calloc, +libheap.a,heap_caps.c.obj,heap_caps_malloc_base, +libheap.a,heap_caps.c.obj,heap_caps_malloc, +libheap.a,heap_caps.c.obj,heap_caps_malloc_default, +libheap.a,heap_caps.c.obj,heap_caps_realloc_default, +libheap.a,heap_caps.c.obj,find_containing_heap, +libheap.a,multi_heap.c.obj,_multi_heap_lock, +libheap.a,multi_heap.c.obj,multi_heap_in_rom_init, +liblog.a,log_freertos.c.obj,esp_log_timestamp, +liblog.a,log_freertos.c.obj,esp_log_impl_lock, +liblog.a,log_freertos.c.obj,esp_log_impl_unlock, +liblog.a,log_freertos.c.obj,esp_log_impl_lock_timeout, +liblog.a,log_freertos.c.obj,esp_log_early_timestamp, +liblog.a,log.c.obj,esp_log_write, +libmbedcrypto.a,esp_mem.c.obj,esp_mbedtls_mem_calloc,!CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC +libmbedcrypto.a,esp_mem.c.obj,esp_mbedtls_mem_free,!CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC +libnewlib.a,assert.c.obj,__assert_func, +libnewlib.a,assert.c.obj,newlib_include_assert_impl, +libnewlib.a,heap.c.obj,_calloc_r, +libnewlib.a,heap.c.obj,_free_r, +libnewlib.a,heap.c.obj,_malloc_r, +libnewlib.a,heap.c.obj,_realloc_r, +libnewlib.a,heap.c.obj,calloc, +libnewlib.a,heap.c.obj,cfree, +libnewlib.a,heap.c.obj,free, +libnewlib.a,heap.c.obj,malloc, +libnewlib.a,heap.c.obj,newlib_include_heap_impl, +libnewlib.a,heap.c.obj,realloc, +libnewlib.a,locks.c.obj,_lock_try_acquire_recursive, +libnewlib.a,locks.c.obj,lock_release_generic, +libnewlib.a,locks.c.obj,_lock_release, +libnewlib.a,locks.c.obj,_lock_release_recursive, +libnewlib.a,locks.c.obj,__retarget_lock_init, +libnewlib.a,locks.c.obj,__retarget_lock_init_recursive, +libnewlib.a,locks.c.obj,__retarget_lock_close, +libnewlib.a,locks.c.obj,__retarget_lock_close_recursive, +libnewlib.a,locks.c.obj,check_lock_nonzero, +libnewlib.a,locks.c.obj,__retarget_lock_acquire, +libnewlib.a,locks.c.obj,lock_init_generic, +libnewlib.a,locks.c.obj,__retarget_lock_acquire_recursive, +libnewlib.a,locks.c.obj,__retarget_lock_try_acquire, +libnewlib.a,locks.c.obj,__retarget_lock_try_acquire_recursive, +libnewlib.a,locks.c.obj,__retarget_lock_release, +libnewlib.a,locks.c.obj,__retarget_lock_release_recursive, +libnewlib.a,locks.c.obj,_lock_close, +libnewlib.a,locks.c.obj,lock_acquire_generic, +libnewlib.a,locks.c.obj,_lock_acquire, +libnewlib.a,locks.c.obj,_lock_acquire_recursive, +libnewlib.a,locks.c.obj,_lock_try_acquire, +libnewlib.a,reent_init.c.obj,esp_reent_init, +libnewlib.a,time.c.obj,_times_r, +libnewlib.a,time.c.obj,_gettimeofday_r, +libpp.a,pp_debug.o,wifi_gpio_debug, +libpthread.a,pthread.c.obj,pthread_mutex_lock_internal, +libpthread.a,pthread.c.obj,pthread_mutex_lock, +libpthread.a,pthread.c.obj,pthread_mutex_unlock, +libriscv.a,interrupt.c.obj,intr_handler_get, +libriscv.a,interrupt.c.obj,intr_handler_set, +libriscv.a,interrupt.c.obj,intr_matrix_route, +libspi_flash.a,flash_brownout_hook.c.obj,spi_flash_needs_reset_check,FALSE +libspi_flash.a,flash_brownout_hook.c.obj,spi_flash_set_erasing_flag,FALSE +libspi_flash.a,flash_ops.c.obj,spi_flash_guard_set,CONFIG_SPI_FLASH_ROM_IMPL +libspi_flash.a,flash_ops.c.obj,spi_flash_malloc_internal,CONFIG_SPI_FLASH_ROM_IMPL +libspi_flash.a,flash_ops.c.obj,spi_flash_rom_impl_init,CONFIG_SPI_FLASH_ROM_IMPL +libspi_flash.a,flash_ops.c.obj,esp_mspi_pin_init,CONFIG_SPI_FLASH_ROM_IMPL +libspi_flash.a,flash_ops.c.obj,spi_flash_init_chip_state,CONFIG_SPI_FLASH_ROM_IMPL +libspi_flash.a,spi_flash_os_func_app.c.obj,delay_us,CONFIG_SPI_FLASH_ROM_IMPL +libspi_flash.a,spi_flash_os_func_app.c.obj,get_buffer_malloc,CONFIG_SPI_FLASH_ROM_IMPL +libspi_flash.a,spi_flash_os_func_app.c.obj,release_buffer_malloc,CONFIG_SPI_FLASH_ROM_IMPL +libspi_flash.a,spi_flash_os_func_app.c.obj,main_flash_region_protected,CONFIG_SPI_FLASH_ROM_IMPL +libspi_flash.a,spi_flash_os_func_app.c.obj,main_flash_op_status,CONFIG_SPI_FLASH_ROM_IMPL +libspi_flash.a,spi_flash_os_func_app.c.obj,spi1_flash_os_check_yield,CONFIG_SPI_FLASH_ROM_IMPL +libspi_flash.a,spi_flash_os_func_app.c.obj,spi1_flash_os_yield,CONFIG_SPI_FLASH_ROM_IMPL +libspi_flash.a,spi_flash_os_func_noos.c.obj,start,CONFIG_SPI_FLASH_ROM_IMPL +libspi_flash.a,spi_flash_os_func_noos.c.obj,end,CONFIG_SPI_FLASH_ROM_IMPL +libspi_flash.a,spi_flash_os_func_noos.c.obj,delay_us,CONFIG_SPI_FLASH_ROM_IMPL diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/scripts/relinker/examples/esp32c2/library.csv b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/scripts/relinker/examples/esp32c2/library.csv new file mode 100644 index 000000000..3fd9e4a2b --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/scripts/relinker/examples/esp32c2/library.csv @@ -0,0 +1,24 @@ +library,path +libble_app.a,$IDF_PATH/components/bt/controller/lib_esp32c2/esp32c2-bt-lib/libble_app.a +libpp.a,$IDF_PATH/components/esp_wifi/lib/esp32c2/libpp.a +libbootloader_support.a,./esp-idf/bootloader_support/libbootloader_support.a +libbt.a,./esp-idf/bt/libbt.a +libdriver.a,./esp-idf/driver/libdriver.a +libesp_app_format.a,./esp-idf/esp_app_format/libesp_app_format.a +libesp_hw_support.a,./esp-idf/esp_hw_support/libesp_hw_support.a +libesp_phy.a,./esp-idf/esp_phy/libesp_phy.a +libesp_pm.a,./esp-idf/esp_pm/libesp_pm.a +libesp_ringbuf.a,./esp-idf/esp_ringbuf/libesp_ringbuf.a +libesp_rom.a,./esp-idf/esp_rom/libesp_rom.a +libesp_system.a,./esp-idf/esp_system/libesp_system.a +libesp_timer.a,./esp-idf/esp_timer/libesp_timer.a +libesp_wifi.a,./esp-idf/esp_wifi/libesp_wifi.a +libfreertos.a,./esp-idf/freertos/libfreertos.a +libhal.a,./esp-idf/hal/libhal.a +libheap.a,./esp-idf/heap/libheap.a +liblog.a,./esp-idf/log/liblog.a +libmbedcrypto.a,./esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a +libnewlib.a,./esp-idf/newlib/libnewlib.a +libpthread.a,./esp-idf/pthread/libpthread.a +libriscv.a,./esp-idf/riscv/libriscv.a +libspi_flash.a,./esp-idf/spi_flash/libspi_flash.a diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/scripts/relinker/examples/esp32c2/object.csv b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/scripts/relinker/examples/esp32c2/object.csv new file mode 100644 index 000000000..a897d843d --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/scripts/relinker/examples/esp32c2/object.csv @@ -0,0 +1,66 @@ +library,object,path +libbootloader_support.a,bootloader_flash.c.obj,esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/bootloader_flash.c.obj +libbootloader_support.a,flash_encrypt.c.obj,esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_encrypt.c.obj +libbt.a,bt_osi_mem.c.obj,esp-idf/bt/CMakeFiles/__idf_bt.dir/porting/mem/bt_osi_mem.c.obj +libbt.a,bt.c.obj,esp-idf/bt/CMakeFiles/__idf_bt.dir/controller/esp32c2/bt.c.obj +libbt.a,npl_os_freertos.c.obj,esp-idf/bt/CMakeFiles/__idf_bt.dir/porting/npl/freertos/src/npl_os_freertos.c.obj +libbt.a,nimble_port.c.obj,esp-idf/bt/CMakeFiles/__idf_bt.dir/host/nimble/nimble/porting/nimble/src/nimble_port.c.obj +libdriver.a,gpio.c.obj,esp-idf/driver/CMakeFiles/__idf_driver.dir/gpio/gpio.c.obj +libesp_app_format.a,esp_app_desc.c.obj,esp-idf/esp_app_format/CMakeFiles/__idf_esp_app_format.dir/esp_app_desc.c.obj +libesp_hw_support.a,cpu.c.obj,esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/cpu.c.obj +libesp_hw_support.a,esp_clk.c.obj,esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/esp_clk.c.obj +libesp_hw_support.a,esp_memory_utils.c.obj,esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/esp_memory_utils.c.obj +libesp_hw_support.a,hw_random.c.obj,esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/hw_random.c.obj +libesp_hw_support.a,intr_alloc.c.obj,esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/intr_alloc.c.obj +libesp_hw_support.a,periph_ctrl.c.obj,esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/periph_ctrl.c.obj +libesp_hw_support.a,regi2c_ctrl.c.obj,esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/regi2c_ctrl.c.obj +libesp_hw_support.a,rtc_clk.c.obj,esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32c2/rtc_clk.c.obj +libesp_hw_support.a,rtc_init.c.obj,esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32c2/rtc_init.c.obj +libesp_hw_support.a,rtc_module.c.obj,esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/rtc_module.c.obj +libesp_hw_support.a,rtc_sleep.c.obj,esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32c2/rtc_sleep.c.obj +libesp_hw_support.a,rtc_time.c.obj,esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32c2/rtc_time.c.obj +libesp_hw_support.a,sleep_modes.c.obj,esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_modes.c.obj +libesp_phy.a,phy_init.c.obj,esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/src/phy_init.c.obj +libesp_phy.a,phy_override.c.obj,esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/src/phy_override.c.obj +libesp_pm.a,pm_locks.c.obj,esp-idf/esp_pm/CMakeFiles/__idf_esp_pm.dir/pm_locks.c.obj +libesp_pm.a,pm_impl.c.obj,esp-idf/esp_pm/CMakeFiles/__idf_esp_pm.dir/pm_impl.c.obj +libesp_ringbuf.a,ringbuf.c.obj,esp-idf/esp_ringbuf/CMakeFiles/__idf_esp_ringbuf.dir/ringbuf.c.obj +libesp_rom.a,esp_rom_systimer.c.obj,esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_systimer.c.obj +libesp_rom.a,esp_rom_uart.c.obj,esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_uart.c.obj +libesp_system.a,brownout.c.obj,esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/brownout.c.obj +libesp_system.a,cache_err_int.c.obj,esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32c2/cache_err_int.c.obj +libesp_system.a,cpu_start.c.obj,esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/cpu_start.c.obj +libesp_system.a,crosscore_int.c.obj,esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/crosscore_int.c.obj +libesp_system.a,esp_system.c.obj,esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/esp_system.c.obj +libesp_system.a,reset_reason.c.obj,esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32c2/reset_reason.c.obj +libesp_system.a,ubsan.c.obj,esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/ubsan.c.obj +libesp_timer.a,esp_timer.c.obj,esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/esp_timer.c.obj +libesp_timer.a,esp_timer_impl_systimer.c.obj,esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/esp_timer_impl_systimer.c.obj +libesp_timer.a,ets_timer_legacy.c.obj,esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/ets_timer_legacy.c.obj +libesp_timer.a,system_time.c.obj,esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/system_time.c.obj +libesp_wifi.a,esp_adapter.c.obj,esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/esp32c2/esp_adapter.c.obj +libfreertos.a,list.c.obj,esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/list.c.obj +libfreertos.a,port.c.obj,esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/portable/riscv/port.c.obj +libfreertos.a,port_common.c.obj,esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/portable/port_common.c.obj +libfreertos.a,port_systick.c.obj,esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/portable/port_systick.c.obj +libfreertos.a,queue.c.obj,esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/queue.c.obj +libfreertos.a,tasks.c.obj,esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/tasks.c.obj +libhal.a,brownout_hal.c.obj,esp-idf/hal/CMakeFiles/__idf_hal.dir/esp32c2/brownout_hal.c.obj +libhal.a,efuse_hal.c.obj,esp-idf/hal/CMakeFiles/__idf_hal.dir/efuse_hal.c.obj +libhal.a,efuse_hal.c.obj,esp-idf/hal/CMakeFiles/__idf_hal.dir/esp32c2/efuse_hal.c.obj +libheap.a,heap_caps.c.obj,esp-idf/heap/CMakeFiles/__idf_heap.dir/heap_caps.c.obj +libheap.a,multi_heap.c.obj,./esp-idf/heap/CMakeFiles/__idf_heap.dir/multi_heap.c.obj +liblog.a,log_freertos.c.obj,esp-idf/log/CMakeFiles/__idf_log.dir/log_freertos.c.obj +liblog.a,log.c.obj,esp-idf/log/CMakeFiles/__idf_log.dir/log.c.obj +libmbedcrypto.a,esp_mem.c.obj,esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/$IDF_PATH/components/mbedtls/port/esp_mem.c.obj +libnewlib.a,assert.c.obj,esp-idf/newlib/CMakeFiles/__idf_newlib.dir/assert.c.obj +libnewlib.a,heap.c.obj,esp-idf/newlib/CMakeFiles/__idf_newlib.dir/heap.c.obj +libnewlib.a,locks.c.obj,esp-idf/newlib/CMakeFiles/__idf_newlib.dir/locks.c.obj +libnewlib.a,reent_init.c.obj,esp-idf/newlib/CMakeFiles/__idf_newlib.dir/reent_init.c.obj +libnewlib.a,time.c.obj,esp-idf/newlib/CMakeFiles/__idf_newlib.dir/time.c.obj +libpthread.a,pthread.c.obj,esp-idf/pthread/CMakeFiles/__idf_pthread.dir/pthread.c.obj +libriscv.a,interrupt.c.obj,esp-idf/riscv/CMakeFiles/__idf_riscv.dir/interrupt.c.obj +libspi_flash.a,flash_brownout_hook.c.obj,esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/flash_brownout_hook.c.obj +libspi_flash.a,flash_ops.c.obj,esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/flash_ops.c.obj +libspi_flash.a,spi_flash_os_func_app.c.obj,esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_os_func_app.c.obj +libspi_flash.a,spi_flash_os_func_noos.c.obj,esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_os_func_noos.c.obj diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/scripts/relinker/relinker.py b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/scripts/relinker/relinker.py new file mode 100644 index 000000000..151b87738 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/scripts/relinker/relinker.py @@ -0,0 +1,311 @@ +#!/usr/bin/env python3 +# +# SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: Apache-2.0 + + +import logging +import argparse +import csv +import os +import subprocess +import sys +import re +from io import StringIO +import configuration + +sys.path.append(os.environ['IDF_PATH'] + '/tools/ldgen') +sys.path.append(os.environ['IDF_PATH'] + '/tools/ldgen/ldgen') +from entity import EntityDB + +espidf_objdump = None + +def lib_secs(lib, file, lib_path): + new_env = os.environ.copy() + new_env['LC_ALL'] = 'C' + dump = StringIO(subprocess.check_output([espidf_objdump, '-h', lib_path], env=new_env).decode()) + dump.name = lib + + sections_infos = EntityDB() + sections_infos.add_sections_info(dump) + + secs = sections_infos.get_sections(lib, file.split('.')[0] + '.c') + if len(secs) == 0: + secs = sections_infos.get_sections(lib, file.split('.')[0]) + if len(secs) == 0: + raise ValueError('Failed to get sections from lib %s'%(lib_path)) + + return secs + +def filter_secs(secs_a, secs_b): + new_secs = list() + for s_a in secs_a: + for s_b in secs_b: + if s_b in s_a: + new_secs.append(s_a) + return new_secs + +def strip_secs(secs_a, secs_b): + secs = list(set(secs_a) - set(secs_b)) + secs.sort() + return secs + +def func2sect(func): + if ' ' in func: + func_l = func.split(' ') + else: + func_l = list() + func_l.append(func) + + secs = list() + for l in func_l: + if '.iram1.' not in l: + secs.append('.literal.%s'%(l,)) + secs.append('.text.%s'%(l, )) + else: + secs.append(l) + return secs + +class filter_c: + def __init__(self, file): + lines = open(file).read().splitlines() + self.libs_desc = '' + self.libs = '' + for l in lines: + if ') .iram1 EXCLUDE_FILE(*' in l and ') .iram1.*)' in l: + desc = '\(EXCLUDE_FILE\((.*)\) .iram1 ' + self.libs_desc = re.search(desc, l)[1] + self.libs = self.libs_desc.replace('*', '') + return + + def match(self, lib): + if lib in self.libs: + print('Remove lib %s'%(lib)) + return True + return False + + def add(self): + return self.libs_desc + +class target_c: + def __init__(self, lib, lib_path, file, fsecs): + self.lib = lib + self.file = file + + self.lib_path = lib_path + self.fsecs = func2sect(fsecs) + self.desc = '*%s:%s.*'%(lib, file.split('.')[0]) + + secs = lib_secs(lib, file, lib_path) + if '.iram1.' in self.fsecs[0]: + self.secs = filter_secs(secs, ('.iram1.', )) + else: + self.secs = filter_secs(secs, ('.iram1.', '.text.', '.literal.')) + self.isecs = strip_secs(self.secs, self.fsecs) + + def __str__(self): + s = 'lib=%s\nfile=%s\lib_path=%s\ndesc=%s\nsecs=%s\nfsecs=%s\nisecs=%s\n'%(\ + self.lib, self.file, self.lib_path, self.desc, self.secs, self.fsecs,\ + self.isecs) + return s + +class relink_c: + def __init__(self, input, library_file, object_file, function_file, sdkconfig_file, missing_function_info): + self.filter = filter_c(input) + + libraries = configuration.generator(library_file, object_file, function_file, sdkconfig_file, missing_function_info, espidf_objdump) + self.targets = list() + for i in libraries.libs: + lib = libraries.libs[i] + + if self.filter.match(lib.name): + continue + + for j in lib.objs: + obj = lib.objs[j] + self.targets.append(target_c(lib.name, lib.path, obj.name, + ' '.join(obj.sections()))) + # for i in self.targets: + # print(i) + self.__transform__() + + def __transform__(self): + iram1_exclude = list() + iram1_include = list() + flash_include = list() + + for t in self.targets: + secs = filter_secs(t.fsecs, ('.iram1.', )) + if len(secs) > 0: + iram1_exclude.append(t.desc) + + secs = filter_secs(t.isecs, ('.iram1.', )) + if len(secs) > 0: + iram1_include.append(' %s(%s)'%(t.desc, ' '.join(secs))) + + secs = t.fsecs + if len(secs) > 0: + flash_include.append(' %s(%s)'%(t.desc, ' '.join(secs))) + + self.iram1_exclude = ' *(EXCLUDE_FILE(%s %s) .iram1.*) *(EXCLUDE_FILE(%s %s) .iram1)' % \ + (self.filter.add(), ' '.join(iram1_exclude), \ + self.filter.add(), ' '.join(iram1_exclude)) + self.iram1_include = '\n'.join(iram1_include) + self.flash_include = '\n'.join(flash_include) + + logging.debug('IRAM1 Exclude: %s'%(self.iram1_exclude)) + logging.debug('IRAM1 Include: %s'%(self.iram1_include)) + logging.debug('Flash Include: %s'%(self.flash_include)) + + def __replace__(self, lines): + def is_iram_desc(l): + if '*(.iram1 .iram1.*)' in l or (') .iram1 EXCLUDE_FILE(*' in l and ') .iram1.*)' in l): + return True + return False + + iram_start = False + flash_done = False + + for i in range(0, len(lines) - 1): + l = lines[i] + if '.iram0.text :' in l: + logging.debug('start to process .iram0.text') + iram_start = True + elif '.dram0.data :' in l: + logging.debug('end to process .iram0.text') + iram_start = False + elif is_iram_desc(l): + if iram_start: + lines[i] = '%s\n%s\n'%(self.iram1_exclude, self.iram1_include) + elif '(.stub .gnu.warning' in l: + if not flash_done: + lines[i] = '%s\n\n%s'%(self.flash_include, l) + elif self.flash_include in l: + flash_done = True + else: + if iram_start: + new_l = self._replace_func(l) + if new_l: + lines[i] = new_l + + return lines + + def _replace_func(self, l): + for t in self.targets: + if t.desc in l: + S = '.literal .literal.* .text .text.*' + if S in l: + if len(t.isecs) > 0: + return l.replace(S, ' '.join(t.isecs)) + else: + return ' ' + + S = '%s(%s)'%(t.desc, ' '.join(t.fsecs)) + if S in l: + return ' ' + + replaced = False + for s in t.fsecs: + s2 = s + ' ' + if s2 in l: + l = l.replace(s2, '') + replaced = True + s2 = s + ')' + if s2 in l: + l = l.replace(s2, ')') + replaced = True + if '( )' in l or '()' in l: + return ' ' + if replaced: + return l + else: + index = '*%s:(EXCLUDE_FILE'%(t.lib) + if index in l and t.file.split('.')[0] not in l: + for m in self.targets: + index = '*%s:(EXCLUDE_FILE'%(m.lib) + if index in l and m.file.split('.')[0] not in l: + l = l.replace('EXCLUDE_FILE(', 'EXCLUDE_FILE(%s '%(m.desc)) + if len(m.isecs) > 0: + l += '\n %s(%s)'%(m.desc, ' '.join(m.isecs)) + return l + + return False + + def save(self, input, output): + lines = open(input).read().splitlines() + lines = self.__replace__(lines) + open(output, 'w+').write('\n'.join(lines)) + +def main(): + argparser = argparse.ArgumentParser(description='Relinker script generator') + + argparser.add_argument( + '--input', '-i', + help='Linker template file', + type=str) + + argparser.add_argument( + '--output', '-o', + help='Output linker script', + type=str) + + argparser.add_argument( + '--library', '-l', + help='Library description directory', + type=str) + + argparser.add_argument( + '--object', '-b', + help='Object description file', + type=str) + + argparser.add_argument( + '--function', '-f', + help='Function description file', + type=str) + + argparser.add_argument( + '--sdkconfig', '-s', + help='sdkconfig file', + type=str) + + argparser.add_argument( + '--objdump', '-g', + help='GCC objdump command', + type=str) + + argparser.add_argument( + '--debug', '-d', + help='Debug level(option is \'debug\')', + default='no', + type=str) + + argparser.add_argument( + '--missing_function_info', + help='Print error information instead of throwing exception when missing function', + default=False, + type=bool) + + args = argparser.parse_args() + + if args.debug == 'debug': + logging.basicConfig(level=logging.DEBUG) + + logging.debug('input: %s'%(args.input)) + logging.debug('output: %s'%(args.output)) + logging.debug('library: %s'%(args.library)) + logging.debug('object: %s'%(args.object)) + logging.debug('function: %s'%(args.function)) + logging.debug('sdkconfig:%s'%(args.sdkconfig)) + logging.debug('objdump: %s'%(args.objdump)) + logging.debug('debug: %s'%(args.debug)) + logging.debug('missing_function_info: %s'%(args.missing_function_info)) + + global espidf_objdump + espidf_objdump = args.objdump + + relink = relink_c(args.input, args.library, args.object, args.function, args.sdkconfig, args.missing_function_info) + relink.save(args.input, args.output) + +if __name__ == '__main__': + main() diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/CMakeLists.txt new file mode 100644 index 000000000..4ac13ebb8 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/CMakeLists.txt @@ -0,0 +1,8 @@ +# The following lines of boilerplate have to be in your project's CMakeLists +# in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.5) + +set(EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/tools/unit-test-app/components" + "../../cmake_utilities") +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(cmake_utilities_test_apps) \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/TEST-component2/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/TEST-component2/CMakeLists.txt new file mode 100644 index 000000000..6d9ee6993 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/TEST-component2/CMakeLists.txt @@ -0,0 +1,10 @@ +idf_component_register( SRC_DIRS "." + INCLUDE_DIRS "." + REQUIRES cmake_utilities) + +include(gcc) +include(gen_compressed_ota) +include(gen_single_bin) +include(package_manager) +include(relinker) +cu_pkg_define_version(${CMAKE_CURRENT_LIST_DIR}) \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/TEST-component2/idf_component.yml b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/TEST-component2/idf_component.yml new file mode 100644 index 000000000..5a0b9dff4 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/TEST-component2/idf_component.yml @@ -0,0 +1,6 @@ +version: "3.2.1" +description: Test2 for cmake utilities +url: https://github.com/espressif/esp-iot-solution/tree/master/tools/cmake_utilities +issues: https://github.com/espressif/esp-iot-solution/issues +dependencies: + idf: ">=4.1" \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/TEST-component2/test_component2.c b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/TEST-component2/test_component2.c new file mode 100644 index 000000000..3cb65557a --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/TEST-component2/test_component2.c @@ -0,0 +1,16 @@ +#include + +int test_component2_version_major() +{ + return TEST_COMPONENT2_VER_MAJOR; +} + +int test_component2_version_minor() +{ + return TEST_COMPONENT2_VER_MINOR; +} + +int test_component2_version_patch() +{ + return TEST_COMPONENT2_VER_PATCH; +} diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/TEST-component2/test_component2.h b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/TEST-component2/test_component2.h new file mode 100644 index 000000000..1323ccbce --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/TEST-component2/test_component2.h @@ -0,0 +1,14 @@ +#include +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +int test_component2_version_major(); +int test_component2_version_minor(); +int test_component2_version_patch(); + +#ifdef __cplusplus +} +#endif diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/test_component1/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/test_component1/CMakeLists.txt new file mode 100644 index 000000000..6d9ee6993 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/test_component1/CMakeLists.txt @@ -0,0 +1,10 @@ +idf_component_register( SRC_DIRS "." + INCLUDE_DIRS "." + REQUIRES cmake_utilities) + +include(gcc) +include(gen_compressed_ota) +include(gen_single_bin) +include(package_manager) +include(relinker) +cu_pkg_define_version(${CMAKE_CURRENT_LIST_DIR}) \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/test_component1/idf_component.yml b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/test_component1/idf_component.yml new file mode 100644 index 000000000..cc5a94646 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/test_component1/idf_component.yml @@ -0,0 +1,6 @@ +version: "1.2.3" +description: Test1 for cmake utilities +url: https://github.com/espressif/esp-iot-solution/tree/master/tools/cmake_utilities +issues: https://github.com/espressif/esp-iot-solution/issues +dependencies: + idf: ">=4.1" \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/test_component1/test_component1.c b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/test_component1/test_component1.c new file mode 100644 index 000000000..7f607e0b2 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/test_component1/test_component1.c @@ -0,0 +1,16 @@ +#include + +int test_component1_version_major() +{ + return TEST_COMPONENT1_VER_MAJOR; +} + +int test_component1_version_minor() +{ + return TEST_COMPONENT1_VER_MINOR; +} + +int test_component1_version_patch() +{ + return TEST_COMPONENT1_VER_PATCH; +} diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/test_component1/test_component1.h b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/test_component1/test_component1.h new file mode 100644 index 000000000..794cc4945 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/components/test_component1/test_component1.h @@ -0,0 +1,14 @@ +#include +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +int test_component1_version_major(); +int test_component1_version_minor(); +int test_component1_version_patch(); + +#ifdef __cplusplus +} +#endif diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/main/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/main/CMakeLists.txt new file mode 100644 index 000000000..4d89cab19 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/main/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRC_DIRS "." + INCLUDE_DIRS "." + REQUIRES unity test_utils test_component1 TEST-component2) \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/main/test_cmake_utilities.c b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/main/test_cmake_utilities.c new file mode 100644 index 000000000..9c2cb9522 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/main/test_cmake_utilities.c @@ -0,0 +1,59 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include "freertos/FreeRTOS.h" +#include "esp_system.h" +#include "esp_log.h" +#include "unity.h" +#include "test_component1.h" +#include "test_component2.h" + + +/* USB PIN fixed in esp32-s2, can not use io matrix */ +#define TEST_MEMORY_LEAK_THRESHOLD (-400) + +TEST_CASE("Test package manager version", "[cmake_utilities][package_manager]") +{ + esp_log_level_set("*", ESP_LOG_INFO); + TEST_ASSERT_EQUAL_INT(test_component1_version_major(), 1); + TEST_ASSERT_EQUAL_INT(test_component1_version_minor(), 2); + TEST_ASSERT_EQUAL_INT(test_component1_version_patch(), 3); + TEST_ASSERT_EQUAL_INT(test_component2_version_major(), 3); + TEST_ASSERT_EQUAL_INT(test_component2_version_minor(), 2); + TEST_ASSERT_EQUAL_INT(test_component2_version_patch(), 1); +} + +static size_t before_free_8bit; +static size_t before_free_32bit; + +static void check_leak(size_t before_free, size_t after_free, const char *type) +{ + ssize_t delta = after_free - before_free; + printf("MALLOC_CAP_%s: Before %u bytes free, After %u bytes free (delta %d)\n", type, before_free, after_free, delta); + TEST_ASSERT_MESSAGE(delta >= TEST_MEMORY_LEAK_THRESHOLD, "memory leak"); +} + +void setUp(void) +{ + before_free_8bit = heap_caps_get_free_size(MALLOC_CAP_8BIT); + before_free_32bit = heap_caps_get_free_size(MALLOC_CAP_32BIT); +} + +void tearDown(void) +{ + size_t after_free_8bit = heap_caps_get_free_size(MALLOC_CAP_8BIT); + size_t after_free_32bit = heap_caps_get_free_size(MALLOC_CAP_32BIT); + check_leak(before_free_8bit, after_free_8bit, "8BIT"); + check_leak(before_free_32bit, after_free_32bit, "32BIT"); +} + +void app_main(void) +{ + printf("Cmake Utilities TEST \n"); + unity_run_menu(); +} diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/pytest_cmake_utilities.py b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/pytest_cmake_utilities.py new file mode 100644 index 000000000..3b188bfcc --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__cmake_utilities/test_apps/pytest_cmake_utilities.py @@ -0,0 +1,20 @@ +''' +Steps to run these cases: +- Build + - . ${IDF_PATH}/export.sh + - pip install idf_build_apps + - python tools/build_apps.py tools/cmake_utilities/test_apps -t esp32s2 +- Test + - pip install -r tools/requirements/requirement.pytest.txt + - pytest tools/cmake_utilities/test_apps --target esp32s2 +''' + +import pytest +from pytest_embedded import Dut + +@pytest.mark.target('esp32s3') +@pytest.mark.env('generic') +def test_cmake_utilities(dut: Dut)-> None: + dut.expect_exact('Press ENTER to see the list of tests.') + dut.write('*') + dut.expect_unity_test_output(timeout = 1000) diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/.component_hash b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/.component_hash new file mode 100644 index 000000000..e15b730c9 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/.component_hash @@ -0,0 +1 @@ +fe8f85b3859544fabb960d7bcec24278cd3c88e3f1777e8a2075b0aca202fd9f \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/CHANGELOG.md b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/CHANGELOG.md new file mode 100644 index 000000000..1c1031eb0 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/CHANGELOG.md @@ -0,0 +1,51 @@ +# ChangeLog + +## v1.4.2 - 2025-8-26 + +### Bug Fix: + +- Remove the dependency of `I2C_BUS_BACKWARD_CONFIG` on the IDF version, and add CMake messages for I2C driver information. + +## V1.4.1 - 2025-8-14 + +### Bug Fix: + +- Soft i2c supports removing the restriction on ``NULL_I2C_MEM_ADDR``, allowing users to refer to all eligible register addresses. +- Modify the `ESP_IDF_VERSION` naming in Kconfig to avoid conflicts with other components. + +## v1.4.0 - 2025-3-13 + +### Enhancements: + +- Support removing the restriction on ``NULL_I2C_MEM_ADDR``, allowing users to refer to all eligible register addresses. + +## v1.3.0 - 2025-2-13 + +### Enhancements: + +- ``i2c_bus_v2`` supports initialization using the bus_handle provided by ``esp_driver_i2c``, and also supports returning the internal bus_handle of ``esp_driver_i2c``. + +## v1.2.0 - 2025-1-14 + +### Enhancements: + +- Support enabling software I2C to extend the number of I2C ports. + +## v1.1.0 - 2024-11-22 + +### Enhancements: + +- Support manual selection of ``driver/i2c`` or ``esp_driver_i2c`` in idf v5.3 and above. + +## v1.0.0 - 2024-9-19 + +### Enhancements: + +- Component version maintenance and documentation enhancement. +- Support `esp_driver_i2c` driver. + +## v0.1.0 - 2024-5-27 + +First release version. + +- Support I2C bus diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/CHECKSUMS.json b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/CHECKSUMS.json new file mode 100644 index 000000000..0593af492 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/CHECKSUMS.json @@ -0,0 +1 @@ +{"version": "1.0", "algorithm": "sha256", "created_at": "2025-08-27T10:45:51.231944+00:00", "files": [{"path": "CHANGELOG.md", "size": 1261, "hash": "3b1da89b95b6772f863f63da4d4c4c82001f28b5c93ea572c67089f657761578"}, {"path": "CMakeLists.txt", "size": 753, "hash": "fd22669ac3cece12a92742949c4608fb2e1da1439a8739a4a90c194dbc984c7b"}, {"path": "Kconfig", "size": 1931, "hash": "d25036af205c7f65f7e59938d28cc9526fd40a676b22ce3ff5da0dffc65827c8"}, {"path": "README.md", "size": 2910, "hash": "0dad1b9de95d531ddbbdf5daacd8b8ad0db8a908c0e1f716ef623d803995054c"}, {"path": "i2c_bus.c", "size": 25008, "hash": "f4f27a81aa3bca438b75240be396812b50f014a77e73f2e564ff54735559dd82"}, {"path": "i2c_bus_soft.c", "size": 15138, "hash": "3781e4dbb8971cbe94942a7a492042d0d30eef0a0b1a987f04f0e765264dcd6b"}, {"path": "i2c_bus_v2.c", "size": 27979, "hash": "ada5ca779030fcb26d7dd44955e6b3d348eae4d24cf54a4152c8f7c7e7536227"}, {"path": "idf_component.yml", "size": 543, "hash": "6ea3402fd8b698b1f2d508917af9cd9447c55dbfacce41d56757096005399205"}, {"path": "license.txt", "size": 11358, "hash": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30"}, {"path": "include/i2c_bus.h", "size": 15491, "hash": "c5dd23aa628ab072f6e2b7edfa7e00fcc4233d7d234564c97156415447cb4833"}, {"path": "private_include/i2c_bus_soft.h", "size": 5089, "hash": "32433f38ca82faee70bfba1da0e1ad2fedea7c8477ab602fd337962ac4aec8f6"}, {"path": "test_apps/CMakeLists.txt", "size": 352, "hash": "7216690bc36de976c448f44ed31931ef8457acda922537c5e895f73897726cbe"}, {"path": "test_apps/pytest_i2c_bus.py", "size": 759, "hash": "910d205af99012638fae7c71356f79aa23a60655cf72d1df43ac0b1348468285"}, {"path": "test_apps/sdkconfig.defaults", "size": 257, "hash": "b3f9660085595b907f7411e205468220c2dfb867de4de5d7fb3cbb406651dcab"}, {"path": "test_apps/main/CMakeLists.txt", "size": 144, "hash": "82bd519669b040da7894ea50dc37fa85d2055a009e511ececa92a4e93497b4a1"}, {"path": "test_apps/main/test_i2c_bus.c", "size": 21112, "hash": "a5aa7e26f41845ad597867c9ce5e83a90975049cbc8a83a39434288b3d8ba084"}]} \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/CMakeLists.txt new file mode 100644 index 000000000..0503e91cb --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/CMakeLists.txt @@ -0,0 +1,21 @@ +if("${IDF_VERSION_MAJOR}.${IDF_VERSION_MINOR}" VERSION_LESS "5.3" OR CONFIG_I2C_BUS_BACKWARD_CONFIG) + set(SRC_FILE "i2c_bus.c") + set(REQ driver) + message(STATUS "Using driver/i2c (SRC_FILE=i2c_bus.c, REQ=driver)") +else() + set(SRC_FILE "i2c_bus_v2.c") + set(REQ esp_driver_i2c driver) + message(STATUS "Using esp_driver_i2c (SRC_FILE=i2c_bus_v2.c, REQ=esp_driver_i2c driver)") +endif() + +if (CONFIG_I2C_BUS_SUPPORT_SOFTWARE) + list(APPEND SRC_FILE "i2c_bus_soft.c") +endif() + +idf_component_register(SRCS ${SRC_FILE} + INCLUDE_DIRS "include" + PRIV_INCLUDE_DIRS "private_include" + REQUIRES ${REQ}) + +include(package_manager) +cu_pkg_define_version(${CMAKE_CURRENT_LIST_DIR}) diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/Kconfig b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/Kconfig new file mode 100644 index 000000000..50bffb74d --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/Kconfig @@ -0,0 +1,48 @@ +menu "Bus Options" + + menu "I2C Bus Options" + config I2C_BUS_DYNAMIC_CONFIG + bool "enable dynamic configuration" + default y + help + If enable, i2c_bus will dynamically check configs and re-install i2c driver before each transfer, + hence multiple devices with different configs on a single bus can be supported. + + config I2C_MS_TO_WAIT + int "mutex block time" + default 200 + range 50 5000 + help + task block time when try to take the bus, unit:milliseconds + + config I2C_BUS_BACKWARD_CONFIG + bool "Enable backward compatibility for the I2C driver (force use of the old i2c_driver above v5.3)" + default n + help + Enable this option for backward compatibility with the old I2C driver (only valid in IDF v5.3 and above). + + config I2C_BUS_SUPPORT_SOFTWARE + bool "Enable software I2C support" + default n + help + Enable this option to use a software-implemented I2C driver. This can be useful for scenarios where + hardware I2C is unavailable or additional I2C buses are needed beyond the hardware support. + + config I2C_BUS_SOFTWARE_MAX_PORT + int "Maximum number of software I2C ports" + default 2 + range 1 5 + depends on I2C_BUS_SUPPORT_SOFTWARE + help + Set the maximum number of software I2C ports that can be used. This option is only applicable when + software I2C support is enabled. + + config I2C_BUS_REMOVE_NULL_MEM_ADDR + bool "Remove the limitation of NULL_MEM_ADDR, any register address will be sent" + default n + help + Enable this option to disable NULL_MEM_ADDR. This allows any register address to be sent. + + endmenu + +endmenu diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/README.md b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/README.md new file mode 100644 index 000000000..89b2ebfc5 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/README.md @@ -0,0 +1,70 @@ +# Component: I2C BUS +[Online documentation](https://docs.espressif.com/projects/esp-iot-solution/en/latest/basic/bus/i2c_bus.html) + +The I2C bus component (Bus) is a set of application-layer code built on top of the ESP-IDF peripheral driver code, It is mainly used for bus communication between ESP chips and external devices. From the point of application development, this component has the following features: + +1. Simplified peripheral initialization processes +2. Thread-safe device operations +3. Simple and flexible RW operations +4. Compatible with `driver/i2c` and `esp_driver_i2c` +5. Supports additional software I2C + +This component abstracts the following concepts: + +1. Bus: the resource and configuration option shared between devices during communication +2. Device: device specific resource and configuration option during communication + +Each physical peripheral bus can mount one or more devices if the electrical condition allows, the I2C bus addressing devices based on their addresses, thus achieving software independence between different devices on the same bus. + +## Add component to your project + +Please use the component manager command `add-dependency` to add the `i2c_bus` to your project's dependency, during the `CMake` step the component will be downloaded automatically + +``` +idf.py add-dependency "espressif/i2c_bus=*" +``` + +Alternatively, you can create `idf_component.yml`. More is in [Espressif's documentation](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/tools/idf-component-manager.html). + +## Example use + +```c +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "i2c_bus.h" + +#define I2C_MASTER_SCL_IO (gpio_num_t)15 /*!< gpio number for I2C master clock */ +#define I2C_MASTER_SDA_IO (gpio_num_t)16 /*!< gpio number for I2C master data */ +#define I2C_MASTER_FREQ_HZ 100000 /*!< I2C master clock frequency */ +#define ESP_SLAVE_ADDR 0x28 /*!< ESP32 slave address, you can set any 7bit value */ +#define DATA_LENGTH 64 /*! +#include +#include + +#include "freertos/FreeRTOS.h" +#include "freertos/semphr.h" + +#include "esp_log.h" +#include "i2c_bus.h" +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE +#include "i2c_bus_soft.h" +#endif + +#define I2C_ACK_CHECK_EN 0x1 /*!< I2C master will check ack from slave*/ +#define I2C_ACK_CHECK_DIS 0x0 /*!< I2C master will not check ack from slave */ +#define I2C_BUS_FLG_DEFAULT (0) +#define I2C_BUS_MASTER_BUF_LEN (0) +#define I2C_BUS_MS_TO_WAIT CONFIG_I2C_MS_TO_WAIT +#define I2C_BUS_TICKS_TO_WAIT (I2C_BUS_MS_TO_WAIT/portTICK_RATE_MS) +#define I2C_BUS_MUTEX_TICKS_TO_WAIT (I2C_BUS_MS_TO_WAIT/portTICK_RATE_MS) + +typedef struct { + i2c_port_t i2c_port; /*!< I2C port number */ + bool is_init; /*!< if bus is initialized */ + i2c_config_t conf_active; /*!< I2C active configuration */ + SemaphoreHandle_t mutex; /*!< mutex to achieve thread-safe */ + int32_t ref_counter; /*!< reference count */ +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE + i2c_master_soft_bus_handle_t soft_bus_handle; /*!< I2C master soft bus handle */ +#endif +} i2c_bus_t; + +typedef struct { + uint8_t dev_addr; /*!< device address */ + i2c_config_t conf; /*!< I2C active configuration */ + i2c_bus_t *i2c_bus; /*!< I2C bus */ +} i2c_bus_device_t; + +static const char *TAG = "i2c_bus"; + +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE +static i2c_bus_t s_i2c_bus[I2C_NUM_SW_MAX]; /*!< If software I2C is enabled, additional space is required to store the port. */ +#else +static i2c_bus_t s_i2c_bus[I2C_NUM_MAX]; +#endif + +#define I2C_BUS_CHECK(a, str, ret) if(!(a)) { \ + ESP_LOGE(TAG,"%s:%d (%s):%s", __FILE__, __LINE__, __FUNCTION__, str); \ + return (ret); \ + } + +#define I2C_BUS_CHECK_GOTO(a, str, label) if(!(a)) { \ + ESP_LOGE(TAG,"%s:%d (%s):%s", __FILE__, __LINE__, __FUNCTION__, str); \ + goto label; \ + } + +#define I2C_BUS_INIT_CHECK(is_init, ret) if(!is_init) { \ + ESP_LOGE(TAG,"%s:%d (%s):i2c_bus has not inited", __FILE__, __LINE__, __FUNCTION__); \ + return (ret); \ + } + +#define I2C_BUS_MUTEX_TAKE(mutex, ret) if (!xSemaphoreTake(mutex, I2C_BUS_MUTEX_TICKS_TO_WAIT)) { \ + ESP_LOGE(TAG, "i2c_bus take mutex timeout, max wait = %"PRIu32"ms", I2C_BUS_MUTEX_TICKS_TO_WAIT); \ + return (ret); \ + } + +#define I2C_BUS_MUTEX_TAKE_MAX_DELAY(mutex, ret) if (!xSemaphoreTake(mutex, portMAX_DELAY)) { \ + ESP_LOGE(TAG, "i2c_bus take mutex timeout, max wait = %"PRIu32"ms", portMAX_DELAY); \ + return (ret); \ + } + +#define I2C_BUS_MUTEX_GIVE(mutex, ret) if (!xSemaphoreGive(mutex)) { \ + ESP_LOGE(TAG, "i2c_bus give mutex failed"); \ + return (ret); \ + } + +static esp_err_t i2c_driver_reinit(i2c_port_t port, const i2c_config_t *conf); +static esp_err_t i2c_driver_deinit(i2c_port_t port); +static esp_err_t i2c_bus_write_reg8(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, size_t data_len, const uint8_t *data); +static esp_err_t i2c_bus_read_reg8(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, size_t data_len, uint8_t *data); +inline static bool i2c_config_compare(i2c_port_t port, const i2c_config_t *conf); +/**************************************** Public Functions (Application level)*********************************************/ + +i2c_bus_handle_t i2c_bus_create(i2c_port_t port, const i2c_config_t *conf) +{ +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE + I2C_BUS_CHECK(((i2c_sw_port_t)port < I2C_NUM_SW_MAX) || (port == I2C_NUM_MAX), "I2C port error", NULL); +#else + I2C_BUS_CHECK(port < I2C_NUM_MAX, "I2C port error", NULL); +#endif + I2C_BUS_CHECK(conf != NULL, "pointer = NULL error", NULL); + I2C_BUS_CHECK(conf->mode == I2C_MODE_MASTER, "i2c_bus only supports master mode", NULL); + + if (s_i2c_bus[port].is_init) { + /**if i2c_bus has been inited and configs not changed, return the handle directly**/ + if (i2c_config_compare(port, conf)) { + ESP_LOGW(TAG, "i2c%d has been inited, return handle directly, ref_counter=%"PRIi32"", port, s_i2c_bus[port].ref_counter); + return (i2c_bus_handle_t)&s_i2c_bus[port]; + } + } else { + s_i2c_bus[port].mutex = xSemaphoreCreateMutex(); + I2C_BUS_CHECK(s_i2c_bus[port].mutex != NULL, "i2c_bus xSemaphoreCreateMutex failed", NULL); + s_i2c_bus[port].ref_counter = 0; + } + + esp_err_t ret = i2c_driver_reinit(port, conf); + I2C_BUS_CHECK(ret == ESP_OK, "init error", NULL); + s_i2c_bus[port].conf_active = *conf; + s_i2c_bus[port].i2c_port = port; + ESP_LOGI(TAG, "I2C Bus Config Succeed, Version: %d.%d.%d", I2C_BUS_VER_MAJOR, I2C_BUS_VER_MINOR, I2C_BUS_VER_PATCH); + return (i2c_bus_handle_t)&s_i2c_bus[port]; +} + +esp_err_t i2c_bus_delete(i2c_bus_handle_t *p_bus) +{ + I2C_BUS_CHECK(p_bus != NULL && *p_bus != NULL, "pointer = NULL error", ESP_ERR_INVALID_ARG); + i2c_bus_t *i2c_bus = (i2c_bus_t *)(*p_bus); + I2C_BUS_INIT_CHECK(i2c_bus->is_init, ESP_FAIL); + I2C_BUS_MUTEX_TAKE_MAX_DELAY(i2c_bus->mutex, ESP_ERR_TIMEOUT); + + /** if ref_counter == 0, de-init the bus**/ + if ((i2c_bus->ref_counter) > 0) { + ESP_LOGW(TAG, "i2c%d is also handled by others ref_counter=%"PRIi32", won't be de-inited", i2c_bus->i2c_port, i2c_bus->ref_counter); + return ESP_OK; + } + + esp_err_t ret = i2c_driver_deinit(i2c_bus->i2c_port); + I2C_BUS_CHECK(ret == ESP_OK, "deinit error", ret); + vSemaphoreDelete(i2c_bus->mutex); + *p_bus = NULL; + return ESP_OK; +} + +uint8_t i2c_bus_scan(i2c_bus_handle_t bus_handle, uint8_t *buf, uint8_t num) +{ + I2C_BUS_CHECK(bus_handle != NULL, "Handle error", 0); + i2c_bus_t *i2c_bus = (i2c_bus_t *)bus_handle; + I2C_BUS_INIT_CHECK(i2c_bus->is_init, 0); + uint8_t device_count = 0; + esp_err_t ret = ESP_FAIL; + I2C_BUS_MUTEX_TAKE_MAX_DELAY(i2c_bus->mutex, 0); + + for (uint8_t dev_address = 1; dev_address < 127; dev_address++) { +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE + if (i2c_bus->i2c_port > I2C_NUM_MAX) { + ret = i2c_master_soft_bus_probe(i2c_bus->soft_bus_handle, dev_address); + } else +#endif + { + i2c_cmd_handle_t cmd = i2c_cmd_link_create(); + i2c_master_start(cmd); + i2c_master_write_byte(cmd, (dev_address << 1) | I2C_MASTER_WRITE, I2C_ACK_CHECK_EN); + i2c_master_stop(cmd); + ret = i2c_master_cmd_begin(i2c_bus->i2c_port, cmd, I2C_BUS_TICKS_TO_WAIT); + } + if (ret == ESP_OK) { + ESP_LOGI(TAG, "found i2c device address = 0x%02x", dev_address); + if (buf != NULL && device_count < num) { + *(buf + device_count) = dev_address; + } + device_count++; + } + } + I2C_BUS_MUTEX_GIVE(i2c_bus->mutex, 0); + return device_count; +} + +uint32_t i2c_bus_get_current_clk_speed(i2c_bus_handle_t bus_handle) +{ + I2C_BUS_CHECK(bus_handle != NULL, "Null Bus Handle", 0); + i2c_bus_t *i2c_bus = (i2c_bus_t *)bus_handle; + I2C_BUS_INIT_CHECK(i2c_bus->is_init, 0); + return i2c_bus->conf_active.master.clk_speed; +} + +uint8_t i2c_bus_get_created_device_num(i2c_bus_handle_t bus_handle) +{ + I2C_BUS_CHECK(bus_handle != NULL, "Null Bus Handle", 0); + i2c_bus_t *i2c_bus = (i2c_bus_t *)bus_handle; + I2C_BUS_INIT_CHECK(i2c_bus->is_init, 0); + return i2c_bus->ref_counter; +} + +i2c_bus_device_handle_t i2c_bus_device_create(i2c_bus_handle_t bus_handle, uint8_t dev_addr, uint32_t clk_speed) +{ + I2C_BUS_CHECK(bus_handle != NULL, "Null Bus Handle", NULL); + I2C_BUS_CHECK(clk_speed <= 400000, "clk_speed must <= 400000", NULL); + i2c_bus_t *i2c_bus = (i2c_bus_t *)bus_handle; + I2C_BUS_INIT_CHECK(i2c_bus->is_init, NULL); + i2c_bus_device_t *i2c_device = calloc(1, sizeof(i2c_bus_device_t)); + I2C_BUS_CHECK(i2c_device != NULL, "calloc memory failed", NULL); + I2C_BUS_MUTEX_TAKE_MAX_DELAY(i2c_bus->mutex, NULL); + i2c_device->dev_addr = dev_addr; + i2c_device->conf = i2c_bus->conf_active; + + /*if clk_speed == 0, current active clock speed will be used, else set a specified value*/ + if (clk_speed != 0) { + i2c_device->conf.master.clk_speed = clk_speed; + } + + i2c_device->i2c_bus = i2c_bus; + i2c_bus->ref_counter++; + I2C_BUS_MUTEX_GIVE(i2c_bus->mutex, NULL); + return (i2c_bus_device_handle_t)i2c_device; +} + +esp_err_t i2c_bus_device_delete(i2c_bus_device_handle_t *p_dev_handle) +{ + I2C_BUS_CHECK(p_dev_handle != NULL && *p_dev_handle != NULL, "Null Device Handle", ESP_ERR_INVALID_ARG); + i2c_bus_device_t *i2c_device = (i2c_bus_device_t *)(*p_dev_handle); + I2C_BUS_MUTEX_TAKE_MAX_DELAY(i2c_device->i2c_bus->mutex, ESP_ERR_TIMEOUT); + i2c_device->i2c_bus->ref_counter--; + I2C_BUS_MUTEX_GIVE(i2c_device->i2c_bus->mutex, ESP_FAIL); + free(i2c_device); + *p_dev_handle = NULL; + return ESP_OK; +} + +uint8_t i2c_bus_device_get_address(i2c_bus_device_handle_t dev_handle) +{ + I2C_BUS_CHECK(dev_handle != NULL, "device handle error", NULL_I2C_DEV_ADDR); + i2c_bus_device_t *i2c_device = (i2c_bus_device_t *)dev_handle; + return i2c_device->dev_addr; +} + +esp_err_t i2c_bus_read_bytes(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, size_t data_len, uint8_t *data) +{ + return i2c_bus_read_reg8(dev_handle, mem_address, data_len, data); +} + +esp_err_t i2c_bus_read_byte(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, uint8_t *data) +{ + return i2c_bus_read_reg8(dev_handle, mem_address, 1, data); +} + +esp_err_t i2c_bus_read_bit(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, uint8_t bit_num, uint8_t *data) +{ + uint8_t byte = 0; + esp_err_t ret = i2c_bus_read_reg8(dev_handle, mem_address, 1, &byte); + *data = byte & (1 << bit_num); + *data = (*data != 0) ? 1 : 0; + return ret; +} + +esp_err_t i2c_bus_read_bits(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, uint8_t bit_start, uint8_t length, uint8_t *data) +{ + uint8_t byte = 0; + esp_err_t ret = i2c_bus_read_byte(dev_handle, mem_address, &byte); + + if (ret != ESP_OK) { + return ret; + } + + uint8_t mask = ((1 << length) - 1) << (bit_start - length + 1); + byte &= mask; + byte >>= (bit_start - length + 1); + *data = byte; + return ret; +} + +esp_err_t i2c_bus_write_byte(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, uint8_t data) +{ + return i2c_bus_write_reg8(dev_handle, mem_address, 1, &data); +} + +esp_err_t i2c_bus_write_bytes(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, size_t data_len, const uint8_t *data) +{ + return i2c_bus_write_reg8(dev_handle, mem_address, data_len, data); +} + +esp_err_t i2c_bus_write_bit(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, uint8_t bit_num, uint8_t data) +{ + uint8_t byte = 0; + esp_err_t ret = i2c_bus_read_byte(dev_handle, mem_address, &byte); + + if (ret != ESP_OK) { + return ret; + } + + byte = (data != 0) ? (byte | (1 << bit_num)) : (byte & ~(1 << bit_num)); + return i2c_bus_write_byte(dev_handle, mem_address, byte); +} + +esp_err_t i2c_bus_write_bits(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, uint8_t bit_start, uint8_t length, uint8_t data) +{ + uint8_t byte = 0; + esp_err_t ret = i2c_bus_read_byte(dev_handle, mem_address, &byte); + + if (ret != ESP_OK) { + return ret; + } + + uint8_t mask = ((1 << length) - 1) << (bit_start - length + 1); + data <<= (bit_start - length + 1); // shift data into correct position + data &= mask; // zero all non-important bits in data + byte &= ~(mask); // zero all important bits in existing byte + byte |= data; // combine data with existing byte + return i2c_bus_write_byte(dev_handle, mem_address, byte); +} + +/** + * @brief I2C master send queued commands. + * This function will trigger sending all queued commands. + * The task will be blocked until all the commands have been sent out. + * If I2C_BUS_DYNAMIC_CONFIG enable, i2c_bus will dynamically check configs and re-install i2c driver before each transfer, + * hence multiple devices with different configs on a single bus can be supported. + * @note + * Only call this function in I2C master mode + * + * @param i2c_num I2C port number + * @param cmd_handle I2C command handler + * @param ticks_to_wait maximum wait ticks. + * @param conf pointer to I2C parameter settings + * @return esp_err_t + */ +inline static esp_err_t i2c_master_cmd_begin_with_conf(i2c_port_t i2c_num, i2c_cmd_handle_t cmd_handle, TickType_t ticks_to_wait, const i2c_config_t *conf) +{ + esp_err_t ret; +#ifdef CONFIG_I2C_BUS_DYNAMIC_CONFIG + /*if configs changed, i2c driver will reinit with new configuration*/ + if (conf != NULL && false == i2c_config_compare(i2c_num, conf)) { + ret = i2c_driver_reinit(i2c_num, conf); + I2C_BUS_CHECK(ret == ESP_OK, "reinit error", ret); + s_i2c_bus[i2c_num].conf_active = *conf; + } +#endif + ret = i2c_master_cmd_begin(i2c_num, cmd_handle, ticks_to_wait); + return ret; +} + +/**************************************** Public Functions (Low level)*********************************************/ + +esp_err_t i2c_bus_cmd_begin(i2c_bus_device_handle_t dev_handle, i2c_cmd_handle_t cmd) +{ + I2C_BUS_CHECK(dev_handle != NULL, "device handle error", ESP_ERR_INVALID_ARG); + I2C_BUS_CHECK(cmd != NULL, "I2C command error", ESP_ERR_INVALID_ARG); + i2c_bus_device_t *i2c_device = (i2c_bus_device_t *)dev_handle; + I2C_BUS_INIT_CHECK(i2c_device->i2c_bus->is_init, ESP_ERR_INVALID_STATE); + I2C_BUS_MUTEX_TAKE(i2c_device->i2c_bus->mutex, ESP_ERR_TIMEOUT); + esp_err_t ret = i2c_master_cmd_begin_with_conf(i2c_device->i2c_bus->i2c_port, cmd, I2C_BUS_TICKS_TO_WAIT, &i2c_device->conf); + I2C_BUS_MUTEX_GIVE(i2c_device->i2c_bus->mutex, ESP_FAIL); + return ret; +} + +static esp_err_t i2c_bus_read_reg8(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, size_t data_len, uint8_t *data) +{ + I2C_BUS_CHECK(dev_handle != NULL, "device handle error", ESP_ERR_INVALID_ARG); + I2C_BUS_CHECK(data != NULL, "data pointer error", ESP_ERR_INVALID_ARG); + i2c_bus_device_t *i2c_device = (i2c_bus_device_t *)dev_handle; + esp_err_t ret = ESP_FAIL; + I2C_BUS_INIT_CHECK(i2c_device->i2c_bus->is_init, ESP_ERR_INVALID_STATE); + I2C_BUS_MUTEX_TAKE(i2c_device->i2c_bus->mutex, ESP_ERR_TIMEOUT); + +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE + if (i2c_device->i2c_bus->i2c_port > I2C_NUM_MAX) { + ret = i2c_master_soft_bus_change_frequency(i2c_device->i2c_bus->soft_bus_handle, i2c_device->conf.master.clk_speed); + ret = i2c_master_soft_bus_read_reg8(i2c_device->i2c_bus->soft_bus_handle, i2c_device->dev_addr, mem_address, data_len, data); + } else +#endif + { + i2c_cmd_handle_t cmd = i2c_cmd_link_create(); +#if !CONFIG_I2C_BUS_REMOVE_NULL_MEM_ADDR + if (mem_address != NULL_I2C_MEM_ADDR) { +#endif + i2c_master_start(cmd); + i2c_master_write_byte(cmd, (i2c_device->dev_addr << 1) | I2C_MASTER_WRITE, I2C_ACK_CHECK_EN); + i2c_master_write_byte(cmd, mem_address, I2C_ACK_CHECK_EN); +#if !CONFIG_I2C_BUS_REMOVE_NULL_MEM_ADDR + } else { + ESP_LOGD(TAG, "register address 0x%X is skipped and will not be sent", NULL_I2C_MEM_ADDR); + } +#endif + + i2c_master_start(cmd); + i2c_master_write_byte(cmd, (i2c_device->dev_addr << 1) | I2C_MASTER_READ, I2C_ACK_CHECK_EN); + i2c_master_read(cmd, data, data_len, I2C_MASTER_LAST_NACK); + i2c_master_stop(cmd); + ret = i2c_master_cmd_begin_with_conf(i2c_device->i2c_bus->i2c_port, cmd, I2C_BUS_TICKS_TO_WAIT, &i2c_device->conf); + i2c_cmd_link_delete(cmd); + } + I2C_BUS_MUTEX_GIVE(i2c_device->i2c_bus->mutex, ESP_FAIL); + return ret; +} + +esp_err_t i2c_bus_read_reg16(i2c_bus_device_handle_t dev_handle, uint16_t mem_address, size_t data_len, uint8_t *data) +{ + I2C_BUS_CHECK(dev_handle != NULL, "device handle error", ESP_ERR_INVALID_ARG); + I2C_BUS_CHECK(data != NULL, "data pointer error", ESP_ERR_INVALID_ARG); + i2c_bus_device_t *i2c_device = (i2c_bus_device_t *)dev_handle; + I2C_BUS_INIT_CHECK(i2c_device->i2c_bus->is_init, ESP_ERR_INVALID_STATE); + uint8_t memAddress8[2]; + esp_err_t ret = ESP_OK; + memAddress8[0] = (uint8_t)((mem_address >> 8) & 0x00FF); + memAddress8[1] = (uint8_t)(mem_address & 0x00FF); + I2C_BUS_MUTEX_TAKE(i2c_device->i2c_bus->mutex, ESP_ERR_TIMEOUT); + +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE + if (i2c_device->i2c_bus->i2c_port > I2C_NUM_MAX) { + ret = i2c_master_soft_bus_change_frequency(i2c_device->i2c_bus->soft_bus_handle, i2c_device->conf.master.clk_speed); + ret = i2c_master_soft_bus_read_reg16(i2c_device->i2c_bus->soft_bus_handle, i2c_device->dev_addr, mem_address, data_len, data); + } else +#endif + { + i2c_cmd_handle_t cmd = i2c_cmd_link_create(); +#if !CONFIG_I2C_BUS_REMOVE_NULL_MEM_ADDR + if (mem_address != NULL_I2C_MEM_16BIT_ADDR) { +#endif + i2c_master_start(cmd); + i2c_master_write_byte(cmd, (i2c_device->dev_addr << 1) | I2C_MASTER_WRITE, I2C_ACK_CHECK_EN); + i2c_master_write(cmd, memAddress8, 2, I2C_ACK_CHECK_EN); +#if !CONFIG_I2C_BUS_REMOVE_NULL_MEM_ADDR + } else { + ESP_LOGD(TAG, "register address 0x%X is skipped and will not be sent", NULL_I2C_MEM_16BIT_ADDR); + } +#endif + i2c_master_start(cmd); + i2c_master_write_byte(cmd, (i2c_device->dev_addr << 1) | I2C_MASTER_READ, I2C_ACK_CHECK_EN); + i2c_master_read(cmd, data, data_len, I2C_MASTER_LAST_NACK); + i2c_master_stop(cmd); + ret = i2c_master_cmd_begin_with_conf(i2c_device->i2c_bus->i2c_port, cmd, I2C_BUS_TICKS_TO_WAIT, &i2c_device->conf); + i2c_cmd_link_delete(cmd); + } + I2C_BUS_MUTEX_GIVE(i2c_device->i2c_bus->mutex, ESP_FAIL); + return ret; +} + +static esp_err_t i2c_bus_write_reg8(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, size_t data_len, const uint8_t *data) +{ + I2C_BUS_CHECK(dev_handle != NULL, "device handle error", ESP_ERR_INVALID_ARG); + I2C_BUS_CHECK(data != NULL, "data pointer error", ESP_ERR_INVALID_ARG); + i2c_bus_device_t *i2c_device = (i2c_bus_device_t *)dev_handle; + esp_err_t ret = ESP_OK; + I2C_BUS_INIT_CHECK(i2c_device->i2c_bus->is_init, ESP_ERR_INVALID_STATE); + I2C_BUS_MUTEX_TAKE(i2c_device->i2c_bus->mutex, ESP_ERR_TIMEOUT); + +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE + if (i2c_device->i2c_bus->i2c_port > I2C_NUM_MAX) { + ret = i2c_master_soft_bus_change_frequency(i2c_device->i2c_bus->soft_bus_handle, i2c_device->conf.master.clk_speed); + ret = i2c_master_soft_bus_write_reg8(i2c_device->i2c_bus->soft_bus_handle, i2c_device->dev_addr, mem_address, data_len, data); + } else +#endif + { + i2c_cmd_handle_t cmd = i2c_cmd_link_create(); + i2c_master_start(cmd); + i2c_master_write_byte(cmd, (i2c_device->dev_addr << 1) | I2C_MASTER_WRITE, I2C_ACK_CHECK_EN); +#if !CONFIG_I2C_BUS_REMOVE_NULL_MEM_ADDR + if (mem_address != NULL_I2C_MEM_ADDR) { +#endif + i2c_master_write_byte(cmd, mem_address, I2C_ACK_CHECK_EN); +#if !CONFIG_I2C_BUS_REMOVE_NULL_MEM_ADDR + } else { + ESP_LOGD(TAG, "register address 0x%X is skipped and will not be sent", NULL_I2C_MEM_ADDR); + } +#endif + i2c_master_write(cmd, (uint8_t *)data, data_len, I2C_ACK_CHECK_EN); + i2c_master_stop(cmd); + ret = i2c_master_cmd_begin_with_conf(i2c_device->i2c_bus->i2c_port, cmd, I2C_BUS_TICKS_TO_WAIT, &i2c_device->conf); + i2c_cmd_link_delete(cmd); + } + I2C_BUS_MUTEX_GIVE(i2c_device->i2c_bus->mutex, ESP_FAIL); + return ret; +} + +esp_err_t i2c_bus_write_reg16(i2c_bus_device_handle_t dev_handle, uint16_t mem_address, size_t data_len, const uint8_t *data) +{ + I2C_BUS_CHECK(dev_handle != NULL, "device handle error", ESP_ERR_INVALID_ARG); + I2C_BUS_CHECK(data != NULL, "data pointer error", ESP_ERR_INVALID_ARG); + i2c_bus_device_t *i2c_device = (i2c_bus_device_t *)dev_handle; + I2C_BUS_INIT_CHECK(i2c_device->i2c_bus->is_init, ESP_ERR_INVALID_STATE); + uint8_t memAddress8[2]; + esp_err_t ret = ESP_OK; + memAddress8[0] = (uint8_t)((mem_address >> 8) & 0x00FF); + memAddress8[1] = (uint8_t)(mem_address & 0x00FF); + I2C_BUS_MUTEX_TAKE(i2c_device->i2c_bus->mutex, ESP_ERR_TIMEOUT); + +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE + if (i2c_device->i2c_bus->i2c_port > I2C_NUM_MAX) { + ret = i2c_master_soft_bus_change_frequency(i2c_device->i2c_bus->soft_bus_handle, i2c_device->conf.master.clk_speed); + ret = i2c_master_soft_bus_write_reg16(i2c_device->i2c_bus->soft_bus_handle, i2c_device->dev_addr, mem_address, data_len, data); + } else +#endif + { + i2c_cmd_handle_t cmd = i2c_cmd_link_create(); + i2c_master_start(cmd); + i2c_master_write_byte(cmd, (i2c_device->dev_addr << 1) | I2C_MASTER_WRITE, I2C_ACK_CHECK_EN); + +#if !CONFIG_I2C_BUS_REMOVE_NULL_MEM_ADDR + if (mem_address != NULL_I2C_MEM_16BIT_ADDR) { +#endif + i2c_master_write(cmd, memAddress8, 2, I2C_ACK_CHECK_EN); +#if !CONFIG_I2C_BUS_REMOVE_NULL_MEM_ADDR + } else { + ESP_LOGD(TAG, "register address 0x%X is skipped and will not be sent", NULL_I2C_MEM_16BIT_ADDR); + } +#endif + + i2c_master_write(cmd, (uint8_t *)data, data_len, I2C_ACK_CHECK_EN); + i2c_master_stop(cmd); + ret = i2c_master_cmd_begin_with_conf(i2c_device->i2c_bus->i2c_port, cmd, I2C_BUS_TICKS_TO_WAIT, &i2c_device->conf); + i2c_cmd_link_delete(cmd); + } + I2C_BUS_MUTEX_GIVE(i2c_device->i2c_bus->mutex, ESP_FAIL); + return ret; +} + +/**************************************** Private Functions*********************************************/ +static esp_err_t i2c_driver_reinit(i2c_port_t port, const i2c_config_t *conf) +{ +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE + I2C_BUS_CHECK(((i2c_sw_port_t)port < I2C_NUM_SW_MAX) || (port == I2C_NUM_MAX), "I2C port error", ESP_ERR_INVALID_ARG); +#else + I2C_BUS_CHECK(port < I2C_NUM_MAX, "i2c port error", ESP_ERR_INVALID_ARG); +#endif + I2C_BUS_CHECK(conf != NULL, "pointer = NULL error", ESP_ERR_INVALID_ARG); + esp_err_t ret = ESP_OK; + + if (s_i2c_bus[port].is_init) { +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE + if (port > I2C_NUM_MAX) { + i2c_del_master_soft_bus(s_i2c_bus[port].soft_bus_handle); + } else +#endif + { + i2c_driver_delete(port); + } + s_i2c_bus[port].is_init = false; + ESP_LOGI(TAG, "i2c%d bus deinited", port); + } + +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE + if (port > I2C_NUM_MAX) { + ret = i2c_new_master_soft_bus(conf, &s_i2c_bus[port].soft_bus_handle); + I2C_BUS_CHECK(ret == ESP_OK, "i2c software driver install failed", ret); + } else +#endif + { + ret = i2c_param_config(port, conf); + I2C_BUS_CHECK(ret == ESP_OK, "i2c param config failed", ret); + ret = i2c_driver_install(port, conf->mode, I2C_BUS_MASTER_BUF_LEN, I2C_BUS_MASTER_BUF_LEN, I2C_BUS_FLG_DEFAULT); + I2C_BUS_CHECK(ret == ESP_OK, "i2c driver install failed", ret); + } + s_i2c_bus[port].is_init = true; + ESP_LOGI(TAG, "i2c%d bus inited", port); + return ESP_OK; +} + +static esp_err_t i2c_driver_deinit(i2c_port_t port) +{ +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE + I2C_BUS_CHECK(((i2c_sw_port_t)port < I2C_NUM_SW_MAX) || (port == I2C_NUM_MAX), "I2C port error", ESP_ERR_INVALID_ARG); +#else + I2C_BUS_CHECK(port < I2C_NUM_MAX, "i2c port error", ESP_ERR_INVALID_ARG); +#endif + I2C_BUS_CHECK(s_i2c_bus[port].is_init == true, "i2c not inited", ESP_ERR_INVALID_STATE); + +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE + if (port > I2C_NUM_MAX) { + esp_err_t ret = i2c_del_master_soft_bus(s_i2c_bus[port].soft_bus_handle); + I2C_BUS_CHECK(ret == ESP_OK, "i2c software driver delete failed", ret); + } else +#endif + { + i2c_driver_delete(port); //always return ESP_OK + } + s_i2c_bus[port].is_init = false; + ESP_LOGI(TAG, "i2c%d bus deinited", port); + return ESP_OK; +} + +/** + * @brief compare with active i2c_bus configuration + * + * @param port choose which i2c_port's configuration will be compared + * @param conf new configuration + * @return true new configuration is equal to active configuration + * @return false new configuration is not equal to active configuration + */ +inline static bool i2c_config_compare(i2c_port_t port, const i2c_config_t *conf) +{ + if (s_i2c_bus[port].conf_active.master.clk_speed == conf->master.clk_speed + && s_i2c_bus[port].conf_active.sda_io_num == conf->sda_io_num + && s_i2c_bus[port].conf_active.scl_io_num == conf->scl_io_num + && s_i2c_bus[port].conf_active.scl_pullup_en == conf->scl_pullup_en + && s_i2c_bus[port].conf_active.sda_pullup_en == conf->sda_pullup_en) { + return true; + } + + return false; +} diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/i2c_bus_soft.c b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/i2c_bus_soft.c new file mode 100644 index 000000000..fb5298779 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/i2c_bus_soft.c @@ -0,0 +1,319 @@ +/* + * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "esp_err.h" +#include "esp_check.h" +#include "i2c_bus_soft.h" +#include "driver/gpio.h" + +static const char*TAG = "i2c_bus_soft"; + +static esp_err_t i2c_master_soft_bus_wait_ack(i2c_master_soft_bus_handle_t bus_handle) +{ + esp_rom_delay_us(bus_handle->time_delay_us); + ESP_RETURN_ON_ERROR(gpio_set_level(bus_handle->scl_io, 1), TAG, "Failed to set SCL high"); + esp_rom_delay_us(bus_handle->time_delay_us); + + bool ack = !gpio_get_level(bus_handle->sda_io); /*!< SDA should be low for ACK */ + ESP_RETURN_ON_ERROR(gpio_set_level(bus_handle->scl_io, 0), TAG, "Failed to set SCL low"); + esp_rom_delay_us(bus_handle->time_delay_us); + + return ack ? ESP_OK : ESP_ERR_NOT_FOUND; +} + +static esp_err_t i2c_master_soft_bus_send_ack(i2c_master_soft_bus_handle_t bus_handle, bool ack) +{ + ESP_RETURN_ON_ERROR(gpio_set_level(bus_handle->sda_io, ack ? 0 : 1), TAG, "Failed to set SDA for ACK/NACK"); /*!< Set SDA line to ACK (low) or NACK (high) */ + + // Generate clock pulse for ACK/NACK + ESP_RETURN_ON_ERROR(gpio_set_level(bus_handle->scl_io, 1), TAG, "Failed to set SCL high during ACK/NACK"); + esp_rom_delay_us(bus_handle->time_delay_us); + ESP_RETURN_ON_ERROR(gpio_set_level(bus_handle->scl_io, 0), TAG, "Failed to set SCL low after ACK/NACK"); + esp_rom_delay_us(bus_handle->time_delay_us); + + return ESP_OK; +} + +static esp_err_t i2c_master_soft_bus_start(i2c_master_soft_bus_handle_t bus_handle) +{ + ESP_RETURN_ON_ERROR(gpio_set_level(bus_handle->scl_io, 1), TAG, "Failed to set SCL high"); + ESP_RETURN_ON_ERROR(gpio_set_level(bus_handle->sda_io, 1), TAG, "Failed to set SDA high"); + esp_rom_delay_us(bus_handle->time_delay_us); + ESP_RETURN_ON_ERROR(gpio_set_level(bus_handle->sda_io, 0), TAG, "Failed to set SDA low"); + esp_rom_delay_us(bus_handle->time_delay_us); + ESP_RETURN_ON_ERROR(gpio_set_level(bus_handle->scl_io, 0), TAG, "Failed to set SCL low"); + esp_rom_delay_us(bus_handle->time_delay_us); + return ESP_OK; +} + +static esp_err_t i2c_master_soft_bus_stop(i2c_master_soft_bus_handle_t bus_handle) +{ + ESP_RETURN_ON_ERROR(gpio_set_level(bus_handle->sda_io, 0), TAG, "Failed to set SDA low"); + ESP_RETURN_ON_ERROR(gpio_set_level(bus_handle->scl_io, 1), TAG, "Failed to set SCL high"); + esp_rom_delay_us(bus_handle->time_delay_us); + ESP_RETURN_ON_ERROR(gpio_set_level(bus_handle->sda_io, 1), TAG, "Failed to set SDA high"); + return ESP_OK; +} + +static esp_err_t i2c_master_soft_bus_write_byte(i2c_master_soft_bus_handle_t bus_handle, uint8_t byte) +{ + for (int i = 0; i < 8; i++) { + if (byte & 0x80) { + ESP_RETURN_ON_ERROR(gpio_set_level(bus_handle->sda_io, 1), TAG, "Failed to set SDA high"); + } else { + ESP_RETURN_ON_ERROR(gpio_set_level(bus_handle->sda_io, 0), TAG, "Failed to set SDA low"); + } + esp_rom_delay_us(bus_handle->time_delay_us); + ESP_RETURN_ON_ERROR(gpio_set_level(bus_handle->scl_io, 1), TAG, "Failed to set SCL high"); + esp_rom_delay_us(bus_handle->time_delay_us); + ESP_RETURN_ON_ERROR(gpio_set_level(bus_handle->scl_io, 0), TAG, "Failed to set SCL low"); + + if (i == 7) { + ESP_RETURN_ON_ERROR(gpio_set_level(bus_handle->sda_io, 1), TAG, "Failed to release SDA"); /*!< Release SDA */ + } + + byte <<= 1; + } + return ESP_OK; +} + +static esp_err_t i2c_master_soft_bus_read_byte(i2c_master_soft_bus_handle_t bus_handle, uint8_t *byte) +{ + uint8_t value = 0; + ESP_RETURN_ON_ERROR(gpio_set_level(bus_handle->sda_io, 1), TAG, "Failed to release SDA"); /*!< First release SDA */ + for (int i = 0; i < 8; i++) { + value <<= 1; + ESP_RETURN_ON_ERROR(gpio_set_level(bus_handle->scl_io, 1), TAG, "Failed to set SCL high"); + esp_rom_delay_us(bus_handle->time_delay_us); + + if (gpio_get_level(bus_handle->sda_io)) { + value ++; + } + ESP_RETURN_ON_ERROR(gpio_set_level(bus_handle->scl_io, 0), TAG, "Failed to set SCL low"); + esp_rom_delay_us(bus_handle->time_delay_us); + } + + *byte = value; + return ESP_OK; +} + +esp_err_t i2c_master_soft_bus_write_reg8(i2c_master_soft_bus_handle_t bus_handle, uint8_t dev_addr, uint8_t mem_address, size_t data_len, const uint8_t *data) +{ + ESP_RETURN_ON_FALSE(bus_handle, ESP_ERR_INVALID_ARG, TAG, "Invalid I2C bus handle"); + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_start(bus_handle), TAG, "Failed to initiate start signal"); + + // Send device address with write bit (0) + uint8_t address_byte = (dev_addr << 1) | 0; + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_write_byte(bus_handle, address_byte), TAG, "Failed to write device address"); + + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_wait_ack(bus_handle), TAG, "No ACK for device address"); + +#if !CONFIG_I2C_BUS_REMOVE_NULL_MEM_ADDR + if (mem_address != NULL_I2C_MEM_ADDR) { +#endif + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_write_byte(bus_handle, mem_address), TAG, "Failed to write memory address"); + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_wait_ack(bus_handle), TAG, "No ACK for device address"); +#if !CONFIG_I2C_BUS_REMOVE_NULL_MEM_ADDR + } +#endif + // Write data + for (size_t i = 0; i < data_len; i++) { + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_write_byte(bus_handle, data[i]), TAG, "Failed to write data byte"); + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_wait_ack(bus_handle), TAG, "No ACK for data byte"); + } + + // Generate STOP condition + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_stop(bus_handle), TAG, "Failed to initiate stop signal"); + return ESP_OK; +} + +esp_err_t i2c_master_soft_bus_write_reg16(i2c_master_soft_bus_handle_t bus_handle, uint8_t dev_addr, uint16_t mem_address, size_t data_len, const uint8_t *data) +{ + ESP_RETURN_ON_FALSE(bus_handle, ESP_ERR_INVALID_ARG, TAG, "Invalid I2C bus handle"); + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_start(bus_handle), TAG, "Failed to initiate start signal"); + + // Send device address with write bit (0) + uint8_t address_byte = (dev_addr << 1) | 0; + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_write_byte(bus_handle, address_byte), TAG, "Failed to write device address"); + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_wait_ack(bus_handle), TAG, "No ACK for device address"); + +#if !CONFIG_I2C_BUS_REMOVE_NULL_MEM_ADDR + if (mem_address != NULL_I2C_MEM_16BIT_ADDR) { +#endif + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_write_byte(bus_handle, (uint8_t)((mem_address >> 8) & 0x00FF)), TAG, "Failed to write memory address"); + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_wait_ack(bus_handle), TAG, "No ACK for mem address"); + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_write_byte(bus_handle, (uint8_t)(mem_address & 0x00FF)), TAG, "Failed to write memory address"); + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_wait_ack(bus_handle), TAG, "No ACK for mem address"); +#if !CONFIG_I2C_BUS_REMOVE_NULL_MEM_ADDR + } +#endif + + // Write data + for (size_t i = 0; i < data_len; i++) { + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_write_byte(bus_handle, data[i]), TAG, "Failed to write data byte"); + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_wait_ack(bus_handle), TAG, "No ACK for data byte"); + } + + // Generate STOP condition + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_stop(bus_handle), TAG, "Failed to initiate stop signal"); + return ESP_OK; +} + +esp_err_t i2c_master_soft_bus_read_reg8(i2c_master_soft_bus_handle_t bus_handle, uint8_t dev_addr, uint8_t mem_address, size_t data_len, uint8_t *data) +{ + ESP_RETURN_ON_FALSE(bus_handle, ESP_ERR_INVALID_ARG, TAG, "Invalid I2C bus handle"); + + // Send memory address +#if !CONFIG_I2C_BUS_REMOVE_NULL_MEM_ADDR + if (mem_address != NULL_I2C_MEM_ADDR) { +#endif + // Generate START condition + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_start(bus_handle), TAG, "Failed to initiate start signal"); + + // Send device address with write bit (0) to write the memory address + uint8_t write_address_byte = (dev_addr << 1) | 0; + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_write_byte(bus_handle, write_address_byte), TAG, "Failed to write device address"); + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_wait_ack(bus_handle), TAG, "No ACK for device address"); + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_write_byte(bus_handle, mem_address), TAG, "Failed to write memory address"); + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_wait_ack(bus_handle), TAG, "No ACK for mem address"); +#if !CONFIG_I2C_BUS_REMOVE_NULL_MEM_ADDR + } +#endif + + // Generate RESTART condition + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_start(bus_handle), TAG, "Failed to initiate repeated start signal"); + + // Send device address with read bit (1) + uint8_t read_address_byte = (dev_addr << 1) | 1; + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_write_byte(bus_handle, read_address_byte), TAG, "Failed to write device address with read bit"); + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_wait_ack(bus_handle), TAG, "No ACK for device address"); + + // Read data bytes + for (size_t i = 0; i < data_len; i++) { + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_read_byte(bus_handle, &data[i]), TAG, "Failed to read data byte"); + + // Send ACK for all but the last byte + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_send_ack(bus_handle, i != data_len - 1), TAG, "Failed to send ACK/NACK"); + } + + // Generate STOP condition + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_stop(bus_handle), TAG, "Failed to initiate stop signal"); + + return ESP_OK; +} + +esp_err_t i2c_master_soft_bus_read_reg16(i2c_master_soft_bus_handle_t bus_handle, uint8_t dev_addr, uint16_t mem_address, size_t data_len, uint8_t *data) +{ + ESP_RETURN_ON_FALSE(bus_handle, ESP_ERR_INVALID_ARG, TAG, "Invalid I2C bus handle"); + + // Send memory address +#if !CONFIG_I2C_BUS_REMOVE_NULL_MEM_ADDR + if (mem_address != NULL_I2C_MEM_16BIT_ADDR) { +#endif + // Generate START condition + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_start(bus_handle), TAG, "Failed to initiate start signal"); + + // Send device address with write bit (0) to write the memory address + uint8_t write_address_byte = (dev_addr << 1) | 0; + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_write_byte(bus_handle, write_address_byte), TAG, "Failed to write device address"); + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_wait_ack(bus_handle), TAG, "No ACK for device address"); + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_write_byte(bus_handle, (uint8_t)((mem_address >> 8) & 0x00FF)), TAG, "Failed to write memory address"); + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_wait_ack(bus_handle), TAG, "No ACK for mem address"); + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_write_byte(bus_handle, (uint8_t)(mem_address & 0x00FF)), TAG, "Failed to write memory address"); + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_wait_ack(bus_handle), TAG, "No ACK for mem address"); +#if !CONFIG_I2C_BUS_REMOVE_NULL_MEM_ADDR + } +#endif + + // Generate RESTART condition + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_start(bus_handle), TAG, "Failed to initiate repeated start signal"); + + // Send device address with read bit (1) + uint8_t read_address_byte = (dev_addr << 1) | 1; + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_write_byte(bus_handle, read_address_byte), TAG, "Failed to write device address with read bit"); + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_wait_ack(bus_handle), TAG, "No ACK for device address during read"); + + // Read data bytes + for (size_t i = 0; i < data_len; i++) { + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_read_byte(bus_handle, &data[i]), TAG, "Failed to read data byte"); + + // Send ACK for all but the last byte + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_send_ack(bus_handle, i != data_len - 1), TAG, "Failed to send ACK/NACK"); + } + + // Generate STOP condition + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_stop(bus_handle), TAG, "Failed to initiate stop signal"); + return ESP_OK; +} + +esp_err_t i2c_master_soft_bus_probe(i2c_master_soft_bus_handle_t bus_handle, uint8_t address) +{ + ESP_RETURN_ON_FALSE(bus_handle, ESP_ERR_INVALID_ARG, TAG, "Invalid I2C bus handle"); + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_start(bus_handle), TAG, "Failed to initiate start signal"); + + // Send device address with write bit (0) + uint8_t address_byte = (address << 1) | 0; + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_write_byte(bus_handle, address_byte), TAG, "Failed to write address byte"); + + // Wait for ACK + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_wait_ack(bus_handle), TAG, "Failed to wait for ACK"); + + // Generate STOP condition + ESP_RETURN_ON_ERROR(i2c_master_soft_bus_stop(bus_handle), TAG, "Failed to initiate stop signal"); + return ESP_OK; +} + +esp_err_t i2c_new_master_soft_bus(const i2c_config_t *conf, i2c_master_soft_bus_handle_t *ret_soft_bus_handle) +{ + esp_err_t ret = ESP_OK; + ESP_RETURN_ON_FALSE(GPIO_IS_VALID_GPIO(conf->scl_io_num) && GPIO_IS_VALID_GPIO(conf->sda_io_num), ESP_ERR_INVALID_ARG, TAG, "Invalid SDA/SCL pin number"); + ESP_RETURN_ON_FALSE(conf->master.clk_speed > 0, ESP_ERR_INVALID_ARG, TAG, "Invalid scl frequency"); + + gpio_config_t scl_io_conf = { + .mode = GPIO_MODE_OUTPUT_OD, + .pull_up_en = conf->scl_pullup_en, + .intr_type = GPIO_INTR_DISABLE, + .pull_down_en = GPIO_PULLDOWN_DISABLE, + .pin_bit_mask = (1ULL << conf->scl_io_num), + }; + ESP_RETURN_ON_ERROR(gpio_config(&scl_io_conf), TAG, "Failed to configure scl gpio"); + + gpio_config_t sda_io_conf = { + .mode = GPIO_MODE_INPUT_OUTPUT_OD, + .pull_up_en = conf->sda_pullup_en, + .intr_type = GPIO_INTR_DISABLE, + .pull_down_en = GPIO_PULLDOWN_DISABLE, + .pin_bit_mask = (1ULL << conf->sda_io_num), + }; + ESP_RETURN_ON_ERROR(gpio_config(&sda_io_conf), TAG, "Failed to configure sda gpio"); + + i2c_master_soft_bus_handle_t soft_bus_handle = calloc(1, sizeof(struct i2c_master_soft_bus_t)); + if (soft_bus_handle == NULL) { + ESP_LOGE(TAG, "Failed to allocate soft bus handle"); + return ESP_ERR_NO_MEM; + } + + soft_bus_handle->scl_io = conf->scl_io_num; + soft_bus_handle->sda_io = conf->sda_io_num; + soft_bus_handle->time_delay_us = (uint32_t)((1e6f / conf->master.clk_speed) / 2.0f + 0.5f); + *ret_soft_bus_handle = soft_bus_handle; + + return ret; +} + +esp_err_t i2c_master_soft_bus_change_frequency(i2c_master_soft_bus_handle_t bus_handle, uint32_t frequency) +{ + ESP_RETURN_ON_FALSE(bus_handle, ESP_ERR_INVALID_ARG, TAG, "Invalid I2C bus handle"); + ESP_RETURN_ON_FALSE(frequency > 0, ESP_ERR_INVALID_ARG, TAG, "Invalid scl frequency"); + bus_handle->time_delay_us = (uint32_t)((1e6f / frequency) / 2.0f + 0.5f); + return ESP_OK; +} + +esp_err_t i2c_del_master_soft_bus(i2c_master_soft_bus_handle_t bus_handle) +{ + ESP_RETURN_ON_FALSE(bus_handle, ESP_ERR_INVALID_ARG, TAG, "no memory for i2c master soft bus"); + free(bus_handle); + return ESP_OK; +} diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/i2c_bus_v2.c b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/i2c_bus_v2.c new file mode 100644 index 000000000..aa3d814b8 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/i2c_bus_v2.c @@ -0,0 +1,608 @@ +/* + * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include + +#include "freertos/FreeRTOS.h" +#include "freertos/semphr.h" + +#include "esp_log.h" +#include "i2c_bus.h" +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE +#include "i2c_bus_soft.h" +#endif + +#define I2C_ACK_CHECK_EN 0x1 /*!< I2C master will check ack from slave*/ +#define I2C_ACK_CHECK_DIS 0x0 /*!< I2C master will not check ack from slave */ +#define I2C_BUS_FLG_DEFAULT (0) +#define I2C_BUS_MASTER_BUF_LEN (0) +#define I2C_BUS_MS_TO_WAIT CONFIG_I2C_MS_TO_WAIT +#define I2C_BUS_TICKS_TO_WAIT (I2C_BUS_MS_TO_WAIT/portTICK_PERIOD_MS) +#define I2C_BUS_MUTEX_TICKS_TO_WAIT (I2C_BUS_MS_TO_WAIT/portTICK_PERIOD_MS) + +typedef struct { + i2c_master_bus_config_t bus_config; /*!< I2C master bus specific configurations */ + i2c_master_bus_handle_t bus_handle; /*!< I2C master bus handle */ + i2c_device_config_t device_config; /*!< I2C device configuration, in order to get the frequency information of I2C */ +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE + i2c_master_soft_bus_handle_t soft_bus_handle; /*!< I2C master soft bus handle */ +#endif + bool is_init; /*!< if bus is initialized */ + i2c_config_t conf_activate; /*!< I2C active configuration */ + SemaphoreHandle_t mutex; /*!< mutex to achieve thread-safe */ + int32_t ref_counter; /*!< reference count */ +} i2c_bus_t; + +typedef struct { + i2c_device_config_t device_config; /*!< I2C device configuration */ + i2c_master_dev_handle_t dev_handle; /*!< I2C master bus device handle */ + i2c_device_config_t conf; /*!< I2C active configuration */ + i2c_bus_t *i2c_bus; /*!< I2C bus */ +} i2c_bus_device_t; + +static const char *TAG = "i2c_bus"; + +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE +static i2c_bus_t s_i2c_bus[I2C_NUM_SW_MAX]; /*!< If software I2C is enabled, additional space is required to store the port. */ +#else +static i2c_bus_t s_i2c_bus[I2C_NUM_MAX]; +#endif + +#define I2C_BUS_CHECK(a, str, ret) if(!(a)) { \ + ESP_LOGE(TAG,"%s:%d (%s):%s", __FILE__, __LINE__, __FUNCTION__, str); \ + return (ret); \ + } + +#define I2C_BUS_CHECK_GOTO(a, str, label) if(!(a)) { \ + ESP_LOGE(TAG,"%s:%d (%s):%s", __FILE__, __LINE__, __FUNCTION__, str); \ + goto label; \ + } + +#define I2C_BUS_INIT_CHECK(is_init, ret) if(!is_init) { \ + ESP_LOGE(TAG,"%s:%d (%s):i2c_bus has not inited", __FILE__, __LINE__, __FUNCTION__); \ + return (ret); \ + } + +#define I2C_BUS_MUTEX_TAKE(mutex, ret) if (!xSemaphoreTake(mutex, I2C_BUS_MUTEX_TICKS_TO_WAIT)) { \ + ESP_LOGE(TAG, "i2c_bus take mutex timeout, max wait = %"PRIu32"ms", I2C_BUS_MUTEX_TICKS_TO_WAIT); \ + return (ret); \ + } + +#define I2C_BUS_MUTEX_TAKE_MAX_DELAY(mutex, ret) if (!xSemaphoreTake(mutex, portMAX_DELAY)) { \ + ESP_LOGE(TAG, "i2c_bus take mutex timeout, max wait = %"PRIu32"ms", portMAX_DELAY); \ + return (ret); \ + } + +#define I2C_BUS_MUTEX_GIVE(mutex, ret) if (!xSemaphoreGive(mutex)) { \ + ESP_LOGE(TAG, "i2c_bus give mutex failed"); \ + return (ret); \ + } + +static esp_err_t i2c_driver_reinit(i2c_port_t port, const i2c_config_t *conf); +static esp_err_t i2c_driver_deinit(i2c_port_t port); +static esp_err_t i2c_bus_write_reg8(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, size_t data_len, const uint8_t *data); +static esp_err_t i2c_bus_read_reg8(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, size_t data_len, uint8_t *data); +inline static bool i2c_config_compare(i2c_port_t port, const i2c_config_t *conf); +/**************************************** Public Functions (Application level)*********************************************/ + +i2c_bus_handle_t i2c_bus_create(i2c_port_t port, const i2c_config_t *conf) +{ +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE + I2C_BUS_CHECK(((i2c_sw_port_t)port < I2C_NUM_SW_MAX) || (port == I2C_NUM_MAX), "I2C port error", NULL); +#else + I2C_BUS_CHECK(port < I2C_NUM_MAX, "I2C port error", NULL); +#endif + I2C_BUS_CHECK(conf != NULL, "pointer = NULL error", NULL); + I2C_BUS_CHECK(conf->mode == I2C_MODE_MASTER, "i2c_bus only supports master mode", NULL); + + if (i2c_master_get_bus_handle(port, &s_i2c_bus[port].bus_handle) == ESP_OK) { + s_i2c_bus[port].is_init = true; + s_i2c_bus[port].conf_activate = *conf; + s_i2c_bus[port].bus_config.i2c_port = port; + s_i2c_bus[port].device_config.scl_speed_hz = conf->master.clk_speed; + s_i2c_bus[port].mutex = xSemaphoreCreateMutex(); + I2C_BUS_CHECK(s_i2c_bus[port].mutex != NULL, "i2c_bus xSemaphoreCreateMutex failed", NULL); + s_i2c_bus[port].ref_counter = 0; + ESP_LOGI(TAG, "I2C Bus V2 uses the externally initialized bus handle"); + return (i2c_bus_handle_t)&s_i2c_bus[port]; + } + + if (s_i2c_bus[port].is_init) { + // if i2c_bus has been inited and configs not changed, return the handle directly + if (i2c_config_compare(port, conf)) { + ESP_LOGW(TAG, "i2c%d has been inited, return handle directly, ref_counter=%"PRIi32"", port, s_i2c_bus[port].ref_counter); + return (i2c_bus_handle_t)&s_i2c_bus[port]; + } + } else { + s_i2c_bus[port].mutex = xSemaphoreCreateMutex(); + I2C_BUS_CHECK(s_i2c_bus[port].mutex != NULL, "i2c_bus xSemaphoreCreateMutex failed", NULL); + s_i2c_bus[port].ref_counter = 0; + } + + esp_err_t ret = i2c_driver_reinit(port, conf); /*!< Reconfigure the I2C parameters and initialise the bus. */ + I2C_BUS_CHECK(ret == ESP_OK, "init error", NULL); + s_i2c_bus[port].conf_activate = *conf; + s_i2c_bus[port].bus_config.i2c_port = port; + s_i2c_bus[port].device_config.scl_speed_hz = conf->master.clk_speed; /*!< Stores the frequency configured in the bus, overrides the value if the device has a separate frequency */ + ESP_LOGI(TAG, "I2C Bus V2 Config Succeed, Version: %d.%d.%d", I2C_BUS_VER_MAJOR, I2C_BUS_VER_MINOR, I2C_BUS_VER_PATCH); + return (i2c_bus_handle_t)&s_i2c_bus[port]; +} + +esp_err_t i2c_bus_delete(i2c_bus_handle_t *p_bus) +{ + I2C_BUS_CHECK(p_bus != NULL && *p_bus != NULL, "pointer = NULL error", ESP_ERR_INVALID_ARG); + i2c_bus_t *i2c_bus = (i2c_bus_t *)(*p_bus); + I2C_BUS_INIT_CHECK(i2c_bus->is_init, ESP_FAIL); + I2C_BUS_MUTEX_TAKE_MAX_DELAY(i2c_bus->mutex, ESP_ERR_TIMEOUT); + + // if ref_counter == 0, de-init the bus + if ((i2c_bus->ref_counter) > 0) { + ESP_LOGW(TAG, "i2c%d is also handled by others ref_counter=%"PRIi32", won't be de-inited", i2c_bus->bus_config.i2c_port, i2c_bus->ref_counter); + return ESP_OK; + } + + esp_err_t ret = i2c_driver_deinit(i2c_bus->bus_config.i2c_port); + I2C_BUS_CHECK(ret == ESP_OK, "deinit error", ret); + vSemaphoreDelete(i2c_bus->mutex); + *p_bus = NULL; + return ESP_OK; +} + +i2c_master_bus_handle_t i2c_bus_get_internal_bus_handle(i2c_bus_handle_t bus_handle) +{ + I2C_BUS_CHECK(bus_handle != NULL, "Null Bus Handle", NULL); + i2c_bus_t *i2c_bus = (i2c_bus_t *)bus_handle; + I2C_BUS_INIT_CHECK(i2c_bus->is_init, NULL); + return i2c_bus->bus_handle; +} + +uint32_t i2c_bus_get_current_clk_speed(i2c_bus_handle_t bus_handle) +{ + I2C_BUS_CHECK(bus_handle != NULL, "Null Bus Handle", 0); + i2c_bus_t *i2c_bus = (i2c_bus_t *)bus_handle; + I2C_BUS_INIT_CHECK(i2c_bus->is_init, 0); + return i2c_bus->conf_activate.master.clk_speed; +} + +uint8_t i2c_bus_get_created_device_num(i2c_bus_handle_t bus_handle) +{ + I2C_BUS_CHECK(bus_handle != NULL, "Null Bus Handle", 0); + i2c_bus_t *i2c_bus = (i2c_bus_t *)bus_handle; + I2C_BUS_INIT_CHECK(i2c_bus->is_init, 0); + return i2c_bus->ref_counter; +} + +i2c_bus_device_handle_t i2c_bus_device_create(i2c_bus_handle_t bus_handle, uint8_t dev_addr, uint32_t clk_speed) +{ + I2C_BUS_CHECK(bus_handle != NULL, "Null Bus Handle", NULL); + I2C_BUS_CHECK(clk_speed <= 400000, "clk_speed must <= 400000", NULL); + i2c_bus_t *i2c_bus = (i2c_bus_t *)bus_handle; + I2C_BUS_INIT_CHECK(i2c_bus->is_init, NULL); + i2c_bus_device_t *i2c_device = calloc(1, sizeof(i2c_bus_device_t)); + I2C_BUS_CHECK(i2c_device != NULL, "calloc memory failed", NULL); + I2C_BUS_MUTEX_TAKE_MAX_DELAY(i2c_bus->mutex, NULL); + i2c_device->device_config.device_address = dev_addr; + i2c_device->device_config.dev_addr_length = I2C_ADDR_BIT_LEN_7; + i2c_device->device_config.scl_speed_hz = i2c_bus->device_config.scl_speed_hz; /*!< Transfer the frequency information in the bus to the device. */ + i2c_device->device_config.flags.disable_ack_check = i2c_bus->device_config.flags.disable_ack_check; /*!< Transfer the ack check in the bus to the device. */ + + if (clk_speed != 0) { + i2c_device->device_config.scl_speed_hz = clk_speed; + } + +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE + // For software I2C, it is only necessary to save the device configuration. + if (i2c_bus->bus_config.i2c_port < I2C_NUM_MAX) +#endif + { + esp_err_t ret = i2c_master_bus_add_device(i2c_bus->bus_handle, &i2c_device->device_config, &i2c_device->dev_handle); + I2C_BUS_CHECK(ret == ESP_OK, "add device error", NULL); + } + i2c_device->i2c_bus = i2c_bus; + i2c_bus->ref_counter++; + I2C_BUS_MUTEX_GIVE(i2c_bus->mutex, NULL); + return (i2c_bus_device_handle_t)i2c_device; +} + +esp_err_t i2c_bus_device_delete(i2c_bus_device_handle_t *p_dev_handle) +{ + I2C_BUS_CHECK(p_dev_handle != NULL && *p_dev_handle != NULL, "Null Device Handle", ESP_ERR_INVALID_ARG); + i2c_bus_device_t *i2c_device = (i2c_bus_device_t *)(*p_dev_handle); + +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE + if (i2c_device->i2c_bus->bus_config.i2c_port < I2C_NUM_MAX) +#endif + { + esp_err_t ret = i2c_master_bus_rm_device(i2c_device->dev_handle); + I2C_BUS_CHECK(ret == ESP_OK, "remove device error", ret); + } + I2C_BUS_MUTEX_TAKE_MAX_DELAY(i2c_device->i2c_bus->mutex, ESP_ERR_TIMEOUT); + i2c_device->i2c_bus->ref_counter--; /*!< ref_counter is reduced only when the device is removed successfully. */ + I2C_BUS_MUTEX_GIVE(i2c_device->i2c_bus->mutex, ESP_FAIL); + free(i2c_device); + *p_dev_handle = NULL; + return ESP_OK; +} + +uint8_t i2c_bus_scan(i2c_bus_handle_t bus_handle, uint8_t *buf, uint8_t num) +{ + I2C_BUS_CHECK(bus_handle != NULL, "Handle error", 0); + i2c_bus_t *i2c_bus = (i2c_bus_t *)bus_handle; + I2C_BUS_INIT_CHECK(i2c_bus->is_init, 0); + uint8_t device_count = 0; + esp_err_t ret = ESP_OK; + I2C_BUS_MUTEX_TAKE_MAX_DELAY(i2c_bus->mutex, 0); + + for (uint8_t dev_address = 1; dev_address < 127; dev_address++) { +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE + if (i2c_bus->bus_config.i2c_port > I2C_NUM_MAX) { + ret = i2c_master_soft_bus_probe(i2c_bus->soft_bus_handle, dev_address); + } else +#endif + { + ret = i2c_master_probe(i2c_bus->bus_handle, dev_address, I2C_BUS_TICKS_TO_WAIT); + } + if (ret == ESP_OK) { + ESP_LOGI(TAG, "found i2c device address = 0x%02x", dev_address); + if (buf != NULL && device_count < num) { + *(buf + device_count) = dev_address; + } + device_count++; + } + } + I2C_BUS_MUTEX_GIVE(i2c_bus->mutex, 0); + return device_count; +} + +uint8_t i2c_bus_device_get_address(i2c_bus_device_handle_t dev_handle) +{ + I2C_BUS_CHECK(dev_handle != NULL, "device handle error", NULL_I2C_DEV_ADDR); + i2c_bus_device_t *i2c_device = (i2c_bus_device_t *)dev_handle; + return i2c_device->device_config.device_address; +} + +esp_err_t i2c_bus_read_bytes(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, size_t data_len, uint8_t *data) +{ + return i2c_bus_read_reg8(dev_handle, mem_address, data_len, data); +} + +esp_err_t i2c_bus_read_byte(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, uint8_t *data) +{ + return i2c_bus_read_reg8(dev_handle, mem_address, 1, data); +} + +esp_err_t i2c_bus_read_bit(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, uint8_t bit_num, uint8_t *data) +{ + uint8_t byte = 0; + esp_err_t ret = i2c_bus_read_reg8(dev_handle, mem_address, 1, &byte); + *data = byte & (1 << bit_num); + *data = (*data != 0) ? 1 : 0; + return ret; +} + +esp_err_t i2c_bus_read_bits(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, uint8_t bit_start, uint8_t length, uint8_t *data) +{ + uint8_t byte = 0; + esp_err_t ret = i2c_bus_read_byte(dev_handle, mem_address, &byte); + + if (ret != ESP_OK) { + return ret; + } + + uint8_t mask = ((1 << length) - 1) << (bit_start - length + 1); + byte &= mask; + byte >>= (bit_start - length + 1); + *data = byte; + return ret; +} + +esp_err_t i2c_bus_write_byte(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, uint8_t data) +{ + return i2c_bus_write_reg8(dev_handle, mem_address, 1, &data); +} + +esp_err_t i2c_bus_write_bytes(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, size_t data_len, const uint8_t *data) +{ + return i2c_bus_write_reg8(dev_handle, mem_address, data_len, data); +} + +esp_err_t i2c_bus_write_bit(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, uint8_t bit_num, uint8_t data) +{ + uint8_t byte = 0; + esp_err_t ret = i2c_bus_read_byte(dev_handle, mem_address, &byte); + + if (ret != ESP_OK) { + return ret; + } + + byte = (data != 0) ? (byte | (1 << bit_num)) : (byte & ~(1 << bit_num)); + return i2c_bus_write_byte(dev_handle, mem_address, byte); +} + +esp_err_t i2c_bus_write_bits(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, uint8_t bit_start, uint8_t length, uint8_t data) +{ + uint8_t byte = 0; + esp_err_t ret = i2c_bus_read_byte(dev_handle, mem_address, &byte); + + if (ret != ESP_OK) { + return ret; + } + + uint8_t mask = ((1 << length) - 1) << (bit_start - length + 1); + data <<= (bit_start - length + 1); // shift data into correct position + data &= mask; // zero all non-important bits in data + byte &= ~(mask); // zero all important bits in existing byte + byte |= data; // combine data with existing byte + return i2c_bus_write_byte(dev_handle, mem_address, byte); +} + +/**************************************** Public Functions (Low level)*********************************************/ + +static esp_err_t i2c_bus_read_reg8(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, size_t data_len, uint8_t *data) +{ + I2C_BUS_CHECK(dev_handle != NULL, "device handle error", ESP_ERR_INVALID_ARG); + I2C_BUS_CHECK(data != NULL, "data pointer error", ESP_ERR_INVALID_ARG); + i2c_bus_device_t *i2c_device = (i2c_bus_device_t *)dev_handle; + I2C_BUS_INIT_CHECK(i2c_device->i2c_bus->is_init, ESP_ERR_INVALID_STATE); + I2C_BUS_MUTEX_TAKE(i2c_device->i2c_bus->mutex, ESP_ERR_TIMEOUT); + esp_err_t ret = ESP_FAIL; + +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE + // Need to distinguish between hardware I2C and software I2C via port + if (i2c_device->i2c_bus->bus_config.i2c_port > I2C_NUM_MAX) { + ret = i2c_master_soft_bus_change_frequency(i2c_device->i2c_bus->soft_bus_handle, i2c_device->device_config.scl_speed_hz); + ret = i2c_master_soft_bus_read_reg8(i2c_device->i2c_bus->soft_bus_handle, i2c_device->device_config.device_address, mem_address, data_len, data); + } else +#endif + { +#if !CONFIG_I2C_BUS_REMOVE_NULL_MEM_ADDR + if (mem_address != NULL_I2C_MEM_ADDR) { +#endif + ret = i2c_master_transmit_receive(i2c_device->dev_handle, &mem_address, 1, data, data_len, I2C_BUS_TICKS_TO_WAIT); +#if !CONFIG_I2C_BUS_REMOVE_NULL_MEM_ADDR + } else { + ESP_LOGD(TAG, "register address 0x%X is skipped and will not be sent", NULL_I2C_MEM_ADDR); + ret = i2c_master_receive(i2c_device->dev_handle, data, data_len, I2C_BUS_TICKS_TO_WAIT); + } +#endif + } + I2C_BUS_MUTEX_GIVE(i2c_device->i2c_bus->mutex, ESP_FAIL); + return ret; +} + +esp_err_t i2c_bus_read_reg16(i2c_bus_device_handle_t dev_handle, uint16_t mem_address, size_t data_len, uint8_t *data) +{ + I2C_BUS_CHECK(dev_handle != NULL, "device handle error", ESP_ERR_INVALID_ARG); + I2C_BUS_CHECK(data != NULL, "data pointer error", ESP_ERR_INVALID_ARG); + i2c_bus_device_t *i2c_device = (i2c_bus_device_t *)dev_handle; + I2C_BUS_INIT_CHECK(i2c_device->i2c_bus->is_init, ESP_ERR_INVALID_STATE); + esp_err_t ret = ESP_FAIL; + uint8_t memAddress8[2]; + memAddress8[0] = (uint8_t)((mem_address >> 8) & 0x00FF); + memAddress8[1] = (uint8_t)(mem_address & 0x00FF); + I2C_BUS_MUTEX_TAKE(i2c_device->i2c_bus->mutex, ESP_ERR_TIMEOUT); + +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE + // Need to distinguish between hardware I2C and software I2C via port + if (i2c_device->i2c_bus->bus_config.i2c_port > I2C_NUM_MAX) { + ret = i2c_master_soft_bus_change_frequency(i2c_device->i2c_bus->soft_bus_handle, i2c_device->device_config.scl_speed_hz); + ret = i2c_master_soft_bus_read_reg16(i2c_device->i2c_bus->soft_bus_handle, i2c_device->device_config.device_address, mem_address, data_len, data); + } else +#endif + { +#if !CONFIG_I2C_BUS_REMOVE_NULL_MEM_ADDR + if (mem_address != NULL_I2C_MEM_16BIT_ADDR) { +#endif + ret = i2c_master_transmit_receive(i2c_device->dev_handle, memAddress8, 2, data, data_len, I2C_BUS_TICKS_TO_WAIT); +#if !CONFIG_I2C_BUS_REMOVE_NULL_MEM_ADDR + } else { + ESP_LOGD(TAG, "register address 0x%X is skipped and will not be sent", NULL_I2C_MEM_16BIT_ADDR); + ret = i2c_master_receive(i2c_device->dev_handle, data, data_len, I2C_BUS_TICKS_TO_WAIT); + } +#endif + } + I2C_BUS_MUTEX_GIVE(i2c_device->i2c_bus->mutex, ESP_FAIL); + return ret; +} + +static esp_err_t i2c_bus_write_reg8(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, size_t data_len, const uint8_t *data) +{ + I2C_BUS_CHECK(dev_handle != NULL, "device handle error", ESP_ERR_INVALID_ARG); + I2C_BUS_CHECK(data != NULL, "data pointer error", ESP_ERR_INVALID_ARG); + i2c_bus_device_t *i2c_device = (i2c_bus_device_t *)dev_handle; + I2C_BUS_INIT_CHECK(i2c_device->i2c_bus->is_init, ESP_ERR_INVALID_STATE); + I2C_BUS_MUTEX_TAKE(i2c_device->i2c_bus->mutex, ESP_ERR_TIMEOUT); + esp_err_t ret = ESP_FAIL; + +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE + // Need to distinguish between hardware I2C and software I2C via port + if (i2c_device->i2c_bus->bus_config.i2c_port > I2C_NUM_MAX) { + ret = i2c_master_soft_bus_change_frequency(i2c_device->i2c_bus->soft_bus_handle, i2c_device->device_config.scl_speed_hz); + ret = i2c_master_soft_bus_write_reg8(i2c_device->i2c_bus->soft_bus_handle, i2c_device->device_config.device_address, mem_address, data_len, data); + } else +#endif + { +#if !CONFIG_I2C_BUS_REMOVE_NULL_MEM_ADDR + if (mem_address != NULL_I2C_MEM_ADDR) { +#endif + uint8_t *data_addr = malloc(data_len + 1); + if (data_addr == NULL) { + ESP_LOGE(TAG, "data_addr memory alloc fail"); + I2C_BUS_MUTEX_GIVE(i2c_device->i2c_bus->mutex, ESP_FAIL); + return ESP_ERR_NO_MEM; /*!< If the memory request fails, unlock it immediately and return an error. */ + } + data_addr[0] = mem_address; + for (int i = 0; i < data_len; i++) { + data_addr[i + 1] = data[i]; + } + ret = i2c_master_transmit(i2c_device->dev_handle, data_addr, data_len + 1, I2C_BUS_TICKS_TO_WAIT); + free(data_addr); +#if !CONFIG_I2C_BUS_REMOVE_NULL_MEM_ADDR + } else { + ESP_LOGD(TAG, "register address 0x%X is skipped and will not be sent", NULL_I2C_MEM_ADDR); + ret = i2c_master_transmit(i2c_device->dev_handle, data, data_len, I2C_BUS_TICKS_TO_WAIT); + } +#endif + } + I2C_BUS_MUTEX_GIVE(i2c_device->i2c_bus->mutex, ESP_FAIL); + return ret; +} + +esp_err_t i2c_bus_write_reg16(i2c_bus_device_handle_t dev_handle, uint16_t mem_address, size_t data_len, const uint8_t *data) +{ + I2C_BUS_CHECK(dev_handle != NULL, "device handle error", ESP_ERR_INVALID_ARG); + I2C_BUS_CHECK(data != NULL, "data pointer error", ESP_ERR_INVALID_ARG); + i2c_bus_device_t *i2c_device = (i2c_bus_device_t *)dev_handle; + I2C_BUS_INIT_CHECK(i2c_device->i2c_bus->is_init, ESP_ERR_INVALID_STATE); + uint8_t memAddress8[2]; + memAddress8[0] = (uint8_t)((mem_address >> 8) & 0x00FF); + memAddress8[1] = (uint8_t)(mem_address & 0x00FF); + I2C_BUS_MUTEX_TAKE(i2c_device->i2c_bus->mutex, ESP_ERR_TIMEOUT); + esp_err_t ret = ESP_FAIL; + +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE + if (i2c_device->i2c_bus->bus_config.i2c_port > I2C_NUM_MAX) { + ret = i2c_master_soft_bus_change_frequency(i2c_device->i2c_bus->soft_bus_handle, i2c_device->device_config.scl_speed_hz); + ret = i2c_master_soft_bus_write_reg16(i2c_device->i2c_bus->soft_bus_handle, i2c_device->device_config.device_address, mem_address, data_len, data); + } else +#endif + { +#if !CONFIG_I2C_BUS_REMOVE_NULL_MEM_ADDR + if (mem_address != NULL_I2C_MEM_16BIT_ADDR) { +#endif + uint8_t *data_addr = malloc(data_len + 2); + if (data_addr == NULL) { + ESP_LOGE(TAG, "data_addr memory alloc fail"); + I2C_BUS_MUTEX_GIVE(i2c_device->i2c_bus->mutex, ESP_FAIL); + return ESP_ERR_NO_MEM; /*!< If the memory request fails, unlock it immediately and return an error. */ + } + data_addr[0] = memAddress8[0]; + data_addr[1] = memAddress8[1]; + for (int i = 0; i < data_len; i++) { + data_addr[i + 2] = data[i]; + } + ret = i2c_master_transmit(i2c_device->dev_handle, data_addr, data_len + 2, I2C_BUS_TICKS_TO_WAIT); + free(data_addr); +#if !CONFIG_I2C_BUS_REMOVE_NULL_MEM_ADDR + } else { + ESP_LOGD(TAG, "register address 0x%X is skipped and will not be sent", NULL_I2C_MEM_16BIT_ADDR); + ret = i2c_master_transmit(i2c_device->dev_handle, data, data_len, I2C_BUS_TICKS_TO_WAIT); + } +#endif + } + I2C_BUS_MUTEX_GIVE(i2c_device->i2c_bus->mutex, ESP_FAIL); + return ret; +} + +/**************************************** Private Functions*********************************************/ + +static esp_err_t i2c_driver_reinit(i2c_port_t port, const i2c_config_t *conf) +{ +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE + I2C_BUS_CHECK(((i2c_sw_port_t)port < I2C_NUM_SW_MAX) || (port == I2C_NUM_MAX), "I2C port error", ESP_ERR_INVALID_ARG); +#else + I2C_BUS_CHECK(port < I2C_NUM_MAX, "i2c port error", ESP_ERR_INVALID_ARG); +#endif + I2C_BUS_CHECK(conf != NULL, "pointer = NULL error", ESP_ERR_INVALID_ARG); + + if (s_i2c_bus[port].is_init) { +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE + if (port > I2C_NUM_MAX) { + i2c_del_master_soft_bus(s_i2c_bus[port].soft_bus_handle); + } else +#endif + { + i2c_del_master_bus(s_i2c_bus[port].bus_handle); + } + s_i2c_bus[port].is_init = false; + ESP_LOGI(TAG, "i2c%d bus deinited", port); + } + +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE + if (port > I2C_NUM_MAX) { + s_i2c_bus[port].bus_config.i2c_port = port; /*!< Similarly, it is necessary to preserve the I2C_PORT for later distinction. */ + esp_err_t ret = i2c_new_master_soft_bus(conf, &s_i2c_bus[port].soft_bus_handle); + I2C_BUS_CHECK(ret == ESP_OK, "i2c software driver install failed", ret); + s_i2c_bus[port].is_init = true; + ESP_LOGI(TAG, "i2c%d software bus inited", port); + } else +#endif + { + // Convert i2c_config_t information to i2c_master_bus_config_t and i2c_device_config_t + s_i2c_bus[port].bus_config.clk_source = I2C_CLK_SRC_DEFAULT; + s_i2c_bus[port].bus_config.i2c_port = port; + s_i2c_bus[port].bus_config.scl_io_num = conf->scl_io_num; + s_i2c_bus[port].bus_config.sda_io_num = conf->sda_io_num; + s_i2c_bus[port].bus_config.glitch_ignore_cnt = 7; /*!< Set the burr cycle of the host bus */ + s_i2c_bus[port].bus_config.flags.enable_internal_pullup = (conf->scl_pullup_en | conf->sda_pullup_en); + s_i2c_bus[port].device_config.scl_speed_hz = conf->master.clk_speed; + s_i2c_bus[port].device_config.flags.disable_ack_check = false; + + esp_err_t ret = i2c_new_master_bus(&s_i2c_bus[port].bus_config, &s_i2c_bus[port].bus_handle); + I2C_BUS_CHECK(ret == ESP_OK, "i2c driver install failed", ret); + s_i2c_bus[port].is_init = true; + ESP_LOGI(TAG, "i2c%d bus inited", port); + } + return ESP_OK; +} + +static esp_err_t i2c_driver_deinit(i2c_port_t port) +{ +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE + I2C_BUS_CHECK(((i2c_sw_port_t)port < I2C_NUM_SW_MAX) || (port == I2C_NUM_MAX), "I2C port error", ESP_ERR_INVALID_ARG); +#else + I2C_BUS_CHECK(port < I2C_NUM_MAX, "i2c port error", ESP_ERR_INVALID_ARG); +#endif + I2C_BUS_CHECK(s_i2c_bus[port].is_init == true, "i2c not inited", ESP_ERR_INVALID_STATE); + + // Need to distinguish between hardware I2C and software I2C via port +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE + if (port > I2C_NUM_MAX) { + esp_err_t ret = i2c_del_master_soft_bus(s_i2c_bus[port].soft_bus_handle); + I2C_BUS_CHECK(ret == ESP_OK, "i2c software driver delete failed", ret); + } else +#endif + { + esp_err_t ret = i2c_del_master_bus(s_i2c_bus[port].bus_handle); + I2C_BUS_CHECK(ret == ESP_OK, "i2c driver delete failed", ret); + } + s_i2c_bus[port].is_init = false; + ESP_LOGI(TAG, "i2c%d bus deinited", port); + return ESP_OK; +} + +/** + * @brief compare with active i2c_bus configuration + * + * @param port choose which i2c_port's configuration will be compared + * @param conf new configuration + * @return true new configuration is equal to active configuration + * @return false new configuration is not equal to active configuration + */ +inline static bool i2c_config_compare(i2c_port_t port, const i2c_config_t *conf) +{ +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE + if (port > I2C_NUM_MAX) { + if (s_i2c_bus[port].conf_activate.master.clk_speed == conf->master.clk_speed + && s_i2c_bus[port].conf_activate.sda_io_num == conf->sda_io_num + && s_i2c_bus[port].conf_activate.scl_io_num == conf->scl_io_num + && s_i2c_bus[port].conf_activate.scl_pullup_en == conf->scl_pullup_en + && s_i2c_bus[port].conf_activate.sda_pullup_en == conf->sda_pullup_en) { + return true; + } + } else +#endif + { + if (s_i2c_bus[port].bus_config.sda_io_num == conf->sda_io_num + && s_i2c_bus[port].bus_config.scl_io_num == conf->scl_io_num + && s_i2c_bus[port].bus_config.flags.enable_internal_pullup == (conf->scl_pullup_en | conf->sda_pullup_en)) { + return true; + } + } + return false; +} diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/idf_component.yml b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/idf_component.yml new file mode 100644 index 000000000..f2d2b0a16 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/idf_component.yml @@ -0,0 +1,12 @@ +dependencies: + cmake_utilities: 0.* + idf: '>=4.0' +description: The I2C Bus Driver supports both hardware and software I2C. +documentation: https://docs.espressif.com/projects/esp-iot-solution/en/latest/basic/bus/i2c_bus.html +issues: https://github.com/espressif/esp-iot-solution/issues +repository: git://github.com/espressif/esp-iot-solution.git +repository_info: + commit_sha: 36792767ff23111c8fae8e57401d716e8da83e71 + path: components/i2c_bus +url: https://github.com/espressif/esp-iot-solution/tree/master/components/i2c_bus +version: 1.4.2 diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/include/i2c_bus.h b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/include/i2c_bus.h new file mode 100644 index 000000000..11d7ebf6d --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/include/i2c_bus.h @@ -0,0 +1,358 @@ +/* + * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef _I2C_BUS_H_ +#define _I2C_BUS_H_ + +#include "esp_idf_version.h" + +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0) +#if CONFIG_I2C_BUS_BACKWARD_CONFIG +#include "driver/i2c.h" +#else +#include "driver/i2c_master.h" +#endif +#else +#include "driver/i2c.h" +#endif + +#define NULL_I2C_MEM_ADDR 0xFF /*!< set mem_address to NULL_I2C_MEM_ADDR if i2c device has no internal address during read/write */ +#define NULL_I2C_MEM_16BIT_ADDR 0XFFFF /*!< set 16bit mem_address to NULL_I2C_MEM_16BIT_ADDR if i2c device has no internal address during read/write */ +#define NULL_I2C_DEV_ADDR 0xFF /*!< invalid i2c device address */ +typedef void *i2c_bus_handle_t; /*!< i2c bus handle */ +typedef void *i2c_bus_device_handle_t; /*!< i2c device handle */ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE +typedef enum { + I2C_NUM_SW_0 = I2C_NUM_MAX + 1, +#if CONFIG_I2C_BUS_SOFTWARE_MAX_PORT >= 2 + I2C_NUM_SW_1, +#endif +#if CONFIG_I2C_BUS_SOFTWARE_MAX_PORT >= 3 + I2C_NUM_SW_2, +#endif +#if CONFIG_I2C_BUS_SOFTWARE_MAX_PORT >= 4 + I2C_NUM_SW_3, +#endif +#if CONFIG_I2C_BUS_SOFTWARE_MAX_PORT >= 5 + I2C_NUM_SW_4, +#endif + I2C_NUM_SW_MAX, +} i2c_sw_port_t; +#endif + +#if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)) +#define gpio_pad_select_gpio esp_rom_gpio_pad_select_gpio +#define portTICK_RATE_MS portTICK_PERIOD_MS +#endif + +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0) +#if !CONFIG_I2C_BUS_BACKWARD_CONFIG +/** + * @brief I2C initialization parameters + */ +typedef struct { + i2c_mode_t mode; /*!< I2C mode */ + int sda_io_num; /*!< GPIO number for I2C sda signal */ + int scl_io_num; /*!< GPIO number for I2C scl signal */ + bool sda_pullup_en; /*!< Internal GPIO pull mode for I2C sda signal*/ + bool scl_pullup_en; /*!< Internal GPIO pull mode for I2C scl signal*/ + struct { + uint32_t clk_speed; /*!< I2C clock frequency for master mode, (no higher than 1MHz for now) */ + } master; /*!< I2C master config */ + uint32_t clk_flags; /*!< Bitwise of ``I2C_SCLK_SRC_FLAG_**FOR_DFS**`` for clk source choice*/ +} i2c_config_t; +#endif + +typedef void *i2c_cmd_handle_t; /*!< I2C command handle */ +#endif + +/**************************************** Public Functions (Application level)*********************************************/ + +/** + * @brief Create an I2C bus instance then return a handle if created successfully. Each I2C bus works in a singleton mode, + * which means for an i2c port only one group parameter works. When i2c_bus_create is called more than one time for the + * same i2c port, following parameter will override the previous one. + * + * @param port I2C port number. Please note that enabling I2C_BUS_SUPPORT_SOFTWARE in menuconfig allows you to use ports in i2c_sw_port_t to enable software I2C. + * @param conf Pointer to I2C bus configuration + * @return i2c_bus_handle_t Return the I2C bus handle if created successfully, return NULL if failed. + */ +i2c_bus_handle_t i2c_bus_create(i2c_port_t port, const i2c_config_t *conf); + +/** + * @brief Delete and release the I2C bus resource. + * + * @param p_bus_handle Point to the I2C bus handle, if delete succeed handle will set to NULL. + * @return + * - ESP_OK Success + * - ESP_FAIL Fail + */ +esp_err_t i2c_bus_delete(i2c_bus_handle_t *p_bus_handle); + +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0) +#if !CONFIG_I2C_BUS_BACKWARD_CONFIG +/** + * @brief Get internal idf bus_handle from i2c_bus_handle + * + * @param bus_handle I2C bus handle + * @return i2c_master_bus_handle_t Return the idf bus_handle if obtained successfully, return NULL if failed. + */ +i2c_master_bus_handle_t i2c_bus_get_internal_bus_handle(i2c_bus_handle_t bus_handle); +#endif +#endif + +/** + * @brief Scan i2c devices attached on i2c bus + * + * @param bus_handle I2C bus handle + * @param buf Pointer to a buffer to save devices' address, if NULL no address will be saved. + * @param num Maximum number of addresses to save, invalid if buf set to NULL, + * higher addresses will be discarded if num less-than the total number found on the I2C bus. + * @return uint8_t Total number of devices found on the I2C bus + */ +uint8_t i2c_bus_scan(i2c_bus_handle_t bus_handle, uint8_t *buf, uint8_t num); + +/** + * @brief Get current active clock speed. + * + * @param bus_handle I2C bus handle + * @return uint32_t current clock speed + */ +uint32_t i2c_bus_get_current_clk_speed(i2c_bus_handle_t bus_handle); + +/** + * @brief Get created device number of the bus. + * + * @param bus_handle I2C bus handle + * @return uint8_t created device number of the bus + */ +uint8_t i2c_bus_get_created_device_num(i2c_bus_handle_t bus_handle); + +/** + * @brief Create an I2C device on specific bus. + * Dynamic configuration must be enable to achieve multiple devices with different configs on a single bus. + * menuconfig:Bus Options->I2C Bus Options->enable dynamic configuration + * + * @param bus_handle Point to the I2C bus handle + * @param dev_addr i2c device address + * @param clk_speed device specified clock frequency the i2c_bus will switch to during each transfer. 0 if use current bus speed. + * @return i2c_bus_device_handle_t return a device handle if created successfully, return NULL if failed. + */ +i2c_bus_device_handle_t i2c_bus_device_create(i2c_bus_handle_t bus_handle, uint8_t dev_addr, uint32_t clk_speed); + +/** + * @brief Delete and release the I2C device resource, i2c_bus_device_delete should be used in pairs with i2c_bus_device_create. + * + * @param p_dev_handle Point to the I2C device handle, if delete succeed handle will set to NULL. + * @return + * - ESP_OK Success + * - ESP_FAIL Fail + */ +esp_err_t i2c_bus_device_delete(i2c_bus_device_handle_t *p_dev_handle); + +/** + * @brief Get device's I2C address + * + * @param dev_handle I2C device handle + * @return uint8_t I2C address, return NULL_I2C_DEV_ADDR if dev_handle is invalid. + */ +uint8_t i2c_bus_device_get_address(i2c_bus_device_handle_t dev_handle); + +/** + * @brief Read single byte from i2c device with 8-bit internal register/memory address + * + * @param dev_handle I2C device handle + * @param mem_address The internal reg/mem address to read from, set to NULL_I2C_MEM_ADDR if no internal address. + * @param data Pointer to a buffer to save the data that was read + * @return esp_err_t + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_FAIL Sending command error, slave doesn't ACK the transfer. + * - ESP_ERR_INVALID_STATE I2C driver not installed or not in master mode. + * - ESP_ERR_TIMEOUT Operation timeout because the bus is busy. + */ +esp_err_t i2c_bus_read_byte(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, uint8_t *data); + +/** + * @brief Read multiple bytes from i2c device with 8-bit internal register/memory address. + * If internal reg/mem address is 16-bit, please refer i2c_bus_read_reg16 + * + * @param dev_handle I2C device handle + * @param mem_address The internal reg/mem address to read from, set to NULL_I2C_MEM_ADDR if no internal address. + * @param data_len Number of bytes to read + * @param data Pointer to a buffer to save the data that was read + * @return esp_err_t + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_FAIL Sending command error, slave doesn't ACK the transfer. + * - ESP_ERR_INVALID_STATE I2C driver not installed or not in master mode. + * - ESP_ERR_TIMEOUT Operation timeout because the bus is busy. + */ +esp_err_t i2c_bus_read_bytes(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, size_t data_len, uint8_t *data); + +/** + * @brief Read single bit of a byte from i2c device with 8-bit internal register/memory address + * + * @param dev_handle I2C device handle + * @param mem_address The internal reg/mem address to read from, set to NULL_I2C_MEM_ADDR if no internal address. + * @param bit_num The bit number 0 - 7 to read + * @param data Pointer to a buffer to save the data that was read. *data == 0 -> bit = 0, *data !=0 -> bit = 1. + * @return esp_err_t + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_FAIL Sending command error, slave doesn't ACK the transfer. + * - ESP_ERR_INVALID_STATE I2C driver not installed or not in master mode. + * - ESP_ERR_TIMEOUT Operation timeout because the bus is busy. + */ +esp_err_t i2c_bus_read_bit(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, uint8_t bit_num, uint8_t *data); + +/** + * @brief Read multiple bits of a byte from i2c device with 8-bit internal register/memory address + * + * @param dev_handle I2C device handle + * @param mem_address The internal reg/mem address to read from, set to NULL_I2C_MEM_ADDR if no internal address. + * @param bit_start The bit to start from, 0 - 7, MSB at 0 + * @param length The number of bits to read, 1 - 8 + * @param data Pointer to a buffer to save the data that was read + * @return esp_err_t + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_FAIL Sending command error, slave doesn't ACK the transfer. + * - ESP_ERR_INVALID_STATE I2C driver not installed or not in master mode. + * - ESP_ERR_TIMEOUT Operation timeout because the bus is busy. + */ +esp_err_t i2c_bus_read_bits(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, uint8_t bit_start, uint8_t length, uint8_t *data); + +/** + * @brief Write single byte to i2c device with 8-bit internal register/memory address + * + * @param dev_handle I2C device handle + * @param mem_address The internal reg/mem address to write to, set to NULL_I2C_MEM_ADDR if no internal address. + * @param data The byte to write. + * @return esp_err_t + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_FAIL Sending command error, slave doesn't ACK the transfer. + * - ESP_ERR_INVALID_STATE I2C driver not installed or not in master mode. + * - ESP_ERR_TIMEOUT Operation timeout because the bus is busy. + */ +esp_err_t i2c_bus_write_byte(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, uint8_t data); + +/** + * @brief Write multiple byte to i2c device with 8-bit internal register/memory address + * If internal reg/mem address is 16-bit, please refer i2c_bus_write_reg16 + * + * @param dev_handle I2C device handle + * @param mem_address The internal reg/mem address to write to, set to NULL_I2C_MEM_ADDR if no internal address. + * @param data_len Number of bytes to write + * @param data Pointer to the bytes to write. + * @return esp_err_t + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_FAIL Sending command error, slave doesn't ACK the transfer. + * - ESP_ERR_INVALID_STATE I2C driver not installed or not in master mode. + * - ESP_ERR_TIMEOUT Operation timeout because the bus is busy. + */ +esp_err_t i2c_bus_write_bytes(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, size_t data_len, const uint8_t *data); + +/** + * @brief Write single bit of a byte to an i2c device with 8-bit internal register/memory address + * + * @param dev_handle I2C device handle + * @param mem_address The internal reg/mem address to write to, set to NULL_I2C_MEM_ADDR if no internal address. + * @param bit_num The bit number 0 - 7 to write + * @param data The bit to write, data == 0 means set bit = 0, data !=0 means set bit = 1. + * @return esp_err_t + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_FAIL Sending command error, slave doesn't ACK the transfer. + * - ESP_ERR_INVALID_STATE I2C driver not installed or not in master mode. + * - ESP_ERR_TIMEOUT Operation timeout because the bus is busy. + */ +esp_err_t i2c_bus_write_bit(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, uint8_t bit_num, uint8_t data); + +/** + * @brief Write multiple bits of a byte to an i2c device with 8-bit internal register/memory address + * + * @param dev_handle I2C device handle + * @param mem_address The internal reg/mem address to write to, set to NULL_I2C_MEM_ADDR if no internal address. + * @param bit_start The bit to start from, 0 - 7, MSB at 0 + * @param length The number of bits to write, 1 - 8 + * @param data The bits to write. + * @return esp_err_t + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_FAIL Sending command error, slave doesn't ACK the transfer. + * - ESP_ERR_INVALID_STATE I2C driver not installed or not in master mode. + * - ESP_ERR_TIMEOUT Operation timeout because the bus is busy. + */ +esp_err_t i2c_bus_write_bits(i2c_bus_device_handle_t dev_handle, uint8_t mem_address, uint8_t bit_start, uint8_t length, uint8_t data); + +/**************************************** Public Functions (Low level)*********************************************/ + +/** + * @brief I2C master send queued commands create by ``i2c_cmd_link_create`` . + * This function will trigger sending all queued commands. + * The task will be blocked until all the commands have been sent out. + * If I2C_BUS_DYNAMIC_CONFIG enable, i2c_bus will dynamically check configs and re-install i2c driver before each transfer, + * hence multiple devices with different configs on a single bus can be supported. + * @note + * Only call this function when ``i2c_bus_read/write_xx`` do not meet the requirements + * + * @param dev_handle I2C device handle + * @param cmd I2C command handler + * @return esp_err_t + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_FAIL Sending command error, slave doesn't ACK the transfer. + * - ESP_ERR_INVALID_STATE I2C driver not installed or not in master mode. + * - ESP_ERR_TIMEOUT Operation timeout because the bus is busy. + */ +esp_err_t i2c_bus_cmd_begin(i2c_bus_device_handle_t dev_handle, i2c_cmd_handle_t cmd); + +/** + * @brief Write date to an i2c device with 16-bit internal reg/mem address + * + * @param dev_handle I2C device handle + * @param mem_address The internal 16-bit reg/mem address to write to, set to NULL_I2C_MEM_ADDR if no internal address. + * @param data_len Number of bytes to write + * @param data Pointer to the bytes to write. + * @return esp_err_t + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_FAIL Sending command error, slave doesn't ACK the transfer. + * - ESP_ERR_INVALID_STATE I2C driver not installed or not in master mode. + * - ESP_ERR_TIMEOUT Operation timeout because the bus is busy. + */ +esp_err_t i2c_bus_write_reg16(i2c_bus_device_handle_t dev_handle, uint16_t mem_address, size_t data_len, const uint8_t *data); + +/** + * @brief Read date from i2c device with 16-bit internal reg/mem address + * + * @param dev_handle I2C device handle + * @param mem_address The internal 16-bit reg/mem address to read from, set to NULL_I2C_MEM_ADDR if no internal address. + * @param data_len Number of bytes to read + * @param data Pointer to a buffer to save the data that was read + * @return esp_err_t + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_FAIL Sending command error, slave doesn't ACK the transfer. + * - ESP_ERR_INVALID_STATE I2C driver not installed or not in master mode. + * - ESP_ERR_TIMEOUT Operation timeout because the bus is busy. + */ +esp_err_t i2c_bus_read_reg16(i2c_bus_device_handle_t dev_handle, uint16_t mem_address, size_t data_len, uint8_t *data); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/license.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/license.txt new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/license.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/private_include/i2c_bus_soft.h b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/private_include/i2c_bus_soft.h new file mode 100644 index 000000000..00e2ae1a7 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/private_include/i2c_bus_soft.h @@ -0,0 +1,121 @@ +/* + * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include "i2c_bus.h" + +struct i2c_master_soft_bus_t { + gpio_num_t scl_io; /*!< SCL GPIO PIN */ + gpio_num_t sda_io; /*!< SDA GPIO PIN */ + uint32_t time_delay_us; /*!< Interval between SCL GPIO toggles in microseconds, determining the SCL frequency */ +}; + +typedef struct i2c_master_soft_bus_t *i2c_master_soft_bus_handle_t; + +/** + * @brief Allocate an I2C master soft bus + * + * @param conf I2C master soft bus configuration + * @param ret_soft_bus_handle I2C soft bus handle + * @return + * - ESP_OK: I2C master soft bus initialized successfully + * - ESP_ERR_INVALID_ARG: I2C soft bus initialization failed because of invalid argument + * - ESP_ERR_NO_MEM: Create I2C soft bus failed because of out of memory + */ +esp_err_t i2c_new_master_soft_bus(const i2c_config_t *conf, i2c_master_soft_bus_handle_t *ret_soft_bus_handle); + +/** + * @brief Delete the I2C master soft bus + * + * @param bus_handle I2C soft bus handle + * @return + * - ESP_OK: Delete I2C soft bus success + * - Otherwise: Some module delete failed + */ +esp_err_t i2c_del_master_soft_bus(i2c_master_soft_bus_handle_t bus_handle); + +/** + * @brief Change I2C soft bus frequency + * + * @param bus_handle I2C soft bus handle + * @param frequency I2C bus frequency + * @return + * - ESP_OK: Change I2C soft bus frequency success + * - ESP_ERR_INVALID_ARG: I2C soft bus change frequency failed because of invalid argument + */ +esp_err_t i2c_master_soft_bus_change_frequency(i2c_master_soft_bus_handle_t bus_handle, uint32_t frequency); + +/** + * @brief Probe I2C address, if address is correct and ACK is received, this function will return ESP_OK + * + * @param bus_handle I2C soft bus handle + * @param address I2C device address that you want to probe + * @return + * - ESP_OK: I2C device probe successfully + * - ESP_ERR_INVALID_ARG: I2C probe failed because of invalid argument + * - ESP_ERR_NOT_FOUND: I2C probe failed, doesn't find the device with specific address you gave + */ +esp_err_t i2c_master_soft_bus_probe(i2c_master_soft_bus_handle_t bus_handle, uint8_t address); + +/** + * @brief Write multiple byte to i2c device with 8-bit internal register/memory address + * + * @param bus_handle I2C soft bus handle + * @param dev_addr I2C device address + * @param mem_address The internal reg/mem address to write to, set to NULL_I2C_MEM_ADDR if no internal address + * @param data_len Number of bytes to write + * @param data Pointer to the bytes to write + * @return + * - ESP_OK: I2C master write success + * - ESP_ERR_INVALID_ARG: I2C master write failed because of invalid argument + * - Otherwise: I2C master write failed + */ +esp_err_t i2c_master_soft_bus_write_reg8(i2c_master_soft_bus_handle_t bus_handle, uint8_t dev_addr, uint8_t mem_address, size_t data_len, const uint8_t *data); + +/** + * @brief Write multiple byte to i2c device with 16-bit internal register/memory address + * + * @param bus_handle I2C soft bus handle + * @param dev_addr I2C device address + * @param mem_address The internal reg/mem address to write to, set to NULL_I2C_MEM_16BIT_ADDR if no internal address + * @param data_len Number of bytes to write + * @param data Pointer to the bytes to write + * @return + * - ESP_OK: I2C master write success + * - ESP_ERR_INVALID_ARG: I2C master write failed because of invalid argument + * - Otherwise: I2C master write failed + */ +esp_err_t i2c_master_soft_bus_write_reg16(i2c_master_soft_bus_handle_t bus_handle, uint8_t dev_addr, uint16_t mem_address, size_t data_len, const uint8_t *data); + +/** + * @brief Read multiple byte to i2c device with 8-bit internal register/memory address + * + * @param bus_handle I2C soft bus handle + * @param dev_addr I2C device address + * @param mem_address The internal reg/mem address to write to, set to NULL_I2C_MEM_ADDR if no internal address + * @param data_len Number of bytes to read + * @param data Pointer to the bytes to read + * @return + * - ESP_OK: I2C master read success + * - ESP_ERR_INVALID_ARG: I2C master read failed because of invalid argument + * - Otherwise: I2C master read failed + */ +esp_err_t i2c_master_soft_bus_read_reg8(i2c_master_soft_bus_handle_t bus_handle, uint8_t dev_addr, uint8_t mem_address, size_t data_len, uint8_t *data); + +/** + * @brief Read multiple byte to i2c device with 16-bit internal register/memory address + * + * @param bus_handle I2C soft bus handle + * @param dev_addr I2C device address + * @param mem_address The internal reg/mem address to write to, set to NULL_I2C_MEM_16BIT_ADDR if no internal address + * @param data_len Number of bytes to read + * @param data Pointer to the bytes to read + * @return + * - ESP_OK: I2C master read success + * - ESP_ERR_INVALID_ARG: I2C master read failed because of invalid argument + * - Otherwise: I2C master read failed + */ +esp_err_t i2c_master_soft_bus_read_reg16(i2c_master_soft_bus_handle_t bus_handle, uint8_t dev_addr, uint16_t mem_address, size_t data_len, uint8_t *data); diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/test_apps/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/test_apps/CMakeLists.txt new file mode 100644 index 000000000..271523a37 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/test_apps/CMakeLists.txt @@ -0,0 +1,9 @@ +# The following lines of boilerplate have to be in your project's CMakeLists +# in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.5) + +set(EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/tools/unit-test-app/components" + "../../i2c_bus") + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(i2c_bus_test) diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/test_apps/main/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/test_apps/main/CMakeLists.txt new file mode 100644 index 000000000..2b42ccf19 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/test_apps/main/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRC_DIRS "." + PRIV_INCLUDE_DIRS "." + PRIV_REQUIRES unity i2c_bus test_utils) diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/test_apps/main/test_i2c_bus.c b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/test_apps/main/test_i2c_bus.c new file mode 100644 index 000000000..1f207febb --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/test_apps/main/test_i2c_bus.c @@ -0,0 +1,595 @@ +/* + * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include "unity.h" +#include "unity_config.h" +#include "i2c_bus.h" +#include "esp_system.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" + +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0) +#include "driver/i2c_slave.h" +#include "test_utils.h" +#endif + +#define TEST_MEMORY_LEAK_THRESHOLD (-460) + +static size_t before_free_8bit; +static size_t before_free_32bit; + +#define I2C_MASTER_SCL_IO (gpio_num_t)4 /*!< gpio number for I2C master clock */ +#define I2C_MASTER_SDA_IO (gpio_num_t)5 /*!< gpio number for I2C master data */ + +#define DATA_LENGTH 512 /*!= ESP_IDF_VERSION_VAL(5, 3, 0) && !CONFIG_I2C_BUS_BACKWARD_CONFIG +static QueueHandle_t s_receive_queue; + +static IRAM_ATTR bool test_i2c_rx_done_callback(i2c_slave_dev_handle_t channel, const i2c_slave_rx_done_event_data_t *edata, void *user_data) +{ + BaseType_t high_task_wakeup = pdFALSE; + QueueHandle_t receive_queue = (QueueHandle_t)user_data; + xQueueSendFromISR(receive_queue, edata, &high_task_wakeup); + return high_task_wakeup == pdTRUE; +} +#endif + +void i2c_bus_init_deinit_test() +{ + i2c_config_t conf = { + .mode = I2C_MODE_MASTER, + .sda_io_num = I2C_MASTER_SDA_IO, + .sda_pullup_en = GPIO_PULLUP_ENABLE, + .scl_io_num = I2C_MASTER_SCL_IO, + .scl_pullup_en = GPIO_PULLUP_ENABLE, + .master.clk_speed = I2C_MASTER_FREQ_HZ, + }; + i2c_bus_handle_t i2c0_bus_1 = i2c_bus_create(I2C_NUM_0, &conf); + TEST_ASSERT(i2c0_bus_1 != NULL); + /** configs not change**/ + i2c0_bus_1 = i2c_bus_create(I2C_NUM_0, &conf); + TEST_ASSERT(i2c0_bus_1 != NULL); + /** configs change**/ + conf.master.clk_speed *= 2; + i2c0_bus_1 = i2c_bus_create(I2C_NUM_0, &conf); + TEST_ASSERT(i2c0_bus_1 != NULL); + vTaskDelay(100 / portTICK_RATE_MS); + TEST_ASSERT(ESP_OK == i2c_bus_delete(&i2c0_bus_1)); + TEST_ASSERT(i2c0_bus_1 == NULL); +} + +void i2c_bus_device_add_test() +{ + i2c_config_t conf = { + .mode = I2C_MODE_MASTER, + .sda_io_num = I2C_MASTER_SDA_IO, + .sda_pullup_en = GPIO_PULLUP_ENABLE, + .scl_io_num = I2C_MASTER_SCL_IO, + .scl_pullup_en = GPIO_PULLUP_ENABLE, + .master.clk_speed = I2C_MASTER_FREQ_HZ, + }; + i2c_bus_handle_t i2c0_bus_1 = i2c_bus_create(I2C_NUM_0, &conf); + TEST_ASSERT(i2c0_bus_1 != NULL); + i2c_bus_device_handle_t i2c_device1 = i2c_bus_device_create(i2c0_bus_1, 0x01, 400000); + TEST_ASSERT(i2c_device1 != NULL); + i2c_bus_device_handle_t i2c_device2 = i2c_bus_device_create(i2c0_bus_1, 0x01, 100000); + TEST_ASSERT(i2c_device2 != NULL); + i2c_bus_device_delete(&i2c_device1); + TEST_ASSERT(i2c_device1 == NULL); + i2c_bus_device_delete(&i2c_device2); + TEST_ASSERT(i2c_device2 == NULL); + TEST_ASSERT(ESP_OK == i2c_bus_delete(&i2c0_bus_1)); + TEST_ASSERT(i2c0_bus_1 == NULL); +} + +// print the reading buffer +static void disp_buf(uint8_t *buf, int len) +{ + int i; + + for (i = 0; i < len; i++) { + printf("%02x ", buf[i]); + + if ((i + 1) % 16 == 0) { + printf("\n"); + } + } + + printf("\n"); +} + +static void i2c_master_write_test(void) +{ + uint8_t *data_wr = (uint8_t *) malloc(DATA_LENGTH); + int i; + i2c_config_t conf = { + .mode = I2C_MODE_MASTER, + .sda_io_num = I2C_MASTER_SDA_IO, + .sda_pullup_en = GPIO_PULLUP_ENABLE, + .scl_io_num = I2C_MASTER_SCL_IO, + .scl_pullup_en = GPIO_PULLUP_ENABLE, + .master.clk_speed = I2C_MASTER_FREQ_HZ, + }; + i2c_bus_handle_t i2c0_bus = i2c_bus_create(I2C_MASTER_NUM, &conf); + TEST_ASSERT(i2c0_bus != NULL); + i2c_bus_device_handle_t i2c_device1 = i2c_bus_device_create(i2c0_bus, ESP_SLAVE_ADDR, 0); + TEST_ASSERT(i2c_device1 != NULL); + +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0) && !CONFIG_I2C_BUS_BACKWARD_CONFIG + unity_wait_for_signal("i2c slave init finish"); + unity_send_signal("master write"); +#endif + + for (i = 0; i < DATA_LENGTH / 2; i++) { + data_wr[i] = i; + } + + i2c_bus_write_bytes(i2c_device1, NULL_I2C_MEM_ADDR, DATA_LENGTH / 2, data_wr); + disp_buf(data_wr, i); + free(data_wr); +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0) && !CONFIG_I2C_BUS_BACKWARD_CONFIG + unity_wait_for_signal("ready to delete"); +#endif + i2c_bus_device_delete(&i2c_device1); + TEST_ASSERT(i2c_device1 == NULL); + TEST_ASSERT(ESP_OK == i2c_bus_delete(&i2c0_bus)); + TEST_ASSERT(i2c0_bus == NULL); +} + +static void i2c_slave_read_test(void) +{ + uint8_t *data_rd = (uint8_t *) malloc(DATA_LENGTH); + +#if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 3, 0) || CONFIG_I2C_BUS_BACKWARD_CONFIG + int len = 0; + int size_rd = 0; + + i2c_config_t conf_slave = { + .mode = I2C_MODE_SLAVE, + .sda_io_num = I2C_SLAVE_SDA_IO, + .scl_io_num = I2C_SLAVE_SCL_IO, + .sda_pullup_en = GPIO_PULLUP_ENABLE, + .scl_pullup_en = GPIO_PULLUP_ENABLE, + .slave.addr_10bit_en = 0, + .slave.slave_addr = ESP_SLAVE_ADDR, + }; + + TEST_ESP_OK(i2c_param_config(I2C_SLAVE_NUM, &conf_slave)); + TEST_ESP_OK(i2c_driver_install(I2C_SLAVE_NUM, I2C_MODE_SLAVE, + I2C_SLAVE_RX_BUF_LEN, + I2C_SLAVE_TX_BUF_LEN, 0)); + + while (1) { + len = i2c_slave_read_buffer(I2C_SLAVE_NUM, data_rd + size_rd, DATA_LENGTH, 10000 / portTICK_RATE_MS); + + if (len == 0) { + break; + } + + size_rd += len; + } + + disp_buf(data_rd, size_rd); + + for (int i = 0; i < size_rd; i++) { + TEST_ASSERT(data_rd[i] == i); + } + + free(data_rd); + TEST_ESP_OK(i2c_driver_delete(I2C_SLAVE_NUM)); +#else + i2c_slave_config_t i2c_slv_config = { + .addr_bit_len = I2C_ADDR_BIT_LEN_7, + .clk_source = I2C_CLK_SRC_DEFAULT, + .i2c_port = I2C_SLAVE_NUM, + .send_buf_depth = 256, + .scl_io_num = I2C_SLAVE_SCL_IO, + .sda_io_num = I2C_SLAVE_SDA_IO, + .slave_addr = ESP_SLAVE_ADDR, + }; + i2c_slave_dev_handle_t slave_handle; + TEST_ESP_OK(i2c_new_slave_device(&i2c_slv_config, &slave_handle)); + + s_receive_queue = xQueueCreate(1, sizeof(i2c_slave_rx_done_event_data_t)); + i2c_slave_event_callbacks_t cbs = { + .on_recv_done = test_i2c_rx_done_callback, + }; + ESP_ERROR_CHECK(i2c_slave_register_event_callbacks(slave_handle, &cbs, s_receive_queue)); + i2c_slave_rx_done_event_data_t rx_data; + TEST_ESP_OK(i2c_slave_receive(slave_handle, data_rd, DATA_LENGTH / 2)); + unity_send_signal("i2c slave init finish"); + unity_wait_for_signal("master write"); + xQueueReceive(s_receive_queue, &rx_data, pdMS_TO_TICKS(1000)); + disp_buf(data_rd, DATA_LENGTH / 2); + for (int i = 0; i < DATA_LENGTH / 2; i++) { + TEST_ASSERT(data_rd[i] == i); + } + vQueueDelete(s_receive_queue); + unity_send_signal("ready to delete"); + free(data_rd); + TEST_ESP_OK(i2c_del_slave_device(slave_handle)); +#endif +} + +TEST_CASE_MULTIPLE_DEVICES("I2C master write slave test", "[i2c_bus]", i2c_master_write_test, i2c_slave_read_test); + +static void master_read_slave_test(void) +{ + uint8_t *data_rd = (uint8_t *) malloc(DATA_LENGTH); + memset(data_rd, 0, DATA_LENGTH); + i2c_config_t conf = { + .mode = I2C_MODE_MASTER, + .sda_io_num = I2C_MASTER_SDA_IO, + .sda_pullup_en = GPIO_PULLUP_ENABLE, + .scl_io_num = I2C_MASTER_SCL_IO, + .scl_pullup_en = GPIO_PULLUP_ENABLE, + .master.clk_speed = I2C_MASTER_FREQ_HZ, + }; + + i2c_bus_handle_t i2c0_bus = i2c_bus_create(I2C_MASTER_NUM, &conf); + TEST_ASSERT(i2c0_bus != NULL); + i2c_bus_device_handle_t i2c_device1 = i2c_bus_device_create(i2c0_bus, ESP_SLAVE_ADDR, 0); + TEST_ASSERT(i2c_device1 != NULL); + +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0) && !CONFIG_I2C_BUS_BACKWARD_CONFIG + unity_send_signal("i2c master init finish"); + unity_wait_for_signal("slave write"); +#endif + + i2c_bus_read_bytes(i2c_device1, NULL_I2C_MEM_ADDR, RW_TEST_LENGTH, data_rd); + vTaskDelay(100 / portTICK_RATE_MS); + + disp_buf(data_rd, RW_TEST_LENGTH); +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0) && !CONFIG_I2C_BUS_BACKWARD_CONFIG + unity_send_signal("ready to delete"); +#endif + i2c_bus_device_delete(&i2c_device1); + TEST_ASSERT(i2c_device1 == NULL); + TEST_ASSERT(ESP_OK == i2c_bus_delete(&i2c0_bus)); + TEST_ASSERT(i2c0_bus == NULL); + free(data_rd); +} + +static void slave_write_buffer_test(void) +{ + uint8_t *data_wr = (uint8_t *) malloc(RW_TEST_LENGTH); + +#if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 3, 0) || CONFIG_I2C_BUS_BACKWARD_CONFIG + i2c_config_t conf_slave = { + .mode = I2C_MODE_SLAVE, + .sda_io_num = I2C_SLAVE_SDA_IO, + .scl_io_num = I2C_SLAVE_SCL_IO, + .sda_pullup_en = GPIO_PULLUP_ENABLE, + .scl_pullup_en = GPIO_PULLUP_ENABLE, + .slave.addr_10bit_en = 0, + .slave.slave_addr = ESP_SLAVE_ADDR, + }; + + TEST_ESP_OK(i2c_param_config(I2C_SLAVE_NUM, &conf_slave)); + TEST_ESP_OK(i2c_driver_install(I2C_SLAVE_NUM, I2C_MODE_SLAVE, + I2C_SLAVE_RX_BUF_LEN, + I2C_SLAVE_TX_BUF_LEN, 0)); + + for (int i = 0; i < RW_TEST_LENGTH; i++) { + data_wr[i] = i; + } + + i2c_slave_write_buffer(I2C_SLAVE_NUM, data_wr, RW_TEST_LENGTH, 2000 / portTICK_RATE_MS); +#else + i2c_slave_config_t i2c_slv_config = { + .addr_bit_len = I2C_ADDR_BIT_LEN_7, + .clk_source = I2C_CLK_SRC_DEFAULT, + .i2c_port = I2C_SLAVE_NUM, + .send_buf_depth = 256, + .scl_io_num = I2C_SLAVE_SCL_IO, + .sda_io_num = I2C_SLAVE_SDA_IO, + .slave_addr = ESP_SLAVE_ADDR, + }; + i2c_slave_dev_handle_t slave_handle; + TEST_ESP_OK(i2c_new_slave_device(&i2c_slv_config, &slave_handle)); + + for (int i = 0; i < RW_TEST_LENGTH; i++) { + data_wr[i] = i; + } + + unity_wait_for_signal("i2c master init finish"); + unity_send_signal("slave write"); + + i2c_slave_transmit(slave_handle, data_wr, RW_TEST_LENGTH, 100 / portTICK_PERIOD_MS); +#endif + + disp_buf(data_wr, RW_TEST_LENGTH); + free(data_wr); + +#if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 3, 0) || CONFIG_I2C_BUS_BACKWARD_CONFIG + i2c_driver_delete(I2C_SLAVE_NUM); +#else + unity_wait_for_signal("ready to delete"); + TEST_ESP_OK(i2c_del_slave_device(slave_handle)); +#endif +} + +TEST_CASE_MULTIPLE_DEVICES("I2C master read slave test", "[i2c_bus]", master_read_slave_test, slave_write_buffer_test); + +TEST_CASE("I2C master write under different frequency test", "[i2c_bus]") +{ + uint8_t *data_wr = (uint8_t *) malloc(RW_TEST_LENGTH); + for (int i = 0; i < RW_TEST_LENGTH; i++) { + data_wr[i] = i; + } + + i2c_config_t conf = { + .mode = I2C_MODE_MASTER, + .sda_io_num = I2C_MASTER_SDA_IO, + .sda_pullup_en = GPIO_PULLUP_ENABLE, + .scl_io_num = I2C_MASTER_SCL_IO, + .scl_pullup_en = GPIO_PULLUP_ENABLE, + .master.clk_speed = I2C_MASTER_FREQ_HZ, + }; + i2c_bus_handle_t i2c_bus = i2c_bus_create(I2C_NUM_0, &conf); + TEST_ASSERT(i2c_bus != NULL); + i2c_bus_device_handle_t i2c_device1 = i2c_bus_device_create(i2c_bus, 0x01, I2C_MASTER_FREQ_HZ); + TEST_ASSERT(i2c_device1 != NULL); + i2c_bus_write_bytes(i2c_device1, NULL_I2C_MEM_ADDR, RW_TEST_LENGTH, data_wr); + vTaskDelay(300 / portTICK_RATE_MS); + + conf.master.clk_speed = 40 * 100; + i2c_bus = i2c_bus_create(I2C_NUM_0, &conf); + i2c_bus_device_handle_t i2c_device2 = i2c_bus_device_create(i2c_bus, 0x02, 40 * 100); + TEST_ASSERT(i2c_device2 != NULL); + i2c_bus_write_bytes(i2c_device2, NULL_I2C_MEM_ADDR, RW_TEST_LENGTH, data_wr); + i2c_bus_device_delete(&i2c_device1); + TEST_ASSERT(i2c_device1 == NULL); + i2c_bus_device_delete(&i2c_device2); + TEST_ASSERT(i2c_device2 == NULL); + free(data_wr); + TEST_ASSERT(ESP_OK == i2c_bus_delete(&i2c_bus)); + TEST_ASSERT(i2c_bus == NULL); +} + +TEST_CASE("i2c bus init-deinit test", "[bus][i2c_bus]") +{ + i2c_bus_init_deinit_test(); + i2c_bus_device_add_test(); +} + +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0) && !CONFIG_I2C_BUS_BACKWARD_CONFIG +TEST_CASE("I2C bus uses external bus handle test", "[bus][i2c_bus]") +{ + uint8_t *data_wr = (uint8_t *) malloc(RW_TEST_LENGTH); + for (int i = 0; i < RW_TEST_LENGTH; i++) { + data_wr[i] = i; + } + + i2c_master_bus_config_t i2c_mst_config = { + .clk_source = I2C_CLK_SRC_DEFAULT, + .i2c_port = I2C_MASTER_NUM, + .scl_io_num = I2C_MASTER_SCL_IO, + .sda_io_num = I2C_MASTER_SDA_IO, + .flags.enable_internal_pullup = true, + }; + i2c_master_bus_handle_t bus_handle; + + TEST_ESP_OK(i2c_new_master_bus(&i2c_mst_config, &bus_handle)); + + i2c_config_t conf = { + .mode = I2C_MODE_MASTER, + .sda_io_num = I2C_MASTER_SDA_IO, + .sda_pullup_en = GPIO_PULLUP_ENABLE, + .scl_io_num = I2C_MASTER_SCL_IO, + .scl_pullup_en = GPIO_PULLUP_ENABLE, + .master.clk_speed = I2C_MASTER_FREQ_HZ, + }; + + i2c_bus_handle_t i2c_bus = i2c_bus_create(I2C_MASTER_NUM, &conf); + + i2c_bus_device_handle_t i2c_device1 = i2c_bus_device_create(i2c_bus, 0x01, 400000); + TEST_ASSERT(i2c_device1 != NULL); + i2c_bus_write_bytes(i2c_device1, NULL_I2C_MEM_ADDR, RW_TEST_LENGTH, data_wr); + i2c_bus_device_delete(&i2c_device1); + free(data_wr); + TEST_ASSERT(ESP_OK == i2c_bus_delete(&i2c_bus)); + TEST_ASSERT(i2c_bus == NULL); +} +#endif + +TEST_CASE("I2C bus scan test", "[i2c_bus][scan]") +{ + uint8_t addrs[I2C_SCAN_ADDR_NUM] = {0}; + + i2c_config_t conf = { + .mode = I2C_MODE_MASTER, + .sda_io_num = I2C_MASTER_SDA_IO, + .sda_pullup_en = GPIO_PULLUP_ENABLE, + .scl_io_num = I2C_MASTER_SCL_IO, + .scl_pullup_en = GPIO_PULLUP_ENABLE, + .master.clk_speed = I2C_MASTER_FREQ_HZ, + }; + i2c_bus_handle_t i2c_bus = i2c_bus_create(I2C_MASTER_NUM, &conf); + i2c_bus_scan(i2c_bus, addrs, I2C_SCAN_ADDR_NUM); + + TEST_ASSERT(ESP_OK == i2c_bus_delete(&i2c_bus)); + TEST_ASSERT(i2c_bus == NULL); +} + +TEST_CASE("I2C bus register address restriction test", "[i2c_bus][NULL_I2C_MEM_ADDR]") +{ + uint8_t *data_wr = (uint8_t *) malloc(RW_TEST_LENGTH); + for (int i = 0; i < RW_TEST_LENGTH; i++) { + data_wr[i] = i; + } + + i2c_config_t conf = { + .mode = I2C_MODE_MASTER, + .sda_io_num = I2C_MASTER_SDA_IO, + .sda_pullup_en = GPIO_PULLUP_ENABLE, + .scl_io_num = I2C_MASTER_SCL_IO, + .scl_pullup_en = GPIO_PULLUP_ENABLE, + .master.clk_speed = I2C_MASTER_FREQ_HZ, + }; + i2c_bus_handle_t i2c_bus = i2c_bus_create(I2C_NUM_0, &conf); + TEST_ASSERT(i2c_bus != NULL); + i2c_bus_device_handle_t i2c_device1 = i2c_bus_device_create(i2c_bus, 0x01, I2C_MASTER_FREQ_HZ); + TEST_ASSERT(i2c_device1 != NULL); + i2c_bus_write_bytes(i2c_device1, NULL_I2C_MEM_ADDR, RW_TEST_LENGTH, data_wr); + i2c_bus_device_delete(&i2c_device1); + TEST_ASSERT(i2c_device1 == NULL); + TEST_ASSERT(ESP_OK == i2c_bus_delete(&i2c_bus)); + free(data_wr); + TEST_ASSERT(i2c_bus == NULL); +} + +#if CONFIG_I2C_BUS_SUPPORT_SOFTWARE + +TEST_CASE("I2C soft bus init-deinit test", "[soft][bus][i2c_bus]") +{ + i2c_config_t conf = { + .mode = I2C_MODE_MASTER, + .sda_io_num = I2C_MASTER_SDA_IO, + .sda_pullup_en = GPIO_PULLUP_ENABLE, + .scl_io_num = I2C_MASTER_SCL_IO, + .scl_pullup_en = GPIO_PULLUP_ENABLE, + .master.clk_speed = I2C_MASTER_FREQ_HZ, + }; + i2c_bus_handle_t i2c0_bus_1 = i2c_bus_create(I2C_NUM_SW_1, &conf); + TEST_ASSERT(i2c0_bus_1 != NULL); + /** configs not change**/ + i2c0_bus_1 = i2c_bus_create(I2C_NUM_SW_1, &conf); + TEST_ASSERT(i2c0_bus_1 != NULL); + /** configs change**/ + conf.master.clk_speed *= 2; + i2c0_bus_1 = i2c_bus_create(I2C_NUM_SW_0, &conf); + TEST_ASSERT(i2c0_bus_1 != NULL); + vTaskDelay(100 / portTICK_RATE_MS); + TEST_ASSERT(ESP_OK == i2c_bus_delete(&i2c0_bus_1)); + TEST_ASSERT(i2c0_bus_1 == NULL); +} + +TEST_CASE("I2C soft bus device add test", "[soft][bus][device][i2c_bus]") +{ + i2c_config_t conf = { + .mode = I2C_MODE_MASTER, + .sda_io_num = I2C_MASTER_SDA_IO, + .sda_pullup_en = GPIO_PULLUP_ENABLE, + .scl_io_num = I2C_MASTER_SCL_IO, + .scl_pullup_en = GPIO_PULLUP_ENABLE, + .master.clk_speed = I2C_MASTER_FREQ_HZ, + }; + i2c_bus_handle_t i2c0_bus_1 = i2c_bus_create(I2C_NUM_SW_0, &conf); + TEST_ASSERT(i2c0_bus_1 != NULL); + i2c_bus_device_handle_t i2c_device1 = i2c_bus_device_create(i2c0_bus_1, 0x01, 400000); + TEST_ASSERT(i2c_device1 != NULL); + i2c_bus_device_handle_t i2c_device2 = i2c_bus_device_create(i2c0_bus_1, 0x01, 100000); + TEST_ASSERT(i2c_device2 != NULL); + i2c_bus_device_delete(&i2c_device1); + TEST_ASSERT(i2c_device1 == NULL); + i2c_bus_device_delete(&i2c_device2); + TEST_ASSERT(i2c_device2 == NULL); + TEST_ASSERT(ESP_OK == i2c_bus_delete(&i2c0_bus_1)); + TEST_ASSERT(i2c0_bus_1 == NULL); +} + +TEST_CASE("I2C soft bus scan test", "[soft][i2c_bus][scan]") +{ + uint8_t addrs[I2C_SCAN_ADDR_NUM] = {0}; + + i2c_config_t conf = { + .mode = I2C_MODE_MASTER, + .sda_io_num = I2C_MASTER_SDA_IO, + .sda_pullup_en = GPIO_PULLUP_ENABLE, + .scl_io_num = I2C_MASTER_SCL_IO, + .scl_pullup_en = GPIO_PULLUP_ENABLE, + .master.clk_speed = I2C_MASTER_FREQ_HZ, + }; + i2c_bus_handle_t i2c_bus = i2c_bus_create(I2C_NUM_SW_0, &conf); + i2c_bus_scan(i2c_bus, addrs, I2C_SCAN_ADDR_NUM); + + TEST_ASSERT(ESP_OK == i2c_bus_delete(&i2c_bus)); + TEST_ASSERT(i2c_bus == NULL); +} + +TEST_CASE("I2C soft bus write under different frequency test", "[soft][i2c_bus]") +{ + uint8_t *data_wr = (uint8_t *) malloc(RW_TEST_LENGTH); + for (int i = 0; i < RW_TEST_LENGTH; i++) { + data_wr[i] = i; + } + + i2c_config_t conf = { + .mode = I2C_MODE_MASTER, + .sda_io_num = I2C_MASTER_SDA_IO, + .sda_pullup_en = GPIO_PULLUP_ENABLE, + .scl_io_num = I2C_MASTER_SCL_IO, + .scl_pullup_en = GPIO_PULLUP_ENABLE, + .master.clk_speed = I2C_MASTER_FREQ_HZ, + }; + i2c_bus_handle_t i2c_bus = i2c_bus_create(I2C_NUM_SW_0, &conf); + TEST_ASSERT(i2c_bus != NULL); + i2c_bus_device_handle_t i2c_device1 = i2c_bus_device_create(i2c_bus, 0x01, I2C_MASTER_FREQ_HZ); + TEST_ASSERT(i2c_device1 != NULL); + i2c_bus_write_bytes(i2c_device1, NULL_I2C_MEM_ADDR, RW_TEST_LENGTH, data_wr); + vTaskDelay(300 / portTICK_RATE_MS); + + i2c_bus_device_handle_t i2c_device2 = i2c_bus_device_create(i2c_bus, 0x02, 40 * 100); + TEST_ASSERT(i2c_device2 != NULL); + i2c_bus_write_bytes(i2c_device2, NULL_I2C_MEM_ADDR, RW_TEST_LENGTH, data_wr); + i2c_bus_device_delete(&i2c_device1); + TEST_ASSERT(i2c_device1 == NULL); + i2c_bus_device_delete(&i2c_device2); + TEST_ASSERT(i2c_device2 == NULL); + free(data_wr); + TEST_ASSERT(ESP_OK == i2c_bus_delete(&i2c_bus)); + TEST_ASSERT(i2c_bus == NULL); +} + +#endif + +static void check_leak(size_t before_free, size_t after_free, const char *type) +{ + ssize_t delta = after_free - before_free; + printf("MALLOC_CAP_%s: Before %u bytes free, After %u bytes free (delta %d)\n", type, before_free, after_free, delta); + TEST_ASSERT_MESSAGE(delta >= TEST_MEMORY_LEAK_THRESHOLD, "memory leak"); +} + +void setUp(void) +{ + before_free_8bit = heap_caps_get_free_size(MALLOC_CAP_8BIT); + before_free_32bit = heap_caps_get_free_size(MALLOC_CAP_32BIT); +} + +void tearDown(void) +{ + size_t after_free_8bit = heap_caps_get_free_size(MALLOC_CAP_8BIT); + size_t after_free_32bit = heap_caps_get_free_size(MALLOC_CAP_32BIT); + check_leak(before_free_8bit, after_free_8bit, "8BIT"); + check_leak(before_free_32bit, after_free_32bit, "32BIT"); +} + +void app_main(void) +{ +#if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 3, 0) || CONFIG_I2C_BUS_BACKWARD_CONFIG + printf("I2C BUS TEST \n"); +#else + printf("I2C BUS V2 TEST \n"); +#endif + unity_run_menu(); +} diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/test_apps/pytest_i2c_bus.py b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/test_apps/pytest_i2c_bus.py new file mode 100644 index 000000000..d623dcf1b --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/test_apps/pytest_i2c_bus.py @@ -0,0 +1,30 @@ +# SPDX-FileCopyrightText: 2024Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: Apache-2.0 + +''' +Steps to run these cases: +- Build + - . ${IDF_PATH}/export.sh + - pip install idf_build_apps + - python tools/build_apps.py components/sensors/i2c_bus/test_apps -t esp32 +- Test + - pip install -r tools/requirements/requirement.pytest.txt + - pytest components/sensors/i2c_bus/test_apps --target esp32 +''' + +import pytest +from pytest_embedded import Dut + +@pytest.mark.target('esp32') +@pytest.mark.target('esp32c3') +@pytest.mark.target('esp32c6') +@pytest.mark.target('esp32s3') +@pytest.mark.env('generic') +@pytest.mark.parametrize( + 'config', + [ + 'defaults', + ], +) +def test_i2c_bus(dut: Dut)-> None: + dut.run_all_single_board_cases() diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/test_apps/sdkconfig.defaults b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/test_apps/sdkconfig.defaults new file mode 100644 index 000000000..f61533c30 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__i2c_bus/test_apps/sdkconfig.defaults @@ -0,0 +1,10 @@ +# For IDF 5.0 +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y +CONFIG_FREERTOS_HZ=1000 +CONFIG_ESP_TASK_WDT_EN=n +CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=4096 + +# For IDF4.4 +CONFIG_ESP32S2_DEFAULT_CPU_FREQ_240=y +CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240=y +CONFIG_ESP_TASK_WDT=n diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.build-test-rules.yml b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.build-test-rules.yml new file mode 100644 index 000000000..a1929adca --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.build-test-rules.yml @@ -0,0 +1,106 @@ +# ESP-MQTT Build Test Rules +# Consolidated manifest covering all examples and test apps + +.default_rules: &default_rules + disable: + - if: IDF_TARGET in ["esp32h21", "esp32h4"] + temporary: true + reason: not supported yet + - if: IDF_TARGET in ["esp32p4", "esp32h2"] and IDF_VERSION_MAJOR == 5 and IDF_VERSION_MINOR == 3 + temporary: true + reason: esp32p4/esp32h2 example dependencies require IDF versions other than 5.3 + disable_test: + - if: IDF_TARGET not in ["esp32"] + reason: Tests run only on ESP32 with ethernet runners + +# Basic TCP MQTT example +examples/tcp: + <<: *default_rules + +# SSL/TLS MQTT example +examples/ssl: + <<: *default_rules + disable_test: + - if: IDF_TARGET == IDF_TARGET + reason: CN verification enabled, tests disabled during server migration + +# WebSocket MQTT example +examples/ws: + <<: *default_rules + +# WebSocket Secure MQTT example +examples/wss: + <<: *default_rules + disable_test: + - if: IDF_TARGET == IDF_TARGET + reason: CN verification enabled, tests disabled during server migration + +# MQTT 5.0 protocol example +examples/mqtt5: + <<: *default_rules + +# SSL with mutual authentication +examples/ssl_mutual_auth: + <<: *default_rules + disable_test: + - if: IDF_TARGET == IDF_TARGET + reason: Advanced feature demonstration, only build + +# SSL with pre-shared keys +examples/ssl_psk: + <<: *default_rules + disable_test: + - if: IDF_TARGET == IDF_TARGET + reason: Advanced feature demonstration, only build + +# SSL with Digital Signature peripheral +examples/ssl_ds: + <<: *default_rules + disable: + - if: SOC_DIG_SIGN_SUPPORTED != 1 + reason: DS not present + disable_test: + - if: IDF_TARGET == IDF_TARGET + reason: Advanced feature demonstration, only build + +# Custom outbox implementation example +examples/custom_outbox: + <<: *default_rules + disable_test: + - if: IDF_TARGET == IDF_TARGET + reason: Advanced feature demonstration, only build + +test/apps: + disable: + - if: IDF_TARGET not in ["esp32"] + reason: Test apps build only for esp32 + disable_test: + - if: IDF_TARGET != "esp32" + temporary: false + reason: Only esp32 target has ethernet runners for integration tests + +# C++ compatibility build test +test/apps/build_test: + enable: + - if: IDF_TARGET in ["esp32", "esp32c3"] + reason: C++ compatibility build test + disable_test: + - if: IDF_TARGET != IDF_TARGET + temporary: false + reason: Build only test + +# Publish/Connect integration test +test/apps/publish_connect_test: + enable: + - if: IDF_TARGET in ["esp32"] + reason: Integration test for publish/connect functionality + disable_test: + - if: IDF_TARGET != "esp32" + temporary: false + reason: Only esp32 target has ethernet runners for integration tests + +# Host tests (unit tests with mocks) +test/host: + enable: + - if: IDF_TARGET in ["linux"] + reason: Host-based unit tests with mocked ESP-IDF components diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.component_hash b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.component_hash new file mode 100644 index 000000000..81dacc210 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.component_hash @@ -0,0 +1 @@ +ffdad5659706b4dc14bc63f8eb73ef765efa015bf7e9adf71c813d52a2dc9342 \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.editorconfig b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.editorconfig new file mode 100644 index 000000000..15977c64e --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.editorconfig @@ -0,0 +1,34 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# http://editorconfig.org + +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[{*.md,*.rst}] +trim_trailing_whitespace = false + +[{Makefile,*.mk,*.bat}] +indent_style = tab +indent_size = 2 + +[*/freertos/**] +indent_style = tab +indent_size = 4 + +[{*/freertos/**.S,**/FreeRTOSConfig.h}] +indent_style = space +indent_size = 4 + +[*.pem] +insert_final_newline = false + +[*.py] +max_line_length = 119 diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.gitignore b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.gitignore new file mode 100644 index 000000000..119e9fa75 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.gitignore @@ -0,0 +1,112 @@ +# Object files +*.o +*.ko +*.obj +*.elf + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ +*.su + +# ESP-IDF Build System +build/ +sdkconfig +sdkconfig.old +dependencies.lock +managed_components/ + +# ESP-IDF build directories (but not source directories like build_test) +**/build/ +**/build_esp32*/ +**/build_esp32c*/ +**/build_esp32s*/ +**/build_esp32h*/ +**/build_esp32p*/ +**/build_linux*/ + +# Examples and test app builds +examples/**/build/ +examples/**/build_esp32*/ +examples/**/build_esp32c*/ +examples/**/build_esp32s*/ +examples/**/build_esp32h*/ +examples/**/build_esp32p*/ +examples/**/sdkconfig +examples/**/sdkconfig.old +examples/**/dependencies.lock +examples/**/managed_components/ + +# Test application builds (specific build directories, not source) +test/apps/**/build/ +test/apps/**/build_esp32*/ +test/apps/**/build_esp32c*/ +test/apps/**/build_esp32s*/ +test/apps/**/build_esp32h*/ +test/apps/**/build_esp32p*/ +test/apps/**/sdkconfig +test/apps/**/sdkconfig.old +test/apps/**/dependencies.lock +test/apps/**/managed_components/ + +# Host test builds +test/host/build/ +test/host/sdkconfig +test/host/sdkconfig.old +test/host/dependencies.lock +test/host/managed_components/ + +# idf-ci generated files +app_info_*.txt +size_info_*.txt +compile_commands.json +*.log + +# Python cache and environments +__pycache__/ +*.pyc +*.pyo +.venv/ +.cache/ + +# Coverage and test results +**/coverage.xml +**/coverage.html +**/junit.xml +**/pytest_*.xml +**/test_results_*.xml + +# Documentation builds +docs/_build/ +docs/build/ + +# Distribution/packaging +dist/ +build/ +*.egg-info/ + +# CI/CD artifacts +build_child_pipeline.yml diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.gitlab/ci/build.yml b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.gitlab/ci/build.yml new file mode 100644 index 000000000..84e536a17 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.gitlab/ci/build.yml @@ -0,0 +1,27 @@ +# Note: No need to run build and test on master branch since we use FastForward merge strategy and so each merge request +# is tested and then merged onto top of master branch. + +.build_template: + stage: build + tags: + - build + - internet + script: + - pip install -U 'idf-ci<1' + - idf-ci build run + +build_idf_v5.3: + extends: .build_template + image: espressif/idf:release-v5.3 + +build_idf_v5.4: + extends: .build_template + image: espressif/idf:release-v5.4 + +build_idf_v5.5: + extends: .build_template + image: espressif/idf:release-v5.5 + +build_idf_latest: + extends: .build_template + image: espressif/idf:latest diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.gitlab/ci/deploy.yml b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.gitlab/ci/deploy.yml new file mode 100644 index 000000000..38920d139 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.gitlab/ci/deploy.yml @@ -0,0 +1,29 @@ +push_master_to_github: + stage: deploy + image: ${CI_DOCKER_REGISTRY}/esp32-ci-env + tags: + - build + only: + refs: + - master + - idf + when: on_success + variables: + GIT_STRATEGY: clone + script: + - source ${CI_PROJECT_DIR}/.gitlab/ci/utils.sh + - add_github_remote "$GH_PUSH_KEY" "$GH_PUSH_REPO" + - git push github HEAD:${CI_COMMIT_REF_NAME} + +upload_to_component_manager: + stage: deploy + image: python:3.10-alpine + tags: + - deploy + rules: + - if: '$CI_COMMIT_BRANCH == "master"' + script: + - pip install idf-component-manager + - export IDF_COMPONENT_API_TOKEN=${MQTT_COMPONENT_API_KEY} + - export COMP_VERSION=$(grep 'version:' idf_component.yml | head -n 1 | awk '{print $2}' | tr -d '"') + - compote component upload --namespace=espressif --name=mqtt --allow-existing --version=${COMP_VERSION} diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.gitlab/ci/docs.yml b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.gitlab/ci/docs.yml new file mode 100644 index 000000000..5402d094e --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.gitlab/ci/docs.yml @@ -0,0 +1,82 @@ +variables: + # System environment + ESP_DOCS_ENV_IMAGE: "$CI_DOCKER_REGISTRY/esp-idf-doc-env-v5.4:1-1" + ESP_DOCS_PATH: "$CI_PROJECT_DIR" + +docs_build: + stage: build + image: $ESP_DOCS_ENV_IMAGE + tags: + - build_docs + variables: + # Set Python buffering for better CI output + PYTHONUNBUFFERED: 1 + TYPE: "preview" + DOCS_BUILD_DIR: "${CI_PROJECT_DIR}/docs/_build/" + artifacts: + when: always + paths: + - docs/_build/*/*/*.txt + - docs/_build/*/*/html/* + expire_in: 4 days + before_script: + # Install ESP-IDF documentation build tool + - pip install -U pip + - pip install esp-docs linuxdoc + script: + - cd docs + - build-docs -t esp32 -l en + +.deploy_docs_template: + image: $ESP_DOCS_ENV_IMAGE + variables: + DOCS_BUILD_DIR: "${CI_PROJECT_DIR}/docs/_build/" + PYTHONUNBUFFERED: 1 + # ensure all tags are fetched, need to know the latest/stable tag for the docs + GIT_STRATEGY: clone + GIT_DEPTH: 0 + stage: test_deploy + tags: + - brew + - amd64 + script: + - source ${CI_PROJECT_DIR}/.gitlab/ci/utils.sh + # ensure all tags are fetched, need to know the latest/stable tag for the docs + - add_doc_server_ssh_keys $DOCS_DEPLOY_PRIVATEKEY $DOCS_DEPLOY_SERVER $DOCS_DEPLOY_SERVER_USER + - export GIT_VER=$(git describe --always ${PIPELINE_COMMIT_SHA} --) + - pip install esp-docs + - deploy-docs + +deploy_docs_preview: + extends: + - .deploy_docs_template + except: + refs: + - master + needs: + - docs_build + variables: + TYPE: "preview" + DOCS_BUILD_DIR: "${CI_PROJECT_DIR}/docs/_build/" + DOCS_DEPLOY_PRIVATEKEY: "$DOCS_PREVIEW_PRIVATEKEY" + DOCS_DEPLOY_SERVER: "$DOCS_PREVIEW_SERVER" + DOCS_DEPLOY_SERVER_USER: "$DOCS_PREVIEW_SERVER_USER" + DOCS_DEPLOY_PATH: "$DOCS_PREVIEW_PATH" + DOCS_DEPLOY_URL_BASE: "$DOCS_PREVIEW_URL_BASE" + +deploy_docs_prod: + extends: + - .deploy_docs_template + stage: deploy + only: + refs: + - master + needs: + - docs_build + variables: + TYPE: "production" + DOCS_DEPLOY_PRIVATEKEY: "$DOCS_PROD_PRIVATEKEY" + DOCS_DEPLOY_SERVER: "$DOCS_PROD_SERVER" + DOCS_DEPLOY_SERVER_USER: "$DOCS_PROD_SERVER_USER" + DOCS_DEPLOY_PATH: "$DOCS_PROD_PATH" + DOCS_DEPLOY_URL_BASE: "$DOCS_PROD_URL_BASE" diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.gitlab/ci/ignore_build_warnings.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.gitlab/ci/ignore_build_warnings.txt new file mode 100644 index 000000000..302920da0 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.gitlab/ci/ignore_build_warnings.txt @@ -0,0 +1,5 @@ +Warning: Deprecated: Option '--flash_size' is deprecated. Use '--flash-size' instead. +Warning: Deprecated: Option '--flash_mode' is deprecated. Use '--flash-mode' instead. +Warning: Deprecated: Option '--flash_freq' is deprecated. Use '--flash-freq' instead. +Warning: Deprecated: Command 'sign_data' is deprecated. Use 'sign-data' instead. +Warning: Deprecated: Command 'extract_public_key' is deprecated. Use 'extract-public-key' instead. diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.gitlab/ci/test.yml b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.gitlab/ci/test.yml new file mode 100644 index 000000000..86725ab46 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.gitlab/ci/test.yml @@ -0,0 +1,50 @@ +.add_gh_key_remote: &add_gh_key_remote | + curl -sSL ${CIT_LOADER_URL} | sh + source citools/import_functions + cit_add_ssh_key "${GH_PUSH_KEY}" + git remote remove github || true + git remote add github ${GH_PUSH_REPO} + +host_tests: + image: espressif/idf:latest + stage: test + tags: [build] + timeout: 1h + variables: + GIT_DEPTH: 1 + needs: [] + artifacts: + paths: + - "**/coverage.xml" + - "**/coverage.html" + expire_in: 1 week + when: always + reports: + junit: "**/junit.xml" + coverage_report: + coverage_format: cobertura + path: "**/coverage.xml" + before_script: + - pip install -U gcovr 'idf-ci<1' + script: + - idf-ci build run -t linux -p test/host + - cd test/host + - ./build_linux_coverage/host_mqtt_client_test.elf -r junit -o junit.xml + - cd ../.. + - gcovr --gcov-ignore-parse-errors -g -k -r . --html coverage.html -x coverage.xml + +check_remotes_sync: + stage: test_deploy + image: espressif/idf:latest + tags: + - build + - internet + needs: [] + except: + - master + - idf + script: + - *add_gh_key_remote + - git fetch --depth=1 origin master + - git fetch --depth=1 github master + - test "$(git rev-parse origin/master)" == "$(git rev-parse github/master)" diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.gitlab/ci/utils.sh b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.gitlab/ci/utils.sh new file mode 100644 index 000000000..2676b0918 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.gitlab/ci/utils.sh @@ -0,0 +1,26 @@ +function add_ssh_keys() { + local key_string="${1}" + mkdir -p ~/.ssh + chmod 700 ~/.ssh + echo -n "${key_string}" >~/.ssh/id_rsa_base64 + base64 --decode --ignore-garbage ~/.ssh/id_rsa_base64 >~/.ssh/id_rsa + chmod 600 ~/.ssh/id_rsa +} +function add_doc_server_ssh_keys() { + local key_string="${1}" + local server_url="${2}" + local server_user="${3}" + add_ssh_keys "${key_string}" + echo -e "Host ${server_url}\n\tStrictHostKeyChecking no\n\tUser ${server_user}\n" >>~/.ssh/config +} + +function add_github_remote() { + local key_string="${1}" + local remote_url="${2}" + add_ssh_keys "${key_string}" + if ! grep -q "Host github.com" ~/.ssh/config 2>/dev/null; then + printf "Host github.com\n\tStrictHostKeyChecking no\n" >>~/.ssh/config + fi + git remote remove github || true + git remote add github "${remote_url}" +} diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.idf_build_apps.toml b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.idf_build_apps.toml new file mode 100644 index 000000000..3117396e3 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.idf_build_apps.toml @@ -0,0 +1,18 @@ +# check the latest documentation at +# https://docs.espressif.com/projects/idf-build-apps/en/latest/references/config_file.html + +config_rules = ['sdkconfig.ci=default', 'sdkconfig.ci.*=', '=default'] + +recursive = true +check_warnings = true +keep_going = true + +build_dir = "build_@t_@w" +build_log_filename = "build.log" +size_json_filename = "size.json" + +collect_app_info_filename = "app_info_@p.txt" + +check_manifest_rules = true +manifest_filepatterns = ['**/.build-test-rules.yml'] +ignore_warning_files = ['.gitlab/ci/ignore_build_warnings.txt'] diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.idf_ci.toml b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.idf_ci.toml new file mode 100644 index 000000000..993c081e2 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.idf_ci.toml @@ -0,0 +1,21 @@ +# ESP-MQTT idf-ci Configuration +[gitlab.artifacts] +build_job_filepatterns = [ + "**/build*/partition_table/*.bin", + "**/build*/bootloader/*.bin", + "**/build*/bootloader/*.map", + "**/build*/bootloader/*.elf", + "**/build*/config/sdkconfig.json", + "**/build*/*.map", + "**/build*/*.bin", + "**/build*/*.elf", + "**/build*/flasher_args.json", +] + +test_job_filepatterns = [ + "**/test_logs", + "**/XUNIT_RESULT_*.xml", +] + +[gitlab.build_pipeline] +runs_per_job = 15 diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.travis.yml b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.travis.yml new file mode 100644 index 000000000..4affec10d --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/.travis.yml @@ -0,0 +1,65 @@ +sudo: false +language: bash +os: + - linux + +addons: + apt: + packages: + - gperf + - python + - python-serial + +before_install: + # Save path to the git respository + - PROJECT_PATH=$(pwd) + # Have to checkout a temp branch for later in tree reference + - git checkout -b temporary_ref_branch + - CI_COMMIT_SHA=$(git rev-parse HEAD) + # Test building with latest (stable == v3.3 for now) IDF + - LTS_IDF=release/v3.3 + +install: + # Install ESP32 toochain following steps as desribed + # in http://esp-idf.readthedocs.io/en/latest/linux-setup.html + # + # Get required packages - already done above, see addons: apt: packages: + # - sudo apt-get install git wget make libncurses-dev flex bison gperf python python-serial + # Prepare directory for the toolchain + - mkdir -p ~/esp + - cd ~/esp + # Download binary toolchain for the ESP32 + - wget https://dl.espressif.com/dl/xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz + - tar -xzf xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz + # Get ESP-IDF from github (non-recursive to save time, later we update submodules for different versions) + - git clone https://github.com/espressif/esp-idf.git + # Set the path to ESP-IDF directory + - export IDF_PATH=~/esp/esp-idf + - python -m pip install --user -r $IDF_PATH/requirements.txt + # Setup build tool: xtensa-esp32-elf and idf.py + - export PATH=$PATH:$HOME/esp/xtensa-esp32-elf/bin:$IDF_PATH/tools + +script: + # Legacy build with IDF < 3.2 + - cd $IDF_PATH + - git checkout v3.1 && git submodule update --init --recursive + - cd $PROJECT_PATH + - ./ci/modify_for_legacy_idf.sh ${LTS_IDF} || true + - cd $PROJECT_PATH/examples/tcp + - make defconfig + - make -j4 + # Build with v3.3 (LTS) IDF + - cd $IDF_PATH + - git checkout ${LTS_IDF} && git submodule update --init --recursive + - cd $IDF_PATH/components/mqtt/esp-mqtt + - git remote add local $PROJECT_PATH/.git + - git fetch local + - git reset --hard $CI_COMMIT_SHA + - cd $IDF_PATH/examples/protocols/mqtt/tcp + - idf.py build + - cd $IDF_PATH/examples/protocols/mqtt/ssl + - idf.py build + - cd $IDF_PATH/examples/protocols/mqtt/ws + - idf.py build + - cd $IDF_PATH/examples/protocols/mqtt/wss + - idf.py build \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/CHECKSUMS.json b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/CHECKSUMS.json new file mode 100644 index 000000000..00493c9b3 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/CHECKSUMS.json @@ -0,0 +1 @@ +{"version":"1.0","algorithm":"sha256","created_at":"2025-09-17T12:32:25.834794+00:00","files":[{"path":".build-test-rules.yml","size":3148,"hash":"5d65aecb48c2d6945a9d84b6ef63dab95687248ba0d5c96cde4264304da32790"},{"path":".editorconfig","size":595,"hash":"0592d873d53552677f17072f27cd86c519ba07b9ae09c50e12fd4897d0462e16"},{"path":".gitignore","size":1724,"hash":"1a31ebe938735595df33adf681fd3416428e958a82daf6ebd90e6c077cc16d90"},{"path":".idf_build_apps.toml","size":543,"hash":"0b2142700fd70a0682050577d0448cd690aee239417989bd54db16eefb6c4612"},{"path":".idf_ci.toml","size":485,"hash":"43b096498c023040f9d2ccc00a05e4d4eed3c890d36853e532caf780bd37291e"},{"path":".travis.yml","size":2196,"hash":"95750cb0110692f20f5df9e63a5c59fa985fd862d83a2cf109471f07debd4a26"},{"path":"CMakeLists.txt","size":622,"hash":"b6bd1b528700e2ff567ccba36a7692c34a8fcdce86a51a3481c2ea5be2514d62"},{"path":"Kconfig","size":6648,"hash":"4584e68452c6d1c02a935d7c9a988b6caa7e4976ca8e3dbb62ae2e9e1bc89135"},{"path":"LICENSE","size":11339,"hash":"20ed622a5f1a273258b415097609f6a236fb2f23f8c593c63e29e6cc77de0032"},{"path":"README.md","size":2097,"hash":"388922ed982a05c6e2b17eb9c583b7e73393bb66f52d8670b4e15674c8e690d5"},{"path":"coverage.html","size":15598,"hash":"fe96cfbbb16636d99a48aebcfa090cfb4dd249b80728d52e4795707eef203ff9"},{"path":"coverage.xml","size":383,"hash":"29f272a3fd2cf98fcfef1a5a83fa0fd06f6182708b3423fe8c92ff7227b640f9"},{"path":"idf_component.yml","size":587,"hash":"de5eb67afef8fd3f7f0cc769a83e3f133ac9b892c9135e8b69b131c3b6e47b9e"},{"path":"mqtt5_client.c","size":33116,"hash":"05973d1bd85e7844d6b21df80489e4ca63a4596338f995e30230c6c0d5cb23df"},{"path":"mqtt_client.c","size":99989,"hash":"4b24720b34c2bd44b0857a5251f5392663225c618595229540b35f1529663a9a"},{"path":"pytest.ini","size":708,"hash":"eb1e46050a53c5cc8a36306416977051cc96d095d558116310ec14099d14d50c"},{"path":"static-analysis-rules.yml","size":152,"hash":"5388e0824a15876b022b4b0efc09b17b9f25b0afa8f31e9520b0f4a0a02cc0b5"},{"path":"docs/Doxyfile","size":1617,"hash":"54bea31a8741fb1670aad8e1280c5162d56b4fd02823796c9c3fa1cb6a19dd4e"},{"path":"docs/conf_common.py","size":1005,"hash":"ec735c12fc953d84f1c0650f5675a285bf009ae5edd296df0d5b35f2ab53b4e3"},{"path":"docs/doxygen-known-warnings.txt","size":104,"hash":"2d963560507e50f94c3b1f6c058a0bc594eb5f2e329d826dfe9fc2dfe299bf68"},{"path":"docs/sphinx-known-warnings.txt","size":3209,"hash":"414485def9bc11d6c45c89624b1a2157fd24d4b13de715be43171631cad99414"},{"path":"include/mqtt5_client.h","size":14938,"hash":"8d2fc142e3e5a7ce7c1d2bac655df8722245bdd081cfe11f8e9d1824784584ec"},{"path":"include/mqtt_client.h","size":32426,"hash":"6b05afe12c80f9a77127f776c2ed787a67e22cba3be7ad66358efe470b221bd5"},{"path":"include/mqtt_supported_features.h","size":2648,"hash":"49f5d5b95c5d284083569c4cc7cc72df60410230d836d760ea6cf1b0a7961d4f"},{"path":"lib/mqtt5_msg.c","size":49594,"hash":"615bf5574776c65cd0496c99e1f6c3c31fe344da9aefbc7e3a77958f87e8c8cd"},{"path":"lib/mqtt_msg.c","size":20083,"hash":"f536a71cb75bcf054f997bda520c3a2f804daa29831ed18277fb3d8f9fe00087"},{"path":"lib/mqtt_outbox.c","size":6749,"hash":"14e8db1fae7006ed4647646d0086b7a91919260b4bb6f64f57cdc23a6840af9f"},{"path":"lib/platform_esp32_idf.c","size":1130,"hash":"31cff57ddebb2544feae66ff0488daf19af38cd28831f225d4775c2c8a33f7e4"},{"path":"test/host/CMakeLists.txt","size":666,"hash":"a75bf83c46f4cc0e1e7aea1cd748ccfbb32bf9216a262127ca977a2bfdcd7fd7"},{"path":"test/host/README.md","size":502,"hash":"5ac037b59086239896a5fafb491b55d4d025255e60ad9f5983cf17d6531d6e46"},{"path":"test/host/sdkconfig.ci.coverage","size":22,"hash":"3af786d60d341eebc0905750dddacc0639c623663ed638792c46f957a4baf3c7"},{"path":"test/host/sdkconfig.defaults","size":211,"hash":"1b722f26c279027f3a08001a389fc6ef41bf87e629e8e9f60c28936ac1d4f775"},{"path":"test/host/main/CMakeLists.txt","size":1083,"hash":"583d2601e09d238f698b9b43d78314cdbafddb7095de6db6ad04abd0778fcfef"},{"path":"test/host/main/Kconfig","size":177,"hash":"2b316639175c9ec220b7ae785765493e30f867f76c1dbb9617d5fa388c5815db"},{"path":"test/host/main/idf_component.yml","size":203,"hash":"b9385d15c2ac8400f5c857d224006e84c60da59e5188c232f5ee460cc09ccc70"},{"path":"test/host/main/test_mqtt_client.cpp","size":6752,"hash":"1dfb612ea88e6b36921572020fae116bde68de753ae890b9ff37e75db73582d3"},{"path":"test/host/mocks/include/sys/queue.h","size":2220,"hash":"24e7bd0df69cfb30e7460af398134075fa56bfadfbefa81a5bbaa0c9e012cc70"},{"path":"test/apps/common/CMakeLists.txt","size":188,"hash":"0f3d32701ae15c094170b549400f1d61450ac1e1395916fcb3622cc05e70fb21"},{"path":"test/apps/common/test_mqtt_connection.c","size":5352,"hash":"658463962b9866114ea5bdff6551522ee842445525426e283098f4d43b99b8a6"},{"path":"test/apps/mqtt/CMakeLists.txt","size":519,"hash":"fcfa074033b1b6f094832972f40a413a7e0293ccc0043d52d498bcdba6e02889"},{"path":"test/apps/mqtt/README.md","size":82,"hash":"05a6bd555a813916fb24460b83a691b94fc4bf09871b510a3c3493822037b36a"},{"path":"test/apps/mqtt/pytest_mqtt_ut.py","size":378,"hash":"1911a45931f086b5f39c6c0d6ab9fd158fc40a238cd1a2c3466db6b17764fb51"},{"path":"test/apps/mqtt/sdkconfig.ci.default","size":184,"hash":"be57ca92d356bfd36397babac94d690e5ba2e14ce7c83dae9360457a6d4ef959"},{"path":"test/apps/mqtt/sdkconfig.defaults","size":95,"hash":"b9002ecbf28b4125fef5770511c85b2f9ee04f14fbdd8110a5f5a03d6f9e4490"},{"path":"test/apps/mqtt5/CMakeLists.txt","size":520,"hash":"d87dbc309f001e8607f1da0fd746d4906783688dd8363f36e807c977063f73fa"},{"path":"test/apps/mqtt5/README.md","size":82,"hash":"05a6bd555a813916fb24460b83a691b94fc4bf09871b510a3c3493822037b36a"},{"path":"test/apps/mqtt5/pytest_mqtt5_ut.py","size":379,"hash":"c21608c95cc874c1673052689624a208e24a7a4a9393c898bd3d91581a60e7da"},{"path":"test/apps/mqtt5/sdkconfig.ci.default","size":184,"hash":"be57ca92d356bfd36397babac94d690e5ba2e14ce7c83dae9360457a6d4ef959"},{"path":"test/apps/mqtt5/sdkconfig.defaults","size":120,"hash":"cf7a6b828fa9bc5b7cb4900df31f5b560f61d3d487aa0783b00c747375b6bca1"},{"path":"test/apps/publish_connect_test/CMakeLists.txt","size":835,"hash":"be324b6b124e586144f8207bd2abc35b130632c78c617a61662a1051cbc6e3e9"},{"path":"test/apps/publish_connect_test/README.md","size":1238,"hash":"395413b6b9f47663959df3c3a34da8c67e8e84d2b3a83680c8dfd8464abed83d"},{"path":"test/apps/publish_connect_test/ca.crt","size":1135,"hash":"ddccb46bfeae064b591ea3d09ec16a68d57c78348a3557935f63ff0e9dfba826"},{"path":"test/apps/publish_connect_test/ca.der","size":797,"hash":"da8d302d190589b28a378ba41934db584aa45f2a1546348b3f7536a56d5b646c"},{"path":"test/apps/publish_connect_test/ca.key","size":1708,"hash":"54157361c60b97ce743fb8f875466311fd0e1f873224f16ef611bb8339cd638d"},{"path":"test/apps/publish_connect_test/client_inv.crt","size":1099,"hash":"8208370061d0d89d18e0f87b85c8d0879ff4fef46e4c99b32c84b116be905efb"},{"path":"test/apps/publish_connect_test/client_no_pwd.key","size":1704,"hash":"1d1df8ff79d756700952d4c4d16d8b5f9dc2a00069304cdabec79534a8ae09b0"},{"path":"test/apps/publish_connect_test/client_pwd.crt","size":1086,"hash":"f3b3ae6596c5bd59cb349921ffda34e086e3a259c8554f76b709e8992149d18e"},{"path":"test/apps/publish_connect_test/client_pwd.key","size":1886,"hash":"1eb44d11023b9af728a6e0f234754de14e29de176ba4fb6415f6edc59fa4732c"},{"path":"test/apps/publish_connect_test/pytest_mqtt_app.py","size":11374,"hash":"88db6ab27d5e17a317225ff53d41488dade5fdb82d5e1b0800074f4b3d9c9e25"},{"path":"test/apps/publish_connect_test/pytest_mqtt_publish_app.py","size":15180,"hash":"08f4daeb2923fcab3008202aaac5197de39d8044d190fad92337247b5d514306"},{"path":"test/apps/publish_connect_test/sdkconfig.ci.default","size":866,"hash":"114c1e7efde7ddf1b83ec97093614db699fe57d73e80c5d663c5838d68bd2b96"},{"path":"test/apps/publish_connect_test/sdkconfig.ci.local_broker","size":473,"hash":"d5a8fc690149ecdd65ad7d02e0bcfe999ffbe9ba42aa54aa198966d385166dc8"},{"path":"test/apps/publish_connect_test/server.key","size":1675,"hash":"e567ff3810f9440dcddb6fc14e2bf93a236f9413d8863f0ae8d3baf6796c7ac8"},{"path":"test/apps/publish_connect_test/main/CMakeLists.txt","size":250,"hash":"c8642ab0e5df5c8d2f128f027a5e54c25a9e28788acbb61e828f77b2cc1d72f3"},{"path":"test/apps/publish_connect_test/main/Kconfig.projbuild","size":2698,"hash":"ff7fbe8020c57bf0ad72cd15bb2930d38780d9e5ae1bf81a0204ae438f46aaad"},{"path":"test/apps/publish_connect_test/main/connect_test.c","size":7886,"hash":"da47055a1de5755b502ab22718d7fb2c9110e19d6cbafd313f9c27893f650998"},{"path":"test/apps/publish_connect_test/main/idf_component.yml","size":300,"hash":"f04be606ccd04822c07464a2f438b272e420ff2adc638094e963161e66b77af1"},{"path":"test/apps/publish_connect_test/main/mqtt_eclipseprojects_io.pem","size":1826,"hash":"177e1b8fc43b722b393f4200ff4d92e32deeffbb76fef5ee68d8f49c88cf9d32"},{"path":"test/apps/publish_connect_test/main/publish_connect_test.c","size":11287,"hash":"5802889ae473dae42f40c2d03a6c6877e115bfbb8146069b33f068866346389e"},{"path":"test/apps/publish_connect_test/main/publish_connect_test.h","size":1556,"hash":"b6860ff0f99d2d44e82e0465fc0d831fc59c7a8735ed18a1ea7a34d00aff2de7"},{"path":"test/apps/publish_connect_test/main/publish_test.c","size":9524,"hash":"cc447a94bb44325e1a88c5b6a2339e06ab192b7c5f85d1c913bf33226b8e55e4"},{"path":"test/apps/mqtt5/main/CMakeLists.txt","size":184,"hash":"f662a4161c94c83a80cdfc49752ce14a9fccc0f39199f073f7ede5bdfcc996bf"},{"path":"test/apps/mqtt5/main/Kconfig.projbuild","size":438,"hash":"c9ee0b12c2a4cc3860a5849e07bc6d56e392d3138023683e0b17f31c83f4a18e"},{"path":"test/apps/mqtt5/main/idf_component.yml","size":81,"hash":"01bec0cacc38aefd5f5b032321b51cf2678669e60f7cfe7c28d0e57ebb409e28"},{"path":"test/apps/mqtt5/main/test_mqtt5.c","size":5917,"hash":"f47ee72395036d275e501348862606868ae3e67d216075c077b1d1ba8cea7841"},{"path":"test/apps/mqtt5/main/test_mqtt5_client_broker.c","size":11590,"hash":"2846d59012da765713e4e9cccbea4f14408561acda9f62cc5a49ef52ef0d0433"},{"path":"test/apps/mqtt5/main/test_mqtt5_client_broker.h","size":1653,"hash":"b22dd1e5fc7c9aa86fd287b77328b0e50b4ef51fcc3dcb4a6b716224543012ca"},{"path":"test/apps/mqtt/main/CMakeLists.txt","size":280,"hash":"bf563d3e2058962f6258fd4e797f7833d5c392f2c497989a3f00d6aa5b6d567a"},{"path":"test/apps/mqtt/main/Kconfig.projbuild","size":438,"hash":"c9ee0b12c2a4cc3860a5849e07bc6d56e392d3138023683e0b17f31c83f4a18e"},{"path":"test/apps/mqtt/main/idf_component.yml","size":93,"hash":"f381001de37b61491ceb74caf5e8e753cbd3971fcf8fcdbc45e280b45ce183f1"},{"path":"test/apps/mqtt/main/test_mqtt.c","size":3893,"hash":"89282cbea9c052f6ff15dd198a0f94ba9373e3d947773d1299a6482925724f19"},{"path":"test/apps/mqtt/main/test_mqtt_client_broker.c","size":8839,"hash":"2b1f18d47b921c38d4ef13ab8bf89529ded91563aa5d3bea4b590bab7e6fd3a0"},{"path":"test/apps/mqtt/main/test_mqtt_client_broker.h","size":1641,"hash":"a37f3a5f84b2edf5b94673d98f7eaa11a8f6b51c0028ff476d0720e59d2ad94e"},{"path":"test/apps/common/include/test_mqtt_connection.h","size":373,"hash":"6af9cce1f3ea9d7010d227a18e4aa94e0a97d0780897b87d745d4b93a6d7d5c0"},{"path":"lib/include/mqtt5_client_priv.h","size":2405,"hash":"6c7b225be69b9cb6c14416b4ac153d6aa5544c00e3918da0bf96f8c4bee1ed58"},{"path":"lib/include/mqtt5_msg.h","size":6180,"hash":"86c50af4687528e27e940bbaf80d6247969a8bb52fa03e360f1817ceb975518f"},{"path":"lib/include/mqtt_client_priv.h","size":3891,"hash":"ee8f464f6cbf77a83468126bf22d91833b9c2b8985ba5860381acb99a655c565"},{"path":"lib/include/mqtt_config.h","size":3107,"hash":"1237445252e445f5fae23b2c9171ce101445667be9b8de1d87c4e34702eac948"},{"path":"lib/include/mqtt_msg.h","size":5746,"hash":"40be3eca3c6cd60ffe22d43ae5be0ac0d1a52b2e2152d95ece75b708e1ca245e"},{"path":"lib/include/mqtt_outbox.h","size":2197,"hash":"4eacd0383171e881053ed256147017adc24de2754130462367ff332ff03fd2fa"},{"path":"lib/include/platform.h","size":296,"hash":"54ebf11150b6ff7e0d0d075f779e9a78e49d74fa594251af4d04c1579d351c7b"},{"path":"lib/include/platform_esp32_idf.h","size":1057,"hash":"9ff4b5254413f07096edba16d836238baedefd8f06130f1b41f68c1aef77dfbb"},{"path":"examples/custom_outbox/CMakeLists.txt","size":1001,"hash":"b872815f45c40599c68de1a3325b4ece8be444ac36328bf89bcaab66f3b1732d"},{"path":"examples/custom_outbox/README.md","size":5184,"hash":"009c36deaa1e4fdfa6b33bd39f15a844bd8128d17f90971f1400d6adfade84a7"},{"path":"examples/custom_outbox/sdkconfig.ci.esp32c6","size":42,"hash":"6653345afbb8d5c69f9bf91a74b562dd46c294a1c010a588b352e0ee57ddf1c1"},{"path":"examples/custom_outbox/sdkconfig.defaults","size":97,"hash":"c232fdd54ac529504969b8ddcc5a3b35aff8d434ba96390a11838e2db0eaee91"},{"path":"examples/mqtt5/CMakeLists.txt","size":370,"hash":"f7f6a6fead2c0465dac0c76a9eb81821d2e16b6f1c1f8719b70b8ab3f6ca66aa"},{"path":"examples/mqtt5/README.md","size":4220,"hash":"c9dda1a58b8daac04d79e754dc9202f1a841b906104e8f456d3d64e90f826748"},{"path":"examples/mqtt5/pytest_mqtt5.py","size":2536,"hash":"ed760f8e537c9dda9e361337bd748e844bdaf709c47f4ee64a62a45c39c9c211"},{"path":"examples/mqtt5/sdkconfig.ci","size":342,"hash":"c63d1df38e0d67b266b5eda9ea1565815bc37e58e0ebfa456a8f44eda590af5e"},{"path":"examples/mqtt5/sdkconfig.defaults","size":25,"hash":"f7c2090e8fc46c205de9aadd0559955e4b60813a0b746db7f36c6744b1de28c7"},{"path":"examples/ssl/CMakeLists.txt","size":458,"hash":"09b4628767c43f54599616a3125810811ffce4dc0dab9b499bd447015d510acb"},{"path":"examples/ssl/README.md","size":3564,"hash":"a7b5817b1f1d105c45d7382b1d3d86b022fc36c337a41b6e00515715dd675653"},{"path":"examples/ssl/pytest_mqtt_ssl.py","size":5518,"hash":"3c0d93f5794477502692e7d5d197ecd663a1231809eab8d6b81ac035830b45cb"},{"path":"examples/ssl/sdkconfig.ci","size":799,"hash":"29b0688a821085bccda1492e36bcbf856d3a6f447a1e0f35d4bd57a5d2d99f17"},{"path":"examples/ssl_ds/CMakeLists.txt","size":824,"hash":"770efd0ba7cbac114c3d7a104b737abfef48ee31708a32931797c7dbba06736a"},{"path":"examples/ssl_ds/README.md","size":5530,"hash":"b9957d1f8687d4a8c84f87c7b0ac2ccce0bcb4042ac04c7182f2c80115cf99eb"},{"path":"examples/ssl_ds/partitions.csv","size":177,"hash":"24f1257782a2df023bc65260364b5c9d2bf51bd6adbb77e4eb1132356c676d68"},{"path":"examples/ssl_ds/sdkconfig.defaults","size":398,"hash":"ad76f67287d9cf78466129ac6fc3866528c186691b034981dba96dd2bc0d0577"},{"path":"examples/ssl_ds/sdkconfig.defaults.esp32h2","size":64,"hash":"3aff995924e7aef20d4c61e143a1865f38eb4d1924014bb1364020db2bb3853a"},{"path":"examples/ssl_mutual_auth/CMakeLists.txt","size":612,"hash":"5455aecbfc4a7ecfa3ce1afe696e1708c48c48bbdf054794a0edff97385298e3"},{"path":"examples/ssl_mutual_auth/README.md","size":3680,"hash":"e26fc8c401a2ebb86e45e2a743fdee238edcdfb028e8b65660c661fbda556016"},{"path":"examples/ssl_mutual_auth/sdkconfig.defaults","size":61,"hash":"5765b89fbc38d2773ee9cf5ba18ba9dc11b36d35140496e4814a79e2664566fc"},{"path":"examples/ssl_mutual_auth/sdkconfig.defaults.esp32c5","size":42,"hash":"6653345afbb8d5c69f9bf91a74b562dd46c294a1c010a588b352e0ee57ddf1c1"},{"path":"examples/ssl_mutual_auth/sdkconfig.defaults.esp32c6","size":42,"hash":"6653345afbb8d5c69f9bf91a74b562dd46c294a1c010a588b352e0ee57ddf1c1"},{"path":"examples/ssl_mutual_auth/sdkconfig.defaults.esp32c61","size":42,"hash":"6653345afbb8d5c69f9bf91a74b562dd46c294a1c010a588b352e0ee57ddf1c1"},{"path":"examples/ssl_psk/CMakeLists.txt","size":377,"hash":"125efcc26092f44c25d4999057e9b30af2869fdfd49d9c7c9b9ebd797c8836a0"},{"path":"examples/ssl_psk/README.md","size":3434,"hash":"195de8fee9bfd710d1515ba3b788db16dd6daa72c794ff6a26fa143ff4579636"},{"path":"examples/ssl_psk/sdkconfig.defaults","size":34,"hash":"821e05eaf372af317ef78a85f7eeb4ede94542ae3a27361971d15ebf80d9ce9a"},{"path":"examples/ssl_psk/sdkconfig.defaults.esp32c5","size":42,"hash":"6653345afbb8d5c69f9bf91a74b562dd46c294a1c010a588b352e0ee57ddf1c1"},{"path":"examples/ssl_psk/sdkconfig.defaults.esp32c6","size":42,"hash":"6653345afbb8d5c69f9bf91a74b562dd46c294a1c010a588b352e0ee57ddf1c1"},{"path":"examples/ssl_psk/sdkconfig.defaults.esp32c61","size":42,"hash":"6653345afbb8d5c69f9bf91a74b562dd46c294a1c010a588b352e0ee57ddf1c1"},{"path":"examples/tcp/CMakeLists.txt","size":373,"hash":"f63ad62560d2405c09beac72021cf3a2075673e422862823d5b49c72953a2116"},{"path":"examples/tcp/README.md","size":19224,"hash":"20d2e8b51d2c5196d08a3381d7d411b3debdd631d350b07d3473f6f906afbdcf"},{"path":"examples/tcp/pytest_mqtt_tcp.py","size":3642,"hash":"bb406e775a1d51f7b4cd158e7221c52c0f6b93a1b65863b1aa7a25e95f606447"},{"path":"examples/tcp/sdkconfig.ci","size":422,"hash":"54f668b27cb3ad19c10ed2e2ded73f12f009e86ebace337a2d31426632e8fc8f"},{"path":"examples/tcp/sdkconfig.ci.p4_eppp","size":182,"hash":"dfaf1bb40a2ad6c4fcc5e45713b30a26af7f9f3febefe2a6118d8108baba2094"},{"path":"examples/tcp/sdkconfig.ci.p4_wifi","size":98,"hash":"4b89fef2f2d4145b7d1c3a9ab843e584d7f4f00ae53c8dca903f895ce5fbc448"},{"path":"examples/tcp/sdkconfig.ci.ppp_connect","size":100,"hash":"977baff7c71bbdd5387b68d38a95d79177d2727e01ec2644750af0cf8c59b019"},{"path":"examples/ws/CMakeLists.txt","size":379,"hash":"b3a041e7ea1618c6e7c4842c0492e37ddec0f8c69773bd5be761768877b14841"},{"path":"examples/ws/README.md","size":2750,"hash":"f75c38abe84e96e7a8bcbc4d926cade57d80b7f45cb1a7d0ad12616283d9f5af"},{"path":"examples/ws/pytest_mqtt_ws_example.py","size":4107,"hash":"0e9aa67e88d84191a9015f07a2e05b98d900f1fc894da5fa95d767a974791d74"},{"path":"examples/ws/sdkconfig.ci","size":379,"hash":"465e344f384925435796a053f7c0d7704bbd81c00d7cafec08b3273dc85348b4"},{"path":"examples/wss/CMakeLists.txt","size":471,"hash":"2573e473265321aa836966d9300e961ca13ae8b29535274e4c7abdaeb622397d"},{"path":"examples/wss/README.md","size":3668,"hash":"abf6ca09a712fd3fa3cafa1ecc9944208ce0f35ef68625213c48af0469ca4c64"},{"path":"examples/wss/pytest_mqtt_wss_example.py","size":4261,"hash":"384fa7430531bc2d82e8b30a6301566b786c414362cd4293cb466d8c97b26feb"},{"path":"examples/wss/sdkconfig.ci","size":486,"hash":"1f7bb5d15ca76fe2170cdf14d40081fe078ce48938826899fa50975b35c43a94"},{"path":"examples/wss/main/CMakeLists.txt","size":137,"hash":"a5c4a973356fb78f8750946fb88d88da48555428d8a4b64fbe4f237f47ede634"},{"path":"examples/wss/main/Kconfig.projbuild","size":601,"hash":"076928b4213427f8afc3a36f91ded021695817ea96b4d51d7c6e3d96984da1e9"},{"path":"examples/wss/main/app_main.c","size":5012,"hash":"51d9625834ce5d699a90b2d17a9961ef3ce5686f865263a0a60f8dc12cf0a0e0"},{"path":"examples/wss/main/idf_component.yml","size":151,"hash":"c0f5b42698e8774ad57951b73c5d5f69197975a29b8cc4added119730ca77530"},{"path":"examples/wss/main/mqtt_eclipseprojects_io.pem","size":1826,"hash":"177e1b8fc43b722b393f4200ff4d92e32deeffbb76fef5ee68d8f49c88cf9d32"},{"path":"examples/ws/main/CMakeLists.txt","size":137,"hash":"a5c4a973356fb78f8750946fb88d88da48555428d8a4b64fbe4f237f47ede634"},{"path":"examples/ws/main/Kconfig.projbuild","size":223,"hash":"17ab4dca8eca03919cc925f16c3427afe59a62799b36acfa45c57a72a0181968"},{"path":"examples/ws/main/app_main.c","size":5473,"hash":"6960b1c551b79b7d0cab7614402931edba2ed6797fe784179d240da3c589dde7"},{"path":"examples/ws/main/idf_component.yml","size":151,"hash":"c0f5b42698e8774ad57951b73c5d5f69197975a29b8cc4added119730ca77530"},{"path":"examples/tcp/main/CMakeLists.txt","size":138,"hash":"616803f5a7096a312dd0e6c8174c707754b99a3aa93f51be3c8caa43dcc03662"},{"path":"examples/tcp/main/Kconfig.projbuild","size":289,"hash":"3c9a63b6def6d2a7709d61a6471824a0c5a23bf3c0e081b1003a420d7c4c0277"},{"path":"examples/tcp/main/app_main.c","size":6025,"hash":"4f7e16a458ced882106524aca47678be51451241392ac532644316193b8335e1"},{"path":"examples/tcp/main/idf_component.yml","size":350,"hash":"fbbeb42b0c08542897d2641801e5d39f6b7ff17cb4c3c91dcca1244cdedef7fd"},{"path":"examples/ssl_psk/main/CMakeLists.txt","size":137,"hash":"a5c4a973356fb78f8750946fb88d88da48555428d8a4b64fbe4f237f47ede634"},{"path":"examples/ssl_psk/main/app_main.c","size":5302,"hash":"cade7b6ce79f5128cb052a51d4f6e43fc1aba1f85623e0022cd9b63c6f280ae2"},{"path":"examples/ssl_psk/main/idf_component.yml","size":151,"hash":"c0f5b42698e8774ad57951b73c5d5f69197975a29b8cc4added119730ca77530"},{"path":"examples/ssl_mutual_auth/main/CMakeLists.txt","size":137,"hash":"a5c4a973356fb78f8750946fb88d88da48555428d8a4b64fbe4f237f47ede634"},{"path":"examples/ssl_mutual_auth/main/app_main.c","size":6024,"hash":"29320351a92255ec4acaf47ced0b3dee58b16a8207da790b6f736685447e0516"},{"path":"examples/ssl_mutual_auth/main/client.crt","size":77,"hash":"25fad8bcc56d47c66a23431921b91d44d2b9366f6949b5efc578f2af5ecc3ff4"},{"path":"examples/ssl_mutual_auth/main/client.key","size":69,"hash":"b8f709f7213eee2e73a2db7d41cc8eea79fed1fa3ccd0302b4303bf2f7bef443"},{"path":"examples/ssl_mutual_auth/main/idf_component.yml","size":151,"hash":"c0f5b42698e8774ad57951b73c5d5f69197975a29b8cc4added119730ca77530"},{"path":"examples/ssl_mutual_auth/main/mosquitto.org.crt","size":1452,"hash":"45612492b0690dc1f16b97c2df2d1649fababcc1bf52ca0c12935dbda00ad7e6"},{"path":"examples/ssl_ds/main/CMakeLists.txt","size":128,"hash":"7a64b2072f11c6455560ac42e585504339d9c26ddd5531df296ccd67e17c62bd"},{"path":"examples/ssl_ds/main/app_main.c","size":5586,"hash":"e9be245f7bf2ddf7684a714f2222782554f9d401eaede49fab173ff54db04536"},{"path":"examples/ssl_ds/main/idf_component.yml","size":191,"hash":"86ad970e52663aba7d977db6a5aacf92a72b4b3aa2ebffd60b862a9dfb8d2c94"},{"path":"examples/ssl_ds/main/mosquitto.org.crt","size":1456,"hash":"0ceb5dcc23f6216941d0ca68bbf3c9356c32dd2acd9149c60460fbf48fb2dc3b"},{"path":"examples/ssl/main/CMakeLists.txt","size":163,"hash":"719fa26a6a472355f326c90b4d950b11a4e2fd3c9eb8decae8d0d9f44c2c1958"},{"path":"examples/ssl/main/Kconfig.projbuild","size":849,"hash":"9a02eb5733e5ffe87e9415073372e9a618561a2443d66c92a14b39ae6545a206"},{"path":"examples/ssl/main/app_main.c","size":6900,"hash":"80cf5ad0fab1ee37145dd1c7a0be40c28ad317a2ea632cecbda0023caab06f17"},{"path":"examples/ssl/main/idf_component.yml","size":151,"hash":"c0f5b42698e8774ad57951b73c5d5f69197975a29b8cc4added119730ca77530"},{"path":"examples/ssl/main/mqtt_eclipseprojects_io.pem","size":1826,"hash":"177e1b8fc43b722b393f4200ff4d92e32deeffbb76fef5ee68d8f49c88cf9d32"},{"path":"examples/mqtt5/main/CMakeLists.txt","size":138,"hash":"616803f5a7096a312dd0e6c8174c707754b99a3aa93f51be3c8caa43dcc03662"},{"path":"examples/mqtt5/main/Kconfig.projbuild","size":289,"hash":"3c9a63b6def6d2a7709d61a6471824a0c5a23bf3c0e081b1003a420d7c4c0277"},{"path":"examples/mqtt5/main/app_main.c","size":12375,"hash":"f459e7027e6b763917e7cdc04d33c9ee7c1229d927f74f2f08a2337e7c611180"},{"path":"examples/mqtt5/main/idf_component.yml","size":151,"hash":"c0f5b42698e8774ad57951b73c5d5f69197975a29b8cc4added119730ca77530"},{"path":"examples/custom_outbox/main/CMakeLists.txt","size":159,"hash":"6da8fcc6003d843f2aedab6adf2c0273e5d4b3421e77be8c95636250911674b7"},{"path":"examples/custom_outbox/main/Kconfig.projbuild","size":289,"hash":"3c9a63b6def6d2a7709d61a6471824a0c5a23bf3c0e081b1003a420d7c4c0277"},{"path":"examples/custom_outbox/main/app_main.c","size":6448,"hash":"9a7e6802f5b680cb3b5a76976e1e115fa8e7ac269711479094f6d48becd9742a"},{"path":"examples/custom_outbox/main/custom_outbox.cpp","size":13353,"hash":"a32a650d9cb60cf88e4c5ab1415fcbb657459362e375417e5adcd702cb5de8a2"},{"path":"examples/custom_outbox/main/idf_component.yml","size":151,"hash":"c0f5b42698e8774ad57951b73c5d5f69197975a29b8cc4added119730ca77530"},{"path":"docs/en/conf.py","size":783,"hash":"6021c0a8b65c5d26585dab132f77149a2bb3e69fb9cab0d31a29a8869e9d0fd9"},{"path":"docs/en/index.rst","size":12597,"hash":"385b3ede3568af22a8a0dc905269cf54b2463a952de5bf7af6f13b453a5c32b0"},{"path":"docs/zh_CN/conf.py","size":786,"hash":"bf9fd2b51606aab8f9bafa68466a351fc1f6685e534b98acc55b52b048208ef4"},{"path":"docs/zh_CN/index.rst","size":11756,"hash":"f41eced579b912d51e59810c4cd28529a32946a4702863b1f011d9cfb9cd8102"},{"path":"docs/_build/en/esp32/IDF_TARGET-substitutions.txt","size":660,"hash":"a4d3e89430802cbb6838a4a6afb18919a8a5c8756d49a2a879513b729f6a3b1f"},{"path":"docs/_build/en/esp32/doxygen-warning-log-sanitized.txt","size":0,"hash":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},{"path":"docs/_build/en/esp32/doxygen-warning-log.txt","size":0,"hash":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},{"path":"docs/_build/en/esp32/sphinx-warning-log-sanitized.txt","size":3209,"hash":"414485def9bc11d6c45c89624b1a2157fd24d4b13de715be43171631cad99414"},{"path":"docs/_build/en/esp32/sphinx-warning-log.txt","size":4229,"hash":"6c1420326f5f52873268c18b78a8472611960c87ae74825fb772a5eddcc6baf0"},{"path":"docs/_build/en/esp32/html/.buildinfo","size":230,"hash":"0c8530e50a587a0b93464e3aadcf61cc38097f9f47c537def22f5fbb8cb7798f"},{"path":"docs/_build/en/esp32/html/genindex.html","size":49699,"hash":"8788be942d08dbb5fa15b0b2b7a3c6386518d8307bc38bff595414ecb7f330a2"},{"path":"docs/_build/en/esp32/html/index.html","size":331840,"hash":"cb91443d6375be67d93bde2f06a051e1a400367827abb72dbbb103880b2995d6"},{"path":"docs/_build/en/esp32/html/objects.inv","size":11285,"hash":"c47787bdf475a0a2c5f4fafc9b0cdd77ec0afe4ab750d7d410a790ebefe0f9a6"},{"path":"docs/_build/en/esp32/html/search.html","size":5484,"hash":"25414e97c45b868865f7aeb0083c8f8b1af9f81f52c5dd6b81acce9427483da0"},{"path":"docs/_build/en/esp32/html/searchindex.js","size":97481,"hash":"600ff49591e598a95af34ba2a615900d183d1829b2f7692c6f05e27ee7800170"},{"path":"docs/_build/en/esp32/html/_sources/index.rst.txt","size":12597,"hash":"385b3ede3568af22a8a0dc905269cf54b2463a952de5bf7af6f13b453a5c32b0"},{"path":"docs/_build/en/esp32/html/_static/DejaVuSans.ttf","size":720856,"hash":"4a2438171a9144a2c698a36a64b10116c4c9db9112cd12361296f9eb0bd8cbed"},{"path":"docs/_build/en/esp32/html/_static/NotoSansSC-Regular.otf","size":8665020,"hash":"9cfd9daa651014e66cb9816c8b8995c3f95bc25d315dfd697c520652f28687db"},{"path":"docs/_build/en/esp32/html/_static/_sphinx_javascript_frameworks_compat.js","size":4289,"hash":"480a2c7377252c14a11bca4d3a49dfa16ea540a998fa637fae0189aee1b89113"},{"path":"docs/_build/en/esp32/html/_static/basic.css","size":15059,"hash":"b2fe2bbe6f4ee4946c1e39e760feda90658531622978f8fb8e162746be3bd37c"},{"path":"docs/_build/en/esp32/html/_static/check-solid.svg","size":313,"hash":"edfc4de8b5af9662c19d74d0ef059deb00283f6b1ae21dfcc8e052d5617a1c7f"},{"path":"docs/_build/en/esp32/html/_static/clipboard.min.js","size":9031,"hash":"261ffa06f381039cf7d18984d1364c59f3c2b9b60b1fa05d5f9c8c152e4d5be5"},{"path":"docs/_build/en/esp32/html/_static/copy-button.svg","size":411,"hash":"8cf972ac6d0873154c8245eab96a509026ee132f03bf68ec79fdfe3fa7b03a05"},{"path":"docs/_build/en/esp32/html/_static/copybutton.css","size":2010,"hash":"5695e324fd258ce13f353545d543b75a28724a77a5b256fca338126210547d26"},{"path":"docs/_build/en/esp32/html/_static/copybutton.js","size":7479,"hash":"d9a85b63a47b50a2ec0336640175215d581dda5ee3f59259bc54e4b7fe83c6d6"},{"path":"docs/_build/en/esp32/html/_static/copybutton_funcs.js","size":2198,"hash":"858bf2ca435bc8029b7c0684c68d5d4990598d8afb4175bdac77eb2a963d05ec"},{"path":"docs/_build/en/esp32/html/_static/doctools.js","size":4472,"hash":"3d62b81f63b0418a39a8f5a323203d88ddafc8c5226f86d311970025d86d7b6c"},{"path":"docs/_build/en/esp32/html/_static/documentation_options.js","size":421,"hash":"e44fc9a43f54b703e99bfe35d445bd6806ff9b2928725985c4205060b32cb82f"},{"path":"docs/_build/en/esp32/html/_static/espressif-logo.svg","size":3956,"hash":"e0deb0b2e6f60753551ebaf3f77236a85765573f33bcd91adb2d078c8bffc845"},{"path":"docs/_build/en/esp32/html/_static/espressif2.pdf","size":67271,"hash":"db83d4e439de89ec7d405fc6089124c9367bfd1d38bd4f2de5582efb6b1bf85d"},{"path":"docs/_build/en/esp32/html/_static/file.png","size":286,"hash":"5c4bc9a16aebf38c4b950f59b8e501ca36495328cb9eb622218bce9064a35e3e"},{"path":"docs/_build/en/esp32/html/_static/jquery.js","size":89501,"hash":"ff1523fb7389539c84c65aba19260648793bb4f5e29329d2ee8804bc37a3fe6e"},{"path":"docs/_build/en/esp32/html/_static/language_data.js","size":4758,"hash":"95b1d44e1ba5a3155d89f8427a3b2c981158f956bf48b9cdf0030265e8b7a609"},{"path":"docs/_build/en/esp32/html/_static/minus.png","size":90,"hash":"47e7fc50db3699f1ca41ce9a2ffa202c00c5d1d5180c55f62ba859b1bd6cc008"},{"path":"docs/_build/en/esp32/html/_static/plus.png","size":90,"hash":"54115199b96a130cba02147c47c0deb43dcc9b9f08b5162bba8642b34980ac63"},{"path":"docs/_build/en/esp32/html/_static/pygments.css","size":4929,"hash":"1accd27ffdaa3456771214dbc2f4d841d9ebe9324da2b23ac0333d35756f25e5"},{"path":"docs/_build/en/esp32/html/_static/searchtools.js","size":18215,"hash":"5b9facbcb36e5e15e409e2db42439fb8cbc1e43275e337a645bb3c76c3191b93"},{"path":"docs/_build/en/esp32/html/_static/sphinx_highlight.js","size":4712,"hash":"0a20464b65797522de18421a7db1a0851a26aae6dd06b7109d442236313c27ee"},{"path":"docs/_build/en/esp32/html/_static/theme_overrides.css","size":1151,"hash":"baa7330647b71de6f9234d63d3ab13aa41e07eb8f908e0191fc1655d9669a921"},{"path":"docs/_build/en/esp32/html/_static/css/badge_only.css","size":3229,"hash":"3ebb8a7c4ab074330ec0c24a9bcb32b6ced1c5eb45be7ef34b79193864337865"},{"path":"docs/_build/en/esp32/html/_static/css/theme.css","size":135452,"hash":"27839b5c27d745332b2d76a84dd0a7e669a3ce2ee065fb299f7531925c6d899b"},{"path":"docs/_build/en/esp32/html/_static/js/badge_only.js","size":934,"hash":"f784a162bf0ecdd9d8c289e6bc7c4b67afcc85583804b9ee10e20a3e7fcb64eb"},{"path":"docs/_build/en/esp32/html/_static/js/html5shiv-printshiv.min.js","size":4370,"hash":"b42a7e949a6e21d66b30fbbb4a22deafd9e0ccabc04f0fa2907fc6252fdf165f"},{"path":"docs/_build/en/esp32/html/_static/js/html5shiv.min.js","size":2734,"hash":"f6e0283561ddb33b140e14977ffad57163aa28f7e2e7ff15e51e1475b6657b60"},{"path":"docs/_build/en/esp32/html/_static/js/theme.js","size":26617,"hash":"e740bbf6fce2838609cc1fa0ee7615dcff117f183c0f4abc8e9773700af4b878"},{"path":"docs/_build/en/esp32/html/_static/css/fonts/Roboto-Slab-Bold.woff","size":87624,"hash":"9fec87cadbe2413b255f1ec577573a83f1ca2e1c37aa023dbebcd3a7b864636a"},{"path":"docs/_build/en/esp32/html/_static/css/fonts/Roboto-Slab-Bold.woff2","size":67312,"hash":"1a0c024dd1a267c52d5575469ffe8570d1e84164de7d393cf3414bafd17d7a0c"},{"path":"docs/_build/en/esp32/html/_static/css/fonts/Roboto-Slab-Regular.woff","size":86288,"hash":"9f32630e2c0c5135bf1e86e36cb65b3932e4410644235bc2bd995e9c7f6ff117"},{"path":"docs/_build/en/esp32/html/_static/css/fonts/Roboto-Slab-Regular.woff2","size":66444,"hash":"874e42222856d7af03b3f438d21d923a4280d47fe67c48510e2174a1579795ef"},{"path":"docs/_build/en/esp32/html/_static/css/fonts/fontawesome-webfont.eot","size":165742,"hash":"7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979"},{"path":"docs/_build/en/esp32/html/_static/css/fonts/fontawesome-webfont.svg","size":444379,"hash":"ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4"},{"path":"docs/_build/en/esp32/html/_static/css/fonts/fontawesome-webfont.ttf","size":165548,"hash":"aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8"},{"path":"docs/_build/en/esp32/html/_static/css/fonts/fontawesome-webfont.woff","size":98024,"hash":"ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07"},{"path":"docs/_build/en/esp32/html/_static/css/fonts/fontawesome-webfont.woff2","size":77160,"hash":"2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe"},{"path":"docs/_build/en/esp32/html/_static/css/fonts/lato-bold-italic.woff","size":323344,"hash":"980c8592e5488df256192c999e92db8fd302db8cd8909b7fa266a684e37e45f8"},{"path":"docs/_build/en/esp32/html/_static/css/fonts/lato-bold-italic.woff2","size":193308,"hash":"c0916a33340d063f7b05679e08031e729d1888444706f04804705da5966d895d"},{"path":"docs/_build/en/esp32/html/_static/css/fonts/lato-bold.woff","size":309728,"hash":"0e56b17d142eb366c8007031d14e34da48c70b4a9d9a0ca492e696a7bae45e1e"},{"path":"docs/_build/en/esp32/html/_static/css/fonts/lato-bold.woff2","size":184912,"hash":"ae88fc0d7a961832f809527d30bd3983a6866d42f66a56ade23f543681594db6"},{"path":"docs/_build/en/esp32/html/_static/css/fonts/lato-normal-italic.woff","size":328412,"hash":"26318a1467a5e5caf10b04cfa942d079632560cd7a29cec565fd1dc9f7ec5081"},{"path":"docs/_build/en/esp32/html/_static/css/fonts/lato-normal-italic.woff2","size":195704,"hash":"4465765f2f6eddcdad34ffd7cab559e56bc0e75e45e192f85e9562b0771481dc"},{"path":"docs/_build/en/esp32/html/_static/css/fonts/lato-normal.woff","size":309192,"hash":"5b9025dda4d7688e3311b0c17eddc501133b807def33effaef6593843cf5416e"},{"path":"docs/_build/en/esp32/html/_static/css/fonts/lato-normal.woff2","size":182708,"hash":"983b0caf336e8542214fc17019a4fc5e0360864b92806ca14d55c1fc1c2c5a0f"},{"path":".gitlab/ci/build.yml","size":663,"hash":"9a40bf33d42c916f0707294e97e7b754983f1516d77724dc57387945582ff091"},{"path":".gitlab/ci/deploy.yml","size":926,"hash":"8cc0ac9f2a8c9131b7491145e578d2cbd96185a74805e2ebb193e733b4fe45c7"},{"path":".gitlab/ci/docs.yml","size":2482,"hash":"7cf6686cdb78dc0a364bdd9548e21997db4234404d92cf3e49f45588cc8b87c2"},{"path":".gitlab/ci/ignore_build_warnings.txt","size":438,"hash":"0de186cccca179e476bd8078d45979831eb69f53ff7d1c2e0460f4deba39ac36"},{"path":".gitlab/ci/test.yml","size":1407,"hash":"afff3a9d2400dd49a0d1871825e667e21e64c1e5b6881f250a71db75bd962a01"},{"path":".gitlab/ci/utils.sh","size":822,"hash":"e681ea308d973609dac626a781f75f92426a6f5103cdc972f48992ec619e3fd5"}]} \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/CMakeLists.txt new file mode 100644 index 000000000..8f86e9d25 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/CMakeLists.txt @@ -0,0 +1,14 @@ +set(srcs mqtt_client.c lib/mqtt_msg.c lib/mqtt_outbox.c lib/platform_esp32_idf.c) + +if(CONFIG_MQTT_PROTOCOL_5) + list(APPEND srcs lib/mqtt5_msg.c mqtt5_client.c) +endif() + +list(TRANSFORM srcs PREPEND ${CMAKE_CURRENT_LIST_DIR}/) +idf_component_register(SRCS "${srcs}" + INCLUDE_DIRS ${CMAKE_CURRENT_LIST_DIR}/include + PRIV_INCLUDE_DIRS ${CMAKE_CURRENT_LIST_DIR}/lib/include + REQUIRES esp_event tcp_transport + PRIV_REQUIRES esp_timer http_parser esp_hw_support heap + KCONFIG ${CMAKE_CURRENT_LIST_DIR}/Kconfig + ) diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/Kconfig b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/Kconfig new file mode 100644 index 000000000..d438858b9 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/Kconfig @@ -0,0 +1,190 @@ +menu "ESP-MQTT Configurations" + + config MQTT_PROTOCOL_311 + bool "Enable MQTT protocol 3.1.1" + default y + help + If not, this library will use MQTT protocol 3.1 + + config MQTT_PROTOCOL_5 + bool "Enable MQTT protocol 5.0" + default n + help + If not, this library will not support MQTT 5.0 + + config MQTT_TRANSPORT_SSL + bool "Enable MQTT over SSL" + default y + help + Enable MQTT transport over SSL with mbedtls + + config MQTT_TRANSPORT_WEBSOCKET + bool "Enable MQTT over Websocket" + default y + depends on WS_TRANSPORT + help + Enable MQTT transport over Websocket. + + config MQTT_TRANSPORT_WEBSOCKET_SECURE + bool "Enable MQTT over Websocket Secure" + default y + depends on MQTT_TRANSPORT_WEBSOCKET + depends on MQTT_TRANSPORT_SSL + help + Enable MQTT transport over Websocket Secure. + + config MQTT_MSG_ID_INCREMENTAL + bool "Use Incremental Message Id" + default n + help + Set this to true for the message id (2.3.1 Packet Identifier) to be generated + as an incremental number rather then a random value (used by default) + + config MQTT_SKIP_PUBLISH_IF_DISCONNECTED + bool "Skip publish if disconnected" + default n + help + Set this to true to avoid publishing (enqueueing messages) if the client is disconnected. + The MQTT client tries to publish all messages by default, even in the disconnected state + (where the qos1 and qos2 packets are stored in the internal outbox to be published later) + The MQTT_SKIP_PUBLISH_IF_DISCONNECTED option allows applications to override this behaviour + and not enqueue publish packets in the disconnected state. + + config MQTT_REPORT_DELETED_MESSAGES + bool "Report deleted messages" + default n + help + Set this to true to post events for all messages which were deleted from the outbox + before being correctly sent and confirmed. + + config MQTT_USE_CUSTOM_CONFIG + bool "MQTT Using custom configurations" + default n + help + Custom MQTT configurations. + + config MQTT_TCP_DEFAULT_PORT + int "Default MQTT over TCP port" + default 1883 + depends on MQTT_USE_CUSTOM_CONFIG + help + Default MQTT over TCP port + + config MQTT_SSL_DEFAULT_PORT + int "Default MQTT over SSL port" + default 8883 + depends on MQTT_USE_CUSTOM_CONFIG + depends on MQTT_TRANSPORT_SSL + help + Default MQTT over SSL port + + config MQTT_WS_DEFAULT_PORT + int "Default MQTT over Websocket port" + default 80 + depends on MQTT_USE_CUSTOM_CONFIG + depends on MQTT_TRANSPORT_WEBSOCKET + help + Default MQTT over Websocket port + + config MQTT_WSS_DEFAULT_PORT + int "Default MQTT over Websocket Secure port" + default 443 + depends on MQTT_USE_CUSTOM_CONFIG + depends on MQTT_TRANSPORT_WEBSOCKET + depends on MQTT_TRANSPORT_WEBSOCKET_SECURE + help + Default MQTT over Websocket Secure port + + config MQTT_BUFFER_SIZE + int "Default MQTT Buffer Size" + default 1024 + depends on MQTT_USE_CUSTOM_CONFIG + help + This buffer size using for both transmit and receive + + config MQTT_TASK_STACK_SIZE + int "MQTT task stack size" + default 6144 + depends on MQTT_USE_CUSTOM_CONFIG + help + MQTT task stack size + + config MQTT_DISABLE_API_LOCKS + bool "Disable API locks" + default n + depends on MQTT_USE_CUSTOM_CONFIG + help + Default config employs API locks to protect internal structures. It is possible to disable + these locks if the user code doesn't access MQTT API from multiple concurrent tasks + + config MQTT_TASK_PRIORITY + int "MQTT task priority" + default 5 + depends on MQTT_USE_CUSTOM_CONFIG + help + MQTT task priority. Higher number denotes higher priority. + + config MQTT_POLL_READ_TIMEOUT_MS + int "MQTT transport poll read timeut" + default 1000 + depends on MQTT_USE_CUSTOM_CONFIG + help + Timeout when polling underlying transport for read. + + config MQTT_EVENT_QUEUE_SIZE + int "Number of queued events." + default 1 + depends on MQTT_USE_CUSTOM_CONFIG + help + A value higher than 1 enables multiple queued events. + + config MQTT_TASK_CORE_SELECTION_ENABLED + bool "Enable MQTT task core selection" + help + This will enable core selection + + choice MQTT_TASK_CORE_SELECTION + depends on MQTT_TASK_CORE_SELECTION_ENABLED + prompt "Core to use ?" + config MQTT_USE_CORE_0 + bool "Core 0" + config MQTT_USE_CORE_1 + bool "Core 1" + endchoice + + config MQTT_OUTBOX_DATA_ON_EXTERNAL_MEMORY + bool "Use external memory for outbox data" + default n + depends on MQTT_USE_CUSTOM_CONFIG + help + Set to true to use external memory for outbox data. + + config MQTT_CUSTOM_OUTBOX + bool "Enable custom outbox implementation" + default n + help + Set to true if a specific implementation of message outbox is needed (e.g. persistent outbox in NVM or + similar). + Note: Implementation of the custom outbox must be added to the mqtt component. These CMake commands + could be used to append the custom implementation to lib-mqtt sources: + idf_component_get_property(mqtt mqtt COMPONENT_LIB) + set_property(TARGET ${mqtt} PROPERTY SOURCES ${PROJECT_DIR}/custom_outbox.c APPEND) + + config MQTT_OUTBOX_EXPIRED_TIMEOUT_MS + int "Outbox message expired timeout[ms]" + default 30000 + depends on MQTT_USE_CUSTOM_CONFIG + help + Messages which stays in the outbox longer than this value before being published will be discarded. + + config MQTT_TOPIC_PRESENT_ALL_DATA_EVENTS + bool "Enable publish topic in all data events" + default n + depends on MQTT_USE_CUSTOM_CONFIG + help + Set to true to have publish topic in all data events. This changes the behaviour + when the message is bigger than the receive buffer size. The first event of the sequence + always have the topic. + Note: This will allocate memory to store the topic only in case of messge bigger than the buffer size. + +endmenu diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/LICENSE b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/LICENSE new file mode 100644 index 000000000..a623b53ff --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2016 Tuan PM + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/README.md b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/README.md new file mode 100644 index 000000000..f46f80bd5 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/README.md @@ -0,0 +1,52 @@ +# ESP32 MQTT Library + +![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/espressif/esp-mqtt/test-examples.yml?branch=master) +![License](https://img.shields.io/github/license/espressif/esp-mqtt) +![GitHub contributors](https://img.shields.io/github/contributors/espressif/esp-mqtt) + +## Features + +- Based on: +- Support MQTT over TCP, SSL with mbedtls, MQTT over Websocket, MQTT over Websocket Secure +- Easy to setup with URI +- Multiple instances (Multiple clients in one application) +- Support subscribing, publishing, authentication, will messages, keep alive pings and all 3 QoS levels (it should be a fully functional client). +- Support for MQTT 3.1.1 and 5.0 + +## How to use + +ESP-MQTT is available through the [ESP-IDF Component Manager](https://components.espressif.com/) and ships as a standard [ESP-IDF](https://github.com/espressif/esp-idf) component. + +- To add it via the Component Manager (recommended), declare the dependency in your project's `idf_component.yml`, for example: + + ```yaml + dependencies: + espressif/mqtt: "*" + ``` + + Replace `*` with the version constraint you want to track, or run `idf.py add-dependency espressif/mqtt`. +- For local development, clone this repository as `mqtt` so the component name matches: + + ```bash + git clone https://github.com/espressif/esp-mqtt.git mqtt + ``` + +## Documentation + +- Documentation of ESP-MQTT API: + +## License + +- Apache License 2.0 +- MQTT package origin: [Stephen Robinson - contiki-mqtt](https://github.com/esar/contiki-mqtt) +- Additional contributions by [@tuanpmt](https://twitter.com/tuanpmt) + +## Older IDF versions + +For [ESP-IDF](https://github.com/espressif/esp-idf) versions prior to IDFv3.2, please clone as a component of [ESP-IDF](https://github.com/espressif/esp-idf): + +``` +git submodule add https://github.com/espressif/esp-mqtt.git components/espmqtt +``` + +and checkout the [ESP-MQTT_FOR_IDF_3.1](https://github.com/espressif/esp-mqtt/tree/ESP-MQTT_FOR_IDF_3.1) tag diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/Doxyfile b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/Doxyfile new file mode 100644 index 000000000..35dabbc4a --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/Doxyfile @@ -0,0 +1,57 @@ +# This is Doxygen configuration file +# +# Doxygen provides over 260 configuration statements +# To make this file easier to follow, +# it contains only statements that are non-default +# +# NOTE: +# It is recommended not to change defaults unless specifically required +# Test any changes how they affect generated documentation +# Make sure that correct warnings are generated to flag issues with documented code +# +# For the complete list of configuration statements see: +# http://doxygen.nl/manual/config.html + + +PROJECT_NAME = "ESP-MQTT Programming Guide" + +## The 'INPUT' statement below is used as input by script 'gen-df-input.py' +## to automatically generate API reference list files heder_file.inc +## These files are placed in '_inc' directory +## and used to include in API reference documentation + +INPUT = \ + $(PROJECT_PATH)/include/mqtt_client.h \ + $(PROJECT_PATH)/include/mqtt5_client.h \ + $(PROJECT_PATH)/include/mqtt_supported_features.h + +## Get warnings for functions that have no documentation for their parameters or return value +## +WARN_NO_PARAMDOC = YES + +## Enable preprocessing and remove __attribute__(...) expressions from the INPUT files +## +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = YES +EXPAND_ONLY_PREDEF = YES +PREDEFINED = \ + $(ENV_DOXYGEN_DEFINES) \ + +## Do not complain about not having dot +## +HAVE_DOT = NO + +## Generate XML that is required for Breathe +## +GENERATE_XML = YES +XML_OUTPUT = xml + +GENERATE_HTML = NO +HAVE_DOT = NO +GENERATE_LATEX = NO +GENERATE_MAN = YES +GENERATE_RTF = NO + +## Skip distracting progress messages +## +QUIET = YES diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/conf_common.py b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/conf_common.py new file mode 100644 index 000000000..7e21f2976 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/conf_common.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# +# Common (non-language-specific) configuration for Sphinx +# + +# type: ignore +# pylint: disable=wildcard-import +# pylint: disable=undefined-variable + +from __future__ import print_function, unicode_literals + +from esp_docs.conf_docs import * # noqa: F403,F401 + +# IDF_PATH validation removed - not needed for standalone component docs +# Only required when using ESP-IDF extensions that depend on IDF environment + + +extensions += ['sphinx_copybutton', + # Needed as a trigger for running doxygen + 'esp_docs.esp_extensions.dummy_build_system', + 'esp_docs.esp_extensions.run_doxygen' + ] + +# link roles config +github_repo = 'espressif/esp-mqtt' + +# context used by sphinx_idf_theme +html_context['github_user'] = 'espressif' +html_context['github_repo'] = 'esp-mqtt' + +# Extra options required by sphinx_idf_theme +project_slug = 'esp-mqtt' +versions_url = './_static/mqtt_docs_versions.js' + +idf_targets = [ 'esp32' ] +languages = ['en'] + + + diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/doxygen-known-warnings.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/doxygen-known-warnings.txt new file mode 100644 index 000000000..1ad7d8a06 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/doxygen-known-warnings.txt @@ -0,0 +1,2 @@ +# Known doxygen warnings for ESP-MQTT documentation build +# Currently no known doxygen warnings expected \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/en/conf.py b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/en/conf.py new file mode 100644 index 000000000..be95ec82c --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/en/conf.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# +# English Language RTD & Sphinx config file +# +# Uses ../conf_common.py for most non-language-specific settings. + +# Importing conf_common adds all the non-language-specific +# parts to this conf module +try: + from conf_common import * # noqa: F403,F401 +except ImportError: + import os + import sys + sys.path.insert(0, os.path.abspath('../')) + from conf_common import * # noqa: F403,F401 + +import datetime + +current_year = datetime.datetime.now().year + +# General information about the project. +project = u'ESP-MQTT Programming Guide' +copyright = u'2019 - {}, Espressif Systems (Shanghai) Co., Ltd'.format(current_year) + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +language = 'en' diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/en/index.rst b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/en/index.rst new file mode 100644 index 000000000..52e1a916b --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/en/index.rst @@ -0,0 +1,208 @@ +ESP-MQTT +======== + +:link_to_translation:`zh_CN:[中文]` + +Overview +-------- + +ESP-MQTT is an implementation of `MQTT `__ protocol client, which is a lightweight publish/subscribe messaging protocol. Now ESP-MQTT supports `MQTT v5.0 `__. + + +Features +-------- + + * Support MQTT over TCP, SSL with Mbed TLS, MQTT over WebSocket, and MQTT over WebSocket Secure + * Easy to setup with URI + * Multiple instances (multiple clients in one application) + * Support subscribing, publishing, authentication, last will messages, keep alive pings, and all 3 Quality of Service (QoS) levels (it should be a fully functional client) + + +Application Examples +-------------------- + + - :example:`tcp` demonstrates how to implement MQTT communication over TCP (default port 1883). + + - :example:`ssl` demonstrates how to use SSL transport to implement MQTT communication over TLS (default port 8883). + + - :example:`ssl_ds` demonstrates how to use digital signature peripheral for authentication to implement MQTT communication over TLS (default port 8883). + + - :example:`ssl_mutual_auth` demonstrates how to use certificates for authentication to implement MQTT communication (default port 8883). + + - :example:`ssl_psk` demonstrates how to use pre-shared keys for authentication to implement MQTT communication over TLS (default port 8883). + + - :example:`ws` demonstrates how to implement MQTT communication over WebSocket (default port 80). + + - :example:`wss` demonstrates how to implement MQTT communication over WebSocket Secure (default port 443). + + - :example:`mqtt5` demonstrates how to use ESP-MQTT library to connect to broker with MQTT v5.0. + + - :example:`custom_outbox` demonstrates how to customize the outbox in the ESP-MQTT library. + +MQTT Message Retransmission +--------------------------- + +A new MQTT message can be created by calling :cpp:func:`esp_mqtt_client_publish ` or its non-blocking counterpart :cpp:func:`esp_mqtt_client_enqueue `. + +Messages with QoS 0 are sent only once. QoS 1 and 2 behave differently since the protocol requires additional steps to complete the process. + +The ESP-MQTT library opts to always retransmit unacknowledged QoS 1 and 2 publish messages to prevent data loss in faulty connections, even though the MQTT specification requires the re-transmission only on reconnect with Clean Session flag been set to 0 (set :cpp:member:`disable_clean_session ` to true for this behavior). + +QoS 1 and 2 messages that may need retransmission are always enqueued, but first transmission try occurs immediately if :cpp:func:`esp_mqtt_client_publish ` is used. A transmission retry for unacknowledged messages will occur after :cpp:member:`message_retransmit_timeout `. After :ref:`CONFIG_MQTT_OUTBOX_EXPIRED_TIMEOUT_MS` messages will expire and be deleted. If :ref:`CONFIG_MQTT_REPORT_DELETED_MESSAGES` is set, an event will be sent to notify the user. + +Configuration +------------- + +The configuration is made by setting fields in :cpp:class:`esp_mqtt_client_config_t` struct. The configuration struct has the following sub structs to configure different aspects of the client operation. + + * :cpp:class:`esp_mqtt_client_config_t::broker_t` - Allow to set address and security verification. + * :cpp:class:`esp_mqtt_client_config_t::credentials_t` - Client credentials for authentication. + * :cpp:class:`esp_mqtt_client_config_t::session_t` - Configuration for MQTT session aspects. + * :cpp:class:`esp_mqtt_client_config_t::network_t` - Networking related configuration. + * :cpp:class:`esp_mqtt_client_config_t::task_t` - Allow to configure FreeRTOS task. + * :cpp:class:`esp_mqtt_client_config_t::buffer_t` - Buffer size for input and output. + +In the following sections, the most common aspects are detailed. + +Broker +^^^^^^^^^^^ + +=========== +Address +=========== + +Broker address can be set by usage of :cpp:class:`address ` struct. The configuration can be made by usage of :cpp:member:`uri ` field or the combination of :cpp:member:`hostname `, :cpp:member:`transport ` and :cpp:member:`port `. Optionally, :cpp:member:`path ` could be set, this field is useful in WebSocket connections. + +The :cpp:member:`uri ` field is used in the format ``scheme://hostname:port/path``. + +- Currently support ``mqtt``, ``mqtts``, ``ws``, ``wss`` schemes +- MQTT over TCP samples: + + - ``mqtt://mqtt.eclipseprojects.io``: MQTT over TCP, default port 1883 + - ``mqtt://mqtt.eclipseprojects.io:1884``: MQTT over TCP, port 1884 + - ``mqtt://username:password@mqtt.eclipseprojects.io:1884``: MQTT over TCP, + port 1884, with username and password + +- MQTT over SSL samples: + + - ``mqtts://mqtt.eclipseprojects.io``: MQTT over SSL, port 8883 + - ``mqtts://mqtt.eclipseprojects.io:8884``: MQTT over SSL, port 8884 + +- MQTT over WebSocket samples: + + - ``ws://mqtt.eclipseprojects.io:80/mqtt`` + +- MQTT over WebSocket Secure samples: + + - ``wss://mqtt.eclipseprojects.io:443/mqtt`` + +- Minimal configurations: + +.. code-block:: c + + const esp_mqtt_client_config_t mqtt_cfg = { + .broker.address.uri = "mqtt://mqtt.eclipseprojects.io", + }; + esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg); + esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, client); + esp_mqtt_client_start(client); + +.. note:: + + By default MQTT client uses event loop library to post related MQTT events (connected, subscribed, published, etc.). + +============ +Verification +============ + +For secure connections with TLS used, and to guarantee Broker's identity, the :cpp:class:`verification ` struct must be set. +The broker certificate may be set in PEM or DER format. To select DER, the equivalent :cpp:member:`certificate_len ` field must be set. Otherwise, a null-terminated string in PEM format should be provided to :cpp:member:`certificate ` field. + +- Get certificate from server, example: ``mqtt.eclipseprojects.io`` + .. code:: + + openssl s_client -showcerts -connect mqtt.eclipseprojects.io:8883 < /dev/null \ + 2> /dev/null | openssl x509 -outform PEM > mqtt_eclipse_org.pem + +- Check the sample application: :example:`ssl` +- Configuration: + +.. code:: c + + const esp_mqtt_client_config_t mqtt_cfg = { + .broker = { + .address.uri = "mqtts://mqtt.eclipseprojects.io:8883", + .verification.certificate = (const char *)mqtt_eclipse_org_pem_start, + }, + }; + +For details about other fields, please check the `API Reference`_ and :ref:`esp_tls_server_verification`. + +Client Credentials +^^^^^^^^^^^^^^^^^^ + +All client related credentials are under the :cpp:class:`credentials ` field. + + * :cpp:member:`username `: pointer to the username used for connecting to the broker, can also be set by URI + * :cpp:member:`client_id `: pointer to the client ID, defaults to ``ESP32_%CHIPID%`` where ``%CHIPID%`` are the last 3 bytes of MAC address in hex format + +============== +Authentication +============== + +It is possible to set authentication parameters through the :cpp:class:`authentication ` field. The client supports the following authentication methods: + + * :cpp:member:`password `: use a password by setting + * :cpp:member:`certificate ` and :cpp:member:`key `: mutual authentication with TLS, and both can be provided in PEM or DER format + * :cpp:member:`use_secure_element `: use secure element (ATECC608A) interfaced to ESP32 series + * :cpp:member:`ds_data `: use Digital Signature Peripheral available in some Espressif devices + +Session +^^^^^^^^^^^ + +For MQTT session-related configurations, :cpp:class:`session ` fields should be used. + +======================= +Last Will and Testament +======================= + +MQTT allows for a last will and testament (LWT) message to notify other clients when a client ungracefully disconnects. This is configured by the following fields in the :cpp:class:`last_will ` struct. + + * :cpp:member:`topic `: pointer to the LWT message topic + * :cpp:member:`msg `: pointer to the LWT message + * :cpp:member:`msg_len `: length of the LWT message, required if :cpp:member:`msg ` is not null-terminated + * :cpp:member:`qos `: quality of service for the LWT message + * :cpp:member:`retain `: specifies the retain flag of the LWT message + +Change Settings in Project Configuration Menu +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The settings for MQTT can be found using :code:`idf.py menuconfig`, under ``Component config`` > ``ESP-MQTT Configuration``. + +The following settings are available: + +- :ref:`CONFIG_MQTT_PROTOCOL_311`: enable 3.1.1 version of MQTT protocol + +- :ref:`CONFIG_MQTT_TRANSPORT_SSL` and :ref:`CONFIG_MQTT_TRANSPORT_WEBSOCKET`: enable specific MQTT transport layer, such as SSL, WEBSOCKET, and WEBSOCKET_SECURE + +- :ref:`CONFIG_MQTT_CUSTOM_OUTBOX`: disable default implementation of mqtt_outbox, so a specific implementation can be supplied + + +Events +------ +The following events may be posted by the MQTT client: + +* ``MQTT_EVENT_BEFORE_CONNECT``: The client is initialized and about to start connecting to the broker. +* ``MQTT_EVENT_CONNECTED``: The client has successfully established a connection to the broker. The client is now ready to send and receive data. +* ``MQTT_EVENT_DISCONNECTED``: The client has aborted the connection due to being unable to read or write data, e.g., because the server is unavailable. +* ``MQTT_EVENT_SUBSCRIBED``: The broker has acknowledged the client's subscribe request. The event data contains the message ID of the subscribe message. +* ``MQTT_EVENT_UNSUBSCRIBED``: The broker has acknowledged the client's unsubscribe request. The event data contains the message ID of the unsubscribe message. +* ``MQTT_EVENT_PUBLISHED``: The broker has acknowledged the client's publish message. This is only posted for QoS level 1 and 2, as level 0 does not use acknowledgements. The event data contains the message ID of the publish message. +* ``MQTT_EVENT_DATA``: The client has received a publish message. The event data contains: message ID, name of the topic it was published to, received data and its length. For data that exceeds the internal buffer, multiple ``MQTT_EVENT_DATA`` events are posted and :cpp:member:`current_data_offset ` and :cpp:member:`total_data_len ` from event data updated to keep track of the fragmented message. +* ``MQTT_EVENT_ERROR``: The client has encountered an error. The field :cpp:type:`error_handle ` in the event data contains :cpp:type:`error_type ` that can be used to identify the error. The type of error determines which parts of the :cpp:type:`error_handle ` struct is filled. + +API Reference +------------- + +.. include-build-file:: inc/mqtt_client.inc +.. include-build-file:: inc/mqtt5_client.inc diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/sphinx-known-warnings.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/sphinx-known-warnings.txt new file mode 100644 index 000000000..cff318d32 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/sphinx-known-warnings.txt @@ -0,0 +1,37 @@ +mqtt_client.inc:line: WARNING: Duplicate C++ declaration, also defined at index:line. +Declaration is '.. cpp:type:: struct esp_mqtt_event_t esp_mqtt_event_t'. +mqtt_client.inc:line: WARNING: Duplicate C++ declaration, also defined at index:line. +Declaration is '.. cpp:type:: struct esp_mqtt_client_config_t esp_mqtt_client_config_t'. +mqtt_client.inc:line: WARNING: Duplicate C++ declaration, also defined at index:line. +Declaration is '.. cpp:enum:: esp_mqtt_event_id_t'. +mqtt_client.inc:line: WARNING: Duplicate C++ declaration, also defined at index:line. +Declaration is '.. cpp:enum:: esp_mqtt_connect_return_code_t'. +mqtt_client.inc:line: WARNING: Duplicate C++ declaration, also defined at index:line. +Declaration is '.. cpp:enum:: esp_mqtt_error_type_t'. +mqtt_client.inc:line: WARNING: Duplicate C++ declaration, also defined at index:line. +Declaration is '.. cpp:enum:: esp_mqtt_transport_t'. +mqtt_client.inc:line: WARNING: Duplicate C++ declaration, also defined at index:line. +Declaration is '.. cpp:enum:: esp_mqtt_protocol_ver_t'. +mqtt5_client.inc:line: WARNING: Duplicate C++ declaration, also defined at index:line. +Declaration is '.. cpp:enumerator:: __attribute__'. +index.rst:line: CRITICAL: Duplicate ID: "mqtt5__client_8h_1a4504a6557b6b27d66613101e758693f4a8c1dfc1ccf00a08192611433ee7f17b4". +index.rst:line: WARNING: Duplicate explicit target name: "mqtt5__client_8h_1a4504a6557b6b27d66613101e758693f4a8c1dfc1ccf00a08192611433ee7f17b4". +mqtt5_client.inc:line: WARNING: Duplicate C++ declaration, also defined at index:line. +Declaration is '.. cpp:enumerator:: __attribute__'. +index.rst:line: CRITICAL: Duplicate ID: "mqtt5__client_8h_1a4504a6557b6b27d66613101e758693f4a8c1dfc1ccf00a08192611433ee7f17b4". +index.rst:line: WARNING: Duplicate explicit target name: "mqtt5__client_8h_1a4504a6557b6b27d66613101e758693f4a8c1dfc1ccf00a08192611433ee7f17b4". +mqtt5_client.inc:line: WARNING: Duplicate C++ declaration, also defined at index:line. +Declaration is '.. cpp:enumerator:: __attribute__'. +index.rst:line: CRITICAL: Duplicate ID: "mqtt5__client_8h_1a4504a6557b6b27d66613101e758693f4a8c1dfc1ccf00a08192611433ee7f17b4". +index.rst:line: WARNING: Duplicate explicit target name: "mqtt5__client_8h_1a4504a6557b6b27d66613101e758693f4a8c1dfc1ccf00a08192611433ee7f17b4". +mqtt5_client.inc:line: WARNING: Duplicate C++ declaration, also defined at index:line. +Declaration is '.. cpp:enumerator:: __attribute__'. +index.rst:line: CRITICAL: Duplicate ID: "mqtt5__client_8h_1a4504a6557b6b27d66613101e758693f4a8c1dfc1ccf00a08192611433ee7f17b4". +index.rst:line: WARNING: Duplicate explicit target name: "mqtt5__client_8h_1a4504a6557b6b27d66613101e758693f4a8c1dfc1ccf00a08192611433ee7f17b4". +index.rst:line: WARNING: undefined label: 'config_mqtt_outbox_expired_timeout_ms' +index.rst:line: WARNING: undefined label: 'config_mqtt_report_deleted_messages' +index.rst:line: WARNING: undefined label: 'esp_tls_server_verification' +index.rst:line: WARNING: undefined label: 'config_mqtt_protocol_311' +index.rst:line: WARNING: undefined label: 'config_mqtt_transport_ssl' +index.rst:line: WARNING: undefined label: 'config_mqtt_transport_websocket' +index.rst:line: WARNING: undefined label: 'config_mqtt_custom_outbox' diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/zh_CN/conf.py b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/zh_CN/conf.py new file mode 100644 index 000000000..0eadade5c --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/zh_CN/conf.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# +# English Language RTD & Sphinx config file +# +# Uses ../conf_common.py for most non-language-specific settings. + +# Importing conf_common adds all the non-language-specific +# parts to this conf module +try: + from conf_common import * # noqa: F403,F401 +except ImportError: + import os + import sys + sys.path.insert(0, os.path.abspath('../')) + from conf_common import * # noqa: F403,F401 + +import datetime + +current_year = datetime.datetime.now().year + +# General information about the project. +project = u'ESP-MQTT Programming Guide' +copyright = u'2019 - {}, Espressif Systems (Shanghai) Co., Ltd'.format(current_year) + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +language = 'zh_CN' diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/zh_CN/index.rst b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/zh_CN/index.rst new file mode 100644 index 000000000..eca9217c2 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/docs/zh_CN/index.rst @@ -0,0 +1,208 @@ +ESP-MQTT +======== + +:link_to_translation:`en:[English]` + +概述 +-------- + +ESP-MQTT 是 `MQTT `__ 协议客户端的实现,MQTT 是一种基于发布/订阅模式的轻量级消息传输协议。ESP-MQTT 当前支持 `MQTT v5.0 `__。 + + +特性 +-------- + + * 支持基于 TCP 的 MQTT、基于 Mbed TLS 的 SSL、基于 WebSocket 的 MQTT 以及基于 WebSocket Secure 的 MQTT + * 通过 URI 简化配置流程 + * 多个实例(一个应用程序中有多个客户端) + * 支持订阅、发布、认证、遗嘱消息、保持连接心跳机制以及 3 个服务质量 (QoS) 级别(组成全功能客户端) + + +应用示例 +------------------- + + - :example:`tcp` 演示了如何通过 TCP 实现 MQTT 通信(默认端口 1883)。 + + - :example:`ssl` 演示了如何使用 SSL 传输来实现基于 TLS 的 MQTT 通信(默认端口 8883)。 + + - :example:`ssl_ds` 演示了如何使用数字签名外设进行身份验证,以实现基于 TLS 的 MQTT 通信(默认端口 8883)。 + + - :example:`ssl_mutual_auth` 演示了如何使用证书进行身份验证实现 MQTT 通信(默认端口 8883)。 + + - :example:`ssl_psk` 演示了如何使用预共享密钥进行身份验证,以实现基于 TLS 的 MQTT 通信(默认端口 8883)。 + + - :example:`ws` 演示了如何通过 WebSocket 实现 MQTT 通信(默认端口 80)。 + + - :example:`wss` 演示了如何通过 WebSocket Secure 实现 MQTT 通信(默认端口 443)。 + + - :example:`mqtt5` 演示了如何使用 ESP-MQTT 库通过 MQTT v5.0 连接到代理。 + + - :example:`custom_outbox` 演示了如何自定义 ESP-MQTT 库中的 outbox。 + +MQTT 消息重传 +-------------------------- + +调用 :cpp:func:`esp_mqtt_client_publish ` 或其非阻塞形式 :cpp:func:`esp_mqtt_client_enqueue `,可以创建新的 MQTT 消息。 + +QoS 0 的消息将只发送一次,QoS 1 和 2 具有不同行为,因为协议需要执行额外步骤来完成该过程。 + +ESP-MQTT 库将始终重新传输未确认的 QoS 1 和 2 发布消息,以避免连接错误导致信息丢失,虽然 MQTT 规范要求仅在重新连接且 Clean Session 标志设置为 0 时重新传输(针对此行为,将 :cpp:member:`disable_clean_session ` 设置为 true)。 + +可能需要重传的 QoS 1 和 2 消息总是处于排队状态,但若使用 :cpp:func:`esp_mqtt_client_publish ` 则会立即进行第一次传输尝试。未确认消息的重传将在 :cpp:member:`message_retransmit_timeout ` 之后进行。在 :ref:`CONFIG_MQTT_OUTBOX_EXPIRED_TIMEOUT_MS` 之后,消息会过期并被删除。如已设置 :ref:`CONFIG_MQTT_REPORT_DELETED_MESSAGES`,则会发送事件来通知用户。 + +配置 +------------- + +通过设置 :cpp:class:`esp_mqtt_client_config_t` 结构体中的字段来进行配置。配置结构体包含以下子结构体,用于配置客户端的多种操作。 + + * :cpp:class:`esp_mqtt_client_config_t::broker_t` - 允许设置地址和安全验证。 + * :cpp:class:`esp_mqtt_client_config_t::credentials_t` - 用于身份验证的客户端凭据。 + * :cpp:class:`esp_mqtt_client_config_t::session_t` - MQTT 会话相关配置。 + * :cpp:class:`esp_mqtt_client_config_t::network_t` - 网络相关配置。 + * :cpp:class:`esp_mqtt_client_config_t::task_t` - 允许配置 FreeRTOS 任务。 + * :cpp:class:`esp_mqtt_client_config_t::buffer_t` - 输入输出的缓冲区大小。 + +下文将详细介绍不同配置。 + +服务器 +^^^^^^^^^^^^ + +=========== +地址 +=========== + +通过 :cpp:class:`address ` 结构体的 :cpp:member:`uri ` 字段或者 :cpp:member:`hostname `、:cpp:member:`transport ` 以及 :cpp:member:`port ` 的组合,可以设置服务器地址。也可以选择设置 :cpp:member:`path `,该字段对 WebSocket 连接而言非常有用。 + +使用 :cpp:member:`uri ` 字段的格式为 ``scheme://hostname:port/path``。 + +- 当前支持 ``mqtt``、``mqtts``、``ws`` 和 ``wss`` 协议 +- 基于 TCP 的 MQTT 示例: + + - ``mqtt://mqtt.eclipseprojects.io``:基于 TCP 的 MQTT,默认端口 1883 + - ``mqtt://mqtt.eclipseprojects.io:1884``:基于 TCP 的 MQTT,端口 1884 + - ``mqtt://username:password@mqtt.eclipseprojects.io:1884``:基于 TCP 的 MQTT, + 端口 1884,带有用户名和密码 + +- 基于 SSL 的 MQTT 示例: + + - ``mqtts://mqtt.eclipseprojects.io``:基于 SSL 的 MQTT,端口 8883 + - ``mqtts://mqtt.eclipseprojects.io:8884``:基于 SSL 的 MQTT,端口 8884 + +- 基于 WebSocket 的 MQTT 示例: + + - ``ws://mqtt.eclipseprojects.io:80/mqtt`` + +- 基于 WebSocket Secure 的 MQTT 示例: + + - ``wss://mqtt.eclipseprojects.io:443/mqtt`` + +- 最简配置: + +.. code-block:: c + + const esp_mqtt_client_config_t mqtt_cfg = { + .broker.address.uri = "mqtt://mqtt.eclipseprojects.io", + }; + esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg); + esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, client); + esp_mqtt_client_start(client); + +.. note:: + + 默认情况下,MQTT 客户端使用事件循环库来发布相关 MQTT 事件(已连接、已订阅、已发布等)。 + +============= +验证 +============= + +为验证服务器身份,对于使用 TLS 的安全链接,必须设置 :cpp:class:`verification ` 结构体。 +服务器证书可设置为 PEM 或 DER 格式。如要选择 DER 格式,必须设置等效 :cpp:member:`certificate_len ` 字段,否则应在 :cpp:member:`certificate ` 字段传入以空字符结尾的 PEM 格式字符串。 + +- 从服务器获取证书,例如:``mqtt.eclipseprojects.io`` + .. code:: + + openssl s_client -showcerts -connect mqtt.eclipseprojects.io:8883 < /dev/null \ + 2> /dev/null | openssl x509 -outform PEM > mqtt_eclipse_org.pem + +- 检查示例应用程序::example:`ssl` +- 配置: + +.. code:: c + + const esp_mqtt_client_config_t mqtt_cfg = { + .broker = { + .address.uri = "mqtts://mqtt.eclipseprojects.io:8883", + .verification.certificate = (const char *)mqtt_eclipse_org_pem_start, + }, + }; + +了解其他字段的详细信息,请查看 `API 参考`_ 以及 :ref:`esp_tls_server_verification`。 + +客户端凭据 +^^^^^^^^^^^^^^^^^^^^^^^^ + +:cpp:class:`credentials ` 字段下包含所有客户端相关凭据。 + + * :cpp:member:`username `:指向用于连接服务器用户名的指针,也可通过 URI 设置 + * :cpp:member:`client_id `:指向客户端 ID 的指针,默认为 ``ESP32_%CHIPID%``,其中 ``%CHIPID%`` 是十六进制 MAC 地址的最后 3 个字节 + +=============== +认证 +=============== + +可以通过 :cpp:class:`authentication ` 字段设置认证参数。客户端支持以下认证方式: + + * :cpp:member:`password `:使用密码 + * * :cpp:member:`certificate ` 和 :cpp:member:`key `:进行双向 TLS 身份验证,PEM 或 DER 格式均可 + * :cpp:member:`use_secure_element `:使用 ESP32 系列中的安全元素 (ATECC608A) + * :cpp:member:`ds_data `:使用某些乐鑫设备的数字签名外设 + +会话 +^^^^^^^^^^^^ + +使用 :cpp:class:`session ` 字段进行 MQTT 会话相关配置。 + +======================== +遗嘱消息 (LWT) +======================== + +通过设置 :cpp:class:`last_will ` 结构体的以下字段,MQTT 会在一个客户端意外断开连接时通过遗嘱消息通知其他客户端。 + + * :cpp:member:`topic `:指向 LWT 消息主题的指针 + * :cpp:member:`msg `:指向 LWT 消息的指针 + * :cpp:member:`msg_len `:LWT 消息的长度,:cpp:member:`msg ` 不以空字符结尾时需要该字段 + * :cpp:member:`qos `:LWT 消息的服务质量 + * :cpp:member:`retain `:指定 LWT 消息的保留标志 + +在项目配置菜单中设置 MQTT +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +通过 :code:`idf.py menuconfig`,可以在 ``Component config`` > ``ESP-MQTT Configuration`` 中找到 MQTT 设置。 + +相关设置如下: + +- :ref:`CONFIG_MQTT_PROTOCOL_311`:启用 MQTT 协议 3.1.1 版本 + +- :ref:`CONFIG_MQTT_TRANSPORT_SSL` 和 :ref:`CONFIG_MQTT_TRANSPORT_WEBSOCKET`:启用特定 MQTT 传输层,例如 SSL、WEBSOCKET 和 WEBSOCKET_SECURE + +- :ref:`CONFIG_MQTT_CUSTOM_OUTBOX`:禁用 mqtt_outbox 默认实现,因此可以提供特定实现 + + +事件 +------------ +MQTT 客户端可能会发布以下事件: + +* ``MQTT_EVENT_BEFORE_CONNECT``:客户端已初始化并即将开始连接至服务器。 +* ``MQTT_EVENT_CONNECTED``:客户端已成功连接至服务器。客户端已准备好收发数据。 +* ``MQTT_EVENT_DISCONNECTED``:由于无法读取或写入数据,例如因为服务器无法使用,客户端已终止连接。 +* ``MQTT_EVENT_SUBSCRIBED``:服务器已确认客户端的订阅请求。事件数据将包含订阅消息的消息 ID。 +* ``MQTT_EVENT_UNSUBSCRIBED``:服务器已确认客户端的退订请求。事件数据将包含退订消息的消息 ID。 +* ``MQTT_EVENT_PUBLISHED``:服务器已确认客户端的发布消息。消息将仅针对 QoS 级别 1 和 2 发布,因为级别 0 不会进行确认。事件数据将包含发布消息的消息 ID。 +* ``MQTT_EVENT_DATA``:客户端已收到发布消息。事件数据包含:消息 ID、发布消息所属主题名称、收到的数据及其长度。对于超出内部缓冲区的数据,将发布多个 ``MQTT_EVENT_DATA``,并更新事件数据的 :cpp:member:`current_data_offset ` 和 :cpp:member:`total_data_len` 以跟踪碎片化消息。 +* ``MQTT_EVENT_ERROR``:客户端遇到错误。使用事件数据 :cpp:type:`error_handle ` 字段中的 :cpp:type:`error_type `,可以发现错误。错误类型决定 :cpp:type:`error_handle ` 结构体的哪些部分会被填充。 + +API 参考 +------------- + +.. include-build-file:: inc/mqtt_client.inc +.. include-build-file:: inc/mqtt5_client.inc diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/CMakeLists.txt new file mode 100644 index 000000000..746ab1cb3 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/CMakeLists.txt @@ -0,0 +1,20 @@ +# The following four lines of boilerplate have to be in your project's CMakeLists +# in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +# "Trim" the build. Include the minimal set of components, main, and anything it depends on. +idf_build_set_property(MINIMAL_BUILD ON) +project(mqtt_tcp_custom_outbox) + +# Add custom outbox implementation to mqtt component +idf_component_get_property(mqtt mqtt COMPONENT_LIB) +target_sources(${mqtt} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/main/custom_outbox.cpp) + +# Our C++ needs an extra dependency to mqtt component, so we add it to mqtt component. +# This is needed because we are adding another source to the mqtt component and the build +# system needs to be aware of it to be able to compile and link the mqtt component. +# First we get our dependency +idf_component_get_property(pthread pthread COMPONENT_LIB) +# And them we link the components +target_link_libraries(${mqtt} ${pthread}) diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/README.md b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/README.md new file mode 100644 index 000000000..5b64bcdba --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/README.md @@ -0,0 +1,100 @@ +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | + +# ESP-MQTT custom outbox sample application +(See the README.md file in the upper level 'examples' directory for more information about examples.) + +This example is a slightly modified version of the tcp example to show how to configure a custom outbox. +This example connects to the broker URI selected using `idf.py menuconfig` (using mqtt tcp transport) and as a demonstration subscribes/unsubscribes and send a message on certain topic. +(Please note that the public broker is maintained by the community so may not be always available, for details please see this [disclaimer](https://iot.eclipse.org/getting-started/#sandboxes)) + +Note: If the URI equals `FROM_STDIN` then the broker address is read from stdin upon application startup (used for testing) + +It uses ESP-MQTT library which implements mqtt client to connect to mqtt broker. + +## Necessary changes to customize the outbox + +To customize the outbox the first step is to enable it in the menuconfig option. + +With this option enabled, the default implementation isn't defined and the function definition needs to be added to mqtt component. +Any extra dependencies needed by the new sources also need to be added to the mqtt component. Refer to the example CMakeLists.txt file +for the details on how to do it. + +## The custom outbox in the example + +For the sake of this example the customized outbox implements the same functionalits of the regular but using C++ as a language. + +The implementation uses [C++ Polymorphic memory resources]() to control memory allocations and limit the usage of the memory. + +## How to use example + +### Hardware Required + +This example can be executed on any ESP32 board, the only required interface is WiFi and connection to internet. + +### Configure the project + +* Open the project configuration menu (`idf.py menuconfig`) +* Configure Wi-Fi or Ethernet under "Example Connection Configuration" menu. See "Establishing Wi-Fi or Ethernet Connection" section in [examples/protocols/README.md](../../README.md) for more details. + +Note that the mandatory configurations for this example, mqtt custom outbox and C++ exceptions are automatically added by the `sdkconfig.defaults` file. +### Build and Flash + +Build the project and flash it to the board, then run monitor tool to view serial output: + +``` +idf.py -p PORT flash monitor +``` + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the Getting Started Guide for full steps to configure and use ESP-IDF to build projects. + +## Example Output + +``` +I (4635) example_common: Connected to example_netif_sta +I (4645) example_common: - IPv4 address: 192.168.33.206, +I (4645) example_common: - IPv6 address: fe80:0000:0000:0000:7e9e:bdff:fecf:00c0, type: ESP_IP6_ADDR_IS_LINK_LOCAL +I (4655) Monotonic: Monotonic: 400 bytes allocated, 400 total bytes in use +I (4665) Monotonic: Monotonic: 1000 bytes allocated, 1400 total bytes in use +I (4675) Monotonic: Monotonic: 128 bytes allocated, 1528 total bytes in use +I (4685) Pool: Pool: 32 bytes allocated, 32 total bytes in use +I (4685) Monotonic: Monotonic: 7688 bytes allocated, 9216 total bytes in use +I (4695) Monotonic: Monotonic: 128 bytes allocated, 9344 total bytes in use +I (4705) Pool: Pool: 480 bytes allocated, 512 total bytes in use +I (4715) Monotonic: Monotonic: 992 bytes allocated, 10336 total bytes in use +I (4715) Monotonic: Monotonic: 128 bytes allocated, 10464 total bytes in use +I (4725) Pool: Pool: 23 bytes allocated, 535 total bytes in use +I (4735) MQTT_EXAMPLE: Enqueued msg_id=14345 +I (4735) Pool: Pool: 29 bytes allocated, 564 total bytes in use +I (4745) MQTT_EXAMPLE: Enqueued msg_id=3507 +I (4745) MQTT_EXAMPLE: Other event id:7 +I (4755) main_task: Returned from app_main() +I (5085) MQTT_EXAMPLE: MQTT_EVENT_CONNECTED +I (5085) Pool: Pool: 23 bytes allocated, 587 total bytes in use +I (5085) MQTT_EXAMPLE: sent publish successful, msg_id=47425 +I (5085) Pool: Pool: 18 bytes allocated, 605 total bytes in use +I (5095) MQTT_EXAMPLE: sent subscribe successful, msg_id=60709 +I (5105) Pool: Pool: 18 bytes allocated, 623 total bytes in use +I (5105) MQTT_EXAMPLE: sent subscribe successful, msg_id=33273 +I (5395) Pool: Pool: 23 bytes deallocated, 623 total bytes in use +I (5395) MQTT_EXAMPLE: MQTT_EVENT_PUBLISHED, msg_id=47425 +I (6005) Pool: Pool: 18 bytes deallocated, 623 total bytes in use +I (6005) MQTT_EXAMPLE: MQTT_EVENT_SUBSCRIBED, msg_id=60709 +I (6005) MQTT_EXAMPLE: sent publish successful, msg_id=0 +I (6015) Pool: Pool: 18 bytes deallocated, 623 total bytes in use +I (6015) MQTT_EXAMPLE: MQTT_EVENT_SUBSCRIBED, msg_id=33273 +I (6025) MQTT_EXAMPLE: sent publish successful, msg_id=0 +I (6035) MQTT_EXAMPLE: MQTT_EVENT_DATA +TOPIC=/topic/qos1 +DATA=data_3 +I (6315) MQTT_EXAMPLE: MQTT_EVENT_DATA +TOPIC=/topic/qos1 +DATA=data_3 +I (6315) Pool: Pool: 23 bytes deallocated, 623 total bytes in use +I (6315) MQTT_EXAMPLE: MQTT_EVENT_PUBLISHED, msg_id=14345 +I (6615) MQTT_EXAMPLE: MQTT_EVENT_DATA +TOPIC=/topic/qos0 +DATA=data +``` diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/main/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/main/CMakeLists.txt new file mode 100644 index 000000000..7423b6078 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/main/CMakeLists.txt @@ -0,0 +1,4 @@ +idf_component_register(SRCS "app_main.c" + INCLUDE_DIRS "." + PRIV_REQUIRES mqtt nvs_flash esp_netif + ) diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/main/Kconfig.projbuild b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/main/Kconfig.projbuild new file mode 100644 index 000000000..c11539fb8 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/main/Kconfig.projbuild @@ -0,0 +1,13 @@ +menu "Example Configuration" + + config BROKER_URL + string "Broker URL" + default "mqtt://mqtt.eclipseprojects.io" + help + URL of the broker to connect to + + config BROKER_URL_FROM_STDIN + bool + default y if BROKER_URL = "FROM_STDIN" + +endmenu diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/main/app_main.c b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/main/app_main.c new file mode 100644 index 000000000..b30bc46aa --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/main/app_main.c @@ -0,0 +1,173 @@ +/* + * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Unlicense OR CC0-1.0 + */ +/* MQTT (over TCP) Example with custom outbox + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +#include +#include +#include +#include +#include "esp_system.h" +#include "nvs_flash.h" +#include "esp_event.h" +#include "esp_netif.h" +#include "protocol_examples_common.h" + +#include "esp_log.h" +#include "mqtt_client.h" + +static const char *TAG = "MQTT_EXAMPLE"; + + +static void log_error_if_nonzero(const char *message, int error_code) +{ + if (error_code != 0) { + ESP_LOGE(TAG, "Last error %s: 0x%x", message, error_code); + } +} + +/* + * @brief Event handler registered to receive MQTT events + * + * This function is called by the MQTT client event loop. + * + * @param handler_args user data registered to the event. + * @param base Event base for the handler(always MQTT Base in this example). + * @param event_id The id for the received event. + * @param event_data The data for the event, esp_mqtt_event_handle_t. + */ +static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) +{ + ESP_LOGD(TAG, "Event dispatched from event loop base=%s, event_id=%" PRIi32 "", base, event_id); + esp_mqtt_event_handle_t event = event_data; + esp_mqtt_client_handle_t client = event->client; + int msg_id; + switch ((esp_mqtt_event_id_t)event_id) { + case MQTT_EVENT_CONNECTED: + ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED"); + msg_id = esp_mqtt_client_publish(client, "/topic/qos1", "data_3", 0, 1, 0); + ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id); + + msg_id = esp_mqtt_client_subscribe(client, "/topic/qos0", 0); + ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); + + msg_id = esp_mqtt_client_subscribe(client, "/topic/qos1", 1); + ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); + + break; + case MQTT_EVENT_DISCONNECTED: + ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED"); + break; + + case MQTT_EVENT_SUBSCRIBED: + ESP_LOGI(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d", event->msg_id); + msg_id = esp_mqtt_client_publish(client, "/topic/qos0", "data", 0, 0, 0); + ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id); + break; + case MQTT_EVENT_UNSUBSCRIBED: + ESP_LOGI(TAG, "MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id); + break; + case MQTT_EVENT_PUBLISHED: + ESP_LOGI(TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id); + break; + case MQTT_EVENT_DATA: + ESP_LOGI(TAG, "MQTT_EVENT_DATA"); + printf("TOPIC=%.*s\r\n", event->topic_len, event->topic); + printf("DATA=%.*s\r\n", event->data_len, event->data); + break; + case MQTT_EVENT_ERROR: + ESP_LOGI(TAG, "MQTT_EVENT_ERROR"); + if (event->error_handle->error_type == MQTT_ERROR_TYPE_TCP_TRANSPORT) { + log_error_if_nonzero("reported from esp-tls", event->error_handle->esp_tls_last_esp_err); + log_error_if_nonzero("reported from tls stack", event->error_handle->esp_tls_stack_err); + log_error_if_nonzero("captured as transport's socket errno", event->error_handle->esp_transport_sock_errno); + ESP_LOGI(TAG, "Last errno string (%s)", strerror(event->error_handle->esp_transport_sock_errno)); + + } + break; + default: + ESP_LOGI(TAG, "Other event id:%d", event->event_id); + break; + } +} + +static void mqtt_app_start(void) +{ + esp_mqtt_client_config_t mqtt_cfg = { + .broker.address.uri = CONFIG_BROKER_URL, + }; +#if CONFIG_BROKER_URL_FROM_STDIN + char line[128]; + + if (strcmp(mqtt_cfg.broker.address.uri, "FROM_STDIN") == 0) { + int count = 0; + printf("Please enter url of mqtt broker\n"); + while (count < 128) { + int c = fgetc(stdin); + if (c == '\n') { + line[count] = '\0'; + break; + } else if (c > 0 && c < 127) { + line[count] = c; + ++count; + } + vTaskDelay(10 / portTICK_PERIOD_MS); + } + mqtt_cfg.broker.address.uri = line; + printf("Broker url: %s\n", line); + } else { + ESP_LOGE(TAG, "Configuration mismatch: wrong broker url"); + abort(); + } +#endif /* CONFIG_BROKER_URL_FROM_STDIN */ + + esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg); + /* The last argument may be used to pass data to the event handler, in this example mqtt_event_handler */ + esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL); + + /*Let's enqueue a few messages to the outbox to see the allocations*/ + int msg_id; + msg_id = esp_mqtt_client_enqueue(client, "/topic/qos1", "data_3", 0, 1, 0, true); + ESP_LOGI(TAG, "Enqueued msg_id=%d", msg_id); + msg_id = esp_mqtt_client_enqueue(client, "/topic/qos2", "QoS2 message", 0, 2, 0, true); + ESP_LOGI(TAG, "Enqueued msg_id=%d", msg_id); + + /* Now we start the client and it's possible to see the memory usage for the operations in the outbox. */ + esp_mqtt_client_start(client); +} + +void app_main(void) +{ + ESP_LOGI(TAG, "[APP] Startup.."); + ESP_LOGI(TAG, "[APP] Free memory: %" PRIu32 " bytes", esp_get_free_heap_size()); + ESP_LOGI(TAG, "[APP] IDF version: %s", esp_get_idf_version()); + + esp_log_level_set("*", ESP_LOG_INFO); + esp_log_level_set("mqtt_client", ESP_LOG_VERBOSE); + esp_log_level_set("MQTT_EXAMPLE", ESP_LOG_VERBOSE); + esp_log_level_set("TRANSPORT_BASE", ESP_LOG_VERBOSE); + esp_log_level_set("esp-tls", ESP_LOG_VERBOSE); + esp_log_level_set("TRANSPORT", ESP_LOG_VERBOSE); + esp_log_level_set("custom_outbox", ESP_LOG_VERBOSE); + + ESP_ERROR_CHECK(nvs_flash_init()); + ESP_ERROR_CHECK(esp_netif_init()); + ESP_ERROR_CHECK(esp_event_loop_create_default()); + + /* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig. + * Read "Establishing Wi-Fi or Ethernet Connection" section in + * examples/protocols/README.md for more information about this function. + */ + ESP_ERROR_CHECK(example_connect()); + + mqtt_app_start(); +} diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/main/custom_outbox.cpp b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/main/custom_outbox.cpp new file mode 100644 index 000000000..2db9d7e49 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/main/custom_outbox.cpp @@ -0,0 +1,393 @@ +/* + * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Unlicense OR CC0-1.0 + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "esp_log.h" +#include "mqtt_outbox.h" + +constexpr auto TAG = "custom_outbox"; + +/* + * The trace resource class is created here as an example on how to build a custom memory resource + * The class is only needed to show where we are allocating from and to track allocations and deallocations. + */ +class trace_resource : public std::pmr::memory_resource { +public: + explicit trace_resource(std::string resource_name, std::pmr::memory_resource *upstream_resource = std::pmr::get_default_resource()) : upstream{upstream_resource}, name{std::move(resource_name)} {} + [[nodiscard]] std::string_view get_name() const noexcept + { + return std::string_view(name); + } + [[nodiscard]] auto upstream_resource() const + { + return upstream; + } +private: + void *do_allocate(std::size_t bytes, std::size_t alignment) override + { + auto *allocated = upstream->allocate(bytes, alignment); + allocated_total += bytes; + ESP_LOGI(name.c_str(), "%s: %zu bytes allocated, %zu total bytes in use", name.c_str(), bytes, allocated_total); + return allocated; + } + void do_deallocate(void *ptr, std::size_t bytes, std::size_t alignment) override + { + upstream->deallocate(ptr, bytes, alignment); + ESP_LOGI(name.c_str(), "%s: %zu bytes deallocated, %zu total bytes in use", name.c_str(), bytes, allocated_total); + } + + [[nodiscard]] bool do_is_equal(const std::pmr::memory_resource &other) const noexcept override + { + return this == &other; + } + size_t allocated_total{}; + std::pmr::memory_resource *upstream; + std::string name; +}; + +struct outbox_item { + /* Defining the allocator_type to let compiler know that our type is allocator aware, + * This way the allocator used for the outbox is propagated to the messages*/ + using allocator_type = std::pmr::polymorphic_allocator<>; + + /* Few strong types to diferetiate parameters*/ + enum class id_t : int {}; + enum class type_t : int {}; + enum class qos_t : int {}; + + /* Allocator aware constructors */ + outbox_item( + std::pmr::vector message, + id_t msg_id, + type_t msg_type, + qos_t msg_qos, + outbox_tick_t tick, + pending_state_t pending_state, + allocator_type alloc = {} + ) : message(std::move(message), alloc), id(msg_id), type(msg_type), qos(msg_qos), tick(tick), pending_state(pending_state) {} + + /*Copy and move constructors have an extra allocator parameter, for copy default and allocator aware are the same.*/ + outbox_item(const outbox_item &other, allocator_type alloc = {}) : message(other.message, alloc), id(other.id), type(other.type), qos(other.qos), tick(other.tick), pending_state(other.pending_state) {} + outbox_item(outbox_item &&other, allocator_type alloc) noexcept : message(std::move(other.message), alloc), id(other.id), type(other.type), qos(other.qos), tick(other.tick), pending_state(other.pending_state) + {} + + outbox_item(const outbox_item &) = default; + outbox_item(outbox_item &&other) = default; + outbox_item &operator=(const outbox_item &rhs) = default; + outbox_item &operator=(outbox_item &&other) = default; + ~outbox_item() = default; + + /* Getters to support outbox operation */ + [[nodiscard]] auto state() const noexcept + { + return pending_state; + } + + [[nodiscard]] allocator_type get_allocator() const + { + return message.get_allocator(); + } + + void set(pending_state state) noexcept + { + pending_state = state; + } + + void set(outbox_tick_t n_tick) noexcept + { + tick = n_tick; + } + + [[nodiscard]] auto get_id() const noexcept + { + return id; + } + + [[nodiscard]] auto get_type() const noexcept + { + return type; + } + + [[nodiscard]] auto get_tick() const noexcept + { + return tick; + } + + [[nodiscard]] auto get_data(size_t *len, uint16_t *msg_id, int *msg_type, int *msg_qos) + { + *len = message.size(); + *msg_id = static_cast(id); + *msg_type = static_cast(type); + *msg_qos = static_cast(qos); + return message.data(); + } + + [[nodiscard]] auto get_size() const noexcept + { + return message.size(); + } + +private: + std::pmr::vector message; + id_t id; + type_t type; + qos_t qos; + outbox_tick_t tick; + pending_state_t pending_state; +}; + +/* + * For the outbox_t we let the special member functions as default and + * we don't extend the allocator aware versions for the sake of the simplicity, since the operations are not needed in the usage. + */ +struct outbox_t { + using allocator_type = std::pmr::polymorphic_allocator<>; + explicit outbox_t(allocator_type alloc = {}) : queue(alloc) {} + + outbox_item_handle_t get(outbox_item::id_t msg_id) + { + if (auto item = std::ranges::find_if(queue, [msg_id](auto & item) { + return item.get_id() == msg_id; + }); + item != std::end(queue)) { + return &(*item); + } + return nullptr; + } + + int delete_expired(outbox_tick_t current_tick, outbox_tick_t timeout) + { + return std::erase_if(queue, [current_tick, timeout, this](const outbox_item & item) { + if (current_tick - item.get_tick() > timeout) { + total_size -= item.get_size(); + return true; + } + return false; + }); + } + + outbox_item::id_t delete_single_expired(outbox_tick_t current_tick, outbox_tick_t timeout) + { + if (auto erase = std::ranges::find_if(queue, [current_tick, timeout](auto & item) { + return (current_tick - item.get_tick() > timeout); + }); erase != std::end(queue)) { + auto msg_id = erase->get_id(); + total_size -= erase->get_size(); + queue.erase(erase); + return msg_id; + } + return outbox_item::id_t{-1}; + } + + auto erase(outbox_item_handle_t to_erase) + { + return erase_if([to_erase](auto & item) { + return &item == to_erase; + }); + } + + auto erase(outbox_item::id_t msg_id, outbox_item::type_t msg_type) + { + return erase_if([msg_id, msg_type](auto & item) { + return (item.get_id() == msg_id && (item.get_type() == msg_type)); + }); + } + + [[nodiscard]] auto size() const noexcept + { + return total_size; + } + + void clear() + { + queue.clear(); + } + + outbox_item_handle_t enqueue(outbox_message_handle_t message, outbox_tick_t tick) noexcept + { + try { + auto &item = + queue.emplace_back(std::pmr::vector {message->data, message->data + message->len}, + outbox_item::id_t{message->msg_id}, + outbox_item::type_t{message->msg_type}, + outbox_item::qos_t{message->msg_qos}, + tick, + QUEUED + ); + total_size += item.get_size(); + ESP_LOGD(TAG, "ENQUEUE msgid=%d, msg_type=%d, len=%d, size=%" PRIu64, message->msg_id, message->msg_type, message->len + message->remaining_len, outbox_get_size(this)); + return &item; + } catch (const std::exception &e) { + return nullptr; + } + } + + outbox_item_handle_t dequeue(pending_state_t state, outbox_tick_t *tick) + { + if (auto item = std::ranges::find_if(queue, [state](auto & item) { + return item.state() == state; + }); + item != std::end(queue)) { + if (tick != nullptr) { + *tick = item->get_tick(); + } + return &(*item); + } + return nullptr; + } + [[nodiscard]] allocator_type get_allocator() const + { + return queue.get_allocator(); + } +private: + [[nodiscard]] esp_err_t erase_if(std::predicate auto &&predicate) + { + if (auto to_erase = std::ranges::find_if(queue, predicate); to_erase != std::end(queue)) { + total_size -= to_erase->get_size(); + queue.erase(to_erase); + return ESP_OK; + } + return ESP_FAIL; + } + std::size_t total_size{}; + std::pmr::deque queue ; +}; + +extern "C" { + + outbox_handle_t outbox_init() + { + /* First we create a fixed size memory buffer to be used. */ + static constexpr auto work_memory_size = 16 * 1024; + static std::array resource_buffer{}; + try { + /* + * Since the outbox is managed by a C API we can't rely on C++ automatic cleanup and smart pointers but, on production code it would be better to add the + * memory resources to outbox_t, applying RAII principles, and make only outbox_item allocator aware. For the sake of the example we are keeping them + * separated to explictly show the relations. + * First we create the monotonic buffer and add null_memory_resource as upstream. This way if our working memory is exausted an exception is thrown. + */ + auto *monotonic_resource = new std::pmr::monotonic_buffer_resource{resource_buffer.data(), resource_buffer.size(), std::pmr::null_memory_resource()}; + /*Here we add our custom trace wrapper type to trace allocations and deallocations*/ + auto *trace_monotonic = new trace_resource("Monotonic", monotonic_resource); + + /* We compose monotonic buffer with pool resource, since the monotonic deallocate is a no-op and we need to remove messages to not go out of memory.*/ + auto *pool_resource = new std::pmr::unsynchronized_pool_resource{trace_monotonic}; + auto *trace_pool = new trace_resource("Pool", pool_resource); + /* Our outbox class is created using the trace_pool as memory resource */ + auto *outbox = new outbox_t{trace_pool}; + return outbox; + } catch (const std::exception &e) { + ESP_LOGD(TAG, "Not enough memory to construct the outbox, review the resource_buffer size"); + return nullptr; + + } + } + + outbox_item_handle_t outbox_enqueue(outbox_handle_t outbox, outbox_message_handle_t message, outbox_tick_t tick) + { + return outbox->enqueue(message, tick); + } + + outbox_item_handle_t outbox_get(outbox_handle_t outbox, int msg_id) + { + return outbox->get(outbox_item::id_t{msg_id}); + } + + outbox_item_handle_t outbox_dequeue(outbox_handle_t outbox, pending_state_t pending, outbox_tick_t *tick) + { + return outbox->dequeue(pending, tick); + } +} + +uint8_t *outbox_item_get_data(outbox_item_handle_t item, size_t *len, uint16_t *msg_id, int *msg_type, int *qos) +{ + if (item == nullptr) { + return nullptr; + } + return item->get_data(len, msg_id, msg_type, qos); +} + +esp_err_t outbox_delete_item(outbox_handle_t outbox, outbox_item_handle_t item_to_delete) +{ + return outbox->erase(item_to_delete); + +} + +esp_err_t outbox_delete(outbox_handle_t outbox, int msg_id, int msg_type) +{ + return outbox->erase(outbox_item::id_t{msg_id}, outbox_item::type_t{msg_type}); +} + +int outbox_delete_single_expired(outbox_handle_t outbox, outbox_tick_t current_tick, outbox_tick_t timeout) +{ + return static_cast(outbox->delete_single_expired(current_tick, timeout)); +} + +int outbox_delete_expired(outbox_handle_t outbox, outbox_tick_t current_tick, outbox_tick_t timeout) +{ + return outbox->delete_expired(current_tick, timeout); +} + +esp_err_t outbox_set_pending(outbox_handle_t outbox, int msg_id, pending_state_t pending) +{ + if (auto *item = outbox->get(outbox_item::id_t{msg_id}); item != nullptr) { + item->set(pending); + return ESP_OK; + } + return ESP_FAIL; +} + +pending_state_t outbox_item_get_pending(outbox_item_handle_t item) +{ + if (item != nullptr) { + return item->state(); + } + return QUEUED; +} + +esp_err_t outbox_set_tick(outbox_handle_t outbox, int msg_id, outbox_tick_t tick) +{ + if (auto *item = outbox->get(outbox_item::id_t{msg_id}); item != nullptr) { + item->set(tick); + return ESP_OK; + } + return ESP_FAIL; +} + +uint64_t outbox_get_size(outbox_handle_t outbox) +{ + return outbox->size(); +} + +void outbox_delete_all_items(outbox_handle_t outbox) +{ + outbox->clear(); +} + +void outbox_destroy(outbox_handle_t outbox) +{ + auto *trace_pool = static_cast(outbox->get_allocator().resource()); + auto *pool_resource = static_cast(trace_pool->upstream_resource()); + auto *trace_monotonic = static_cast(pool_resource->upstream_resource()); + auto *monotonic_resource = static_cast(trace_monotonic->upstream_resource()); + + delete monotonic_resource; + delete trace_monotonic; + delete pool_resource; + delete trace_pool; + delete outbox; +} diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/main/idf_component.yml b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/main/idf_component.yml new file mode 100644 index 000000000..808c17483 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/main/idf_component.yml @@ -0,0 +1,5 @@ +dependencies: + espressif/mqtt: + version: '*' + protocol_examples_common: + path: ${IDF_PATH}/examples/common_components/protocol_examples_common diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/sdkconfig.ci.esp32c6 b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/sdkconfig.ci.esp32c6 new file mode 100644 index 000000000..1686559de --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/sdkconfig.ci.esp32c6 @@ -0,0 +1 @@ +CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE=y diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/sdkconfig.defaults b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/sdkconfig.defaults new file mode 100644 index 000000000..11f90ceac --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/custom_outbox/sdkconfig.defaults @@ -0,0 +1,3 @@ +CONFIG_MQTT_CUSTOM_OUTBOX=y +CONFIG_COMPILER_CXX_EXCEPTIONS=y +CONFIG_COMPILER_OPTIMIZATION_SIZE=y diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/CMakeLists.txt new file mode 100644 index 000000000..fe8bdc9cd --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/CMakeLists.txt @@ -0,0 +1,9 @@ +# The following four lines of boilerplate have to be in your project's CMakeLists +# in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +# "Trim" the build. Include the minimal set of components, main, and anything it depends on. +idf_build_set_property(MINIMAL_BUILD ON) +project(mqtt5) diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/README.md b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/README.md new file mode 100644 index 000000000..3e6c9c225 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/README.md @@ -0,0 +1,78 @@ +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | + +# ESP-MQTT sample application +(See the README.md file in the upper level 'examples' directory for more information about examples.) + +This example connects to the broker URI selected using `idf.py menuconfig` (using mqtt tcp transport) and as a demonstration subscribes/unsubscribes and send a message on certain topic. +(Please note that the public broker is maintained by the community so may not be always available, for details please see this [disclaimer](https://iot.eclipse.org/getting-started/#sandboxes)) + +Note: If the URI equals `FROM_STDIN` then the broker address is read from stdin upon application startup (used for testing) + +It uses ESP-MQTT library which implements mqtt client to connect to mqtt broker with MQTT version 5. + +The more details about MQTT v5, please refer to [official website](https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html) + +## How to use example + +### Hardware Required + +This example can be executed on any ESP32 board, the only required interface is WiFi and connection to internet. + +### Configure the project + +* Open the project configuration menu (`idf.py menuconfig`) +* Configure Wi-Fi or Ethernet under "Example Connection Configuration" menu. See "Establishing Wi-Fi or Ethernet Connection" section in [examples/protocols/README.md](../../README.md) for more details. +* MQTT v5 protocol (`CONFIG_MQTT_PROTOCOL_5`) under "ESP-MQTT Configurations" menu is enabled by `sdkconfig.defaults`. + +### Build and Flash + +Build the project and flash it to the board, then run monitor tool to view serial output: + +``` +idf.py -p PORT flash monitor +``` + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the Getting Started Guide for full steps to configure and use ESP-IDF to build projects. + +## Example Output + +``` +I (5119) esp_netif_handlers: example_connect: sta ip: 192.168.3.143, mask: 255.255.255.0, gw: 192.168.3.1 +I (5119) example_connect: Got IPv4 event: Interface "example_connect: sta" address: 192.168.3.143 +I (5619) example_connect: Got IPv6 event: Interface "example_connect: sta" address: fe80:0000:0000:0000:c64f:33ff:fe24:6645, type: ESP_IP6_ADDR_IS_LINK_LOCAL +I (5619) example_connect: Connected to example_connect: sta +I (5629) example_connect: - IPv4 address: 192.168.3.143 +I (5629) example_connect: - IPv6 address: fe80:0000:0000:0000:c64f:33ff:fe24:6645, type: ESP_IP6_ADDR_IS_LINK_LOCAL +I (5649) MQTT5_EXAMPLE: Other event id:7 +W (6299) wifi:idx:0 (ifx:0, 34:29:12:43:c5:40), tid:7, ssn:0, winSize:64 +I (7439) MQTT5_EXAMPLE: MQTT_EVENT_CONNECTED +I (7439) MQTT5_EXAMPLE: sent publish successful, msg_id=53118 +I (7439) MQTT5_EXAMPLE: sent subscribe successful, msg_id=41391 +I (7439) MQTT5_EXAMPLE: sent subscribe successful, msg_id=13695 +I (7449) MQTT5_EXAMPLE: sent unsubscribe successful, msg_id=55594 +I (7649) mqtt5_client: MQTT_MSG_TYPE_PUBACK return code is -1 +I (7649) MQTT5_EXAMPLE: MQTT_EVENT_PUBLISHED, msg_id=53118 +I (8039) mqtt5_client: MQTT_MSG_TYPE_SUBACK return code is 0 +I (8049) MQTT5_EXAMPLE: MQTT_EVENT_SUBSCRIBED, msg_id=41391 +I (8049) MQTT5_EXAMPLE: sent publish successful, msg_id=0 +I (8059) mqtt5_client: MQTT_MSG_TYPE_SUBACK return code is 2 +I (8059) MQTT5_EXAMPLE: MQTT_EVENT_SUBSCRIBED, msg_id=13695 +I (8069) MQTT5_EXAMPLE: sent publish successful, msg_id=0 +I (8079) MQTT5_EXAMPLE: MQTT_EVENT_DATA +I (8079) MQTT5_EXAMPLE: key is board, value is esp32 +I (8079) MQTT5_EXAMPLE: key is u, value is user +I (8089) MQTT5_EXAMPLE: key is p, value is password +I (8089) MQTT5_EXAMPLE: payload_format_indicator is 1 +I (8099) MQTT5_EXAMPLE: response_topic is /topic/test/response +I (8109) MQTT5_EXAMPLE: correlation_data is 123456 +I (8109) MQTT5_EXAMPLE: content_type is +I (8119) MQTT5_EXAMPLE: TOPIC=/topic/qos1 +I (8119) MQTT5_EXAMPLE: DATA=data_3 +I (8129) mqtt5_client: MQTT_MSG_TYPE_UNSUBACK return code is 0 +I (8129) MQTT5_EXAMPLE: MQTT_EVENT_UNSUBSCRIBED, msg_id=55594 +I (8139) mqtt_client: Client asked to disconnect +I (9159) MQTT5_EXAMPLE: MQTT_EVENT_DISCONNECTED +``` diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/main/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/main/CMakeLists.txt new file mode 100644 index 000000000..3bf739cf8 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/main/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRCS "app_main.c" + PRIV_REQUIRES mqtt nvs_flash esp_netif + INCLUDE_DIRS ".") diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/main/Kconfig.projbuild b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/main/Kconfig.projbuild new file mode 100644 index 000000000..c11539fb8 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/main/Kconfig.projbuild @@ -0,0 +1,13 @@ +menu "Example Configuration" + + config BROKER_URL + string "Broker URL" + default "mqtt://mqtt.eclipseprojects.io" + help + URL of the broker to connect to + + config BROKER_URL_FROM_STDIN + bool + default y if BROKER_URL = "FROM_STDIN" + +endmenu diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/main/app_main.c b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/main/app_main.c new file mode 100644 index 000000000..e82fd70a9 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/main/app_main.c @@ -0,0 +1,290 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include +#include "esp_system.h" +#include "nvs_flash.h" +#include "esp_event.h" +#include "esp_netif.h" +#include "protocol_examples_common.h" +#include "esp_log.h" +#include "mqtt_client.h" + +static const char *TAG = "mqtt5_example"; + +static void log_error_if_nonzero(const char *message, int error_code) +{ + if (error_code != 0) { + ESP_LOGE(TAG, "Last error %s: 0x%x", message, error_code); + } +} + +static esp_mqtt5_user_property_item_t user_property_arr[] = { + {"board", "esp32"}, + {"u", "user"}, + {"p", "password"} + }; + +#define USE_PROPERTY_ARR_SIZE sizeof(user_property_arr)/sizeof(esp_mqtt5_user_property_item_t) + +static esp_mqtt5_publish_property_config_t publish_property = { + .payload_format_indicator = 1, + .message_expiry_interval = 1000, + .topic_alias = 0, + .response_topic = "/topic/test/response", + .correlation_data = "123456", + .correlation_data_len = 6, +}; + +static esp_mqtt5_subscribe_property_config_t subscribe_property = { + .subscribe_id = 25555, + .no_local_flag = false, + .retain_as_published_flag = false, + .retain_handle = 0, + .is_share_subscribe = true, + .share_name = "group1", +}; + +static esp_mqtt5_subscribe_property_config_t subscribe1_property = { + .subscribe_id = 25555, + .no_local_flag = true, + .retain_as_published_flag = false, + .retain_handle = 0, +}; + +static esp_mqtt5_unsubscribe_property_config_t unsubscribe_property = { + .is_share_subscribe = true, + .share_name = "group1", +}; + +static esp_mqtt5_disconnect_property_config_t disconnect_property = { + .session_expiry_interval = 60, + .disconnect_reason = 0, +}; + +static void print_user_property(mqtt5_user_property_handle_t user_property) +{ + if (user_property) { + uint8_t count = esp_mqtt5_client_get_user_property_count(user_property); + if (count) { + esp_mqtt5_user_property_item_t *item = malloc(count * sizeof(esp_mqtt5_user_property_item_t)); + if (esp_mqtt5_client_get_user_property(user_property, item, &count) == ESP_OK) { + for (int i = 0; i < count; i ++) { + esp_mqtt5_user_property_item_t *t = &item[i]; + ESP_LOGI(TAG, "key is %s, value is %s", t->key, t->value); + free((char *)t->key); + free((char *)t->value); + } + } + free(item); + } + } +} + +/* + * @brief Event handler registered to receive MQTT events + * + * This function is called by the MQTT client event loop. + * + * @param handler_args user data registered to the event. + * @param base Event base for the handler(always MQTT Base in this example). + * @param event_id The id for the received event. + * @param event_data The data for the event, esp_mqtt_event_handle_t. + */ +static void mqtt5_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) +{ + ESP_LOGD(TAG, "Event dispatched from event loop base=%s, event_id=%" PRIi32, base, event_id); + esp_mqtt_event_handle_t event = event_data; + esp_mqtt_client_handle_t client = event->client; + int msg_id; + + ESP_LOGD(TAG, "free heap size is %" PRIu32 ", minimum %" PRIu32, esp_get_free_heap_size(), esp_get_minimum_free_heap_size()); + switch ((esp_mqtt_event_id_t)event_id) { + case MQTT_EVENT_CONNECTED: + ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED"); + print_user_property(event->property->user_property); + esp_mqtt5_client_set_user_property(&publish_property.user_property, user_property_arr, USE_PROPERTY_ARR_SIZE); + esp_mqtt5_client_set_publish_property(client, &publish_property); + msg_id = esp_mqtt_client_publish(client, "/topic/qos1", "data_3", 0, 1, 1); + esp_mqtt5_client_delete_user_property(publish_property.user_property); + publish_property.user_property = NULL; + ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id); + + esp_mqtt5_client_set_user_property(&subscribe_property.user_property, user_property_arr, USE_PROPERTY_ARR_SIZE); + esp_mqtt5_client_set_subscribe_property(client, &subscribe_property); + msg_id = esp_mqtt_client_subscribe(client, "/topic/qos0", 0); + esp_mqtt5_client_delete_user_property(subscribe_property.user_property); + subscribe_property.user_property = NULL; + ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); + + esp_mqtt5_client_set_user_property(&subscribe1_property.user_property, user_property_arr, USE_PROPERTY_ARR_SIZE); + esp_mqtt5_client_set_subscribe_property(client, &subscribe1_property); + msg_id = esp_mqtt_client_subscribe(client, "/topic/qos1", 2); + esp_mqtt5_client_delete_user_property(subscribe1_property.user_property); + subscribe1_property.user_property = NULL; + ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); + + esp_mqtt5_client_set_user_property(&unsubscribe_property.user_property, user_property_arr, USE_PROPERTY_ARR_SIZE); + esp_mqtt5_client_set_unsubscribe_property(client, &unsubscribe_property); + msg_id = esp_mqtt_client_unsubscribe(client, "/topic/qos0"); + ESP_LOGI(TAG, "sent unsubscribe successful, msg_id=%d", msg_id); + esp_mqtt5_client_delete_user_property(unsubscribe_property.user_property); + unsubscribe_property.user_property = NULL; + break; + case MQTT_EVENT_DISCONNECTED: + ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED"); + print_user_property(event->property->user_property); + break; + case MQTT_EVENT_SUBSCRIBED: + ESP_LOGI(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d, reason code=0x%02x ", event->msg_id, (uint8_t)*event->data); + print_user_property(event->property->user_property); + esp_mqtt5_client_set_publish_property(client, &publish_property); + msg_id = esp_mqtt_client_publish(client, "/topic/qos0", "data", 0, 0, 0); + ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id); + break; + case MQTT_EVENT_UNSUBSCRIBED: + ESP_LOGI(TAG, "MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id); + print_user_property(event->property->user_property); + esp_mqtt5_client_set_user_property(&disconnect_property.user_property, user_property_arr, USE_PROPERTY_ARR_SIZE); + esp_mqtt5_client_set_disconnect_property(client, &disconnect_property); + esp_mqtt5_client_delete_user_property(disconnect_property.user_property); + disconnect_property.user_property = NULL; + esp_mqtt_client_disconnect(client); + break; + case MQTT_EVENT_PUBLISHED: + ESP_LOGI(TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id); + print_user_property(event->property->user_property); + break; + case MQTT_EVENT_DATA: + ESP_LOGI(TAG, "MQTT_EVENT_DATA"); + print_user_property(event->property->user_property); + ESP_LOGI(TAG, "payload_format_indicator is %d", event->property->payload_format_indicator); + ESP_LOGI(TAG, "response_topic is %.*s", event->property->response_topic_len, event->property->response_topic); + ESP_LOGI(TAG, "correlation_data is %.*s", event->property->correlation_data_len, event->property->correlation_data); + ESP_LOGI(TAG, "content_type is %.*s", event->property->content_type_len, event->property->content_type); + ESP_LOGI(TAG, "TOPIC=%.*s", event->topic_len, event->topic); + ESP_LOGI(TAG, "DATA=%.*s", event->data_len, event->data); + break; + case MQTT_EVENT_ERROR: + ESP_LOGI(TAG, "MQTT_EVENT_ERROR"); + print_user_property(event->property->user_property); + ESP_LOGI(TAG, "MQTT5 return code is %d", event->error_handle->connect_return_code); + if (event->error_handle->error_type == MQTT_ERROR_TYPE_TCP_TRANSPORT) { + log_error_if_nonzero("reported from esp-tls", event->error_handle->esp_tls_last_esp_err); + log_error_if_nonzero("reported from tls stack", event->error_handle->esp_tls_stack_err); + log_error_if_nonzero("captured as transport's socket errno", event->error_handle->esp_transport_sock_errno); + ESP_LOGI(TAG, "Last errno string (%s)", strerror(event->error_handle->esp_transport_sock_errno)); + } + break; + default: + ESP_LOGI(TAG, "Other event id:%d", event->event_id); + break; + } +} + +static void mqtt5_app_start(void) +{ + esp_mqtt5_connection_property_config_t connect_property = { + .session_expiry_interval = 10, + .maximum_packet_size = 1024, + .receive_maximum = 65535, + .topic_alias_maximum = 2, + .request_resp_info = true, + .request_problem_info = true, + .will_delay_interval = 10, + .payload_format_indicator = true, + .message_expiry_interval = 10, + .response_topic = "/test/response", + .correlation_data = "123456", + .correlation_data_len = 6, + }; + + esp_mqtt_client_config_t mqtt5_cfg = { + .broker.address.uri = CONFIG_BROKER_URL, + .session.protocol_ver = MQTT_PROTOCOL_V_5, + .network.disable_auto_reconnect = true, + .credentials.username = "123", + .credentials.authentication.password = "456", + .session.last_will.topic = "/topic/will", + .session.last_will.msg = "i will leave", + .session.last_will.msg_len = 12, + .session.last_will.qos = 1, + .session.last_will.retain = true, + }; + +#if CONFIG_BROKER_URL_FROM_STDIN + char line[128]; + + if (strcmp(mqtt5_cfg.uri, "FROM_STDIN") == 0) { + int count = 0; + printf("Please enter url of mqtt broker\n"); + while (count < 128) { + int c = fgetc(stdin); + if (c == '\n') { + line[count] = '\0'; + break; + } else if (c > 0 && c < 127) { + line[count] = c; + ++count; + } + vTaskDelay(10 / portTICK_PERIOD_MS); + } + mqtt5_cfg.broker.address.uri = line; + printf("Broker url: %s\n", line); + } else { + ESP_LOGE(TAG, "Configuration mismatch: wrong broker url"); + abort(); + } +#endif /* CONFIG_BROKER_URL_FROM_STDIN */ + + esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt5_cfg); + + /* Set connection properties and user properties */ + esp_mqtt5_client_set_user_property(&connect_property.user_property, user_property_arr, USE_PROPERTY_ARR_SIZE); + esp_mqtt5_client_set_user_property(&connect_property.will_user_property, user_property_arr, USE_PROPERTY_ARR_SIZE); + esp_mqtt5_client_set_connect_property(client, &connect_property); + + /* If you call esp_mqtt5_client_set_user_property to set user properties, DO NOT forget to delete them. + * esp_mqtt5_client_set_connect_property will malloc buffer to store the user_property and you can delete it after + */ + esp_mqtt5_client_delete_user_property(connect_property.user_property); + esp_mqtt5_client_delete_user_property(connect_property.will_user_property); + + /* The last argument may be used to pass data to the event handler, in this example mqtt_event_handler */ + esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt5_event_handler, NULL); + esp_mqtt_client_start(client); +} + +void app_main(void) +{ + + ESP_LOGI(TAG, "[APP] Startup.."); + ESP_LOGI(TAG, "[APP] Free memory: %" PRIu32 " bytes", esp_get_free_heap_size()); + ESP_LOGI(TAG, "[APP] IDF version: %s", esp_get_idf_version()); + + esp_log_level_set("*", ESP_LOG_INFO); + esp_log_level_set("mqtt_client", ESP_LOG_VERBOSE); + esp_log_level_set("mqtt_example", ESP_LOG_VERBOSE); + esp_log_level_set("transport_base", ESP_LOG_VERBOSE); + esp_log_level_set("esp-tls", ESP_LOG_VERBOSE); + esp_log_level_set("transport", ESP_LOG_VERBOSE); + esp_log_level_set("outbox", ESP_LOG_VERBOSE); + + ESP_ERROR_CHECK(nvs_flash_init()); + ESP_ERROR_CHECK(esp_netif_init()); + ESP_ERROR_CHECK(esp_event_loop_create_default()); + + /* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig. + * Read "Establishing Wi-Fi or Ethernet Connection" section in + * examples/protocols/README.md for more information about this function. + */ + ESP_ERROR_CHECK(example_connect()); + + mqtt5_app_start(); +} diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/main/idf_component.yml b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/main/idf_component.yml new file mode 100644 index 000000000..808c17483 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/main/idf_component.yml @@ -0,0 +1,5 @@ +dependencies: + espressif/mqtt: + version: '*' + protocol_examples_common: + path: ${IDF_PATH}/examples/common_components/protocol_examples_common diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/pytest_mqtt5.py b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/pytest_mqtt5.py new file mode 100644 index 000000000..dc7063e95 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/pytest_mqtt5.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python +# +# SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: Apache-2.0 +import logging +import os + +import pytest +from pytest_embedded import Dut +from pytest_embedded_idf.utils import idf_parametrize + + +@pytest.mark.ethernet +@idf_parametrize('target', ['esp32'], indirect=['target']) +def test_examples_protocol_mqtt5(dut: Dut) -> None: + """ + steps: | + 1. join AP + 2. connect to mqtt://mqtt.eclipseprojects.io + 3. check connection success + """ + # check and log bin size + binary_file = os.path.join(dut.app.binary_path, 'mqtt5.bin') + bin_size = os.path.getsize(binary_file) + logging.info('mqtt5_bin_size : {}KB'.format(bin_size // 1024)) + # check if connected or not + dut.expect_exact('MQTT_EVENT_CONNECTED', timeout=30) + # check log + res = dut.expect(r'sent publish successful, msg_id=(\d+)[^\d]') + msgid_pub1 = res.group(1).decode('utf8') + res = dut.expect(r'sent subscribe successful, msg_id=(\d+)[^\d]') + msgid_sub1 = res.group(1).decode('utf8') + res = dut.expect(r'sent subscribe successful, msg_id=(\d+)[^\d]') + msgid_sub2 = res.group(1).decode('utf8') + res = dut.expect(r'sent unsubscribe successful, msg_id=(\d+)[^\d]') + msgid_unsub = res.group(1).decode('utf8') + res = dut.expect(r'MQTT_EVENT_PUBLISHED, msg_id=(\d+)[^\d]') + msgid_pubd = res.group(1).decode('utf8') + assert msgid_pubd == msgid_pub1 + + res = dut.expect(r'MQTT_EVENT_SUBSCRIBED, msg_id=(\d+)[^\d]') + msgid_subd = res.group(1).decode('utf8') + assert msgid_subd == msgid_sub1 + + dut.expect_exact('sent publish successful, msg_id=0') + res = dut.expect(r'MQTT_EVENT_SUBSCRIBED, msg_id=(\d+)[^\d]') + msgid_subd = res.group(1).decode('utf8') + assert msgid_subd == msgid_sub2 + + dut.expect_exact('sent publish successful, msg_id=0') + dut.expect_exact('MQTT_EVENT_DATA') + dut.expect_exact('key is board, value is esp32') + dut.expect_exact('key is u, value is user') + dut.expect_exact('key is p, value is password') + dut.expect_exact('payload_format_indicator is 1') + dut.expect_exact('response_topic is /topic/test/response') + dut.expect_exact('correlation_data is 123456') + dut.expect_exact('TOPIC=/topic/qos1') + dut.expect_exact('DATA=data_3') + res = dut.expect(r'MQTT_EVENT_UNSUBSCRIBED, msg_id=(\d+)[^\d]') + msgid_unsubd = res.group(1).decode('utf8') + assert msgid_unsubd == msgid_unsub + + dut.expect_exact('MQTT_EVENT_DISCONNECTED') + logging.info('MQTT5 pytest pass') diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/sdkconfig.ci b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/sdkconfig.ci new file mode 100644 index 000000000..f4a0a7e40 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/sdkconfig.ci @@ -0,0 +1,10 @@ +CONFIG_EXAMPLE_CONNECT_ETHERNET=y +CONFIG_EXAMPLE_CONNECT_WIFI=n +CONFIG_EXAMPLE_USE_INTERNAL_ETHERNET=y +CONFIG_EXAMPLE_ETH_PHY_IP101=y +CONFIG_EXAMPLE_ETH_MDC_GPIO=23 +CONFIG_EXAMPLE_ETH_MDIO_GPIO=18 +CONFIG_EXAMPLE_ETH_PHY_RST_GPIO=5 +CONFIG_EXAMPLE_ETH_PHY_ADDR=1 +CONFIG_MQTT_PROTOCOL_5=y +CONFIG_BROKER_URL="mqtt://${EXAMPLE_MQTTV5_BROKER_TCP}" diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/sdkconfig.defaults b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/sdkconfig.defaults new file mode 100644 index 000000000..db60a2ab3 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/mqtt5/sdkconfig.defaults @@ -0,0 +1 @@ +CONFIG_MQTT_PROTOCOL_5=y diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/CMakeLists.txt new file mode 100644 index 000000000..e41e1b8e4 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/CMakeLists.txt @@ -0,0 +1,11 @@ +# The following four lines of boilerplate have to be in your project's CMakeLists +# in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +# "Trim" the build. Include the minimal set of components, main, and anything it depends on. +idf_build_set_property(MINIMAL_BUILD ON) +project(mqtt_ssl) + +target_add_binary_data(${PROJECT_NAME}.elf "main/mqtt_eclipseprojects_io.pem" TEXT) diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/README.md b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/README.md new file mode 100644 index 000000000..0407edad9 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/README.md @@ -0,0 +1,70 @@ +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | + +# ESP-MQTT SSL Sample application + +(See the README.md file in the upper level 'examples' directory for more information about examples.) + +This example connects to the broker mqtt.eclipseprojects.io using ssl transport and as a demonstration subscribes/unsubscribes and send a message on certain topic. +(Please note that the public broker is maintained by the community so may not be always available, for details please see this [disclaimer](https://iot.eclipse.org/getting-started/#sandboxes)) + +It uses ESP-MQTT library which implements mqtt client to connect to mqtt broker. + +## How to use example + +### Hardware Required + +This example can be executed on any ESP32 board, the only required interface is WiFi and connection to internet. + +### Configure the project + +* Open the project configuration menu (`idf.py menuconfig`) +* Configure Wi-Fi or Ethernet under "Example Connection Configuration" menu. See "Establishing Wi-Fi or Ethernet Connection" section in [examples/protocols/README.md](../../README.md) for more details. + +PEM certificate for this example could be extracted from an openssl `s_client` command connecting to mqtt.eclipseprojects.io. +In case a host operating system has `openssl` and `sed` packages installed, one could execute the following command to download and save the root certificate to a file (Note for Windows users: Both Linux like environment or Windows native packages may be used). +``` +echo "" | openssl s_client -showcerts -connect mqtt.eclipseprojects.io:8883 | sed -n "1,/Root/d; /BEGIN/,/END/p" | openssl x509 -outform PEM >mqtt_eclipse_org.pem +``` +Please note that this is not a general command for downloading a root certificate for an arbitrary host; +this command works with mqtt.eclipseprojects.io as the site provides root certificate in the chain, which then could be extracted +with text operation. + +### Build and Flash + +Build the project and flash it to the board, then run monitor tool to view serial output: + +``` +idf.py -p PORT flash monitor +``` + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the Getting Started Guide for full steps to configure and use ESP-IDF to build projects. + +## Example Output + +``` +I (3714) event: sta ip: 192.168.0.139, mask: 255.255.255.0, gw: 192.168.0.2 +I (3714) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE +I (3964) MQTT_CLIENT: Sending MQTT CONNECT message, type: 1, id: 0000 +I (4164) MQTTS_EXAMPLE: MQTT_EVENT_CONNECTED +I (4174) MQTTS_EXAMPLE: sent publish successful, msg_id=41464 +I (4174) MQTTS_EXAMPLE: sent subscribe successful, msg_id=17886 +I (4174) MQTTS_EXAMPLE: sent subscribe successful, msg_id=42970 +I (4184) MQTTS_EXAMPLE: sent unsubscribe successful, msg_id=50241 +I (4314) MQTTS_EXAMPLE: MQTT_EVENT_PUBLISHED, msg_id=41464 +I (4484) MQTTS_EXAMPLE: MQTT_EVENT_SUBSCRIBED, msg_id=17886 +I (4484) MQTTS_EXAMPLE: sent publish successful, msg_id=0 +I (4684) MQTTS_EXAMPLE: MQTT_EVENT_SUBSCRIBED, msg_id=42970 +I (4684) MQTTS_EXAMPLE: sent publish successful, msg_id=0 +I (4884) MQTT_CLIENT: deliver_publish, message_length_read=19, message_length=19 +I (4884) MQTTS_EXAMPLE: MQTT_EVENT_DATA +TOPIC=/topic/qos0 +DATA=data +I (5194) MQTT_CLIENT: deliver_publish, message_length_read=19, message_length=19 +I (5194) MQTTS_EXAMPLE: MQTT_EVENT_DATA +TOPIC=/topic/qos0 +DATA=data +``` + diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/main/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/main/CMakeLists.txt new file mode 100644 index 000000000..d6ca62dc1 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/main/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRCS "app_main.c" + PRIV_REQUIRES mqtt esp_partition nvs_flash esp_netif app_update + INCLUDE_DIRS ".") diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/main/Kconfig.projbuild b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/main/Kconfig.projbuild new file mode 100644 index 000000000..5e9357d1a --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/main/Kconfig.projbuild @@ -0,0 +1,26 @@ +menu "Example Configuration" + + config BROKER_URI + string "Broker URL" + default "mqtts://mqtt.eclipseprojects.io:8883" + help + URL of an mqtt broker which this example connects to. + + config BROKER_CERTIFICATE_OVERRIDE + string "Broker certificate override" + default "" + help + Please leave empty if broker certificate included from a textfile; otherwise fill in a base64 part of PEM + format certificate + + config BROKER_CERTIFICATE_OVERRIDDEN + bool + default y if BROKER_CERTIFICATE_OVERRIDE != "" + + config BROKER_BIN_SIZE_TO_SEND + # This option is not visible and is used only to set parameters for example tests + # Here we configure the data size to send and to be expected in the python script + int + default 20000 + +endmenu diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/main/app_main.c b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/main/app_main.c new file mode 100644 index 000000000..ed5e04f1f --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/main/app_main.c @@ -0,0 +1,165 @@ +/* MQTT over SSL Example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +#include +#include +#include +#include +#include "esp_system.h" +#include "esp_partition.h" +#include "nvs_flash.h" +#include "esp_event.h" +#include "esp_netif.h" +#include "protocol_examples_common.h" + +#include "esp_log.h" +#include "mqtt_client.h" +#include "esp_tls.h" +#include "esp_ota_ops.h" +#include + +static const char *TAG = "mqtts_example"; + + +#if CONFIG_BROKER_CERTIFICATE_OVERRIDDEN == 1 +static const uint8_t mqtt_eclipseprojects_io_pem_start[] = "-----BEGIN CERTIFICATE-----\n" CONFIG_BROKER_CERTIFICATE_OVERRIDE "\n-----END CERTIFICATE-----"; +#else +extern const uint8_t mqtt_eclipseprojects_io_pem_start[] asm("_binary_mqtt_eclipseprojects_io_pem_start"); +#endif +extern const uint8_t mqtt_eclipseprojects_io_pem_end[] asm("_binary_mqtt_eclipseprojects_io_pem_end"); + +// +// Note: this function is for testing purposes only publishing part of the active partition +// (to be checked against the original binary) +// +static void send_binary(esp_mqtt_client_handle_t client) +{ + esp_partition_mmap_handle_t out_handle; + const void *binary_address; + const esp_partition_t *partition = esp_ota_get_running_partition(); + esp_partition_mmap(partition, 0, partition->size, ESP_PARTITION_MMAP_DATA, &binary_address, &out_handle); + // sending only the configured portion of the partition (if it's less than the partition size) + int binary_size = MIN(CONFIG_BROKER_BIN_SIZE_TO_SEND, partition->size); + int msg_id = esp_mqtt_client_publish(client, "/topic/binary", binary_address, binary_size, 0, 0); + ESP_LOGI(TAG, "binary sent with msg_id=%d", msg_id); +} + +/* + * @brief Event handler registered to receive MQTT events + * + * This function is called by the MQTT client event loop. + * + * @param handler_args user data registered to the event. + * @param base Event base for the handler(always MQTT Base in this example). + * @param event_id The id for the received event. + * @param event_data The data for the event, esp_mqtt_event_handle_t. + */ +static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) +{ + ESP_LOGD(TAG, "Event dispatched from event loop base=%s, event_id=%" PRIi32, base, event_id); + esp_mqtt_event_handle_t event = event_data; + esp_mqtt_client_handle_t client = event->client; + int msg_id; + switch ((esp_mqtt_event_id_t)event_id) { + case MQTT_EVENT_CONNECTED: + ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED"); + msg_id = esp_mqtt_client_subscribe(client, "/topic/qos0", 0); + ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); + + msg_id = esp_mqtt_client_subscribe(client, "/topic/qos1", 1); + ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); + + msg_id = esp_mqtt_client_unsubscribe(client, "/topic/qos1"); + ESP_LOGI(TAG, "sent unsubscribe successful, msg_id=%d", msg_id); + break; + case MQTT_EVENT_DISCONNECTED: + ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED"); + break; + + case MQTT_EVENT_SUBSCRIBED: + ESP_LOGI(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d, return code=0x%02x ", event->msg_id, (uint8_t)*event->data); + msg_id = esp_mqtt_client_publish(client, "/topic/qos0", "data", 0, 0, 0); + ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id); + break; + case MQTT_EVENT_UNSUBSCRIBED: + ESP_LOGI(TAG, "MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id); + break; + case MQTT_EVENT_PUBLISHED: + ESP_LOGI(TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id); + break; + case MQTT_EVENT_DATA: + ESP_LOGI(TAG, "MQTT_EVENT_DATA"); + printf("TOPIC=%.*s\r\n", event->topic_len, event->topic); + printf("DATA=%.*s\r\n", event->data_len, event->data); + if (strncmp(event->data, "send binary please", event->data_len) == 0) { + ESP_LOGI(TAG, "Sending the binary"); + send_binary(client); + } + break; + case MQTT_EVENT_ERROR: + ESP_LOGI(TAG, "MQTT_EVENT_ERROR"); + if (event->error_handle->error_type == MQTT_ERROR_TYPE_TCP_TRANSPORT) { + ESP_LOGI(TAG, "Last error code reported from esp-tls: 0x%x", event->error_handle->esp_tls_last_esp_err); + ESP_LOGI(TAG, "Last tls stack error number: 0x%x", event->error_handle->esp_tls_stack_err); + ESP_LOGI(TAG, "Last captured errno : %d (%s)", event->error_handle->esp_transport_sock_errno, + strerror(event->error_handle->esp_transport_sock_errno)); + } else if (event->error_handle->error_type == MQTT_ERROR_TYPE_CONNECTION_REFUSED) { + ESP_LOGI(TAG, "Connection refused error: 0x%x", event->error_handle->connect_return_code); + } else { + ESP_LOGW(TAG, "Unknown error type: 0x%x", event->error_handle->error_type); + } + break; + default: + ESP_LOGI(TAG, "Other event id:%d", event->event_id); + break; + } +} + +static void mqtt_app_start(void) +{ + const esp_mqtt_client_config_t mqtt_cfg = { + .broker = { + .address.uri = CONFIG_BROKER_URI, + .verification.certificate = (const char *)mqtt_eclipseprojects_io_pem_start + }, + }; + + ESP_LOGI(TAG, "[APP] Free memory: %" PRIu32 " bytes", esp_get_free_heap_size()); + esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg); + /* The last argument may be used to pass data to the event handler, in this example mqtt_event_handler */ + esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL); + esp_mqtt_client_start(client); +} + +void app_main(void) +{ + ESP_LOGI(TAG, "[APP] Startup.."); + ESP_LOGI(TAG, "[APP] Free memory: %" PRIu32 " bytes", esp_get_free_heap_size()); + ESP_LOGI(TAG, "[APP] IDF version: %s", esp_get_idf_version()); + + esp_log_level_set("*", ESP_LOG_INFO); + esp_log_level_set("esp-tls", ESP_LOG_VERBOSE); + esp_log_level_set("mqtt_client", ESP_LOG_VERBOSE); + esp_log_level_set("mqtt_example", ESP_LOG_VERBOSE); + esp_log_level_set("transport_base", ESP_LOG_VERBOSE); + esp_log_level_set("transport", ESP_LOG_VERBOSE); + esp_log_level_set("outbox", ESP_LOG_VERBOSE); + + ESP_ERROR_CHECK(nvs_flash_init()); + ESP_ERROR_CHECK(esp_netif_init()); + ESP_ERROR_CHECK(esp_event_loop_create_default()); + + /* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig. + * Read "Establishing Wi-Fi or Ethernet Connection" section in + * examples/protocols/README.md for more information about this function. + */ + ESP_ERROR_CHECK(example_connect()); + + mqtt_app_start(); +} diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/main/idf_component.yml b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/main/idf_component.yml new file mode 100644 index 000000000..808c17483 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/main/idf_component.yml @@ -0,0 +1,5 @@ +dependencies: + espressif/mqtt: + version: '*' + protocol_examples_common: + path: ${IDF_PATH}/examples/common_components/protocol_examples_common diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/main/mqtt_eclipseprojects_io.pem b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/main/mqtt_eclipseprojects_io.pem new file mode 100644 index 000000000..43b222a60 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/main/mqtt_eclipseprojects_io.pem @@ -0,0 +1,30 @@ +-----BEGIN CERTIFICATE----- +MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjAwOTA0MDAwMDAw +WhcNMjUwOTE1MTYwMDAwWjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg +RW5jcnlwdDELMAkGA1UEAxMCUjMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC7AhUozPaglNMPEuyNVZLD+ILxmaZ6QoinXSaqtSu5xUyxr45r+XXIo9cP +R5QUVTVXjJ6oojkZ9YI8QqlObvU7wy7bjcCwXPNZOOftz2nwWgsbvsCUJCWH+jdx +sxPnHKzhm+/b5DtFUkWWqcFTzjTIUu61ru2P3mBw4qVUq7ZtDpelQDRrK9O8Zutm +NHz6a4uPVymZ+DAXXbpyb/uBxa3Shlg9F8fnCbvxK/eG3MHacV3URuPMrSXBiLxg +Z3Vms/EY96Jc5lP/Ooi2R6X/ExjqmAl3P51T+c8B5fWmcBcUr2Ok/5mzk53cU6cG +/kiFHaFpriV1uxPMUgP17VGhi9sVAgMBAAGjggEIMIIBBDAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYB +Af8CAQAwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYfr52LFMLGMB8GA1UdIwQYMBaA +FHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcw +AoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzAnBgNVHR8EIDAeMBygGqAYhhZodHRw +Oi8veDEuYy5sZW5jci5vcmcvMCIGA1UdIAQbMBkwCAYGZ4EMAQIBMA0GCysGAQQB +gt8TAQEBMA0GCSqGSIb3DQEBCwUAA4ICAQCFyk5HPqP3hUSFvNVneLKYY611TR6W +PTNlclQtgaDqw+34IL9fzLdwALduO/ZelN7kIJ+m74uyA+eitRY8kc607TkC53wl +ikfmZW4/RvTZ8M6UK+5UzhK8jCdLuMGYL6KvzXGRSgi3yLgjewQtCPkIVz6D2QQz +CkcheAmCJ8MqyJu5zlzyZMjAvnnAT45tRAxekrsu94sQ4egdRCnbWSDtY7kh+BIm +lJNXoB1lBMEKIq4QDUOXoRgffuDghje1WrG9ML+Hbisq/yFOGwXD9RiX8F6sw6W4 +avAuvDszue5L3sz85K+EC4Y/wFVDNvZo4TYXao6Z0f+lQKc0t8DQYzk1OXVu8rp2 +yJMC6alLbBfODALZvYH7n7do1AZls4I9d1P4jnkDrQoxB3UqQ9hVl3LEKQ73xF1O +yK5GhDDX8oVfGKF5u+decIsH4YaTw7mP3GFxJSqv3+0lUFJoi5Lc5da149p90Ids +hCExroL1+7mryIkXPeFM5TgO9r0rvZaBFOvV2z0gp35Z0+L4WPlbuEjN/lxPFin+ +HlUjr8gRsI3qfJOQFy/9rKIJR0Y/8Omwt/8oTWgy1mdeHmmjk7j1nYsvC9JSQ6Zv +MldlTTKB3zhThV1+XWYp6rjd5JW1zbVWEkLNxE7GJThEUG3szgBVGP7pSWTUTsqX +nLRbwHOoq7hHwg== +-----END CERTIFICATE----- diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/pytest_mqtt_ssl.py b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/pytest_mqtt_ssl.py new file mode 100644 index 000000000..c34cea6e5 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/pytest_mqtt_ssl.py @@ -0,0 +1,135 @@ +# SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: Unlicense OR CC0-1.0 +import logging +import os +import re +import ssl +import sys +from threading import Event +from threading import Thread + +import paho.mqtt.client as mqtt +import pexpect +import pytest +from pytest_embedded import Dut +from pytest_embedded_idf.utils import idf_parametrize + +event_client_connected = Event() +event_stop_client = Event() +event_client_received_correct = Event() +event_client_received_binary = Event() +message_log = '' + + +# The callback for when the client receives a CONNACK response from the server. +def on_connect(client, userdata, flags, rc): # type: (mqtt.Client, str, bool, str) -> None + _ = (userdata, flags) + print('Connected with result code ' + str(rc)) + event_client_connected.set() + client.subscribe('/topic/qos0') + + +def mqtt_client_task(client): # type: (mqtt.Client) -> None + while not event_stop_client.is_set(): + client.loop() + + +# The callback for when a PUBLISH message is received from the server. +def on_message(client, userdata, msg): # type: (mqtt.Client, tuple, mqtt.client.MQTTMessage) -> None + global message_log + global event_client_received_correct + global event_client_received_binary + if msg.topic == '/topic/binary': + binary, bin_size = userdata + print('Receiving binary from esp and comparing with {}, size {}...'.format(binary, bin_size)) + with open(binary, 'rb') as f: + bin = f.read() + if bin[:bin_size] == msg.payload[:bin_size]: + print('...matches!') + event_client_received_binary.set() + return + recv_binary = binary + '.received' + with open(recv_binary, 'w', encoding='utf-8') as fw: + fw.write(msg.payload) + raise ValueError( + 'Received binary (saved as: {}) does not match the original file: {}'.format(recv_binary, binary) + ) + + payload = msg.payload.decode() + if not event_client_received_correct.is_set() and payload == 'data': + client.subscribe('/topic/binary') + client.publish('/topic/qos0', 'send binary please') + if msg.topic == '/topic/qos0' and payload == 'data': + event_client_received_correct.set() + message_log += 'Received data:' + msg.topic + ' ' + payload + '\n' + + +@pytest.mark.ethernet +@idf_parametrize('target', ['esp32'], indirect=['target']) +def test_examples_protocol_mqtt_ssl(dut): # type: (Dut) -> None + broker_url = '' + broker_port = 0 + """ + steps: + 1. join AP and connects to ssl broker + 2. Test connects a client to the same broker + 3. Test evaluates python client received correct qos0 message + 4. Test ESP32 client received correct qos0 message + 5. Test python client receives binary data from running partition and compares it with the binary + """ + binary_file = os.path.join(dut.app.binary_path, 'mqtt_ssl.bin') + bin_size = os.path.getsize(binary_file) + logging.info('[Performance][mqtt_ssl_bin_size]: %s KB', bin_size // 1024) + + # Look for host:port in sdkconfig + try: + value = re.search(r'\:\/\/([^:]+)\:([0-9]+)', dut.app.sdkconfig.get('BROKER_URI')) + assert value is not None + broker_url = value.group(1) + broker_port = int(value.group(2)) + bin_size = min(int(dut.app.sdkconfig.get('BROKER_BIN_SIZE_TO_SEND')), bin_size) + except Exception: + print('ENV_TEST_FAILURE: Cannot find broker url in sdkconfig') + raise + client = None + # 1. Test connects to a broker + try: + client = mqtt.Client() + client.on_connect = on_connect + client.on_message = on_message + client.user_data_set((binary_file, bin_size)) + client.tls_set(None, None, None, cert_reqs=ssl.CERT_NONE, tls_version=ssl.PROTOCOL_TLSv1_2, ciphers=None) + client.tls_insecure_set(True) + print('Connecting...') + client.connect(broker_url, broker_port, 60) + except Exception: + print( + 'ENV_TEST_FAILURE: Unexpected error while connecting to broker {}: {}:'.format( + broker_url, sys.exc_info()[0] + ) + ) + raise + # Starting a py-client in a separate thread + thread1 = Thread(target=mqtt_client_task, args=(client,)) + thread1.start() + try: + print('Connecting py-client to broker {}:{}...'.format(broker_url, broker_port)) + if not event_client_connected.wait(timeout=30): + raise ValueError('ENV_TEST_FAILURE: Test script cannot connect to broker: {}'.format(broker_url)) + try: + ip_address = dut.expect(r'IPv4 address: (\d+\.\d+\.\d+\.\d+)[^\d]', timeout=30)[0] + print('Connected to AP with IP: {}'.format(ip_address)) + except pexpect.TIMEOUT: + print('ENV_TEST_FAILURE: Cannot connect to AP') + raise + print('Checking py-client received msg published from esp...') + if not event_client_received_correct.wait(timeout=30): + raise ValueError('Wrong data received, msg log: {}'.format(message_log)) + print('Checking esp-client received msg published from py-client...') + dut.expect(r'DATA=send binary please', timeout=30) + print('Receiving binary data from running partition...') + if not event_client_received_binary.wait(timeout=30): + raise ValueError('Binary not received within timeout') + finally: + event_stop_client.set() + thread1.join() diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/sdkconfig.ci b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/sdkconfig.ci new file mode 100644 index 000000000..e8d4a52f6 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl/sdkconfig.ci @@ -0,0 +1,22 @@ +CONFIG_BROKER_URI="mqtts://${EXAMPLE_MQTT_BROKER_SSL}" +CONFIG_BROKER_CERTIFICATE_OVERRIDE="${EXAMPLE_MQTT_BROKER_CERTIFICATE}" +CONFIG_MQTT_USE_CUSTOM_CONFIG=y +CONFIG_MQTT_TCP_DEFAULT_PORT=1883 +CONFIG_MQTT_SSL_DEFAULT_PORT=8883 +CONFIG_MQTT_WS_DEFAULT_PORT=80 +CONFIG_MQTT_WSS_DEFAULT_PORT=443 +CONFIG_MQTT_BUFFER_SIZE=16384 +CONFIG_MQTT_TASK_STACK_SIZE=6144 +CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y +CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384 +CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096 +CONFIG_EXAMPLE_CONNECT_ETHERNET=y +CONFIG_EXAMPLE_CONNECT_WIFI=n +CONFIG_EXAMPLE_USE_INTERNAL_ETHERNET=y +CONFIG_EXAMPLE_ETH_PHY_IP101=y +CONFIG_EXAMPLE_ETH_MDC_GPIO=23 +CONFIG_EXAMPLE_ETH_MDIO_GPIO=18 +CONFIG_EXAMPLE_ETH_PHY_RST_GPIO=5 +CONFIG_EXAMPLE_ETH_PHY_ADDR=1 +CONFIG_EXAMPLE_CONNECT_IPV6=y +CONFIG_LWIP_CHECK_THREAD_SAFETY=y diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/CMakeLists.txt new file mode 100644 index 000000000..acf7743cb --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/CMakeLists.txt @@ -0,0 +1,18 @@ +# The following four lines of boilerplate have to be in your project's CMakeLists +# in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +# "Trim" the build. Include the minimal set of components, main, and anything it depends on. +idf_build_set_property(MINIMAL_BUILD ON) +project(mqtt_ssl_ds) + +# Flash the custom partition named `esp_secure_cert`. +set(partition esp_secure_cert) +idf_build_get_property(project_dir PROJECT_DIR) +set(image_file ${project_dir}/esp_secure_cert_data/${partition}.bin) +partition_table_get_partition_info(offset "--partition-name ${partition}" "offset") +esptool_py_flash_target_image(flash "${partition}" "${offset}" "${image_file}") + +target_add_binary_data(${CMAKE_PROJECT_NAME}.elf "main/mosquitto.org.crt" TEXT) diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/README.md b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/README.md new file mode 100644 index 000000000..f89d1726e --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/README.md @@ -0,0 +1,105 @@ +| Supported Targets | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | + +# ESP-MQTT SSL Mutual Authentication with Digital Signature +(See the README.md file in the upper level 'examples' directory for more information about examples.) + +Espressif's ESP32-S2, ESP32-S3, ESP32-C3, ESP32-C6, ESP32-H2 and ESP32-P4 MCU have a built-in Digital Signature (DS) Peripheral, which provides hardware acceleration for RSA signature. More details can be found at [Digital Signature with ESP-TLS](https://docs.espressif.com/projects/esp-idf/en/latest/esp32s2/api-reference/protocols/esp_tls.html#digital-signature-with-esp-tls). + +This example connects to the broker test.mosquitto.org using ssl transport with client certificate(RSA) and as a demonstration subscribes/unsubscribes and sends a message on certain topic.The RSA signature operation required in the ssl connection is performed with help of the Digital Signature (DS) peripheral. +(Please note that the public broker is maintained by the community so may not be always available, for details please visit http://test.mosquitto.org) + +It uses ESP-MQTT library which implements mqtt client to connect to mqtt broker. +## How to use example + +### Hardware Required + +This example can be executed on any of the supported ESP32 family board (which has a built-in DS peripheral), the only required interface is WiFi/Ethernet and connection to internet. + +### Configure the project + +#### 1) Selecting the target + +Please select the supported target with the following command: +``` +idf.py set-target /* target */ +``` +More details can be found at [Selecting the target](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html#selecting-the-target). + +#### 2) Generate your client key and certificate + +Navigate to the main directory + +``` +cd main +``` + +Generate a client key and a CSR. When you are generating the CSR, do not use the default values. At a minimum, the CSR must include the Country, Organisation and Common Name fields. + +``` +openssl genrsa -out client.key +openssl req -out client.csr -key client.key -new +``` + +Paste the generated CSR in the [Mosquitto test certificate signer](https://test.mosquitto.org/ssl/index.php), click Submit and downloaded the `client.crt`. This `client.crt` file shall be used as the device certificate. + +#### 3) Configure the DS peripheral + +* i) Install the [esp_secure_cert configuration utility](https://github.com/espressif/esp_secure_cert_mgr/tree/main/tools#esp_secure_cert-configuration-tool) with following command: +``` +pip install esp-secure-cert-tool +``` +* ii) The DS peripheral can be configured by executing the following command: + +``` +configure_esp_secure_cert.py -p /* Serial port */ --device-cert /* Device cert */ --private-key /* RSA priv key */ --target_chip /* target chip */ --configure_ds --skip_flash +``` +This command shall generate a partition named `esp_secure_cert.bin` in the `esp_secure_cert_data` directory. This partition would be aumatically detected by the build system and flashed at appropriate offset when `idf.py flash` command is used. For this process, the command must be executed in the current folder only. + +In the command USB COM port is nothing but the serial port to which the ESP chip is connected. see +[check serial port](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/establish-serial-connection.html#check-port-on-windows) for more details. +RSA private key is nothing but the client private key ( RSA ) generated in Step 2. + +> Note: More details about the `esp-secure-cert-tool` utility can be found [here](https://github.com/espressif/esp_secure_cert_mgr/tree/main/tools). + +#### 4) Connection configuration +* Open the project configuration menu (`idf.py menuconfig`) +* Configure Wi-Fi or Ethernet under "Example Connection Configuration" menu. See "Establishing Wi-Fi or Ethernet Connection" section in [examples/protocols/README.md](../../README.md) for more details. + +### Build and Flash + +Build the project and flash it to the board, then run monitor tool to view serial output: + +``` +idf.py -p PORT flash monitor +``` + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the Getting Started Guide for full steps to configure and use ESP-IDF to build projects. + +## Example Output + +``` +I (3714) event: sta ip: 192.168.0.139, mask: 255.255.255.0, gw: 192.168.0.2 +I (3714) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE +I (3964) MQTT_CLIENT: Sending MQTT CONNECT message, type: 1, id: 0000 +I (4164) MQTTS_EXAMPLE: MQTT_EVENT_CONNECTED +I (4174) MQTTS_EXAMPLE: sent publish successful, msg_id=41464 +I (4174) MQTTS_EXAMPLE: sent subscribe successful, msg_id=17886 +I (4174) MQTTS_EXAMPLE: sent subscribe successful, msg_id=42970 +I (4184) MQTTS_EXAMPLE: sent unsubscribe successful, msg_id=50241 +I (4314) MQTTS_EXAMPLE: MQTT_EVENT_PUBLISHED, msg_id=41464 +I (4484) MQTTS_EXAMPLE: MQTT_EVENT_SUBSCRIBED, msg_id=17886 +I (4484) MQTTS_EXAMPLE: sent publish successful, msg_id=0 +I (4684) MQTTS_EXAMPLE: MQTT_EVENT_SUBSCRIBED, msg_id=42970 +I (4684) MQTTS_EXAMPLE: sent publish successful, msg_id=0 +I (4884) MQTT_CLIENT: deliver_publish, message_length_read=19, message_length=19 +I (4884) MQTTS_EXAMPLE: MQTT_EVENT_DATA +TOPIC=/topic/qos0 +DATA=data +I (5194) MQTT_CLIENT: deliver_publish, message_length_read=19, message_length=19 +I (5194) MQTTS_EXAMPLE: MQTT_EVENT_DATA +TOPIC=/topic/qos0 +DATA=data +``` diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/main/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/main/CMakeLists.txt new file mode 100644 index 000000000..055d4c563 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/main/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRCS "app_main.c" + PRIV_REQUIRES mqtt esp_netif + INCLUDE_DIRS ".") diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/main/app_main.c b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/main/app_main.c new file mode 100644 index 000000000..7b54cfbf8 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/main/app_main.c @@ -0,0 +1,156 @@ +/* MQTT Mutual Authentication Example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ +#include +#include +#include +#include +#include "esp_system.h" +#include "nvs_flash.h" +#include "esp_event.h" +#include "esp_netif.h" +#include "protocol_examples_common.h" + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#include "freertos/queue.h" + +#include "lwip/sockets.h" +#include "lwip/dns.h" +#include "lwip/netdb.h" + +#include "esp_log.h" +#include "mqtt_client.h" +#include "rsa_sign_alt.h" +#include "esp_secure_cert_read.h" + +static const char *TAG = "mqtts_example"; + +extern const uint8_t server_cert_pem_start[] asm("_binary_mosquitto_org_crt_start"); +extern const uint8_t server_cert_pem_end[] asm("_binary_mosquitto_org_crt_end"); + +/* + * @brief Event handler registered to receive MQTT events + * + * This function is called by the MQTT client event loop. + * + * @param handler_args user data registered to the event. + * @param base Event base for the handler(always MQTT Base in this example). + * @param event_id The id for the received event. + * @param event_data The data for the event, esp_mqtt_event_handle_t. + */ +static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) +{ + ESP_LOGD(TAG, "Event dispatched from event loop base=%s, event_id=%" PRIi32, base, event_id); + esp_mqtt_event_handle_t event = event_data; + esp_mqtt_client_handle_t client = event->client; + int msg_id; + // your_context_t *context = event->context; + switch ((esp_mqtt_event_id_t)event_id) { + case MQTT_EVENT_CONNECTED: + ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED"); + msg_id = esp_mqtt_client_subscribe(client, "/topic/qos0", 0); + ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); + + msg_id = esp_mqtt_client_subscribe(client, "/topic/qos1", 1); + ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); + + msg_id = esp_mqtt_client_unsubscribe(client, "/topic/qos1"); + ESP_LOGI(TAG, "sent unsubscribe successful, msg_id=%d", msg_id); + break; + case MQTT_EVENT_DISCONNECTED: + ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED"); + break; + + case MQTT_EVENT_SUBSCRIBED: + ESP_LOGI(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d, return code=0x%02x ", event->msg_id, (uint8_t)*event->data); + msg_id = esp_mqtt_client_publish(client, "/topic/qos0", "data", 0, 0, 0); + ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id); + break; + case MQTT_EVENT_UNSUBSCRIBED: + ESP_LOGI(TAG, "MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id); + break; + case MQTT_EVENT_PUBLISHED: + ESP_LOGI(TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id); + break; + case MQTT_EVENT_DATA: + ESP_LOGI(TAG, "MQTT_EVENT_DATA"); + printf("TOPIC=%.*s\r\n", event->topic_len, event->topic); + printf("DATA=%.*s\r\n", event->data_len, event->data); + break; + case MQTT_EVENT_ERROR: + ESP_LOGI(TAG, "MQTT_EVENT_ERROR"); + break; + default: + ESP_LOGI(TAG, "Other event id:%d", event->event_id); + break; + } +} + +static void mqtt_app_start(void) +{ + /* The context is used by the DS peripheral, should not be freed */ + esp_ds_data_ctx_t *ds_data = esp_secure_cert_get_ds_ctx(); + if (ds_data == NULL) { + ESP_LOGE(TAG, "Error in reading DS data from NVS"); + vTaskDelete(NULL); + } + char *device_cert = NULL; + esp_err_t ret; + uint32_t len; + ret = esp_secure_cert_get_device_cert(&device_cert, &len); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "Failed to obtain the device certificate"); + vTaskDelete(NULL); + } + + const esp_mqtt_client_config_t mqtt_cfg = { + .broker = { + .address.uri = "mqtts://test.mosquitto.org:8884", + .verification.certificate = (const char *)server_cert_pem_start, + }, + .credentials = { + .authentication = { + .certificate = (const char *)device_cert, + .key = NULL, + .ds_data = (void *)ds_data + }, + }, + }; + + ESP_LOGI(TAG, "[APP] Free memory: %" PRIu32 " bytes", esp_get_free_heap_size()); + esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg); + esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL); + esp_mqtt_client_start(client); +} + +void app_main(void) +{ + ESP_LOGI(TAG, "[APP] Startup.."); + ESP_LOGI(TAG, "[APP] Free memory: %" PRIu32 " bytes", esp_get_free_heap_size()); + ESP_LOGI(TAG, "[APP] IDF version: %s", esp_get_idf_version()); + + esp_log_level_set("*", ESP_LOG_INFO); + esp_log_level_set("mqtt_client", ESP_LOG_VERBOSE); + esp_log_level_set("transport_base", ESP_LOG_VERBOSE); + esp_log_level_set("transport", ESP_LOG_VERBOSE); + esp_log_level_set("outbox", ESP_LOG_VERBOSE); + + ESP_ERROR_CHECK(nvs_flash_init()); + ESP_ERROR_CHECK(esp_netif_init()); + ESP_ERROR_CHECK(esp_event_loop_create_default()); + + /* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig. + * Read "Establishing Wi-Fi or Ethernet Connection" section in + * examples/protocols/README.md for more information about this function. + */ + ESP_ERROR_CHECK(example_connect()); + + mqtt_app_start(); +} diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/main/idf_component.yml b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/main/idf_component.yml new file mode 100644 index 000000000..1a3b32d7e --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/main/idf_component.yml @@ -0,0 +1,6 @@ +dependencies: + espressif/esp_secure_cert_mgr: ^2.0.2 + espressif/mqtt: + version: '*' + protocol_examples_common: + path: ${IDF_PATH}/examples/common_components/protocol_examples_common diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/main/mosquitto.org.crt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/main/mosquitto.org.crt new file mode 100644 index 000000000..8a3d44f57 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/main/mosquitto.org.crt @@ -0,0 +1,25 @@ +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIUBY1hlCGvdj4NhBXkZ/uLUZNILAwwDQYJKoZIhvcNAQEL +BQAwgZAxCzAJBgNVBAYTAkdCMRcwFQYDVQQIDA5Vbml0ZWQgS2luZ2RvbTEOMAwG +A1UEBwwFRGVyYnkxEjAQBgNVBAoMCU1vc3F1aXR0bzELMAkGA1UECwwCQ0ExFjAU +BgNVBAMMDW1vc3F1aXR0by5vcmcxHzAdBgkqhkiG9w0BCQEWEHJvZ2VyQGF0Y2hv +by5vcmcwHhcNMjAwNjA5MTEwNjM5WhcNMzAwNjA3MTEwNjM5WjCBkDELMAkGA1UE +BhMCR0IxFzAVBgNVBAgMDlVuaXRlZCBLaW5nZG9tMQ4wDAYDVQQHDAVEZXJieTES +MBAGA1UECgwJTW9zcXVpdHRvMQswCQYDVQQLDAJDQTEWMBQGA1UEAwwNbW9zcXVp +dHRvLm9yZzEfMB0GCSqGSIb3DQEJARYQcm9nZXJAYXRjaG9vLm9yZzCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAME0HKmIzfTOwkKLT3THHe+ObdizamPg +UZmD64Tf3zJdNeYGYn4CEXbyP6fy3tWc8S2boW6dzrH8SdFf9uo320GJA9B7U1FW +Te3xda/Lm3JFfaHjkWw7jBwcauQZjpGINHapHRlpiCZsquAthOgxW9SgDgYlGzEA +s06pkEFiMw+qDfLo/sxFKB6vQlFekMeCymjLCbNwPJyqyhFmPWwio/PDMruBTzPH +3cioBnrJWKXc3OjXdLGFJOfj7pP0j/dr2LH72eSvv3PQQFl90CZPFhrCUcRHSSxo +E6yjGOdnz7f6PveLIB574kQORwt8ePn0yidrTC1ictikED3nHYhMUOUCAwEAAaNT +MFEwHQYDVR0OBBYEFPVV6xBUFPiGKDyo5V3+Hbh4N9YSMB8GA1UdIwQYMBaAFPVV +6xBUFPiGKDyo5V3+Hbh4N9YSMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBAGa9kS21N70ThM6/Hj9D7mbVxKLBjVWe2TPsGfbl3rEDfZ+OKRZ2j6AC +6r7jb4TZO3dzF2p6dgbrlU71Y/4K0TdzIjRj3cQ3KSm41JvUQ0hZ/c04iGDg/xWf ++pp58nfPAYwuerruPNWmlStWAXf0UTqRtg4hQDWBuUFDJTuWuuBvEXudz74eh/wK +sMwfu1HFvjy5Z0iMDU8PUDepjVolOCue9ashlS4EB5IECdSR2TItnAIiIwimx839 +LdUdRudafMu5T5Xma182OC0/u/xRlEm+tvKGGmfFcN0piqVl8OrSPBgIlb+1IKJE +m/XriWr/Cq4h/JfB7NTsezVslgkBaoU= +-----END CERTIFICATE----- +--- diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/partitions.csv b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/partitions.csv new file mode 100644 index 000000000..1423949dc --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/partitions.csv @@ -0,0 +1,6 @@ +# ESP-IDF Partition Table +# Name, Type, SubType, Offset, Size, Flags +esp_secure_cert,0x3F,,,0x2000, +nvs,data,nvs,,24K, +phy_init,data,phy,,4K, +factory,app,factory,0x20000,1500K, diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/sdkconfig.defaults b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/sdkconfig.defaults new file mode 100644 index 000000000..94e282f1d --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/sdkconfig.defaults @@ -0,0 +1,7 @@ +CONFIG_PARTITION_TABLE_CUSTOM=y +# Setting partition table offset to 0xC000 would make the address of +# `esp_secure_cert` partition as 0xD000 (comes next in the sequence). +# Modules that are programmed with Espressif Secure Pre Provisioining service +# uses this offset for `esp_secure_cert` and hence this change aligns this example +# to work on those modules. +CONFIG_PARTITION_TABLE_OFFSET=0xC000 diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/sdkconfig.defaults.esp32h2 b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/sdkconfig.defaults.esp32h2 new file mode 100644 index 000000000..dcbc3a5a7 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_ds/sdkconfig.defaults.esp32h2 @@ -0,0 +1,2 @@ +CONFIG_EXAMPLE_CONNECT_WIFI=n +CONFIG_EXAMPLE_CONNECT_ETHERNET=y diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/CMakeLists.txt new file mode 100644 index 000000000..67ec43b37 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/CMakeLists.txt @@ -0,0 +1,13 @@ +# The following four lines of boilerplate have to be in your project's CMakeLists +# in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +# "Trim" the build. Include the minimal set of components, main, and anything it depends on. +idf_build_set_property(MINIMAL_BUILD ON) +project(mqtt_ssl_mutual_auth) + +target_add_binary_data(${CMAKE_PROJECT_NAME}.elf "main/client.crt" TEXT) +target_add_binary_data(${CMAKE_PROJECT_NAME}.elf "main/client.key" TEXT) +target_add_binary_data(${CMAKE_PROJECT_NAME}.elf "main/mosquitto.org.crt" TEXT) diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/README.md b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/README.md new file mode 100644 index 000000000..4750ff1ff --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/README.md @@ -0,0 +1,82 @@ +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | + +# ESP-MQTT SSL Sample application (mutual authentication) + +(See the README.md file in the upper level 'examples' directory for more information about examples.) + +This example connects to the broker test.mosquitto.org using ssl transport with client certificate and as a demonstration subscribes/unsubscribes and send a message on certain topic. +(Please note that the public broker is maintained by the community so may not be always available, for details please visit http://test.mosquitto.org) + +It uses ESP-MQTT library which implements mqtt client to connect to mqtt broker. + +## How to use example + +### Hardware Required + +This example can be executed on any ESP32 board, the only required interface is WiFi and connection to internet. + +### Configure the project + +* Open the project configuration menu (`idf.py menuconfig`) +* Configure Wi-Fi or Ethernet under "Example Connection Configuration" menu. See "Establishing Wi-Fi or Ethernet Connection" section in [examples/protocols/README.md](../../README.md) for more details. + +* Generate your client keys and certificate + +Navigate to the main directory + +``` +cd main +``` + +Generate a client key and a CSR. When you are generating the CSR, do not use the default values. At a minimum, the CSR must include the Country, Organisation and Common Name fields. + +``` +openssl genrsa -out client.key +openssl req -out client.csr -key client.key -new +``` + +Paste the generated CSR in the [Mosquitto test certificate signer](https://test.mosquitto.org/ssl/index.php), click Submit and copy the downloaded `client.crt` in the `main` directory. + +Please note, that the supplied files `client.crt` and `client.key` in the `main` directory are only placeholders for your client certificate and key (i.e. the example "as is" would compile but would not connect to the broker) + +The server certificate `mosquitto.org.crt` can be downloaded in pem format from [mosquitto.org.crt](https://test.mosquitto.org/ssl/mosquitto.org.crt). + +### Build and Flash + +Build the project and flash it to the board, then run monitor tool to view serial output: + +``` +idf.py -p PORT flash monitor +``` + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the Getting Started Guide for full steps to configure and use ESP-IDF to build projects. + +## Example Output + +``` +I (3714) event: sta ip: 192.168.0.139, mask: 255.255.255.0, gw: 192.168.0.2 +I (3714) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE +I (3964) MQTT_CLIENT: Sending MQTT CONNECT message, type: 1, id: 0000 +I (4164) MQTTS_EXAMPLE: MQTT_EVENT_CONNECTED +I (4174) MQTTS_EXAMPLE: sent publish successful, msg_id=41464 +I (4174) MQTTS_EXAMPLE: sent subscribe successful, msg_id=17886 +I (4174) MQTTS_EXAMPLE: sent subscribe successful, msg_id=42970 +I (4184) MQTTS_EXAMPLE: sent unsubscribe successful, msg_id=50241 +I (4314) MQTTS_EXAMPLE: MQTT_EVENT_PUBLISHED, msg_id=41464 +I (4484) MQTTS_EXAMPLE: MQTT_EVENT_SUBSCRIBED, msg_id=17886 +I (4484) MQTTS_EXAMPLE: sent publish successful, msg_id=0 +I (4684) MQTTS_EXAMPLE: MQTT_EVENT_SUBSCRIBED, msg_id=42970 +I (4684) MQTTS_EXAMPLE: sent publish successful, msg_id=0 +I (4884) MQTT_CLIENT: deliver_publish, message_length_read=19, message_length=19 +I (4884) MQTTS_EXAMPLE: MQTT_EVENT_DATA +TOPIC=/topic/qos0 +DATA=data +I (5194) MQTT_CLIENT: deliver_publish, message_length_read=19, message_length=19 +I (5194) MQTTS_EXAMPLE: MQTT_EVENT_DATA +TOPIC=/topic/qos0 +DATA=data +``` + diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/main/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/main/CMakeLists.txt new file mode 100644 index 000000000..31650f39d --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/main/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRCS "app_main.c" + PRIV_REQUIRES mqtt esp_wifi nvs_flash + INCLUDE_DIRS ".") diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/main/app_main.c b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/main/app_main.c new file mode 100644 index 000000000..90ba71c51 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/main/app_main.c @@ -0,0 +1,155 @@ +/* MQTT Mutual Authentication Example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ +#include +#include +#include +#include +#include "esp_wifi.h" +#include "esp_system.h" +#include "nvs_flash.h" +#include "esp_event.h" +#include "esp_netif.h" +#include "protocol_examples_common.h" + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#include "freertos/queue.h" + +#include "lwip/sockets.h" +#include "lwip/dns.h" +#include "lwip/netdb.h" + +#include "esp_log.h" +#include "mqtt_client.h" + +static const char *TAG = "mqtts_example"; + +extern const uint8_t client_cert_pem_start[] asm("_binary_client_crt_start"); +extern const uint8_t client_cert_pem_end[] asm("_binary_client_crt_end"); +extern const uint8_t client_key_pem_start[] asm("_binary_client_key_start"); +extern const uint8_t client_key_pem_end[] asm("_binary_client_key_end"); +extern const uint8_t server_cert_pem_start[] asm("_binary_mosquitto_org_crt_start"); +extern const uint8_t server_cert_pem_end[] asm("_binary_mosquitto_org_crt_end"); + +static void log_error_if_nonzero(const char *message, int error_code) +{ + if (error_code != 0) { + ESP_LOGE(TAG, "Last error %s: 0x%x", message, error_code); + } +} + +/* + * @brief Event handler registered to receive MQTT events + * + * This function is called by the MQTT client event loop. + * + * @param handler_args user data registered to the event. + * @param base Event base for the handler(always MQTT Base in this example). + * @param event_id The id for the received event. + * @param event_data The data for the event, esp_mqtt_event_handle_t. + */ +static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) +{ + ESP_LOGD(TAG, "Event dispatched from event loop base=%s, event_id=%" PRIi32, base, event_id); + esp_mqtt_event_handle_t event = event_data; + esp_mqtt_client_handle_t client = event->client; + int msg_id; + switch ((esp_mqtt_event_id_t)event_id) { + case MQTT_EVENT_CONNECTED: + ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED"); + msg_id = esp_mqtt_client_subscribe(client, "/topic/qos0", 0); + ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); + + msg_id = esp_mqtt_client_subscribe(client, "/topic/qos1", 1); + ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); + + msg_id = esp_mqtt_client_unsubscribe(client, "/topic/qos1"); + ESP_LOGI(TAG, "sent unsubscribe successful, msg_id=%d", msg_id); + break; + case MQTT_EVENT_DISCONNECTED: + ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED"); + break; + + case MQTT_EVENT_SUBSCRIBED: + ESP_LOGI(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d, return code=0x%02x ", event->msg_id, (uint8_t)*event->data); + msg_id = esp_mqtt_client_publish(client, "/topic/qos0", "data", 0, 0, 0); + ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id); + break; + case MQTT_EVENT_UNSUBSCRIBED: + ESP_LOGI(TAG, "MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id); + break; + case MQTT_EVENT_PUBLISHED: + ESP_LOGI(TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id); + break; + case MQTT_EVENT_DATA: + ESP_LOGI(TAG, "MQTT_EVENT_DATA"); + printf("TOPIC=%.*s\r\n", event->topic_len, event->topic); + printf("DATA=%.*s\r\n", event->data_len, event->data); + break; + case MQTT_EVENT_ERROR: + ESP_LOGI(TAG, "MQTT_EVENT_ERROR"); + if (event->error_handle->error_type == MQTT_ERROR_TYPE_TCP_TRANSPORT) { + log_error_if_nonzero("reported from esp-tls", event->error_handle->esp_tls_last_esp_err); + log_error_if_nonzero("reported from tls stack", event->error_handle->esp_tls_stack_err); + log_error_if_nonzero("captured as transport's socket errno", event->error_handle->esp_transport_sock_errno); + ESP_LOGI(TAG, "Last errno string (%s)", strerror(event->error_handle->esp_transport_sock_errno)); + + } + break; + default: + ESP_LOGI(TAG, "Other event id:%d", event->event_id); + break; + } +} + +static void mqtt_app_start(void) +{ + const esp_mqtt_client_config_t mqtt_cfg = { + .broker.address.uri = "mqtts://test.mosquitto.org:8884", + .broker.verification.certificate = (const char *)server_cert_pem_start, + .credentials = { + .authentication = { + .certificate = (const char *)client_cert_pem_start, + .key = (const char *)client_key_pem_start, + }, + } + }; + + ESP_LOGI(TAG, "[APP] Free memory: %" PRIu32 " bytes", esp_get_free_heap_size()); + esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg); + /* The last argument may be used to pass data to the event handler, in this example mqtt_event_handler */ + esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL); + esp_mqtt_client_start(client); +} + +void app_main(void) +{ + ESP_LOGI(TAG, "[APP] Startup.."); + ESP_LOGI(TAG, "[APP] Free memory: %" PRIu32 " bytes", esp_get_free_heap_size()); + ESP_LOGI(TAG, "[APP] IDF version: %s", esp_get_idf_version()); + + esp_log_level_set("*", ESP_LOG_INFO); + esp_log_level_set("mqtt_client", ESP_LOG_VERBOSE); + esp_log_level_set("transport_base", ESP_LOG_VERBOSE); + esp_log_level_set("transport", ESP_LOG_VERBOSE); + esp_log_level_set("outbox", ESP_LOG_VERBOSE); + + ESP_ERROR_CHECK(nvs_flash_init()); + ESP_ERROR_CHECK(esp_netif_init()); + ESP_ERROR_CHECK(esp_event_loop_create_default()); + + /* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig. + * Read "Establishing Wi-Fi or Ethernet Connection" section in + * examples/protocols/README.md for more information about this function. + */ + ESP_ERROR_CHECK(example_connect()); + + mqtt_app_start(); +} diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/main/client.crt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/main/client.crt new file mode 100644 index 000000000..7a3074b90 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/main/client.crt @@ -0,0 +1 @@ +Please paste your client certificate here (follow instructions in README.md) diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/main/client.key b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/main/client.key new file mode 100644 index 000000000..a956f850c --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/main/client.key @@ -0,0 +1 @@ +Please paste here your client key (follow instructions in README.md) diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/main/idf_component.yml b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/main/idf_component.yml new file mode 100644 index 000000000..808c17483 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/main/idf_component.yml @@ -0,0 +1,5 @@ +dependencies: + espressif/mqtt: + version: '*' + protocol_examples_common: + path: ${IDF_PATH}/examples/common_components/protocol_examples_common diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/main/mosquitto.org.crt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/main/mosquitto.org.crt new file mode 100644 index 000000000..e76dbd855 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/main/mosquitto.org.crt @@ -0,0 +1,24 @@ +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIUBY1hlCGvdj4NhBXkZ/uLUZNILAwwDQYJKoZIhvcNAQEL +BQAwgZAxCzAJBgNVBAYTAkdCMRcwFQYDVQQIDA5Vbml0ZWQgS2luZ2RvbTEOMAwG +A1UEBwwFRGVyYnkxEjAQBgNVBAoMCU1vc3F1aXR0bzELMAkGA1UECwwCQ0ExFjAU +BgNVBAMMDW1vc3F1aXR0by5vcmcxHzAdBgkqhkiG9w0BCQEWEHJvZ2VyQGF0Y2hv +by5vcmcwHhcNMjAwNjA5MTEwNjM5WhcNMzAwNjA3MTEwNjM5WjCBkDELMAkGA1UE +BhMCR0IxFzAVBgNVBAgMDlVuaXRlZCBLaW5nZG9tMQ4wDAYDVQQHDAVEZXJieTES +MBAGA1UECgwJTW9zcXVpdHRvMQswCQYDVQQLDAJDQTEWMBQGA1UEAwwNbW9zcXVp +dHRvLm9yZzEfMB0GCSqGSIb3DQEJARYQcm9nZXJAYXRjaG9vLm9yZzCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAME0HKmIzfTOwkKLT3THHe+ObdizamPg +UZmD64Tf3zJdNeYGYn4CEXbyP6fy3tWc8S2boW6dzrH8SdFf9uo320GJA9B7U1FW +Te3xda/Lm3JFfaHjkWw7jBwcauQZjpGINHapHRlpiCZsquAthOgxW9SgDgYlGzEA +s06pkEFiMw+qDfLo/sxFKB6vQlFekMeCymjLCbNwPJyqyhFmPWwio/PDMruBTzPH +3cioBnrJWKXc3OjXdLGFJOfj7pP0j/dr2LH72eSvv3PQQFl90CZPFhrCUcRHSSxo +E6yjGOdnz7f6PveLIB574kQORwt8ePn0yidrTC1ictikED3nHYhMUOUCAwEAAaNT +MFEwHQYDVR0OBBYEFPVV6xBUFPiGKDyo5V3+Hbh4N9YSMB8GA1UdIwQYMBaAFPVV +6xBUFPiGKDyo5V3+Hbh4N9YSMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBAGa9kS21N70ThM6/Hj9D7mbVxKLBjVWe2TPsGfbl3rEDfZ+OKRZ2j6AC +6r7jb4TZO3dzF2p6dgbrlU71Y/4K0TdzIjRj3cQ3KSm41JvUQ0hZ/c04iGDg/xWf ++pp58nfPAYwuerruPNWmlStWAXf0UTqRtg4hQDWBuUFDJTuWuuBvEXudz74eh/wK +sMwfu1HFvjy5Z0iMDU8PUDepjVolOCue9ashlS4EB5IECdSR2TItnAIiIwimx839 +LdUdRudafMu5T5Xma182OC0/u/xRlEm+tvKGGmfFcN0piqVl8OrSPBgIlb+1IKJE +m/XriWr/Cq4h/JfB7NTsezVslgkBaoU= +-----END CERTIFICATE----- diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/sdkconfig.defaults b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/sdkconfig.defaults new file mode 100644 index 000000000..99d317837 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/sdkconfig.defaults @@ -0,0 +1 @@ +# Empty file to trigger idf-ci to use esp32c6 specific file. diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/sdkconfig.defaults.esp32c5 b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/sdkconfig.defaults.esp32c5 new file mode 100644 index 000000000..1686559de --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/sdkconfig.defaults.esp32c5 @@ -0,0 +1 @@ +CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE=y diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/sdkconfig.defaults.esp32c6 b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/sdkconfig.defaults.esp32c6 new file mode 100644 index 000000000..1686559de --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/sdkconfig.defaults.esp32c6 @@ -0,0 +1 @@ +CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE=y diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/sdkconfig.defaults.esp32c61 b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/sdkconfig.defaults.esp32c61 new file mode 100644 index 000000000..1686559de --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_mutual_auth/sdkconfig.defaults.esp32c61 @@ -0,0 +1 @@ +CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE=y diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/CMakeLists.txt new file mode 100644 index 000000000..d30f79616 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/CMakeLists.txt @@ -0,0 +1,9 @@ +# The following four lines of boilerplate have to be in your project's CMakeLists +# in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +# "Trim" the build. Include the minimal set of components, main, and anything it depends on. +idf_build_set_property(MINIMAL_BUILD ON) +project(mqtt_ssl_psk) diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/README.md b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/README.md new file mode 100644 index 000000000..d5dbb1b48 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/README.md @@ -0,0 +1,78 @@ +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | + +# ESP-MQTT SSL example with PSK verification + +(See the README.md file in the upper level 'examples' directory for more information about examples.) + +This example connects to a local broker configured to PSK authentication + +## How to use example + +### Hardware Required + +This example can be executed on any ESP32 board, the only required interface is WiFi (or ethernet) to connect to a MQTT +broker with preconfigured PSK verification method. + +#### Mosquitto settings +In case of using mosquitto broker, here is how to enable PSK authentication in `mosquitto.config`, +``` +psk_hint hint +psk_file path_to_your_psk_file +allow_anonymous true +``` +Note: Last line enables anonymous mode, as this example does not use mqtt username and password. + +PSK file then has to contain pairs of hints and keys, as shown below: +``` +hint:BAD123 +``` + +Important note: Keys are stored as text hexadecimal values in PSK file, while the example code stores key as plain binary +as required by MQTT API. (See the example source for details: `"BAD123" -> 0xBA, 0xD1, 0x23`) + +### Configure the project + +* Run `idf.py menuconfig` +* Configure Wi-Fi or Ethernet under "Example Connection Configuration" menu. See "Establishing Wi-Fi or Ethernet Connection" section in [examples/protocols/README.md](../../README.md) for more details. + +### Build and Flash + + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the Getting Started Guide for full steps to configure and use ESP-IDF to build projects. + +## Example Output + +``` +I (2160) example_connect: Ethernet Link Up +I (4650) example_connect: Connected to Ethernet +I (4650) example_connect: IPv4 address: 192.168.0.1 +I (4650) MQTTS_EXAMPLE: [APP] Free memory: 244792 bytes +I (4660) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE +D (4670) MQTT_CLIENT: MQTT client_id=ESP32_c6B4F8 +D (4680) MQTT_CLIENT: Core selection disabled +I (4680) MQTTS_EXAMPLE: Other event id:7 +D (4680) esp-tls: host:192.168.0.2: strlen 13 +D (4700) esp-tls: ssl psk authentication +D (4700) esp-tls: handshake in progress... +D (4720) MQTT_CLIENT: Transport connected to mqtts://192.168.0.2:8883 +I (4720) MQTT_CLIENT: Sending MQTT CONNECT message, type: 1, id: 0000 +D (4720) MQTT_CLIENT: mqtt_message_receive: first byte: 0x20 +D (4730) MQTT_CLIENT: mqtt_message_receive: read "remaining length" byte: 0x2 +D (4730) MQTT_CLIENT: mqtt_message_receive: total message length: 4 (already read: 2) +D (4740) MQTT_CLIENT: mqtt_message_receive: read_len=2 +D (4750) MQTT_CLIENT: mqtt_message_receive: transport_read():4 4 +D (4750) MQTT_CLIENT: Connected +I (4760) MQTTS_EXAMPLE: MQTT_EVENT_CONNECTED +D (4760) MQTT_CLIENT: mqtt_enqueue id: 4837, type=8 successful +D (4770) OUTBOX: ENQUEUE msgid=4837, msg_type=8, len=18, size=18 +D (4770) MQTT_CLIENT: Sent subscribe topic=/topic/qos0, id: 4837, type=8 successful +I (4780) MQTTS_EXAMPLE: sent subscribe successful, msg_id=4837 +D (4790) MQTT_CLIENT: mqtt_enqueue id: 58982, type=8 successful +D (4790) OUTBOX: ENQUEUE msgid=58982, msg_type=8, len=18, size=36 +D (4800) MQTT_CLIENT: Sent subscribe topic=/topic/qos1, id: 58982, type=8 successful +I (4810) MQTTS_EXAMPLE: sent subscribe successful, msg_id=58982 +``` + diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/main/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/main/CMakeLists.txt new file mode 100644 index 000000000..31650f39d --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/main/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRCS "app_main.c" + PRIV_REQUIRES mqtt esp_wifi nvs_flash + INCLUDE_DIRS ".") diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/main/app_main.c b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/main/app_main.c new file mode 100644 index 000000000..ee9e81859 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/main/app_main.c @@ -0,0 +1,151 @@ +/* MQTT over SSL Example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +#include +#include +#include +#include +#include "esp_wifi.h" +#include "esp_system.h" +#include "nvs_flash.h" +#include "esp_event.h" +#include "esp_netif.h" +#include "protocol_examples_common.h" + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#include "freertos/queue.h" + +#include "lwip/sockets.h" +#include "lwip/dns.h" +#include "lwip/netdb.h" + +#include "esp_log.h" +#include "mqtt_client.h" +#include "esp_tls.h" + +/* + * Add here URI of mqtt broker which supports PSK authentication + */ +#define EXAMPLE_BROKER_URI "mqtts://192.168.0.2" + +static const char *TAG = "mqtts_example"; + +/* + * Define psk key and hint as defined in mqtt broker + * example for mosquitto server, content of psk_file: + * hint:BAD123 + * + */ +static const uint8_t s_key[] = { 0xBA, 0xD1, 0x23 }; + +static const psk_hint_key_t psk_hint_key = { + .key = s_key, + .key_size = sizeof(s_key), + .hint = "hint" + }; + +/* + * @brief Event handler registered to receive MQTT events + * + * This function is called by the MQTT client event loop. + * + * @param handler_args user data registered to the event. + * @param base Event base for the handler(always MQTT Base in this example). + * @param event_id The id for the received event. + * @param event_data The data for the event, esp_mqtt_event_handle_t. + */ +static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) +{ + ESP_LOGD(TAG, "Event dispatched from event loop base=%s, event_id=%" PRIi32 "", base, event_id); + esp_mqtt_event_handle_t event = event_data; + esp_mqtt_client_handle_t client = event->client; + int msg_id; + switch ((esp_mqtt_event_id_t)event_id) { + case MQTT_EVENT_CONNECTED: + ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED"); + msg_id = esp_mqtt_client_subscribe(client, "/topic/qos0", 0); + ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); + + msg_id = esp_mqtt_client_subscribe(client, "/topic/qos1", 1); + ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); + + msg_id = esp_mqtt_client_unsubscribe(client, "/topic/qos1"); + ESP_LOGI(TAG, "sent unsubscribe successful, msg_id=%d", msg_id); + break; + case MQTT_EVENT_DISCONNECTED: + ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED"); + break; + + case MQTT_EVENT_SUBSCRIBED: + ESP_LOGI(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d, return code=0x%02x ", event->msg_id, (uint8_t)*event->data); + msg_id = esp_mqtt_client_publish(client, "/topic/qos0", "data", 0, 0, 0); + ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id); + break; + case MQTT_EVENT_UNSUBSCRIBED: + ESP_LOGI(TAG, "MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id); + break; + case MQTT_EVENT_PUBLISHED: + ESP_LOGI(TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id); + break; + case MQTT_EVENT_DATA: + ESP_LOGI(TAG, "MQTT_EVENT_DATA"); + printf("TOPIC=%.*s\r\n", event->topic_len, event->topic); + printf("DATA=%.*s\r\n", event->data_len, event->data); + break; + case MQTT_EVENT_ERROR: + ESP_LOGI(TAG, "MQTT_EVENT_ERROR"); + break; + default: + ESP_LOGI(TAG, "Other event id:%d", event->event_id); + break; + } +} + + +static void mqtt_app_start(void) +{ + const esp_mqtt_client_config_t mqtt_cfg = { + .broker.address.uri = EXAMPLE_BROKER_URI, + .broker.verification.psk_hint_key = &psk_hint_key, + }; + + ESP_LOGI(TAG, "[APP] Free memory: %" PRIu32 " bytes", esp_get_free_heap_size()); + esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg); + /* The last argument may be used to pass data to the event handler, in this example mqtt_event_handler */ + esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL); + esp_mqtt_client_start(client); +} + +void app_main(void) +{ + ESP_LOGI(TAG, "[APP] Startup.."); + ESP_LOGI(TAG, "[APP] Free memory: %" PRIu32 " bytes", esp_get_free_heap_size()); + ESP_LOGI(TAG, "[APP] IDF version: %s", esp_get_idf_version()); + + esp_log_level_set("*", ESP_LOG_INFO); + esp_log_level_set("mqtt_client", ESP_LOG_VERBOSE); + esp_log_level_set("transport_base", ESP_LOG_VERBOSE); + esp_log_level_set("esp-tls", ESP_LOG_VERBOSE); + esp_log_level_set("transport", ESP_LOG_VERBOSE); + esp_log_level_set("outbox", ESP_LOG_VERBOSE); + + ESP_ERROR_CHECK(nvs_flash_init()); + ESP_ERROR_CHECK(esp_netif_init()); + ESP_ERROR_CHECK(esp_event_loop_create_default()); + + /* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig. + * Read "Establishing Wi-Fi or Ethernet Connection" section in + * examples/protocols/README.md for more information about this function. + */ + ESP_ERROR_CHECK(example_connect()); + + mqtt_app_start(); +} diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/main/idf_component.yml b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/main/idf_component.yml new file mode 100644 index 000000000..808c17483 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/main/idf_component.yml @@ -0,0 +1,5 @@ +dependencies: + espressif/mqtt: + version: '*' + protocol_examples_common: + path: ${IDF_PATH}/examples/common_components/protocol_examples_common diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/sdkconfig.defaults b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/sdkconfig.defaults new file mode 100644 index 000000000..1df83e8f3 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/sdkconfig.defaults @@ -0,0 +1 @@ +CONFIG_ESP_TLS_PSK_VERIFICATION=y diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/sdkconfig.defaults.esp32c5 b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/sdkconfig.defaults.esp32c5 new file mode 100644 index 000000000..1686559de --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/sdkconfig.defaults.esp32c5 @@ -0,0 +1 @@ +CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE=y diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/sdkconfig.defaults.esp32c6 b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/sdkconfig.defaults.esp32c6 new file mode 100644 index 000000000..1686559de --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/sdkconfig.defaults.esp32c6 @@ -0,0 +1 @@ +CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE=y diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/sdkconfig.defaults.esp32c61 b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/sdkconfig.defaults.esp32c61 new file mode 100644 index 000000000..1686559de --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ssl_psk/sdkconfig.defaults.esp32c61 @@ -0,0 +1 @@ +CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE=y diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/CMakeLists.txt new file mode 100644 index 000000000..d6f01d8da --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/CMakeLists.txt @@ -0,0 +1,9 @@ +# The following four lines of boilerplate have to be in your project's CMakeLists +# in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +# "Trim" the build. Include the minimal set of components, main, and anything it depends on. +idf_build_set_property(MINIMAL_BUILD ON) +project(mqtt_tcp) diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/README.md b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/README.md new file mode 100644 index 000000000..cb9f2cca0 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/README.md @@ -0,0 +1,375 @@ +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | + +# ESP-MQTT sample application +(See the README.md file in the upper level 'examples' directory for more information about examples.) + +This example connects to the broker URI selected using `idf.py menuconfig` (using mqtt tcp transport) and as a demonstration subscribes/unsubscribes and send a message on certain topic. +(Please note that the public broker is maintained by the community so may not be always available, for details please see this [disclaimer](https://iot.eclipse.org/getting-started/#sandboxes)) + +Note: If the URI equals `FROM_STDIN` then the broker address is read from stdin upon application startup (used for testing) + +It uses ESP-MQTT library which implements mqtt client to connect to mqtt broker. + +## How to use example + +### Hardware Required + +This example can be executed on any ESP32 board, the only required interface is WiFi and connection to internet. + +### Configure the project + +* Open the project configuration menu (`idf.py menuconfig`) +* Configure Wi-Fi or Ethernet under "Example Connection Configuration" menu. See "Establishing Wi-Fi or Ethernet Connection" section in [examples/protocols/README.md](../../README.md) for more details. + +### Build and Flash + +Build the project and flash it to the board, then run monitor tool to view serial output: + +``` +idf.py -p PORT flash monitor +``` + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the Getting Started Guide for full steps to configure and use ESP-IDF to build projects. + +## Example Output + +``` +I (3714) event: sta ip: 192.168.0.139, mask: 255.255.255.0, gw: 192.168.0.2 +I (3714) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE +I (3964) MQTT_CLIENT: Sending MQTT CONNECT message, type: 1, id: 0000 +I (4164) MQTT_EXAMPLE: MQTT_EVENT_CONNECTED +I (4174) MQTT_EXAMPLE: sent publish successful, msg_id=41464 +I (4174) MQTT_EXAMPLE: sent subscribe successful, msg_id=17886 +I (4174) MQTT_EXAMPLE: sent subscribe successful, msg_id=42970 +I (4184) MQTT_EXAMPLE: sent unsubscribe successful, msg_id=50241 +I (4314) MQTT_EXAMPLE: MQTT_EVENT_PUBLISHED, msg_id=41464 +I (4484) MQTT_EXAMPLE: MQTT_EVENT_SUBSCRIBED, msg_id=17886 +I (4484) MQTT_EXAMPLE: sent publish successful, msg_id=0 +I (4684) MQTT_EXAMPLE: MQTT_EVENT_SUBSCRIBED, msg_id=42970 +I (4684) MQTT_EXAMPLE: sent publish successful, msg_id=0 +I (4884) MQTT_CLIENT: deliver_publish, message_length_read=19, message_length=19 +I (4884) MQTT_EXAMPLE: MQTT_EVENT_DATA +TOPIC=/topic/qos0 +DATA=data +I (5194) MQTT_CLIENT: deliver_publish, message_length_read=19, message_length=19 +I (5194) MQTT_EXAMPLE: MQTT_EVENT_DATA +TOPIC=/topic/qos0 +DATA=data +``` + +## Using Wi-Fi connection with ESP32P4 + +It is possible to use Wi-Fi connection on targets that do not support native Wi-Fi peripheral. This example demonstrates using `esp_wifi_remote` on ESP32P4 in the test configuration defined as `sdkconfig.ci.p4_wifi`. This configuration requires another ESP target with native Wi-Fi support physically connected to the ESP32-P4. + +This uses [esp_hosted](https://components.espressif.com/components/espressif/esp_hosted) project by default, please refer to its documentation for more details. +Note, that `esp_hosted` library currently transmits Wi-Fi credentials in plain text. In case this is a concern, please choose the `eppp` option in `esp_wifi_remote` configuration menu (`CONFIG_ESP_WIFI_REMOTE_LIBRARY_EPPP=y`) and setup master-slave verification (please see [eppp: Configure master-slave verification](#eppp)). + +### esp-hosted: Configure the slave project + +You first need to build and flash the slave project. It's possible to perform this action directly from the host project, these commands can be used to set the slave target device (for example ESP32C6), build and flash the slave project. You will have to hold the RST button to keep the host device (ESP32-P4) in reset while flashing the slave device. +``` +idf.py -C managed_components/espressif__esp_hosted/slave/ -B build_slave set-target esp32c6 +idf.py -C managed_components/espressif__esp_hosted/slave/ -B build_slave build flash monitor +``` + +### esp-hosted: Example Output of the slave device + +``` +I (348) cpu_start: Unicore app +I (357) cpu_start: Pro cpu start user code +I (357) cpu_start: cpu freq: 160000000 Hz +I (357) app_init: Application information: +I (360) app_init: Project name: network_adapter +I (365) app_init: App version: qa-test-full-master-esp32c5-202 +I (372) app_init: Compile time: Aug 30 2024 08:10:15 +I (378) app_init: ELF file SHA256: 6220fafe8... +I (383) app_init: ESP-IDF: v5.4-dev-2600-g1157a27964c-dirt +I (390) efuse_init: Min chip rev: v0.0 +I (395) efuse_init: Max chip rev: v0.99 +I (400) efuse_init: Chip rev: v0.1 +I (405) heap_init: Initializing. RAM available for dynamic allocation: +I (412) heap_init: At 4082FCD0 len 0004C940 (306 KiB): RAM +I (418) heap_init: At 4087C610 len 00002F54 (11 KiB): RAM +I (424) heap_init: At 50000000 len 00003FE8 (15 KiB): RTCRAM +I (432) spi_flash: detected chip: generic +I (435) spi_flash: flash io: dio +I (440) sleep_gpio: Configure to isolate all GPIO pins in sleep state +I (447) sleep_gpio: Enable automatic switching of GPIO sleep configuration +I (454) coexist: coex firmware version: 8da3f50af +I (481) coexist: coexist rom version 5b8dcfa +I (481) main_task: Started on CPU0 +I (481) main_task: Calling app_main() +I (482) fg_mcu_slave: ********************************************************************* +I (491) fg_mcu_slave: ESP-Hosted-MCU Slave FW version :: 0.0.6 +I (501) fg_mcu_slave: Transport used :: SDIO only +I (510) fg_mcu_slave: ********************************************************************* +I (519) fg_mcu_slave: Supported features are: +I (524) fg_mcu_slave: - WLAN over SDIO +I (528) h_bt: - BT/BLE +I (531) h_bt: - HCI Over SDIO +I (535) h_bt: - BLE only +I (539) fg_mcu_slave: capabilities: 0xd +I (543) fg_mcu_slave: Supported extended features are: +I (549) h_bt: - BT/BLE (extended) +I (553) fg_mcu_slave: extended capabilities: 0x0 +I (563) h_bt: ESP Bluetooth MAC addr: 40:4c:ca:5b:a0:8a +I (564) BLE_INIT: Using main XTAL as clock source +I (574) BLE_INIT: ble controller commit:[7491a85] +I (575) BLE_INIT: Bluetooth MAC: 40:4c:ca:5b:a0:8a +I (581) phy_init: phy_version 310,dde1ba9,Jun 4 2024,16:38:11 +I (641) phy: libbtbb version: 04952fd, Jun 4 2024, 16:38:26 +I (642) SDIO_SLAVE: Using SDIO interface +I (642) SDIO_SLAVE: sdio_init: sending mode: SDIO_SLAVE_SEND_STREAM +I (648) SDIO_SLAVE: sdio_init: ESP32-C6 SDIO RxQ[20] timing[0] + +I (1155) fg_mcu_slave: Start Data Path +I (1165) fg_mcu_slave: Initial set up done +I (1165) slave_ctrl: event ESPInit +``` + +### esp_hosted: Example Output of the master device (ESP32-P4) + +``` +I (1833) sdio_wrapper: Function 0 Blocksize: 512 +I (1843) sdio_wrapper: Function 1 Blocksize: 512 +I (1843) H_SDIO_DRV: SDIO Host operating in STREAMING MODE +I (1853) H_SDIO_DRV: generate slave intr +I (1863) transport: Received INIT event from ESP32 peripheral +I (1873) transport: EVENT: 12 +I (1873) transport: EVENT: 11 +I (1873) transport: capabilities: 0xd +I (1873) transport: Features supported are: +I (1883) transport: * WLAN +I (1883) transport: - HCI over SDIO +I (1893) transport: - BLE only +I (1893) transport: EVENT: 13 +I (1893) transport: ESP board type is : 13 + +I (1903) transport: Base transport is set-up + +I (1903) transport: Slave chip Id[12] +I (1913) hci_stub_drv: Host BT Support: Disabled +I (1913) H_SDIO_DRV: Received INIT event +I (1923) rpc_evt: EVENT: ESP INIT + +I (1923) rpc_wrap: Received Slave ESP Init +I (2703) rpc_core: <-- RPC_Req [0x116], uid 1 +I (2823) rpc_rsp: --> RPC_Resp [0x216], uid 1 +I (2823) rpc_core: <-- RPC_Req [0x139], uid 2 +I (2833) rpc_rsp: --> RPC_Resp [0x239], uid 2 +I (2833) rpc_core: <-- RPC_Req [0x104], uid 3 +I (2843) rpc_rsp: --> RPC_Resp [0x204], uid 3 +I (2843) rpc_core: <-- RPC_Req [0x118], uid 4 +I (2933) rpc_rsp: --> RPC_Resp [0x218], uid 4 +I (2933) example_connect: Connecting to Cermakowifi... +I (2933) rpc_core: <-- RPC_Req [0x11c], uid 5 +I (2943) rpc_evt: Event [0x2b] received +I (2943) rpc_evt: Event [0x2] received +I (2953) rpc_evt: EVT rcvd: Wi-Fi Start +I (2953) rpc_core: <-- RPC_Req [0x101], uid 6 +I (2973) rpc_rsp: --> RPC_Resp [0x21c], uid 5 +I (2973) H_API: esp_wifi_remote_connect +I (2973) rpc_core: <-- RPC_Req [0x11a], uid 7 +I (2983) rpc_rsp: --> RPC_Resp [0x201], uid 6 +I (3003) rpc_rsp: --> RPC_Resp [0x21a], uid 7 +I (3003) example_connect: Waiting for IP(s) +I (5723) rpc_evt: Event [0x2b] received +I (5943) esp_wifi_remote: esp_wifi_internal_reg_rxcb: sta: 0x400309fe +0x400309fe: wifi_sta_receive at /home/david/esp/idf/components/esp_wifi/src/wifi_netif.c:38 + +I (7573) example_connect: Got IPv6 event: Interface "example_netif_sta" address: fe80:0000:0000:0000:424c:caff:fe5b:a088, type: ESP_IP6_ADDR_IS_LINK_LOCAL +I (9943) esp_netif_handlers: example_netif_sta ip: 192.168.0.29, mask: 255.255.255.0, gw: 192.168.0.1 +I (9943) example_connect: Got IPv4 event: Interface "example_netif_sta" address: 192.168.0.29 +I (9943) example_common: Connected to example_netif_sta +I (9953) example_common: - IPv4 address: 192.168.0.29, +I (9963) example_common: - IPv6 address: fe80:0000:0000:0000:424c:caff:fe5b:a088, type: ESP_IP6_ADDR_IS_LINK_LOCAL +I (9973) mqtt_example: Other event id:7 +I (9973) main_task: Returned from app_main() +I (10253) mqtt_example: MQTT_EVENT_CONNECTED +I (10253) mqtt_example: sent publish successful, msg_id=45053 +I (10253) mqtt_example: sent subscribe successful, msg_id=34643 +I (10263) mqtt_example: sent subscribe successful, msg_id=2358 +I (10263) mqtt_example: sent unsubscribe successful, msg_id=57769 +I (10453) mqtt_example: MQTT_EVENT_PUBLISHED, msg_id=45053 +I (10603) mqtt_example: MQTT_EVENT_SUBSCRIBED, msg_id=34643 +I (10603) mqtt_example: sent publish successful, msg_id=0 +I (10603) mqtt_example: MQTT_EVENT_SUBSCRIBED, msg_id=2358 +I (10613) mqtt_example: sent publish successful, msg_id=0 +I (10613) mqtt_example: MQTT_EVENT_UNSUBSCRIBED, msg_id=57769 +I (10713) mqtt_example: MQTT_EVENT_DATA +TOPIC=/topic/qos0 +DATA=data +I (10863) mqtt_example: MQTT_EVENT_DATA +TOPIC=/topic/qos0 +DATA=data +``` + +### eppp: Configure master-slave verification + +In order to secure the physical connection between the ESP32-P4 (master) and the slave device, it is necessary to set certificates and keys for each side. +To bootstrap this step, you can use one-time generated self-signed RSA keys and certificates running: +``` +./managed_components/espressif__esp_wifi_remote/examples/test_certs/generate_test_certs.sh espressif.local +``` + +#### eppp: Configure the slave project + +It is recommended to create a new project from `esp_wifi_remote` component's example with +``` +idf.py create-project-from-example "espressif/esp_wifi_remote:server" +``` +but you can also build and flash the slave project directly from the `managed_components` directory using: +``` +idf.py -C managed_components/espressif__esp_wifi_remote/examples/server/ -B build_slave +``` + +Please follow these steps to setup the slave application: +* `idf.py set-target` -- choose the slave target (must support Wi-Fi) +* `idf.py menuconfig` -- configure the physical connection and verification details: + - `CONFIG_ESP_WIFI_REMOTE_EPPP_CLIENT_CA` -- CA for verifying ESP32-P4 application + - `CONFIG_ESP_WIFI_REMOTE_EPPP_SERVER_CRT` -- slave's certificate + - `CONFIG_ESP_WIFI_REMOTE_EPPP_SERVER_KEY` -- slave's private key +* `idf.py build flash monitor` + +#### eppp: Configure the master project (ESP32-P4) + +similarly to the slave project, we have to configure +* the physical connection +* the verification + - `CONFIG_ESP_WIFI_REMOTE_EPPP_SERVER_CA` -- CA for verifying the slave application + - `CONFIG_ESP_WIFI_REMOTE_EPPP_CLIENT_CRT` -- our own certificate + - `CONFIG_ESP_WIFI_REMOTE_EPPP_CLIENT_KEY` -- our own private key + +After project configuration, you build and flash the board with +``` +idf.py build flash monitor +``` + +### eppp: Example Output of the slave device + +``` +I (7982) main_task: Returned from app_main() +I (8242) rpc_server: Received header id 2 +I (8242) pp: pp rom version: 5b8dcfa +I (8242) net80211: net80211 rom version: 5b8dcfa +I (8252) wifi:wifi driver task: 4082be8c, prio:23, stack:6656, core=0 +I (8252) wifi:wifi firmware version: feaf82d +I (8252) wifi:wifi certification version: v7.0 +I (8252) wifi:config NVS flash: enabled +I (8262) wifi:config nano formatting: disabled +I (8262) wifi:mac_version:HAL_MAC_ESP32AX_761,ut_version:N, band:0x1 +I (8272) wifi:Init data frame dynamic rx buffer num: 32 +I (8272) wifi:Init static rx mgmt buffer num: 5 +I (8282) wifi:Init management short buffer num: 32 +I (8282) wifi:Init dynamic tx buffer num: 32 +I (8292) wifi:Init static tx FG buffer num: 2 +I (8292) wifi:Init static rx buffer size: 1700 (rxctrl:92, csi:512) +I (8302) wifi:Init static rx buffer num: 10 +I (8302) wifi:Init dynamic rx buffer num: 32 +I (8302) wifi_init: rx ba win: 6 +I (8312) wifi_init: accept mbox: 6 +I (8312) wifi_init: tcpip mbox: 32 +I (8322) wifi_init: udp mbox: 6 +I (8322) wifi_init: tcp mbox: 6 +I (8322) wifi_init: tcp tx win: 5760 +I (8332) wifi_init: tcp rx win: 5760 +I (8332) wifi_init: tcp mss: 1440 +I (8342) wifi_init: WiFi IRAM OP enabled +I (8342) wifi_init: WiFi RX IRAM OP enabled +I (8352) wifi_init: WiFi SLP IRAM OP enabled +I (8362) rpc_server: Received header id 11 +I (8362) rpc_server: Received header id 4 +I (8372) rpc_server: Received header id 6 +I (8372) phy_init: phy_version 270,339aa07,Apr 3 2024,16:36:11 +I (8492) wifi:enable tsf +I (8492) rpc_server: Received WIFI event 41 +I (8502) rpc_server: Received WIFI event 2 +I (8732) rpc_server: Received header id 10 +I (8742) rpc_server: Received header id 5 +I (8752) rpc_server: Received header id 8 +I (11452) wifi:new:<6,0>, old:<1,0>, ap:<255,255>, sta:<6,0>, prof:1, snd_ch_cfg:0x0 +I (11452) wifi:(connect)dot11_authmode:0x3, pairwise_cipher:0x3, group_cipher:0x1 +I (11452) wifi:state: init -> auth (0xb0) +I (11462) rpc_server: Received WIFI event 41 +I (11462) wifi:state: auth -> assoc (0x0) +I (11472) wifi:(assoc)RESP, Extended Capabilities length:8, operating_mode_notification:0 +I (11472) wifi:(assoc)RESP, Extended Capabilities, MBSSID:0, TWT Responder:0, OBSS Narrow Bandwidth RU In OFDMA Tolerance:0 +I (11482) wifi:Extended Capabilities length:8, operating_mode_notification:1 +I (11492) wifi:state: assoc -> run (0x10) +I (11492) wifi:(trc)phytype:CBW20-SGI, snr:50, maxRate:144, highestRateIdx:0 +W (11502) wifi:(trc)band:2G, phymode:3, highestRateIdx:0, lowestRateIdx:11, dataSchedTableSize:14 +I (11512) wifi:(trc)band:2G, rate(S-MCS7, rateIdx:0), ampdu(rate:S-MCS7, schedIdx(0, stop:8)), snr:50, ampduState:wait operational +I (11522) wifi:ifidx:0, rssi:-45, nf:-95, phytype(0x3, CBW20-SGI), phymode(0x3, 11bgn), max_rate:144, he:0, vht:0, ht:1 +I (11532) wifi:(ht)max.RxAMPDULenExponent:3(65535 bytes), MMSS:6(8 us) +W (11542) wifi:idx:0, ifx:0, tid:0, TAHI:0x1002cb4, TALO:0x1b942980, (ssn:0, win:64, cur_ssn:0), CONF:0xc0000005 +I (11572) wifi:connected with Cermakowifi, aid = 2, channel 6, BW20, bssid = 80:29:94:1b:b4:2c +I (11572) wifi:cipher(pairwise:0x3, group:0x1), pmf:0, security:WPA2-PSK, phy:11bgn, rssi:-45 +I (11582) wifi:pm start, type: 1, twt_start:0 + +I (11582) wifi:pm start, type:1, aid:0x2, trans-BSSID:80:29:94:1b:b4:2c, BSSID[5]:0x2c, mbssid(max-indicator:0, index:0), he:0 +I (11592) wifi:dp: 1, bi: 102400, li: 3, scale listen interval from 307200 us to 307200 us +I (11602) wifi:set rx beacon pti, rx_bcn_pti: 10, bcn_timeout: 25000, mt_pti: 10, mt_time: 10000 +I (11612) wifi:[ADDBA]TX addba request, tid:0, dialogtoken:1, bufsize:64, A-MSDU:0(not supported), policy:1(IMR), ssn:0(0x0) +I (11622) wifi:[ADDBA]TX addba request, tid:7, dialogtoken:2, bufsize:64, A-MSDU:0(not supported), policy:1(IMR), ssn:0(0x20) +I (11632) wifi:[ADDBA]TX addba request, tid:5, dialogtoken:3, bufsize:64, A-MSDU:0(not supported), policy:1(IMR), ssn:0(0x0) +I (11642) wifi:[ADDBA]RX addba response, status:0, tid:7/tb:0(0x1), bufsize:64, batimeout:0, txa_wnd:64 +I (11652) wifi:[ADDBA]RX addba response, status:0, tid:5/tb:0(0x1), bufsize:64, batimeout:0, txa_wnd:64 +I (11662) wifi:[ADDBA]RX addba response, status:0, tid:0/tb:1(0x1), bufsize:64, batimeout:0, txa_wnd:64 +I (11672) wifi:AP's beacon interval = 102400 us, DTIM period = 1 +I (11682) rpc_server: Received WIFI event 4 +I (15682) esp_netif_handlers: sta ip: 192.168.0.33, mask: 255.255.255.0, gw: 192.168.0.1 +I (15682) rpc_server: Received IP event 0 +I (15682) rpc_server: Main DNS:185.162.24.55 +I (15682) rpc_server: IP address:192.168.0.33 +``` + +### eppp: Example Output of the master device (ESP32-P4) + +``` +I (445) example_connect: Start example_connect. +I (455) uart: queue free spaces: 16 +I (455) eppp_link: Waiting for IP address 0 +I (3195) esp-netif_lwip-ppp: Connected +I (3195) eppp_link: Got IPv4 event: Interface "pppos_client(EPPP0)" address: 192.168.11.2 +I (3195) esp-netif_lwip-ppp: Connected +I (3195) eppp_link: Connected! 0 +I (5475) example_connect: Waiting for IP(s) +I (8405) esp_wifi_remote: esp_wifi_internal_reg_rxcb: sta: 0x4001c68a +I (9445) example_connect: Got IPv6 event: Interface "pppos_client" address: fe80:0000:0000:0000:5632:04ff:fe08:5054, type: ESP_IP6_ADDR_IS_LINK_LOCAL +I (12415) rpc_client: Main DNS:185.162.24.55 +I (12415) esp_netif_handlers: pppos_client ip: 192.168.11.2, mask: 255.255.255.255, gw: 192.168.11.1 +I (12415) rpc_client: EPPP IP:192.168.11.1 +I (12415) example_connect: Got IPv4 event: Interface "pppos_client" address: 192.168.11.2 +I (12425) rpc_client: WIFI IP:192.168.0.33 +I (12435) example_common: Connected to pppos_client +I (12445) rpc_client: WIFI GW:192.168.0.1 +I (12455) example_common: - IPv6 address: fe80:0000:0000:0000:5632:04ff:fe08:5054, type: ESP_IP6_ADDR_IS_LINK_LOCAL +I (12455) rpc_client: WIFI mask:255.255.255.0 +I (12465) example_common: Connected to pppos_client +I (12475) example_common: - IPv4 address: 192.168.11.2, +I (12475) example_common: - IPv6 address: fe80:0000:0000:0000:5c3b:1291:05ca:6dc8, type: ESP_IP6_ADDR_IS_LINK_LOCAL +I (12495) mqtt_example: Other event id:7 +I (12495) main_task: Returned from app_main() +I (12905) mqtt_example: MQTT_EVENT_CONNECTED +I (12905) mqtt_example: sent publish successful, msg_id=36013 +I (12905) mqtt_example: sent subscribe successful, msg_id=44233 +I (12905) mqtt_example: sent subscribe successful, msg_id=36633 +I (12915) mqtt_example: sent unsubscribe successful, msg_id=15480 +I (13115) mqtt_example: MQTT_EVENT_PUBLISHED, msg_id=36013 +I (13415) mqtt_example: MQTT_EVENT_SUBSCRIBED, msg_id=44233 +I (13415) mqtt_example: sent publish successful, msg_id=0 +I (13415) mqtt_example: MQTT_EVENT_SUBSCRIBED, msg_id=36633 +I (13415) mqtt_example: sent publish successful, msg_id=0 +I (13425) mqtt_example: MQTT_EVENT_DATA +TOPIC=/topic/qos1 +DATA=data_3 +I (13435) mqtt_example: MQTT_EVENT_UNSUBSCRIBED, msg_id=15480 +I (13615) mqtt_example: MQTT_EVENT_DATA +TOPIC=/topic/qos0 +DATA=data +I (13925) mqtt_example: MQTT_EVENT_DATA +TOPIC=/topic/qos0 +``` diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/main/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/main/CMakeLists.txt new file mode 100644 index 000000000..3bf739cf8 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/main/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRCS "app_main.c" + PRIV_REQUIRES mqtt nvs_flash esp_netif + INCLUDE_DIRS ".") diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/main/Kconfig.projbuild b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/main/Kconfig.projbuild new file mode 100644 index 000000000..c11539fb8 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/main/Kconfig.projbuild @@ -0,0 +1,13 @@ +menu "Example Configuration" + + config BROKER_URL + string "Broker URL" + default "mqtt://mqtt.eclipseprojects.io" + help + URL of the broker to connect to + + config BROKER_URL_FROM_STDIN + bool + default y if BROKER_URL = "FROM_STDIN" + +endmenu diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/main/app_main.c b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/main/app_main.c new file mode 100644 index 000000000..396aca669 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/main/app_main.c @@ -0,0 +1,162 @@ +/* MQTT (over TCP) Example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +#include +#include +#include +#include +#include +#include "esp_system.h" +#include "nvs_flash.h" +#include "esp_event.h" +#include "esp_netif.h" +#include "protocol_examples_common.h" + +#include "esp_log.h" +#include "mqtt_client.h" + +static const char *TAG = "mqtt_example"; + + +static void log_error_if_nonzero(const char *message, int error_code) +{ + if (error_code != 0) { + ESP_LOGE(TAG, "Last error %s: 0x%x", message, error_code); + } +} + +/* + * @brief Event handler registered to receive MQTT events + * + * This function is called by the MQTT client event loop. + * + * @param handler_args user data registered to the event. + * @param base Event base for the handler(always MQTT Base in this example). + * @param event_id The id for the received event. + * @param event_data The data for the event, esp_mqtt_event_handle_t. + */ +static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) +{ + ESP_LOGD(TAG, "Event dispatched from event loop base=%s, event_id=%" PRIi32 "", base, event_id); + esp_mqtt_event_handle_t event = event_data; + esp_mqtt_client_handle_t client = event->client; + int msg_id; + switch ((esp_mqtt_event_id_t)event_id) { + case MQTT_EVENT_CONNECTED: + ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED"); + msg_id = esp_mqtt_client_publish(client, "/topic/qos1", "data_3", 0, 1, 0); + ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id); + + msg_id = esp_mqtt_client_subscribe(client, "/topic/qos0", 0); + ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); + + msg_id = esp_mqtt_client_subscribe(client, "/topic/qos1", 1); + ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); + + msg_id = esp_mqtt_client_unsubscribe(client, "/topic/qos1"); + ESP_LOGI(TAG, "sent unsubscribe successful, msg_id=%d", msg_id); + break; + case MQTT_EVENT_DISCONNECTED: + ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED"); + break; + + case MQTT_EVENT_SUBSCRIBED: + ESP_LOGI(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d, return code=0x%02x ", event->msg_id, (uint8_t)*event->data); + msg_id = esp_mqtt_client_publish(client, "/topic/qos0", "data", 0, 0, 0); + ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id); + break; + case MQTT_EVENT_UNSUBSCRIBED: + ESP_LOGI(TAG, "MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id); + break; + case MQTT_EVENT_PUBLISHED: + ESP_LOGI(TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id); + break; + case MQTT_EVENT_DATA: + ESP_LOGI(TAG, "MQTT_EVENT_DATA"); + printf("TOPIC=%.*s\r\n", event->topic_len, event->topic); + printf("DATA=%.*s\r\n", event->data_len, event->data); + break; + case MQTT_EVENT_ERROR: + ESP_LOGI(TAG, "MQTT_EVENT_ERROR"); + if (event->error_handle->error_type == MQTT_ERROR_TYPE_TCP_TRANSPORT) { + log_error_if_nonzero("reported from esp-tls", event->error_handle->esp_tls_last_esp_err); + log_error_if_nonzero("reported from tls stack", event->error_handle->esp_tls_stack_err); + log_error_if_nonzero("captured as transport's socket errno", event->error_handle->esp_transport_sock_errno); + ESP_LOGI(TAG, "Last errno string (%s)", strerror(event->error_handle->esp_transport_sock_errno)); + + } + break; + default: + ESP_LOGI(TAG, "Other event id:%d", event->event_id); + break; + } +} + +static void mqtt_app_start(void) +{ + esp_mqtt_client_config_t mqtt_cfg = { + .broker.address.uri = CONFIG_BROKER_URL, + }; +#if CONFIG_BROKER_URL_FROM_STDIN + char line[128]; + + if (strcmp(mqtt_cfg.broker.address.uri, "FROM_STDIN") == 0) { + int count = 0; + printf("Please enter url of mqtt broker\n"); + while (count < 128) { + int c = fgetc(stdin); + if (c == '\n') { + line[count] = '\0'; + break; + } else if (c > 0 && c < 127) { + line[count] = c; + ++count; + } + vTaskDelay(10 / portTICK_PERIOD_MS); + } + mqtt_cfg.broker.address.uri = line; + printf("Broker url: %s\n", line); + } else { + ESP_LOGE(TAG, "Configuration mismatch: wrong broker url"); + abort(); + } +#endif /* CONFIG_BROKER_URL_FROM_STDIN */ + + esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg); + /* The last argument may be used to pass data to the event handler, in this example mqtt_event_handler */ + esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL); + esp_mqtt_client_start(client); +} + +void app_main(void) +{ + ESP_LOGI(TAG, "[APP] Startup.."); + ESP_LOGI(TAG, "[APP] Free memory: %" PRIu32 " bytes", esp_get_free_heap_size()); + ESP_LOGI(TAG, "[APP] IDF version: %s", esp_get_idf_version()); + + esp_log_level_set("*", ESP_LOG_INFO); + esp_log_level_set("mqtt_client", ESP_LOG_VERBOSE); + esp_log_level_set("mqtt_example", ESP_LOG_VERBOSE); + esp_log_level_set("transport_base", ESP_LOG_VERBOSE); + esp_log_level_set("esp-tls", ESP_LOG_VERBOSE); + esp_log_level_set("transport", ESP_LOG_VERBOSE); + esp_log_level_set("outbox", ESP_LOG_VERBOSE); + + ESP_ERROR_CHECK(nvs_flash_init()); + ESP_ERROR_CHECK(esp_netif_init()); + ESP_ERROR_CHECK(esp_event_loop_create_default()); + + /* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig. + * Read "Establishing Wi-Fi or Ethernet Connection" section in + * examples/protocols/README.md for more information about this function. + */ + ESP_ERROR_CHECK(example_connect()); + + mqtt_app_start(); +} diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/main/idf_component.yml b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/main/idf_component.yml new file mode 100644 index 000000000..7c166832e --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/main/idf_component.yml @@ -0,0 +1,13 @@ +dependencies: + espressif/esp_hosted: + rules: + - if: target in [esp32p4, esp32h2] + version: 2.5.1 + espressif/esp_wifi_remote: + rules: + - if: target in [esp32p4, esp32h2] + version: '>=0.10,<2.0' + espressif/mqtt: + version: '*' + protocol_examples_common: + path: ${IDF_PATH}/examples/common_components/protocol_examples_common diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/pytest_mqtt_tcp.py b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/pytest_mqtt_tcp.py new file mode 100644 index 000000000..f8deb23ff --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/pytest_mqtt_tcp.py @@ -0,0 +1,97 @@ +# SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: Unlicense OR CC0-1.0 +import logging +import os +import socket +import struct +import sys +import time +from threading import Thread + +import pexpect +import pytest +from common_test_methods import get_host_ip4_by_dest_ip +from pytest_embedded import Dut +from pytest_embedded_idf.utils import idf_parametrize + +msgid = -1 + + +def mqqt_server_sketch(my_ip, port): # type: (str, str) -> None + global msgid + print('Starting the server on {}'.format(my_ip)) + s = None + try: + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.settimeout(60) + s.bind((my_ip, port)) + s.listen(1) + q, addr = s.accept() + q.settimeout(30) + print('connection accepted') + except Exception: + print( + 'Local server on {}:{} listening/accepting failure: {}' + 'Possibly check permissions or firewall settings' + 'to accept connections on this address'.format(my_ip, port, sys.exc_info()[0]) + ) + raise + data = q.recv(1024) + # check if received initial empty message + print('received from client {!r}'.format(data)) + data = bytearray([0x20, 0x02, 0x00, 0x00]) + q.send(data) + # try to receive qos1 + data = q.recv(1024) + msgid = struct.unpack('>H', data[15:17])[0] + print('received from client {!r}, msgid: {}'.format(data, msgid)) + data = bytearray([0x40, 0x02, data[15], data[16]]) + q.send(data) + time.sleep(5) + s.close() + print('server closed') + + +@pytest.mark.ethernet +@idf_parametrize('target', ['esp32'], indirect=['target']) +def test_examples_protocol_mqtt_qos1(dut: Dut) -> None: + global msgid + """ + steps: (QoS1: Happy flow) + 1. start the broker broker (with correctly sending ACK) + 2. DUT client connects to a broker and publishes qos1 message + 3. Test evaluates that qos1 message is queued and removed from queued after ACK received + 4. Test the broker received the same message id evaluated in step 3 + """ + # check and log bin size + binary_file = os.path.join(dut.app.binary_path, 'mqtt_tcp.bin') + bin_size = os.path.getsize(binary_file) + logging.info('[Performance][mqtt_tcp_bin_size]: %s KB', bin_size // 1024) + # waiting for getting the IP address + try: + ip_address = dut.expect(r'IPv4 address: (\d+\.\d+\.\d+\.\d+)', timeout=30).group(1).decode() + print('Connected to AP/Ethernet with IP: {}'.format(ip_address)) + except pexpect.TIMEOUT: + raise ValueError('ENV_TEST_FAILURE: Cannot connect to AP/Ethernet') + + # 2. start mqtt broker sketch + host_ip = get_host_ip4_by_dest_ip(ip_address) + thread1 = Thread(target=mqqt_server_sketch, args=(host_ip, 1883)) + thread1.start() + + data_write = 'mqtt://' + host_ip + print('writing to device: {}'.format(data_write)) + dut.write(data_write) + thread1.join() + print('Message id received from server: {}'.format(msgid)) + # 3. check the message id was enqueued and then deleted + msgid_enqueued = dut.expect(b'outbox: ENQUEUE msgid=([0-9]+)', timeout=30).group(1).decode() + msgid_deleted = dut.expect(b'outbox: DELETED msgid=([0-9]+)', timeout=30).group(1).decode() + # 4. check the msgid of received data are the same as that of enqueued and deleted from outbox + if msgid_enqueued == str(msgid) and msgid_deleted == str(msgid): + print('PASS: Received correct msg id') + else: + print('Failure!') + raise ValueError( + 'Mismatch of msgid: received: {}, enqueued {}, deleted {}'.format(msgid, msgid_enqueued, msgid_deleted) + ) diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/sdkconfig.ci b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/sdkconfig.ci new file mode 100644 index 000000000..acf084a9e --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/sdkconfig.ci @@ -0,0 +1,13 @@ +CONFIG_LOG_DEFAULT_LEVEL_DEBUG=y +CONFIG_BROKER_URL="FROM_STDIN" +CONFIG_EXAMPLE_CONNECT_ETHERNET=y +CONFIG_EXAMPLE_CONNECT_WIFI=n +CONFIG_EXAMPLE_USE_INTERNAL_ETHERNET=y +CONFIG_EXAMPLE_ETH_PHY_IP101=y +CONFIG_EXAMPLE_ETH_MDC_GPIO=23 +CONFIG_EXAMPLE_ETH_MDIO_GPIO=18 +CONFIG_EXAMPLE_ETH_PHY_RST_GPIO=5 +CONFIG_EXAMPLE_ETH_PHY_ADDR=1 +CONFIG_EXAMPLE_CONNECT_IPV6=y +CONFIG_LWIP_TCPIP_CORE_LOCKING=y +CONFIG_LWIP_CHECK_THREAD_SAFETY=y diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/sdkconfig.ci.p4_eppp b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/sdkconfig.ci.p4_eppp new file mode 100644 index 000000000..8d423df47 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/sdkconfig.ci.p4_eppp @@ -0,0 +1,5 @@ +CONFIG_IDF_TARGET="esp32p4" +CONFIG_EXAMPLE_CONNECT_WIFI=y +CONFIG_ESP_WIFI_REMOTE_LIBRARY_EPPP=y +CONFIG_ESP_WIFI_REMOTE_EPPP_UART_TX_PIN=17 +CONFIG_ESP_WIFI_REMOTE_EPPP_UART_RX_PIN=16 diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/sdkconfig.ci.p4_wifi b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/sdkconfig.ci.p4_wifi new file mode 100644 index 000000000..a2ea93a35 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/sdkconfig.ci.p4_wifi @@ -0,0 +1,3 @@ +CONFIG_IDF_TARGET="esp32p4" +CONFIG_EXAMPLE_CONNECT_WIFI=y +CONFIG_ESP_WIFI_REMOTE_LIBRARY_HOSTED=y diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/sdkconfig.ci.ppp_connect b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/sdkconfig.ci.ppp_connect new file mode 100644 index 000000000..7366a909e --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/tcp/sdkconfig.ci.ppp_connect @@ -0,0 +1,3 @@ +CONFIG_EXAMPLE_CONNECT_WIFI=n +CONFIG_EXAMPLE_CONNECT_PPP=y +CONFIG_EXAMPLE_CONNECT_PPP_DEVICE_UART=y diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/CMakeLists.txt new file mode 100644 index 000000000..bc5e2f109 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/CMakeLists.txt @@ -0,0 +1,9 @@ +# The following four lines of boilerplate have to be in your project's CMakeLists +# in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +# "Trim" the build. Include the minimal set of components, main, and anything it depends on. +idf_build_set_property(MINIMAL_BUILD ON) +project(mqtt_websocket) diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/README.md b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/README.md new file mode 100644 index 000000000..5d1724fd3 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/README.md @@ -0,0 +1,61 @@ +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | + +# ESP-MQTT MQTT over Websocket + +(See the README.md file in the upper level 'examples' directory for more information about examples.) + +This example connects to the broker mqtt.eclipseprojects.io over web sockets as a demonstration subscribes/unsubscribes and send a message on certain topic. +(Please note that the public broker is maintained by the community so may not be always available, for details please see this [disclaimer](https://iot.eclipse.org/getting-started/#sandboxes)) + +It uses ESP-MQTT library which implements mqtt client to connect to mqtt broker. + +## How to use example + +### Hardware Required + +This example can be executed on any ESP32 board, the only required interface is WiFi and connection to internet. + +### Configure the project + +* Open the project configuration menu (`idf.py menuconfig`) +* Configure Wi-Fi or Ethernet under "Example Connection Configuration" menu. See "Establishing Wi-Fi or Ethernet Connection" section in [examples/protocols/README.md](../../README.md) for more details. + +### Build and Flash + +Build the project and flash it to the board, then run monitor tool to view serial output: + +``` +idf.py -p PORT flash monitor +``` + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the Getting Started Guide for full steps to configure and use ESP-IDF to build projects. + +## Example Output + +``` +I (3714) event: sta ip: 192.168.0.139, mask: 255.255.255.0, gw: 192.168.0.2 +I (3714) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE +I (3964) MQTT_CLIENT: Sending MQTT CONNECT message, type: 1, id: 0000 +I (4164) MQTTWS_EXAMPLE: MQTT_EVENT_CONNECTED +I (4174) MQTTWS_EXAMPLE: sent publish successful, msg_id=41464 +I (4174) MQTTWS_EXAMPLE: sent subscribe successful, msg_id=17886 +I (4174) MQTTWS_EXAMPLE: sent subscribe successful, msg_id=42970 +I (4184) MQTTWS_EXAMPLE: sent unsubscribe successful, msg_id=50241 +I (4314) MQTTWS_EXAMPLE: MQTT_EVENT_PUBLISHED, msg_id=41464 +I (4484) MQTTWS_EXAMPLE: MQTT_EVENT_SUBSCRIBED, msg_id=17886 +I (4484) MQTTWS_EXAMPLE: sent publish successful, msg_id=0 +I (4684) MQTTWS_EXAMPLE: MQTT_EVENT_SUBSCRIBED, msg_id=42970 +I (4684) MQTTWS_EXAMPLE: sent publish successful, msg_id=0 +I (4884) MQTT_CLIENT: deliver_publish, message_length_read=19, message_length=19 +I (4884) MQTTWS_EXAMPLE: MQTT_EVENT_DATA +TOPIC=/topic/qos0 +DATA=data +I (5194) MQTT_CLIENT: deliver_publish, message_length_read=19, message_length=19 +I (5194) MQTTWS_EXAMPLE: MQTT_EVENT_DATA +TOPIC=/topic/qos0 +DATA=data +``` + diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/main/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/main/CMakeLists.txt new file mode 100644 index 000000000..31650f39d --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/main/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRCS "app_main.c" + PRIV_REQUIRES mqtt esp_wifi nvs_flash + INCLUDE_DIRS ".") diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/main/Kconfig.projbuild b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/main/Kconfig.projbuild new file mode 100644 index 000000000..e547a5156 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/main/Kconfig.projbuild @@ -0,0 +1,9 @@ +menu "Example Configuration" + + config BROKER_URI + string "Broker URL" + default "ws://mqtt.eclipseprojects.io:80/mqtt" + help + URL of an mqtt broker which this example connects to. + +endmenu diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/main/app_main.c b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/main/app_main.c new file mode 100644 index 000000000..f518fdfac --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/main/app_main.c @@ -0,0 +1,144 @@ +/* MQTT over Websockets Example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ +#include +#include +#include +#include +#include "esp_wifi.h" +#include "esp_system.h" +#include "nvs_flash.h" +#include "esp_event.h" +#include "esp_netif.h" +#include "protocol_examples_common.h" + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#include "freertos/queue.h" + +#include "lwip/sockets.h" +#include "lwip/dns.h" +#include "lwip/netdb.h" + +#include "esp_log.h" +#include "mqtt_client.h" + +static const char *TAG = "mqttws_example"; + +static void log_error_if_nonzero(const char *message, int error_code) +{ + if (error_code != 0) { + ESP_LOGE(TAG, "Last error %s: 0x%x", message, error_code); + } +} + +/* + * @brief Event handler registered to receive MQTT events + * + * This function is called by the MQTT client event loop. + * + * @param handler_args user data registered to the event. + * @param base Event base for the handler(always MQTT Base in this example). + * @param event_id The id for the received event. + * @param event_data The data for the event, esp_mqtt_event_handle_t. + */ +static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) +{ + ESP_LOGD(TAG, "Event dispatched from event loop base=%s, event_id=%" PRIi32, base, event_id); + esp_mqtt_event_handle_t event = event_data; + esp_mqtt_client_handle_t client = event->client; + int msg_id; + switch ((esp_mqtt_event_id_t)event_id) { + case MQTT_EVENT_CONNECTED: + ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED"); + msg_id = esp_mqtt_client_publish(client, "/topic/qos1", "data_3", 0, 1, 0); + ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id); + msg_id = esp_mqtt_client_subscribe(client, "/topic/qos0", 0); + ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); + + msg_id = esp_mqtt_client_subscribe(client, "/topic/qos1", 1); + ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); + + msg_id = esp_mqtt_client_unsubscribe(client, "/topic/qos1"); + ESP_LOGI(TAG, "sent unsubscribe successful, msg_id=%d", msg_id); + break; + case MQTT_EVENT_DISCONNECTED: + ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED"); + break; + + case MQTT_EVENT_SUBSCRIBED: + ESP_LOGI(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d, return code=0x%02x ", event->msg_id, (uint8_t)*event->data); + msg_id = esp_mqtt_client_publish(client, "/topic/qos0", "data", 0, 0, 0); + ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id); + break; + case MQTT_EVENT_UNSUBSCRIBED: + ESP_LOGI(TAG, "MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id); + break; + case MQTT_EVENT_PUBLISHED: + ESP_LOGI(TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id); + break; + case MQTT_EVENT_DATA: + ESP_LOGI(TAG, "MQTT_EVENT_DATA"); + printf("TOPIC=%.*s\r\n", event->topic_len, event->topic); + printf("DATA=%.*s\r\n", event->data_len, event->data); + break; + case MQTT_EVENT_ERROR: + ESP_LOGI(TAG, "MQTT_EVENT_ERROR"); + if (event->error_handle->error_type == MQTT_ERROR_TYPE_TCP_TRANSPORT) { + log_error_if_nonzero("reported from esp-tls", event->error_handle->esp_tls_last_esp_err); + log_error_if_nonzero("reported from tls stack", event->error_handle->esp_tls_stack_err); + log_error_if_nonzero("captured as transport's socket errno", event->error_handle->esp_transport_sock_errno); + ESP_LOGI(TAG, "Last errno string (%s)", strerror(event->error_handle->esp_transport_sock_errno)); + + } + break; + default: + ESP_LOGI(TAG, "Other event id:%d", event->event_id); + break; + } +} + +static void mqtt_app_start(void) +{ + const esp_mqtt_client_config_t mqtt_cfg = { + .broker.address.uri = CONFIG_BROKER_URI, + }; + + esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg); + /* The last argument may be used to pass data to the event handler, in this example mqtt_event_handler */ + esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL); + esp_mqtt_client_start(client); +} + +void app_main(void) +{ + ESP_LOGI(TAG, "[APP] Startup.."); + ESP_LOGI(TAG, "[APP] Free memory: %" PRIu32 " bytes", esp_get_free_heap_size()); + ESP_LOGI(TAG, "[APP] IDF version: %s", esp_get_idf_version()); + + esp_log_level_set("*", ESP_LOG_INFO); + esp_log_level_set("mqtt_client", ESP_LOG_VERBOSE); + esp_log_level_set("mqtt_example", ESP_LOG_VERBOSE); + esp_log_level_set("transport_base", ESP_LOG_VERBOSE); + esp_log_level_set("transport_ws", ESP_LOG_VERBOSE); + esp_log_level_set("transport", ESP_LOG_VERBOSE); + esp_log_level_set("outbox", ESP_LOG_VERBOSE); + + ESP_ERROR_CHECK(nvs_flash_init()); + ESP_ERROR_CHECK(esp_netif_init()); + ESP_ERROR_CHECK(esp_event_loop_create_default()); + + /* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig. + * Read "Establishing Wi-Fi or Ethernet Connection" section in + * examples/protocols/README.md for more information about this function. + */ + ESP_ERROR_CHECK(example_connect()); + + mqtt_app_start(); +} diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/main/idf_component.yml b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/main/idf_component.yml new file mode 100644 index 000000000..808c17483 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/main/idf_component.yml @@ -0,0 +1,5 @@ +dependencies: + espressif/mqtt: + version: '*' + protocol_examples_common: + path: ${IDF_PATH}/examples/common_components/protocol_examples_common diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/pytest_mqtt_ws_example.py b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/pytest_mqtt_ws_example.py new file mode 100644 index 000000000..3ad6bd742 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/pytest_mqtt_ws_example.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python +# +# SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: Unlicense OR CC0-1.0 +import logging +import os +import re +import sys +from threading import Event +from threading import Thread + +import paho.mqtt.client as mqtt +import pytest +from pytest_embedded import Dut +from pytest_embedded_idf.utils import idf_parametrize + +event_client_connected = Event() +event_stop_client = Event() +event_client_received_correct = Event() +message_log = '' + + +# The callback for when the client receives a CONNACK response from the server. +def on_connect(client, userdata, flags, rc): # type: (mqtt.Client, tuple, bool, str) -> None + _ = (userdata, flags) + print('Connected with result code ' + str(rc)) + event_client_connected.set() + client.subscribe('/topic/qos0') + + +def mqtt_client_task(client): # type: (mqtt.Client) -> None + while not event_stop_client.is_set(): + client.loop() + + +# The callback for when a PUBLISH message is received from the server. +def on_message(client, userdata, msg): # type: (mqtt.Client, tuple, mqtt.client.MQTTMessage) -> None + _ = userdata + global message_log + payload = msg.payload.decode() + if not event_client_received_correct.is_set() and payload == 'data': + client.publish('/topic/qos0', 'data_to_esp32') + if msg.topic == '/topic/qos0' and payload == 'data': + event_client_received_correct.set() + message_log += 'Received data:' + msg.topic + ' ' + payload + '\n' + + +@pytest.mark.ethernet +@idf_parametrize('target', ['esp32'], indirect=['target']) +def test_examples_protocol_mqtt_ws(dut): # type: (Dut) -> None + broker_url = '' + broker_port = 0 + """ + steps: | + 1. join AP and connects to ws broker + 2. Test connects a client to the same broker + 3. Test evaluates it received correct qos0 message + 4. Test ESP32 client received correct qos0 message + """ + # check and log bin size + binary_file = os.path.join(dut.app.binary_path, 'mqtt_websocket.bin') + bin_size = os.path.getsize(binary_file) + logging.info('[Performance][mqtt_websocket_bin_size]: %s KB', bin_size // 1024) + # Look for host:port in sdkconfig + try: + value = re.search(r'\:\/\/([^:]+)\:([0-9]+)', dut.app.sdkconfig.get('BROKER_URI')) + assert value is not None + broker_url = value.group(1) + broker_port = int(value.group(2)) + except Exception: + print('ENV_TEST_FAILURE: Cannot find broker url in sdkconfig') + raise + client = None + # 1. Test connects to a broker + try: + client = mqtt.Client(transport='websockets') + client.on_connect = on_connect + client.on_message = on_message + print('Connecting...') + client.connect(broker_url, broker_port, 60) + except Exception: + print( + 'ENV_TEST_FAILURE: Unexpected error while connecting to broker {}: {}:'.format( + broker_url, sys.exc_info()[0] + ) + ) + raise + # Starting a py-client in a separate thread + thread1 = Thread(target=mqtt_client_task, args=(client,)) + thread1.start() + try: + print('Connecting py-client to broker {}:{}...'.format(broker_url, broker_port)) + if not event_client_connected.wait(timeout=30): + raise ValueError('ENV_TEST_FAILURE: Test script cannot connect to broker: {}'.format(broker_url)) + try: + ip_address = dut.expect(r'IPv4 address: (\d+\.\d+\.\d+\.\d+)[^\d]', timeout=30)[0] + print('Connected to AP with IP: {}'.format(ip_address)) + except Dut.ExpectTimeout: + print('ENV_TEST_FAILURE: Cannot connect to AP') + raise + print('Checking py-client received msg published from esp...') + if not event_client_received_correct.wait(timeout=30): + raise ValueError('Wrong data received, msg log: {}'.format(message_log)) + print('Checking esp-client received msg published from py-client...') + dut.expect(r'DATA=data_to_esp32', timeout=30) + finally: + event_stop_client.set() + thread1.join() diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/sdkconfig.ci b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/sdkconfig.ci new file mode 100644 index 000000000..eebcafdea --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/ws/sdkconfig.ci @@ -0,0 +1,11 @@ +CONFIG_BROKER_URI="ws://${EXAMPLE_MQTT_BROKER_WS}/ws" +CONFIG_EXAMPLE_CONNECT_ETHERNET=y +CONFIG_EXAMPLE_CONNECT_WIFI=n +CONFIG_EXAMPLE_USE_INTERNAL_ETHERNET=y +CONFIG_EXAMPLE_ETH_PHY_IP101=y +CONFIG_EXAMPLE_ETH_MDC_GPIO=23 +CONFIG_EXAMPLE_ETH_MDIO_GPIO=18 +CONFIG_EXAMPLE_ETH_PHY_RST_GPIO=5 +CONFIG_EXAMPLE_ETH_PHY_ADDR=1 +CONFIG_EXAMPLE_CONNECT_IPV6=y +CONFIG_LWIP_CHECK_THREAD_SAFETY=y diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/CMakeLists.txt new file mode 100644 index 000000000..e62d88e13 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/CMakeLists.txt @@ -0,0 +1,11 @@ +# The following four lines of boilerplate have to be in your project's CMakeLists +# in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +# "Trim" the build. Include the minimal set of components, main, and anything it depends on. +idf_build_set_property(MINIMAL_BUILD ON) +project(mqtt_websocket_secure) + +target_add_binary_data(${PROJECT_NAME}.elf "main/mqtt_eclipseprojects_io.pem" TEXT) diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/README.md b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/README.md new file mode 100644 index 000000000..b401d3191 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/README.md @@ -0,0 +1,73 @@ +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | + +# ESP-MQTT MQTT over WSS Sample application +(See the README.md file in the upper level 'examples' directory for more information about examples.) + +This example connects to the broker mqtt.eclipseprojects.io over secure websockets and as a demonstration subscribes/unsubscribes and send a message on certain topic. +(Please note that the public broker is maintained by the community so may not be always available, for details please see this [disclaimer](https://iot.eclipse.org/getting-started/#sandboxes)) + +It uses ESP-MQTT library which implements mqtt client to connect to mqtt broker. + +## How to use example + +### Hardware Required + +This example can be executed on any ESP32 board, the only required interface is WiFi and connection to internet. + +### Configure the project + +* Open the project configuration menu (`idf.py menuconfig`) +* Configure Wi-Fi or Ethernet under "Example Connection Configuration" menu. See "Establishing Wi-Fi or Ethernet Connection" section in [examples/protocols/README.md](../../README.md) for more details. + +Note how to create a PEM certificate for mqtt.eclipseprojects.io: + +PEM certificate for this example could be extracted from an openssl `s_client` command connecting to mqtt.eclipseprojects.io. +In case a host operating system has `openssl` and `sed` packages installed, one could execute the following command to download and save the root certificate to a file (Note for Windows users: Both Linux like environment or Windows native packages may be used). +``` +echo "" | openssl s_client -showcerts -connect mqtt.eclipseprojects.io:443 | sed -n "1,/Root/d; /BEGIN/,/END/p" | openssl x509 -outform PEM >mqtt_eclipse_org.pem +``` +Please note that this is not a general command for downloading a root certificate for an arbitrary host; +this command works with mqtt.eclipseprojects.io as the site provides root certificate in the chain, which then could be extracted +with text operation. + +### Build and Flash + +Build the project and flash it to the board, then run monitor tool to view serial output: + +``` +idf.py -p PORT flash monitor +``` + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the Getting Started Guide for full steps to configure and use ESP-IDF to build projects. + +## Example Output + +``` +I (3714) event: sta ip: 192.168.0.139, mask: 255.255.255.0, gw: 192.168.0.2 +I (3714) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE +I (3964) MQTT_CLIENT: Sending MQTT CONNECT message, type: 1, id: 0000 +I (4164) MQTTWSS_EXAMPLE: MQTT_EVENT_CONNECTED +I (4174) MQTTWSS_EXAMPLE: sent publish successful, msg_id=41464 +I (4174) MQTTWSS_EXAMPLE: sent subscribe successful, msg_id=17886 +I (4174) MQTTWSS_EXAMPLE: sent subscribe successful, msg_id=42970 +I (4184) MQTTWSS_EXAMPLE: sent unsubscribe successful, msg_id=50241 +I (4314) MQTTWSS_EXAMPLE: MQTT_EVENT_PUBLISHED, msg_id=41464 +I (4484) MQTTWSS_EXAMPLE: MQTT_EVENT_SUBSCRIBED, msg_id=17886 +I (4484) MQTTWSS_EXAMPLE: sent publish successful, msg_id=0 +I (4684) MQTTWSS_EXAMPLE: MQTT_EVENT_SUBSCRIBED, msg_id=42970 +I (4684) MQTTWSS_EXAMPLE: sent publish successful, msg_id=0 +I (4884) MQTT_CLIENT: deliver_publish, message_length_read=19, message_length=19 +I (4884) MQTTWSS_EXAMPLE: MQTT_EVENT_DATA +TOPIC=/topic/qos0 +DATA=data +I (5194) MQTT_CLIENT: deliver_publish, message_length_read=19, message_length=19 +I (5194) MQTTWSS_EXAMPLE: MQTT_EVENT_DATA +TOPIC=/topic/qos0 +DATA=data +``` + + + diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/main/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/main/CMakeLists.txt new file mode 100644 index 000000000..31650f39d --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/main/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRCS "app_main.c" + PRIV_REQUIRES mqtt esp_wifi nvs_flash + INCLUDE_DIRS ".") diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/main/Kconfig.projbuild b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/main/Kconfig.projbuild new file mode 100644 index 000000000..b6d1f593d --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/main/Kconfig.projbuild @@ -0,0 +1,20 @@ +menu "Example Configuration" + + config BROKER_URI + string "Broker URL" + default "wss://mqtt.eclipseprojects.io:443/mqtt" + help + URL of an mqtt broker which this example connects to. + + config BROKER_CERTIFICATE_OVERRIDE + string "Server certificate override" + default "" + help + Please leave empty if server certificate included from a textfile; otherwise fill in a base64 part of PEM + format certificate + + config BROKER_CERTIFICATE_OVERRIDDEN + bool + default y if BROKER_CERTIFICATE_OVERRIDE != "" + +endmenu diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/main/app_main.c b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/main/app_main.c new file mode 100644 index 000000000..3de96c0b9 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/main/app_main.c @@ -0,0 +1,135 @@ +/* MQTT over Secure Websockets Example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ +#include +#include +#include +#include +#include "esp_wifi.h" +#include "esp_system.h" +#include "nvs_flash.h" +#include "esp_event.h" +#include "esp_netif.h" +#include "protocol_examples_common.h" + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#include "freertos/queue.h" + +#include "lwip/sockets.h" +#include "lwip/dns.h" +#include "lwip/netdb.h" + +#include "esp_log.h" +#include "mqtt_client.h" + +static const char *TAG = "mqttwss_example"; + + +#if CONFIG_BROKER_CERTIFICATE_OVERRIDDEN == 1 +static const uint8_t mqtt_eclipseprojects_io_pem_start[] = "-----BEGIN CERTIFICATE-----\n" CONFIG_BROKER_CERTIFICATE_OVERRIDE "\n-----END CERTIFICATE-----"; +#else +extern const uint8_t mqtt_eclipseprojects_io_pem_start[] asm("_binary_mqtt_eclipseprojects_io_pem_start"); +#endif +extern const uint8_t mqtt_eclipseprojects_io_pem_end[] asm("_binary_mqtt_eclipseprojects_io_pem_end"); + +static esp_err_t mqtt_event_handler_cb(esp_mqtt_event_handle_t event) +{ + esp_mqtt_client_handle_t client = event->client; + int msg_id; + // your_context_t *context = event->context; + switch (event->event_id) { + case MQTT_EVENT_CONNECTED: + ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED"); + msg_id = esp_mqtt_client_subscribe(client, "/topic/qos0", 0); + ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); + + msg_id = esp_mqtt_client_subscribe(client, "/topic/qos1", 1); + ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); + + msg_id = esp_mqtt_client_unsubscribe(client, "/topic/qos1"); + ESP_LOGI(TAG, "sent unsubscribe successful, msg_id=%d", msg_id); + break; + case MQTT_EVENT_DISCONNECTED: + ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED"); + break; + + case MQTT_EVENT_SUBSCRIBED: + ESP_LOGI(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d, return code=0x%02x ", event->msg_id, (uint8_t)*event->data); + msg_id = esp_mqtt_client_publish(client, "/topic/qos0", "data", 0, 0, 0); + ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id); + break; + case MQTT_EVENT_UNSUBSCRIBED: + ESP_LOGI(TAG, "MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id); + break; + case MQTT_EVENT_PUBLISHED: + ESP_LOGI(TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id); + break; + case MQTT_EVENT_DATA: + ESP_LOGI(TAG, "MQTT_EVENT_DATA"); + printf("TOPIC=%.*s\r\n", event->topic_len, event->topic); + printf("DATA=%.*s\r\n", event->data_len, event->data); + break; + case MQTT_EVENT_ERROR: + ESP_LOGI(TAG, "MQTT_EVENT_ERROR"); + break; + default: + ESP_LOGI(TAG, "Other event id:%d", event->event_id); + break; + } + return ESP_OK; +} + +static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) +{ + /* The argument passed to esp_mqtt_client_register_event can de accessed as handler_args*/ + ESP_LOGD(TAG, "Event dispatched from event loop base=%s, event_id=%" PRIi32, base, event_id); + mqtt_event_handler_cb(event_data); +} + +static void mqtt_app_start(void) +{ + const esp_mqtt_client_config_t mqtt_cfg = { + .broker.address.uri = CONFIG_BROKER_URI, + .broker.verification.certificate = (const char *)mqtt_eclipseprojects_io_pem_start, + }; + + ESP_LOGI(TAG, "[APP] Free memory: %" PRIu32 " bytes", esp_get_free_heap_size()); + esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg); + /* The last argument may be used to pass data to the event handler, in this example mqtt_event_handler */ + esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL); + + esp_mqtt_client_start(client); +} + +void app_main(void) +{ + ESP_LOGI(TAG, "[APP] Startup.."); + ESP_LOGI(TAG, "[APP] Free memory: %" PRIu32 " bytes", esp_get_free_heap_size()); + ESP_LOGI(TAG, "[APP] IDF version: %s", esp_get_idf_version()); + + esp_log_level_set("*", ESP_LOG_INFO); + esp_log_level_set("mqtt_client", ESP_LOG_VERBOSE); + esp_log_level_set("mqtt_example", ESP_LOG_VERBOSE); + esp_log_level_set("transport_base", ESP_LOG_VERBOSE); + esp_log_level_set("transport", ESP_LOG_VERBOSE); + esp_log_level_set("outbox", ESP_LOG_VERBOSE); + + ESP_ERROR_CHECK(nvs_flash_init()); + ESP_ERROR_CHECK(esp_netif_init()); + ESP_ERROR_CHECK(esp_event_loop_create_default()); + + /* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig. + * Read "Establishing Wi-Fi or Ethernet Connection" section in + * examples/protocols/README.md for more information about this function. + */ + ESP_ERROR_CHECK(example_connect()); + + mqtt_app_start(); +} diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/main/idf_component.yml b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/main/idf_component.yml new file mode 100644 index 000000000..808c17483 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/main/idf_component.yml @@ -0,0 +1,5 @@ +dependencies: + espressif/mqtt: + version: '*' + protocol_examples_common: + path: ${IDF_PATH}/examples/common_components/protocol_examples_common diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/main/mqtt_eclipseprojects_io.pem b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/main/mqtt_eclipseprojects_io.pem new file mode 100644 index 000000000..43b222a60 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/main/mqtt_eclipseprojects_io.pem @@ -0,0 +1,30 @@ +-----BEGIN CERTIFICATE----- +MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjAwOTA0MDAwMDAw +WhcNMjUwOTE1MTYwMDAwWjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg +RW5jcnlwdDELMAkGA1UEAxMCUjMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC7AhUozPaglNMPEuyNVZLD+ILxmaZ6QoinXSaqtSu5xUyxr45r+XXIo9cP +R5QUVTVXjJ6oojkZ9YI8QqlObvU7wy7bjcCwXPNZOOftz2nwWgsbvsCUJCWH+jdx +sxPnHKzhm+/b5DtFUkWWqcFTzjTIUu61ru2P3mBw4qVUq7ZtDpelQDRrK9O8Zutm +NHz6a4uPVymZ+DAXXbpyb/uBxa3Shlg9F8fnCbvxK/eG3MHacV3URuPMrSXBiLxg +Z3Vms/EY96Jc5lP/Ooi2R6X/ExjqmAl3P51T+c8B5fWmcBcUr2Ok/5mzk53cU6cG +/kiFHaFpriV1uxPMUgP17VGhi9sVAgMBAAGjggEIMIIBBDAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYB +Af8CAQAwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYfr52LFMLGMB8GA1UdIwQYMBaA +FHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcw +AoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzAnBgNVHR8EIDAeMBygGqAYhhZodHRw +Oi8veDEuYy5sZW5jci5vcmcvMCIGA1UdIAQbMBkwCAYGZ4EMAQIBMA0GCysGAQQB +gt8TAQEBMA0GCSqGSIb3DQEBCwUAA4ICAQCFyk5HPqP3hUSFvNVneLKYY611TR6W +PTNlclQtgaDqw+34IL9fzLdwALduO/ZelN7kIJ+m74uyA+eitRY8kc607TkC53wl +ikfmZW4/RvTZ8M6UK+5UzhK8jCdLuMGYL6KvzXGRSgi3yLgjewQtCPkIVz6D2QQz +CkcheAmCJ8MqyJu5zlzyZMjAvnnAT45tRAxekrsu94sQ4egdRCnbWSDtY7kh+BIm +lJNXoB1lBMEKIq4QDUOXoRgffuDghje1WrG9ML+Hbisq/yFOGwXD9RiX8F6sw6W4 +avAuvDszue5L3sz85K+EC4Y/wFVDNvZo4TYXao6Z0f+lQKc0t8DQYzk1OXVu8rp2 +yJMC6alLbBfODALZvYH7n7do1AZls4I9d1P4jnkDrQoxB3UqQ9hVl3LEKQ73xF1O +yK5GhDDX8oVfGKF5u+decIsH4YaTw7mP3GFxJSqv3+0lUFJoi5Lc5da149p90Ids +hCExroL1+7mryIkXPeFM5TgO9r0rvZaBFOvV2z0gp35Z0+L4WPlbuEjN/lxPFin+ +HlUjr8gRsI3qfJOQFy/9rKIJR0Y/8Omwt/8oTWgy1mdeHmmjk7j1nYsvC9JSQ6Zv +MldlTTKB3zhThV1+XWYp6rjd5JW1zbVWEkLNxE7GJThEUG3szgBVGP7pSWTUTsqX +nLRbwHOoq7hHwg== +-----END CERTIFICATE----- diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/pytest_mqtt_wss_example.py b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/pytest_mqtt_wss_example.py new file mode 100644 index 000000000..cb4a22e37 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/pytest_mqtt_wss_example.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python +# +# SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: Unlicense OR CC0-1.0 +import logging +import os +import re +import ssl +import sys +from threading import Event +from threading import Thread + +import paho.mqtt.client as mqtt +import pexpect +import pytest +from pytest_embedded import Dut +from pytest_embedded_idf.utils import idf_parametrize + +event_client_connected = Event() +event_stop_client = Event() +event_client_received_correct = Event() +message_log = '' + + +# The callback for when the client receives a CONNACK response from the server. +def on_connect(client, userdata, flags, rc): # type: (mqtt.Client, tuple, bool, str) -> None + _ = (userdata, flags) + print('Connected with result code ' + str(rc)) + event_client_connected.set() + client.subscribe('/topic/qos0') + + +def mqtt_client_task(client): # type: (mqtt.Client) -> None + while not event_stop_client.is_set(): + client.loop() + + +# The callback for when a PUBLISH message is received from the server. +def on_message(client, userdata, msg): # type: (mqtt.Client, tuple, mqtt.client.MQTTMessage) -> None + _ = userdata + global message_log + payload = msg.payload.decode() + if not event_client_received_correct.is_set() and payload == 'data': + client.publish('/topic/qos0', 'data_to_esp32') + if msg.topic == '/topic/qos0' and payload == 'data': + event_client_received_correct.set() + message_log += 'Received data:' + msg.topic + ' ' + payload + '\n' + + +@pytest.mark.ethernet +@idf_parametrize('target', ['esp32'], indirect=['target']) +def test_examples_protocol_mqtt_wss(dut): # type: (Dut) -> None + broker_url = '' + broker_port = 0 + """ + steps: | + 1. join AP and connects to wss broker + 2. Test connects a client to the same broker + 3. Test evaluates it received correct qos0 message + 4. Test ESP32 client received correct qos0 message + """ + # check and log bin size + binary_file = os.path.join(dut.app.binary_path, 'mqtt_websocket_secure.bin') + bin_size = os.path.getsize(binary_file) + logging.info('[Performance][mqtt_websocket_secure_bin_size]: %s KB', bin_size // 1024) + # Look for host:port in sdkconfig + try: + value = re.search(r'\:\/\/([^:]+)\:([0-9]+)', dut.app.sdkconfig.get('BROKER_URI')) + assert value is not None + broker_url = value.group(1) + broker_port = int(value.group(2)) + except Exception: + print('ENV_TEST_FAILURE: Cannot find broker url in sdkconfig') + raise + client = None + # 1. Test connects to a broker + try: + client = mqtt.Client(transport='websockets') + client.on_connect = on_connect + client.on_message = on_message + client.tls_set(None, None, None, cert_reqs=ssl.CERT_NONE, tls_version=ssl.PROTOCOL_TLSv1_2, ciphers=None) + print('Connecting...') + client.connect(broker_url, broker_port, 60) + except Exception: + print( + 'ENV_TEST_FAILURE: Unexpected error while connecting to broker {}: {}:'.format( + broker_url, sys.exc_info()[0] + ) + ) + raise + # Starting a py-client in a separate thread + thread1 = Thread(target=mqtt_client_task, args=(client,)) + thread1.start() + try: + print('Connecting py-client to broker {}:{}...'.format(broker_url, broker_port)) + if not event_client_connected.wait(timeout=30): + raise ValueError('ENV_TEST_FAILURE: Test script cannot connect to broker: {}'.format(broker_url)) + try: + ip_address = dut.expect(r'IPv4 address: (\d+\.\d+\.\d+\.\d+)[^\d]', timeout=30)[0] + print('Connected to AP with IP: {}'.format(ip_address)) + except pexpect.TIMEOUT: + print('ENV_TEST_FAILURE: Cannot connect to AP') + raise + print('Checking py-client received msg published from esp...') + if not event_client_received_correct.wait(timeout=30): + raise ValueError('Wrong data received, msg log: {}'.format(message_log)) + print('Checking esp-client received msg published from py-client...') + dut.expect(r'DATA=data_to_esp32', timeout=30) + finally: + event_stop_client.set() + thread1.join() diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/sdkconfig.ci b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/sdkconfig.ci new file mode 100644 index 000000000..c8e8ef94a --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/examples/wss/sdkconfig.ci @@ -0,0 +1,13 @@ +CONFIG_BROKER_URI="wss://${EXAMPLE_MQTT_BROKER_WSS}/ws" +CONFIG_BROKER_CERTIFICATE_OVERRIDE="${EXAMPLE_MQTT_BROKER_CERTIFICATE}" +CONFIG_EXAMPLE_CONNECT_ETHERNET=y +CONFIG_EXAMPLE_CONNECT_WIFI=n +CONFIG_EXAMPLE_USE_INTERNAL_ETHERNET=y +CONFIG_EXAMPLE_ETH_PHY_IP101=y +CONFIG_EXAMPLE_ETH_MDC_GPIO=23 +CONFIG_EXAMPLE_ETH_MDIO_GPIO=18 +CONFIG_EXAMPLE_ETH_PHY_RST_GPIO=5 +CONFIG_EXAMPLE_ETH_PHY_ADDR=1 +CONFIG_EXAMPLE_CONNECT_IPV6=y +CONFIG_LWIP_TCPIP_CORE_LOCKING=y +CONFIG_LWIP_CHECK_THREAD_SAFETY=y diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/idf_component.yml b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/idf_component.yml new file mode 100644 index 000000000..9bcfaee62 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/idf_component.yml @@ -0,0 +1,18 @@ +dependencies: + idf: + version: '>=5.3' +description: ESP-MQTT - A robust MQTT client library for ESP32 microcontrollers supporting + MQTT 3.1.1 and 5.0 protocols with multiple transport layers +documentation: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/protocols/mqtt.html +issues: https://github.com/espressif/esp-mqtt/issues +license: Apache-2.0 +maintainers: +- Espressif Systems +repository: https://github.com/espressif/esp-mqtt +tags: +- mqtt +- mqtt5 +- protocol +- networking +url: https://github.com/espressif/esp-mqtt +version: 1.0.0 diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/include/mqtt5_client.h b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/include/mqtt5_client.h new file mode 100644 index 000000000..25254c410 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/include/mqtt5_client.h @@ -0,0 +1,286 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef _MQTT5_CLIENT_H_ +#define _MQTT5_CLIENT_H_ + +#include "mqtt_client.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct esp_mqtt_client *esp_mqtt5_client_handle_t; + +/** + * MQTT5 protocol error reason code, more details refer to MQTT5 protocol document section 2.4 + */ +typedef enum mqtt5_error_reason_code_t { + MQTT5_UNSPECIFIED_ERROR = 0x80, + MQTT5_MALFORMED_PACKET = 0x81, + MQTT5_PROTOCOL_ERROR = 0x82, + MQTT5_IMPLEMENT_SPECIFIC_ERROR = 0x83, + MQTT5_UNSUPPORTED_PROTOCOL_VER = 0x84, + MQTT5_INVAILD_CLIENT_ID __attribute__((deprecated)) = 0x85, + MQTT5_INVALID_CLIENT_ID = 0x85, + MQTT5_BAD_USERNAME_OR_PWD = 0x86, + MQTT5_NOT_AUTHORIZED = 0x87, + MQTT5_SERVER_UNAVAILABLE = 0x88, + MQTT5_SERVER_BUSY = 0x89, + MQTT5_BANNED = 0x8A, + MQTT5_SERVER_SHUTTING_DOWN = 0x8B, + MQTT5_BAD_AUTH_METHOD = 0x8C, + MQTT5_KEEP_ALIVE_TIMEOUT = 0x8D, + MQTT5_SESSION_TAKEN_OVER = 0x8E, + MQTT5_TOPIC_FILTER_INVAILD __attribute__((deprecated)) = 0x8F, + MQTT5_TOPIC_FILTER_INVALID = 0x8F, + MQTT5_TOPIC_NAME_INVAILD __attribute__((deprecated)) = 0x90, + MQTT5_TOPIC_NAME_INVALID = 0x90, + MQTT5_PACKET_IDENTIFIER_IN_USE = 0x91, + MQTT5_PACKET_IDENTIFIER_NOT_FOUND = 0x92, + MQTT5_RECEIVE_MAXIMUM_EXCEEDED = 0x93, + MQTT5_TOPIC_ALIAS_INVAILD __attribute__((deprecated)) = 0x94, + MQTT5_TOPIC_ALIAS_INVALID = 0x94, + MQTT5_PACKET_TOO_LARGE = 0x95, + MQTT5_MESSAGE_RATE_TOO_HIGH = 0x96, + MQTT5_QUOTA_EXCEEDED = 0x97, + MQTT5_ADMINISTRATIVE_ACTION = 0x98, + MQTT5_PAYLOAD_FORMAT_INVAILD __attribute__((deprecated)) = 0x99, + MQTT5_PAYLOAD_FORMAT_INVALID = 0x99, + MQTT5_RETAIN_NOT_SUPPORT = 0x9A, + MQTT5_QOS_NOT_SUPPORT = 0x9B, + MQTT5_USE_ANOTHER_SERVER = 0x9C, + MQTT5_SERVER_MOVED = 0x9D, + MQTT5_SHARED_SUBSCR_NOT_SUPPORTED = 0x9E, + MQTT5_CONNECTION_RATE_EXCEEDED = 0x9F, + MQTT5_MAXIMUM_CONNECT_TIME = 0xA0, + MQTT5_SUBSCRIBE_IDENTIFIER_NOT_SUPPORT = 0xA1, + MQTT5_WILDCARD_SUBSCRIBE_NOT_SUPPORT = 0xA2, +} esp_mqtt5_error_reason_code_t; + +/** + * MQTT5 user property handle + */ +typedef struct mqtt5_user_property_list_t *mqtt5_user_property_handle_t; + +/** + * MQTT5 protocol connect properties and will properties configuration, more details refer to MQTT5 protocol document section 3.1.2.11 and 3.3.2.3 + */ +typedef struct { + uint32_t session_expiry_interval; /*!< The interval time of session expiry */ + uint32_t maximum_packet_size; /*!< The maximum packet size that we can receive */ + uint16_t receive_maximum; /*!< The maximum pakcket count that we process concurrently */ + uint16_t topic_alias_maximum; /*!< The maximum topic alias that we support */ + bool request_resp_info; /*!< This value to request Server to return Response information */ + bool request_problem_info; /*!< This value to indicate whether the reason string or user properties are sent in case of failures */ + mqtt5_user_property_handle_t user_property; /*!< The handle for user property, call function esp_mqtt5_client_set_user_property to set it */ + uint32_t will_delay_interval; /*!< The time interval that server delays publishing will message */ + uint32_t message_expiry_interval; /*!< The time interval that message expiry */ + bool payload_format_indicator; /*!< This value is to indicator will message payload format */ + const char *content_type; /*!< This value is to indicator will message content type, use a MIME content type string */ + const char *response_topic; /*!< Topic name for a response message */ + const char *correlation_data; /*!< Binary data for receiver to match the response message */ + uint16_t correlation_data_len; /*!< The length of correlation data */ + mqtt5_user_property_handle_t will_user_property; /*!< The handle for will message user property, call function esp_mqtt5_client_set_user_property to set it */ +} esp_mqtt5_connection_property_config_t; + +/** + * MQTT5 protocol publish properties configuration, more details refer to MQTT5 protocol document section 3.3.2.3 + */ +typedef struct { + bool payload_format_indicator; /*!< This value is to indicator publish message payload format */ + uint32_t message_expiry_interval; /*!< The time interval that message expiry */ + uint16_t topic_alias; /*!< An interger value to identify the topic instead of using topic name string */ + const char *response_topic; /*!< Topic name for a response message */ + const char *correlation_data; /*!< Binary data for receiver to match the response message */ + uint16_t correlation_data_len; /*!< The length of correlation data */ + const char *content_type; /*!< This value is to indicator publish message content type, use a MIME content type string */ + mqtt5_user_property_handle_t user_property; /*!< The handle for user property, call function esp_mqtt5_client_set_user_property to set it */ +} esp_mqtt5_publish_property_config_t; + +/** + * MQTT5 protocol subscribe properties configuration, more details refer to MQTT5 protocol document section 3.8.2.1 + */ +typedef struct { + uint16_t subscribe_id; /*!< A variable byte represents the identifier of the subscription */ + bool no_local_flag; /*!< Subscription Option to allow that server publish message that client sent */ + bool retain_as_published_flag; /*!< Subscription Option to keep the retain flag as published option */ + uint8_t retain_handle; /*!< Subscription Option to handle retain option */ + bool is_share_subscribe; /*!< Whether subscribe is a shared subscription */ + const char *share_name; /*!< The name of shared subscription which is a part of $share/{share_name}/{topic} */ + mqtt5_user_property_handle_t user_property; /*!< The handle for user property, call function esp_mqtt5_client_set_user_property to set it */ +} esp_mqtt5_subscribe_property_config_t; + +/** + * MQTT5 protocol unsubscribe properties configuration, more details refer to MQTT5 protocol document section 3.10.2.1 + */ +typedef struct { + bool is_share_subscribe; /*!< Whether subscribe is a shared subscription */ + const char *share_name; /*!< The name of shared subscription which is a part of $share/{share_name}/{topic} */ + mqtt5_user_property_handle_t user_property; /*!< The handle for user property, call function esp_mqtt5_client_set_user_property to set it */ +} esp_mqtt5_unsubscribe_property_config_t; + +/** + * MQTT5 protocol disconnect properties configuration, more details refer to MQTT5 protocol document section 3.14.2.2 + */ +typedef struct { + uint32_t session_expiry_interval; /*!< The interval time of session expiry */ + uint8_t disconnect_reason; /*!< The reason that connection disconnet, refer to mqtt5_error_reason_code */ + mqtt5_user_property_handle_t user_property; /*!< The handle for user property, call function esp_mqtt5_client_set_user_property to set it */ +} esp_mqtt5_disconnect_property_config_t; + +/** + * MQTT5 protocol for event properties + */ +typedef struct { + bool payload_format_indicator; /*!< Payload format of the message */ + char *response_topic; /*!< Response topic of the message */ + int response_topic_len; /*!< Response topic length of the message */ + char *correlation_data; /*!< Correlation data of the message */ + uint16_t correlation_data_len; /*!< Correlation data length of the message */ + char *content_type; /*!< Content type of the message */ + int content_type_len; /*!< Content type length of the message */ + uint16_t subscribe_id; /*!< Subscription identifier of the message */ + mqtt5_user_property_handle_t user_property; /*!< The handle for user property, call function esp_mqtt5_client_delete_user_property to free the memory */ +} esp_mqtt5_event_property_t; + +/** + * MQTT5 protocol for user property + */ +typedef struct { + const char *key; /*!< Item key name */ + const char *value; /*!< Item value string */ +} esp_mqtt5_user_property_item_t; + +/** + * @brief Set MQTT5 client connect property configuration + * + * @param client mqtt client handle + * @param connect_property connect property + * + * @return ESP_ERR_NO_MEM if failed to allocate + * ESP_ERR_INVALID_ARG on wrong initialization + * ESP_FAIL on fail + * ESP_OK on success + */ +esp_err_t esp_mqtt5_client_set_connect_property(esp_mqtt5_client_handle_t client, const esp_mqtt5_connection_property_config_t *connect_property); + +/** + * @brief Set MQTT5 client publish property configuration + * + * This API will not store the publish property, it is one-time configuration. + * Before call `esp_mqtt_client_publish` to publish data, call this API to set publish property if have + * + * @param client mqtt client handle + * @param property publish property + * + * @return ESP_ERR_INVALID_ARG on wrong initialization + * ESP_FAIL on fail + * ESP_OK on success + */ +esp_err_t esp_mqtt5_client_set_publish_property(esp_mqtt5_client_handle_t client, const esp_mqtt5_publish_property_config_t *property); + +/** + * @brief Set MQTT5 client subscribe property configuration + * + * This API will not store the subscribe property, it is one-time configuration. + * Before call `esp_mqtt_client_subscribe` to subscribe topic, call this API to set subscribe property if have + * + * @param client mqtt client handle + * @param property subscribe property + * + * @return ESP_ERR_INVALID_ARG on wrong initialization + * ESP_FAIL on fail + * ESP_OK on success + */ +esp_err_t esp_mqtt5_client_set_subscribe_property(esp_mqtt5_client_handle_t client, const esp_mqtt5_subscribe_property_config_t *property); + +/** + * @brief Set MQTT5 client unsubscribe property configuration + * + * This API will not store the unsubscribe property, it is one-time configuration. + * Before call `esp_mqtt_client_unsubscribe` to unsubscribe topic, call this API to set unsubscribe property if have + * + * @param client mqtt client handle + * @param property unsubscribe property + * + * @return ESP_ERR_INVALID_ARG on wrong initialization + * ESP_FAIL on fail + * ESP_OK on success + */ +esp_err_t esp_mqtt5_client_set_unsubscribe_property(esp_mqtt5_client_handle_t client, const esp_mqtt5_unsubscribe_property_config_t *property); + +/** + * @brief Set MQTT5 client disconnect property configuration + * + * This API will not store the disconnect property, it is one-time configuration. + * Before call `esp_mqtt_client_disconnect` to disconnect connection, call this API to set disconnect property if have + * + * @param client mqtt client handle + * @param property disconnect property + * + * @return ESP_ERR_NO_MEM if failed to allocate + * ESP_ERR_INVALID_ARG on wrong initialization + * ESP_FAIL on fail + * ESP_OK on success + */ +esp_err_t esp_mqtt5_client_set_disconnect_property(esp_mqtt5_client_handle_t client, const esp_mqtt5_disconnect_property_config_t *property); + +/** + * @brief Set MQTT5 client user property configuration + * + * This API will allocate memory for user_property, please DO NOT forget `call esp_mqtt5_client_delete_user_property` + * after you use it. + * Before publish data, subscribe topic, unsubscribe, etc, call this API to set user property if have + * + * @param user_property user_property handle + * @param item array of user property data (eg. {{"var","val"},{"other","2"}}) + * @param item_num number of items in user property data + * + * @return ESP_ERR_NO_MEM if failed to allocate + * ESP_FAIL on fail + * ESP_OK on success + */ +esp_err_t esp_mqtt5_client_set_user_property(mqtt5_user_property_handle_t *user_property, esp_mqtt5_user_property_item_t item[], uint8_t item_num); + +/** + * @brief Get MQTT5 client user property + * + * @param user_property user_property handle + * @param item point that store user property data + * @param item_num number of items in user property data + * + * This API can use with `esp_mqtt5_client_get_user_property_count` to get list count of user property. + * And malloc number of count item array memory to store the user property data. + * Please DO NOT forget the item memory, key and value point in item memory when get user property data successfully. + * + * @return ESP_ERR_NO_MEM if failed to allocate + * ESP_FAIL on fail + * ESP_OK on success + */ +esp_err_t esp_mqtt5_client_get_user_property(mqtt5_user_property_handle_t user_property, esp_mqtt5_user_property_item_t *item, uint8_t *item_num); + +/** + * @brief Get MQTT5 client user property list count + * + * @param user_property user_property handle + * @return user property list count + */ +uint8_t esp_mqtt5_client_get_user_property_count(mqtt5_user_property_handle_t user_property); + +/** + * @brief Free the user property list + * + * @param user_property user_property handle + * + * This API will free the memory in user property list and free user_property itself + */ +void esp_mqtt5_client_delete_user_property(mqtt5_user_property_handle_t user_property); +#ifdef __cplusplus +} +#endif //__cplusplus + +#endif diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/include/mqtt_client.h b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/include/mqtt_client.h new file mode 100644 index 000000000..4627585bc --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/include/mqtt_client.h @@ -0,0 +1,704 @@ +/* + * This file is subject to the terms and conditions defined in + * file 'LICENSE', which is part of this source code package. + * Tuan PM + */ + +#ifndef _MQTT_CLIENT_H_ +#define _MQTT_CLIENT_H_ + +#include +#include +#include +#include "esp_err.h" +#include "esp_event.h" +#include "esp_transport.h" +#ifdef CONFIG_MQTT_PROTOCOL_5 +#include "mqtt5_client.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef ESP_EVENT_DECLARE_BASE +// Define event loop types if macros not available +typedef void *esp_event_loop_handle_t; +typedef void *esp_event_handler_t; +#endif + +typedef struct esp_mqtt_client *esp_mqtt_client_handle_t; + +#define MQTT_OVER_TCP_SCHEME "mqtt" +#define MQTT_OVER_SSL_SCHEME "mqtts" +#define MQTT_OVER_WS_SCHEME "ws" +#define MQTT_OVER_WSS_SCHEME "wss" + +/** + * @brief *MQTT* event types. + * + * User event handler receives context data in `esp_mqtt_event_t` structure with + * - client - *MQTT* client handle + * - various other data depending on event type + * + */ +typedef enum esp_mqtt_event_id_t { + MQTT_EVENT_ANY = -1, + MQTT_EVENT_ERROR = + 0, /*!< on error event, additional context: connection return code, error + handle from esp_tls (if supported) */ + MQTT_EVENT_CONNECTED, /*!< connected event, additional context: + session_present flag */ + MQTT_EVENT_DISCONNECTED, /*!< disconnected event */ + MQTT_EVENT_SUBSCRIBED, /*!< subscribed event, additional context: + - msg_id message id + - error_handle `error_type` in case subscribing failed + - data pointer to broker response, check for errors. + - data_len length of the data for this + event + */ + MQTT_EVENT_UNSUBSCRIBED, /*!< unsubscribed event, additional context: msg_id */ + MQTT_EVENT_PUBLISHED, /*!< published event, additional context: msg_id */ + MQTT_EVENT_DATA, /*!< data event, additional context: + - msg_id message id + - topic pointer to the received topic + - topic_len length of the topic + - data pointer to the received data + - data_len length of the data for this event + - current_data_offset offset of the current data for + this event + - total_data_len total length of the data received + - retain retain flag of the message + - qos QoS level of the message + - dup dup flag of the message + Note: Multiple MQTT_EVENT_DATA could be fired for one + message, if it is longer than internal buffer. In that + case only first event contains topic pointer and length, + other contain data only with current data length and + current data offset updating. + */ + MQTT_EVENT_BEFORE_CONNECT, /*!< The event occurs before connecting */ + MQTT_EVENT_DELETED, /*!< Notification on delete of one message from the + internal outbox, if the message couldn't have been sent + or acknowledged before expiring defined in + OUTBOX_EXPIRED_TIMEOUT_MS. (events are not posted upon + deletion of successfully acknowledged messages) + - This event id is posted only if + MQTT_REPORT_DELETED_MESSAGES==1 + - Additional context: msg_id (id of the deleted + message, always 0 for QoS = 0 messages). + */ + MQTT_USER_EVENT, /*!< Custom event used to queue tasks into mqtt event handler + All fields from the esp_mqtt_event_t type could be used to pass + an additional context data to the handler. + */ +} esp_mqtt_event_id_t; + +/** + * *MQTT* connection error codes propagated via ERROR event + */ +typedef enum esp_mqtt_connect_return_code_t { + MQTT_CONNECTION_ACCEPTED = 0, /*!< Connection accepted */ + MQTT_CONNECTION_REFUSE_PROTOCOL, /*!< *MQTT* connection refused reason: Wrong + protocol */ + MQTT_CONNECTION_REFUSE_ID_REJECTED, /*!< *MQTT* connection refused reason: ID + rejected */ + MQTT_CONNECTION_REFUSE_SERVER_UNAVAILABLE, /*!< *MQTT* connection refused + reason: Server unavailable */ + MQTT_CONNECTION_REFUSE_BAD_USERNAME, /*!< *MQTT* connection refused reason: + Wrong user */ + MQTT_CONNECTION_REFUSE_NOT_AUTHORIZED /*!< *MQTT* connection refused reason: + Wrong username or password */ +} esp_mqtt_connect_return_code_t; + +/** + * *MQTT* connection error codes propagated via ERROR event + */ +typedef enum esp_mqtt_error_type_t { + MQTT_ERROR_TYPE_NONE = 0, + MQTT_ERROR_TYPE_TCP_TRANSPORT, + MQTT_ERROR_TYPE_CONNECTION_REFUSED, + MQTT_ERROR_TYPE_SUBSCRIBE_FAILED +} esp_mqtt_error_type_t; + +/** + * MQTT_ERROR_TYPE_TCP_TRANSPORT error type hold all sorts of transport layer + * errors, including ESP-TLS error, but in the past only the errors from + * MQTT_ERROR_TYPE_ESP_TLS layer were reported, so the ESP-TLS error type is + * re-defined here for backward compatibility + */ +#define MQTT_ERROR_TYPE_ESP_TLS MQTT_ERROR_TYPE_TCP_TRANSPORT + +typedef enum esp_mqtt_transport_t { + MQTT_TRANSPORT_UNKNOWN = 0x0, + MQTT_TRANSPORT_OVER_TCP, /*!< *MQTT* over TCP, using scheme: ``MQTT`` */ + MQTT_TRANSPORT_OVER_SSL, /*!< *MQTT* over SSL, using scheme: ``MQTTS`` */ + MQTT_TRANSPORT_OVER_WS, /*!< *MQTT* over Websocket, using scheme:: ``ws`` */ + MQTT_TRANSPORT_OVER_WSS /*!< *MQTT* over Websocket Secure, using scheme: + ``wss`` */ +} esp_mqtt_transport_t; + +/** + * *MQTT* protocol version used for connection + */ +typedef enum esp_mqtt_protocol_ver_t { + MQTT_PROTOCOL_UNDEFINED = 0, + MQTT_PROTOCOL_V_3_1, + MQTT_PROTOCOL_V_3_1_1, + MQTT_PROTOCOL_V_5, +} esp_mqtt_protocol_ver_t; + +/** + * @brief *MQTT* error code structure to be passed as a contextual information + * into ERROR event + * + * Important: This structure extends `esp_tls_last_error` error structure and is + * backward compatible with it (so might be down-casted and treated as + * `esp_tls_last_error` error, but recommended to update applications if used + * this way previously) + * + * Use this structure directly checking error_type first and then appropriate + * error code depending on the source of the error: + * + * | error_type | related member variables | note | + * | MQTT_ERROR_TYPE_TCP_TRANSPORT | esp_tls_last_esp_err, esp_tls_stack_err, + * esp_tls_cert_verify_flags, sock_errno | Error reported from + * tcp_transport/esp-tls | | MQTT_ERROR_TYPE_CONNECTION_REFUSED | + * connect_return_code | Internal error reported from *MQTT* broker on + * connection | + */ +typedef struct esp_mqtt_error_codes { + /* compatible portion of the struct corresponding to struct esp_tls_last_error + */ + esp_err_t esp_tls_last_esp_err; /*!< last esp_err code reported from esp-tls + component */ + int esp_tls_stack_err; /*!< tls specific error code reported from underlying + tls stack */ + int esp_tls_cert_verify_flags; /*!< tls flags reported from underlying tls + stack during certificate verification */ + /* esp-mqtt specific structure extension */ + esp_mqtt_error_type_t + error_type; /*!< error type referring to the source of the error */ + esp_mqtt_connect_return_code_t + connect_return_code; /*!< connection refused error code reported from + *MQTT* broker on connection */ +#ifdef CONFIG_MQTT_PROTOCOL_5 + esp_mqtt5_error_reason_code_t + disconnect_return_code; /*!< disconnection reason code reported from + *MQTT* broker on disconnection */ +#endif + /* tcp_transport extension */ + int esp_transport_sock_errno; /*!< errno from the underlying socket */ + +} esp_mqtt_error_codes_t; + +/** + * *MQTT* event configuration structure + */ +typedef struct esp_mqtt_event_t { + esp_mqtt_event_id_t event_id; /*!< *MQTT* event type */ + esp_mqtt_client_handle_t client; /*!< *MQTT* client handle for this event */ + char *data; /*!< Data associated with this event */ + int data_len; /*!< Length of the data for this event */ + int total_data_len; /*!< Total length of the data (longer data are supplied + with multiple events) */ + int current_data_offset; /*!< Actual offset for the data associated with this + event */ + char *topic; /*!< Topic associated with this event */ + int topic_len; /*!< Length of the topic for this event associated with this + event */ + int msg_id; /*!< *MQTT* messaged id of message */ + int session_present; /*!< *MQTT* session_present flag for connection event */ + esp_mqtt_error_codes_t + *error_handle; /*!< esp-mqtt error handle including esp-tls errors as well + as internal *MQTT* errors */ + bool retain; /*!< Retained flag of the message associated with this event */ + int qos; /*!< QoS of the messages associated with this event */ + bool dup; /*!< dup flag of the message associated with this event */ + esp_mqtt_protocol_ver_t protocol_ver; /*!< MQTT protocol version used for connection, defaults to value from menuconfig*/ +#ifdef CONFIG_MQTT_PROTOCOL_5 + esp_mqtt5_event_property_t *property; /*!< MQTT 5 property associated with this event */ +#endif + +} esp_mqtt_event_t; + +typedef esp_mqtt_event_t *esp_mqtt_event_handle_t; + +/** + * *MQTT* client configuration structure + * + * - Default values can be set via menuconfig + * - All certificates and key data could be passed in PEM or DER format. PEM format must have a terminating NULL + * character and the related len field set to 0. DER format requires a related len field set to the correct length. + */ +typedef struct esp_mqtt_client_config_t { + /** + * Broker related configuration + */ + struct broker_t { + /** + * Broker address + * + * - uri have precedence over other fields + * - If uri isn't set at least hostname, transport and port should. + */ + struct address_t { + const char *uri; /*!< Complete *MQTT* broker URI */ + const char *hostname; /*!< Hostname, to set ipv4 pass it as string) */ + esp_mqtt_transport_t transport; /*!< Selects transport*/ + const char *path; /*!< Path in the URI*/ + uint32_t port; /*!< *MQTT* server port */ + } address; /*!< Broker address configuration */ + /** + * Broker identity verification + * + * If fields are not set broker's identity isn't verified. it's recommended + * to set the options in this struct for security reasons. + */ + struct verification_t { + bool use_global_ca_store; /*!< Use a global ca_store, look esp-tls + documentation for details. */ + esp_err_t (*crt_bundle_attach)(void *conf); /*!< Pointer to ESP x509 Certificate Bundle attach function for + the usage of certificate bundles. Client only attach the bundle, the clean up must be done by the user. */ + const char *certificate; /*!< Certificate data, default is NULL. It's not copied nor freed by the client, user needs to clean up.*/ + size_t certificate_len; /*!< Length of the buffer pointed to by certificate. */ + const struct psk_key_hint *psk_hint_key; /*!< Pointer to PSK struct defined in esp_tls.h to enable PSK + authentication (as alternative to certificate verification). + PSK is enabled only if there are no other ways to + verify broker. It's not copied nor freed by the client, user needs to clean up.*/ + bool skip_cert_common_name_check; /*!< Skip any validation of server certificate CN field, this reduces the + security of TLS and makes the *MQTT* client susceptible to MITM attacks */ + const char **alpn_protos; /*!< NULL-terminated list of supported application protocols to be used for ALPN.*/ + const char *common_name; /*!< Pointer to the string containing server certificate common name. + If non-NULL, server certificate CN must match this name, + If NULL, server certificate CN must match hostname. + This is ignored if skip_cert_common_name_check=true. + It's not copied nor freed by the client, user needs to clean up.*/ + const int *ciphersuites_list; /*!< Pointer to a zero-terminated array of IANA identifiers of TLS cipher suites. + Please ensure the validity of the list, and note that it is not copied or freed by the client. */ + } verification; /*!< Security verification of the broker */ + } broker; /*!< Broker address and security verification */ + /** + * Client related credentials for authentication. + */ + struct credentials_t { + const char *username; /*!< *MQTT* username */ + const char *client_id; /*!< Set *MQTT* client identifier. Ignored if set_null_client_id == true If NULL set + the default client id. Default client id is ``ESP32_%CHIPID%`` where `%CHIPID%` are + last 3 bytes of MAC address in hex format */ + bool set_null_client_id; /*!< Selects a NULL client id */ + /** + * Client authentication + * + * Fields related to client authentication by broker + * + * For mutual authentication using TLS, user could select certificate and key, + * secure element or digital signature peripheral if available. + * + */ + struct authentication_t { + const char *password; /*!< *MQTT* password */ + const char *certificate; /*!< Certificate for ssl mutual authentication, not required if mutual + authentication is not needed. Must be provided with `key`. It's not copied nor freed by the client, user needs to clean up.*/ + size_t certificate_len; /*!< Length of the buffer pointed to by certificate.*/ + const char *key; /*!< Private key for SSL mutual authentication, not required if mutual authentication + is not needed. If it is not NULL, also `certificate` has to be provided. It's not copied nor freed by the client, user needs to clean up.*/ + size_t key_len; /*!< Length of the buffer pointed to by key.*/ + const char *key_password; /*!< Client key decryption password, not PEM nor DER, if provided + `key_password_len` must be correctly set.*/ + int key_password_len; /*!< Length of the password pointed to by `key_password` */ + bool use_secure_element; /*!< Enable secure element, available in ESP32-ROOM-32SE, for SSL connection */ + void *ds_data; /*!< Carrier of handle for digital signature parameters, digital signature peripheral is + available in some Espressif devices. It's not copied nor freed by the client, user needs to clean up.*/ + bool use_ecdsa_peripheral; /*!< Enable ECDSA peripheral, available in some Espressif devices. */ + uint8_t ecdsa_key_efuse_blk; /*!< ECDSA key block number from efuse, available in some Espressif devices. */ + } authentication; /*!< Client authentication */ + } credentials; /*!< User credentials for broker */ + /** + * *MQTT* Session related configuration + */ + struct session_t { + /** + * Last Will and Testament message configuration. + */ + struct last_will_t { + const char *topic; /*!< LWT (Last Will and Testament) message topic */ + const char *msg; /*!< LWT message, may be NULL terminated*/ + int msg_len; /*!< LWT message length, if msg isn't NULL terminated must have the correct length */ + int qos; /*!< LWT message QoS */ + int retain; /*!< LWT retained message flag */ + } last_will; /*!< Last will configuration */ + bool disable_clean_session; /*!< *MQTT* clean session, default clean_session is true */ + int keepalive; /*!< *MQTT* keepalive, default is 120 seconds + When configuring this value, keep in mind that the client attempts + to communicate with the broker at half the interval that is actually set. + This conservative approach allows for more attempts before the broker's timeout occurs */ + bool disable_keepalive; /*!< Set `disable_keepalive=true` to turn off keep-alive mechanism, keepalive is active + by default. Note: setting the config value `keepalive` to `0` doesn't disable + keepalive feature, but uses a default keepalive period */ + esp_mqtt_protocol_ver_t protocol_ver; /*!< *MQTT* protocol version used for connection.*/ + int message_retransmit_timeout; /*!< timeout for retransmitting of failed packet */ + } session; /*!< *MQTT* session configuration. */ + /** + * Network related configuration + */ + struct network_t { + int reconnect_timeout_ms; /*!< Reconnect to the broker after this value in miliseconds if auto reconnect is not + disabled (defaults to 10s) */ + int timeout_ms; /*!< Abort network operation if it is not completed after this value, in milliseconds + (defaults to 10s). */ + int refresh_connection_after_ms; /*!< Refresh connection after this value (in milliseconds) */ + bool disable_auto_reconnect; /*!< Client will reconnect to server (when errors/disconnect). Set + `disable_auto_reconnect=true` to disable */ + esp_transport_keep_alive_t tcp_keep_alive_cfg; /*!< Transport keep-alive config*/ + esp_transport_handle_t transport; /*!< Custom transport handle to use, leave it NULL to allow MQTT client create or recreate its own. Warning: The transport should be valid during the client lifetime and is destroyed when esp_mqtt_client_destroy is called. */ + struct ifreq * if_name; /*!< The name of interface for data to go through. Use the default interface without setting */ + } network; /*!< Network configuration */ + /** + * Client task configuration + */ + struct task_t { + int priority; /*!< *MQTT* task priority*/ + int stack_size; /*!< *MQTT* task stack size*/ + } task; /*!< FreeRTOS task configuration.*/ + /** + * Client buffer size configuration + * + * Client have two buffers for input and output respectivelly. + */ + struct buffer_t { + int size; /*!< size of *MQTT* send/receive buffer*/ + int out_size; /*!< size of *MQTT* output buffer. If not defined, defaults to the size defined by + ``buffer_size`` */ + } buffer; /*!< Buffer size configuration.*/ + + /** + * Client outbox configuration options. + */ + struct outbox_config_t { + uint64_t limit; /*!< Size limit for the outbox in bytes.*/ + } outbox; /*!< Outbox configuration. */ +} esp_mqtt_client_config_t; + +/** + * Topic definition struct + */ +typedef struct topic_t { + const char *filter; /*!< Topic filter to subscribe */ + int qos; /*!< Max QoS level of the subscription */ +} esp_mqtt_topic_t; + +/** + * @brief Creates *MQTT* client handle based on the configuration + * + * @param config *MQTT* configuration structure + * + * @return mqtt_client_handle if successfully created, NULL on error + */ +esp_mqtt_client_handle_t +esp_mqtt_client_init(const esp_mqtt_client_config_t *config); + +/** + * @brief Sets *MQTT* connection URI. This API is usually used to overrides the + * URI configured in esp_mqtt_client_init + * + * @param client *MQTT* client handle + * @param uri + * + * @return ESP_FAIL if URI parse error, ESP_OK on success + */ +esp_err_t esp_mqtt_client_set_uri(esp_mqtt_client_handle_t client, + const char *uri); + +/** + * @brief Starts *MQTT* client with already created client handle + * + * @param client *MQTT* client handle + * + * @return ESP_OK on success + * ESP_ERR_INVALID_ARG on wrong initialization + * ESP_FAIL on other error + */ +esp_err_t esp_mqtt_client_start(esp_mqtt_client_handle_t client); + +/** + * @brief This api is typically used to force reconnection upon a specific event + * + * @param client *MQTT* client handle + * + * @return ESP_OK on success + * ESP_ERR_INVALID_ARG on wrong initialization + * ESP_FAIL if client is in invalid state + */ +esp_err_t esp_mqtt_client_reconnect(esp_mqtt_client_handle_t client); + +/** + * @brief This api is typically used to force disconnection from the broker + * + * @param client *MQTT* client handle + * + * @return ESP_OK on success + * ESP_ERR_INVALID_ARG on wrong initialization + */ +esp_err_t esp_mqtt_client_disconnect(esp_mqtt_client_handle_t client); + +/** + * @brief Stops *MQTT* client tasks + * + * * Notes: + * - Cannot be called from the *MQTT* event handler + * + * @param client *MQTT* client handle + * + * @return ESP_OK on success + * ESP_ERR_INVALID_ARG on wrong initialization + * ESP_FAIL if client is in invalid state + */ +esp_err_t esp_mqtt_client_stop(esp_mqtt_client_handle_t client); + +#ifdef __cplusplus + +#define esp_mqtt_client_subscribe esp_mqtt_client_subscribe_single + +#else +/** + * @brief Convenience macro to select subscribe function to use. + * + * Notes: + * - Usage of `esp_mqtt_client_subscribe_single` is the same as previous + * esp_mqtt_client_subscribe, refer to it for details. + * + * @param client_handle *MQTT* client handle + * @param topic_type Needs to be char* for single subscription or `esp_mqtt_topic_t` for multiple topics + * @param qos_or_size It's either a qos when subscribing to a single topic or the size of the subscription array when subscribing to multiple topics. + * + * @return message_id of the subscribe message on success + * -1 on failure + * -2 in case of full outbox. + */ +#define esp_mqtt_client_subscribe(client_handle, topic_type, qos_or_size) _Generic((topic_type), \ + char *: esp_mqtt_client_subscribe_single, \ + const char *: esp_mqtt_client_subscribe_single, \ + esp_mqtt_topic_t*: esp_mqtt_client_subscribe_multiple \ + )(client_handle, topic_type, qos_or_size) + +#endif /* __cplusplus*/ +/** + * @brief Subscribe the client to defined topic with defined qos + * + * Notes: + * - Client must be connected to send subscribe message + * - This API is could be executed from a user task or + * from a *MQTT* event callback i.e. internal *MQTT* task + * (API is protected by internal mutex, so it might block + * if a longer data receive operation is in progress. + * - `esp_mqtt_client_subscribe` could be used to call this function. + * + * @param client *MQTT* client handle + * @param topic topic filter to subscribe + * @param qos Max qos level of the subscription + * + * @return message_id of the subscribe message on success + * -1 on failure + * -2 in case of full outbox. + */ +int esp_mqtt_client_subscribe_single(esp_mqtt_client_handle_t client, + const char *topic, int qos); +/** + * @brief Subscribe the client to a list of defined topics with defined qos + * + * Notes: + * - Client must be connected to send subscribe message + * - This API is could be executed from a user task or + * from a *MQTT* event callback i.e. internal *MQTT* task + * (API is protected by internal mutex, so it might block + * if a longer data receive operation is in progress. + * - `esp_mqtt_client_subscribe` could be used to call this function. + * + * @param client *MQTT* client handle + * @param topic_list List of topics to subscribe + * @param size size of topic_list + * + * @return message_id of the subscribe message on success + * -1 on failure + * -2 in case of full outbox. + */ +int esp_mqtt_client_subscribe_multiple(esp_mqtt_client_handle_t client, + const esp_mqtt_topic_t *topic_list, int size); + +/** + * @brief Unsubscribe the client from defined topic + * + * Notes: + * - Client must be connected to send unsubscribe message + * - It is thread safe, please refer to `esp_mqtt_client_subscribe_single` for details + * + * @param client *MQTT* client handle + * @param topic + * + * @return message_id of the subscribe message on success + * -1 on failure + */ +int esp_mqtt_client_unsubscribe(esp_mqtt_client_handle_t client, + const char *topic); + +/** + * @brief Client to send a publish message to the broker + * + * Notes: + * - This API might block for several seconds, either due to network timeout + * (10s) or if publishing payloads longer than internal buffer (due to message + * fragmentation) + * - Client doesn't have to be connected for this API to work, enqueueing the + * messages with qos>1 (returning -1 for all the qos=0 messages if + * disconnected). If MQTT_SKIP_PUBLISH_IF_DISCONNECTED is enabled, this API will + * not attempt to publish when the client is not connected and will always + * return -1. + * - It is thread safe, please refer to `esp_mqtt_client_subscribe` for details + * + * @param client *MQTT* client handle + * @param topic topic string + * @param data payload string (set to NULL, sending empty payload message) + * @param len data length, if set to 0, length is calculated from payload + * string + * @param qos QoS of publish message + * @param retain retain flag + * + * @return message_id of the publish message (for QoS 0 message_id will always + * be zero) on success. -1 on failure, -2 in case of full outbox. + */ +int esp_mqtt_client_publish(esp_mqtt_client_handle_t client, const char *topic, + const char *data, int len, int qos, int retain); + +/** + * @brief Enqueue a message to the outbox, to be sent later. Typically used for + * messages with qos>0, but could be also used for qos=0 messages if store=true. + * + * This API generates and stores the publish message into the internal outbox + * and the actual sending to the network is performed in the mqtt-task context + * (in contrast to the esp_mqtt_client_publish() which sends the publish message + * immediately in the user task's context). Thus, it could be used as a non + * blocking version of esp_mqtt_client_publish(). + * + * @param client *MQTT* client handle + * @param topic topic string + * @param data payload string (set to NULL, sending empty payload message) + * @param len data length, if set to 0, length is calculated from payload + * string + * @param qos QoS of publish message + * @param retain retain flag + * @param store if true, all messages are enqueued; otherwise only QoS 1 and + * QoS 2 are enqueued + * + * @return message_id if queued successfully, -1 on failure, -2 in case of full outbox. + */ +int esp_mqtt_client_enqueue(esp_mqtt_client_handle_t client, const char *topic, + const char *data, int len, int qos, int retain, + bool store); + +/** + * @brief Destroys the client handle + * + * Notes: + * - Cannot be called from the *MQTT* event handler + * + * @param client *MQTT* client handle + * + * @return ESP_OK + * ESP_ERR_INVALID_ARG on wrong initialization + */ +esp_err_t esp_mqtt_client_destroy(esp_mqtt_client_handle_t client); + +/** + * @brief Set configuration structure, typically used when updating the config + * (i.e. on "before_connect" event + * + * Notes: + * - When calling this function make sure to have all the intendend configurations + * set, otherwise default values are set. + * @param client *MQTT* client handle + * + * @param config *MQTT* configuration structure + * + * @return ESP_ERR_NO_MEM if failed to allocate + * ESP_ERR_INVALID_ARG if conflicts on transport configuration. + * ESP_OK on success + */ +esp_err_t esp_mqtt_set_config(esp_mqtt_client_handle_t client, + const esp_mqtt_client_config_t *config); + +/** + * @brief Registers *MQTT* event + * + * @param client *MQTT* client handle + * @param event event type + * @param event_handler handler callback + * @param event_handler_arg handlers context + * + * @return ESP_ERR_NO_MEM if failed to allocate + * ESP_ERR_INVALID_ARG on wrong initialization + * ESP_OK on success + */ +esp_err_t esp_mqtt_client_register_event(esp_mqtt_client_handle_t client, + esp_mqtt_event_id_t event, + esp_event_handler_t event_handler, + void *event_handler_arg); + +/** + * @brief Unregisters mqtt event + * + * @param client mqtt client handle + * @param event event ID + * @param event_handler handler to unregister + * + * @return ESP_ERR_NO_MEM if failed to allocate + * ESP_ERR_INVALID_ARG on invalid event ID + * ESP_OK on success + */ +esp_err_t esp_mqtt_client_unregister_event(esp_mqtt_client_handle_t client, esp_mqtt_event_id_t event, esp_event_handler_t event_handler); + +/** + * @brief Get outbox size + * + * @param client *MQTT* client handle + * @return outbox size + * 0 on wrong initialization + */ +int esp_mqtt_client_get_outbox_size(esp_mqtt_client_handle_t client); + +/** + * @brief Dispatch user event to the mqtt internal event loop + * + * @param client *MQTT* client handle + * @param event *MQTT* event handle structure + * @return ESP_OK on success + * ESP_ERR_TIMEOUT if the event couldn't be queued (ref also CONFIG_MQTT_EVENT_QUEUE_SIZE) + */ +esp_err_t esp_mqtt_dispatch_custom_event(esp_mqtt_client_handle_t client, esp_mqtt_event_t *event); + +/** + * @brief Get a transport from the scheme + * + * Allows extra settings to be made on the selected transport, + * for convenience the scheme used by the mqtt client are defined as + * MQTT_OVER_TCP_SCHEME, MQTT_OVER_SSL_SCHEME, MQTT_OVER_WS_SCHEME and MQTT_OVER_WSS_SCHEME + * If the transport_scheme is NULL and the client was set with a custom transport the custom transport will be returned. + * + * Notes: + * - This function should be called only on MQTT_EVENT_BEFORE_CONNECT. + * - The intetion is to provide a way to set different configurations than the ones available from client config. + * - If esp_mqtt_client_destroy is called the returned pointer will be invalidated. + * - All the required settings should be made in the MQTT_EVENT_BEFORE_CONNECT event handler + * + * @param client *MQTT* client handle + * @param transport_scheme Transport handle to search for. + * @return the transport handle + * NULL in case of error + * +*/ +esp_transport_handle_t esp_mqtt_client_get_transport(esp_mqtt_client_handle_t client, char *transport_scheme); +#ifdef __cplusplus +} +#endif //__cplusplus + +#endif diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/include/mqtt_supported_features.h b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/include/mqtt_supported_features.h new file mode 100644 index 000000000..6036e5f90 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/include/mqtt_supported_features.h @@ -0,0 +1,83 @@ +// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef _MQTT_SUPPORTED_FEATURES_H_ +#define _MQTT_SUPPORTED_FEATURES_H_ + +#if __has_include("esp_idf_version.h") +#include "esp_idf_version.h" +#endif + +/** + * @brief This header defines supported features of IDF which mqtt module + * could use depending on specific version of ESP-IDF. + * In case "esp_idf_version.h" were not found, all additional + * features would be disabled + */ + +#ifdef ESP_IDF_VERSION + +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(3, 3, 0) +// Features supported from 3.3 +#define MQTT_SUPPORTED_FEATURE_EVENT_LOOP +#define MQTT_SUPPORTED_FEATURE_SKIP_CRT_CMN_NAME_CHECK +#endif + +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 0, 0) +// Features supported in 4.0 +#define MQTT_SUPPORTED_FEATURE_WS_SUBPROTOCOL +#define MQTT_SUPPORTED_FEATURE_TRANSPORT_ERR_REPORTING +#endif + +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 1, 0) +// Features supported in 4.1 +#define MQTT_SUPPORTED_FEATURE_PSK_AUTHENTICATION +#define MQTT_SUPPORTED_FEATURE_DER_CERTIFICATES +#define MQTT_SUPPORTED_FEATURE_ALPN +#define MQTT_SUPPORTED_FEATURE_CLIENT_KEY_PASSWORD +#endif + +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) +// Features supported in 4.2 +#define MQTT_SUPPORTED_FEATURE_SECURE_ELEMENT +#endif + +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 3, 0) +// Features supported in 4.3 +#define MQTT_SUPPORTED_FEATURE_DIGITAL_SIGNATURE +#define MQTT_SUPPORTED_FEATURE_TRANSPORT_SOCK_ERRNO_REPORTING +#endif + +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 4, 0) +// Features supported in 4.4 +#define MQTT_SUPPORTED_FEATURE_CERTIFICATE_BUNDLE +#endif + +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 0) +// Features supported in 5.1.0 +#define MQTT_SUPPORTED_FEATURE_CRT_CMN_NAME +#endif + +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 2, 0) +// Features supported in 5.2.0 +#define MQTT_SUPPORTED_FEATURE_ECDSA_PERIPHERAL +#endif + +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0) +// Features supported in 5.5.0 +#define MQTT_SUPPORTED_FEATURE_CIPHERSUITES_LIST +#endif + +#endif /* ESP_IDF_VERSION */ +#endif // _MQTT_SUPPORTED_FEATURES_H_ diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/mqtt5_client_priv.h b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/mqtt5_client_priv.h new file mode 100644 index 000000000..1b5f04bec --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/mqtt5_client_priv.h @@ -0,0 +1,56 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef _MQTT5_CLIENT_PRIV_H_ +#define _MQTT5_CLIENT_PRIV_H_ + +#include "mqtt5_client.h" +#include "mqtt_client_priv.h" +#include "mqtt5_msg.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct mqtt5_topic_alias { + char *topic; + uint16_t topic_len; + uint16_t topic_alias; + STAILQ_ENTRY(mqtt5_topic_alias) next; +} mqtt5_topic_alias_t; +STAILQ_HEAD(mqtt5_topic_alias_list_t, mqtt5_topic_alias); +typedef struct mqtt5_topic_alias_list_t *mqtt5_topic_alias_handle_t; +typedef struct mqtt5_topic_alias *mqtt5_topic_alias_item_t; + +typedef struct { + esp_mqtt5_connection_property_storage_t connect_property_info; + esp_mqtt5_connection_will_property_storage_t will_property_info; + esp_mqtt5_connection_server_resp_property_t server_resp_property_info; + esp_mqtt5_disconnect_property_config_t disconnect_property_info; + const esp_mqtt5_publish_property_config_t *publish_property_info; + const esp_mqtt5_subscribe_property_config_t *subscribe_property_info; + const esp_mqtt5_unsubscribe_property_config_t *unsubscribe_property_info; + mqtt5_topic_alias_handle_t peer_topic_alias; +} mqtt5_config_storage_t; + +void esp_mqtt5_increment_packet_counter(esp_mqtt5_client_handle_t client); +void esp_mqtt5_decrement_packet_counter(esp_mqtt5_client_handle_t client); +void esp_mqtt5_parse_pubcomp(esp_mqtt5_client_handle_t client); +void esp_mqtt5_parse_puback(esp_mqtt5_client_handle_t client); +void esp_mqtt5_parse_unsuback(esp_mqtt5_client_handle_t client); +void esp_mqtt5_parse_suback(esp_mqtt5_client_handle_t client); +void esp_mqtt5_parse_disconnect(esp_mqtt5_client_handle_t client, int *disconnect_rsp_code); +esp_err_t esp_mqtt5_parse_connack(esp_mqtt5_client_handle_t client, int *connect_rsp_code); +void esp_mqtt5_client_destory(esp_mqtt5_client_handle_t client); +esp_err_t esp_mqtt5_client_publish_check(esp_mqtt5_client_handle_t client, int qos, int retain); +esp_err_t esp_mqtt5_client_subscribe_check(esp_mqtt5_client_handle_t client, int qos); +esp_err_t esp_mqtt5_create_default_config(esp_mqtt5_client_handle_t client); +esp_err_t esp_mqtt5_get_publish_data(esp_mqtt5_client_handle_t client, uint8_t *msg_buf, size_t msg_read_len, char **msg_topic, size_t *msg_topic_len, char **msg_data, size_t *msg_data_len); +#ifdef __cplusplus +} +#endif //__cplusplus + +#endif \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/mqtt5_msg.h b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/mqtt5_msg.h new file mode 100644 index 000000000..6c2a036c8 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/mqtt5_msg.h @@ -0,0 +1,142 @@ +#ifndef MQTT5_MSG_H +#define MQTT5_MSG_H +#include +#include +#include "sys/queue.h" +#include "mqtt_config.h" +#include "mqtt_msg.h" +#include "mqtt_client.h" +#ifdef __cplusplus +extern "C" { +#endif + +enum mqtt_properties_type { + MQTT5_PROPERTY_PAYLOAD_FORMAT_INDICATOR = 0x01, + MQTT5_PROPERTY_MESSAGE_EXPIRY_INTERVAL = 0x02, + MQTT5_PROPERTY_CONTENT_TYPE = 0x03, + MQTT5_PROPERTY_RESPONSE_TOPIC = 0x08, + MQTT5_PROPERTY_CORRELATION_DATA = 0x09, + MQTT5_PROPERTY_SUBSCRIBE_IDENTIFIER = 0x0B, + MQTT5_PROPERTY_SESSION_EXPIRY_INTERVAL = 0x11, + MQTT5_PROPERTY_ASSIGNED_CLIENT_IDENTIFIER = 0x12, + MQTT5_PROPERTY_SERVER_KEEP_ALIVE = 0x13, + MQTT5_PROPERTY_AUTHENTICATION_METHOD = 0x15, + MQTT5_PROPERTY_AUTHENTICATION_DATA = 0x16, + MQTT5_PROPERTY_REQUEST_PROBLEM_INFO = 0x17, + MQTT5_PROPERTY_WILL_DELAY_INTERVAL = 0x18, + MQTT5_PROPERTY_REQUEST_RESP_INFO = 0x19, + MQTT5_PROPERTY_RESP_INFO = 0x1A, + MQTT5_PROPERTY_SERVER_REFERENCE = 0x1C, + MQTT5_PROPERTY_REASON_STRING = 0x1F, + MQTT5_PROPERTY_RECEIVE_MAXIMUM = 0x21, + MQTT5_PROPERTY_TOPIC_ALIAS_MAXIMIM = 0x22, + MQTT5_PROPERTY_TOPIC_ALIAS = 0x23, + MQTT5_PROPERTY_MAXIMUM_QOS = 0x24, + MQTT5_PROPERTY_RETAIN_AVAILABLE = 0x25, + MQTT5_PROPERTY_USER_PROPERTY = 0x26, + MQTT5_PROPERTY_MAXIMUM_PACKET_SIZE = 0x27, + MQTT5_PROPERTY_WILDCARD_SUBSCR_AVAILABLE = 0x28, + MQTT5_PROPERTY_SUBSCR_IDENTIFIER_AVAILABLE = 0x29, + MQTT5_PROPERTY_SHARED_SUBSCR_AVAILABLE = 0x2A, +}; + +typedef struct mqtt5_user_property { + char *key; + char *value; + STAILQ_ENTRY(mqtt5_user_property) next; +} mqtt5_user_property_t; +STAILQ_HEAD(mqtt5_user_property_list_t, mqtt5_user_property); +typedef struct mqtt5_user_property *mqtt5_user_property_item_t; + +typedef struct { + uint32_t maximum_packet_size; + uint16_t receive_maximum; + uint16_t topic_alias_maximum; + uint8_t max_qos; + bool retain_available; + bool wildcard_subscribe_available; + bool subscribe_identifiers_available; + bool shared_subscribe_available; + char *response_info; +} esp_mqtt5_connection_server_resp_property_t; + +typedef struct { + bool payload_format_indicator; + uint32_t message_expiry_interval; + uint16_t topic_alias; + char *response_topic; + int response_topic_len; + char *correlation_data; + uint16_t correlation_data_len; + char *content_type; + int content_type_len; + uint16_t subscribe_id; +} esp_mqtt5_publish_resp_property_t; + +typedef struct { + uint32_t session_expiry_interval; + uint32_t maximum_packet_size; + uint16_t receive_maximum; + uint16_t topic_alias_maximum; + bool request_resp_info; + bool request_problem_info; + mqtt5_user_property_handle_t user_property; +} esp_mqtt5_connection_property_storage_t; + +typedef struct { + uint32_t will_delay_interval; + uint32_t message_expiry_interval; + bool payload_format_indicator; + char *content_type; + char *response_topic; + char *correlation_data; + uint16_t correlation_data_len; + mqtt5_user_property_handle_t user_property; +} esp_mqtt5_connection_will_property_storage_t; + +#define mqtt5_get_type mqtt_get_type + +#define mqtt5_get_dup mqtt_get_dup + +#define mqtt5_set_dup mqtt_set_dup + +#define mqtt5_get_qos mqtt_get_qos + +#define mqtt5_get_retain mqtt_get_retain + +#define mqtt5_msg_init mqtt_msg_init + +#define mqtt5_get_total_length mqtt_get_total_length + +#define mqtt5_has_valid_msg_hdr mqtt_has_valid_msg_hdr + +#define mqtt5_msg_pingreq mqtt_msg_pingreq + +#define mqtt5_msg_pingresp mqtt_msg_pingresp + +#define mqtt5_get_unsuback_data mqtt5_get_suback_data + +#define mqtt5_get_pubcomp_data mqtt5_get_puback_data + +uint16_t mqtt5_get_id(uint8_t *buffer, size_t length); +char *mqtt5_get_publish_property_payload(uint8_t *buffer, size_t buffer_length, char **msg_topic, size_t *msg_topic_len, esp_mqtt5_publish_resp_property_t *resp_property, uint16_t *property_len, size_t *payload_len, mqtt5_user_property_handle_t *user_property); +char *mqtt5_get_suback_data(uint8_t *buffer, size_t *length, mqtt5_user_property_handle_t *user_property); +char *mqtt5_get_puback_data(uint8_t *buffer, size_t *length, mqtt5_user_property_handle_t *user_property); +mqtt_message_t *mqtt5_msg_connect(mqtt_connection_t *connection, mqtt_connect_info_t *info, esp_mqtt5_connection_property_storage_t *property, esp_mqtt5_connection_will_property_storage_t *will_property); +mqtt_message_t *mqtt5_msg_publish(mqtt_connection_t *connection, const char *topic, const char *data, int data_length, int qos, int retain, uint16_t *message_id, const esp_mqtt5_publish_property_config_t *property, const char *resp_info); +esp_err_t mqtt5_msg_parse_connack_property(uint8_t *buffer, size_t buffer_len, mqtt_connect_info_t *connection_info, esp_mqtt5_connection_property_storage_t *connection_property, esp_mqtt5_connection_server_resp_property_t *resp_property, int *reason_code, uint8_t *ack_flag, mqtt5_user_property_handle_t *user_property); +int mqtt5_msg_get_reason_code(uint8_t *buffer, size_t length); +mqtt_message_t *mqtt5_msg_subscribe(mqtt_connection_t *connection, const esp_mqtt_topic_t *topic, int size, uint16_t *message_id, const esp_mqtt5_subscribe_property_config_t *property); +mqtt_message_t *mqtt5_msg_unsubscribe(mqtt_connection_t *connection, const char *topic, uint16_t *message_id, const esp_mqtt5_unsubscribe_property_config_t *property); +mqtt_message_t *mqtt5_msg_disconnect(mqtt_connection_t *connection, esp_mqtt5_disconnect_property_config_t *disconnect_property_info); +mqtt_message_t *mqtt5_msg_pubcomp(mqtt_connection_t *connection, uint16_t message_id); +mqtt_message_t *mqtt5_msg_pubrel(mqtt_connection_t *connection, uint16_t message_id); +mqtt_message_t *mqtt5_msg_pubrec(mqtt_connection_t *connection, uint16_t message_id); +mqtt_message_t *mqtt5_msg_puback(mqtt_connection_t *connection, uint16_t message_id); + +#ifdef __cplusplus +} +#endif + +#endif /* MQTT5_MSG_H */ + diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/mqtt_client_priv.h b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/mqtt_client_priv.h new file mode 100644 index 000000000..c1ed03884 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/mqtt_client_priv.h @@ -0,0 +1,150 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef _MQTT_CLIENT_PRIV_H_ +#define _MQTT_CLIENT_PRIV_H_ + +#include +#include +#include +#include +#include "esp_err.h" +#include "platform.h" + +#include "esp_event.h" +#include "mqtt_client.h" +#include "mqtt_msg.h" +#ifdef MQTT_PROTOCOL_5 +#include "mqtt5_client_priv.h" +#endif +#include "esp_transport.h" +#include "esp_transport_tcp.h" +#include "esp_transport_ssl.h" +#include "esp_transport_ws.h" +#include "esp_log.h" +#include "mqtt_outbox.h" +#include "freertos/event_groups.h" +#include +#include + +#include "mqtt_supported_features.h" + +/* using uri parser */ +#include "http_parser.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if CONFIG_LIBC_NEWLIB_NANO_FORMAT +#define NEWLIB_NANO_COMPAT_FORMAT PRIu32 +#define NEWLIB_NANO_COMPAT_CAST(size_t_var) (uint32_t)size_t_var +#else +#define NEWLIB_NANO_COMPAT_FORMAT "zu" +#define NEWLIB_NANO_COMPAT_CAST(size_t_var) size_t_var +#endif + +#ifdef MQTT_DISABLE_API_LOCKS +# define MQTT_API_LOCK(c) +# define MQTT_API_UNLOCK(c) +#else +# define MQTT_API_LOCK(c) xSemaphoreTakeRecursive(c->api_lock, portMAX_DELAY) +# define MQTT_API_UNLOCK(c) xSemaphoreGiveRecursive(c->api_lock) +#endif /* MQTT_USE_API_LOCKS */ + +typedef struct mqtt_state { + uint8_t *in_buffer; + int in_buffer_length; + size_t message_length; + size_t in_buffer_read_len; + mqtt_connection_t connection; + uint16_t pending_msg_id; + int pending_msg_type; + int pending_publish_qos; +} mqtt_state_t; + +typedef struct { + esp_event_loop_handle_t event_loop_handle; + int task_stack; + int task_prio; + char *uri; + char *host; + char *path; + char *scheme; + int port; + bool auto_reconnect; + int network_timeout_ms; + int refresh_connection_after_ms; + int reconnect_timeout_ms; + char **alpn_protos; + int num_alpn_protos; + char *clientkey_password; + int clientkey_password_len; + bool use_global_ca_store; + esp_err_t ((*crt_bundle_attach)(void *conf)); + const int *ciphersuites_list; + const char *cacert_buf; + size_t cacert_bytes; + const char *clientcert_buf; + size_t clientcert_bytes; + const char *clientkey_buf; + size_t clientkey_bytes; + const struct psk_key_hint *psk_hint_key; + bool skip_cert_common_name_check; + const char *common_name; + bool use_secure_element; + void *ds_data; + bool use_ecdsa_peripheral; + uint8_t ecdsa_key_efuse_blk; + int message_retransmit_timeout; + uint64_t outbox_limit; + esp_transport_handle_t transport; + struct ifreq * if_name; + esp_transport_keep_alive_t tcp_keep_alive_cfg; +} mqtt_config_storage_t; + +typedef enum { + MQTT_STATE_INIT = 0, + MQTT_STATE_DISCONNECTED, + MQTT_STATE_CONNECTED, + MQTT_STATE_WAIT_RECONNECT, +} mqtt_client_state_t; + +struct esp_mqtt_client { + esp_transport_list_handle_t transport_list; + esp_transport_handle_t transport; + mqtt_config_storage_t *config; + mqtt_state_t mqtt_state; + _Atomic mqtt_client_state_t state; + uint64_t refresh_connection_tick; + int64_t keepalive_tick; + uint64_t reconnect_tick; +#ifdef MQTT_PROTOCOL_5 + mqtt5_config_storage_t *mqtt5_config; + uint16_t send_publish_packet_count; // This is for MQTT v5.0 flow control +#endif + int wait_timeout_ms; + int auto_reconnect; + esp_mqtt_event_t event; + bool run; + bool wait_for_ping_resp; + outbox_handle_t outbox; + EventGroupHandle_t status_bits; + SemaphoreHandle_t api_lock; + TaskHandle_t task_handle; +#if MQTT_EVENT_QUEUE_SIZE > 1 + atomic_int queued_events; +#endif +}; + +bool esp_mqtt_set_if_config(char const *const new_config, char **old_config); +void esp_mqtt_destroy_config(esp_mqtt_client_handle_t client); + +#ifdef __cplusplus +} +#endif //__cplusplus + +#endif diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/mqtt_config.h b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/mqtt_config.h new file mode 100644 index 000000000..d96e2ad41 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/mqtt_config.h @@ -0,0 +1,118 @@ +/* + * This file is subject to the terms and conditions defined in + * file 'LICENSE', which is part of this source code package. + * Tuan PM + */ +#ifndef _MQTT_CONFIG_H_ +#define _MQTT_CONFIG_H_ + +#include "sdkconfig.h" + +#ifdef CONFIG_MQTT_PROTOCOL_311 +#define MQTT_PROTOCOL_311 +#endif + +#ifdef CONFIG_MQTT_PROTOCOL_5 +#define MQTT_PROTOCOL_5 +#endif + +#define MQTT_RECON_DEFAULT_MS (10*1000) + +#ifdef CONFIG_MQTT_POLL_READ_TIMEOUT_MS +#define MQTT_POLL_READ_TIMEOUT_MS CONFIG_MQTT_POLL_READ_TIMEOUT_MS +#else +#define MQTT_POLL_READ_TIMEOUT_MS (1000) +#endif + +#define MQTT_MSG_ID_INCREMENTAL CONFIG_MQTT_MSG_ID_INCREMENTAL + +#define MQTT_SKIP_PUBLISH_IF_DISCONNECTED CONFIG_MQTT_SKIP_PUBLISH_IF_DISCONNECTED + +#define MQTT_REPORT_DELETED_MESSAGES CONFIG_MQTT_REPORT_DELETED_MESSAGES + +#if CONFIG_MQTT_BUFFER_SIZE +#define MQTT_BUFFER_SIZE_BYTE CONFIG_MQTT_BUFFER_SIZE +#else +#define MQTT_BUFFER_SIZE_BYTE 1024 +#endif + +#if CONFIG_MQTT_TASK_PRIORITY +#define MQTT_TASK_PRIORITY CONFIG_MQTT_TASK_PRIORITY +#else +#define MQTT_TASK_PRIORITY 5 +#endif + +#if CONFIG_MQTT_TASK_STACK_SIZE +#define MQTT_TASK_STACK CONFIG_MQTT_TASK_STACK_SIZE +#else +#define MQTT_TASK_STACK (6*1024) +#endif + +#define MQTT_KEEPALIVE_TICK (120) +#define MQTT_NETWORK_TIMEOUT_MS (10000) + +#ifdef CONFIG_MQTT_TCP_DEFAULT_PORT +#define MQTT_TCP_DEFAULT_PORT CONFIG_MQTT_TCP_DEFAULT_PORT +#else +#define MQTT_TCP_DEFAULT_PORT 1883 +#endif + +#ifdef CONFIG_MQTT_SSL_DEFAULT_PORT +#define MQTT_SSL_DEFAULT_PORT CONFIG_MQTT_SSL_DEFAULT_PORT +#else +#define MQTT_SSL_DEFAULT_PORT 8883 +#endif + +#ifdef CONFIG_MQTT_WS_DEFAULT_PORT +#define MQTT_WS_DEFAULT_PORT CONFIG_MQTT_WS_DEFAULT_PORT +#else +#define MQTT_WS_DEFAULT_PORT 80 +#endif + +#ifdef CONFIG_MQTT_WSS_DEFAULT_PORT +#define MQTT_WSS_DEFAULT_PORT CONFIG_MQTT_WSS_DEFAULT_PORT +#else +#define MQTT_WSS_DEFAULT_PORT 443 +#endif + +#define MQTT_CORE_SELECTION_ENABLED CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED + +#ifdef CONFIG_MQTT_DISABLE_API_LOCKS +#define MQTT_DISABLE_API_LOCKS CONFIG_MQTT_DISABLE_API_LOCKS +#endif + +#ifdef CONFIG_MQTT_USE_CORE_0 +#define MQTT_TASK_CORE 0 +#else +#ifdef CONFIG_MQTT_USE_CORE_1 +#define MQTT_TASK_CORE 1 +#else +#define MQTT_TASK_CORE 0 +#endif +#endif + +#ifdef CONFIG_MQTT_OUTBOX_EXPIRED_TIMEOUT_MS +#define OUTBOX_EXPIRED_TIMEOUT_MS CONFIG_MQTT_OUTBOX_EXPIRED_TIMEOUT_MS +#else +#define OUTBOX_EXPIRED_TIMEOUT_MS (30*1000) +#endif + +#define MQTT_ENABLE_SSL CONFIG_MQTT_TRANSPORT_SSL +#define MQTT_ENABLE_WS CONFIG_MQTT_TRANSPORT_WEBSOCKET +#define MQTT_ENABLE_WSS CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE +#define MQTT_DEFAULT_RETRANSMIT_TIMEOUT_MS 1000 + +#ifdef CONFIG_MQTT_EVENT_QUEUE_SIZE +#define MQTT_EVENT_QUEUE_SIZE CONFIG_MQTT_EVENT_QUEUE_SIZE +#else +#define MQTT_EVENT_QUEUE_SIZE 1 +#endif + +#ifdef CONFIG_MQTT_OUTBOX_DATA_ON_EXTERNAL_MEMORY +#define MQTT_OUTBOX_MEMORY MALLOC_CAP_SPIRAM +#else +#define MQTT_OUTBOX_MEMORY MALLOC_CAP_DEFAULT +#endif + +#define OUTBOX_MAX_SIZE (4*1024) +#endif diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/mqtt_msg.h b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/mqtt_msg.h new file mode 100644 index 000000000..f09590dc9 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/mqtt_msg.h @@ -0,0 +1,152 @@ +#ifndef MQTT_MSG_H +#define MQTT_MSG_H +#include +#include + +#include "mqtt_config.h" +#include "mqtt_client.h" +#ifdef __cplusplus +extern "C" { +#endif + +/* +* Copyright (c) 2014, Stephen Robinson +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* 3. Neither the name of the copyright holder nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* +*/ +/* 7 6 5 4 3 2 1 0 */ +/*| --- Message Type---- | DUP Flag | QoS Level | Retain | */ +/* Remaining Length */ + + +enum mqtt_message_type { + MQTT_MSG_TYPE_CONNECT = 1, + MQTT_MSG_TYPE_CONNACK = 2, + MQTT_MSG_TYPE_PUBLISH = 3, + MQTT_MSG_TYPE_PUBACK = 4, + MQTT_MSG_TYPE_PUBREC = 5, + MQTT_MSG_TYPE_PUBREL = 6, + MQTT_MSG_TYPE_PUBCOMP = 7, + MQTT_MSG_TYPE_SUBSCRIBE = 8, + MQTT_MSG_TYPE_SUBACK = 9, + MQTT_MSG_TYPE_UNSUBSCRIBE = 10, + MQTT_MSG_TYPE_UNSUBACK = 11, + MQTT_MSG_TYPE_PINGREQ = 12, + MQTT_MSG_TYPE_PINGRESP = 13, + MQTT_MSG_TYPE_DISCONNECT = 14 +}; + +typedef struct mqtt_message { + uint8_t *data; + size_t length; + size_t fragmented_msg_total_length; /*!< total len of fragmented messages (zero for all other messages) */ + size_t fragmented_msg_data_offset; /*!< data offset of fragmented messages (zero for all other messages) */ +} mqtt_message_t; + +typedef struct mqtt_connect_info { + char *client_id; + char *username; + char *password; + char *will_topic; + char *will_message; + int64_t keepalive; /*!< keepalive=0 -> keepalive is disabled */ + int will_length; + int will_qos; + int will_retain; + int clean_session; + esp_mqtt_protocol_ver_t protocol_ver; +} mqtt_connect_info_t; + +typedef struct mqtt_connection { + mqtt_message_t outbound_message; +#if MQTT_MSG_ID_INCREMENTAL + uint16_t last_message_id; /*!< last used id if incremental message id configured */ +#endif + uint8_t *buffer; + size_t buffer_length; + mqtt_connect_info_t information; + +} mqtt_connection_t; + +static inline int mqtt_get_type(const uint8_t *buffer) +{ + return (buffer[0] & 0xf0) >> 4; +} +static inline int mqtt_get_connect_session_present(const uint8_t *buffer) +{ + return buffer[2] & 0x01; +} +static inline int mqtt_get_connect_return_code(const uint8_t *buffer) +{ + return buffer[3]; +} +static inline int mqtt_get_dup(const uint8_t *buffer) +{ + return (buffer[0] & 0x08) >> 3; +} +static inline void mqtt_set_dup(uint8_t *buffer) +{ + buffer[0] |= 0x08; +} +static inline int mqtt_get_qos(const uint8_t *buffer) +{ + return (buffer[0] & 0x06) >> 1; +} +static inline int mqtt_get_retain(const uint8_t *buffer) +{ + return (buffer[0] & 0x01); +} + +bool mqtt_header_complete(uint8_t *buffer, size_t buffer_length); +size_t mqtt_get_total_length(const uint8_t *buffer, size_t length, int *fixed_size_len); +char *mqtt_get_publish_topic(uint8_t *buffer, size_t *length); +char *mqtt_get_publish_data(uint8_t *buffer, size_t *length); +char *mqtt_get_suback_data(uint8_t *buffer, size_t *length); +uint16_t mqtt_get_id(uint8_t *buffer, size_t length); +int mqtt_has_valid_msg_hdr(uint8_t *buffer, size_t length); + +esp_err_t mqtt_msg_buffer_init(mqtt_connection_t *connection, int buffer_size); +void mqtt_msg_buffer_destroy(mqtt_connection_t *connection); + +mqtt_message_t *mqtt_msg_connect(mqtt_connection_t *connection, mqtt_connect_info_t *info); +mqtt_message_t *mqtt_msg_publish(mqtt_connection_t *connection, const char *topic, const char *data, int data_length, int qos, int retain, uint16_t *message_id); +mqtt_message_t *mqtt_msg_puback(mqtt_connection_t *connection, uint16_t message_id); +mqtt_message_t *mqtt_msg_pubrec(mqtt_connection_t *connection, uint16_t message_id); +mqtt_message_t *mqtt_msg_pubrel(mqtt_connection_t *connection, uint16_t message_id); +mqtt_message_t *mqtt_msg_pubcomp(mqtt_connection_t *connection, uint16_t message_id); +mqtt_message_t *mqtt_msg_subscribe(mqtt_connection_t *connection, const esp_mqtt_topic_t topic_list[], int size, uint16_t *message_id) __attribute__((nonnull)); +mqtt_message_t *mqtt_msg_unsubscribe(mqtt_connection_t *connection, const char *topic, uint16_t *message_id); +mqtt_message_t *mqtt_msg_pingreq(mqtt_connection_t *connection); +mqtt_message_t *mqtt_msg_pingresp(mqtt_connection_t *connection); +mqtt_message_t *mqtt_msg_disconnect(mqtt_connection_t *connection); +#ifdef __cplusplus +} +#endif + +#endif /* MQTT_MSG_H */ + diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/mqtt_outbox.h b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/mqtt_outbox.h new file mode 100644 index 000000000..241b33525 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/mqtt_outbox.h @@ -0,0 +1,64 @@ +/* + * This file is subject to the terms and conditions defined in + * file 'LICENSE', which is part of this source code package. + * Tuan PM + */ +#ifndef _MQTT_OUTOBX_H_ +#define _MQTT_OUTOBX_H_ +#include "platform.h" +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct outbox_item; + +typedef struct outbox_t *outbox_handle_t; +typedef struct outbox_item *outbox_item_handle_t; +typedef struct outbox_message *outbox_message_handle_t; +typedef long long outbox_tick_t; + +typedef struct outbox_message { + uint8_t *data; + int len; + int msg_id; + int msg_qos; + int msg_type; + uint8_t *remaining_data; + int remaining_len; +} outbox_message_t; + +typedef enum pending_state { + QUEUED, + TRANSMITTED, + ACKNOWLEDGED, + CONFIRMED +} pending_state_t; + +outbox_handle_t outbox_init(void); +outbox_item_handle_t outbox_enqueue(outbox_handle_t outbox, outbox_message_handle_t message, outbox_tick_t tick); +outbox_item_handle_t outbox_dequeue(outbox_handle_t outbox, pending_state_t pending, outbox_tick_t *tick); +outbox_item_handle_t outbox_get(outbox_handle_t outbox, int msg_id); +uint8_t *outbox_item_get_data(outbox_item_handle_t item, size_t *len, uint16_t *msg_id, int *msg_type, int *qos); +esp_err_t outbox_delete(outbox_handle_t outbox, int msg_id, int msg_type); +esp_err_t outbox_delete_item(outbox_handle_t outbox, outbox_item_handle_t item); +int outbox_delete_expired(outbox_handle_t outbox, outbox_tick_t current_tick, outbox_tick_t timeout); +/** + * @brief Deletes single expired message returning it's message id + * + * @return msg id of the deleted message, -1 if no expired message in the outbox + */ +int outbox_delete_single_expired(outbox_handle_t outbox, outbox_tick_t current_tick, outbox_tick_t timeout); + +esp_err_t outbox_set_pending(outbox_handle_t outbox, int msg_id, pending_state_t pending); +pending_state_t outbox_item_get_pending(outbox_item_handle_t item); +esp_err_t outbox_set_tick(outbox_handle_t outbox, int msg_id, outbox_tick_t tick); +uint64_t outbox_get_size(outbox_handle_t outbox); +void outbox_destroy(outbox_handle_t outbox); +void outbox_delete_all_items(outbox_handle_t outbox); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/platform.h b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/platform.h new file mode 100644 index 000000000..b3358b9fe --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/platform.h @@ -0,0 +1,14 @@ +/* + * This file is subject to the terms and conditions defined in + * file 'LICENSE', which is part of this source code package. + * Tuan PM + */ +#ifndef _PLATFORM_H__ +#define _PLATFORM_H__ + +//Support ESP32 +#ifdef ESP_PLATFORM +#include "platform_esp32_idf.h" +#endif + +#endif diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/platform_esp32_idf.h b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/platform_esp32_idf.h new file mode 100644 index 000000000..98f5fe14f --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/include/platform_esp32_idf.h @@ -0,0 +1,29 @@ +/* + * This file is subject to the terms and conditions defined in + * file 'LICENSE', which is part of this source code package. + * Tuan PM + */ +#ifndef _ESP_PLATFORM_H__ +#define _ESP_PLATFORM_H__ + +#include "freertos/FreeRTOS.h" +#include "freertos/event_groups.h" + +#include +#include + +char *platform_create_id_string(void); +int platform_random(int max); +uint64_t platform_tick_get_ms(void); + +#define ESP_MEM_CHECK(TAG, a, action) if (!(a)) { \ + ESP_LOGE(TAG,"%s(%d): %s", __FUNCTION__, __LINE__, "Memory exhausted"); \ + action; \ + } + +#define ESP_OK_CHECK(TAG, a, action) if ((a) != ESP_OK) { \ + ESP_LOGE(TAG,"%s(%d): %s", __FUNCTION__, __LINE__, "Failed"); \ + action; \ + } + +#endif diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/mqtt5_msg.c b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/mqtt5_msg.c new file mode 100644 index 000000000..32ff92950 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/mqtt5_msg.c @@ -0,0 +1,1047 @@ +#include +#include "mqtt5_msg.h" +#include "mqtt_client.h" +#include "mqtt_config.h" +#include "platform.h" +#include "esp_log.h" + +#define MQTT5_MAX_FIXED_HEADER_SIZE 5 + +static const char *TAG = "mqtt5_msg"; + +#define APPEND_CHECK(a, ret) if(a == -1) { \ + ESP_LOGE(TAG,"%s(%d) fail",__FUNCTION__, __LINE__); \ + return (ret); \ + } +#define MQTT5_SHARED_SUB "$share/%s/%s" +#define MQTT5_CONVERT_ONE_BYTE_TO_FOUR(i, a, b, c, d) i = (a << 24); \ + i |= (b << 16); \ + i |= (c << 8); \ + i |= d; + +#define MQTT5_CONVERT_ONE_BYTE_TO_TWO(i, a, b) i = (a << 8); \ + i |= b; + +#define MQTT5_CONVERT_TWO_BYTE(i, a) i = (a >> 8) & 0xff; \ + i = a & 0xff; + +enum mqtt5_connect_flag { + MQTT5_CONNECT_FLAG_USERNAME = 1 << 7, + MQTT5_CONNECT_FLAG_PASSWORD = 1 << 6, + MQTT5_CONNECT_FLAG_WILL_RETAIN = 1 << 5, + MQTT5_CONNECT_FLAG_WILL = 1 << 2, + MQTT5_CONNECT_FLAG_CLEAN_SESSION = 1 << 1 +}; + +static void generate_variable_len(size_t len, uint8_t *len_bytes, uint8_t *encoded_lens) +{ + uint8_t bytes = 0; + do { + uint8_t i = len % 128; + len /= 128; + if (len > 0) { + i |= 0x80; + } + encoded_lens[bytes ++] = i; + } while (len > 0); + *len_bytes = bytes; +} + +static size_t get_variable_len(uint8_t *buffer, size_t offset, size_t buffer_length, uint8_t *len_bytes) +{ + *len_bytes = 0; + size_t len = 0, i = 0; + for (i = offset; i < buffer_length; i ++) { + len += (buffer[i] & 0x7f) << (7 * (i - offset)); + if ((buffer[i] & 0x80) == 0) { + i ++; + break; + } + } + *len_bytes = i - offset; + return len; +} + +static int update_property_len_value(mqtt_connection_t *connection, size_t property_len, int property_offset) +{ + uint8_t encoded_lens[4] = {0}, len_bytes = 0; + size_t len = property_len, message_offset = property_offset + property_len; + generate_variable_len(len, &len_bytes, encoded_lens); + int offset = len_bytes - 1; + + connection->outbound_message.length += offset; + if (connection->outbound_message.length > connection->buffer_length) { + return -1; + } + + if (offset > 0) { + for (int i = 0; i < property_len; i ++) { + connection->buffer[message_offset + offset] = connection->buffer[message_offset]; + message_offset --; + } + } + + for (int i = 0; i < len_bytes; i ++) { + connection->buffer[property_offset ++] = encoded_lens[i]; + } + return offset; +} + +static int append_property(mqtt_connection_t *connection, uint8_t property_type, uint8_t len_occupy, const char *data, size_t data_len) +{ + if ((connection->outbound_message.length + len_occupy + (data ? data_len : 0) + (property_type ? 1 : 0)) > connection->buffer_length) { + return -1; + } + + size_t origin_message_len = connection->outbound_message.length; + if (property_type) { + connection->buffer[connection->outbound_message.length ++] = property_type; + } + + if (len_occupy == 0) { + uint8_t encoded_lens[4] = {0}, len_bytes = 0; + generate_variable_len(data_len, &len_bytes, encoded_lens); + for (int j = 0; j < len_bytes; j ++) { + connection->buffer[connection->outbound_message.length ++] = encoded_lens[j]; + } + } else { + for (int i = 1; i <= len_occupy; i ++) { + connection->buffer[connection->outbound_message.length ++] = (data_len >> (8 * (len_occupy - i))) & 0xff; + } + } + + if (data) { + memcpy(connection->buffer + connection->outbound_message.length, data, data_len); + connection->outbound_message.length += data_len; + } + + return connection->outbound_message.length - origin_message_len; +} + +static uint16_t append_message_id(mqtt_connection_t *connection, uint16_t message_id) +{ + // If message_id is zero then we should assign one, otherwise + // we'll use the one supplied by the caller + while (message_id == 0) { +#if MQTT_MSG_ID_INCREMENTAL + message_id = ++ connection->last_message_id; +#else + message_id = platform_random(65535); +#endif + } + + if (connection->outbound_message.length + 2 > connection->buffer_length) { + return 0; + } + + MQTT5_CONVERT_TWO_BYTE(connection->buffer[connection->outbound_message.length ++], message_id) + + return message_id; +} + +static int init_message(mqtt_connection_t *connection) +{ + connection->outbound_message.length = MQTT5_MAX_FIXED_HEADER_SIZE; + return MQTT5_MAX_FIXED_HEADER_SIZE; +} + +static mqtt_message_t *fail_message(mqtt_connection_t *connection) +{ + connection->outbound_message.data = connection->buffer; + connection->outbound_message.length = 0; + return &connection->outbound_message; +} + +static mqtt_message_t *fini_message(mqtt_connection_t *connection, int type, int dup, int qos, int retain) +{ + int message_length = connection->outbound_message.length - MQTT5_MAX_FIXED_HEADER_SIZE; + int total_length = message_length; + uint8_t encoded_lens[4] = {0}, len_bytes = 0; + // Check if we have fragmented message and update total_len + if (connection->outbound_message.fragmented_msg_total_length) { + total_length = connection->outbound_message.fragmented_msg_total_length - MQTT5_MAX_FIXED_HEADER_SIZE; + } + + // Encode MQTT message length + generate_variable_len(total_length, &len_bytes, encoded_lens); + + // Sanity check for MQTT header + if (len_bytes + 1 > MQTT5_MAX_FIXED_HEADER_SIZE) { + return fail_message(connection); + } + + // Save the header bytes + connection->outbound_message.length = message_length + len_bytes + 1; // msg len + encoded_size len + type (1 byte) + int offs = MQTT5_MAX_FIXED_HEADER_SIZE - 1 - len_bytes; + connection->outbound_message.data = connection->buffer + offs; + connection->outbound_message.fragmented_msg_data_offset -= offs; + // type byte + connection->buffer[offs ++] = ((type & 0x0f) << 4) | ((dup & 1) << 3) | ((qos & 3) << 1) | (retain & 1); + // length bytes + for (int j = 0; j < len_bytes; j ++) { + connection->buffer[offs ++] = encoded_lens[j]; + } + + return &connection->outbound_message; +} + +static esp_err_t mqtt5_msg_set_user_property(mqtt5_user_property_handle_t *user_property, char *key, size_t key_len, char *value, size_t value_len) +{ + if (!*user_property) { + *user_property = calloc(1, sizeof(struct mqtt5_user_property_list_t)); + ESP_MEM_CHECK(TAG, *user_property, return ESP_FAIL); + STAILQ_INIT(*user_property); + } + + mqtt5_user_property_item_t user_property_item = calloc(1, sizeof(mqtt5_user_property_t)); + ESP_MEM_CHECK(TAG, user_property_item, return ESP_FAIL;); + user_property_item->key = calloc(1, key_len + 1); + ESP_MEM_CHECK(TAG, user_property_item->key, { + free(user_property_item); + return ESP_FAIL; + }); + memcpy(user_property_item->key, key, key_len); + user_property_item->key[key_len] = '\0'; + + user_property_item->value = calloc(1, value_len + 1); + ESP_MEM_CHECK(TAG, user_property_item->value, { + free(user_property_item->key); + free(user_property_item); + return ESP_FAIL; + }); + memcpy(user_property_item->value, value, value_len); + user_property_item->value[value_len] = '\0'; + + STAILQ_INSERT_TAIL(*user_property, user_property_item, next); + return ESP_OK; +} + +static mqtt5_user_property_handle_t mqtt5_msg_get_user_property(uint8_t *buffer, size_t buffer_length) +{ + mqtt5_user_property_handle_t user_porperty = NULL; + uint8_t *property = buffer; + uint16_t property_offset = 0, len = 0; + while (property_offset < buffer_length) { + uint8_t property_id = property[property_offset ++]; + switch (property_id) { + case MQTT5_PROPERTY_REASON_STRING: //only print now + MQTT5_CONVERT_ONE_BYTE_TO_TWO(len, property[property_offset ++], property[property_offset ++]) + ESP_LOGD(TAG, "MQTT5_PROPERTY_REASON_STRING %.*s", len, &property[property_offset]); + property_offset += len; + continue; + case MQTT5_PROPERTY_USER_PROPERTY: { + uint8_t *key = NULL, *value = NULL; + size_t key_len = 0, value_len = 0; + MQTT5_CONVERT_ONE_BYTE_TO_TWO(len, property[property_offset ++], property[property_offset ++]) + key = &property[property_offset]; + key_len = len; + ESP_LOGD(TAG, "MQTT5_PROPERTY_USER_PROPERTY key: %.*s", key_len, (char *)key); + property_offset += len; + MQTT5_CONVERT_ONE_BYTE_TO_TWO(len, property[property_offset ++], property[property_offset ++]) + value = &property[property_offset]; + value_len = len; + ESP_LOGD(TAG, "MQTT5_PROPERTY_USER_PROPERTY value: %.*s", value_len, (char *)value); + property_offset += len; + if (mqtt5_msg_set_user_property(&user_porperty, (char *)key, key_len, (char *)value, value_len) != ESP_OK) { + ESP_LOGE(TAG, "mqtt5_msg_set_user_property fail"); + goto err; + } + continue; + } + default: + ESP_LOGW(TAG, "Unknow property id 0x%02x", property_id); + goto err; + } + } + return user_porperty; +err: + esp_mqtt5_client_delete_user_property(user_porperty); + return NULL; +} + +uint16_t mqtt5_get_id(uint8_t *buffer, size_t length) +{ + int topiclen = 0; + uint8_t len_bytes = 0; + size_t offset = 1; + size_t totlen = get_variable_len(buffer, offset, length, &len_bytes); + offset += len_bytes; + totlen += offset; + + if (offset + 2 > length) { + return 0; + } + + switch (mqtt5_get_type(buffer)) { + case MQTT_MSG_TYPE_PUBLISH: { + MQTT5_CONVERT_ONE_BYTE_TO_TWO(topiclen, buffer[offset++], buffer[offset++]) + offset += topiclen; + if (offset + 2 > length) { + return 0; + } + if (mqtt_get_qos(buffer) == 0) { + return 0; + } + return (buffer[offset] << 8) | buffer[offset + 1]; + } + case MQTT_MSG_TYPE_PUBACK: + case MQTT_MSG_TYPE_PUBREC: + case MQTT_MSG_TYPE_PUBREL: + case MQTT_MSG_TYPE_PUBCOMP: + case MQTT_MSG_TYPE_SUBACK: + case MQTT_MSG_TYPE_UNSUBACK: + case MQTT_MSG_TYPE_SUBSCRIBE: + case MQTT_MSG_TYPE_UNSUBSCRIBE: { + return (buffer[offset] << 8) | buffer[offset + 1]; + } + default: + return 0; + } +} + +char *mqtt5_get_publish_property_payload(uint8_t *buffer, size_t buffer_length, char **msg_topic, size_t *msg_topic_len, esp_mqtt5_publish_resp_property_t *resp_property, uint16_t *property_len, size_t *payload_len, mqtt5_user_property_handle_t *user_property) +{ + *user_property = NULL; + uint8_t len_bytes = 0; + size_t offset = 1; + size_t totlen = get_variable_len(buffer, offset, buffer_length, &len_bytes); + offset += len_bytes; + totlen += offset; + + size_t topic_len = buffer[offset ++] << 8; + topic_len |= buffer[offset ++] & 0xff; + *msg_topic = (char *)(buffer + offset); + *msg_topic_len = topic_len; + offset += topic_len; + + if (offset >= buffer_length) { + return NULL; + } + + if (mqtt5_get_qos(buffer) > 0) { + if (offset + 2 >= buffer_length) { + return NULL; + } + offset += 2; // skip the message id + } + + *property_len = get_variable_len(buffer, offset, buffer_length, &len_bytes); + offset += len_bytes; + + uint16_t len = 0, property_offset = 0; + uint8_t *property = (buffer + offset); + while (property_offset < *property_len) { + uint8_t property_id = property[property_offset ++]; + switch (property_id) { + case MQTT5_PROPERTY_PAYLOAD_FORMAT_INDICATOR: + resp_property->payload_format_indicator = property[property_offset ++]; + ESP_LOGD(TAG, "MQTT5_PROPERTY_PAYLOAD_FORMAT_INDICATOR %d", resp_property->payload_format_indicator); + continue; + case MQTT5_PROPERTY_MESSAGE_EXPIRY_INTERVAL: + MQTT5_CONVERT_ONE_BYTE_TO_FOUR(resp_property->message_expiry_interval, property[property_offset ++], property[property_offset ++], property[property_offset ++], property[property_offset ++]) + ESP_LOGD(TAG, "MQTT5_PROPERTY_MESSAGE_EXPIRY_INTERVAL %"PRIu32, resp_property->message_expiry_interval); + continue; + case MQTT5_PROPERTY_TOPIC_ALIAS: + MQTT5_CONVERT_ONE_BYTE_TO_TWO(resp_property->topic_alias, property[property_offset ++], property[property_offset ++]) + ESP_LOGD(TAG, "MQTT5_PROPERTY_TOPIC_ALIAS %d", resp_property->topic_alias); + continue; + case MQTT5_PROPERTY_RESPONSE_TOPIC: + MQTT5_CONVERT_ONE_BYTE_TO_TWO(resp_property->response_topic_len, property[property_offset ++], property[property_offset ++]) + resp_property->response_topic = (char *)(property + property_offset); + property_offset += resp_property->response_topic_len; + ESP_LOGD(TAG, "MQTT5_PROPERTY_RESPONSE_TOPIC %.*s", resp_property->response_topic_len, resp_property->response_topic); + continue; + case MQTT5_PROPERTY_CORRELATION_DATA: + MQTT5_CONVERT_ONE_BYTE_TO_TWO(resp_property->correlation_data_len, property[property_offset ++], property[property_offset ++]) + resp_property->correlation_data = (char *)(property + property_offset); + property_offset += resp_property->correlation_data_len; + ESP_LOGD(TAG, "MQTT5_PROPERTY_CORRELATION_DATA length %d", resp_property->correlation_data_len); + continue; + case MQTT5_PROPERTY_SUBSCRIBE_IDENTIFIER: + resp_property->subscribe_id = get_variable_len(property, property_offset, buffer_length, &len_bytes); + property_offset += len_bytes; + ESP_LOGD(TAG, "MQTT5_PROPERTY_SUBSCRIBE_IDENTIFIER %d", resp_property->subscribe_id); + continue; + case MQTT5_PROPERTY_CONTENT_TYPE: + MQTT5_CONVERT_ONE_BYTE_TO_TWO(resp_property->content_type_len, property[property_offset ++], property[property_offset ++]) + resp_property->content_type = (char *)(property + property_offset); + property_offset += resp_property->content_type_len; + ESP_LOGD(TAG, "MQTT5_PROPERTY_CONTENT_TYPE %.*s", resp_property->content_type_len, resp_property->content_type); + continue; + case MQTT5_PROPERTY_USER_PROPERTY: { + uint8_t *key = NULL, *value = NULL; + size_t key_len = 0, value_len = 0; + MQTT5_CONVERT_ONE_BYTE_TO_TWO(len, property[property_offset ++], property[property_offset ++]) + key = &property[property_offset]; + key_len = len; + ESP_LOGD(TAG, "MQTT5_PROPERTY_USER_PROPERTY key: %.*s", key_len, (char *)key); + property_offset += len; + MQTT5_CONVERT_ONE_BYTE_TO_TWO(len, property[property_offset ++], property[property_offset ++]) + value = &property[property_offset]; + value_len = len; + ESP_LOGD(TAG, "MQTT5_PROPERTY_USER_PROPERTY value: %.*s", value_len, (char *)value); + property_offset += len; + if (mqtt5_msg_set_user_property(user_property, (char *)key, key_len, (char *)value, value_len) != ESP_OK) { + esp_mqtt5_client_delete_user_property(*user_property); + *user_property = NULL; + ESP_LOGE(TAG, "mqtt5_msg_set_user_property fail"); + return NULL; + } + continue; + } + case MQTT5_PROPERTY_REASON_STRING: //only print now + MQTT5_CONVERT_ONE_BYTE_TO_TWO(len, property[property_offset ++], property[property_offset ++]) + ESP_LOGD(TAG, "MQTT5_PROPERTY_REASON_STRING %.*s", len, &property[property_offset]); + property_offset += len; + continue; + default: + ESP_LOGW(TAG, "Unknow publish property id 0x%02x", property_id); + return NULL; + } + } + + offset += property_offset; + if (totlen <= buffer_length) { + *payload_len = totlen - offset; + } else { + *payload_len = buffer_length - offset; + } + return (char *)(buffer + offset); +} + +char *mqtt5_get_suback_data(uint8_t *buffer, size_t *length, mqtt5_user_property_handle_t *user_property) +{ + uint8_t len_bytes = 0; + size_t offset = 1; + size_t totlen = get_variable_len(buffer, offset, *length, &len_bytes); + offset += len_bytes; + totlen += offset; + + if (totlen > *length) { + goto err; + } + offset += 2; // skip the message id + if (offset < totlen) { + size_t property_len = get_variable_len(buffer, offset, totlen, &len_bytes); + offset += len_bytes; + *user_property = mqtt5_msg_get_user_property(buffer + offset, property_len); + offset += property_len; + if (offset < totlen) { + *length = totlen - offset; + return (char *)(buffer + offset); + } + } +err: + *user_property = NULL; + *length = 0; + return NULL; +} + +char *mqtt5_get_puback_data(uint8_t *buffer, size_t *length, mqtt5_user_property_handle_t *user_property) +{ + uint8_t len_bytes = 0; + size_t offset = 1; + size_t totlen = get_variable_len(buffer, offset, *length, &len_bytes); + offset += len_bytes; + totlen += offset; + + offset += 2; // skip the message id + if (offset < totlen) { + *length = 1; + char *data = (char *)(buffer + offset); + offset ++; + if (offset < totlen) { + size_t property_len = get_variable_len(buffer, offset, totlen, &len_bytes); + offset += len_bytes; + *user_property = mqtt5_msg_get_user_property(buffer + offset, property_len); + } + return data; + } else { + *length = 0; + return NULL; + } +} + +mqtt_message_t *mqtt5_msg_connect(mqtt_connection_t *connection, mqtt_connect_info_t *info, esp_mqtt5_connection_property_storage_t *property, esp_mqtt5_connection_will_property_storage_t *will_property) +{ + init_message(connection); + connection->buffer[connection->outbound_message.length ++] = 0; // Variable header length MSB + /* Defaults to protocol version 5 values */ + connection->buffer[connection->outbound_message.length ++] = 4; // Variable header length LSB + memcpy(&connection->buffer[connection->outbound_message.length], "MQTT", 4); // Protocol name + connection->outbound_message.length += 4; + connection->buffer[connection->outbound_message.length ++] = 5; // Protocol version + + int flags_offset = connection->outbound_message.length; + connection->buffer[connection->outbound_message.length ++] = 0; // Flags + MQTT5_CONVERT_TWO_BYTE(connection->buffer[connection->outbound_message.length ++], info->keepalive) // Keep-alive + + if (info->clean_session) { + connection->buffer[flags_offset] |= MQTT5_CONNECT_FLAG_CLEAN_SESSION; + } + + //Add properties + int properties_offset = connection->outbound_message.length; + connection->outbound_message.length ++; + if (property->session_expiry_interval) { + APPEND_CHECK(append_property(connection, MQTT5_PROPERTY_SESSION_EXPIRY_INTERVAL, 4, NULL, property->session_expiry_interval), fail_message(connection)); + } + if (property->maximum_packet_size) { + APPEND_CHECK(append_property(connection, MQTT5_PROPERTY_MAXIMUM_PACKET_SIZE, 4, NULL, property->maximum_packet_size), fail_message(connection)); + } + if (property->receive_maximum) { + APPEND_CHECK(append_property(connection, MQTT5_PROPERTY_RECEIVE_MAXIMUM, 2, NULL, property->receive_maximum), fail_message(connection)); + } + if (property->topic_alias_maximum) { + APPEND_CHECK(append_property(connection, MQTT5_PROPERTY_TOPIC_ALIAS_MAXIMIM, 2, NULL, property->topic_alias_maximum), fail_message(connection)); + } + if (property->request_resp_info) { + APPEND_CHECK(append_property(connection, MQTT5_PROPERTY_REQUEST_RESP_INFO, 1, NULL, 1), fail_message(connection)); + } + if (property->request_problem_info) { + APPEND_CHECK(append_property(connection, MQTT5_PROPERTY_REQUEST_PROBLEM_INFO, 1, NULL, 1), fail_message(connection)); + } + if (property->user_property) { + mqtt5_user_property_item_t item; + STAILQ_FOREACH(item, property->user_property, next) { + APPEND_CHECK(append_property(connection, MQTT5_PROPERTY_USER_PROPERTY, 2, item->key, strlen(item->key)), fail_message(connection)); + APPEND_CHECK(append_property(connection, 0, 2, item->value, strlen(item->value)), fail_message(connection)); + } + } + APPEND_CHECK(update_property_len_value(connection, connection->outbound_message.length - properties_offset - 1, properties_offset), fail_message(connection)); + + if (info->client_id != NULL && info->client_id[0] != '\0') { + APPEND_CHECK(append_property(connection, 0, 2, info->client_id, strlen(info->client_id)), fail_message(connection)); + } else { + APPEND_CHECK(append_property(connection, 0, 2, NULL, 0), fail_message(connection)); + } + + //Add will properties + if (info->will_topic != NULL && info->will_topic[0] != '\0') { + properties_offset = connection->outbound_message.length; + connection->outbound_message.length ++; + if (will_property->will_delay_interval) { + APPEND_CHECK(append_property(connection, MQTT5_PROPERTY_WILL_DELAY_INTERVAL, 4, NULL, will_property->will_delay_interval), fail_message(connection)); + } + if (will_property->payload_format_indicator) { + APPEND_CHECK(append_property(connection, MQTT5_PROPERTY_PAYLOAD_FORMAT_INDICATOR, 1, NULL, 1), fail_message(connection)); + } + if (will_property->message_expiry_interval) { + APPEND_CHECK(append_property(connection, MQTT5_PROPERTY_MESSAGE_EXPIRY_INTERVAL, 4, NULL, will_property->message_expiry_interval), fail_message(connection)); + } + if (will_property->content_type) { + APPEND_CHECK(append_property(connection, MQTT5_PROPERTY_CONTENT_TYPE, 2, will_property->content_type, strlen(will_property->content_type)), fail_message(connection)); + } + if (will_property->response_topic) { + APPEND_CHECK(append_property(connection, MQTT5_PROPERTY_RESPONSE_TOPIC, 2, will_property->response_topic, strlen(will_property->response_topic)), fail_message(connection)); + } + if (will_property->correlation_data && will_property->correlation_data_len) { + APPEND_CHECK(append_property(connection, MQTT5_PROPERTY_CORRELATION_DATA, 2, will_property->correlation_data, will_property->correlation_data_len), fail_message(connection)); + } + if (will_property->user_property) { + mqtt5_user_property_item_t item; + STAILQ_FOREACH(item, will_property->user_property, next) { + APPEND_CHECK(append_property(connection, MQTT5_PROPERTY_USER_PROPERTY, 2, item->key, strlen(item->key)), fail_message(connection)); + APPEND_CHECK(append_property(connection, 0, 2, item->value, strlen(item->value)), fail_message(connection)); + } + } + APPEND_CHECK(update_property_len_value(connection, connection->outbound_message.length - properties_offset - 1, properties_offset), fail_message(connection)); + + APPEND_CHECK(append_property(connection, 0, 2, info->will_topic, strlen(info->will_topic)), fail_message(connection)); + APPEND_CHECK(append_property(connection, 0, 2, info->will_message, info->will_length), fail_message(connection)); + + connection->buffer[flags_offset] |= MQTT5_CONNECT_FLAG_WILL; + if (info->will_retain) { + connection->buffer[flags_offset] |= MQTT5_CONNECT_FLAG_WILL_RETAIN; + } + connection->buffer[flags_offset] |= (info->will_qos & 3) << 3; + } + + if (info->username != NULL && info->username[0] != '\0') { + APPEND_CHECK(append_property(connection, 0, 2, info->username, strlen(info->username)), fail_message(connection)); + connection->buffer[flags_offset] |= MQTT5_CONNECT_FLAG_USERNAME; + } + + if (info->password != NULL && info->password[0] != '\0') { + if (info->username == NULL || info->username[0] == '\0') { + /* In case if password is set without username, we need to set a zero length username. + * (otherwise we violate: MQTT-3.1.2-22: If the User Name Flag is set to 0 then the Password Flag MUST be set to 0.) + */ + APPEND_CHECK(append_property(connection, 0, 2, NULL, 0), fail_message(connection)); + connection->buffer[flags_offset] |= MQTT5_CONNECT_FLAG_USERNAME; + } + APPEND_CHECK(append_property(connection, 0, 2, info->password, strlen(info->password)), fail_message(connection)); + connection->buffer[flags_offset] |= MQTT5_CONNECT_FLAG_PASSWORD; + } + + return fini_message(connection, MQTT_MSG_TYPE_CONNECT, 0, 0, 0); +} + +esp_err_t mqtt5_msg_parse_connack_property(uint8_t *buffer, size_t buffer_len, mqtt_connect_info_t *connection_info, esp_mqtt5_connection_property_storage_t *connection_property, esp_mqtt5_connection_server_resp_property_t *resp_property, int *reason_code, uint8_t *ack_flag, mqtt5_user_property_handle_t *user_property) +{ + *reason_code = 0; + *user_property = NULL; + uint8_t len_bytes = 0; + size_t offset = 1; + size_t totlen = get_variable_len(buffer, offset, buffer_len, &len_bytes); + offset += len_bytes; + totlen += offset; + + if (totlen > buffer_len) { + ESP_LOGE(TAG, "Total length %d is over read len %d", totlen, buffer_len); + return ESP_FAIL; + } + + *ack_flag = buffer[offset ++]; //acknowledge flags + *reason_code = buffer[offset ++]; //reason code + size_t property_len = get_variable_len(buffer, offset, buffer_len, &len_bytes); + offset += len_bytes; + uint16_t property_offset = 0, len = 0; + uint8_t *property = (buffer + offset); + while (property_offset < property_len) { + uint8_t property_id = property[property_offset ++]; + switch (property_id) { + case MQTT5_PROPERTY_SESSION_EXPIRY_INTERVAL: + MQTT5_CONVERT_ONE_BYTE_TO_FOUR(connection_property->session_expiry_interval, property[property_offset ++], property[property_offset ++], property[property_offset ++], property[property_offset ++]) + ESP_LOGD(TAG, "MQTT5_PROPERTY_SESSION_EXPIRY_INTERVAL %"PRIu32, connection_property->session_expiry_interval); + continue; + case MQTT5_PROPERTY_RECEIVE_MAXIMUM: + MQTT5_CONVERT_ONE_BYTE_TO_TWO(resp_property->receive_maximum, property[property_offset ++], property[property_offset ++]) + ESP_LOGD(TAG, "MQTT5_PROPERTY_RECEIVE_MAXIMUM %d", resp_property->receive_maximum); + continue; + case MQTT5_PROPERTY_MAXIMUM_QOS: + resp_property->max_qos = property[property_offset ++]; + ESP_LOGD(TAG, "MQTT5_PROPERTY_MAXIMUM_QOS %d", resp_property->max_qos); + continue; + case MQTT5_PROPERTY_RETAIN_AVAILABLE: + resp_property->retain_available = property[property_offset ++]; + ESP_LOGD(TAG, "MQTT5_PROPERTY_RETAIN_AVAILABLE %d", resp_property->retain_available); + continue; + case MQTT5_PROPERTY_MAXIMUM_PACKET_SIZE: + MQTT5_CONVERT_ONE_BYTE_TO_FOUR(resp_property->maximum_packet_size, property[property_offset ++], property[property_offset ++], property[property_offset ++], property[property_offset ++]) + ESP_LOGD(TAG, "MQTT5_PROPERTY_MAXIMUM_PACKET_SIZE %"PRIu32, resp_property->maximum_packet_size); + continue; + case MQTT5_PROPERTY_ASSIGNED_CLIENT_IDENTIFIER: + MQTT5_CONVERT_ONE_BYTE_TO_TWO(len, property[property_offset ++], property[property_offset ++]) + if (connection_info->client_id) { + free(connection_info->client_id); + } + connection_info->client_id = calloc(1, len + 1); + if (!connection_info->client_id) { + ESP_LOGE(TAG, "Failed to calloc %d data", len); + return ESP_FAIL; + } + memcpy(connection_info->client_id, &property[property_offset], len); + connection_info->client_id[len] = '\0'; + property_offset += len; + ESP_LOGD(TAG, "MQTT5_PROPERTY_ASSIGNED_CLIENT_IDENTIFIER %s", connection_info->client_id); + continue; + case MQTT5_PROPERTY_TOPIC_ALIAS_MAXIMIM: + MQTT5_CONVERT_ONE_BYTE_TO_TWO(resp_property->topic_alias_maximum, property[property_offset ++], property[property_offset ++]) + ESP_LOGD(TAG, "MQTT5_PROPERTY_TOPIC_ALIAS_MAXIMIM %d", resp_property->topic_alias_maximum); + continue; + case MQTT5_PROPERTY_REASON_STRING: //only print now + MQTT5_CONVERT_ONE_BYTE_TO_TWO(len, property[property_offset ++], property[property_offset ++]) + ESP_LOGD(TAG, "MQTT5_PROPERTY_REASON_STRING %.*s", len, &property[property_offset]); + property_offset += len; + continue; + case MQTT5_PROPERTY_USER_PROPERTY: { + uint8_t *key = NULL, *value = NULL; + size_t key_len = 0, value_len = 0; + MQTT5_CONVERT_ONE_BYTE_TO_TWO(len, property[property_offset ++], property[property_offset ++]) + key = &property[property_offset]; + key_len = len; + ESP_LOGD(TAG, "MQTT5_PROPERTY_USER_PROPERTY key: %.*s", key_len, (char *)key); + property_offset += len; + MQTT5_CONVERT_ONE_BYTE_TO_TWO(len, property[property_offset ++], property[property_offset ++]) + value = &property[property_offset]; + value_len = len; + ESP_LOGD(TAG, "MQTT5_PROPERTY_USER_PROPERTY value: %.*s", value_len, (char *)value); + property_offset += len; + if (mqtt5_msg_set_user_property(user_property, (char *)key, key_len, (char *)value, value_len) != ESP_OK) { + esp_mqtt5_client_delete_user_property(*user_property); + *user_property = NULL; + ESP_LOGE(TAG, "mqtt5_msg_set_user_property fail"); + return ESP_FAIL; + } + continue; + } + case MQTT5_PROPERTY_WILDCARD_SUBSCR_AVAILABLE: + resp_property->wildcard_subscribe_available = property[property_offset++]; + ESP_LOGD(TAG, "MQTT5_PROPERTY_WILDCARD_SUBSCR_AVAILABLE %d", resp_property->wildcard_subscribe_available); + continue; + case MQTT5_PROPERTY_SUBSCR_IDENTIFIER_AVAILABLE: + resp_property->subscribe_identifiers_available = property[property_offset++]; + ESP_LOGD(TAG, "MQTT5_PROPERTY_SUBSCR_IDENTIFIER_AVAILABLE %d", resp_property->subscribe_identifiers_available); + continue; + case MQTT5_PROPERTY_SHARED_SUBSCR_AVAILABLE: + resp_property->shared_subscribe_available = property[property_offset++]; + ESP_LOGD(TAG, "MQTT5_PROPERTY_SHARED_SUBSCR_AVAILABLE %d", resp_property->shared_subscribe_available); + continue; + case MQTT5_PROPERTY_SERVER_KEEP_ALIVE: + MQTT5_CONVERT_ONE_BYTE_TO_TWO(connection_info->keepalive, property[property_offset ++], property[property_offset ++]) + ESP_LOGD(TAG, "MQTT5_PROPERTY_SERVER_KEEP_ALIVE %lld", connection_info->keepalive); + continue; + case MQTT5_PROPERTY_RESP_INFO: + if (resp_property->response_info) { + free(resp_property->response_info); + } + MQTT5_CONVERT_ONE_BYTE_TO_TWO(len, property[property_offset ++], property[property_offset ++]) + resp_property->response_info = calloc(1, len + 1); + if (!resp_property->response_info) { + ESP_LOGE(TAG, "Failed to calloc %d data", len); + return ESP_FAIL; + } + memcpy(resp_property->response_info, &property[property_offset], len); + resp_property->response_info[len] = '\0'; + property_offset += len; + ESP_LOGD(TAG, "MQTT5_PROPERTY_RESP_INFO %s", resp_property->response_info); + continue; + case MQTT5_PROPERTY_SERVER_REFERENCE: //only print now + MQTT5_CONVERT_ONE_BYTE_TO_TWO(len, property[property_offset ++], property[property_offset ++]) + ESP_LOGD(TAG, "MQTT5_PROPERTY_SERVER_REFERENCE %.*s", len, &property[property_offset]); + property_offset += len; + continue; + case MQTT5_PROPERTY_AUTHENTICATION_METHOD: //only print now + MQTT5_CONVERT_ONE_BYTE_TO_TWO(len, property[property_offset ++], property[property_offset ++]) + ESP_LOGD(TAG, "MQTT5_PROPERTY_AUTHENTICATION_METHOD %.*s", len, &property[property_offset]); + property_offset += len; + continue; + case MQTT5_PROPERTY_AUTHENTICATION_DATA: //only print now + MQTT5_CONVERT_ONE_BYTE_TO_TWO(len, property[property_offset ++], property[property_offset ++]) + ESP_LOGD(TAG, "MQTT5_PROPERTY_AUTHENTICATION_DATA length %d", len); + property_offset += len; + continue; + default: + ESP_LOGW(TAG, "Unknow connack property id 0x%02x", property_id); + return ESP_FAIL; + } + } + return ESP_OK; +} + +mqtt_message_t *mqtt5_msg_publish(mqtt_connection_t *connection, const char *topic, const char *data, int data_length, int qos, int retain, uint16_t *message_id, const esp_mqtt5_publish_property_config_t *property, const char *resp_info) +{ + init_message(connection); + + if ((topic == NULL || topic[0] == '\0') && (!property || !property->topic_alias)){ + ESP_LOGE(TAG, "Message must have a topic filter or a topic alias set"); + return fail_message(connection); + } + int topic_len = (topic == NULL || topic[0] == '\0') ? 0 : strlen(topic); + APPEND_CHECK(append_property(connection, 0, 2, topic, topic_len), fail_message(connection)); + + if (data == NULL && data_length > 0) { + return fail_message(connection); + } + + if (qos > 0) { + if ((*message_id = append_message_id(connection, 0)) == 0) { + return fail_message(connection); + } + } else { + *message_id = 0; + } + + int properties_offset = connection->outbound_message.length; + connection->outbound_message.length ++; + + if (property) { + if (property->payload_format_indicator) { + APPEND_CHECK(append_property(connection, MQTT5_PROPERTY_PAYLOAD_FORMAT_INDICATOR, 1, NULL, 1), fail_message(connection)); + } + if (property->message_expiry_interval) { + APPEND_CHECK(append_property(connection, MQTT5_PROPERTY_MESSAGE_EXPIRY_INTERVAL, 4, NULL, property->message_expiry_interval), fail_message(connection)); + } + if (property->topic_alias) { + APPEND_CHECK(append_property(connection, MQTT5_PROPERTY_TOPIC_ALIAS, 2, NULL, property->topic_alias), fail_message(connection)); + } + if (property->response_topic) { + if (resp_info && strlen(resp_info)) { + uint16_t response_topic_size = strlen(property->response_topic) + strlen(resp_info) + 1; + char *response_topic = calloc(1, response_topic_size); + if (!response_topic) { + ESP_LOGE(TAG, "Failed to calloc %d memory", response_topic_size); + return fail_message(connection); + } + snprintf(response_topic, response_topic_size, "%s/%s", property->response_topic, resp_info); + if (append_property(connection, MQTT5_PROPERTY_RESPONSE_TOPIC, 2, response_topic, response_topic_size) == -1) { + ESP_LOGE(TAG, "%s(%d) fail", __FUNCTION__, __LINE__); + free(response_topic); + return fail_message(connection); + } + free(response_topic); + } else { + APPEND_CHECK(append_property(connection, MQTT5_PROPERTY_RESPONSE_TOPIC, 2, property->response_topic, strlen(property->response_topic)), fail_message(connection)); + } + } + if (property->correlation_data && property->correlation_data_len) { + APPEND_CHECK(append_property(connection, MQTT5_PROPERTY_CORRELATION_DATA, 2, property->correlation_data, property->correlation_data_len), fail_message(connection)); + } + if (property->user_property) { + mqtt5_user_property_item_t item; + STAILQ_FOREACH(item, property->user_property, next) { + APPEND_CHECK(append_property(connection, MQTT5_PROPERTY_USER_PROPERTY, 2, item->key, strlen(item->key)), fail_message(connection)); + APPEND_CHECK(append_property(connection, 0, 2, item->value, strlen(item->value)), fail_message(connection)); + } + } + if (property->content_type) { + APPEND_CHECK(append_property(connection, MQTT5_PROPERTY_CONTENT_TYPE, 2, property->content_type, strlen(property->content_type)), fail_message(connection)); + } + } + APPEND_CHECK(update_property_len_value(connection, connection->outbound_message.length - properties_offset - 1, properties_offset), fail_message(connection)); + + if (connection->outbound_message.length + data_length > connection->buffer_length) { + // Not enough size in buffer -> fragment this message + connection->outbound_message.fragmented_msg_data_offset = connection->outbound_message.length; + memcpy(connection->buffer + connection->outbound_message.length, data, connection->buffer_length - connection->outbound_message.length); + connection->outbound_message.length = connection->buffer_length; + connection->outbound_message.fragmented_msg_total_length = data_length + connection->outbound_message.fragmented_msg_data_offset; + } else { + if (data != NULL) { + memcpy(connection->buffer + connection->outbound_message.length, data, data_length); + connection->outbound_message.length += data_length; + } + connection->outbound_message.fragmented_msg_total_length = 0; + } + return fini_message(connection, MQTT_MSG_TYPE_PUBLISH, 0, qos, retain); +} + +int mqtt5_msg_get_reason_code(uint8_t *buffer, size_t length) +{ + uint8_t len_bytes = 0; + size_t offset = 1; // Message type + size_t variable_len = get_variable_len(buffer, offset, length, &len_bytes); + offset += len_bytes; + + switch (mqtt5_get_type(buffer)) { + case MQTT_MSG_TYPE_PUBACK: + case MQTT_MSG_TYPE_PUBREC: + case MQTT_MSG_TYPE_PUBREL: + case MQTT_MSG_TYPE_PUBCOMP: + if(variable_len == 2) { + return 0; + } + offset += 2; //skip the message id + if (offset >= length) { + ESP_LOGE(TAG, "Invalid control packet, reason code is absent"); + return -1; + } + return buffer[offset]; + case MQTT_MSG_TYPE_SUBACK: + case MQTT_MSG_TYPE_UNSUBACK: { + offset += 2; //skip the message id + if (offset >= length) { + return -1; + } + size_t property_len = get_variable_len(buffer, offset, length, &len_bytes); + offset = offset + len_bytes + property_len; + if (offset >= length) { + ESP_LOGE(TAG, "Invalid control packet, reason code is absent"); + return -1; + } + return buffer[offset]; + } + case MQTT_MSG_TYPE_DISCONNECT: + if (offset >= length) { + return -1; + } else { + return buffer[offset]; + } + default: + break; + } + return -1; +} + +mqtt_message_t *mqtt5_msg_subscribe(mqtt_connection_t *connection, const esp_mqtt_topic_t *topic_list, int size, uint16_t *message_id, const esp_mqtt5_subscribe_property_config_t *property) +{ + init_message(connection); + + if ((*message_id = append_message_id(connection, 0)) == 0) { + return fail_message(connection); + } + + int properties_offset = connection->outbound_message.length; + connection->outbound_message.length ++; + + if (property) { + if (property->subscribe_id) { + APPEND_CHECK(append_property(connection, MQTT5_PROPERTY_SUBSCRIBE_IDENTIFIER, 0, NULL, property->subscribe_id), fail_message(connection)); + } + if (property->user_property) { + mqtt5_user_property_item_t item; + STAILQ_FOREACH(item, property->user_property, next) { + APPEND_CHECK(append_property(connection, MQTT5_PROPERTY_USER_PROPERTY, 2, item->key, strlen(item->key)), fail_message(connection)); + APPEND_CHECK(append_property(connection, 0, 2, item->value, strlen(item->value)), fail_message(connection)); + } + } + } + APPEND_CHECK(update_property_len_value(connection, connection->outbound_message.length - properties_offset - 1, properties_offset), fail_message(connection)); + + for (int topic_number = 0; topic_number < size; ++topic_number) { + if (topic_list[topic_number].filter[0] == '\0') { + return fail_message(connection); + } + if (property && property->is_share_subscribe) { + uint16_t shared_topic_size = strlen(topic_list[topic_number].filter) + strlen(MQTT5_SHARED_SUB) + strlen(property->share_name); + char *shared_topic = calloc(1, shared_topic_size); + if (!shared_topic) { + ESP_LOGE(TAG, "Failed to calloc %d memory", shared_topic_size); + fail_message(connection); + } + snprintf(shared_topic, shared_topic_size, MQTT5_SHARED_SUB, property->share_name, topic_list[topic_number].filter); + if (append_property(connection, 0, 2, shared_topic, strlen(shared_topic)) == -1) { + ESP_LOGE(TAG, "%s(%d) fail", __FUNCTION__, __LINE__); + free(shared_topic); + return fail_message(connection); + } + free(shared_topic); + } else { + APPEND_CHECK(append_property(connection, 0, 2, topic_list[topic_number].filter, strlen(topic_list[topic_number].filter)), fail_message(connection)); + } + + if (connection->outbound_message.length + 1 > connection->buffer_length) { + return fail_message(connection); + } + connection->buffer[connection->outbound_message.length] = 0; + if (property) { + if (property->retain_handle > 0 && property->retain_handle < 3) { + connection->buffer[connection->outbound_message.length] |= (property->retain_handle & 3) << 4; + } + if (property->no_local_flag) { + connection->buffer[connection->outbound_message.length] |= (property->no_local_flag << 2); + } + if (property->retain_as_published_flag) { + connection->buffer[connection->outbound_message.length] |= (property->retain_as_published_flag << 3); + } + } + connection->buffer[connection->outbound_message.length] |= (topic_list[topic_number].qos & 3); + connection->outbound_message.length ++; + } + return fini_message(connection, MQTT_MSG_TYPE_SUBSCRIBE, 0, 1, 0); +} + +mqtt_message_t *mqtt5_msg_disconnect(mqtt_connection_t *connection, esp_mqtt5_disconnect_property_config_t *disconnect_property_info) +{ + init_message(connection); + int reason_offset = connection->outbound_message.length; + connection->buffer[connection->outbound_message.length ++] = 0; + int properties_offset = connection->outbound_message.length; + connection->outbound_message.length ++; + if (disconnect_property_info) { + if (disconnect_property_info->session_expiry_interval) { + APPEND_CHECK(append_property(connection, MQTT5_PROPERTY_SESSION_EXPIRY_INTERVAL, 4, NULL, disconnect_property_info->session_expiry_interval), fail_message(connection)); + } + if (disconnect_property_info->user_property) { + mqtt5_user_property_item_t item; + STAILQ_FOREACH(item, disconnect_property_info->user_property, next) { + APPEND_CHECK(append_property(connection, MQTT5_PROPERTY_USER_PROPERTY, 2, item->key, strlen(item->key)), fail_message(connection)); + APPEND_CHECK(append_property(connection, 0, 2, item->value, strlen(item->value)), fail_message(connection)); + } + } + if (disconnect_property_info->disconnect_reason) { + connection->buffer[reason_offset] = disconnect_property_info->disconnect_reason; + } + } + APPEND_CHECK(update_property_len_value(connection, connection->outbound_message.length - properties_offset - 1, properties_offset), fail_message(connection)); + return fini_message(connection, MQTT_MSG_TYPE_DISCONNECT, 0, 0, 0); +} + +mqtt_message_t *mqtt5_msg_unsubscribe(mqtt_connection_t *connection, const char *topic, uint16_t *message_id, const esp_mqtt5_unsubscribe_property_config_t *property) +{ + init_message(connection); + + if (topic == NULL || topic[0] == '\0') { + return fail_message(connection); + } + + if ((*message_id = append_message_id(connection, 0)) == 0) { + return fail_message(connection); + } + + int properties_offset = connection->outbound_message.length; + connection->outbound_message.length ++; + if (property) { + if (property->user_property) { + mqtt5_user_property_item_t item; + STAILQ_FOREACH(item, property->user_property, next) { + APPEND_CHECK(append_property(connection, MQTT5_PROPERTY_USER_PROPERTY, 2, item->key, strlen(item->key)), fail_message(connection)); + APPEND_CHECK(append_property(connection, 0, 2, item->value, strlen(item->value)), fail_message(connection)); + } + } + } + + APPEND_CHECK(update_property_len_value(connection, connection->outbound_message.length - properties_offset - 1, properties_offset), fail_message(connection)); + if (property && property->is_share_subscribe) { + uint16_t shared_topic_size = strlen(topic) + strlen(MQTT5_SHARED_SUB) + strlen(property->share_name); + char *shared_topic = calloc(1, shared_topic_size); + if (!shared_topic) { + ESP_LOGE(TAG, "Failed to calloc %d memory", shared_topic_size); + fail_message(connection); + } + snprintf(shared_topic, shared_topic_size, MQTT5_SHARED_SUB, property->share_name, topic); + if (append_property(connection, 0, 2, shared_topic, strlen(shared_topic)) == -1) { + ESP_LOGE(TAG, "%s(%d) fail", __FUNCTION__, __LINE__); + free(shared_topic); + return fail_message(connection); + } + free(shared_topic); + } else { + APPEND_CHECK(append_property(connection, 0, 2, topic, strlen(topic)), fail_message(connection)); + } + + return fini_message(connection, MQTT_MSG_TYPE_UNSUBSCRIBE, 0, 1, 0); +} + +mqtt_message_t *mqtt5_msg_puback(mqtt_connection_t *connection, uint16_t message_id) +{ + init_message(connection); + if (append_message_id(connection, message_id) == 0) { + return fail_message(connection); + } + connection->buffer[connection->outbound_message.length ++] = 0; // Regard it is success + int properties_offset = connection->outbound_message.length; + connection->outbound_message.length ++; + APPEND_CHECK(update_property_len_value(connection, connection->outbound_message.length - properties_offset - 1, properties_offset), fail_message(connection)); + return fini_message(connection, MQTT_MSG_TYPE_PUBACK, 0, 0, 0); +} + +mqtt_message_t *mqtt5_msg_pubrec(mqtt_connection_t *connection, uint16_t message_id) +{ + init_message(connection); + if (append_message_id(connection, message_id) == 0) { + return fail_message(connection); + } + connection->buffer[connection->outbound_message.length ++] = 0; // Regard it is success + int properties_offset = connection->outbound_message.length; + connection->outbound_message.length ++; + APPEND_CHECK(update_property_len_value(connection, connection->outbound_message.length - properties_offset - 1, properties_offset), fail_message(connection)); + return fini_message(connection, MQTT_MSG_TYPE_PUBREC, 0, 0, 0); +} + +mqtt_message_t *mqtt5_msg_pubrel(mqtt_connection_t *connection, uint16_t message_id) +{ + init_message(connection); + if (append_message_id(connection, message_id) == 0) { + return fail_message(connection); + } + connection->buffer[connection->outbound_message.length ++] = 0; // Regard it is success + int properties_offset = connection->outbound_message.length; + connection->outbound_message.length ++; + APPEND_CHECK(update_property_len_value(connection, connection->outbound_message.length - properties_offset - 1, properties_offset), fail_message(connection)); + return fini_message(connection, MQTT_MSG_TYPE_PUBREL, 0, 1, 0); +} + +mqtt_message_t *mqtt5_msg_pubcomp(mqtt_connection_t *connection, uint16_t message_id) +{ + init_message(connection); + if (append_message_id(connection, message_id) == 0) { + return fail_message(connection); + } + connection->buffer[connection->outbound_message.length ++] = 0; // Regard it is success + int properties_offset = connection->outbound_message.length; + connection->outbound_message.length ++; + APPEND_CHECK(update_property_len_value(connection, connection->outbound_message.length - properties_offset - 1, properties_offset), fail_message(connection)); + return fini_message(connection, MQTT_MSG_TYPE_PUBCOMP, 0, 0, 0); +} diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/mqtt_msg.c b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/mqtt_msg.c new file mode 100644 index 000000000..582fc92d8 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/mqtt_msg.c @@ -0,0 +1,637 @@ +/* +* Copyright (c) 2014, Stephen Robinson +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* 3. Neither the name of the copyright holder nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* +*/ +#include +#include "mqtt_client.h" +#include "mqtt_msg.h" +#include "mqtt_config.h" +#include "platform.h" + +#define MQTT_MAX_FIXED_HEADER_SIZE 5 +#define MQTT_3_1_VARIABLE_HEADER_SIZE 12 +#define MQTT_3_1_1_VARIABLE_HEADER_SIZE 10 + +enum mqtt_connect_flag { + MQTT_CONNECT_FLAG_USERNAME = 1 << 7, + MQTT_CONNECT_FLAG_PASSWORD = 1 << 6, + MQTT_CONNECT_FLAG_WILL_RETAIN = 1 << 5, + MQTT_CONNECT_FLAG_WILL = 1 << 2, + MQTT_CONNECT_FLAG_CLEAN_SESSION = 1 << 1 +}; + +static int append_string(mqtt_connection_t *connection, const char *string, int len) +{ + if (connection->outbound_message.length + len + 2 > connection->buffer_length) { + return -1; + } + + connection->buffer[connection->outbound_message.length++] = len >> 8; + connection->buffer[connection->outbound_message.length++] = len & 0xff; + memcpy(connection->buffer + connection->outbound_message.length, string, len); + connection->outbound_message.length += len; + + return len + 2; +} + +static uint16_t append_message_id(mqtt_connection_t *connection, uint16_t message_id) +{ + // If message_id is zero then we should assign one, otherwise + // we'll use the one supplied by the caller + while (message_id == 0) { +#if MQTT_MSG_ID_INCREMENTAL + message_id = ++connection->last_message_id; +#else + message_id = platform_random(65535); +#endif + } + + if (connection->outbound_message.length + 2 > connection->buffer_length) { + return 0; + } + + connection->buffer[connection->outbound_message.length++] = message_id >> 8; + connection->buffer[connection->outbound_message.length++] = message_id & 0xff; + + return message_id; +} + +static int set_message_header_size(mqtt_connection_t *connection) +{ + connection->outbound_message.length = MQTT_MAX_FIXED_HEADER_SIZE; + return MQTT_MAX_FIXED_HEADER_SIZE; +} + +static mqtt_message_t *fail_message(mqtt_connection_t *connection) +{ + connection->outbound_message.data = connection->buffer; + connection->outbound_message.length = 0; + return &connection->outbound_message; +} + +static mqtt_message_t *fini_message(mqtt_connection_t *connection, int type, int dup, int qos, int retain) +{ + int message_length = connection->outbound_message.length - MQTT_MAX_FIXED_HEADER_SIZE; + int total_length = message_length; + int encoded_length = 0; + uint8_t encoded_lens[4] = {0}; + // Check if we have fragmented message and update total_len + if (connection->outbound_message.fragmented_msg_total_length) { + total_length = connection->outbound_message.fragmented_msg_total_length - MQTT_MAX_FIXED_HEADER_SIZE; + } + + // Encode MQTT message length + int len_bytes = 0; // size of encoded message length + do { + encoded_length = total_length % 128; + total_length /= 128; + if (total_length > 0) { + encoded_length |= 0x80; + } + encoded_lens[len_bytes] = encoded_length; + len_bytes++; + } while (total_length > 0); + + // Sanity check for MQTT header + if (len_bytes + 1 > MQTT_MAX_FIXED_HEADER_SIZE) { + return fail_message(connection); + } + + // Save the header bytes + connection->outbound_message.length = message_length + len_bytes + 1; // msg len + encoded_size len + type (1 byte) + int offs = MQTT_MAX_FIXED_HEADER_SIZE - 1 - len_bytes; + connection->outbound_message.data = connection->buffer + offs; + connection->outbound_message.fragmented_msg_data_offset -= offs; + // type byte + connection->buffer[offs++] = ((type & 0x0f) << 4) | ((dup & 1) << 3) | ((qos & 3) << 1) | (retain & 1); + // length bytes + for (int j = 0; j < len_bytes; j++) { + connection->buffer[offs++] = encoded_lens[j]; + } + + return &connection->outbound_message; +} + +size_t mqtt_get_total_length(const uint8_t *buffer, size_t length, int *fixed_size_len) +{ + int i; + size_t totlen = 0; + + for (i = 1; i < length; ++i) { + totlen += (buffer[i] & 0x7f) << (7 * (i - 1)); + if ((buffer[i] & 0x80) == 0) { + ++i; + break; + } + } + totlen += i; + if (fixed_size_len) { + *fixed_size_len = i; + } + + return totlen; +} + +bool mqtt_header_complete(uint8_t *buffer, size_t buffer_length) +{ + uint16_t i; + uint16_t topiclen; + + for (i = 1; i < MQTT_MAX_FIXED_HEADER_SIZE; ++i) { + if (i >= buffer_length) { + return false; + } + if ((buffer[i] & 0x80) == 0) { + ++i; + break; + } + } + // i is now the length of the fixed header + + if (i + 2 >= buffer_length) { + return false; + } + topiclen = buffer[i++] << 8; + topiclen |= buffer[i++]; + + i += topiclen; + + if (mqtt_get_qos(buffer) > 0) { + i += 2; + } + // i is now the length of the fixed + variable header + return buffer_length >= i; +} + +char *mqtt_get_publish_topic(uint8_t *buffer, size_t *length) +{ + int i; + int topiclen; + + for (i = 1; i < *length; ++i) { + if ((buffer[i] & 0x80) == 0) { + ++i; + break; + } + } + + if (i + 2 >= *length) { + return NULL; + } + topiclen = buffer[i++] << 8; + topiclen |= buffer[i++]; + + if (i + topiclen > *length) { + return NULL; + } + + *length = topiclen; + return (char *)(buffer + i); +} + +char *mqtt_get_publish_data(uint8_t *buffer, size_t *length) +{ + int i; + int totlen = 0; + int topiclen; + int blength = *length; + *length = 0; + + for (i = 1; i < blength; ++i) { + totlen += (buffer[i] & 0x7f) << (7 * (i - 1)); + if ((buffer[i] & 0x80) == 0) { + ++i; + break; + } + } + totlen += i; + + if (i + 2 >= blength) { + return NULL; + } + topiclen = buffer[i++] << 8; + topiclen |= buffer[i++]; + + if (i + topiclen >= blength) { + return NULL; + } + + i += topiclen; + + if (mqtt_get_qos(buffer) > 0) { + if (i + 2 >= blength) { + return NULL; + } + i += 2; + } + + if (totlen < i) { + return NULL; + } + + if (totlen <= blength) { + *length = totlen - i; + } else { + *length = blength - i; + } + return (char *)(buffer + i); +} + +char *mqtt_get_suback_data(uint8_t *buffer, size_t *length) +{ + // SUBACK payload length = total length - (fixed header (2 bytes) + variable header (2 bytes)) + // This requires the remaining length to be encoded in 1 byte. + if (*length > 4) { + *length -= 4; + return (char *)(buffer + 4); + } + *length = 0; + return NULL; +} + +uint16_t mqtt_get_id(uint8_t *buffer, size_t length) +{ + if (length < 1) { + return 0; + } + + switch (mqtt_get_type(buffer)) { + case MQTT_MSG_TYPE_PUBLISH: { + int i; + int topiclen; + + for (i = 1; i < length; ++i) { + if ((buffer[i] & 0x80) == 0) { + ++i; + break; + } + } + + if (i + 2 >= length) { + return 0; + } + topiclen = buffer[i++] << 8; + topiclen |= buffer[i++]; + + if (i + topiclen > length) { + return 0; + } + i += topiclen; + + if (mqtt_get_qos(buffer) > 0) { + if (i + 2 > length) { + return 0; + } + //i += 2; + } else { + return 0; + } + + return (buffer[i] << 8) | buffer[i + 1]; + } + case MQTT_MSG_TYPE_PUBACK: + case MQTT_MSG_TYPE_PUBREC: + case MQTT_MSG_TYPE_PUBREL: + case MQTT_MSG_TYPE_PUBCOMP: + case MQTT_MSG_TYPE_SUBACK: + case MQTT_MSG_TYPE_UNSUBACK: + case MQTT_MSG_TYPE_SUBSCRIBE: + case MQTT_MSG_TYPE_UNSUBSCRIBE: { + // This requires the remaining length to be encoded in 1 byte, + // which it should be. + if (length >= 4 && (buffer[1] & 0x80) == 0) { + return (buffer[2] << 8) | buffer[3]; + } else { + return 0; + } + } + + default: + return 0; + } +} + +mqtt_message_t *mqtt_msg_connect(mqtt_connection_t *connection, mqtt_connect_info_t *info) +{ + + set_message_header_size(connection); + + int header_len; + if (info->protocol_ver == MQTT_PROTOCOL_V_3_1) { + header_len = MQTT_3_1_VARIABLE_HEADER_SIZE; + } else { + header_len = MQTT_3_1_1_VARIABLE_HEADER_SIZE; + } + + if (connection->outbound_message.length + header_len > connection->buffer_length) { + return fail_message(connection); + } + char *variable_header = (char *)(connection->buffer + connection->outbound_message.length); + connection->outbound_message.length += header_len; + + int header_idx = 0; + variable_header[header_idx++] = 0; // Variable header length MSB + + if (info->protocol_ver == MQTT_PROTOCOL_V_3_1) { + variable_header[header_idx++] = 6; // Variable header length LSB + memcpy(&variable_header[header_idx], "MQIsdp", 6); // Protocol name + header_idx = header_idx + 6; + variable_header[header_idx++] = 3; // Protocol version + } else { + /* Defaults to protocol version 3.1.1 values */ + variable_header[header_idx++] = 4; // Variable header length LSB + memcpy(&variable_header[header_idx], "MQTT", 4); // Protocol name + header_idx = header_idx + 4; + variable_header[header_idx++] = 4; // Protocol version + } + + int flags_offset = header_idx; + variable_header[header_idx++] = 0; // Flags + variable_header[header_idx++] = info->keepalive >> 8; // Keep-alive MSB + variable_header[header_idx] = info->keepalive & 0xff; // Keep-alive LSB + + if (info->clean_session) { + variable_header[flags_offset] |= MQTT_CONNECT_FLAG_CLEAN_SESSION; + } + + if (info->client_id != NULL && info->client_id[0] != '\0') { + if (append_string(connection, info->client_id, strlen(info->client_id)) < 0) { + return fail_message(connection); + } + } else { + if (append_string(connection, "", 0) < 0) { + return fail_message(connection); + } + } + + if (info->will_topic != NULL && info->will_topic[0] != '\0') { + if (append_string(connection, info->will_topic, strlen(info->will_topic)) < 0) { + return fail_message(connection); + } + + if (append_string(connection, info->will_message, info->will_length) < 0) { + return fail_message(connection); + } + + variable_header[flags_offset] |= MQTT_CONNECT_FLAG_WILL; + if (info->will_retain) { + variable_header[flags_offset] |= MQTT_CONNECT_FLAG_WILL_RETAIN; + } + variable_header[flags_offset] |= (info->will_qos & 3) << 3; + } + + if (info->username != NULL && info->username[0] != '\0') { + if (append_string(connection, info->username, strlen(info->username)) < 0) { + return fail_message(connection); + } + + variable_header[flags_offset] |= MQTT_CONNECT_FLAG_USERNAME; + } + + if (info->password != NULL && info->password[0] != '\0') { + if (info->username == NULL || info->username[0] == '\0') { + /* In case if password is set without username, we need to set a zero length username. + * (otherwise we violate: MQTT-3.1.2-22: If the User Name Flag is set to 0 then the Password Flag MUST be set to 0.) + */ + if (append_string(connection, "", 0) < 0) { + return fail_message(connection); + } + + variable_header[flags_offset] |= MQTT_CONNECT_FLAG_USERNAME; + } + + if (append_string(connection, info->password, strlen(info->password)) < 0) { + return fail_message(connection); + } + + variable_header[flags_offset] |= MQTT_CONNECT_FLAG_PASSWORD; + } + + return fini_message(connection, MQTT_MSG_TYPE_CONNECT, 0, 0, 0); +} + +mqtt_message_t *mqtt_msg_publish(mqtt_connection_t *connection, const char *topic, const char *data, int data_length, int qos, int retain, uint16_t *message_id) +{ + set_message_header_size(connection); + + if (topic == NULL || topic[0] == '\0') { + return fail_message(connection); + } + + if (append_string(connection, topic, strlen(topic)) < 0) { + return fail_message(connection); + } + + if (data == NULL && data_length > 0) { + return fail_message(connection); + } + + if (qos > 0) { + if ((*message_id = append_message_id(connection, 0)) == 0) { + return fail_message(connection); + } + } else { + *message_id = 0; + } + + if (data != NULL) { + if (connection->outbound_message.length + data_length > connection->buffer_length) { + // Not enough size in buffer -> fragment this message + connection->outbound_message.fragmented_msg_data_offset = connection->outbound_message.length; + memcpy(connection->buffer + connection->outbound_message.length, data, connection->buffer_length - connection->outbound_message.length); + connection->outbound_message.length = connection->buffer_length; + connection->outbound_message.fragmented_msg_total_length = data_length + connection->outbound_message.fragmented_msg_data_offset; + } else { + memcpy(connection->buffer + connection->outbound_message.length, data, data_length); + connection->outbound_message.length += data_length; + connection->outbound_message.fragmented_msg_total_length = 0; + } + } + return fini_message(connection, MQTT_MSG_TYPE_PUBLISH, 0, qos, retain); +} + +mqtt_message_t *mqtt_msg_puback(mqtt_connection_t *connection, uint16_t message_id) +{ + set_message_header_size(connection); + if (append_message_id(connection, message_id) == 0) { + return fail_message(connection); + } + return fini_message(connection, MQTT_MSG_TYPE_PUBACK, 0, 0, 0); +} + +mqtt_message_t *mqtt_msg_pubrec(mqtt_connection_t *connection, uint16_t message_id) +{ + set_message_header_size(connection); + if (append_message_id(connection, message_id) == 0) { + return fail_message(connection); + } + return fini_message(connection, MQTT_MSG_TYPE_PUBREC, 0, 0, 0); +} + +mqtt_message_t *mqtt_msg_pubrel(mqtt_connection_t *connection, uint16_t message_id) +{ + set_message_header_size(connection); + if (append_message_id(connection, message_id) == 0) { + return fail_message(connection); + } + return fini_message(connection, MQTT_MSG_TYPE_PUBREL, 0, 1, 0); +} + +mqtt_message_t *mqtt_msg_pubcomp(mqtt_connection_t *connection, uint16_t message_id) +{ + set_message_header_size(connection); + if (append_message_id(connection, message_id) == 0) { + return fail_message(connection); + } + return fini_message(connection, MQTT_MSG_TYPE_PUBCOMP, 0, 0, 0); +} + +mqtt_message_t *mqtt_msg_subscribe(mqtt_connection_t *connection, const esp_mqtt_topic_t topic_list[], int size, uint16_t *message_id) +{ + set_message_header_size(connection); + + if ((*message_id = append_message_id(connection, 0)) == 0) { + return fail_message(connection); + } + + for (int topic_number = 0; topic_number < size; ++topic_number) { + if (topic_list[topic_number].filter[0] == '\0') { + return fail_message(connection); + } + + if (append_string(connection, topic_list[topic_number].filter, strlen(topic_list[topic_number].filter)) < 0) { + return fail_message(connection); + } + + if (connection->outbound_message.length + 1 > connection->buffer_length) { + return fail_message(connection); + } + connection->buffer[connection->outbound_message.length] = topic_list[topic_number].qos; + connection->outbound_message.length ++; + } + + return fini_message(connection, MQTT_MSG_TYPE_SUBSCRIBE, 0, 1, 0); +} + +mqtt_message_t *mqtt_msg_unsubscribe(mqtt_connection_t *connection, const char *topic, uint16_t *message_id) +{ + set_message_header_size(connection); + + if (topic == NULL || topic[0] == '\0') { + return fail_message(connection); + } + + if ((*message_id = append_message_id(connection, 0)) == 0) { + return fail_message(connection); + } + + if (append_string(connection, topic, strlen(topic)) < 0) { + return fail_message(connection); + } + + return fini_message(connection, MQTT_MSG_TYPE_UNSUBSCRIBE, 0, 1, 0); +} + +mqtt_message_t *mqtt_msg_pingreq(mqtt_connection_t *connection) +{ + set_message_header_size(connection); + return fini_message(connection, MQTT_MSG_TYPE_PINGREQ, 0, 0, 0); +} + +mqtt_message_t *mqtt_msg_pingresp(mqtt_connection_t *connection) +{ + set_message_header_size(connection); + return fini_message(connection, MQTT_MSG_TYPE_PINGRESP, 0, 0, 0); +} + +mqtt_message_t *mqtt_msg_disconnect(mqtt_connection_t *connection) +{ + set_message_header_size(connection); + return fini_message(connection, MQTT_MSG_TYPE_DISCONNECT, 0, 0, 0); +} + +/* + * check flags: [MQTT-2.2.2-1], [MQTT-2.2.2-2] + * returns 0 if flags are invalid, otherwise returns 1 + */ +int mqtt_has_valid_msg_hdr(uint8_t *buffer, size_t length) +{ + int qos, dup; + + if (length < 1) { + return 0; + } + switch (mqtt_get_type(buffer)) { + case MQTT_MSG_TYPE_CONNECT: + case MQTT_MSG_TYPE_CONNACK: + case MQTT_MSG_TYPE_PUBACK: + case MQTT_MSG_TYPE_PUBREC: + case MQTT_MSG_TYPE_PUBCOMP: + case MQTT_MSG_TYPE_SUBACK: + case MQTT_MSG_TYPE_UNSUBACK: + case MQTT_MSG_TYPE_PINGREQ: + case MQTT_MSG_TYPE_PINGRESP: + case MQTT_MSG_TYPE_DISCONNECT: + return (buffer[0] & 0x0f) == 0; /* all flag bits are 0 */ + case MQTT_MSG_TYPE_PUBREL: + case MQTT_MSG_TYPE_SUBSCRIBE: + case MQTT_MSG_TYPE_UNSUBSCRIBE: + return (buffer[0] & 0x0f) == 0x02; /* only bit 1 is set */ + case MQTT_MSG_TYPE_PUBLISH: + qos = mqtt_get_qos(buffer); + dup = mqtt_get_dup(buffer); + /* + * there is no qos=3 [MQTT-3.3.1-4] + * dup flag must be set to 0 for all qos=0 messages [MQTT-3.3.1-2] + */ + return (qos < 3) && ((qos > 0) || (dup == 0)); + default: + return 0; + } +} + +esp_err_t mqtt_msg_buffer_init(mqtt_connection_t *connection, int buffer_size) +{ + memset(&connection->outbound_message, 0, sizeof(mqtt_message_t)); + connection->buffer = (uint8_t *)calloc(buffer_size, sizeof(uint8_t)); + if (!connection->buffer) { + return ESP_ERR_NO_MEM; + } + connection->buffer_length = buffer_size; + return ESP_OK; +} + +void mqtt_msg_buffer_destroy(mqtt_connection_t *connection) +{ + if (connection) { + free(connection->buffer); + } +} + + diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/mqtt_outbox.c b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/mqtt_outbox.c new file mode 100644 index 000000000..6e63b198e --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/mqtt_outbox.c @@ -0,0 +1,225 @@ +#include "mqtt_outbox.h" +#include +#include +#include +#include "mqtt_config.h" +#include "sys/queue.h" +#include "esp_heap_caps.h" +#include "esp_log.h" + +#ifndef CONFIG_MQTT_CUSTOM_OUTBOX +static const char *TAG = "outbox"; + +typedef struct outbox_item { + char *buffer; + int len; + int msg_id; + int msg_type; + int msg_qos; + outbox_tick_t tick; + pending_state_t pending; + STAILQ_ENTRY(outbox_item) next; +} outbox_item_t; + +STAILQ_HEAD(outbox_list_t, outbox_item); + +struct outbox_t { + _Atomic uint64_t size; + struct outbox_list_t *list; +}; + +outbox_handle_t outbox_init(void) +{ + outbox_handle_t outbox = calloc(1, sizeof(struct outbox_t)); + ESP_MEM_CHECK(TAG, outbox, return NULL); + outbox->list = calloc(1, sizeof(struct outbox_list_t)); + ESP_MEM_CHECK(TAG, outbox->list, {free(outbox); return NULL;}); + outbox->size = 0; + STAILQ_INIT(outbox->list); + return outbox; +} + +outbox_item_handle_t outbox_enqueue(outbox_handle_t outbox, outbox_message_handle_t message, outbox_tick_t tick) +{ + outbox_item_handle_t item = calloc(1, sizeof(outbox_item_t)); + ESP_MEM_CHECK(TAG, item, return NULL); + item->msg_id = message->msg_id; + item->msg_type = message->msg_type; + item->msg_qos = message->msg_qos; + item->tick = tick; + item->len = message->len + message->remaining_len; + item->pending = QUEUED; + item->buffer = heap_caps_malloc(message->len + message->remaining_len, MQTT_OUTBOX_MEMORY); + ESP_MEM_CHECK(TAG, item->buffer, { + free(item); + return NULL; + }); + memcpy(item->buffer, message->data, message->len); + if (message->remaining_data) { + memcpy(item->buffer + message->len, message->remaining_data, message->remaining_len); + } + STAILQ_INSERT_TAIL(outbox->list, item, next); + outbox->size += item->len; + ESP_LOGD(TAG, "ENQUEUE msgid=%d, msg_type=%d, len=%d, size=%"PRIu64, message->msg_id, message->msg_type, message->len + message->remaining_len, outbox_get_size(outbox)); + return item; +} + +outbox_item_handle_t outbox_get(outbox_handle_t outbox, int msg_id) +{ + outbox_item_handle_t item; + STAILQ_FOREACH(item, outbox->list, next) { + if (item->msg_id == msg_id) { + return item; + } + } + return NULL; +} + +outbox_item_handle_t outbox_dequeue(outbox_handle_t outbox, pending_state_t pending, outbox_tick_t *tick) +{ + outbox_item_handle_t item; + STAILQ_FOREACH(item, outbox->list, next) { + if (item->pending == pending) { + if (tick) { + *tick = item->tick; + } + return item; + } + } + return NULL; +} + +esp_err_t outbox_delete_item(outbox_handle_t outbox, outbox_item_handle_t item_to_delete) +{ + outbox_item_handle_t item; + STAILQ_FOREACH(item, outbox->list, next) { + if (item == item_to_delete) { + STAILQ_REMOVE(outbox->list, item, outbox_item, next); + outbox->size -= item->len; + ESP_LOGD(TAG, "DELETE_ITEM msgid=%d, msg_type=%d, remain size=%"PRIu64, item_to_delete->msg_id, item_to_delete->msg_type, outbox_get_size(outbox)); + free(item->buffer); + free(item); + return ESP_OK; + } + } + return ESP_FAIL; +} + +uint8_t *outbox_item_get_data(outbox_item_handle_t item, size_t *len, uint16_t *msg_id, int *msg_type, int *qos) +{ + if (item) { + *len = item->len; + *msg_id = item->msg_id; + *msg_type = item->msg_type; + *qos = item->msg_qos; + return (uint8_t *)item->buffer; + } + return NULL; +} + +esp_err_t outbox_delete(outbox_handle_t outbox, int msg_id, int msg_type) +{ + outbox_item_handle_t item, tmp; + STAILQ_FOREACH_SAFE(item, outbox->list, next, tmp) { + if (item->msg_id == msg_id && (0xFF & (item->msg_type)) == msg_type) { + STAILQ_REMOVE(outbox->list, item, outbox_item, next); + outbox->size -= item->len; + ESP_LOGD(TAG, "DELETE msgid=%d, msg_type=%d, remain size=%"PRIu64, msg_id, msg_type, outbox_get_size(outbox)); + free(item->buffer); + free(item); + return ESP_OK; + } + + } + return ESP_FAIL; +} + +esp_err_t outbox_set_pending(outbox_handle_t outbox, int msg_id, pending_state_t pending) +{ + outbox_item_handle_t item = outbox_get(outbox, msg_id); + if (item) { + item->pending = pending; + return ESP_OK; + } + return ESP_FAIL; +} + +pending_state_t outbox_item_get_pending(outbox_item_handle_t item) +{ + if (item) { + return item->pending; + } + return QUEUED; +} + +esp_err_t outbox_set_tick(outbox_handle_t outbox, int msg_id, outbox_tick_t tick) +{ + outbox_item_handle_t item = outbox_get(outbox, msg_id); + if (item) { + item->tick = tick; + return ESP_OK; + } + return ESP_FAIL; +} + +int outbox_delete_single_expired(outbox_handle_t outbox, outbox_tick_t current_tick, outbox_tick_t timeout) +{ + int msg_id = -1; + outbox_item_handle_t item; + STAILQ_FOREACH(item, outbox->list, next) { + if (current_tick - item->tick > timeout) { + STAILQ_REMOVE(outbox->list, item, outbox_item, next); + free(item->buffer); + outbox->size -= item->len; + msg_id = item->msg_id; + free(item); + ESP_LOGD(TAG, "DELETE_SINGLE_EXPIRED msgid=%d, remain size=%"PRIu64, msg_id, outbox_get_size(outbox)); + return msg_id; + } + + } + return msg_id; +} + +int outbox_delete_expired(outbox_handle_t outbox, outbox_tick_t current_tick, outbox_tick_t timeout) +{ + int deleted_items = 0; + outbox_item_handle_t item, tmp; + STAILQ_FOREACH_SAFE(item, outbox->list, next, tmp) { + if (current_tick - item->tick > timeout) { + STAILQ_REMOVE(outbox->list, item, outbox_item, next); + free(item->buffer); + outbox->size -= item->len; + ESP_LOGD(TAG, "DELETE_EXPIRED msgid=%d, remain size=%"PRIu64, item->msg_id, outbox_get_size(outbox)); + free(item); + deleted_items ++; + } + + } + return deleted_items; +} + +uint64_t outbox_get_size(outbox_handle_t outbox) +{ + return outbox->size; +} + +void outbox_delete_all_items(outbox_handle_t outbox) +{ + outbox_item_handle_t item, tmp; + STAILQ_FOREACH_SAFE(item, outbox->list, next, tmp) { + STAILQ_REMOVE(outbox->list, item, outbox_item, next); + outbox->size -= item->len; + ESP_LOGD(TAG, "DELETE_ALL_ITEMS msgid=%d, msg_type=%d, remain size=%"PRIu64, item->msg_id, item->msg_type, outbox_get_size(outbox)); + free(item->buffer); + free(item); + } +} +void outbox_destroy(outbox_handle_t outbox) +{ + outbox_delete_all_items(outbox); + free(outbox->list); + free(outbox); +} + +#endif /* CONFIG_MQTT_CUSTOM_OUTBOX */ diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/platform_esp32_idf.c b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/platform_esp32_idf.c new file mode 100644 index 000000000..a84e6fbf6 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/lib/platform_esp32_idf.c @@ -0,0 +1,48 @@ +#include "platform.h" + +#ifdef ESP_PLATFORM +#include "esp_log.h" +#include "esp_mac.h" +#include "soc/soc_caps.h" +#include "esp_timer.h" +#include "esp_random.h" +#include +#include + +static const char *TAG = "platform"; + +#define MAX_ID_STRING (32) + +#if defined SOC_WIFI_SUPPORTED +#define MAC_TYPE ESP_MAC_WIFI_STA +#elif defined SOC_EMAC_SUPPORTED +#define MAC_TYPE ESP_MAC_ETH +#elif defined SOC_IEEE802154_SUPPORTED +#define MAC_TYPE ESP_MAC_IEEE802154 +#endif +char *platform_create_id_string(void) +{ + char *id_string = calloc(1, MAX_ID_STRING); + ESP_MEM_CHECK(TAG, id_string, return NULL); + #ifndef MAC_TYPE + ESP_LOGW(TAG, "Soc doesn't provide MAC, client could be disconnected in case of device with same name in the broker."); + sprintf(id_string, "esp_mqtt_client_id"); + #else + uint8_t mac[6]; + esp_read_mac(mac, MAC_TYPE); + sprintf(id_string, "ESP32_%02x%02X%02X", mac[3], mac[4], mac[5]); + #endif + return id_string; +} + +int platform_random(int max) +{ + return esp_random() % max; +} + +uint64_t platform_tick_get_ms(void) +{ + return esp_timer_get_time()/(int64_t)1000; +} + +#endif diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/mqtt5_client.c b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/mqtt5_client.c new file mode 100644 index 000000000..060dfed55 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/mqtt5_client.c @@ -0,0 +1,768 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "mqtt_client_priv.h" +#include "esp_log.h" +#include + +static const char *TAG = "mqtt5_client"; + +static void esp_mqtt5_print_error_code(esp_mqtt5_client_handle_t client, int code); +static esp_err_t esp_mqtt5_client_update_topic_alias(mqtt5_topic_alias_handle_t topic_alias_handle, uint16_t topic_alias, char *topic, size_t topic_len); +static char *esp_mqtt5_client_get_topic_alias(mqtt5_topic_alias_handle_t topic_alias_handle, uint16_t topic_alias, size_t *topic_length); +static void esp_mqtt5_client_delete_topic_alias(mqtt5_topic_alias_handle_t topic_alias_handle); +static esp_err_t esp_mqtt5_user_property_copy(mqtt5_user_property_handle_t user_property_new, const mqtt5_user_property_handle_t user_property_old); + +void esp_mqtt5_increment_packet_counter(esp_mqtt5_client_handle_t client) +{ + bool msg_dup = mqtt5_get_dup(client->mqtt_state.connection.outbound_message.data); + if (msg_dup == false) { + client->send_publish_packet_count ++; + ESP_LOGD(TAG, "Sent (%d) qos > 0 publish packet without ack", client->send_publish_packet_count); + } +} + +void esp_mqtt5_decrement_packet_counter(esp_mqtt5_client_handle_t client) +{ + if (client->send_publish_packet_count > 0) { + client->send_publish_packet_count --; + ESP_LOGD(TAG, "Receive (%d) qos > 0 publish packet with ack", client->send_publish_packet_count); + } +} + +void esp_mqtt5_parse_pubcomp(esp_mqtt5_client_handle_t client) +{ + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { + ESP_LOGD(TAG, "MQTT_MSG_TYPE_PUBCOMP return code is %d", mqtt5_msg_get_reason_code(client->mqtt_state.in_buffer, client->mqtt_state.in_buffer_read_len)); + size_t msg_data_len = client->mqtt_state.in_buffer_read_len; + client->event.data = mqtt5_get_pubcomp_data(client->mqtt_state.in_buffer, &msg_data_len, &client->event.property->user_property); + client->event.data_len = msg_data_len; + client->event.total_data_len = msg_data_len; + client->event.current_data_offset = 0; + } +} + +void esp_mqtt5_parse_puback(esp_mqtt5_client_handle_t client) +{ + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { + ESP_LOGD(TAG, "MQTT_MSG_TYPE_PUBACK return code is %d", mqtt5_msg_get_reason_code(client->mqtt_state.in_buffer, client->mqtt_state.in_buffer_read_len)); + size_t msg_data_len = client->mqtt_state.in_buffer_read_len; + client->event.data = mqtt5_get_puback_data(client->mqtt_state.in_buffer, &msg_data_len, &client->event.property->user_property); + client->event.data_len = msg_data_len; + client->event.total_data_len = msg_data_len; + client->event.current_data_offset = 0; + } +} + +void esp_mqtt5_parse_unsuback(esp_mqtt5_client_handle_t client) +{ + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { + ESP_LOGD(TAG, "MQTT_MSG_TYPE_UNSUBACK return code is %d", mqtt5_msg_get_reason_code(client->mqtt_state.in_buffer, client->mqtt_state.in_buffer_read_len)); + size_t msg_data_len = client->mqtt_state.in_buffer_read_len; + client->event.data = mqtt5_get_unsuback_data(client->mqtt_state.in_buffer, &msg_data_len, &client->event.property->user_property); + client->event.data_len = msg_data_len; + client->event.total_data_len = msg_data_len; + client->event.current_data_offset = 0; + } +} + +void esp_mqtt5_parse_suback(esp_mqtt5_client_handle_t client) +{ + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { + ESP_LOGD(TAG, "MQTT_MSG_TYPE_SUBACK return code is %d", mqtt5_msg_get_reason_code(client->mqtt_state.in_buffer, client->mqtt_state.in_buffer_read_len)); + } +} + +void esp_mqtt5_parse_disconnect(esp_mqtt5_client_handle_t client, int *disconnect_rsp_code) +{ + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { + *disconnect_rsp_code = mqtt5_msg_get_reason_code(client->mqtt_state.in_buffer, client->mqtt_state.in_buffer_read_len); + ESP_LOGD(TAG, "MQTT_MSG_TYPE_DISCONNECT return code is %d", *disconnect_rsp_code); + } +} + +esp_err_t esp_mqtt5_parse_connack(esp_mqtt5_client_handle_t client, int *connect_rsp_code) +{ + size_t len = client->mqtt_state.in_buffer_read_len; + client->mqtt_state.in_buffer_read_len = 0; + uint8_t ack_flag = 0; + if (mqtt5_msg_parse_connack_property(client->mqtt_state.in_buffer, len, &client->mqtt_state. + connection.information, &client->mqtt5_config->connect_property_info, &client->mqtt5_config->server_resp_property_info, connect_rsp_code, &ack_flag, &client->event.property->user_property) != ESP_OK) { + ESP_LOGE(TAG, "Failed to parse CONNACK packet"); + return ESP_FAIL; + } + if (*connect_rsp_code == MQTT_CONNECTION_ACCEPTED) { + ESP_LOGD(TAG, "Connected"); + client->event.session_present = ack_flag & 0x01; + return ESP_OK; + } + esp_mqtt5_print_error_code(client, *connect_rsp_code); + return ESP_FAIL; +} + +esp_err_t esp_mqtt5_get_publish_data(esp_mqtt5_client_handle_t client, uint8_t *msg_buf, size_t msg_read_len, char **msg_topic, size_t *msg_topic_len, char **msg_data, size_t *msg_data_len) +{ + // get property + uint16_t property_len = 0; + esp_mqtt5_publish_resp_property_t property = {0}; + *msg_data = mqtt5_get_publish_property_payload(msg_buf, msg_read_len, msg_topic, msg_topic_len, &property, &property_len, msg_data_len, &client->event.property->user_property); + if (*msg_data == NULL) { + ESP_LOGE(TAG, "%s: mqtt5_get_publish_property_payload() failed", __func__); + return ESP_FAIL; + } + + if (property.topic_alias > client->mqtt5_config->connect_property_info.topic_alias_maximum) { + ESP_LOGE(TAG, "%s: Broker response topic alias %d is over the max topic alias %d", __func__, property.topic_alias, client->mqtt5_config->connect_property_info.topic_alias_maximum); + return ESP_FAIL; + } + + if (property.topic_alias) { + if (*msg_topic_len == 0) { + *msg_topic = esp_mqtt5_client_get_topic_alias(client->mqtt5_config->peer_topic_alias, property.topic_alias, msg_topic_len); + if (!*msg_topic) { + ESP_LOGE(TAG, "%s: esp_mqtt5_client_get_topic_alias() failed", __func__); + return ESP_FAIL; + } + } else { + if (esp_mqtt5_client_update_topic_alias(client->mqtt5_config->peer_topic_alias, property.topic_alias, *msg_topic, *msg_topic_len) != ESP_OK) { + ESP_LOGE(TAG, "%s: esp_mqtt5_client_update_topic_alias() failed", __func__); + return ESP_FAIL; + } + } + } + + client->event.property->payload_format_indicator = property.payload_format_indicator; + client->event.property->response_topic = property.response_topic; + client->event.property->response_topic_len = property.response_topic_len; + client->event.property->correlation_data = property.correlation_data; + client->event.property->correlation_data_len = property.correlation_data_len; + client->event.property->content_type = property.content_type; + client->event.property->content_type_len = property.content_type_len; + client->event.property->subscribe_id = property.subscribe_id; + return ESP_OK; +} + +esp_err_t esp_mqtt5_create_default_config(esp_mqtt5_client_handle_t client) +{ + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { + client->event.property = calloc(1, sizeof(esp_mqtt5_event_property_t)); + ESP_MEM_CHECK(TAG, client->event.property, return ESP_FAIL) + client->mqtt5_config = calloc(1, sizeof(mqtt5_config_storage_t)); + ESP_MEM_CHECK(TAG, client->mqtt5_config, return ESP_FAIL) + client->mqtt5_config->server_resp_property_info.max_qos = 2; + client->mqtt5_config->server_resp_property_info.retain_available = true; + client->mqtt5_config->server_resp_property_info.wildcard_subscribe_available = true; + client->mqtt5_config->server_resp_property_info.subscribe_identifiers_available = true; + client->mqtt5_config->server_resp_property_info.shared_subscribe_available = true; + client->mqtt5_config->server_resp_property_info.receive_maximum = 65535; + } + return ESP_OK; +} + +static void esp_mqtt5_print_error_code(esp_mqtt5_client_handle_t client, int code) +{ + switch (code) { + case MQTT5_UNSPECIFIED_ERROR: + ESP_LOGW(TAG, "Unspecified error"); + break; + case MQTT5_MALFORMED_PACKET: + ESP_LOGW(TAG, "Malformed Packet"); + break; + case MQTT5_PROTOCOL_ERROR: + ESP_LOGW(TAG, "Protocol Error"); + break; + case MQTT5_IMPLEMENT_SPECIFIC_ERROR: + ESP_LOGW(TAG, "Implementation specific error"); + break; + case MQTT5_UNSUPPORTED_PROTOCOL_VER: + ESP_LOGW(TAG, "Unsupported Protocol Version"); + break; + case MQTT5_INVALID_CLIENT_ID: + ESP_LOGW(TAG, "Client Identifier not valid"); + break; + case MQTT5_BAD_USERNAME_OR_PWD: + ESP_LOGW(TAG, "Bad User Name or Password"); + break; + case MQTT5_NOT_AUTHORIZED: + ESP_LOGW(TAG, "Not authorized"); + break; + case MQTT5_SERVER_UNAVAILABLE: + ESP_LOGW(TAG, "Server unavailable"); + break; + case MQTT5_SERVER_BUSY: + ESP_LOGW(TAG, "Server busy"); + break; + case MQTT5_BANNED: + ESP_LOGW(TAG, "Banned"); + break; + case MQTT5_SERVER_SHUTTING_DOWN: + ESP_LOGW(TAG, "Server shutting down"); + break; + case MQTT5_BAD_AUTH_METHOD: + ESP_LOGW(TAG, "Bad authentication method"); + break; + case MQTT5_KEEP_ALIVE_TIMEOUT: + ESP_LOGW(TAG, "Keep Alive timeout"); + break; + case MQTT5_SESSION_TAKEN_OVER: + ESP_LOGW(TAG, "Session taken over"); + break; + case MQTT5_TOPIC_FILTER_INVALID: + ESP_LOGW(TAG, "Topic Filter invalid"); + break; + case MQTT5_TOPIC_NAME_INVALID: + ESP_LOGW(TAG, "Topic Name invalid"); + break; + case MQTT5_PACKET_IDENTIFIER_IN_USE: + ESP_LOGW(TAG, "Packet Identifier in use"); + break; + case MQTT5_PACKET_IDENTIFIER_NOT_FOUND: + ESP_LOGW(TAG, "Packet Identifier not found"); + break; + case MQTT5_RECEIVE_MAXIMUM_EXCEEDED: + ESP_LOGW(TAG, "Receive Maximum exceeded"); + break; + case MQTT5_TOPIC_ALIAS_INVALID: + ESP_LOGW(TAG, "Topic Alias invalid"); + break; + case MQTT5_PACKET_TOO_LARGE: + ESP_LOGW(TAG, "Packet too large"); + break; + case MQTT5_MESSAGE_RATE_TOO_HIGH: + ESP_LOGW(TAG, "Message rate too high"); + break; + case MQTT5_QUOTA_EXCEEDED: + ESP_LOGW(TAG, "Quota exceeded"); + break; + case MQTT5_ADMINISTRATIVE_ACTION: + ESP_LOGW(TAG, "Administrative action"); + break; + case MQTT5_PAYLOAD_FORMAT_INVALID: + ESP_LOGW(TAG, "Payload format invalid"); + break; + case MQTT5_RETAIN_NOT_SUPPORT: + ESP_LOGW(TAG, "Retain not supported"); + break; + case MQTT5_QOS_NOT_SUPPORT: + ESP_LOGW(TAG, "QoS not supported"); + break; + case MQTT5_USE_ANOTHER_SERVER: + ESP_LOGW(TAG, "Use another server"); + break; + case MQTT5_SERVER_MOVED: + ESP_LOGW(TAG, "Server moved"); + break; + case MQTT5_SHARED_SUBSCR_NOT_SUPPORTED: + ESP_LOGW(TAG, "Shared Subscriptions not supported"); + break; + case MQTT5_CONNECTION_RATE_EXCEEDED: + ESP_LOGW(TAG, "Connection rate exceeded"); + break; + case MQTT5_MAXIMUM_CONNECT_TIME: + ESP_LOGW(TAG, "Maximum connect time"); + break; + case MQTT5_SUBSCRIBE_IDENTIFIER_NOT_SUPPORT: + ESP_LOGW(TAG, "Subscription Identifiers not supported"); + break; + case MQTT5_WILDCARD_SUBSCRIBE_NOT_SUPPORT: + ESP_LOGW(TAG, "Wildcard Subscriptions not supported"); + break; + default: + ESP_LOGW(TAG, "Connection refused, Unknow reason"); + break; + } +} + +esp_err_t esp_mqtt5_client_subscribe_check(esp_mqtt5_client_handle_t client, int qos) +{ + /* Check Server support QoS level */ + if (client->mqtt5_config->server_resp_property_info.max_qos < qos) { + ESP_LOGE(TAG, "Server only support max QoS level %d", client->mqtt5_config->server_resp_property_info.max_qos); + return ESP_FAIL; + } + + return ESP_OK; +} + +esp_err_t esp_mqtt5_client_publish_check(esp_mqtt5_client_handle_t client, int qos, int retain) +{ + /* Check Server support QoS level */ + if (client->mqtt5_config->server_resp_property_info.max_qos < qos) { + ESP_LOGE(TAG, "Server only support max QoS level %d", client->mqtt5_config->server_resp_property_info.max_qos); + return ESP_FAIL; + } + + /* Check Server support RETAIN */ + if (!client->mqtt5_config->server_resp_property_info.retain_available && retain) { + ESP_LOGE(TAG, "Server not support retain"); + return ESP_FAIL; + } + + /* Flow control to check PUBLISH(No PUBACK or PUBCOMP received) packet sent count(Only record QoS1 and QoS2)*/ + if (client->send_publish_packet_count > client->mqtt5_config->server_resp_property_info.receive_maximum) { + ESP_LOGE(TAG, "Client send more than %d QoS1 and QoS2 PUBLISH packet without no ack", client->mqtt5_config->server_resp_property_info.receive_maximum); + return ESP_FAIL; + } + + return ESP_OK; +} + +void esp_mqtt5_client_destory(esp_mqtt5_client_handle_t client) +{ + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { + if (client->mqtt5_config) { + free(client->mqtt5_config->will_property_info.content_type); + free(client->mqtt5_config->will_property_info.response_topic); + free(client->mqtt5_config->will_property_info.correlation_data); + free(client->mqtt5_config->server_resp_property_info.response_info); + esp_mqtt5_client_delete_topic_alias(client->mqtt5_config->peer_topic_alias); + esp_mqtt5_client_delete_user_property(client->mqtt5_config->connect_property_info.user_property); + esp_mqtt5_client_delete_user_property(client->mqtt5_config->will_property_info.user_property); + esp_mqtt5_client_delete_user_property(client->mqtt5_config->disconnect_property_info.user_property); + free(client->mqtt5_config); + } + free(client->event.property); + } +} + +static void esp_mqtt5_client_delete_topic_alias(mqtt5_topic_alias_handle_t topic_alias_handle) +{ + if (topic_alias_handle) { + mqtt5_topic_alias_item_t item, tmp; + STAILQ_FOREACH_SAFE(item, topic_alias_handle, next, tmp) { + STAILQ_REMOVE(topic_alias_handle, item, mqtt5_topic_alias, next); + free(item->topic); + free(item); + } + free(topic_alias_handle); + } +} + +static esp_err_t esp_mqtt5_client_update_topic_alias(mqtt5_topic_alias_handle_t topic_alias_handle, uint16_t topic_alias, char *topic, size_t topic_len) +{ + mqtt5_topic_alias_item_t item; + bool found = false; + STAILQ_FOREACH(item, topic_alias_handle, next) { + if (item->topic_alias == topic_alias) { + found = true; + break; + } + } + if (found) { + if ((item->topic_len != topic_len) || strncmp(topic, item->topic, topic_len)) { + free(item->topic); + item->topic = calloc(1, topic_len); + ESP_MEM_CHECK(TAG, item->topic, return ESP_FAIL); + memcpy(item->topic, topic, topic_len); + item->topic_len = topic_len; + } + } else { + item = calloc(1, sizeof(mqtt5_topic_alias_t)); + ESP_MEM_CHECK(TAG, item, return ESP_FAIL); + item->topic_alias = topic_alias; + item->topic_len = topic_len; + item->topic = calloc(1, topic_len); + ESP_MEM_CHECK(TAG, item->topic, { + free(item); + return ESP_FAIL; + }); + memcpy(item->topic, topic, topic_len); + STAILQ_INSERT_TAIL(topic_alias_handle, item, next); + } + return ESP_OK; +} + +static char *esp_mqtt5_client_get_topic_alias(mqtt5_topic_alias_handle_t topic_alias_handle, uint16_t topic_alias, size_t *topic_length) +{ + mqtt5_topic_alias_item_t item; + STAILQ_FOREACH(item, topic_alias_handle, next) { + if (item->topic_alias == topic_alias) { + *topic_length = item->topic_len; + return item->topic; + } + } + *topic_length = 0; + return NULL; +} + +static esp_err_t esp_mqtt5_user_property_copy(mqtt5_user_property_handle_t user_property_new, const mqtt5_user_property_handle_t user_property_old) +{ + if (!user_property_new || !user_property_old) { + ESP_LOGE(TAG, "Input is NULL"); + return ESP_FAIL; + } + + mqtt5_user_property_item_t old_item, new_item; + STAILQ_FOREACH(old_item, user_property_old, next) { + new_item = calloc(1, sizeof(mqtt5_user_property_t)); + ESP_MEM_CHECK(TAG, new_item, return ESP_FAIL); + new_item->key = strdup(old_item->key); + ESP_MEM_CHECK(TAG, new_item->key, { + free(new_item); + return ESP_FAIL; + }); + new_item->value = strdup(old_item->value); + ESP_MEM_CHECK(TAG, new_item->value, { + free(new_item->key); + free(new_item); + return ESP_FAIL; + }); + STAILQ_INSERT_TAIL(user_property_new, new_item, next); + } + return ESP_OK; +} + +esp_err_t esp_mqtt5_client_set_publish_property(esp_mqtt5_client_handle_t client, const esp_mqtt5_publish_property_config_t *property) +{ + if (!client) { + ESP_LOGE(TAG, "Client was not initialized"); + return ESP_ERR_INVALID_ARG; + } + MQTT_API_LOCK(client); + + /* Check protocol version */ + if (client->mqtt_state.connection.information.protocol_ver != MQTT_PROTOCOL_V_5) { + ESP_LOGE(TAG, "MQTT protocol version is not v5"); + MQTT_API_UNLOCK(client); + return ESP_FAIL; + } + /* Check topic alias less than server maximum topic alias */ + if (property->topic_alias > client->mqtt5_config->server_resp_property_info.topic_alias_maximum) { + ESP_LOGE(TAG, "Topic alias %d is bigger than server support %d", property->topic_alias, client->mqtt5_config->server_resp_property_info.topic_alias_maximum); + MQTT_API_UNLOCK(client); + return ESP_FAIL; + } + client->mqtt5_config->publish_property_info = property; + MQTT_API_UNLOCK(client); + return ESP_OK; +} + +esp_err_t esp_mqtt5_client_set_subscribe_property(esp_mqtt5_client_handle_t client, const esp_mqtt5_subscribe_property_config_t *property) +{ + if (!client) { + ESP_LOGE(TAG, "Client was not initialized"); + return ESP_ERR_INVALID_ARG; + } + if (property->retain_handle > 2) { + ESP_LOGE(TAG, "retain_handle only support 0, 1, 2"); + return -1; + } + MQTT_API_LOCK(client); + + /* Check protocol version */ + if (client->mqtt_state.connection.information.protocol_ver != MQTT_PROTOCOL_V_5) { + ESP_LOGE(TAG, "MQTT protocol version is not v5"); + MQTT_API_UNLOCK(client); + return ESP_FAIL; + } + if (property->is_share_subscribe) { + if (property->no_local_flag) { + // MQTT-3.8.3-4 not allow that No Local bit to 1 on a Shared Subscription + ESP_LOGE(TAG, "Protocol error that no local flag set on shared subscription"); + MQTT_API_UNLOCK(client); + return ESP_FAIL; + } + if (!client->mqtt5_config->server_resp_property_info.shared_subscribe_available) { + ESP_LOGE(TAG, "MQTT broker not support shared subscribe"); + MQTT_API_UNLOCK(client); + return ESP_FAIL; + } + if (!property->share_name || !strlen(property->share_name)) { + ESP_LOGE(TAG, "Share name can't be empty for shared subscribe"); + MQTT_API_UNLOCK(client); + return ESP_FAIL; + } + } + client->mqtt5_config->subscribe_property_info = property; + MQTT_API_UNLOCK(client); + return ESP_OK; +} + +esp_err_t esp_mqtt5_client_set_unsubscribe_property(esp_mqtt5_client_handle_t client, const esp_mqtt5_unsubscribe_property_config_t *property) +{ + if (!client) { + ESP_LOGE(TAG, "Client was not initialized"); + return ESP_ERR_INVALID_ARG; + } + MQTT_API_LOCK(client); + + /* Check protocol version */ + if (client->mqtt_state.connection.information.protocol_ver != MQTT_PROTOCOL_V_5) { + ESP_LOGE(TAG, "MQTT protocol version is not v5"); + MQTT_API_UNLOCK(client); + return ESP_FAIL; + } + if (property->is_share_subscribe) { + if (!client->mqtt5_config->server_resp_property_info.shared_subscribe_available) { + ESP_LOGE(TAG, "MQTT broker not support shared subscribe"); + MQTT_API_UNLOCK(client); + return ESP_FAIL; + } + if (!property->share_name || !strlen(property->share_name)) { + ESP_LOGE(TAG, "Share name can't be empty for shared subscribe"); + MQTT_API_UNLOCK(client); + return ESP_FAIL; + } + } + client->mqtt5_config->unsubscribe_property_info = property; + MQTT_API_UNLOCK(client); + return ESP_OK; +} + +esp_err_t esp_mqtt5_client_set_disconnect_property(esp_mqtt5_client_handle_t client, const esp_mqtt5_disconnect_property_config_t *property) +{ + if (!client) { + ESP_LOGE(TAG, "Client was not initialized"); + return ESP_ERR_INVALID_ARG; + } + MQTT_API_LOCK(client); + + /* Check protocol version */ + if (client->mqtt_state.connection.information.protocol_ver != MQTT_PROTOCOL_V_5) { + ESP_LOGE(TAG, "MQTT protocol version is not v5"); + MQTT_API_UNLOCK(client); + return ESP_FAIL; + } + if (property) { + if (property->session_expiry_interval) { + client->mqtt5_config->disconnect_property_info.session_expiry_interval = property->session_expiry_interval; + } + if (property->disconnect_reason) { + client->mqtt5_config->disconnect_property_info.disconnect_reason = property->disconnect_reason; + } + if (property->user_property) { + esp_mqtt5_client_delete_user_property(client->mqtt5_config->disconnect_property_info.user_property); + client->mqtt5_config->disconnect_property_info.user_property = calloc(1, sizeof(struct mqtt5_user_property_list_t)); + ESP_MEM_CHECK(TAG, client->mqtt5_config->disconnect_property_info.user_property, { + MQTT_API_UNLOCK(client); + return ESP_ERR_NO_MEM; + }); + STAILQ_INIT(client->mqtt5_config->disconnect_property_info.user_property); + if (esp_mqtt5_user_property_copy(client->mqtt5_config->disconnect_property_info.user_property, property->user_property) != ESP_OK) { + ESP_LOGE(TAG, "esp_mqtt5_user_property_copy fail"); + free(client->mqtt5_config->disconnect_property_info.user_property); + client->mqtt5_config->disconnect_property_info.user_property = NULL; + MQTT_API_UNLOCK(client); + return ESP_FAIL; + } + } + } + + MQTT_API_UNLOCK(client); + return ESP_OK; +} + +esp_err_t esp_mqtt5_client_set_connect_property(esp_mqtt5_client_handle_t client, const esp_mqtt5_connection_property_config_t *connect_property) +{ + if (!client) { + ESP_LOGE(TAG, "Client was not initialized"); + return ESP_ERR_INVALID_ARG; + } + MQTT_API_LOCK(client); + + /* Check protocol version */ + if (client->mqtt_state.connection.information.protocol_ver != MQTT_PROTOCOL_V_5) { + ESP_LOGE(TAG, "MQTT protocol version is not v5"); + MQTT_API_UNLOCK(client); + return ESP_FAIL; + } + if (connect_property) { + if (connect_property->session_expiry_interval) { + client->mqtt5_config->connect_property_info.session_expiry_interval = connect_property->session_expiry_interval; + } + if (connect_property->maximum_packet_size) { + if (connect_property->maximum_packet_size > client->mqtt_state.in_buffer_length) { + ESP_LOGW(TAG, "Connect maximum_packet_size property is over buffer_size(%d), Please first change it", client->mqtt_state.in_buffer_length); + MQTT_API_UNLOCK(client); + return ESP_FAIL; + } else { + client->mqtt5_config->connect_property_info.maximum_packet_size = connect_property->maximum_packet_size; + } + } else { + client->mqtt5_config->connect_property_info.maximum_packet_size = client->mqtt_state.in_buffer_length; + } + if (connect_property->receive_maximum) { + client->mqtt5_config->connect_property_info.receive_maximum = connect_property->receive_maximum; + } + if (connect_property->topic_alias_maximum) { + client->mqtt5_config->connect_property_info.topic_alias_maximum = connect_property->topic_alias_maximum; + if (!client->mqtt5_config->peer_topic_alias) { + client->mqtt5_config->peer_topic_alias = calloc(1, sizeof(struct mqtt5_topic_alias_list_t)); + ESP_MEM_CHECK(TAG, client->mqtt5_config->peer_topic_alias, goto _mqtt_set_config_failed); + STAILQ_INIT(client->mqtt5_config->peer_topic_alias); + } + } + if (connect_property->request_resp_info) { + client->mqtt5_config->connect_property_info.request_resp_info = connect_property->request_resp_info; + } + if (connect_property->request_problem_info) { + client->mqtt5_config->connect_property_info.request_problem_info = connect_property->request_problem_info; + } + if (connect_property->user_property) { + esp_mqtt5_client_delete_user_property(client->mqtt5_config->connect_property_info.user_property); + client->mqtt5_config->connect_property_info.user_property = calloc(1, sizeof(struct mqtt5_user_property_list_t)); + ESP_MEM_CHECK(TAG, client->mqtt5_config->connect_property_info.user_property, goto _mqtt_set_config_failed); + STAILQ_INIT(client->mqtt5_config->connect_property_info.user_property); + if (esp_mqtt5_user_property_copy(client->mqtt5_config->connect_property_info.user_property, connect_property->user_property) != ESP_OK) { + ESP_LOGE(TAG, "esp_mqtt5_user_property_copy fail"); + goto _mqtt_set_config_failed; + } + } + if (connect_property->payload_format_indicator) { + client->mqtt5_config->will_property_info.payload_format_indicator = connect_property->payload_format_indicator; + } + if (connect_property->will_delay_interval) { + client->mqtt5_config->will_property_info.will_delay_interval = connect_property->will_delay_interval; + } + if (connect_property->message_expiry_interval) { + client->mqtt5_config->will_property_info.message_expiry_interval = connect_property->message_expiry_interval; + } + ESP_MEM_CHECK(TAG, esp_mqtt_set_if_config(connect_property->content_type, &client->mqtt5_config->will_property_info.content_type), goto _mqtt_set_config_failed); + ESP_MEM_CHECK(TAG, esp_mqtt_set_if_config(connect_property->response_topic, &client->mqtt5_config->will_property_info.response_topic), goto _mqtt_set_config_failed); + if (connect_property->correlation_data && connect_property->correlation_data_len) { + free(client->mqtt5_config->will_property_info.correlation_data); + client->mqtt5_config->will_property_info.correlation_data = malloc(connect_property->correlation_data_len); + ESP_MEM_CHECK(TAG, client->mqtt5_config->will_property_info.correlation_data, goto _mqtt_set_config_failed); + memcpy(client->mqtt5_config->will_property_info.correlation_data, connect_property->correlation_data, connect_property->correlation_data_len); + client->mqtt5_config->will_property_info.correlation_data_len = connect_property->correlation_data_len; + } + if (connect_property->will_user_property) { + esp_mqtt5_client_delete_user_property(client->mqtt5_config->will_property_info.user_property); + client->mqtt5_config->will_property_info.user_property = calloc(1, sizeof(struct mqtt5_user_property_list_t)); + ESP_MEM_CHECK(TAG, client->mqtt5_config->will_property_info.user_property, goto _mqtt_set_config_failed); + STAILQ_INIT(client->mqtt5_config->will_property_info.user_property); + if (esp_mqtt5_user_property_copy(client->mqtt5_config->will_property_info.user_property, connect_property->will_user_property) != ESP_OK) { + ESP_LOGE(TAG, "esp_mqtt5_user_property_copy fail"); + goto _mqtt_set_config_failed; + } + } + } + MQTT_API_UNLOCK(client); + return ESP_OK; +_mqtt_set_config_failed: + esp_mqtt_destroy_config(client); + MQTT_API_UNLOCK(client); + return ESP_ERR_NO_MEM; +} + +esp_err_t esp_mqtt5_client_set_user_property(mqtt5_user_property_handle_t *user_property, esp_mqtt5_user_property_item_t item[], uint8_t item_num) +{ + if (!item_num || !item) { + ESP_LOGE(TAG, "Input value is NULL"); + return ESP_FAIL; + } + + if (!*user_property) { + *user_property = calloc(1, sizeof(struct mqtt5_user_property_list_t)); + ESP_MEM_CHECK(TAG, *user_property, return ESP_ERR_NO_MEM); + STAILQ_INIT(*user_property); + } + + for (int i = 0; i < item_num; i ++) { + if (item[i].key && item[i].value) { + mqtt5_user_property_item_t user_property_item = calloc(1, sizeof(mqtt5_user_property_t)); + ESP_MEM_CHECK(TAG, user_property_item, goto err); + size_t key_len = strlen(item[i].key); + size_t value_len = strlen(item[i].value); + + user_property_item->key = calloc(1, key_len + 1); + ESP_MEM_CHECK(TAG, user_property_item->key, { + free(user_property_item); + goto err; + }); + memcpy(user_property_item->key, item[i].key, key_len); + user_property_item->key[key_len] = '\0'; + + user_property_item->value = calloc(1, value_len + 1); + ESP_MEM_CHECK(TAG, user_property_item->value, { + free(user_property_item->key); + free(user_property_item); + goto err; + }); + memcpy(user_property_item->value, item[i].value, value_len); + user_property_item->value[value_len] = '\0'; + + STAILQ_INSERT_TAIL(*user_property, user_property_item, next); + } + } + return ESP_OK; +err: + esp_mqtt5_client_delete_user_property(*user_property); + *user_property = NULL; + return ESP_ERR_NO_MEM; +} + +esp_err_t esp_mqtt5_client_get_user_property(mqtt5_user_property_handle_t user_property, esp_mqtt5_user_property_item_t *item, uint8_t *item_num) +{ + int i = 0, j = 0; + if (user_property && item && *item_num) { + mqtt5_user_property_item_t user_property_item; + uint8_t num = *item_num; + STAILQ_FOREACH(user_property_item, user_property, next) { + if (i < num) { + size_t item_key_len = strlen(user_property_item->key); + size_t item_value_len = strlen(user_property_item->value); + char *key = calloc(1, item_key_len + 1); + ESP_MEM_CHECK(TAG, key, goto err); + memcpy(key, user_property_item->key, item_key_len); + key[item_key_len] = '\0'; + char *value = calloc(1, item_value_len + 1); + ESP_MEM_CHECK(TAG, value, { + free(key); + goto err; + }); + memcpy(value, user_property_item->value, item_value_len); + value[item_value_len] = '\0'; + item[i].key = key; + item[i].value = value; + i ++; + } else { + break; + } + } + *item_num = i; + return ESP_OK; + } else { + ESP_LOGE(TAG, "Input value is NULL or item_num is 0"); + return ESP_FAIL; + } +err: + for (j = 0; j < i; j ++) { + if (item[j].key) { + free((char *)item[j].key); + } + if (item[j].value) { + free((char *)item[j].value); + } + } + return ESP_ERR_NO_MEM; +} + +uint8_t esp_mqtt5_client_get_user_property_count(mqtt5_user_property_handle_t user_property) +{ + uint8_t count = 0; + if (user_property) { + mqtt5_user_property_item_t item; + STAILQ_FOREACH(item, user_property, next) { + count ++; + } + } + return count; +} + +void esp_mqtt5_client_delete_user_property(mqtt5_user_property_handle_t user_property) +{ + if (user_property) { + mqtt5_user_property_item_t item, tmp; + STAILQ_FOREACH_SAFE(item, user_property, next, tmp) { + STAILQ_REMOVE(user_property, item, mqtt5_user_property, next); + free(item->key); + free(item->value); + free(item); + } + } + free(user_property); +} diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/mqtt_client.c b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/mqtt_client.c new file mode 100644 index 000000000..dd0ca7f21 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/mqtt_client.c @@ -0,0 +1,2392 @@ +#include +#include +#include +#include "esp_err.h" +#include "esp_log.h" +#include "esp_heap_caps.h" +#include "esp_transport.h" +#include "mqtt_client.h" +#include "mqtt_client_priv.h" +#include "mqtt_msg.h" +#include "mqtt_outbox.h" + +_Static_assert(sizeof(uint64_t) == sizeof(outbox_tick_t), "mqtt-client tick type size different from outbox tick type"); +#ifdef ESP_EVENT_ANY_ID +_Static_assert(MQTT_EVENT_ANY == ESP_EVENT_ANY_ID, "mqtt-client event enum does not match the global EVENT_ANY_ID"); +#endif + +static const char *TAG = "mqtt_client"; + +#ifdef MQTT_SUPPORTED_FEATURE_EVENT_LOOP +/** + * @brief Define of MQTT Event base + * + */ +ESP_EVENT_DEFINE_BASE(MQTT_EVENTS); +#endif + +const static int STOPPED_BIT = (1 << 0); +const static int RECONNECT_BIT = (1 << 1); +const static int DISCONNECT_BIT = (1 << 2); + +static esp_err_t esp_mqtt_dispatch_event(esp_mqtt_client_handle_t client); +static esp_err_t esp_mqtt_dispatch_event_with_msgid(esp_mqtt_client_handle_t client); +static esp_err_t esp_mqtt_connect(esp_mqtt_client_handle_t client, int timeout_ms); +static void esp_mqtt_abort_connection(esp_mqtt_client_handle_t client); +static esp_err_t esp_mqtt_client_ping(esp_mqtt_client_handle_t client); +static char *create_string(const char *ptr, int len); +static int mqtt_message_receive(esp_mqtt_client_handle_t client, int read_poll_timeout_ms); +static void esp_mqtt_client_dispatch_transport_error(esp_mqtt_client_handle_t client); +static esp_err_t send_disconnect_msg(esp_mqtt_client_handle_t client); + +/** + * @brief Processes error reported from transport layer (considering the message read status) + * + * @param err: Error reported from TCP transport + * @param client: MQTT client handle + * @param mid_message: True if the error occured when reading incomplete message + * + * @return - 0 on Timeout + * - -1 on Timeout with incomplete message + * - -2 on Error or EOF + */ +static int esp_mqtt_handle_transport_read_error(int err, esp_mqtt_client_handle_t client, bool mid_message) +{ + if (err == ERR_TCP_TRANSPORT_CONNECTION_TIMEOUT) { + if (mid_message) { + // No error message, because we could've read with timeout 0 (caller will decide) + return -1; + } + // Not an error, continue + ESP_LOGV(TAG, "%s: transport_read(): call timed out before data was ready!", __func__); + return 0; + } + + if (err == ERR_TCP_TRANSPORT_CONNECTION_CLOSED_BY_FIN) { + ESP_LOGE(TAG, "%s: transport_read(): EOF", __func__); + } + + ESP_LOGE(TAG, "%s: transport_read() error: errno=%d", __func__, errno); + esp_mqtt_client_dispatch_transport_error(client); + return -2; +} + +#if MQTT_ENABLE_SSL +enum esp_mqtt_ssl_cert_key_api { + MQTT_SSL_DATA_API_CA_CERT, + MQTT_SSL_DATA_API_CLIENT_CERT, + MQTT_SSL_DATA_API_CLIENT_KEY, + MQTT_SSL_DATA_API_MAX, +}; + +static esp_err_t esp_mqtt_set_cert_key_data(esp_transport_handle_t ssl, enum esp_mqtt_ssl_cert_key_api what, const char *cert_key_data, int cert_key_len) +{ + char *data = (char *)cert_key_data; + int ssl_transport_api_id = what; + int len = cert_key_len; + + if (!data) { + return ESP_OK; + } + + if (len == 0) { + // if length not specified, expect 0-terminated PEM string + // and the original transport_api_id (by convention after the last api_id in the enum) + ssl_transport_api_id += MQTT_SSL_DATA_API_MAX; + len = strlen(data); + } +#ifndef MQTT_SUPPORTED_FEATURE_DER_CERTIFICATES + else { + ESP_LOGE(TAG, "Explicit cert-/key-len is not available in IDF version %s", IDF_VER); + return ESP_ERR_NOT_SUPPORTED; + } +#endif + + // option to force the cert/key config to null (i.e. skip validation) when existing config updates + if (0 == strcmp(data, "NULL")) { + data = NULL; + len = 0; + } + + switch (ssl_transport_api_id) { +#ifdef MQTT_SUPPORTED_FEATURE_DER_CERTIFICATES + case MQTT_SSL_DATA_API_CA_CERT: + esp_transport_ssl_set_cert_data_der(ssl, data, len); + break; + case MQTT_SSL_DATA_API_CLIENT_CERT: + esp_transport_ssl_set_client_cert_data_der(ssl, data, len); + break; + case MQTT_SSL_DATA_API_CLIENT_KEY: + esp_transport_ssl_set_client_key_data_der(ssl, data, len); + break; +#endif + case MQTT_SSL_DATA_API_CA_CERT + MQTT_SSL_DATA_API_MAX: + esp_transport_ssl_set_cert_data(ssl, data, len); + break; + case MQTT_SSL_DATA_API_CLIENT_CERT + MQTT_SSL_DATA_API_MAX: + esp_transport_ssl_set_client_cert_data(ssl, data, len); + break; + case MQTT_SSL_DATA_API_CLIENT_KEY + MQTT_SSL_DATA_API_MAX: + esp_transport_ssl_set_client_key_data(ssl, data, len); + break; + default: + return ESP_ERR_INVALID_ARG; + } + return ESP_OK; +} + +static esp_err_t esp_mqtt_set_ssl_transport_properties(esp_transport_list_handle_t transport_list, mqtt_config_storage_t *cfg) +{ + esp_transport_handle_t ssl = esp_transport_list_get_transport(transport_list, MQTT_OVER_SSL_SCHEME); + + if (cfg->use_global_ca_store == true) { + esp_transport_ssl_enable_global_ca_store(ssl); + } else if (cfg->crt_bundle_attach != NULL) { +#ifdef MQTT_SUPPORTED_FEATURE_CERTIFICATE_BUNDLE +#ifdef CONFIG_MBEDTLS_CERTIFICATE_BUNDLE + esp_transport_ssl_crt_bundle_attach(ssl, cfg->crt_bundle_attach); +#else + ESP_LOGE(TAG, "Certificate bundle is not enabled for mbedTLS in menuconfig"); + goto esp_mqtt_set_transport_failed; +#endif /* CONFIG_MBEDTLS_CERTIFICATE_BUNDLE */ +#else + ESP_LOGE(TAG, "Certificate bundle feature is not available in IDF version %s", IDF_VER); + goto esp_mqtt_set_transport_failed; +#endif /* MQTT_SUPPORTED_FEATURE_CERTIFICATE_BUNDLE */ + } else { + ESP_OK_CHECK(TAG, esp_mqtt_set_cert_key_data(ssl, MQTT_SSL_DATA_API_CA_CERT, cfg->cacert_buf, cfg->cacert_bytes), + goto esp_mqtt_set_transport_failed); + + } + if(cfg->ciphersuites_list) + { +#if defined(MQTT_SUPPORTED_FEATURE_CIPHERSUITES_LIST) + esp_transport_ssl_set_ciphersuites_list(ssl,cfg->ciphersuites_list); +#else + ESP_LOGE(TAG, "Cipher suites list feature is not available in IDF version %s", IDF_VER); + goto esp_mqtt_set_transport_failed; +#endif /* MQTT_SUPPORTED_FEATURE_CIPHERSUITES_LIST */ + } + + if (cfg->psk_hint_key) { +#if defined(MQTT_SUPPORTED_FEATURE_PSK_AUTHENTICATION) && MQTT_ENABLE_SSL +#ifdef CONFIG_ESP_TLS_PSK_VERIFICATION + esp_transport_ssl_set_psk_key_hint(ssl, cfg->psk_hint_key); +#else + ESP_LOGE(TAG, "PSK authentication configured but not enabled in menuconfig: Please enable ESP_TLS_PSK_VERIFICATION option"); + goto esp_mqtt_set_transport_failed; +#endif +#else + ESP_LOGE(TAG, "PSK authentication is not available in IDF version %s", IDF_VER); + goto esp_mqtt_set_transport_failed; +#endif + } + + if (cfg->alpn_protos) { +#if defined(MQTT_SUPPORTED_FEATURE_ALPN) && MQTT_ENABLE_SSL +#if defined(CONFIG_MBEDTLS_SSL_ALPN) || defined(CONFIG_WOLFSSL_HAVE_ALPN) + esp_transport_ssl_set_alpn_protocol(ssl, (const char **)cfg->alpn_protos); +#else + ESP_LOGE(TAG, "APLN configured but not enabled in menuconfig: Please enable MBEDTLS_SSL_ALPN or WOLFSSL_HAVE_ALPN option"); + goto esp_mqtt_set_transport_failed; +#endif +#else + ESP_LOGE(TAG, "APLN is not available in IDF version %s", IDF_VER); + goto esp_mqtt_set_transport_failed; +#endif + } + + + if (cfg->skip_cert_common_name_check) { +#if defined(MQTT_SUPPORTED_FEATURE_SKIP_CRT_CMN_NAME_CHECK) && MQTT_ENABLE_SSL + esp_transport_ssl_skip_common_name_check(ssl); +#else + ESP_LOGE(TAG, "Skip certificate common name check is not available in IDF version %s", IDF_VER); + goto esp_mqtt_set_transport_failed; +#endif + } + + if (cfg->common_name) { +#if defined(MQTT_SUPPORTED_FEATURE_CRT_CMN_NAME) && MQTT_ENABLE_SSL + esp_transport_ssl_set_common_name(ssl, cfg->common_name); +#else + ESP_LOGE(TAG, "Setting expected certificate common name is not available in IDF version %s", IDF_VER); + goto esp_mqtt_set_transport_failed; +#endif + } + + if (cfg->use_secure_element) { +#ifdef MQTT_SUPPORTED_FEATURE_SECURE_ELEMENT +#ifdef CONFIG_ESP_TLS_USE_SECURE_ELEMENT + esp_transport_ssl_use_secure_element(ssl); +#else + ESP_LOGE(TAG, "Secure element not enabled for esp-tls in menuconfig"); + goto esp_mqtt_set_transport_failed; +#endif /* CONFIG_ESP_TLS_USE_SECURE_ELEMENT */ +#else + ESP_LOGE(TAG, "Secure element feature is not available in IDF version %s", IDF_VER); + goto esp_mqtt_set_transport_failed; +#endif /* MQTT_SUPPORTED_FEATURE_SECURE_ELEMENT */ + } + + if (cfg->ds_data != NULL) { +#ifdef MQTT_SUPPORTED_FEATURE_DIGITAL_SIGNATURE +#ifdef CONFIG_ESP_TLS_USE_DS_PERIPHERAL + esp_transport_ssl_set_ds_data(ssl, cfg->ds_data); +#else + ESP_LOGE(TAG, "Digital Signature not enabled for esp-tls in menuconfig"); + goto esp_mqtt_set_transport_failed; +#endif /* CONFIG_ESP_TLS_USE_DS_PERIPHERAL */ +#else + ESP_LOGE(TAG, "Digital Signature feature is not available in IDF version %s", IDF_VER); + goto esp_mqtt_set_transport_failed; +#endif + } + + if (cfg->use_ecdsa_peripheral) { +#ifdef MQTT_SUPPORTED_FEATURE_ECDSA_PERIPHERAL +#ifdef CONFIG_MBEDTLS_HARDWARE_ECDSA_SIGN + esp_transport_ssl_set_client_key_ecdsa_peripheral(ssl, cfg->ecdsa_key_efuse_blk); +#else + ESP_LOGE(TAG, "ECDSA peripheral not enabled for esp-tls in menuconfig"); + goto esp_mqtt_set_transport_failed; +#endif /* CONFIG_MBEDTLS_HARDWARE_ECDSA_SIGN */ +#else + ESP_LOGE(TAG, "ECDSA peripheral feature is not available in IDF version %s", IDF_VER); + goto esp_mqtt_set_transport_failed; +#endif /* MQTT_SUPPORTED_FEATURE_ECDSA_PERIPHERAL */ + } + + ESP_OK_CHECK(TAG, esp_mqtt_set_cert_key_data(ssl, MQTT_SSL_DATA_API_CLIENT_CERT, cfg->clientcert_buf, cfg->clientcert_bytes), + goto esp_mqtt_set_transport_failed); + ESP_OK_CHECK(TAG, esp_mqtt_set_cert_key_data(ssl, MQTT_SSL_DATA_API_CLIENT_KEY, cfg->clientkey_buf, cfg->clientkey_bytes), + goto esp_mqtt_set_transport_failed); + + if (cfg->clientkey_password && cfg->clientkey_password_len) { +#if defined(MQTT_SUPPORTED_FEATURE_CLIENT_KEY_PASSWORD) && MQTT_ENABLE_SSL + esp_transport_ssl_set_client_key_password(ssl, + cfg->clientkey_password, + cfg->clientkey_password_len); +#else + ESP_LOGE(TAG, "Password protected keys are not available in IDF version %s", IDF_VER); + goto esp_mqtt_set_transport_failed; +#endif + } + + + return ESP_OK; + +esp_mqtt_set_transport_failed: + return ESP_FAIL; +} +#endif // MQTT_ENABLE_SSL + +/* Checks if the user supplied config values are internally consistent */ +static esp_err_t esp_mqtt_check_cfg_conflict(const mqtt_config_storage_t *cfg, const esp_mqtt_client_config_t *user_cfg) +{ + if (cfg == NULL || user_cfg == NULL) { + ESP_LOGE(TAG, "Invalid configuration"); + return ESP_ERR_INVALID_ARG; + } + esp_err_t ret = ESP_OK; + + bool ssl_cfg_enabled = cfg->use_global_ca_store || cfg->cacert_buf || cfg->clientcert_buf || cfg->psk_hint_key || cfg->alpn_protos; + bool is_ssl_scheme = false; + if (cfg->scheme) { + is_ssl_scheme = (strncasecmp(cfg->scheme, MQTT_OVER_SSL_SCHEME, sizeof(MQTT_OVER_SSL_SCHEME)) == 0) || (strncasecmp(cfg->scheme, MQTT_OVER_WSS_SCHEME, sizeof(MQTT_OVER_WSS_SCHEME)) == 0); + } + + if (!is_ssl_scheme && ssl_cfg_enabled) { + if (cfg->uri) { + ESP_LOGW(TAG, "SSL related configs set, but the URI scheme specifies a non-SSL scheme, scheme = %s", cfg->scheme); + } else { + ESP_LOGW(TAG, "SSL related configs set, but the transport protocol is a non-SSL scheme, transport = %d", user_cfg->broker.address.transport); + } + ret = ESP_ERR_INVALID_ARG; + } + + if (cfg->uri && user_cfg->broker.address.transport) { + ESP_LOGW(TAG, "Transport config set, but overridden by scheme from URI: transport = %d, uri scheme = %s", user_cfg->broker.address.transport, cfg->scheme); + ret = ESP_ERR_INVALID_ARG; + } + + return ret; +} + +bool esp_mqtt_set_if_config(char const *const new_config, char **old_config) +{ + if (new_config) { + free(*old_config); + *old_config = strdup(new_config); + if (*old_config == NULL) { + return false; + } + } + return true; +} + +static esp_err_t esp_mqtt_client_create_transport(esp_mqtt_client_handle_t client) +{ + esp_err_t ret = ESP_OK; + if (client->transport_list) { + esp_transport_list_destroy(client->transport_list); + client->transport_list = NULL; + } + if (client->config->scheme) { + client->transport_list = esp_transport_list_init(); + ESP_MEM_CHECK(TAG, client->transport_list, return ESP_ERR_NO_MEM); + + if ((strncasecmp(client->config->scheme, MQTT_OVER_TCP_SCHEME, sizeof(MQTT_OVER_TCP_SCHEME)) == 0) || (strncasecmp(client->config->scheme, MQTT_OVER_WS_SCHEME, sizeof(MQTT_OVER_WS_SCHEME)) == 0)) { + esp_transport_handle_t tcp = esp_transport_tcp_init(); + ESP_MEM_CHECK(TAG, tcp, return ESP_ERR_NO_MEM); + esp_transport_set_default_port(tcp, MQTT_TCP_DEFAULT_PORT); + if (client->config->if_name) { + esp_transport_tcp_set_interface_name(tcp, client->config->if_name); + } + esp_transport_list_add(client->transport_list, tcp, MQTT_OVER_TCP_SCHEME); + if (strncasecmp(client->config->scheme, MQTT_OVER_WS_SCHEME, sizeof(MQTT_OVER_WS_SCHEME)) == 0) { +#if MQTT_ENABLE_WS + esp_transport_handle_t ws = esp_transport_ws_init(tcp); + ESP_MEM_CHECK(TAG, ws, return ESP_ERR_NO_MEM); + esp_transport_set_default_port(ws, MQTT_WS_DEFAULT_PORT); + if (client->config->path) { + esp_transport_ws_set_path(ws, client->config->path); + } +#ifdef MQTT_SUPPORTED_FEATURE_WS_SUBPROTOCOL + esp_transport_ws_set_subprotocol(ws, MQTT_OVER_TCP_SCHEME); +#endif + esp_transport_list_add(client->transport_list, ws, MQTT_OVER_WS_SCHEME); +#else + ESP_LOGE(TAG, "Please enable MQTT_ENABLE_WS to use %s", client->config->scheme); + ret = ESP_FAIL; +#endif + } + } else if ((strncasecmp(client->config->scheme, MQTT_OVER_SSL_SCHEME, sizeof(MQTT_OVER_SSL_SCHEME)) == 0) || (strncasecmp(client->config->scheme, MQTT_OVER_WSS_SCHEME, sizeof(MQTT_OVER_WSS_SCHEME)) == 0)) { +#if MQTT_ENABLE_SSL + esp_transport_handle_t ssl = esp_transport_ssl_init(); + ESP_MEM_CHECK(TAG, ssl, return ESP_ERR_NO_MEM); + esp_transport_set_default_port(ssl, MQTT_SSL_DEFAULT_PORT); + if (client->config->if_name) { + esp_transport_ssl_set_interface_name(ssl, client->config->if_name); + } + esp_transport_list_add(client->transport_list, ssl, MQTT_OVER_SSL_SCHEME); + if (strncasecmp(client->config->scheme, MQTT_OVER_WSS_SCHEME, sizeof(MQTT_OVER_WSS_SCHEME)) == 0) { +#if MQTT_ENABLE_WS + esp_transport_handle_t wss = esp_transport_ws_init(ssl); + ESP_MEM_CHECK(TAG, wss, return ESP_ERR_NO_MEM); + esp_transport_set_default_port(wss, MQTT_WSS_DEFAULT_PORT); + if (client->config->path) { + esp_transport_ws_set_path(wss, client->config->path); + } +#ifdef MQTT_SUPPORTED_FEATURE_WS_SUBPROTOCOL + esp_transport_ws_set_subprotocol(wss, MQTT_OVER_TCP_SCHEME); +#endif + esp_transport_list_add(client->transport_list, wss, MQTT_OVER_WSS_SCHEME); +#else + ESP_LOGE(TAG, "Please enable MQTT_ENABLE_WS to use %s", client->config->scheme); + ret = ESP_FAIL; +#endif + } +#else + ESP_LOGE(TAG, "Please enable MQTT_ENABLE_SSL to use %s", client->config->scheme); + ret = ESP_FAIL; +#endif + } else { + ESP_LOGE(TAG, "Not support this mqtt scheme %s", client->config->scheme); + ret = ESP_FAIL; + } + } else { + ESP_LOGE(TAG, "No scheme found"); + ret = ESP_FAIL; + } + return ret; +} + +esp_err_t esp_mqtt_set_config(esp_mqtt_client_handle_t client, const esp_mqtt_client_config_t *config) +{ + if (!client) { + ESP_LOGE(TAG, "Client was not initialized"); + return ESP_ERR_INVALID_ARG; + } + MQTT_API_LOCK(client); + //Copy user configurations to client context + esp_err_t err = ESP_OK; + if (!client->config) { + client->config = calloc(1, sizeof(mqtt_config_storage_t)); + ESP_MEM_CHECK(TAG, client->config, { + MQTT_API_UNLOCK(client); + return ESP_ERR_NO_MEM; + }); + } + + mqtt_msg_buffer_destroy(&client->mqtt_state.connection); + int buffer_size = config->buffer.size; + if (buffer_size <= 0) { + buffer_size = MQTT_BUFFER_SIZE_BYTE; + } + + // use separate value for output buffer size if configured + int out_buffer_size = config->buffer.out_size > 0 ? config->buffer.out_size : buffer_size; + if (mqtt_msg_buffer_init(&client->mqtt_state.connection, out_buffer_size) != ESP_OK) { + goto _mqtt_set_config_failed; + } + + free(client->mqtt_state.in_buffer); + client->mqtt_state.in_buffer = (uint8_t *)malloc(buffer_size); + ESP_MEM_CHECK(TAG, client->mqtt_state.in_buffer, goto _mqtt_set_config_failed); + client->mqtt_state.in_buffer_length = buffer_size; + + client->config->message_retransmit_timeout = config->session.message_retransmit_timeout; + if (config->session.message_retransmit_timeout <= 0) { + client->config->message_retransmit_timeout = MQTT_DEFAULT_RETRANSMIT_TIMEOUT_MS; + } + + client->config->task_prio = config->task.priority; + if (client->config->task_prio <= 0) { + client->config->task_prio = MQTT_TASK_PRIORITY; + } + + client->config->task_stack = config->task.stack_size; + if (client->config->task_stack <= 0) { + client->config->task_stack = MQTT_TASK_STACK; + } + + if (config->broker.address.port) { + client->config->port = config->broker.address.port; + } + + if (config->network.tcp_keep_alive_cfg.keep_alive_enable) { + client->config->tcp_keep_alive_cfg = config->network.tcp_keep_alive_cfg; + } + + err = ESP_ERR_NO_MEM; + ESP_MEM_CHECK(TAG, esp_mqtt_set_if_config(config->broker.address.hostname, &client->config->host), goto _mqtt_set_config_failed); + ESP_MEM_CHECK(TAG, esp_mqtt_set_if_config(config->broker.address.path, &client->config->path), goto _mqtt_set_config_failed); + ESP_MEM_CHECK(TAG, esp_mqtt_set_if_config(config->credentials.username, &client->mqtt_state.connection.information.username), goto _mqtt_set_config_failed); + ESP_MEM_CHECK(TAG, esp_mqtt_set_if_config(config->credentials.authentication.password, &client->mqtt_state.connection.information.password), goto _mqtt_set_config_failed); + + if (!config->credentials.set_null_client_id) { + if (config->credentials.client_id) { + ESP_MEM_CHECK(TAG, esp_mqtt_set_if_config(config->credentials.client_id, &client->mqtt_state.connection.information.client_id), goto _mqtt_set_config_failed); + } else if (client->mqtt_state.connection.information.client_id == NULL) { + client->mqtt_state.connection.information.client_id = platform_create_id_string(); + } + ESP_MEM_CHECK(TAG, client->mqtt_state.connection.information.client_id, goto _mqtt_set_config_failed); + ESP_LOGD(TAG, "MQTT client_id=%s", client->mqtt_state.connection.information.client_id); + } + + ESP_MEM_CHECK(TAG, esp_mqtt_set_if_config(config->broker.address.uri, &client->config->uri), goto _mqtt_set_config_failed); + ESP_MEM_CHECK(TAG, esp_mqtt_set_if_config(config->session.last_will.topic, &client->mqtt_state.connection.information.will_topic), goto _mqtt_set_config_failed); + + if (config->session.last_will.msg_len && config->session.last_will.msg) { + free(client->mqtt_state.connection.information.will_message); + client->mqtt_state.connection.information.will_message = malloc(config->session.last_will.msg_len); + ESP_MEM_CHECK(TAG, client->mqtt_state.connection.information.will_message, goto _mqtt_set_config_failed); + memcpy(client->mqtt_state.connection.information.will_message, config->session.last_will.msg, config->session.last_will.msg_len); + client->mqtt_state.connection.information.will_length = config->session.last_will.msg_len; + } else if (config->session.last_will.msg) { + free(client->mqtt_state.connection.information.will_message); + client->mqtt_state.connection.information.will_message = strdup(config->session.last_will.msg); + ESP_MEM_CHECK(TAG, client->mqtt_state.connection.information.will_message, goto _mqtt_set_config_failed); + client->mqtt_state.connection.information.will_length = strlen(config->session.last_will.msg); + } + if (config->session.last_will.qos) { + client->mqtt_state.connection.information.will_qos = config->session.last_will.qos; + } + if (config->session.last_will.retain) { + client->mqtt_state.connection.information.will_retain = config->session.last_will.retain; + } + + if (config->session.disable_clean_session == client->mqtt_state.connection.information.clean_session) { + client->mqtt_state.connection.information.clean_session = !config->session.disable_clean_session; + if (!client->mqtt_state.connection.information.clean_session && config->credentials.set_null_client_id) { + ESP_LOGE(TAG, "Clean Session flag must be true if client has a null id"); + } + } + if (config->session.keepalive) { + client->mqtt_state.connection.information.keepalive = config->session.keepalive; + } + if (client->mqtt_state.connection.information.keepalive == 0) { + client->mqtt_state.connection.information.keepalive = MQTT_KEEPALIVE_TICK; + } + if (config->session.disable_keepalive) { + // internal `keepalive` value (in connect_info) is in line with 3.1.2.10 Keep Alive from mqtt spec: + // * keepalive=0: Keep alive mechanism disabled (server not to disconnect the client on its inactivity) + // * period in seconds to send a Control packet if inactive + client->mqtt_state.connection.information.keepalive = 0; + } + + if (config->session.protocol_ver) { + client->mqtt_state.connection.information.protocol_ver = config->session.protocol_ver; + } + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_UNDEFINED) { +#ifdef MQTT_PROTOCOL_311 + client->mqtt_state.connection.information.protocol_ver = MQTT_PROTOCOL_V_3_1_1; +#else + client->mqtt_state.connection.information.protocol_ver = MQTT_PROTOCOL_V_3_1; +#endif + } else if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { +#ifndef MQTT_PROTOCOL_5 + ESP_LOGE(TAG, "Please first enable MQTT_PROTOCOL_5 feature in menuconfig"); + goto _mqtt_set_config_failed; +#endif + } + + client->config->network_timeout_ms = config->network.timeout_ms; + if (client->config->network_timeout_ms <= 0) { + client->config->network_timeout_ms = MQTT_NETWORK_TIMEOUT_MS; + } + + if (config->network.refresh_connection_after_ms) { + client->config->refresh_connection_after_ms = config->network.refresh_connection_after_ms; + } + + client->config->auto_reconnect = true; + if (config->network.disable_auto_reconnect == client->config->auto_reconnect) { + client->config->auto_reconnect = !config->network.disable_auto_reconnect; + } + + if (config->network.reconnect_timeout_ms) { + client->config->reconnect_timeout_ms = config->network.reconnect_timeout_ms; + } else { + client->config->reconnect_timeout_ms = MQTT_RECON_DEFAULT_MS; + } + + client->config->transport = config->network.transport; + + if (config->network.if_name) { + client->config->if_name = calloc(1, sizeof(struct ifreq) + 1); + ESP_MEM_CHECK(TAG, client->config->if_name, goto _mqtt_set_config_failed); + memcpy(client->config->if_name, config->network.if_name, sizeof(struct ifreq)); + } + + if (config->broker.verification.alpn_protos) { + for (int i = 0; i < client->config->num_alpn_protos; i++) { + free(client->config->alpn_protos[i]); + } + free(client->config->alpn_protos); + client->config->num_alpn_protos = 0; + + const char **p; + + for (p = config->broker.verification.alpn_protos; *p != NULL; p++ ) { + client->config->num_alpn_protos++; + } + // mbedTLS expects the list to be null-terminated + client->config->alpn_protos = calloc(client->config->num_alpn_protos + 1, sizeof(*config->broker.verification.alpn_protos)); + ESP_MEM_CHECK(TAG, client->config->alpn_protos, goto _mqtt_set_config_failed); + + for (int i = 0; i < client->config->num_alpn_protos; i++) { + client->config->alpn_protos[i] = strdup(config->broker.verification.alpn_protos[i]); + ESP_MEM_CHECK(TAG, client->config->alpn_protos[i], goto _mqtt_set_config_failed); + } + } + + // configure ssl related parameters + client->config->use_global_ca_store = config->broker.verification.use_global_ca_store; + client->config->cacert_buf = config->broker.verification.certificate; + client->config->cacert_bytes = config->broker.verification.certificate_len; + client->config->psk_hint_key = config->broker.verification.psk_hint_key; + client->config->crt_bundle_attach = config->broker.verification.crt_bundle_attach; + client->config->ciphersuites_list = config->broker.verification.ciphersuites_list; + client->config->clientcert_buf = config->credentials.authentication.certificate; + client->config->clientcert_bytes = config->credentials.authentication.certificate_len; + client->config->clientkey_buf = config->credentials.authentication.key; + client->config->clientkey_bytes = config->credentials.authentication.key_len; + client->config->skip_cert_common_name_check = config->broker.verification.skip_cert_common_name_check; + client->config->common_name = config->broker.verification.common_name; + client->config->use_secure_element = config->credentials.authentication.use_secure_element; + client->config->ds_data = config->credentials.authentication.ds_data; + client->config->use_ecdsa_peripheral = config->credentials.authentication.use_ecdsa_peripheral; + client->config->ecdsa_key_efuse_blk = config->credentials.authentication.ecdsa_key_efuse_blk; + + if (config->credentials.authentication.key_password && config->credentials.authentication.key_password_len) { + client->config->clientkey_password_len = config->credentials.authentication.key_password_len; + client->config->clientkey_password = malloc(client->config->clientkey_password_len); + ESP_MEM_CHECK(TAG, client->config->clientkey_password, goto _mqtt_set_config_failed); + memcpy(client->config->clientkey_password, config->credentials.authentication.key_password, client->config->clientkey_password_len); + } + + if (config->broker.address.transport) { + free(client->config->scheme); + client->config->scheme = NULL; + if (config->broker.address.transport == MQTT_TRANSPORT_OVER_TCP) { + client->config->scheme = create_string(MQTT_OVER_TCP_SCHEME, strlen(MQTT_OVER_TCP_SCHEME)); + ESP_MEM_CHECK(TAG, client->config->scheme, goto _mqtt_set_config_failed); + } +#if MQTT_ENABLE_WS + else if (config->broker.address.transport == MQTT_TRANSPORT_OVER_WS) { + client->config->scheme = create_string(MQTT_OVER_WS_SCHEME, strlen(MQTT_OVER_WS_SCHEME)); + ESP_MEM_CHECK(TAG, client->config->scheme, goto _mqtt_set_config_failed); + } +#endif +#if MQTT_ENABLE_SSL + else if (config->broker.address.transport == MQTT_TRANSPORT_OVER_SSL) { + client->config->scheme = create_string(MQTT_OVER_SSL_SCHEME, strlen(MQTT_OVER_SSL_SCHEME)); + ESP_MEM_CHECK(TAG, client->config->scheme, goto _mqtt_set_config_failed); + } +#endif +#if MQTT_ENABLE_WSS + else if (config->broker.address.transport == MQTT_TRANSPORT_OVER_WSS) { + client->config->scheme = create_string(MQTT_OVER_WSS_SCHEME, strlen(MQTT_OVER_WSS_SCHEME)); + ESP_MEM_CHECK(TAG, client->config->scheme, goto _mqtt_set_config_failed); + } +#endif + } + + // Set uri at the end of config to override separately configured uri elements + if (config->broker.address.uri) { + if (esp_mqtt_client_set_uri(client, client->config->uri) != ESP_OK) { + err = ESP_FAIL; + goto _mqtt_set_config_failed; + } + } + client->config->outbox_limit = config->outbox.limit; + esp_err_t config_has_conflict = esp_mqtt_check_cfg_conflict(client->config, config); + + MQTT_API_UNLOCK(client); + + return config_has_conflict; +_mqtt_set_config_failed: + esp_mqtt_destroy_config(client); + MQTT_API_UNLOCK(client); + return err; +} + +void esp_mqtt_destroy_config(esp_mqtt_client_handle_t client) +{ + if (client->config == NULL) { + return; + } + free(client->mqtt_state.in_buffer); + mqtt_msg_buffer_destroy(&client->mqtt_state.connection); + free(client->config->host); + free(client->config->uri); + free(client->config->path); + free(client->config->scheme); + for (int i = 0; i < client->config->num_alpn_protos; i++) { + free(client->config->alpn_protos[i]); + } + free(client->config->alpn_protos); + free(client->config->clientkey_password); + free(client->config->if_name); + free(client->mqtt_state.connection.information.will_topic); + free(client->mqtt_state.connection.information.will_message); + free(client->mqtt_state.connection.information.client_id); + free(client->mqtt_state.connection.information.username); + free(client->mqtt_state.connection.information.password); +#ifdef MQTT_PROTOCOL_5 + esp_mqtt5_client_destory(client); +#endif + memset(&client->mqtt_state.connection.information, 0, sizeof(mqtt_connect_info_t)); +#ifdef MQTT_SUPPORTED_FEATURE_EVENT_LOOP + if (client->config->event_loop_handle) { + esp_event_loop_delete(client->config->event_loop_handle); + } +#endif + esp_transport_destroy(client->config->transport); + memset(client->config, 0, sizeof(mqtt_config_storage_t)); + free(client->config); + client->config = NULL; +} + +static inline bool has_timed_out(uint64_t last_tick, uint64_t timeout) +{ + uint64_t next = last_tick + timeout; + return (int64_t)(next - platform_tick_get_ms()) <= 0; +} + +static esp_err_t process_keepalive(esp_mqtt_client_handle_t client) +{ + if (client->mqtt_state.connection.information.keepalive > 0) { + const uint64_t keepalive_ms = client->mqtt_state.connection.information.keepalive * 1000; + + if (client->wait_for_ping_resp == true ) { + if (has_timed_out(client->keepalive_tick, keepalive_ms)) { + ESP_LOGE(TAG, "No PING_RESP, disconnected"); + esp_mqtt_abort_connection(client); + client->wait_for_ping_resp = false; + return ESP_FAIL; + } + return ESP_OK; + } + + if (has_timed_out(client->keepalive_tick, keepalive_ms / 2)) { + if (esp_mqtt_client_ping(client) == ESP_FAIL) { + ESP_LOGE(TAG, "Can't send ping, disconnected"); + esp_mqtt_abort_connection(client); + return ESP_FAIL; + } + client->wait_for_ping_resp = true; + return ESP_OK; + } + } + return ESP_OK; +} + +static inline esp_err_t esp_mqtt_write(esp_mqtt_client_handle_t client) +{ + int wlen = 0, widx = 0, len = client->mqtt_state.connection.outbound_message.length; + while (len > 0) { + wlen = esp_transport_write(client->transport, + (char *)client->mqtt_state.connection.outbound_message.data + widx, + len, + client->config->network_timeout_ms); + if (wlen < 0) { + ESP_LOGE(TAG, "Writing failed: errno=%d", errno); + esp_mqtt_client_dispatch_transport_error(client); + return ESP_FAIL; + } + + if (wlen == 0) { + ESP_LOGE(TAG, "Writing didn't complete in specified timeout: errno=%d", errno); + return ESP_ERR_TIMEOUT; + } + widx += wlen; + len -= wlen; + } + return ESP_OK; +} + +static esp_err_t esp_mqtt_connect(esp_mqtt_client_handle_t client, int timeout_ms) +{ + int read_len, connect_rsp_code = 0; + client->wait_for_ping_resp = false; + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { +#ifdef MQTT_PROTOCOL_5 + mqtt5_msg_connect(&client->mqtt_state.connection, + &client->mqtt_state.connection.information, &client->mqtt5_config->connect_property_info, &client->mqtt5_config->will_property_info); +#endif + } else { + mqtt_msg_connect(&client->mqtt_state.connection, + &client->mqtt_state.connection.information); + } + if (client->mqtt_state.connection.outbound_message.length == 0) { + ESP_LOGE(TAG, "Connect message cannot be created"); + return ESP_FAIL; + } + + client->mqtt_state.pending_msg_type = mqtt_get_type(client->mqtt_state.connection.outbound_message.data); + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { +#ifdef MQTT_PROTOCOL_5 + client->mqtt_state.pending_msg_id = mqtt5_get_id(client->mqtt_state.connection.outbound_message.data, + client->mqtt_state.connection.outbound_message.length); +#endif + } else { + client->mqtt_state.pending_msg_id = mqtt_get_id(client->mqtt_state.connection.outbound_message.data, + client->mqtt_state.connection.outbound_message.length); + } + ESP_LOGD(TAG, "Sending MQTT CONNECT message, type: %d, id: %04X", + client->mqtt_state.pending_msg_type, + client->mqtt_state.pending_msg_id); + + if (esp_mqtt_write(client) != ESP_OK) { + return ESP_FAIL; + } + + client->mqtt_state.in_buffer_read_len = 0; + client->mqtt_state.message_length = 0; + + /* wait configured network timeout for broker connection response */ + uint64_t connack_recv_started = platform_tick_get_ms(); + do { + read_len = mqtt_message_receive(client, client->config->network_timeout_ms); + } while (read_len == 0 && platform_tick_get_ms() - connack_recv_started < client->config->network_timeout_ms); + + if (read_len <= 0) { + ESP_LOGE(TAG, "%s: mqtt_message_receive() returned %d", __func__, read_len); + return ESP_FAIL; + } + + if (mqtt_get_type(client->mqtt_state.in_buffer) != MQTT_MSG_TYPE_CONNACK) { + ESP_LOGE(TAG, "Invalid MSG_TYPE response: %d, read_len: %d", mqtt_get_type(client->mqtt_state.in_buffer), read_len); + return ESP_FAIL; + } + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { +#ifdef MQTT_PROTOCOL_5 + if (esp_mqtt5_parse_connack(client, &connect_rsp_code) == ESP_OK) { + client->send_publish_packet_count = 0; + return ESP_OK; + } +#endif + } else { + client->mqtt_state.in_buffer_read_len = 0; + connect_rsp_code = mqtt_get_connect_return_code(client->mqtt_state.in_buffer); + if (connect_rsp_code == MQTT_CONNECTION_ACCEPTED) { + ESP_LOGD(TAG, "Connected"); + return ESP_OK; + } + switch (connect_rsp_code) { + case MQTT_CONNECTION_REFUSE_PROTOCOL: + ESP_LOGW(TAG, "Connection refused, bad protocol"); + break; + case MQTT_CONNECTION_REFUSE_SERVER_UNAVAILABLE: + ESP_LOGW(TAG, "Connection refused, server unavailable"); + break; + case MQTT_CONNECTION_REFUSE_BAD_USERNAME: + ESP_LOGW(TAG, "Connection refused, bad username or password"); + break; + case MQTT_CONNECTION_REFUSE_NOT_AUTHORIZED: + ESP_LOGW(TAG, "Connection refused, not authorized"); + break; + default: + ESP_LOGW(TAG, "Connection refused, Unknow reason"); + break; + } + } + /* propagate event with connection refused error */ + client->event.event_id = MQTT_EVENT_ERROR; + client->event.error_handle->error_type = MQTT_ERROR_TYPE_CONNECTION_REFUSED; + client->event.error_handle->connect_return_code = connect_rsp_code; + client->event.error_handle->esp_tls_stack_err = 0; + client->event.error_handle->esp_tls_last_esp_err = 0; + client->event.error_handle->esp_tls_cert_verify_flags = 0; + esp_mqtt_dispatch_event_with_msgid(client); + + return ESP_FAIL; +} + +static void esp_mqtt_abort_connection(esp_mqtt_client_handle_t client) +{ + MQTT_API_LOCK(client); + esp_transport_close(client->transport); + client->wait_timeout_ms = client->config->reconnect_timeout_ms; + client->reconnect_tick = platform_tick_get_ms(); + client->state = MQTT_STATE_WAIT_RECONNECT; + ESP_LOGD(TAG, "Reconnect after %d ms", client->wait_timeout_ms); + client->event.event_id = MQTT_EVENT_DISCONNECTED; + client->wait_for_ping_resp = false; + esp_mqtt_dispatch_event_with_msgid(client); + MQTT_API_UNLOCK(client); +} + +static bool create_client_data(esp_mqtt_client_handle_t client) +{ + client->event.error_handle = calloc(1, sizeof(esp_mqtt_error_codes_t)); + ESP_MEM_CHECK(TAG, client->event.error_handle, return false) + + client->api_lock = xSemaphoreCreateRecursiveMutex(); + ESP_MEM_CHECK(TAG, client->api_lock, return false); + + client->outbox = outbox_init(); + ESP_MEM_CHECK(TAG, client->outbox, return false); + client->status_bits = xEventGroupCreate(); + ESP_MEM_CHECK(TAG, client->status_bits, return false); + + return true; +} + +esp_mqtt_client_handle_t esp_mqtt_client_init(const esp_mqtt_client_config_t *config) +{ + esp_mqtt_client_handle_t client = heap_caps_calloc(1, sizeof(struct esp_mqtt_client), +#if MQTT_EVENT_QUEUE_SIZE > 1 + // if supporting multiple queued events, we keep track of them + // using atomic variable, so need to make sure it won't get allocated in PSRAM + MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT); +#else + MALLOC_CAP_DEFAULT); +#endif + ESP_MEM_CHECK(TAG, client, return NULL); + if (!create_client_data(client)) { + goto _mqtt_init_failed; + } + + if (esp_mqtt_set_config(client, config) != ESP_OK) { + goto _mqtt_init_failed; + } +#ifdef MQTT_SUPPORTED_FEATURE_EVENT_LOOP + esp_event_loop_args_t no_task_loop = { + .queue_size = MQTT_EVENT_QUEUE_SIZE, + .task_name = NULL, + }; + esp_event_loop_create(&no_task_loop, &client->config->event_loop_handle); +#if MQTT_EVENT_QUEUE_SIZE > 1 + atomic_init(&client->queued_events, 0); +#endif +#endif + + client->keepalive_tick = platform_tick_get_ms(); + client->reconnect_tick = platform_tick_get_ms(); + client->refresh_connection_tick = platform_tick_get_ms(); + client->wait_for_ping_resp = false; +#ifdef MQTT_PROTOCOL_5 + if (esp_mqtt5_create_default_config(client) != ESP_OK) { + goto _mqtt_init_failed; + } +#endif + return client; +_mqtt_init_failed: + esp_mqtt_client_destroy(client); + return NULL; +} + +esp_err_t esp_mqtt_client_destroy(esp_mqtt_client_handle_t client) +{ + if (client == NULL) { + return ESP_ERR_INVALID_ARG; + } + if (client->run) { + esp_mqtt_client_stop(client); + } + esp_mqtt_destroy_config(client); + if (client->transport_list) { + esp_transport_list_destroy(client->transport_list); + } + if (client->outbox) { + outbox_destroy(client->outbox); + } + if (client->status_bits) { + vEventGroupDelete(client->status_bits); + } + if (client->api_lock) { + vSemaphoreDelete(client->api_lock); + } + free(client->event.error_handle); + free(client); + return ESP_OK; +} + +static char *create_string(const char *ptr, int len) +{ + char *ret; + if (len <= 0) { + return NULL; + } + ret = calloc(1, len + 1); + ESP_MEM_CHECK(TAG, ret, return NULL); + memcpy(ret, ptr, len); + return ret; +} + +esp_err_t esp_mqtt_client_set_uri(esp_mqtt_client_handle_t client, const char *uri) +{ + struct http_parser_url puri; + http_parser_url_init(&puri); + int parser_status = http_parser_parse_url(uri, strlen(uri), 0, &puri); + if (parser_status != 0) { + ESP_LOGE(TAG, "Error parse uri = %s", uri); + return ESP_FAIL; + } + + // This API could be also executed when client is active (need to protect config fields) + MQTT_API_LOCK(client); + // set uri overrides actual scheme, host, path if configured previously +// False-positive leak detection. TODO: GCC-366 +#pragma GCC diagnostic push // TODO: IDF-10105 +#if __clang__ +#pragma clang diagnostic ignored "-Wunknown-warning-option" +#else +#pragma GCC diagnostic ignored "-Wpragmas" +#endif +#pragma GCC diagnostic ignored "-Wanalyzer-malloc-leak" + free(client->config->scheme); + free(client->config->host); + free(client->config->path); + + client->config->scheme = create_string(uri + puri.field_data[UF_SCHEMA].off, puri.field_data[UF_SCHEMA].len); + client->config->host = create_string(uri + puri.field_data[UF_HOST].off, puri.field_data[UF_HOST].len); + client->config->path = NULL; +#pragma GCC diagnostic pop + + if (puri.field_data[UF_PATH].len || puri.field_data[UF_QUERY].len) { + int asprintf_ret_value; + if (puri.field_data[UF_QUERY].len == 0) { + asprintf_ret_value = asprintf(&client->config->path, + "%.*s", + puri.field_data[UF_PATH].len, uri + puri.field_data[UF_PATH].off); + } else if (puri.field_data[UF_PATH].len == 0) { + asprintf_ret_value = asprintf(&client->config->path, + "/?%.*s", + puri.field_data[UF_QUERY].len, uri + puri.field_data[UF_QUERY].off); + } else { + asprintf_ret_value = asprintf(&client->config->path, + "%.*s?%.*s", + puri.field_data[UF_PATH].len, uri + puri.field_data[UF_PATH].off, + puri.field_data[UF_QUERY].len, uri + puri.field_data[UF_QUERY].off); + } + + if (asprintf_ret_value == -1) { + ESP_LOGE(TAG,"%s(%d): %s", __FUNCTION__, __LINE__, "Memory exhausted"); + MQTT_API_UNLOCK(client); + return ESP_ERR_NO_MEM; + } + } + + if (puri.field_data[UF_PORT].len) { + client->config->port = strtol((const char *)(uri + puri.field_data[UF_PORT].off), NULL, 10); + } + + char *user_info = create_string(uri + puri.field_data[UF_USERINFO].off, puri.field_data[UF_USERINFO].len); + if (user_info) { + char *pass = strchr(user_info, ':'); + if (pass) { + pass[0] = 0; //terminal username + pass ++; + client->mqtt_state.connection.information.password = strdup(pass); + } + client->mqtt_state.connection.information.username = strdup(user_info); + + free(user_info); + } + + MQTT_API_UNLOCK(client); + return ESP_OK; +} + + +static esp_err_t esp_mqtt_dispatch_event_with_msgid(esp_mqtt_client_handle_t client) +{ + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { +#ifdef MQTT_PROTOCOL_5 + client->event.msg_id = mqtt5_get_id(client->mqtt_state.in_buffer, client->mqtt_state.in_buffer_length); +#endif + } else { + client->event.msg_id = mqtt_get_id(client->mqtt_state.in_buffer, client->mqtt_state.in_buffer_length); + } + return esp_mqtt_dispatch_event(client); +} + +esp_err_t esp_mqtt_dispatch_custom_event(esp_mqtt_client_handle_t client, esp_mqtt_event_t *event) +{ + esp_err_t ret = esp_event_post_to(client->config->event_loop_handle, MQTT_EVENTS, MQTT_USER_EVENT, event, sizeof(*event), 0); +#if MQTT_EVENT_QUEUE_SIZE > 1 + if (ret == ESP_OK) { + atomic_fetch_add(&client->queued_events, 1); + } +#endif + return ret; +} + +static esp_err_t esp_mqtt_dispatch_event(esp_mqtt_client_handle_t client) +{ + client->event.client = client; + client->event.protocol_ver = client->mqtt_state.connection.information.protocol_ver; + esp_err_t ret = ESP_FAIL; + +#ifdef MQTT_SUPPORTED_FEATURE_EVENT_LOOP + esp_event_post_to(client->config->event_loop_handle, MQTT_EVENTS, client->event.event_id, &client->event, sizeof(client->event), portMAX_DELAY); + ret = esp_event_loop_run(client->config->event_loop_handle, 0); +#else + return ESP_FAIL; +#endif + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { +#ifdef MQTT_PROTOCOL_5 + esp_mqtt5_client_delete_user_property(client->event.property->user_property); + client->event.property->user_property = NULL; +#endif + } + return ret; +} + +static esp_err_t deliver_publish(esp_mqtt_client_handle_t client) +{ + uint8_t *msg_buf = client->mqtt_state.in_buffer; + size_t msg_read_len = client->mqtt_state.in_buffer_read_len; + size_t msg_total_len = client->mqtt_state.message_length; + size_t msg_topic_len = msg_read_len; + size_t msg_data_len = msg_read_len; + size_t msg_data_offset = 0; + size_t saved_msg_topic_len = 0; + char *saved_msg_topic = NULL; + char *msg_topic = NULL; + char *msg_data = NULL; + + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { +#ifdef MQTT_PROTOCOL_5 + if (esp_mqtt5_get_publish_data(client, msg_buf, msg_read_len, &msg_topic, &msg_topic_len, &msg_data, &msg_data_len) != ESP_OK) { + ESP_LOGE(TAG, "%s: esp_mqtt5_get_publish_data() failed", __func__); + return ESP_FAIL; + } +#endif + } else { + msg_topic = mqtt_get_publish_topic(msg_buf, &msg_topic_len); + if (msg_topic == NULL) { + ESP_LOGE(TAG, "%s: mqtt_get_publish_topic() failed", __func__); + return ESP_FAIL; + } + ESP_LOGD(TAG, "%s: msg_topic_len=%"NEWLIB_NANO_COMPAT_FORMAT, __func__, NEWLIB_NANO_COMPAT_CAST(msg_topic_len)); + + // get payload + msg_data = mqtt_get_publish_data(msg_buf, &msg_data_len); + if (msg_data_len > 0 && msg_data == NULL) { + ESP_LOGE(TAG, "%s: mqtt_get_publish_data() failed", __func__); + return ESP_FAIL; + } + } + + client->event.retain = mqtt_get_retain(msg_buf); + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { +#ifdef MQTT_PROTOCOL_5 + client->event.msg_id = mqtt5_get_id(msg_buf, msg_read_len); +#endif + } else { + client->event.msg_id = mqtt_get_id(msg_buf, msg_read_len); + } + client->event.qos = mqtt_get_qos(msg_buf); + client->event.dup = mqtt_get_dup(msg_buf); + client->event.total_data_len = msg_data_len + msg_total_len - msg_read_len; + + bool send_event = true; + while (send_event) { + ESP_LOGD(TAG, "Get data len= %"NEWLIB_NANO_COMPAT_FORMAT", topic len=%"NEWLIB_NANO_COMPAT_FORMAT", total_data: %d offset: %"NEWLIB_NANO_COMPAT_FORMAT, + NEWLIB_NANO_COMPAT_CAST(msg_data_len), NEWLIB_NANO_COMPAT_CAST(msg_topic_len), + client->event.total_data_len, NEWLIB_NANO_COMPAT_CAST(msg_data_offset)); + client->event.event_id = MQTT_EVENT_DATA; + client->event.data = msg_data_len > 0 ? msg_data : NULL; + client->event.data_len = msg_data_len; + client->event.current_data_offset = msg_data_offset; + client->event.topic = msg_topic; + client->event.topic_len = msg_topic_len; + esp_mqtt_dispatch_event(client); + send_event = false; + + if (msg_read_len < msg_total_len) { + send_event = true; + #ifdef CONFIG_MQTT_TOPIC_PRESENT_ALL_DATA_EVENTS + if (!saved_msg_topic) { + saved_msg_topic = strndup(msg_topic, msg_topic_len); + ESP_MEM_CHECK(TAG, saved_msg_topic, return ESP_ERR_NO_MEM); + saved_msg_topic_len = msg_topic_len; + } + #endif + size_t buf_len = client->mqtt_state.in_buffer_length; + + msg_data = (char *)client->mqtt_state.in_buffer; + msg_topic = saved_msg_topic; + msg_topic_len = saved_msg_topic_len; + msg_data_offset += msg_data_len; + int ret = esp_transport_read(client->transport, (char *)client->mqtt_state.in_buffer, + msg_total_len - msg_read_len > buf_len ? buf_len : msg_total_len - msg_read_len, + client->config->network_timeout_ms); + if (ret <= 0) { + return esp_mqtt_handle_transport_read_error(ret, client, false) == 0 ? ESP_OK : ESP_FAIL; + } + + msg_data_len = ret; + msg_read_len += msg_data_len; + } + } + free(saved_msg_topic); + return ESP_OK; +} + +static esp_err_t deliver_suback(esp_mqtt_client_handle_t client) +{ + uint8_t *msg_buf = client->mqtt_state.in_buffer; + size_t msg_data_len = client->mqtt_state.in_buffer_read_len; + char *msg_data = NULL; + + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { +#ifdef MQTT_PROTOCOL_5 + msg_data = mqtt5_get_suback_data(msg_buf, &msg_data_len, &client->event.property->user_property); +#else + // SUBACK Using MQTT5 received but MQTT5 is disabled, This is unlikely to happen. + return ESP_FAIL; +#endif + } else { + msg_data = mqtt_get_suback_data(msg_buf, &msg_data_len); + } + if (msg_data_len <= 0) { + ESP_LOGE(TAG, "Failed to acquire suback data"); + return ESP_FAIL; + } + client->event.error_handle->esp_tls_stack_err = 0; + client->event.error_handle->esp_tls_last_esp_err = 0; + client->event.error_handle->esp_tls_cert_verify_flags = 0; + client->event.error_handle->error_type = MQTT_ERROR_TYPE_NONE; + client->event.error_handle->connect_return_code = MQTT_CONNECTION_ACCEPTED; + // post data event + for (int topic = 0; topic < msg_data_len; ++topic) { + if ((uint8_t)msg_data[topic] >= 0x80) { + client->event.error_handle->error_type = MQTT_ERROR_TYPE_SUBSCRIBE_FAILED; + break; + } + } + client->event.data_len = msg_data_len; + client->event.total_data_len = msg_data_len; + client->event.event_id = MQTT_EVENT_SUBSCRIBED; + client->event.data = msg_data; + client->event.current_data_offset = 0; + esp_mqtt_dispatch_event_with_msgid(client); + + return ESP_OK; +} + +// Deletes the initial message in MQTT communication protocol +// Return false when message is not found, making the received counterpart invalid. +static bool remove_initiator_message(esp_mqtt_client_handle_t client, int msg_type, int msg_id) +{ + if (outbox_delete(client->outbox, msg_id, msg_type) == ESP_OK) { + ESP_LOGD(TAG, "Removed pending_id=%d", msg_id); + return true; + } + + ESP_LOGD(TAG, "Failed to remove pending_id=%d", msg_id); + return false; +} + +static outbox_item_handle_t mqtt_enqueue(esp_mqtt_client_handle_t client, uint8_t *remaining_data, int remaining_len) +{ + ESP_LOGD(TAG, "mqtt_enqueue id: %d, type=%d successful", + client->mqtt_state.pending_msg_id, client->mqtt_state.pending_msg_type); + outbox_message_t msg = { 0 }; + msg.data = client->mqtt_state.connection.outbound_message.data; + msg.len = client->mqtt_state.connection.outbound_message.length; + msg.msg_id = client->mqtt_state.pending_msg_id; + msg.msg_type = client->mqtt_state.pending_msg_type; + msg.msg_qos = client->mqtt_state.pending_publish_qos; + msg.remaining_data = remaining_data; + msg.remaining_len = remaining_len; + //Copy to queue buffer + return outbox_enqueue(client->outbox, &msg, platform_tick_get_ms()); +} + + +/* + * Returns: + * -2 in case of failure or EOF (clean connection closure) + * -1 timeout while in-the-middle of the messge + * 0 if no message has been received + * 1 if a message has been received and placed to client->mqtt_state: + * message length: client->mqtt_state.message_length + * message content: client->mqtt_state.in_buffer + * + */ +static int mqtt_message_receive(esp_mqtt_client_handle_t client, int read_poll_timeout_ms) +{ + int read_len, total_len, fixed_header_len; + uint8_t *buf = client->mqtt_state.in_buffer + client->mqtt_state.in_buffer_read_len; + esp_transport_handle_t t = client->transport; + + client->mqtt_state.message_length = 0; + if (client->mqtt_state.in_buffer_read_len == 0) { + /* + * Read first byte of the mqtt packet fixed header, it contains packet + * type and flags. + */ + read_len = esp_transport_read(t, (char *)buf, 1, read_poll_timeout_ms); + if (read_len <= 0) { + return esp_mqtt_handle_transport_read_error(read_len, client, false); + } + ESP_LOGD(TAG, "%s: first byte: 0x%x", __func__, *buf); + /* + * Verify the flags and act according to MQTT protocol: close connection + * if the flags are set incorrectly. + */ + if (!mqtt_has_valid_msg_hdr(buf, read_len)) { + ESP_LOGE(TAG, "%s: received a message with an invalid header=0x%x", __func__, *buf); + goto err; + } + buf++; + client->mqtt_state.in_buffer_read_len++; + } + if ((client->mqtt_state.in_buffer_read_len == 1) || + ((client->mqtt_state.in_buffer_read_len < 6) && (*(buf - 1) & 0x80))) { + do { + /* + * Read the "remaining length" part of mqtt packet fixed header. It + * starts at second byte and spans up to 4 bytes, but we accept here + * only up to 2 bytes of remaining length, i.e. messages with + * maximal remaining length value = 16383 (maximal total message + * size of 16386 bytes). + */ + read_len = esp_transport_read(t, (char *)buf, 1, read_poll_timeout_ms); + if (read_len <= 0) { + return esp_mqtt_handle_transport_read_error(read_len, client, true); + } + ESP_LOGD(TAG, "%s: read \"remaining length\" byte: 0x%x", __func__, *buf); + buf++; + client->mqtt_state.in_buffer_read_len++; + } while ((client->mqtt_state.in_buffer_read_len < 6) && (*(buf - 1) & 0x80)); + } + total_len = mqtt_get_total_length(client->mqtt_state.in_buffer, client->mqtt_state.in_buffer_read_len, &fixed_header_len); + ESP_LOGD(TAG, "%s: total message length: %d (already read: %"NEWLIB_NANO_COMPAT_FORMAT")", __func__, total_len, NEWLIB_NANO_COMPAT_CAST(client->mqtt_state.in_buffer_read_len)); + client->mqtt_state.message_length = total_len; + if (client->mqtt_state.in_buffer_length < total_len) { + if (mqtt_get_type(client->mqtt_state.in_buffer) == MQTT_MSG_TYPE_PUBLISH) { + /* + * In case larger publish messages, we only need to read full topic, data can be split to multiple data event. + * Evaluate and correct total_len to read only publish message header, so data can be read separately + */ + if (client->mqtt_state.in_buffer_read_len < fixed_header_len + 2) { + /* read next 2 bytes - topic length to get minimum portion of publish packet */ + read_len = esp_transport_read(t, (char *)buf, client->mqtt_state.in_buffer_read_len - fixed_header_len + 2, read_poll_timeout_ms); + ESP_LOGD(TAG, "%s: read_len=%d", __func__, read_len); + if (read_len <= 0) { + return esp_mqtt_handle_transport_read_error(read_len, client, true); + } + client->mqtt_state.in_buffer_read_len += read_len; + buf += read_len; + if (client->mqtt_state.in_buffer_read_len < fixed_header_len + 2) { + ESP_LOGD(TAG, "%s: transport_read(): message reading left in progress :: total message length: %d (already read: %"NEWLIB_NANO_COMPAT_FORMAT")", + __func__, total_len, NEWLIB_NANO_COMPAT_CAST(client->mqtt_state.in_buffer_read_len)); + return 0; + } + } + int topic_len = client->mqtt_state.in_buffer[fixed_header_len] << 8; + topic_len |= client->mqtt_state.in_buffer[fixed_header_len + 1]; + total_len = fixed_header_len + topic_len + (mqtt_get_qos(client->mqtt_state.in_buffer) > 0 ? 2 : 0); + ESP_LOGD(TAG, "%s: total len modified to %d as message longer than input buffer", __func__, total_len); + if (client->mqtt_state.in_buffer_length < total_len) { + ESP_LOGE(TAG, "%s: message is too big, insufficient buffer size", __func__); + goto err; + } else { + total_len = client->mqtt_state.in_buffer_length; + } + /* free to continue with reading */ + } else { + ESP_LOGE(TAG, "%s: message is too big, insufficient buffer size", __func__); + goto err; + } + } + if (client->mqtt_state.in_buffer_read_len < total_len) { + /* read the rest of the mqtt message */ + read_len = esp_transport_read(t, (char *)buf, total_len - client->mqtt_state.in_buffer_read_len, read_poll_timeout_ms); + ESP_LOGD(TAG, "%s: read_len=%d", __func__, read_len); + if (read_len <= 0) { + return esp_mqtt_handle_transport_read_error(read_len, client, true); + } + client->mqtt_state.in_buffer_read_len += read_len; + if (client->mqtt_state.in_buffer_read_len < total_len) { + ESP_LOGD(TAG, "%s: transport_read(): message reading left in progress :: total message length: %d (already read: %"NEWLIB_NANO_COMPAT_FORMAT")", + __func__, total_len, NEWLIB_NANO_COMPAT_CAST(client->mqtt_state.in_buffer_read_len)); + return 0; + } + } + ESP_LOGV(TAG, "%s: transport_read():%"NEWLIB_NANO_COMPAT_FORMAT" %"NEWLIB_NANO_COMPAT_FORMAT, __func__, + NEWLIB_NANO_COMPAT_CAST(client->mqtt_state.in_buffer_read_len), NEWLIB_NANO_COMPAT_CAST(client->mqtt_state.message_length)); + return 1; +err: + esp_mqtt_client_dispatch_transport_error(client); + return -2; +} + +static esp_err_t mqtt_process_receive(esp_mqtt_client_handle_t client) +{ + uint8_t msg_type = 0, msg_qos = 0; + uint16_t msg_id = 0; + size_t previous_in_buffer_read_len = client->mqtt_state.in_buffer_read_len; + + /* non-blocking receive in order not to block other tasks */ + int recv = mqtt_message_receive(client, 0); + if (recv == 0) { // Timeout + return ESP_OK; + } + if (recv == -1) { // Mid-message timeout + if (previous_in_buffer_read_len == client->mqtt_state.in_buffer_read_len) { + // Report error only if didn't receive anything since previous iteration + ESP_LOGE(TAG, "%s: Network timeout while reading MQTT message", __func__); + return ESP_FAIL; + } + return ESP_OK; // Treat as standard timeout (keep reading the message) + } + if (recv < 0) { // Other error + ESP_LOGE(TAG, "%s: mqtt_message_receive() returned %d", __func__, recv); + return ESP_FAIL; + } + int read_len = client->mqtt_state.message_length; + + // If the message was valid, get the type, quality of service and id of the message + msg_type = mqtt_get_type(client->mqtt_state.in_buffer); + msg_qos = mqtt_get_qos(client->mqtt_state.in_buffer); + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { +#ifdef MQTT_PROTOCOL_5 + msg_id = mqtt5_get_id(client->mqtt_state.in_buffer, read_len); +#endif + } else { + msg_id = mqtt_get_id(client->mqtt_state.in_buffer, read_len); + } + + ESP_LOGD(TAG, "msg_type=%d, msg_id=%d", msg_type, msg_id); + + switch (msg_type) { + case MQTT_MSG_TYPE_SUBACK: + if (remove_initiator_message(client, MQTT_MSG_TYPE_SUBSCRIBE, msg_id)) { +#ifdef MQTT_PROTOCOL_5 + esp_mqtt5_parse_suback(client); +#endif + ESP_LOGD(TAG, "deliver_suback, message_length_read=%"NEWLIB_NANO_COMPAT_FORMAT", message_length=%"NEWLIB_NANO_COMPAT_FORMAT, + NEWLIB_NANO_COMPAT_CAST(client->mqtt_state.in_buffer_read_len), NEWLIB_NANO_COMPAT_CAST(client->mqtt_state.message_length)); + if (deliver_suback(client) != ESP_OK) { + ESP_LOGE(TAG, "Failed to deliver suback message id=%d", msg_id); + return ESP_FAIL; + } + } + break; + case MQTT_MSG_TYPE_UNSUBACK: + if (remove_initiator_message(client, MQTT_MSG_TYPE_UNSUBSCRIBE, msg_id)) { +#ifdef MQTT_PROTOCOL_5 + esp_mqtt5_parse_unsuback(client); +#endif + ESP_LOGD(TAG, "UnSubscribe successful"); + client->event.event_id = MQTT_EVENT_UNSUBSCRIBED; + esp_mqtt_dispatch_event_with_msgid(client); + } + break; + case MQTT_MSG_TYPE_PUBLISH: + ESP_LOGD(TAG, "deliver_publish, message_length_read=%"NEWLIB_NANO_COMPAT_FORMAT", message_length=%"NEWLIB_NANO_COMPAT_FORMAT, NEWLIB_NANO_COMPAT_CAST(client->mqtt_state.in_buffer_read_len), NEWLIB_NANO_COMPAT_CAST(client->mqtt_state.message_length)); + if (deliver_publish(client) != ESP_OK) { + ESP_LOGE(TAG, "Failed to deliver publish message id=%d", msg_id); + return ESP_FAIL; + } + if (msg_qos == 1 || msg_qos == 2) { + if (msg_qos == 1) { + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { +#ifdef MQTT_PROTOCOL_5 + mqtt5_msg_puback(&client->mqtt_state.connection, msg_id); +#endif + } else { + mqtt_msg_puback(&client->mqtt_state.connection, msg_id); + } + } else if (msg_qos == 2) { + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { +#ifdef MQTT_PROTOCOL_5 + mqtt5_msg_pubrec(&client->mqtt_state.connection, msg_id); +#endif + } else { + mqtt_msg_pubrec(&client->mqtt_state.connection, msg_id); + } + } + if (client->mqtt_state.connection.outbound_message.length == 0) { + ESP_LOGE(TAG, "Publish response message PUBACK or PUBREC cannot be created"); + return ESP_FAIL; + } + + ESP_LOGD(TAG, "Queue response QoS: %d", msg_qos); + + if (esp_mqtt_write(client) != ESP_OK) { + ESP_LOGE(TAG, "Error write qos msg repsonse, qos = %d", msg_qos); + return ESP_FAIL; + } + } + break; + case MQTT_MSG_TYPE_PUBACK: +#ifdef MQTT_PROTOCOL_5 + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { + esp_mqtt5_decrement_packet_counter(client); + } +#endif + if (remove_initiator_message(client, MQTT_MSG_TYPE_PUBLISH, msg_id)) { + ESP_LOGD(TAG, "received MQTT_MSG_TYPE_PUBACK, finish QoS1 publish"); +#ifdef MQTT_PROTOCOL_5 + esp_mqtt5_parse_puback(client); +#endif + client->event.event_id = MQTT_EVENT_PUBLISHED; + esp_mqtt_dispatch_event_with_msgid(client); + } + break; + case MQTT_MSG_TYPE_PUBREC: + ESP_LOGD(TAG, "received MQTT_MSG_TYPE_PUBREC"); + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { +#ifdef MQTT_PROTOCOL_5 + ESP_LOGI(TAG, "MQTT_MSG_TYPE_PUBREC return code is %d", mqtt5_msg_get_reason_code(client->mqtt_state.in_buffer, client->mqtt_state.in_buffer_read_len)); + mqtt5_msg_pubrel(&client->mqtt_state.connection, msg_id); +#endif + } else { + mqtt_msg_pubrel(&client->mqtt_state.connection, msg_id); + } + if (client->mqtt_state.connection.outbound_message.length == 0) { + ESP_LOGE(TAG, "Publish response message PUBREL cannot be created"); + return ESP_FAIL; + } + + outbox_set_pending(client->outbox, msg_id, ACKNOWLEDGED); + esp_mqtt_write(client); + break; + case MQTT_MSG_TYPE_PUBREL: + ESP_LOGD(TAG, "received MQTT_MSG_TYPE_PUBREL"); + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { +#ifdef MQTT_PROTOCOL_5 + ESP_LOGI(TAG, "MQTT_MSG_TYPE_PUBREL return code is %d", mqtt5_msg_get_reason_code(client->mqtt_state.in_buffer, client->mqtt_state.in_buffer_read_len)); + mqtt5_msg_pubcomp(&client->mqtt_state.connection, msg_id); +#endif + } else { + mqtt_msg_pubcomp(&client->mqtt_state.connection, msg_id); + } + if (client->mqtt_state.connection.outbound_message.length == 0) { + ESP_LOGE(TAG, "Publish response message PUBCOMP cannot be created"); + return ESP_FAIL; + } + + esp_mqtt_write(client); + break; + case MQTT_MSG_TYPE_PUBCOMP: + ESP_LOGD(TAG, "received MQTT_MSG_TYPE_PUBCOMP"); +#ifdef MQTT_PROTOCOL_5 + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { + esp_mqtt5_decrement_packet_counter(client); + } +#endif + if (remove_initiator_message(client, MQTT_MSG_TYPE_PUBLISH, msg_id)) { + ESP_LOGD(TAG, "Receive MQTT_MSG_TYPE_PUBCOMP, finish QoS2 publish"); +#ifdef MQTT_PROTOCOL_5 + esp_mqtt5_parse_pubcomp(client); +#endif + client->event.event_id = MQTT_EVENT_PUBLISHED; + esp_mqtt_dispatch_event_with_msgid(client); + } + break; + case MQTT_MSG_TYPE_PINGRESP: + ESP_LOGD(TAG, "MQTT_MSG_TYPE_PINGRESP"); + client->wait_for_ping_resp = false; + /* It is the responsibility of the Client to ensure that the interval between Control Packets + * being sent does not exceed the Keep Alive value. In the absence of sending any other Control + * Packets, the Client MUST send a PINGREQ Packet [MQTT-3.1.2-23]. + * [MQTT-3.1.2-23] + */ + client->keepalive_tick = platform_tick_get_ms(); + break; + case MQTT_MSG_TYPE_DISCONNECT: + ESP_LOGD(TAG, "MQTT_MSG_TYPE_DISCONNECT"); +#ifdef MQTT_PROTOCOL_5 + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { + int disconnect_rsp_code; + esp_mqtt5_parse_disconnect(client, &disconnect_rsp_code); + client->event.event_id = MQTT_EVENT_DISCONNECTED; + client->event.error_handle->disconnect_return_code = disconnect_rsp_code; + esp_mqtt_dispatch_event_with_msgid(client); + } +#endif + break; + } + + client->mqtt_state.in_buffer_read_len = 0; + return ESP_OK; +} + +static esp_err_t mqtt_resend_queued(esp_mqtt_client_handle_t client, outbox_item_handle_t item) +{ + // decode queued data + client->mqtt_state.connection.outbound_message.data = outbox_item_get_data(item, &client->mqtt_state.connection.outbound_message.length, &client->mqtt_state.pending_msg_id, + &client->mqtt_state.pending_msg_type, &client->mqtt_state.pending_publish_qos); + // set duplicate flag for QoS-1 and QoS-2 messages + if (client->mqtt_state.pending_msg_type == MQTT_MSG_TYPE_PUBLISH && client->mqtt_state.pending_publish_qos > 0 && (outbox_item_get_pending(item) == TRANSMITTED)) { + mqtt_set_dup(client->mqtt_state.connection.outbound_message.data); + ESP_LOGD(TAG, "Sending Duplicated QoS%d message with id=%d", client->mqtt_state.pending_publish_qos, client->mqtt_state.pending_msg_id); + } + + // try to resend the data + if (esp_mqtt_write(client) != ESP_OK) { + ESP_LOGE(TAG, "Error to resend data "); + esp_mqtt_abort_connection(client); + return ESP_FAIL; + } + + return ESP_OK; +} + +static esp_err_t mqtt_resend_pubrel(esp_mqtt_client_handle_t client, outbox_item_handle_t item) +{ + client->mqtt_state.connection.outbound_message.data = outbox_item_get_data(item, &client->mqtt_state.connection.outbound_message.length, &client->mqtt_state.pending_msg_id, + &client->mqtt_state.pending_msg_type, &client->mqtt_state.pending_publish_qos); + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { +#ifdef MQTT_PROTOCOL_5 + ESP_LOGI(TAG, "MQTT_MSG_TYPE_PUBREC return code is %d", mqtt5_msg_get_reason_code(client->mqtt_state.in_buffer, client->mqtt_state.in_buffer_read_len)); + mqtt5_msg_pubrel(&client->mqtt_state.connection, client->mqtt_state.pending_msg_id); +#endif + } else { + mqtt_msg_pubrel(&client->mqtt_state.connection, client->mqtt_state.pending_msg_id); + } + if (client->mqtt_state.connection.outbound_message.length == 0) { + ESP_LOGE(TAG, "Publish response message PUBREL cannot be created"); + return ESP_FAIL; + } + + if (esp_mqtt_write(client) != ESP_OK) { + ESP_LOGE(TAG, "Error to resend data "); + esp_mqtt_abort_connection(client); + return ESP_FAIL; + } + + return ESP_OK; +} + +static void mqtt_delete_expired_messages(esp_mqtt_client_handle_t client) +{ + // Delete message after OUTBOX_EXPIRED_TIMEOUT_MS milliseconds +#if MQTT_REPORT_DELETED_MESSAGES + // also report the deleted items as MQTT_EVENT_DELETED events if enabled + int msg_id = 0; + while ((msg_id = outbox_delete_single_expired(client->outbox, platform_tick_get_ms(), OUTBOX_EXPIRED_TIMEOUT_MS)) >= 0) { + client->event.event_id = MQTT_EVENT_DELETED; + client->event.msg_id = msg_id; + if (esp_mqtt_dispatch_event(client) != ESP_OK) { + ESP_LOGE(TAG, "Failed to post event on deleting message id=%d", msg_id); + } + } +#else + outbox_delete_expired(client->outbox, platform_tick_get_ms(), OUTBOX_EXPIRED_TIMEOUT_MS); +#endif +} + +/** + * @brief When using multiple queued item, we'd like to reduce the poll timeout to proceed with event loop exacution + */ +static inline int max_poll_timeout(esp_mqtt_client_handle_t client, int max_timeout) +{ + return +#if MQTT_EVENT_QUEUE_SIZE > 1 + atomic_load(&client->queued_events) > 0 ? 10 : max_timeout; +#else + max_timeout; +#endif +} + +static inline void run_event_loop(esp_mqtt_client_handle_t client) +{ +#if MQTT_EVENT_QUEUE_SIZE > 1 + if (atomic_load(&client->queued_events) > 0) { + atomic_fetch_sub(&client->queued_events, 1); +#else + { +#endif + esp_err_t ret = esp_event_loop_run(client->config->event_loop_handle, 0); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "Error in running event_loop %d", ret); + } + } +} + +static void esp_mqtt_task(void *pv) +{ + esp_mqtt_client_handle_t client = (esp_mqtt_client_handle_t) pv; + uint64_t last_retransmit = 0; + outbox_tick_t msg_tick = 0; + client->run = true; + + client->state = MQTT_STATE_INIT; + xEventGroupClearBits(client->status_bits, STOPPED_BIT); + while (client->run) { + MQTT_API_LOCK(client); + run_event_loop(client); + // delete long pending messages + mqtt_delete_expired_messages(client); + mqtt_client_state_t state = client->state; + switch (state) { + case MQTT_STATE_DISCONNECTED: + break; + case MQTT_STATE_INIT: + xEventGroupClearBits(client->status_bits, RECONNECT_BIT | DISCONNECT_BIT); + + client->transport = client->config->transport; + if (!client->transport) { + + if (esp_mqtt_client_create_transport(client) != ESP_OK) { + ESP_LOGE(TAG, "Failed to create transport list"); + client->run = false; + break; + } + //get transport by scheme + client->transport = esp_transport_list_get_transport(client->transport_list, client->config->scheme); + + if (client->transport == NULL) { + ESP_LOGE(TAG, "There are no transports valid, stop mqtt client, config scheme = %s", client->config->scheme); + client->run = false; + break; + } + } + //default port + if (client->config->port == 0) { + client->config->port = esp_transport_get_default_port(client->transport); + } + +#if MQTT_ENABLE_SSL + esp_mqtt_set_ssl_transport_properties(client->transport_list, client->config); +#endif + + if(client->config->tcp_keep_alive_cfg.keep_alive_enable) { + esp_transport_tcp_set_keep_alive(client->transport, &client->config->tcp_keep_alive_cfg); + } + + client->event.event_id = MQTT_EVENT_BEFORE_CONNECT; + esp_mqtt_dispatch_event_with_msgid(client); + + if (esp_transport_connect(client->transport, + client->config->host, + client->config->port, + client->config->network_timeout_ms) < 0) { + ESP_LOGE(TAG, "Error transport connect"); + esp_mqtt_client_dispatch_transport_error(client); + esp_mqtt_abort_connection(client); + break; + } + ESP_LOGD(TAG, "Transport connected to %s://%s:%d", client->config->scheme, client->config->host, client->config->port); + if (esp_mqtt_connect(client, client->config->network_timeout_ms) != ESP_OK) { + ESP_LOGE(TAG, "MQTT connect failed"); + esp_mqtt_abort_connection(client); + break; + } + client->event.event_id = MQTT_EVENT_CONNECTED; + if (client->mqtt_state.connection.information.protocol_ver != MQTT_PROTOCOL_V_5) { + client->event.session_present = mqtt_get_connect_session_present(client->mqtt_state.in_buffer); + } + client->state = MQTT_STATE_CONNECTED; + esp_mqtt_dispatch_event_with_msgid(client); + client->refresh_connection_tick = platform_tick_get_ms(); + client->keepalive_tick = platform_tick_get_ms(); + + break; + case MQTT_STATE_CONNECTED: + // check for disconnection request + if (xEventGroupWaitBits(client->status_bits, DISCONNECT_BIT, true, true, 0) & DISCONNECT_BIT) { + send_disconnect_msg(client); // ignore error, if clean disconnect fails, just abort the connection + esp_mqtt_abort_connection(client); + break; + } + // receive and process data + if (mqtt_process_receive(client) == ESP_FAIL) { + esp_mqtt_abort_connection(client); + break; + } + + if (last_retransmit == 0) { + // connected for first time, set last_retransmit to now, avoid retransmit + last_retransmit = platform_tick_get_ms(); + } + + + // resend all non-transmitted messages first + outbox_item_handle_t item = outbox_dequeue(client->outbox, QUEUED, NULL); + if (item) { + if (mqtt_resend_queued(client, item) == ESP_OK) { + if (client->mqtt_state.pending_msg_type == MQTT_MSG_TYPE_PUBLISH && client->mqtt_state.pending_publish_qos == 0) { + // delete all qos0 publish messages once we process them + if (outbox_delete_item(client->outbox, item) != ESP_OK) { + ESP_LOGE(TAG, "Failed to remove queued qos0 message from the outbox"); + } + } + if (client->mqtt_state.pending_publish_qos > 0) { + outbox_set_pending(client->outbox, client->mqtt_state.pending_msg_id, TRANSMITTED); +#ifdef MQTT_PROTOCOL_5 + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { + esp_mqtt5_increment_packet_counter(client); + } +#endif + } + } + // resend other "transmitted" messages after 1s + } else if (has_timed_out(last_retransmit, client->config->message_retransmit_timeout)) { + last_retransmit = platform_tick_get_ms(); + item = outbox_dequeue(client->outbox, TRANSMITTED, &msg_tick); + if (item && (last_retransmit - msg_tick > client->config->message_retransmit_timeout)) { + if (mqtt_resend_queued(client, item) == ESP_OK) { +#ifdef MQTT_PROTOCOL_5 + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { + esp_mqtt5_increment_packet_counter(client); + } +#endif + } + } + item = outbox_dequeue(client->outbox, ACKNOWLEDGED, &msg_tick); + if (item && (last_retransmit - msg_tick > client->config->message_retransmit_timeout)) { + if (mqtt_resend_pubrel(client, item) == ESP_OK) { +#ifdef MQTT_PROTOCOL_5 + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { + esp_mqtt5_increment_packet_counter(client); + } +#endif + } + } + } + + if (process_keepalive(client) != ESP_OK) { + break; + } + + if (client->config->refresh_connection_after_ms && + has_timed_out(client->refresh_connection_tick, client->config->refresh_connection_after_ms)) { + ESP_LOGD(TAG, "Refreshing the connection..."); + esp_mqtt_abort_connection(client); + client->state = MQTT_STATE_INIT; + } + + break; + case MQTT_STATE_WAIT_RECONNECT: + + if (!client->config->auto_reconnect && xEventGroupGetBits(client->status_bits)&RECONNECT_BIT) { + xEventGroupClearBits(client->status_bits, RECONNECT_BIT); + client->state = MQTT_STATE_INIT; + client->wait_timeout_ms = MQTT_RECON_DEFAULT_MS; + ESP_LOGD(TAG, "Reconnecting per user request..."); + break; + } else if (client->config->auto_reconnect && + platform_tick_get_ms() - client->reconnect_tick > client->wait_timeout_ms) { + client->state = MQTT_STATE_INIT; + client->reconnect_tick = platform_tick_get_ms(); + ESP_LOGD(TAG, "Reconnecting..."); + break; + } + MQTT_API_UNLOCK(client); + xEventGroupWaitBits(client->status_bits, RECONNECT_BIT, false, true, + max_poll_timeout(client, client->wait_timeout_ms / 2 / portTICK_PERIOD_MS)); + // continue the while loop instead of break, as the mutex is unlocked + continue; + default: + ESP_LOGE(TAG, "MQTT client error, client is in an unrecoverable state."); + break; + } + MQTT_API_UNLOCK(client); + if (MQTT_STATE_CONNECTED == client->state) { + if (esp_transport_poll_read(client->transport, max_poll_timeout(client, MQTT_POLL_READ_TIMEOUT_MS)) < 0) { + ESP_LOGE(TAG, "Poll read error: %d, aborting connection", errno); + esp_mqtt_abort_connection(client); + } + } + + } + esp_transport_close(client->transport); + outbox_delete_all_items(client->outbox); + client->state = MQTT_STATE_DISCONNECTED; + xEventGroupSetBits(client->status_bits, STOPPED_BIT); + + vTaskDelete(NULL); +} + +esp_err_t esp_mqtt_client_start(esp_mqtt_client_handle_t client) +{ + if (!client) { + ESP_LOGE(TAG, "Client was not initialized"); + return ESP_ERR_INVALID_ARG; + } + MQTT_API_LOCK(client); + if (client->state != MQTT_STATE_INIT && client->state != MQTT_STATE_DISCONNECTED) { + ESP_LOGE(TAG, "Client has started"); + MQTT_API_UNLOCK(client); + return ESP_FAIL; + } + esp_err_t err = ESP_OK; +#if MQTT_CORE_SELECTION_ENABLED + ESP_LOGD(TAG, "Core selection enabled on %u", MQTT_TASK_CORE); + if (xTaskCreatePinnedToCore(esp_mqtt_task, "mqtt_task", client->config->task_stack, client, client->config->task_prio, &client->task_handle, MQTT_TASK_CORE) != pdTRUE) { + ESP_LOGE(TAG, "Error create mqtt task"); + err = ESP_FAIL; + } +#else + ESP_LOGD(TAG, "Core selection disabled"); + if (xTaskCreate(esp_mqtt_task, "mqtt_task", client->config->task_stack, client, client->config->task_prio, &client->task_handle) != pdTRUE) { + ESP_LOGE(TAG, "Error create mqtt task"); + err = ESP_FAIL; + } +#endif + MQTT_API_UNLOCK(client); + return err; +} + +esp_err_t esp_mqtt_client_disconnect(esp_mqtt_client_handle_t client) +{ + if (!client) { + ESP_LOGE(TAG, "Client was not initialized"); + return ESP_ERR_INVALID_ARG; + } + ESP_LOGI(TAG, "Client asked to disconnect"); + xEventGroupSetBits(client->status_bits, DISCONNECT_BIT); + return ESP_OK; +} + +esp_err_t esp_mqtt_client_reconnect(esp_mqtt_client_handle_t client) +{ + if (!client) { + ESP_LOGE(TAG, "Client was not initialized"); + return ESP_ERR_INVALID_ARG; + } + ESP_LOGI(TAG, "Client force reconnect requested"); + if (client->state != MQTT_STATE_WAIT_RECONNECT) { + ESP_LOGD(TAG, "The client is not waiting for reconnection. Ignore the request"); + return ESP_FAIL; + } + client->wait_timeout_ms = 0; + xEventGroupSetBits(client->status_bits, RECONNECT_BIT); + return ESP_OK; +} + +static esp_err_t send_disconnect_msg(esp_mqtt_client_handle_t client) +{ + // Notify the broker we are disconnecting + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { +#ifdef MQTT_PROTOCOL_5 + mqtt5_msg_disconnect(&client->mqtt_state.connection, &client->mqtt5_config->disconnect_property_info); + if (client->mqtt_state.connection.outbound_message.length) { + esp_mqtt5_client_delete_user_property(client->mqtt5_config->disconnect_property_info.user_property); + client->mqtt5_config->disconnect_property_info.user_property = NULL; + memset(&client->mqtt5_config->disconnect_property_info, 0, sizeof(esp_mqtt5_disconnect_property_config_t)); + } +#endif + } else { + mqtt_msg_disconnect(&client->mqtt_state.connection); + } + if (client->mqtt_state.connection.outbound_message.length == 0) { + ESP_LOGE(TAG, "Disconnect message cannot be created"); + return ESP_FAIL; + } + if (esp_mqtt_write(client) != ESP_OK) { + ESP_LOGE(TAG, "Error sending disconnect message"); + } + return ESP_OK; +} + +esp_err_t esp_mqtt_client_stop(esp_mqtt_client_handle_t client) +{ + if (!client) { + ESP_LOGE(TAG, "Client was not initialized"); + return ESP_ERR_INVALID_ARG; + } + MQTT_API_LOCK(client); + if (client->run) { + /* A running client cannot be stopped from the MQTT task/event handler */ + TaskHandle_t running_task = xTaskGetCurrentTaskHandle(); + if (running_task == client->task_handle) { + MQTT_API_UNLOCK(client); + ESP_LOGE(TAG, "Client cannot be stopped from MQTT task"); + return ESP_FAIL; + } + + // Only send the disconnect message if the client is connected + if (client->state == MQTT_STATE_CONNECTED) { + send_disconnect_msg(client); + } + + client->run = false; + client->state = MQTT_STATE_DISCONNECTED; + MQTT_API_UNLOCK(client); + xEventGroupWaitBits(client->status_bits, STOPPED_BIT, false, true, portMAX_DELAY); + return ESP_OK; + } else { + ESP_LOGW(TAG, "Client asked to stop, but was not started"); + MQTT_API_UNLOCK(client); + return ESP_FAIL; + } +} + +static esp_err_t esp_mqtt_client_ping(esp_mqtt_client_handle_t client) +{ + mqtt_msg_pingreq(&client->mqtt_state.connection); + if (client->mqtt_state.connection.outbound_message.length == 0) { + ESP_LOGE(TAG, "Ping message cannot be created"); + return ESP_FAIL; + } + + if (esp_mqtt_write(client) != ESP_OK) { + ESP_LOGE(TAG, "Error sending ping"); + return ESP_FAIL; + } + ESP_LOGD(TAG, "Sent PING successful"); + return ESP_OK; +} + +int esp_mqtt_client_subscribe_multiple(esp_mqtt_client_handle_t client, + const esp_mqtt_topic_t *topic_list, int size) +{ + if (!client) { + ESP_LOGE(TAG, "Client was not initialized"); + return -1; + } + + if (client->config->outbox_limit > 0 && outbox_get_size(client->outbox) > client->config->outbox_limit) { + return -2; + } + + if (client->state != MQTT_STATE_CONNECTED) { + ESP_LOGE(TAG, "Client has not connected"); + return -1; + } + + MQTT_API_LOCK(client); + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { +#ifdef MQTT_PROTOCOL_5 + int max_qos = topic_list[0].qos; + for (int topic_number = 0; topic_number < size; ++topic_number) { + if (topic_list[topic_number].qos > max_qos) { + max_qos = topic_list[topic_number].qos; + } + } + if (esp_mqtt5_client_subscribe_check(client, max_qos) != ESP_OK) { + ESP_LOGI(TAG, "MQTT5 subscribe check fail: QoS %d not accepted by broker ", max_qos); + MQTT_API_UNLOCK(client); + return -1; + } + mqtt5_msg_subscribe(&client->mqtt_state.connection, + topic_list, size, + &client->mqtt_state.pending_msg_id, client->mqtt5_config->subscribe_property_info); + if (client->mqtt_state.connection.outbound_message.length) { + client->mqtt5_config->subscribe_property_info = NULL; + } +#endif + } else { + mqtt_msg_subscribe(&client->mqtt_state.connection, + topic_list, size, + &client->mqtt_state.pending_msg_id); + } + if (client->mqtt_state.connection.outbound_message.length == 0) { + ESP_LOGE(TAG, "Subscribe message cannot be created"); + MQTT_API_UNLOCK(client); + return -1; + } + + client->mqtt_state.pending_msg_type = mqtt_get_type(client->mqtt_state.connection.outbound_message.data); + //move pending msg to outbox (if have) + if (!mqtt_enqueue(client, NULL, 0)) { + MQTT_API_UNLOCK(client); + return -1; + } + outbox_set_pending(client->outbox, client->mqtt_state.pending_msg_id, TRANSMITTED);// handle error + + if (esp_mqtt_write(client) != ESP_OK) { + ESP_LOGE(TAG, "Error to send subscribe message, first topic: %s, qos: %d", topic_list[0].filter, topic_list[0].qos); + MQTT_API_UNLOCK(client); + return -1; + } + + ESP_LOGD(TAG, "Sent subscribe, first topic=%s, id: %d", topic_list[0].filter, client->mqtt_state.pending_msg_id); + + int pending_msg_id = client->mqtt_state.pending_msg_id; + MQTT_API_UNLOCK(client); + return pending_msg_id; + +} +int esp_mqtt_client_subscribe_single(esp_mqtt_client_handle_t client, const char *topic, int qos) +{ + esp_mqtt_topic_t user_topic = {.filter = topic, .qos = qos}; + return esp_mqtt_client_subscribe_multiple(client, &user_topic, 1); +} + +int esp_mqtt_client_unsubscribe(esp_mqtt_client_handle_t client, const char *topic) +{ + if (!client) { + ESP_LOGE(TAG, "Client was not initialized"); + return -1; + } + if (client->state != MQTT_STATE_CONNECTED) { + ESP_LOGE(TAG, "Client has not connected"); + return -1; + } + MQTT_API_LOCK(client); + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { +#ifdef MQTT_PROTOCOL_5 + mqtt5_msg_unsubscribe(&client->mqtt_state.connection, + topic, + &client->mqtt_state.pending_msg_id, client->mqtt5_config->unsubscribe_property_info); + if (client->mqtt_state.connection.outbound_message.length) { + client->mqtt5_config->unsubscribe_property_info = NULL; + } +#endif + } else { + mqtt_msg_unsubscribe(&client->mqtt_state.connection, + topic, + &client->mqtt_state.pending_msg_id); + } + if (client->mqtt_state.connection.outbound_message.length == 0) { + MQTT_API_UNLOCK(client); + ESP_LOGE(TAG, "Unubscribe message cannot be created"); + return -1; + } + ESP_LOGD(TAG, "unsubscribe, topic\"%s\", id: %d", topic, client->mqtt_state.pending_msg_id); + + client->mqtt_state.pending_msg_type = mqtt_get_type(client->mqtt_state.connection.outbound_message.data); + if (!mqtt_enqueue(client, NULL, 0)) { + MQTT_API_UNLOCK(client); + return -1; + } + outbox_set_pending(client->outbox, client->mqtt_state.pending_msg_id, TRANSMITTED); //handle error + + if (esp_mqtt_write(client) != ESP_OK) { + ESP_LOGE(TAG, "Error to unsubscribe topic=%s", topic); + MQTT_API_UNLOCK(client); + return -1; + } + + ESP_LOGD(TAG, "Sent Unsubscribe topic=%s, id: %d, successful", topic, client->mqtt_state.pending_msg_id); + + int pending_msg_id = client->mqtt_state.pending_msg_id; + MQTT_API_UNLOCK(client); + return pending_msg_id; +} + +static int make_publish(esp_mqtt_client_handle_t client, const char *topic, const char *data, + int len, int qos, int retain) +{ + uint16_t pending_msg_id = 0; + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { +#ifdef MQTT_PROTOCOL_5 + mqtt5_msg_publish(&client->mqtt_state.connection, + topic, data, len, + qos, retain, + &pending_msg_id, client->mqtt5_config->publish_property_info, client->mqtt5_config->server_resp_property_info.response_info); + if (client->mqtt_state.connection.outbound_message.length) { + client->mqtt5_config->publish_property_info = NULL; + } +#endif + } else { + mqtt_msg_publish(&client->mqtt_state.connection, + topic, data, len, + qos, retain, + &pending_msg_id); + } + + if (client->mqtt_state.connection.outbound_message.length == 0) { + ESP_LOGE(TAG, "Publish message cannot be created"); + return -1; + } + return pending_msg_id; +} +static inline int mqtt_client_enqueue_publish(esp_mqtt_client_handle_t client, const char *topic, const char *data, + int len, int qos, int retain, bool store) +{ + int pending_msg_id = make_publish(client, topic, data, len, qos, retain); + if (pending_msg_id < 0) { + return -1; + } + /* We have to set as pending all the qos>0 messages */ + //TODO: client->mqtt_state.outbound_message = publish_msg; + if (qos > 0 || store) { + client->mqtt_state.pending_msg_type = mqtt_get_type(client->mqtt_state.connection.outbound_message.data); + client->mqtt_state.pending_msg_id = pending_msg_id; + client->mqtt_state.pending_publish_qos = qos; + // by default store as QUEUED (not transmitted yet) only for messages which would fit outbound buffer + if (client->mqtt_state.connection.outbound_message.fragmented_msg_total_length == 0) { + if (!mqtt_enqueue(client, NULL, 0)) { + return -1; + } + } else { + int first_fragment = client->mqtt_state.connection.outbound_message.length - client->mqtt_state.connection.outbound_message.fragmented_msg_data_offset; + if (!mqtt_enqueue(client, ((uint8_t *)data) + first_fragment, len - first_fragment)) { + return -1; + } + client->mqtt_state.connection.outbound_message.fragmented_msg_total_length = 0; + } + } + return pending_msg_id; +} + +int esp_mqtt_client_publish(esp_mqtt_client_handle_t client, const char *topic, const char *data, int len, int qos, int retain) +{ + if (!client) { + ESP_LOGE(TAG, "Client was not initialized"); + return -1; + } +#if MQTT_SKIP_PUBLISH_IF_DISCONNECTED + if (client->state != MQTT_STATE_CONNECTED) { + ESP_LOGI(TAG, "Publishing skipped: client is not connected"); + return -1; + } +#endif + +MQTT_API_LOCK(client); +#ifdef MQTT_PROTOCOL_5 + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { + if (esp_mqtt5_client_publish_check(client, qos, retain) != ESP_OK) { + ESP_LOGI(TAG, "MQTT5 publish check fail"); + MQTT_API_UNLOCK(client); + return -1; + } + } +#endif + + /* Acceptable publish messages: + data == NULL, len == 0: publish null message + data valid, len == 0: publish all data, payload len is determined from string length + data valid, len > 0: publish data with defined length + */ + if (len <= 0 && data != NULL) { + len = strlen(data); + } + + if (client->config->outbox_limit > 0 && qos > 0) { + if (len + outbox_get_size(client->outbox) > client->config->outbox_limit) { + MQTT_API_UNLOCK(client); + return -2; + } + } + + int pending_msg_id = mqtt_client_enqueue_publish(client, topic, data, len, qos, retain, false); + if (pending_msg_id < 0) { + MQTT_API_UNLOCK(client); + return -1; + } + int ret = 0; + + /* Skip sending if not connected (rely on resending) */ + if (client->state != MQTT_STATE_CONNECTED) { + ESP_LOGD(TAG, "Publish: client is not connected"); + if (qos > 0) { + ret = pending_msg_id; + } else { + ret = -1; + } + + goto cannot_publish; + } + + /* Provide support for sending fragmented message if it doesn't fit buffer */ + int remaining_len = len; + const char *current_data = data; + bool sending = true; + + while (sending) { + + if (esp_mqtt_write(client) != ESP_OK) { + esp_mqtt_abort_connection(client); + ret = -1; + goto cannot_publish; + } + + int data_sent = client->mqtt_state.connection.outbound_message.length - client->mqtt_state.connection.outbound_message.fragmented_msg_data_offset; + client->mqtt_state.connection.outbound_message.fragmented_msg_data_offset = 0; + client->mqtt_state.connection.outbound_message.fragmented_msg_total_length = 0; + remaining_len -= data_sent; + current_data += data_sent; + + if (remaining_len > 0) { + mqtt_connection_t *connection = &client->mqtt_state.connection; + ESP_LOGD(TAG, "Sending fragmented message, remains to send %d bytes of %d", remaining_len, len); + int write_len = remaining_len > connection->buffer_length ? connection->buffer_length : remaining_len; + memcpy(connection->buffer, current_data, write_len); + connection->outbound_message.data = connection->buffer; + connection->outbound_message.length = write_len; + sending = true; + } else { + // Message was sent correctly + sending = false; + } + } + + if (qos > 0) { +#ifdef MQTT_PROTOCOL_5 + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { + esp_mqtt5_increment_packet_counter(client); + } +#endif + //Tick is set after transmit to avoid retransmitting too early due slow network speed / big messages + outbox_set_tick(client->outbox, pending_msg_id, platform_tick_get_ms()); + outbox_set_pending(client->outbox, pending_msg_id, TRANSMITTED); + } + MQTT_API_UNLOCK(client); + return pending_msg_id; + +cannot_publish: + // clear out possible fragmented publish if failed or skipped + client->mqtt_state.connection.outbound_message.fragmented_msg_total_length = 0; + if (qos == 0) { + ESP_LOGW(TAG, "Publish: Losing qos0 data when client not connected"); + } + MQTT_API_UNLOCK(client); + + return ret; +} + +int esp_mqtt_client_enqueue(esp_mqtt_client_handle_t client, const char *topic, const char *data, int len, int qos, int retain, bool store) +{ + if (!client) { + ESP_LOGE(TAG, "Client was not initialized"); + return -1; + } + + /* Acceptable publish messages: + data == NULL, len == 0: publish null message + data valid, len == 0: publish all data, payload len is determined from string length + data valid, len > 0: publish data with defined length + */ + if (len <= 0 && data != NULL) { + len = strlen(data); + } + + if (client->config->outbox_limit > 0) { + if (len + outbox_get_size(client->outbox) > client->config->outbox_limit) { + return -2; + } + + } + + MQTT_API_LOCK(client); +#ifdef MQTT_PROTOCOL_5 + if (client->mqtt_state.connection.information.protocol_ver == MQTT_PROTOCOL_V_5) { + if (esp_mqtt5_client_publish_check(client, qos, retain) != ESP_OK) { + ESP_LOGI(TAG, "esp_mqtt_client_enqueue check fail"); + MQTT_API_UNLOCK(client); + return -1; + } + } +#endif + int ret = mqtt_client_enqueue_publish(client, topic, data, len, qos, retain, store); + MQTT_API_UNLOCK(client); + if (ret == 0 && store == false) { + // messages with qos=0 are not enqueued if not overridden by store_in_outobx -> indicate as error + return -1; + } + return ret; +} + +esp_err_t esp_mqtt_client_register_event(esp_mqtt_client_handle_t client, esp_mqtt_event_id_t event, esp_event_handler_t event_handler, void *event_handler_arg) +{ + if (client == NULL) { + return ESP_ERR_INVALID_ARG; + } +#ifdef MQTT_SUPPORTED_FEATURE_EVENT_LOOP + + return esp_event_handler_register_with(client->config->event_loop_handle, MQTT_EVENTS, event, event_handler, event_handler_arg); +#else + ESP_LOGE(TAG, "Registering event handler while event loop not available in IDF version %s", IDF_VER); + return ESP_FAIL; +#endif +} + +esp_err_t esp_mqtt_client_unregister_event(esp_mqtt_client_handle_t client, esp_mqtt_event_id_t event, esp_event_handler_t event_handler) +{ + if (client == NULL) { + return ESP_ERR_INVALID_ARG; + } +#ifdef MQTT_SUPPORTED_FEATURE_EVENT_LOOP + + return esp_event_handler_unregister_with(client->config->event_loop_handle, MQTT_EVENTS, event, event_handler); +#else + ESP_LOGE(TAG, "Unregistering event handler while event loop not available in IDF version %s", IDF_VER); + return ESP_FAIL; +#endif +} + +static void esp_mqtt_client_dispatch_transport_error(esp_mqtt_client_handle_t client) +{ + client->event.event_id = MQTT_EVENT_ERROR; + client->event.error_handle->error_type = MQTT_ERROR_TYPE_TCP_TRANSPORT; + client->event.error_handle->connect_return_code = 0; +#ifdef MQTT_PROTOCOL_5 + client->event.error_handle->disconnect_return_code = 0; +#endif +#ifdef MQTT_SUPPORTED_FEATURE_TRANSPORT_ERR_REPORTING + client->event.error_handle->esp_tls_last_esp_err = esp_tls_get_and_clear_last_error(esp_transport_get_error_handle(client->transport), + &client->event.error_handle->esp_tls_stack_err, + &client->event.error_handle->esp_tls_cert_verify_flags); +#ifdef MQTT_SUPPORTED_FEATURE_TRANSPORT_SOCK_ERRNO_REPORTING + client->event.error_handle->esp_transport_sock_errno = esp_transport_get_errno(client->transport); +#endif +#endif + esp_mqtt_dispatch_event_with_msgid(client); +} + +int esp_mqtt_client_get_outbox_size(esp_mqtt_client_handle_t client) +{ + int outbox_size = 0; + + if (client == NULL) { + return 0; + } + + MQTT_API_LOCK(client); + + if (client->outbox) { + outbox_size = outbox_get_size(client->outbox); + } + + MQTT_API_UNLOCK(client); + + return outbox_size; +} + +esp_transport_handle_t esp_mqtt_client_get_transport(esp_mqtt_client_handle_t client, char *transport_scheme){ + if (client == NULL || (transport_scheme == NULL && client->config->transport == NULL)) { + return NULL; + } + if (transport_scheme == NULL && client->config->transport != NULL) { + return client->config->transport; + } + return esp_transport_list_get_transport(client->transport_list, transport_scheme); +} diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/pytest.ini b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/pytest.ini new file mode 100644 index 000000000..3bbea5355 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/pytest.ini @@ -0,0 +1,28 @@ +[pytest] +python_files = pytest_*.py +addopts = + --embedded-services esp,idf + --ignore-no-tests-collected-error + --ignore-glob */managed_components/* + --ignore=examples/ssl + --ignore=examples/wss + --junitxml=junit.xml + --ignore-result-files .gitlab/ignored_cases.txt + --root-logdir=test_logs + +filterwarnings = + ignore::FutureWarning + +junit_family = xunit1 + +env_markers = + eth_ip101: Ethernet IP101 PHY required for test + eth_ip101_stress: Ethernet IP101 PHY required for stress test + generic: applicable to generic ESP devices + +# log related +log_cli = True +log_cli_level = INFO +log_cli_format = %(asctime)s %(levelname)s %(message)s +log_cli_date_format = %Y-%m-%d %H:%M:%S + diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/static-analysis-rules.yml b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/static-analysis-rules.yml new file mode 100644 index 000000000..bd36de885 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/static-analysis-rules.yml @@ -0,0 +1,9 @@ +limits: + "clang-analyzer-core.NullDereference" : 0 + "clang-analyzer-unix.Malloc" : 0 + +ignore: + - "llvm-header-guard" + - "llvm-include-order" + +skip: diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/common/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/common/CMakeLists.txt new file mode 100644 index 000000000..97ab3b53b --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/common/CMakeLists.txt @@ -0,0 +1,4 @@ + +idf_component_register(SRCS test_mqtt_connection.c + INCLUDE_DIRS ${CMAKE_CURRENT_LIST_DIR}/include + PRIV_REQUIRES unity esp_event esp_netif esp_eth) diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/common/include/test_mqtt_connection.h b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/common/include/test_mqtt_connection.h new file mode 100644 index 000000000..460beccfe --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/common/include/test_mqtt_connection.h @@ -0,0 +1,18 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once +#include "soc/soc_caps.h" + +/** + * Connection test fixture setup, so we expect the broker is available + * on network + */ +void connect_test_fixture_setup(void); + +/** + * Cleans up the connection + */ +void connect_test_fixture_teardown(void); diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/common/test_mqtt_connection.c b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/common/test_mqtt_connection.c new file mode 100644 index 000000000..a6cb70210 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/common/test_mqtt_connection.c @@ -0,0 +1,144 @@ +/* + * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "freertos/FreeRTOS.h" +#include "freertos/event_groups.h" +#include "unity.h" +#include "esp_event.h" +#include "esp_netif.h" +#include "esp_eth.h" +#include "esp_log.h" + + +#if SOC_EMAC_SUPPORTED +#define ETH_START_BIT BIT(0) +#define ETH_STOP_BIT BIT(1) +#define ETH_CONNECT_BIT BIT(2) +#define ETH_GOT_IP_BIT BIT(3) +#define ETH_STOP_TIMEOUT_MS (10000) +#define ETH_GET_IP_TIMEOUT_MS (60000) + + +static const char *TAG = "esp32_eth_test_fixture"; +static EventGroupHandle_t s_eth_event_group = NULL; +static esp_netif_t *s_eth_netif = NULL; +static esp_eth_mac_t *s_mac = NULL; +static esp_eth_phy_t *s_phy = NULL; +static esp_eth_handle_t s_eth_handle = NULL; +static esp_eth_netif_glue_handle_t s_eth_glue = NULL; + + +/** Event handler for Ethernet events */ +static void eth_event_handler(void *arg, esp_event_base_t event_base, + int32_t event_id, void *event_data) +{ + EventGroupHandle_t eth_event_group = (EventGroupHandle_t)arg; + switch (event_id) { + case ETHERNET_EVENT_CONNECTED: + xEventGroupSetBits(eth_event_group, ETH_CONNECT_BIT); + ESP_LOGI(TAG, "Ethernet Link Up"); + break; + case ETHERNET_EVENT_DISCONNECTED: + ESP_LOGI(TAG, "Ethernet Link Down"); + break; + case ETHERNET_EVENT_START: + xEventGroupSetBits(eth_event_group, ETH_START_BIT); + ESP_LOGI(TAG, "Ethernet Started"); + break; + case ETHERNET_EVENT_STOP: + xEventGroupSetBits(eth_event_group, ETH_STOP_BIT); + ESP_LOGI(TAG, "Ethernet Stopped"); + break; + default: + break; + } +} + +/** Event handler for IP_EVENT_ETH_GOT_IP */ +static void got_ip_event_handler(void *arg, esp_event_base_t event_base, + int32_t event_id, void *event_data) +{ + EventGroupHandle_t eth_event_group = (EventGroupHandle_t)arg; + ip_event_got_ip_t *event = (ip_event_got_ip_t *)event_data; + const esp_netif_ip_info_t *ip_info = &event->ip_info; + ESP_LOGI(TAG, "Ethernet Got IP Address"); + ESP_LOGI(TAG, "~~~~~~~~~~~"); + ESP_LOGI(TAG, "ETHIP:" IPSTR, IP2STR(&ip_info->ip)); + ESP_LOGI(TAG, "ETHMASK:" IPSTR, IP2STR(&ip_info->netmask)); + ESP_LOGI(TAG, "ETHGW:" IPSTR, IP2STR(&ip_info->gw)); + ESP_LOGI(TAG, "~~~~~~~~~~~"); + xEventGroupSetBits(eth_event_group, ETH_GOT_IP_BIT); +} + +static esp_err_t test_uninstall_driver(esp_eth_handle_t eth_hdl, uint32_t ms_to_wait) +{ + int i = 0; + ms_to_wait += 100; + for (i = 0; i < ms_to_wait / 100; i++) { + vTaskDelay(pdMS_TO_TICKS(100)); + if (esp_eth_driver_uninstall(eth_hdl) == ESP_OK) { + break; + } + } + if (i < ms_to_wait / 10) { + return ESP_OK; + } else { + return ESP_FAIL; + } +} + + +void connect_test_fixture_setup(void) +{ + EventBits_t bits; + s_eth_event_group = xEventGroupCreate(); + TEST_ASSERT(s_eth_event_group != NULL); + TEST_ESP_OK(esp_event_loop_create_default()); + // create TCP/IP netif + esp_netif_config_t netif_cfg = ESP_NETIF_DEFAULT_ETH(); + s_eth_netif = esp_netif_new(&netif_cfg); + + eth_mac_config_t mac_config = ETH_MAC_DEFAULT_CONFIG(); + eth_esp32_emac_config_t esp32_emac_config = ETH_ESP32_EMAC_DEFAULT_CONFIG(); + s_mac = esp_eth_mac_new_esp32(&esp32_emac_config, &mac_config); + eth_phy_config_t phy_config = ETH_PHY_DEFAULT_CONFIG(); + s_phy = esp_eth_phy_new_ip101(&phy_config); + esp_eth_config_t eth_config = ETH_DEFAULT_CONFIG(s_mac, s_phy); + + // install Ethernet driver + TEST_ESP_OK(esp_eth_driver_install(ð_config, &s_eth_handle)); + // combine driver with netif + s_eth_glue = esp_eth_new_netif_glue(s_eth_handle); + TEST_ESP_OK(esp_netif_attach(s_eth_netif, s_eth_glue)); + // register user defined event handlers + TEST_ESP_OK(esp_event_handler_register(ETH_EVENT, ESP_EVENT_ANY_ID, ð_event_handler, s_eth_event_group)); + TEST_ESP_OK(esp_event_handler_register(IP_EVENT, IP_EVENT_ETH_GOT_IP, &got_ip_event_handler, s_eth_event_group)); + // start Ethernet driver + TEST_ESP_OK(esp_eth_start(s_eth_handle)); + /* wait for IP lease */ + bits = xEventGroupWaitBits(s_eth_event_group, ETH_GOT_IP_BIT, true, true, pdMS_TO_TICKS(ETH_GET_IP_TIMEOUT_MS)); + TEST_ASSERT((bits & ETH_GOT_IP_BIT) == ETH_GOT_IP_BIT); +} + +void connect_test_fixture_teardown(void) +{ + EventBits_t bits; + // stop Ethernet driver + TEST_ESP_OK(esp_eth_stop(s_eth_handle)); + /* wait for connection stop */ + bits = xEventGroupWaitBits(s_eth_event_group, ETH_STOP_BIT, true, true, pdMS_TO_TICKS(ETH_STOP_TIMEOUT_MS)); + TEST_ASSERT((bits & ETH_STOP_BIT) == ETH_STOP_BIT); + TEST_ESP_OK(esp_eth_del_netif_glue(s_eth_glue)); + /* driver should be uninstalled within 2 seconds */ + TEST_ESP_OK(test_uninstall_driver(s_eth_handle, 2000)); + TEST_ESP_OK(s_phy->del(s_phy)); + TEST_ESP_OK(s_mac->del(s_mac)); + TEST_ESP_OK(esp_event_handler_unregister(IP_EVENT, IP_EVENT_ETH_GOT_IP, got_ip_event_handler)); + TEST_ESP_OK(esp_event_handler_unregister(ETH_EVENT, ESP_EVENT_ANY_ID, eth_event_handler)); + esp_netif_destroy(s_eth_netif); + TEST_ESP_OK(esp_event_loop_delete_default()); + vEventGroupDelete(s_eth_event_group); +} +#endif // SOC_EMAC_SUPPORTED diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/CMakeLists.txt new file mode 100644 index 000000000..8a681178a --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/CMakeLists.txt @@ -0,0 +1,16 @@ +#This is the project CMakeLists.txt file for the test subproject +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) + +set(EXTRA_COMPONENT_DIRS "../common") + +if("${IDF_VERSION_MAJOR}.${IDF_VERSION_MINOR}" VERSION_GREATER "5.5") + list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/tools/test_apps/components") +else() + list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/tools/unit-test-app/components") +endif() + + +idf_build_set_property(MINIMAL_BUILD ON) +project(esp_mqtt_client_test) diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/README.md b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/README.md new file mode 100644 index 000000000..1fb88efd1 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/README.md @@ -0,0 +1,2 @@ +| Supported Targets | ESP32 | ESP32-C3 | +| ----------------- | ----- | -------- | diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/main/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/main/CMakeLists.txt new file mode 100644 index 000000000..0647fe29f --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/main/CMakeLists.txt @@ -0,0 +1,8 @@ +set(srcs test_mqtt_client_broker.c test_mqtt.c) + +if(CONFIG_MQTT_PROTOCOL_5) + list(APPEND srcs test_mqtt5_client_broker.c test_mqtt5.c) +endif() + +idf_component_register(SRCS "${srcs}" + PRIV_REQUIRES cmock test_utils mqtt nvs_flash app_update spi_flash common) diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/main/Kconfig.projbuild b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/main/Kconfig.projbuild new file mode 100644 index 000000000..30b2c1087 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/main/Kconfig.projbuild @@ -0,0 +1,14 @@ +menu "ESP-MQTT Unit Test Config" + + config MQTT_TEST_BROKER_URI + string "URI of the test broker" + default "mqtt://mqtt.eclipseprojects.io" + help + URL of an mqtt broker which this test connects to. + + config MQTT5_TEST_BROKER_URI + string "URI of the test broker" + default "mqtt://mqtt.eclipseprojects.io" + help + URL of an mqtt broker which this test connects to. +endmenu diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/main/idf_component.yml b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/main/idf_component.yml new file mode 100644 index 000000000..30ca4eed7 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/main/idf_component.yml @@ -0,0 +1,5 @@ +dependencies: + espressif/mqtt: + version: "*" + override_path: "../../../.." + diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/main/test_mqtt.c b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/main/test_mqtt.c new file mode 100644 index 000000000..cb56a5e06 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/main/test_mqtt.c @@ -0,0 +1,122 @@ +/* + * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Unlicense OR CC0-1.0 + * + * This test code is in the Public Domain (or CC0 licensed, at your option.) + * + * Unless required by applicable law or agreed to in writing, this + * software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, either express or implied. + */ + +#include +#include "unity_fixture.h" +#include "unity_fixture_extras.h" +#include "test_utils.h" +#include "memory_checks.h" +#include "mqtt_client.h" +#include "esp_ota_ops.h" +#include "test_mqtt_client_broker.h" +#include "test_mqtt_connection.h" +#include "esp_partition.h" + +TEST_GROUP(mqtt); + +TEST_SETUP(mqtt){ + test_utils_record_free_mem(); + TEST_ESP_OK(test_utils_set_leak_level(0, ESP_LEAK_TYPE_CRITICAL, ESP_COMP_LEAK_GENERAL)); +} + +TEST_TEAR_DOWN(mqtt){ + test_utils_finish_and_evaluate_leaks(test_utils_get_leak_level(ESP_LEAK_TYPE_WARNING, ESP_COMP_LEAK_ALL), + test_utils_get_leak_level(ESP_LEAK_TYPE_CRITICAL, ESP_COMP_LEAK_ALL)); +} + +TEST(mqtt, init_with_invalid_url) +{ + const esp_mqtt_client_config_t mqtt_cfg = { + .broker.address.uri = "INVALID", + }; + esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg); + TEST_ASSERT_EQUAL(NULL, client ); +} + +TEST(mqtt, init_and_deinit) +{ + const esp_mqtt_client_config_t mqtt_cfg = { + // no connection takes place, but the uri has to be valid for init() to succeed + .broker.address.uri = "mqtts://localhost:8883", + }; + esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg); + TEST_ASSERT_NOT_EQUAL(NULL, client ); + esp_mqtt_client_destroy(client); +} + +static const char* this_bin_addr(void) +{ + esp_partition_mmap_handle_t out_handle; + const void *binary_address; + const esp_partition_t* partition = esp_ota_get_running_partition(); + esp_partition_mmap(partition, 0, partition->size, ESP_PARTITION_MMAP_DATA, &binary_address, &out_handle); + return binary_address; +} + +TEST(mqtt, enqueue_and_destroy_outbox) +{ + const char * bin_addr = this_bin_addr(); + + // Reseting leak detection since this_bin_addr adds to allocated memory. + test_utils_record_free_mem(); + TEST_ESP_OK(test_utils_set_leak_level(0, ESP_LEAK_TYPE_CRITICAL, ESP_COMP_LEAK_GENERAL)); + const int messages = 20; + const int size = 2000; + const esp_mqtt_client_config_t mqtt_cfg = { + // no connection takes place, but the uri has to be valid for init() to succeed + .broker.address.uri = "mqtts://localhost:8883", + }; + esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg); + TEST_ASSERT_NOT_EQUAL(NULL, client ); + int bytes_before = esp_get_free_heap_size(); + for (int i=0; iqos; + xEventGroupSetBits(s_event_group, DATA_BIT); + } +} + +static void mqtt_data_handler_lwt(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) +{ + if (event_id == MQTT_EVENT_DATA) { + esp_mqtt_event_handle_t event = event_data; + ESP_LOGI("mqtt-lwt", "MQTT_EVENT_DATA"); + ESP_LOGI("mqtt-lwt", "TOPIC=%.*s", event->topic_len, event->topic); + ESP_LOGI("mqtt-lwt", "DATA=%.*s", event->data_len, event->data); + if (strncmp(event->data, "no-lwt", event->data_len) == 0) { + // no lwt, just to indicate the test has finished + xEventGroupSetBits(s_event_group, DATA_BIT); + } else { + // count up any potential lwt message + int * count = handler_args; + *count = *count + 1; + ESP_LOGE("mqtt-lwt", "count=%d", *count); + } + } +} + +static void mqtt_data_handler_subscribe(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) +{ + if (event_id == MQTT_EVENT_SUBSCRIBED) { + esp_mqtt_event_handle_t event = event_data; + ESP_LOGI("mqtt-subscribe", "MQTT_EVENT_SUBSCRIBED, data size=%d", event->data_len); + int * sub_payload = handler_args; + if (event->data_len == 1) { + ESP_LOGI("mqtt-subscribe", "DATA=%d", *(uint8_t*)event->data); + *sub_payload = *(uint8_t*)event->data; + } + xEventGroupSetBits(s_event_group, DATA_BIT); + } +} + + +static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) +{ + switch ((esp_mqtt_event_id_t)event_id) { + case MQTT_EVENT_CONNECTED: + xEventGroupSetBits(s_event_group, CONNECT_BIT); + break; + + case MQTT_EVENT_DISCONNECTED: + xEventGroupSetBits(s_event_group, DISCONNECT_BIT); + break; + default: + break; + } +} + +bool mqtt_connect_disconnect(void) +{ + const esp_mqtt_client_config_t mqtt_cfg = { + .broker.address.uri = CONFIG_MQTT_TEST_BROKER_URI, + .network.disable_auto_reconnect = true, + }; + s_event_group = xEventGroupCreate(); + esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg); + TEST_ASSERT_TRUE(NULL != client ); + esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL); + TEST_ASSERT_TRUE(ESP_OK == esp_mqtt_client_start(client)); + WAIT_FOR_EVENT(CONNECT_BIT); + esp_mqtt_client_disconnect(client); + WAIT_FOR_EVENT(DISCONNECT_BIT); + esp_mqtt_client_reconnect(client); + WAIT_FOR_EVENT(CONNECT_BIT); + esp_mqtt_client_destroy(client); + vEventGroupDelete(s_event_group); + return true; +} + +bool mqtt_subscribe_publish(void) +{ + const esp_mqtt_client_config_t mqtt_cfg = { + .broker.address.uri = CONFIG_MQTT_TEST_BROKER_URI, + }; + char* topic = append_mac("topic"); + TEST_ASSERT_TRUE(NULL != topic); + s_event_group = xEventGroupCreate(); + esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg); + TEST_ASSERT_TRUE(NULL != client ); + esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL); + TEST_ASSERT_TRUE(ESP_OK == esp_mqtt_client_start(client)); + WAIT_FOR_EVENT(CONNECT_BIT); + int qos = -1; + esp_mqtt_client_register_event(client, MQTT_EVENT_DATA, mqtt_data_handler_qos, &qos); + TEST_ASSERT_TRUE(esp_mqtt_client_subscribe(client, topic, 2) != -1); + TEST_ASSERT_TRUE(esp_mqtt_client_publish(client, topic, "message", 0, 2, 0) != -1); + WAIT_FOR_EVENT(DATA_BIT); + TEST_ASSERT_TRUE(qos == 2); + TEST_ASSERT_TRUE(esp_mqtt_client_publish(client, topic, "message", 0, 1, 0) != -1); + WAIT_FOR_EVENT(DATA_BIT); + TEST_ASSERT_TRUE(qos == 1); + esp_mqtt_client_destroy(client); + vEventGroupDelete(s_event_group); + free(topic); + return true; +} + +bool mqtt_lwt_clean_disconnect(void) +{ + char* lwt = append_mac("lwt"); + TEST_ASSERT_TRUE(lwt); + const esp_mqtt_client_config_t mqtt_cfg1 = { + .broker.address.uri = CONFIG_MQTT_TEST_BROKER_URI, + .credentials.set_null_client_id = true, + .session.last_will.topic = lwt, + .session.last_will.msg = "lwt_msg" + }; + const esp_mqtt_client_config_t mqtt_cfg2 = { + .broker.address.uri = CONFIG_MQTT_TEST_BROKER_URI, + .credentials.set_null_client_id = true, + .session.last_will.topic = lwt, + .session.last_will.msg = "lwt_msg" + }; + s_event_group = xEventGroupCreate(); + + esp_mqtt_client_handle_t client1 = esp_mqtt_client_init(&mqtt_cfg1); + esp_mqtt_client_handle_t client2 = esp_mqtt_client_init(&mqtt_cfg2); + TEST_ASSERT_TRUE(NULL != client1 && NULL != client2 ); + esp_mqtt_client_register_event(client1, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL); + esp_mqtt_client_register_event(client2, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL); + TEST_ASSERT_TRUE(esp_mqtt_client_start(client1) == ESP_OK); + WAIT_FOR_EVENT(CONNECT_BIT); + TEST_ASSERT_TRUE(esp_mqtt_client_start(client2) == ESP_OK); + WAIT_FOR_EVENT(CONNECT_BIT); + int counter = 0; + esp_mqtt_client_register_event(client1, MQTT_EVENT_DATA, mqtt_data_handler_lwt, &counter); + esp_mqtt_client_register_event(client2, MQTT_EVENT_DATA, mqtt_data_handler_lwt, &counter); + TEST_ASSERT_TRUE(esp_mqtt_client_subscribe(client1, lwt, 0) != -1); + TEST_ASSERT_TRUE(esp_mqtt_client_subscribe(client2, lwt, 0) != -1); + esp_mqtt_client_disconnect(client1); + WAIT_FOR_EVENT(DISCONNECT_BIT); + esp_mqtt_client_reconnect(client1); + WAIT_FOR_EVENT(CONNECT_BIT); + TEST_ASSERT_TRUE(esp_mqtt_client_subscribe(client1, lwt, 0) != -1); + esp_mqtt_client_stop(client2); + esp_mqtt_client_start(client2); + WAIT_FOR_EVENT(CONNECT_BIT); + TEST_ASSERT_TRUE(esp_mqtt_client_subscribe(client2, lwt, 0) != -1); + TEST_ASSERT_TRUE(esp_mqtt_client_publish(client1, lwt, "no-lwt", 0, 0, 0) != -1); + WAIT_FOR_EVENT(DATA_BIT); + TEST_ASSERT_TRUE(counter == 0); + esp_mqtt_client_destroy(client1); + esp_mqtt_client_destroy(client2); + vEventGroupDelete(s_event_group); + free(lwt); + return true; +} + +bool mqtt_subscribe_payload(void) +{ + const esp_mqtt_client_config_t mqtt_cfg = { + .broker.address.uri = CONFIG_MQTT_TEST_BROKER_URI, + .network.disable_auto_reconnect = true, + }; + char* topic = append_mac("topic"); + TEST_ASSERT_TRUE(NULL != topic); + s_event_group = xEventGroupCreate(); + esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg); + TEST_ASSERT_TRUE(NULL != client ); + esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL); + TEST_ASSERT_TRUE(ESP_OK == esp_mqtt_client_start(client)); + WAIT_FOR_EVENT(CONNECT_BIT); + int qos_payload = -1; + esp_mqtt_client_register_event(client, MQTT_EVENT_SUBSCRIBED, mqtt_data_handler_subscribe, &qos_payload); + TEST_ASSERT_TRUE(esp_mqtt_client_subscribe(client, topic, 2) != -1); + WAIT_FOR_EVENT(DATA_BIT); + TEST_ASSERT_TRUE(qos_payload == 2); + TEST_ASSERT_TRUE(esp_mqtt_client_subscribe(client, topic, 0) != -1); + WAIT_FOR_EVENT(DATA_BIT); + TEST_ASSERT_TRUE(qos_payload == 0); + esp_mqtt_client_destroy(client); + vEventGroupDelete(s_event_group); + free(topic); + return true; +} diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/main/test_mqtt_client_broker.h b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/main/test_mqtt_client_broker.h new file mode 100644 index 000000000..63e7856f7 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/main/test_mqtt_client_broker.h @@ -0,0 +1,50 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once +#include "esp_log.h" + +/** + * @brief MQTT client-broker tests are not implemented as separate test cases + * due to time consuming connection setup/teardown. + * This utility macro is used to run functional cases as MQTT tests + * and evaluate as separate assertions in one "mqtt broker tests" test case. + */ +#define RUN_MQTT_BROKER_TEST(test_name) \ + do { \ + ESP_LOGI("mqtt_test", "Running test:" #test_name "()"); \ + TEST_ASSERT_TRUE_MESSAGE(test_name(), "Mqtt test failed: " #test_name "() "); \ + ESP_LOGI("mqtt_test", "Test:" #test_name "() passed "); \ + } while(0) + + +/** + * @brief This module contains mqtt test cases interacting the client with a (real) broker + */ + +/** + * @brief The client subscribes and publishes on the same topic + * and verifies the received published qos in the event + */ +bool mqtt_subscribe_publish(void); + +/** + * @brief The client connects, disconnects and reconnects. + * Tests basic client state transitions + */ +bool mqtt_connect_disconnect(void); + +/** + * @brief Two clients with defined lwt connect and subscribe to lwt topic. + * This test verifies that no lwt is send when each of the client disconnects. + * (we expect a clean disconnection, so no last-will being sent) + */ +bool mqtt_lwt_clean_disconnect(void); + +/** + * @brief The client subscribes to a topic with certain qos + * and verifies the qos in SUBACK message from the broker. + */ +bool mqtt_subscribe_payload(void); diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/pytest_mqtt_ut.py b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/pytest_mqtt_ut.py new file mode 100644 index 000000000..429b85747 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/pytest_mqtt_ut.py @@ -0,0 +1,11 @@ +# SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: Unlicense OR CC0-1.0 +import pytest +from pytest_embedded import Dut +from pytest_embedded_idf.utils import idf_parametrize + + +@pytest.mark.ethernet +@idf_parametrize('target', ['esp32'], indirect=['target']) +def test_mqtt_client(dut: Dut) -> None: + dut.expect_unity_test_output() diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/sdkconfig.ci.default b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/sdkconfig.ci.default new file mode 100644 index 000000000..1d40815a9 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/sdkconfig.ci.default @@ -0,0 +1,4 @@ +CONFIG_MQTT_TEST_BROKER_URI="mqtt://${EXAMPLE_MQTT_BROKER_TCP}" +CONFIG_MQTT5_TEST_BROKER_URI="mqtt://${EXAMPLE_MQTT_BROKER_TCP}" +CONFIG_ESP_TASK_WDT_EN=n +CONFIG_UNITY_ENABLE_FIXTURE=y diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/sdkconfig.defaults b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/sdkconfig.defaults new file mode 100644 index 000000000..2bcae3f3b --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt/sdkconfig.defaults @@ -0,0 +1,3 @@ +# General options for additional checks +CONFIG_ESP_TASK_WDT_EN=n +CONFIG_UNITY_ENABLE_FIXTURE=y diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/CMakeLists.txt new file mode 100644 index 000000000..6b8e1e8dd --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/CMakeLists.txt @@ -0,0 +1,16 @@ +#This is the project CMakeLists.txt file for the test subproject +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) + +set(EXTRA_COMPONENT_DIRS "../common") + +if("${IDF_VERSION_MAJOR}.${IDF_VERSION_MINOR}" VERSION_GREATER "5.5") + list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/tools/test_apps/components") +else() + list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/tools/unit-test-app/components") +endif() + + +idf_build_set_property(MINIMAL_BUILD ON) +project(esp_mqtt5_client_test) diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/README.md b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/README.md new file mode 100644 index 000000000..1fb88efd1 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/README.md @@ -0,0 +1,2 @@ +| Supported Targets | ESP32 | ESP32-C3 | +| ----------------- | ----- | -------- | diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/main/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/main/CMakeLists.txt new file mode 100644 index 000000000..d33a86ceb --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/main/CMakeLists.txt @@ -0,0 +1,4 @@ +set(srcs test_mqtt5_client_broker.c test_mqtt5.c) + +idf_component_register(SRCS "${srcs}" + PRIV_REQUIRES cmock test_utils mqtt nvs_flash app_update spi_flash common) diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/main/Kconfig.projbuild b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/main/Kconfig.projbuild new file mode 100644 index 000000000..30b2c1087 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/main/Kconfig.projbuild @@ -0,0 +1,14 @@ +menu "ESP-MQTT Unit Test Config" + + config MQTT_TEST_BROKER_URI + string "URI of the test broker" + default "mqtt://mqtt.eclipseprojects.io" + help + URL of an mqtt broker which this test connects to. + + config MQTT5_TEST_BROKER_URI + string "URI of the test broker" + default "mqtt://mqtt.eclipseprojects.io" + help + URL of an mqtt broker which this test connects to. +endmenu diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/main/idf_component.yml b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/main/idf_component.yml new file mode 100644 index 000000000..1b39baac9 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/main/idf_component.yml @@ -0,0 +1,4 @@ +dependencies: + espressif/mqtt: + version: "*" + override_path: "../../../.." \ No newline at end of file diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/main/test_mqtt5.c b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/main/test_mqtt5.c new file mode 100644 index 000000000..9d8705d83 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/main/test_mqtt5.c @@ -0,0 +1,172 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include "unity_fixture.h" +#include "unity_fixture_extras.h" +#include "test_utils.h" +#include "memory_checks.h" +#include "mqtt_client.h" +#include "esp_ota_ops.h" +#include "test_mqtt5_client_broker.h" +#include "test_mqtt_connection.h" +#include "esp_partition.h" + + +TEST_GROUP(mqtt5); + +TEST_SETUP(mqtt5) +{ + test_utils_record_free_mem(); + TEST_ESP_OK(test_utils_set_leak_level(0, ESP_LEAK_TYPE_CRITICAL, ESP_COMP_LEAK_GENERAL)); +} + +TEST_TEAR_DOWN(mqtt5) +{ + test_utils_finish_and_evaluate_leaks(test_utils_get_leak_level(ESP_LEAK_TYPE_WARNING, ESP_COMP_LEAK_ALL), + test_utils_get_leak_level(ESP_LEAK_TYPE_CRITICAL, ESP_COMP_LEAK_ALL)); +} + +static esp_mqtt5_user_property_item_t user_property_arr[3] = { + {"board", "esp32"}, + {"u", "user"}, + {"p", "password"} +}; + +TEST(mqtt5, init_with_invalid_url) +{ + const esp_mqtt_client_config_t mqtt5_cfg = { + .broker.address.uri = "INVALID", + .session.protocol_ver = MQTT_PROTOCOL_V_5, + }; + esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt5_cfg); + TEST_ASSERT_EQUAL(NULL, client ); +} + +TEST(mqtt5, init_and_deinit) +{ + const esp_mqtt_client_config_t mqtt5_cfg = { + // no connection takes place, but the uri has to be valid for init() to succeed + .broker.address.uri = "mqtts://localhost:8883", + .session.protocol_ver = MQTT_PROTOCOL_V_5, + .credentials.username = "123", + .credentials.authentication.password = "456", + .session.last_will.topic = "/topic/will", + .session.last_will.msg = "i will leave", + .session.last_will.msg_len = 12, + .session.last_will.qos = 1, + .session.last_will.retain = true, + }; + esp_mqtt5_connection_property_config_t connect_property = { + .session_expiry_interval = 10, + .maximum_packet_size = 1024, + .receive_maximum = 65535, + .topic_alias_maximum = 2, + .request_resp_info = true, + .request_problem_info = true, + .will_delay_interval = 10, + .payload_format_indicator = true, + .message_expiry_interval = 10, + .content_type = "json", + .response_topic = "/test/response", + .correlation_data = "123456", + .correlation_data_len = 6, + }; + + esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt5_cfg); + esp_mqtt5_client_set_user_property(&connect_property.user_property, user_property_arr, 3); + esp_mqtt5_client_set_user_property(&connect_property.will_user_property, user_property_arr, 3); + esp_mqtt5_client_set_connect_property(client, &connect_property); + esp_mqtt5_client_delete_user_property(connect_property.user_property); + esp_mqtt5_client_delete_user_property(connect_property.will_user_property); + TEST_ASSERT_NOT_EQUAL(NULL, client ); + esp_mqtt_client_destroy(client); +} + +static const char *this_bin_addr(void) +{ + esp_partition_mmap_handle_t out_handle; + const void *binary_address; + const esp_partition_t *partition = esp_ota_get_running_partition(); + esp_partition_mmap(partition, 0, partition->size, ESP_PARTITION_MMAP_DATA, &binary_address, &out_handle); + return binary_address; +} + +TEST(mqtt5, enqueue_and_destroy_outbox) +{ + const char *bin_addr = this_bin_addr(); + // Reseting leak detection since this_bin_addr adds to allocated memory. + test_utils_record_free_mem(); + TEST_ESP_OK(test_utils_set_leak_level(0, ESP_LEAK_TYPE_CRITICAL, ESP_COMP_LEAK_GENERAL)); + const int messages = 20; + const int size = 2000; + const esp_mqtt_client_config_t mqtt5_cfg = { + // no connection takes place, but the uri has to be valid for init() to succeed + .broker.address.uri = "mqtts://localhost:8883", + .session.protocol_ver = MQTT_PROTOCOL_V_5, + }; + esp_mqtt5_publish_property_config_t publish_property = { + .payload_format_indicator = 1, + .message_expiry_interval = 1000, + .topic_alias = 0, + .response_topic = "/topic/test/response", + .correlation_data = "123456", + .correlation_data_len = 6, + .content_type = "json", + }; + esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt5_cfg); + TEST_ASSERT_NOT_EQUAL(NULL, client ); + int bytes_before = esp_get_free_heap_size(); + for (int i = 0; i < messages; i ++) { + esp_mqtt5_client_set_user_property(&publish_property.user_property, user_property_arr, 3); + esp_mqtt5_client_set_publish_property(client, &publish_property); + esp_mqtt_client_publish(client, "test", bin_addr, size, 1, 0); + esp_mqtt5_client_delete_user_property(publish_property.user_property); + publish_property.user_property = NULL; + } + int bytes_after = esp_get_free_heap_size(); + // check that outbox allocated all messages on heap + TEST_ASSERT_GREATER_OR_EQUAL(messages * size, bytes_before - bytes_after); + + esp_mqtt_client_destroy(client); +} + +#if SOC_EMAC_SUPPORTED +/** + * This test cases uses ethernet kit, so build and use it only if EMAC supported + */ +TEST(mqtt5, broker_tests) +{ + test_case_uses_tcpip(); + connect_test_fixture_setup(); + + RUN_MQTT5_BROKER_TEST(mqtt5_connect_disconnect); + RUN_MQTT5_BROKER_TEST(mqtt5_subscribe_publish); + RUN_MQTT5_BROKER_TEST(mqtt5_lwt_clean_disconnect); + RUN_MQTT5_BROKER_TEST(mqtt5_subscribe_payload); + + connect_test_fixture_teardown(); +} +#endif // SOC_EMAC_SUPPORTED + +TEST_GROUP_RUNNER(mqtt5) +{ +#if !DISABLED_FOR_TARGETS(ESP32H2) + RUN_TEST_CASE(mqtt5, init_with_invalid_url); + RUN_TEST_CASE(mqtt5, init_and_deinit); + RUN_TEST_CASE(mqtt5, enqueue_and_destroy_outbox); + +#if SOC_EMAC_SUPPORTED + RUN_TEST_CASE(mqtt5, broker_tests); +#endif // SOC_EMAC_SUPPORTED +#endif //!DISABLED_FOR_TARGETS(ESP32H2) +} + + +void app_main(void) +{ + UNITY_MAIN(mqtt5); +} diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/main/test_mqtt5_client_broker.c b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/main/test_mqtt5_client_broker.c new file mode 100644 index 000000000..0ac4c3dd0 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/main/test_mqtt5_client_broker.c @@ -0,0 +1,285 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "freertos/FreeRTOS.h" +#include "freertos/event_groups.h" +#include "mqtt_client.h" +#include "esp_log.h" +#include "esp_mac.h" + +#define WAIT_FOR_EVENT(event) \ + TEST_ASSERT_TRUE(xEventGroupWaitBits(s_event_group, event, pdTRUE, pdTRUE, pdMS_TO_TICKS(COMMON_OPERATION_TIMEOUT)) & event); + +#define TEST_ASSERT_TRUE(condition) TEST_ASSERT_TRUE_LINE(condition, __LINE__) +#define TEST_ASSERT_TRUE_LINE(condition, line) \ + do { \ + if (!(condition)) { \ + ESP_LOGE("test_mqtt5_client_broker.c", \ + "Assertion failed in line %d", line); \ + return false; \ + } \ + } while(0) + + +static const int COMMON_OPERATION_TIMEOUT = 10000; +static const int CONNECT_BIT = BIT0; +static const int DISCONNECT_BIT = BIT1; +static const int DATA_BIT = BIT2; + +static EventGroupHandle_t s_event_group; + +static esp_mqtt5_user_property_item_t user_property_arr[3] = { + {"board", "esp32"}, + {"u", "user"}, + {"p", "password"} +}; + +static char* append_mac(const char* string) +{ + uint8_t mac[6]; + char *id_string = NULL; + esp_read_mac(mac, ESP_MAC_WIFI_STA); + asprintf(&id_string, "%s_%02x%02X%02X", string, mac[3], mac[4], mac[5]); + return id_string; +} + +static void mqtt5_data_handler_qos(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) +{ + if (event_id == MQTT_EVENT_DATA) { + esp_mqtt_event_handle_t event = event_data; + int * qos = handler_args; + *qos = event->qos; + xEventGroupSetBits(s_event_group, DATA_BIT); + } +} + +static void mqtt5_data_handler_lwt(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) +{ + if (event_id == MQTT_EVENT_DATA) { + esp_mqtt_event_handle_t event = event_data; + ESP_LOGI("mqtt-lwt", "MQTT_EVENT_DATA"); + ESP_LOGI("mqtt-lwt", "TOPIC=%.*s", event->topic_len, event->topic); + ESP_LOGI("mqtt-lwt", "DATA=%.*s", event->data_len, event->data); + if (strncmp(event->data, "no-lwt", event->data_len) == 0) { + // no lwt, just to indicate the test has finished + xEventGroupSetBits(s_event_group, DATA_BIT); + } else { + // count up any potential lwt message + int * count = handler_args; + *count = *count + 1; + ESP_LOGE("mqtt5-lwt", "count=%d", *count); + } + } +} + +static void mqtt5_data_handler_subscribe(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) +{ + if (event_id == MQTT_EVENT_SUBSCRIBED) { + esp_mqtt_event_handle_t event = event_data; + ESP_LOGI("mqtt5-subscribe", "MQTT_EVENT_SUBSCRIBED, data size=%d", event->data_len); + int * sub_payload = handler_args; + if (event->data_len == 1) { + ESP_LOGI("mqtt5-subscribe", "DATA=%d", *(uint8_t*)event->data); + *sub_payload = *(uint8_t*)event->data; + } + xEventGroupSetBits(s_event_group, DATA_BIT); + } +} + + +static void mqtt5_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) +{ + switch ((esp_mqtt_event_id_t)event_id) { + case MQTT_EVENT_CONNECTED: + xEventGroupSetBits(s_event_group, CONNECT_BIT); + break; + + case MQTT_EVENT_DISCONNECTED: + xEventGroupSetBits(s_event_group, DISCONNECT_BIT); + break; + default: + break; + } +} + +bool mqtt5_connect_disconnect(void) +{ + const esp_mqtt_client_config_t mqtt5_cfg = { + .broker.address.uri = CONFIG_MQTT5_TEST_BROKER_URI, + .network.disable_auto_reconnect = true, + .session.protocol_ver = MQTT_PROTOCOL_V_5, + }; + esp_mqtt5_connection_property_config_t connect_property = { + .session_expiry_interval = 10, + .maximum_packet_size = 1024, + .receive_maximum = 65535, + .topic_alias_maximum = 2, + .request_resp_info = true, + .request_problem_info = true, + }; + esp_mqtt5_disconnect_property_config_t disconnect_property = { + .session_expiry_interval = 10, + .disconnect_reason = 0, + }; + s_event_group = xEventGroupCreate(); + esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt5_cfg); + TEST_ASSERT_TRUE(NULL != client ); + esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt5_event_handler, NULL); + TEST_ASSERT_TRUE(ESP_OK == esp_mqtt5_client_set_user_property(&connect_property.user_property, user_property_arr, 3)); + TEST_ASSERT_TRUE(ESP_OK == esp_mqtt5_client_set_connect_property(client, &connect_property)); + esp_mqtt5_client_delete_user_property(connect_property.user_property); + TEST_ASSERT_TRUE(ESP_OK == esp_mqtt_client_start(client)); + WAIT_FOR_EVENT(CONNECT_BIT); + TEST_ASSERT_TRUE(ESP_OK == esp_mqtt5_client_set_user_property(&disconnect_property.user_property, user_property_arr, 3)); + TEST_ASSERT_TRUE(ESP_OK == esp_mqtt5_client_set_disconnect_property(client, &disconnect_property)); + esp_mqtt5_client_delete_user_property(disconnect_property.user_property); + esp_mqtt_client_disconnect(client); + WAIT_FOR_EVENT(DISCONNECT_BIT); + esp_mqtt_client_reconnect(client); + WAIT_FOR_EVENT(CONNECT_BIT); + esp_mqtt_client_destroy(client); + vEventGroupDelete(s_event_group); + return true; +} + +bool mqtt5_subscribe_publish(void) +{ + const esp_mqtt_client_config_t mqtt5_cfg = { + .broker.address.uri = CONFIG_MQTT5_TEST_BROKER_URI, + .session.protocol_ver = MQTT_PROTOCOL_V_5, + }; + esp_mqtt5_publish_property_config_t publish_property = { + .payload_format_indicator = 1, + .message_expiry_interval = 1000, + .topic_alias = 1, + .response_topic = "/topic/test/response", + .correlation_data = "123456", + .correlation_data_len = 6, + .content_type = "json", + }; + esp_mqtt5_subscribe_property_config_t subscribe_property = { + .subscribe_id = 25555, + .no_local_flag = false, + .retain_as_published_flag = true, + .retain_handle = 0, + }; + char* topic = append_mac("topic"); + TEST_ASSERT_TRUE(NULL != topic); + s_event_group = xEventGroupCreate(); + esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt5_cfg); + TEST_ASSERT_TRUE(NULL != client ); + esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt5_event_handler, NULL); + TEST_ASSERT_TRUE(ESP_OK == esp_mqtt_client_start(client)); + WAIT_FOR_EVENT(CONNECT_BIT); + int qos = -1; + esp_mqtt_client_register_event(client, MQTT_EVENT_DATA, mqtt5_data_handler_qos, &qos); + TEST_ASSERT_TRUE(ESP_OK == esp_mqtt5_client_set_subscribe_property(client, &subscribe_property)); + TEST_ASSERT_TRUE(esp_mqtt_client_subscribe(client, topic, 2) != -1); + TEST_ASSERT_TRUE(ESP_OK == esp_mqtt5_client_set_publish_property(client, &publish_property)); + TEST_ASSERT_TRUE(esp_mqtt_client_publish(client, topic, "message", 0, 2, 0) != -1); + WAIT_FOR_EVENT(DATA_BIT); + TEST_ASSERT_TRUE(qos == 2); + TEST_ASSERT_TRUE(esp_mqtt_client_publish(client, topic, "message", 0, 1, 0) != -1); + WAIT_FOR_EVENT(DATA_BIT); + TEST_ASSERT_TRUE(qos == 1); + esp_mqtt_client_destroy(client); + vEventGroupDelete(s_event_group); + free(topic); + return true; +} + +bool mqtt5_lwt_clean_disconnect(void) +{ + char* lwt = append_mac("lwt"); + TEST_ASSERT_TRUE(lwt); + const esp_mqtt_client_config_t mqtt5_cfg1 = { + .broker.address.uri = CONFIG_MQTT5_TEST_BROKER_URI, + .credentials.set_null_client_id = true, + .session.last_will.topic = lwt, + .session.last_will.msg = "lwt_msg", + .session.protocol_ver = MQTT_PROTOCOL_V_5, + }; + const esp_mqtt_client_config_t mqtt5_cfg2 = { + .broker.address.uri = CONFIG_MQTT5_TEST_BROKER_URI, + .credentials.set_null_client_id = true, + .session.last_will.topic = lwt, + .session.last_will.msg = "lwt_msg", + .session.protocol_ver = MQTT_PROTOCOL_V_5, + }; + esp_mqtt5_connection_property_config_t connect_property = { + .will_delay_interval = 10, + .payload_format_indicator = true, + .message_expiry_interval = 10, + .content_type = "json", + .response_topic = "/test/response", + .correlation_data = "123456", + .correlation_data_len = 6, + }; + s_event_group = xEventGroupCreate(); + + esp_mqtt_client_handle_t client1 = esp_mqtt_client_init(&mqtt5_cfg1); + esp_mqtt_client_handle_t client2 = esp_mqtt_client_init(&mqtt5_cfg2); + TEST_ASSERT_TRUE(NULL != client1 && NULL != client2 ); + esp_mqtt_client_register_event(client1, ESP_EVENT_ANY_ID, mqtt5_event_handler, NULL); + esp_mqtt_client_register_event(client2, ESP_EVENT_ANY_ID, mqtt5_event_handler, NULL); + TEST_ASSERT_TRUE(ESP_OK == esp_mqtt5_client_set_connect_property(client1, &connect_property)); + TEST_ASSERT_TRUE(ESP_OK == esp_mqtt5_client_set_connect_property(client2, &connect_property)); + TEST_ASSERT_TRUE(esp_mqtt_client_start(client1) == ESP_OK); + WAIT_FOR_EVENT(CONNECT_BIT); + TEST_ASSERT_TRUE(esp_mqtt_client_start(client2) == ESP_OK); + WAIT_FOR_EVENT(CONNECT_BIT); + int counter = 0; + esp_mqtt_client_register_event(client1, MQTT_EVENT_DATA, mqtt5_data_handler_lwt, &counter); + esp_mqtt_client_register_event(client2, MQTT_EVENT_DATA, mqtt5_data_handler_lwt, &counter); + TEST_ASSERT_TRUE(esp_mqtt_client_subscribe(client1, lwt, 0) != -1); + TEST_ASSERT_TRUE(esp_mqtt_client_subscribe(client2, lwt, 0) != -1); + esp_mqtt_client_disconnect(client1); + WAIT_FOR_EVENT(DISCONNECT_BIT); + esp_mqtt_client_reconnect(client1); + WAIT_FOR_EVENT(CONNECT_BIT); + TEST_ASSERT_TRUE(esp_mqtt_client_subscribe(client1, lwt, 0) != -1); + esp_mqtt_client_stop(client2); + esp_mqtt_client_start(client2); + WAIT_FOR_EVENT(CONNECT_BIT); + TEST_ASSERT_TRUE(esp_mqtt_client_subscribe(client2, lwt, 0) != -1); + TEST_ASSERT_TRUE(esp_mqtt_client_publish(client1, lwt, "no-lwt", 0, 0, 0) != -1); + WAIT_FOR_EVENT(DATA_BIT); + TEST_ASSERT_TRUE(counter == 0); + esp_mqtt_client_destroy(client1); + esp_mqtt_client_destroy(client2); + vEventGroupDelete(s_event_group); + free(lwt); + return true; +} + +bool mqtt5_subscribe_payload(void) +{ + const esp_mqtt_client_config_t mqtt5_cfg = { + .broker.address.uri = CONFIG_MQTT5_TEST_BROKER_URI, + .network.disable_auto_reconnect = true, + .session.protocol_ver = MQTT_PROTOCOL_V_5, + }; + char* topic = append_mac("topic"); + TEST_ASSERT_TRUE(NULL != topic); + s_event_group = xEventGroupCreate(); + esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt5_cfg); + TEST_ASSERT_TRUE(NULL != client ); + esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt5_event_handler, NULL); + TEST_ASSERT_TRUE(ESP_OK == esp_mqtt_client_start(client)); + WAIT_FOR_EVENT(CONNECT_BIT); + int qos_payload = -1; + esp_mqtt_client_register_event(client, MQTT_EVENT_SUBSCRIBED, mqtt5_data_handler_subscribe, &qos_payload); + TEST_ASSERT_TRUE(esp_mqtt_client_subscribe(client, topic, 2) != -1); + WAIT_FOR_EVENT(DATA_BIT); + TEST_ASSERT_TRUE(qos_payload == 2); + TEST_ASSERT_TRUE(esp_mqtt_client_subscribe(client, topic, 0) != -1); + WAIT_FOR_EVENT(DATA_BIT); + TEST_ASSERT_TRUE(qos_payload == 0); + esp_mqtt_client_destroy(client); + vEventGroupDelete(s_event_group); + free(topic); + return true; +} diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/main/test_mqtt5_client_broker.h b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/main/test_mqtt5_client_broker.h new file mode 100644 index 000000000..a181dd8e0 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/main/test_mqtt5_client_broker.h @@ -0,0 +1,51 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once +#include "esp_log.h" + +/** + * @brief MQTT5 client-broker tests are not implemented as separate test cases + * due to time consuming connection setup/teardown. + * This utility macro is used to run functional cases as MQTT tests + * and evaluate as separate assertions in one "mqtt5 broker tests" test case. + */ +#define RUN_MQTT5_BROKER_TEST(test_name) \ + do { \ + ESP_LOGI("mqtt5_test", "Running test:" #test_name "()"); \ + TEST_ASSERT_TRUE_MESSAGE(test_name(), "Mqtt5 test failed: " #test_name "() "); \ + ESP_LOGI("mqtt5_test", "Test:" #test_name "() passed "); \ + } while(0) + + +/** + * @brief This module contains mqtt5 test cases interacting the client with a (real) broker + */ + +/** + * @brief The client subscribes and publishes on the same topic + * and verifies the received published qos in the event + */ +bool mqtt5_subscribe_publish(void); + +/** + * @brief The client connects, disconnects and reconnects. + * Tests basic client state transitions + */ +bool mqtt5_connect_disconnect(void); + +/** + * @brief Two clients with defined lwt connect and subscribe to lwt topic. + * This test verifies that no lwt is send when each of the client disconnects. + * (we expect a clean disconnection, so no last-will being sent) + */ +bool mqtt5_lwt_clean_disconnect(void); + +/** + * @brief The client subscribes to a topic with certain qos + * and verifies the qos in SUBACK message from the broker. + */ +bool mqtt5_subscribe_payload(void); diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/pytest_mqtt5_ut.py b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/pytest_mqtt5_ut.py new file mode 100644 index 000000000..7e38dfac8 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/pytest_mqtt5_ut.py @@ -0,0 +1,11 @@ +# SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: Unlicense OR CC0-1.0 +import pytest +from pytest_embedded import Dut +from pytest_embedded_idf.utils import idf_parametrize + + +@pytest.mark.ethernet +@idf_parametrize('target', ['esp32'], indirect=['target']) +def test_mqtt5_client(dut: Dut) -> None: + dut.expect_unity_test_output() diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/sdkconfig.ci.default b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/sdkconfig.ci.default new file mode 100644 index 000000000..1d40815a9 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/sdkconfig.ci.default @@ -0,0 +1,4 @@ +CONFIG_MQTT_TEST_BROKER_URI="mqtt://${EXAMPLE_MQTT_BROKER_TCP}" +CONFIG_MQTT5_TEST_BROKER_URI="mqtt://${EXAMPLE_MQTT_BROKER_TCP}" +CONFIG_ESP_TASK_WDT_EN=n +CONFIG_UNITY_ENABLE_FIXTURE=y diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/sdkconfig.defaults b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/sdkconfig.defaults new file mode 100644 index 000000000..06c58d7b6 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/mqtt5/sdkconfig.defaults @@ -0,0 +1,4 @@ +# General options for additional checks +CONFIG_ESP_TASK_WDT_EN=n +CONFIG_MQTT_PROTOCOL_5=y +CONFIG_UNITY_ENABLE_FIXTURE=y diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/CMakeLists.txt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/CMakeLists.txt new file mode 100644 index 000000000..543259e6a --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/CMakeLists.txt @@ -0,0 +1,16 @@ +# The following four lines of boilerplate have to be in your project's CMakeLists +# in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +idf_build_set_property(MINIMAL_BUILD ON) + +project(mqtt_publish_connect_test) + +target_add_binary_data(mqtt_publish_connect_test.elf "main/mqtt_eclipseprojects_io.pem" TEXT) +target_add_binary_data(mqtt_publish_connect_test.elf "ca.crt" TEXT) +target_add_binary_data(mqtt_publish_connect_test.elf "ca.der" TEXT) +target_add_binary_data(mqtt_publish_connect_test.elf "client_pwd.key" TEXT) +target_add_binary_data(mqtt_publish_connect_test.elf "client_pwd.crt" TEXT) +target_add_binary_data(mqtt_publish_connect_test.elf "client_no_pwd.key" TEXT) +target_add_binary_data(mqtt_publish_connect_test.elf "client_inv.crt" TEXT) diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/README.md b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/README.md new file mode 100644 index 000000000..ec2cd41e2 --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/README.md @@ -0,0 +1,25 @@ +| Supported Targets | ESP32 | ESP32-C3 | ESP32-S2 | +| ----------------- | ----- | -------- | -------- | + +# ESP-MQTT advanced publish and connect test project + +Main purpose of this application is to test the MQTT library to correctly publish and receive messages (of different size and sequences) over different transports. +It is possible to run this example manually without any test to exercise how the MQTT library deals with + +- reception of fragmented messages +- runtime updates of URI + +## Runtime settings + +This app waits for user input to provide these parameters: +- test-type: "conn" if connection test (host, port, test-case number) +- publish test: + * transport: string parameter, one of: tcp, ssl, ws, wss + * pattern: sample string to be transmitted as message + * pattern repeats: number of repeats of pattern in one MQTT message + * repeated: number of repeats ESP32 publishes the message, also ESP32 expects to receive the same message the same number of repeats + * qos: number specifying qos, one of: 0, 1, 2 + +## Hardware Required + +This test-app can be executed on any ESP32 board, the only required interface is WiFi and connection to a local network, then depending on the test either a mqtt test broker or a tls server. diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/ca.crt b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/ca.crt new file mode 100644 index 000000000..e371e070c --- /dev/null +++ b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/ca.crt @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDGTCCAgGgAwIBAgIUY6kAA+U+ZPIJYIff8dlbi6NCzKswDQYJKoZIhvcNAQEL +BQAwFDESMBAGA1UEAwwJRXNwcmVzc2lmMB4XDTI1MDQwMjA1MjcwMloXDTM1MDMz +MTA1MjcwMlowFDESMBAGA1UEAwwJRXNwcmVzc2lmMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAwSY/p8zDP8W3f37xfL1jy/WcWVOOS2msWRyxjpXQM2e+ +66McSkn8mVKTW5/aZ96sFQbmBBuhp3ypopH+kBQHxK4kla6roEcN/Nx9wpC8X64l +U9EqPmOvcIG8HElEY05LzZ9Rzc4LIBREq/sM8FE5+YHO2za8rN2XIaMii0mm2alf +o1MFEq1nkHBeJKlXkk6eZDwcQ9kqLWBz9YQWygE2pmDCjdCoY97/dZpgAjvkrAGN +9UYno9ZmNOYefL1P1ZmVtdBRW/xDGTDSZCJGYHOrtvfD8VS6cguOOl+rsy3obFdh +A4AgGFEFtfdY/+2fJHFkn6Pep6j+7h8f9n89qpSwswIDAQABo2MwYTAdBgNVHQ4E +FgQUJ+QsjjuS10OtEEcU0Wh2XhXTa1YwHwYDVR0jBBgwFoAUJ+QsjjuS10OtEEcU +0Wh2XhXTa1YwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAoQwDQYJKoZI +hvcNAQELBQADggEBABKWpI+QdMYoDwyssIbfwpbqJxb5M1w3PLnMsPzg1d5aEqLh +zwN9EnEQ5TxfeC7Lxdv3hKEGtif/aVxBhs48wPSxD7Fuw17kX6P4l9Cu9Ro2+1Oy +0lUxHi61xXxf7zVkdPQ0JLXdSMUvSUuKfvBtHCwEfdC+lsamxIDmCJys69kDhsCM +VJzY8Yz4MA9WOY3Z2YYMRp6ryFBZ9UgSUEnFxSOpggymkcM5mNxod1jshvSJ3FDG +dmvfbmK0+dN3rCiooORsIYVbopAYxralavA9IY24oiULE+GyVt5pNSONmJ96Y7GK +dL72B8RxX+jUSzgu/N3D1DwbPHP/xRiI7EqaYvg= +-----END CERTIFICATE----- diff --git a/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/ca.der b/ESP32-IDF_Temperture-Node-v2/managed_components/espressif__mqtt/test/apps/publish_connect_test/ca.der new file mode 100644 index 0000000000000000000000000000000000000000..8f0d12006aceaf0753b903aba07c6822dfbb2fe2 GIT binary patch literal 797 zcmXqLVwN;$Vq#pt%*4pVB$B+6f%&Oj$|uf*_WK`iMt3iEI0ro;}B{AmXz6H_wMa%b$(sZkz2{b9cJpVx?}+ zWj9yGFAioETAMzhAWmgv_$0r1DK;|BH??#ViodpqonkawmT;)|!iwa3|4U~jFj+rY z!`S=PO?~mTG?Qm?HGBQ9&YZgSLSXbCXGw!gDN1e$#jCe{Km0LdR}pugRs8DBx-W9V z6PX(nBm!BtevkP7cD_ns%KXLmmaq8tPG0_7z3r+g8#XgBGcqtPPBut1kOhXgEFX&) zi-`IYoj&VH*PYi2xQkrOD2o%loE>H$50X}9kuVTzz^;HFq(GRF@jnZz0W**?-~$Qp zg9KQZnV4FTqX8Jpz-VA(5Sq56e?rMI4St?A8`|z4n)XUv?5A;zxy{Zq8~!}FdM`?7 z(Zlo1wL*mgPi^8W^iChW{k>%&+cx$8nK6!S=WGsq*~q^!?{M6c_{Be_Us(55%ItUW zrc0rQa(Y{j*2KRzO)2?eqO$d_$5DMx@2