├── .clang-format ├── .gitignore ├── .vscode ├── c_cpp_properties.json ├── launch.json ├── settings.json └── tasks.json ├── CMakeLists.txt ├── Itho Data Labels.xlsx ├── LICENSE ├── README.md ├── Specs.md ├── hru-com-esp32.fzz ├── hru-com-esp32_schem.png ├── main ├── CMakeLists.txt ├── Config.cpp ├── Config.h ├── Nvs.cpp ├── Nvs.h ├── console.cpp ├── console.h ├── dht.cpp ├── dht.h ├── i2c.cpp ├── i2c.h ├── i2c_master.cpp ├── i2c_master.h ├── i2c_slave.cpp ├── i2c_slave.h ├── i2c_sniffer.cpp ├── i2c_sniffer.h ├── main.cpp ├── mqtt.cpp ├── mqtt.h ├── sht4x.cpp ├── sht4x.h ├── util.cpp ├── util.h ├── wifi.cpp └── wifi.h └── sdkconfig /.clang-format: -------------------------------------------------------------------------------- 1 | Standard: Cpp11 2 | BasedOnStyle: LLVM 3 | ColumnLimit: 150 4 | IndentWidth: 4 5 | UseTab: Never 6 | PointerAlignment: Left 7 | AlignConsecutiveMacros: true 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | build/ 2 | sdkconfig.old 3 | *.tmp 4 | *.log 5 | -------------------------------------------------------------------------------- /.vscode/c_cpp_properties.json: -------------------------------------------------------------------------------- 1 | { 2 | "configurations": [ 3 | { 4 | "name": "Linux", 5 | "cStandard": "c11", 6 | "cppStandard": "c++17", 7 | "includePath": [ 8 | "${config:idf.espIdfPath}/components/**", 9 | "${config:idf.espIdfPathWin}/components/**", 10 | "${workspaceFolder}/**" 11 | ], 12 | "browse": { 13 | "path": [ 14 | "${config:idf.espIdfPath}/components", 15 | "${config:idf.espIdfPathWin}/components", 16 | "${workspaceFolder}" 17 | ], 18 | "limitSymbolsToIncludedHeaders": false 19 | }, 20 | "compileCommands": "${workspaceFolder}/build/compile_commands.json", 21 | "configurationProvider": "ms-vscode.cmake-tools" 22 | } 23 | ], 24 | "version": 4 25 | } -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "espidf", 9 | "name": "Launch", 10 | "request": "launch", 11 | } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "C_Cpp.clang_format_style": "Visual Studio", 3 | "editor.formatOnSave": true, 4 | "cmake.generator": "Ninja", 5 | "[cpp]": { 6 | "editor.quickSuggestions": { 7 | "comments": "on", 8 | "strings": "on", 9 | "other": "on" 10 | } 11 | }, 12 | "[c]": { 13 | "editor.quickSuggestions": { 14 | "comments": "on", 15 | "strings": "on", 16 | "other": "on" 17 | } 18 | }, 19 | "idf.adapterTargetName": "esp32", 20 | "idf.openOcdConfigs": [ 21 | "interface/ftdi/esp32_devkitj_v1.cfg", 22 | "target/esp32.cfg" 23 | ] 24 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "label": "Build - Build project", 6 | "type": "shell", 7 | "command": "${config:idf.pythonBinPath} ${config:idf.espIdfPath}/tools/idf.py build", 8 | "windows": { 9 | "command": "${config:idf.pythonBinPathWin} ${config:idf.espIdfPathWin}\\tools\\idf.py build" 10 | }, 11 | "options": { 12 | "env": { 13 | "PATH": "${config:idf.customExtraPaths}" 14 | } 15 | }, 16 | "problemMatcher": [ 17 | { 18 | "owner": "cpp", 19 | "fileLocation": ["relative", "${workspaceFolder}"], 20 | "pattern": { 21 | "regexp": "^\\.\\.(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", 22 | "file": 1, 23 | "line": 2, 24 | "column": 3, 25 | "severity": 4, 26 | "message": 5 27 | } 28 | }, 29 | { 30 | "owner": "cpp", 31 | "fileLocation": "absolute", 32 | "pattern": { 33 | "regexp": "^[^\\.](.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", 34 | "file": 1, 35 | "line": 2, 36 | "column": 3, 37 | "severity": 4, 38 | "message": 5 39 | } 40 | } 41 | ], 42 | "group": { 43 | "kind": "build", 44 | "isDefault": true 45 | } 46 | }, 47 | { 48 | "label": "Set ESP-IDF Target", 49 | "type": "shell", 50 | "command": "${command:espIdf.setTarget}", 51 | "problemMatcher": { 52 | "owner": "cpp", 53 | "fileLocation": "absolute", 54 | "pattern": { 55 | "regexp": "^(.*):(//d+):(//d+)://s+(warning|error)://s+(.*)$", 56 | "file": 1, 57 | "line": 2, 58 | "column": 3, 59 | "severity": 4, 60 | "message": 5 61 | } 62 | }, 63 | }, 64 | { 65 | "label": "Clean - Clean the project", 66 | "type": "shell", 67 | "command": "${config:idf.pythonBinPath} ${config:idf.espIdfPath}/tools/idf.py fullclean", 68 | "windows": { 69 | "command": "${config:idf.pythonBinPathWin} ${config:idf.espIdfPathWin}\\tools\\idf.py fullclean" 70 | }, 71 | "options": { 72 | "env": { 73 | "PATH": "${config:idf.customExtraPaths}" 74 | } 75 | }, 76 | "problemMatcher": [ 77 | { 78 | "owner": "cpp", 79 | "fileLocation": ["relative", "${workspaceFolder}"], 80 | "pattern": { 81 | "regexp": "^\\.\\.(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", 82 | "file": 1, 83 | "line": 2, 84 | "column": 3, 85 | "severity": 4, 86 | "message": 5 87 | } 88 | }, 89 | { 90 | "owner": "cpp", 91 | "fileLocation": "absolute", 92 | "pattern": { 93 | "regexp": "^[^\\.](.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", 94 | "file": 1, 95 | "line": 2, 96 | "column": 3, 97 | "severity": 4, 98 | "message": 5 99 | } 100 | } 101 | ], 102 | }, 103 | { 104 | "label": "Flash - Flash the device", 105 | "type": "shell", 106 | "command": "${config:idf.pythonBinPath} ${config:idf.espIdfPath}/tools/idf.py -p ${config:idf.port} -b ${config:idf.baudRate} flash", 107 | "windows": { 108 | "command": "${config:idf.pythonBinPathWin} ${config:idf.espIdfPathWin}\\tools\\idf.py flash -p ${config:idf.portWin} -b ${config:idf.baudRate}" 109 | }, 110 | "options": { 111 | "env": { 112 | "PATH": "${config:idf.customExtraPaths}" 113 | } 114 | }, 115 | "problemMatcher": [ 116 | { 117 | "owner": "cpp", 118 | "fileLocation": ["relative", "${workspaceFolder}"], 119 | "pattern": { 120 | "regexp": "^\\.\\.(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", 121 | "file": 1, 122 | "line": 2, 123 | "column": 3, 124 | "severity": 4, 125 | "message": 5 126 | } 127 | }, 128 | { 129 | "owner": "cpp", 130 | "fileLocation": "absolute", 131 | "pattern": { 132 | "regexp": "^[^\\.](.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", 133 | "file": 1, 134 | "line": 2, 135 | "column": 3, 136 | "severity": 4, 137 | "message": 5 138 | } 139 | } 140 | ], 141 | }, 142 | { 143 | "label": "Monitor: Start the monitor", 144 | "type": "shell", 145 | "command": "${config:idf.pythonBinPath} ${config:idf.espIdfPath}/tools/idf.py -p ${config:idf.port} -b ${config:idf.baudRate} monitor", 146 | "windows": { 147 | "command": "${config:idf.pythonBinPathWin} ${config:idf.espIdfPathWin}\\tools\\idf.py monitor -p ${config:idf.portWin} -b ${config:idf.baudRate}" 148 | }, 149 | "options": { 150 | "env": { 151 | "PATH": "${config:idf.customExtraPaths}", 152 | } 153 | }, 154 | "dependsOn": "Flash - Flash the device", 155 | }, 156 | { 157 | "label":"OpenOCD: Start openOCD", 158 | "type":"shell", 159 | "presentation": { 160 | "echo": true, 161 | "reveal": "never", 162 | "focus": false, 163 | "panel":"new" 164 | }, 165 | "command":"openocd -s ${command:espIdf.getOpenOcdScriptValue} ${command:espIdf.getOpenOcdConfigs}", 166 | "windows": { 167 | "command": "openocd.exe -s ${command:espIdf.getOpenOcdScriptValue} ${command:espIdf.getOpenOcdConfigs}" 168 | }, 169 | "options": { 170 | "env": { 171 | "PATH": "${config:idf.customExtraPaths}" 172 | } 173 | }, 174 | "problemMatcher": { 175 | "owner": "cpp", 176 | "fileLocation": "absolute", 177 | "pattern": { 178 | "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", 179 | "file": 1, 180 | "line": 2, 181 | "column": 3, 182 | "severity": 4, 183 | "message": 5 184 | } 185 | }, 186 | }, 187 | { 188 | "label": "adapter", 189 | "type": "shell", 190 | "command": "${config:idf.pythonBinPath}", 191 | "isBackground": true, 192 | "options": { 193 | "env": { 194 | "PATH": "${config:idf.customExtraPaths}", 195 | "PYTHONPATH": "${command:espIdf.getExtensionPath}/esp_debug_adapter/debug_adapter" 196 | } 197 | }, 198 | "problemMatcher": { 199 | "background": { 200 | "beginsPattern": "\bDEBUG_ADAPTER_STARTED\b", 201 | "endsPattern": "DEBUG_ADAPTER_READY2CONNECT", 202 | "activeOnStart": true 203 | }, 204 | "pattern": { 205 | "regexp": "(\\d+)-(\\d+)-(\\d+)\\s(\\d+):(\\d+):(\\d+),(\\d+)\\s-(.+)\\s(ERROR)", 206 | "file": 8, 207 | "line": 2, 208 | "column": 3, 209 | "severity": 4, 210 | "message": 9 211 | } 212 | }, 213 | "args": [ 214 | "${command:espIdf.getExtensionPath}/esp_debug_adapter/debug_adapter_main.py", 215 | "-e", "${workspaceFolder}/build/${command:espIdf.getProjectName}.elf", 216 | "-s", "${command:espIdf.getOpenOcdScriptValue}", 217 | "-ip", "localhost", 218 | "-dn", "${config:idf.adapterTargetName}", 219 | "-om", 220 | "connect_to_instance" 221 | ], 222 | "windows": { 223 | "args": [ 224 | "${command:espIdf.getExtensionPath}/esp_debug_adapter/debug_adapter_main.py", 225 | "-e", "${workspaceFolder}/build/${command:espIdf.getProjectName}.elf", 226 | "-s", "${command:espIdf.getOpenOcdScriptValue}", 227 | "-ip", "localhost", 228 | "-dn", "${config:idf.adapterTargetName}", 229 | "-om", 230 | "connect_to_instance" 231 | ] 232 | } 233 | } 234 | ] 235 | } 236 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.16) 2 | 3 | include($ENV{IDF_PATH}/tools/cmake/project.cmake) 4 | project(itho-esp) 5 | -------------------------------------------------------------------------------- /Itho Data Labels.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rustyx/itho-esp/8e4421675f8853b7e8f3a3ad3fb724243ec9bfa6/Itho Data Labels.xlsx -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | ## itho-esp 3 | 4 | Itho diag port controller 5 | 6 | ### WTF is this? 7 | 8 | This is an ESP32 firmware that connects to the dianostic port of an Itho device in order to communicate with it and let it do things it couldn't before. 9 | 10 | Originally designed for controlling the Itho HRU ecofan 350 ventilation unit via MQTT, but can be used to play with the I2C bus of many other Itho products. 11 | 12 | Some key features are: 13 | 14 | * I2C bus sniffing - dumps messages to/from the Itho CPU. On products that have peripherals like an RFT receiver, will dump traffic between the peripheral and the CPU. 15 | * Send and receive dianostic messages to the CPU. 16 | * Query the device status and parse parameter values. 17 | * Control the device via Wi-Fi/MQTT. 18 | * Monitor temperature and humidity via DHT22 and/or SHT4x, publish results via MQTT. 19 | * (HRU-specific) Control ventilation level setting (low, med., high) via MQTT. 20 | * (HRU-specific) Automatically set ventilation to high when humidity exceeds a threshold value. 21 | 22 | ### Prerequisites 23 | 24 | Hardware: 25 | 26 | * An Itho ecofan HRU 350 WTW unit (or another Itho product that has an RJ45 diagnostic port) 27 | * ESP32 Dev Kit (or a raw ESP32 unit + power supply + a USB COM dongle + some SMD work) 28 | * a logic level shifter for converting 5V <-> 3,3V logic levels (or 2 small N-channel MOSFETs) 29 | * One or more DHT22 or SHT4x (optional, to measure humidity) 30 | * DC-DC buck converter (optional, to power ESP32 directly from the Itho diag port's +15V) 31 | 32 | Software: 33 | 34 | * [ESP-IDF Framework](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/index.html) v5.3+ and its prerequisites (`xtensa-esp32-elf-gcc`, `pip`, etc.) 35 | * USB COM driver matching the USB serial interface chip (see [Connect ESP32 to PC](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/establish-serial-connection.html)) 36 | * [Visual Studio Code](https://code.visualstudio.com/download) with [ESP-IDF extension](https://github.com/espressif/vscode-esp-idf-extension/blob/master/docs/ONBOARDING.md) (optional but recommended, will also help with installing the ESP-IDF framework) 37 | 38 | ### Building 39 | 40 | * Make sure the ESP Dev Kit can be connected to USB and a COM port is functional 41 | * Install ESP-IDF framework, make sure it works and has access to the COM port (see [connect your device](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/#get-started-connect)) 42 | * Build the firmware: `idf.py build` 43 | * Flash the firmware: `idf.py -b 921600 flash` (will also invoke `build` if needed) 44 | To flash, the ESP32 chip needs to be put in download mode. This can be achieved by shorting J3 pin 5 to ground (pin 4) while booting. 45 | * Attach to the console: `idf.py monitor` (can combine with the `flash` command) 46 | 47 | ### Console interface 48 | 49 | * `config` : Configure Wi-Fi, MQTT and humidity sensor GPIO 50 | * `p` : Pullup OFF 51 | * `P` : Pullup ON 52 | * `s` : Sniffer OFF 53 | * `S` : Sniffer ON 54 | * `h` : Hex reporting OFF 55 | * `H` : Hex reporting ON 56 | * Or any of MQTT command below 57 | 58 | ### MQTT commands 59 | 60 | * `set1` - set ventilation level to low 61 | * `set2` - set ventilation level to medium 62 | * `set3` - set ventilation level to high for 30 min (then back to low) 63 | * `hum` - request DHT22 temp/humidity values 64 | * `status` - request device status 65 | * `ping` - request `pong` 66 | * `high_hum_threshold` - get current high humidity threshold (output goes to `esp-data-dht`) 67 | * `high_hum_threshold N` - set high humidity threshold to N * 0.1% (e.g. for 75% use 750) 68 | * Hex bytes - send these bytes to the bus 69 | 70 | ### MQTT topics 71 | 72 | `esp` - The topic for MQTT requests. 73 | 74 | `esp-data` - The topic for MQTT replies. In addition, Itho status data + DHT data are published here as a JSON array every 5 seconds. 75 | 76 | `esp-data-dht` - DHT data (humidity, temp, status) is published here when `hum` is requested. 77 | 78 | `esp-data-hex` - when hex reporting is enabled, all Itho response messages are published here in hex format. 79 | 80 | ### Tech specs 81 | 82 | For technical details and other research notes refer to [Specs.md](Specs.md) 83 | 84 | ### License 85 | 86 | The unlicense: 87 | 88 | The software is provided AS-IS without any warranty. 89 | 90 | You can do whatever you want with it to the extent permitted by law. 91 | 92 | I will deny any involvement with this project, should any questions arise. 93 | -------------------------------------------------------------------------------- /Specs.md: -------------------------------------------------------------------------------- 1 | 2 | ### RJ45 dianostic port pinout 3 | 4 | | Pin | | 5 | | --- | ---- | 6 | | 2 | SCL | 7 | | 3 | GND | 8 | | 4 | GND | 9 | | 5 | +15V | 10 | | 7 | SDA | 11 | 12 | The SCL, SDA are I2C lines with a 5V pull-up (5,6K) connecting straight to the CPU on the Itho mainboard. 13 | 14 | +15V can be used for power supply needs (appears to be good for at least 1A). 15 | 16 | There is no +5V available, but is not needed due to the built-in pull-ups (the lines only need to be pulled down for a logical 0). 17 | 18 | --- 19 | 20 | ### GPIO Pin assignment 21 | 22 | | GPIO | Desc | Notes | 23 | | ---- | --------------- | ---------------------------------------------- | 24 | | 0 | Reset | The ESP32 reset pin (inverted) | 25 | | 13 | I2C Sniffer SDA | Defined in [i2c_sniffer.h](main/i2c_sniffer.h) | 26 | | 14 | I2C Slave SDA | Defined in [i2c_slave.h](main/i2c_slave.h) | 27 | | 15 | DHT22 I/O | Defined in [dht.h](main/dht.h) | 28 | | 25 | I2C Sniffer SCL | | 29 | | 26 | I2C Master SCL | Defined in [i2c_master.h](main/i2c_master.h) | 30 | | 27 | I2C Master SDA | | 31 | | 33 | I2C Slave SCL | | 32 | 33 | The I2C pins were carefully chosen so that they can be wired into a "bus", as can be seen on the schematic: 34 | 35 | ![schematic](hru-com-esp32_schem.png) 36 | 37 | --- 38 | 39 | ### I2C message format 40 | 41 | The Itho mainboard is an I2C master running at ~100kHz. 42 | Each packet has a checksum byte at the end, which is the negative sum of all other bytes. 43 | First byte is destination address (0x82 = Itho mainboard). 44 | Second byte is reply address (0x80 = dongle). 45 | 2 bytes: message code. 46 | 1 byte: message flags (it seems: `06` = write, `04` = request, `01` = reply). 47 | 1 byte: payload length (N). 48 | N bytes: payload. 49 | 1 byte: checksum. 50 | 51 | --- 52 | 53 | ### Message `90 E0`: query device type 54 | 55 | 82 80 90 E0 04 00 8A 56 | 57 | Example reply: 58 | 59 | 80 82 90 E0 01 12 00 01 00 03 12 0B 00 00 00 FF FF FF FF FF FF FF FF 00 62 60 | 61 | `00` = Manufacturer (Itho), `03` = Device type (HRU), `12` = HW version, `0B` = list version. 62 | 63 | The "list version" refers to the Datalabel_V.. table in the corresponding Jet DB (.par) file of the Servicetool. 64 | 65 | Some known Device Type codes: 66 | 67 | `01` : Lucht gordijn 68 | `03` : HRU ECO-fan 69 | `08` : Laadboiler 70 | `0A` : Gas gestookte boost boiler 71 | `0B` : DemandFlow 72 | `0C` : CO2 relay 73 | `0D` : Warmtepomp 74 | `0E` : Oplaadboiler enkele wisselaar 75 | `0F` : AutoTemp 76 | `10` : Oplaadboiler dubbele wisselaar 77 | `11` : RF+ 78 | `14` : CVE 79 | `15` : Extended 80 | `16` : Extended Plus 81 | `1A` : AreaFlow 82 | `1B` : CVE-Silent 83 | `1C` : CVE-SilentExt 84 | `1D` : CVE-SilentExtPlus 85 | `20` : RF_CO2 86 | `2B` : HRU 350 87 | 88 | --- 89 | 90 | ### Message `90 E1`: query device serial number 91 | 92 | 82 80 90 E1 04 00 89 93 | 94 | Example reply (edited): 95 | 96 | 80 82 90 E1 01 03 52 D3 3C 48 97 | 98 | Serial nr: 52D33C = 5428028 99 | 100 | --- 101 | 102 | ### Message `A4 00`: query status format 103 | 104 | 82 80 A4 00 04 00 56 105 | 106 | Example reply: 107 | 108 | 80 82 A4 00 01 16 91 11 10 90 10 90 92 92 00 92 92 00 00 91 00 10 10 00 90 00 00 10 C8 109 | 110 | A4 00 01 followed by number of data elements, followed by element formats (1 byte per element). 111 | 112 | Data format (1 byte): 113 | 114 | | Bit | Description | 115 | | ---- | ---------------------------------- | 116 | | 7 | signed (1) / unsigned (0) | 117 | | 6..4 | size in bytes (2^n): 0=1, 1=2, 2=4 | 118 | | 3..0 | decimal digits (divider 10^n) | 119 | 120 | So for example `91` would mean "signed, 2 bytes, 0.1 values". 121 | 122 | Special cases: 123 | 124 | 0C: unsigned 1 byte 125 | 0F: unsigned 1 byte * 0.5 126 | 5B: unsigned 2 bytes 127 | 6C: 1 byte boolean 128 | 129 | --- 130 | 131 | ### Message `A4 01`: query device status 132 | 133 | 82 80 A4 01 04 00 55 134 | 135 | Example reply: 136 | 137 | 80 82 A4 01 01 25 00 00 03 9C 03 9E 03 98 03 EB 03 EB 09 09 09 8A 00 09 09 09 8A 00 00 0B B8 01 00 00 00 B1 79 00 00 00 00 10 95 9F 138 | 139 | 80 82 A4 01 01 followed by data size and data formatted according to the status format (see previous message). 140 | 141 | The temperatures are the bytes 09 09 09 8A, or (0x0909 and 0x098A) 23.13 C en 24.42 C respectively (.01 values). 142 | 143 | The first 00 00 is the ventilation level. It goes from 0 for position "1" to 03E8 (100.0) for level "3". 144 | 145 | For the meaning of each data element refer to [Itho Data Labels.xlsx](Itho%20Data%20Labels.xlsx) 146 | 147 | --- 148 | 149 | ### Itho ecofan RFT 536-0124 (RF remote control) messages 150 | 151 | Button 1: 152 | 82 60 C1 01 01 11 (4b: msg timestamp) (1b: msg format) (3b: commander ID) (1b: command seq nr) 22 F1 03 00 02 04 (2b: seq) (1b: checksum) 153 | 154 | Button 2: 155 | 82 60 C1 01 01 11 (4b: msg timestamp) (1b: msg format) (3b: commander ID) (1b: command seq nr) 22 F1 03 00 03 04 (2b: seq) (1b: checksum) 156 | 157 | Button 3: 158 | 82 60 C1 01 01 11 (4b: msg timestamp) (1b: msg format) (3b: commander ID) (1b: command seq nr) 22 F1 03 00 04 04 (2b: seq) (1b: checksum) 159 | 160 | Button 4 (1st press): 161 | 82 60 C1 01 01 11 (4b: msg timestamp) (1b: msg format) (3b: commander ID) (1b: command seq nr) 22 F3 03 00 00 0A (2b: seq) (1b: checksum) 162 | 163 | Button 4 (2nd press): 164 | 82 60 C1 01 01 11 (4b: msg timestamp) (1b: msg format) (3b: commander ID) (1b: command seq nr) 22 F3 03 00 00 14 (2b: seq) (1b: checksum) 165 | 166 | Button 4 (3rd press): 167 | 82 60 C1 01 01 11 (4b: msg timestamp) (1b: msg format) (3b: commander ID) (1b: command seq nr) 22 F3 03 00 00 1E (2b: seq) (1b: checksum) 168 | 169 | Register an RFT (press 1+4 or 2+3): 170 | 82 60 C1 01 01 1A (4b: msg timestamp) (1b: msg format) (3b: commander ID) (1b: command seq nr) 1F C9 0C 00 22 F1 (3b: commander ID) 01 10 E0 (3b: commander 171 | ID) (2b: seq) (1b: checksum) 172 | 173 | Deregister an RFT (press 1+2+3+4): 174 | 82 60 C1 01 01 14 (4b: msg timestamp) (1b: msg format) (3b: commander ID) (1b: command seq nr) 1F C9 06 00 1F C9 (3b: commander ID) (2b: seq) (1b: checksum) 175 | 176 | Notes: 177 | 178 | * Each command is repeated 3 times with a short interval 179 | * Note sure if my interpretation of (4b: msg timestamp), (1b: command seq nr), (2b: seq) is correct, most can be `00`'s but some itho devices (but not the HRU) need to have the command seq nr changed every message. 180 | * (3b: commander ID) are the 3 bytes of the device ID 181 | * (1b: msg format) is the message format determining the fields present in the message. For standard 4 button remotes this is `16`. 182 | 183 | ... 184 | -------------------------------------------------------------------------------- /hru-com-esp32.fzz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rustyx/itho-esp/8e4421675f8853b7e8f3a3ad3fb724243ec9bfa6/hru-com-esp32.fzz -------------------------------------------------------------------------------- /hru-com-esp32_schem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rustyx/itho-esp/8e4421675f8853b7e8f3a3ad3fb724243ec9bfa6/hru-com-esp32_schem.png -------------------------------------------------------------------------------- /main/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | file(GLOB Sources "*.cpp") 2 | idf_component_register(SRCS ${Sources} INCLUDE_DIRS "") 3 | -------------------------------------------------------------------------------- /main/Config.cpp: -------------------------------------------------------------------------------- 1 | #include "Config.h" 2 | #include "Nvs.h" 3 | #include "console.h" 4 | #include "mqtt.h" 5 | #include "util.h" 6 | #include "wifi.h" 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | 17 | static const char* TAG = "config"; 18 | 19 | extern Nvs nvs; 20 | 21 | bool Config::Read() { 22 | ESP_LOGI(TAG, "Reading config"); 23 | if (!nvs.StartRead()) { 24 | ESP_LOGW(TAG, "Not configured. Enter \"config\" to configure."); 25 | return false; 26 | } 27 | wifiAPMode = false; 28 | wifiSsid = nvs.ReadString("ssid"); 29 | wifiPw = nvs.ReadString("wifipw"); 30 | mqtturi = nvs.ReadString("mqtturi"); 31 | mqttId = nvs.ReadString("mqttid"); 32 | mqttServerCert = nvs.ReadString("mqttsc"); 33 | mqttClientKey = nvs.ReadString("mqttck"); 34 | mqttClientCert = nvs.ReadString("mqttcc"); 35 | mqttqos = nvs.ReadShort("mqttqos"); 36 | rftKey = nvs.ReadInt("rftKey"); 37 | high_hum_threshold = normalize_high_hum_threshold(nvs.ReadShort("hum1")); 38 | for (int i = 0; i < sensors.size(); i++) { 39 | sensors[i].type = nvs.ReadShort(("sens_typ" + std::to_string(i)).c_str()); 40 | sensors[i].sda = nvs.ReadShort(("sens_sda" + std::to_string(i)).c_str()); 41 | sensors[i].scl = nvs.ReadShort(("sens_scl" + std::to_string(i)).c_str()); 42 | } 43 | nvs.EndRead(); 44 | if (mqttId.empty()) { 45 | uint8_t mac[8]; 46 | int rc = esp_read_mac(mac, ESP_MAC_WIFI_STA); 47 | if (rc != ESP_OK) { 48 | ESP_LOGE(TAG, "esp_read_mac: %s", esp_err_to_name(rc)); 49 | std::fill_n(mac, sizeof(mac), 0); 50 | } 51 | char buf[16]; 52 | sprintf(buf, "esp-%02x%02x%02x", mac[3], mac[4], mac[5]); 53 | mqttId = buf; 54 | } 55 | mqtt_config.credentials.client_id = mqttId.c_str(); 56 | mqtt_config.broker.address.uri = mqtturi.c_str(); 57 | mqtt_config.broker.verification.certificate = trimToNull(mqttServerCert.c_str()); 58 | mqtt_config.credentials.authentication.key = trimToNull(mqttClientKey.c_str()); 59 | mqtt_config.credentials.authentication.certificate = trimToNull(mqttClientCert.c_str()); 60 | mqtt_config.pub_qos = mqttqos; 61 | mqtt_config.sub_qos = mqttqos; 62 | return true; 63 | } 64 | 65 | bool Config::Write() { 66 | nvs.StartWrite(); 67 | nvs.WriteString("ssid", wifiSsid); 68 | nvs.WriteString("wifipw", wifiPw); 69 | nvs.WriteString("mqtturi", mqtturi); 70 | nvs.WriteString("mqttid", mqttId); 71 | nvs.WriteString("mqttsc", mqttServerCert); 72 | nvs.WriteString("mqttck", mqttClientKey); 73 | nvs.WriteString("mqttcc", mqttClientCert); 74 | nvs.WriteShort("mqttqos", mqttqos); 75 | nvs.WriteInt("rftKey", rftKey); 76 | nvs.WriteShort("hum1", high_hum_threshold); 77 | for (int i = 0; i < sensors.size(); i++) { 78 | nvs.WriteShort(("sens_typ" + std::to_string(i)).c_str(), sensors[i].type); 79 | nvs.WriteShort(("sens_sda" + std::to_string(i)).c_str(), sensors[i].sda); 80 | nvs.WriteShort(("sens_scl" + std::to_string(i)).c_str(), sensors[i].scl); 81 | } 82 | return nvs.EndWrite(); 83 | } 84 | 85 | int Config::read_string(const char* msg, std::string& val, bool multiline) { 86 | std::string prompt = msg; 87 | std::string tmp; 88 | prompt += " ["; 89 | if (!multiline) { 90 | prompt += val; 91 | } else if (!val.empty()) { 92 | prompt += "*"; 93 | } 94 | prompt += "]: "; 95 | auto rc = console_read(prompt.c_str(), tmp, val.c_str(), multiline); 96 | if (rc && tmp != "") { 97 | val = tmp == "-" || tmp == "-\n" ? "" : tmp; 98 | } 99 | 100 | return rc; 101 | } 102 | 103 | int Config::read_short(const char* msg, uint16_t& val) { 104 | std::string defaultValue = std::to_string(val); 105 | std::string prompt = msg; 106 | std::string tmp; 107 | prompt += " ["; 108 | prompt += defaultValue; 109 | prompt += "]: "; 110 | auto rc = console_read(prompt.c_str(), tmp, defaultValue.c_str()); 111 | if (rc) { 112 | val = atoi(tmp.c_str()); 113 | } 114 | 115 | return rc; 116 | } 117 | 118 | bool Config::Reconfigure() { 119 | std::string tmp = toHexStr((uint8_t*)&rftKey, 4); 120 | if (!read_string("RFT Key (4 hex bytes)", tmp)) 121 | return false; 122 | rftKey = 0; 123 | parseHexStr(tmp.c_str(), tmp.length(), (uint8_t*)&rftKey, 4); 124 | if (rftKey == 0) { 125 | if (!read_string("Sniff the RFT key? (y/n): ", tmp)) 126 | return false; 127 | if (tmp == "y" || tmp == "Y") { 128 | return true; 129 | } 130 | } 131 | if (!read_string("SSID", wifiSsid)) 132 | return false; 133 | if (wifiSsid.empty()) { 134 | ESP_LOGI(TAG, "Wi-Fi disabled"); 135 | } else { 136 | if (!read_string("WiFi pw", wifiPw)) 137 | return false; 138 | } 139 | if (!read_string("MQTT URI (e.g. mqtts://user:pass@host:port)", mqtturi)) 140 | return false; 141 | if (mqtturi.empty()) { 142 | ESP_LOGI(TAG, "MQTT disabled"); 143 | } else { 144 | if (!read_string("MQTT Client ID", mqttId)) 145 | return false; 146 | if (!read_string("MQTT Server Cert PEM (if needed)", mqttServerCert, true)) 147 | return false; 148 | if (!read_string("MQTT Client Key PEM (if needed)", mqttClientKey, true)) 149 | return false; 150 | if (mqttClientKey.empty()) 151 | mqttClientCert = ""; 152 | else if (!read_string("MQTT Client Cert PEM (if needed)", mqttClientCert, true)) 153 | return false; 154 | if (!read_short("MQTT QoS (0,1,2)", mqttqos)) 155 | return false; 156 | } 157 | if (!read_short("high_hum_threshold? (in 0.1%)", high_hum_threshold)) 158 | return false; 159 | high_hum_threshold = normalize_high_hum_threshold(high_hum_threshold); 160 | for (int i = 0; i < max_sensors; i++) { 161 | if (i && sensors[i - 1].type == 0) { 162 | sensors[i].type = 0; 163 | } else { 164 | if (!read_short(("Sensor " + std::to_string(i + 1) + " type (0=unused, 1=DHT, 2=SHT4x)").c_str(), sensors[i].type)) { 165 | return false; 166 | } 167 | } 168 | if (sensors[i].type == 0) { 169 | sensors[i].sda = sensors[i].scl = 0; 170 | continue; 171 | } 172 | if (!read_short(("Sensor " + std::to_string(i + 1) + " SDA GPIO").c_str(), sensors[i].sda)) { 173 | return false; 174 | } 175 | if (sensors[i].type == SensorTypeDHT) { 176 | sensors[i].scl = 0; 177 | continue; 178 | } 179 | if (!read_short(("Sensor " + std::to_string(i + 1) + " SCL GPIO").c_str(), sensors[i].scl)) { 180 | return false; 181 | } 182 | } 183 | if (!Write()) { 184 | ESP_LOGE(TAG, "Config write failed"); 185 | return false; 186 | } 187 | ESP_LOGI(TAG, "Config saved. Restarting"); 188 | vTaskDelay(configTICK_RATE_HZ); 189 | esp_restart(); 190 | return false; 191 | } 192 | -------------------------------------------------------------------------------- /main/Config.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | 5 | constexpr int max_sensors = 3; 6 | 7 | constexpr uint16_t SensorTypeDHT = 1; 8 | constexpr uint16_t SensorTypeSHT4x = 2; 9 | 10 | class SensorConfig { 11 | public: 12 | uint16_t type = 0; 13 | uint16_t sda = 0; 14 | uint16_t scl = 0; 15 | }; 16 | 17 | class Config { 18 | public: 19 | std::string mqtturi; 20 | std::string mqttId; 21 | std::string mqttServerCert; 22 | std::string mqttClientKey; 23 | std::string mqttClientCert; 24 | uint32_t rftKey = 0; 25 | uint16_t mqttqos = 0; 26 | uint16_t high_hum_threshold = default_high_hum_threshold; 27 | std::array sensors; 28 | 29 | bool Read(); 30 | /* returns true if sniffing is requested, false on error. Reboots on success (never returns) */ 31 | bool Reconfigure(); 32 | bool Write(); 33 | 34 | static constexpr uint16_t default_high_hum_threshold = 770; // * 0.1 % 35 | static uint16_t normalize_high_hum_threshold(uint16_t val) { return val > 0 && val <= 1000 ? val : default_high_hum_threshold; } 36 | int read_string(const char* msg, std::string& val, bool multiline = false); 37 | int read_short(const char* msg, uint16_t& val); 38 | }; 39 | 40 | inline const char* trimToNull(const char* s) { return s && s[0] ? s : nullptr; } 41 | -------------------------------------------------------------------------------- /main/Nvs.cpp: -------------------------------------------------------------------------------- 1 | #include "Nvs.h" 2 | #include 3 | #include 4 | #include 5 | 6 | static const char TAG[] = "Nvs"; 7 | 8 | void Nvs::Init() { 9 | esp_err_t ret = nvs_flash_init(); 10 | if (ret == ESP_ERR_NVS_NO_FREE_PAGES) { 11 | ret = nvs_flash_erase(); 12 | ESP_LOGE(TAG, "nvs_flash_erase: %s", esp_err_to_name(ret)); 13 | ret = nvs_flash_init(); 14 | } 15 | if (ret != ESP_OK) { 16 | ESP_LOGE(TAG, "nvs_flash_init: %s", esp_err_to_name(ret)); 17 | } 18 | } 19 | 20 | bool Nvs::StartRead() { 21 | if (open) 22 | ESP_LOGE(TAG, "Nvs already open (forget to call EndRead/EndWrite?)"); 23 | esp_err_t ret = nvs_open(configName, NVS_READONLY, &h); 24 | if (ret != ESP_OK) { 25 | ESP_LOGW(TAG, "nvs_open: %s", esp_err_to_name(ret)); 26 | return false; 27 | } 28 | open = true; 29 | return true; 30 | } 31 | 32 | void Nvs::EndRead() { 33 | nvs_close(h); 34 | open = false; 35 | } 36 | 37 | bool Nvs::StartWrite() { 38 | if (open) 39 | ESP_LOGE(TAG, "Nvs already open (forget to call EndRead/EndWrite?)"); 40 | esp_err_t ret = nvs_open(configName, NVS_READWRITE, &h); 41 | if (ret != ESP_OK) { 42 | ESP_LOGE(TAG, "nvs_open: %s", esp_err_to_name(ret)); 43 | return false; 44 | } 45 | ret = nvs_erase_all(h); // otherwise I need double the space 46 | if (ret != ESP_OK) 47 | ESP_LOGE(TAG, "nvs_erase_all: %s", esp_err_to_name(ret)); 48 | open = true; 49 | return true; 50 | } 51 | 52 | bool Nvs::EndWrite() { 53 | esp_err_t ret = nvs_commit(h); 54 | if (ret != ESP_OK) 55 | ESP_LOGE(TAG, "nvs_commit: %s", esp_err_to_name(ret)); 56 | nvs_close(h); 57 | open = false; 58 | return ret == ESP_OK; 59 | } 60 | 61 | //------------------------------------------------------------------------------------ 62 | 63 | bool Nvs::ReadBool(const char* sKey, bool defaultValue) { 64 | uint8_t u = defaultValue; 65 | esp_err_t rc = nvs_get_u8(h, sKey, &u); 66 | if (rc != ESP_OK) { 67 | ESP_LOGW(TAG, "nvs_get_u%d(%s): %s", 8, sKey, esp_err_to_name(rc)); 68 | } 69 | return u; 70 | } 71 | 72 | uint16_t Nvs::ReadShort(const char* sKey, uint16_t defaultValue) { 73 | uint16_t u = defaultValue; 74 | esp_err_t rc = nvs_get_u16(h, sKey, &u); 75 | if (rc != ESP_OK) { 76 | ESP_LOGW(TAG, "nvs_get_u%d(%s): %s", 16, sKey, esp_err_to_name(rc)); 77 | } 78 | return u; 79 | } 80 | 81 | uint32_t Nvs::ReadInt(const char* sKey, uint32_t defaultValue) { 82 | uint32_t u = defaultValue; 83 | esp_err_t rc = nvs_get_u32(h, sKey, &u); 84 | if (rc != ESP_OK) { 85 | ESP_LOGW(TAG, "nvs_get_u%d(%s): %s", 32, sKey, esp_err_to_name(rc)); 86 | } 87 | return u; 88 | } 89 | 90 | std::string Nvs::ReadString(const char* sKey, const char* defaultValue) { 91 | std::string rs; 92 | size_t u = 0; 93 | esp_err_t rc = nvs_get_blob(h, sKey, nullptr, &u); 94 | if (u) { 95 | rs.resize(u); 96 | rc = nvs_get_blob(h, sKey, &rs[0], &u); 97 | if (rc != ESP_OK) { 98 | ESP_LOGW(TAG, "nvs_get_blob(%s): %s", sKey, esp_err_to_name(rc)); 99 | } 100 | } 101 | return rs; 102 | } 103 | 104 | bool Nvs::WriteBool(const char* sKey, bool bValue) { 105 | esp_err_t rc = nvs_set_u8(h, sKey, bValue ? 1 : 0); 106 | if (rc != ESP_OK) { 107 | ESP_LOGE(TAG, "nvs_set_u%d(%s): %s", 8, sKey, esp_err_to_name(rc)); 108 | return false; 109 | } 110 | return true; 111 | } 112 | 113 | bool Nvs::WriteShort(const char* sKey, uint16_t iValue) { 114 | esp_err_t rc = nvs_set_u16(h, sKey, iValue); 115 | if (rc != ESP_OK) { 116 | ESP_LOGE(TAG, "nvs_set_u%d(%s): %s", 16, sKey, esp_err_to_name(rc)); 117 | return false; 118 | } 119 | return true; 120 | } 121 | 122 | bool Nvs::WriteInt(const char* sKey, uint32_t iValue) { 123 | esp_err_t rc = nvs_set_u32(h, sKey, iValue); 124 | if (rc != ESP_OK) { 125 | ESP_LOGE(TAG, "nvs_set_u%d(%s): %s", 32, sKey, esp_err_to_name(rc)); 126 | return false; 127 | } 128 | return true; 129 | } 130 | 131 | bool Nvs::WriteString(const char* sKey, const std::string& rsValue) { 132 | esp_err_t rc = nvs_set_blob(h, sKey, rsValue.c_str(), rsValue.length()); 133 | if (rc != ESP_OK) { 134 | ESP_LOGE(TAG, "nvs_set_blob(%s): %s", sKey, esp_err_to_name(rc)); 135 | return false; 136 | } 137 | return true; 138 | } 139 | -------------------------------------------------------------------------------- /main/Nvs.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | 6 | class Nvs { 7 | public: 8 | Nvs(const char* configName = "cfg") : configName(configName) {} 9 | 10 | void Init(); 11 | bool StartRead(); 12 | bool ReadBool(const char* sKey, bool defaultValue = false); 13 | uint16_t ReadShort(const char* sKey, uint16_t defaultValue = 0); 14 | uint32_t ReadInt(const char* sKey, uint32_t defaultValue = 0); 15 | std::string ReadString(const char* sKey, const char* defaultValue = ""); 16 | void EndRead(); 17 | 18 | bool StartWrite(); 19 | bool WriteBool(const char* sKey, bool bValue); 20 | bool WriteShort(const char* sKey, uint16_t bValue); 21 | bool WriteInt(const char* sKey, uint32_t bValue); 22 | bool WriteString(const char* sKey, const std::string& rsValue); 23 | bool EndWrite(); 24 | 25 | private: 26 | const char* configName; 27 | nvs_handle h = {}; 28 | bool open = false; 29 | }; 30 | -------------------------------------------------------------------------------- /main/console.cpp: -------------------------------------------------------------------------------- 1 | #include "console.h" 2 | #include 3 | 4 | bool console_read(const char* prompt, std::string& res, const char* defaultValue, bool multiline) { 5 | std::string buf; 6 | char c; 7 | bool rc = true; 8 | printf("%s", prompt); 9 | res.clear(); 10 | while (1) { 11 | while (1) { 12 | int len = uart_read_bytes(UART_NUM_0, (uint8_t*)&c, 1, 2); 13 | if (len) { 14 | if (c < 32 && c != 9) { 15 | if (c == '\n') { 16 | continue; 17 | } else if (c == '\r') { 18 | break; 19 | } else if (c == '\b') { 20 | if (buf.size()) { 21 | buf.resize(buf.size() - 1); 22 | putchar(c); 23 | } 24 | } else { 25 | res.clear(); 26 | rc = false; 27 | break; 28 | } 29 | } else { 30 | buf += c; 31 | putchar(c); 32 | } 33 | } 34 | } 35 | printf("\n\n"); 36 | res += buf; 37 | if (multiline && !buf.empty()) { 38 | res += '\n'; 39 | buf.clear(); 40 | } else { 41 | break; 42 | } 43 | } 44 | if (res.empty()) 45 | res = defaultValue; 46 | return rc; 47 | } 48 | -------------------------------------------------------------------------------- /main/console.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | bool console_read(const char* prompt, std::string& res, const char* defaultValue = "", bool multiline = false); 5 | -------------------------------------------------------------------------------- /main/dht.cpp: -------------------------------------------------------------------------------- 1 | /*------------------------------------------------------------------------------ 2 | DHT22 CPP temperature & humidity sensor AM2302 (DHT22) driver for ESP32 3 | Jun 2017: Ricardo Timmermann, new for DHT22 4 | Timing model entirely rewritten by rustyx 5 | 6 | This example code is in the Public Domain (or CC0 licensed, at your option.) 7 | Unless required by applicable law or agreed to in writing, this 8 | software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 9 | CONDITIONS OF ANY KIND, either express or implied. 10 | PLEASE KEEP THIS CODE IN LESS THAN 0XFF LINES. EACH LINE MAY CONTAIN ONE BUG !!! 11 | ---------------------------------------------------------------------------------*/ 12 | 13 | #include "dht.h" 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | 21 | DHT::DHT(const char* tg, gpio_num_t pin) : dhtGpio(pin) { 22 | strncpy(tag, tg, sizeof(tag)); 23 | ESP_LOGI(tag, "Starting DHT on GPIO %d", dhtGpio); 24 | gpio_config_t config{BIT64(dhtGpio), GPIO_MODE_INPUT, GPIO_PULLUP_DISABLE, GPIO_PULLDOWN_DISABLE, GPIO_INTR_DISABLE}; 25 | gpio_config(&config); 26 | } 27 | 28 | bool DHT::errorHandler(int response) { 29 | switch (response) { 30 | case DHT_TIMEOUT_ERROR: 31 | ESP_LOGE(tag, "Sensor timeout"); 32 | break; 33 | case DHT_CHECKSUM_ERROR: 34 | ESP_LOGE(tag, "Checksum error"); 35 | break; 36 | case DHT_OK: 37 | break; 38 | default: 39 | ESP_LOGE(tag, "Unknown error"); 40 | } 41 | return response == DHT_OK; 42 | } 43 | 44 | inline int DHT::waitForLevel(int usTimeOut, bool state) { 45 | int uSec = 0; 46 | while (gpio_get_level(dhtGpio) != state) { 47 | if (uSec > usTimeOut) { 48 | uSec = -1; 49 | break; 50 | } 51 | ++uSec; 52 | esp_rom_delay_us(1); // uSec delay 53 | } 54 | return uSec; 55 | } 56 | 57 | /*---------------------------------------------------------------------------- 58 | ; 59 | ; read DHT22 sensor 60 | 61 | copy/paste from AM2302/DHT22 Docu: 62 | DATA: Hum = 16 bits, Temp = 16 Bits, check-sum = 8 Bits 63 | Example: MCU has received 40 bits data from AM2302 as 64 | 0000 0010 1000 1100 0000 0001 0101 1111 1110 1110 65 | 16 bits RH data + 16 bits T data + check sum 66 | 67 | 1) we convert 16 bits RH data from binary system to decimal system, 0000 0010 1000 1100 → 652 68 | Binary system Decimal system: RH=652/10=65.2%RH 69 | 2) we convert 16 bits T data from binary system to decimal system, 0000 0001 0101 1111 → 351 70 | Binary system Decimal system: T=351/10=35.1°C 71 | When highest bit of temperature is 1, it means the temperature is below 0 degree Celsius. 72 | Example: 1000 0000 0110 0101, T= minus 10.1°C: 16 bits T data 73 | 3) Check Sum=0000 0010+1000 1100+0000 0001+0101 1111=1110 1110 Check-sum=the last 8 bits of Sum=11101110 74 | 75 | Signal & Timings: 76 | The interval of whole process must be beyond 2 seconds. 77 | 78 | To request data from DHT: 79 | 1) Sent low pulse for > 1~10 ms (MILI SEC) 80 | 2) Sent high pulse for > 20~40 us (Micros). 81 | 3) When DHT detects the start signal, it will pull low the bus 80us as response signal, 82 | then the DHT pulls up 80us for preparation to send data. 83 | 4) When DHT is sending data to MCU, every bit's transmission begin with low-voltage-level that last 50us, 84 | the following high-voltage-level signal's length decide the bit is "1" or "0". 85 | 0: 26~28 us 86 | 1: 70 us 87 | ;----------------------------------------------------------------------------*/ 88 | 89 | #define MAXdhtData 5 // to complete 40 = 5*8 Bits 90 | 91 | int DHT::readDHT() { 92 | int uSec = 0; 93 | uint8_t dhtData[MAXdhtData] = {}; 94 | uint8_t byteInx = 0; 95 | uint8_t bitInx = 7; 96 | 97 | // == Send start signal to DHT sensor =========== 98 | 99 | gpio_set_direction(dhtGpio, GPIO_MODE_OUTPUT); 100 | 101 | // pull down for 5 ms for a smooth and nice wake up 102 | gpio_set_level(dhtGpio, 0); 103 | esp_rom_delay_us(5000); 104 | 105 | portENTER_CRITICAL(&mutex); 106 | // pull up for 25 us to gently ask for data 107 | gpio_set_level(dhtGpio, 1); 108 | esp_rom_delay_us(25); 109 | 110 | gpio_set_direction(dhtGpio, GPIO_MODE_INPUT); 111 | 112 | // == DHT will keep the line low for 80 us and then high for 80us ==== 113 | 114 | int uSec1 = waitForLevel(50, 0); 115 | if (uSec1 < 0) { 116 | portEXIT_CRITICAL(&mutex); 117 | return DHT_TIMEOUT_ERROR; 118 | } 119 | 120 | // -- 80us up ------------------------ 121 | 122 | int uSec2 = waitForLevel(100, 1); 123 | // ESP_LOGD(tag, "Response 2 = %d", uSec2); 124 | if (uSec2 < 0) { 125 | portEXIT_CRITICAL(&mutex); 126 | // ESP_LOGW(tag, "Sensor timeout 2"); 127 | return DHT_TIMEOUT_ERROR; 128 | } 129 | 130 | // == No errors, read the 40 data bits ================ 131 | 132 | for (int k = 0; k < 40; k++) { 133 | // -- starts new data transmission with low signal 134 | uSec = waitForLevel(100, 0); 135 | if (uSec < 0) { 136 | portEXIT_CRITICAL(&mutex); 137 | ESP_LOGW(tag, "Sensor timeout %d @ %d", 1, k); 138 | return DHT_TIMEOUT_ERROR; 139 | } 140 | // high after 50us 141 | uSec = waitForLevel(75, 1); 142 | if (uSec < 0) { 143 | portEXIT_CRITICAL(&mutex); 144 | ESP_LOGW(tag, "Sensor timeout %d @ %d", 2, k); 145 | return DHT_TIMEOUT_ERROR; 146 | } 147 | // data bit after 26..28 us 148 | esp_rom_delay_us(40); 149 | 150 | if (gpio_get_level(dhtGpio)) 151 | dhtData[byteInx] |= (1 << bitInx); 152 | 153 | // index to next byte 154 | if (bitInx == 0) { 155 | bitInx = 7; 156 | ++byteInx; 157 | } else { 158 | --bitInx; 159 | } 160 | } 161 | portEXIT_CRITICAL(&mutex); 162 | 163 | // == get humidity from Data[0] and Data[1] ========================== 164 | humidity = (((unsigned)dhtData[0] << 8) | dhtData[1]); 165 | 166 | // == get temp from Data[2] and Data[3] 167 | temperature = ((((unsigned)dhtData[2] & 0x7F) << 8) | dhtData[3]); 168 | 169 | if (dhtData[2] & 0x80) // negative temp 170 | temperature = -temperature; 171 | 172 | ESP_LOGD(tag, "DHT Response = %d, %d, %02x %02x %02x %02x %02x", uSec1, uSec2, dhtData[0], dhtData[1], dhtData[2], dhtData[3], dhtData[4]); 173 | 174 | // == verify if checksum is ok =========================================== 175 | // Checksum is the sum of Data 8 bits masked out 0xFF 176 | 177 | if (dhtData[4] == ((dhtData[0] + dhtData[1] + dhtData[2] + dhtData[3]) & 0xFF)) 178 | return DHT_OK; 179 | else 180 | return DHT_CHECKSUM_ERROR; 181 | } 182 | -------------------------------------------------------------------------------- /main/dht.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | 5 | #define DHT_OK 0 6 | #define DHT_CHECKSUM_ERROR -1 7 | #define DHT_TIMEOUT_ERROR -2 8 | class DHT { 9 | public: 10 | DHT(const char* tag, gpio_num_t pin); 11 | bool errorHandler(int response); 12 | int readDHT(); 13 | int getHumidity() const { return humidity; } 14 | int getTemperature() const { return temperature; } 15 | 16 | private: 17 | char tag[12]; 18 | portMUX_TYPE mutex = portMUX_INITIALIZER_UNLOCKED; 19 | gpio_num_t dhtGpio; 20 | int humidity = 0; 21 | int temperature = 0; 22 | int waitForLevel(int usTimeOut, bool state); 23 | }; 24 | -------------------------------------------------------------------------------- /main/i2c.cpp: -------------------------------------------------------------------------------- 1 | #include "i2c.h" 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | #define I2C_CLOCK_HALF_US 10 9 | #define I2C_CLOCK_IDLE_US (I2C_CLOCK_HALF_US * 2) 10 | #define I2C_CLOCK_HOLD_US (I2C_CLOCK_HALF_US * 2) 11 | #define I2C_CLOCK_WAIT_MAX_US 100000 12 | 13 | BitbangI2C::BitbangI2C(gpio_num_t i2c_sda, gpio_num_t i2c_scl) 14 | : i2c_sda(i2c_sda), 15 | i2c_scl(i2c_scl) { 16 | gpio_config_t cfg { 17 | .pin_bit_mask = BIT64(i2c_sda) | BIT64(i2c_scl), 18 | .mode = GPIO_MODE_INPUT_OUTPUT_OD, 19 | .pull_up_en = GPIO_PULLUP_DISABLE, 20 | .pull_down_en = GPIO_PULLDOWN_DISABLE, 21 | .intr_type = GPIO_INTR_DISABLE, 22 | }; 23 | gpio_config(&cfg); 24 | gpio_set_level(i2c_sda, 1); 25 | gpio_set_level(i2c_scl, 1); 26 | vTaskDelay(10); 27 | } 28 | 29 | i2c_err_t IRAM_ATTR BitbangI2C::i2c_write(uint8_t addr, uint8_t data) { 30 | i2c_err_t res = i2c_start(); 31 | if (res != i2c_err_t::OK) { 32 | return res; 33 | } 34 | res = i2c_write_byte(addr << 1); 35 | if (res != i2c_err_t::OK) { 36 | i2c_stop(); 37 | return res == i2c_err_t::WRITE_NACK ? i2c_err_t::DEVICE_NACK : res; 38 | } 39 | res = i2c_write_byte(data); 40 | i2c_stop(); 41 | 42 | return res; 43 | } 44 | 45 | i2c_err_t IRAM_ATTR BitbangI2C::i2c_start() { 46 | // SDA 1 47 | gpio_set_level(i2c_sda, 1); 48 | // SCL 1 (wait) 49 | gpio_set_level(i2c_scl, 1); 50 | int idle_us = 0; 51 | for (int i = I2C_CLOCK_WAIT_MAX_US; i; --i) { 52 | if (gpio_get_level(i2c_scl)) { 53 | if (++idle_us >= I2C_CLOCK_IDLE_US) { 54 | break; 55 | } 56 | } else { 57 | idle_us = 0; 58 | } 59 | if (i == 1) { 60 | return i2c_err_t::START_TIMEOUT; 61 | } 62 | esp_rom_delay_us(1); 63 | } 64 | // SDA 0 65 | gpio_set_level(i2c_sda, 0); 66 | esp_rom_delay_us(I2C_CLOCK_HOLD_US); 67 | 68 | return i2c_err_t::OK; 69 | } 70 | 71 | void IRAM_ATTR BitbangI2C::i2c_stop() { 72 | // SCL 0 73 | gpio_set_level(i2c_scl, 0); 74 | esp_rom_delay_us(1); 75 | // SDA 0 76 | gpio_set_level(i2c_sda, 0); 77 | esp_rom_delay_us(I2C_CLOCK_HALF_US - 1); 78 | // SCL 1 79 | gpio_set_level(i2c_scl, 1); 80 | esp_rom_delay_us(I2C_CLOCK_HALF_US); 81 | // SDA 1 82 | gpio_set_level(i2c_sda, 1); 83 | esp_rom_delay_us(I2C_CLOCK_HALF_US); 84 | } 85 | 86 | i2c_err_t IRAM_ATTR BitbangI2C::i2c_write_byte(uint8_t data) { 87 | for (uint8_t mask = 0x80; mask; mask >>= 1) { 88 | // SCL 0 89 | gpio_set_level(i2c_scl, 0); 90 | esp_rom_delay_us(1); 91 | // SDA x 92 | gpio_set_level(i2c_sda, !!(data & mask)); 93 | esp_rom_delay_us(I2C_CLOCK_HALF_US - 1); 94 | // SCL 1 95 | gpio_set_level(i2c_scl, 1); 96 | esp_rom_delay_us(I2C_CLOCK_HALF_US); 97 | } 98 | gpio_set_level(i2c_scl, 0); 99 | esp_rom_delay_us(1); 100 | gpio_set_level(i2c_sda, 1); 101 | esp_rom_delay_us(I2C_CLOCK_HALF_US - 1); 102 | gpio_set_level(i2c_scl, 1); 103 | esp_rom_delay_us(I2C_CLOCK_HALF_US - 1); 104 | int res = gpio_get_level(i2c_sda); 105 | esp_rom_delay_us(1); 106 | 107 | return res ? i2c_err_t::WRITE_NACK : i2c_err_t::OK; 108 | } 109 | 110 | std::pair IRAM_ATTR BitbangI2C::i2c_read_byte(bool ack) { 111 | std::pair res {}; 112 | for (int i = 0; i < 8; ++i) { 113 | // SCL 0 114 | gpio_set_level(i2c_scl, 0); 115 | esp_rom_delay_us(1); 116 | // SDA 1 117 | gpio_set_level(i2c_sda, 1); 118 | esp_rom_delay_us(I2C_CLOCK_HALF_US - 1); 119 | // SCL 1 120 | gpio_set_level(i2c_scl, 1); 121 | esp_rom_delay_us(I2C_CLOCK_HALF_US / 2); 122 | // read SDA 123 | res.second = (res.second << 1) | gpio_get_level(i2c_sda); 124 | esp_rom_delay_us(I2C_CLOCK_HALF_US - I2C_CLOCK_HALF_US / 2); 125 | // esp_rom_delay_us(1); 126 | } 127 | // SCL 0 128 | gpio_set_level(i2c_scl, 0); 129 | esp_rom_delay_us(1); 130 | // SDA 1 131 | gpio_set_level(i2c_sda, !ack); 132 | esp_rom_delay_us(I2C_CLOCK_HALF_US - 1); 133 | // SCL 1 134 | gpio_set_level(i2c_scl, 1); 135 | esp_rom_delay_us(I2C_CLOCK_HALF_US / 2); 136 | // read SDA 137 | if (gpio_get_level(i2c_sda)) { 138 | res.first = i2c_err_t::READ_NACK; 139 | } 140 | esp_rom_delay_us(I2C_CLOCK_HALF_US - I2C_CLOCK_HALF_US / 2); 141 | 142 | return res; 143 | } 144 | 145 | i2c_err_t IRAM_ATTR BitbangI2C::i2c_read(uint8_t addr, uint8_t* buf, int len) { 146 | i2c_err_t res = i2c_start(); 147 | if (res != i2c_err_t::OK) { 148 | return res; 149 | } 150 | res = i2c_write_byte((addr << 1) | 1); 151 | if (res != i2c_err_t::OK) { 152 | i2c_stop(); 153 | return res == i2c_err_t::WRITE_NACK ? i2c_err_t::DEVICE_NACK : res; 154 | } 155 | uint8_t* p = buf; 156 | for (int i = len; i; --i) { 157 | auto b = i2c_read_byte(i > 1); 158 | *p++ = b.second; 159 | } 160 | i2c_stop(); 161 | 162 | return res; 163 | } 164 | -------------------------------------------------------------------------------- /main/i2c.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | #include 5 | 6 | enum class i2c_err_t { 7 | OK = 0, 8 | START_TIMEOUT = -1, 9 | DEVICE_NACK = -2, 10 | WRITE_NACK = -3, 11 | READ_NACK = -4, 12 | CRC_ERROR = -5, 13 | }; 14 | 15 | class BitbangI2C { 16 | public: 17 | BitbangI2C(gpio_num_t i2c_sda, gpio_num_t i2c_scl); 18 | i2c_err_t i2c_write(uint8_t addr, uint8_t data); 19 | i2c_err_t i2c_start(); 20 | void i2c_stop(); 21 | i2c_err_t i2c_write_byte(uint8_t data); 22 | std::pair i2c_read_byte(bool ack); 23 | i2c_err_t i2c_read(uint8_t addr, uint8_t* buf, int len); 24 | protected: 25 | portMUX_TYPE mutex = portMUX_INITIALIZER_UNLOCKED; 26 | gpio_num_t i2c_sda; 27 | gpio_num_t i2c_scl; 28 | }; 29 | -------------------------------------------------------------------------------- /main/i2c_master.cpp: -------------------------------------------------------------------------------- 1 | #include "i2c_master.h" 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | static const char* TAG = "i2c-master"; 11 | 12 | void i2c_master_init() { 13 | i2c_config_t conf {}; 14 | conf.mode = I2C_MODE_MASTER; 15 | conf.sda_io_num = I2C_MASTER_SDA_IO; 16 | conf.scl_io_num = I2C_MASTER_SCL_IO; 17 | conf.sda_pullup_en = I2C_MASTER_SDA_PULLUP; 18 | conf.scl_pullup_en = I2C_MASTER_SCL_PULLUP; 19 | conf.master.clk_speed = I2C_MASTER_FREQ_HZ; 20 | 21 | i2c_param_config(I2C_MASTER_NUM, &conf); 22 | i2c_driver_install(I2C_MASTER_NUM, conf.mode, 0, 0, 0); 23 | ESP_LOGI(TAG, "Master pin assignment: SCL=%d, SDA=%d", I2C_MASTER_SCL_IO, I2C_MASTER_SDA_IO); 24 | } 25 | 26 | esp_err_t i2c_master_send(char* buf, uint32_t len) { 27 | esp_err_t rc; 28 | for (uint32_t i = 0; i < 5; ++i) { 29 | i2c_cmd_handle_t link = i2c_cmd_link_create(); 30 | i2c_master_start(link); 31 | i2c_master_write(link, (uint8_t*)buf, len, true); 32 | i2c_master_stop(link); 33 | rc = i2c_master_cmd_begin(I2C_MASTER_NUM, link, 25); 34 | i2c_cmd_link_delete(link); 35 | if (!rc) 36 | break; 37 | vTaskDelay(1); 38 | } 39 | return rc; 40 | } 41 | -------------------------------------------------------------------------------- /main/i2c_master.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | #define I2C_MASTER_SDA_IO GPIO_NUM_27 5 | #define I2C_MASTER_SCL_IO GPIO_NUM_26 6 | #define I2C_MASTER_SDA_PULLUP true 7 | #define I2C_MASTER_SCL_PULLUP true 8 | #define I2C_MASTER_NUM I2C_NUM_0 9 | #define I2C_MASTER_FREQ_HZ 100000 10 | 11 | void i2c_master_init(); 12 | esp_err_t i2c_master_send(char* buf, uint32_t len); 13 | -------------------------------------------------------------------------------- /main/i2c_slave.cpp: -------------------------------------------------------------------------------- 1 | #include "i2c_slave.h" 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | 11 | static const char* TAG = "i2c-slave"; 12 | 13 | static i2c_slave_callback_t i2c_callback; 14 | static uint8_t buf[I2C_SLAVE_RX_BUF_LEN]; 15 | static size_t buflen; 16 | 17 | static void i2c_slave_task(void* arg) { 18 | while (1) { 19 | buf[0] = I2C_SLAVE_ADDRESS << 1; 20 | buflen = 1; 21 | while (1) { 22 | int len1 = i2c_slave_read_buffer(I2C_SLAVE_NUM, buf + buflen, sizeof(buf) - buflen, 10); 23 | if (len1 <= 0) 24 | break; 25 | buflen += len1; 26 | } 27 | if (buflen > 1) { 28 | i2c_callback(buf, buflen); 29 | } 30 | } 31 | } 32 | 33 | void i2c_slave_init(i2c_slave_callback_t cb) { 34 | i2c_config_t conf {}; 35 | conf.mode = I2C_MODE_SLAVE; 36 | conf.sda_io_num = I2C_SLAVE_SDA_IO; 37 | conf.scl_io_num =I2C_SLAVE_SCL_IO; 38 | conf.sda_pullup_en = I2C_SLAVE_SDA_PULLUP; 39 | conf.scl_pullup_en = I2C_SLAVE_SCL_PULLUP; 40 | conf.slave.slave_addr = I2C_SLAVE_ADDRESS; 41 | 42 | i2c_param_config(I2C_SLAVE_NUM, &conf); 43 | i2c_callback = cb; 44 | i2c_driver_install(I2C_SLAVE_NUM, conf.mode, I2C_SLAVE_RX_BUF_LEN, 0, 0); 45 | ESP_LOGI(TAG, "Slave pin assignment: SCL=%d, SDA=%d", I2C_SLAVE_SCL_IO, I2C_SLAVE_SDA_IO); 46 | ESP_LOGI(TAG, "Slave address: %02X (W)", I2C_SLAVE_ADDRESS << 1); 47 | xTaskCreatePinnedToCore(i2c_slave_task, "i2c_task", 4096, NULL, 22, NULL, 0); 48 | } 49 | -------------------------------------------------------------------------------- /main/i2c_slave.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | #define I2C_SLAVE_SDA_IO GPIO_NUM_14 5 | #define I2C_SLAVE_SCL_IO GPIO_NUM_33 6 | #define I2C_SLAVE_SDA_PULLUP true 7 | #define I2C_SLAVE_SCL_PULLUP true 8 | #define I2C_SLAVE_NUM I2C_NUM_1 9 | #define I2C_SLAVE_RX_BUF_LEN 512 10 | #define I2C_SLAVE_ADDRESS 0x40 11 | 12 | typedef void (*i2c_slave_callback_t)(const uint8_t* data, size_t len); 13 | 14 | void i2c_slave_init(i2c_slave_callback_t cb); 15 | -------------------------------------------------------------------------------- /main/i2c_sniffer.cpp: -------------------------------------------------------------------------------- 1 | #include "i2c_sniffer.h" 2 | #include // ESP32 GPIO 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | 11 | static const char* TAG = "i2c-sniffer"; 12 | 13 | typedef enum { ACK = 0x100, START = 0x200, STOP = 0x400 } state_t; 14 | typedef uint16_t gpdata_t; 15 | static QueueHandle_t gpio_evt_queue; 16 | #define pin_(pin) GPIO_NUM_##pin 17 | #define PIN(pin) pin_(pin) 18 | #if I2C_SNIFFER_SCL_PIN < 32 && I2C_SNIFFER_SDA_PIN < 32 19 | #define SCL (1 << I2C_SNIFFER_SCL_PIN) 20 | #define SDA (1 << I2C_SNIFFER_SDA_PIN) 21 | #define GPIO_in GPIO.in 22 | #elif I2C_SNIFFER_SCL_PIN >= 32 && I2C_SNIFFER_SDA_PIN >= 32 23 | #define SCL (1 << (I2C_SNIFFER_SCL_PIN - 32)) 24 | #define SDA (1 << (I2C_SNIFFER_SDA_PIN - 32)) 25 | #define GPIO_in GPIO.in1.data 26 | #else 27 | #error I2C_SNIFFER_SCL_PIN and I2C_SNIFFER_SDA_PIN must be together < 32 or >= 32 28 | #endif 29 | static uint32_t last = SCL | SDA; 30 | static uint32_t cur; 31 | static uint32_t bits; 32 | static uint32_t state; 33 | static uint32_t tm1, tm2, tm; 34 | 35 | static inline IRAM_ATTR void enable_sda_intr(bool en) { 36 | // gpio_set_intr_type() is not IRAM, i.e. too slow 37 | GPIO.pin[I2C_SNIFFER_SDA_PIN].int_type = en ? GPIO_INTR_ANYEDGE : GPIO_INTR_DISABLE; 38 | } 39 | 40 | static inline IRAM_ATTR uint32_t read_sda_scl_pins() { 41 | // gpio_get_level() is not IRAM, i.e. too slow 42 | return GPIO_in & (SCL | SDA); 43 | } 44 | 45 | // SCL=1, SDA 1>0 = Start 46 | // SCL=1, SDA 0>1 = End 47 | // SCL 0>1, SDA = data 48 | static void IRAM_ATTR gpio_sda_handler(void* arg) { 49 | uint32_t st = read_sda_scl_pins(); 50 | if (last == (SCL | SDA) && st == SCL) { 51 | enable_sda_intr(false); 52 | state = START; 53 | cur = bits = 0; 54 | tm1 = tm2 = esp_timer_get_time(); 55 | do { 56 | last = st; 57 | st = read_sda_scl_pins(); 58 | tm = esp_timer_get_time(); 59 | if (last == SCL && st == (SCL | SDA)) { 60 | state = STOP | ((tm - tm1) << 16); 61 | xQueueSendFromISR(gpio_evt_queue, &state, NULL); 62 | break; 63 | } else if ((st & SCL) && !(last & SCL)) { 64 | if (++bits < 9) 65 | cur = (cur << 1) | !!(st & SDA); 66 | else { 67 | cur |= state | ((st & SDA) ? 0 : ACK) | ((tm - tm2) << 16); 68 | xQueueSendFromISR(gpio_evt_queue, &cur, NULL); 69 | state = bits = cur = 0; 70 | tm2 = tm; 71 | } 72 | } 73 | } while (tm - tm1 < 14900); 74 | enable_sda_intr(true); 75 | } 76 | last = st; 77 | } 78 | 79 | static void sniffer_task(void* arg) { 80 | uint32_t x; 81 | uint32_t flag = 0; 82 | uint32_t tm1 = esp_timer_get_time(), tm; 83 | 84 | gpio_evt_queue = xQueueCreate(256, sizeof(uint32_t)); 85 | gpio_install_isr_service(ESP_INTR_FLAG_LEVEL3); 86 | gpio_config_t config = {BIT64(I2C_SNIFFER_SCL_PIN) | BIT64(I2C_SNIFFER_SDA_PIN), GPIO_MODE_INPUT, GPIO_PULLUP_DISABLE, GPIO_PULLDOWN_DISABLE, 87 | GPIO_INTR_DISABLE}; 88 | gpio_config(&config); 89 | gpio_isr_handler_add(PIN(I2C_SNIFFER_SDA_PIN), gpio_sda_handler, (void*)I2C_SNIFFER_SDA_PIN); 90 | ESP_LOGI(TAG, "Sniffer pin assignment: SCL=%d, SDA=%d, sniffer %s", I2C_SNIFFER_SCL_PIN, I2C_SNIFFER_SDA_PIN, arg ? "ON" : "OFF"); 91 | enable_sda_intr(!!arg); 92 | 93 | for (;;) { 94 | if (xQueueReceive(gpio_evt_queue, &x, portMAX_DELAY)) { 95 | tm = esp_timer_get_time(); 96 | if (flag && (tm - tm1) > 200000) 97 | printf("\n\n"); 98 | tm1 = tm; 99 | flag = 1; 100 | if (x & START) { 101 | printf("["); 102 | } 103 | if (x & STOP) { 104 | #if I2C_SNIFFER_PRINT_TIMING 105 | printf("]/%d\n", (x >> 16)); 106 | #else 107 | printf("]\n"); 108 | #endif 109 | } else { 110 | #if I2C_SNIFFER_PRINT_TIMING 111 | printf("%02lX/%d%c", (x & 0xFF), (x >> 16), (x & ACK ? '+' : '-')); 112 | #else 113 | printf("%02lX%c", (x & 0xFF), (x & ACK ? '+' : '-')); 114 | #endif 115 | } 116 | } 117 | } 118 | } 119 | 120 | void i2c_sniffer_init(bool enabled) { 121 | xTaskCreatePinnedToCore(sniffer_task, "sniffer_task", 4096, (void*)enabled, 17, NULL, I2C_SNIFFER_RUN_ON_CORE); 122 | } 123 | 124 | void i2c_sniffer_enable() { enable_sda_intr(true); } 125 | 126 | void i2c_sniffer_disable() { 127 | enable_sda_intr(false); 128 | vTaskDelay(1); 129 | enable_sda_intr(false); 130 | } 131 | 132 | void i2c_sniffer_pullup(bool enable) { 133 | if (enable) { 134 | gpio_pullup_en(PIN(I2C_SNIFFER_SCL_PIN)); 135 | gpio_pullup_en(PIN(I2C_SNIFFER_SDA_PIN)); 136 | } else { 137 | gpio_pullup_dis(PIN(I2C_SNIFFER_SCL_PIN)); 138 | gpio_pullup_dis(PIN(I2C_SNIFFER_SDA_PIN)); 139 | } 140 | } 141 | -------------------------------------------------------------------------------- /main/i2c_sniffer.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | #define I2C_SNIFFER_SDA_PIN 13 5 | #define I2C_SNIFFER_SCL_PIN 25 6 | #define I2C_SNIFFER_RUN_ON_CORE 1 7 | #define I2C_SNIFFER_PRINT_TIMING 0 8 | 9 | void i2c_sniffer_init(bool enabled); 10 | void i2c_sniffer_enable(); 11 | void i2c_sniffer_disable(); 12 | void i2c_sniffer_pullup(bool enable); 13 | -------------------------------------------------------------------------------- /main/main.cpp: -------------------------------------------------------------------------------- 1 | #include "Config.h" 2 | #include "Nvs.h" 3 | #include "console.h" 4 | #include "dht.h" 5 | #include "sht4x.h" 6 | #include "i2c_master.h" 7 | #include "i2c_slave.h" 8 | #include "i2c_sniffer.h" 9 | #include "mqtt.h" 10 | #include "util.h" 11 | #include "wifi.h" 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | 23 | static const char* TAG = "main"; 24 | 25 | static char cmd[128]; 26 | static uint8_t buf[128]; 27 | static uint32_t cmdlen = 0; 28 | static struct { 29 | int ret = -1, hum = -1, temp = -1; 30 | } dht_ret[max_sensors]; 31 | static bool verbose = false, reportHex = false; 32 | 33 | Nvs nvs; 34 | Config config; 35 | 36 | bool sendBytes(const uint8_t* buf, size_t len) { 37 | if (len) { 38 | esp_err_t rc = i2c_master_send((char*)buf, len); 39 | if (rc || verbose) { 40 | printf("Master send: %d\n", rc); 41 | } 42 | return rc == ESP_OK; 43 | } 44 | return false; 45 | } 46 | 47 | bool sendBytesHex(const char* hex, size_t hexlen) { 48 | size_t len = parseHexStr(hex, hexlen, buf, sizeof(buf)); 49 | return sendBytes(buf, len); 50 | } 51 | 52 | static void publishHumidity() { 53 | char buf[20 * max_sensors]; 54 | int len = 0; 55 | for (int i = 0; i < max_sensors; i++) { 56 | auto& ret = dht_ret[i]; 57 | len += snprintf(buf + len, sizeof(buf) - len, "%c%d.%d,%d.%d,%d", len ? ',' : '[', ret.hum / 10, ret.hum % 10, ret.temp / 10, ret.temp % 10, 58 | ret.ret); 59 | } 60 | strncpy(buf + len, "]", sizeof(buf) - 1); 61 | mqtt_publish("esp-data-dht", buf); 62 | } 63 | 64 | static uint8_t set1[]{0x82, 0x60, 0xC1, 0x01, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 65 | 0xFF, 0xFF, 0x00, 0x22, 0xF1, 0x03, 0x00, 0x02, 0x04, 0x00, 0x00, 0xCC}; 66 | static uint8_t set2[]{0x82, 0x60, 0xC1, 0x01, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 67 | 0xFF, 0xFF, 0x00, 0x22, 0xF1, 0x03, 0x00, 0x03, 0x04, 0x00, 0x00, 0xCC}; 68 | static uint8_t set3[]{0x82, 0x60, 0xC1, 0x01, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 69 | 0xFF, 0xFF, 0x00, 0x22, 0xF3, 0x03, 0x00, 0x00, 0x1E, 0x00, 0x00, 0xCC}; 70 | 71 | static void initRFTKey(uint32_t rftKey) { 72 | memcpy(set1 + 10, &rftKey, 4); 73 | fixChecksum(set1, sizeof(set1)); 74 | memcpy(set2 + 10, &rftKey, 4); 75 | fixChecksum(set2, sizeof(set2)); 76 | memcpy(set3 + 10, &rftKey, 4); 77 | fixChecksum(set3, sizeof(set3)); 78 | } 79 | 80 | static int64_t lastSetTime; 81 | 82 | static void processCommand(const char* data, int data_len) { 83 | if (strncmp("set1", data, data_len) == 0) { 84 | lastSetTime = std::max(lastSetTime, esp_timer_get_time()) + 3600 * 1000000LL; 85 | sendBytes(set1, sizeof(set1)); 86 | } else if (strncmp("set2", data, data_len) == 0) { 87 | sendBytes(set2, sizeof(set2)); 88 | } else if (strncmp("set3", data, data_len) == 0) { // 30min 89 | sendBytes(set3, sizeof(set3)); 90 | } 91 | // } else if (strncmp("sniff0", data, data_len) == 0) { 92 | // i2c_sniffer_disable(); 93 | // reportHex = false; 94 | // mqtt_publish("esp-data", "sniffer off"); 95 | // } else if (strncmp("sniff1", data, data_len) == 0) { 96 | // i2c_sniffer_enable(); 97 | // reportHex = true; 98 | // mqtt_publish("esp-data", "sniffer on"); 99 | // } else if (strncmp("rftkey", data, 6) == 0) { 100 | // unsigned i = 6; 101 | // while (data[i] == ' ') 102 | // i++; 103 | // if (i < data_len) { 104 | // uint32_t key = 0; 105 | // parseHexStr(data + i, data_len - i, (uint8_t*)&key, 4); 106 | // if (key) { 107 | // config.rftKey = key; 108 | // initRFTKey(config.rftKey); 109 | // if (!config.Write()) { 110 | // ESP_LOGE(TAG, "Config write failed"); 111 | // } 112 | // } 113 | // } 114 | // std::string s = "rftkey="; 115 | // s += toHexStr((uint8_t*)&config.rftKey, 4); 116 | // mqtt_publish("esp-data", s.c_str()); 117 | else if (strncmp("high_hum_threshold", data, 18) == 0) { 118 | unsigned i = 18; 119 | while (data[i] == ' ') 120 | i++; 121 | if (i < data_len) { 122 | std::string hum_str(data + i, data + data_len); 123 | int hum = atoi(hum_str.c_str()); 124 | if (hum < 100 || hum > 1000) { 125 | std::string buf = "invalid parameter value " + hum_str; 126 | ESP_LOGE(TAG, "%s", buf.c_str()); 127 | mqtt_publish("esp-data-dht", buf.c_str()); 128 | return; 129 | } 130 | config.high_hum_threshold = Config::normalize_high_hum_threshold(hum); 131 | if (!config.Write()) { 132 | ESP_LOGE(TAG, "Config write failed"); 133 | } 134 | } 135 | int hum1 = config.high_hum_threshold / 10, hum2 = config.high_hum_threshold % 10; 136 | std::string buf = "high_hum_threshold=" + std::to_string(hum1) + '.' + std::to_string(hum2); 137 | ESP_LOGI(TAG, "%s", buf.c_str()); 138 | mqtt_publish("esp-data-dht", buf.c_str()); 139 | } else if (strncmp("hum", data, data_len) == 0) { 140 | publishHumidity(); 141 | } else if (isHex(data[0])) { 142 | sendBytesHex(data, data_len); 143 | } else { 144 | ESP_LOGE(TAG, "Unknown command '%s'", std::string(data, data + data_len).c_str()); 145 | } 146 | } 147 | 148 | static const int mode_set_max_freq_sec = 600; // set mode at most once every 10 min 149 | static int prev_hum; 150 | 151 | static void handleHumidity() { 152 | int hum = 0; 153 | for (int i = 0; i < max_sensors; i++ ) { 154 | hum = std::max(hum, dht_ret[i].hum); 155 | } 156 | if (hum >= config.high_hum_threshold && prev_hum >= config.high_hum_threshold) { 157 | int64_t now = esp_timer_get_time(); 158 | if (now - lastSetTime >= mode_set_max_freq_sec * 1000000) { 159 | ESP_LOGI(TAG, "High humidity, setting mode 3"); 160 | processCommand("set3", 4); 161 | } 162 | } 163 | prev_hum = hum; 164 | } 165 | 166 | static void processConsoleCommand() { 167 | if (strcmp(cmd, "p") == 0) { 168 | i2c_sniffer_pullup(false); 169 | printf("Pullup OFF\n"); 170 | } else if (strcmp(cmd, "P") == 0) { 171 | i2c_sniffer_pullup(true); 172 | printf("Pullup ON\n"); 173 | } else if (strcmp(cmd, "s") == 0) { 174 | i2c_sniffer_disable(); 175 | printf("Sniffer OFF\n"); 176 | } else if (strcmp(cmd, "S") == 0) { 177 | i2c_sniffer_enable(); 178 | printf("Sniffer ON\n"); 179 | } else if (strcmp(cmd, "h") == 0) { 180 | reportHex = false; 181 | printf("esp-data-hex reporting OFF\n"); 182 | } else if (strcmp(cmd, "H") == 0) { 183 | reportHex = true; 184 | printf("esp-data-hex reporting ON\n"); 185 | } else if (strcmp(cmd, "r") == 0) { 186 | printf("Restarting\n"); 187 | vTaskDelay(configTICK_RATE_HZ / 4); 188 | esp_restart(); 189 | } else if (strcmp("config", cmd) == 0) { 190 | if (config.Reconfigure()) { 191 | i2c_sniffer_enable(); 192 | printf("Sniffer is ON.\n" 193 | "Press any key on the RFT device, watching for a message that looks like:\n" 194 | "82 60 C1 01 01 11 .. .. .. .. xx xx xx xx .. .. .. .. .. .. .. .. .. ..\n" 195 | "The RFT ID will be the values xx xx xx xx.\n" 196 | "Write those down, then turn off the sniffer with the 's' command.\n"); 197 | } 198 | } else { 199 | processCommand(cmd, strlen(cmd)); 200 | } 201 | } 202 | 203 | portMUX_TYPE status_mux = portMUX_INITIALIZER_UNLOCKED; 204 | std::string datatypes; 205 | 206 | static void requestStatus() { 207 | for (int i = 0; i < 3; ++i) { 208 | portENTER_CRITICAL(&status_mux); 209 | bool haveDatatypes = !datatypes.empty(); 210 | portEXIT_CRITICAL(&status_mux); 211 | if (haveDatatypes) 212 | break; 213 | sendBytesHex("82 80 A4 00 04 00 56", 20); 214 | vTaskDelay(configTICK_RATE_HZ / 5); 215 | } 216 | if (datatypes.empty()) { 217 | ESP_LOGW(TAG, "Unable to fetch data types"); 218 | } 219 | sendBytesHex("82 80 A4 01 04 00 55", 20); 220 | } 221 | 222 | static void requestStatusTask(void* arg) { 223 | requestStatus(); 224 | vTaskDelete(nullptr); 225 | } 226 | 227 | static void requestStatusLoopTask(void* arg) { 228 | for (;;) { 229 | vTaskDelay(5 * configTICK_RATE_HZ); 230 | if (mqtt_is_connected()) { 231 | requestStatus(); 232 | } 233 | } 234 | vTaskDelete(nullptr); 235 | } 236 | 237 | /* 238 | Data format (1 byte): 239 | bit 7: signed / unsigned 240 | bits 6..4: size (2^n): 0=1, 1=2, 2=4 241 | bits 3..0: decimal digits (divider 10^n) 242 | */ 243 | void handleStatus(const uint8_t* data, size_t len) { 244 | std::string s; 245 | char buf[64]; 246 | s.reserve(4 * len + 4); 247 | s = "["; 248 | size_t i = 0; 249 | for (uint8_t dt : datatypes) { 250 | if (i >= len) 251 | break; 252 | if (s.length() > 1) 253 | s += ','; 254 | int32_t x = (dt & 0x80) ? (int8_t)data[i++] : data[i++]; 255 | for (int j = (1 << ((dt >> 4) & 3)); j > 1; --j) { 256 | x = (x << 8) | data[i++]; 257 | } 258 | int rem = dt & 7; 259 | snprintf(buf, sizeof(buf), "%0*ld", (int)(rem + 1 + (x < 0)), (long int)x); 260 | size_t len = strlen(buf); 261 | s.append(buf, len - rem); 262 | if (rem) { 263 | s += '.'; 264 | s.append(buf + len - rem, rem); 265 | } 266 | } 267 | for (int i = 0; i < max_sensors; i++) { 268 | if (!config.sensors[i].type) { 269 | continue; 270 | } 271 | auto& ret = dht_ret[i]; 272 | snprintf(buf, sizeof(buf), ",%d.%d,%d.%d,%d", ret.hum / 10, ret.hum % 10, ret.temp / 10, ret.temp % 10, ret.ret); 273 | s += buf; 274 | } 275 | s += "]"; 276 | mqtt_publish_bin("esp-data", s.c_str(), s.length()); 277 | } 278 | 279 | inline bool checksumOk(const uint8_t* data, size_t len) { return checksum(data, len - 1) == data[len - 1]; } 280 | 281 | void i2c_slave_callback(const uint8_t* data, size_t len) { 282 | std::string s = toHexStr(data, len); 283 | if (len > 6 && data[1] == 0x82 && data[2] == 0xA4 && data[3] == 0 && data[4] == 1 && data[5] < len - 5 && checksumOk(data, len)) { 284 | portENTER_CRITICAL(&status_mux); 285 | datatypes.assign((const char*)data + 6, data[5]); 286 | portEXIT_CRITICAL(&status_mux); 287 | } 288 | if (len > 6 && data[1] == 0x82 && data[2] == 0xa4 && data[3] == 1 && data[4] == 1 && data[5] < len - 5 && checksumOk(data, len)) { 289 | handleStatus(data + 6, len - 7); 290 | } 291 | if (reportHex) { 292 | mqtt_publish_bin("esp-data-hex", s.c_str(), s.length()); 293 | } 294 | if (verbose) { 295 | printf("Slave: %s\n", s.c_str()); 296 | } 297 | } 298 | 299 | static void processMqttCommand(const char* data, int data_len) { 300 | if (strncmp("status", data, data_len) == 0) { 301 | xTaskCreate(requestStatusTask, "requestStatusTask", 4096, NULL, 6, NULL); 302 | } else if (strncmp("ping", data, data_len) == 0) { 303 | mqtt_publish("esp-data", "pong"); 304 | } else { 305 | processCommand(data, data_len); 306 | } 307 | } 308 | 309 | static void mqtt_message_callback(const char* topic, int topic_len, const char* data, int data_len) { 310 | processMqttCommand(data, data_len); 311 | // ESP_LOGD(TAG, "mqtt_callback '%.*s' '%.*s'", topic_len, topic, data_len, data); 312 | } 313 | 314 | static void mqtt_connect_callback() { mqtt_subscribe("esp", mqtt_message_callback); } 315 | 316 | static void dht_task(void* arg) { 317 | int id = (int)arg; 318 | DHT dht(("DHT" + std::to_string(id + 1)).c_str(), (gpio_num_t)config.sensors[id].sda); 319 | int errors = 1; 320 | auto& ret = dht_ret[id]; 321 | while (1) { 322 | vTaskDelay(5 * configTICK_RATE_HZ); // wait at least 2 sec before reading again 323 | ret.ret = dht.readDHT(); 324 | if (!dht.errorHandler(ret.ret)) { 325 | if (errors && ++errors > 3) { 326 | ESP_LOGI(TAG, "Stopping DHT[%d] task", id + 1); 327 | break; 328 | } 329 | continue; 330 | } 331 | errors = 0; 332 | ret.hum = dht.getHumidity(); 333 | ret.temp = dht.getTemperature(); 334 | ESP_LOGI(TAG, "DHT[%d] Humidity %d.%d, Temp %d.%d", id + 1, ret.hum / 10, ret.hum % 10, ret.temp / 10, ret.temp % 10); 335 | handleHumidity(); 336 | } 337 | vTaskDelete(nullptr); 338 | } 339 | 340 | static void sht4x_task(void* arg) { 341 | int id = (int)arg; 342 | SHT4x sht(("SHT" + std::to_string(id + 1)).c_str(), (gpio_num_t)config.sensors[id].sda, (gpio_num_t)config.sensors[id].scl); 343 | int errors = 1; 344 | i2c_err_t res = sht.readSerial(); 345 | sht.errorHandler(res); 346 | ESP_LOGI(TAG, "SHT4x[%d] serial: %" PRIu32, id + 1, sht.getSerial()); 347 | auto& ret = dht_ret[id]; 348 | while (1) { 349 | vTaskDelay(5 * configTICK_RATE_HZ); 350 | i2c_err_t res = sht.measure(); 351 | ret.ret = (int)res; 352 | if (!sht.errorHandler(res)) { 353 | if (errors && ++errors > 3) { 354 | ESP_LOGI(TAG, "Stopping SHT4x[%d] task", id + 1); 355 | break; 356 | } 357 | continue; 358 | } 359 | errors = 0; 360 | ret.hum = sht.getHumidity(); 361 | ret.temp = sht.getTemperature(); 362 | ESP_LOGI(TAG, "SHT4x[%d] Humidity %d.%d, Temp %d.%d", id + 1, ret.hum / 10, ret.hum % 10, ret.temp / 10, ret.temp % 10); 363 | handleHumidity(); 364 | } 365 | vTaskDelete(nullptr); 366 | } 367 | 368 | extern "C" void app_main() { 369 | setvbuf(stdout, NULL, _IONBF, 0); 370 | uart_driver_install(UART_NUM_0, 512, 512, 32, NULL, ESP_INTR_FLAG_LEVEL1); 371 | // esp_log_level_set("*", ESP_LOG_INFO); 372 | // esp_log_level_set("SHT4x", ESP_LOG_DEBUG); 373 | nvs.Init(); 374 | config.Read(); 375 | initRFTKey(config.rftKey); 376 | i2c_sniffer_init(false); 377 | i2c_master_init(); 378 | i2c_slave_init(&i2c_slave_callback); 379 | wifi_init(); 380 | mqtt_init(); 381 | mqtt_on_connect(&mqtt_connect_callback); 382 | for (int i = 0; i < config.sensors.size(); i++) { 383 | switch (config.sensors[i].type) { 384 | case SensorTypeDHT: 385 | xTaskCreatePinnedToCore(&dht_task, ("dht_task" + std::to_string(i)).c_str(), 4096, (void*)i, 7, NULL, 0); 386 | break; 387 | case SensorTypeSHT4x: 388 | xTaskCreatePinnedToCore(&sht4x_task, ("sht4x_task" + std::to_string(i)).c_str(), 4096, (void*)i, 7, NULL, 0); 389 | break; 390 | } 391 | } 392 | xTaskCreatePinnedToCore(requestStatusLoopTask, "statusLoopTask", 4096, NULL, 8, NULL, 1); 393 | 394 | printf("Press Enter to start console\n"); 395 | while (1) { 396 | int len = uart_read_bytes(UART_NUM_0, (uint8_t*)buf, 1, configTICK_RATE_HZ / 5); 397 | if (len > 0 && *buf == '\r') { 398 | break; 399 | } 400 | } 401 | printf("\nConsole started\n"); 402 | verbose = true; 403 | while (1) { 404 | int len = uart_read_bytes(UART_NUM_0, (uint8_t*)buf, sizeof(buf), 2); 405 | if (len > 0) { 406 | for (int i = 0; i < len; ++i) { 407 | if (buf[i] == '\r') 408 | buf[i] = '\n'; 409 | } 410 | // uart_write_bytes(UART_NUM_0, buf, len); 411 | printf("%.*s", len, buf); 412 | if (buf[0] == '\n') 413 | printf("\n"); 414 | for (int i = 0; i < len; ++i) { 415 | if (buf[i] == '\n' || buf[i] == '\r') { 416 | // if (buf[i] == '\n') 417 | // printf("\n"); 418 | cmd[cmdlen] = 0; 419 | if (cmdlen) 420 | processConsoleCommand(); 421 | cmdlen = 0; 422 | } else { 423 | cmd[cmdlen++] = buf[i]; 424 | if (cmdlen == sizeof(cmd)) { 425 | printf("Command too long\n"); 426 | cmdlen = 0; 427 | break; 428 | } 429 | } 430 | } 431 | } 432 | } 433 | } 434 | -------------------------------------------------------------------------------- /main/mqtt.cpp: -------------------------------------------------------------------------------- 1 | #include "mqtt.h" 2 | #include "wifi.h" 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | 19 | static const char* TAG = "MQTT"; 20 | mqtt_config_t mqtt_config; 21 | static esp_mqtt_client_handle_t mqttClient; 22 | static EventGroupHandle_t mqtt_event_group; 23 | const int MQTT_CONNECTED_BIT = BIT1; 24 | static mqtt_callback_t mqttCallback; 25 | #define MAX_MQTT_CALLBACKS 2 26 | static mqtt_connect_callback_t mqtt_connect_callbacks[MAX_MQTT_CALLBACKS]; 27 | 28 | static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) { 29 | // int msg_id; 30 | esp_mqtt_event_handle_t event = (esp_mqtt_event_handle_t)event_data; 31 | switch ((esp_mqtt_event_id_t)event_id) { 32 | case MQTT_EVENT_CONNECTED: 33 | xEventGroupSetBits(mqtt_event_group, MQTT_CONNECTED_BIT); 34 | for (int i = 0; i < MAX_MQTT_CALLBACKS; ++i) { 35 | if (!mqtt_connect_callbacks[i]) 36 | break; 37 | mqtt_connect_callbacks[i](); 38 | } 39 | // ESP_LOGI(TAG, "Connected"); 40 | // msg_id = esp_mqtt_client_subscribe(mqttClient, mUfo.GetConfig().msMqttTopic.c_str(), mUfo.GetConfig().muMqttQos); 41 | // ESP_LOGI(TAG, "Connected, subscribing to %s, msg_id=%d", mUfo.GetConfig().msMqttTopic.c_str(), msg_id); 42 | break; 43 | case MQTT_EVENT_DISCONNECTED: 44 | xEventGroupClearBits(mqtt_event_group, MQTT_CONNECTED_BIT); 45 | ESP_LOGI(TAG, "Disconnected"); 46 | break; 47 | case MQTT_EVENT_SUBSCRIBED: 48 | ESP_LOGI(TAG, "Subscribed, msg_id=%d", event->msg_id); 49 | // msg_id = esp_mqtt_client_publish(client, mUfo.GetConfig().msMqttTopic, "ping", 0, 0, 0); 50 | // ESP_LOGI(LOGTAG, "sent publish successful, msg_id=%d", msg_id); 51 | break; 52 | case MQTT_EVENT_PUBLISHED: 53 | break; 54 | case MQTT_EVENT_UNSUBSCRIBED: 55 | break; 56 | case MQTT_EVENT_DATA: 57 | ESP_LOGI(TAG, "Message received: '%.*s'", event->data_len, event->data); 58 | if (mqttCallback) { 59 | mqttCallback(event->topic, event->topic_len, event->data, event->data_len); 60 | } 61 | // HandleMessage(String(event->data, event->data_len)); 62 | // printf("TOPIC=%.*s\r\n", event->topic_len, event->topic); 63 | // printf("DATA=%.*s\r\n", event->data_len, event->data); 64 | break; 65 | case MQTT_EVENT_ERROR: 66 | ESP_LOGE(TAG, "MQTT_EVENT_ERROR"); 67 | break; 68 | default: 69 | break; 70 | } 71 | } 72 | 73 | bool mqtt_wait_for_connection(TickType_t delay) { 74 | return !!(xEventGroupWaitBits(mqtt_event_group, MQTT_CONNECTED_BIT, false, true, delay) & MQTT_CONNECTED_BIT); 75 | } 76 | 77 | bool mqtt_is_connected() { return !!(xEventGroupGetBits(mqtt_event_group) & MQTT_CONNECTED_BIT); } 78 | 79 | void mqtt_on_connect(mqtt_connect_callback_t cb) { 80 | for (int i = 0; i < MAX_MQTT_CALLBACKS; ++i) { 81 | if (!mqtt_connect_callbacks[i]) { 82 | mqtt_connect_callbacks[i] = cb; 83 | return; 84 | } 85 | } 86 | ESP_LOGE(TAG, "mqtt_on_connect: too many callbacks"); 87 | } 88 | 89 | static void mqtt_init_task(void* pvParameter) { 90 | ESP_LOGI(TAG, "Waiting for connection"); 91 | wifi_wait_for_connection(portMAX_DELAY); 92 | const char* uri = strchr(mqtt_config.broker.address.uri, '@'); 93 | ESP_LOGI(TAG, "Connecting %s to %s", mqtt_config.credentials.client_id, (uri ? uri + 1 : mqtt_config.broker.address.uri)); 94 | mqttClient = esp_mqtt_client_init(&mqtt_config); 95 | esp_mqtt_client_register_event(mqttClient, (esp_mqtt_event_id_t)ESP_EVENT_ANY_ID, mqtt_event_handler, NULL); 96 | esp_mqtt_client_start(mqttClient); 97 | vTaskDelete(NULL); 98 | } 99 | 100 | int mqtt_publish(const char* topic, const char* data) { 101 | if (!mqttClient) 102 | return 0; 103 | return mqtt_publish_bin(topic, data, strlen(data)); 104 | } 105 | 106 | int mqtt_publish_bin(const char* topic, const char* data, int len) { 107 | if (!mqttClient) 108 | return 0; 109 | int msg_id = esp_mqtt_client_publish(mqttClient, topic, data, len, mqtt_config.pub_qos, 0); 110 | ESP_LOGD(TAG, "publish to %s: msg_id=%d", topic, msg_id); // msg_id > 0 only when QoS > 0 111 | return msg_id; 112 | } 113 | 114 | esp_err_t mqtt_subscribe(const char* topic, mqtt_callback_t callback) { 115 | if (!mqttClient) 116 | return 0; 117 | if (!mqttCallback && callback) 118 | mqttCallback = callback; 119 | esp_err_t rc = esp_mqtt_client_subscribe(mqttClient, topic, mqtt_config.sub_qos); 120 | ESP_LOGI(TAG, "mqtt_subscribe '%s': rc=%d", topic, rc); 121 | return rc; 122 | } 123 | 124 | void mqtt_init() { 125 | mqtt_event_group = xEventGroupCreate(); 126 | if (mqtt_config.broker.address.uri && mqtt_config.broker.address.uri[0]) { 127 | xTaskCreatePinnedToCore(mqtt_init_task, "mqtt_init_task", 4096, NULL, 5, NULL, 0); 128 | } 129 | } 130 | -------------------------------------------------------------------------------- /main/mqtt.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | 5 | struct mqtt_config_t : public esp_mqtt_client_config_t { 6 | int pub_qos; 7 | int sub_qos; 8 | }; 9 | 10 | extern mqtt_config_t mqtt_config; 11 | void mqtt_init(); 12 | bool mqtt_is_connected(); 13 | bool mqtt_wait_for_connection(TickType_t delay); 14 | int mqtt_publish(const char* topic, const char* data); 15 | int mqtt_publish_bin(const char* topic, const char* data, int len); 16 | typedef void (*mqtt_callback_t)(const char* topic, int topic_len, const char* data, int data_len); 17 | esp_err_t mqtt_subscribe(const char* topic, mqtt_callback_t callback); 18 | typedef void (*mqtt_connect_callback_t)(); 19 | void mqtt_on_connect(mqtt_connect_callback_t); 20 | -------------------------------------------------------------------------------- /main/sht4x.cpp: -------------------------------------------------------------------------------- 1 | #include "sht4x.h" 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | #define SHT4X_CMD_MEASURE_HPM 0xFD 8 | #define SHT4X_CMD_MEASURE_LPM 0xE0 9 | #define SHT4X_CMD_READ_SERIAL 0x89 10 | #define SHT4X_CMD_DURATION_USEC 1000 11 | #define SHT4X_MEASUREMENT_DURATION_HPM_USEC 9000 12 | #define SHT4X_MEASUREMENT_DURATION_LPM_USEC 2000 13 | #define SHT4X_ADDRESS 0x44 14 | 15 | SHT4x::SHT4x(const char* tg, gpio_num_t i2c_sda, gpio_num_t i2c_scl) : BitbangI2C(i2c_sda, i2c_scl) { 16 | strncpy(tag, tg, sizeof(tag)); 17 | ESP_LOGI(tag, "Starting SHT4x on GPIO: SDA %d, SCL %d", i2c_sda, i2c_scl); 18 | } 19 | 20 | static uint8_t crc8(const uint8_t* data, int len) { 21 | uint8_t crc = 0xFF; 22 | for (int j = len; j; --j) { 23 | crc ^= *data++; 24 | for (int i = 8; i; --i) { 25 | crc = (crc & 0x80) ? (crc << 1) ^ 0x31 : (crc << 1); 26 | } 27 | } 28 | return crc; 29 | } 30 | 31 | bool SHT4x::errorHandler(i2c_err_t response) { 32 | switch (response) { 33 | case i2c_err_t::OK: 34 | return true; 35 | case i2c_err_t::START_TIMEOUT: 36 | ESP_LOGE(tag, "i2c bus error"); 37 | break; 38 | case i2c_err_t::DEVICE_NACK: 39 | ESP_LOGE(tag, "device timeout"); 40 | break; 41 | case i2c_err_t::WRITE_NACK: 42 | ESP_LOGE(tag, "command rejected"); 43 | break; 44 | case i2c_err_t::READ_NACK: 45 | ESP_LOGE(tag, "read error"); 46 | break; 47 | case i2c_err_t::CRC_ERROR: 48 | ESP_LOGE(tag, "CRC error"); 49 | break; 50 | } 51 | 52 | return false; 53 | } 54 | 55 | i2c_err_t SHT4x::measure() { 56 | uint8_t buf[6]; 57 | 58 | portENTER_CRITICAL(&mutex); 59 | i2c_err_t res = i2c_write(SHT4X_ADDRESS, SHT4X_CMD_MEASURE_HPM); 60 | if (res != i2c_err_t::OK) { 61 | portEXIT_CRITICAL(&mutex); 62 | return res; 63 | } 64 | esp_rom_delay_us(SHT4X_MEASUREMENT_DURATION_HPM_USEC); 65 | 66 | res = i2c_read(SHT4X_ADDRESS, buf, sizeof(buf)); 67 | if (res == i2c_err_t::OK) { 68 | if (crc8(buf, 2) != buf[2] || crc8(buf + 3, 2) != buf[5]) { 69 | res = i2c_err_t::CRC_ERROR; 70 | } 71 | /** 72 | * temperature = 175 * S_T / 65535 - 45 73 | * humidity = 125 * (S_RH / 65535) - 6 74 | */ 75 | // xx.x fixed point 76 | temperature = ((875 * ((buf[0] << 8) | buf[1])) >> 15) - 450; 77 | humidity = ((625 * ((buf[3] << 8) | buf[4])) >> 15) - 60; 78 | // xx.xxx fixed point 79 | // temperature = ((21875 * ((buf[0] << 8) | buf[1])) >> 13) - 45000; 80 | // humidity = ((15625 * ((buf[3] << 8) | buf[4])) >> 13) - 6000; 81 | } 82 | portEXIT_CRITICAL(&mutex); 83 | 84 | return res; 85 | } 86 | 87 | i2c_err_t SHT4x::readSerial() { 88 | uint8_t buf[6]; 89 | 90 | portENTER_CRITICAL(&mutex); 91 | i2c_err_t res = i2c_write(SHT4X_ADDRESS, SHT4X_CMD_READ_SERIAL); 92 | if (res != i2c_err_t::OK) { 93 | portEXIT_CRITICAL(&mutex); 94 | return res; 95 | } 96 | esp_rom_delay_us(SHT4X_CMD_DURATION_USEC); 97 | 98 | res = i2c_read(SHT4X_ADDRESS, buf, sizeof(buf)); 99 | if (res == i2c_err_t::OK) { 100 | if (crc8(buf, 2) != buf[2] || crc8(buf + 3, 2) != buf[5]) { 101 | res = i2c_err_t::CRC_ERROR; 102 | } 103 | serial = (buf[0] << 24u) | (buf[1] << 16u) | (buf[3] << 8u) | buf[4]; 104 | } 105 | portEXIT_CRITICAL(&mutex); 106 | 107 | return res; 108 | } 109 | -------------------------------------------------------------------------------- /main/sht4x.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "i2c.h" 3 | 4 | // Sensirion SHT4x (SHT40, SHT41, SHT43, SHT45) 5 | 6 | class SHT4x : BitbangI2C { 7 | public: 8 | SHT4x(const char* tag, gpio_num_t i2c_sda, gpio_num_t i2c_scl); 9 | bool errorHandler(i2c_err_t response); 10 | i2c_err_t measure(); 11 | int getHumidity() const { return humidity; } 12 | int getTemperature() const { return temperature; } 13 | i2c_err_t readSerial(); 14 | uint32_t getSerial() const { return serial; } 15 | 16 | private: 17 | char tag[12]; 18 | int humidity = 0; 19 | int temperature = 0; 20 | uint32_t serial = 0; 21 | }; 22 | -------------------------------------------------------------------------------- /main/util.cpp: -------------------------------------------------------------------------------- 1 | #include "util.h" 2 | 3 | size_t parseHexStr(const char* hex, size_t hexlen, uint8_t* buf, size_t buflen) { 4 | size_t len = 0; 5 | for (size_t i = 0; i < hexlen && len <= buflen; ++i) { 6 | if (!isHex(hex[i])) 7 | continue; 8 | if (!isHex(hex[i + 1])) { 9 | break; 10 | } 11 | buf[len++] = parseHex(hex[i]) << 4 | parseHex(hex[i + 1]); 12 | ++i; 13 | } 14 | return len; 15 | } 16 | 17 | std::string toHexStr(const uint8_t* data, unsigned len) { 18 | std::string s; 19 | s.reserve(len * 3 + 2); 20 | for (size_t i = 0; i < len; ++i) { 21 | if (i) 22 | s += ' '; 23 | s += toHex(data[i] >> 4); 24 | s += toHex(data[i] & 0xF); 25 | } 26 | return s; 27 | } -------------------------------------------------------------------------------- /main/util.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | #include 5 | 6 | inline bool isHex(char c) { return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'); } 7 | 8 | inline char parseHex(char c) { return c <= '9' ? c - '0' : (c >= 'a' ? c - 'a' + 10 : c - 'A' + 10); } 9 | 10 | size_t parseHexStr(const char* hex, size_t hexlen, uint8_t* buf, size_t buflen); 11 | 12 | inline uint8_t checksum(const uint8_t* buf, size_t buflen) { 13 | uint8_t sum = 0; 14 | while (buflen--) { 15 | sum += *buf++; 16 | } 17 | return -sum; 18 | } 19 | 20 | inline void fixChecksum(uint8_t* buf, size_t buflen) { buf[buflen - 1] = checksum(buf, buflen - 1); } 21 | 22 | inline char toHex(uint8_t c) { return c < 10 ? c + '0' : c + 'A' - 10; } 23 | 24 | std::string toHexStr(const uint8_t* data, unsigned len); 25 | -------------------------------------------------------------------------------- /main/wifi.cpp: -------------------------------------------------------------------------------- 1 | #include "wifi.h" 2 | 3 | static const char* TAG = "WIFI"; 4 | 5 | bool wifiAPMode; 6 | std::string wifiSsid, wifiPw; 7 | static EventGroupHandle_t wifi_event_group; 8 | const int WIFI_CONNECTED_BIT = BIT0; 9 | 10 | #if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 3, 0) 11 | #define WIFI_IF_STA ESP_IF_WIFI_STA 12 | #define WIFI_IF_AP ESP_IF_WIFI_AP 13 | #endif 14 | 15 | static void event_handler_ap(void* arg, esp_event_base_t base, int32_t event_id, void* data) { 16 | if (event_id == WIFI_EVENT_AP_STACONNECTED) { 17 | wifi_event_ap_staconnected_t* event = (wifi_event_ap_staconnected_t*)data; 18 | ESP_LOGI(TAG, "station " MACSTR " join, AID=%d", MAC2STR(event->mac), event->aid); 19 | } else if (event_id == WIFI_EVENT_AP_STADISCONNECTED) { 20 | wifi_event_ap_stadisconnected_t* event = (wifi_event_ap_stadisconnected_t*)data; 21 | ESP_LOGI(TAG, "station " MACSTR " leave, AID=%d", MAC2STR(event->mac), event->aid); 22 | } 23 | } 24 | 25 | static void wifi_init_softap() { 26 | esp_netif_create_default_wifi_ap(); 27 | wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); 28 | ESP_ERROR_CHECK(esp_wifi_init(&cfg)); 29 | ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler_ap, NULL, NULL)); 30 | wifi_config_t wificfg = {}; 31 | wificfg.ap.authmode = wifiPw.empty() ? WIFI_AUTH_OPEN : WIFI_AUTH_WPA2_PSK; 32 | wificfg.ap.max_connection = 32; 33 | wificfg.ap.beacon_interval = 300; 34 | strncpy((char*)wificfg.ap.ssid, wifiSsid.c_str(), sizeof(wificfg.ap.ssid) - 1); 35 | strncpy((char*)wificfg.ap.password, wifiPw.c_str(), sizeof(wificfg.ap.password) - 1); 36 | ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP)); 37 | ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_AP, &wificfg)); 38 | ESP_ERROR_CHECK(esp_wifi_start()); 39 | ESP_LOGI(TAG, "wifi_init_softap SSID: %s password: %s", wifiSsid.c_str(), wifiPw.c_str()); 40 | } 41 | 42 | static void event_handler_sta(void* arg, esp_event_base_t base, int32_t event_id, void* data) { 43 | if (event_id == WIFI_EVENT_STA_START) { 44 | ESP_LOGI(TAG, "starting"); 45 | esp_wifi_connect(); 46 | } else if (event_id == WIFI_EVENT_STA_DISCONNECTED) { 47 | ESP_LOGI(TAG, "disconnected"); 48 | xEventGroupClearBits(wifi_event_group, WIFI_CONNECTED_BIT); 49 | esp_wifi_connect(); 50 | } 51 | } 52 | 53 | static void event_handler_sta_ip(void* arg, esp_event_base_t base, int32_t event_id, void* data) { 54 | if (event_id == IP_EVENT_STA_GOT_IP) { 55 | ip_event_got_ip_t* event = (ip_event_got_ip_t*)data; 56 | ESP_LOGI(TAG, "got ip: " IPSTR, IP2STR(&event->ip_info.ip)); 57 | xEventGroupSetBits(wifi_event_group, WIFI_CONNECTED_BIT); 58 | } 59 | } 60 | 61 | static void wifi_init_sta() { 62 | esp_netif_create_default_wifi_sta(); 63 | wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); 64 | ESP_ERROR_CHECK(esp_wifi_init(&cfg)); 65 | ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler_sta, NULL, NULL)); 66 | ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler_sta_ip, NULL, NULL)); 67 | wifi_config_t wificfg = {}; 68 | wificfg.sta.sort_method = WIFI_CONNECT_AP_BY_SIGNAL; 69 | wificfg.sta.threshold.authmode = WIFI_AUTH_WPA2_PSK; 70 | wificfg.sta.sae_pwe_h2e = WPA3_SAE_PWE_BOTH; 71 | wificfg.sta.sae_h2e_identifier[0] = 0; 72 | strncpy((char*)wificfg.sta.ssid, wifiSsid.c_str(), sizeof(wificfg.sta.ssid) - 1); 73 | strncpy((char*)wificfg.sta.password, wifiPw.c_str(), sizeof(wificfg.sta.password) - 1); 74 | ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); 75 | ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wificfg)); 76 | ESP_ERROR_CHECK(esp_wifi_start()); 77 | ESP_LOGI(TAG, "wifi_init_sta connecting to SSID: %s", wifiSsid.c_str()); 78 | } 79 | 80 | bool wifi_wait_for_connection(TickType_t delay) { 81 | return !!(xEventGroupWaitBits(wifi_event_group, WIFI_CONNECTED_BIT, false, true, delay) & WIFI_CONNECTED_BIT); 82 | } 83 | 84 | void wifi_init() { 85 | esp_log_level_set("wifi", ESP_LOG_WARN); // reduce built-in wifi logging 86 | wifi_event_group = xEventGroupCreate(); 87 | if (wifiSsid.empty()) 88 | return; 89 | ESP_ERROR_CHECK(esp_netif_init()); 90 | ESP_ERROR_CHECK(esp_event_loop_create_default()); 91 | if (wifiAPMode) { 92 | wifi_init_softap(); 93 | } else { 94 | wifi_init_sta(); 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /main/wifi.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "wifi.h" 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | 18 | extern bool wifiAPMode; 19 | extern std::string wifiSsid, wifiPw; 20 | 21 | void wifi_init(); 22 | bool wifi_wait_for_connection(TickType_t delay = portMAX_DELAY); 23 | -------------------------------------------------------------------------------- /sdkconfig: -------------------------------------------------------------------------------- 1 | # 2 | # Automatically generated file. DO NOT EDIT. 3 | # Espressif IoT Development Framework (ESP-IDF) 5.2.3 Project Configuration 4 | # 5 | CONFIG_SOC_BROWNOUT_RESET_SUPPORTED="Not determined" 6 | CONFIG_SOC_TWAI_BRP_DIV_SUPPORTED="Not determined" 7 | CONFIG_SOC_DPORT_WORKAROUND="Not determined" 8 | CONFIG_SOC_CAPS_ECO_VER_MAX=301 9 | CONFIG_SOC_ADC_SUPPORTED=y 10 | CONFIG_SOC_DAC_SUPPORTED=y 11 | CONFIG_SOC_UART_SUPPORTED=y 12 | CONFIG_SOC_MCPWM_SUPPORTED=y 13 | CONFIG_SOC_GPTIMER_SUPPORTED=y 14 | CONFIG_SOC_SDMMC_HOST_SUPPORTED=y 15 | CONFIG_SOC_BT_SUPPORTED=y 16 | CONFIG_SOC_PCNT_SUPPORTED=y 17 | CONFIG_SOC_WIFI_SUPPORTED=y 18 | CONFIG_SOC_SDIO_SLAVE_SUPPORTED=y 19 | CONFIG_SOC_TWAI_SUPPORTED=y 20 | CONFIG_SOC_EFUSE_SUPPORTED=y 21 | CONFIG_SOC_EMAC_SUPPORTED=y 22 | CONFIG_SOC_ULP_SUPPORTED=y 23 | CONFIG_SOC_CCOMP_TIMER_SUPPORTED=y 24 | CONFIG_SOC_RTC_FAST_MEM_SUPPORTED=y 25 | CONFIG_SOC_RTC_SLOW_MEM_SUPPORTED=y 26 | CONFIG_SOC_RTC_MEM_SUPPORTED=y 27 | CONFIG_SOC_I2S_SUPPORTED=y 28 | CONFIG_SOC_RMT_SUPPORTED=y 29 | CONFIG_SOC_SDM_SUPPORTED=y 30 | CONFIG_SOC_GPSPI_SUPPORTED=y 31 | CONFIG_SOC_LEDC_SUPPORTED=y 32 | CONFIG_SOC_I2C_SUPPORTED=y 33 | CONFIG_SOC_SUPPORT_COEXISTENCE=y 34 | CONFIG_SOC_AES_SUPPORTED=y 35 | CONFIG_SOC_MPI_SUPPORTED=y 36 | CONFIG_SOC_SHA_SUPPORTED=y 37 | CONFIG_SOC_FLASH_ENC_SUPPORTED=y 38 | CONFIG_SOC_SECURE_BOOT_SUPPORTED=y 39 | CONFIG_SOC_TOUCH_SENSOR_SUPPORTED=y 40 | CONFIG_SOC_BOD_SUPPORTED=y 41 | CONFIG_SOC_ULP_FSM_SUPPORTED=y 42 | CONFIG_SOC_CLK_TREE_SUPPORTED=y 43 | CONFIG_SOC_MPU_SUPPORTED=y 44 | CONFIG_SOC_WDT_SUPPORTED=y 45 | CONFIG_SOC_SPI_FLASH_SUPPORTED=y 46 | CONFIG_SOC_DPORT_WORKAROUND_DIS_INTERRUPT_LVL=5 47 | CONFIG_SOC_XTAL_SUPPORT_26M=y 48 | CONFIG_SOC_XTAL_SUPPORT_40M=y 49 | CONFIG_SOC_XTAL_SUPPORT_AUTO_DETECT=y 50 | CONFIG_SOC_ADC_RTC_CTRL_SUPPORTED=y 51 | CONFIG_SOC_ADC_DIG_CTRL_SUPPORTED=y 52 | CONFIG_SOC_ADC_DMA_SUPPORTED=y 53 | CONFIG_SOC_ADC_PERIPH_NUM=2 54 | CONFIG_SOC_ADC_MAX_CHANNEL_NUM=10 55 | CONFIG_SOC_ADC_ATTEN_NUM=4 56 | CONFIG_SOC_ADC_DIGI_CONTROLLER_NUM=2 57 | CONFIG_SOC_ADC_PATT_LEN_MAX=16 58 | CONFIG_SOC_ADC_DIGI_MIN_BITWIDTH=9 59 | CONFIG_SOC_ADC_DIGI_MAX_BITWIDTH=12 60 | CONFIG_SOC_ADC_DIGI_RESULT_BYTES=2 61 | CONFIG_SOC_ADC_DIGI_DATA_BYTES_PER_CONV=4 62 | CONFIG_SOC_ADC_DIGI_MONITOR_NUM=0 63 | CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH=2 64 | CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW=20 65 | CONFIG_SOC_ADC_RTC_MIN_BITWIDTH=9 66 | CONFIG_SOC_ADC_RTC_MAX_BITWIDTH=12 67 | CONFIG_SOC_ADC_SHARED_POWER=y 68 | CONFIG_SOC_SHARED_IDCACHE_SUPPORTED=y 69 | CONFIG_SOC_IDCACHE_PER_CORE=y 70 | CONFIG_SOC_CPU_CORES_NUM=2 71 | CONFIG_SOC_CPU_INTR_NUM=32 72 | CONFIG_SOC_CPU_HAS_FPU=y 73 | CONFIG_SOC_HP_CPU_HAS_MULTIPLE_CORES=y 74 | CONFIG_SOC_CPU_BREAKPOINTS_NUM=2 75 | CONFIG_SOC_CPU_WATCHPOINTS_NUM=2 76 | CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE=64 77 | CONFIG_SOC_DAC_CHAN_NUM=2 78 | CONFIG_SOC_DAC_RESOLUTION=8 79 | CONFIG_SOC_DAC_DMA_16BIT_ALIGN=y 80 | CONFIG_SOC_GPIO_PORT=1 81 | CONFIG_SOC_GPIO_PIN_COUNT=40 82 | CONFIG_SOC_GPIO_VALID_GPIO_MASK=0xFFFFFFFFFF 83 | CONFIG_SOC_GPIO_IN_RANGE_MAX=39 84 | CONFIG_SOC_GPIO_OUT_RANGE_MAX=33 85 | CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0xEF0FEA 86 | CONFIG_SOC_GPIO_CLOCKOUT_BY_IO_MUX=y 87 | CONFIG_SOC_I2C_NUM=2 88 | CONFIG_SOC_I2C_FIFO_LEN=32 89 | CONFIG_SOC_I2C_CMD_REG_NUM=16 90 | CONFIG_SOC_I2C_SUPPORT_SLAVE=y 91 | CONFIG_SOC_I2C_SUPPORT_APB=y 92 | CONFIG_SOC_I2C_STOP_INDEPENDENT=y 93 | CONFIG_SOC_I2S_NUM=2 94 | CONFIG_SOC_I2S_HW_VERSION_1=y 95 | CONFIG_SOC_I2S_SUPPORTS_APLL=y 96 | CONFIG_SOC_I2S_SUPPORTS_PLL_F160M=y 97 | CONFIG_SOC_I2S_SUPPORTS_PDM=y 98 | CONFIG_SOC_I2S_SUPPORTS_PDM_TX=y 99 | CONFIG_SOC_I2S_PDM_MAX_TX_LINES=1 100 | CONFIG_SOC_I2S_SUPPORTS_PDM_RX=y 101 | CONFIG_SOC_I2S_PDM_MAX_RX_LINES=1 102 | CONFIG_SOC_I2S_SUPPORTS_ADC_DAC=y 103 | CONFIG_SOC_I2S_SUPPORTS_ADC=y 104 | CONFIG_SOC_I2S_SUPPORTS_DAC=y 105 | CONFIG_SOC_I2S_SUPPORTS_LCD_CAMERA=y 106 | CONFIG_SOC_I2S_TRANS_SIZE_ALIGN_WORD=y 107 | CONFIG_SOC_I2S_LCD_I80_VARIANT=y 108 | CONFIG_SOC_LCD_I80_SUPPORTED=y 109 | CONFIG_SOC_LCD_I80_BUSES=2 110 | CONFIG_SOC_LCD_I80_BUS_WIDTH=24 111 | CONFIG_SOC_LEDC_HAS_TIMER_SPECIFIC_MUX=y 112 | CONFIG_SOC_LEDC_SUPPORT_APB_CLOCK=y 113 | CONFIG_SOC_LEDC_SUPPORT_REF_TICK=y 114 | CONFIG_SOC_LEDC_SUPPORT_HS_MODE=y 115 | CONFIG_SOC_LEDC_CHANNEL_NUM=8 116 | CONFIG_SOC_LEDC_TIMER_BIT_WIDTH=20 117 | CONFIG_SOC_MCPWM_GROUPS=2 118 | CONFIG_SOC_MCPWM_TIMERS_PER_GROUP=3 119 | CONFIG_SOC_MCPWM_OPERATORS_PER_GROUP=3 120 | CONFIG_SOC_MCPWM_COMPARATORS_PER_OPERATOR=2 121 | CONFIG_SOC_MCPWM_GENERATORS_PER_OPERATOR=2 122 | CONFIG_SOC_MCPWM_TRIGGERS_PER_OPERATOR=2 123 | CONFIG_SOC_MCPWM_GPIO_FAULTS_PER_GROUP=3 124 | CONFIG_SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP=y 125 | CONFIG_SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER=3 126 | CONFIG_SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP=3 127 | CONFIG_SOC_MMU_PERIPH_NUM=2 128 | CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=3 129 | CONFIG_SOC_MPU_MIN_REGION_SIZE=0x20000000 130 | CONFIG_SOC_MPU_REGIONS_MAX_NUM=8 131 | CONFIG_SOC_PCNT_GROUPS=1 132 | CONFIG_SOC_PCNT_UNITS_PER_GROUP=8 133 | CONFIG_SOC_PCNT_CHANNELS_PER_UNIT=2 134 | CONFIG_SOC_PCNT_THRES_POINT_PER_UNIT=2 135 | CONFIG_SOC_RMT_GROUPS=1 136 | CONFIG_SOC_RMT_TX_CANDIDATES_PER_GROUP=8 137 | CONFIG_SOC_RMT_RX_CANDIDATES_PER_GROUP=8 138 | CONFIG_SOC_RMT_CHANNELS_PER_GROUP=8 139 | CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL=64 140 | CONFIG_SOC_RMT_SUPPORT_REF_TICK=y 141 | CONFIG_SOC_RMT_SUPPORT_APB=y 142 | CONFIG_SOC_RMT_CHANNEL_CLK_INDEPENDENT=y 143 | CONFIG_SOC_RTCIO_PIN_COUNT=18 144 | CONFIG_SOC_RTCIO_INPUT_OUTPUT_SUPPORTED=y 145 | CONFIG_SOC_RTCIO_HOLD_SUPPORTED=y 146 | CONFIG_SOC_RTCIO_WAKE_SUPPORTED=y 147 | CONFIG_SOC_SDM_GROUPS=1 148 | CONFIG_SOC_SDM_CHANNELS_PER_GROUP=8 149 | CONFIG_SOC_SDM_CLK_SUPPORT_APB=y 150 | CONFIG_SOC_SPI_HD_BOTH_INOUT_SUPPORTED=y 151 | CONFIG_SOC_SPI_AS_CS_SUPPORTED=y 152 | CONFIG_SOC_SPI_PERIPH_NUM=3 153 | CONFIG_SOC_SPI_DMA_CHAN_NUM=2 154 | CONFIG_SOC_SPI_MAX_CS_NUM=3 155 | CONFIG_SOC_SPI_SUPPORT_CLK_APB=y 156 | CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE=64 157 | CONFIG_SOC_SPI_MAX_PRE_DIVIDER=8192 158 | CONFIG_SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED=y 159 | CONFIG_SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED=y 160 | CONFIG_SOC_MEMSPI_SRC_FREQ_26M_SUPPORTED=y 161 | CONFIG_SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED=y 162 | CONFIG_SOC_TIMER_GROUPS=2 163 | CONFIG_SOC_TIMER_GROUP_TIMERS_PER_GROUP=2 164 | CONFIG_SOC_TIMER_GROUP_COUNTER_BIT_WIDTH=64 165 | CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS=4 166 | CONFIG_SOC_TIMER_GROUP_SUPPORT_APB=y 167 | CONFIG_SOC_TOUCH_VERSION_1=y 168 | CONFIG_SOC_TOUCH_SENSOR_NUM=10 169 | CONFIG_SOC_TOUCH_PAD_MEASURE_WAIT_MAX=0xFF 170 | CONFIG_SOC_TWAI_CONTROLLER_NUM=1 171 | CONFIG_SOC_TWAI_BRP_MIN=2 172 | CONFIG_SOC_TWAI_CLK_SUPPORT_APB=y 173 | CONFIG_SOC_TWAI_SUPPORT_MULTI_ADDRESS_LAYOUT=y 174 | CONFIG_SOC_UART_NUM=3 175 | CONFIG_SOC_UART_HP_NUM=3 176 | CONFIG_SOC_UART_SUPPORT_APB_CLK=y 177 | CONFIG_SOC_UART_SUPPORT_REF_TICK=y 178 | CONFIG_SOC_UART_FIFO_LEN=128 179 | CONFIG_SOC_UART_BITRATE_MAX=5000000 180 | CONFIG_SOC_SPIRAM_SUPPORTED=y 181 | CONFIG_SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE=y 182 | CONFIG_SOC_SHA_SUPPORT_PARALLEL_ENG=y 183 | CONFIG_SOC_SHA_ENDIANNESS_BE=y 184 | CONFIG_SOC_SHA_SUPPORT_SHA1=y 185 | CONFIG_SOC_SHA_SUPPORT_SHA256=y 186 | CONFIG_SOC_SHA_SUPPORT_SHA384=y 187 | CONFIG_SOC_SHA_SUPPORT_SHA512=y 188 | CONFIG_SOC_MPI_MEM_BLOCKS_NUM=4 189 | CONFIG_SOC_MPI_OPERATIONS_NUM=y 190 | CONFIG_SOC_RSA_MAX_BIT_LEN=4096 191 | CONFIG_SOC_AES_SUPPORT_AES_128=y 192 | CONFIG_SOC_AES_SUPPORT_AES_192=y 193 | CONFIG_SOC_AES_SUPPORT_AES_256=y 194 | CONFIG_SOC_SECURE_BOOT_V1=y 195 | CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS=y 196 | CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX=32 197 | CONFIG_SOC_PHY_DIG_REGS_MEM_SIZE=21 198 | CONFIG_SOC_PM_SUPPORT_EXT0_WAKEUP=y 199 | CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP=y 200 | CONFIG_SOC_PM_SUPPORT_EXT_WAKEUP=y 201 | CONFIG_SOC_PM_SUPPORT_TOUCH_SENSOR_WAKEUP=y 202 | CONFIG_SOC_PM_SUPPORT_RTC_PERIPH_PD=y 203 | CONFIG_SOC_PM_SUPPORT_RTC_FAST_MEM_PD=y 204 | CONFIG_SOC_PM_SUPPORT_RTC_SLOW_MEM_PD=y 205 | CONFIG_SOC_PM_SUPPORT_RC_FAST_PD=y 206 | CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD=y 207 | CONFIG_SOC_PM_SUPPORT_MODEM_PD=y 208 | CONFIG_SOC_CONFIGURABLE_VDDSDIO_SUPPORTED=y 209 | CONFIG_SOC_CLK_APLL_SUPPORTED=y 210 | CONFIG_SOC_CLK_RC_FAST_D256_SUPPORTED=y 211 | CONFIG_SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256=y 212 | CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION=y 213 | CONFIG_SOC_CLK_XTAL32K_SUPPORTED=y 214 | CONFIG_SOC_SDMMC_USE_IOMUX=y 215 | CONFIG_SOC_SDMMC_NUM_SLOTS=2 216 | CONFIG_SOC_WIFI_WAPI_SUPPORT=y 217 | CONFIG_SOC_WIFI_CSI_SUPPORT=y 218 | CONFIG_SOC_WIFI_MESH_SUPPORT=y 219 | CONFIG_SOC_WIFI_SUPPORT_VARIABLE_BEACON_WINDOW=y 220 | CONFIG_SOC_WIFI_NAN_SUPPORT=y 221 | CONFIG_SOC_BLE_SUPPORTED=y 222 | CONFIG_SOC_BLE_MESH_SUPPORTED=y 223 | CONFIG_SOC_BT_CLASSIC_SUPPORTED=y 224 | CONFIG_SOC_BLUFI_SUPPORTED=y 225 | CONFIG_SOC_ULP_HAS_ADC=y 226 | CONFIG_SOC_PHY_COMBO_MODULE=y 227 | CONFIG_IDF_CMAKE=y 228 | CONFIG_IDF_TOOLCHAIN="gcc" 229 | CONFIG_IDF_TARGET_ARCH_XTENSA=y 230 | CONFIG_IDF_TARGET_ARCH="xtensa" 231 | CONFIG_IDF_TARGET="esp32" 232 | CONFIG_IDF_INIT_VERSION="5.2.3" 233 | CONFIG_IDF_TARGET_ESP32=y 234 | CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000 235 | 236 | # 237 | # Build type 238 | # 239 | CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y 240 | # CONFIG_APP_BUILD_TYPE_RAM is not set 241 | CONFIG_APP_BUILD_GENERATE_BINARIES=y 242 | CONFIG_APP_BUILD_BOOTLOADER=y 243 | CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y 244 | # CONFIG_APP_REPRODUCIBLE_BUILD is not set 245 | # CONFIG_APP_NO_BLOBS is not set 246 | # CONFIG_APP_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set 247 | # CONFIG_APP_COMPATIBLE_PRE_V3_1_BOOTLOADERS is not set 248 | # end of Build type 249 | 250 | # 251 | # Bootloader config 252 | # 253 | 254 | # 255 | # Bootloader manager 256 | # 257 | CONFIG_BOOTLOADER_COMPILE_TIME_DATE=y 258 | CONFIG_BOOTLOADER_PROJECT_VER=1 259 | # end of Bootloader manager 260 | 261 | CONFIG_BOOTLOADER_OFFSET_IN_FLASH=0x1000 262 | CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y 263 | # CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set 264 | # CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF is not set 265 | # CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_NONE is not set 266 | # CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set 267 | # CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set 268 | # CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set 269 | CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y 270 | # CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set 271 | # CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set 272 | CONFIG_BOOTLOADER_LOG_LEVEL=3 273 | 274 | # 275 | # Serial Flash Configurations 276 | # 277 | # CONFIG_BOOTLOADER_FLASH_DC_AWARE is not set 278 | CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y 279 | # end of Serial Flash Configurations 280 | 281 | # CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_8V is not set 282 | CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y 283 | # CONFIG_BOOTLOADER_FACTORY_RESET is not set 284 | # CONFIG_BOOTLOADER_APP_TEST is not set 285 | CONFIG_BOOTLOADER_REGION_PROTECTION_ENABLE=y 286 | CONFIG_BOOTLOADER_WDT_ENABLE=y 287 | # CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE is not set 288 | CONFIG_BOOTLOADER_WDT_TIME_MS=9000 289 | # CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE is not set 290 | # CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP is not set 291 | # CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON is not set 292 | # CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set 293 | CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0 294 | # CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set 295 | # end of Bootloader config 296 | 297 | # 298 | # Security features 299 | # 300 | CONFIG_SECURE_BOOT_V1_SUPPORTED=y 301 | # CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set 302 | # CONFIG_SECURE_BOOT is not set 303 | # CONFIG_SECURE_FLASH_ENC_ENABLED is not set 304 | # end of Security features 305 | 306 | # 307 | # Application manager 308 | # 309 | CONFIG_APP_COMPILE_TIME_DATE=y 310 | # CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set 311 | # CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set 312 | # CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set 313 | CONFIG_APP_RETRIEVE_LEN_ELF_SHA=16 314 | # end of Application manager 315 | 316 | CONFIG_ESP_ROM_HAS_CRC_LE=y 317 | CONFIG_ESP_ROM_HAS_CRC_BE=y 318 | CONFIG_ESP_ROM_HAS_MZ_CRC32=y 319 | CONFIG_ESP_ROM_HAS_JPEG_DECODE=y 320 | CONFIG_ESP_ROM_HAS_UART_BUF_SWITCH=y 321 | CONFIG_ESP_ROM_NEEDS_SWSETUP_WORKAROUND=y 322 | CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT=y 323 | CONFIG_ESP_ROM_HAS_SW_FLOAT=y 324 | CONFIG_ESP_ROM_USB_SERIAL_DEVICE_NUM=-1 325 | 326 | # 327 | # Serial flasher config 328 | # 329 | # CONFIG_ESPTOOLPY_NO_STUB is not set 330 | # CONFIG_ESPTOOLPY_FLASHMODE_QIO is not set 331 | # CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set 332 | CONFIG_ESPTOOLPY_FLASHMODE_DIO=y 333 | # CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set 334 | CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_STR=y 335 | CONFIG_ESPTOOLPY_FLASHMODE="dio" 336 | # CONFIG_ESPTOOLPY_FLASHFREQ_80M is not set 337 | CONFIG_ESPTOOLPY_FLASHFREQ_40M=y 338 | # CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set 339 | # CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set 340 | CONFIG_ESPTOOLPY_FLASHFREQ="40m" 341 | # CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set 342 | # CONFIG_ESPTOOLPY_FLASHSIZE_2MB is not set 343 | CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y 344 | # CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set 345 | # CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set 346 | # CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set 347 | # CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set 348 | # CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set 349 | CONFIG_ESPTOOLPY_FLASHSIZE="4MB" 350 | # CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE is not set 351 | CONFIG_ESPTOOLPY_BEFORE_RESET=y 352 | # CONFIG_ESPTOOLPY_BEFORE_NORESET is not set 353 | CONFIG_ESPTOOLPY_BEFORE="default_reset" 354 | CONFIG_ESPTOOLPY_AFTER_RESET=y 355 | # CONFIG_ESPTOOLPY_AFTER_NORESET is not set 356 | CONFIG_ESPTOOLPY_AFTER="hard_reset" 357 | CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 358 | # end of Serial flasher config 359 | 360 | # 361 | # Partition Table 362 | # 363 | CONFIG_PARTITION_TABLE_SINGLE_APP=y 364 | # CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE is not set 365 | # CONFIG_PARTITION_TABLE_TWO_OTA is not set 366 | # CONFIG_PARTITION_TABLE_CUSTOM is not set 367 | CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" 368 | CONFIG_PARTITION_TABLE_FILENAME="partitions_singleapp.csv" 369 | CONFIG_PARTITION_TABLE_OFFSET=0x8000 370 | CONFIG_PARTITION_TABLE_MD5=y 371 | # end of Partition Table 372 | 373 | # 374 | # Compiler options 375 | # 376 | # CONFIG_COMPILER_OPTIMIZATION_DEBUG is not set 377 | CONFIG_COMPILER_OPTIMIZATION_SIZE=y 378 | # CONFIG_COMPILER_OPTIMIZATION_PERF is not set 379 | # CONFIG_COMPILER_OPTIMIZATION_NONE is not set 380 | # CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE is not set 381 | # CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set 382 | CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y 383 | CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB=y 384 | CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=0 385 | # CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set 386 | CONFIG_COMPILER_HIDE_PATHS_MACROS=y 387 | # CONFIG_COMPILER_CXX_EXCEPTIONS is not set 388 | # CONFIG_COMPILER_CXX_RTTI is not set 389 | CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y 390 | # CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set 391 | # CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set 392 | # CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set 393 | # CONFIG_COMPILER_WARN_WRITE_STRINGS is not set 394 | # CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set 395 | # CONFIG_COMPILER_DISABLE_GCC13_WARNINGS is not set 396 | # CONFIG_COMPILER_DUMP_RTL_FILES is not set 397 | CONFIG_COMPILER_RT_LIB_GCCLIB=y 398 | CONFIG_COMPILER_RT_LIB_NAME="gcc" 399 | # CONFIG_COMPILER_ORPHAN_SECTIONS_WARNING is not set 400 | CONFIG_COMPILER_ORPHAN_SECTIONS_PLACE=y 401 | # end of Compiler options 402 | 403 | # 404 | # Component config 405 | # 406 | 407 | # 408 | # Application Level Tracing 409 | # 410 | # CONFIG_APPTRACE_DEST_JTAG is not set 411 | CONFIG_APPTRACE_DEST_NONE=y 412 | # CONFIG_APPTRACE_DEST_UART1 is not set 413 | # CONFIG_APPTRACE_DEST_UART2 is not set 414 | CONFIG_APPTRACE_DEST_UART_NONE=y 415 | CONFIG_APPTRACE_UART_TASK_PRIO=1 416 | CONFIG_APPTRACE_LOCK_ENABLE=y 417 | # end of Application Level Tracing 418 | 419 | # 420 | # Bluetooth 421 | # 422 | # CONFIG_BT_ENABLED is not set 423 | CONFIG_BT_ALARM_MAX_NUM=50 424 | # end of Bluetooth 425 | 426 | # 427 | # Driver Configurations 428 | # 429 | 430 | # 431 | # Legacy ADC Configuration 432 | # 433 | CONFIG_ADC_DISABLE_DAC=y 434 | # CONFIG_ADC_SUPPRESS_DEPRECATE_WARN is not set 435 | 436 | # 437 | # Legacy ADC Calibration Configuration 438 | # 439 | CONFIG_ADC_CAL_EFUSE_TP_ENABLE=y 440 | CONFIG_ADC_CAL_EFUSE_VREF_ENABLE=y 441 | CONFIG_ADC_CAL_LUT_ENABLE=y 442 | # CONFIG_ADC_CALI_SUPPRESS_DEPRECATE_WARN is not set 443 | # end of Legacy ADC Calibration Configuration 444 | # end of Legacy ADC Configuration 445 | 446 | # 447 | # SPI Configuration 448 | # 449 | # CONFIG_SPI_MASTER_IN_IRAM is not set 450 | CONFIG_SPI_MASTER_ISR_IN_IRAM=y 451 | # CONFIG_SPI_SLAVE_IN_IRAM is not set 452 | CONFIG_SPI_SLAVE_ISR_IN_IRAM=y 453 | # end of SPI Configuration 454 | 455 | # 456 | # TWAI Configuration 457 | # 458 | # CONFIG_TWAI_ISR_IN_IRAM is not set 459 | # CONFIG_TWAI_ERRATA_FIX_BUS_OFF_REC is not set 460 | # CONFIG_TWAI_ERRATA_FIX_TX_INTR_LOST is not set 461 | # CONFIG_TWAI_ERRATA_FIX_RX_FRAME_INVALID is not set 462 | # CONFIG_TWAI_ERRATA_FIX_RX_FIFO_CORRUPT is not set 463 | # CONFIG_TWAI_ERRATA_FIX_LISTEN_ONLY_DOM is not set 464 | # end of TWAI Configuration 465 | 466 | # 467 | # UART Configuration 468 | # 469 | # CONFIG_UART_ISR_IN_IRAM is not set 470 | # end of UART Configuration 471 | 472 | # 473 | # GPIO Configuration 474 | # 475 | # CONFIG_GPIO_ESP32_SUPPORT_SWITCH_SLP_PULL is not set 476 | # CONFIG_GPIO_CTRL_FUNC_IN_IRAM is not set 477 | # end of GPIO Configuration 478 | 479 | # 480 | # Sigma Delta Modulator Configuration 481 | # 482 | # CONFIG_SDM_CTRL_FUNC_IN_IRAM is not set 483 | # CONFIG_SDM_SUPPRESS_DEPRECATE_WARN is not set 484 | # CONFIG_SDM_ENABLE_DEBUG_LOG is not set 485 | # end of Sigma Delta Modulator Configuration 486 | 487 | # 488 | # GPTimer Configuration 489 | # 490 | CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM=y 491 | # CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM is not set 492 | # CONFIG_GPTIMER_ISR_IRAM_SAFE is not set 493 | # CONFIG_GPTIMER_SUPPRESS_DEPRECATE_WARN is not set 494 | # CONFIG_GPTIMER_ENABLE_DEBUG_LOG is not set 495 | # end of GPTimer Configuration 496 | 497 | # 498 | # PCNT Configuration 499 | # 500 | # CONFIG_PCNT_CTRL_FUNC_IN_IRAM is not set 501 | # CONFIG_PCNT_ISR_IRAM_SAFE is not set 502 | # CONFIG_PCNT_SUPPRESS_DEPRECATE_WARN is not set 503 | # CONFIG_PCNT_ENABLE_DEBUG_LOG is not set 504 | # end of PCNT Configuration 505 | 506 | # 507 | # RMT Configuration 508 | # 509 | # CONFIG_RMT_ISR_IRAM_SAFE is not set 510 | # CONFIG_RMT_RECV_FUNC_IN_IRAM is not set 511 | # CONFIG_RMT_SUPPRESS_DEPRECATE_WARN is not set 512 | # CONFIG_RMT_ENABLE_DEBUG_LOG is not set 513 | # end of RMT Configuration 514 | 515 | # 516 | # MCPWM Configuration 517 | # 518 | # CONFIG_MCPWM_ISR_IRAM_SAFE is not set 519 | # CONFIG_MCPWM_CTRL_FUNC_IN_IRAM is not set 520 | # CONFIG_MCPWM_SUPPRESS_DEPRECATE_WARN is not set 521 | # CONFIG_MCPWM_ENABLE_DEBUG_LOG is not set 522 | # end of MCPWM Configuration 523 | 524 | # 525 | # I2S Configuration 526 | # 527 | # CONFIG_I2S_ISR_IRAM_SAFE is not set 528 | # CONFIG_I2S_SUPPRESS_DEPRECATE_WARN is not set 529 | # CONFIG_I2S_ENABLE_DEBUG_LOG is not set 530 | # end of I2S Configuration 531 | 532 | # 533 | # DAC Configuration 534 | # 535 | # CONFIG_DAC_CTRL_FUNC_IN_IRAM is not set 536 | # CONFIG_DAC_ISR_IRAM_SAFE is not set 537 | # CONFIG_DAC_SUPPRESS_DEPRECATE_WARN is not set 538 | # CONFIG_DAC_ENABLE_DEBUG_LOG is not set 539 | CONFIG_DAC_DMA_AUTO_16BIT_ALIGN=y 540 | # end of DAC Configuration 541 | 542 | # 543 | # LEDC Configuration 544 | # 545 | # CONFIG_LEDC_CTRL_FUNC_IN_IRAM is not set 546 | # end of LEDC Configuration 547 | 548 | # 549 | # I2C Configuration 550 | # 551 | # CONFIG_I2C_ISR_IRAM_SAFE is not set 552 | # CONFIG_I2C_ENABLE_DEBUG_LOG is not set 553 | # end of I2C Configuration 554 | # end of Driver Configurations 555 | 556 | # 557 | # eFuse Bit Manager 558 | # 559 | # CONFIG_EFUSE_CUSTOM_TABLE is not set 560 | # CONFIG_EFUSE_VIRTUAL is not set 561 | # CONFIG_EFUSE_CODE_SCHEME_COMPAT_NONE is not set 562 | CONFIG_EFUSE_CODE_SCHEME_COMPAT_3_4=y 563 | # CONFIG_EFUSE_CODE_SCHEME_COMPAT_REPEAT is not set 564 | CONFIG_EFUSE_MAX_BLK_LEN=192 565 | # end of eFuse Bit Manager 566 | 567 | # 568 | # ESP-TLS 569 | # 570 | CONFIG_ESP_TLS_USING_MBEDTLS=y 571 | # CONFIG_ESP_TLS_USE_SECURE_ELEMENT is not set 572 | # CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS is not set 573 | # CONFIG_ESP_TLS_SERVER is not set 574 | # CONFIG_ESP_TLS_PSK_VERIFICATION is not set 575 | # CONFIG_ESP_TLS_INSECURE is not set 576 | # end of ESP-TLS 577 | 578 | # 579 | # ADC and ADC Calibration 580 | # 581 | # CONFIG_ADC_ONESHOT_CTRL_FUNC_IN_IRAM is not set 582 | # CONFIG_ADC_CONTINUOUS_ISR_IRAM_SAFE is not set 583 | 584 | # 585 | # ADC Calibration Configurations 586 | # 587 | CONFIG_ADC_CALI_EFUSE_TP_ENABLE=y 588 | CONFIG_ADC_CALI_EFUSE_VREF_ENABLE=y 589 | CONFIG_ADC_CALI_LUT_ENABLE=y 590 | # end of ADC Calibration Configurations 591 | 592 | CONFIG_ADC_DISABLE_DAC_OUTPUT=y 593 | # end of ADC and ADC Calibration 594 | 595 | # 596 | # Wireless Coexistence 597 | # 598 | # end of Wireless Coexistence 599 | 600 | # 601 | # Common ESP-related 602 | # 603 | CONFIG_ESP_ERR_TO_NAME_LOOKUP=y 604 | # end of Common ESP-related 605 | 606 | # 607 | # Ethernet 608 | # 609 | CONFIG_ETH_ENABLED=y 610 | CONFIG_ETH_USE_ESP32_EMAC=y 611 | CONFIG_ETH_PHY_INTERFACE_RMII=y 612 | CONFIG_ETH_RMII_CLK_INPUT=y 613 | # CONFIG_ETH_RMII_CLK_OUTPUT is not set 614 | CONFIG_ETH_RMII_CLK_IN_GPIO=0 615 | CONFIG_ETH_DMA_BUFFER_SIZE=512 616 | CONFIG_ETH_DMA_RX_BUFFER_NUM=10 617 | CONFIG_ETH_DMA_TX_BUFFER_NUM=10 618 | # CONFIG_ETH_IRAM_OPTIMIZATION is not set 619 | CONFIG_ETH_USE_SPI_ETHERNET=y 620 | # CONFIG_ETH_SPI_ETHERNET_DM9051 is not set 621 | # CONFIG_ETH_SPI_ETHERNET_W5500 is not set 622 | # CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL is not set 623 | # CONFIG_ETH_USE_OPENETH is not set 624 | # CONFIG_ETH_TRANSMIT_MUTEX is not set 625 | # end of Ethernet 626 | 627 | # 628 | # Event Loop Library 629 | # 630 | # CONFIG_ESP_EVENT_LOOP_PROFILING is not set 631 | CONFIG_ESP_EVENT_POST_FROM_ISR=y 632 | CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y 633 | # end of Event Loop Library 634 | 635 | # 636 | # GDB Stub 637 | # 638 | CONFIG_ESP_GDBSTUB_ENABLED=y 639 | # CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set 640 | CONFIG_ESP_GDBSTUB_SUPPORT_TASKS=y 641 | CONFIG_ESP_GDBSTUB_MAX_TASKS=32 642 | # end of GDB Stub 643 | 644 | # 645 | # ESP HTTP client 646 | # 647 | CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y 648 | # CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set 649 | CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH=y 650 | # end of ESP HTTP client 651 | 652 | # 653 | # HTTP Server 654 | # 655 | CONFIG_HTTPD_MAX_REQ_HDR_LEN=512 656 | CONFIG_HTTPD_MAX_URI_LEN=512 657 | CONFIG_HTTPD_ERR_RESP_NO_DELAY=y 658 | CONFIG_HTTPD_PURGE_BUF_LEN=32 659 | # CONFIG_HTTPD_LOG_PURGE_DATA is not set 660 | # CONFIG_HTTPD_WS_SUPPORT is not set 661 | # CONFIG_HTTPD_QUEUE_WORK_BLOCKING is not set 662 | # end of HTTP Server 663 | 664 | # 665 | # ESP HTTPS OTA 666 | # 667 | # CONFIG_ESP_HTTPS_OTA_DECRYPT_CB is not set 668 | # CONFIG_ESP_HTTPS_OTA_ALLOW_HTTP is not set 669 | # end of ESP HTTPS OTA 670 | 671 | # 672 | # ESP HTTPS server 673 | # 674 | # CONFIG_ESP_HTTPS_SERVER_ENABLE is not set 675 | # end of ESP HTTPS server 676 | 677 | # 678 | # Hardware Settings 679 | # 680 | 681 | # 682 | # Chip revision 683 | # 684 | CONFIG_ESP32_REV_MIN_0=y 685 | # CONFIG_ESP32_REV_MIN_1 is not set 686 | # CONFIG_ESP32_REV_MIN_1_1 is not set 687 | # CONFIG_ESP32_REV_MIN_2 is not set 688 | # CONFIG_ESP32_REV_MIN_3 is not set 689 | # CONFIG_ESP32_REV_MIN_3_1 is not set 690 | CONFIG_ESP32_REV_MIN=0 691 | CONFIG_ESP32_REV_MIN_FULL=0 692 | CONFIG_ESP_REV_MIN_FULL=0 693 | 694 | # 695 | # Maximum Supported ESP32 Revision (Rev v3.99) 696 | # 697 | CONFIG_ESP32_REV_MAX_FULL=399 698 | CONFIG_ESP_REV_MAX_FULL=399 699 | CONFIG_ESP_EFUSE_BLOCK_REV_MIN_FULL=0 700 | CONFIG_ESP_EFUSE_BLOCK_REV_MAX_FULL=99 701 | 702 | # 703 | # Maximum Supported ESP32 eFuse Block Revision (eFuse Block Rev v0.99) 704 | # 705 | # end of Chip revision 706 | 707 | # 708 | # MAC Config 709 | # 710 | CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y 711 | CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y 712 | CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y 713 | CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y 714 | CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR=y 715 | # CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_TWO is not set 716 | CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_FOUR=y 717 | CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES=4 718 | # CONFIG_ESP_MAC_IGNORE_MAC_CRC_ERROR is not set 719 | # CONFIG_ESP_MAC_USE_CUSTOM_MAC_AS_BASE_MAC is not set 720 | # end of MAC Config 721 | 722 | # 723 | # Sleep Config 724 | # 725 | CONFIG_ESP_SLEEP_POWER_DOWN_FLASH=y 726 | CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND=y 727 | # CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND is not set 728 | CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY=2000 729 | # CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION is not set 730 | # CONFIG_ESP_SLEEP_DEBUG is not set 731 | CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS=y 732 | # end of Sleep Config 733 | 734 | # 735 | # RTC Clock Config 736 | # 737 | CONFIG_RTC_CLK_SRC_INT_RC=y 738 | # CONFIG_RTC_CLK_SRC_EXT_CRYS is not set 739 | # CONFIG_RTC_CLK_SRC_EXT_OSC is not set 740 | # CONFIG_RTC_CLK_SRC_INT_8MD256 is not set 741 | CONFIG_RTC_CLK_CAL_CYCLES=1024 742 | # end of RTC Clock Config 743 | 744 | # 745 | # Peripheral Control 746 | # 747 | CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y 748 | # end of Peripheral Control 749 | 750 | # 751 | # Main XTAL Config 752 | # 753 | # CONFIG_XTAL_FREQ_26 is not set 754 | CONFIG_XTAL_FREQ_40=y 755 | # CONFIG_XTAL_FREQ_AUTO is not set 756 | CONFIG_XTAL_FREQ=40 757 | # end of Main XTAL Config 758 | # end of Hardware Settings 759 | 760 | # 761 | # LCD and Touch Panel 762 | # 763 | 764 | # 765 | # LCD Touch Drivers are maintained in the IDF Component Registry 766 | # 767 | 768 | # 769 | # LCD Peripheral Configuration 770 | # 771 | CONFIG_LCD_PANEL_IO_FORMAT_BUF_SIZE=32 772 | # CONFIG_LCD_ENABLE_DEBUG_LOG is not set 773 | # end of LCD Peripheral Configuration 774 | # end of LCD and Touch Panel 775 | 776 | # 777 | # ESP NETIF Adapter 778 | # 779 | CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL=120 780 | CONFIG_ESP_NETIF_TCPIP_LWIP=y 781 | # CONFIG_ESP_NETIF_LOOPBACK is not set 782 | CONFIG_ESP_NETIF_USES_TCPIP_WITH_BSD_API=y 783 | # CONFIG_ESP_NETIF_RECEIVE_REPORT_ERRORS is not set 784 | # CONFIG_ESP_NETIF_L2_TAP is not set 785 | # CONFIG_ESP_NETIF_BRIDGE_EN is not set 786 | # CONFIG_ESP_NETIF_SET_DNS_PER_DEFAULT_NETIF is not set 787 | # end of ESP NETIF Adapter 788 | 789 | # 790 | # Partition API Configuration 791 | # 792 | # end of Partition API Configuration 793 | 794 | # 795 | # PHY 796 | # 797 | CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y 798 | # CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION is not set 799 | CONFIG_ESP_PHY_MAX_WIFI_TX_POWER=20 800 | CONFIG_ESP_PHY_MAX_TX_POWER=20 801 | CONFIG_ESP_PHY_REDUCE_TX_POWER=y 802 | # CONFIG_ESP_PHY_RF_CAL_PARTIAL is not set 803 | # CONFIG_ESP_PHY_RF_CAL_NONE is not set 804 | CONFIG_ESP_PHY_RF_CAL_FULL=y 805 | CONFIG_ESP_PHY_CALIBRATION_MODE=2 806 | # CONFIG_ESP_PHY_PLL_TRACK_DEBUG is not set 807 | # end of PHY 808 | 809 | # 810 | # Power Management 811 | # 812 | # CONFIG_PM_ENABLE is not set 813 | # end of Power Management 814 | 815 | # 816 | # ESP PSRAM 817 | # 818 | # CONFIG_SPIRAM is not set 819 | # end of ESP PSRAM 820 | 821 | # 822 | # ESP Ringbuf 823 | # 824 | # CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH is not set 825 | # end of ESP Ringbuf 826 | 827 | # 828 | # ESP System Settings 829 | # 830 | # CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80 is not set 831 | CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160=y 832 | # CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240 is not set 833 | CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=160 834 | 835 | # 836 | # Memory 837 | # 838 | # CONFIG_ESP32_USE_FIXED_STATIC_RAM_SIZE is not set 839 | 840 | # 841 | # Non-backward compatible options 842 | # 843 | # CONFIG_ESP_SYSTEM_ESP32_SRAM1_REGION_AS_IRAM is not set 844 | # end of Non-backward compatible options 845 | # end of Memory 846 | 847 | # 848 | # Trace memory 849 | # 850 | # CONFIG_ESP32_TRAX is not set 851 | CONFIG_ESP32_TRACEMEM_RESERVE_DRAM=0x0 852 | # end of Trace memory 853 | 854 | # CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT is not set 855 | CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y 856 | # CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set 857 | # CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set 858 | CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=0 859 | 860 | # 861 | # Memory protection 862 | # 863 | # end of Memory protection 864 | 865 | CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32 866 | CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2304 867 | CONFIG_ESP_MAIN_TASK_STACK_SIZE=3584 868 | CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0=y 869 | # CONFIG_ESP_MAIN_TASK_AFFINITY_CPU1 is not set 870 | # CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY is not set 871 | CONFIG_ESP_MAIN_TASK_AFFINITY=0x0 872 | CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE=2048 873 | CONFIG_ESP_CONSOLE_UART_DEFAULT=y 874 | # CONFIG_ESP_CONSOLE_UART_CUSTOM is not set 875 | # CONFIG_ESP_CONSOLE_NONE is not set 876 | CONFIG_ESP_CONSOLE_UART=y 877 | CONFIG_ESP_CONSOLE_UART_NUM=0 878 | CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 879 | CONFIG_ESP_INT_WDT=y 880 | CONFIG_ESP_INT_WDT_TIMEOUT_MS=300 881 | CONFIG_ESP_INT_WDT_CHECK_CPU1=y 882 | CONFIG_ESP_TASK_WDT_EN=y 883 | CONFIG_ESP_TASK_WDT_INIT=y 884 | # CONFIG_ESP_TASK_WDT_PANIC is not set 885 | CONFIG_ESP_TASK_WDT_TIMEOUT_S=5 886 | CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y 887 | CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=y 888 | # CONFIG_ESP_PANIC_HANDLER_IRAM is not set 889 | # CONFIG_ESP_DEBUG_STUBS_ENABLE is not set 890 | CONFIG_ESP_DEBUG_OCDAWARE=y 891 | # CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5 is not set 892 | CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4=y 893 | 894 | # 895 | # Brownout Detector 896 | # 897 | CONFIG_ESP_BROWNOUT_DET=y 898 | CONFIG_ESP_BROWNOUT_DET_LVL_SEL_0=y 899 | # CONFIG_ESP_BROWNOUT_DET_LVL_SEL_1 is not set 900 | # CONFIG_ESP_BROWNOUT_DET_LVL_SEL_2 is not set 901 | # CONFIG_ESP_BROWNOUT_DET_LVL_SEL_3 is not set 902 | # CONFIG_ESP_BROWNOUT_DET_LVL_SEL_4 is not set 903 | # CONFIG_ESP_BROWNOUT_DET_LVL_SEL_5 is not set 904 | # CONFIG_ESP_BROWNOUT_DET_LVL_SEL_6 is not set 905 | # CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7 is not set 906 | CONFIG_ESP_BROWNOUT_DET_LVL=0 907 | # end of Brownout Detector 908 | 909 | # CONFIG_ESP32_DISABLE_BASIC_ROM_CONSOLE is not set 910 | CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y 911 | # end of ESP System Settings 912 | 913 | # 914 | # IPC (Inter-Processor Call) 915 | # 916 | CONFIG_ESP_IPC_TASK_STACK_SIZE=1536 917 | CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y 918 | CONFIG_ESP_IPC_ISR_ENABLE=y 919 | # end of IPC (Inter-Processor Call) 920 | 921 | # 922 | # High resolution timer (esp_timer) 923 | # 924 | # CONFIG_ESP_TIMER_PROFILING is not set 925 | CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER=y 926 | CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER=y 927 | CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584 928 | CONFIG_ESP_TIMER_INTERRUPT_LEVEL=1 929 | # CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL is not set 930 | CONFIG_ESP_TIMER_TASK_AFFINITY=0x0 931 | CONFIG_ESP_TIMER_TASK_AFFINITY_CPU0=y 932 | CONFIG_ESP_TIMER_ISR_AFFINITY=0x1 933 | CONFIG_ESP_TIMER_ISR_AFFINITY_CPU0=y 934 | # CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD is not set 935 | CONFIG_ESP_TIMER_IMPL_TG0_LAC=y 936 | # end of High resolution timer (esp_timer) 937 | 938 | # 939 | # Wi-Fi 940 | # 941 | CONFIG_ESP_WIFI_ENABLED=y 942 | CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=10 943 | CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32 944 | # CONFIG_ESP_WIFI_STATIC_TX_BUFFER is not set 945 | CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER=y 946 | CONFIG_ESP_WIFI_TX_BUFFER_TYPE=1 947 | CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER_NUM=32 948 | CONFIG_ESP_WIFI_STATIC_RX_MGMT_BUFFER=y 949 | # CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUFFER is not set 950 | CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF=0 951 | CONFIG_ESP_WIFI_RX_MGMT_BUF_NUM_DEF=5 952 | # CONFIG_ESP_WIFI_CSI_ENABLED is not set 953 | CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=y 954 | CONFIG_ESP_WIFI_TX_BA_WIN=6 955 | CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y 956 | CONFIG_ESP_WIFI_RX_BA_WIN=6 957 | CONFIG_ESP_WIFI_NVS_ENABLED=y 958 | CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_0=y 959 | # CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_1 is not set 960 | CONFIG_ESP_WIFI_SOFTAP_BEACON_MAX_LEN=752 961 | CONFIG_ESP_WIFI_MGMT_SBUF_NUM=32 962 | CONFIG_ESP_WIFI_IRAM_OPT=y 963 | # CONFIG_ESP_WIFI_EXTRA_IRAM_OPT is not set 964 | CONFIG_ESP_WIFI_RX_IRAM_OPT=y 965 | CONFIG_ESP_WIFI_ENABLE_WPA3_SAE=y 966 | CONFIG_ESP_WIFI_ENABLE_SAE_PK=y 967 | CONFIG_ESP_WIFI_SOFTAP_SAE_SUPPORT=y 968 | CONFIG_ESP_WIFI_ENABLE_WPA3_OWE_STA=y 969 | # CONFIG_ESP_WIFI_SLP_IRAM_OPT is not set 970 | CONFIG_ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME=50 971 | CONFIG_ESP_WIFI_SLP_DEFAULT_MAX_ACTIVE_TIME=10 972 | CONFIG_ESP_WIFI_SLP_DEFAULT_WAIT_BROADCAST_DATA_TIME=15 973 | # CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE is not set 974 | # CONFIG_ESP_WIFI_GMAC_SUPPORT is not set 975 | CONFIG_ESP_WIFI_SOFTAP_SUPPORT=y 976 | # CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT is not set 977 | CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7 978 | # CONFIG_ESP_WIFI_NAN_ENABLE is not set 979 | CONFIG_ESP_WIFI_MBEDTLS_CRYPTO=y 980 | CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y 981 | # CONFIG_ESP_WIFI_WAPI_PSK is not set 982 | # CONFIG_ESP_WIFI_11KV_SUPPORT is not set 983 | # CONFIG_ESP_WIFI_MBO_SUPPORT is not set 984 | # CONFIG_ESP_WIFI_DPP_SUPPORT is not set 985 | # CONFIG_ESP_WIFI_11R_SUPPORT is not set 986 | # CONFIG_ESP_WIFI_WPS_SOFTAP_REGISTRAR is not set 987 | 988 | # 989 | # WPS Configuration Options 990 | # 991 | # CONFIG_ESP_WIFI_WPS_STRICT is not set 992 | # CONFIG_ESP_WIFI_WPS_PASSPHRASE is not set 993 | # end of WPS Configuration Options 994 | 995 | # CONFIG_ESP_WIFI_DEBUG_PRINT is not set 996 | # CONFIG_ESP_WIFI_TESTING_OPTIONS is not set 997 | CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT=y 998 | # CONFIG_ESP_WIFI_ENT_FREE_DYNAMIC_BUFFER is not set 999 | # end of Wi-Fi 1000 | 1001 | # 1002 | # Core dump 1003 | # 1004 | # CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH is not set 1005 | # CONFIG_ESP_COREDUMP_ENABLE_TO_UART is not set 1006 | CONFIG_ESP_COREDUMP_ENABLE_TO_NONE=y 1007 | # end of Core dump 1008 | 1009 | # 1010 | # FAT Filesystem support 1011 | # 1012 | CONFIG_FATFS_VOLUME_COUNT=2 1013 | CONFIG_FATFS_LFN_NONE=y 1014 | # CONFIG_FATFS_LFN_HEAP is not set 1015 | # CONFIG_FATFS_LFN_STACK is not set 1016 | # CONFIG_FATFS_SECTOR_512 is not set 1017 | CONFIG_FATFS_SECTOR_4096=y 1018 | # CONFIG_FATFS_CODEPAGE_DYNAMIC is not set 1019 | CONFIG_FATFS_CODEPAGE_437=y 1020 | # CONFIG_FATFS_CODEPAGE_720 is not set 1021 | # CONFIG_FATFS_CODEPAGE_737 is not set 1022 | # CONFIG_FATFS_CODEPAGE_771 is not set 1023 | # CONFIG_FATFS_CODEPAGE_775 is not set 1024 | # CONFIG_FATFS_CODEPAGE_850 is not set 1025 | # CONFIG_FATFS_CODEPAGE_852 is not set 1026 | # CONFIG_FATFS_CODEPAGE_855 is not set 1027 | # CONFIG_FATFS_CODEPAGE_857 is not set 1028 | # CONFIG_FATFS_CODEPAGE_860 is not set 1029 | # CONFIG_FATFS_CODEPAGE_861 is not set 1030 | # CONFIG_FATFS_CODEPAGE_862 is not set 1031 | # CONFIG_FATFS_CODEPAGE_863 is not set 1032 | # CONFIG_FATFS_CODEPAGE_864 is not set 1033 | # CONFIG_FATFS_CODEPAGE_865 is not set 1034 | # CONFIG_FATFS_CODEPAGE_866 is not set 1035 | # CONFIG_FATFS_CODEPAGE_869 is not set 1036 | # CONFIG_FATFS_CODEPAGE_932 is not set 1037 | # CONFIG_FATFS_CODEPAGE_936 is not set 1038 | # CONFIG_FATFS_CODEPAGE_949 is not set 1039 | # CONFIG_FATFS_CODEPAGE_950 is not set 1040 | CONFIG_FATFS_CODEPAGE=437 1041 | CONFIG_FATFS_FS_LOCK=0 1042 | CONFIG_FATFS_TIMEOUT_MS=10000 1043 | CONFIG_FATFS_PER_FILE_CACHE=y 1044 | # CONFIG_FATFS_USE_FASTSEEK is not set 1045 | CONFIG_FATFS_VFS_FSTAT_BLKSIZE=0 1046 | # CONFIG_FATFS_IMMEDIATE_FSYNC is not set 1047 | # end of FAT Filesystem support 1048 | 1049 | # 1050 | # FreeRTOS 1051 | # 1052 | 1053 | # 1054 | # Kernel 1055 | # 1056 | # CONFIG_FREERTOS_SMP is not set 1057 | # CONFIG_FREERTOS_UNICORE is not set 1058 | CONFIG_FREERTOS_HZ=100 1059 | # CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set 1060 | # CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set 1061 | CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y 1062 | CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1 1063 | CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536 1064 | # CONFIG_FREERTOS_USE_IDLE_HOOK is not set 1065 | # CONFIG_FREERTOS_USE_TICK_HOOK is not set 1066 | CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 1067 | # CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY is not set 1068 | CONFIG_FREERTOS_USE_TIMERS=y 1069 | CONFIG_FREERTOS_TIMER_SERVICE_TASK_NAME="Tmr Svc" 1070 | CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 1071 | CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048 1072 | CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 1073 | CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 1074 | CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 1075 | # CONFIG_FREERTOS_USE_TRACE_FACILITY is not set 1076 | # CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set 1077 | # CONFIG_FREERTOS_USE_APPLICATION_TASK_TAG is not set 1078 | # end of Kernel 1079 | 1080 | # 1081 | # Port 1082 | # 1083 | # CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set 1084 | CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS=y 1085 | # CONFIG_FREERTOS_TASK_PRE_DELETION_HOOK is not set 1086 | # CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set 1087 | CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y 1088 | CONFIG_FREERTOS_ISR_STACKSIZE=1536 1089 | CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y 1090 | # CONFIG_FREERTOS_FPU_IN_ISR is not set 1091 | CONFIG_FREERTOS_TICK_SUPPORT_CORETIMER=y 1092 | CONFIG_FREERTOS_CORETIMER_0=y 1093 | # CONFIG_FREERTOS_CORETIMER_1 is not set 1094 | CONFIG_FREERTOS_SYSTICK_USES_CCOUNT=y 1095 | # CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set 1096 | # CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set 1097 | # end of Port 1098 | 1099 | CONFIG_FREERTOS_PORT=y 1100 | CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF 1101 | CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y 1102 | CONFIG_FREERTOS_DEBUG_OCDAWARE=y 1103 | CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y 1104 | CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y 1105 | # end of FreeRTOS 1106 | 1107 | # 1108 | # Hardware Abstraction Layer (HAL) and Low Level (LL) 1109 | # 1110 | CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y 1111 | # CONFIG_HAL_ASSERTION_DISABLE is not set 1112 | CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=0 1113 | CONFIG_HAL_SPI_MASTER_FUNC_IN_IRAM=y 1114 | CONFIG_HAL_SPI_SLAVE_FUNC_IN_IRAM=y 1115 | # end of Hardware Abstraction Layer (HAL) and Low Level (LL) 1116 | 1117 | # 1118 | # Heap memory debugging 1119 | # 1120 | CONFIG_HEAP_POISONING_DISABLED=y 1121 | # CONFIG_HEAP_POISONING_LIGHT is not set 1122 | # CONFIG_HEAP_POISONING_COMPREHENSIVE is not set 1123 | CONFIG_HEAP_TRACING_OFF=y 1124 | # CONFIG_HEAP_TRACING_STANDALONE is not set 1125 | # CONFIG_HEAP_TRACING_TOHOST is not set 1126 | # CONFIG_HEAP_USE_HOOKS is not set 1127 | # CONFIG_HEAP_TASK_TRACKING is not set 1128 | # CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set 1129 | # CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH is not set 1130 | # end of Heap memory debugging 1131 | 1132 | # 1133 | # Log output 1134 | # 1135 | # CONFIG_LOG_DEFAULT_LEVEL_NONE is not set 1136 | # CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set 1137 | # CONFIG_LOG_DEFAULT_LEVEL_WARN is not set 1138 | CONFIG_LOG_DEFAULT_LEVEL_INFO=y 1139 | # CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set 1140 | # CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set 1141 | CONFIG_LOG_DEFAULT_LEVEL=3 1142 | CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y 1143 | # CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set 1144 | # CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set 1145 | CONFIG_LOG_MAXIMUM_LEVEL=3 1146 | # CONFIG_LOG_MASTER_LEVEL is not set 1147 | # CONFIG_LOG_COLORS is not set 1148 | CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y 1149 | # CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set 1150 | # end of Log output 1151 | 1152 | # 1153 | # LWIP 1154 | # 1155 | CONFIG_LWIP_ENABLE=y 1156 | CONFIG_LWIP_LOCAL_HOSTNAME="espressif" 1157 | # CONFIG_LWIP_NETIF_API is not set 1158 | CONFIG_LWIP_TCPIP_TASK_PRIO=18 1159 | # CONFIG_LWIP_TCPIP_CORE_LOCKING is not set 1160 | # CONFIG_LWIP_CHECK_THREAD_SAFETY is not set 1161 | CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y 1162 | # CONFIG_LWIP_L2_TO_L3_COPY is not set 1163 | # CONFIG_LWIP_IRAM_OPTIMIZATION is not set 1164 | # CONFIG_LWIP_EXTRA_IRAM_OPTIMIZATION is not set 1165 | CONFIG_LWIP_TIMERS_ONDEMAND=y 1166 | CONFIG_LWIP_ND6=y 1167 | # CONFIG_LWIP_FORCE_ROUTER_FORWARDING is not set 1168 | CONFIG_LWIP_MAX_SOCKETS=10 1169 | # CONFIG_LWIP_USE_ONLY_LWIP_SELECT is not set 1170 | # CONFIG_LWIP_SO_LINGER is not set 1171 | CONFIG_LWIP_SO_REUSE=y 1172 | CONFIG_LWIP_SO_REUSE_RXTOALL=y 1173 | # CONFIG_LWIP_SO_RCVBUF is not set 1174 | # CONFIG_LWIP_NETBUF_RECVINFO is not set 1175 | CONFIG_LWIP_IP_DEFAULT_TTL=64 1176 | CONFIG_LWIP_IP4_FRAG=y 1177 | CONFIG_LWIP_IP6_FRAG=y 1178 | # CONFIG_LWIP_IP4_REASSEMBLY is not set 1179 | # CONFIG_LWIP_IP6_REASSEMBLY is not set 1180 | CONFIG_LWIP_IP_REASS_MAX_PBUFS=10 1181 | # CONFIG_LWIP_IP_FORWARD is not set 1182 | # CONFIG_LWIP_STATS is not set 1183 | CONFIG_LWIP_ESP_GRATUITOUS_ARP=y 1184 | CONFIG_LWIP_GARP_TMR_INTERVAL=60 1185 | CONFIG_LWIP_ESP_MLDV6_REPORT=y 1186 | CONFIG_LWIP_MLDV6_TMR_INTERVAL=40 1187 | CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32 1188 | CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y 1189 | # CONFIG_LWIP_DHCP_DISABLE_CLIENT_ID is not set 1190 | CONFIG_LWIP_DHCP_DISABLE_VENDOR_CLASS_ID=y 1191 | # CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set 1192 | CONFIG_LWIP_DHCP_OPTIONS_LEN=68 1193 | CONFIG_LWIP_NUM_NETIF_CLIENT_DATA=0 1194 | CONFIG_LWIP_DHCP_COARSE_TIMER_SECS=1 1195 | 1196 | # 1197 | # DHCP server 1198 | # 1199 | CONFIG_LWIP_DHCPS=y 1200 | CONFIG_LWIP_DHCPS_LEASE_UNIT=60 1201 | CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8 1202 | CONFIG_LWIP_DHCPS_STATIC_ENTRIES=y 1203 | # end of DHCP server 1204 | 1205 | # CONFIG_LWIP_AUTOIP is not set 1206 | CONFIG_LWIP_IPV4=y 1207 | CONFIG_LWIP_IPV6=y 1208 | # CONFIG_LWIP_IPV6_AUTOCONFIG is not set 1209 | CONFIG_LWIP_IPV6_NUM_ADDRESSES=3 1210 | # CONFIG_LWIP_IPV6_FORWARD is not set 1211 | # CONFIG_LWIP_NETIF_STATUS_CALLBACK is not set 1212 | CONFIG_LWIP_NETIF_LOOPBACK=y 1213 | CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8 1214 | 1215 | # 1216 | # TCP 1217 | # 1218 | CONFIG_LWIP_MAX_ACTIVE_TCP=16 1219 | CONFIG_LWIP_MAX_LISTENING_TCP=16 1220 | CONFIG_LWIP_TCP_HIGH_SPEED_RETRANSMISSION=y 1221 | CONFIG_LWIP_TCP_MAXRTX=12 1222 | CONFIG_LWIP_TCP_SYNMAXRTX=12 1223 | CONFIG_LWIP_TCP_MSS=1440 1224 | CONFIG_LWIP_TCP_TMR_INTERVAL=250 1225 | CONFIG_LWIP_TCP_MSL=60000 1226 | CONFIG_LWIP_TCP_FIN_WAIT_TIMEOUT=20000 1227 | CONFIG_LWIP_TCP_SND_BUF_DEFAULT=5744 1228 | CONFIG_LWIP_TCP_WND_DEFAULT=5744 1229 | CONFIG_LWIP_TCP_RECVMBOX_SIZE=6 1230 | CONFIG_LWIP_TCP_QUEUE_OOSEQ=y 1231 | CONFIG_LWIP_TCP_OOSEQ_TIMEOUT=6 1232 | CONFIG_LWIP_TCP_OOSEQ_MAX_PBUFS=4 1233 | # CONFIG_LWIP_TCP_SACK_OUT is not set 1234 | CONFIG_LWIP_TCP_OVERSIZE_MSS=y 1235 | # CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set 1236 | # CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set 1237 | CONFIG_LWIP_TCP_RTO_TIME=1500 1238 | # end of TCP 1239 | 1240 | # 1241 | # UDP 1242 | # 1243 | CONFIG_LWIP_MAX_UDP_PCBS=16 1244 | CONFIG_LWIP_UDP_RECVMBOX_SIZE=6 1245 | # end of UDP 1246 | 1247 | # 1248 | # Checksums 1249 | # 1250 | # CONFIG_LWIP_CHECKSUM_CHECK_IP is not set 1251 | # CONFIG_LWIP_CHECKSUM_CHECK_UDP is not set 1252 | CONFIG_LWIP_CHECKSUM_CHECK_ICMP=y 1253 | # end of Checksums 1254 | 1255 | CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=3072 1256 | CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y 1257 | # CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set 1258 | # CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU1 is not set 1259 | CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF 1260 | CONFIG_LWIP_IPV6_ND6_NUM_PREFIXES=5 1261 | CONFIG_LWIP_IPV6_ND6_NUM_ROUTERS=3 1262 | CONFIG_LWIP_IPV6_ND6_NUM_DESTINATIONS=10 1263 | # CONFIG_LWIP_PPP_SUPPORT is not set 1264 | CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3 1265 | CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5 1266 | # CONFIG_LWIP_SLIP_SUPPORT is not set 1267 | 1268 | # 1269 | # ICMP 1270 | # 1271 | CONFIG_LWIP_ICMP=y 1272 | # CONFIG_LWIP_MULTICAST_PING is not set 1273 | # CONFIG_LWIP_BROADCAST_PING is not set 1274 | # end of ICMP 1275 | 1276 | # 1277 | # LWIP RAW API 1278 | # 1279 | CONFIG_LWIP_MAX_RAW_PCBS=16 1280 | # end of LWIP RAW API 1281 | 1282 | # 1283 | # SNTP 1284 | # 1285 | CONFIG_LWIP_SNTP_MAX_SERVERS=1 1286 | # CONFIG_LWIP_DHCP_GET_NTP_SRV is not set 1287 | CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000 1288 | # end of SNTP 1289 | 1290 | # 1291 | # DNS 1292 | # 1293 | CONFIG_LWIP_DNS_MAX_HOST_IP=1 1294 | CONFIG_LWIP_DNS_MAX_SERVERS=3 1295 | # CONFIG_LWIP_FALLBACK_DNS_SERVER_SUPPORT is not set 1296 | # CONFIG_LWIP_DNS_SETSERVER_WITH_NETIF is not set 1297 | # end of DNS 1298 | 1299 | CONFIG_LWIP_BRIDGEIF_MAX_PORTS=7 1300 | 1301 | # 1302 | # Hooks 1303 | # 1304 | # CONFIG_LWIP_HOOK_TCP_ISN_NONE is not set 1305 | CONFIG_LWIP_HOOK_TCP_ISN_DEFAULT=y 1306 | # CONFIG_LWIP_HOOK_TCP_ISN_CUSTOM is not set 1307 | CONFIG_LWIP_HOOK_IP6_ROUTE_NONE=y 1308 | # CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT is not set 1309 | # CONFIG_LWIP_HOOK_IP6_ROUTE_CUSTOM is not set 1310 | CONFIG_LWIP_HOOK_ND6_GET_GW_NONE=y 1311 | # CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT is not set 1312 | # CONFIG_LWIP_HOOK_ND6_GET_GW_CUSTOM is not set 1313 | CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_NONE=y 1314 | # CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_DEFAULT is not set 1315 | # CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM is not set 1316 | CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y 1317 | # CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT is not set 1318 | # CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM is not set 1319 | CONFIG_LWIP_HOOK_IP6_INPUT_NONE=y 1320 | # CONFIG_LWIP_HOOK_IP6_INPUT_DEFAULT is not set 1321 | # CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM is not set 1322 | # end of Hooks 1323 | 1324 | # CONFIG_LWIP_DEBUG is not set 1325 | # end of LWIP 1326 | 1327 | # 1328 | # mbedTLS 1329 | # 1330 | CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y 1331 | # CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set 1332 | # CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set 1333 | CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y 1334 | CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384 1335 | CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096 1336 | # CONFIG_MBEDTLS_DYNAMIC_BUFFER is not set 1337 | # CONFIG_MBEDTLS_DEBUG is not set 1338 | 1339 | # 1340 | # mbedTLS v3.x related 1341 | # 1342 | # CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 is not set 1343 | # CONFIG_MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH is not set 1344 | # CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set 1345 | # CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set 1346 | CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=y 1347 | CONFIG_MBEDTLS_PKCS7_C=y 1348 | # end of mbedTLS v3.x related 1349 | 1350 | # 1351 | # Certificate Bundle 1352 | # 1353 | CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y 1354 | CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=y 1355 | # CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN is not set 1356 | # CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE is not set 1357 | # CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE is not set 1358 | CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200 1359 | # end of Certificate Bundle 1360 | 1361 | # CONFIG_MBEDTLS_ECP_RESTARTABLE is not set 1362 | CONFIG_MBEDTLS_CMAC_C=y 1363 | CONFIG_MBEDTLS_HARDWARE_AES=y 1364 | # CONFIG_MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER is not set 1365 | CONFIG_MBEDTLS_HARDWARE_MPI=y 1366 | # CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI is not set 1367 | CONFIG_MBEDTLS_HARDWARE_SHA=y 1368 | CONFIG_MBEDTLS_ROM_MD5=y 1369 | # CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set 1370 | # CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY is not set 1371 | CONFIG_MBEDTLS_HAVE_TIME=y 1372 | # CONFIG_MBEDTLS_PLATFORM_TIME_ALT is not set 1373 | # CONFIG_MBEDTLS_HAVE_TIME_DATE is not set 1374 | CONFIG_MBEDTLS_ECDSA_DETERMINISTIC=y 1375 | CONFIG_MBEDTLS_SHA512_C=y 1376 | CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y 1377 | # CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set 1378 | # CONFIG_MBEDTLS_TLS_CLIENT_ONLY is not set 1379 | # CONFIG_MBEDTLS_TLS_DISABLED is not set 1380 | CONFIG_MBEDTLS_TLS_SERVER=y 1381 | CONFIG_MBEDTLS_TLS_CLIENT=y 1382 | CONFIG_MBEDTLS_TLS_ENABLED=y 1383 | 1384 | # 1385 | # TLS Key Exchange Methods 1386 | # 1387 | # CONFIG_MBEDTLS_PSK_MODES is not set 1388 | CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y 1389 | CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y 1390 | CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y 1391 | CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y 1392 | CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y 1393 | CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y 1394 | # end of TLS Key Exchange Methods 1395 | 1396 | CONFIG_MBEDTLS_SSL_RENEGOTIATION=y 1397 | CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y 1398 | # CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 is not set 1399 | # CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set 1400 | CONFIG_MBEDTLS_SSL_ALPN=y 1401 | CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y 1402 | CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y 1403 | 1404 | # 1405 | # Symmetric Ciphers 1406 | # 1407 | CONFIG_MBEDTLS_AES_C=y 1408 | # CONFIG_MBEDTLS_CAMELLIA_C is not set 1409 | # CONFIG_MBEDTLS_DES_C is not set 1410 | # CONFIG_MBEDTLS_BLOWFISH_C is not set 1411 | # CONFIG_MBEDTLS_XTEA_C is not set 1412 | CONFIG_MBEDTLS_CCM_C=y 1413 | CONFIG_MBEDTLS_GCM_C=y 1414 | # CONFIG_MBEDTLS_NIST_KW_C is not set 1415 | # end of Symmetric Ciphers 1416 | 1417 | # CONFIG_MBEDTLS_RIPEMD160_C is not set 1418 | 1419 | # 1420 | # Certificates 1421 | # 1422 | CONFIG_MBEDTLS_PEM_PARSE_C=y 1423 | CONFIG_MBEDTLS_PEM_WRITE_C=y 1424 | CONFIG_MBEDTLS_X509_CRL_PARSE_C=y 1425 | CONFIG_MBEDTLS_X509_CSR_PARSE_C=y 1426 | # end of Certificates 1427 | 1428 | CONFIG_MBEDTLS_ECP_C=y 1429 | # CONFIG_MBEDTLS_DHM_C is not set 1430 | CONFIG_MBEDTLS_ECDH_C=y 1431 | CONFIG_MBEDTLS_ECDSA_C=y 1432 | # CONFIG_MBEDTLS_ECJPAKE_C is not set 1433 | CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y 1434 | CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y 1435 | CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y 1436 | CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y 1437 | CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y 1438 | CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y 1439 | CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y 1440 | CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y 1441 | CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y 1442 | CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y 1443 | CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y 1444 | CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y 1445 | CONFIG_MBEDTLS_ECP_NIST_OPTIM=y 1446 | CONFIG_MBEDTLS_ECP_FIXED_POINT_OPTIM=y 1447 | # CONFIG_MBEDTLS_POLY1305_C is not set 1448 | # CONFIG_MBEDTLS_CHACHA20_C is not set 1449 | # CONFIG_MBEDTLS_HKDF_C is not set 1450 | # CONFIG_MBEDTLS_THREADING_C is not set 1451 | CONFIG_MBEDTLS_ERROR_STRINGS=y 1452 | # end of mbedTLS 1453 | 1454 | # 1455 | # ESP-MQTT Configurations 1456 | # 1457 | CONFIG_MQTT_PROTOCOL_311=y 1458 | # CONFIG_MQTT_PROTOCOL_5 is not set 1459 | CONFIG_MQTT_TRANSPORT_SSL=y 1460 | CONFIG_MQTT_TRANSPORT_WEBSOCKET=y 1461 | CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y 1462 | # CONFIG_MQTT_MSG_ID_INCREMENTAL is not set 1463 | # CONFIG_MQTT_SKIP_PUBLISH_IF_DISCONNECTED is not set 1464 | # CONFIG_MQTT_REPORT_DELETED_MESSAGES is not set 1465 | # CONFIG_MQTT_USE_CUSTOM_CONFIG is not set 1466 | # CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED is not set 1467 | # CONFIG_MQTT_CUSTOM_OUTBOX is not set 1468 | # end of ESP-MQTT Configurations 1469 | 1470 | # 1471 | # Newlib 1472 | # 1473 | CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y 1474 | # CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF is not set 1475 | # CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR is not set 1476 | # CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF is not set 1477 | # CONFIG_NEWLIB_STDIN_LINE_ENDING_LF is not set 1478 | CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y 1479 | # CONFIG_NEWLIB_NANO_FORMAT is not set 1480 | CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y 1481 | # CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC is not set 1482 | # CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT is not set 1483 | # CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set 1484 | # end of Newlib 1485 | 1486 | # 1487 | # NVS 1488 | # 1489 | # CONFIG_NVS_ASSERT_ERROR_CHECK is not set 1490 | # CONFIG_NVS_LEGACY_DUP_KEYS_COMPATIBILITY is not set 1491 | # end of NVS 1492 | 1493 | # 1494 | # OpenThread 1495 | # 1496 | # CONFIG_OPENTHREAD_ENABLED is not set 1497 | 1498 | # 1499 | # Thread Operational Dataset 1500 | # 1501 | CONFIG_OPENTHREAD_NETWORK_NAME="OpenThread-ESP" 1502 | CONFIG_OPENTHREAD_MESH_LOCAL_PREFIX="fd00:db8:a0:0::/64" 1503 | CONFIG_OPENTHREAD_NETWORK_CHANNEL=15 1504 | CONFIG_OPENTHREAD_NETWORK_PANID=0x1234 1505 | CONFIG_OPENTHREAD_NETWORK_EXTPANID="dead00beef00cafe" 1506 | CONFIG_OPENTHREAD_NETWORK_MASTERKEY="00112233445566778899aabbccddeeff" 1507 | CONFIG_OPENTHREAD_NETWORK_PSKC="104810e2315100afd6bc9215a6bfac53" 1508 | # end of Thread Operational Dataset 1509 | 1510 | CONFIG_OPENTHREAD_XTAL_ACCURACY=130 1511 | # CONFIG_OPENTHREAD_SPINEL_ONLY is not set 1512 | CONFIG_OPENTHREAD_RX_ON_WHEN_IDLE=y 1513 | 1514 | # 1515 | # Thread Address Query Config 1516 | # 1517 | # end of Thread Address Query Config 1518 | # end of OpenThread 1519 | 1520 | # 1521 | # Protocomm 1522 | # 1523 | CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_0=y 1524 | CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_1=y 1525 | CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_2=y 1526 | # end of Protocomm 1527 | 1528 | # 1529 | # PThreads 1530 | # 1531 | CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5 1532 | CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 1533 | CONFIG_PTHREAD_STACK_MIN=768 1534 | CONFIG_PTHREAD_DEFAULT_CORE_NO_AFFINITY=y 1535 | # CONFIG_PTHREAD_DEFAULT_CORE_0 is not set 1536 | # CONFIG_PTHREAD_DEFAULT_CORE_1 is not set 1537 | CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1 1538 | CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" 1539 | # end of PThreads 1540 | 1541 | # 1542 | # MMU Config 1543 | # 1544 | CONFIG_MMU_PAGE_SIZE_64KB=y 1545 | CONFIG_MMU_PAGE_MODE="64KB" 1546 | CONFIG_MMU_PAGE_SIZE=0x10000 1547 | # end of MMU Config 1548 | 1549 | # 1550 | # Main Flash configuration 1551 | # 1552 | 1553 | # 1554 | # SPI Flash behavior when brownout 1555 | # 1556 | CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y 1557 | CONFIG_SPI_FLASH_BROWNOUT_RESET=y 1558 | # end of SPI Flash behavior when brownout 1559 | 1560 | # 1561 | # Optional and Experimental Features (READ DOCS FIRST) 1562 | # 1563 | 1564 | # 1565 | # Features here require specific hardware (READ DOCS FIRST!) 1566 | # 1567 | # end of Optional and Experimental Features (READ DOCS FIRST) 1568 | # end of Main Flash configuration 1569 | 1570 | # 1571 | # SPI Flash driver 1572 | # 1573 | # CONFIG_SPI_FLASH_VERIFY_WRITE is not set 1574 | # CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set 1575 | CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y 1576 | CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y 1577 | # CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set 1578 | # CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set 1579 | # CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set 1580 | # CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set 1581 | CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y 1582 | CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20 1583 | CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=1 1584 | CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192 1585 | # CONFIG_SPI_FLASH_SIZE_OVERRIDE is not set 1586 | # CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED is not set 1587 | # CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST is not set 1588 | 1589 | # 1590 | # Auto-detect flash chips 1591 | # 1592 | CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORTED=y 1593 | CONFIG_SPI_FLASH_VENDOR_GD_SUPPORTED=y 1594 | CONFIG_SPI_FLASH_VENDOR_ISSI_SUPPORTED=y 1595 | CONFIG_SPI_FLASH_VENDOR_MXIC_SUPPORTED=y 1596 | CONFIG_SPI_FLASH_VENDOR_WINBOND_SUPPORTED=y 1597 | CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=y 1598 | CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=y 1599 | CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y 1600 | CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=y 1601 | # CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP is not set 1602 | # CONFIG_SPI_FLASH_SUPPORT_TH_CHIP is not set 1603 | # end of Auto-detect flash chips 1604 | 1605 | CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=y 1606 | # end of SPI Flash driver 1607 | 1608 | # 1609 | # SPIFFS Configuration 1610 | # 1611 | CONFIG_SPIFFS_MAX_PARTITIONS=3 1612 | 1613 | # 1614 | # SPIFFS Cache Configuration 1615 | # 1616 | CONFIG_SPIFFS_CACHE=y 1617 | CONFIG_SPIFFS_CACHE_WR=y 1618 | # CONFIG_SPIFFS_CACHE_STATS is not set 1619 | # end of SPIFFS Cache Configuration 1620 | 1621 | CONFIG_SPIFFS_PAGE_CHECK=y 1622 | CONFIG_SPIFFS_GC_MAX_RUNS=10 1623 | # CONFIG_SPIFFS_GC_STATS is not set 1624 | CONFIG_SPIFFS_PAGE_SIZE=256 1625 | CONFIG_SPIFFS_OBJ_NAME_LEN=32 1626 | # CONFIG_SPIFFS_FOLLOW_SYMLINKS is not set 1627 | CONFIG_SPIFFS_USE_MAGIC=y 1628 | CONFIG_SPIFFS_USE_MAGIC_LENGTH=y 1629 | CONFIG_SPIFFS_META_LENGTH=4 1630 | CONFIG_SPIFFS_USE_MTIME=y 1631 | 1632 | # 1633 | # Debug Configuration 1634 | # 1635 | # CONFIG_SPIFFS_DBG is not set 1636 | # CONFIG_SPIFFS_API_DBG is not set 1637 | # CONFIG_SPIFFS_GC_DBG is not set 1638 | # CONFIG_SPIFFS_CACHE_DBG is not set 1639 | # CONFIG_SPIFFS_CHECK_DBG is not set 1640 | # CONFIG_SPIFFS_TEST_VISUALISATION is not set 1641 | # end of Debug Configuration 1642 | # end of SPIFFS Configuration 1643 | 1644 | # 1645 | # TCP Transport 1646 | # 1647 | 1648 | # 1649 | # Websocket 1650 | # 1651 | CONFIG_WS_TRANSPORT=y 1652 | CONFIG_WS_BUFFER_SIZE=1024 1653 | # CONFIG_WS_DYNAMIC_BUFFER is not set 1654 | # end of Websocket 1655 | # end of TCP Transport 1656 | 1657 | # 1658 | # Ultra Low Power (ULP) Co-processor 1659 | # 1660 | # CONFIG_ULP_COPROC_ENABLED is not set 1661 | # end of Ultra Low Power (ULP) Co-processor 1662 | 1663 | # 1664 | # Unity unit testing library 1665 | # 1666 | CONFIG_UNITY_ENABLE_FLOAT=y 1667 | CONFIG_UNITY_ENABLE_DOUBLE=y 1668 | # CONFIG_UNITY_ENABLE_64BIT is not set 1669 | # CONFIG_UNITY_ENABLE_COLOR is not set 1670 | CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y 1671 | # CONFIG_UNITY_ENABLE_FIXTURE is not set 1672 | # CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set 1673 | # end of Unity unit testing library 1674 | 1675 | # 1676 | # Virtual file system 1677 | # 1678 | CONFIG_VFS_SUPPORT_IO=y 1679 | CONFIG_VFS_SUPPORT_DIR=y 1680 | CONFIG_VFS_SUPPORT_SELECT=y 1681 | CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y 1682 | # CONFIG_VFS_SELECT_IN_RAM is not set 1683 | CONFIG_VFS_SUPPORT_TERMIOS=y 1684 | CONFIG_VFS_MAX_COUNT=8 1685 | 1686 | # 1687 | # Host File System I/O (Semihosting) 1688 | # 1689 | CONFIG_VFS_SEMIHOSTFS_MAX_MOUNT_POINTS=1 1690 | # end of Host File System I/O (Semihosting) 1691 | # end of Virtual file system 1692 | 1693 | # 1694 | # Wear Levelling 1695 | # 1696 | # CONFIG_WL_SECTOR_SIZE_512 is not set 1697 | CONFIG_WL_SECTOR_SIZE_4096=y 1698 | CONFIG_WL_SECTOR_SIZE=4096 1699 | # end of Wear Levelling 1700 | 1701 | # 1702 | # Wi-Fi Provisioning Manager 1703 | # 1704 | CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16 1705 | CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30 1706 | # CONFIG_WIFI_PROV_BLE_FORCE_ENCRYPTION is not set 1707 | CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN=y 1708 | # CONFIG_WIFI_PROV_STA_FAST_SCAN is not set 1709 | # end of Wi-Fi Provisioning Manager 1710 | # end of Component config 1711 | 1712 | CONFIG_IDF_EXPERIMENTAL_FEATURES=y 1713 | 1714 | # Deprecated options for backward compatibility 1715 | # CONFIG_APP_BUILD_TYPE_ELF_RAM is not set 1716 | # CONFIG_NO_BLOBS is not set 1717 | # CONFIG_ESP32_NO_BLOBS is not set 1718 | # CONFIG_ESP32_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set 1719 | # CONFIG_ESP32_COMPATIBLE_PRE_V3_1_BOOTLOADERS is not set 1720 | # CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set 1721 | # CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set 1722 | # CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set 1723 | CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y 1724 | # CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set 1725 | # CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set 1726 | CONFIG_LOG_BOOTLOADER_LEVEL=3 1727 | # CONFIG_APP_ROLLBACK_ENABLE is not set 1728 | # CONFIG_FLASH_ENCRYPTION_ENABLED is not set 1729 | # CONFIG_FLASHMODE_QIO is not set 1730 | # CONFIG_FLASHMODE_QOUT is not set 1731 | CONFIG_FLASHMODE_DIO=y 1732 | # CONFIG_FLASHMODE_DOUT is not set 1733 | CONFIG_MONITOR_BAUD=115200 1734 | # CONFIG_OPTIMIZATION_LEVEL_DEBUG is not set 1735 | # CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG is not set 1736 | # CONFIG_COMPILER_OPTIMIZATION_DEFAULT is not set 1737 | CONFIG_OPTIMIZATION_LEVEL_RELEASE=y 1738 | CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE=y 1739 | # CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED is not set 1740 | # CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set 1741 | CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED=y 1742 | CONFIG_OPTIMIZATION_ASSERTION_LEVEL=0 1743 | # CONFIG_CXX_EXCEPTIONS is not set 1744 | CONFIG_STACK_CHECK_NONE=y 1745 | # CONFIG_STACK_CHECK_NORM is not set 1746 | # CONFIG_STACK_CHECK_STRONG is not set 1747 | # CONFIG_STACK_CHECK_ALL is not set 1748 | # CONFIG_WARN_WRITE_STRINGS is not set 1749 | # CONFIG_ESP32_APPTRACE_DEST_TRAX is not set 1750 | CONFIG_ESP32_APPTRACE_DEST_NONE=y 1751 | CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y 1752 | CONFIG_ADC2_DISABLE_DAC=y 1753 | # CONFIG_MCPWM_ISR_IN_IRAM is not set 1754 | # CONFIG_EVENT_LOOP_PROFILING is not set 1755 | CONFIG_POST_EVENTS_FROM_ISR=y 1756 | CONFIG_POST_EVENTS_FROM_IRAM_ISR=y 1757 | CONFIG_GDBSTUB_SUPPORT_TASKS=y 1758 | CONFIG_GDBSTUB_MAX_TASKS=32 1759 | # CONFIG_OTA_ALLOW_HTTP is not set 1760 | # CONFIG_TWO_UNIVERSAL_MAC_ADDRESS is not set 1761 | CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS=y 1762 | CONFIG_NUMBER_OF_UNIVERSAL_MAC_ADDRESS=4 1763 | CONFIG_ESP_SYSTEM_PD_FLASH=y 1764 | CONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAY=2000 1765 | CONFIG_ESP_SLEEP_DEEP_SLEEP_WAKEUP_DELAY=2000 1766 | CONFIG_ESP32_RTC_CLK_SRC_INT_RC=y 1767 | CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC=y 1768 | # CONFIG_ESP32_RTC_CLK_SRC_EXT_CRYS is not set 1769 | # CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_CRYSTAL is not set 1770 | # CONFIG_ESP32_RTC_CLK_SRC_EXT_OSC is not set 1771 | # CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_OSC is not set 1772 | # CONFIG_ESP32_RTC_CLK_SRC_INT_8MD256 is not set 1773 | # CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_8MD256 is not set 1774 | CONFIG_ESP32_RTC_CLK_CAL_CYCLES=1024 1775 | # CONFIG_ESP32_XTAL_FREQ_26 is not set 1776 | CONFIG_ESP32_XTAL_FREQ_40=y 1777 | # CONFIG_ESP32_XTAL_FREQ_AUTO is not set 1778 | CONFIG_ESP32_XTAL_FREQ=40 1779 | CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y 1780 | # CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION is not set 1781 | CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20 1782 | CONFIG_ESP32_PHY_MAX_TX_POWER=20 1783 | CONFIG_REDUCE_PHY_TX_POWER=y 1784 | CONFIG_ESP32_REDUCE_PHY_TX_POWER=y 1785 | # CONFIG_SPIRAM_SUPPORT is not set 1786 | # CONFIG_ESP32_SPIRAM_SUPPORT is not set 1787 | # CONFIG_ESP32_DEFAULT_CPU_FREQ_80 is not set 1788 | CONFIG_ESP32_DEFAULT_CPU_FREQ_160=y 1789 | # CONFIG_ESP32_DEFAULT_CPU_FREQ_240 is not set 1790 | CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=160 1791 | CONFIG_TRACEMEM_RESERVE_DRAM=0x0 1792 | # CONFIG_ESP32_PANIC_PRINT_HALT is not set 1793 | CONFIG_ESP32_PANIC_PRINT_REBOOT=y 1794 | # CONFIG_ESP32_PANIC_SILENT_REBOOT is not set 1795 | # CONFIG_ESP32_PANIC_GDBSTUB is not set 1796 | CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 1797 | CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304 1798 | CONFIG_MAIN_TASK_STACK_SIZE=3584 1799 | CONFIG_CONSOLE_UART_DEFAULT=y 1800 | # CONFIG_CONSOLE_UART_CUSTOM is not set 1801 | # CONFIG_CONSOLE_UART_NONE is not set 1802 | # CONFIG_ESP_CONSOLE_UART_NONE is not set 1803 | CONFIG_CONSOLE_UART=y 1804 | CONFIG_CONSOLE_UART_NUM=0 1805 | CONFIG_CONSOLE_UART_BAUDRATE=115200 1806 | CONFIG_INT_WDT=y 1807 | CONFIG_INT_WDT_TIMEOUT_MS=300 1808 | CONFIG_INT_WDT_CHECK_CPU1=y 1809 | CONFIG_TASK_WDT=y 1810 | CONFIG_ESP_TASK_WDT=y 1811 | # CONFIG_TASK_WDT_PANIC is not set 1812 | CONFIG_TASK_WDT_TIMEOUT_S=5 1813 | CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y 1814 | CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1=y 1815 | # CONFIG_ESP32_DEBUG_STUBS_ENABLE is not set 1816 | CONFIG_ESP32_DEBUG_OCDAWARE=y 1817 | CONFIG_BROWNOUT_DET=y 1818 | CONFIG_ESP32_BROWNOUT_DET=y 1819 | CONFIG_BROWNOUT_DET_LVL_SEL_0=y 1820 | CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_0=y 1821 | # CONFIG_BROWNOUT_DET_LVL_SEL_1 is not set 1822 | # CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_1 is not set 1823 | # CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set 1824 | # CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_2 is not set 1825 | # CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set 1826 | # CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_3 is not set 1827 | # CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set 1828 | # CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_4 is not set 1829 | # CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set 1830 | # CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_5 is not set 1831 | # CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set 1832 | # CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_6 is not set 1833 | # CONFIG_BROWNOUT_DET_LVL_SEL_7 is not set 1834 | # CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_7 is not set 1835 | CONFIG_BROWNOUT_DET_LVL=0 1836 | CONFIG_ESP32_BROWNOUT_DET_LVL=0 1837 | # CONFIG_DISABLE_BASIC_ROM_CONSOLE is not set 1838 | CONFIG_IPC_TASK_STACK_SIZE=1536 1839 | CONFIG_TIMER_TASK_STACK_SIZE=3584 1840 | CONFIG_ESP32_WIFI_ENABLED=y 1841 | CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10 1842 | CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32 1843 | # CONFIG_ESP32_WIFI_STATIC_TX_BUFFER is not set 1844 | CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y 1845 | CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1 1846 | CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=32 1847 | # CONFIG_ESP32_WIFI_CSI_ENABLED is not set 1848 | CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y 1849 | CONFIG_ESP32_WIFI_TX_BA_WIN=6 1850 | CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y 1851 | CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y 1852 | CONFIG_ESP32_WIFI_RX_BA_WIN=6 1853 | CONFIG_ESP32_WIFI_RX_BA_WIN=6 1854 | CONFIG_ESP32_WIFI_NVS_ENABLED=y 1855 | CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0=y 1856 | # CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1 is not set 1857 | CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 1858 | CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 1859 | CONFIG_ESP32_WIFI_IRAM_OPT=y 1860 | CONFIG_ESP32_WIFI_RX_IRAM_OPT=y 1861 | CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y 1862 | CONFIG_ESP32_WIFI_ENABLE_WPA3_OWE_STA=y 1863 | CONFIG_WPA_MBEDTLS_CRYPTO=y 1864 | CONFIG_WPA_MBEDTLS_TLS_CLIENT=y 1865 | # CONFIG_WPA_WAPI_PSK is not set 1866 | # CONFIG_WPA_11KV_SUPPORT is not set 1867 | # CONFIG_WPA_MBO_SUPPORT is not set 1868 | # CONFIG_WPA_DPP_SUPPORT is not set 1869 | # CONFIG_WPA_11R_SUPPORT is not set 1870 | # CONFIG_WPA_WPS_SOFTAP_REGISTRAR is not set 1871 | # CONFIG_WPA_WPS_STRICT is not set 1872 | # CONFIG_WPA_DEBUG_PRINT is not set 1873 | # CONFIG_WPA_TESTING_OPTIONS is not set 1874 | # CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set 1875 | # CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set 1876 | CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y 1877 | CONFIG_TIMER_TASK_PRIORITY=1 1878 | CONFIG_TIMER_TASK_STACK_DEPTH=2048 1879 | CONFIG_TIMER_QUEUE_LENGTH=10 1880 | # CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK is not set 1881 | # CONFIG_L2_TO_L3_COPY is not set 1882 | CONFIG_ESP_GRATUITOUS_ARP=y 1883 | CONFIG_GARP_TMR_INTERVAL=60 1884 | CONFIG_TCPIP_RECVMBOX_SIZE=32 1885 | CONFIG_TCP_MAXRTX=12 1886 | CONFIG_TCP_SYNMAXRTX=12 1887 | CONFIG_TCP_MSS=1440 1888 | CONFIG_TCP_MSL=60000 1889 | CONFIG_TCP_SND_BUF_DEFAULT=5744 1890 | CONFIG_TCP_WND_DEFAULT=5744 1891 | CONFIG_TCP_RECVMBOX_SIZE=6 1892 | CONFIG_TCP_QUEUE_OOSEQ=y 1893 | CONFIG_TCP_OVERSIZE_MSS=y 1894 | # CONFIG_TCP_OVERSIZE_QUARTER_MSS is not set 1895 | # CONFIG_TCP_OVERSIZE_DISABLE is not set 1896 | CONFIG_UDP_RECVMBOX_SIZE=6 1897 | CONFIG_TCPIP_TASK_STACK_SIZE=3072 1898 | CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y 1899 | # CONFIG_TCPIP_TASK_AFFINITY_CPU0 is not set 1900 | # CONFIG_TCPIP_TASK_AFFINITY_CPU1 is not set 1901 | CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF 1902 | # CONFIG_PPP_SUPPORT is not set 1903 | CONFIG_ESP32_TIME_SYSCALL_USE_RTC_HRT=y 1904 | CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1=y 1905 | # CONFIG_ESP32_TIME_SYSCALL_USE_RTC is not set 1906 | # CONFIG_ESP32_TIME_SYSCALL_USE_HRT is not set 1907 | # CONFIG_ESP32_TIME_SYSCALL_USE_FRC1 is not set 1908 | # CONFIG_ESP32_TIME_SYSCALL_USE_NONE is not set 1909 | CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 1910 | CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 1911 | CONFIG_ESP32_PTHREAD_STACK_MIN=768 1912 | CONFIG_ESP32_DEFAULT_PTHREAD_CORE_NO_AFFINITY=y 1913 | # CONFIG_ESP32_DEFAULT_PTHREAD_CORE_0 is not set 1914 | # CONFIG_ESP32_DEFAULT_PTHREAD_CORE_1 is not set 1915 | CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1 1916 | CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread" 1917 | CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y 1918 | # CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set 1919 | # CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set 1920 | # CONFIG_ESP32_ULP_COPROC_ENABLED is not set 1921 | CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y 1922 | CONFIG_SUPPORT_TERMIOS=y 1923 | CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1 1924 | # End of deprecated options 1925 | --------------------------------------------------------------------------------