diff --git a/Documentation/firmware/getting_started.md b/Documentation/firmware/getting_started.md index 1edddc3..1c5265f 100644 --- a/Documentation/firmware/getting_started.md +++ b/Documentation/firmware/getting_started.md @@ -4,15 +4,15 @@ This guide covers how to set up the development environment, clone the required ## Prerequisites -- **nRF Connect SDK** (NCS) v2.x with Zephyr RTOS +- **nRF Connect SDK** (NCS) v2.6.1 with Zephyr RTOS (newer SDK/toolchain versions are not currently supported) - **Visual Studio Code** with the nRF Connect for VS Code extension (recommended) - **SEGGER J-Link** debugger (or the BioGAP Debug Board) -- **Python 3.10+** with west build tool +- **Python 3.10+** with the `west` build tool - Git ## Step 1: Clone the SENSEI-SDK -The firmware depends on the SENSEI-SDK, which provides the Zephyr board support package for the custom `nrf5340_senseiv1` board and all third-party dependencies. +The firmware depends on the SENSEI-SDK, which provides the Zephyr board support package for the custom `nrf5340_senseiv1` board, the BioGAP shield definitions (ExG, PPG, WiFi/SD), and all third-party dependencies. ```bash git clone https://github.com/pulp-bio/sensei-sdk.git @@ -20,120 +20,110 @@ cd sensei-sdk git submodule update --init --recursive ``` -Set the `SENSEI_SDK_ROOT` environment variable to point to this directory: +Check out the branch that adds the BioGAP board overlays and shield definitions: ```bash -export SENSEI_SDK_ROOT=/path/to/sensei-sdk +git checkout feat/add-biogap-overlays ``` +> There is **no manual copy-paste step anymore**. Earlier versions of this guide had you copy `Firmware/custom_dts` and `Firmware/custom_shields` into the SDK and hand-edit the board `.dts` file — that workflow is gone. Everything BioGAP-specific (the `nrf5340_senseiv1` board files, the `SENSEI_ExGShield` / `SENSEI_PPGShield` / `SENSEI_WiFi_SD_Shield_V1` shield overlays, the ADS1298 devicetree binding) now lives directly in this branch of the sensei-sdk repo. + ## Step 2: Clone the BioGAP Repository ```bash git clone https://github.com/pulp-bio/BioGAP.git ``` -## Step 3: Integrate Custom Files into the SENSEI-SDK +## Step 3: Point the Build at Your SENSEI-SDK Clone -The BioGAP firmware requires custom device tree bindings and shield definitions that are not part of the base SENSEI-SDK. These are provided in the `Firmware/` directory. +The build reads the `SENSEI_SDK_ROOT` environment variable to locate the SDK (registered as a Zephyr module in `Firmware/src_NRF/CMakeLists.txt`). Get this wrong and CMake fails at configure time with either `SENSEI_SDK_ROOT is not defined` or `Expected Zephyr module metadata at '/NRF/zephyr/module.yml'`. -### Copy Custom Device Tree Bindings +### Windows (PowerShell) -The ADS1298 AFE binding must be added to the SDK: +Set it **persistently** (so every new shell/VS Code launch picks it up) *and* in your **current session** (so it's available immediately, without waiting for a restart): -```bash -cp -r Firmware/custom_dts/* $SENSEI_SDK_ROOT/NRF/dts/bindings +```powershell +[Environment]::SetEnvironmentVariable("SENSEI_SDK_ROOT", "C:\path\to\sensei-sdk", "User") +$env:SENSEI_SDK_ROOT = "C:\path\to\sensei-sdk" +``` + +Verify: + +```powershell +echo $env:SENSEI_SDK_ROOT ``` -### Copy Custom Shield Definitions +> **This is the part that actually trips people up.** `SetEnvironmentVariable(..., "User")` writes to the registry, but it only affects *new* processes started after the call — it does **not** update already-running ones. If VS Code (or a terminal, or the nRF Connect build task) was already open when you set it, it will keep using the old value no matter how many times you reopen a terminal panel or "Reload Window" inside it. **Fully quit VS Code** (all windows, confirm it's not still running in the background) and relaunch it before building again. -The ExG and PPG shield overlays must be added to the SDK: +### Linux / macOS (bash/zsh) ```bash -cp -r Firmware/custom_shields/* $SENSEI_SDK_ROOT/NRF/boards/shields +export SENSEI_SDK_ROOT=/path/to/sensei-sdk ``` -## Step 4: Modify the SENSEI-SDK Device Tree +Add this to your shell profile (`.bashrc`/`.zshrc`) to persist it across sessions. -The base SENSEI-SDK device tree file needs modifications to support the BioGAP hardware. Edit the file: +## Step 4: Build the Firmware -``` -$SENSEI_SDK_ROOT/NRF/boards/arm/nrf5340_senseiv1/nrf5340_senseiv1_cpuapp.dts -``` +Two ways to build; the command line is the more reliable of the two in practice (see Troubleshooting) — try it first if the extension gives you trouble. -### 4a. Comment out the UART GAP alias +### Option A: Command line (recommended) -Change the `aliases` block from: +`west build`/`west flash` are **west extension commands** — they only exist when `west` can locate its workspace (the NCS installation's `.west` folder, e.g. `C:\ncs\v2.6.1`) by walking up from your current directory. Your BioGAP/sensei-sdk checkouts almost certainly live *outside* that workspace tree, so you must run `west` **from inside the NCS workspace root** and point it at your application explicitly with `--build-dir`/a positional source-dir argument — this is the standard, supported way Zephyr/NCS builds out-of-tree applications, not a workaround. -```dts -aliases { - i2ca = &i2c0; - i2cb = &i2c1; - uartgap = &uart_gap; -}; +```powershell +# Make sure SENSEI_SDK_ROOT is set in *this* shell (see Step 3) — check with: +echo $env:SENSEI_SDK_ROOT + +cd C:\ncs\v2.6.1 # your NCS workspace root — wherever `west init` set it up +west build --build-dir C:\path\to\BioGAP\Firmware\src_NRF\build C:\path\to\BioGAP\Firmware\src_NRF --board nrf5340_senseiv1_cpuapp --pristine ``` -To: +Drop `--pristine` on later incremental builds (it forces a full reconfigure/clean build — useful the first time or after changing Kconfig/CMakeLists, unnecessary otherwise, and slower). -```dts -aliases { - i2ca = &i2c0; - i2cb = &i2c1; - // uartgap = &uart_gap; -}; -``` +On Linux/macOS the same idea applies with your shell's syntax (`cd ~/ncs/v2.6.1 && west build --build-dir ~/BioGAP/Firmware/src_NRF/build ~/BioGAP/Firmware/src_NRF --board nrf5340_senseiv1_cpuapp --pristine`). -### 4b. Add GPIO button definitions - -Add the following block immediately after the `aliases` block: - -```dts -buttons { - gpio_lis2duxs12_int1: gpio_lis2duxs12_int1 { - gpios = <&gpio0 23 GPIO_ACTIVE_HIGH>; - label = "LIS2DUXS12_INT"; - }; - gpio_soft_rst: gpio_soft_rst { - gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; - label = "BUTTON_SOFT_INT"; - }; -}; -``` +### Option B: nRF Connect for VS Code Extension -### 4c. Comment out the UART3 pin control - -Comment out the `uart_gap_default` and `uart_gap_sleep` pin control groups: - -```dts -// uart_gap_default: uart0_default { -// group1 { -// psels = , -// ; -// }; -// }; -// -// uart_gap_sleep: uart0_sleep { -// group1 { -// psels = , -// ; -// low-power-enable; -// }; -// }; -``` +1. Open the `sensei-sdk` folder in VS Code first, then use "Open an existing application" from the nRF Connect extension to open `BioGAP/Firmware/src_NRF` — opening `src_NRF` directly, without the SDK folder as the workspace root, will not resolve the SDK modules correctly. +2. In the "Applications" tab, select the application and click **Add Build Configuration**. +3. Under **CMakePreset**, select "Build for NRF5340 SENSEIV1C APP (build)". +4. Select **SDK version v2.6.1** and **Toolchain version v2.9.1** (newer versions are not currently supported). +5. Select **`nrf5340_senseiv1_cpuapp`** as the **Board Target**. +6. Click **Generate and Build**. + +In practice, step 5 has been unreliable: the Board Target picker in the extension appears to build its list independently of this app's own `CMakeLists.txt` (where the SDK module is actually registered), so it may never offer `nrf5340_senseiv1_cpuapp` at all, and the field has not accepted it typed in manually either. If you hit that, fall back to Option A — the underlying build works correctly either way, since Option A is exactly what the extension itself runs under the hood. -### 4d. Comment out the UART3 node definition +## Step 5: Flash the Firmware -Comment out the `uart_gap` node at the bottom of the file: +### Command line -```dts -// uart_gap: &uart3 { -// status = "okay"; -// current-speed = <115200>; -// pinctrl-0 = <&uart_gap_default>; -// pinctrl-1 = <&uart_gap_sleep>; -// pinctrl-names = "default", "sleep"; -// }; +From the same NCS-workspace-rooted shell as the build: + +```powershell +cd C:\ncs\v2.6.1 +west flash --build-dir C:\path\to\BioGAP\Firmware\src_NRF\build ``` -## Step 5: Build the Firmware +This uses whichever runner the board supports by default (nrfjprog/J-Link for the nRF5340). Make sure the SEGGER J-Link (or BioGAP Debug Board) is connected before running it. + +### nRF Connect for VS Code Extension + +From the "Actions" tab of the build configuration, click **Flash**. + +## Troubleshooting + +**`CMake Error: ... is not a valid zephyr module` / `Expected Zephyr module metadata at '/NRF/zephyr/module.yml'`** +`SENSEI_SDK_ROOT` doesn't point at a real sensei-sdk checkout (typo, stale/deleted clone, or a value set before you had cloned it). Re-check Step 3, and remember the VS Code restart requirement above. + +**Devicetree parse error, e.g. `undefined node label 'spi_a'` in a shield overlay** +This means the build picked the *wrong board* — a generic Nordic dev-kit board (`nrf52840dk_nrf52840`, `nrf5340dk_nrf5340_cpuapp`, ...) instead of `nrf5340_senseiv1_cpuapp`. Those boards don't define the BioGAP-specific aliases (`spi_a`, `spi_b`, ...) the shield overlays reference. Double-check the `--board` value (CLI) or re-select the board target (extension) as described in Step 4. + +**The board target reverted to a generic board after I deleted the `build/` folder** +The nRF Connect extension stores which board you picked for a given build configuration inside that build folder (`.vscode-nrf-connect.json`). Deleting `build/` to clear a stale `CMakeCache.txt` also deletes that memory — you'll need to re-add the build configuration and re-select `nrf5340_senseiv1_cpuapp` explicitly; it won't come back on its own. This is one reason Option A (command line) is more predictable. + +**`west: unknown command "build"; do you need to run this inside a workspace?`** +You ran `west build`/`west flash` from a directory that isn't inside (or a descendant of) the NCS workspace root. `cd` into the workspace root first (e.g. `C:\ncs\v2.6.1`) and pass your app's path explicitly via `--build-dir`/the positional source-dir argument, as shown in Step 4 Option A. -Once everything is set up, you can build the firmware. The instruction are exactly the same as the one provided in the [SENSEI-SDK repository](https://github.com/pulp-bio/sensei-sdk). \ No newline at end of file +**`ImportError: DLL load failed while importing _ctypes`** (usually during the MCUboot child-image build, in `imgtool.py`) +An active Conda environment (prompt shows `(base)` or similar) is shadowing the NCS toolchain's own bundled Python DLLs on `PATH`. Run `conda deactivate` (repeat if nested) in that shell before building, or use a shell that doesn't auto-activate Conda (e.g. `powershell.exe -NoProfile`, or check `$PROFILE` for a `conda init` block to disable for this session). diff --git a/Firmware/.gitignore b/Firmware/.gitignore index aafe9a9..0d714d7 100644 --- a/Firmware/.gitignore +++ b/Firmware/.gitignore @@ -39,3 +39,7 @@ src_GAP/*.png src_GAP/*.ppm serial_log.log + + +// ignore claude +*.claude \ No newline at end of file diff --git a/Firmware/custom_dts/ads1298/ti,ads1298_a.yaml b/Firmware/custom_dts/ads1298/ti,ads1298_a.yaml deleted file mode 100644 index 9690ad8..0000000 --- a/Firmware/custom_dts/ads1298/ti,ads1298_a.yaml +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright (c) 2024 Arduino SA -# SPDX-License-Identifier: Apache-2.0 - -description: | - Blabla - - - - -compatible: "ti,ads1298_a" - -properties: - reg: - type: int - required: true - description: Chip select for the device - - spi-max-frequency: - type: int - required: true - description: Maximum SPI clock frequency - - duplex: - type: int - required: false - description: Full (1) or half (0) duplex SPI communication - - frame-format: - type: int - required: false - description: SPI frame format (e.g., Motorola SPI = 0) \ No newline at end of file diff --git a/Firmware/custom_shields/SENSEI_ExGShield/Kconfig.shield b/Firmware/custom_shields/SENSEI_ExGShield/Kconfig.shield deleted file mode 100644 index ce40f50..0000000 --- a/Firmware/custom_shields/SENSEI_ExGShield/Kconfig.shield +++ /dev/null @@ -1,5 +0,0 @@ -# Copyright (c) 2019 Linaro Limited -# SPDX-License-Identifier: Apache-2.0 - -config SHIELD_SENSEI_EXGSHIELD - def_bool $(shields_list_contains,SENSEI_ExGShield) diff --git a/Firmware/custom_shields/SENSEI_ExGShield/SENSEI_ExGShield.defconfig b/Firmware/custom_shields/SENSEI_ExGShield/SENSEI_ExGShield.defconfig deleted file mode 100644 index 0164081..0000000 --- a/Firmware/custom_shields/SENSEI_ExGShield/SENSEI_ExGShield.defconfig +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright (c) 2024 Nordic Semiconductor ASA -# SPDX-License-Identifier: Apache-2.0 - -CONFIG_GPIO_PCA64XXA=n -CONFIG_BME680=n - - -CONFIG_TFM_SECURE_UART=n -CONFIG_TFM_LOG_LEVEL_SILENCE=y - diff --git a/Firmware/custom_shields/SENSEI_ExGShield/SENSEI_ExGShield.overlay b/Firmware/custom_shields/SENSEI_ExGShield/SENSEI_ExGShield.overlay deleted file mode 100644 index 30a1f77..0000000 --- a/Firmware/custom_shields/SENSEI_ExGShield/SENSEI_ExGShield.overlay +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2022 Nordic Semiconductor ASA - * - * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause - */ - - / { - - sensei_pwr: sensei_pwr { - compatible = "gpio-leds"; - gpio_ads1298_pwr: gpio_ads1298_pwr { - gpios = <&gpio0 31 GPIO_ACTIVE_HIGH>; // nRF_P0.31 corresponds to gpio0 31 - label = "ADS1298_PWR"; - }; - }; - - gpio_nodes { - compatible = "gpio-leds"; - - gpio_ads1298_a_spi_cs: gpio_ads1298_a_spi_cs { - gpios = <&gpio0 11 GPIO_ACTIVE_LOW>; - label = "ADS1298_A_SPI_CS"; - }; - - gpio_ads1298_b_spi_cs: gpio_ads1298_b_spi_cs { - gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; - label = "ADS1298_B_SPI_CS"; - }; - - gpio_ads1298_start_pin: gpio_ads1298_start_pin { - gpios = <&gpio1 0 GPIO_ACTIVE_HIGH>; - label = "ADS1298_START_PIN"; - }; - }; - - buttons{ - gpio_ads1298_a_dr: gpio_ads1298_a_dr { - gpios = <&gpio0 2 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; - label = "ADS1298_A_DR"; - }; - gpio_ppg_max86150_dr: gpio_ppg_max86150_dr { - gpios = <&gpio0 12 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; - label = "MAX86150_DR"; - }; - }; - - - -}; - - - -/* STEP 2.1 - Add the SPI peripheral to spi2 */ -&i2c2 { status = "disabled";}; -&uart2 { status = "disabled";}; - - -/* -&spi2 { - status = "okay"; - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi_dummy>; -};*/ - -&spi2 { - compatible = "nordic,nrf-spim"; - status = "okay"; - pinctrl-0 = <&spi2_default>; - pinctrl-1 = <&spi2_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&gpio1 11 GPIO_ACTIVE_LOW>; - ads1298_a: ads1298_a@0 { - compatible = "ti,ads1298_a"; - reg = <0>; - spi-max-frequency = <8000000>; - duplex = <1>; // Full duplex - frame-format = <0>; // SPI frame format (default, typically 0) - }; -}; - - -&pinctrl { - spi2_default: spi2_default { - group1 { - psels = , - , - ; - }; - }; - - spi2_sleep: spi2_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; -}; - diff --git a/Firmware/custom_shields/SENSEI_PPGShield/Kconfig.shield b/Firmware/custom_shields/SENSEI_PPGShield/Kconfig.shield deleted file mode 100644 index 7dfa228..0000000 --- a/Firmware/custom_shields/SENSEI_PPGShield/Kconfig.shield +++ /dev/null @@ -1,5 +0,0 @@ -# Copyright (c) 2019 Linaro Limited -# SPDX-License-Identifier: Apache-2.0 - -config SHIELD_SENSEI_PPGSHIELD - def_bool $(shields_list_contains,SENSEI_PPGShield) diff --git a/Firmware/custom_shields/SENSEI_PPGShield/SENSEI_PPGShield.defconfig b/Firmware/custom_shields/SENSEI_PPGShield/SENSEI_PPGShield.defconfig deleted file mode 100644 index 0164081..0000000 --- a/Firmware/custom_shields/SENSEI_PPGShield/SENSEI_PPGShield.defconfig +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright (c) 2024 Nordic Semiconductor ASA -# SPDX-License-Identifier: Apache-2.0 - -CONFIG_GPIO_PCA64XXA=n -CONFIG_BME680=n - - -CONFIG_TFM_SECURE_UART=n -CONFIG_TFM_LOG_LEVEL_SILENCE=y - diff --git a/Firmware/custom_shields/SENSEI_PPGShield/SENSEI_PPGShield.overlay b/Firmware/custom_shields/SENSEI_PPGShield/SENSEI_PPGShield.overlay deleted file mode 100644 index b156434..0000000 --- a/Firmware/custom_shields/SENSEI_PPGShield/SENSEI_PPGShield.overlay +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright (c) 2022 Nordic Semiconductor ASA - * - * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause - */ - - - -&i2c1 { - max86150ppg: max86150ppg@5e{ - compatible = "i2c-device"; - reg = < 0x5e >; - label = "MAX86150_PPG"; - }; -}; diff --git a/Firmware/src_NRF/BLE_PACKET_STRUCTURE.md b/Firmware/docs/BLE_PACKET_STRUCTURE.md similarity index 100% rename from Firmware/src_NRF/BLE_PACKET_STRUCTURE.md rename to Firmware/docs/BLE_PACKET_STRUCTURE.md diff --git a/Firmware/src_NRF/Mainboard_Schematics.PDF b/Firmware/docs/Mainboard_Schematics.PDF similarity index 100% rename from Firmware/src_NRF/Mainboard_Schematics.PDF rename to Firmware/docs/Mainboard_Schematics.PDF diff --git a/Firmware/docs/firmware_overview.md b/Firmware/docs/firmware_overview.md new file mode 100644 index 0000000..e48ff8c --- /dev/null +++ b/Firmware/docs/firmware_overview.md @@ -0,0 +1,128 @@ +# BioGAP NRF Firmware Overview + +This document describes the architecture of the nRF5340 firmware in `Firmware/src_NRF`. It targets the `nrf5340_senseiv1_cpuapp` board defined in the companion [sensei-sdk](https://github.com/pulp-bio/sensei-sdk) repository, built as a Zephyr/nRF Connect SDK application. + +## 1. Purpose + +The nRF5340 is the central controller of the BioGAP wearable: it drives the ADS1298 analog front-end(s) for ExG (EEG/EMG) acquisition, talks to a set of optional sensor shields (PPG, IMU, microphone, WULPUS ultrasound), and streams the resulting data to a host application over one of two mutually-exclusive transports: + +- **BLE** (Nordic UART Service) — the default. +- **WiFi/SD shield** (an ESP32-C6 acting as SPI slave to the nRF) — selected at build time via `CONFIG_WI_FI`. + +Both transports funnel *incoming* commands through a single transport-agnostic dispatcher, so the sensor/streaming logic itself doesn't need to know which transport is active. + +## 2. Directory Layout + +``` +src_NRF/ +├── main.c Entry point: power-up, SPI/GPIO init, transport selection, sensor init +├── Kconfig Feature toggles (sensors, transport, diagnostics, multi-board sync) +├── CMakeLists.txt Build config: shields, sources, conditional compilation +├── prj.conf Zephyr/NCS project configuration (peripherals, BLE stack, logging, ...) +│ +├── afe/ ADS1298 analog front-end driver (ExG: EEG/EMG) +├── ble/ BLE stack (NUS) + BLE-side application glue +├── bsp/ Board support: power thread, system status, I2C mux, diagnostics +├── core/ Cross-cutting: command dispatcher, sync primitives, shared definitions +├── sensors/ One subfolder per sensor modality +│ ├── eeg/ emg/ Built on top of afe/ (ADS1298) +│ ├── imu/ LSM6DSV16BX accelerometer + gyroscope +│ ├── mic/ PDM microphone +│ ├── ppg_new/ MAXM86161 PPG (1-8x via TCA9548A I2C mux) +│ ├── wulpus/ WULPUS ultrasound probe (MSP430 bridge) +│ └── dummy_sensor/ Synthetic data generator, no hardware required +├── spi/ Shared SPI_A bus (SPIM4) — see §4 +└── wifi_sd_shield/ ESP32-C6 WiFi/SD shield transport +``` + +## 3. Boot Sequence (`main.c`) + +`main()` runs the following steps in order: + +1. **Power**: `pwr_init()` → `pwr_charge_enable()` → `pwr_start()` (SDK power thread; refreshes battery/charger telemetry, gated off from PMIC I2C reads while the ADS streams — see §6). +2. **SPI_A + ADS1298**: `ads_dr_init()` (DRDY GPIO/interrupt) and `init_spi()` (brings up the shared SPI_A bus via `init_spi_a_bus()`, then the ADS1298 CS/START GPIOs — see §4). +3. **Transport** (mutually exclusive, `CONFIG_WI_FI`): + - **WiFi/SD shield**: `wifi_sd_shield_cs_init()` (CS/DRDY/QSPI-mux GPIOs on the shared SPI_A bus) then `initial_handshake_nrf_esp()`. + - **BLE** (default): `start_bluetooth_adverts()`. +4. **Dummy sensor** (`CONFIG_DUMMY_SENSOR`, optional): `dummy_sensor_init()`. +5. **Microphone**, **IMU**: `mic_init()` / `imu_init()`. +6. **EEG / EMG** (`CONFIG_SENSOR_EEG` / `CONFIG_SENSOR_EMG`, can both be built into one image — the mode is selected at runtime by the GUI start command; simultaneous EEG+EMG streaming is rejected at runtime since they share the ADS1298 pair). +7. **PPG** (`CONFIG_SENSOR_PPG_NEW`), **WULPUS** (`CONFIG_SENSOR_WULPUS`, default-enabled). +8. **Board sync** (currently disabled in `main.c`; see §8). +9. Idle loop: sleeps, and services `flag_isr_soft_reset` (long-press → PMIC factory-ship mode via `max77654_factory_ship_mode()`). + +Everything after step 3 runs from dedicated Zephyr threads (`K_THREAD_DEFINE` per module) — `main()` itself does not block on streaming. + +## 4. SPI_A: the Shared High-Speed Bus (`spi/`) + +`spi/spi_a.c` / `spi_a.h` own the one nrfx SPIM peripheral (**SPIM4**, pins SCK=P0.08/MOSI=P0.09/MISO=P0.10) that is physically shared by every device on **SPI_A**: the ADS1298 pair (ExG shield) and the ESP32-C6 / on-board SD path (WiFi/SD shield). There is no hardware-managed chip select — every device gets its own software-toggled CS GPIO, since more than one device shares the bus. + +Key pieces: +- `init_spi_a_bus()` — idempotent bring-up (nrfx init + IRQ). Safe to call from both `afe/ads_spi_hw.c`'s `init_spi()` and `wifi_sd_shield/wifi_sd_shield_inits.c`'s `wifi_sd_shield_cs_init()`, in either order. +- `spi_a_begin_transfer(owner, cs)` — since nrfx allows only **one** registered completion handler per peripheral instance, this records which consumer (`SPI_A_OWNER_ADS` / `SPI_A_OWNER_WIFI_SD`) issued the in-flight transfer, so the single shared interrupt handler can route completion to the right place (`ads_spim_transfer_complete()` or `wifi_sd_spim_transfer_complete()`). +- `spi_a_mutex` — serializes bus access across consumers. The ADS driver releases it immediately after kicking off its async transfer (matching its existing, hardware-validated timing); the WiFi/SD path holds it through completion (it already blocks on a semaphore). + +`SPI_B` (SPIM2, SCK=P1.07/MOSI=P0.30/MISO=P0.29) is a separate bus reserved for the WULPUS shield (MSP430 bridge) and is owned directly by `sensors/wulpus/wulpus_appl.c`. + +## 5. ADS1298 / ExG (`afe/`) + +- `ads_spi_hw.c` — GPIO (CS ×2, START, DRDY) and SPI_A bring-up. +- `ads_spi_comm.c` — low-level read/write transactions (`ads1298_read_spi`, `ads1298_read_samples`, `ads1298_write_spi`), each asserting the correct device's CS and registering itself as `SPI_A_OWNER_ADS`. +- `ads_spi_config.c` — device configuration/register programming, ID check (`ads_check_id`). +- `ads_spi_data.c` — DRDY-interrupt-driven acquisition (`ads_spim_handler_done`, `process_ads_data`): reads both ADS1298_A/B, assembles the 211-byte ExG packet (header, counter, timestamp, 4 samples × 50 bytes, board-sync metadata, trailer), and hands it to the active transport (`add_data_to_send_buffer` for BLE, `add_data_to_esp_send_buffer` for WiFi). +- `sensors/eeg/` and `sensors/emg/` are thin mode-selection layers on top of this shared ADS1298 pair (unipolar vs. bipolar supply rails). + +## 6. Transport Layer + +### 6.1 BLE (`ble/`) + +- `bluetooth.c` — Zephyr BT stack, NUS init/advertising, `send_data_ble()`. +- `ble_appl.c` — two threads (disabled at compile time when `CONFIG_WI_FI` is set): `ble_send_thread` drains `send_msgq` → `send_data_ble()`; `process_received_data_thread` drains `nus_rx_msgq` and forwards each command to `handle_connectivity_command()` (§7). Also exposes the transport-agnostic `add_data_to_send_buffer()` sensors call to enqueue outgoing data. + +### 6.2 WiFi/SD shield (`wifi_sd_shield/`) + +The nRF acts as SPI master to an ESP32-C6 SPI slave on the shared SPI_A bus (§4), using its own software-toggled CS (`gpio_nrf_esp_cs`). A second CS (`gpio_nrf_sd_cs`) is reserved for the nRF to write to the SD card directly, bypassing the ESP32 (not yet implemented). Two QSPI-mux GPIOs (`gpio_nrf_qspi_cs`, `_sel`) are parked at init so the on-board QSPI PSRAM (unused on this bus) stays deselected. + +- `wifi_sd_shield_inits.c` — CS/DRDY GPIO setup + shared SPI_A bring-up (`wifi_sd_shield_cs_init()`). +- `wifi_sd_spi_functions.c` — `spi_master_transceive()` (generic transaction primitive, `SPI_A_OWNER_WIFI_SD`), `biogap_to_esp_transaction()` (sends a sensor packet, checks for an embedded stop command from the ESP). +- `wifi_sd_shield_appl.c` — sender/receiver threads (`spi_nrf_esp_sender_thread`, `spi_nrf_esp_receiver_thread`), DRDY-driven `process_esp_data()`, `add_data_to_esp_send_buffer()`, and `initial_handshake_nrf_esp()`. + +> **Known gap**: the shield schematic's bus-direction/level-translator control lines (`NRF_ESP_DIR_CTRL`, `NRF_ESP_DRDY_DIR_CTRL`) aren't yet modeled in the devicetree overlay or initialized in code — needed before this shield works on real hardware. + +### 6.3 Command Dispatcher (`core/command_dispatcher.c`) + +`handle_connectivity_command(const uint8_t *data, uint16_t size)` is the single entry point both transports route incoming commands through (`data[0]` is the opcode; `data[1..]` is any command-specific payload). It dispatches to: battery/system status requests, device/board state, streaming start/stop for every sensor (EEG, EMG, IMU, MIC, PPG, WULPUS, dummy), and combined start/stop (e.g. `START_STREAMING_ALL`) with `core/sync_streaming.c` barriers so multiple sensors begin sampling together. + +Commands that need payload bytes beyond the opcode (PPG_NEW config, WULPUS MSP430 config) gracefully fall back to defaults when the caller can only supply the opcode itself — relevant for the WiFi shield's fixed-size 4-byte command transaction, which has little room for a payload. + +Opcodes live in `core/connectivity_commands.h` (transport-agnostic superset of the legacy `ble/ble_commands.h`). + +## 7. Sensor Modules (`sensors/`) + +| Module | Hardware | Notes | +|---|---|---| +| `eeg/`, `emg/` | ADS1298 (via `afe/`) | Mutually exclusive at runtime, share the ADS1298 pair | +| `imu/` | LSM6DSV16BX (accel + gyro) | Always initialized in `main.c` | +| `mic/` | PDM microphone | Timestamped packets (harmonized first-sample convention, matching ExG) | +| `ppg_new/` | 1-8× MAXM86161 via TCA9548A I2C mux | `CONFIG_SENSOR_PPG_NEW`; config parsed from the start-streaming payload | +| `wulpus/` | MSP430 ultrasound bridge, on SPI_B | `CONFIG_SENSOR_WULPUS` (default-enabled); BLE-only rich config, forwards raw MSP430 config bytes | +| `dummy_sensor/` | None | `CONFIG_DUMMY_SENSOR`; generates synthetic ExG-shaped packets on a timer, routes through the same BLE/WiFi send path as a real sensor — useful for pipeline testing without hardware | + +## 8. BSP and Cross-Cutting (`bsp/`, `core/`) + +- `bsp/pwr_bsp.c`, `bsp/power/` — SDK power-thread integration (battery/charger telemetry cache, gated off from PMIC I2C reads while ADS streams to avoid noise injection). +- `bsp/system_status/system_status.c` — battery/status/version/board-state packet builders and senders (transport-branching via `CONFIG_WI_FI`). +- `bsp/i2c_mux/` — TCA9548A I2C mux driver (PPG). +- `bsp/pmic_noise_test.c` — diagnostic sweep to correlate PMIC activity with ExG noise bursts (`CONFIG_PMIC_NOISE_TEST`). +- `core/sync_streaming.c` — barrier (`sync_begin(n)`/`sync_reset()`) for simultaneous multi-sensor start. +- `core/board_sync.c` — multi-board hardware sync (primary/secondary GPIO pulse roles), currently disabled in `main.c`. +- `core/i2c_helpers.c` — generic I2C helper routines. +- `core/common.h` — shared board-state constants, firmware/hardware version macros. + +## 9. Build Configuration + +- **`CMakeLists.txt`**: selects shields (`SENSEI_ExGShield`, `SENSEI_PPGShield`, `SENSEI_WiFi_SD_Shield_V1` — all defined in the sensei-sdk repo, not in this one), and conditionally compiles WULPUS, PMIC noise test, PPG_NEW, WiFi/SD shield + dispatcher, and dummy sensor sources based on their Kconfig symbols. +- **`Kconfig`**: `SENSOR_EEG`, `SENSOR_EMG`, `SENSOR_WULPUS`, `SENSOR_PPG_NEW` (+ sub-options), `WI_FI`, `DUMMY_SENSOR`, `PMIC_NOISE_TEST`, plus Multi-Board Sync and State Machine menus. +- **`prj.conf`**: default `y`/`n` values for the above, BLE stack config, SPI instance enables (`CONFIG_NRFX_SPIM4`, `CONFIG_NRFX_SPIM2`), logging/debug backends, MCUboot. + +Shield devicetree overlays (GPIO/pin definitions) live in the [sensei-sdk](https://github.com/pulp-bio/sensei-sdk) repo under `NRF/boards/shields/`, not in this repository — see the top-level `Documentation/firmware/getting_started.md` for the two-repo build setup. diff --git a/Firmware/src_NRF/.gitignore b/Firmware/src_NRF/.gitignore index 821c19d..8b09cfe 100644 --- a/Firmware/src_NRF/.gitignore +++ b/Firmware/src_NRF/.gitignore @@ -1 +1,2 @@ -.github \ No newline at end of file +.github +*.claude \ No newline at end of file diff --git a/Firmware/src_NRF/BioGAP_pinout_board-to-board_connectors.xlsx b/Firmware/src_NRF/BioGAP_pinout_board-to-board_connectors.xlsx deleted file mode 100644 index 170ed81..0000000 Binary files a/Firmware/src_NRF/BioGAP_pinout_board-to-board_connectors.xlsx and /dev/null differ diff --git a/Firmware/src_NRF/CMakeLists.txt b/Firmware/src_NRF/CMakeLists.txt index a91d195..488c61f 100644 --- a/Firmware/src_NRF/CMakeLists.txt +++ b/Firmware/src_NRF/CMakeLists.txt @@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 3.20.0) # Enable shields -set(SHIELD "SENSEI_ExGShield SENSEI_PPGShield") +set(SHIELD "SENSEI_ExGShield SENSEI_PPGShield SENSEI_WiFi_SD_Shield_V1") set(CONF_FILE prj.conf) @@ -22,9 +22,7 @@ add_custom_target(print_sensei_sdk_root ALL COMMENT "Printing SENSEI_SDK_ROOT at build time" ) -list(APPEND EXTRA_ZEPHYR_MODULES - ${SENSEI_SDK_ROOT}/NRF -) +list(APPEND EXTRA_ZEPHYR_MODULES "${SENSEI_SDK_ROOT}/NRF") # Configure the project find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) @@ -39,12 +37,16 @@ target_sources(app PRIVATE core/sync_streaming.c core/i2c_helpers.c core/board_sync.c + core/command_dispatcher.c # BSP bsp/pwr_bsp.c bsp/power/power.c bsp/system_status/system_status.c + # SPI (shared SPI_A bus -- ADS1298 and WiFi/SD shield both sit on it) + spi/spi_a.c + # AFE (Analog Front-End - ADS1298) afe/ads_appl.c afe/ads_spi_hw.c @@ -95,6 +97,26 @@ if(CONFIG_SENSOR_PPG_NEW) ) endif() +# WiFi/SD shield (ESP32-C6): alternative to BLE for streaming sensor data. +# Shares SPI_A (spi/spi_a.c) with the ADS1298. The command dispatcher itself +# (core/command_dispatcher.c) is unconditional above, since BLE routes +# through it too. +if(CONFIG_WI_FI) + target_sources(app PRIVATE + wifi_sd_shield/wifi_sd_shield_appl.c + wifi_sd_shield/wifi_sd_shield_inits.c + wifi_sd_shield/wifi_sd_spi_functions.c + ) +endif() + +# Dummy sensor (synthetic data, no hardware required): sends over BLE or +# the WiFi shield depending on CONFIG_WI_FI, handled internally by the file. +if(CONFIG_DUMMY_SENSOR) + target_sources(app PRIVATE + sensors/dummy_sensor/dummy_sensor_appl.c + ) +endif() + target_include_directories(app PRIVATE . # Needed so maxm86161.c and maxm86161.h can use bare #include "maxm86161_i2c.h" diff --git a/Firmware/src_NRF/Kconfig b/Firmware/src_NRF/Kconfig index a91bb14..7295c45 100644 --- a/Firmware/src_NRF/Kconfig +++ b/Firmware/src_NRF/Kconfig @@ -117,6 +117,27 @@ config PPG_SAMPLE_RATE endif # SENSOR_PPG_NEW +config WI_FI + bool "WiFi/SD shield (ESP32-C6) as the streaming transport" + default n + help + Enables the WiFi/SD shield as an alternative to BLE for streaming + sensor data: the nRF5340 acts as SPI master to an ESP32-C6 SPI + slave, plus a transport-agnostic command dispatcher + (core/command_dispatcher.c) that both this and the BLE path route + commands through. Shares SPI_A (SPIM4) with the ADS1298 -- each + device on the bus gets its own software-toggled CS GPIO (see + spi/spi_a.h and wifi_sd_shield/wifi_sd_shield_inits.c). + +config DUMMY_SENSOR + bool "Dummy sensor (synthetic ExG-shaped data, no hardware required)" + default n + help + Generates synthetic ExG-shaped packets on a timer and sends them + through the same path a real sensor would (BLE, or the ESP32 WiFi + shield when CONFIG_WI_FI is also enabled). Useful for exercising the + streaming pipeline without an ADS1298/ExG shield attached. + config PMIC_NOISE_TEST bool "PMIC noise-injection test (diagnostic build)" default n diff --git a/Firmware/src_NRF/afe/ads_defs.h b/Firmware/src_NRF/afe/ads_defs.h index 94126d1..a3725eb 100644 --- a/Firmware/src_NRF/afe/ads_defs.h +++ b/Firmware/src_NRF/afe/ads_defs.h @@ -95,24 +95,12 @@ /*============================================================================== * SPIM Instance Configuration * - * The ADS1298 sits on SPI_A of the BioGAP mainboard, driven by SPIM4 — - * the nRF5340's dedicated high-speed instance (up to 32 MHz on these - * pins). Pin numbers must match the spi_a_default pinctrl in the board - * DTS (nrf5340_senseiv1_cpuapp.dts). + * The ADS1298 sits on SPI_A of the BioGAP mainboard -- a bus shared with + * other shields (e.g. WiFi/SD). The peripheral instance, pins, and + * initialization now live in spi/spi_a.h / spi/spi_a.c, since bringing up + * SPI_A is no longer an ADS-specific concern. *============================================================================*/ -/** @brief SPIM instance index to be used for ADS1298 communication (SPI_A) */ -#define SPIM_INST_IDX 4 - -/** @brief MOSI pin number for SPI communication (SPI_A_MOSI = P0.09) */ -#define MOSI_PIN 9 - -/** @brief MISO pin number for SPI communication (SPI_A_MISO = P0.10) */ -#define MISO_PIN 10 - -/** @brief SCK (clock) pin number for SPI communication (SPI_A_CLK = P0.08) */ -#define SCK_PIN 8 - /*============================================================================== * ADS1298 SPI Command Definitions *============================================================================*/ diff --git a/Firmware/src_NRF/afe/ads_spi_comm.c b/Firmware/src_NRF/afe/ads_spi_comm.c index 513c9e0..93ef7fd 100644 --- a/Firmware/src_NRF/afe/ads_spi_comm.c +++ b/Firmware/src_NRF/afe/ads_spi_comm.c @@ -43,6 +43,7 @@ #include "afe/ads_defs.h" #include "afe/ads_spi_hw.h" #include "afe/ads_spi_data.h" +#include "spi/spi_a.h" LOG_MODULE_REGISTER(ads_spi_comm, LOG_LEVEL_INF); @@ -127,24 +128,22 @@ static int ads_chip_select(ads_device_id_t ads_id) { * @note CS is asserted by this function and deasserted by interrupt handler */ int ads1298_read_spi(uint8_t *data, uint8_t size, ads_device_id_t ads_id) { - extern struct k_mutex spi_mutex; - extern nrfx_spim_t spim_inst; - unsigned int key = irq_lock(); // Disable all interrupts - k_mutex_lock(&spi_mutex, K_FOREVER); + k_mutex_lock(&spi_a_mutex, K_FOREVER); nrfx_spim_xfer_desc_t spim_xfer_desc = NRFX_SPIM_XFER_TRX(pr_word, size, ads_rx_buf, size); if (ads_chip_select(ads_id) < 0) { - k_mutex_unlock(&spi_mutex); + k_mutex_unlock(&spi_a_mutex); irq_unlock(key); return -1; } + spi_a_begin_transfer(SPI_A_OWNER_ADS, NULL); // ADS deasserts its own CS on completion nrfx_err_t status; - status = nrfx_spim_xfer(&spim_inst, &spim_xfer_desc, 0); + status = nrfx_spim_xfer(&spi_a_inst, &spim_xfer_desc, 0); NRFX_ASSERT(status == NRFX_SUCCESS); - k_mutex_unlock(&spi_mutex); + k_mutex_unlock(&spi_a_mutex); irq_unlock(key); // Restore interrupts return 0; @@ -168,23 +167,21 @@ int ads1298_read_spi(uint8_t *data, uint8_t size, ads_device_id_t ads_id) { * @note empty_buffer contains zeros for dummy TX bytes */ int ads1298_read_samples(uint8_t *data, uint8_t size, ads_device_id_t ads_id) { - extern struct k_mutex spi_mutex; - extern nrfx_spim_t spim_inst; - unsigned int key = irq_lock(); // Disable all interrupts - k_mutex_lock(&spi_mutex, K_FOREVER); + k_mutex_lock(&spi_a_mutex, K_FOREVER); nrfx_spim_xfer_desc_t spim_xfer_desc = NRFX_SPIM_XFER_TRX(empty_buffer, size, ads_rx_buf, size); if (ads_chip_select(ads_id) < 0) { - k_mutex_unlock(&spi_mutex); + k_mutex_unlock(&spi_a_mutex); irq_unlock(key); return -1; } + spi_a_begin_transfer(SPI_A_OWNER_ADS, NULL); // ADS deasserts its own CS on completion nrfx_err_t status; - status = nrfx_spim_xfer(&spim_inst, &spim_xfer_desc, 0); + status = nrfx_spim_xfer(&spi_a_inst, &spim_xfer_desc, 0); NRFX_ASSERT(status == NRFX_SUCCESS); - k_mutex_unlock(&spi_mutex); + k_mutex_unlock(&spi_a_mutex); irq_unlock(key); // Restore interrupts return 0; @@ -207,22 +204,28 @@ int ads1298_read_samples(uint8_t *data, uint8_t size, ads_device_id_t ads_id) { * @note Transfer is non-blocking; poll spi_xfer_done for completion */ int ads1298_write_spi(uint8_t size, ads_device_id_t ads_id) { - extern struct k_mutex spi_mutex; - extern nrfx_spim_t spim_inst; - nrfx_spim_xfer_desc_t spim_xfer_desc = NRFX_SPIM_XFER_TRX(pr_word, sizeof(pr_word), ads_rx_buf, sizeof(ads_rx_buf)); nrfx_err_t status; + unsigned int key = irq_lock(); // Disable all interrupts + k_mutex_lock(&spi_a_mutex, K_FOREVER); + if (ads_chip_select(ads_id) < 0) { + k_mutex_unlock(&spi_a_mutex); + irq_unlock(key); return -1; } LOG_DBG("Starting SPI write transfer"); - status = nrfx_spim_xfer(&spim_inst, &spim_xfer_desc, 0); + spi_a_begin_transfer(SPI_A_OWNER_ADS, NULL); // ADS deasserts its own CS on completion + status = nrfx_spim_xfer(&spi_a_inst, &spim_xfer_desc, 0); LOG_DBG("Status: %d", status); LOG_DBG("SPI write transfer started"); NRFX_ASSERT(status == NRFX_SUCCESS); LOG_DBG("SPI write transfer asserted CS"); + k_mutex_unlock(&spi_a_mutex); + irq_unlock(key); // Restore interrupts + return 0; } \ No newline at end of file diff --git a/Firmware/src_NRF/afe/ads_spi_data.c b/Firmware/src_NRF/afe/ads_spi_data.c index 5bbb25e..a6b276d 100644 --- a/Firmware/src_NRF/afe/ads_spi_data.c +++ b/Firmware/src_NRF/afe/ads_spi_data.c @@ -44,6 +44,9 @@ #include "afe/ads_spi_data.h" #include "ble/ble_appl.h" #include "ads_spi_comm.h" +#if defined(CONFIG_WI_FI) +#include "wifi_sd_shield/wifi_sd_shield_appl.h" +#endif /* Inter-board synchronization */ #include "core/board_sync.h" @@ -214,7 +217,11 @@ void ads_spim_handler_done(void) { // BLE PCK tail ble_tx_buf[buf_current_size++] = BLE_PCK_TAILER; +#if defined(CONFIG_WI_FI) + add_data_to_esp_send_buffer(ble_tx_buf, EXG_PCK_LNGTH); +#else add_data_to_send_buffer(ble_tx_buf, EXG_PCK_LNGTH); +#endif } } diff --git a/Firmware/src_NRF/afe/ads_spi_hw.c b/Firmware/src_NRF/afe/ads_spi_hw.c index ac75a73..ab329c0 100644 --- a/Firmware/src_NRF/afe/ads_spi_hw.c +++ b/Firmware/src_NRF/afe/ads_spi_hw.c @@ -36,7 +36,6 @@ */ /* Zephyr RTOS headers */ -#include #include #include #include @@ -45,6 +44,8 @@ #include "afe/ads_defs.h" #include "afe/ads_spi.h" +#include "afe/ads_spi_hw.h" +#include "spi/spi_a.h" LOG_MODULE_REGISTER(ads_spi_hw, LOG_LEVEL_INF); @@ -84,48 +85,6 @@ static const struct gpio_dt_spec gpio_dt_ads1298_a_dr = GPIO_DT_SPEC_GET(ADS_A_D * SPI Configuration *============================================================================*/ -/** @brief SPI interrupt priority level */ -#define SPI_INT_PRIO 1 - -/*============================================================================== - * Module Variables - Synchronization - *============================================================================*/ - -/** - * @brief SPI bus mutex - * - * Protects SPI bus access from concurrent threads. Locked during SPI - * transfers, unlocked when complete. - */ -struct k_mutex spi_mutex; - -/** - * @brief SPIM driver instance - * - * nrfx SPIM peripheral instance for ADS1298 communication. - */ -nrfx_spim_t spim_inst = NRFX_SPIM_INSTANCE(SPIM_INST_IDX); - -/*============================================================================== - * SPI Interrupt Handler - *============================================================================*/ - -/** - * @brief SPIM driver interrupt handler - * - * Called by nrfx SPIM driver when SPI transfer completes. This handler: - * 1. Deasserts chip select for both ADS devices - * 2. Processes received data if in READ mode - * 3. Constructs BLE packets from ADS/PPG/IMU data - * 4. Sets flags to indicate transfer completion - * - * @param[in] p_event Pointer to SPIM event structure - * @param[in] p_context User context (unused) - * - * @note This function runs in interrupt context. Keep processing minimal. - */ -static void spim_handler(nrfx_spim_evt_t const *p_event, void *p_context); - /*============================================================================== * Private Functions - Interrupt Callbacks *============================================================================*/ @@ -156,11 +115,9 @@ static void cb_ads_a_dr(const struct device *dev, struct gpio_callback *cb, uint * @brief Initialize SPI peripheral and GPIO pins for ADS1298 communication * * Performs complete hardware initialization: - * 1. Connects SPI interrupt handler - * 2. Configures SPIM peripheral (4 MHz, Mode 1, MSB first) - * 3. Initializes chip select pins for both ADS devices - * 4. Initializes START pin for synchronized acquisition - * 5. Creates SPI mutex for thread-safe access + * 1. Brings up the shared SPI_A bus (see spi/spi_a.h) if not already done + * 2. Initializes chip select pins for both ADS devices + * 3. Initializes START pin for synchronized acquisition * * SPI Mode 1 timing: * - CPOL = 0 (clock idle low) @@ -170,25 +127,13 @@ static void cb_ads_a_dr(const struct device *dev, struct gpio_callback *cb, uint * Errors are logged but not returned to allow graceful degradation. */ void init_spi() { - nrfx_err_t status; - (void)status; - -#if defined(__ZEPHYR__) - IRQ_CONNECT(NRFX_IRQ_NUMBER_GET(NRF_SPIM_INST_GET(SPIM_INST_IDX)), SPI_INT_PRIO, - NRFX_SPIM_INST_HANDLER_GET(SPIM_INST_IDX), 0, 0); -#endif - - // ADS_A_CS_PIN - nrfx_spim_config_t spim_config = NRFX_SPIM_DEFAULT_CONFIG(SCK_PIN, MOSI_PIN, MISO_PIN, NRF_SPIM_PIN_NOT_CONNECTED); - - spim_config.frequency = NRFX_MHZ_TO_HZ(4); - spim_config.mode = NRF_SPIM_MODE_1; - spim_config.bit_order = NRF_SPIM_BIT_ORDER_MSB_FIRST; - spim_config.irq_priority = SPI_INT_PRIO; - - void *p_context = "Some context"; - status = nrfx_spim_init(&spim_inst, &spim_config, spim_handler, p_context); - NRFX_ASSERT(status == NRFX_SUCCESS); + /* Bring up the shared SPI_A (SPIM4) peripheral. Safe to call even if + * another shield on SPI_A (e.g. WiFi/SD) already brought it up first -- + * whichever consumer initializes first wins; nrfx_spim_init() is not + * called a second time here. */ + if (init_spi_a_bus() != 0) { + return; + } // Initialize SPI CS pin for ADS A if (!device_is_ready(gpio_dt_ads1298_a_cs.port)) { @@ -219,8 +164,6 @@ void init_spi() { LOG_ERR("ADS pwr GPIO init error"); return; } - - k_mutex_init(&spi_mutex); } /*============================================================================== @@ -312,21 +255,19 @@ uint8_t pr_word[10] = {_RESET, 0, 0, 0, 0, 0, 0, 0, 0, 0}; */ bool ads_initialized = false; -static void spim_handler(nrfx_spim_evt_t const *p_event, void *p_context) { - LOG_DBG("spim_handler called, event type: %d", p_event->type); - - if (p_event->type == NRFX_SPIM_EVENT_DONE) { - if (gpio_pin_set_dt(&gpio_dt_ads1298_a_cs, 0) < 0) { // Set CS pin to disable - LOG_ERR("ADS1298 power GPIO set error"); - return; - } - if (gpio_pin_set_dt(&gpio_dt_ads1298_b_cs, 0) < 0) { // Set CS pin to disable - LOG_ERR("ADS1298 power GPIO set error"); - return; - } - - ads_spim_handler_done(); +void ads_spim_transfer_complete(void) { + LOG_DBG("ads_spim_transfer_complete called"); + + if (gpio_pin_set_dt(&gpio_dt_ads1298_a_cs, 0) < 0) { // Set CS pin to disable + LOG_ERR("ADS1298 power GPIO set error"); + return; + } + if (gpio_pin_set_dt(&gpio_dt_ads1298_b_cs, 0) < 0) { // Set CS pin to disable + LOG_ERR("ADS1298 power GPIO set error"); + return; } + + ads_spim_handler_done(); } static void cb_ads_a_dr(const struct device *dev, struct gpio_callback *cb, uint32_t pins) { diff --git a/Firmware/src_NRF/afe/ads_spi_hw.h b/Firmware/src_NRF/afe/ads_spi_hw.h index 4c69f83..9539288 100644 --- a/Firmware/src_NRF/afe/ads_spi_hw.h +++ b/Firmware/src_NRF/afe/ads_spi_hw.h @@ -32,17 +32,12 @@ #include #include #include "afe/ads_defs.h" +#include "spi/spi_a.h" /*============================================================================== * External Hardware Resources *============================================================================*/ -/** @brief SPI bus mutex */ -extern struct k_mutex spi_mutex; - -/** @brief SPIM driver instance */ -extern nrfx_spim_t spim_inst; - /** @brief ADS1298_A chip select GPIO spec */ extern const struct gpio_dt_spec gpio_dt_ads1298_a_cs; @@ -58,4 +53,13 @@ extern uint8_t pr_word[10]; /** @brief ADS1298 initialization status flag */ extern bool ads_initialized; +/** + * @brief SPI_A completion handler for ADS1298 transfers + * + * Called by the shared spi/spi_a.c interrupt dispatcher when the in-flight + * transfer's owner is SPI_A_OWNER_ADS. Deasserts both ADS1298 CS lines and + * runs the read/write completion logic (see ads_spi_data.c). + */ +void ads_spim_transfer_complete(void); + #endif // ADS_SPI_HW_H \ No newline at end of file diff --git a/Firmware/src_NRF/ble/ble_appl.c b/Firmware/src_NRF/ble/ble_appl.c index 496ff52..d0ce76e 100644 --- a/Firmware/src_NRF/ble/ble_appl.c +++ b/Firmware/src_NRF/ble/ble_appl.c @@ -26,19 +26,9 @@ * limitations under the License. */ #include "ble/ble_appl.h" -#include "afe/ads_appl.h" -#include "afe/ads_spi.h" #include "bsp/system_status/system_status.h" #include "core/common.h" -#include "core/sync_streaming.h" -#include "sensors/ppg_new/ppg_new_appl.h" -#include "sensors/eeg/eeg_appl.h" -#include "sensors/emg/emg_appl.h" -#include "sensors/imu/imu_appl.h" -#include "sensors/mic/mic_appl.h" -#if defined(CONFIG_SENSOR_WULPUS) -#include "sensors/wulpus/wulpus_appl.h" -#endif +#include "core/command_dispatcher.h" #include #include @@ -116,272 +106,6 @@ static void forward_to_gap9(void) { pck_uart_wolf.is_data_available = true; } -/** - * @brief Process BLE Command - * - * Handles all BLE commands received from the connected device. - * Commands include battery state requests, device settings, streaming - * control (Nordic and microphone), board state management, and more. - * - * @param cmd The command byte received from BLE (first byte of packet) - */ -static void handle_ble_command(uint8_t cmd) { - switch (cmd) { - case REQUEST_BATTERY_STATE: - LOG_DBG("Ping REQUEST_BATTERY_STATE"); - size_t out_len = 0; - uint8_t bat_data[7]; - if (system_status_build_ble_packet(bat_data, sizeof(bat_data), &out_len) == 0) { - send_data_ble(bat_data, (uint16_t)out_len); - } else { - LOG_ERR("Failed to build battery status packet"); - } - break; - - case REQUEST_SYSTEM_STATUS: { - LOG_DBG("Ping REQUEST_SYSTEM_STATUS"); - size_t status_len = 0; - uint8_t status_data[SYSTEM_STATUS_PACKET_LEN]; - if (system_status_build_system_status_packet(status_data, sizeof(status_data), &status_len) == 0) { - send_data_ble(status_data, (uint16_t)status_len); - } else { - LOG_ERR("Failed to build system status packet"); - } - break; - } - - case GET_DEVICE_SETTINGS: - LOG_DBG("Ping GET_DEVICE_SETTINGS"); - system_status_send_device_settings(); - break; - - case SET_DEVICE_SETTINGS: - LOG_DBG("Ping SET_DEVICE_SETTINGS"); - break; - - case REQUEST_CONNECTING_STRING: - LOG_DBG("Ping REQUEST_CONNECTING_STRING"); - system_status_send_ready(); - break; - - case REQUEST_HARDWARE_VERSION: - LOG_DBG("Ping REQUEST_HARDWARE_VERSION"); - system_status_send_hardware_version(); - break; - - case REQUEST_FIRMWARE_VERSION: - LOG_DBG("Ping REQUEST_FIRMWARE_VERSION"); - system_status_send_firmware_version(); - break; - - case REQUEST_AVAILABLE_SENSORS: - LOG_DBG("Ping REQUEST_AVAILABLE_SENSORS"); - system_status_send_available_sensors(); - break; - - case GET_BOARD_STATE: { - LOG_DBG("Ping GET_BOARD_STATE"); - int8_t current_state = system_status_get_board_state(); - LOG_DBG("Sending current state: %d", current_state); - send_data_ble(¤t_state, 1); - break; - } - - case SET_BOARD_STATE: - LOG_DBG("Ping SET_BOARD_STATE"); - LOG_DBG(".data[1], %d", ble_data_available.data[1]); - LOG_DBG(".data[2], %d", ble_data_available.data[2]); - - if (ble_data_available.data[1] == 1) { - system_status_set_board_state(STATE_STREAMING_NORDIC); - } else { - system_status_set_board_state(STATE_GAP9_MASTER); - } - - if (system_status_get_board_state() == STATE_STREAMING_NORDIC) { - ads_set_function(ADS_STILL); - } else { - ads_set_function(ADS_INIT_GAP9_CTRL); - } - break; - - case RESET_GAP9: - LOG_DBG("Ping RESET_GAP9"); - break; - - case RESET_BOARD: - LOG_DBG("Ping RESET_BOARD"); - break; - - case SET_TRIGGER_STATE: - LOG_DBG("Ping SET_TRIGGER_STATE (deprecated - trigger removed)"); - break; - - case ENTER_BOOTLOADERT_MODE: - LOG_DBG("Ping ENTER_BOOTLOADER_MODE"); - break; - - case GO_TO_SLEEP: - LOG_DBG("Ping GO_TO_SLEEP"); - break; - - case START_EEG_STREAMING: - LOG_INF("Ping START_EEG_STREAMING"); - ble_reset_packet_counters(); /* Reset packet counters for new session */ - eeg_start_streaming(); - break; - - case STOP_EEG_STREAMING: - LOG_INF("Ping STOP_EEG_STREAMING"); - eeg_stop_streaming(); - ble_print_packet_stats(); /* Print BLE packet stats */ - break; - - case START_EMG_STREAMING: - LOG_INF("Ping START_EMG_STREAMING"); - ble_reset_packet_counters(); /* Reset packet counters for new session */ - LOG_INF("Starting EMG streaming"); - emg_start_streaming(); - break; - - case STOP_EMG_STREAMING: - LOG_INF("Ping STOP_EMG_STREAMING"); - emg_stop_streaming(); - ble_print_packet_stats(); /* Print BLE packet stats */ - break; - - case START_PPG_STREAMING: - #if defined(CONFIG_SENSOR_PPG_NEW) - LOG_INF("Ping START_PPG_STREAMING"); - ble_reset_packet_counters(); - { - /* - * BLE packet layout (bytes after command code 39): - * [1] sensor_mask - * [2] sample_rate_hz - * [3] led_green (0x00 = disable) - * [4] led_ir (0x00 = disable) - * [5] led_red (0x00 = disable) - * [6] led_range (0–3 index) - * [7] tint (0–3 index) - * [8] adc_range (0–3 index) - * [9] sample_avg (0–7 index) - * [10] alc_enable (0/1) - * [11] proximity_enable (0/1) - * Total packet size: 12 bytes (cmd + 11 config bytes). - * If the packet is shorter than expected, missing bytes fall back to - * sensible defaults so the GUI can omit trailing optional params. - */ - const uint8_t *d = ble_data_available.data; - uint16_t n = ble_data_available.size; - - ppg_config_t pcfg = { - .sensor_mask = (n > 1) ? d[1] : 0x01, - .sample_rate_hz = (n > 2) ? d[2] : 125, - .led_green = (n > 3) ? d[3] : 0x7F, - .led_ir = (n > 4) ? d[4] : 0x7F, - .led_red = (n > 5) ? d[5] : 0x7F, - .led_range = (n > 6) ? d[6] : 3, /* default 32k */ - .tint = (n > 7) ? d[7] : 3, /* default 117.3 µs */ - .adc_range = (n > 8) ? d[8] : 3, /* default 32k */ - .sample_avg = (n > 9) ? d[9] : 0, /* default 1x */ - .alc_enable = (n > 10) ? d[10] : 1, /* default on */ - .proximity_enable = (n > 11) ? d[11] : 0, /* default off */ - }; - - ppg_new_start_streaming(&pcfg); - } - #endif - break; - - case STOP_PPG_STREAMING: - #if defined(CONFIG_SENSOR_PPG_NEW) - LOG_INF("Ping STOP_PPG_STREAMING"); - ppg_new_stop_streaming(); - //ble_print_packet_stats(); /* Print BLE packet stats */ - #endif - break; - - case START_MIC_STREAMING: - LOG_INF("Ping START_MIC_STREAMING"); - mic_start_streaming(); - break; - - case STOP_MIC_STREAMING: - LOG_INF("Ping STOP_MIC_STREAMING"); - mic_stop_streaming(); - break; - - case START_EEG_MIC_STREAMING: - LOG_DBG("Ping START_EEG_MIC_STREAMING"); - ble_reset_packet_counters(); /* Reset packet counters for new session */ - sync_begin(2); /* Setup sync barrier for 2 subsystems (EEG + MIC) */ - mic_start_streaming(); - eeg_start_streaming(); - break; - case STOP_EEG_MIC_STREAMING: - LOG_DBG("Ping STOP_EEG_MIC_STREAMING"); - mic_stop_streaming(); - eeg_stop_streaming(); - ble_print_packet_stats(); /* Print BLE packet stats */ - sync_reset(); /* Clean up sync state */ - break; - case START_STREAMING_ALL: - LOG_DBG("Ping START_STREAMING_ALL"); - ble_reset_packet_counters(); /* Reset packet counters for new session */ - sync_begin(3); /* Setup sync barrier for 2 subsystems (EEG + MIC + IMU) */ - mic_start_streaming(); - eeg_start_streaming(); - imu_start_streaming(); - break; - case STOP_STREAMING_ALL: - LOG_DBG("Ping STOP_STREAMING_ALL"); - mic_stop_streaming(); - eeg_stop_streaming(); - imu_stop_streaming(); - ble_print_packet_stats(); /* Print BLE packet stats */ - sync_reset(); /* Clean up sync state */ - break; - case START_IMU_STREAMING: - LOG_DBG("Ping START_IMU_STREAMING"); - imu_start_streaming(); - break; - case STOP_IMU_STREAMING: - LOG_DBG("Ping STOP_IMU_STREAMING"); - imu_stop_streaming(); - break; - -#if defined(CONFIG_SENSOR_WULPUS) - case START_WULPUS_STREAMING: - LOG_INF("Ping START_WULPUS_STREAMING"); - /* Any bytes after the command code are forwarded as MSP430 config */ - wulpus_set_msp_config( - ble_data_available.size > 1 ? ble_data_available.data + 1 : NULL, - ble_data_available.size > 1 ? ble_data_available.size - 1 : 0); - break; - - case STOP_WULPUS_STREAMING: - LOG_INF("Ping STOP_WULPUS_STREAMING"); - wulpus_stop(); - break; -#endif - - default: - /* - * Command code not recognised – treat the full payload as MSP430 - * configuration for the WULPUS dongle (which sends raw config bytes - * without a preceding command code, exactly as the old nRF52 firmware). - */ -#if defined(CONFIG_SENSOR_WULPUS) - LOG_INF("Unrecognised cmd %u – treating as WULPUS MSP430 config", cmd); - wulpus_set_msp_config(ble_data_available.data, ble_data_available.size); -#else - LOG_WRN("Unrecognised BLE command: %u", cmd); -#endif - break; - } -} - /** * @brief BLE Process Received Data Thread * @@ -416,11 +140,10 @@ void process_received_data_thread(void *arg1, void *arg2, void *arg3) { } // Process BLE command - uint8_t cmd = ble_data_available.data[0]; for (int k = 0; k < ble_data_available.size; k++) { LOG_DBG("Data[%d]: %d", k, ble_data_available.data[k]); } - handle_ble_command(cmd); + handle_connectivity_command(ble_data_available.data, (uint16_t)ble_data_available.size); } } @@ -468,9 +191,11 @@ void add_data_to_send_buffer(uint8_t *data, uint16_t size) { } +#ifndef CONFIG_WI_FI /* BLE Send Thread Definition */ K_THREAD_DEFINE(ble_send_tid, BLE_SEND_STACK_SIZE, ble_send_thread, NULL, NULL, NULL, BLE_SEND_PRIORITY, 0, 0); /* BLE Receive Thread Definition */ K_THREAD_DEFINE(ble_receive_tid, BLE_RECEIVE_STACK_SIZE, process_received_data_thread, NULL, NULL, NULL, BLE_RECEIVE_PRIORITY, 0, 0); +#endif diff --git a/Firmware/src_NRF/ble/bluetooth.c b/Firmware/src_NRF/ble/bluetooth.c index b3bbab8..350e053 100644 --- a/Firmware/src_NRF/ble/bluetooth.c +++ b/Firmware/src_NRF/ble/bluetooth.c @@ -556,5 +556,7 @@ bool ble_is_connected(void) { * Thread Definition *============================================================================*/ +#ifndef CONFIG_WI_FI K_THREAD_DEFINE(ble_write_thread_id, CONFIG_BT_NUS_THREAD_STACK_SIZE, ble_write_thread, NULL, NULL, NULL, PRIORITY_BLE_THREAD, 0, 0); +#endif diff --git a/Firmware/src_NRF/bsp/pwr_bsp.c b/Firmware/src_NRF/bsp/pwr_bsp.c index 9364bee..8260c88 100644 --- a/Firmware/src_NRF/bsp/pwr_bsp.c +++ b/Firmware/src_NRF/bsp/pwr_bsp.c @@ -160,7 +160,7 @@ int pwr_charge_enable() pmic_conf->charger_enabled = true; // Enable charger pmic_conf->preq_i = MAX77654_I_PQ_20PERCENT; // Pre-qual current ~5mA (20% of 22.5mA) - pmic_conf->chgin_i_lim = MAX77654_ICHGIN_LIM_0A285; // Input current limit 285mA + pmic_conf->chgin_i_lim = MAX77654_ICHGIN_LIM_0A475; // Input current limit 285mA pmic_conf->fast_chg_cc = MAX77654_CHG_CC_90MA; // Fast charge current 22.5mA pmic_conf->fast_chg_cv = MAX77654_CHG_CV_4V2; // Charge voltage 4.2V pmic_conf->termnation_i = MAX77654_I_TERM_10PERCENT; // Term current ~2.25mA diff --git a/Firmware/src_NRF/bsp/system_status/system_status.c b/Firmware/src_NRF/bsp/system_status/system_status.c index af1deea..4bd35bb 100644 --- a/Firmware/src_NRF/bsp/system_status/system_status.c +++ b/Firmware/src_NRF/bsp/system_status/system_status.c @@ -13,7 +13,7 @@ #include "bsp/system_status/system_status.h" #include "sensors/imu/imu_appl.h" -#include "ble/ble_commands.h" +#include "core/connectivity_commands.h" #include "ble/bluetooth.h" #include "core/common.h" #include "afe/ads_defs.h" @@ -21,6 +21,9 @@ #include #include #include +#if defined(CONFIG_WI_FI) +#include "wifi_sd_shield/wifi_sd_shield_appl.h" +#endif LOG_MODULE_REGISTER(system_status, LOG_LEVEL_INF); @@ -53,7 +56,7 @@ int system_status_init(void) { return 0; } -int system_status_build_ble_packet(uint8_t *buffer, size_t buf_size, size_t *out_len) { +int system_status_build_packet(uint8_t *buffer, size_t buf_size, size_t *out_len) { if (buf_size < 7) { return -1; // Buffer too small for standard 7-byte status packet } @@ -135,7 +138,11 @@ void system_status_send_hardware_version(void) { data[1] = HARDWARE_VERSION; data[2] = HARDWARE_REVISION; data[3] = BLE_PCK_TAILER; +#if defined(CONFIG_WI_FI) + add_data_to_esp_send_buffer(data, sizeof(data)); +#else send_data_ble(data, sizeof(data)); +#endif } void system_status_send_firmware_version(void) { @@ -144,7 +151,11 @@ void system_status_send_firmware_version(void) { data[1] = FIRMWARE_VERSION; data[2] = FIRMWARE_REVISION; data[3] = BLE_PCK_TAILER; +#if defined(CONFIG_WI_FI) + add_data_to_esp_send_buffer(data, sizeof(data)); +#else send_data_ble(data, sizeof(data)); +#endif } void system_status_send_available_sensors(void) { @@ -153,7 +164,11 @@ void system_status_send_available_sensors(void) { data[1] = true; data[2] = 0; data[3] = BLE_PCK_TAILER; +#if defined(CONFIG_WI_FI) + add_data_to_esp_send_buffer(data, sizeof(data)); +#else send_data_ble(data, sizeof(data)); +#endif } void system_status_send_device_settings(void) { @@ -162,7 +177,11 @@ void system_status_send_device_settings(void) { void system_status_send_ready(void) { uint8_t ready[5] = {'B', 'W', 'F', '1', '6'}; +#if defined(CONFIG_WI_FI) + add_data_to_esp_send_buffer(ready, sizeof(ready)); +#else send_data_ble(ready, sizeof(ready)); +#endif } /*============================================================================== diff --git a/Firmware/src_NRF/bsp/system_status/system_status.h b/Firmware/src_NRF/bsp/system_status/system_status.h index 5ca51fe..5c96cb2 100644 --- a/Firmware/src_NRF/bsp/system_status/system_status.h +++ b/Firmware/src_NRF/bsp/system_status/system_status.h @@ -36,17 +36,19 @@ int system_status_init(void); /** - * @brief Build the legacy 7-byte battery/status BLE response (command 17). + * @brief Build the legacy 7-byte battery/status response (command 17). * * Byte layout is kept byte-for-byte compatible with the original BioGAP GUI. * All values come from the SDK power-thread cache - no PMIC/I2C access. + * Transport-agnostic: the caller sends the built buffer over BLE or the + * WiFi/SD shield. * * @param buffer Pointer to the buffer where the packet will be built. * @param buf_size Size of the buffer. * @param out_len Pointer to store the resulting packet length. * @return 0 on success, negative on error (e.g., buffer too small). */ -int system_status_build_ble_packet(uint8_t *buffer, size_t buf_size, size_t *out_len); +int system_status_build_packet(uint8_t *buffer, size_t buf_size, size_t *out_len); /** * @brief Build the extended system-status BLE response (command 43). diff --git a/Firmware/src_NRF/core/command_dispatcher.c b/Firmware/src_NRF/core/command_dispatcher.c new file mode 100644 index 0000000..1eb810f --- /dev/null +++ b/Firmware/src_NRF/core/command_dispatcher.c @@ -0,0 +1,430 @@ +/* + * ---------------------------------------------------------------------- + * + * File: command_dispatcher.c + * + * Last edited: 07.05.2026 + * + * Copyright (C) 2026, ETH Zurich and University of Bologna. + * + * Authors: + * - Giusy Spacone (gspacone@iis.ee.ethz.ch), ETH Zurich + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#include "core/command_dispatcher.h" +#include +#include "ble/ble_appl.h" +#include "ble/bluetooth.h" +#include "sensors/eeg/eeg_appl.h" +#include "sensors/emg/emg_appl.h" +#include "sensors/imu/imu_appl.h" +#include "sensors/mic/mic_appl.h" +#include "sensors/dummy_sensor/dummy_sensor_appl.h" +#if defined(CONFIG_WI_FI) +#include "wifi_sd_shield/wifi_sd_shield_appl.h" +#include "wifi_sd_shield/wifi_sd_shield_defs.h" + +uint16_t esp_spi_packet_size = 0; // Global variable to hold the size of the current SPI packet from ESP +#endif +#if defined(CONFIG_SENSOR_PPG_NEW) +#include "sensors/ppg_new/ppg_new_appl.h" +#endif +#if defined(CONFIG_SENSOR_WULPUS) +#include "sensors/wulpus/wulpus_appl.h" +#endif + +LOG_MODULE_REGISTER(command_dispatcher, LOG_LEVEL_DBG); + +/** + * @brief Process Connectivity Command + * + * Handles all commands received from the connected device. + * Connection can be either via Wi-Fi or BLE, depeding on the desired KConfig settings. + * Commands include battery state requests, device settings, streaming + * control (Nordic and microphone), board state management, and more. + * + * @param data Full received payload; data[0] is the command byte (see the + * header doc for how commands needing more than the opcode are + * handled when the transport can't supply it). + * @param size Number of valid bytes in data (>= 1). + */ +void handle_connectivity_command(const uint8_t *data, uint16_t size) { + uint8_t cmd = data[0]; + switch (cmd) { + + case REQUEST_BATTERY_STATE: + LOG_DBG("Ping REQUEST_BATTERY_STATE"); + size_t out_len = 0; + uint8_t bat_data[7]; + if (system_status_build_packet(bat_data, sizeof(bat_data), &out_len) == 0) { + + #ifndef CONFIG_WI_FI + send_data_ble(bat_data, (uint16_t)out_len); + #else + add_data_to_esp_send_buffer(bat_data, (uint16_t)out_len); + #endif + } else { + LOG_ERR("Failed to build battery status packet"); + } + break; + + case REQUEST_SYSTEM_STATUS: { + LOG_DBG("Ping REQUEST_SYSTEM_STATUS"); + size_t status_len = 0; + uint8_t status_data[SYSTEM_STATUS_PACKET_LEN]; + if (system_status_build_system_status_packet(status_data, sizeof(status_data), &status_len) == 0) { + #ifndef CONFIG_WI_FI + send_data_ble(status_data, (uint16_t)status_len); + #else + add_data_to_esp_send_buffer(status_data, (uint16_t)status_len); + #endif + } else { + LOG_ERR("Failed to build system status packet"); + } + break; + } + + case GET_DEVICE_SETTINGS: + LOG_DBG("Ping GET_DEVICE_SETTINGS"); + system_status_send_device_settings(); + break; + + case SET_DEVICE_SETTINGS: + LOG_DBG("Ping SET_DEVICE_SETTINGS"); + break; + + case REQUEST_CONNECTING_STRING: + LOG_DBG("Ping REQUEST_CONNECTING_STRING"); + system_status_send_ready(); + break; + + case REQUEST_HARDWARE_VERSION: + LOG_DBG("Ping REQUEST_HARDWARE_VERSION"); + system_status_send_hardware_version(); + break; + + case REQUEST_FIRMWARE_VERSION: + LOG_DBG("Ping REQUEST_FIRMWARE_VERSION"); + system_status_send_firmware_version(); + break; + + case REQUEST_AVAILABLE_SENSORS: + LOG_DBG("Ping REQUEST_AVAILABLE_SENSORS"); + system_status_send_available_sensors(); + break; + + case GET_BOARD_STATE: { + LOG_DBG("Ping GET_BOARD_STATE"); + int8_t current_state = system_status_get_board_state(); + LOG_DBG("Sending current state: %d", current_state); + + #ifndef CONFIG_WI_FI + send_data_ble(¤t_state, 1); + #else + add_data_to_esp_send_buffer((uint8_t *)¤t_state, 1); + #endif + break; + } + + case SET_BOARD_STATE: + LOG_DBG("Ping SET_BOARD_STATE"); +#ifndef CONFIG_WI_FI + LOG_DBG(".data[1], %d", ble_data_available.data[1]); + LOG_DBG(".data[2], %d", ble_data_available.data[2]); + + if (ble_data_available.data[1] == 1) { + system_status_set_board_state(STATE_STREAMING_NORDIC); + } else { + system_status_set_board_state(STATE_GAP9_MASTER); + } +#else + /* TODO: Handle SET_BOARD_STATE from WiFi transport */ +#endif + + if (system_status_get_board_state() == STATE_STREAMING_NORDIC) { + ads_set_function(ADS_STILL); + } else { + ads_set_function(ADS_INIT_GAP9_CTRL); + } + break; + + case RESET_GAP9: + LOG_DBG("Ping RESET_GAP9"); + break; + + case RESET_BOARD: + LOG_DBG("Ping RESET_BOARD"); + break; + + case SET_TRIGGER_STATE: + LOG_DBG("Ping SET_TRIGGER_STATE (deprecated - trigger removed)"); + break; + + case ENTER_BOOTLOADERT_MODE: + LOG_DBG("Ping ENTER_BOOTLOADER_MODE"); + break; + + case GO_TO_SLEEP: + LOG_DBG("Ping GO_TO_SLEEP"); + break; + + + case START_DUMMY_STREAMING: + LOG_INF("Ping START_DUMMY_STREAMING"); + #if defined CONFIG_WI_FI + /* TODO: reset WiFi transport packet counters */ + #else + /* Reset packet counters for new session */ + ble_reset_packet_counters(); + #endif + LOG_INF("Starting DUMMY streaming"); + #if defined(CONFIG_WI_FI) + // check the status of Wi-Fi state machine + if(nrf_esp_comm_state != NRF_ESP_IDLE){ + LOG_INF("NRF-ESP communication state is not idle (current state: %d) - new streaming session may be delayed until current communication is complete.", nrf_esp_comm_state); + } + nrf_esp_comm_state = SEND_TO_ESP; // Set state to allow sending data to ESP + #endif + #if defined(CONFIG_DUMMY_SENSOR) + esp_spi_packet_size = DUMMY_SENSOR_PCKT_SIZE; // Set the expected SPI packet size for dummy sensor + dummy_sensor_start_streaming(); + #else + LOG_WRN("Dummy sensor not built (CONFIG_DUMMY_SENSOR=n) - ignoring START_DUMMY_STREAMING"); + #endif + break; + + + case STOP_DUMMY_STREAMING: + LOG_INF("Ping STOP_DUMMY_STREAMING"); + #if defined(CONFIG_WI_FI) + nrf_esp_comm_state = NRF_ESP_IDLE; // Reset state to idle to block sending data to ESP + #endif + #if defined(CONFIG_DUMMY_SENSOR) + dummy_sensor_stop_streaming(); + #else + LOG_WRN("Dummy sensor not built (CONFIG_DUMMY_SENSOR=n) - ignoring STOP_DUMMY_STREAMING"); + #endif + #if defined CONFIG_WI_FI + /* TODO: print WiFi transport stats */ + #else + /* TODO: print WiFi transport stats */ + ble_print_packet_stats(); /* Print BLE packet stats */ + #endif + break; + + case START_EEG_STREAMING: + LOG_INF("Ping START_EEG_STREAMING"); + + #ifndef CONFIG_WI_FI + ble_reset_packet_counters(); /* Reset BLE packet counters for new session */ + #else + /* TODO: reset WiFi transport packet counters */ + #endif + eeg_start_streaming(); + break; + + case STOP_EEG_STREAMING: + LOG_INF("Ping STOP_EEG_STREAMING"); + eeg_stop_streaming(); + #ifndef CONFIG_WI_FI + ble_print_packet_stats(); /* Print BLE packet stats */ + #else + /* TODO: print WiFi transport stats */ + #endif + break; + + case START_EMG_STREAMING: + LOG_INF("Ping START_EMG_STREAMING"); + #ifndef CONFIG_WI_FI + ble_reset_packet_counters(); /* Reset packet counters for new session */ + #else + /* TODO: reset WiFi transport packet counters */ + #endif + LOG_INF("Starting EMG streaming"); + emg_start_streaming(); + break; + + case STOP_EMG_STREAMING: + LOG_INF("Ping STOP_EMG_STREAMING"); + emg_stop_streaming(); + #ifndef CONFIG_WI_FI + ble_print_packet_stats(); /* Print BLE packet stats */ + #else + /* TODO: print WiFi transport stats */ + #endif + break; + + case START_PPG_STREAMING: + #if defined(CONFIG_SENSOR_PPG_NEW) + LOG_INF("Ping START_PPG_STREAMING"); + #ifndef CONFIG_WI_FI + ble_reset_packet_counters(); + #endif + { + /* + * Payload layout (bytes after command code 39): + * [1] sensor_mask + * [2] sample_rate_hz + * [3] led_green (0x00 = disable) + * [4] led_ir (0x00 = disable) + * [5] led_red (0x00 = disable) + * [6] led_range (0-3 index) + * [7] tint (0-3 index) + * [8] adc_range (0-3 index) + * [9] sample_avg (0-7 index) + * [10] alc_enable (0/1) + * [11] proximity_enable (0/1) + * Total packet size: 12 bytes (cmd + 11 config bytes). + * If the payload is shorter than expected (e.g. the WiFi shield's + * fixed-size command transaction, which only ever supplies the + * opcode), missing bytes fall back to these defaults. + */ + const uint8_t *d = data; + uint16_t n = size; + + ppg_config_t pcfg = { + .sensor_mask = (n > 1) ? d[1] : 0x01, + .sample_rate_hz = (n > 2) ? d[2] : 125, + .led_green = (n > 3) ? d[3] : 0x7F, + .led_ir = (n > 4) ? d[4] : 0x7F, + .led_red = (n > 5) ? d[5] : 0x7F, + .led_range = (n > 6) ? d[6] : 3, /* default 32k */ + .tint = (n > 7) ? d[7] : 3, /* default 117.3 µs */ + .adc_range = (n > 8) ? d[8] : 3, /* default 32k */ + .sample_avg = (n > 9) ? d[9] : 0, /* default 1x */ + .alc_enable = (n > 10) ? d[10] : 1, /* default on */ + .proximity_enable = (n > 11) ? d[11] : 0, /* default off */ + }; + + ppg_new_start_streaming(&pcfg); + } + #endif + break; + + case STOP_PPG_STREAMING: + #if defined(CONFIG_SENSOR_PPG_NEW) + LOG_INF("Ping STOP_PPG_STREAMING"); + ppg_new_stop_streaming(); + #endif + break; + + case START_WULPUS_STREAMING: + #if defined(CONFIG_SENSOR_WULPUS) + LOG_INF("Ping START_WULPUS_STREAMING"); + /* Any bytes after the command code are forwarded as MSP430 config */ + wulpus_set_msp_config(size > 1 ? data + 1 : NULL, size > 1 ? size - 1 : 0); + #endif + break; + + case STOP_WULPUS_STREAMING: + #if defined(CONFIG_SENSOR_WULPUS) + LOG_INF("Ping STOP_WULPUS_STREAMING"); + wulpus_stop(); + #endif + break; + + case START_MIC_STREAMING: + LOG_INF("Ping START_MIC_STREAMING"); + mic_start_streaming(); + break; + + case STOP_MIC_STREAMING: + LOG_INF("Ping STOP_MIC_STREAMING"); + mic_stop_streaming(); + break; + + case START_EEG_MIC_STREAMING: + LOG_DBG("Ping START_EEG_MIC_STREAMING"); + #ifndef CONFIG_WI_FI + ble_reset_packet_counters(); /* Reset packet counters for new session */ + #else + /* TODO: reset WiFi transport packet counters */ + #endif + sync_begin(2); /* Setup sync barrier for 2 subsystems (EEG + MIC) */ + mic_start_streaming(); + eeg_start_streaming(); + break; + + case STOP_EEG_MIC_STREAMING: + LOG_DBG("Ping STOP_EEG_MIC_STREAMING"); + mic_stop_streaming(); + eeg_stop_streaming(); + + #ifndef CONFIG_WI_FI + ble_print_packet_stats(); /* Print BLE packet stats */ + #else + /* TODO: print WiFi transport stats */ + #endif + sync_reset(); /* Clean up sync state */ + break; + + + case START_STREAMING_ALL: + LOG_DBG("Ping START_STREAMING_ALL"); + #ifndef CONFIG_WI_FI + ble_reset_packet_counters(); /* Reset BLE packet counters for new session */ + #else + /* TODO: reset WiFi transport packet counters */ + #endif + sync_begin(3); /* Setup sync barrier for 2 subsystems (EEG + MIC + IMU) */ + mic_start_streaming(); + eeg_start_streaming(); + imu_start_streaming(); + break; + + case STOP_STREAMING_ALL: + LOG_DBG("Ping STOP_STREAMING_ALL"); + mic_stop_streaming(); + eeg_stop_streaming(); + imu_stop_streaming(); + + #ifndef CONFIG_WI_FI + ble_print_packet_stats(); /* Print BLE packet stats */ + #else + /* TODO: print WiFi transport stats */ + #endif + sync_reset(); /* Clean up sync state */ + break; + + + case START_IMU_STREAMING: + LOG_DBG("Ping START_IMU_STREAMING"); + imu_start_streaming(); + break; + case STOP_IMU_STREAMING: + LOG_DBG("Ping STOP_IMU_STREAMING"); + imu_stop_streaming(); + break; + + default: + /* + * Command code not recognised - treat the full payload as MSP430 + * configuration for the WULPUS dongle (which sends raw config bytes + * without a preceding command code, exactly as the old nRF52 firmware). + */ +#if defined(CONFIG_SENSOR_WULPUS) + LOG_INF("Unrecognised cmd %u - treating as WULPUS MSP430 config", cmd); + wulpus_set_msp_config(data, size); +#else + LOG_WRN("Unrecognised command: %u", cmd); +#endif + break; + } +} diff --git a/Firmware/src_NRF/core/command_dispatcher.h b/Firmware/src_NRF/core/command_dispatcher.h new file mode 100644 index 0000000..07d2fcc --- /dev/null +++ b/Firmware/src_NRF/core/command_dispatcher.h @@ -0,0 +1,55 @@ +/* + * ---------------------------------------------------------------------- + * + * File: command_dispatcher.h + * + * Last edited: 07.05.2026 + * + * Copyright (C) 2026, ETH Zurich and University of Bologna. + * + * Authors: + * - Giusy Spacone (gspacone@iis.ee.ethz.ch), ETH Zurich + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef COMMAND_DISPATCHER_H +#define COMMAND_DISPATCHER_H + +#include "connectivity_commands.h" +#include "core/common.h" +#include "afe/ads_appl.h" +#include "bsp/system_status/system_status.h" +#include "core/sync_streaming.h" +#include "wifi_sd_shield/wifi_sd_shield_defs.h" +#include +#include + +/** + * @brief Process a command received from either transport (BLE or WiFi/SD) + * + * @param data Full received payload; data[0] is the command byte. Commands + * that need configuration bytes beyond the opcode (PPG_NEW, + * WULPUS) read them from data[1..size-1] -- callers that can + * only supply the opcode (e.g. the WiFi shield's fixed 4-byte + * command transaction) should still pass size >= 1, and those + * commands will fall back to their documented defaults. + * @param size Number of valid bytes in data (>= 1). + */ +void handle_connectivity_command(const uint8_t *data, uint16_t size); + +#endif // COMMAND_DISPATCHER_H \ No newline at end of file diff --git a/Firmware/src_NRF/core/connectivity_commands.h b/Firmware/src_NRF/core/connectivity_commands.h new file mode 100644 index 0000000..799e993 --- /dev/null +++ b/Firmware/src_NRF/core/connectivity_commands.h @@ -0,0 +1,92 @@ +/* + * ---------------------------------------------------------------------- + * + * File: connectivity_commands.h + * + * Last edited: 07.05.2026 + * + * Copyright (C) 2026, ETH Zurich + * + * Authors: + * - Sebastian Frey (sefrey@iis.ee.ethz.ch), ETH Zurich + * - Giusy Spacone (gspacone@iis.ee.ethz.ch), ETH Zurich + * + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef CONNECTIVITY_COMMANDS_H +#define CONNECTIVITY_COMMANDS_H + +/** + * @file connectivity_commands.h + * @brief Connectivity Protocol Command Definitions + * + * This header defines the command codes used in the connectivity communication + * protocol between the SENSEI board and the host application. + */ + +/*============================================================================== + * Connectivity Command Codes + *============================================================================*/ + +#define GET_DEVICE_SETTINGS 13 +#define REQUEST_HARDWARE_VERSION 14 +#define GET_BOARD_STATE 15 +#define REQUEST_BATTERY_STATE 17 +#define START_EEG_STREAMING 18 +#define STOP_EEG_STREAMING 19 +#define SET_BOARD_STATE 20 +#define RESET_BOARD 21 +#define ENTER_BOOTLOADERT_MODE 22 +#define SET_TRIGGER_STATE 23 +#define GO_TO_SLEEP 24 +#define RESET_GAP9 25 +#define START_MIC_STREAMING 26 +#define STOP_MIC_STREAMING 27 +#define REQUEST_AVAILABLE_SENSORS 28 +#define REQUEST_FIRMWARE_VERSION 29 +#define REQUEST_CONNECTING_STRING 30 +#define START_STREAMING_ALL 31 +#define STOP_STREAMING_ALL 32 +#define START_IMU_STREAMING 33 +#define STOP_IMU_STREAMING 34 +#define START_EEG_MIC_STREAMING 35 +#define STOP_EEG_MIC_STREAMING 36 +#define SET_DEVICE_SETTINGS 12 +#define START_EMG_STREAMING 37 +#define STOP_EMG_STREAMING 38 +#define START_PPG_STREAMING 39 +#define STOP_PPG_STREAMING 40 +#define START_WULPUS_STREAMING 41 +#define STOP_WULPUS_STREAMING 42 +/* Extended battery/system status (v2). Response header 43 = 0x2B is chosen + * to not collide with any streaming packet header (0x55 ExG, 0x56 IMU, + * 0xAA MIC, 0x10-0x13 WULPUS, 0x70 PPG) - unlike the legacy + * REQUEST_BATTERY_STATE echo (17 = 0x11), which is ambiguous with WULPUS + * chunk 2 during ultrasound streaming. */ +#define REQUEST_SYSTEM_STATUS 43 + +/* Deliberately NOT 250/251 (0xFA/0xFB): sensors/wulpus/wulpus_appl.c treats + * those as protocol-internal "new config"/"restart" markers embedded in raw + * MSP430 config bytes forwarded through the same dispatcher (see the + * default: case in command_dispatcher.c) -- a WULPUS config fragment + * legitimately starting with 250 or 251 would otherwise be intercepted here + * as one of these commands instead of reaching wulpus_set_msp_config(). */ +#define START_DUMMY_STREAMING 243 +#define STOP_DUMMY_STREAMING 244 +#define ESP_STOP_COMMAND 245 + +#endif // CONNECTIVITY_COMMANDS_H diff --git a/Firmware/src_NRF/main.c b/Firmware/src_NRF/main.c index 429be98..bcc5d2c 100644 --- a/Firmware/src_NRF/main.c +++ b/Firmware/src_NRF/main.c @@ -61,6 +61,13 @@ #if defined(CONFIG_SENSOR_WULPUS) #include "sensors/wulpus/wulpus_appl.h" #endif +#if defined(CONFIG_WI_FI) +#include "wifi_sd_shield/wifi_sd_shield_inits.h" +#include "wifi_sd_shield/wifi_sd_shield_appl.h" +#endif +#if defined(CONFIG_DUMMY_SENSOR) +#include "sensors/dummy_sensor/dummy_sensor_appl.h" +#endif // Inter-board hardware synchronization #include "core/board_sync.h" @@ -133,6 +140,7 @@ int main(void) { LOG_ERR("PWR Start failed!"); } + // LOG_INF("Initializing ADS..."); ret = ads_dr_init(); @@ -143,10 +151,35 @@ int main(void) { // gap9_pwr(true); LOG_INF("GAP9 powered up"); +#if defined(CONFIG_WI_FI) + LOG_INF("Initializing Wi-Fi/SD shield..."); + ret = wifi_sd_shield_cs_init(); + if (ret != 0) { + LOG_ERR("Wi-Fi/SD shield initialization failed"); + } + ret = initial_handshake_nrf_esp(); + if (ret != 0) { + LOG_ERR("Initial handshake with ESP32 failed - Wi-Fi communication not established"); + } else { + LOG_INF("Wi-Fi/SD shield initialized"); + } +#else struct uart_data_t *buf = k_malloc(sizeof(*buf)); LOG_INF("Starting BLE adverts..."); start_bluetooth_adverts(); +#endif + +#if defined(CONFIG_DUMMY_SENSOR) + LOG_INF("Initializing Dummy Sensor..."); + if (dummy_sensor_init() != 0) { + LOG_ERR("Dummy sensor initialization failed"); + } else { + LOG_INF("Dummy sensor initialized"); + } +#endif + +/* COMMENTED OUT FOR NOW // Initialize microphone LOG_INF("Initializing microphone..."); //if (mic_init() != 0) { @@ -162,10 +195,13 @@ int main(void) { } else { LOG_INF("IMU initialized"); } +*/ /* EEG and EMG can both be built into one image; the mode (unipolar vs * bipolar rails) is selected at runtime by the GUI start command, and * simultaneous streaming is rejected in eeg/emg_start_streaming(). */ + +/* #if defined(CONFIG_SENSOR_EEG) // Initialize EEG subsystem LOG_INF("Initializing EEG subsystem..."); @@ -209,12 +245,14 @@ int main(void) { // Initialize inter-board synchronization LOG_INF("Initializing board sync..."); -// if (board_sync_init() != 0) { - // LOG_WRN("Board sync initialization failed - inter-board sync disabled"); - //} else { - // LOG_INF("Board sync initialized"); - //} + // if (board_sync_init() != 0) { + // LOG_WRN("Board sync initialization failed - inter-board sync disabled"); + //} else { + // LOG_INF("Board sync initialized"); + //} + + */ while (1) { k_msleep(1000); // Main thread can sleep now, all the work is handeled by other threads //gpio_pin_set_dt(&ppg_sync_gpio, 1); diff --git a/Firmware/src_NRF/prj.conf b/Firmware/src_NRF/prj.conf index 6af66e3..9826528 100755 --- a/Firmware/src_NRF/prj.conf +++ b/Firmware/src_NRF/prj.conf @@ -59,6 +59,10 @@ CONFIG_SENSOR_EMG=y # Disable again for production builds. # CONFIG_PMIC_NOISE_TEST=y +# WiFi/SD shield (ESP32-C6) as the streaming transport instead of BLE. +# Shares SPI_A (SPIM4, already enabled above) with the ADS1298. +CONFIG_WI_FI=y + # Sensor Support CONFIG_SENSOR=y @@ -176,4 +180,9 @@ CONFIG_SENSOR_PPG_NEW=n CONFIG_PPG_SENSOR_MASK=0x01 # Sample rate: 125, 250, or 500 sps. -CONFIG_PPG_SAMPLE_RATE=125 \ No newline at end of file +CONFIG_PPG_SAMPLE_RATE=125 + +#=============================================================================== +# Dummy Sensor Configuration (for testing without real sensors) +#=============================================================================== +CONFIG_DUMMY_SENSOR=y \ No newline at end of file diff --git a/Firmware/src_NRF/sensors/dummy_sensor/dummy_sensor_appl.c b/Firmware/src_NRF/sensors/dummy_sensor/dummy_sensor_appl.c new file mode 100644 index 0000000..a8366c1 --- /dev/null +++ b/Firmware/src_NRF/sensors/dummy_sensor/dummy_sensor_appl.c @@ -0,0 +1,257 @@ +/* + * ---------------------------------------------------------------------- + * + * File: dummy_sensor.c + * + * Last edited: 20.05.2026 + * + * Copyright (C) 2026, ETH Zurich + * + * Authors: + * - Giusy Spacone (gspacone@iis.ee.ethz.ch), ETH Zurich + * + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + /** + * @file dummy_sensor_appl.c + * @brief Dummy Sensor Application Interface + * + * This file contains the application-level implementation for simulating a sensor. + * It can be used for testing the data flow and integration of the system without requiring actual sensor hardware. + * The dummy sensor will generate synthetic data at a configurable rate and send it through the same pathways as rwal sensors. +*/ + +#include "dummy_sensor_appl.h" +#include "ble/ble_appl.h" +#include "wifi_sd_shield/wifi_sd_shield_appl.h" +#include +#include +#include +#include +#include +LOG_MODULE_REGISTER(dummy_sensor_appl, LOG_LEVEL_INF); + +/*==============================================================================*/ +/* Static Function Declarations */ +/*==============================================================================*/ + +/** + * @brief Dummy sensor streaming thread function + * + * Main thread that handles dummy sensor data acquisition. + * Runs continuously while dummy_sensor_keep_running is true. + * + * @param arg1 Unused + * @param arg2 Unused + * @param arg3 Unused + */ +static void dummy_sensor_streaming_thread(void *arg1, void *arg2, void *arg3); + + +static volatile dummy_sensor_state_t dummy_sensor_state = DUMMY_SENSOR_STATE_IDLE; +static volatile bool dummy_sensor_keep_running = false; +static K_SEM_DEFINE(dummy_sensor_start_sem, 0, 1); +uint8_t dummy_sensor_buf[DUMMY_SENSOR_PCKT_SIZE]; +static uint16_t dummy_sensor_buf_idx = DUMMY_SAMPLE_HEADER_SIZE; /* Start after header space */ +static uint8_t dummy_sensor_pkt_counter = 0; +static void dummy_periodic_timer_expiry(struct k_timer *timer); +K_TIMER_DEFINE(dummy_periodic_timer, dummy_periodic_timer_expiry, NULL); +K_SEM_DEFINE(dummy_data_ready_sem, 0, 1); +uint32_t chunk_counter = 0; + + + +void fill_dummy_exg_sample(uint8_t *sample, uint32_t sample_index) +{ + /* Generate DUMMY_BYTES_PER_SAMPLE bytes whose values continue across samples + * within a packet so the full packet payload becomes 0..(N-1). + * sample_index is the sample number within the current packet (0..) + */ + uint32_t base = sample_index * DUMMY_BYTES_PER_SAMPLE; + for (int i = 0; i < DUMMY_BYTES_PER_SAMPLE; i++) { + sample[i] = (uint8_t)(base + i); + } +} + +static void build_full_dummy_packet(uint8_t *packet) +{ + /* + * Build complete Dummy packet from aggregation buffer: + * Bytes 0-6: header, counter, timestamp (7 bytes) + * Bytes 7-206: payload (200 bytes from aggregation_buffer) + * Bytes 207-209: metadata (3 bytes) + * Byte 210: tailer + */ + uint32_t ts_us = k_cyc_to_us_floor32(k_cycle_get_32()); + + /* Header */ + packet[0] = DUMMY_SENSOR_HEADER; + + /* Counter (little-endian) */ + packet[1] = (uint8_t)(dummy_sensor_pkt_counter & 0xFF); + packet[2] = (uint8_t)((dummy_sensor_pkt_counter >> 8) & 0xFF); + + /* Timestamp (microseconds, little-endian) */ + packet[3] = (uint8_t)(ts_us & 0xFF); + packet[4] = (uint8_t)((ts_us >> 8) & 0xFF); + packet[5] = (uint8_t)((ts_us >> 16) & 0xFF); + packet[6] = (uint8_t)((ts_us >> 24) & 0xFF); + + /* Metadata bytes */ + packet[DUMMY_SENSOR_PCKT_SIZE - 4] = 0x01; /* board_id placeholder */ + packet[DUMMY_SENSOR_PCKT_SIZE - 3] = 0x00; /* sync_pulse_count placeholder */ + packet[DUMMY_SENSOR_PCKT_SIZE - 2] = 0x00; /* reserved */ + + /* Tailer */ + packet[DUMMY_SENSOR_PCKT_SIZE - 1] = DUMMY_SENSOR_TAILER; + //LOG_INF("Built full DUMMY packet,header is 0x%02X, tailer is: 0x%02X", packet[0], packet[DUMMY_SENSOR_PCKT_SIZE - 1]); +} + +static void dummy_periodic_timer_expiry(struct k_timer *timer) +{ + ARG_UNUSED(timer); + k_sem_give(&dummy_data_ready_sem); +} + +int dummy_sensor_init(void) { + + LOG_INF("Initializing Dummy Sensor subsystem"); + + // Set initial state + dummy_sensor_state = DUMMY_SENSOR_STATE_IDLE; + dummy_sensor_keep_running = false; + dummy_sensor_buf_idx = DUMMY_SAMPLE_HEADER_SIZE; /* Start after header space */ + dummy_sensor_pkt_counter = 0; + + LOG_INF("Dummy Sensor subsystem initialized successfully"); + return 0; +} + +int dummy_sensor_start_streaming(void) { + if (dummy_sensor_state != DUMMY_SENSOR_STATE_IDLE) { + LOG_ERR("Dummy sensor not in idle state, current state: %d", dummy_sensor_state); + return -EBUSY; + } + + LOG_INF("Starting Dummy Sensor streaming"); + + dummy_sensor_state = DUMMY_SENSOR_STATE_STARTING; + dummy_sensor_keep_running = true; + dummy_sensor_buf_idx = DUMMY_SAMPLE_HEADER_SIZE; /* Start after header space */ + dummy_sensor_pkt_counter = 0; + chunk_counter = 0; + + // Start dummy sensor hardware. Timer to generate synthetic data ready + k_timer_start(&dummy_periodic_timer, K_MSEC(SENSOR_SAMPLING_PERIOD_MS), K_MSEC(SENSOR_SAMPLING_PERIOD_MS)); + /* Signal thread to complete startup (sync barrier + ads_start) */ + + // wait a bit + k_msleep(1000); + k_sem_give(&dummy_sensor_start_sem); + + LOG_INF("Signaled Dummy Sensor streaming thread to start"); + + return 0; +} + +int dummy_sensor_stop_streaming(void){ + if (dummy_sensor_state != DUMMY_SENSOR_STATE_STREAMING) { + LOG_WRN("Dummy sensor not streaming"); + return -EINVAL; + } + + dummy_sensor_keep_running = false; + k_timer_stop(&dummy_periodic_timer); /* Stop timer to avoid running between sessions */ + k_sem_give(&dummy_data_ready_sem); /* In case thread is waiting on timer expiry, unblock it to allow clean shutdown */ + LOG_INF("Stopping Dummy Sensor streaming"); + + /* Wait for the streaming thread to stop */ + int timeout = 100; /* 1 second timeout */ + while (dummy_sensor_state != DUMMY_SENSOR_STATE_IDLE && timeout > 0) { + k_msleep(10); + timeout--; + } + + if (timeout == 0) { + LOG_ERR("Timeout waiting for dummy sensor to stop"); + return -ETIMEDOUT; + } + + return 0; +} + + + +static void dummy_sensor_streaming_thread(void *arg1, void *arg2, void *arg3) { + ARG_UNUSED(arg1); + ARG_UNUSED(arg2); + ARG_UNUSED(arg3); + + int ret; + + + LOG_INF("Dummy sensor streaming thread started, waiting for initialization signal..."); + + while (1) { + /* Wait for start signal from dummy_sensor_start_streaming() */ + k_sem_take(&dummy_sensor_start_sem, K_FOREVER); + // wait for the first run to complete initialization + + dummy_sensor_state = DUMMY_SENSOR_STATE_STREAMING; + + while (dummy_sensor_keep_running) { + /* wait for timer expiry (data-ready) */ + k_sem_take(&dummy_data_ready_sem, K_FOREVER); + // fill dummy sample + uint8_t dummy_sample[DUMMY_BYTES_PER_SAMPLE]; + fill_dummy_exg_sample(dummy_sample, chunk_counter++); + // copy to the big buffer + memcpy(&dummy_sensor_buf[dummy_sensor_buf_idx], dummy_sample, DUMMY_BYTES_PER_SAMPLE); + dummy_sensor_buf_idx += DUMMY_BYTES_PER_SAMPLE; + if(dummy_sensor_buf_idx >= (DUMMY_SAMPLE_HEADER_SIZE + DUMMY_BYTES_PER_SAMPLE * DUMMY_SAMPLES_PER_PACKET)){ + build_full_dummy_packet(&dummy_sensor_buf); + + #if defined(CONFIG_WI_FI) + add_data_to_esp_send_buffer(dummy_sensor_buf, DUMMY_SENSOR_PCKT_SIZE); + #else + /* Send via BLE queue */ + add_data_to_send_buffer(dummy_sensor_buf, DUMMY_SENSOR_PCKT_SIZE); + #endif + /* Prepare for next packet*/ + dummy_sensor_buf_idx = DUMMY_SAMPLE_HEADER_SIZE; /* Start after header space */ + dummy_sensor_pkt_counter++; + /* restart sample numbering for the next packet */ + chunk_counter = 0; + } + } + + + /* stop periodic timer to avoid running between sessions */ + k_timer_stop(&dummy_periodic_timer); + + dummy_sensor_state = DUMMY_SENSOR_STATE_IDLE; + LOG_INF("Dummy sensor streaming stopped"); + } + + LOG_INF("Dummy sensor streaming thread exiting"); +} + + +#if defined(CONFIG_DUMMY_SENSOR) + K_THREAD_DEFINE(dummy_sensor_thread_id, DUMMY_SENSOR_THREAD_STACK_SIZE, dummy_sensor_streaming_thread, + NULL, NULL, NULL, DUMMY_SENSOR_THREAD_PRIORITY, 0, 0); +#endif diff --git a/Firmware/src_NRF/sensors/dummy_sensor/dummy_sensor_appl.h b/Firmware/src_NRF/sensors/dummy_sensor/dummy_sensor_appl.h new file mode 100644 index 0000000..2f046da --- /dev/null +++ b/Firmware/src_NRF/sensors/dummy_sensor/dummy_sensor_appl.h @@ -0,0 +1,120 @@ +/* + * ---------------------------------------------------------------------- + * + * File: dummy_sensor.h + * + * Last edited: 20.05.2026 + * + * Copyright (C) 2026, ETH Zurich + * + * Authors: + * - Giusy Spacone (gspacone@iis.ee.ethz.ch), ETH Zurich + * + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @file dummy_sensor_appl.h + * @brief Dummy Sensor Application Interface + * + * This header contains the application-level interface to simulate a sensor. + * It can be used for testing the data flow and integration of the system without requiring actual sensor hardware. + * The dummy sensor will generate synthetic data at a configurable rate and send it through the same pathways as rwal sensors. +*/ +#ifndef DUMMY_SENSOR_APPL_H +#define DUMMY_SENSOR_APPL_H + +#include +#include +#include +#include +#include +#include +#include + + +#define EMULATE_EXG_DATA 1 /* Set to 1 to enable dummy producer thread that generates EXG-like packets for testing without real sensor input */ +#define EMULATE_US_DATA 0 /* Set to 1 to enable dummy producer thread that generates US-like packets for testing without real sensor input */ + +#if (EMULATE_EXG_DATA == 1) + + /* Packet format constants (aligned with biogap firmware ads_defs.h) */ + #define DUMMY_SENSOR_PCKT_SIZE 211 /* Total packet size (211 for EXG | 811 for US)*/ + #define DUMMY_SAMPLE_DATA_END 207 /* 207 for EXG, 807 for US - Header(1) + Counter(2) + Timestamp(4) + 4×50forEXG - 800 for US */ + #define DUMMY_SAMPLE_HEADER_SIZE 7 /* Header(1) + Counter(2) + Timestamp(4) */ + #define DUMMY_SAMPLES_PER_PACKET 4 /* 4 samples per packet for EXG - 1 for */ + #define DUMMY_BYTES_PER_SAMPLE 50 /* 24 ADS_A + 24 ADS_B + counter + reserved */ + #define DUMMY_PAYLOAD_SIZE (DUMMY_SAMPLES_PER_PACKET * DUMMY_BYTES_PER_SAMPLE) /* 200 bytes to aggregate */ + #define SENSOR_SAMPLING_PERIOD_MS 100 /* Timer period: one sample from ads every TRANSACTION_PERIOD_MS. One NRF -> ESP transactio occurs every SAMPLING_PERIOD_MS x DUMMY_SAMPLES_PER_PACKET */ +#endif + +#if (EMULATE_US_DATA == 1) + /* Packet format constants (aligned with biogap firmware ads_defs.h) */ + #define DUMMY_SENSOR_PCKT_SIZE 811 /* Total packet size (211 for EXG | 811 for US)*/ + #define DUMMY_SAMPLE_HEADER_SIZE 7 /* Header(1) + Counter(2) + Timestamp(4) */ + #define DUMMY_SAMPLE_DATA_END 807 /* 207 for EXG, 807 for US - Header(1) + Counter(2) + Timestamp(4) + 4×50forEXG - 800 for US */ + #define DUMMY_SAMPLES_PER_PACKET 1 /* 4 samples per packet for EXG - 1 for */ + #define DUMMY_BYTES_PER_SAMPLE 800 /* 24 ADS_A + 24 ADS_B + counter + reserved */ + #define DUMMY_PAYLOAD_SIZE (DUMMY_SAMPLES_PER_PACKET * DUMMY_BYTES_PER_SAMPLE) /* 200 bytes to aggregate */ + #define SENSOR_SAMPLING_PERIOD_MS 10 /* Timer period: one sample from ads every TRANSACTION_PERIOD_MS. One NRF -> ESP transactio occurs every SAMPLING_PERIOD_MS x DUMMY_SAMPLES_PER_PACKET */ + +#endif + +#define DUMMY_SENSOR_HEADER 0x55 +#define DUMMY_SENSOR_TAILER 0xAA + +#define DUMMY_NRF_ESP_TRANSACTION_INTERVAL_MS SENSOR_SAMPLING_PERIOD_MS * DUMMY_SAMPLES_PER_PACKET /* Expected interval between NRF-ESP transactions, used for logging */ + + +#define DUMMY_SENSOR_THREAD_STACK_SIZE 2048 +#define DUMMY_SENSOR_THREAD_PRIORITY 5 + + +/*============================================================================== + * Type Definitions + *============================================================================*/ + +/** + * @enum dummy_sensor_state_t + * @brief Dummy sensor states + */ +typedef enum { + DUMMY_SENSOR_STATE_IDLE, /**< Dummy sensor idle, not streaming */ + DUMMY_SENSOR_STATE_STARTING, /**< Dummy sensor initializing and configuring */ + DUMMY_SENSOR_STATE_STREAMING, /**< Dummy sensor actively streaming data */ + DUMMY_SENSOR_STATE_STOPPING, /**< Dummy sensor stopping */ + DUMMY_SENSOR_STATE_ERROR /**< Error state */ +} dummy_sensor_state_t; + + +/** @brief Dummy Buffer to hold synthetic data samples before sending. */ + +extern uint8_t dummy_sensor_buf[DUMMY_SENSOR_PCKT_SIZE]; +extern uint32_t chunk_counter; /* Counter to generate unique sample data */ + +/** @brief Function to produce dummy sensor data */ +void fill_dummy_exg_sample(uint8_t *sample, uint32_t counter); + +/** @brief Initialize the dummy sensor subsystem (state only; call once at boot) */ +int dummy_sensor_init(void); + +/** @brief Start the dummy sensor's periodic synthetic-data streaming */ +int dummy_sensor_start_streaming(void); + +/** @brief Stop the dummy sensor's streaming and wait for the thread to go idle */ +int dummy_sensor_stop_streaming(void); + +#endif // DUMMY_SENSOR_APPL_H \ No newline at end of file diff --git a/Firmware/src_NRF/sensors/imu/imu_appl.c b/Firmware/src_NRF/sensors/imu/imu_appl.c index 1e70d94..ac4da38 100644 --- a/Firmware/src_NRF/sensors/imu/imu_appl.c +++ b/Firmware/src_NRF/sensors/imu/imu_appl.c @@ -38,6 +38,9 @@ #include "sensors/imu/imu_appl.h" #include "ble/ble_appl.h" #include "sensors/imu/lsm6dsv16bx_sensor.h" +#if defined(CONFIG_WI_FI) +#include "wifi_sd_shield/wifi_sd_shield_appl.h" +#endif #include "core/sync_streaming.h" #include @@ -147,8 +150,12 @@ static void imu_packet_add_sample(const int16_t accel[3], const int16_t gyro[3]) /* Add trailer */ imu_tx_buf[imu_buf_idx++] = IMU_DATA_TRAILER; - /* Send packet via BLE queue */ + /* Send packet via BLE or WiFi/SD shield queue */ +#if defined(CONFIG_WI_FI) + add_data_to_esp_send_buffer(imu_tx_buf, IMU_PCKT_SIZE); +#else add_data_to_send_buffer(imu_tx_buf, IMU_PCKT_SIZE); +#endif /* Reset for next packet */ imu_packet_init(); diff --git a/Firmware/src_NRF/sensors/mic/mic_appl.c b/Firmware/src_NRF/sensors/mic/mic_appl.c index defa0b9..01277cb 100644 --- a/Firmware/src_NRF/sensors/mic/mic_appl.c +++ b/Firmware/src_NRF/sensors/mic/mic_appl.c @@ -37,6 +37,9 @@ #include "sensors/mic/mic_appl.h" #include "ble/ble_appl.h" #include "core/sync_streaming.h" +#if defined(CONFIG_WI_FI) +#include "wifi_sd_shield/wifi_sd_shield_appl.h" +#endif #include #include @@ -213,8 +216,12 @@ static void mic_streaming_thread(void *arg1, void *arg2, void *arg3) { ble_packet[MIC_PCKT_SIZE - 1] = MIC_DATA_TRAILER; - /* Send via BLE queue */ + /* Send via BLE or WiFi/SD shield queue */ +#if defined(CONFIG_WI_FI) + add_data_to_esp_send_buffer(ble_packet, MIC_PCKT_SIZE); +#else add_data_to_send_buffer(ble_packet, MIC_PCKT_SIZE); +#endif /* Prepare next packet */ packet_counter++; diff --git a/Firmware/src_NRF/sensors/wulpus/wulpus_appl.c b/Firmware/src_NRF/sensors/wulpus/wulpus_appl.c index cb27734..50f05d1 100644 --- a/Firmware/src_NRF/sensors/wulpus/wulpus_appl.c +++ b/Firmware/src_NRF/sensors/wulpus/wulpus_appl.c @@ -295,7 +295,7 @@ static void wulpus_spi_thread(void *a, void *b, void *c) if (buffer_counter == WULPUS_MAX_FRAMES) { buffer_counter = 0; } - + //LOG_INF("WULPUS SPI done, give BLE ready sem"); k_sem_give(&wulpus_ble_ready_sem); } } @@ -347,7 +347,7 @@ static void wulpus_ble_thread(void *a, void *b, void *c) { ARG_UNUSED(a); ARG_UNUSED(b); ARG_UNUSED(c); - LOG_INF("WULPUS BLE thread started"); + //LOG_INF("WULPUS BLE thread started"); uint8_t ble_packet[WULPUS_BLE_PKT_SIZE]; /* Zero once. The header [0], metadata [1..6] and SPI payload [7..207] are @@ -357,6 +357,7 @@ static void wulpus_ble_thread(void *a, void *b, void *c) while (1) { k_sem_take(&wulpus_ble_ready_sem, K_FOREVER); + //LOG_INF("WULPUS BLE ready, processing frames"); while (current_buffer != buffer_counter) { int base = current_buffer * WULPUS_NUMBER_OF_XFERS; @@ -368,6 +369,7 @@ static void wulpus_ble_thread(void *a, void *b, void *c) uint32_t ts_us = m_frame_ts[current_buffer]; ble_packet[WULPUS_META_CNT_OFF] = (uint8_t)(wulpus_frame_counter); ble_packet[WULPUS_META_CNT_OFF + 1] = (uint8_t)(wulpus_frame_counter >> 8); + //LOG_INF("WULPUS frame %d, timestamp %u us", wulpus_frame_counter, ts_us); ble_packet[WULPUS_META_TS_OFF] = (uint8_t)(ts_us); ble_packet[WULPUS_META_TS_OFF + 1] = (uint8_t)(ts_us >> 8); ble_packet[WULPUS_META_TS_OFF + 2] = (uint8_t)(ts_us >> 16); diff --git a/Firmware/src_NRF/spi/spi_a.c b/Firmware/src_NRF/spi/spi_a.c new file mode 100644 index 0000000..b1edcbd --- /dev/null +++ b/Firmware/src_NRF/spi/spi_a.c @@ -0,0 +1,125 @@ +/* + * ---------------------------------------------------------------------- + * + * File: spi_a.c + * + * Copyright (C) 2026, ETH Zurich + * + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @file spi_a.c + * @brief Shared SPI_A bus (nrfx SPIM4) initialization and transfer dispatch + */ + +#include "spi/spi_a.h" + +#include +#include "zephyr/irq.h" + +LOG_MODULE_REGISTER(spi_a, LOG_LEVEL_INF); + +nrfx_spim_t spi_a_inst = NRFX_SPIM_INSTANCE(SPI_A_INST_IDX); +K_MUTEX_DEFINE(spi_a_mutex); + +/** @brief Owner of the in-flight transfer, set by spi_a_begin_transfer() */ +static spi_a_owner_t current_owner = SPI_A_OWNER_NONE; + +/** @brief CS line to auto-deassert on completion, or NULL if the owner + * manages its own CS deassertion */ +static const struct gpio_dt_spec *current_cs = NULL; + +/** @brief Set once nrfx_spim_init() has succeeded, so init_spi_a_bus() is + * safe to call from every shield that sits on SPI_A regardless of + * init order, without re-initializing an already-live peripheral. */ +static bool spi_a_initialized = false; + +/* Each consumer owns its own completion handling (CS deassertion for + * multi-CS owners, data processing, semaphore signalling, ...); this + * module only routes the single nrfx completion event to the right one. */ +extern void ads_spim_transfer_complete(void); +#if defined(CONFIG_WI_FI) +extern void wifi_sd_spim_transfer_complete(void); +#endif + +static void spi_a_event_handler(nrfx_spim_evt_t const *p_event, void *p_context) { + ARG_UNUSED(p_context); + if (p_event->type != NRFX_SPIM_EVENT_DONE) { + return; + } + + if (current_cs != NULL) { + gpio_pin_set_dt(current_cs, 0); // deassert + current_cs = NULL; + } + + switch (current_owner) { + case SPI_A_OWNER_ADS: + ads_spim_transfer_complete(); + break; + case SPI_A_OWNER_WIFI_SD: +#if defined(CONFIG_WI_FI) + wifi_sd_spim_transfer_complete(); +#else + LOG_WRN("SPI_A transfer completed for WiFi/SD owner, but CONFIG_WI_FI=n"); +#endif + break; + default: + LOG_WRN("SPI_A transfer completed with no registered owner"); + break; + } + current_owner = SPI_A_OWNER_NONE; +} + +int init_spi_a_bus(void) { + nrfx_err_t status; + + if (spi_a_initialized) { + return 0; + } + +#if defined(__ZEPHYR__) + IRQ_CONNECT(NRFX_IRQ_NUMBER_GET(NRF_SPIM_INST_GET(SPI_A_INST_IDX)), SPI_A_INT_PRIO, + NRFX_SPIM_INST_HANDLER_GET(SPI_A_INST_IDX), 0, 0); +#endif + + nrfx_spim_config_t config = + NRFX_SPIM_DEFAULT_CONFIG(SPI_A_SCK_PIN, SPI_A_MOSI_PIN, SPI_A_MISO_PIN, NRF_SPIM_PIN_NOT_CONNECTED); + config.frequency = NRFX_MHZ_TO_HZ(4); + config.mode = NRF_SPIM_MODE_1; + config.bit_order = NRF_SPIM_BIT_ORDER_MSB_FIRST; + config.irq_priority = SPI_A_INT_PRIO; + + status = nrfx_spim_init(&spi_a_inst, &config, spi_a_event_handler, NULL); + if (status != NRFX_SUCCESS) { + LOG_ERR("SPI_A (SPIM%d) init failed: %d", SPI_A_INST_IDX, status); + return -1; + } + + spi_a_initialized = true; + LOG_INF("SPI_A (SPIM%d) initialized: SCK=P0.%02d MOSI=P0.%02d MISO=P0.%02d", SPI_A_INST_IDX, SPI_A_SCK_PIN, + SPI_A_MOSI_PIN, SPI_A_MISO_PIN); + return 0; +} + +void spi_a_begin_transfer(spi_a_owner_t owner, const struct gpio_dt_spec *cs) { + current_owner = owner; + current_cs = cs; + if (cs != NULL) { + gpio_pin_set_dt(cs, 1); // assert + } +} diff --git a/Firmware/src_NRF/spi/spi_a.h b/Firmware/src_NRF/spi/spi_a.h new file mode 100644 index 0000000..ccf53d9 --- /dev/null +++ b/Firmware/src_NRF/spi/spi_a.h @@ -0,0 +1,128 @@ +/* + * ---------------------------------------------------------------------- + * + * File: spi_a.h + * + * Copyright (C) 2026, ETH Zurich + * + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @file spi_a.h + * @brief Shared SPI_A bus (nrfx SPIM4) initialization and transfer dispatch + * + * SPI_A is the BioGAP mainboard's high-speed SPI bus (SCK=P0.08, MOSI=P0.09, + * MISO=P0.10, driven by nrfx SPIM instance 4). It is physically shared by + * every device that sits on it -- currently the two ADS1298 AFEs (ExG + * shield) and the ESP32-C6 / SD card (WiFi/SD shield). Each device gets its + * own software-toggled CS GPIO; there is no hardware-managed CS on this + * bus, since more than one device shares it. + * + * The nrfx SPIM driver only allows ONE event handler per peripheral + * instance, but every consumer needs to know when *its* transfer + * completed. This module resolves that with a single shared interrupt + * handler that dispatches to whichever consumer kicked off the + * in-flight transfer (tracked via spi_a_begin_transfer()). Since the bus + * is physically serial and every consumer is expected to hold spi_a_mutex + * for the duration of its transfer, at most one transfer -- and therefore + * one owner -- is ever in flight at a time. + */ + +#ifndef SPI_A_H +#define SPI_A_H + +#include +#include +#include + +/** @brief SPIM instance index for SPI_A (must match spi_a_default pinctrl + * in the sensei-sdk board DTS: nrf5340_senseiv1_cpuapp.dts) */ +#define SPI_A_INST_IDX 4 + +/** @brief SCK pin number for SPI_A (SPI_A_CLK = P0.08) */ +#define SPI_A_SCK_PIN 8 + +/** @brief MOSI pin number for SPI_A (SPI_A_MOSI = P0.09) */ +#define SPI_A_MOSI_PIN 9 + +/** @brief MISO pin number for SPI_A (SPI_A_MISO = P0.10) */ +#define SPI_A_MISO_PIN 10 + +/** @brief SPI_A interrupt priority level */ +#define SPI_A_INT_PRIO 1 + +/** @brief nrfx SPIM driver instance shared by every device on SPI_A */ +extern nrfx_spim_t spi_a_inst; + +/** + * @brief Serializes access to SPI_A across all consumers (ADS, WiFi/SD, ...) + * + * @note The ADS1298 driver releases this mutex right after kicking off an + * async nrfx_spim_xfer() (matching its pre-existing, hardware-validated + * timing), rather than holding it until the transfer completes. This + * leaves a narrow theoretical window where another consumer could start a + * transfer before the ADS one physically finishes. In practice ADS + * transfers are a few dozen bytes at 4 MHz (tens of microseconds), so the + * window is small, but it is not zero -- treat concurrent ADS + WiFi/SD + * traffic as a known follow-up to validate on hardware, or to close by + * having ADS hold the mutex until completion too (would require moving + * its irq_lock()/busy-wait handling around, since Zephyr mutexes cannot be + * released from ISR context). + */ +extern struct k_mutex spi_a_mutex; + +/** + * @brief Identifies which consumer owns the in-flight SPI_A transfer + * + * Set via spi_a_begin_transfer() immediately before issuing an + * nrfx_spim_xfer() on spi_a_inst, so the shared interrupt handler routes + * the completion event to the right consumer. + */ +typedef enum { + SPI_A_OWNER_NONE, + SPI_A_OWNER_ADS, + SPI_A_OWNER_WIFI_SD, +} spi_a_owner_t; + +/** + * @brief Bring up the shared SPI_A (SPIM4) peripheral + * + * Configures SPI Mode 1 (CPOL=0, CPHA=1), 4 MHz, MSB first, with no + * hardware-managed CS (every device's CS is a plain GPIO toggled by its + * own driver). Call exactly once at boot, regardless of which shields + * (ExG, WiFi/SD, ...) are actually enabled -- each shield's own init + * function should call this rather than initializing SPIM4 itself. + * + * @return 0 on success, -1 on nrfx init failure + */ +int init_spi_a_bus(void); + +/** + * @brief Declare the owner and CS line for the next SPI_A transfer + * + * Must be called with spi_a_mutex held, immediately before asserting CS + * and issuing nrfx_spim_xfer() on spi_a_inst. Asserts *cs (if non-NULL) + * and records it so the shared interrupt handler can deassert it + * automatically on completion; pass NULL if the caller manages its own + * CS deassertion (e.g. ADS toggles two CS lines from a single owner). + * + * @param owner Consumer identifier, used to route the completion callback + * @param cs CS GPIO to assert now and auto-deassert on completion, or NULL + */ +void spi_a_begin_transfer(spi_a_owner_t owner, const struct gpio_dt_spec *cs); + +#endif // SPI_A_H diff --git a/Firmware/src_NRF/wifi_sd_shield/wifi_sd_shield_appl.c b/Firmware/src_NRF/wifi_sd_shield/wifi_sd_shield_appl.c new file mode 100644 index 0000000..2812d2a --- /dev/null +++ b/Firmware/src_NRF/wifi_sd_shield/wifi_sd_shield_appl.c @@ -0,0 +1,279 @@ +/* + * ---------------------------------------------------------------------- + * + * File: wifi_sd_shield_appl.c + * + * Last edited: 15.05.2026 + * + * Copyright (C) 2026, ETH Zurich + * + * Authors: + * - Giusy Spacone (gspacone@iis.ee.ethz.ch), ETH Zurich + * + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @file wifi_sd_shield_appl.c + * @brief Wi-Fi and SD Shield Application Interface + * + * This file contains the application-level implementation for interacting with + * the Wi-Fi and SD shields. +*/ + +#include "wifi_sd_shield_appl.h" +#include "wifi_sd_shield_inits.h" +#include "wifi_sd_spi_functions.h" +#include "core/command_dispatcher.h" +#include + +LOG_MODULE_REGISTER(wifi_sd_shield, LOG_LEVEL_INF); + +#define SPI_NRF_ESP_SENDER_STACK_SIZE 2048 +#define SPI_NRF_ESP_RECEIVER_STACK_SIZE 2048 +#define SPI_NRF_ESP_SENDER_PRIORITY 5 // Same priority as BLE send thread +#define SPI_NRF_ESP_RECEIVER_PRIORITY 5 // Same priority as BLE receive thread + +K_MSGQ_DEFINE(esp_send_msgq, sizeof(esp_packet_t), ESP_SEND_QUEUE_SIZE, 4); +bool handshake_done = false; +/* Semaphore to synchronize NRF-ESP communication: both sender and receiver wait for handshake to complete */ +K_SEM_DEFINE(handshake_complete_sem, 0, 2); + +/** + * @brief Process ESP data when DRDY interrupt occurs + * +*/ +void process_esp_data(void) { + // LOG_INF("Processing ESP data..."); + if (esp_data_ready) { + // LOG_INF("ESP DATA READY interrupt received"); + // Clear flag first to avoid missing next interrupt + esp_data_ready = false; + // Allocate buffer for incoming data. Need to allocate 4 Bytes for ESP DMA transaction + + //if (first_esp_data_ready==true){ + uint8_t spi_tx_buf[4] = {0x00, 0x00, 0x00, 0x00}; + uint8_t spi_rx_buf[4] = {0x00, 0x00, 0x00, 0x00}; + (void)spi_master_transceive(spi_tx_buf, spi_rx_buf, sizeof(spi_tx_buf)); + LOG_INF("SPI transaction with ESP completed, received: 0x%02X 0x%02X 0x%02X 0x%02X", spi_rx_buf[0], spi_rx_buf[1], spi_rx_buf[2], spi_rx_buf[3]); + // reset the flag + first_esp_data_ready = false; + // Check if expected bytes match + if (spi_rx_buf[0] == ESP_SPI_HEADER && spi_rx_buf[3] == ESP_SPI_TAILER) { + LOG_INF("Received valid data from ESP: 0x%02X 0x%02X 0x%02X 0x%02X", spi_rx_buf[0], spi_rx_buf[1], spi_rx_buf[2], spi_rx_buf[3]); + handle_connectivity_command(&spi_rx_buf[1], 1); + } + else{ + LOG_WRN("Received invalid data from ESP, ignoring: 0x%02X 0x%02X 0x%02X 0x%02X", spi_rx_buf[0], spi_rx_buf[1], spi_rx_buf[2], spi_rx_buf[3]); + // halt the system + LOG_ERR("=== SPI FAILURE in process_esp_data - NRF53 HALTED ==="); + while (1) {k_sleep(K_FOREVER);} + } + serve_esp_requests = false; // Clear pending request flag after processing to allow sender thread to resume if it was yielding + + } + + k_sleep(K_USEC(1)); +} + + +/** @brief SPI receiver thread for NRF and ESP communication*/ +/* This thread should be considered the counterpart of process_received_data_thread() used for BLE data reception. +*/ + +void spi_nrf_esp_receiver_thread(void *arg1, void *arg2, void *arg3) +{ + /* Enable this thread only if the commfirst hadns communication has been established*/ + ARG_UNUSED(arg1); + ARG_UNUSED(arg2); + ARG_UNUSED(arg3); + LOG_INF("SPI NRF-ESP receiver thread started, waiting for handshake to complete..."); + k_sem_take(&handshake_complete_sem, K_FOREVER); + LOG_INF("SPI NRF-ESP receiver took semaphore, starting receiver thread"); + + while(1){ + if(esp_data_ready){ + LOG_INF("ESP data ready flag set, processing incoming data..."); + process_esp_data(); + } + else { + /* Yield CPU when no DRDY event is pending. */ + k_msleep(1); + } + + } +} + +/** + * @brief Add Data to Send Buffer + * + * Enqueues data into the send message queue for transmission to ESP32. + * Supports variable packet sizes. + * This function is the counterpart of add_data_to_send_buffer() used for BLE transmission. + * + * @param data The pointer to the byte array to be sent over BLE. + * @param size The size of the data to send in bytes. + */ +void add_data_to_esp_send_buffer(uint8_t *data, uint16_t size) { + + int ret; + esp_packet_t packet; + + // Validate size + if (size > ESP_PCKT_MAX_SIZE) { + LOG_ERR("Packet size %d exceeds max %d", size, ESP_PCKT_MAX_SIZE); + return; + } + + packet.size = size; + memcpy(packet.data, data, size); + //LOG_INF("Enqueuing packet for ESP sending, size: %d", size); + ret = k_msgq_put(&esp_send_msgq, &packet, K_FOREVER); // K_NO_WAIT failed + if (ret != 0) { + LOG_ERR("Failed to enqueue data for ESP sending (err %d)", ret); + } else { + LOG_DBG("Data enqueued for ESP sending: %d", size); + } +} + + +/** @brief SPI sender thread for NRF and ESP communication*/ +void spi_nrf_esp_sender_thread(void *arg1, void *arg2, void *arg3) +{ + /* Enbale this thread only if the communication has bee established*/ + ARG_UNUSED(arg1); + ARG_UNUSED(arg2); + ARG_UNUSED(arg3); + LOG_INF("SPI NRF-ESP sender thread started, waiting for handshake to complete..."); + + k_sem_take(&handshake_complete_sem, K_FOREVER); + LOG_INF("SPI NRF-ESP sender took semaphore, starting sender thread"); + esp_packet_t packet; + while(1){ + int ret = k_msgq_get(&esp_send_msgq, &packet, K_FOREVER); + if (ret == 0) { + // Process packet for transmission to ESP32 + + // make sure that the read-transaction from the ESP has the priority to avoid SPI bus contention. + if (serve_esp_requests) { + LOG_INF("ESP requests pending, prioritizing incoming data processing over sending"); + // Yield to allow processing of incoming ESP data + k_msleep(1); + continue; // Skip this send iteration to prioritize incoming data + } + + // check we are in the correct state to send data to ESP + if (nrf_esp_comm_state != SEND_TO_ESP) { + // Yield and retry later + k_msleep(1); + continue; + } + ret = biogap_to_esp_transaction(&packet); + if (ret != 0) { + LOG_ERR("Failed to send packet to ESP32 (err %d)", ret); + // halt + LOG_ERR("=== SPI FAILURE in spi_nrf_esp_sender_thread - NRF53 HALTED ==="); + while (1) + { + k_sleep(K_FOREVER); + } + } + } else { + LOG_ERR("Failed to get packet from esp_send_msgq (err %d)", ret); + } + } + +} + +/** @brief Perform initial handshake with ESP32 to verify that the connection is established */ +int initial_handshake_nrf_esp() { + + + uint8_t max_handshake_attempts = 5; + uint8_t attempt = 0; + + static uint8_t spi_tx_buf[4] = {HANDSHAKE_MARKER, HANDSHAKE_MARKER, HANDSHAKE_MARKER, HANDSHAKE_MARKER}; + static uint8_t spi_rx_buf[4] = {0x00, 0x00, 0x00, 0x00}; + static const uint8_t expected_handshake_response[4] = { + HANDSHAKE_MARKER_RCV, + HANDSHAKE_MARKER_RCV, + HANDSHAKE_MARKER_RCV, + HANDSHAKE_MARKER_RCV, + }; + + while (!handshake_done && attempt < max_handshake_attempts){ + + LOG_INF("Attempting SPI handshake with ESP32 (attempt %d/%d)", attempt+1, max_handshake_attempts); + /* SPI master transaction for handshake */ + memset(spi_rx_buf, 0x00, sizeof(spi_rx_buf)); + + int ret = spi_master_transceive(spi_tx_buf, spi_rx_buf, sizeof(spi_tx_buf)); + attempt++; + + if (ret == 0) { + LOG_INF("SPI handshake, received: 0x%02X 0x%02X 0x%02X 0x%02X", spi_rx_buf[0], spi_rx_buf[1], spi_rx_buf[2], spi_rx_buf[3]); + if (memcmp(spi_rx_buf, expected_handshake_response, sizeof(expected_handshake_response)) == 0) { + //LOG_INF("SPI handshake accepted: expected marker echoed by slave."); + // wait couple of seconds + + //k_sleep(K_MSEC(2000)); + handshake_done = true; + k_sem_give(&handshake_complete_sem); // Signal sender thread to start + k_sem_give(&handshake_complete_sem); // Signal receiver thread to start + LOG_INF("Initial handshake with ESP32 successful, semaphore given "); + return 0; + } + + else if (((spi_rx_buf[0] | spi_rx_buf[1] | spi_rx_buf[2] | spi_rx_buf[3]) == 0x00) || + ((spi_rx_buf[0] & spi_rx_buf[1] & spi_rx_buf[2] & spi_rx_buf[3]) == 0xFF)) { + LOG_WRN("SPI handshake rejected: RX is all 0x00/0xFF, likely slave absent, not ready, or MISO floating."); + + // wait 2 seconds before retrying handshake, to avoid spamming logs and give slave time to boot + handshake_done = false; + + } + else { + LOG_WRN("SPI handshake rejected: unexpected response [0x%02X 0x%02X 0x%02X 0x%02X]", + spi_rx_buf[0], spi_rx_buf[1], spi_rx_buf[2], spi_rx_buf[3]); + + handshake_done = false; + } + + } + else { + LOG_ERR("SPI handshake failed (ret=%d)", ret); + // sleep 2 seconds before retrying + handshake_done = false; + } + LOG_INF("Retrying SPI handshake with ESP32..."); + LOG_INF("Retry delay start (2s, busy wait)"); + //k_busy_wait(5000000000); // 5 seconds in microseconds. Keeps CPU occupied + k_sleep(K_MSEC(3000)); // 2 seconds sleep, allows other threads to run and reduces CPU usage during handshake retries + LOG_INF("Retry delay done, continuing handshake loop"); + continue; + + + } + return -1; // Handshake failed after max attempts +} + +#if defined (CONFIG_WI_FI) + K_THREAD_DEFINE(spi_nrf_esp_sender_tid, SPI_NRF_ESP_SENDER_STACK_SIZE, spi_nrf_esp_sender_thread, NULL, NULL, NULL,SPI_NRF_ESP_SENDER_PRIORITY, + 0, 0); + K_THREAD_DEFINE(spi_nrf_esp_receiver_tid, SPI_NRF_ESP_RECEIVER_STACK_SIZE, spi_nrf_esp_receiver_thread, NULL, NULL, NULL,SPI_NRF_ESP_RECEIVER_PRIORITY, + 0, 0); + +#endif diff --git a/Firmware/src_NRF/wifi_sd_shield/wifi_sd_shield_appl.h b/Firmware/src_NRF/wifi_sd_shield/wifi_sd_shield_appl.h new file mode 100644 index 0000000..c2fb443 --- /dev/null +++ b/Firmware/src_NRF/wifi_sd_shield/wifi_sd_shield_appl.h @@ -0,0 +1,60 @@ +/* + * ---------------------------------------------------------------------- + * + * File: wifi_sd_shield_appl.h + * + * Last edited: 15.05.2026 + * + * Copyright (C) 2026, ETH Zurich + * + * Authors: + * - Giusy Spacone (gspacone@iis.ee.ethz.ch), ETH Zurich + * + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @file wifi_sd_shield_appl.h + * @brief Wi-Fi and SD Shield Application Interface + * + * This header contains the application-level interface for interacting with + * the Wi-Fi and SD shields. +*/ + +#ifndef WIFI_SD_SHIELD_APPL_H +#define WIFI_SD_SHIELD_APPL_H + +#include +#include + +/** @brief Perform initial handshake with ESP32 to verify that the connection is established */ +int initial_handshake_nrf_esp(); + +/** @brief Process ESP data when DRDY interrupt occurs*/ +void process_esp_data(void); + +/** @brief SPI receiver thread for NRF and ESP communication*/ +/* This thread should be considered the counterpart of process_received_data_thread() used for BLE data reception. +*/ +void spi_nrf_esp_receiver_thread(void *arg1, void *arg2, void *arg3); + +/** @brief SPI sender thread for NRF and ESP communication*/ +void spi_nrf_esp_sender_thread(void *arg1, void *arg2, void *arg3); + +/** @brief Add data to ESP send buffer */ +void add_data_to_esp_send_buffer(uint8_t *data, uint16_t size); + +#endif /* WIFI_SD_SHIELD_APPL_H */ \ No newline at end of file diff --git a/Firmware/src_NRF/wifi_sd_shield/wifi_sd_shield_defs.h b/Firmware/src_NRF/wifi_sd_shield/wifi_sd_shield_defs.h new file mode 100644 index 0000000..66c6fee --- /dev/null +++ b/Firmware/src_NRF/wifi_sd_shield/wifi_sd_shield_defs.h @@ -0,0 +1,132 @@ +/* + * ---------------------------------------------------------------------- + * + * File: wifi_sd_shield_defs.h + * + * Last edited: 15.05.2026 + * + * Copyright (C) 2026, ETH Zurich + * + * Authors: + * - Giusy Spacone (gspacone@iis.ee.ethz.ch), ETH Zurich + * + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @file wifi_sd_shield_defs.h + * @brief Wi-Fi and SD Shield Common Definitions and Constants + * + * This header contains all shared definitions, constants, and macros used + * across the Wi-Fi and SD shields. It includes: + * - GPIO pin definitions + * - Hardware pin assignments + * - SPIM instance for NRF <-> ESP communication + * - Wi-Fi and SD shield specific constants +*/ + +#ifndef WIFI_SD_SHIELD_DEFS_H +#define WIFI_SD_SHIELD_DEFS_H + +#include +#include +#include +#include +#include +#include +#include "nrfx_spim.h" +#include + + +/** + * @brief WiFi/SD shield now sits on the shared SPI_A bus (see spi/spi_a.h) + * rather than a dedicated SPIM instance -- SPI_A is physically shared with + * the ADS1298 (ExG shield), per the new mainboard's default SPI-A jumper + * population on the WiFi/SD shield. + */ + +/** @brief Chip select GPIO node for the ESP32-C6 (P0.14, see + * custom_shields/SENSEI_WiFi_SD_Shield_V1/SENSEI_WiFi_SD_Shield_V1.overlay) */ +#define ESP32_CS_GPIO_NODE DT_NODELABEL(gpio_nrf_esp_cs) + +/** @brief Chip select GPIO node for direct NRF -> SD card access (P0.16). + * Reserved for when the NRF writes to the SD card directly instead of + * through the ESP32; no such data path exists yet. */ +#define SD_CS_GPIO_NODE DT_NODELABEL(gpio_nrf_sd_cs) + +/** @brief Data-ready signal, ESP -> NRF (P0.15) */ +#define DRDY_GPIO_NODE DT_NODELABEL(gpio_nrf_esp_shield_drdy) + +/** + * @brief nRF on-chip QSPI chip-select passthrough (P0.18) + * + * The nRF5340's dedicated QSPI_CS pin, unused as QSPI here (WiFi/SD shield + * uses SPI_A instead), so it's free to bit-bang as GPIO. Feeds an analog + * mux that routes it to either the on-board QSPI PSRAM's CS or the + * board-to-board connector, selected by QSPI_CS_SEL_GPIO_NODE. Driven to 1 + * (deactivate the on-board PSRAM) when the WiFi shield is enabled. + */ +#define QSPI_CS_GPIO_NODE DT_NODELABEL(gpio_nrf_qspi_cs) + +/** + * @brief QSPI CS mux select (P0.19) + * + * Driven to 0 (route QSPI_CS_GPIO_NODE to the on-board PSRAM's CS) when + * the WiFi shield is enabled. + */ +#define QSPI_CS_SEL_GPIO_NODE DT_NODELABEL(gpio_nrf_qspi_cs_sel) + +/** @brief SPI configuration constants */ +#define SPI_NRF_ESP_INT_PRIO 5 +#define HANDSHAKE_MARKER 0xA5 +#define HANDSHAKE_MARKER_RCV 0x5A +#define ESP_SPI_HEADER 0x66 // Header byte for every ESP <--> NRF transaction, to verify correct data parsing +#define ESP_SPI_TAILER 0xBB // Tailer byte for every ESP <--> NRF transaction, to verify correct data parsing + +/** @brief Bit 7 of a packet's header byte: set by the NRF on a dedicated + * ack transaction (biogap_to_esp_transaction()) to explicitly confirm it + * received and processed the ESP's piggybacked STOP marker. Checked by the + * ESP against data it actually reads FROM the NRF (its rx_buffer), not its + * own previously-stomped tx buffer -- see enter_stop_quiesce_state() + * (espc6/components/biogap/source/biogap_read.c) for why that distinction + * matters. */ +#define NRF_STOP_ACK_MASK 0x80 + +#define ESP_PCKT_MAX_SIZE 820 // Set for now equal to the max size of WULPUS packets +#define ESP_SEND_QUEUE_SIZE 4 // Max number of packets that can be queued for sending to ESP. + // Adjust as needed based on expected traffic and memory constraints. +/** @brief Boolean to verify successful connection between NRF and ESP */ +extern bool handshake_done; + + +/** + * @brief ESP packet structure for variable-size packet support + * + * Allows sending packets of different sizes through the same queue. + */ +typedef struct { + uint16_t size; // Actual size of data in this packet + uint8_t data[ESP_PCKT_MAX_SIZE]; // Packet data buffer +} esp_packet_t; + +extern uint16_t esp_spi_packet_size; +typedef enum { + NRF_ESP_IDLE, + SEND_TO_ESP, +} nrf_to_esp_comm_state_t; +extern nrf_to_esp_comm_state_t nrf_esp_comm_state; +extern bool serve_esp_requests; // Flag to control whether to process incoming ESP data,to avoid SPI bus contention during critical operations +#endif // WIFI_SD_SHIELD_DEFS_H \ No newline at end of file diff --git a/Firmware/src_NRF/wifi_sd_shield/wifi_sd_shield_inits.c b/Firmware/src_NRF/wifi_sd_shield/wifi_sd_shield_inits.c new file mode 100644 index 0000000..ad42102 --- /dev/null +++ b/Firmware/src_NRF/wifi_sd_shield/wifi_sd_shield_inits.c @@ -0,0 +1,180 @@ +/* + * ---------------------------------------------------------------------- + * + * File: wifi_sd_shield_inits.c + * + * Last edited: 15.05.2026 + * + * Copyright (C) 2026, ETH Zurich + * + * Authors: + * - Giusy Spacone (gspacone@iis.ee.ethz.ch), ETH Zurich + * + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @file wifi_sd_shield_inits.c + * @brief Wi-Fi and SD Shield Initialization Functions + * + * This file contains the initialization functions for the Wi-Fi and SD card shields. + */ + +#include "wifi_sd_shield_inits.h" +#include "spi/spi_a.h" + +LOG_MODULE_REGISTER(wifi_sd_shield_inits, LOG_LEVEL_INF); + +bool esp_data_ready = false; +bool first_esp_data_ready = true; +bool serve_esp_requests = false; // Flag to control whether to process incoming ESP data, to avoid SPI bus contention during critical operations +nrf_to_esp_comm_state_t nrf_esp_comm_state = NRF_ESP_IDLE; // State variable to manage NRF-ESP communication flow + +/* GPIO device specs - defined in device tree overlay */ +static const struct gpio_dt_spec drdy_gpio = GPIO_DT_SPEC_GET(DRDY_GPIO_NODE, gpios); +const struct gpio_dt_spec esp_cs_gpio = GPIO_DT_SPEC_GET(ESP32_CS_GPIO_NODE, gpios); +const struct gpio_dt_spec sd_cs_gpio = GPIO_DT_SPEC_GET(SD_CS_GPIO_NODE, gpios); +const struct gpio_dt_spec qspi_cs_gpio = GPIO_DT_SPEC_GET(QSPI_CS_GPIO_NODE, gpios); +const struct gpio_dt_spec qspi_cs_sel_gpio = GPIO_DT_SPEC_GET(QSPI_CS_SEL_GPIO_NODE, gpios); + +/*============================================================================== + * Private Functions - Interrupt Callbacks + *============================================================================*/ + +/** @brief GPIO callback data structure for DRDY interrupt */ +static struct gpio_callback esp_drdy_cb_data; + +/** @brief DRDY GPIO callback function for ESP -> NRF communication. +*/ +static void cb_esp_drdy(const struct device *dev, struct gpio_callback *cb, uint32_t pins) { + /* Signal that ESP has new data to send */ + esp_data_ready = true; + // Signal also that ESP must be served + serve_esp_requests = true; + //LOG_INF("ESP DRDY interrupt: new data ready from ESP"); +} + + +/** @brief Initialize adn Enable Data Ready GPIO for ESP -> NRF communication */ +int esp_drydy_gpio_init(){ + int ret; + /* Data Ready GPIO for ESP <--> NRF comminication */ + if (!device_is_ready(drdy_gpio.port)) { + LOG_ERR("DRDY GPIO controller not ready!"); + return -1; + } + ret = gpio_pin_configure_dt(&drdy_gpio, GPIO_INPUT); + if (ret != 0) { + LOG_ERR("Failed to configure DRDY GPIO (%d)", ret); + return -1; + } + + // Initialize the static struct gpio_callback variable + gpio_init_callback(&esp_drdy_cb_data, cb_esp_drdy, BIT(drdy_gpio.pin)); + // Add the callback function by calling gpio_add_callback() + ret = gpio_add_callback(drdy_gpio.port, &esp_drdy_cb_data); + if (ret < 0) { + LOG_ERR("ESP DRDY GPIO interrupt enable error"); + return -1; + } + + // Enable the DRDY interrupt only after the callback is registered. + ret = gpio_pin_interrupt_configure_dt(&drdy_gpio, GPIO_INT_EDGE_TO_ACTIVE); + if (ret < 0) { + LOG_ERR("ESP DRDY GPIO interrupt enable error"); + return -1; + } + + LOG_INF("ESP DRDY GPIO initialized and interrupt enabled"); + + + + return 0; + +} +/** + * @brief Initialize the WiFi/SD shield: shared SPI_A bus, CS/DRDY/QSPI-mux GPIOs + * + * SPI_A itself is shared with the ExG shield -- init_spi_a_bus() is + * idempotent, so it is safe to call here regardless of whether the ExG + * shield already brought it up (or will do so later). + * + * Also parks the on-board QSPI PSRAM's mux out of the way: with the WiFi + * shield enabled, the nRF's on-chip QSPI peripheral is not used, so + * QSPI_CS_SEL_GPIO_NODE is set to 0 (routes QSPI_CS_GPIO_NODE to the + * on-board PSRAM's CS) and QSPI_CS_GPIO_NODE is set to 1 (deactivates + * that PSRAM) so it never sits selected/floating. + * + * @note The bus-direction/level-translator control lines found on the + * WiFi shield schematic (NRF_ESP_DIR_CTRL, NRF_ESP_DRDY_DIR_CTRL) are not + * yet modeled in the devicetree overlay or initialized here -- they need + * dedicated GPIO nodes (with real pin numbers from the shield schematic) + * added to SENSEI_WiFi_SD_Shield_V1.overlay before this shield can be + * brought up on real hardware. + */ +int wifi_sd_shield_cs_init(void) { + int ret; + + if (init_spi_a_bus() != 0) { + LOG_ERR("Failed to initialize shared SPI_A bus"); + return -1; + } + + ret = esp_drydy_gpio_init(); + if (ret != 0) { + LOG_ERR("Failed to initialize DRDY GPIO (%d)", ret); + return -1; + } + LOG_INF("DRDY GPIO initialized"); + + if (!device_is_ready(esp_cs_gpio.port)) { + LOG_ERR("ESP32-CS GPIO controller not ready!"); + return -1; + } + ret = gpio_pin_configure_dt(&esp_cs_gpio, GPIO_OUTPUT_INACTIVE); + if (ret != 0) { + LOG_ERR("Failed to configure ESP32-CS GPIO (%d)", ret); + return -1; + } + LOG_INF("ESP32-CS initialized"); + + if (!device_is_ready(sd_cs_gpio.port)) { + LOG_ERR("SD-CS GPIO controller not ready!"); + return -1; + } + ret = gpio_pin_configure_dt(&sd_cs_gpio, GPIO_OUTPUT_INACTIVE); + if (ret != 0) { + LOG_ERR("Failed to configure SD-CS GPIO (%d)", ret); + return -1; + } + LOG_INF("SD-CS initialized"); + + if (!device_is_ready(qspi_cs_sel_gpio.port) || !device_is_ready(qspi_cs_gpio.port)) { + LOG_ERR("QSPI mux GPIO controller not ready!"); + return -1; + } + ret = gpio_pin_configure_dt(&qspi_cs_sel_gpio, GPIO_OUTPUT); + ret |= gpio_pin_set_dt(&qspi_cs_sel_gpio, 0); // route QSPI_CS to the on-board PSRAM + ret |= gpio_pin_configure_dt(&qspi_cs_gpio, GPIO_OUTPUT); + ret |= gpio_pin_set_dt(&qspi_cs_gpio, 1); // deactivate the on-board PSRAM + if (ret != 0) { + LOG_ERR("Failed to configure QSPI mux GPIOs (%d)", ret); + return -1; + } + LOG_INF("QSPI mux parked (on-board PSRAM deactivated)"); + + return 0; +} diff --git a/Firmware/src_NRF/wifi_sd_shield/wifi_sd_shield_inits.h b/Firmware/src_NRF/wifi_sd_shield/wifi_sd_shield_inits.h new file mode 100644 index 0000000..0a9061c --- /dev/null +++ b/Firmware/src_NRF/wifi_sd_shield/wifi_sd_shield_inits.h @@ -0,0 +1,99 @@ +/* + * ---------------------------------------------------------------------- + * + * File: wifi_sd_shield_inits.h + * + * Last edited: 15.05.2026 + * + * Copyright (C) 2026, ETH Zurich + * + * Authors: + * - Giusy Spacone (gspacone@iis.ee.ethz.ch), ETH Zurich + * + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @file wifi_sd_shield_inits.h + * @brief Wi-Fi and SD Shield Initialization Functions + * + * This header contains the initialization functions for the Wi-Fi and SD card shields. + */ + +#ifndef WIFI_SD_SHIELD_INITS_H +#define WIFI_SD_SHIELD_INITS_H + +#include +#include +#include +#include +#include +#include "zephyr/irq.h" +#include "wifi_sd_shield_defs.h" +#include "core/command_dispatcher.h" + +extern struct k_sem spi_nrf_esp_transfer_done; +/** + * @brief Data ready interrupt flag + * + * Set by ESP_DRDY GPIO interrupt when ESP wants to send new data. Cleared + * by process_esp_data() after reading. + */ +extern bool esp_data_ready; +extern bool first_esp_data_ready; + +/** @brief ESP32-C6 chip select GPIO spec (SPI_A, software-toggled) */ +extern const struct gpio_dt_spec esp_cs_gpio; + +/** + * @brief Direct NRF -> SD card chip select GPIO spec (SPI_A, software-toggled) + * + * Configured (deasserted) at init time but otherwise unused for now -- the + * NRF writing to the SD card directly, bypassing the ESP32, is not yet + * implemented. + */ +extern const struct gpio_dt_spec sd_cs_gpio; + +/** @brief nRF QSPI CS passthrough GPIO spec (see QSPI_CS_GPIO_NODE) */ +extern const struct gpio_dt_spec qspi_cs_gpio; + +/** @brief QSPI CS mux select GPIO spec (see QSPI_CS_SEL_GPIO_NODE) */ +extern const struct gpio_dt_spec qspi_cs_sel_gpio; + +/** + * @brief Initialize CS (ESP32, SD card) and DRDY GPIOs for the WiFi/SD shield + * + * Does NOT bring up SPI_A itself: SPI_A is shared with the ExG shield, so + * whichever shield initializes first calls init_spi_a_bus() (spi/spi_a.h); + * subsequent calls are no-ops. Call this after init_spi_a_bus() (directly, + * or transitively via the ExG shield's init_spi()) has run at least once. + */ +int wifi_sd_shield_cs_init(void); + +/** @brief Helper function to set DRDY pin (replaces direct gpio_pin_set calls) */ +int drdy_pin_set(int value); +/** @brief Initialize and Enable Data Ready GPIO for ESP -> NRF communication */ +int esp_drydy_gpio_init(void); + + +/** @brief SPI master transaction functions (nrfx-based) */ +int spi_nrf_master_esp_slave_transceive(const uint8_t *tx_buf, uint8_t *rx_buf, size_t len); +int spi_nrf_master_esp_slave_write(const uint8_t *tx_buf, size_t len); +int spi_nrf_master_esp_slave_read(uint8_t *rx_buf, size_t len); + + + +#endif // WIFI_SD_SHIELD_INITS_H \ No newline at end of file diff --git a/Firmware/src_NRF/wifi_sd_shield/wifi_sd_spi_functions.c b/Firmware/src_NRF/wifi_sd_shield/wifi_sd_spi_functions.c new file mode 100644 index 0000000..c7ba499 --- /dev/null +++ b/Firmware/src_NRF/wifi_sd_shield/wifi_sd_spi_functions.c @@ -0,0 +1,194 @@ +/* + * ---------------------------------------------------------------------- + * + * File: wifi_sd_shield_spi_functions.c + * + * Last edited: 15.05.2026 + * + * Copyright (C) 2026, ETH Zurich + * + * Authors: + * - Giusy Spacone (gspacone@iis.ee.ethz.ch), ETH Zurich + * + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @file wifi_sd_shield_spi_functions.h + * @brief Wi-Fi and SD Shield SPI Functions Interface + * + * This header contains the SPI function declarations for interacting with + * the Wi-Fi and SD shields. +*/ + + +#include "wifi_sd_spi_functions.h" +#include "wifi_sd_shield_inits.h" +#include "spi/spi_a.h" +LOG_MODULE_REGISTER(wifi_sd_spi_functions, LOG_LEVEL_INF); + +/* Serialize async SPIM transfers so callers can treat the API as blocking. */ +K_SEM_DEFINE(spi_nrf_esp_transfer_done, 0, 1); + +/** + * @brief SPI_A completion handler for WiFi/SD transfers + * + * Called by the shared spi/spi_a.c interrupt dispatcher when the in-flight + * transfer's owner is SPI_A_OWNER_WIFI_SD. CS deassertion is already + * handled generically by spi_a.c (it was given &esp_cs_gpio in + * spi_a_begin_transfer()); this just wakes up the blocked caller. + */ +void wifi_sd_spim_transfer_complete(void) { + k_sem_give(&spi_nrf_esp_transfer_done); +} + +/** + * @brief SPI master transmit/receive transaction + * + * Performs a full-duplex SPI master transaction with the ESP32 slave, on + * the shared SPI_A bus (spi/spi_a.h). Holds spi_a_mutex for the whole + * transfer (kickoff through completion) since this call already blocks on + * a completion semaphore -- unlike the ADS driver, there's no separate + * caller-side wait to fold this into. + * + * @param tx_buf Transmit buffer (NULL for dummy TX) + * @param rx_buf Receive buffer (NULL to discard RX) + * @param len Number of bytes to transfer + * @return 0 on success, negative error code on failure + */ +int spi_master_transceive(const uint8_t *tx_buf, uint8_t *rx_buf, size_t len) +{ + if (len == 0) { + return -EINVAL; + } + + k_mutex_lock(&spi_a_mutex, K_FOREVER); + + /* Drain any stale completion before starting a new async transfer. */ + while (k_sem_take(&spi_nrf_esp_transfer_done, K_NO_WAIT) == 0) { + } + + /* Configure SPI transaction buffers */ + nrfx_spim_xfer_desc_t xfer = { + .p_tx_buffer = (uint8_t *)tx_buf, + .tx_length = tx_buf ? len : 0, + .p_rx_buffer = rx_buf, + .rx_length = rx_buf ? len : 0, + }; + + /* Execute transfer (blocking) */ + spi_a_begin_transfer(SPI_A_OWNER_WIFI_SD, &esp_cs_gpio); + nrfx_err_t status = nrfx_spim_xfer(&spi_a_inst, &xfer, 0); + if(!handshake_done){ + LOG_INF("SPI master transceive initiated, waiting for handshake to complete..."); + LOG_INF("SPI master transceive initiated, sent: 0x%02X 0x%02X 0x%02X 0x%02X", + tx_buf[0], tx_buf[1], tx_buf[2], tx_buf[3]); + } + if (status != NRFX_SUCCESS) { + LOG_INF("SPI master transfer failed: %d", status); + k_mutex_unlock(&spi_a_mutex); + return -EIO; + } + else{ + LOG_DBG("SPI master transfer initiated, waiting for completion..."); + } + + // Note: 1msec works for ExG packets, but not for US + // 811 bytes = 6488 bits, at 4 Mbps takes approx 1.6 msec + if(!handshake_done){ + status = k_sem_take(&spi_nrf_esp_transfer_done, K_MSEC(5000)); + } + else{ + // smaller timeout for regular packets after handshake is done + status = k_sem_take(&spi_nrf_esp_transfer_done, K_MSEC(2)); + } + if (status != 0) { + LOG_INF("SPI master transfer timed out: %d", status); + k_mutex_unlock(&spi_a_mutex); + return -ETIMEDOUT; + } + + if(!handshake_done){ + LOG_INF("SPI handshake transfer complete, received: 0x%02X 0x%02X 0x%02X 0x%02X", + rx_buf[0], rx_buf[1], rx_buf[2], rx_buf[3]); + } + + k_mutex_unlock(&spi_a_mutex); + return 0; +} + + +int biogap_to_esp_transaction(esp_packet_t *packet){ + + /* NRF53 as SPI master sends packet to ESP32 slave */ + if (packet->size == 0) { + LOG_WRN("Empty packet, nothing to send"); + return -EINVAL; + } + + /* Determine actual send length: if producer left size as max, try to find tailer marker to avoid sending garbage */ + size_t send_len = packet->size; + uint8_t spi_rx_buf[send_len]; + memset(spi_rx_buf, 0, send_len); + int ret = spi_master_transceive(packet->data, spi_rx_buf, send_len); + if(ret != 0){ + LOG_ERR("SPI transaction failed (ret=%d)", ret); + LOG_ERR("=== SPI FAILURE - NRF53 HALTED ==="); + while (1) {k_sleep(K_FOREVER);} + return ret; + } + + // check if expected received header and tailer are correct + if(spi_rx_buf[0] != ESP_SPI_HEADER || spi_rx_buf[send_len - 1] != ESP_SPI_TAILER){ + LOG_ERR("SPI transaction response has invalid header/tailer: received header 0x%02X, expected 0x%02X; received tailer 0x%02X, expected 0x%02X", + spi_rx_buf[0], ESP_SPI_HEADER, spi_rx_buf[send_len - 1], ESP_SPI_TAILER); + LOG_ERR("=== SPI FAILURE - NRF53 HALTED ==="); + while (1) {k_sleep(K_FOREVER);} + return -EIO; + } + + //check if the received data contain an implicit stop command from ESP + if(spi_rx_buf[2] == ESP_STOP_COMMAND){ + LOG_INF("Received ESP STOP command, resetting NRF-ESP communication state and waiting for stop sensor command"); + // reset state to idle to block sending data to ESP + nrf_esp_comm_state = NRF_ESP_IDLE; + /* Save the opcode before spi_rx_buf gets reused below as the RX + * buffer for the ack transaction -- otherwise handle_connectivity_command() + * ends up dispatching whatever the ESP responded with to the ACK, + * not the original STOP request's opcode byte. */ + uint8_t stop_opcode = spi_rx_buf[3]; + + // Explicitly acknowledge STOP with a dedicated transaction whose + // header byte has NRF_STOP_ACK_MASK set. + memset(spi_rx_buf, 0, send_len); + uint8_t dummy_buff[send_len]; + memset(dummy_buff, 0, sizeof(dummy_buff)); + dummy_buff[0] = ESP_SPI_HEADER | NRF_STOP_ACK_MASK; // set the ack bit in the header + dummy_buff[send_len - 1] = ESP_SPI_TAILER; + + int ack_ret = spi_master_transceive(dummy_buff, spi_rx_buf, send_len); + if (ack_ret != 0) { + LOG_WRN("Failed to send STOP ack to ESP (ret=%d)", ack_ret); + } + + handle_connectivity_command(&stop_opcode, 1); + } + + + return 0; +} + + diff --git a/Firmware/src_NRF/wifi_sd_shield/wifi_sd_spi_functions.h b/Firmware/src_NRF/wifi_sd_shield/wifi_sd_spi_functions.h new file mode 100644 index 0000000..5450d34 --- /dev/null +++ b/Firmware/src_NRF/wifi_sd_shield/wifi_sd_spi_functions.h @@ -0,0 +1,53 @@ +/* + * ---------------------------------------------------------------------- + * + * File: wifi_sd_shield_spi_functions.h + * + * Last edited: 15.05.2026 + * + * Copyright (C) 2026, ETH Zurich + * + * Authors: + * - Giusy Spacone (gspacone@iis.ee.ethz.ch), ETH Zurich + * + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @file wifi_sd_shield_spi_functions.h + * @brief Wi-Fi and SD Shield SPI Functions Interface + * + * This header contains the SPI function declarations for interacting with + * the Wi-Fi and SD shields. +*/ + +#ifndef WIFI_SD_SHIELD_SPI_FUNCTIONS_H +#define WIFI_SD_SHIELD_SPI_FUNCTIONS_H + +#include "wifi_sd_shield_defs.h" +#include "nrfx_spim.h" + + +/** @brief SPI master transmit/receive transaction */ +int spi_master_transceive(const uint8_t *tx_buf, uint8_t *rx_buf, size_t len); + +/** @brief BIOGAP to ESP transaction */ +int biogap_to_esp_transaction(esp_packet_t *packet); + +/** @brief SPI_A completion handler for WiFi/SD transfers (see spi/spi_a.h) */ +void wifi_sd_spim_transfer_complete(void); + +#endif /* WIFI_SD_SHIELD_SPI_FUNCTIONS_H */ \ No newline at end of file diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/.devcontainer/Dockerfile b/WiFi_SD_Shield_V1/Firmware/espc6/.devcontainer/Dockerfile new file mode 100644 index 0000000..dafb8ad --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/.devcontainer/Dockerfile @@ -0,0 +1,13 @@ +ARG DOCKER_TAG=latest +FROM espressif/idf:${DOCKER_TAG} + +ENV LC_ALL=C.UTF-8 +ENV LANG=C.UTF-8 + +RUN apt-get update -y && apt-get install udev -y + +RUN echo "source /opt/esp/idf/export.sh > /dev/null 2>&1" >> ~/.bashrc + +ENTRYPOINT [ "/opt/esp/entrypoint.sh" ] + +CMD ["/bin/bash", "-c"] \ No newline at end of file diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/.devcontainer/devcontainer.json b/WiFi_SD_Shield_V1/Firmware/espc6/.devcontainer/devcontainer.json new file mode 100644 index 0000000..b801786 --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/.devcontainer/devcontainer.json @@ -0,0 +1,21 @@ +{ + "name": "ESP-IDF QEMU", + "build": { + "dockerfile": "Dockerfile" + }, + "customizations": { + "vscode": { + "settings": { + "terminal.integrated.defaultProfile.linux": "bash", + "idf.espIdfPath": "/opt/esp/idf", + "idf.toolsPath": "/opt/esp", + "idf.gitPath": "/usr/bin/git" + }, + "extensions": [ + "espressif.esp-idf-extension", + "espressif.esp-idf-web" + ] + } + }, + "runArgs": ["--privileged"] +} \ No newline at end of file diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/.gitignore b/WiFi_SD_Shield_V1/Firmware/espc6/.gitignore new file mode 100644 index 0000000..a222515 --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/.gitignore @@ -0,0 +1,8 @@ +// Ignore build directories and temporary files +build/ + +// Ignore any claude files +*.claude + +// Ignore .vscode directory +.vscode/ \ No newline at end of file diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/CMakeLists.txt b/WiFi_SD_Shield_V1/Firmware/espc6/CMakeLists.txt new file mode 100644 index 0000000..c5a152f --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/CMakeLists.txt @@ -0,0 +1,6 @@ +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(wifi_sd_shield_v0_ap) diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/README.md b/WiFi_SD_Shield_V1/Firmware/espc6/README.md new file mode 100644 index 0000000..4ccf87e --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/README.md @@ -0,0 +1,313 @@ +# WiFi/SD Shield Firmware (ESP32-C6) + +ESP-IDF firmware for the BIOGAP Ultra WiFi/SD shield (ESP32-C6-MINI-1-H8). The ESP32 +bridges the nRF5340 BIOGAP master to a laptop running BioGUI over WiFi: it terminates a +TCP connection from BioGUI, forwards START/STOP commands to the nRF over a shared SPI +link, and relays sensor data packets back to BioGUI. The nRF5340 is always the SPI +master; the ESP32 is always the SPI slave. + +## Build / flash + +Standard ESP-IDF project, target `esp32c6`. + +``` +idf.py set-target esp32c6 # first time only +idf.py build +idf.py -p flash monitor +``` + +Project name: `wifi_sd_shield_v0_ap` (see [CMakeLists.txt](CMakeLists.txt)). + +## Component layout + +``` +main/ app_main(): boot sequence, task creation +components/common/ shared config, pin definitions, SPI/GPIO bring-up +components/biogap/ nRF <-> ESP32 SPI link (handshake, read, send, dummy-sensor test path) +components/wifi_ap/ WiFi SoftAP + TCP server + GUI command/data tasks +``` + +(SD-card writer, LED-strip status, and the vendored Arduino-as-component dependency it +needed have all been removed from the project — see Config flags for the now-vestigial +`ESP_ENABLE_SD_WRITE` flag.) + +## State machine + +```mermaid +stateDiagram-v2 + [*] --> STATE_DISCONNECTED + + STATE_DISCONNECTED --> STATE_IDLE: SPI handshake OK (B_BIOGAP_CONECTED)\n+ GUI TCP accepted (B_GUI_SOCKET_BIND) + + STATE_IDLE --> STATE_STREAMING: START opcode from GUI\nDRDY pulse + 4B control frame\nB_START_CMD_FWD_TO_BIOGAP set + + STATE_STREAMING --> STATE_STREAMING: NRF data transaction (211B,\npre-queued x4) -> ringbuffer -> tx_to_gui() + + STATE_STREAMING --> STATE_IDLE: STOP opcode from GUI, or\nring buffer full (forced STOP)\n(enter_stop_quiesce_state) + + note right of STATE_STREAMING + enter_stop_quiesce_state() (biogap_read.c): + 1. stomp all pre-queued TX buffers with a + piggybacked STOP frame (opcode in byte[3]) + 2. poll completed transactions for the NRF's + explicit ACK (header | NRF_STOP_ACK_MASK) + 3. reset_spi_bus_for_restart(): free DMA + buffers, reinit SPI slave bus + 4. prepare_for_restart(): flush ring buffer, + clear STOP/START event bits + end note + + note right of STATE_IDLE + Next START (send_to_biogap_task...): + 1. propagate_first_start_command_to_biogap_master() + - DRDY pulse + 4B control frame first + 2. only once that succeeds: + allocate_prequeue_resources() for the + 211B DMA buffers, then the read task's + own prequeue_transactions() queues them + end note +``` + +### STOP handshake detail (ESP <-> nRF) + +```mermaid +sequenceDiagram + participant GUI as BioGUI + participant ESP as ESP32 (SPI slave) + participant NRF as nRF5340 (SPI master) + + GUI->>ESP: STOP opcode (TCP) + ESP->>ESP: enter_stop_quiesce_state():
stomp sendbuf_persistent + all tx_bufs[i]
with [ESP_EXG_HEADER, _, ESP_STOP_COMMAND, opcode, ESP_EXG_TAILER] + NRF->>NRF: sends its next regular 211B data transaction
(unaware STOP was requested yet) + ESP-->>NRF: responds with the stomped buffer (piggybacked STOP) + NRF->>NRF: biogap_to_esp_transaction(): sees ESP_STOP_COMMAND,
sets nrf_esp_comm_state = NRF_ESP_IDLE,
saves opcode, dispatches handle_connectivity_command() + NRF->>ESP: dedicated ACK transceive:
header = ESP_SPI_HEADER | NRF_STOP_ACK_MASK + ESP->>ESP: confirm loop sees the ACK bit in rx_buffer[0]
(data NRF actually sent, not ESP's own tx buffer)
-> stop_ack_received = true + ESP->>ESP: reset_spi_bus_for_restart() + prepare_for_restart() + ESP-->>GUI: (implicitly) ready for next START +``` + +The ACK step exists because inspecting the ESP's own previously-stomped `tx_buffer` +after the transaction completes can't distinguish a genuine delivery from a torn write +(if the stomp raced an in-flight DMA transfer) -- checking `rx_buffer` is checking data +that unambiguously came from the NRF. + +## Code workflow + +### 1. Boot (`main/main.c`) + +1. Configure a debug GPIO (`RTC_SCL`), set logging level. +2. Create the global event group `g_evt` (see Event bits below) and the SPI bus mutex. +3. `config_spi_nrf_master_esp_slave_pins()` — configure all NRF<->ESP GPIOs (data pins, + DRDY, direction-control pins, see Pin reference below). +4. `init_nrf_spi_master_esp_slave_bus()` — bring up the SPI slave peripheral + (`SPI2_HOST`, mode 1, DMA). +5. Block in a retry loop on `initial_handshake_nrf_master_esp_slave_pq()` until the nRF + master completes the 4-byte handshake (see Handshake below). Sets `B_BIOGAP_CONECTED`. +6. `wifi_init_softap()` — bring up WiFi SoftAP (`bioserver` / see `EXAMPLE_ESP_WIFI_PASS` + in `softap_main.h`), sets `B_WIFI_CONNECTED`. +7. Create the BIOGAP ring buffer (`biogap_ringbuf`, `RINGBUFF_SIZE` bytes). +8. `bind_to_gui()` — blocking TCP `accept()` on port `PORT_LAPTOP` (4444). Sets + `B_GUI_SOCKET_BIND`; `node_state = STATE_IDLE`. +9. Spawn the four data-plane tasks (or three + the local generator, depending on + `ESP_LOCAL_DUMMY_SENSOR`, see Config flags): + - `read_from_biogap_task_nrf_master_esp_slave_prequeue` — SPI slave RX, nRF -> ESP. + - `send_to_biogap_task_nrf_master_esp_slave` — SPI slave TX / command forwarding, ESP -> nRF. + - `rx_from_gui` — TCP RX, BioGUI -> ESP (commands). + - `tx_to_gui` — TCP TX, ESP -> BioGUI (data). + +The main task then just idles forever; all real work happens in the tasks above. + +### 2. Handshake (`biogap_common.c`) + +`initial_handshake_nrf_master_esp_slave_pq()` arms one 4-byte SPI slave transaction of +`HANDSHAKE_MARKER` (`0x5A`) bytes and blocks until the nRF (master) clocks it out and +clocks back `HANDSHAKE_RESPONSE_MARKER` (`0xA5`) bytes. On a matching response it sets +`B_BIOGAP_CONECTED` and `handshake_pq_done = true`. Every other task that talks to the +nRF blocks on `B_BIOGAP_CONECTED` before doing anything. + +### 3. GUI -> nRF command path (START) + +1. BioGUI opens a TCP connection to `192.168.4.1:4444` (the ESP's SoftAP gateway + address) and sends a single command byte (see `connectivity_commands.h`). +2. `rx_from_gui()` receives it and calls `parse_gui_command()` (`gui_utils.c`), which + validates the opcode via `validate_command()` and, in `STATE_IDLE`, accepts only + START-type commands: sets `rx_gui_data_to_fwd[0]` and `B_START_CMD_RCV`. +3. `send_to_biogap_task_nrf_master_esp_slave()` wakes on `B_START_CMD_RCV` and calls + `propagate_first_start_command_to_biogap_master()`: pulses the DRDY GPIO + (`data_ready_pulse()`, 100 us high pulse via `NRF_ESP_DATA_READY`) to tell the nRF "I + have something for you", then blocks in `send_first_start_command_to_biogap_master()` + on `spi_slave_transmit()` of a 4-byte control frame (`ESP_SPI_HEADER 0x66, , + 0x00, ESP_SPI_TAILER 0xBB`) until the nRF's DRDY interrupt fires and it initiates the + matching master transaction. This is the *same* mechanism and control-frame format + for every START (first session or a later one after a STOP) — no special-casing. +4. Only once that control frame is confirmed delivered does it call + `allocate_prequeue_resources()`, allocating the 211-byte DMA buffers for the + upcoming streaming session (deliberately deferred until after the 4-byte transaction + succeeds, not before). On success: `B_START_CMD_FWD_TO_BIOGAP` set, + `node_state = STATE_STREAMING`. +5. `read_from_biogap_task_nrf_master_esp_slave_prequeue()`, unblocked by + `B_START_CMD_FWD_TO_BIOGAP`, sees `!prequeued` and calls `prequeue_transactions()` to + actually queue the `QUEUE_COUNT` (4) DMA descriptors onto the now-allocated buffers. + +### 4. nRF -> GUI data path (streaming) + +- `read_from_biogap_task_nrf_master_esp_slave_prequeue()` (`biogap_read.c`) keeps + `QUEUE_COUNT` (4) DMA-capable SPI slave transactions pre-queued at all times so the + slave is never "unarmed" between nRF-initiated transactions (see the pre-queue + pattern doc comment at the top of that file, and `notes.md` for the throughput + numbers that motivated it). Each completed transaction is validated + (`NRF_EXG_HEADER 0x55` / `NRF_EXG_TAILER 0xAA`, `NRF_EXG_PACKET_SIZE` = 211 bytes), + pushed into `biogap_ringbuf` via `add_to_ringbuffer()`, and its descriptor is + immediately re-queued. +- `tx_to_gui()` (`gui_task.c`) drains `biogap_ringbuf` and `send()`s each item straight + to `gui_sock` whenever `node_state == STATE_STREAMING`. + +### 5. STOP path + +The ESP (slave) cannot push data to the nRF (master) unilaterally, so the STOP +*request* is delivered by piggybacking on the next regular data-transaction response; +the nRF then sends an explicit dedicated *acknowledgment* transaction back, so the ESP +has a real confirmation instead of just trusting its own previously-written buffer. See +the sequence diagram above for the full picture. In code: + +1. GUI sends a STOP-type opcode while `node_state == STATE_STREAMING`; + `parse_gui_command()` sets `B_STOP_CMD_RPT_PENDING`. +2. `rx_from_gui()` promotes this to `B_STOP_CMD_RCV_GUI` (or, on a ring-buffer overflow, + the read task itself sets `B_STOP_CMD_RCV_FORCED` directly). It does **not** call + any restart/cleanup function itself — `enter_stop_quiesce_state()` (below) is the + sole owner of that sequence, to avoid two tasks racing through + free/reinit/allocate on the same SPI bus. +3. `read_from_biogap_task_nrf_master_esp_slave_prequeue()` sees `B_STOP_CMD_RCV_GUI` / + `B_STOP_CMD_RCV_FORCED` and calls `enter_stop_quiesce_state()`: + - Stomps `sendbuf_persistent` and every pre-queued `tx_bufs[i]` with a STOP frame + (`ESP_EXG_HEADER, _, ESP_STOP_COMMAND, ` at `PACKET_SZ` bytes with + `ESP_EXG_TAILER`). + - Polls completed transactions (`spi_slave_get_trans_result()`) checking + `rx_buffer[0]` (what the NRF actually transmitted) for `NRF_STOP_ACK_MASK` set on + top of `ESP_SPI_HEADER` — the NRF's explicit "I got your STOP and processed it" + signal (see `biogap_to_esp_transaction()`, NRF side, below). + - Once acknowledged (or on timeout — see Known issues), sets `B_SPI_QUIESCED`, + `node_state = STATE_IDLE`, `prequeued = false`, then calls + `reset_spi_bus_for_restart()` (frees the DMA buffers, tears down and + reinitializes the SPI slave bus — safe now that the NRF is confirmed idle) and + `prepare_for_restart()` (soft-flushes `biogap_ringbuf`, clears the STOP/START + event bits) directly, itself. +4. On the NRF side, `biogap_to_esp_transaction()` (`wifi_sd_spi_functions.c`) detects + `ESP_STOP_COMMAND` in the ESP's piggybacked response, sets + `nrf_esp_comm_state = NRF_ESP_IDLE`, saves the opcode byte, sends the dedicated ACK + transceive (header `ESP_SPI_HEADER | NRF_STOP_ACK_MASK`), and only then dispatches + `handle_connectivity_command()` with the saved opcode (e.g. `STOP_DUMMY_STREAMING` + -> `dummy_sensor_stop_streaming()`). + +### State machine (`common.h`) + +`node_state_t`: `STATE_DISCONNECTED` -> `STATE_IDLE` (handshake + GUI socket bound) -> +`STATE_STREAMING` (START forwarded) -> back to `STATE_IDLE` on STOP. See the diagrams +above for the full annotated flow. + +### Event bits (`g_evt`, see `common.h` for the full list) + +Key bits: `B_BIOGAP_CONECTED`, `B_WIFI_CONNECTED`, `B_GUI_SOCKET_BIND`, +`B_START_CMD_RCV`, `B_START_CMD_FWD_TO_BIOGAP`, `B_STOP_CMD_RCV_GUI`, +`B_STOP_CMD_RCV_FORCED`, `B_STOP_CMD_FWD_TO_BIOGAP`, `B_SPI_QUIESCED`, +`B_STOP_CMD_RPT_PENDING`, `B_RINGBUFFER_FULL`, `B_WRITING_TO_SD`. + +### Framing reference + +| Frame type | Header | Tailer | Size | Notes | +|---|---|---|---|---| +| ESP -> nRF control (commands) | `0x66` (`ESP_SPI_HEADER`) | `0xBB` (`ESP_SPI_TAILER`) | 4 bytes | opcode at byte[1] (START) | +| nRF -> ESP data | `0x55` (`NRF_EXG_HEADER`) | `0xAA` (`NRF_EXG_TAILER`) | 211 bytes (`NRF_EXG_PACKET_SIZE`) | real ExG and dummy-sensor packets share this format | +| ESP -> nRF piggybacked STOP request | `0x66` (`ESP_EXG_HEADER`) | `0xBB` (`ESP_EXG_TAILER`) | 211 bytes (`PACKET_SZ`) | `ESP_STOP_COMMAND` (245) at byte[2], real opcode at byte[3] — overwrites a regular streaming response buffer rather than a dedicated transfer | +| nRF -> ESP STOP acknowledgment | `ESP_SPI_HEADER \| NRF_STOP_ACK_MASK` (`0x66 \| 0x80`) | `0xBB` (`ESP_SPI_TAILER`) | 211 bytes (`send_len`) | dedicated transceive the NRF sends after fully processing the piggybacked STOP request | +| Handshake (ESP TX) | `0x5A` x4 (`HANDSHAKE_MARKER`) | - | 4 bytes | expects `0xA5` x4 (`HANDSHAKE_RESPONSE_MARKER`) echoed back | + +Command opcodes are in `connectivity_commands.h` and must stay in sync with +`Firmware/src_NRF/core/connectivity_commands.h` on the nRF side. + +## Pin reference (`components/common/include/pin_definitions.h`) + +### NRF <-> ESP SPI (ESP is always SPI slave) + +| Signal | GPIO | Direction (ESP side) | Notes | +|---|---|---|---| +| `NRF_ESP_MOSI` | 23 | input | SPI MOSI, level-translated via IC2 (`SN74AVC4T774RSVR`) | +| `NRF_ESP_MISO` | 19 | output | SPI MISO, via IC2 | +| `NRF_ESP_SCLK` | 20 | input | SPI clock, via IC2 | +| `NRF_ESP_CS` | 21 | input | SPI chip-select, via IC2 | +| `NRF_ESP_DIR_CTRL` | 12 | output, driven **LOW** | Direction control for IC2's MOSI/MISO/CS/CLK channels. LOW = NRF is master (our only mode). An inverter (IC7, `SN74AUP1G04DBVR`) derives the complementary polarity needed for the MISO channel from this same control bit. | +| `NRF_ESP_DRDY_DIR_CTRL` | 8 | output, driven **HIGH**, fixed | Direction control for IC5's (`SN74AVC2T245RSWR`) dedicated DRDY channel. DRDY always flows ESP -> NRF regardless of SPI master role, so this is permanently HIGH (never toggled at runtime), unlike `NRF_ESP_DIR_CTRL`. | +| `NRF_ESP_DATA_READY` | 22 | output | DRDY line itself (-> nRF's `SPI_NRF_ESP_DRDY` / QSPI_IO2). Pulsed high for ~100 us (`NRF_DRDY_PULSE_US`) by `data_ready_pulse()` whenever the ESP has a command frame ready for the nRF to pick up. | + +Both `NRF_ESP_DIR_CTRL` and `NRF_ESP_DRDY_DIR_CTRL` are configured and driven once at +boot in `config_spi_nrf_master_esp_slave_pins()` (`common.c`) and never change again at +runtime — the shield's bus direction is fixed for the "nRF is SPI master" topology this +firmware implements. + +### SD card SPI (pins reserved on the shield; the SD-writer component that used them has been removed) + +| Signal | GPIO | Notes | +|---|---|---| +| `ESP_SD_MOSI` | 7 | -> SD `mSD_CMD`/CMD | +| `ESP_SD_MISO` | 2 | <- SD `mSD_DAT0`/DAT0 | +| `ESP_SD_CLK` | 6 | SD clock | +| `ESP_SD_CS` | 18 | -> SD `mSD_DAT3`/CS (SPI mode) | +| `ESP_SDCTRL` | 9 | Controls whether ESP writes directly to the SD card | + +### RTC + +| Signal | GPIO | Notes | +|---|---|---| +| `RTC_SCL` | 15 | Also reused as a general debug/status GPIO in `main.c` | +| `RTC_SDA` | 14 | | +| `RTC_ON` | 13 | Enable/disable the RTC | +| `RTC_FOUT` | 4 | | +| `RTC_CLKOUT` | 3 | | + +## Config flags (`components/common/include/shield_config.h`) + +| Flag | Default | Meaning | +|---|---|---| +| `IS_WBAN` | 0 | Multi-node WBAN accept-loop mode (not yet implemented, `main.c` has a stubbed-out call site). | +| `IS_ESP_SPI_SLAVE` | 1 | ESP is always the SPI slave, nRF the master. No other mode is currently supported end-to-end. | +| `ESP_ENABLE_SD_WRITE` | 0 | Was intended to enable an SD-card write task; the `sdcard_spi` component has since been removed from the project, so this is now vestigial — leave at 0 (setting it to 1 will fail to build until/unless SD support is reintroduced). | +| `ESP_LOCAL_DUMMY_SENSOR` | 0 | When 1, bypasses SPI/nRF entirely: the ESP generates synthetic dummy-sensor packets locally (`dummy_sensor_local.c`, byte-identical wire format to the nRF's `dummy_sensor_appl.c`) and streams them straight to BioGUI. Useful for testing the WiFi/GUI half of the system in isolation, with no nRF/SPI hardware attached. When 0 (real integration), the SPI/handshake bring-up in `main.c` runs and the real SPI read/send tasks are created instead. | + +## WiFi / TCP + +- SoftAP SSID: `bioserver` (`EXAMPLE_ESP_WIFI_SSID`, `softap_main.h`), password + `EXAMPLE_ESP_WIFI_PASS`, channel `EXAMPLE_ESP_WIFI_CHANNEL`. +- BioGUI connects as a TCP client to `192.168.4.1:4444` (`PORT_LAPTOP`), the ESP's + default SoftAP gateway address. Single connection only (`accept()` is called once; + see Known issues). +- `PORT_ESP_NODE` (3333) is reserved for the unimplemented `IS_WBAN` multi-node mode. + +## Known issues / not yet implemented + +Actively being worked on: + +- **STOP confirm loop doesn't re-queue non-matching reaps** (`enter_stop_quiesce_state()`, + `biogap_read.c`): each transaction reaped while waiting for the NRF's ACK is + permanently consumed rather than re-queued. With only `QUEUE_COUNT` (4) descriptors, + if more than 4 regular transactions complete before the ACK arrives — increasingly + likely at high sample rates (e.g. ~1ms sensor period, ~250x the original ~400ms + cadence) — the SPI slave queue can run dry before the ACK is ever seen, and the + NRF's next transaction then reads back `0xFF/0xFF` and halts. +- **`tx_to_gui()` leaks ring-buffer space on `send()` failure** (`gui_task.c`): on a + failed `send()` to the GUI socket, the already-dequeued `xRingbufferReceive()` item is + never returned via `vRingbufferReturnItem()` (the code comments assume it "stays in + the ring buffer," but it's already been dequeued). Repeated send failures (WiFi + congestion, GUI not draining fast enough) leak ring-buffer space until + `add_to_ringbuffer()` starts failing, which forces a STOP (`B_STOP_CMD_RCV_FORCED`) + and can cascade into the issue above. + +Other known limitations: + +- `bind_to_gui()` creates a brand-new listening socket for every session rather than + binding/listening once at boot; there's a short window between the old connection + closing and the new `listen()` call where a client's connection attempt gets + "Connection refused." BioGUI's own retry button covers this today. +- The malformed/misframed-packet path in `biogap_read.c`'s main streaming loop calls + `break` (kills the read task) rather than logging and continuing — a single corrupted + SPI transaction can currently take down streaming. diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/components/biogap/CMakeLists.txt b/WiFi_SD_Shield_V1/Firmware/espc6/components/biogap/CMakeLists.txt new file mode 100644 index 0000000..2d561b6 --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/components/biogap/CMakeLists.txt @@ -0,0 +1,9 @@ + +file(GLOB_RECURSE COMMON_SOURCES + "source/*.c" +) +idf_component_register( + SRCS ${COMMON_SOURCES} + INCLUDE_DIRS "include" + REQUIRES esp_wifi esp_event nvs_flash freertos esp_timer common esp_driver_spi esp_mm wifi_ap +) diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/components/biogap/include/biogap.h b/WiFi_SD_Shield_V1/Firmware/espc6/components/biogap/include/biogap.h new file mode 100644 index 0000000..9fa08c0 --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/components/biogap/include/biogap.h @@ -0,0 +1,82 @@ +/* + * ---------------------------------------------------------------------- + * + * File: biogap.h + * + * Last edited: 17.07.2026 + * + * Copyright (c) 2026 ETH Zurich and University of Bologna + * + * Authors: + * - Giusy Spacone (gspacone@iis.ee.ethz.ch), ETH Zurich + * + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "nvs_flash.h" +#include "esp_timer.h" +#include "freertos/queue.h" +#include "freertos/ringbuf.h" + +#include "driver/gpio.h" // will be used for the interrupt pin +#include "driver/gptimer.h" // use for now to fake GPIO interrupt +#include "esp_intr_alloc.h" +#include "driver/spi_master.h" +#include "common.h" +#include "gui_task.h" +#include "connectivity_commands.h" + +/*Ringbuffer to store incoming data from BIOGAP*/ +extern RingbufHandle_t biogap_ringbuf; + + +/*Timer*/ +void timer_init(); + +/* Tasks to Read From Sensor*/ +void read_from_biogap_task_nrf_master_esp_slave(void *pv); +void send_to_biogap_task_nrf_master_esp_slave(void *pv); +extern TaskHandle_t read_from_biogap_task_nrf_master_pq_esp_slave_handle; +extern TaskHandle_t send_to_biogap_task_nrf_master_esp_slave_handle; +void read_from_biogap_task_nrf_master_esp_slave_prequeue(void *pv); + + +/* Handshake and Initialization Functions */ +int initial_handshake_nrf_master_esp_slave_pq(); +esp_err_t propagate_start_command_to_biogap_master(); + + +size_t prepare_buffer(uint8_t *buffer, uint32_t counter, uint16_t bytes_per_node); + +esp_err_t allocate_prequeue_resources(void); +esp_err_t free_prequeue_resources(void); + + +/** @brief Copy len bytes into biogap_ringbuf for tx_to_gui() to drain and send to BioGUI */ +esp_err_t add_to_ringbuffer(const uint8_t *data, size_t len); +#define ESP_SPI_HEADER 0x66 // Header byte for every ESP <--> NRF transaction, to verify correct data parsing +#define ESP_SPI_TAILER 0xBB // Tailer byte for every ESP <--> NRF transaction, to verify correct data parsing +#define NRF_STOP_ACK_MASK 0x80 // Bit mask for STOP ACK in the NRF's response header byte +/* Pre-queue configuration: keep this many transactions armed at all times */ +#define QUEUE_COUNT 4 + +/* Persistent TX buffer shared with pre-queued SPI descriptors (allocated in reader) */ +extern uint8_t *sendbuf_persistent; +extern uint8_t *rx_bufs[QUEUE_COUNT]; /* RX buffers for each pre-queued desc */ +extern uint8_t *tx_bufs[QUEUE_COUNT]; /* TX buffers for each pre-queued desc */ \ No newline at end of file diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/components/biogap/include/dummy_sensor_local.h b/WiFi_SD_Shield_V1/Firmware/espc6/components/biogap/include/dummy_sensor_local.h new file mode 100644 index 0000000..ada5802 --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/components/biogap/include/dummy_sensor_local.h @@ -0,0 +1,80 @@ +/* + * ---------------------------------------------------------------------- + * + * File: dummy_sensor_local.h + * + * Last edited: 17.07.2026 + * + * Copyright (c) 2026 ETH Zurich and University of Bologna + * + * Authors: + * - Giusy Spacone (gspacone@iis.ee.ethz.ch), ETH Zurich + * + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef DUMMY_SENSOR_LOCAL_H +#define DUMMY_SENSOR_LOCAL_H + +#define EMULATE_EXG_DATA 1 +#define EMULATE_US_DATA 0 +#if (EMULATE_EXG_DATA == 1) + #define NRF_EXG_PACKET_SIZE 211 + #define NRF_EXG_HEADER 0x55 + #define NRF_EXG_TAILER 0xAA + #define ESP_EXG_HEADER 0x66 + #define ESP_EXG_TAILER 0xBB +#endif +#if (EMULATE_US_DATA == 1) + #define NRF_EXG_PACKET_SIZE 811 + #define NRF_EXG_HEADER 0x55 + #define NRF_EXG_TAILER 0xAA + #define ESP_EXG_HEADER 0x66 + #define ESP_EXG_TAILER 0xBB +#endif + +#include "esp_err.h" + +/** + * @brief Task that generates synthetic dummy-sensor packets locally on the ESP32, + * bypassing SPI/BIOGAP entirely. + * + * Waits for B_START_CMD_RCV (already set by parse_gui_command() on receiving + * START_DUMMY_STREAMING), then periodically builds packets - byte-identical in + * format to Firmware/src_NRF/sensors/dummy_sensor/dummy_sensor_appl.c on the nRF - + * and pushes them into biogap_ringbuf via add_to_ringbuffer(), the same helper the + * real SPI-read path uses, so tx_to_gui() needs no changes to relay them to BioGUI. + * + * On B_STOP_CMD_RCV_GUI it stops generating, sets node_state back to STATE_IDLE, + * and signals B_STOP_CMD_FWD_TO_BIOGAP - the same handshake contract the real + * send_to_biogap_task_nrf_master_esp_slave uses - so prepare_for_restart_local_dummy() + * can wait on it exactly like prepare_for_restart() does for the real path. + * + * Only meaningful when ESP_LOCAL_DUMMY_SENSOR is set (shield_config.h). + */ +void dummy_sensor_local_task(void *pv); + +/** + * @brief Local-dummy-mode counterpart of prepare_for_restart(). + * + * Waits for B_STOP_CMD_FWD_TO_BIOGAP (set by dummy_sensor_local_task once it has + * stopped), soft-flushes biogap_ringbuf, and clears the STOP-related event bits - + * everything prepare_for_restart() does except the SPI slave / pre-queue + * re-initialization, which does not apply when there is no real SPI link. + */ +esp_err_t prepare_for_restart_local_dummy(void); + +#endif // DUMMY_SENSOR_LOCAL_H diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/components/biogap/source/biogap_common.c b/WiFi_SD_Shield_V1/Firmware/espc6/components/biogap/source/biogap_common.c new file mode 100644 index 0000000..a49d0e8 --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/components/biogap/source/biogap_common.c @@ -0,0 +1,100 @@ +/* + * ---------------------------------------------------------------------- + * + * File: biogap_common.c + * + * Last edited: 17.07.2026 + * + * Copyright (c) 2026 ETH Zurich and University of Bologna + * + * Authors: + * - Giusy Spacone (gspacone@iis.ee.ethz.ch), ETH Zurich + * + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "biogap.h" + +static const char *TAG = "biogap_common.c"; + +/* DMA-capable handshake buffers */ +static uint8_t handshake_pq_tx_buffer[4] __attribute__((aligned(4))); +static uint8_t handshake_pq_rx_buffer[4] __attribute__((aligned(4))); +static uint8_t expected_pq_handshake_buffer[4] __attribute__((aligned(4))); + +// ============================================================================= +// HELPER: Initial handshake +// ============================================================================= + +/** @brief Block until the NRF master completes the 4-byte SPI handshake. */ +int initial_handshake_nrf_master_esp_slave_pq(void) +{ + ESP_LOGW(TAG, ">>> HANDSHAKE: Waiting for NRF master to pull CS and clock 4 bytes (marker=0x%02X)", HANDSHAKE_MARKER); + + handshake_pq_tx_buffer[0] = HANDSHAKE_MARKER; + handshake_pq_tx_buffer[1] = HANDSHAKE_MARKER; + handshake_pq_tx_buffer[2] = HANDSHAKE_MARKER; + handshake_pq_tx_buffer[3] = HANDSHAKE_MARKER; + handshake_pq_rx_buffer[0] = 0x00; + handshake_pq_rx_buffer[1] = 0x00; + handshake_pq_rx_buffer[2] = 0x00; + handshake_pq_rx_buffer[3] = 0x00; + expected_pq_handshake_buffer[0] = HANDSHAKE_RESPONSE_MARKER; + expected_pq_handshake_buffer[1] = HANDSHAKE_RESPONSE_MARKER; + expected_pq_handshake_buffer[2] = HANDSHAKE_RESPONSE_MARKER; + expected_pq_handshake_buffer[3] = HANDSHAKE_RESPONSE_MARKER; + + spi_slave_transaction_t t = {0}; + t.length = 32; /* 4 bytes = 32 bits */ + t.tx_buffer = handshake_pq_tx_buffer; + t.rx_buffer = handshake_pq_rx_buffer; + + ESP_LOGW(TAG, ">>> TX buffer addr=%p, contents=[0x%02X 0x%02X 0x%02X 0x%02X]", + handshake_pq_tx_buffer, handshake_pq_tx_buffer[0], handshake_pq_tx_buffer[1], + handshake_pq_tx_buffer[2], handshake_pq_tx_buffer[3]); + ESP_LOGW(TAG, ">>> RX buffer addr=%p", handshake_pq_rx_buffer); + ESP_LOGW(TAG, ">>> Calling spi_slave_transmit() - will block until CS pulled low"); + + if (!SPI_BUS_LOCK(portMAX_DELAY)) { + ESP_LOGE(TAG, "Failed to lock SPI bus mutex for handshake"); + return -1; + } + + esp_err_t ret = spi_slave_transmit(SPI_HOST_DEVICE, &t, portMAX_DELAY); + SPI_BUS_UNLOCK(); + ESP_LOGW(TAG, ">>> HANDSHAKE: spi_slave_transmit returned: %s", esp_err_to_name(ret)); + + if (ret == ESP_OK) { + ESP_LOGI(TAG, "SPI xact OK: sent [0x%02X 0x%02X 0x%02X 0x%02X], received [0x%02X 0x%02X 0x%02X 0x%02X]", + handshake_pq_tx_buffer[0], handshake_pq_tx_buffer[1], handshake_pq_tx_buffer[2], handshake_pq_tx_buffer[3], + handshake_pq_rx_buffer[0], handshake_pq_rx_buffer[1], handshake_pq_rx_buffer[2], handshake_pq_rx_buffer[3]); + } else { + ESP_LOGE(TAG, "SPI xact failed: %s", esp_err_to_name(ret)); + return -1; + } + + /* Validate handshake response */ + if (memcmp(handshake_pq_rx_buffer, expected_pq_handshake_buffer, 4) == 0) { + ESP_LOGI(TAG, "Handshake successful: received expected response"); + // Set the BIT flag to indicate that the initial handshake was successful + xEventGroupSetBits(g_evt, B_BIOGAP_CONECTED); + handshake_pq_done = true; + } else { + ESP_LOGW(TAG, "Handshake warning: received response does not match expected marker"); + return -1; + } + return 0; +} \ No newline at end of file diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/components/biogap/source/biogap_read.c b/WiFi_SD_Shield_V1/Firmware/espc6/components/biogap/source/biogap_read.c new file mode 100644 index 0000000..9bd9606 --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/components/biogap/source/biogap_read.c @@ -0,0 +1,411 @@ +/* + * ---------------------------------------------------------------------- + * + * File: biogap_read.c + * + * Last edited: 17.07.2026 + * + * Copyright (c) 2026 ETH Zurich and University of Bologna + * + * Authors: + * - Giusy Spacone (gspacone@iis.ee.ethz.ch), ETH Zurich + * + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "biogap.h" +#include "common.h" +#include +#include +#include +#include +#include +#include "esp_log.h" +#include "esp_timer.h" +#include "esp_rom_sys.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/event_groups.h" +#include "freertos/ringbuf.h" +#include "driver/gptimer.h" +#include "driver/gpio.h" +#include "driver/spi_master.h" +#include "driver/spi_slave.h" +#include "driver/spi_common.h" +#include "esp_heap_caps.h" +#include "esp_intr_alloc.h" +#include "gui_task.h" + +#define BIOGAP_READ_TAG "biogap_read_hs" + +#define PACKET_SZ SPI_FROM_BIOGAP_MAX_SIZE + +// ============================================================================= +// GLOBALS FOR PRE-QUEUE PATTERN +// ============================================================================= +uint8_t *rx_bufs[QUEUE_COUNT] = {NULL}; /* RX buffers for each pre-queued desc */ +uint8_t *tx_bufs[QUEUE_COUNT] = {NULL}; /* TX buffers for each pre-queued desc */ +spi_slave_transaction_t trans_descs[QUEUE_COUNT]; /* Transaction descriptors */ +uint8_t *sendbuf_persistent = NULL; /* Single TX buffer for all desciptors */ +static bool prequeued = false; +bool handshake_pq_done = false; + +// ============================================================================= +// HELPER: Pre-queue all RX transactions +// ============================================================================= +/** + * @brief Pre-queue QUEUE_COUNT transactions so slave remains armed at all times. + * + * This function initializes the transaction descriptors and queues them all, + * so the slave is ready to receive the first packet immediately. + * + * @return ESP_OK on success, ESP_FAIL if any queue operation fails + */ +static esp_err_t prequeue_transactions(void) +{ + if (!SPI_BUS_LOCK(portMAX_DELAY)) { + ESP_LOGE(BIOGAP_READ_TAG, "Failed to lock SPI bus mutex while pre-queueing transactions"); + return ESP_FAIL; + } + + for (int i = 0; i < QUEUE_COUNT; i++) { + memset(&trans_descs[i], 0, sizeof(trans_descs[i])); + trans_descs[i].length = PACKET_SZ * 8; /* Convert bytes to bits */ + trans_descs[i].tx_buffer = tx_bufs[i]; + trans_descs[i].rx_buffer = rx_bufs[i]; + + memcpy(tx_bufs[i], sendbuf_persistent, PACKET_SZ); + + esp_err_t ret = spi_slave_queue_trans(SPI_HOST_DEVICE, &trans_descs[i], 0); + if (ret != ESP_OK) { + ESP_LOGE(BIOGAP_READ_TAG, "Failed to pre-queue transaction %d: %s", i, esp_err_to_name(ret)); + SPI_BUS_UNLOCK(); + return ret; + } + } + SPI_BUS_UNLOCK(); + return ESP_OK; +} + +// ============================================================================= +// HELPER: Add packet to ringbuffer +// ============================================================================= +/** @brief Copy a packet into biogap_ringbuf for tx_to_gui() to relay to BioGUI. */ +esp_err_t add_to_ringbuffer(const uint8_t *data, size_t len) +{ + void *rb_ptr = NULL; + if (xRingbufferSendAcquire(biogap_ringbuf, &rb_ptr, len, 0) != pdTRUE || rb_ptr == NULL) { + ESP_LOGE(BIOGAP_READ_TAG, "Failed to acquire ringbuffer space"); + return ESP_FAIL; + } + memcpy(rb_ptr, data, len); + xRingbufferSendComplete(biogap_ringbuf, rb_ptr); + return ESP_OK; +} + +// ============================================================================= +// HELPER: Validate packet markers +// ============================================================================= +/** @brief Check NRF_EXG_HEADER/TAILER framing on a received (RX) buffer. */ +static inline bool is_valid_packet(const uint8_t *data, const size_t packet_size) +{ + return (data[0] == NRF_EXG_HEADER && data[packet_size - 1] == NRF_EXG_TAILER); +} + +/** @brief Free the DMA-capable TX/RX pre-queue buffers. */ +esp_err_t free_prequeue_resources(void) +{ + if (sendbuf_persistent) { + free(sendbuf_persistent); + sendbuf_persistent = NULL; + ESP_LOGW(BIOGAP_READ_TAG, "Freed TX buffer"); + } + + for (int i = 0; i < QUEUE_COUNT; i++) { + if (rx_bufs[i]) { + free(rx_bufs[i]); + rx_bufs[i] = NULL; + } + } + for (int i = 0; i < QUEUE_COUNT; i++) { + if (tx_bufs[i]) { + free(tx_bufs[i]); + tx_bufs[i] = NULL; + } + } + return ESP_OK; +} + +/** @brief Allocate (or reset) the DMA-capable TX/RX pre-queue buffers. */ +esp_err_t allocate_prequeue_resources(void) +{ + if (sendbuf_persistent != NULL) { + ESP_LOGW(BIOGAP_READ_TAG, "TX buffer already allocated, reinitializing for fresh start"); + } + + if (sendbuf_persistent == NULL) { + sendbuf_persistent = heap_caps_malloc(PACKET_SZ, MALLOC_CAP_DMA); + if (!sendbuf_persistent) { + ESP_LOGE(BIOGAP_READ_TAG, "Failed to allocate sendbuf"); + return ESP_FAIL; + } + } + + memset(sendbuf_persistent, 0, PACKET_SZ); + sendbuf_persistent[0] = ESP_EXG_HEADER; + // fill everything apart from header, first and second bytes with ESP_EXG_TAILER + for(uint16_t i=4;itx_buffer; + uint8_t *rx_data = (uint8_t *)ret_trans->rx_buffer; + + ESP_LOGI(BIOGAP_READ_TAG, + "Sent: [0]=0x%02X [1]=0x%02X [2]=0x%02X [3]=0x%02X", + tx_data[0], tx_data[1], tx_data[2], tx_data[3]); + + ESP_LOGI(BIOGAP_READ_TAG, + "Received: [0]=0x%02X [1]=0x%02X [2]=0x%02X [3]=0x%02X", + rx_data[0], rx_data[1], rx_data[2], rx_data[3]); + + bool stop_ack = (rx_data[0] & NRF_STOP_ACK_MASK) != 0; + uint8_t header = rx_data[0] & ~NRF_STOP_ACK_MASK; + + if ((header == ESP_SPI_HEADER) && stop_ack) { + ESP_LOGI(BIOGAP_READ_TAG, "STOP ACK received"); + stop_ack_received = true; + send_stop_command_count = 0; + } + else { + send_stop_command_count++; + } + } + } + + ESP_LOGI(BIOGAP_READ_TAG, "STOP command delivery confirmed after %d attempts", send_stop_command_count); + node_state = STATE_IDLE; + prequeued = false; + xEventGroupSetBits(g_evt, B_STOP_CMD_FWD_TO_BIOGAP); + reset_spi_bus_for_restart(); + prepare_for_restart(); + return ESP_OK; +} + +// ============================================================================= +// MAIN TASK: High-speed SPI slave with pre-queue pattern +// ============================================================================= +/** + * @brief Main SPI slave task using pre-queue pattern for high-speed streaming. + */ +void read_from_biogap_task_nrf_master_esp_slave_prequeue(void *pv) +{ + + uint64_t packet_count = 0; + uint16_t tx_counter = 0; /* Transmit counter sent to master */ + esp_err_t ret; + ret = allocate_prequeue_resources(); + read_from_biogap_task_nrf_master_pq_esp_slave_handle = xTaskGetCurrentTaskHandle(); + bool first_read = true; + /* === MAIN LOOP === */ + while (1) { + /* === HANDSHAKE PHASE === */ + /* Handshake is executed at startup in main; block here until the connected bit is set */ + xEventGroupWaitBits(g_evt, B_BIOGAP_CONECTED, pdFALSE, pdFALSE, portMAX_DELAY); + /* Wait until a start command has been forwarded to BIOGAP (sleep until bit set) */ + xEventGroupWaitBits(g_evt, B_START_CMD_FWD_TO_BIOGAP, pdFALSE, pdFALSE, portMAX_DELAY); + + if(!prequeued){ + ret = prequeue_transactions(); + if (ret != ESP_OK) { + ESP_LOGE(BIOGAP_READ_TAG, "Failed to pre-queue transactions, cannot start streaming"); + vTaskDelay(pdMS_TO_TICKS(1000)); + continue; + } + prequeued = true; + } + + /* === STREAMING PHASE (main high-speed loop) === */ + if (current_spi_mode != SPI_MODE_NRF) { + ESP_LOGW(BIOGAP_READ_TAG, "Not in NRF SPI mode, skipping"); + vTaskDelay(pdMS_TO_TICKS(100)); + continue; + } + + /* First, check if STOP command has arrived from either the GUI or the overflow/backpressure path. */ + if (xEventGroupGetBits(g_evt) & (B_STOP_CMD_RCV_GUI | B_STOP_CMD_RCV_FORCED)) { + + if(node_state != STATE_IDLE){ + ret = enter_stop_quiesce_state(); + xEventGroupClearBits(g_evt, B_START_CMD_FWD_TO_BIOGAP); + ESP_LOGI(BIOGAP_READ_TAG, "STOP command processed, returning to idle state"); + first_read = true; + continue; + } + continue; // jump to the top of the loop + } + else{ + + if (node_state == STATE_STREAMING){ + spi_slave_transaction_t *ret_trans = NULL; + if (!SPI_BUS_LOCK(portMAX_DELAY)) { + ESP_LOGE(BIOGAP_READ_TAG, "Failed to lock SPI bus mutex for transaction receive"); + break; + } + ret = spi_slave_get_trans_result(SPI_HOST_DEVICE, &ret_trans, pdMS_TO_TICKS(50)); + SPI_BUS_UNLOCK(); + if (ret == ESP_ERR_TIMEOUT) { + continue; + } + if (ret != ESP_OK) { + ESP_LOGE(BIOGAP_READ_TAG, "Failed to get SPI result: %s", esp_err_to_name(ret)); + break; + } + + size_t rx_bytes = (size_t)(ret_trans->trans_len / 8); + if(rx_bytes < 4){ + continue; // ignore empty packets + } + uint8_t *rx_data = (uint8_t *)ret_trans->rx_buffer; + uint8_t *tx_data = (uint8_t *)ret_trans->tx_buffer; + + /* Validate packet markers (header + tailer) on what the NRF actually + * sent. This is the only meaningful integrity check available: the + * ESP's own echoed tx buffer has ESP_EXG_TAILER pre-filled at every + * position from byte[3] onward (allocate_prequeue_resources()) so + * that whatever send_len the NRF uses, its own header/tailer check + * in biogap_to_esp_transaction() passes -- which also means a tx-side + * check here would trivially pass regardless of transfer integrity. */ + if (!is_valid_packet(rx_data, rx_bytes)) { + ESP_LOGW(BIOGAP_READ_TAG, "Invalid packet: hdr=0x%02X tail=0x%02X (expected 0x%02X/0x%02X)", + rx_data[0], rx_data[rx_bytes - 1], NRF_EXG_HEADER, NRF_EXG_TAILER); + break; + } + + /* Extract counter (little-endian at bytes[1:2]) */ + uint16_t counter = (rx_data[2] << 8) | rx_data[1]; + packet_count++; + + /* Add packet to ringbuffer */ + if(first_read == true){ + ESP_LOGI(BIOGAP_READ_TAG, "First transaction done"); + first_read = false; + } + ret = add_to_ringbuffer(rx_data, rx_bytes); + if (ret != ESP_OK) { + ESP_LOGW(BIOGAP_READ_TAG, "Failed to add packet to ringbuffer"); + xEventGroupSetBits(g_evt, B_RINGBUFFER_FULL); + // check if the stop command has not been set already to avoid setting it multiple times + if(xEventGroupGetBits(g_evt) & B_STOP_CMD_RCV_GUI){ + ESP_LOGI(BIOGAP_READ_TAG, "STOP command already received, not forwarding another STOP to BIOGAP master"); + } + else{ + ESP_LOGI(BIOGAP_READ_TAG,"Setting Stop CMD from rinfugg"); + rx_gui_data_to_fwd[0] = STOP_DUMMY_STREAMING; + xEventGroupSetBits(g_evt, B_STOP_CMD_RCV_FORCED); + } + continue; // jump to next iteration so the STOP check can run immediately + } + /* Update the descriptor's TX buffer for its next transaction */ + tx_counter++; /* Advance transmit counter */ + tx_data[0] = ESP_EXG_HEADER; + //tx_data[PACKET_SZ - 1] = ESP_EXG_TAILER; + tx_data[1] = tx_counter & 0xFF; /* LSB of counter */ + tx_data[2] = (tx_counter >> 8) & 0xFF; /* MSB of counter */ + + if (!SPI_BUS_LOCK(portMAX_DELAY)) { + ESP_LOGE(BIOGAP_READ_TAG, "Failed to lock SPI bus mutex for re-queue"); + break; + } + // make the descriptor available for the next transaction by re-queuing it immediately + ret = spi_slave_queue_trans(SPI_HOST_DEVICE, ret_trans, 0); + SPI_BUS_UNLOCK(); + if (ret != ESP_OK) { + ESP_LOGE(BIOGAP_READ_TAG, "Failed to re-queue transaction: %s", esp_err_to_name(ret)); + break; + } + } + } + } + + /* === CLEANUP === */ + ESP_LOGI(BIOGAP_READ_TAG, "Freeing pre-queued DMA buffers and exiting task"); + free_prequeue_resources(); + vTaskDelete(NULL); +} diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/components/biogap/source/biogap_send.c b/WiFi_SD_Shield_V1/Firmware/espc6/components/biogap/source/biogap_send.c new file mode 100644 index 0000000..18a8280 --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/components/biogap/source/biogap_send.c @@ -0,0 +1,196 @@ +/* + * ---------------------------------------------------------------------- + * + * File: biogap_send.c + * + * Last edited: 17.07.2026 + * + * Copyright (c) 2026 ETH Zurich and University of Bologna + * + * Authors: + * - Giusy Spacone (gspacone@iis.ee.ethz.ch), ETH Zurich + * + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "biogap.h" +#include "common.h" +#include "gui_task.h" +#include "esp_log.h" +#include "esp_timer.h" +#include "driver/spi_slave.h" + + +bool send_start_command_to_biogap_master = false; +#define BIOGAP_SEND_TAG "biogap_send" +#define NRF_DRDY_PULSE_US 100 + +uint8_t tx_to_biogap_buf[4] __attribute__((aligned(4))); +uint8_t rx_from_biogap_buf[4] __attribute__((aligned(4))); + +static TaskHandle_t send_to_biogap_task_handle = NULL; +static esp_timer_handle_t drdy_pulse_timer_handle = NULL; + +/** @brief Timer callback that ends the DRDY pulse and wakes the waiting sender task. */ +static void drdy_pulse_timer_callback(void *arg) +{ + gpio_set_level(NRF_ESP_DATA_READY, 0); + if (send_to_biogap_task_handle != NULL) { + xTaskNotifyGive(send_to_biogap_task_handle); + } +} + +/** @brief Pulse the DRDY GPIO high for NRF_DRDY_PULSE_US to signal a pending command. */ +static esp_err_t data_ready_pulse(void) +{ + esp_err_t ret; + + gpio_set_level(NRF_ESP_DATA_READY, 1); + ret = esp_timer_start_once(drdy_pulse_timer_handle, NRF_DRDY_PULSE_US); + if (ret != ESP_OK) { + ESP_LOGE(BIOGAP_SEND_TAG, "Failed to start DRDY pulse timer: %s", esp_err_to_name(ret)); + return ret; + } + + ulTaskNotifyTake(pdTRUE, portMAX_DELAY); + return ESP_OK; +} + +/** @brief Transmit a 4-byte control frame (header, opcode, 0x00, tailer) to the NRF. */ +static esp_err_t send_first_start_command_to_biogap_master(uint8_t command) +{ + esp_err_t ret; + + tx_to_biogap_buf[0] = ESP_SPI_HEADER; + tx_to_biogap_buf[1] = command; + tx_to_biogap_buf[2] = 0x00; // nothing + tx_to_biogap_buf[3] = ESP_SPI_TAILER; + rx_from_biogap_buf[0] = 0x00; + rx_from_biogap_buf[1] = 0x00; + rx_from_biogap_buf[2] = 0x00; + rx_from_biogap_buf[3] = 0x00; + + + spi_slave_transaction_t t = {0}; + t.length = sizeof(tx_to_biogap_buf) * 8; /* 4 bytes = 32 bits */ + t.tx_buffer = tx_to_biogap_buf; + t.rx_buffer = rx_from_biogap_buf; + + + if (!SPI_BUS_LOCK(portMAX_DELAY)) { + ESP_LOGE(BIOGAP_SEND_TAG, "Failed to lock SPI bus mutex for command transmit"); + return ESP_FAIL; + } + + ret = spi_slave_transmit(SPI_HOST_DEVICE, &t, portMAX_DELAY); + SPI_BUS_UNLOCK(); + if (ret != ESP_OK) { + ESP_LOGE(BIOGAP_SEND_TAG, "Failed to transmit command to BIOGAP master: %s", esp_err_to_name(ret)); + return ret; + } + + ESP_LOGI(BIOGAP_SEND_TAG, "Transmitted 4-byte control frame: [0] 0x%02X, [1] 0x%02X, [2] 0x%02X, [3] 0x%02X", + tx_to_biogap_buf[0], tx_to_biogap_buf[1], tx_to_biogap_buf[2], tx_to_biogap_buf[3]); + + return ESP_OK; +} + +/** @brief Pulse DRDY then send the 4-byte control frame; used for every START. */ +esp_err_t propagate_first_start_command_to_biogap_master(uint8_t command) +{ + esp_err_t ret = data_ready_pulse(); + if (ret != ESP_OK) { + return ret; + } + return send_first_start_command_to_biogap_master(command); +} + + +/** @brief Task: forwards GUI START commands to the NRF over SPI. */ +void send_to_biogap_task_nrf_master_esp_slave(void *pv){ + + esp_err_t ret; + send_to_biogap_task_handle = xTaskGetCurrentTaskHandle(); + bool first_time = true; + + if (drdy_pulse_timer_handle == NULL) { + esp_timer_create_args_t timer_args = { + .callback = drdy_pulse_timer_callback, + .arg = NULL, + .dispatch_method = ESP_TIMER_TASK, + .name = "drdy_pulse", + .skip_unhandled_events = true, + }; + + ret = esp_timer_create(&timer_args, &drdy_pulse_timer_handle); + if (ret != ESP_OK) { + ESP_LOGE(BIOGAP_SEND_TAG, "Failed to create DRDY pulse timer: %s", esp_err_to_name(ret)); + vTaskDelete(NULL); + return; + } + } + + /* Wait once for the NRF link to come up. After that, block on command events. */ + xEventGroupWaitBits(g_evt, B_BIOGAP_CONECTED, pdFALSE, pdFALSE, portMAX_DELAY); + + while(1){ + /* Sleep until a command or backpressure event arrives. */ + /* Wake on START, RINGBUFFER backpressure, or GUI STOP so this + * task can process STOP handoff when GUI issues it. Use + * pdFALSE (do not clear) so handlers can explicitly clear bits + * after processing. + */ + EventBits_t bits = xEventGroupWaitBits(g_evt, + B_START_CMD_RCV | B_RINGBUFFER_FULL | B_SPI_QUIESCED, + pdTRUE, + pdFALSE, + portMAX_DELAY); + + if ((bits & B_START_CMD_RCV) && !(xEventGroupGetBits(g_evt) & B_START_CMD_FWD_TO_BIOGAP)) { + + uint8_t start_command = rx_gui_data_to_fwd[0]; + ESP_LOGI(BIOGAP_SEND_TAG, "Received command from GUI, propagating to BIOGAP master start_command=%d", (unsigned)start_command); + + ret = propagate_first_start_command_to_biogap_master(start_command); + if (ret == ESP_OK) { + /* Only now -- control frame confirmed delivered -- allocate the + * DMA buffers for the upcoming streaming session. */ + esp_err_t alloc_ret = allocate_prequeue_resources(); + if (alloc_ret != ESP_OK) { + ESP_LOGE(BIOGAP_SEND_TAG, "Failed to allocate pre-queue resources after START, will retry: %s", esp_err_to_name(alloc_ret)); + vTaskDelay(pdMS_TO_TICKS(10)); + xEventGroupSetBits(g_evt, B_START_CMD_RCV); + } else { + send_start_command_to_biogap_master = true; + xEventGroupSetBits(g_evt, B_START_CMD_FWD_TO_BIOGAP); + xEventGroupClearBits(g_evt, B_STOP_CMD_FWD_TO_BIOGAP); + xEventGroupClearBits(g_evt, B_START_CMD_RCV); + node_state = STATE_STREAMING; + ESP_LOGI(BIOGAP_SEND_TAG, "Start command propagated to BIOGAP master successfully"); + } + } + else { + ESP_LOGE(BIOGAP_SEND_TAG, "Failed to propagate start command to BIOGAP master, will retry: %s", esp_err_to_name(ret)); + vTaskDelay(pdMS_TO_TICKS(10)); + xEventGroupSetBits(g_evt, B_START_CMD_RCV); + } + } + if (bits & B_RINGBUFFER_FULL) { + ESP_LOGW(BIOGAP_SEND_TAG, "Ringbuffer backpressure signaled"); + } + } + vTaskDelete(NULL); +} diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/components/biogap/source/dummy_sensor_local.c b/WiFi_SD_Shield_V1/Firmware/espc6/components/biogap/source/dummy_sensor_local.c new file mode 100644 index 0000000..bc1d412 --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/components/biogap/source/dummy_sensor_local.c @@ -0,0 +1,122 @@ +/* + * ---------------------------------------------------------------------- + * + * File: dummy_sensor_local.c + * + * Last edited: 17.07.2026 + * + * Copyright (c) 2026 ETH Zurich and University of Bologna + * + * Authors: + * - Giusy Spacone (gspacone@iis.ee.ethz.ch), ETH Zurich + * + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "dummy_sensor_local.h" +#include "biogap.h" +#include "gui_task.h" +#include "common.h" +#include "esp_timer.h" +#include "esp_log.h" + +#define DUMMY_LOCAL_TAG "[dummy_sensor_local.c]" + + +#define DUMMY_SAMPLES_PER_PACKET 4 +#define DUMMY_BYTES_PER_SAMPLE 50 +#define DUMMY_PACKET_PERIOD_MS (1 * DUMMY_SAMPLES_PER_PACKET) + +/** + * @brief Build one 211-byte dummy-sensor packet, byte-identical to + * build_full_dummy_packet()/fill_dummy_exg_sample() in dummy_sensor_appl.c. + * + * Layout: [0] 0x55 header, [1:3) counter (u16 LE), [3:7) timestamp us (u32 LE), + * [7:207) 4 samples x 50 bytes (sample[i] = (sample_index*50 + i) & 0xFF), + * [207:210) metadata (board_id, sync_pulse_count, reserved), [210] 0xAA tailer. + */ +static void build_dummy_packet(uint8_t *packet, uint16_t counter) +{ + uint32_t ts_us = (uint32_t)esp_timer_get_time(); + + packet[0] = NRF_EXG_HEADER; + packet[1] = (uint8_t)(counter & 0xFF); + packet[2] = (uint8_t)((counter >> 8) & 0xFF); + packet[3] = (uint8_t)(ts_us & 0xFF); + packet[4] = (uint8_t)((ts_us >> 8) & 0xFF); + packet[5] = (uint8_t)((ts_us >> 16) & 0xFF); + packet[6] = (uint8_t)((ts_us >> 24) & 0xFF); + + for (uint32_t s = 0; s < DUMMY_SAMPLES_PER_PACKET; s++) { + uint32_t base = s * DUMMY_BYTES_PER_SAMPLE; + for (uint32_t i = 0; i < DUMMY_BYTES_PER_SAMPLE; i++) { + packet[7 + s * DUMMY_BYTES_PER_SAMPLE + i] = (uint8_t)(base + i); + } + } + + packet[NRF_EXG_PACKET_SIZE - 4] = 0x01; /* board_id placeholder */ + packet[NRF_EXG_PACKET_SIZE - 3] = 0x00; /* sync_pulse_count placeholder */ + packet[NRF_EXG_PACKET_SIZE - 2] = 0x00; /* reserved */ + packet[NRF_EXG_PACKET_SIZE - 1] = NRF_EXG_TAILER; +} + +/** @brief Task: generates and streams synthetic packets when ESP_LOCAL_DUMMY_SENSOR is set. */ +void dummy_sensor_local_task(void *pv) +{ + (void)pv; + uint8_t packet[NRF_EXG_PACKET_SIZE]; + uint16_t counter = 0; + + while (1) { + xEventGroupWaitBits(g_evt, B_START_CMD_RCV, pdTRUE, pdFALSE, portMAX_DELAY); + + ESP_LOGI(DUMMY_LOCAL_TAG, "Starting local dummy sensor generation"); + node_state = STATE_STREAMING; + counter = 0; + xEventGroupClearBits(g_evt, B_STOP_CMD_FWD_TO_BIOGAP); + xEventGroupSetBits(g_evt, B_START_CMD_FWD_TO_BIOGAP); + + TickType_t last_wake = xTaskGetTickCount(); + while (!(xEventGroupGetBits(g_evt) & (B_STOP_CMD_RCV_GUI | B_STOP_CMD_RCV_FORCED))) { + build_dummy_packet(packet, counter++); + if (add_to_ringbuffer(packet, NRF_EXG_PACKET_SIZE) != ESP_OK) { + ESP_LOGW(DUMMY_LOCAL_TAG, "Failed to add packet to ringbuffer"); + } + vTaskDelayUntil(&last_wake, pdMS_TO_TICKS(DUMMY_PACKET_PERIOD_MS)); + } + + ESP_LOGI(DUMMY_LOCAL_TAG, "Stop requested, halting local dummy sensor generation"); + node_state = STATE_IDLE; + xEventGroupClearBits(g_evt, B_START_CMD_RCV | B_START_CMD_FWD_TO_BIOGAP); + xEventGroupSetBits(g_evt, B_STOP_CMD_FWD_TO_BIOGAP); + } +} + +/** @brief Local-dummy-mode counterpart of prepare_for_restart(): flush ring buffer and clear STOP bits. */ +esp_err_t prepare_for_restart_local_dummy(void) +{ + xEventGroupWaitBits(g_evt, B_STOP_CMD_FWD_TO_BIOGAP, pdFALSE, pdFALSE, portMAX_DELAY); + + esp_err_t ret = rb_soft_flush(biogap_ringbuf); + if (ret != ESP_OK) { + ESP_LOGE(DUMMY_LOCAL_TAG, "Failed to soft-flush BIOGAP ringbuffer"); + return ret; + } + + xEventGroupClearBits(g_evt, B_RINGBUFFER_FULL); + xEventGroupClearBits(g_evt, B_STOP_CMD_RCV_GUI | B_STOP_CMD_RCV_FORCED | B_STOP_CMD_FWD_TO_BIOGAP | B_STOP_CMD_RPT_PENDING); + return ESP_OK; +} diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/components/common/CMakeLists.txt b/WiFi_SD_Shield_V1/Firmware/espc6/components/common/CMakeLists.txt new file mode 100644 index 0000000..42a5b25 --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/components/common/CMakeLists.txt @@ -0,0 +1,9 @@ +file(GLOB_RECURSE COMMON_SOURCES + "source/*.c" +) + +idf_component_register( + SRCS ${COMMON_SOURCES} + INCLUDE_DIRS "include" + REQUIRES driver freertos esp_timer biogap esp_driver_spi +) diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/components/common/include/common.h b/WiFi_SD_Shield_V1/Firmware/espc6/components/common/include/common.h new file mode 100644 index 0000000..4f3a89e --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/components/common/include/common.h @@ -0,0 +1,146 @@ +/* + * ---------------------------------------------------------------------- + * + * File: common.h + * + * Last edited: 17.07.2026 + * + * Copyright (c) 2026 ETH Zurich and University of Bologna + * + * Authors: + * - Giusy Spacone (gspacone@iis.ee.ethz.ch), ETH Zurich + * + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include +#include + +// FreeRTOS / ESP-IDF +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/event_groups.h" +#include "freertos/ringbuf.h" +#include "freertos/semphr.h" +#include "esp_timer.h" +// GPIO +#include "driver/gpio.h" +// SPI +#include "driver/spi_master.h" +#include "driver/spi_slave.h" +#include "pin_definitions.h" +#include "shield_config.h" + + +// ---------------------- AP State Machine ---------------------------- + +typedef enum { + STATE_DISCONNECTED, // Initial State, waiting to verify TCP connection and BIOGAP communication + STATE_IDLE , // TCP and BIOGAP comms verified, waiting to start streaming + STATE_STREAMING, // Streaming active/expected +} node_state_t; + +extern volatile node_state_t node_state; +extern int64_t start_time; + +// -------------------- Event bits -------------------- +extern EventGroupHandle_t g_evt; +extern SemaphoreHandle_t spi_bus_mutex; + +#define SPI_BUS_LOCK(timeout_ticks) (xSemaphoreTake(spi_bus_mutex, (timeout_ticks)) == pdTRUE) +#define SPI_BUS_UNLOCK() xSemaphoreGive(spi_bus_mutex) + +// These are for Wi-Fi Streaming +#define B_BIOGAP_CONECTED (1U << 0) // Connection with BIOGAP master verified by successful SPI transaction +#define B_WIFI_CONNECTED (1U << 1) // TCP connected (socket usable) +#define B_GUI_SOCKET_BIND (1U << 2) // GUI socket successfully bound and accepted (gui_sock valid) +#define B_START_CMD_RCV (1U << 3) // Start command received from GUI (via TCP) +#define B_START_CMD_FWD_TO_BIOGAP (1U << 4) // Start command forwarded to BIOGAP master successfully +#define B_STOP_CMD_RCV_GUI (1U << 5) // Stop command received from GUI (via TCP) +#define B_STOP_CMD_FWD_TO_BIOGAP (1U << 6) // Stop command forwarded to BIOGAP master successfully +#define B_RINGBUFFER_FULL (1U << 7) // Ringbuffer is full, cannot add more data until some is consumed +// SPI quiesce handshake: reader sets this when outstanding pre-queued descriptors +// have been drained and the SPI bus is safe for a STOP-frame transmit by sender. +#define B_SPI_QUIESCED (1U << 8) +#define B_STOP_CMD_RCV_FORCED (1U << 9) // Stop command received from GUI (via TCP) +#define B_STOP_CMD_RPT_PENDING (1U << 10) // GUI task should report the simulated STOP event + + +/* Handshake ping-pong markers to validate NRF-ESP communication */ +#define HANDSHAKE_MARKER 0x5A +#define HANDSHAKE_RESPONSE_MARKER 0xA5 + +// -------------------- Task stack sizes -------------------- +#define READ_FROM_BIOGAP_STACK_SIZE 4096 + +// -------------------- Packet format -------------------- +#define PAYLOAD_SIZE 1440 // application payload target for WiFi transmission, can be adjusted +#define HEADER_BYTES 3 +#define COUNTER_BYTES 4 +#define TSF_BYTES 8 +#define NUM_SAMPLES_BYTES 2 + +#define PACKET_DEF_BYTES (HEADER_BYTES + COUNTER_BYTES + TSF_BYTES + NUM_SAMPLES_BYTES) +#define SPACE_RESERVED_FOR_MASTER 3 +#define CRC_BYTES 0 + +#define EFFECTIVE_MAX_PAYLOAD (PAYLOAD_SIZE - PACKET_DEF_BYTES - SPACE_RESERVED_FOR_MASTER - CRC_BYTES) + +// NOTE: this is currently enforced by prepare_buffer(). Keep consistent with builder math. +#define EXPECTED_DATA_LEN 1436 + +// -------------------- Streaming / timing -------------------- +#define NODE_FRAME_TAG 0x0A // high nibble for node frame + +// -------------------- Ringbuffer -------------------- +#define RINGBUFF_SIZE 200000 // bytes +extern RingbufHandle_t ringbuff; + +// -------------------- Constants for NRF-ESP SPI transfer and packet building -------------------- +#define SPI_FROM_BIOGAP_MAX_SIZE 250 // max number of bytes in a single SPI transaction from BIOGAP (e.g. 410 if streaming from WULPUS) + +//--------------------- SPI Transactions & Mode Switching -------- +// Single SPI host constant used for both NRF and SD card modes (runtime switching) +#define SPI_HOST_DEVICE SPI2_HOST + +// SPI bus ownership modes +typedef enum { + SPI_MODE_IDLE = 0, + SPI_MODE_NRF = 1, + SPI_MODE_SD = 2 +} spi_mode_t; + +extern spi_device_handle_t nrf_spi_device; +extern spi_mode_t current_spi_mode; + +esp_err_t config_spi_nrf_master_esp_slave_pins(void); +esp_err_t init_nrf_spi_master_esp_slave_bus(void); +extern bool handshake_pq_done; +extern bool send_start_command_to_biogap_master; + +//---------------------- Logging tags ------------------------ +// Set to 1 only when actively profiling SPI mode-switch overhead. +#ifndef ENABLE_SPI_PROFILE_LOGS +#define ENABLE_SPI_PROFILE_LOGS 0 +#endif + +// 0: suppress INFO logs (default, faster runtime) +// 1: enable INFO logs for debugging/profiling +#ifndef ESP_ENABLE_INFO_LOGS +#define ESP_ENABLE_INFO_LOGS 1 +#endif diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/components/common/include/connectivity_commands.h b/WiFi_SD_Shield_V1/Firmware/espc6/components/common/include/connectivity_commands.h new file mode 100644 index 0000000..882f960 --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/components/common/include/connectivity_commands.h @@ -0,0 +1,51 @@ +/* + * ---------------------------------------------------------------------- + * + * File: connectivity_commands.h + * + * Last edited: 17.07.2026 + * + * Copyright (c) 2026 ETH Zurich and University of Bologna + * + * Authors: + * - Giusy Spacone (gspacone@iis.ee.ethz.ch), ETH Zurich + * + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef CONNECTIVITY_COMMANDS_H +#define CONNECTIVITY_COMMANDS_H + +/** + * @file connectivity_commands.h + * @brief Connectivity Protocol Command Definitions + * + * This header defines extra commands needed for the connectivity between ESP and the BIOGUI. + * The ESP acts as a bridge between the BIOGAP and the GUI, forwarding commands and data. + * Full list of commands can be found in the BIOGAP firmware's connectivity_commands.h file. + */ + +#define START_DUMMY_STREAMING 243 +#define STOP_DUMMY_STREAMING 244 +#define ESP_STOP_COMMAND 245 + +#define NRF_EXG_HEADER 0x55 +#define NRF_EXG_TAILER 0xAA +#define ESP_EXG_HEADER 0x66 +#define ESP_EXG_TAILER 0xBB +#define NRF_EXG_PACKET_SIZE 211 + +#endif // CONNECTIVITY_COMMANDS_H diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/components/common/include/pin_definitions.h b/WiFi_SD_Shield_V1/Firmware/espc6/components/common/include/pin_definitions.h new file mode 100644 index 0000000..43d047f --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/components/common/include/pin_definitions.h @@ -0,0 +1,61 @@ +/* + * ---------------------------------------------------------------------- + * + * File: pin_definitions.h + * + * Last edited: 17.07.2026 + * + * Copyright (c) 2026 ETH Zurich and University of Bologna + * + * Authors: + * - Giusy Spacone (gspacone@iis.ee.ethz.ch), ETH Zurich + * + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef PIN_DEFINITIONS_H +#define PIN_DEFINITIONS_H + +// -------------------- NRF <-> ESP SPI pins. Condition: NRF is SPI Master, ESP is SPI slave -------------------- + +#define NRF_ESP_MOSI 23 // NRF_ESP MOSI -> SPI_NRF_MOSI --> SPI_A_MOSI +#define NRF_ESP_MISO 19 // NRF_ESP MISO --> SPI_NRF_MISO --> SPI_A_MISO +#define NRF_ESP_SCLK 20 // NRF_ESP SCLK -> SPI_NRF_CLK --> SPI_A_CLK +#define NRF_ESP_CS 21 // NRF_ESP_CS -> NRF_QSPI_IO1 +#define NRF_ESP_DIR_CTRL 12 // TO determine if NRF or ESP is the SPI master. LOW if NRF is master, HIGH if ESP is master. + +#define NRF_ESP_DRDY_DIR_CTRL 8 +#define NRF_ESP_DATA_READY 22 // NRF_ESP_DRDY -> NRF_QSPI_IO2 + + +// -------------------- SD Card SPI pins(if ESP writes to SD Card) ------------------------ +// Can be used only when ESP is SPI master and SD card is SPI slave. +// Must switch SPI bus at run-time. It will be updated later. +#define ESP_SD_MOSI 7 // ESP MOSI: writes data to SD Card | SD CARD: mSD_CMD ->CMD +#define ESP_SD_MISO 2 // ESP MISO: received data from SD Card | SD CARD: mSD_DAT0 -> DAT0 +#define ESP_SD_CLK 6 // ESP CLK: clock singal | SD CARD: mSD_CLK -> CLK +#define ESP_SD_CS 18 // ESP CS: chip select signal | SD CARD mSD_DAT3 -> CS (in spi mode) +#define ESP_SDCTRL 9 // To control if the ESP writes directly to SD card. + +// -------------------- RTC PINS ------------------------ +#define RTC_SCL 15 +#define RTC_SDA 14 +#define RTC_ON 13 // GPIO pin for enabling/disabling the RTC +#define RTC_FOUT 4 +#define RTC_CLKOUT 3 + +# +#endif // PIN_DEFINITIONS_H \ No newline at end of file diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/components/common/include/shield_config.h b/WiFi_SD_Shield_V1/Firmware/espc6/components/common/include/shield_config.h new file mode 100644 index 0000000..03ce990 --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/components/common/include/shield_config.h @@ -0,0 +1,47 @@ +/* + * ---------------------------------------------------------------------- + * + * File: shield_config.h + * + * Last edited: 17.07.2026 + * + * Copyright (c) 2026 ETH Zurich and University of Bologna + * + * Authors: + * - Giusy Spacone (gspacone@iis.ee.ethz.ch), ETH Zurich + * + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef SHIELD_CONFIG_H +#define SHIELD_CONFIG_H + + +// ---------------------- AP State Machine --------------------- +#define IS_WBAN 0 + + +// ---------------------- SELECT IF ESP is SPI MASTER OR SLAVE --------------------- +#define IS_ESP_SPI_SLAVE 1 + +// ----------------------- ESP-only dummy sensor generator ----------------------- +// When set, the ESP32 generates synthetic dummy-sensor packets locally (identical +// wire format to Firmware/src_NRF/sensors/dummy_sensor/dummy_sensor_appl.c) and +// streams them straight to BioGUI, bypassing SPI/BIOGAP entirely. For testing the +// WiFi/GUI half of the system in isolation, with no nRF/SPI hardware attached. +#define ESP_LOCAL_DUMMY_SENSOR 0 + +#endif // SHIELD_CONFIG_H \ No newline at end of file diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/components/common/source/common.c b/WiFi_SD_Shield_V1/Firmware/espc6/components/common/source/common.c new file mode 100644 index 0000000..be4bda2 --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/components/common/source/common.c @@ -0,0 +1,139 @@ +/* + * ---------------------------------------------------------------------- + * + * File: common.c + * + * Last edited: 17.07.2026 + * + * Copyright (c) 2026 ETH Zurich and University of Bologna + * + * Authors: + * - Giusy Spacone (gspacone@iis.ee.ethz.ch), ETH Zurich + * + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "common.h" +#include "esp_log.h" +#include "biogap.h" + +static const char *COMMON_TAG = "[common.c]: "; + +// Track current SPI bus mode for safe mode switching +spi_mode_t current_spi_mode = SPI_MODE_IDLE; +SemaphoreHandle_t spi_bus_mutex = NULL; + +/* Initialize ESP as SPI Slave, NRF will be the master */ +esp_err_t init_nrf_spi_master_esp_slave_bus(void) +{ + // Configuration for the SPI bus + spi_bus_config_t buscfg = { + .mosi_io_num = NRF_ESP_MOSI, + .miso_io_num = NRF_ESP_MISO, + .sclk_io_num = NRF_ESP_SCLK, + .quadwp_io_num = -1, + .quadhd_io_num = -1, + .data4_io_num = -1, + .data5_io_num = -1, + .data6_io_num = -1, + .data7_io_num = -1, + .max_transfer_sz = SPI_FROM_BIOGAP_MAX_SIZE, + .flags = 0, + .intr_flags = 0, + }; + + spi_slave_interface_config_t slvcfg = { + .mode = 1, // SPI Mode 1 required for DMA (CPOL=0, CPHA=1) + .spics_io_num = NRF_ESP_CS, + .queue_size = 10, // sets how many transactions can be in the air. Must be higher for larger transaction intervals + .flags = 0 + }; + + + esp_err_t ret = spi_slave_initialize(SPI_HOST_DEVICE, &buscfg, &slvcfg, SPI_DMA_CH_AUTO); + if (ret != ESP_OK) { + ESP_LOGE(COMMON_TAG, ">>> FAILED to initialize NRF SPI slave: %s", esp_err_to_name(ret)); + return ret; + } + + return ESP_OK; +} + + +/** @brief Configure the DRDY, DRDY_DIR_CTRL, and DIR_CTRL GPIOs for the NRF<->ESP SPI link. */ +esp_err_t config_spi_nrf_master_esp_slave_pins(void){ + esp_err_t ret; + // Configure the Data Ready pin as output. + gpio_config_t io_conf = { + .pin_bit_mask = (1ULL << NRF_ESP_DATA_READY), + .mode = GPIO_MODE_OUTPUT, + .pull_up_en = GPIO_PULLUP_DISABLE, + .pull_down_en = GPIO_PULLDOWN_ENABLE, + .intr_type = GPIO_INTR_DISABLE, + }; + + ESP_ERROR_CHECK(gpio_reset_pin(NRF_ESP_DATA_READY)); + ESP_ERROR_CHECK(gpio_config(&io_conf)); + + // Default state: LOW + ret = gpio_set_level(NRF_ESP_DATA_READY, 0); + if (ret!=ESP_OK){ + ESP_LOGE(COMMON_TAG, "Failed to set NRF data-ready pin LOW: %s", esp_err_to_name(ret)); + return ret; + } + + // Configure the DRDY_DIR_CTRL pin (IC5, dedicated DRDY level-translator channel). + gpio_config_t io_conf_dir_ctrl = { + .pin_bit_mask = (1ULL << NRF_ESP_DRDY_DIR_CTRL), + .mode = GPIO_MODE_OUTPUT, + .pull_up_en = GPIO_PULLUP_DISABLE, + .pull_down_en = GPIO_PULLDOWN_ENABLE, + .intr_type = GPIO_INTR_DISABLE, + }; + + ESP_ERROR_CHECK(gpio_reset_pin(NRF_ESP_DRDY_DIR_CTRL)); + ESP_ERROR_CHECK(gpio_config(&io_conf_dir_ctrl)); + + // Fixed HIGH: DRDY always flows ESP -> NRF (IC5 channel A->B). + ret = gpio_set_level(NRF_ESP_DRDY_DIR_CTRL, 1); + if (ret!=ESP_OK){ + ESP_LOGE(COMMON_TAG, "Failed to set NRF data-ready direction pin HIGH: %s", esp_err_to_name(ret)); + return ret; + } + + // Configure the DIR_CTRL pin (IC2, MOSI/MISO/CS/CLK level-translator channels). + // The polarity depends on which side is SPI master. If the NRF is SPI master: + // LOW routes MOSI/CS/CLK as NRF(B) -> ESP(A), MISO as ESP(A) -> NRF(B) + gpio_config_t io_conf_spi_dir_ctrl = { + .pin_bit_mask = (1ULL << NRF_ESP_DIR_CTRL), + .mode = GPIO_MODE_OUTPUT, + .pull_up_en = GPIO_PULLUP_DISABLE, + .pull_down_en = GPIO_PULLDOWN_ENABLE, + .intr_type = GPIO_INTR_DISABLE, + }; + + ESP_ERROR_CHECK(gpio_reset_pin(NRF_ESP_DIR_CTRL)); + ESP_ERROR_CHECK(gpio_config(&io_conf_spi_dir_ctrl)); + + ret = gpio_set_level(NRF_ESP_DIR_CTRL, 0); + if (ret!=ESP_OK){ + ESP_LOGE(COMMON_TAG, "Failed to set NRF/ESP SPI direction pin LOW: %s", esp_err_to_name(ret)); + return ret; + } + + return ESP_OK; +} + diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/components/wifi_ap/CMakeLists.txt b/WiFi_SD_Shield_V1/Firmware/espc6/components/wifi_ap/CMakeLists.txt new file mode 100644 index 0000000..81a4806 --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/components/wifi_ap/CMakeLists.txt @@ -0,0 +1,9 @@ +file(GLOB_RECURSE WIFI_AP_SOURCES + "source/*.c" +) + +idf_component_register( + SRCS ${WIFI_AP_SOURCES} + INCLUDE_DIRS "include" + REQUIRES esp_wifi esp_event driver common +) diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/components/wifi_ap/include/gui_task.h b/WiFi_SD_Shield_V1/Firmware/espc6/components/wifi_ap/include/gui_task.h new file mode 100644 index 0000000..b97172c --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/components/wifi_ap/include/gui_task.h @@ -0,0 +1,70 @@ +/* + * ---------------------------------------------------------------------- + * + * File: gui_task.h + * + * Last edited: 17.07.2026 + * + * Copyright (c) 2026 ETH Zurich and University of Bologna + * + * Authors: + * - Giusy Spacone (gspacone@iis.ee.ethz.ch), ETH Zurich + * + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef GUI_TASK_H +#define GUI_TASK_H + +#include "softap_main.h" +#include "biogap.h" + +#define RX_FROM_GUI_BUF_SIZE 20 + + +/** @brief Buffer to store incoming commands from the GUI*/ +extern uint8_t rx_data_from_gui[RX_FROM_GUI_BUF_SIZE]; +extern uint8_t rx_gui_data_to_fwd[RX_FROM_GUI_BUF_SIZE]; + +/** @brief Binds to the GUI socket */ +esp_err_t bind_to_gui(); + +/** @brief Task to receive data from the GUI */ +void rx_from_gui(void *pv); + +/** @brief Handler for rx_from_gui task */ +extern TaskHandle_t rx_gui_task_handle; + +/** @brief Task to send data to the GUI */ +void tx_to_gui(void *pv); + +/** @brief Parses commands received from the GUI */ +esp_err_t parse_gui_command(uint8_t *buf, size_t len); + +/** @brief Tears down/reinitializes the SPI bus + DMA buffers, guaranteeing an + * empty transaction queue. Only safe once the NRF is confirmed (or very + * likely) idle -- see its doc comment in gui_task.c for the two call sites + * (post-STOP, and before every non-first START). */ +esp_err_t reset_spi_bus_for_restart(void); + +/** @brief Finishes restart bookkeeping (ringbuffer flush, idle re-arm, event + * bits) after a STOP. Sole caller: enter_stop_quiesce_state() (biogap_read.c). */ +esp_err_t prepare_for_restart(); + +/** @brief Drains biogap_ringbuf completely, robust against late in-flight enqueues */ +esp_err_t rb_soft_flush(RingbufHandle_t rb); + +#endif // GUI_TASK_H \ No newline at end of file diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/components/wifi_ap/include/softap_main.h b/WiFi_SD_Shield_V1/Firmware/espc6/components/wifi_ap/include/softap_main.h new file mode 100644 index 0000000..17b68af --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/components/wifi_ap/include/softap_main.h @@ -0,0 +1,63 @@ +/* + * ---------------------------------------------------------------------- + * + * File: softap_main.h + * + * Last edited: 17.07.2026 + * + * Copyright (c) 2026 ETH Zurich and University of Bologna + * + * Authors: + * - Giusy Spacone (gspacone@iis.ee.ethz.ch), ETH Zurich + * + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_system.h" +#include "esp_wifi.h" +#include "esp_event.h" +#include "esp_log.h" +#include "esp_netif.h" +#include "lwip/err.h" +#include "lwip/sockets.h" +#include "lwip/sys.h" +#include +#include "common.h" +#include "connectivity_commands.h" + +#ifndef SOFTAP_MAIN_H +#define SOFTAP_MAIN_H + +// Defines to set-up WiFi +#define EXAMPLE_ESP_WIFI_SSID "bioserver" +#define EXAMPLE_ESP_WIFI_PASS "biogapwifi" +#define EXAMPLE_ESP_WIFI_CHANNEL 1 +// ====== Protocol / ports ====== +#define PORT_LAPTOP 4444 +#define PORT_ESP_NODE 3333 + +/** @brief Function to initialize WiFi in soft-AP mode */ +esp_err_t wifi_init_softap(void); + +/** @brief Global socket for GUI connection */ +extern int gui_sock; // single GUI connection socket or -1 +extern bool gui_connected; // flag to indicate if a GUI is connected + +#endif // SOFTAP_MAIN_H \ No newline at end of file diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/components/wifi_ap/source/gui_task.c b/WiFi_SD_Shield_V1/Firmware/espc6/components/wifi_ap/source/gui_task.c new file mode 100644 index 0000000..f188eec --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/components/wifi_ap/source/gui_task.c @@ -0,0 +1,338 @@ +/* + * ---------------------------------------------------------------------- + * + * File: gui_task.c + * + * Last edited: 17.07.2026 + * + * Copyright (c) 2026 ETH Zurich and University of Bologna + * + * Authors: + * - Giusy Spacone (gspacone@iis.ee.ethz.ch), ETH Zurich + * + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "gui_task.h" +#include "dummy_sensor_local.h" +#include "freertos/ringbuf.h" +#define GUI_TAG "[gui_task.c]" + +bool gui_connected = false; +int gui_sock = -1; +uint8_t rx_data_from_gui[RX_FROM_GUI_BUF_SIZE] = {0}; +uint8_t rx_gui_data_to_fwd[RX_FROM_GUI_BUF_SIZE] = {0}; +TaskHandle_t rx_gui_task_handle = NULL; + +static bool start_reported = false; +static bool stop_reported = false; + +/** @brief Block in accept() for a single TCP connection from BioGUI on PORT_LAPTOP. */ +esp_err_t bind_to_gui() +{ + + // accept the GUI socket + int ls = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); + if (ls < 0){ + ESP_LOGE(GUI_TAG, "socket errno=%d", errno); + vTaskDelete(NULL); + return ESP_FAIL; + } + + int opt = 1; + setsockopt(ls, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); + + struct sockaddr_in a = {0}; + a.sin_family = AF_INET; + a.sin_port = htons(PORT_LAPTOP); + a.sin_addr.s_addr = htonl(INADDR_ANY); + + if (bind(ls, (struct sockaddr*)&a, sizeof(a)) != 0 || listen(ls, 1) != 0) { + ESP_LOGE(GUI_TAG, "bind/listen errno=%d", errno); + close(ls); + vTaskDelete(NULL); + return ESP_FAIL; + } + ESP_LOGI(GUI_TAG, "Listening on %d", PORT_LAPTOP); + + struct sockaddr_storage sa; + socklen_t sl = sizeof(sa); + int s = accept(ls, (struct sockaddr*)&sa, &sl); + if (s < 0) { + ESP_LOGW(GUI_TAG, "accept failed errno=%d", errno); + close(ls); + return ESP_FAIL; + } + ESP_LOGI(GUI_TAG, "Accepted with fd=%d", s); + + /* Only one GUI connection is ever served at a time (accept() above is + * blocking, single-shot); the listening socket isn't needed again until + * the next call to bind_to_gui(), which creates a fresh one. */ + close(ls); + + /* keepalive */ + int ka = 1, idle = 5, intv = 5, cnt = 3; + setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &ka, sizeof(ka)); + setsockopt(s, IPPROTO_TCP, TCP_KEEPIDLE, &idle, sizeof(idle)); + setsockopt(s, IPPROTO_TCP, TCP_KEEPINTVL, &intv, sizeof(intv)); + setsockopt(s, IPPROTO_TCP, TCP_KEEPCNT, &cnt, sizeof(cnt)); + + /* set timeouts to avoid blocking forever */ + struct timeval rcv_to = { .tv_sec = 2, .tv_usec = 0 }; + setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &rcv_to, sizeof(rcv_to)); + + struct timeval snd_to = { .tv_sec = 0, .tv_usec = 200 * 1000 }; /* 200 ms */ + setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, &snd_to, sizeof(snd_to)); + + /* expose the accepted socket to the rest of the app */ + gui_sock = s; + gui_connected = true; + + /* Notify other tasks that the GUI socket is bound and available */ + if (g_evt) { + xEventGroupSetBits(g_evt, B_GUI_SOCKET_BIND); + } + return ESP_OK; +} + +/** @brief Drain biogap_ringbuf completely, robust against late in-flight enqueues. */ +esp_err_t rb_soft_flush(RingbufHandle_t rb) +{ + if (rb == NULL) { + return ESP_ERR_INVALID_ARG; + } + + size_t item_size = 0; + void *item = NULL; + size_t items_flushed = 0; + int empty_rounds = 0; + + /* Keep draining until the ringbuffer stays empty for a few checks. + * This makes the flush robust against late in-flight enqueues. + */ + for (int round = 0; round < 64; round++) { + bool drained_this_round = false; + + while ((item = xRingbufferReceive(rb, &item_size, 0)) != NULL) { + vRingbufferReturnItem(rb, item); + items_flushed++; + drained_this_round = true; + } + + UBaseType_t items_waiting = 0; + vRingbufferGetInfo(rb, NULL, NULL, NULL, NULL, &items_waiting); + + if (!drained_this_round && items_waiting == 0) { + empty_rounds++; + if (empty_rounds >= 3) { + ESP_LOGI(GUI_TAG, "Soft-flushed ringbuffer completely, items=%u", (unsigned)items_flushed); + return ESP_OK; + } + } else { + empty_rounds = 0; + } + + vTaskDelay(pdMS_TO_TICKS(1)); + } + + ESP_LOGW(GUI_TAG, "Ringbuffer flush reached retry limit, items=%u", (unsigned)items_flushed); + return ESP_OK; +} + + +/** @brief Task to transmit data to the GUI + * This task is responsible for draining the content of the ringbuffer and sending it to the GUI via WiFi. +*/ +void tx_to_gui(void *pvParameters) +{ + + while(1){ + if(node_state == STATE_STREAMING){ + size_t item_size = 0; + uint8_t *item = (uint8_t *)xRingbufferReceive(biogap_ringbuf, &item_size, portMAX_DELAY); + + if(item !=NULL){ + // send immediately to the gui + int sent = send(gui_sock, item, item_size, 0); + // int sent = 1; //hardcoded for now + if (sent < 0) { + // item will stay in the ringbuffer since we havent' return it yet. + // ESP_LOGE(GUI_TAG, "Failed to send data to GUI"); + } + else{ + // remove the item from the ringbuffer only if it was sent successfully + vRingbufferReturnItem(biogap_ringbuf, (void *)item); + } + } + } + + else{ + vTaskDelay(pdMS_TO_TICKS(100)); // Sleep for a while when not streaming to avoid busy loop + } + } + + vTaskDelete(NULL); +} + + +/** + * @brief Tear down and reinitialize the SPI slave bus and DMA buffers, + * guaranteeing an empty transaction queue. + */ +esp_err_t reset_spi_bus_for_restart(void) +{ + esp_err_t ret = free_prequeue_resources(); + ret = spi_slave_free(SPI_HOST_DEVICE); + ESP_LOGI(GUI_TAG, "Freed pre-queue resources for restart"); + ret = init_nrf_spi_master_esp_slave_bus(); + if (ret != ESP_OK) { + ESP_LOGE(GUI_TAG, "Failed to re-initialize NRF SPI bus"); + return ret; + } + ESP_LOGI(GUI_TAG, "Re-initialized NRF SPI bus for next acquisition"); + current_spi_mode = SPI_MODE_NRF; + return ESP_OK; +} + +/** + * @brief Finish restart bookkeeping after a STOP: flush the ring buffer, + * re-arm the SPI bus with idle-content transactions, and clear the + * STOP/START event bits. + * + * Sole caller: enter_stop_quiesce_state() (biogap_read.c), right after + * reset_spi_bus_for_restart(). + */ +esp_err_t prepare_for_restart(){ + ESP_LOGI(GUI_TAG, "Preparing for restart after STOP command"); + // drain completely the ringbuffer + esp_err_t ret = rb_soft_flush(biogap_ringbuf); + if (ret != ESP_OK) { + ESP_LOGE(GUI_TAG, "Failed to soft-flush BIOGAP ringbuffer"); + vTaskDelete(NULL); + return ret; + } + xEventGroupClearBits(g_evt, B_RINGBUFFER_FULL); + start_reported = false; + stop_reported = false; + xEventGroupClearBits(g_evt, B_STOP_CMD_RCV_GUI | B_STOP_CMD_RCV_FORCED | B_STOP_CMD_FWD_TO_BIOGAP | B_STOP_CMD_RPT_PENDING); + return ESP_OK; +} + + +/** @brief Task: receives GUI commands and drives the START/STOP/reconnect state machine. */ +void rx_from_gui(void *pvParameters) +{ + rx_gui_task_handle = xTaskGetCurrentTaskHandle(); + uint8_t gui_rx_buf[256]; + esp_err_t ret; + while(1){ + // Receive data from the GUI + int bytes_received = recv(gui_sock, gui_rx_buf, sizeof(gui_rx_buf), 0); + + if (bytes_received==0){ + // The GUI closed the connection. This is expected as part of a normal + // stop-then-disconnect cycle (and BioGUI may reconnect for the next + // session), so don't tear down this task -- go back to waiting for a + // new connection instead. If this happens while still streaming, force + // a STOP first so the SPI link gets quiesced and the NRF told to stop, + // instead of leaving it streaming into a socket nobody is reading. + ESP_LOGW(GUI_TAG, "GUI closed the connection (node_state=%d)", (int)node_state); + + if (node_state == STATE_STREAMING) { + rx_gui_data_to_fwd[0] = STOP_DUMMY_STREAMING; + //xEventGroupSetBits(g_evt, B_STOP_CMD_RCV_FORCED); --> might be the cause of the race + #if ESP_LOCAL_DUMMY_SENSOR + /* Local-dummy mode has no equivalent of enter_stop_quiesce_state() + * to trigger this on its own, so it's still called directly here. */ + prepare_for_restart_local_dummy(); + #else + /* Real path: enter_stop_quiesce_state() (biogap_read.c), running in + * the read task, picks up B_STOP_CMD_RCV_FORCED and calls + * prepare_for_restart() itself once STOP delivery is confirmed. + * Do NOT also call it here -- two tasks racing through + * free/reinit/allocate on the same SPI bus corrupts its state. */ + #endif + } + start_reported = false; + stop_reported = false; + + close(gui_sock); + gui_sock = -1; + gui_connected = false; + xEventGroupClearBits(g_evt, B_GUI_SOCKET_BIND); + + ESP_LOGI(GUI_TAG, "Waiting for a new GUI connection..."); + if (bind_to_gui() != ESP_OK) { + ESP_LOGE(GUI_TAG, "Failed to re-bind to GUI, giving up"); + break; + } + continue; + } + if (bytes_received<0){ + // Handle Error Code 11 (EAGAIN / EWOULDBLOCK) -> means that no data was available right now + // ESP_LOGI(GUI_TAG, "No data received from GUI, errno=%d", errno); + if (errno == EAGAIN || errno == EWOULDBLOCK) { + // Add a small delay to avoid busy-waiting + vTaskDelay(pdMS_TO_TICKS(1000)); // this is not critical, we can wait and let other tasks run + continue; + } + break; + } + + else{ + ret = parse_gui_command(&gui_rx_buf, bytes_received); + if (ret != ESP_OK) { + ESP_LOGW(GUI_TAG, "Failed to parse GUI command"); + continue; // ignore this command and keep listening for new ones + } + if (!start_reported && (xEventGroupGetBits(g_evt) & B_START_CMD_RCV)) { + xEventGroupClearBits(g_evt, B_START_CMD_RCV); + start_reported = true; + stop_reported = false; + } + + if (xEventGroupGetBits(g_evt) & B_STOP_CMD_RPT_PENDING) { + xEventGroupSetBits(g_evt, B_STOP_CMD_RCV_GUI); + xEventGroupClearBits(g_evt, B_STOP_CMD_RPT_PENDING); + ESP_LOGI(GUI_TAG, "STOP command received from GUI, preparing for restart"); + //node_state = STATE_IDLE; + stop_reported = true; + start_reported = false; +#if ESP_LOCAL_DUMMY_SENSOR + /* Local-dummy mode has no equivalent of enter_stop_quiesce_state() + * to trigger this on its own, so it's still called directly here. */ + prepare_for_restart_local_dummy(); +#else + /* Real path: enter_stop_quiesce_state() (biogap_read.c), running in + * the read task, picks up B_STOP_CMD_RCV_GUI and calls + * prepare_for_restart() itself once STOP delivery is confirmed. + * Do NOT also call it here -- two tasks racing through + * free/reinit/allocate on the same SPI bus corrupts its state. */ +#endif + } + + } + + } + +// cleanup: +// ESP_LOGI(GUI_TAG, "RX task cleaning up..."); +// shutdown(gui_sock, SHUT_RDWR); +// close(gui_sock); +// gui_sock = -1; +// gui_connected = false; + vTaskDelete(NULL); +} \ No newline at end of file diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/components/wifi_ap/source/gui_utils.c b/WiFi_SD_Shield_V1/Firmware/espc6/components/wifi_ap/source/gui_utils.c new file mode 100644 index 0000000..9783050 --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/components/wifi_ap/source/gui_utils.c @@ -0,0 +1,67 @@ +/* + * ---------------------------------------------------------------------- + * + * File: gui_utils.c + * + * Last edited: 17.07.2026 + * + * Copyright (c) 2026 ETH Zurich and University of Bologna + * + * Authors: + * - Giusy Spacone (gspacone@iis.ee.ethz.ch), ETH Zurich + * + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "gui_task.h" +#include "common.h" +#include "esp_log.h" +#define GUI_TAG "[gui_utils.c]" + + +/** @brief Validate and dispatch a single command byte received from BioGUI. */ +esp_err_t parse_gui_command(uint8_t *buf, size_t len) +{ + if (buf == NULL || len == 0) { + ESP_LOGE(GUI_TAG, "Empty GUI command buffer"); + return ESP_ERR_INVALID_ARG; + } + + if (len != 1) { + ESP_LOGW(GUI_TAG, "Ignoring non-command GUI frame, len=%u", (unsigned)len); + return ESP_ERR_INVALID_ARG; + } + + uint8_t command = buf[0]; + + switch (node_state) { + case STATE_IDLE: + rx_gui_data_to_fwd[0] = command; // copy the command to the forwarding buffer for the send_to_biogap task + xEventGroupSetBits(g_evt, B_START_CMD_RCV); + ESP_LOGI(GUI_TAG, "Received START command: %d", (unsigned)command); + break; + case STATE_STREAMING: + xEventGroupSetBits(g_evt, B_STOP_CMD_RPT_PENDING); + rx_gui_data_to_fwd[0] = command; // copy the command to the forwarding buffer for the send_to_biogap task + break; + default: + ESP_LOGW(GUI_TAG, "Unknown node state %d", (int)node_state); + return ESP_ERR_INVALID_STATE; + } + + return ESP_OK; +} diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/components/wifi_ap/source/softap_main.c b/WiFi_SD_Shield_V1/Firmware/espc6/components/wifi_ap/source/softap_main.c new file mode 100644 index 0000000..2a0597e --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/components/wifi_ap/source/softap_main.c @@ -0,0 +1,126 @@ +/* + * ---------------------------------------------------------------------- + * + * File: softap_main.c + * + * Last edited: 17.07.2026 + * + * Copyright (c) 2026 ETH Zurich and University of Bologna + * + * Authors: + * - Giusy Spacone (gspacone@iis.ee.ethz.ch), ETH Zurich + * + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "softap_main.h" +#include "esp_log.h" +#include "esp_wifi.h" +#include "esp_mac.h" +#include "nvs_flash.h" + +static const char *TAG = "softap_main.c"; + +/** @brief Log WiFi AP station connect/disconnect events. */ +static void wifi_station_event_handler(void* arg, esp_event_base_t event_base, + int32_t event_id, void* event_data) +{ + if (event_id == WIFI_EVENT_AP_STACONNECTED) { + wifi_event_ap_staconnected_t* event = (wifi_event_ap_staconnected_t*) event_data; + ESP_LOGI(TAG, "station " MACSTR " join, AID=%d", MAC2STR(event->mac), (int)event->aid); + } + else if (event_id == WIFI_EVENT_AP_STADISCONNECTED) { + wifi_event_ap_stadisconnected_t* event = (wifi_event_ap_stadisconnected_t*) event_data; + ESP_LOGI(TAG, "station " MACSTR " leave, AID=%d, reason=%d", MAC2STR(event->mac), (int)event->aid, (int)event->reason); + } +} + +/** @brief Initialize NVS/netif/event loop and bring up the WiFi SoftAP. */ +esp_err_t wifi_init_softap(void) +{ + esp_err_t ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + if (ret != ESP_OK) { + return ret; + } + + ret = esp_netif_init(); + if (ret != ESP_OK) { + return ret; + } + + ret = esp_event_loop_create_default(); + if (ret != ESP_OK) { + return ret; + } + + esp_netif_create_default_wifi_ap(); + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + ret = esp_wifi_init(&cfg); + if (ret != ESP_OK) { + return ret; + } + + ret = esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_station_event_handler, NULL, NULL); + if (ret != ESP_OK) { + return ret; + } + // Set up WiFi configuration for soft-AP + wifi_config_t wifi_config = { + .ap = { + .ssid = EXAMPLE_ESP_WIFI_SSID, + .ssid_len = (uint8_t)strlen(EXAMPLE_ESP_WIFI_SSID), + .channel = EXAMPLE_ESP_WIFI_CHANNEL, + .password = EXAMPLE_ESP_WIFI_PASS, + .max_connection = 1, +#ifdef CONFIG_ESP_WIFI_SOFTAP_SAE_SUPPORT + .authmode = WIFI_AUTH_WPA3_PSK, + .sae_pwe_h2e = WPA3_SAE_PWE_BOTH, +#else + .authmode = WIFI_AUTH_WPA2_PSK, +#endif + .pmf_cfg = { + .required = true, + }, + }, + }; + if (strlen(EXAMPLE_ESP_WIFI_PASS) == 0) { + wifi_config.ap.authmode = WIFI_AUTH_OPEN; + } + + ret = esp_wifi_set_mode(WIFI_MODE_AP); + if (ret != ESP_OK) { + return ret; + } + + ret = esp_wifi_set_config(WIFI_IF_AP, &wifi_config); + if (ret != ESP_OK) { + return ret; + } + + //gpio_set_level(RTC_SCL, 0); + ret = esp_wifi_start(); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "esp_wifi_start failed: %s", esp_err_to_name(ret)); + return ret; + } + //gpio_set_level(RTC_SCL, 1); + ESP_LOGI(TAG, "wifi_init_softap finished. SSID:%s password:%s channel:%d", EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS, (int)EXAMPLE_ESP_WIFI_CHANNEL); + return ESP_OK; +} diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/dependencies.lock b/WiFi_SD_Shield_V1/Firmware/espc6/dependencies.lock new file mode 100644 index 0000000..4fc6f71 --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/dependencies.lock @@ -0,0 +1,416 @@ +dependencies: + chmorgan/esp-libhelix-mp3: + component_hash: cbb76089dc2c5749f7b470e2e70aedc44c9da519e04eb9a67d4c7ec275229e53 + dependencies: + - name: idf + require: private + version: '>=4.1.0' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.0.3 + espressif/cbor: + component_hash: dad9ca860963e930366510a10b422b3125a4fb27b979712ed65efcbcd742de50 + dependencies: + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com/ + type: service + version: 0.6.1~4 + espressif/esp-dsp: + component_hash: ed9ac175b14e0414399a2b33c525579414b5bad19a2a67b12ea212def96f9a98 + dependencies: + - name: idf + require: private + version: '>=4.2' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.8.2 + espressif/esp-modbus: + component_hash: a52eabcf5e1f81f16f730c70981e69338ea33aee9c44fa512c644d1d8942aa16 + dependencies: + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com/ + type: service + version: 2.1.3 + espressif/esp-zboss-lib: + component_hash: 321883d142421f65009972408287441794250057668a11abbdfd8bec77c3309a + dependencies: + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.6.4 + espressif/esp-zigbee-lib: + component_hash: fa0812e6743e2a7d999af9f44ccdcea17ccb1e80f98d6b2956f44687503a88fd + dependencies: + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.6.8 + espressif/esp_daylight: + component_hash: e27629eb7e12da9e6d01c646e0e4ce6358b977b6f89d4f291a4cc1aea755af94 + dependencies: + - name: idf + require: private + version: '>=5.1' + source: + registry_url: https://components.espressif.com + type: service + version: 1.0.1 + espressif/esp_diag_data_store: + component_hash: 93f20de81abb791b4482f1bc99afdc24b25c3ee42aacceeb636e9943e677b1c5 + dependencies: + - name: idf + require: private + version: '>=5.1' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.1.0 + espressif/esp_diagnostics: + component_hash: 32f2e8b9fea1e055a8460fb8afdc96360c40dd461128ee13ceed44296c068e90 + dependencies: + - name: espressif/rmaker_common + registry_url: https://components.espressif.com + require: private + version: ^1.5 + - name: idf + require: private + version: '>=5.1' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.3.3 + espressif/esp_insights: + component_hash: ed93cb82d424d9c651d656ef19b6de5b78bb356fefaa5b4003c136ef188846e3 + dependencies: + - name: espressif/cbor + registry_url: https://components.espressif.com + require: private + version: ~0.6 + - name: espressif/esp_diag_data_store + registry_url: https://components.espressif.com + require: private + version: 1.1.0 + - name: espressif/esp_diagnostics + registry_url: https://components.espressif.com + require: private + version: '>=1.3.0' + - name: espressif/rmaker_common + registry_url: https://components.espressif.com + require: private + version: ^1.5 + - name: idf + require: private + version: '>=5.1' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.3.3 + espressif/esp_modem: + component_hash: 475c2185273ddedff2bb0d21a8ab196a9d0ef60595f73d634edf2d8be03a5f54 + dependencies: + - name: idf + require: private + version: '>=4.1' + source: + registry_url: https://components.espressif.com/ + type: service + version: 2.0.2 + espressif/esp_rainmaker: + component_hash: 173e57d42ec3bb15e7f483964312594fe3bba7761cc135f1748538cb3951502d + dependencies: + - name: espressif/cbor + registry_url: https://components.espressif.com + require: private + version: ~0.6 + - name: espressif/esp_schedule + registry_url: https://components.espressif.com + require: private + version: ~1.3.2 + - name: espressif/esp_secure_cert_mgr + registry_url: https://components.espressif.com + require: private + version: ^2.2.1 + - name: espressif/json_generator + registry_url: https://components.espressif.com + require: private + version: ~1.1.1 + - name: espressif/json_parser + registry_url: https://components.espressif.com + require: private + version: ~1.0.3 + - name: espressif/mdns + registry_url: https://components.espressif.com + require: private + version: ^1.9.0 + - name: espressif/network_provisioning + registry_url: https://components.espressif.com + require: private + version: '>=1.*' + - name: espressif/rmaker_common + registry_url: https://components.espressif.com + require: private + version: '>=1.8.2' + - name: idf + require: private + version: '>=5.1' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.15.0 + espressif/esp_schedule: + component_hash: 52d305300abcee86034c309eb200feb2dfbc95fcbfc5b7b9dcd137763a995dbf + dependencies: + - name: espressif/esp_daylight + registry_url: https://components.espressif.com + require: private + version: ~1.0.1 + - name: idf + require: private + version: '>=5.1' + source: + registry_url: https://components.espressif.com + type: service + version: 1.3.3 + espressif/esp_secure_cert_mgr: + component_hash: 40a986c1f45d91eb6d339ca51dcab90c4ecce2a6622c268edaaa05887852d464 + dependencies: + - name: idf + require: private + version: '>=4.3' + source: + registry_url: https://components.espressif.com + type: service + version: 2.9.2 + espressif/jsmn: + component_hash: d80350c41bbaa827c98a25b6072df00884e72f54885996fab4a4f0aebce6b6c3 + dependencies: + - name: idf + require: private + version: '>=4.3' + source: + registry_url: https://components.espressif.com + type: service + version: 1.1.0 + espressif/json_generator: + component_hash: 45033e1c199b13f1c8c1b544fb7d4e2df6a8e3071ebdcb1b22582b61a7974ff2 + dependencies: [] + source: + registry_url: https://components.espressif.com + type: service + version: 1.1.2 + espressif/json_parser: + component_hash: d74b81729ad06ec11ff5eb5b1b0d7df1d00e6027fc11471f4b139c70dcf1b1e4 + dependencies: + - name: espressif/jsmn + registry_url: https://components.espressif.com + require: private + rules: + - if: idf_version >=5.0 + version: ~1.1 + source: + registry_url: https://components.espressif.com + type: service + version: 1.0.3 + espressif/libsodium: + component_hash: d4066b373fc6d4c5196db42aeea7faef4ac7f3080af96c2b74e2476c08b78dc1 + dependencies: + - name: idf + require: private + version: '>=4.2' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.0.22~1 + espressif/mdns: + component_hash: e81ca7a7f53ea34e78274df054da692c272e1315572876b237b1748e267c013b + dependencies: + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.11.3 + espressif/network_provisioning: + component_hash: ef2e10182fd1861e68b821491916327c25416ca7ae70e5a6e43313dbc71fe993 + dependencies: + - name: idf + require: private + version: '>=5.1' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.0.2 + espressif/qrcode: + component_hash: 3b493771bc5d6ad30cbf87c25bf784aada8a08c941504355b55d6b75518ed7bc + dependencies: [] + source: + registry_url: https://components.espressif.com/ + type: service + version: 0.1.0~2 + espressif/rmaker_cmd_resp: + component_hash: 343ccd5d3a2789ecb241f9de5ac7f67fc39db126c1af139116a20c9a6e3669f3 + dependencies: + - name: idf + require: private + version: '>=5.1' + source: + registry_url: https://components.espressif.com + type: service + version: 1.0.0 + espressif/rmaker_common: + component_hash: 276ee0baf9552805bf66a3e34a19cf38df6f5a7b167c47bf215b7196e03ef1fc + dependencies: + - name: espressif/mqtt + registry_url: https://components.espressif.com + require: private + rules: + - if: idf_version >=6.0.0 + version: '*' + - name: espressif/rmaker_cmd_resp + registry_url: https://components.espressif.com + require: private + version: ^1.0.0 + - name: espressif/rmaker_common_events + registry_url: https://components.espressif.com + require: private + version: ^1.0.0 + - name: espressif/rmaker_console + registry_url: https://components.espressif.com + require: private + version: ^1.0.0 + - name: espressif/rmaker_system_ctrl + registry_url: https://components.espressif.com + require: private + version: ^1.0.0 + - name: espressif/rmaker_time_sync + registry_url: https://components.espressif.com + require: private + version: ^1.0.2 + - name: espressif/rmaker_work_queue + registry_url: https://components.espressif.com + require: private + version: ^1.0.0 + - name: idf + require: private + version: '>=5.1' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.8.5 + espressif/rmaker_common_events: + component_hash: ced95feff88c368e6306ff67ff3696ac76a5273de9fe1f907a7c115d4370fe6e + dependencies: + - name: idf + require: private + version: '>=5.1' + source: + registry_url: https://components.espressif.com + type: service + version: 1.0.0 + espressif/rmaker_console: + component_hash: 24af13dad8da5ca7219203f7d6f37e888246d5adc8910ea3e018fac84492ab9b + dependencies: + - name: espressif/rmaker_system_ctrl + registry_url: https://components.espressif.com + require: private + version: ^1.0.0 + - name: espressif/rmaker_time_sync + registry_url: https://components.espressif.com + require: private + version: ^1.0.0 + - name: idf + require: private + version: '>=5.1' + source: + registry_url: https://components.espressif.com + type: service + version: 1.0.0 + espressif/rmaker_system_ctrl: + component_hash: b4208fbc7e99b30fb1d272cbd30e578327079a6495499d12fb466b6c2fc0d899 + dependencies: + - name: espressif/rmaker_common_events + registry_url: https://components.espressif.com + require: private + version: ^1.0.0 + - name: idf + require: private + version: '>=5.1' + source: + registry_url: https://components.espressif.com + type: service + version: 1.0.0 + espressif/rmaker_time_sync: + component_hash: 5797d2fcd903cad6e9142981e1d0602d7b5efa2c9197a72da8d2e05be7ef568b + dependencies: + - name: espressif/rmaker_common_events + registry_url: https://components.espressif.com + require: private + version: ^1.0.0 + - name: idf + require: private + version: '>=5.1' + source: + registry_url: https://components.espressif.com + type: service + version: 1.0.2 + espressif/rmaker_work_queue: + component_hash: 7d2a9ee4e0343eb36e1816e987dde7babe892b99873c8dc5bae15e647a0e4028 + dependencies: + - name: idf + require: private + version: '>=5.1' + source: + registry_url: https://components.espressif.com + type: service + version: 1.0.0 + idf: + source: + type: idf + version: 5.3.1 + joltwallet/littlefs: + component_hash: fab83a8a57de01b05441557d78e9d10c755413a1836af4b2762b539add0c14b1 + dependencies: + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.22.2 +direct_dependencies: +- chmorgan/esp-libhelix-mp3 +- espressif/cbor +- espressif/esp-dsp +- espressif/esp-modbus +- espressif/esp-zboss-lib +- espressif/esp-zigbee-lib +- espressif/esp_diag_data_store +- espressif/esp_diagnostics +- espressif/esp_insights +- espressif/esp_modem +- espressif/esp_rainmaker +- espressif/libsodium +- espressif/mdns +- espressif/network_provisioning +- espressif/qrcode +- espressif/rmaker_common +- idf +- joltwallet/littlefs +manifest_hash: 3a3eafd5009cfd417fbd00061e350325046e3db120f51acfac1f0d1f3f4f88d2 +target: esp32c6 +version: 2.0.0 diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/docs/wifi_shield_v1.pdf b/WiFi_SD_Shield_V1/Firmware/espc6/docs/wifi_shield_v1.pdf new file mode 100644 index 0000000..eb92df6 Binary files /dev/null and b/WiFi_SD_Shield_V1/Firmware/espc6/docs/wifi_shield_v1.pdf differ diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/main/CMakeLists.txt b/WiFi_SD_Shield_V1/Firmware/espc6/main/CMakeLists.txt new file mode 100644 index 0000000..6bdbe30 --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/main/CMakeLists.txt @@ -0,0 +1,4 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS "." + REQUIRES biogap common wifi_ap) + diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/main/main.c b/WiFi_SD_Shield_V1/Firmware/espc6/main/main.c new file mode 100644 index 0000000..e629912 --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/main/main.c @@ -0,0 +1,223 @@ +/* + * ---------------------------------------------------------------------- + * + * File: main.c + * + * Last edited: 17.07.2026 + * + * Copyright (c) 2026 ETH Zurich and University of Bologna + * + * Authors: + * - Giusy Spacone (gspacone@iis.ee.ethz.ch), ETH Zurich + * + * ---------------------------------------------------------------------- + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "esp_log.h" +#include "softap_main.h" +#include "gui_task.h" +#include "biogap.h" +#include "dummy_sensor_local.h" +#include "common.h" +#include "driver/gpio.h" +#include +#include + +#define MAIN_TAG "[main.c]" + +RingbufHandle_t biogap_ringbuf = NULL; +TaskHandle_t sd_card_task_handle = NULL; +TaskHandle_t read_from_biogap_task_nrf_master_pq_esp_slave_handle = NULL; +TaskHandle_t send_to_biogap_task_nrf_master_esp_slave_handle = NULL; +EventGroupHandle_t g_evt; +uint8_t sd_writecounter = 0; +spi_device_handle_t nrf_spi_device = NULL; +volatile node_state_t node_state = STATE_DISCONNECTED; +int64_t start_time = 0; +/** @brief Boot sequence: GPIO/SPI/WiFi bring-up, then spawn the data-plane tasks. */ +void app_main() +{ + esp_err_t ret= 0; + + // Initialize the debugging GPIO + gpio_config_t io_conf = {0}; + io_conf.pin_bit_mask = (1ULL << RTC_SCL); + io_conf.mode = GPIO_MODE_OUTPUT; + io_conf.pull_up_en = GPIO_PULLUP_ENABLE; // Enable pull-up resistor (in any case this GPIO should pulled up hihg) + io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE; + gpio_config(&io_conf); + + // set the RTC_SCL pin HIGH to enable debugging for now + gpio_set_level(RTC_SCL, 1); + + // Logging policy controlled by compile-time user flag in common.h. + #if ESP_ENABLE_INFO_LOGS + esp_log_level_set("*", ESP_LOG_INFO); + esp_log_level_set("gpio", ESP_LOG_WARN); // Keep GPIO dump lines muted even in INFO mode. + #else + esp_log_level_set("*", ESP_LOG_WARN); + #endif + + ESP_LOGI(MAIN_TAG, "Starting app_main, initializing system..."); + // Initialize Event Group and clear all bits + g_evt = xEventGroupCreate(); + xEventGroupClearBits(g_evt, B_WIFI_CONNECTED | B_BIOGAP_CONECTED | B_START_CMD_RCV | B_START_CMD_FWD_TO_BIOGAP | B_STOP_CMD_RCV_GUI | B_STOP_CMD_RCV_FORCED | B_STOP_CMD_FWD_TO_BIOGAP); + + + +#if !ESP_LOCAL_DUMMY_SENSOR + + spi_bus_mutex = xSemaphoreCreateMutex(); + if (spi_bus_mutex == NULL) { + ESP_LOGE(MAIN_TAG, "Failed to create SPI bus mutex"); + abort(); + } + + // SPI Handshake with NRF + #if defined IS_ESP_SPI_SLAVE + ESP_LOGI(MAIN_TAG, "ESP is configured as SPI SLAVE"); + // Initialize SPI GPIOs + config_spi_nrf_master_esp_slave_pins(); + ESP_LOGI(MAIN_TAG, "NRF-ESP GPIO pins configured successfully"); + // Initialize the SPI BUS + init_nrf_spi_master_esp_slave_bus(); + ESP_LOGI(MAIN_TAG, "NRF-ESP SPI bus initialized successfully"); + #endif + + while(1){ + ret = initial_handshake_nrf_master_esp_slave_pq(); + if (ret == 0) { + ESP_LOGI(MAIN_TAG, "Initial handshake with NRF master successful"); + current_spi_mode = SPI_MODE_NRF; + break; + } else { + ESP_LOGE(MAIN_TAG, "Initial handshake failed, retrying in 1 second: %s", esp_err_to_name(ret)); + vTaskDelay(pdMS_TO_TICKS(1000)); + } + } +#endif + + // Wi-Fi Initialization + //ESP_LOGI(MAIN_TAG, "Before init Wifi free heap: %d, free DMA: %d", heap_caps_get_free_size(MALLOC_CAP_INTERNAL), heap_caps_get_free_size(MALLOC_CAP_DMA)); + + vTaskDelay(pdMS_TO_TICKS(1000)); + if (wifi_init_softap() != ESP_OK) { + ESP_LOGE(MAIN_TAG, "Failed to initialize WiFi"); + abort(); + } + ESP_LOGI(MAIN_TAG, "After init Wifi free heap: %d, free DMA: %d", heap_caps_get_free_size(MALLOC_CAP_INTERNAL), heap_caps_get_free_size(MALLOC_CAP_DMA)); + + xEventGroupSetBits(g_evt, B_WIFI_CONNECTED); + +#if ESP_LOCAL_DUMMY_SENSOR + // ESP-only dummy sensor test: bypasses SPI/BIOGAP entirely. Generates synthetic + // dummy-sensor packets locally and streams them to BioGUI over the TCP connection, + // to test the WiFi/GUI half of the system without any nRF/SPI hardware attached. + biogap_ringbuf = xRingbufferCreate(RINGBUFF_SIZE, RINGBUF_TYPE_NOSPLIT); + if (biogap_ringbuf == NULL) { + ESP_LOGE(MAIN_TAG, "Failed to allocate memory for the BIOGAP ringbuffer"); + abort(); + } + ESP_LOGI(MAIN_TAG, "BIOGAP ringbuffer created with size %d bytes", RINGBUFF_SIZE); + + ret = bind_to_gui(); + if (ret != ESP_OK) { + ESP_LOGE(MAIN_TAG, "Failed to bind to GUI"); + abort(); + } + xEventGroupSetBits(g_evt, B_GUI_SOCKET_BIND); + node_state = STATE_IDLE; + ESP_LOGI(MAIN_TAG, "WiFi initialized and bound to GUI successfully (local dummy sensor mode)"); + + BaseType_t xr = xTaskCreate(rx_from_gui, "rx_from_gui", 4096, NULL, 3, NULL); + if (xr != pdPASS) { + ESP_LOGE(MAIN_TAG, "Failed to create rx_from_gui task (err=%d)", xr); + } else { + ESP_LOGI(MAIN_TAG, "Created rx_from_gui task"); + } + + xr = xTaskCreate(tx_to_gui, "tx_to_gui", 4096, NULL, 3, NULL); + if (xr != pdPASS) { + ESP_LOGE(MAIN_TAG, "Failed to create tx_to_gui task (err=%d)", xr); + } else { + ESP_LOGI(MAIN_TAG, "Created tx_to_gui task"); + } + + xr = xTaskCreate(dummy_sensor_local_task, "dummy_sensor_local", 4096, NULL, 2, NULL); + if (xr != pdPASS) { + ESP_LOGE(MAIN_TAG, "Failed to create dummy_sensor_local task (err=%d)", xr); + } else { + ESP_LOGI(MAIN_TAG, "Created dummy_sensor_local task"); + } +#else + + // Create the RingBuffer to allocate incoming data. + biogap_ringbuf = xRingbufferCreate(RINGBUFF_SIZE, RINGBUF_TYPE_NOSPLIT); + if (biogap_ringbuf == NULL){ + ESP_LOGE(MAIN_TAG, "Failed to allocate Memory for the BIOGAP ringbuffer"); + abort(); + } + ESP_LOGI(MAIN_TAG, "BIOGAP Ringbuffer created with size %d bytes", RINGBUFF_SIZE); + + + // Bind to the GUI socket. + ret = bind_to_gui(); + if (ret != ESP_OK) { + ESP_LOGE(MAIN_TAG, "Failed to bind to GUI"); + abort(); + } + + xEventGroupSetBits(g_evt, B_GUI_SOCKET_BIND); + node_state = STATE_IDLE; + ESP_LOGI(MAIN_TAG, "WiFi initialized and bound to GUI successfully"); + + // ========================== START ALL THE TASKS ============================= + + BaseType_t xr = xTaskCreate(read_from_biogap_task_nrf_master_esp_slave_prequeue, "read_biogap_task_nrf_master", 4096, NULL, 1, &read_from_biogap_task_nrf_master_pq_esp_slave_handle); + if (xr != pdPASS) { + ESP_LOGE(MAIN_TAG, "Failed to create read_from_biogap task (err=%d)", xr); + } else { + ESP_LOGI(MAIN_TAG, "Created read_from_biogap task"); + } + + xr = xTaskCreate(send_to_biogap_task_nrf_master_esp_slave, "send_to_biogap_task_nrf_master", 4096, NULL, 2, &send_to_biogap_task_nrf_master_esp_slave_handle); + if (xr != pdPASS) { + ESP_LOGE(MAIN_TAG, "Failed to create send_to_biogap task (err=%d)", xr); + } else { + ESP_LOGI(MAIN_TAG, "Created send_to_biogap task"); + } + xr = xTaskCreate(rx_from_gui, "rx_from_gui", 4096, NULL, 3, NULL); + if (xr != pdPASS) { + ESP_LOGE(MAIN_TAG, "Failed to create rx_from_gui task (err=%d)", xr); + } else { + ESP_LOGI(MAIN_TAG, "Created rx_from_gui task"); + } + + xr = xTaskCreate(tx_to_gui, "tx_to_gui", 4096, NULL, 3, NULL); + if (xr != pdPASS) { + ESP_LOGE(MAIN_TAG, "Failed to create tx_to_gui task (err=%d)", xr); + } else { + ESP_LOGI(MAIN_TAG, "Created tx_to_gui task"); + } +#endif + // Main Thread can now sleep and let the tasks do the work. + + while(1) { + vTaskDelay(pdMS_TO_TICKS(1000)); + } +} + + diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/sdkconfig b/WiFi_SD_Shield_V1/Firmware/espc6/sdkconfig new file mode 100644 index 0000000..468cd6b --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/sdkconfig @@ -0,0 +1,2121 @@ +# +# Automatically generated file. DO NOT EDIT. +# Espressif IoT Development Framework (ESP-IDF) 5.3.1 Project Configuration +# +CONFIG_SOC_ADC_SUPPORTED=y +CONFIG_SOC_DEDICATED_GPIO_SUPPORTED=y +CONFIG_SOC_UART_SUPPORTED=y +CONFIG_SOC_GDMA_SUPPORTED=y +CONFIG_SOC_AHB_GDMA_SUPPORTED=y +CONFIG_SOC_GPTIMER_SUPPORTED=y +CONFIG_SOC_PCNT_SUPPORTED=y +CONFIG_SOC_MCPWM_SUPPORTED=y +CONFIG_SOC_TWAI_SUPPORTED=y +CONFIG_SOC_ETM_SUPPORTED=y +CONFIG_SOC_PARLIO_SUPPORTED=y +CONFIG_SOC_BT_SUPPORTED=y +CONFIG_SOC_IEEE802154_SUPPORTED=y +CONFIG_SOC_ASYNC_MEMCPY_SUPPORTED=y +CONFIG_SOC_USB_SERIAL_JTAG_SUPPORTED=y +CONFIG_SOC_TEMP_SENSOR_SUPPORTED=y +CONFIG_SOC_PHY_SUPPORTED=y +CONFIG_SOC_WIFI_SUPPORTED=y +CONFIG_SOC_SUPPORTS_SECURE_DL_MODE=y +CONFIG_SOC_ULP_SUPPORTED=y +CONFIG_SOC_LP_CORE_SUPPORTED=y +CONFIG_SOC_EFUSE_KEY_PURPOSE_FIELD=y +CONFIG_SOC_EFUSE_SUPPORTED=y +CONFIG_SOC_RTC_FAST_MEM_SUPPORTED=y +CONFIG_SOC_RTC_MEM_SUPPORTED=y +CONFIG_SOC_I2S_SUPPORTED=y +CONFIG_SOC_RMT_SUPPORTED=y +CONFIG_SOC_SDM_SUPPORTED=y +CONFIG_SOC_GPSPI_SUPPORTED=y +CONFIG_SOC_LEDC_SUPPORTED=y +CONFIG_SOC_I2C_SUPPORTED=y +CONFIG_SOC_SYSTIMER_SUPPORTED=y +CONFIG_SOC_SUPPORT_COEXISTENCE=y +CONFIG_SOC_AES_SUPPORTED=y +CONFIG_SOC_MPI_SUPPORTED=y +CONFIG_SOC_SHA_SUPPORTED=y +CONFIG_SOC_HMAC_SUPPORTED=y +CONFIG_SOC_DIG_SIGN_SUPPORTED=y +CONFIG_SOC_ECC_SUPPORTED=y +CONFIG_SOC_FLASH_ENC_SUPPORTED=y +CONFIG_SOC_SECURE_BOOT_SUPPORTED=y +CONFIG_SOC_SDIO_SLAVE_SUPPORTED=y +CONFIG_SOC_BOD_SUPPORTED=y +CONFIG_SOC_APM_SUPPORTED=y +CONFIG_SOC_APM_CTRL_FILTER_SUPPORTED=y +CONFIG_SOC_PMU_SUPPORTED=y +CONFIG_SOC_PAU_SUPPORTED=y +CONFIG_SOC_LP_TIMER_SUPPORTED=y +CONFIG_SOC_LP_AON_SUPPORTED=y +CONFIG_SOC_LP_PERIPHERALS_SUPPORTED=y +CONFIG_SOC_LP_I2C_SUPPORTED=y +CONFIG_SOC_ULP_LP_UART_SUPPORTED=y +CONFIG_SOC_CLK_TREE_SUPPORTED=y +CONFIG_SOC_ASSIST_DEBUG_SUPPORTED=y +CONFIG_SOC_WDT_SUPPORTED=y +CONFIG_SOC_SPI_FLASH_SUPPORTED=y +CONFIG_SOC_RNG_SUPPORTED=y +CONFIG_SOC_LIGHT_SLEEP_SUPPORTED=y +CONFIG_SOC_DEEP_SLEEP_SUPPORTED=y +CONFIG_SOC_MODEM_CLOCK_SUPPORTED=y +CONFIG_SOC_PM_SUPPORTED=y +CONFIG_SOC_XTAL_SUPPORT_40M=y +CONFIG_SOC_AES_SUPPORT_DMA=y +CONFIG_SOC_AES_GDMA=y +CONFIG_SOC_AES_SUPPORT_AES_128=y +CONFIG_SOC_AES_SUPPORT_AES_256=y +CONFIG_SOC_ADC_DIG_CTRL_SUPPORTED=y +CONFIG_SOC_ADC_DIG_IIR_FILTER_SUPPORTED=y +CONFIG_SOC_ADC_MONITOR_SUPPORTED=y +CONFIG_SOC_ADC_DMA_SUPPORTED=y +CONFIG_SOC_ADC_PERIPH_NUM=1 +CONFIG_SOC_ADC_MAX_CHANNEL_NUM=7 +CONFIG_SOC_ADC_ATTEN_NUM=4 +CONFIG_SOC_ADC_DIGI_CONTROLLER_NUM=1 +CONFIG_SOC_ADC_PATT_LEN_MAX=8 +CONFIG_SOC_ADC_DIGI_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_DIGI_MIN_BITWIDTH=12 +CONFIG_SOC_ADC_DIGI_IIR_FILTER_NUM=2 +CONFIG_SOC_ADC_DIGI_MONITOR_NUM=2 +CONFIG_SOC_ADC_DIGI_RESULT_BYTES=4 +CONFIG_SOC_ADC_DIGI_DATA_BYTES_PER_CONV=4 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH=83333 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW=611 +CONFIG_SOC_ADC_RTC_MIN_BITWIDTH=12 +CONFIG_SOC_ADC_RTC_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_CALIBRATION_V1_SUPPORTED=y +CONFIG_SOC_ADC_SELF_HW_CALI_SUPPORTED=y +CONFIG_SOC_ADC_CALIB_CHAN_COMPENS_SUPPORTED=y +CONFIG_SOC_ADC_TEMPERATURE_SHARE_INTR=y +CONFIG_SOC_ADC_SHARED_POWER=y +CONFIG_SOC_BROWNOUT_RESET_SUPPORTED=y +CONFIG_SOC_SHARED_IDCACHE_SUPPORTED=y +CONFIG_SOC_CACHE_FREEZE_SUPPORTED=y +CONFIG_SOC_CPU_CORES_NUM=1 +CONFIG_SOC_CPU_INTR_NUM=32 +CONFIG_SOC_CPU_HAS_FLEXIBLE_INTC=y +CONFIG_SOC_INT_PLIC_SUPPORTED=y +CONFIG_SOC_CPU_HAS_CSR_PC=y +CONFIG_SOC_CPU_BREAKPOINTS_NUM=4 +CONFIG_SOC_CPU_WATCHPOINTS_NUM=4 +CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE=0x80000000 +CONFIG_SOC_CPU_HAS_PMA=y +CONFIG_SOC_CPU_IDRAM_SPLIT_USING_PMP=y +CONFIG_SOC_DS_SIGNATURE_MAX_BIT_LEN=3072 +CONFIG_SOC_DS_KEY_PARAM_MD_IV_LENGTH=16 +CONFIG_SOC_DS_KEY_CHECK_MAX_WAIT_US=1100 +CONFIG_SOC_AHB_GDMA_VERSION=1 +CONFIG_SOC_GDMA_NUM_GROUPS_MAX=1 +CONFIG_SOC_GDMA_PAIRS_PER_GROUP_MAX=3 +CONFIG_SOC_GDMA_SUPPORT_ETM=y +CONFIG_SOC_GDMA_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_ETM_GROUPS=1 +CONFIG_SOC_ETM_CHANNELS_PER_GROUP=50 +CONFIG_SOC_GPIO_PORT=1 +CONFIG_SOC_GPIO_PIN_COUNT=31 +CONFIG_SOC_GPIO_SUPPORT_PIN_GLITCH_FILTER=y +CONFIG_SOC_GPIO_FLEX_GLITCH_FILTER_NUM=8 +CONFIG_SOC_GPIO_SUPPORT_ETM=y +CONFIG_SOC_GPIO_SUPPORT_RTC_INDEPENDENT=y +CONFIG_SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP=y +CONFIG_SOC_LP_IO_CLOCK_IS_INDEPENDENT=y +CONFIG_SOC_GPIO_IN_RANGE_MAX=30 +CONFIG_SOC_GPIO_OUT_RANGE_MAX=30 +CONFIG_SOC_GPIO_DEEP_SLEEP_WAKE_VALID_GPIO_MASK=0 +CONFIG_SOC_GPIO_DEEP_SLEEP_WAKE_SUPPORTED_PIN_CNT=8 +CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0x000000007FFFFF00 +CONFIG_SOC_GPIO_SUPPORT_FORCE_HOLD=y +CONFIG_SOC_GPIO_SUPPORT_HOLD_SINGLE_IO_IN_DSLP=y +CONFIG_SOC_GPIO_CLOCKOUT_BY_GPIO_MATRIX=y +CONFIG_SOC_CLOCKOUT_HAS_SOURCE_GATE=y +CONFIG_SOC_GPIO_CLOCKOUT_CHANNEL_NUM=3 +CONFIG_SOC_RTCIO_PIN_COUNT=8 +CONFIG_SOC_RTCIO_INPUT_OUTPUT_SUPPORTED=y +CONFIG_SOC_RTCIO_HOLD_SUPPORTED=y +CONFIG_SOC_RTCIO_WAKE_SUPPORTED=y +CONFIG_SOC_RTCIO_VALID_RTCIO_MASK=0xFF +CONFIG_SOC_DEDIC_GPIO_OUT_CHANNELS_NUM=8 +CONFIG_SOC_DEDIC_GPIO_IN_CHANNELS_NUM=8 +CONFIG_SOC_DEDIC_PERIPH_ALWAYS_ENABLE=y +CONFIG_SOC_I2C_NUM=2 +CONFIG_SOC_HP_I2C_NUM=1 +CONFIG_SOC_I2C_FIFO_LEN=32 +CONFIG_SOC_I2C_CMD_REG_NUM=8 +CONFIG_SOC_I2C_SUPPORT_SLAVE=y +CONFIG_SOC_I2C_SUPPORT_HW_FSM_RST=y +CONFIG_SOC_I2C_SUPPORT_HW_CLR_BUS=y +CONFIG_SOC_I2C_SUPPORT_XTAL=y +CONFIG_SOC_I2C_SUPPORT_RTC=y +CONFIG_SOC_I2C_SUPPORT_10BIT_ADDR=y +CONFIG_SOC_I2C_SLAVE_SUPPORT_BROADCAST=y +CONFIG_SOC_I2C_SLAVE_CAN_GET_STRETCH_CAUSE=y +CONFIG_SOC_I2C_SLAVE_SUPPORT_I2CRAM_ACCESS=y +CONFIG_SOC_I2C_SLAVE_SUPPORT_SLAVE_UNMATCH=y +CONFIG_SOC_I2C_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_LP_I2C_NUM=1 +CONFIG_SOC_LP_I2C_FIFO_LEN=16 +CONFIG_SOC_I2S_NUM=1 +CONFIG_SOC_I2S_HW_VERSION_2=y +CONFIG_SOC_I2S_SUPPORTS_XTAL=y +CONFIG_SOC_I2S_SUPPORTS_PLL_F160M=y +CONFIG_SOC_I2S_SUPPORTS_PCM=y +CONFIG_SOC_I2S_SUPPORTS_PDM=y +CONFIG_SOC_I2S_SUPPORTS_PDM_TX=y +CONFIG_SOC_I2S_PDM_MAX_TX_LINES=2 +CONFIG_SOC_I2S_SUPPORTS_TDM=y +CONFIG_SOC_LEDC_SUPPORT_PLL_DIV_CLOCK=y +CONFIG_SOC_LEDC_SUPPORT_XTAL_CLOCK=y +CONFIG_SOC_LEDC_CHANNEL_NUM=6 +CONFIG_SOC_LEDC_TIMER_BIT_WIDTH=20 +CONFIG_SOC_LEDC_SUPPORT_FADE_STOP=y +CONFIG_SOC_LEDC_GAMMA_CURVE_FADE_SUPPORTED=y +CONFIG_SOC_LEDC_GAMMA_CURVE_FADE_RANGE_MAX=16 +CONFIG_SOC_LEDC_FADE_PARAMS_BIT_WIDTH=10 +CONFIG_SOC_MMU_PAGE_SIZE_CONFIGURABLE=y +CONFIG_SOC_MMU_PERIPH_NUM=1 +CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=1 +CONFIG_SOC_MMU_DI_VADDR_SHARED=y +CONFIG_SOC_MPU_MIN_REGION_SIZE=0x20000000 +CONFIG_SOC_MPU_REGIONS_MAX_NUM=8 +CONFIG_SOC_PCNT_GROUPS=1 +CONFIG_SOC_PCNT_UNITS_PER_GROUP=4 +CONFIG_SOC_PCNT_CHANNELS_PER_UNIT=2 +CONFIG_SOC_PCNT_THRES_POINT_PER_UNIT=2 +CONFIG_SOC_PCNT_SUPPORT_RUNTIME_THRES_UPDATE=y +CONFIG_SOC_RMT_GROUPS=1 +CONFIG_SOC_RMT_TX_CANDIDATES_PER_GROUP=2 +CONFIG_SOC_RMT_RX_CANDIDATES_PER_GROUP=2 +CONFIG_SOC_RMT_CHANNELS_PER_GROUP=4 +CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL=48 +CONFIG_SOC_RMT_SUPPORT_RX_PINGPONG=y +CONFIG_SOC_RMT_SUPPORT_RX_DEMODULATION=y +CONFIG_SOC_RMT_SUPPORT_TX_ASYNC_STOP=y +CONFIG_SOC_RMT_SUPPORT_TX_LOOP_COUNT=y +CONFIG_SOC_RMT_SUPPORT_TX_LOOP_AUTO_STOP=y +CONFIG_SOC_RMT_SUPPORT_TX_SYNCHRO=y +CONFIG_SOC_RMT_SUPPORT_TX_CARRIER_DATA_ONLY=y +CONFIG_SOC_RMT_SUPPORT_XTAL=y +CONFIG_SOC_RMT_SUPPORT_RC_FAST=y +CONFIG_SOC_MCPWM_GROUPS=1 +CONFIG_SOC_MCPWM_TIMERS_PER_GROUP=3 +CONFIG_SOC_MCPWM_OPERATORS_PER_GROUP=3 +CONFIG_SOC_MCPWM_COMPARATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GENERATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_TRIGGERS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GPIO_FAULTS_PER_GROUP=3 +CONFIG_SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP=y +CONFIG_SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER=3 +CONFIG_SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP=3 +CONFIG_SOC_MCPWM_SWSYNC_CAN_PROPAGATE=y +CONFIG_SOC_MCPWM_SUPPORT_ETM=y +CONFIG_SOC_MCPWM_CAPTURE_CLK_FROM_GROUP=y +CONFIG_SOC_PARLIO_GROUPS=1 +CONFIG_SOC_PARLIO_TX_UNITS_PER_GROUP=1 +CONFIG_SOC_PARLIO_RX_UNITS_PER_GROUP=1 +CONFIG_SOC_PARLIO_TX_UNIT_MAX_DATA_WIDTH=16 +CONFIG_SOC_PARLIO_RX_UNIT_MAX_DATA_WIDTH=16 +CONFIG_SOC_PARLIO_TX_RX_SHARE_INTERRUPT=y +CONFIG_SOC_MPI_MEM_BLOCKS_NUM=4 +CONFIG_SOC_MPI_OPERATIONS_NUM=3 +CONFIG_SOC_RSA_MAX_BIT_LEN=3072 +CONFIG_SOC_SHA_DMA_MAX_BUFFER_SIZE=3968 +CONFIG_SOC_SHA_SUPPORT_DMA=y +CONFIG_SOC_SHA_SUPPORT_RESUME=y +CONFIG_SOC_SHA_GDMA=y +CONFIG_SOC_SHA_SUPPORT_SHA1=y +CONFIG_SOC_SHA_SUPPORT_SHA224=y +CONFIG_SOC_SHA_SUPPORT_SHA256=y +CONFIG_SOC_SDM_GROUPS=1 +CONFIG_SOC_SDM_CHANNELS_PER_GROUP=4 +CONFIG_SOC_SDM_CLK_SUPPORT_PLL_F80M=y +CONFIG_SOC_SDM_CLK_SUPPORT_XTAL=y +CONFIG_SOC_SPI_PERIPH_NUM=2 +CONFIG_SOC_SPI_MAX_CS_NUM=6 +CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE=64 +CONFIG_SOC_SPI_SUPPORT_DDRCLK=y +CONFIG_SOC_SPI_SLAVE_SUPPORT_SEG_TRANS=y +CONFIG_SOC_SPI_SUPPORT_CD_SIG=y +CONFIG_SOC_SPI_SUPPORT_CONTINUOUS_TRANS=y +CONFIG_SOC_SPI_SUPPORT_SLAVE_HD_VER2=y +CONFIG_SOC_SPI_SUPPORT_CLK_XTAL=y +CONFIG_SOC_SPI_SUPPORT_CLK_PLL_F80M=y +CONFIG_SOC_SPI_SUPPORT_CLK_RC_FAST=y +CONFIG_SOC_SPI_SCT_SUPPORTED=y +CONFIG_SOC_SPI_SCT_REG_NUM=14 +CONFIG_SOC_SPI_SCT_BUFFER_NUM_MAX=y +CONFIG_SOC_SPI_SCT_CONF_BITLEN_MAX=0x3FFFA +CONFIG_SOC_MEMSPI_IS_INDEPENDENT=y +CONFIG_SOC_SPI_MAX_PRE_DIVIDER=16 +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_WAIT_IDLE=y +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_SUSPEND=y +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_RESUME=y +CONFIG_SOC_SPI_MEM_SUPPORT_IDLE_INTR=y +CONFIG_SOC_SPI_MEM_SUPPORT_SW_SUSPEND=y +CONFIG_SOC_SPI_MEM_SUPPORT_CHECK_SUS=y +CONFIG_SOC_SPI_MEM_SUPPORT_WRAP=y +CONFIG_SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED=y +CONFIG_SOC_SYSTIMER_COUNTER_NUM=2 +CONFIG_SOC_SYSTIMER_ALARM_NUM=3 +CONFIG_SOC_SYSTIMER_BIT_WIDTH_LO=32 +CONFIG_SOC_SYSTIMER_BIT_WIDTH_HI=20 +CONFIG_SOC_SYSTIMER_FIXED_DIVIDER=y +CONFIG_SOC_SYSTIMER_SUPPORT_RC_FAST=y +CONFIG_SOC_SYSTIMER_INT_LEVEL=y +CONFIG_SOC_SYSTIMER_ALARM_MISS_COMPENSATE=y +CONFIG_SOC_SYSTIMER_SUPPORT_ETM=y +CONFIG_SOC_LP_TIMER_BIT_WIDTH_LO=32 +CONFIG_SOC_LP_TIMER_BIT_WIDTH_HI=16 +CONFIG_SOC_TIMER_GROUPS=2 +CONFIG_SOC_TIMER_GROUP_TIMERS_PER_GROUP=1 +CONFIG_SOC_TIMER_GROUP_COUNTER_BIT_WIDTH=54 +CONFIG_SOC_TIMER_GROUP_SUPPORT_XTAL=y +CONFIG_SOC_TIMER_GROUP_SUPPORT_RC_FAST=y +CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS=2 +CONFIG_SOC_TIMER_SUPPORT_ETM=y +CONFIG_SOC_TIMER_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_MWDT_SUPPORT_XTAL=y +CONFIG_SOC_TWAI_CONTROLLER_NUM=2 +CONFIG_SOC_TWAI_CLK_SUPPORT_XTAL=y +CONFIG_SOC_TWAI_BRP_MIN=2 +CONFIG_SOC_TWAI_BRP_MAX=32768 +CONFIG_SOC_TWAI_SUPPORTS_RX_STATUS=y +CONFIG_SOC_EFUSE_DIS_DOWNLOAD_ICACHE=y +CONFIG_SOC_EFUSE_DIS_PAD_JTAG=y +CONFIG_SOC_EFUSE_DIS_USB_JTAG=y +CONFIG_SOC_EFUSE_DIS_DIRECT_BOOT=y +CONFIG_SOC_EFUSE_SOFT_DIS_JTAG=y +CONFIG_SOC_EFUSE_DIS_ICACHE=y +CONFIG_SOC_EFUSE_BLOCK9_KEY_PURPOSE_QUIRK=y +CONFIG_SOC_SECURE_BOOT_V2_RSA=y +CONFIG_SOC_SECURE_BOOT_V2_ECC=y +CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS=3 +CONFIG_SOC_EFUSE_REVOKE_BOOT_KEY_DIGESTS=y +CONFIG_SOC_SUPPORT_SECURE_BOOT_REVOKE_KEY=y +CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX=64 +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES=y +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_128=y +CONFIG_SOC_CRYPTO_DPA_PROTECTION_SUPPORTED=y +CONFIG_SOC_UART_NUM=3 +CONFIG_SOC_UART_HP_NUM=2 +CONFIG_SOC_UART_LP_NUM=1 +CONFIG_SOC_UART_FIFO_LEN=128 +CONFIG_SOC_LP_UART_FIFO_LEN=16 +CONFIG_SOC_UART_BITRATE_MAX=5000000 +CONFIG_SOC_UART_SUPPORT_PLL_F80M_CLK=y +CONFIG_SOC_UART_SUPPORT_RTC_CLK=y +CONFIG_SOC_UART_SUPPORT_XTAL_CLK=y +CONFIG_SOC_UART_SUPPORT_WAKEUP_INT=y +CONFIG_SOC_UART_HAS_LP_UART=y +CONFIG_SOC_UART_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_UART_SUPPORT_FSM_TX_WAIT_SEND=y +CONFIG_SOC_COEX_HW_PTI=y +CONFIG_SOC_EXTERNAL_COEX_ADVANCE=y +CONFIG_SOC_PHY_DIG_REGS_MEM_SIZE=21 +CONFIG_SOC_WIFI_LIGHT_SLEEP_CLK_WIDTH=12 +CONFIG_SOC_PM_SUPPORT_WIFI_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_BEACON_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_BT_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP_MODE_PER_PIN=y +CONFIG_SOC_PM_SUPPORT_CPU_PD=y +CONFIG_SOC_PM_SUPPORT_MODEM_PD=y +CONFIG_SOC_PM_SUPPORT_XTAL32K_PD=y +CONFIG_SOC_PM_SUPPORT_RC32K_PD=y +CONFIG_SOC_PM_SUPPORT_RC_FAST_PD=y +CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD=y +CONFIG_SOC_PM_SUPPORT_TOP_PD=y +CONFIG_SOC_PM_SUPPORT_HP_AON_PD=y +CONFIG_SOC_PM_SUPPORT_MAC_BB_PD=y +CONFIG_SOC_PM_SUPPORT_RTC_PERIPH_PD=y +CONFIG_SOC_PM_SUPPORT_PMU_MODEM_STATE=y +CONFIG_SOC_PM_SUPPORT_DEEPSLEEP_CHECK_STUB_ONLY=y +CONFIG_SOC_PM_CPU_RETENTION_BY_SW=y +CONFIG_SOC_PM_MODEM_RETENTION_BY_REGDMA=y +CONFIG_SOC_PM_RETENTION_HAS_CLOCK_BUG=y +CONFIG_SOC_PM_PAU_LINK_NUM=4 +CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION=y +CONFIG_SOC_MODEM_CLOCK_IS_INDEPENDENT=y +CONFIG_SOC_CLK_XTAL32K_SUPPORTED=y +CONFIG_SOC_CLK_OSC_SLOW_SUPPORTED=y +CONFIG_SOC_CLK_RC32K_SUPPORTED=y +CONFIG_SOC_RCC_IS_INDEPENDENT=y +CONFIG_SOC_TEMPERATURE_SENSOR_SUPPORT_FAST_RC=y +CONFIG_SOC_TEMPERATURE_SENSOR_SUPPORT_XTAL=y +CONFIG_SOC_TEMPERATURE_SENSOR_INTR_SUPPORT=y +CONFIG_SOC_TEMPERATURE_SENSOR_SUPPORT_ETM=y +CONFIG_SOC_RNG_CLOCK_IS_INDEPENDENT=y +CONFIG_SOC_WIFI_HW_TSF=y +CONFIG_SOC_WIFI_FTM_SUPPORT=y +CONFIG_SOC_WIFI_GCMP_SUPPORT=y +CONFIG_SOC_WIFI_WAPI_SUPPORT=y +CONFIG_SOC_WIFI_CSI_SUPPORT=y +CONFIG_SOC_WIFI_MESH_SUPPORT=y +CONFIG_SOC_WIFI_HE_SUPPORT=y +CONFIG_SOC_BLE_SUPPORTED=y +CONFIG_SOC_BLE_MESH_SUPPORTED=y +CONFIG_SOC_ESP_NIMBLE_CONTROLLER=y +CONFIG_SOC_BLE_50_SUPPORTED=y +CONFIG_SOC_BLE_DEVICE_PRIVACY_SUPPORTED=y +CONFIG_SOC_BLE_POWER_CONTROL_SUPPORTED=y +CONFIG_SOC_BLE_PERIODIC_ADV_ENH_SUPPORTED=y +CONFIG_SOC_BLUFI_SUPPORTED=y +CONFIG_SOC_BLE_MULTI_CONN_OPTIMIZATION=y +CONFIG_SOC_BLE_USE_WIFI_PWR_CLK_WORKAROUND=y +CONFIG_SOC_PHY_COMBO_MODULE=y +CONFIG_SOC_CAPS_NO_RESET_BY_ANA_BOD=y +CONFIG_SOC_LP_CORE_SINGLE_INTERRUPT_VECTOR=y +CONFIG_SOC_LP_CORE_SUPPORT_ETM=y +CONFIG_IDF_CMAKE=y +CONFIG_IDF_TOOLCHAIN="gcc" +CONFIG_IDF_TARGET_ARCH_RISCV=y +CONFIG_IDF_TARGET_ARCH="riscv" +CONFIG_IDF_TARGET="esp32c6" +CONFIG_IDF_INIT_VERSION="5.3.1" +CONFIG_IDF_TARGET_ESP32C6=y +CONFIG_IDF_FIRMWARE_CHIP_ID=0x000D + +# +# Build type +# +CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y +# CONFIG_APP_BUILD_TYPE_RAM is not set +CONFIG_APP_BUILD_GENERATE_BINARIES=y +CONFIG_APP_BUILD_BOOTLOADER=y +CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y +# CONFIG_APP_REPRODUCIBLE_BUILD is not set +# CONFIG_APP_NO_BLOBS is not set +# end of Build type + +# +# Bootloader config +# + +# +# Bootloader manager +# +CONFIG_BOOTLOADER_COMPILE_TIME_DATE=y +CONFIG_BOOTLOADER_PROJECT_VER=1 +# end of Bootloader manager + +CONFIG_BOOTLOADER_OFFSET_IN_FLASH=0x0 +CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set +CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y +# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set +CONFIG_BOOTLOADER_LOG_LEVEL=3 + +# +# Serial Flash Configurations +# +# CONFIG_BOOTLOADER_FLASH_DC_AWARE is not set +CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y +# end of Serial Flash Configurations + +# CONFIG_BOOTLOADER_FACTORY_RESET is not set +# CONFIG_BOOTLOADER_APP_TEST is not set +CONFIG_BOOTLOADER_REGION_PROTECTION_ENABLE=y +CONFIG_BOOTLOADER_WDT_ENABLE=y +# CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE is not set +CONFIG_BOOTLOADER_WDT_TIME_MS=9000 +# CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set +CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0 +# CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set +# end of Bootloader config + +# +# Security features +# +CONFIG_SECURE_BOOT_V2_RSA_SUPPORTED=y +CONFIG_SECURE_BOOT_V2_ECC_SUPPORTED=y +CONFIG_SECURE_BOOT_V2_PREFERRED=y +# CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set +# CONFIG_SECURE_BOOT is not set +# CONFIG_SECURE_FLASH_ENC_ENABLED is not set +CONFIG_SECURE_ROM_DL_MODE_ENABLED=y +# end of Security features + +# +# Application manager +# +CONFIG_APP_COMPILE_TIME_DATE=y +# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set +# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set +# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set +CONFIG_APP_RETRIEVE_LEN_ELF_SHA=9 +# end of Application manager + +CONFIG_ESP_ROM_HAS_CRC_LE=y +CONFIG_ESP_ROM_HAS_CRC_BE=y +CONFIG_ESP_ROM_HAS_JPEG_DECODE=y +CONFIG_ESP_ROM_UART_CLK_IS_XTAL=y +CONFIG_ESP_ROM_USB_SERIAL_DEVICE_NUM=3 +CONFIG_ESP_ROM_HAS_RETARGETABLE_LOCKING=y +CONFIG_ESP_ROM_GET_CLK_FREQ=y +CONFIG_ESP_ROM_HAS_RVFPLIB=y +CONFIG_ESP_ROM_HAS_HAL_WDT=y +CONFIG_ESP_ROM_HAS_HAL_SYSTIMER=y +CONFIG_ESP_ROM_HAS_HEAP_TLSF=y +CONFIG_ESP_ROM_TLSF_CHECK_PATCH=y +CONFIG_ESP_ROM_MULTI_HEAP_WALK_PATCH=y +CONFIG_ESP_ROM_HAS_LAYOUT_TABLE=y +CONFIG_ESP_ROM_HAS_SPI_FLASH=y +CONFIG_ESP_ROM_HAS_REGI2C_BUG=y +CONFIG_ESP_ROM_HAS_NEWLIB=y +CONFIG_ESP_ROM_HAS_NEWLIB_NORMAL_FORMAT=y +CONFIG_ESP_ROM_REV0_HAS_NO_ECDSA_INTERFACE=y +CONFIG_ESP_ROM_WDT_INIT_PATCH=y +CONFIG_ESP_ROM_NEEDS_SET_CACHE_MMU_SIZE=y +CONFIG_ESP_ROM_RAM_APP_NEEDS_MMU_INIT=y +CONFIG_ESP_ROM_HAS_SW_FLOAT=y +CONFIG_ESP_ROM_USB_OTG_NUM=-1 +CONFIG_ESP_ROM_HAS_VERSION=y +CONFIG_ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB=y + +# +# Boot ROM Behavior +# +CONFIG_BOOT_ROM_LOG_ALWAYS_ON=y +# CONFIG_BOOT_ROM_LOG_ALWAYS_OFF is not set +# CONFIG_BOOT_ROM_LOG_ON_GPIO_HIGH is not set +# CONFIG_BOOT_ROM_LOG_ON_GPIO_LOW is not set +# end of Boot ROM Behavior + +# +# Serial flasher config +# +# CONFIG_ESPTOOLPY_NO_STUB is not set +# CONFIG_ESPTOOLPY_FLASHMODE_QIO is not set +# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set +CONFIG_ESPTOOLPY_FLASHMODE_DIO=y +# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set +CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_STR=y +CONFIG_ESPTOOLPY_FLASHMODE="dio" +CONFIG_ESPTOOLPY_FLASHFREQ_80M=y +# CONFIG_ESPTOOLPY_FLASHFREQ_40M is not set +# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set +CONFIG_ESPTOOLPY_FLASHFREQ_80M_DEFAULT=y +CONFIG_ESPTOOLPY_FLASHFREQ="80m" +# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE_2MB=y +# CONFIG_ESPTOOLPY_FLASHSIZE_4MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE="2MB" +# CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE is not set +CONFIG_ESPTOOLPY_BEFORE_RESET=y +# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set +CONFIG_ESPTOOLPY_BEFORE="default_reset" +CONFIG_ESPTOOLPY_AFTER_RESET=y +# CONFIG_ESPTOOLPY_AFTER_NORESET is not set +CONFIG_ESPTOOLPY_AFTER="hard_reset" +CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 +# end of Serial flasher config + +# +# Partition Table +# +CONFIG_PARTITION_TABLE_SINGLE_APP=y +# CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE is not set +# CONFIG_PARTITION_TABLE_TWO_OTA is not set +# CONFIG_PARTITION_TABLE_CUSTOM is not set +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions_singleapp.csv" +CONFIG_PARTITION_TABLE_OFFSET=0x8000 +CONFIG_PARTITION_TABLE_MD5=y +# end of Partition Table + +# +# Compiler options +# +CONFIG_COMPILER_OPTIMIZATION_DEBUG=y +# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set +# CONFIG_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_COMPILER_OPTIMIZATION_NONE is not set +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set +# CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB is not set +CONFIG_COMPILER_FLOAT_LIB_FROM_RVFPLIB=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set +CONFIG_COMPILER_HIDE_PATHS_MACROS=y +# CONFIG_COMPILER_CXX_EXCEPTIONS is not set +# CONFIG_COMPILER_CXX_RTTI is not set +CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y +# CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set +# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set +# CONFIG_COMPILER_SAVE_RESTORE_LIBCALLS is not set +# CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC13_WARNINGS is not set +# CONFIG_COMPILER_DUMP_RTL_FILES is not set +CONFIG_COMPILER_RT_LIB_GCCLIB=y +CONFIG_COMPILER_RT_LIB_NAME="gcc" +# CONFIG_COMPILER_ORPHAN_SECTIONS_WARNING is not set +CONFIG_COMPILER_ORPHAN_SECTIONS_PLACE=y +# end of Compiler options + +# +# Component config +# + +# +# Application Level Tracing +# +# CONFIG_APPTRACE_DEST_JTAG is not set +CONFIG_APPTRACE_DEST_NONE=y +# CONFIG_APPTRACE_DEST_UART1 is not set +# CONFIG_APPTRACE_DEST_UART2 is not set +CONFIG_APPTRACE_DEST_UART_NONE=y +CONFIG_APPTRACE_UART_TASK_PRIO=1 +CONFIG_APPTRACE_LOCK_ENABLE=y +# end of Application Level Tracing + +# +# Bluetooth +# +# CONFIG_BT_ENABLED is not set +CONFIG_BT_ALARM_MAX_NUM=50 +# end of Bluetooth + +# +# Console Library +# +# CONFIG_CONSOLE_SORTED_HELP is not set +# end of Console Library + +# +# Driver Configurations +# + +# +# TWAI Configuration +# +# CONFIG_TWAI_ISR_IN_IRAM is not set +# end of TWAI Configuration + +# +# Legacy ADC Driver Configuration +# +# CONFIG_ADC_SUPPRESS_DEPRECATE_WARN is not set + +# +# Legacy ADC Calibration Configuration +# +# CONFIG_ADC_CALI_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy ADC Calibration Configuration +# end of Legacy ADC Driver Configuration + +# +# Legacy MCPWM Driver Configurations +# +# CONFIG_MCPWM_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy MCPWM Driver Configurations + +# +# Legacy Timer Group Driver Configurations +# +# CONFIG_GPTIMER_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy Timer Group Driver Configurations + +# +# Legacy RMT Driver Configurations +# +# CONFIG_RMT_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy RMT Driver Configurations + +# +# Legacy I2S Driver Configurations +# +# CONFIG_I2S_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy I2S Driver Configurations + +# +# Legacy PCNT Driver Configurations +# +# CONFIG_PCNT_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy PCNT Driver Configurations + +# +# Legacy SDM Driver Configurations +# +# CONFIG_SDM_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy SDM Driver Configurations + +# +# Legacy Temperature Sensor Driver Configurations +# +# CONFIG_TEMP_SENSOR_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy Temperature Sensor Driver Configurations +# end of Driver Configurations + +# +# eFuse Bit Manager +# +# CONFIG_EFUSE_CUSTOM_TABLE is not set +# CONFIG_EFUSE_VIRTUAL is not set +CONFIG_EFUSE_MAX_BLK_LEN=256 +# end of eFuse Bit Manager + +# +# ESP-TLS +# +CONFIG_ESP_TLS_USING_MBEDTLS=y +CONFIG_ESP_TLS_USE_DS_PERIPHERAL=y +# CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS is not set +# CONFIG_ESP_TLS_SERVER_SESSION_TICKETS is not set +# CONFIG_ESP_TLS_SERVER_CERT_SELECT_HOOK is not set +# CONFIG_ESP_TLS_SERVER_MIN_AUTH_MODE_OPTIONAL is not set +# CONFIG_ESP_TLS_PSK_VERIFICATION is not set +# CONFIG_ESP_TLS_INSECURE is not set +# end of ESP-TLS + +# +# ADC and ADC Calibration +# +# CONFIG_ADC_ONESHOT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_ADC_CONTINUOUS_ISR_IRAM_SAFE is not set +# CONFIG_ADC_ENABLE_DEBUG_LOG is not set +# end of ADC and ADC Calibration + +# +# Wireless Coexistence +# +CONFIG_ESP_COEX_ENABLED=y +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=y +# CONFIG_ESP_COEX_EXTERNAL_COEXIST_ENABLE is not set +# CONFIG_ESP_COEX_POWER_MANAGEMENT is not set +# end of Wireless Coexistence + +# +# Common ESP-related +# +CONFIG_ESP_ERR_TO_NAME_LOOKUP=y +# end of Common ESP-related + +# +# ESP-Driver:GPIO Configurations +# +# CONFIG_GPIO_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:GPIO Configurations + +# +# ESP-Driver:GPTimer Configurations +# +CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM=y +# CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM is not set +# CONFIG_GPTIMER_ISR_IRAM_SAFE is not set +# CONFIG_GPTIMER_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:GPTimer Configurations + +# +# ESP-Driver:I2C Configurations +# +# CONFIG_I2C_ISR_IRAM_SAFE is not set +# CONFIG_I2C_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:I2C Configurations + +# +# ESP-Driver:I2S Configurations +# +# CONFIG_I2S_ISR_IRAM_SAFE is not set +# CONFIG_I2S_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:I2S Configurations + +# +# ESP-Driver:LEDC Configurations +# +# CONFIG_LEDC_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:LEDC Configurations + +# +# ESP-Driver:MCPWM Configurations +# +# CONFIG_MCPWM_ISR_IRAM_SAFE is not set +# CONFIG_MCPWM_CTRL_FUNC_IN_IRAM is not set +# CONFIG_MCPWM_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:MCPWM Configurations + +# +# ESP-Driver:Parallel IO Configurations +# +# CONFIG_PARLIO_ENABLE_DEBUG_LOG is not set +# CONFIG_PARLIO_ISR_IRAM_SAFE is not set +# end of ESP-Driver:Parallel IO Configurations + +# +# ESP-Driver:PCNT Configurations +# +# CONFIG_PCNT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_PCNT_ISR_IRAM_SAFE is not set +# CONFIG_PCNT_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:PCNT Configurations + +# +# ESP-Driver:RMT Configurations +# +# CONFIG_RMT_ISR_IRAM_SAFE is not set +# CONFIG_RMT_RECV_FUNC_IN_IRAM is not set +# CONFIG_RMT_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:RMT Configurations + +# +# ESP-Driver:Sigma Delta Modulator Configurations +# +# CONFIG_SDM_CTRL_FUNC_IN_IRAM is not set +# CONFIG_SDM_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:Sigma Delta Modulator Configurations + +# +# ESP-Driver:SPI Configurations +# +# CONFIG_SPI_MASTER_IN_IRAM is not set +CONFIG_SPI_MASTER_ISR_IN_IRAM=y +# CONFIG_SPI_SLAVE_IN_IRAM is not set +CONFIG_SPI_SLAVE_ISR_IN_IRAM=y +# end of ESP-Driver:SPI Configurations + +# +# ESP-Driver:Temperature Sensor Configurations +# +# CONFIG_TEMP_SENSOR_ENABLE_DEBUG_LOG is not set +# CONFIG_TEMP_SENSOR_ISR_IRAM_SAFE is not set +# end of ESP-Driver:Temperature Sensor Configurations + +# +# ESP-Driver:UART Configurations +# +# CONFIG_UART_ISR_IN_IRAM is not set +# end of ESP-Driver:UART Configurations + +# +# ESP-Driver:USB Serial/JTAG Configuration +# +CONFIG_USJ_ENABLE_USB_SERIAL_JTAG=y +# end of ESP-Driver:USB Serial/JTAG Configuration + +# +# Ethernet +# +CONFIG_ETH_ENABLED=y +CONFIG_ETH_USE_SPI_ETHERNET=y +# CONFIG_ETH_SPI_ETHERNET_DM9051 is not set +# CONFIG_ETH_SPI_ETHERNET_W5500 is not set +# CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL is not set +# CONFIG_ETH_USE_OPENETH is not set +# CONFIG_ETH_TRANSMIT_MUTEX is not set +# end of Ethernet + +# +# Event Loop Library +# +# CONFIG_ESP_EVENT_LOOP_PROFILING is not set +CONFIG_ESP_EVENT_POST_FROM_ISR=y +CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y +# end of Event Loop Library + +# +# GDB Stub +# +CONFIG_ESP_GDBSTUB_ENABLED=y +# CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set +CONFIG_ESP_GDBSTUB_SUPPORT_TASKS=y +CONFIG_ESP_GDBSTUB_MAX_TASKS=32 +# end of GDB Stub + +# +# ESP HTTP client +# +CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y +# CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set +# CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH is not set +# CONFIG_ESP_HTTP_CLIENT_ENABLE_CUSTOM_TRANSPORT is not set +# end of ESP HTTP client + +# +# HTTP Server +# +CONFIG_HTTPD_MAX_REQ_HDR_LEN=512 +CONFIG_HTTPD_MAX_URI_LEN=512 +CONFIG_HTTPD_ERR_RESP_NO_DELAY=y +CONFIG_HTTPD_PURGE_BUF_LEN=32 +# CONFIG_HTTPD_LOG_PURGE_DATA is not set +# CONFIG_HTTPD_WS_SUPPORT is not set +# CONFIG_HTTPD_QUEUE_WORK_BLOCKING is not set +# end of HTTP Server + +# +# ESP HTTPS OTA +# +# CONFIG_ESP_HTTPS_OTA_DECRYPT_CB is not set +# CONFIG_ESP_HTTPS_OTA_ALLOW_HTTP is not set +# end of ESP HTTPS OTA + +# +# ESP HTTPS server +# +# CONFIG_ESP_HTTPS_SERVER_ENABLE is not set +# end of ESP HTTPS server + +# +# Hardware Settings +# + +# +# Chip revision +# +CONFIG_ESP32C6_REV_MIN_0=y +# CONFIG_ESP32C6_REV_MIN_1 is not set +CONFIG_ESP32C6_REV_MIN_FULL=0 +CONFIG_ESP_REV_MIN_FULL=0 + +# +# Maximum Supported ESP32-C6 Revision (Rev v0.99) +# +CONFIG_ESP32C6_REV_MAX_FULL=99 +CONFIG_ESP_REV_MAX_FULL=99 +# end of Chip revision + +# +# MAC Config +# +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_IEEE802154=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP32C6_UNIVERSAL_MAC_ADDRESSES_TWO is not set +CONFIG_ESP32C6_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP32C6_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP_MAC_USE_CUSTOM_MAC_AS_BASE_MAC is not set +# end of MAC Config + +# +# Sleep Config +# +# CONFIG_ESP_SLEEP_POWER_DOWN_FLASH is not set +CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=y +# CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU is not set +CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND=y +CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY=0 +# CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION is not set +# CONFIG_ESP_SLEEP_DEBUG is not set +CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS=y +# end of Sleep Config + +# +# RTC Clock Config +# +CONFIG_RTC_CLK_SRC_INT_RC=y +# CONFIG_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_RTC_CLK_SRC_INT_RC32K is not set +CONFIG_RTC_CLK_CAL_CYCLES=1024 +# end of RTC Clock Config + +# +# Peripheral Control +# +CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y +# end of Peripheral Control + +# +# ETM Configuration +# +# CONFIG_ETM_ENABLE_DEBUG_LOG is not set +# end of ETM Configuration + +# +# GDMA Configurations +# +CONFIG_GDMA_CTRL_FUNC_IN_IRAM=y +# CONFIG_GDMA_ISR_IRAM_SAFE is not set +# CONFIG_GDMA_ENABLE_DEBUG_LOG is not set +# end of GDMA Configurations + +# +# Main XTAL Config +# +CONFIG_XTAL_FREQ_40=y +CONFIG_XTAL_FREQ=40 +# end of Main XTAL Config + +# +# Crypto DPA Protection +# +CONFIG_ESP_CRYPTO_DPA_PROTECTION_AT_STARTUP=y +CONFIG_ESP_CRYPTO_DPA_PROTECTION_LEVEL_LOW=y +# CONFIG_ESP_CRYPTO_DPA_PROTECTION_LEVEL_MEDIUM is not set +# CONFIG_ESP_CRYPTO_DPA_PROTECTION_LEVEL_HIGH is not set +CONFIG_ESP_CRYPTO_DPA_PROTECTION_LEVEL=1 +# end of Crypto DPA Protection + +CONFIG_ESP_SPI_BUS_LOCK_ISR_FUNCS_IN_IRAM=y +# end of Hardware Settings + +# +# LCD and Touch Panel +# + +# +# LCD Touch Drivers are maintained in the IDF Component Registry +# + +# +# LCD Peripheral Configuration +# +# CONFIG_LCD_ENABLE_DEBUG_LOG is not set +# end of LCD Peripheral Configuration +# end of LCD and Touch Panel + +# +# ESP NETIF Adapter +# +CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL=120 +CONFIG_ESP_NETIF_TCPIP_LWIP=y +# CONFIG_ESP_NETIF_LOOPBACK is not set +CONFIG_ESP_NETIF_USES_TCPIP_WITH_BSD_API=y +# CONFIG_ESP_NETIF_RECEIVE_REPORT_ERRORS is not set +# CONFIG_ESP_NETIF_L2_TAP is not set +# CONFIG_ESP_NETIF_BRIDGE_EN is not set +# end of ESP NETIF Adapter + +# +# Partition API Configuration +# +# end of Partition API Configuration + +# +# PHY +# +CONFIG_ESP_PHY_ENABLED=y +CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y +# CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION is not set +CONFIG_ESP_PHY_MAX_WIFI_TX_POWER=20 +CONFIG_ESP_PHY_MAX_TX_POWER=20 +# CONFIG_ESP_PHY_REDUCE_TX_POWER is not set +CONFIG_ESP_PHY_RF_CAL_PARTIAL=y +# CONFIG_ESP_PHY_RF_CAL_NONE is not set +# CONFIG_ESP_PHY_RF_CAL_FULL is not set +CONFIG_ESP_PHY_CALIBRATION_MODE=0 +# CONFIG_ESP_PHY_PLL_TRACK_DEBUG is not set +# end of PHY + +# +# Power Management +# +# CONFIG_PM_ENABLE is not set +CONFIG_PM_SLP_DEFAULT_PARAMS_OPT=y +CONFIG_PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP=y +# CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP is not set +# end of Power Management + +# +# ESP PSRAM +# + +# +# ESP Ringbuf +# +# CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH is not set +# end of ESP Ringbuf + +# +# ESP System Settings +# +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80 is not set +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_120 is not set +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160=y +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=160 +# CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT is not set +CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y +# CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set +# CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set +CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=0 +CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE=y +CONFIG_ESP_SYSTEM_RTC_FAST_MEM_AS_HEAP_DEPCHECK=y +CONFIG_ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP=y +# CONFIG_ESP_SYSTEM_USE_EH_FRAME is not set + +# +# Memory protection +# +CONFIG_ESP_SYSTEM_PMP_IDRAM_SPLIT=y +# end of Memory protection + +CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_ESP_MAIN_TASK_STACK_SIZE=3584 +CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0=y +# CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_ESP_MAIN_TASK_AFFINITY=0x0 +CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE=2048 +CONFIG_ESP_CONSOLE_UART_DEFAULT=y +# CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG is not set +# CONFIG_ESP_CONSOLE_UART_CUSTOM is not set +# CONFIG_ESP_CONSOLE_NONE is not set +# CONFIG_ESP_CONSOLE_SECONDARY_NONE is not set +CONFIG_ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG=y +CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG_ENABLED=y +CONFIG_ESP_CONSOLE_UART=y +CONFIG_ESP_CONSOLE_UART_NUM=0 +CONFIG_ESP_CONSOLE_ROM_SERIAL_PORT_NUM=0 +CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 +CONFIG_ESP_INT_WDT=y +CONFIG_ESP_INT_WDT_TIMEOUT_MS=300 +CONFIG_ESP_TASK_WDT_EN=y +CONFIG_ESP_TASK_WDT_INIT=y +# CONFIG_ESP_TASK_WDT_PANIC is not set +CONFIG_ESP_TASK_WDT_TIMEOUT_S=5 +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +# CONFIG_ESP_PANIC_HANDLER_IRAM is not set +# CONFIG_ESP_DEBUG_STUBS_ENABLE is not set +CONFIG_ESP_DEBUG_OCDAWARE=y +CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4=y + +# +# Brownout Detector +# +CONFIG_ESP_BROWNOUT_DET=y +CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7=y +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_2 is not set +CONFIG_ESP_BROWNOUT_DET_LVL=7 +# end of Brownout Detector + +CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y +CONFIG_ESP_SYSTEM_HW_STACK_GUARD=y +CONFIG_ESP_SYSTEM_BBPLL_RECALIB=y +CONFIG_ESP_SYSTEM_HW_PC_RECORD=y +# end of ESP System Settings + +# +# IPC (Inter-Processor Call) +# +CONFIG_ESP_IPC_TASK_STACK_SIZE=1024 +# end of IPC (Inter-Processor Call) + +# +# ESP Timer (High Resolution Timer) +# +# CONFIG_ESP_TIMER_PROFILING is not set +CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER=y +CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER=y +CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP_TIMER_INTERRUPT_LEVEL=1 +# CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL is not set +CONFIG_ESP_TIMER_TASK_AFFINITY=0x0 +CONFIG_ESP_TIMER_TASK_AFFINITY_CPU0=y +CONFIG_ESP_TIMER_ISR_AFFINITY_CPU0=y +# CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD is not set +CONFIG_ESP_TIMER_IMPL_SYSTIMER=y +# end of ESP Timer (High Resolution Timer) + +# +# Wi-Fi +# +CONFIG_ESP_WIFI_ENABLED=y +CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=10 +CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32 +# CONFIG_ESP_WIFI_STATIC_TX_BUFFER is not set +CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER=y +CONFIG_ESP_WIFI_TX_BUFFER_TYPE=1 +CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER_NUM=32 +CONFIG_ESP_WIFI_STATIC_RX_MGMT_BUFFER=y +# CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUFFER is not set +CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF=0 +CONFIG_ESP_WIFI_RX_MGMT_BUF_NUM_DEF=5 +# CONFIG_ESP_WIFI_CSI_ENABLED is not set +CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP_WIFI_TX_BA_WIN=6 +CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP_WIFI_RX_BA_WIN=6 +CONFIG_ESP_WIFI_NVS_ENABLED=y +CONFIG_ESP_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP_WIFI_MGMT_SBUF_NUM=32 +CONFIG_ESP_WIFI_IRAM_OPT=y +CONFIG_ESP_WIFI_EXTRA_IRAM_OPT=y +CONFIG_ESP_WIFI_RX_IRAM_OPT=y +CONFIG_ESP_WIFI_ENABLE_WPA3_SAE=y +CONFIG_ESP_WIFI_ENABLE_SAE_PK=y +CONFIG_ESP_WIFI_SOFTAP_SAE_SUPPORT=y +CONFIG_ESP_WIFI_ENABLE_WPA3_OWE_STA=y +CONFIG_ESP_WIFI_SLP_IRAM_OPT=y +CONFIG_ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME=50 +CONFIG_ESP_WIFI_SLP_DEFAULT_MAX_ACTIVE_TIME=10 +CONFIG_ESP_WIFI_SLP_DEFAULT_WAIT_BROADCAST_DATA_TIME=15 +# CONFIG_ESP_WIFI_FTM_ENABLE is not set +CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE=y +# CONFIG_ESP_WIFI_GCMP_SUPPORT is not set +CONFIG_ESP_WIFI_GMAC_SUPPORT=y +CONFIG_ESP_WIFI_SOFTAP_SUPPORT=y +# CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT is not set +CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7 +CONFIG_ESP_WIFI_MBEDTLS_CRYPTO=y +CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y +# CONFIG_ESP_WIFI_WAPI_PSK is not set +# CONFIG_ESP_WIFI_SUITE_B_192 is not set +# CONFIG_ESP_WIFI_11KV_SUPPORT is not set +# CONFIG_ESP_WIFI_MBO_SUPPORT is not set +# CONFIG_ESP_WIFI_DPP_SUPPORT is not set +# CONFIG_ESP_WIFI_11R_SUPPORT is not set +# CONFIG_ESP_WIFI_WPS_SOFTAP_REGISTRAR is not set +# CONFIG_ESP_WIFI_ENABLE_WIFI_TX_STATS is not set +# CONFIG_ESP_WIFI_ENABLE_WIFI_RX_STATS is not set +CONFIG_ESP_WIFI_TX_HETB_QUEUE_NUM=3 + +# +# WPS Configuration Options +# +# CONFIG_ESP_WIFI_WPS_STRICT is not set +# CONFIG_ESP_WIFI_WPS_PASSPHRASE is not set +# end of WPS Configuration Options + +# CONFIG_ESP_WIFI_DEBUG_PRINT is not set +# CONFIG_ESP_WIFI_TESTING_OPTIONS is not set +CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT=y +# CONFIG_ESP_WIFI_ENT_FREE_DYNAMIC_BUFFER is not set +# end of Wi-Fi + +# +# Core dump +# +# CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH is not set +# CONFIG_ESP_COREDUMP_ENABLE_TO_UART is not set +CONFIG_ESP_COREDUMP_ENABLE_TO_NONE=y +# end of Core dump + +# +# FAT Filesystem support +# +CONFIG_FATFS_VOLUME_COUNT=2 +CONFIG_FATFS_LFN_NONE=y +# CONFIG_FATFS_LFN_HEAP is not set +# CONFIG_FATFS_LFN_STACK is not set +# CONFIG_FATFS_SECTOR_512 is not set +CONFIG_FATFS_SECTOR_4096=y +# CONFIG_FATFS_CODEPAGE_DYNAMIC is not set +CONFIG_FATFS_CODEPAGE_437=y +# CONFIG_FATFS_CODEPAGE_720 is not set +# CONFIG_FATFS_CODEPAGE_737 is not set +# CONFIG_FATFS_CODEPAGE_771 is not set +# CONFIG_FATFS_CODEPAGE_775 is not set +# CONFIG_FATFS_CODEPAGE_850 is not set +# CONFIG_FATFS_CODEPAGE_852 is not set +# CONFIG_FATFS_CODEPAGE_855 is not set +# CONFIG_FATFS_CODEPAGE_857 is not set +# CONFIG_FATFS_CODEPAGE_860 is not set +# CONFIG_FATFS_CODEPAGE_861 is not set +# CONFIG_FATFS_CODEPAGE_862 is not set +# CONFIG_FATFS_CODEPAGE_863 is not set +# CONFIG_FATFS_CODEPAGE_864 is not set +# CONFIG_FATFS_CODEPAGE_865 is not set +# CONFIG_FATFS_CODEPAGE_866 is not set +# CONFIG_FATFS_CODEPAGE_869 is not set +# CONFIG_FATFS_CODEPAGE_932 is not set +# CONFIG_FATFS_CODEPAGE_936 is not set +# CONFIG_FATFS_CODEPAGE_949 is not set +# CONFIG_FATFS_CODEPAGE_950 is not set +CONFIG_FATFS_CODEPAGE=437 +CONFIG_FATFS_FS_LOCK=0 +CONFIG_FATFS_TIMEOUT_MS=10000 +CONFIG_FATFS_PER_FILE_CACHE=y +# CONFIG_FATFS_USE_FASTSEEK is not set +CONFIG_FATFS_VFS_FSTAT_BLKSIZE=0 +# CONFIG_FATFS_IMMEDIATE_FSYNC is not set +# CONFIG_FATFS_USE_LABEL is not set +CONFIG_FATFS_LINK_LOCK=y +# end of FAT Filesystem support + +# +# FreeRTOS +# + +# +# Kernel +# +# CONFIG_FREERTOS_SMP is not set +CONFIG_FREERTOS_UNICORE=y +CONFIG_FREERTOS_HZ=1000 +CONFIG_FREERTOS_OPTIMIZED_SCHEDULER=y +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set +CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y +CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1 +CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536 +# CONFIG_FREERTOS_USE_IDLE_HOOK is not set +# CONFIG_FREERTOS_USE_TICK_HOOK is not set +CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 +# CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY is not set +CONFIG_FREERTOS_TIMER_SERVICE_TASK_NAME="Tmr Svc" +# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU0 is not set +CONFIG_FREERTOS_TIMER_TASK_NO_AFFINITY=y +CONFIG_FREERTOS_TIMER_SERVICE_TASK_CORE_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 +CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 +CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 +CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 +# CONFIG_FREERTOS_USE_TRACE_FACILITY is not set +# CONFIG_FREERTOS_USE_LIST_DATA_INTEGRITY_CHECK_BYTES is not set +# CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set +# CONFIG_FREERTOS_USE_APPLICATION_TASK_TAG is not set +# end of Kernel + +# +# Port +# +CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y +# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set +CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS=y +# CONFIG_FREERTOS_TASK_PRE_DELETION_HOOK is not set +# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set +CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y +CONFIG_FREERTOS_ISR_STACKSIZE=1536 +CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y +CONFIG_FREERTOS_TICK_SUPPORT_SYSTIMER=y +CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL1=y +# CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL3 is not set +CONFIG_FREERTOS_SYSTICK_USES_SYSTIMER=y +# CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set +# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set +# end of Port + +CONFIG_FREERTOS_PORT=y +CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y +CONFIG_FREERTOS_DEBUG_OCDAWARE=y +CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y +CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y +CONFIG_FREERTOS_NUMBER_OF_CORES=1 +# end of FreeRTOS + +# +# Hardware Abstraction Layer (HAL) and Low Level (LL) +# +CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y +# CONFIG_HAL_ASSERTION_DISABLE is not set +# CONFIG_HAL_ASSERTION_SILENT is not set +# CONFIG_HAL_ASSERTION_ENABLE is not set +CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=2 +CONFIG_HAL_SYSTIMER_USE_ROM_IMPL=y +CONFIG_HAL_WDT_USE_ROM_IMPL=y +CONFIG_HAL_SPI_MASTER_FUNC_IN_IRAM=y +CONFIG_HAL_SPI_SLAVE_FUNC_IN_IRAM=y +# end of Hardware Abstraction Layer (HAL) and Low Level (LL) + +# +# Heap memory debugging +# +CONFIG_HEAP_POISONING_DISABLED=y +# CONFIG_HEAP_POISONING_LIGHT is not set +# CONFIG_HEAP_POISONING_COMPREHENSIVE is not set +CONFIG_HEAP_TRACING_OFF=y +# CONFIG_HEAP_TRACING_STANDALONE is not set +# CONFIG_HEAP_TRACING_TOHOST is not set +# CONFIG_HEAP_USE_HOOKS is not set +# CONFIG_HEAP_TASK_TRACKING is not set +# CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set +CONFIG_HEAP_TLSF_USE_ROM_IMPL=y +# end of Heap memory debugging + +# +# IEEE 802.15.4 +# +CONFIG_IEEE802154_ENABLED=y +CONFIG_IEEE802154_RX_BUFFER_SIZE=20 +# CONFIG_IEEE802154_CCA_CARRIER is not set +CONFIG_IEEE802154_CCA_ED=y +# CONFIG_IEEE802154_CCA_CARRIER_OR_ED is not set +# CONFIG_IEEE802154_CCA_CARRIER_AND_ED is not set +CONFIG_IEEE802154_CCA_MODE=1 +CONFIG_IEEE802154_CCA_THRESHOLD=-60 +CONFIG_IEEE802154_PENDING_TABLE_SIZE=20 +# CONFIG_IEEE802154_MULTI_PAN_ENABLE is not set +# CONFIG_IEEE802154_TIMING_OPTIMIZATION is not set +# CONFIG_IEEE802154_DEBUG is not set +# end of IEEE 802.15.4 + +# +# Log output +# +# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set +# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set +# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set +CONFIG_LOG_DEFAULT_LEVEL_INFO=y +# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set +# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set +CONFIG_LOG_DEFAULT_LEVEL=3 +CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y +# CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set +# CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set +CONFIG_LOG_MAXIMUM_LEVEL=3 +# CONFIG_LOG_MASTER_LEVEL is not set +CONFIG_LOG_COLORS=y +CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y +# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set +# end of Log output + +# +# LWIP +# +CONFIG_LWIP_ENABLE=y +CONFIG_LWIP_LOCAL_HOSTNAME="espressif" +# CONFIG_LWIP_NETIF_API is not set +CONFIG_LWIP_TCPIP_TASK_PRIO=18 +# CONFIG_LWIP_TCPIP_CORE_LOCKING is not set +# CONFIG_LWIP_CHECK_THREAD_SAFETY is not set +CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y +# CONFIG_LWIP_L2_TO_L3_COPY is not set +# CONFIG_LWIP_IRAM_OPTIMIZATION is not set +# CONFIG_LWIP_EXTRA_IRAM_OPTIMIZATION is not set +CONFIG_LWIP_TIMERS_ONDEMAND=y +CONFIG_LWIP_ND6=y +# CONFIG_LWIP_FORCE_ROUTER_FORWARDING is not set +CONFIG_LWIP_MAX_SOCKETS=10 +# CONFIG_LWIP_USE_ONLY_LWIP_SELECT is not set +# CONFIG_LWIP_SO_LINGER is not set +CONFIG_LWIP_SO_REUSE=y +CONFIG_LWIP_SO_REUSE_RXTOALL=y +CONFIG_LWIP_SO_RCVBUF=y +# CONFIG_LWIP_NETBUF_RECVINFO is not set +CONFIG_LWIP_IP_DEFAULT_TTL=64 +CONFIG_LWIP_IP4_FRAG=y +CONFIG_LWIP_IP6_FRAG=y +# CONFIG_LWIP_IP4_REASSEMBLY is not set +# CONFIG_LWIP_IP6_REASSEMBLY is not set +CONFIG_LWIP_IP_REASS_MAX_PBUFS=10 +# CONFIG_LWIP_IP_FORWARD is not set +# CONFIG_LWIP_STATS is not set +CONFIG_LWIP_ESP_GRATUITOUS_ARP=y +CONFIG_LWIP_GARP_TMR_INTERVAL=60 +CONFIG_LWIP_ESP_MLDV6_REPORT=y +CONFIG_LWIP_MLDV6_TMR_INTERVAL=40 +CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32 +CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y +# CONFIG_LWIP_DHCP_DISABLE_CLIENT_ID is not set +CONFIG_LWIP_DHCP_DISABLE_VENDOR_CLASS_ID=y +# CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set +CONFIG_LWIP_DHCP_OPTIONS_LEN=68 +CONFIG_LWIP_NUM_NETIF_CLIENT_DATA=0 +CONFIG_LWIP_DHCP_COARSE_TIMER_SECS=1 + +# +# DHCP server +# +CONFIG_LWIP_DHCPS=y +CONFIG_LWIP_DHCPS_LEASE_UNIT=60 +CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8 +CONFIG_LWIP_DHCPS_STATIC_ENTRIES=y +# end of DHCP server + +# CONFIG_LWIP_AUTOIP is not set +CONFIG_LWIP_IPV4=y +CONFIG_LWIP_IPV6=y +# CONFIG_LWIP_IPV6_AUTOCONFIG is not set +CONFIG_LWIP_IPV6_NUM_ADDRESSES=3 +# CONFIG_LWIP_IPV6_FORWARD is not set +# CONFIG_LWIP_NETIF_STATUS_CALLBACK is not set +CONFIG_LWIP_NETIF_LOOPBACK=y +CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8 + +# +# TCP +# +CONFIG_LWIP_MAX_ACTIVE_TCP=16 +CONFIG_LWIP_MAX_LISTENING_TCP=16 +CONFIG_LWIP_TCP_HIGH_SPEED_RETRANSMISSION=y +CONFIG_LWIP_TCP_MAXRTX=12 +CONFIG_LWIP_TCP_SYNMAXRTX=12 +CONFIG_LWIP_TCP_MSS=1440 +CONFIG_LWIP_TCP_TMR_INTERVAL=250 +CONFIG_LWIP_TCP_MSL=60000 +CONFIG_LWIP_TCP_FIN_WAIT_TIMEOUT=20000 +CONFIG_LWIP_TCP_SND_BUF_DEFAULT=5760 +CONFIG_LWIP_TCP_WND_DEFAULT=5760 +CONFIG_LWIP_TCP_RECVMBOX_SIZE=6 +CONFIG_LWIP_TCP_ACCEPTMBOX_SIZE=6 +CONFIG_LWIP_TCP_QUEUE_OOSEQ=y +CONFIG_LWIP_TCP_OOSEQ_TIMEOUT=6 +CONFIG_LWIP_TCP_OOSEQ_MAX_PBUFS=4 +# CONFIG_LWIP_TCP_SACK_OUT is not set +CONFIG_LWIP_TCP_OVERSIZE_MSS=y +# CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set +# CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set +CONFIG_LWIP_TCP_RTO_TIME=1500 +# end of TCP + +# +# UDP +# +CONFIG_LWIP_MAX_UDP_PCBS=16 +CONFIG_LWIP_UDP_RECVMBOX_SIZE=6 +# end of UDP + +# +# Checksums +# +# CONFIG_LWIP_CHECKSUM_CHECK_IP is not set +# CONFIG_LWIP_CHECKSUM_CHECK_UDP is not set +CONFIG_LWIP_CHECKSUM_CHECK_ICMP=y +# end of Checksums + +CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=3072 +CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set +CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF +CONFIG_LWIP_PPP_SUPPORT=y +CONFIG_LWIP_PPP_ENABLE_IPV6=y +CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3 +CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5 +# CONFIG_LWIP_PPP_NOTIFY_PHASE_SUPPORT is not set +# CONFIG_LWIP_PPP_PAP_SUPPORT is not set +# CONFIG_LWIP_PPP_CHAP_SUPPORT is not set +# CONFIG_LWIP_PPP_MSCHAP_SUPPORT is not set +# CONFIG_LWIP_PPP_MPPE_SUPPORT is not set +# CONFIG_LWIP_PPP_SERVER_SUPPORT is not set +CONFIG_LWIP_PPP_VJ_HEADER_COMPRESSION=y +# CONFIG_LWIP_ENABLE_LCP_ECHO is not set +# CONFIG_LWIP_PPP_DEBUG_ON is not set +# CONFIG_LWIP_SLIP_SUPPORT is not set + +# +# ICMP +# +CONFIG_LWIP_ICMP=y +# CONFIG_LWIP_MULTICAST_PING is not set +# CONFIG_LWIP_BROADCAST_PING is not set +# end of ICMP + +# +# LWIP RAW API +# +CONFIG_LWIP_MAX_RAW_PCBS=16 +# end of LWIP RAW API + +# +# SNTP +# +CONFIG_LWIP_SNTP_MAX_SERVERS=1 +# CONFIG_LWIP_DHCP_GET_NTP_SRV is not set +CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000 +CONFIG_LWIP_SNTP_STARTUP_DELAY=y +CONFIG_LWIP_SNTP_MAXIMUM_STARTUP_DELAY=5000 +# end of SNTP + +# +# DNS +# +CONFIG_LWIP_DNS_MAX_SERVERS=3 +# CONFIG_LWIP_FALLBACK_DNS_SERVER_SUPPORT is not set +# end of DNS + +CONFIG_LWIP_BRIDGEIF_MAX_PORTS=7 +CONFIG_LWIP_ESP_LWIP_ASSERT=y + +# +# Hooks +# +# CONFIG_LWIP_HOOK_TCP_ISN_NONE is not set +CONFIG_LWIP_HOOK_TCP_ISN_DEFAULT=y +# CONFIG_LWIP_HOOK_TCP_ISN_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_ROUTE_NONE=y +# CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_ROUTE_CUSTOM is not set +CONFIG_LWIP_HOOK_ND6_GET_GW_NONE=y +# CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT is not set +# CONFIG_LWIP_HOOK_ND6_GET_GW_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_NONE=y +# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM is not set +CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y +# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT is not set +# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_INPUT_NONE=y +# CONFIG_LWIP_HOOK_IP6_INPUT_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM is not set +# end of Hooks + +# CONFIG_LWIP_DEBUG is not set +# end of LWIP + +# +# mbedTLS +# +CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y +# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set +# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set +CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y +CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384 +CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096 +# CONFIG_MBEDTLS_DYNAMIC_BUFFER is not set +# CONFIG_MBEDTLS_DEBUG is not set + +# +# mbedTLS v3.x related +# +# CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 is not set +# CONFIG_MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH is not set +# CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set +# CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set +CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=y +CONFIG_MBEDTLS_PKCS7_C=y +# end of mbedTLS v3.x related + +# +# Certificate Bundle +# +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=y +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE is not set +# CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEPRECATED_LIST is not set +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200 +# end of Certificate Bundle + +# CONFIG_MBEDTLS_ECP_RESTARTABLE is not set +CONFIG_MBEDTLS_CMAC_C=y +CONFIG_MBEDTLS_HARDWARE_AES=y +CONFIG_MBEDTLS_AES_USE_INTERRUPT=y +CONFIG_MBEDTLS_AES_INTERRUPT_LEVEL=0 +CONFIG_MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER=y +CONFIG_MBEDTLS_HARDWARE_MPI=y +CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI=y +CONFIG_MBEDTLS_MPI_USE_INTERRUPT=y +CONFIG_MBEDTLS_MPI_INTERRUPT_LEVEL=0 +CONFIG_MBEDTLS_HARDWARE_SHA=y +CONFIG_MBEDTLS_HARDWARE_ECC=y +CONFIG_MBEDTLS_ECC_OTHER_CURVES_SOFT_FALLBACK=y +CONFIG_MBEDTLS_ROM_MD5=y +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY is not set +CONFIG_MBEDTLS_HAVE_TIME=y +# CONFIG_MBEDTLS_PLATFORM_TIME_ALT is not set +# CONFIG_MBEDTLS_HAVE_TIME_DATE is not set +CONFIG_MBEDTLS_ECDSA_DETERMINISTIC=y +CONFIG_MBEDTLS_SHA512_C=y +CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y +# CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set +# CONFIG_MBEDTLS_TLS_CLIENT_ONLY is not set +# CONFIG_MBEDTLS_TLS_DISABLED is not set +CONFIG_MBEDTLS_TLS_SERVER=y +CONFIG_MBEDTLS_TLS_CLIENT=y +CONFIG_MBEDTLS_TLS_ENABLED=y + +# +# TLS Key Exchange Methods +# +# CONFIG_MBEDTLS_PSK_MODES is not set +CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y +# end of TLS Key Exchange Methods + +CONFIG_MBEDTLS_SSL_RENEGOTIATION=y +CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y +# CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 is not set +# CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set +CONFIG_MBEDTLS_SSL_ALPN=y +CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y +CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y + +# +# Symmetric Ciphers +# +CONFIG_MBEDTLS_AES_C=y +# CONFIG_MBEDTLS_CAMELLIA_C is not set +# CONFIG_MBEDTLS_DES_C is not set +# CONFIG_MBEDTLS_BLOWFISH_C is not set +# CONFIG_MBEDTLS_XTEA_C is not set +CONFIG_MBEDTLS_CCM_C=y +CONFIG_MBEDTLS_GCM_C=y +# CONFIG_MBEDTLS_NIST_KW_C is not set +# end of Symmetric Ciphers + +# CONFIG_MBEDTLS_RIPEMD160_C is not set + +# +# Certificates +# +CONFIG_MBEDTLS_PEM_PARSE_C=y +CONFIG_MBEDTLS_PEM_WRITE_C=y +CONFIG_MBEDTLS_X509_CRL_PARSE_C=y +CONFIG_MBEDTLS_X509_CSR_PARSE_C=y +# end of Certificates + +CONFIG_MBEDTLS_ECP_C=y +# CONFIG_MBEDTLS_DHM_C is not set +CONFIG_MBEDTLS_ECDH_C=y +CONFIG_MBEDTLS_ECDSA_C=y +# CONFIG_MBEDTLS_ECJPAKE_C is not set +CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y +CONFIG_MBEDTLS_ECP_NIST_OPTIM=y +CONFIG_MBEDTLS_ECP_FIXED_POINT_OPTIM=y +# CONFIG_MBEDTLS_POLY1305_C is not set +# CONFIG_MBEDTLS_CHACHA20_C is not set +# CONFIG_MBEDTLS_HKDF_C is not set +# CONFIG_MBEDTLS_THREADING_C is not set +CONFIG_MBEDTLS_ERROR_STRINGS=y +# end of mbedTLS + +# +# ESP-MQTT Configurations +# +CONFIG_MQTT_PROTOCOL_311=y +# CONFIG_MQTT_PROTOCOL_5 is not set +CONFIG_MQTT_TRANSPORT_SSL=y +CONFIG_MQTT_TRANSPORT_WEBSOCKET=y +CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y +# CONFIG_MQTT_MSG_ID_INCREMENTAL is not set +# CONFIG_MQTT_SKIP_PUBLISH_IF_DISCONNECTED is not set +# CONFIG_MQTT_REPORT_DELETED_MESSAGES is not set +# CONFIG_MQTT_USE_CUSTOM_CONFIG is not set +# CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED is not set +# CONFIG_MQTT_CUSTOM_OUTBOX is not set +# end of ESP-MQTT Configurations + +# +# Newlib +# +CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y +# CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF is not set +# CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR is not set +# CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF is not set +# CONFIG_NEWLIB_STDIN_LINE_ENDING_LF is not set +CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y +# CONFIG_NEWLIB_NANO_FORMAT is not set +CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y +# CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set +# end of Newlib + +# +# NVS +# +# CONFIG_NVS_ENCRYPTION is not set +# CONFIG_NVS_ASSERT_ERROR_CHECK is not set +# CONFIG_NVS_LEGACY_DUP_KEYS_COMPATIBILITY is not set +# end of NVS + +# +# OpenThread +# +# CONFIG_OPENTHREAD_ENABLED is not set + +# +# Thread Operational Dataset +# +CONFIG_OPENTHREAD_NETWORK_NAME="OpenThread-ESP" +CONFIG_OPENTHREAD_MESH_LOCAL_PREFIX="fd00:db8:a0:0::/64" +CONFIG_OPENTHREAD_NETWORK_CHANNEL=15 +CONFIG_OPENTHREAD_NETWORK_PANID=0x1234 +CONFIG_OPENTHREAD_NETWORK_EXTPANID="dead00beef00cafe" +CONFIG_OPENTHREAD_NETWORK_MASTERKEY="00112233445566778899aabbccddeeff" +CONFIG_OPENTHREAD_NETWORK_PSKC="104810e2315100afd6bc9215a6bfac53" +# end of Thread Operational Dataset + +CONFIG_OPENTHREAD_XTAL_ACCURACY=130 +# CONFIG_OPENTHREAD_SPINEL_ONLY is not set +# CONFIG_OPENTHREAD_RX_ON_WHEN_IDLE is not set + +# +# Thread Address Query Config +# +# end of Thread Address Query Config +# end of OpenThread + +# +# Protocomm +# +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_0=y +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_1=y +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_2=y +# end of Protocomm + +# +# PThreads +# +CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_PTHREAD_STACK_MIN=768 +CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" +# end of PThreads + +# +# MMU Config +# +CONFIG_MMU_PAGE_SIZE_32KB=y +CONFIG_MMU_PAGE_MODE="32KB" +CONFIG_MMU_PAGE_SIZE=0x8000 +# end of MMU Config + +# +# Main Flash configuration +# + +# +# SPI Flash behavior when brownout +# +CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y +CONFIG_SPI_FLASH_BROWNOUT_RESET=y +# end of SPI Flash behavior when brownout + +# +# Optional and Experimental Features (READ DOCS FIRST) +# + +# +# Features here require specific hardware (READ DOCS FIRST!) +# +CONFIG_SPI_FLASH_SUSPEND_TSUS_VAL_US=50 +# end of Optional and Experimental Features (READ DOCS FIRST) +# end of Main Flash configuration + +# +# SPI Flash driver +# +# CONFIG_SPI_FLASH_VERIFY_WRITE is not set +# CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set +CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y +# CONFIG_SPI_FLASH_ROM_IMPL is not set +CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set +# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set +CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y +CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20 +CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=1 +CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192 +# CONFIG_SPI_FLASH_SIZE_OVERRIDE is not set +# CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED is not set +# CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST is not set + +# +# Auto-detect flash chips +# +CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORTED=y +# CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP is not set +# CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP is not set +# CONFIG_SPI_FLASH_SUPPORT_GD_CHIP is not set +# CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP is not set +# CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP is not set +# CONFIG_SPI_FLASH_SUPPORT_TH_CHIP is not set +# end of Auto-detect flash chips + +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=y +# end of SPI Flash driver + +# +# SPIFFS Configuration +# +CONFIG_SPIFFS_MAX_PARTITIONS=3 + +# +# SPIFFS Cache Configuration +# +CONFIG_SPIFFS_CACHE=y +CONFIG_SPIFFS_CACHE_WR=y +# CONFIG_SPIFFS_CACHE_STATS is not set +# end of SPIFFS Cache Configuration + +CONFIG_SPIFFS_PAGE_CHECK=y +CONFIG_SPIFFS_GC_MAX_RUNS=10 +# CONFIG_SPIFFS_GC_STATS is not set +CONFIG_SPIFFS_PAGE_SIZE=256 +CONFIG_SPIFFS_OBJ_NAME_LEN=32 +# CONFIG_SPIFFS_FOLLOW_SYMLINKS is not set +CONFIG_SPIFFS_USE_MAGIC=y +CONFIG_SPIFFS_USE_MAGIC_LENGTH=y +CONFIG_SPIFFS_META_LENGTH=4 +CONFIG_SPIFFS_USE_MTIME=y + +# +# Debug Configuration +# +# CONFIG_SPIFFS_DBG is not set +# CONFIG_SPIFFS_API_DBG is not set +# CONFIG_SPIFFS_GC_DBG is not set +# CONFIG_SPIFFS_CACHE_DBG is not set +# CONFIG_SPIFFS_CHECK_DBG is not set +# CONFIG_SPIFFS_TEST_VISUALISATION is not set +# end of Debug Configuration +# end of SPIFFS Configuration + +# +# TCP Transport +# + +# +# Websocket +# +CONFIG_WS_TRANSPORT=y +CONFIG_WS_BUFFER_SIZE=1024 +# CONFIG_WS_DYNAMIC_BUFFER is not set +# end of Websocket +# end of TCP Transport + +# +# Ultra Low Power (ULP) Co-processor +# +# CONFIG_ULP_COPROC_ENABLED is not set + +# +# ULP Debugging Options +# +# end of ULP Debugging Options +# end of Ultra Low Power (ULP) Co-processor + +# +# Unity unit testing library +# +CONFIG_UNITY_ENABLE_FLOAT=y +CONFIG_UNITY_ENABLE_DOUBLE=y +# CONFIG_UNITY_ENABLE_64BIT is not set +# CONFIG_UNITY_ENABLE_COLOR is not set +CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y +# CONFIG_UNITY_ENABLE_FIXTURE is not set +# CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set +# end of Unity unit testing library + +# +# Virtual file system +# +CONFIG_VFS_SUPPORT_IO=y +CONFIG_VFS_SUPPORT_DIR=y +CONFIG_VFS_SUPPORT_SELECT=y +CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y +# CONFIG_VFS_SELECT_IN_RAM is not set +CONFIG_VFS_SUPPORT_TERMIOS=y +CONFIG_VFS_MAX_COUNT=8 + +# +# Host File System I/O (Semihosting) +# +CONFIG_VFS_SEMIHOSTFS_MAX_MOUNT_POINTS=1 +# end of Host File System I/O (Semihosting) +# end of Virtual file system + +# +# Wear Levelling +# +# CONFIG_WL_SECTOR_SIZE_512 is not set +CONFIG_WL_SECTOR_SIZE_4096=y +CONFIG_WL_SECTOR_SIZE=4096 +# end of Wear Levelling + +# +# Wi-Fi Provisioning Manager +# +CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16 +CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30 +# CONFIG_WIFI_PROV_BLE_FORCE_ENCRYPTION is not set +CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN=y +# CONFIG_WIFI_PROV_STA_FAST_SCAN is not set +# end of Wi-Fi Provisioning Manager +# end of Component config + +# CONFIG_IDF_EXPERIMENTAL_FEATURES is not set + +# Deprecated options for backward compatibility +# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set +# CONFIG_NO_BLOBS is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set +CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y +# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set +CONFIG_LOG_BOOTLOADER_LEVEL=3 +# CONFIG_APP_ROLLBACK_ENABLE is not set +# CONFIG_FLASH_ENCRYPTION_ENABLED is not set +# CONFIG_FLASHMODE_QIO is not set +# CONFIG_FLASHMODE_QOUT is not set +CONFIG_FLASHMODE_DIO=y +# CONFIG_FLASHMODE_DOUT is not set +CONFIG_MONITOR_BAUD=115200 +CONFIG_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y +# CONFIG_OPTIMIZATION_LEVEL_RELEASE is not set +# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set +CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y +# CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set +CONFIG_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_CXX_EXCEPTIONS is not set +CONFIG_STACK_CHECK_NONE=y +# CONFIG_STACK_CHECK_NORM is not set +# CONFIG_STACK_CHECK_STRONG is not set +# CONFIG_STACK_CHECK_ALL is not set +# CONFIG_WARN_WRITE_STRINGS is not set +# CONFIG_ESP32_APPTRACE_DEST_TRAX is not set +CONFIG_ESP32_APPTRACE_DEST_NONE=y +CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y +CONFIG_SW_COEXIST_ENABLE=y +CONFIG_ESP32_WIFI_SW_COEXIST_ENABLE=y +CONFIG_ESP_WIFI_SW_COEXIST_ENABLE=y +# CONFIG_EXTERNAL_COEX_ENABLE is not set +# CONFIG_ESP_WIFI_EXTERNAL_COEXIST_ENABLE is not set +# CONFIG_MCPWM_ISR_IN_IRAM is not set +# CONFIG_EVENT_LOOP_PROFILING is not set +CONFIG_POST_EVENTS_FROM_ISR=y +CONFIG_POST_EVENTS_FROM_IRAM_ISR=y +CONFIG_GDBSTUB_SUPPORT_TASKS=y +CONFIG_GDBSTUB_MAX_TASKS=32 +# CONFIG_OTA_ALLOW_HTTP is not set +# CONFIG_ESP_SYSTEM_PD_FLASH is not set +CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y +# CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION is not set +CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20 +CONFIG_ESP32_PHY_MAX_TX_POWER=20 +# CONFIG_REDUCE_PHY_TX_POWER is not set +# CONFIG_ESP32_REDUCE_PHY_TX_POWER is not set +CONFIG_ESP_SYSTEM_PM_POWER_DOWN_CPU=y +CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_MAIN_TASK_STACK_SIZE=3584 +CONFIG_CONSOLE_UART_DEFAULT=y +# CONFIG_CONSOLE_UART_CUSTOM is not set +# CONFIG_CONSOLE_UART_NONE is not set +# CONFIG_ESP_CONSOLE_UART_NONE is not set +CONFIG_CONSOLE_UART=y +CONFIG_CONSOLE_UART_NUM=0 +CONFIG_CONSOLE_UART_BAUDRATE=115200 +CONFIG_INT_WDT=y +CONFIG_INT_WDT_TIMEOUT_MS=300 +CONFIG_TASK_WDT=y +CONFIG_ESP_TASK_WDT=y +# CONFIG_TASK_WDT_PANIC is not set +CONFIG_TASK_WDT_TIMEOUT_S=5 +CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +# CONFIG_ESP32_DEBUG_STUBS_ENABLE is not set +CONFIG_BROWNOUT_DET=y +CONFIG_BROWNOUT_DET_LVL_SEL_7=y +# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set +CONFIG_BROWNOUT_DET_LVL=7 +CONFIG_IPC_TASK_STACK_SIZE=1024 +CONFIG_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP32_WIFI_ENABLED=y +CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10 +CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32 +# CONFIG_ESP32_WIFI_STATIC_TX_BUFFER is not set +CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y +CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1 +CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=32 +# CONFIG_ESP32_WIFI_CSI_ENABLED is not set +CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP32_WIFI_TX_BA_WIN=6 +CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP32_WIFI_RX_BA_WIN=6 +CONFIG_ESP32_WIFI_RX_BA_WIN=6 +CONFIG_ESP32_WIFI_NVS_ENABLED=y +CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 +CONFIG_ESP32_WIFI_IRAM_OPT=y +CONFIG_ESP32_WIFI_RX_IRAM_OPT=y +CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y +CONFIG_ESP32_WIFI_ENABLE_WPA3_OWE_STA=y +CONFIG_WPA_MBEDTLS_CRYPTO=y +CONFIG_WPA_MBEDTLS_TLS_CLIENT=y +# CONFIG_WPA_WAPI_PSK is not set +# CONFIG_WPA_SUITE_B_192 is not set +# CONFIG_WPA_11KV_SUPPORT is not set +# CONFIG_WPA_MBO_SUPPORT is not set +# CONFIG_WPA_DPP_SUPPORT is not set +# CONFIG_WPA_11R_SUPPORT is not set +# CONFIG_WPA_WPS_SOFTAP_REGISTRAR is not set +# CONFIG_WPA_WPS_STRICT is not set +# CONFIG_WPA_DEBUG_PRINT is not set +# CONFIG_WPA_TESTING_OPTIONS is not set +# CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set +# CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set +CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y +CONFIG_TIMER_TASK_PRIORITY=1 +CONFIG_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_TIMER_QUEUE_LENGTH=10 +# CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK is not set +# CONFIG_HAL_ASSERTION_SILIENT is not set +# CONFIG_L2_TO_L3_COPY is not set +CONFIG_ESP_GRATUITOUS_ARP=y +CONFIG_GARP_TMR_INTERVAL=60 +CONFIG_TCPIP_RECVMBOX_SIZE=32 +CONFIG_TCP_MAXRTX=12 +CONFIG_TCP_SYNMAXRTX=12 +CONFIG_TCP_MSS=1440 +CONFIG_TCP_MSL=60000 +CONFIG_TCP_SND_BUF_DEFAULT=5760 +CONFIG_TCP_WND_DEFAULT=5760 +CONFIG_TCP_RECVMBOX_SIZE=6 +CONFIG_TCP_QUEUE_OOSEQ=y +CONFIG_TCP_OVERSIZE_MSS=y +# CONFIG_TCP_OVERSIZE_QUARTER_MSS is not set +# CONFIG_TCP_OVERSIZE_DISABLE is not set +CONFIG_UDP_RECVMBOX_SIZE=6 +CONFIG_TCPIP_TASK_STACK_SIZE=3072 +CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_TCPIP_TASK_AFFINITY_CPU0 is not set +CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF +CONFIG_PPP_SUPPORT=y +# CONFIG_PPP_NOTIFY_PHASE_SUPPORT is not set +# CONFIG_PPP_PAP_SUPPORT is not set +# CONFIG_PPP_CHAP_SUPPORT is not set +# CONFIG_PPP_MSCHAP_SUPPORT is not set +# CONFIG_PPP_MPPE_SUPPORT is not set +# CONFIG_PPP_DEBUG_ON is not set +CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_ESP32_PTHREAD_STACK_MIN=768 +CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread" +CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set +CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y +CONFIG_SUPPORT_TERMIOS=y +CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1 +# End of deprecated options diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/sdkconfig.ci b/WiFi_SD_Shield_V1/Firmware/espc6/sdkconfig.ci new file mode 100644 index 0000000..b416e9f --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/sdkconfig.ci @@ -0,0 +1,2 @@ +CONFIG_ESP_WIFI_SSID="ssid_${IDF_TARGET}_${CI_PIPELINE_ID}" +CONFIG_ESP_WIFI_PASSWORD="password_${IDF_TARGET}_${CI_PIPELINE_ID}" diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/sdkconfig.ci.esp32c2_xtal26m b/WiFi_SD_Shield_V1/Firmware/espc6/sdkconfig.ci.esp32c2_xtal26m new file mode 100644 index 0000000..172f022 --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/sdkconfig.ci.esp32c2_xtal26m @@ -0,0 +1,2 @@ +CONFIG_IDF_TARGET="esp32c2" +CONFIG_XTAL_FREQ_26=y diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/sdkconfig.defaults b/WiFi_SD_Shield_V1/Firmware/espc6/sdkconfig.defaults new file mode 100644 index 0000000..cf2d4f2 --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/sdkconfig.defaults @@ -0,0 +1 @@ +CONFIG_ESP_WIFI_SOFTAP_SUPPORT=y diff --git a/WiFi_SD_Shield_V1/Firmware/espc6/sdkconfig.old b/WiFi_SD_Shield_V1/Firmware/espc6/sdkconfig.old new file mode 100644 index 0000000..bda95e0 --- /dev/null +++ b/WiFi_SD_Shield_V1/Firmware/espc6/sdkconfig.old @@ -0,0 +1,2372 @@ +# +# Automatically generated file. DO NOT EDIT. +# Espressif IoT Development Framework (ESP-IDF) 5.3.1 Project Configuration +# +CONFIG_SOC_ADC_SUPPORTED=y +CONFIG_SOC_DEDICATED_GPIO_SUPPORTED=y +CONFIG_SOC_UART_SUPPORTED=y +CONFIG_SOC_GDMA_SUPPORTED=y +CONFIG_SOC_AHB_GDMA_SUPPORTED=y +CONFIG_SOC_GPTIMER_SUPPORTED=y +CONFIG_SOC_PCNT_SUPPORTED=y +CONFIG_SOC_MCPWM_SUPPORTED=y +CONFIG_SOC_TWAI_SUPPORTED=y +CONFIG_SOC_ETM_SUPPORTED=y +CONFIG_SOC_PARLIO_SUPPORTED=y +CONFIG_SOC_BT_SUPPORTED=y +CONFIG_SOC_IEEE802154_SUPPORTED=y +CONFIG_SOC_ASYNC_MEMCPY_SUPPORTED=y +CONFIG_SOC_USB_SERIAL_JTAG_SUPPORTED=y +CONFIG_SOC_TEMP_SENSOR_SUPPORTED=y +CONFIG_SOC_PHY_SUPPORTED=y +CONFIG_SOC_WIFI_SUPPORTED=y +CONFIG_SOC_SUPPORTS_SECURE_DL_MODE=y +CONFIG_SOC_ULP_SUPPORTED=y +CONFIG_SOC_LP_CORE_SUPPORTED=y +CONFIG_SOC_EFUSE_KEY_PURPOSE_FIELD=y +CONFIG_SOC_EFUSE_SUPPORTED=y +CONFIG_SOC_RTC_FAST_MEM_SUPPORTED=y +CONFIG_SOC_RTC_MEM_SUPPORTED=y +CONFIG_SOC_I2S_SUPPORTED=y +CONFIG_SOC_RMT_SUPPORTED=y +CONFIG_SOC_SDM_SUPPORTED=y +CONFIG_SOC_GPSPI_SUPPORTED=y +CONFIG_SOC_LEDC_SUPPORTED=y +CONFIG_SOC_I2C_SUPPORTED=y +CONFIG_SOC_SYSTIMER_SUPPORTED=y +CONFIG_SOC_SUPPORT_COEXISTENCE=y +CONFIG_SOC_AES_SUPPORTED=y +CONFIG_SOC_MPI_SUPPORTED=y +CONFIG_SOC_SHA_SUPPORTED=y +CONFIG_SOC_HMAC_SUPPORTED=y +CONFIG_SOC_DIG_SIGN_SUPPORTED=y +CONFIG_SOC_ECC_SUPPORTED=y +CONFIG_SOC_FLASH_ENC_SUPPORTED=y +CONFIG_SOC_SECURE_BOOT_SUPPORTED=y +CONFIG_SOC_SDIO_SLAVE_SUPPORTED=y +CONFIG_SOC_BOD_SUPPORTED=y +CONFIG_SOC_APM_SUPPORTED=y +CONFIG_SOC_APM_CTRL_FILTER_SUPPORTED=y +CONFIG_SOC_PMU_SUPPORTED=y +CONFIG_SOC_PAU_SUPPORTED=y +CONFIG_SOC_LP_TIMER_SUPPORTED=y +CONFIG_SOC_LP_AON_SUPPORTED=y +CONFIG_SOC_LP_PERIPHERALS_SUPPORTED=y +CONFIG_SOC_LP_I2C_SUPPORTED=y +CONFIG_SOC_ULP_LP_UART_SUPPORTED=y +CONFIG_SOC_CLK_TREE_SUPPORTED=y +CONFIG_SOC_ASSIST_DEBUG_SUPPORTED=y +CONFIG_SOC_WDT_SUPPORTED=y +CONFIG_SOC_SPI_FLASH_SUPPORTED=y +CONFIG_SOC_RNG_SUPPORTED=y +CONFIG_SOC_LIGHT_SLEEP_SUPPORTED=y +CONFIG_SOC_DEEP_SLEEP_SUPPORTED=y +CONFIG_SOC_MODEM_CLOCK_SUPPORTED=y +CONFIG_SOC_PM_SUPPORTED=y +CONFIG_SOC_XTAL_SUPPORT_40M=y +CONFIG_SOC_AES_SUPPORT_DMA=y +CONFIG_SOC_AES_GDMA=y +CONFIG_SOC_AES_SUPPORT_AES_128=y +CONFIG_SOC_AES_SUPPORT_AES_256=y +CONFIG_SOC_ADC_DIG_CTRL_SUPPORTED=y +CONFIG_SOC_ADC_DIG_IIR_FILTER_SUPPORTED=y +CONFIG_SOC_ADC_MONITOR_SUPPORTED=y +CONFIG_SOC_ADC_DMA_SUPPORTED=y +CONFIG_SOC_ADC_PERIPH_NUM=1 +CONFIG_SOC_ADC_MAX_CHANNEL_NUM=7 +CONFIG_SOC_ADC_ATTEN_NUM=4 +CONFIG_SOC_ADC_DIGI_CONTROLLER_NUM=1 +CONFIG_SOC_ADC_PATT_LEN_MAX=8 +CONFIG_SOC_ADC_DIGI_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_DIGI_MIN_BITWIDTH=12 +CONFIG_SOC_ADC_DIGI_IIR_FILTER_NUM=2 +CONFIG_SOC_ADC_DIGI_MONITOR_NUM=2 +CONFIG_SOC_ADC_DIGI_RESULT_BYTES=4 +CONFIG_SOC_ADC_DIGI_DATA_BYTES_PER_CONV=4 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH=83333 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW=611 +CONFIG_SOC_ADC_RTC_MIN_BITWIDTH=12 +CONFIG_SOC_ADC_RTC_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_CALIBRATION_V1_SUPPORTED=y +CONFIG_SOC_ADC_SELF_HW_CALI_SUPPORTED=y +CONFIG_SOC_ADC_CALIB_CHAN_COMPENS_SUPPORTED=y +CONFIG_SOC_ADC_TEMPERATURE_SHARE_INTR=y +CONFIG_SOC_ADC_SHARED_POWER=y +CONFIG_SOC_BROWNOUT_RESET_SUPPORTED=y +CONFIG_SOC_SHARED_IDCACHE_SUPPORTED=y +CONFIG_SOC_CACHE_FREEZE_SUPPORTED=y +CONFIG_SOC_CPU_CORES_NUM=1 +CONFIG_SOC_CPU_INTR_NUM=32 +CONFIG_SOC_CPU_HAS_FLEXIBLE_INTC=y +CONFIG_SOC_INT_PLIC_SUPPORTED=y +CONFIG_SOC_CPU_HAS_CSR_PC=y +CONFIG_SOC_CPU_BREAKPOINTS_NUM=4 +CONFIG_SOC_CPU_WATCHPOINTS_NUM=4 +CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE=0x80000000 +CONFIG_SOC_CPU_HAS_PMA=y +CONFIG_SOC_CPU_IDRAM_SPLIT_USING_PMP=y +CONFIG_SOC_DS_SIGNATURE_MAX_BIT_LEN=3072 +CONFIG_SOC_DS_KEY_PARAM_MD_IV_LENGTH=16 +CONFIG_SOC_DS_KEY_CHECK_MAX_WAIT_US=1100 +CONFIG_SOC_AHB_GDMA_VERSION=1 +CONFIG_SOC_GDMA_NUM_GROUPS_MAX=1 +CONFIG_SOC_GDMA_PAIRS_PER_GROUP_MAX=3 +CONFIG_SOC_GDMA_SUPPORT_ETM=y +CONFIG_SOC_GDMA_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_ETM_GROUPS=1 +CONFIG_SOC_ETM_CHANNELS_PER_GROUP=50 +CONFIG_SOC_GPIO_PORT=1 +CONFIG_SOC_GPIO_PIN_COUNT=31 +CONFIG_SOC_GPIO_SUPPORT_PIN_GLITCH_FILTER=y +CONFIG_SOC_GPIO_FLEX_GLITCH_FILTER_NUM=8 +CONFIG_SOC_GPIO_SUPPORT_ETM=y +CONFIG_SOC_GPIO_SUPPORT_RTC_INDEPENDENT=y +CONFIG_SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP=y +CONFIG_SOC_LP_IO_CLOCK_IS_INDEPENDENT=y +CONFIG_SOC_GPIO_IN_RANGE_MAX=30 +CONFIG_SOC_GPIO_OUT_RANGE_MAX=30 +CONFIG_SOC_GPIO_DEEP_SLEEP_WAKE_VALID_GPIO_MASK=0 +CONFIG_SOC_GPIO_DEEP_SLEEP_WAKE_SUPPORTED_PIN_CNT=8 +CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0x000000007FFFFF00 +CONFIG_SOC_GPIO_SUPPORT_FORCE_HOLD=y +CONFIG_SOC_GPIO_SUPPORT_HOLD_SINGLE_IO_IN_DSLP=y +CONFIG_SOC_GPIO_CLOCKOUT_BY_GPIO_MATRIX=y +CONFIG_SOC_CLOCKOUT_HAS_SOURCE_GATE=y +CONFIG_SOC_GPIO_CLOCKOUT_CHANNEL_NUM=3 +CONFIG_SOC_RTCIO_PIN_COUNT=8 +CONFIG_SOC_RTCIO_INPUT_OUTPUT_SUPPORTED=y +CONFIG_SOC_RTCIO_HOLD_SUPPORTED=y +CONFIG_SOC_RTCIO_WAKE_SUPPORTED=y +CONFIG_SOC_RTCIO_VALID_RTCIO_MASK=0xFF +CONFIG_SOC_DEDIC_GPIO_OUT_CHANNELS_NUM=8 +CONFIG_SOC_DEDIC_GPIO_IN_CHANNELS_NUM=8 +CONFIG_SOC_DEDIC_PERIPH_ALWAYS_ENABLE=y +CONFIG_SOC_I2C_NUM=2 +CONFIG_SOC_HP_I2C_NUM=1 +CONFIG_SOC_I2C_FIFO_LEN=32 +CONFIG_SOC_I2C_CMD_REG_NUM=8 +CONFIG_SOC_I2C_SUPPORT_SLAVE=y +CONFIG_SOC_I2C_SUPPORT_HW_FSM_RST=y +CONFIG_SOC_I2C_SUPPORT_HW_CLR_BUS=y +CONFIG_SOC_I2C_SUPPORT_XTAL=y +CONFIG_SOC_I2C_SUPPORT_RTC=y +CONFIG_SOC_I2C_SUPPORT_10BIT_ADDR=y +CONFIG_SOC_I2C_SLAVE_SUPPORT_BROADCAST=y +CONFIG_SOC_I2C_SLAVE_CAN_GET_STRETCH_CAUSE=y +CONFIG_SOC_I2C_SLAVE_SUPPORT_I2CRAM_ACCESS=y +CONFIG_SOC_I2C_SLAVE_SUPPORT_SLAVE_UNMATCH=y +CONFIG_SOC_I2C_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_LP_I2C_NUM=1 +CONFIG_SOC_LP_I2C_FIFO_LEN=16 +CONFIG_SOC_I2S_NUM=1 +CONFIG_SOC_I2S_HW_VERSION_2=y +CONFIG_SOC_I2S_SUPPORTS_XTAL=y +CONFIG_SOC_I2S_SUPPORTS_PLL_F160M=y +CONFIG_SOC_I2S_SUPPORTS_PCM=y +CONFIG_SOC_I2S_SUPPORTS_PDM=y +CONFIG_SOC_I2S_SUPPORTS_PDM_TX=y +CONFIG_SOC_I2S_PDM_MAX_TX_LINES=2 +CONFIG_SOC_I2S_SUPPORTS_TDM=y +CONFIG_SOC_LEDC_SUPPORT_PLL_DIV_CLOCK=y +CONFIG_SOC_LEDC_SUPPORT_XTAL_CLOCK=y +CONFIG_SOC_LEDC_CHANNEL_NUM=6 +CONFIG_SOC_LEDC_TIMER_BIT_WIDTH=20 +CONFIG_SOC_LEDC_SUPPORT_FADE_STOP=y +CONFIG_SOC_LEDC_GAMMA_CURVE_FADE_SUPPORTED=y +CONFIG_SOC_LEDC_GAMMA_CURVE_FADE_RANGE_MAX=16 +CONFIG_SOC_LEDC_FADE_PARAMS_BIT_WIDTH=10 +CONFIG_SOC_MMU_PAGE_SIZE_CONFIGURABLE=y +CONFIG_SOC_MMU_PERIPH_NUM=1 +CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=1 +CONFIG_SOC_MMU_DI_VADDR_SHARED=y +CONFIG_SOC_MPU_MIN_REGION_SIZE=0x20000000 +CONFIG_SOC_MPU_REGIONS_MAX_NUM=8 +CONFIG_SOC_PCNT_GROUPS=1 +CONFIG_SOC_PCNT_UNITS_PER_GROUP=4 +CONFIG_SOC_PCNT_CHANNELS_PER_UNIT=2 +CONFIG_SOC_PCNT_THRES_POINT_PER_UNIT=2 +CONFIG_SOC_PCNT_SUPPORT_RUNTIME_THRES_UPDATE=y +CONFIG_SOC_RMT_GROUPS=1 +CONFIG_SOC_RMT_TX_CANDIDATES_PER_GROUP=2 +CONFIG_SOC_RMT_RX_CANDIDATES_PER_GROUP=2 +CONFIG_SOC_RMT_CHANNELS_PER_GROUP=4 +CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL=48 +CONFIG_SOC_RMT_SUPPORT_RX_PINGPONG=y +CONFIG_SOC_RMT_SUPPORT_RX_DEMODULATION=y +CONFIG_SOC_RMT_SUPPORT_TX_ASYNC_STOP=y +CONFIG_SOC_RMT_SUPPORT_TX_LOOP_COUNT=y +CONFIG_SOC_RMT_SUPPORT_TX_LOOP_AUTO_STOP=y +CONFIG_SOC_RMT_SUPPORT_TX_SYNCHRO=y +CONFIG_SOC_RMT_SUPPORT_TX_CARRIER_DATA_ONLY=y +CONFIG_SOC_RMT_SUPPORT_XTAL=y +CONFIG_SOC_RMT_SUPPORT_RC_FAST=y +CONFIG_SOC_MCPWM_GROUPS=1 +CONFIG_SOC_MCPWM_TIMERS_PER_GROUP=3 +CONFIG_SOC_MCPWM_OPERATORS_PER_GROUP=3 +CONFIG_SOC_MCPWM_COMPARATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GENERATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_TRIGGERS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GPIO_FAULTS_PER_GROUP=3 +CONFIG_SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP=y +CONFIG_SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER=3 +CONFIG_SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP=3 +CONFIG_SOC_MCPWM_SWSYNC_CAN_PROPAGATE=y +CONFIG_SOC_MCPWM_SUPPORT_ETM=y +CONFIG_SOC_MCPWM_CAPTURE_CLK_FROM_GROUP=y +CONFIG_SOC_PARLIO_GROUPS=1 +CONFIG_SOC_PARLIO_TX_UNITS_PER_GROUP=1 +CONFIG_SOC_PARLIO_RX_UNITS_PER_GROUP=1 +CONFIG_SOC_PARLIO_TX_UNIT_MAX_DATA_WIDTH=16 +CONFIG_SOC_PARLIO_RX_UNIT_MAX_DATA_WIDTH=16 +CONFIG_SOC_PARLIO_TX_RX_SHARE_INTERRUPT=y +CONFIG_SOC_MPI_MEM_BLOCKS_NUM=4 +CONFIG_SOC_MPI_OPERATIONS_NUM=3 +CONFIG_SOC_RSA_MAX_BIT_LEN=3072 +CONFIG_SOC_SHA_DMA_MAX_BUFFER_SIZE=3968 +CONFIG_SOC_SHA_SUPPORT_DMA=y +CONFIG_SOC_SHA_SUPPORT_RESUME=y +CONFIG_SOC_SHA_GDMA=y +CONFIG_SOC_SHA_SUPPORT_SHA1=y +CONFIG_SOC_SHA_SUPPORT_SHA224=y +CONFIG_SOC_SHA_SUPPORT_SHA256=y +CONFIG_SOC_SDM_GROUPS=1 +CONFIG_SOC_SDM_CHANNELS_PER_GROUP=4 +CONFIG_SOC_SDM_CLK_SUPPORT_PLL_F80M=y +CONFIG_SOC_SDM_CLK_SUPPORT_XTAL=y +CONFIG_SOC_SPI_PERIPH_NUM=2 +CONFIG_SOC_SPI_MAX_CS_NUM=6 +CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE=64 +CONFIG_SOC_SPI_SUPPORT_DDRCLK=y +CONFIG_SOC_SPI_SLAVE_SUPPORT_SEG_TRANS=y +CONFIG_SOC_SPI_SUPPORT_CD_SIG=y +CONFIG_SOC_SPI_SUPPORT_CONTINUOUS_TRANS=y +CONFIG_SOC_SPI_SUPPORT_SLAVE_HD_VER2=y +CONFIG_SOC_SPI_SUPPORT_CLK_XTAL=y +CONFIG_SOC_SPI_SUPPORT_CLK_PLL_F80M=y +CONFIG_SOC_SPI_SUPPORT_CLK_RC_FAST=y +CONFIG_SOC_SPI_SCT_SUPPORTED=y +CONFIG_SOC_SPI_SCT_REG_NUM=14 +CONFIG_SOC_SPI_SCT_BUFFER_NUM_MAX=y +CONFIG_SOC_SPI_SCT_CONF_BITLEN_MAX=0x3FFFA +CONFIG_SOC_MEMSPI_IS_INDEPENDENT=y +CONFIG_SOC_SPI_MAX_PRE_DIVIDER=16 +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_WAIT_IDLE=y +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_SUSPEND=y +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_RESUME=y +CONFIG_SOC_SPI_MEM_SUPPORT_IDLE_INTR=y +CONFIG_SOC_SPI_MEM_SUPPORT_SW_SUSPEND=y +CONFIG_SOC_SPI_MEM_SUPPORT_CHECK_SUS=y +CONFIG_SOC_SPI_MEM_SUPPORT_WRAP=y +CONFIG_SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED=y +CONFIG_SOC_SYSTIMER_COUNTER_NUM=2 +CONFIG_SOC_SYSTIMER_ALARM_NUM=3 +CONFIG_SOC_SYSTIMER_BIT_WIDTH_LO=32 +CONFIG_SOC_SYSTIMER_BIT_WIDTH_HI=20 +CONFIG_SOC_SYSTIMER_FIXED_DIVIDER=y +CONFIG_SOC_SYSTIMER_SUPPORT_RC_FAST=y +CONFIG_SOC_SYSTIMER_INT_LEVEL=y +CONFIG_SOC_SYSTIMER_ALARM_MISS_COMPENSATE=y +CONFIG_SOC_SYSTIMER_SUPPORT_ETM=y +CONFIG_SOC_LP_TIMER_BIT_WIDTH_LO=32 +CONFIG_SOC_LP_TIMER_BIT_WIDTH_HI=16 +CONFIG_SOC_TIMER_GROUPS=2 +CONFIG_SOC_TIMER_GROUP_TIMERS_PER_GROUP=1 +CONFIG_SOC_TIMER_GROUP_COUNTER_BIT_WIDTH=54 +CONFIG_SOC_TIMER_GROUP_SUPPORT_XTAL=y +CONFIG_SOC_TIMER_GROUP_SUPPORT_RC_FAST=y +CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS=2 +CONFIG_SOC_TIMER_SUPPORT_ETM=y +CONFIG_SOC_TIMER_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_MWDT_SUPPORT_XTAL=y +CONFIG_SOC_TWAI_CONTROLLER_NUM=2 +CONFIG_SOC_TWAI_CLK_SUPPORT_XTAL=y +CONFIG_SOC_TWAI_BRP_MIN=2 +CONFIG_SOC_TWAI_BRP_MAX=32768 +CONFIG_SOC_TWAI_SUPPORTS_RX_STATUS=y +CONFIG_SOC_EFUSE_DIS_DOWNLOAD_ICACHE=y +CONFIG_SOC_EFUSE_DIS_PAD_JTAG=y +CONFIG_SOC_EFUSE_DIS_USB_JTAG=y +CONFIG_SOC_EFUSE_DIS_DIRECT_BOOT=y +CONFIG_SOC_EFUSE_SOFT_DIS_JTAG=y +CONFIG_SOC_EFUSE_DIS_ICACHE=y +CONFIG_SOC_EFUSE_BLOCK9_KEY_PURPOSE_QUIRK=y +CONFIG_SOC_SECURE_BOOT_V2_RSA=y +CONFIG_SOC_SECURE_BOOT_V2_ECC=y +CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS=3 +CONFIG_SOC_EFUSE_REVOKE_BOOT_KEY_DIGESTS=y +CONFIG_SOC_SUPPORT_SECURE_BOOT_REVOKE_KEY=y +CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX=64 +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES=y +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_128=y +CONFIG_SOC_CRYPTO_DPA_PROTECTION_SUPPORTED=y +CONFIG_SOC_UART_NUM=3 +CONFIG_SOC_UART_HP_NUM=2 +CONFIG_SOC_UART_LP_NUM=1 +CONFIG_SOC_UART_FIFO_LEN=128 +CONFIG_SOC_LP_UART_FIFO_LEN=16 +CONFIG_SOC_UART_BITRATE_MAX=5000000 +CONFIG_SOC_UART_SUPPORT_PLL_F80M_CLK=y +CONFIG_SOC_UART_SUPPORT_RTC_CLK=y +CONFIG_SOC_UART_SUPPORT_XTAL_CLK=y +CONFIG_SOC_UART_SUPPORT_WAKEUP_INT=y +CONFIG_SOC_UART_HAS_LP_UART=y +CONFIG_SOC_UART_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_UART_SUPPORT_FSM_TX_WAIT_SEND=y +CONFIG_SOC_COEX_HW_PTI=y +CONFIG_SOC_EXTERNAL_COEX_ADVANCE=y +CONFIG_SOC_PHY_DIG_REGS_MEM_SIZE=21 +CONFIG_SOC_WIFI_LIGHT_SLEEP_CLK_WIDTH=12 +CONFIG_SOC_PM_SUPPORT_WIFI_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_BEACON_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_BT_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP_MODE_PER_PIN=y +CONFIG_SOC_PM_SUPPORT_CPU_PD=y +CONFIG_SOC_PM_SUPPORT_MODEM_PD=y +CONFIG_SOC_PM_SUPPORT_XTAL32K_PD=y +CONFIG_SOC_PM_SUPPORT_RC32K_PD=y +CONFIG_SOC_PM_SUPPORT_RC_FAST_PD=y +CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD=y +CONFIG_SOC_PM_SUPPORT_TOP_PD=y +CONFIG_SOC_PM_SUPPORT_HP_AON_PD=y +CONFIG_SOC_PM_SUPPORT_MAC_BB_PD=y +CONFIG_SOC_PM_SUPPORT_RTC_PERIPH_PD=y +CONFIG_SOC_PM_SUPPORT_PMU_MODEM_STATE=y +CONFIG_SOC_PM_SUPPORT_DEEPSLEEP_CHECK_STUB_ONLY=y +CONFIG_SOC_PM_CPU_RETENTION_BY_SW=y +CONFIG_SOC_PM_MODEM_RETENTION_BY_REGDMA=y +CONFIG_SOC_PM_RETENTION_HAS_CLOCK_BUG=y +CONFIG_SOC_PM_PAU_LINK_NUM=4 +CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION=y +CONFIG_SOC_MODEM_CLOCK_IS_INDEPENDENT=y +CONFIG_SOC_CLK_XTAL32K_SUPPORTED=y +CONFIG_SOC_CLK_OSC_SLOW_SUPPORTED=y +CONFIG_SOC_CLK_RC32K_SUPPORTED=y +CONFIG_SOC_RCC_IS_INDEPENDENT=y +CONFIG_SOC_TEMPERATURE_SENSOR_SUPPORT_FAST_RC=y +CONFIG_SOC_TEMPERATURE_SENSOR_SUPPORT_XTAL=y +CONFIG_SOC_TEMPERATURE_SENSOR_INTR_SUPPORT=y +CONFIG_SOC_TEMPERATURE_SENSOR_SUPPORT_ETM=y +CONFIG_SOC_RNG_CLOCK_IS_INDEPENDENT=y +CONFIG_SOC_WIFI_HW_TSF=y +CONFIG_SOC_WIFI_FTM_SUPPORT=y +CONFIG_SOC_WIFI_GCMP_SUPPORT=y +CONFIG_SOC_WIFI_WAPI_SUPPORT=y +CONFIG_SOC_WIFI_CSI_SUPPORT=y +CONFIG_SOC_WIFI_MESH_SUPPORT=y +CONFIG_SOC_WIFI_HE_SUPPORT=y +CONFIG_SOC_BLE_SUPPORTED=y +CONFIG_SOC_BLE_MESH_SUPPORTED=y +CONFIG_SOC_ESP_NIMBLE_CONTROLLER=y +CONFIG_SOC_BLE_50_SUPPORTED=y +CONFIG_SOC_BLE_DEVICE_PRIVACY_SUPPORTED=y +CONFIG_SOC_BLE_POWER_CONTROL_SUPPORTED=y +CONFIG_SOC_BLE_PERIODIC_ADV_ENH_SUPPORTED=y +CONFIG_SOC_BLUFI_SUPPORTED=y +CONFIG_SOC_BLE_MULTI_CONN_OPTIMIZATION=y +CONFIG_SOC_BLE_USE_WIFI_PWR_CLK_WORKAROUND=y +CONFIG_SOC_PHY_COMBO_MODULE=y +CONFIG_SOC_CAPS_NO_RESET_BY_ANA_BOD=y +CONFIG_SOC_LP_CORE_SINGLE_INTERRUPT_VECTOR=y +CONFIG_SOC_LP_CORE_SUPPORT_ETM=y +CONFIG_IDF_CMAKE=y +CONFIG_IDF_TOOLCHAIN="gcc" +CONFIG_IDF_TARGET_ARCH_RISCV=y +CONFIG_IDF_TARGET_ARCH="riscv" +CONFIG_IDF_TARGET="esp32c6" +CONFIG_IDF_INIT_VERSION="5.3.1" +CONFIG_IDF_TARGET_ESP32C6=y +CONFIG_IDF_FIRMWARE_CHIP_ID=0x000D + +# +# Build type +# +CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y +# CONFIG_APP_BUILD_TYPE_RAM is not set +CONFIG_APP_BUILD_GENERATE_BINARIES=y +CONFIG_APP_BUILD_BOOTLOADER=y +CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y +# CONFIG_APP_REPRODUCIBLE_BUILD is not set +# CONFIG_APP_NO_BLOBS is not set +# end of Build type + +# +# Bootloader config +# + +# +# Bootloader manager +# +CONFIG_BOOTLOADER_COMPILE_TIME_DATE=y +CONFIG_BOOTLOADER_PROJECT_VER=1 +# end of Bootloader manager + +CONFIG_BOOTLOADER_OFFSET_IN_FLASH=0x0 +CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set +CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y +# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set +CONFIG_BOOTLOADER_LOG_LEVEL=3 + +# +# Serial Flash Configurations +# +# CONFIG_BOOTLOADER_FLASH_DC_AWARE is not set +CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y +# end of Serial Flash Configurations + +# CONFIG_BOOTLOADER_FACTORY_RESET is not set +# CONFIG_BOOTLOADER_APP_TEST is not set +CONFIG_BOOTLOADER_REGION_PROTECTION_ENABLE=y +CONFIG_BOOTLOADER_WDT_ENABLE=y +# CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE is not set +CONFIG_BOOTLOADER_WDT_TIME_MS=9000 +# CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set +CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0 +# CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set +# end of Bootloader config + +# +# Security features +# +CONFIG_SECURE_BOOT_V2_RSA_SUPPORTED=y +CONFIG_SECURE_BOOT_V2_ECC_SUPPORTED=y +CONFIG_SECURE_BOOT_V2_PREFERRED=y +# CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set +# CONFIG_SECURE_BOOT is not set +# CONFIG_SECURE_FLASH_ENC_ENABLED is not set +CONFIG_SECURE_ROM_DL_MODE_ENABLED=y +# end of Security features + +# +# Application manager +# +CONFIG_APP_COMPILE_TIME_DATE=y +# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set +# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set +# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set +CONFIG_APP_RETRIEVE_LEN_ELF_SHA=9 +# end of Application manager + +CONFIG_ESP_ROM_HAS_CRC_LE=y +CONFIG_ESP_ROM_HAS_CRC_BE=y +CONFIG_ESP_ROM_HAS_JPEG_DECODE=y +CONFIG_ESP_ROM_UART_CLK_IS_XTAL=y +CONFIG_ESP_ROM_USB_SERIAL_DEVICE_NUM=3 +CONFIG_ESP_ROM_HAS_RETARGETABLE_LOCKING=y +CONFIG_ESP_ROM_GET_CLK_FREQ=y +CONFIG_ESP_ROM_HAS_RVFPLIB=y +CONFIG_ESP_ROM_HAS_HAL_WDT=y +CONFIG_ESP_ROM_HAS_HAL_SYSTIMER=y +CONFIG_ESP_ROM_HAS_HEAP_TLSF=y +CONFIG_ESP_ROM_TLSF_CHECK_PATCH=y +CONFIG_ESP_ROM_MULTI_HEAP_WALK_PATCH=y +CONFIG_ESP_ROM_HAS_LAYOUT_TABLE=y +CONFIG_ESP_ROM_HAS_SPI_FLASH=y +CONFIG_ESP_ROM_HAS_REGI2C_BUG=y +CONFIG_ESP_ROM_HAS_NEWLIB=y +CONFIG_ESP_ROM_HAS_NEWLIB_NORMAL_FORMAT=y +CONFIG_ESP_ROM_REV0_HAS_NO_ECDSA_INTERFACE=y +CONFIG_ESP_ROM_WDT_INIT_PATCH=y +CONFIG_ESP_ROM_NEEDS_SET_CACHE_MMU_SIZE=y +CONFIG_ESP_ROM_RAM_APP_NEEDS_MMU_INIT=y +CONFIG_ESP_ROM_HAS_SW_FLOAT=y +CONFIG_ESP_ROM_USB_OTG_NUM=-1 +CONFIG_ESP_ROM_HAS_VERSION=y +CONFIG_ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB=y + +# +# Boot ROM Behavior +# +CONFIG_BOOT_ROM_LOG_ALWAYS_ON=y +# CONFIG_BOOT_ROM_LOG_ALWAYS_OFF is not set +# CONFIG_BOOT_ROM_LOG_ON_GPIO_HIGH is not set +# CONFIG_BOOT_ROM_LOG_ON_GPIO_LOW is not set +# end of Boot ROM Behavior + +# +# Serial flasher config +# +# CONFIG_ESPTOOLPY_NO_STUB is not set +# CONFIG_ESPTOOLPY_FLASHMODE_QIO is not set +# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set +CONFIG_ESPTOOLPY_FLASHMODE_DIO=y +# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set +CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_STR=y +CONFIG_ESPTOOLPY_FLASHMODE="dio" +CONFIG_ESPTOOLPY_FLASHFREQ_80M=y +# CONFIG_ESPTOOLPY_FLASHFREQ_40M is not set +# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set +CONFIG_ESPTOOLPY_FLASHFREQ_80M_DEFAULT=y +CONFIG_ESPTOOLPY_FLASHFREQ="80m" +# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE_2MB=y +# CONFIG_ESPTOOLPY_FLASHSIZE_4MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE="2MB" +# CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE is not set +CONFIG_ESPTOOLPY_BEFORE_RESET=y +# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set +CONFIG_ESPTOOLPY_BEFORE="default_reset" +CONFIG_ESPTOOLPY_AFTER_RESET=y +# CONFIG_ESPTOOLPY_AFTER_NORESET is not set +CONFIG_ESPTOOLPY_AFTER="hard_reset" +CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 +# end of Serial flasher config + +# +# Partition Table +# +CONFIG_PARTITION_TABLE_SINGLE_APP=y +# CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE is not set +# CONFIG_PARTITION_TABLE_TWO_OTA is not set +# CONFIG_PARTITION_TABLE_CUSTOM is not set +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions_singleapp.csv" +CONFIG_PARTITION_TABLE_OFFSET=0x8000 +CONFIG_PARTITION_TABLE_MD5=y +# end of Partition Table + +# +# Arduino Configuration +# +CONFIG_ARDUINO_VARIANT="esp32c6" +CONFIG_ENABLE_ARDUINO_DEPENDS=y +# CONFIG_AUTOSTART_ARDUINO is not set +CONFIG_ARDUINO_RUN_CORE0=y +CONFIG_ARDUINO_RUNNING_CORE=0 +CONFIG_ARDUINO_LOOP_STACK_SIZE=8192 +CONFIG_ARDUINO_EVENT_RUN_CORE0=y +CONFIG_ARDUINO_EVENT_RUNNING_CORE=0 +CONFIG_ARDUINO_SERIAL_EVENT_RUN_CORE0=y +CONFIG_ARDUINO_SERIAL_EVENT_TASK_RUNNING_CORE=0 +CONFIG_ARDUINO_SERIAL_EVENT_TASK_STACK_SIZE=2048 +CONFIG_ARDUINO_SERIAL_EVENT_TASK_PRIORITY=24 +CONFIG_ARDUINO_UDP_RUN_CORE0=y +CONFIG_ARDUINO_UDP_RUNNING_CORE=0 +CONFIG_ARDUINO_UDP_TASK_PRIORITY=3 +CONFIG_ARDUINO_UDP_TASK_STACK_SIZE=4096 +# CONFIG_ARDUINO_ISR_IRAM is not set +# CONFIG_DISABLE_HAL_LOCKS is not set + +# +# Debug Log Configuration +# +# CONFIG_ARDUHAL_LOG_DEFAULT_LEVEL_NONE is not set +CONFIG_ARDUHAL_LOG_DEFAULT_LEVEL_ERROR=y +# CONFIG_ARDUHAL_LOG_DEFAULT_LEVEL_WARN is not set +# CONFIG_ARDUHAL_LOG_DEFAULT_LEVEL_INFO is not set +# CONFIG_ARDUHAL_LOG_DEFAULT_LEVEL_DEBUG is not set +# CONFIG_ARDUHAL_LOG_DEFAULT_LEVEL_VERBOSE is not set +CONFIG_ARDUHAL_LOG_DEFAULT_LEVEL=1 +# CONFIG_ARDUHAL_LOG_COLORS is not set +# CONFIG_ARDUHAL_ESP_LOG is not set +# end of Debug Log Configuration + +CONFIG_ARDUHAL_PARTITION_SCHEME_DEFAULT=y +# CONFIG_ARDUHAL_PARTITION_SCHEME_MINIMAL is not set +# CONFIG_ARDUHAL_PARTITION_SCHEME_NO_OTA is not set +# CONFIG_ARDUHAL_PARTITION_SCHEME_HUGE_APP is not set +# CONFIG_ARDUHAL_PARTITION_SCHEME_MIN_SPIFFS is not set +CONFIG_ARDUHAL_PARTITION_SCHEME="default" +# CONFIG_ARDUINO_SELECTIVE_COMPILATION is not set +# end of Arduino Configuration + +# +# ESP RainMaker Config +# +# CONFIG_ESP_RMAKER_NO_CLAIM is not set +CONFIG_ESP_RMAKER_SELF_CLAIM=y +# CONFIG_ESP_RMAKER_CLAIM_KEY_RSA is not set +CONFIG_ESP_RMAKER_CLAIM_KEY_ECDSA=y +CONFIG_ESP_RMAKER_CLAIM_KEY_TYPE=1 +CONFIG_ESP_RMAKER_USE_NVS=y +CONFIG_ESP_RMAKER_CLAIM_TYPE=1 +CONFIG_ESP_RMAKER_CLAIM_SERVICE_BASE_URL="https://esp-claiming.rainmaker.espressif.com" +# CONFIG_ESP_RMAKER_CLAIM_VIDEOSTREAM_SUPPORT is not set +# CONFIG_ESP_RMAKER_READ_MQTT_HOST_FROM_CONFIG is not set +# CONFIG_ESP_RMAKER_READ_NODE_ID_FROM_CERT_CN is not set +CONFIG_ESP_RMAKER_MQTT_HOST="mqtt.rainmaker.espressif.com" +CONFIG_ESP_RMAKER_MQTT_CRED_HOST="c10yordfvrjdjb.credentials.iot.us-east-1.amazonaws.com" +CONFIG_ESP_RMAKER_MQTT_USE_BASIC_INGEST_TOPICS=y +CONFIG_ESP_RMAKER_MQTT_ENABLE_BUDGETING=y +CONFIG_ESP_RMAKER_MQTT_DEFAULT_BUDGET=100 +CONFIG_ESP_RMAKER_MQTT_MAX_BUDGET=1024 +CONFIG_ESP_RMAKER_MQTT_BUDGET_REVIVE_PERIOD=5 +CONFIG_ESP_RMAKER_MQTT_BUDGET_REVIVE_COUNT=1 +CONFIG_ESP_RMAKER_MAX_PARAM_DATA_SIZE=1024 +# CONFIG_ESP_RMAKER_DISABLE_USER_MAPPING_PROV is not set +CONFIG_ESP_RMAKER_FACTORY_RESET_REPORTING=y +CONFIG_ESP_RMAKER_ENABLE_CHALLENGE_RESPONSE=y +# CONFIG_ESP_RMAKER_ON_NETWORK_CHAL_RESP_ENABLE is not set +# CONFIG_ESP_RMAKER_ENABLE_PROV_LOCAL_CTRL is not set +# CONFIG_RMAKER_NAME_PARAM_CB is not set +# CONFIG_ESP_RMAKER_LOCAL_CTRL_FEATURE_ENABLE is not set +# CONFIG_ESP_RMAKER_LOCAL_CTRL_AUTO_ENABLE is not set +CONFIG_ESP_RMAKER_CONSOLE_UART_NUM_0=y +# CONFIG_ESP_RMAKER_CONSOLE_UART_NUM_1 is not set +CONFIG_ESP_RMAKER_CONSOLE_UART_NUM=0 +# CONFIG_ESP_RMAKER_CONSOLE_PARAM_CMDS_ENABLE is not set +CONFIG_ESP_RMAKER_USE_CERT_BUNDLE=y + +# +# ESP RainMaker OTA Config +# +CONFIG_ESP_RMAKER_OTA_AUTOFETCH=y +CONFIG_ESP_RMAKER_OTA_AUTOFETCH_PERIOD=0 +# CONFIG_ESP_RMAKER_SKIP_COMMON_NAME_CHECK is not set +# CONFIG_ESP_RMAKER_SKIP_VERSION_CHECK is not set +# CONFIG_ESP_RMAKER_SKIP_SECURE_VERSION_CHECK is not set +# CONFIG_ESP_RMAKER_SKIP_PROJECT_NAME_CHECK is not set +CONFIG_ESP_RMAKER_OTA_ROLLBACK_WAIT_PERIOD=90 +# CONFIG_ESP_RMAKER_OTA_ROLLBACK_REPORT_FAILED is not set +# CONFIG_ESP_RMAKER_OTA_DISABLE_AUTO_REBOOT is not set +CONFIG_ESP_RMAKER_OTA_TIME_SUPPORT=y +# CONFIG_ESP_RMAKER_OTA_PROGRESS_SUPPORT is not set +CONFIG_ESP_RMAKER_OTA_MAX_RETRIES=3 +CONFIG_ESP_RMAKER_OTA_RETRY_DELAY_MINUTES=5 +CONFIG_ESP_RMAKER_HTTP_OTA_RESUMPTION=y +CONFIG_ESP_RMAKER_OTA_USE_HTTPS=y +# CONFIG_ESP_RMAKER_OTA_USE_MQTT is not set +CONFIG_ESP_RMAKER_OTA_HTTP_RX_BUFFER_SIZE=1024 +# end of ESP RainMaker OTA Config + +# +# ESP RainMaker Time Service +# +# CONFIG_ESP_RMAKER_TIME_CURRENT_TIME_PARAM is not set +# end of ESP RainMaker Time Service + +# +# ESP RainMaker Scheduling +# +CONFIG_ESP_RMAKER_SCHEDULING_MAX_SCHEDULES=10 +CONFIG_ESP_RMAKER_SCHEDULE_ENABLE_DAYLIGHT=y +# end of ESP RainMaker Scheduling + +# +# ESP RainMaker Scenes +# +CONFIG_ESP_RMAKER_SCENES_MAX_SCENES=10 +# CONFIG_ESP_RMAKER_SCENES_DEACTIVATE_SUPPORT is not set +# end of ESP RainMaker Scenes + +# +# ESP RainMaker Connectivity Service +# +CONFIG_ESP_RMAKER_CONNECTIVITY_REPORT_DELAY=5 +# end of ESP RainMaker Connectivity Service + +# +# ESP RainMaker Command-Response +# +CONFIG_ESP_RMAKER_CMD_RESP_ENABLE=y +CONFIG_ESP_RMAKER_PARAM_CMD_RESP_ENABLE=y +CONFIG_ESP_RMAKER_PARAM_CMD_RESP_BUFFER_SIZE=2048 +# CONFIG_ESP_RMAKER_CMD_RESP_TEST_ENABLE is not set +# end of ESP RainMaker Command-Response + +CONFIG_ESP_RMAKER_NETWORK_OVER_WIFI=y +# end of ESP RainMaker Config + +# +# Compiler options +# +CONFIG_COMPILER_OPTIMIZATION_DEBUG=y +# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set +# CONFIG_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_COMPILER_OPTIMIZATION_NONE is not set +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set +# CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB is not set +CONFIG_COMPILER_FLOAT_LIB_FROM_RVFPLIB=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set +CONFIG_COMPILER_HIDE_PATHS_MACROS=y +# CONFIG_COMPILER_CXX_EXCEPTIONS is not set +# CONFIG_COMPILER_CXX_RTTI is not set +CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y +# CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set +# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set +# CONFIG_COMPILER_SAVE_RESTORE_LIBCALLS is not set +# CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC13_WARNINGS is not set +# CONFIG_COMPILER_DUMP_RTL_FILES is not set +CONFIG_COMPILER_RT_LIB_GCCLIB=y +CONFIG_COMPILER_RT_LIB_NAME="gcc" +# CONFIG_COMPILER_ORPHAN_SECTIONS_WARNING is not set +CONFIG_COMPILER_ORPHAN_SECTIONS_PLACE=y +# end of Compiler options + +# +# Component config +# + +# +# Application Level Tracing +# +# CONFIG_APPTRACE_DEST_JTAG is not set +CONFIG_APPTRACE_DEST_NONE=y +# CONFIG_APPTRACE_DEST_UART1 is not set +# CONFIG_APPTRACE_DEST_UART2 is not set +CONFIG_APPTRACE_DEST_UART_NONE=y +CONFIG_APPTRACE_UART_TASK_PRIO=1 +CONFIG_APPTRACE_LOCK_ENABLE=y +# end of Application Level Tracing + +# +# Bluetooth +# +# CONFIG_BT_ENABLED is not set +CONFIG_BT_ALARM_MAX_NUM=50 +# end of Bluetooth + +# +# Console Library +# +# CONFIG_CONSOLE_SORTED_HELP is not set +# end of Console Library + +# +# Driver Configurations +# + +# +# TWAI Configuration +# +# CONFIG_TWAI_ISR_IN_IRAM is not set +# end of TWAI Configuration + +# +# Legacy ADC Driver Configuration +# +# CONFIG_ADC_SUPPRESS_DEPRECATE_WARN is not set + +# +# Legacy ADC Calibration Configuration +# +# CONFIG_ADC_CALI_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy ADC Calibration Configuration +# end of Legacy ADC Driver Configuration + +# +# Legacy MCPWM Driver Configurations +# +# CONFIG_MCPWM_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy MCPWM Driver Configurations + +# +# Legacy Timer Group Driver Configurations +# +# CONFIG_GPTIMER_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy Timer Group Driver Configurations + +# +# Legacy RMT Driver Configurations +# +# CONFIG_RMT_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy RMT Driver Configurations + +# +# Legacy I2S Driver Configurations +# +# CONFIG_I2S_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy I2S Driver Configurations + +# +# Legacy PCNT Driver Configurations +# +# CONFIG_PCNT_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy PCNT Driver Configurations + +# +# Legacy SDM Driver Configurations +# +# CONFIG_SDM_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy SDM Driver Configurations + +# +# Legacy Temperature Sensor Driver Configurations +# +# CONFIG_TEMP_SENSOR_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy Temperature Sensor Driver Configurations +# end of Driver Configurations + +# +# eFuse Bit Manager +# +# CONFIG_EFUSE_CUSTOM_TABLE is not set +# CONFIG_EFUSE_VIRTUAL is not set +CONFIG_EFUSE_MAX_BLK_LEN=256 +# end of eFuse Bit Manager + +# +# ESP-TLS +# +CONFIG_ESP_TLS_USING_MBEDTLS=y +CONFIG_ESP_TLS_USE_DS_PERIPHERAL=y +# CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS is not set +# CONFIG_ESP_TLS_SERVER_SESSION_TICKETS is not set +# CONFIG_ESP_TLS_SERVER_CERT_SELECT_HOOK is not set +# CONFIG_ESP_TLS_SERVER_MIN_AUTH_MODE_OPTIONAL is not set +# CONFIG_ESP_TLS_PSK_VERIFICATION is not set +# CONFIG_ESP_TLS_INSECURE is not set +# end of ESP-TLS + +# +# ADC and ADC Calibration +# +# CONFIG_ADC_ONESHOT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_ADC_CONTINUOUS_ISR_IRAM_SAFE is not set +# CONFIG_ADC_ENABLE_DEBUG_LOG is not set +# end of ADC and ADC Calibration + +# +# Wireless Coexistence +# +CONFIG_ESP_COEX_ENABLED=y +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=y +# CONFIG_ESP_COEX_EXTERNAL_COEXIST_ENABLE is not set +# CONFIG_ESP_COEX_POWER_MANAGEMENT is not set +# end of Wireless Coexistence + +# +# Common ESP-related +# +CONFIG_ESP_ERR_TO_NAME_LOOKUP=y +# end of Common ESP-related + +# +# ESP-Driver:GPIO Configurations +# +# CONFIG_GPIO_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:GPIO Configurations + +# +# ESP-Driver:GPTimer Configurations +# +CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM=y +# CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM is not set +# CONFIG_GPTIMER_ISR_IRAM_SAFE is not set +# CONFIG_GPTIMER_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:GPTimer Configurations + +# +# ESP-Driver:I2C Configurations +# +# CONFIG_I2C_ISR_IRAM_SAFE is not set +# CONFIG_I2C_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:I2C Configurations + +# +# ESP-Driver:I2S Configurations +# +# CONFIG_I2S_ISR_IRAM_SAFE is not set +# CONFIG_I2S_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:I2S Configurations + +# +# ESP-Driver:LEDC Configurations +# +# CONFIG_LEDC_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:LEDC Configurations + +# +# ESP-Driver:MCPWM Configurations +# +# CONFIG_MCPWM_ISR_IRAM_SAFE is not set +# CONFIG_MCPWM_CTRL_FUNC_IN_IRAM is not set +# CONFIG_MCPWM_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:MCPWM Configurations + +# +# ESP-Driver:Parallel IO Configurations +# +# CONFIG_PARLIO_ENABLE_DEBUG_LOG is not set +# CONFIG_PARLIO_ISR_IRAM_SAFE is not set +# end of ESP-Driver:Parallel IO Configurations + +# +# ESP-Driver:PCNT Configurations +# +# CONFIG_PCNT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_PCNT_ISR_IRAM_SAFE is not set +# CONFIG_PCNT_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:PCNT Configurations + +# +# ESP-Driver:RMT Configurations +# +# CONFIG_RMT_ISR_IRAM_SAFE is not set +# CONFIG_RMT_RECV_FUNC_IN_IRAM is not set +# CONFIG_RMT_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:RMT Configurations + +# +# ESP-Driver:Sigma Delta Modulator Configurations +# +# CONFIG_SDM_CTRL_FUNC_IN_IRAM is not set +# CONFIG_SDM_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:Sigma Delta Modulator Configurations + +# +# ESP-Driver:SPI Configurations +# +# CONFIG_SPI_MASTER_IN_IRAM is not set +CONFIG_SPI_MASTER_ISR_IN_IRAM=y +# CONFIG_SPI_SLAVE_IN_IRAM is not set +CONFIG_SPI_SLAVE_ISR_IN_IRAM=y +# end of ESP-Driver:SPI Configurations + +# +# ESP-Driver:Temperature Sensor Configurations +# +# CONFIG_TEMP_SENSOR_ENABLE_DEBUG_LOG is not set +# CONFIG_TEMP_SENSOR_ISR_IRAM_SAFE is not set +# end of ESP-Driver:Temperature Sensor Configurations + +# +# ESP-Driver:UART Configurations +# +# CONFIG_UART_ISR_IN_IRAM is not set +# end of ESP-Driver:UART Configurations + +# +# ESP-Driver:USB Serial/JTAG Configuration +# +CONFIG_USJ_ENABLE_USB_SERIAL_JTAG=y +# end of ESP-Driver:USB Serial/JTAG Configuration + +# +# Ethernet +# +CONFIG_ETH_ENABLED=y +CONFIG_ETH_USE_SPI_ETHERNET=y +# CONFIG_ETH_SPI_ETHERNET_DM9051 is not set +# CONFIG_ETH_SPI_ETHERNET_W5500 is not set +# CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL is not set +# CONFIG_ETH_USE_OPENETH is not set +# CONFIG_ETH_TRANSMIT_MUTEX is not set +# end of Ethernet + +# +# Event Loop Library +# +# CONFIG_ESP_EVENT_LOOP_PROFILING is not set +CONFIG_ESP_EVENT_POST_FROM_ISR=y +CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y +# end of Event Loop Library + +# +# GDB Stub +# +CONFIG_ESP_GDBSTUB_ENABLED=y +# CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set +CONFIG_ESP_GDBSTUB_SUPPORT_TASKS=y +CONFIG_ESP_GDBSTUB_MAX_TASKS=32 +# end of GDB Stub + +# +# ESP HTTP client +# +CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y +# CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set +# CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH is not set +# CONFIG_ESP_HTTP_CLIENT_ENABLE_CUSTOM_TRANSPORT is not set +# end of ESP HTTP client + +# +# HTTP Server +# +CONFIG_HTTPD_MAX_REQ_HDR_LEN=512 +CONFIG_HTTPD_MAX_URI_LEN=512 +CONFIG_HTTPD_ERR_RESP_NO_DELAY=y +CONFIG_HTTPD_PURGE_BUF_LEN=32 +# CONFIG_HTTPD_LOG_PURGE_DATA is not set +# CONFIG_HTTPD_WS_SUPPORT is not set +# CONFIG_HTTPD_QUEUE_WORK_BLOCKING is not set +# end of HTTP Server + +# +# ESP HTTPS OTA +# +# CONFIG_ESP_HTTPS_OTA_DECRYPT_CB is not set +# CONFIG_ESP_HTTPS_OTA_ALLOW_HTTP is not set +# end of ESP HTTPS OTA + +# +# ESP HTTPS server +# +# CONFIG_ESP_HTTPS_SERVER_ENABLE is not set +# end of ESP HTTPS server + +# +# Hardware Settings +# + +# +# Chip revision +# +CONFIG_ESP32C6_REV_MIN_0=y +# CONFIG_ESP32C6_REV_MIN_1 is not set +CONFIG_ESP32C6_REV_MIN_FULL=0 +CONFIG_ESP_REV_MIN_FULL=0 + +# +# Maximum Supported ESP32-C6 Revision (Rev v0.99) +# +CONFIG_ESP32C6_REV_MAX_FULL=99 +CONFIG_ESP_REV_MAX_FULL=99 +# end of Chip revision + +# +# MAC Config +# +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_IEEE802154=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP32C6_UNIVERSAL_MAC_ADDRESSES_TWO is not set +CONFIG_ESP32C6_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP32C6_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP_MAC_USE_CUSTOM_MAC_AS_BASE_MAC is not set +# end of MAC Config + +# +# Sleep Config +# +# CONFIG_ESP_SLEEP_POWER_DOWN_FLASH is not set +CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=y +# CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU is not set +CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND=y +CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY=0 +# CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION is not set +# CONFIG_ESP_SLEEP_DEBUG is not set +CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS=y +# end of Sleep Config + +# +# RTC Clock Config +# +CONFIG_RTC_CLK_SRC_INT_RC=y +# CONFIG_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_RTC_CLK_SRC_INT_RC32K is not set +CONFIG_RTC_CLK_CAL_CYCLES=1024 +# end of RTC Clock Config + +# +# Peripheral Control +# +CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y +# end of Peripheral Control + +# +# ETM Configuration +# +# CONFIG_ETM_ENABLE_DEBUG_LOG is not set +# end of ETM Configuration + +# +# GDMA Configurations +# +CONFIG_GDMA_CTRL_FUNC_IN_IRAM=y +# CONFIG_GDMA_ISR_IRAM_SAFE is not set +# CONFIG_GDMA_ENABLE_DEBUG_LOG is not set +# end of GDMA Configurations + +# +# Main XTAL Config +# +CONFIG_XTAL_FREQ_40=y +CONFIG_XTAL_FREQ=40 +# end of Main XTAL Config + +# +# Crypto DPA Protection +# +CONFIG_ESP_CRYPTO_DPA_PROTECTION_AT_STARTUP=y +CONFIG_ESP_CRYPTO_DPA_PROTECTION_LEVEL_LOW=y +# CONFIG_ESP_CRYPTO_DPA_PROTECTION_LEVEL_MEDIUM is not set +# CONFIG_ESP_CRYPTO_DPA_PROTECTION_LEVEL_HIGH is not set +CONFIG_ESP_CRYPTO_DPA_PROTECTION_LEVEL=1 +# end of Crypto DPA Protection + +CONFIG_ESP_SPI_BUS_LOCK_ISR_FUNCS_IN_IRAM=y +# end of Hardware Settings + +# +# LCD and Touch Panel +# + +# +# LCD Touch Drivers are maintained in the IDF Component Registry +# + +# +# LCD Peripheral Configuration +# +# CONFIG_LCD_ENABLE_DEBUG_LOG is not set +# end of LCD Peripheral Configuration +# end of LCD and Touch Panel + +# +# ESP NETIF Adapter +# +CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL=120 +CONFIG_ESP_NETIF_TCPIP_LWIP=y +# CONFIG_ESP_NETIF_LOOPBACK is not set +CONFIG_ESP_NETIF_USES_TCPIP_WITH_BSD_API=y +# CONFIG_ESP_NETIF_RECEIVE_REPORT_ERRORS is not set +# CONFIG_ESP_NETIF_L2_TAP is not set +# CONFIG_ESP_NETIF_BRIDGE_EN is not set +# end of ESP NETIF Adapter + +# +# Partition API Configuration +# +# end of Partition API Configuration + +# +# PHY +# +CONFIG_ESP_PHY_ENABLED=y +CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y +# CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION is not set +CONFIG_ESP_PHY_MAX_WIFI_TX_POWER=20 +CONFIG_ESP_PHY_MAX_TX_POWER=20 +CONFIG_ESP_PHY_RF_CAL_PARTIAL=y +# CONFIG_ESP_PHY_RF_CAL_NONE is not set +# CONFIG_ESP_PHY_RF_CAL_FULL is not set +CONFIG_ESP_PHY_CALIBRATION_MODE=0 +# CONFIG_ESP_PHY_PLL_TRACK_DEBUG is not set +# end of PHY + +# +# Power Management +# +# CONFIG_PM_ENABLE is not set +CONFIG_PM_SLP_DEFAULT_PARAMS_OPT=y +CONFIG_PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP=y +# CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP is not set +# end of Power Management + +# +# ESP PSRAM +# + +# +# ESP Ringbuf +# +# CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH is not set +# end of ESP Ringbuf + +# +# ESP System Settings +# +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80 is not set +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_120 is not set +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160=y +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=160 +# CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT is not set +CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y +# CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set +# CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set +CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=0 +CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE=y +CONFIG_ESP_SYSTEM_RTC_FAST_MEM_AS_HEAP_DEPCHECK=y +CONFIG_ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP=y +# CONFIG_ESP_SYSTEM_USE_EH_FRAME is not set + +# +# Memory protection +# +CONFIG_ESP_SYSTEM_PMP_IDRAM_SPLIT=y +# end of Memory protection + +CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_ESP_MAIN_TASK_STACK_SIZE=3584 +CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0=y +# CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_ESP_MAIN_TASK_AFFINITY=0x0 +CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE=2048 +CONFIG_ESP_CONSOLE_UART_DEFAULT=y +# CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG is not set +# CONFIG_ESP_CONSOLE_UART_CUSTOM is not set +# CONFIG_ESP_CONSOLE_NONE is not set +# CONFIG_ESP_CONSOLE_SECONDARY_NONE is not set +CONFIG_ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG=y +CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG_ENABLED=y +CONFIG_ESP_CONSOLE_UART=y +CONFIG_ESP_CONSOLE_UART_NUM=0 +CONFIG_ESP_CONSOLE_ROM_SERIAL_PORT_NUM=0 +CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 +CONFIG_ESP_INT_WDT=y +CONFIG_ESP_INT_WDT_TIMEOUT_MS=300 +CONFIG_ESP_TASK_WDT_EN=y +CONFIG_ESP_TASK_WDT_INIT=y +# CONFIG_ESP_TASK_WDT_PANIC is not set +CONFIG_ESP_TASK_WDT_TIMEOUT_S=5 +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +# CONFIG_ESP_PANIC_HANDLER_IRAM is not set +# CONFIG_ESP_DEBUG_STUBS_ENABLE is not set +CONFIG_ESP_DEBUG_OCDAWARE=y +CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4=y + +# +# Brownout Detector +# +# CONFIG_ESP_BROWNOUT_DET is not set +# end of Brownout Detector + +CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y +CONFIG_ESP_SYSTEM_HW_STACK_GUARD=y +CONFIG_ESP_SYSTEM_BBPLL_RECALIB=y +CONFIG_ESP_SYSTEM_HW_PC_RECORD=y +# end of ESP System Settings + +# +# IPC (Inter-Processor Call) +# +CONFIG_ESP_IPC_TASK_STACK_SIZE=1024 +# end of IPC (Inter-Processor Call) + +# +# ESP Timer (High Resolution Timer) +# +# CONFIG_ESP_TIMER_PROFILING is not set +CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER=y +CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER=y +CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP_TIMER_INTERRUPT_LEVEL=1 +# CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL is not set +CONFIG_ESP_TIMER_TASK_AFFINITY=0x0 +CONFIG_ESP_TIMER_TASK_AFFINITY_CPU0=y +CONFIG_ESP_TIMER_ISR_AFFINITY_CPU0=y +# CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD is not set +CONFIG_ESP_TIMER_IMPL_SYSTIMER=y +# end of ESP Timer (High Resolution Timer) + +# +# Wi-Fi +# +CONFIG_ESP_WIFI_ENABLED=y +CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=10 +CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32 +# CONFIG_ESP_WIFI_STATIC_TX_BUFFER is not set +CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER=y +CONFIG_ESP_WIFI_TX_BUFFER_TYPE=1 +CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER_NUM=32 +CONFIG_ESP_WIFI_STATIC_RX_MGMT_BUFFER=y +# CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUFFER is not set +CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF=0 +CONFIG_ESP_WIFI_RX_MGMT_BUF_NUM_DEF=5 +# CONFIG_ESP_WIFI_CSI_ENABLED is not set +CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP_WIFI_TX_BA_WIN=6 +CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP_WIFI_RX_BA_WIN=6 +CONFIG_ESP_WIFI_NVS_ENABLED=y +CONFIG_ESP_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP_WIFI_MGMT_SBUF_NUM=32 +CONFIG_ESP_WIFI_IRAM_OPT=y +CONFIG_ESP_WIFI_EXTRA_IRAM_OPT=y +CONFIG_ESP_WIFI_RX_IRAM_OPT=y +CONFIG_ESP_WIFI_ENABLE_WPA3_SAE=y +CONFIG_ESP_WIFI_ENABLE_SAE_PK=y +CONFIG_ESP_WIFI_SOFTAP_SAE_SUPPORT=y +CONFIG_ESP_WIFI_ENABLE_WPA3_OWE_STA=y +CONFIG_ESP_WIFI_SLP_IRAM_OPT=y +CONFIG_ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME=50 +CONFIG_ESP_WIFI_SLP_DEFAULT_MAX_ACTIVE_TIME=10 +CONFIG_ESP_WIFI_SLP_DEFAULT_WAIT_BROADCAST_DATA_TIME=15 +# CONFIG_ESP_WIFI_FTM_ENABLE is not set +CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE=y +# CONFIG_ESP_WIFI_GCMP_SUPPORT is not set +CONFIG_ESP_WIFI_GMAC_SUPPORT=y +CONFIG_ESP_WIFI_SOFTAP_SUPPORT=y +# CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT is not set +CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7 +CONFIG_ESP_WIFI_MBEDTLS_CRYPTO=y +CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y +# CONFIG_ESP_WIFI_WAPI_PSK is not set +# CONFIG_ESP_WIFI_SUITE_B_192 is not set +# CONFIG_ESP_WIFI_11KV_SUPPORT is not set +# CONFIG_ESP_WIFI_MBO_SUPPORT is not set +# CONFIG_ESP_WIFI_DPP_SUPPORT is not set +# CONFIG_ESP_WIFI_11R_SUPPORT is not set +# CONFIG_ESP_WIFI_WPS_SOFTAP_REGISTRAR is not set +# CONFIG_ESP_WIFI_ENABLE_WIFI_TX_STATS is not set +# CONFIG_ESP_WIFI_ENABLE_WIFI_RX_STATS is not set +CONFIG_ESP_WIFI_TX_HETB_QUEUE_NUM=3 + +# +# WPS Configuration Options +# +# CONFIG_ESP_WIFI_WPS_STRICT is not set +# CONFIG_ESP_WIFI_WPS_PASSPHRASE is not set +# end of WPS Configuration Options + +# CONFIG_ESP_WIFI_DEBUG_PRINT is not set +# CONFIG_ESP_WIFI_TESTING_OPTIONS is not set +CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT=y +# CONFIG_ESP_WIFI_ENT_FREE_DYNAMIC_BUFFER is not set +# end of Wi-Fi + +# +# Core dump +# +# CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH is not set +# CONFIG_ESP_COREDUMP_ENABLE_TO_UART is not set +CONFIG_ESP_COREDUMP_ENABLE_TO_NONE=y +# end of Core dump + +# +# FAT Filesystem support +# +CONFIG_FATFS_VOLUME_COUNT=2 +CONFIG_FATFS_LFN_NONE=y +# CONFIG_FATFS_LFN_HEAP is not set +# CONFIG_FATFS_LFN_STACK is not set +# CONFIG_FATFS_SECTOR_512 is not set +CONFIG_FATFS_SECTOR_4096=y +# CONFIG_FATFS_CODEPAGE_DYNAMIC is not set +CONFIG_FATFS_CODEPAGE_437=y +# CONFIG_FATFS_CODEPAGE_720 is not set +# CONFIG_FATFS_CODEPAGE_737 is not set +# CONFIG_FATFS_CODEPAGE_771 is not set +# CONFIG_FATFS_CODEPAGE_775 is not set +# CONFIG_FATFS_CODEPAGE_850 is not set +# CONFIG_FATFS_CODEPAGE_852 is not set +# CONFIG_FATFS_CODEPAGE_855 is not set +# CONFIG_FATFS_CODEPAGE_857 is not set +# CONFIG_FATFS_CODEPAGE_860 is not set +# CONFIG_FATFS_CODEPAGE_861 is not set +# CONFIG_FATFS_CODEPAGE_862 is not set +# CONFIG_FATFS_CODEPAGE_863 is not set +# CONFIG_FATFS_CODEPAGE_864 is not set +# CONFIG_FATFS_CODEPAGE_865 is not set +# CONFIG_FATFS_CODEPAGE_866 is not set +# CONFIG_FATFS_CODEPAGE_869 is not set +# CONFIG_FATFS_CODEPAGE_932 is not set +# CONFIG_FATFS_CODEPAGE_936 is not set +# CONFIG_FATFS_CODEPAGE_949 is not set +# CONFIG_FATFS_CODEPAGE_950 is not set +CONFIG_FATFS_CODEPAGE=437 +CONFIG_FATFS_FS_LOCK=0 +CONFIG_FATFS_TIMEOUT_MS=10000 +CONFIG_FATFS_PER_FILE_CACHE=y +# CONFIG_FATFS_USE_FASTSEEK is not set +CONFIG_FATFS_VFS_FSTAT_BLKSIZE=0 +# CONFIG_FATFS_IMMEDIATE_FSYNC is not set +# CONFIG_FATFS_USE_LABEL is not set +CONFIG_FATFS_LINK_LOCK=y +# end of FAT Filesystem support + +# +# FreeRTOS +# + +# +# Kernel +# +# CONFIG_FREERTOS_SMP is not set +CONFIG_FREERTOS_UNICORE=y +CONFIG_FREERTOS_HZ=1000 +CONFIG_FREERTOS_OPTIMIZED_SCHEDULER=y +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set +CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y +CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1 +CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536 +# CONFIG_FREERTOS_USE_IDLE_HOOK is not set +# CONFIG_FREERTOS_USE_TICK_HOOK is not set +CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 +# CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY is not set +CONFIG_FREERTOS_TIMER_SERVICE_TASK_NAME="Tmr Svc" +# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU0 is not set +CONFIG_FREERTOS_TIMER_TASK_NO_AFFINITY=y +CONFIG_FREERTOS_TIMER_SERVICE_TASK_CORE_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 +CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 +CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 +CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 +# CONFIG_FREERTOS_USE_TRACE_FACILITY is not set +# CONFIG_FREERTOS_USE_LIST_DATA_INTEGRITY_CHECK_BYTES is not set +# CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set +# CONFIG_FREERTOS_USE_APPLICATION_TASK_TAG is not set +# end of Kernel + +# +# Port +# +CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y +# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set +CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS=y +# CONFIG_FREERTOS_TASK_PRE_DELETION_HOOK is not set +# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set +CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y +CONFIG_FREERTOS_ISR_STACKSIZE=1536 +CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y +CONFIG_FREERTOS_TICK_SUPPORT_SYSTIMER=y +CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL1=y +# CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL3 is not set +CONFIG_FREERTOS_SYSTICK_USES_SYSTIMER=y +# CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set +# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set +# end of Port + +CONFIG_FREERTOS_PORT=y +CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y +CONFIG_FREERTOS_DEBUG_OCDAWARE=y +CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y +CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y +CONFIG_FREERTOS_NUMBER_OF_CORES=1 +# end of FreeRTOS + +# +# Hardware Abstraction Layer (HAL) and Low Level (LL) +# +CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y +# CONFIG_HAL_ASSERTION_DISABLE is not set +# CONFIG_HAL_ASSERTION_SILENT is not set +# CONFIG_HAL_ASSERTION_ENABLE is not set +CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=2 +CONFIG_HAL_SYSTIMER_USE_ROM_IMPL=y +CONFIG_HAL_WDT_USE_ROM_IMPL=y +CONFIG_HAL_SPI_MASTER_FUNC_IN_IRAM=y +CONFIG_HAL_SPI_SLAVE_FUNC_IN_IRAM=y +# end of Hardware Abstraction Layer (HAL) and Low Level (LL) + +# +# Heap memory debugging +# +CONFIG_HEAP_POISONING_DISABLED=y +# CONFIG_HEAP_POISONING_LIGHT is not set +# CONFIG_HEAP_POISONING_COMPREHENSIVE is not set +CONFIG_HEAP_TRACING_OFF=y +# CONFIG_HEAP_TRACING_STANDALONE is not set +# CONFIG_HEAP_TRACING_TOHOST is not set +# CONFIG_HEAP_USE_HOOKS is not set +# CONFIG_HEAP_TASK_TRACKING is not set +# CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set +CONFIG_HEAP_TLSF_USE_ROM_IMPL=y +# end of Heap memory debugging + +# +# IEEE 802.15.4 +# +CONFIG_IEEE802154_ENABLED=y +CONFIG_IEEE802154_RX_BUFFER_SIZE=20 +# CONFIG_IEEE802154_CCA_CARRIER is not set +CONFIG_IEEE802154_CCA_ED=y +# CONFIG_IEEE802154_CCA_CARRIER_OR_ED is not set +# CONFIG_IEEE802154_CCA_CARRIER_AND_ED is not set +CONFIG_IEEE802154_CCA_MODE=1 +CONFIG_IEEE802154_CCA_THRESHOLD=-60 +CONFIG_IEEE802154_PENDING_TABLE_SIZE=20 +# CONFIG_IEEE802154_MULTI_PAN_ENABLE is not set +# CONFIG_IEEE802154_TIMING_OPTIMIZATION is not set +# CONFIG_IEEE802154_DEBUG is not set +# end of IEEE 802.15.4 + +# +# Log output +# +# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set +# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set +# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set +CONFIG_LOG_DEFAULT_LEVEL_INFO=y +# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set +# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set +CONFIG_LOG_DEFAULT_LEVEL=3 +CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y +# CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set +# CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set +CONFIG_LOG_MAXIMUM_LEVEL=3 +# CONFIG_LOG_MASTER_LEVEL is not set +CONFIG_LOG_COLORS=y +CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y +# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set +# end of Log output + +# +# LWIP +# +CONFIG_LWIP_ENABLE=y +CONFIG_LWIP_LOCAL_HOSTNAME="espressif" +# CONFIG_LWIP_NETIF_API is not set +CONFIG_LWIP_TCPIP_TASK_PRIO=18 +# CONFIG_LWIP_TCPIP_CORE_LOCKING is not set +# CONFIG_LWIP_CHECK_THREAD_SAFETY is not set +CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y +# CONFIG_LWIP_L2_TO_L3_COPY is not set +# CONFIG_LWIP_IRAM_OPTIMIZATION is not set +# CONFIG_LWIP_EXTRA_IRAM_OPTIMIZATION is not set +CONFIG_LWIP_TIMERS_ONDEMAND=y +CONFIG_LWIP_ND6=y +# CONFIG_LWIP_FORCE_ROUTER_FORWARDING is not set +CONFIG_LWIP_MAX_SOCKETS=10 +# CONFIG_LWIP_USE_ONLY_LWIP_SELECT is not set +# CONFIG_LWIP_SO_LINGER is not set +CONFIG_LWIP_SO_REUSE=y +CONFIG_LWIP_SO_REUSE_RXTOALL=y +CONFIG_LWIP_SO_RCVBUF=y +# CONFIG_LWIP_NETBUF_RECVINFO is not set +CONFIG_LWIP_IP_DEFAULT_TTL=64 +CONFIG_LWIP_IP4_FRAG=y +CONFIG_LWIP_IP6_FRAG=y +# CONFIG_LWIP_IP4_REASSEMBLY is not set +# CONFIG_LWIP_IP6_REASSEMBLY is not set +CONFIG_LWIP_IP_REASS_MAX_PBUFS=10 +# CONFIG_LWIP_IP_FORWARD is not set +# CONFIG_LWIP_STATS is not set +CONFIG_LWIP_ESP_GRATUITOUS_ARP=y +CONFIG_LWIP_GARP_TMR_INTERVAL=60 +CONFIG_LWIP_ESP_MLDV6_REPORT=y +CONFIG_LWIP_MLDV6_TMR_INTERVAL=40 +CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32 +CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y +# CONFIG_LWIP_DHCP_DISABLE_CLIENT_ID is not set +CONFIG_LWIP_DHCP_DISABLE_VENDOR_CLASS_ID=y +# CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set +CONFIG_LWIP_DHCP_OPTIONS_LEN=68 +CONFIG_LWIP_NUM_NETIF_CLIENT_DATA=0 +CONFIG_LWIP_DHCP_COARSE_TIMER_SECS=1 + +# +# DHCP server +# +CONFIG_LWIP_DHCPS=y +CONFIG_LWIP_DHCPS_LEASE_UNIT=60 +CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8 +CONFIG_LWIP_DHCPS_STATIC_ENTRIES=y +# end of DHCP server + +# CONFIG_LWIP_AUTOIP is not set +CONFIG_LWIP_IPV4=y +CONFIG_LWIP_IPV6=y +# CONFIG_LWIP_IPV6_AUTOCONFIG is not set +CONFIG_LWIP_IPV6_NUM_ADDRESSES=3 +# CONFIG_LWIP_IPV6_FORWARD is not set +# CONFIG_LWIP_NETIF_STATUS_CALLBACK is not set +CONFIG_LWIP_NETIF_LOOPBACK=y +CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8 + +# +# TCP +# +CONFIG_LWIP_MAX_ACTIVE_TCP=16 +CONFIG_LWIP_MAX_LISTENING_TCP=16 +CONFIG_LWIP_TCP_HIGH_SPEED_RETRANSMISSION=y +CONFIG_LWIP_TCP_MAXRTX=12 +CONFIG_LWIP_TCP_SYNMAXRTX=12 +CONFIG_LWIP_TCP_MSS=1440 +CONFIG_LWIP_TCP_TMR_INTERVAL=250 +CONFIG_LWIP_TCP_MSL=60000 +CONFIG_LWIP_TCP_FIN_WAIT_TIMEOUT=20000 +CONFIG_LWIP_TCP_SND_BUF_DEFAULT=5760 +CONFIG_LWIP_TCP_WND_DEFAULT=5760 +CONFIG_LWIP_TCP_RECVMBOX_SIZE=6 +CONFIG_LWIP_TCP_ACCEPTMBOX_SIZE=6 +CONFIG_LWIP_TCP_QUEUE_OOSEQ=y +CONFIG_LWIP_TCP_OOSEQ_TIMEOUT=6 +CONFIG_LWIP_TCP_OOSEQ_MAX_PBUFS=4 +# CONFIG_LWIP_TCP_SACK_OUT is not set +CONFIG_LWIP_TCP_OVERSIZE_MSS=y +# CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set +# CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set +CONFIG_LWIP_TCP_RTO_TIME=1500 +# end of TCP + +# +# UDP +# +CONFIG_LWIP_MAX_UDP_PCBS=16 +CONFIG_LWIP_UDP_RECVMBOX_SIZE=6 +# end of UDP + +# +# Checksums +# +# CONFIG_LWIP_CHECKSUM_CHECK_IP is not set +# CONFIG_LWIP_CHECKSUM_CHECK_UDP is not set +CONFIG_LWIP_CHECKSUM_CHECK_ICMP=y +# end of Checksums + +CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=3072 +CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set +CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF +CONFIG_LWIP_PPP_SUPPORT=y +CONFIG_LWIP_PPP_ENABLE_IPV6=y +CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3 +CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5 +# CONFIG_LWIP_PPP_NOTIFY_PHASE_SUPPORT is not set +# CONFIG_LWIP_PPP_PAP_SUPPORT is not set +# CONFIG_LWIP_PPP_CHAP_SUPPORT is not set +# CONFIG_LWIP_PPP_MSCHAP_SUPPORT is not set +# CONFIG_LWIP_PPP_MPPE_SUPPORT is not set +# CONFIG_LWIP_PPP_SERVER_SUPPORT is not set +CONFIG_LWIP_PPP_VJ_HEADER_COMPRESSION=y +# CONFIG_LWIP_ENABLE_LCP_ECHO is not set +# CONFIG_LWIP_PPP_DEBUG_ON is not set +# CONFIG_LWIP_SLIP_SUPPORT is not set + +# +# ICMP +# +CONFIG_LWIP_ICMP=y +# CONFIG_LWIP_MULTICAST_PING is not set +# CONFIG_LWIP_BROADCAST_PING is not set +# end of ICMP + +# +# LWIP RAW API +# +CONFIG_LWIP_MAX_RAW_PCBS=16 +# end of LWIP RAW API + +# +# SNTP +# +CONFIG_LWIP_SNTP_MAX_SERVERS=1 +# CONFIG_LWIP_DHCP_GET_NTP_SRV is not set +CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000 +CONFIG_LWIP_SNTP_STARTUP_DELAY=y +CONFIG_LWIP_SNTP_MAXIMUM_STARTUP_DELAY=5000 +# end of SNTP + +# +# DNS +# +CONFIG_LWIP_DNS_MAX_SERVERS=3 +# CONFIG_LWIP_FALLBACK_DNS_SERVER_SUPPORT is not set +# end of DNS + +CONFIG_LWIP_BRIDGEIF_MAX_PORTS=7 +CONFIG_LWIP_ESP_LWIP_ASSERT=y + +# +# Hooks +# +# CONFIG_LWIP_HOOK_TCP_ISN_NONE is not set +CONFIG_LWIP_HOOK_TCP_ISN_DEFAULT=y +# CONFIG_LWIP_HOOK_TCP_ISN_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_ROUTE_NONE=y +# CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_ROUTE_CUSTOM is not set +CONFIG_LWIP_HOOK_ND6_GET_GW_NONE=y +# CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT is not set +# CONFIG_LWIP_HOOK_ND6_GET_GW_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_NONE=y +# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM is not set +CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y +# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT is not set +# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_INPUT_NONE=y +# CONFIG_LWIP_HOOK_IP6_INPUT_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM is not set +# end of Hooks + +# CONFIG_LWIP_DEBUG is not set +# end of LWIP + +# +# mbedTLS +# +CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y +# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set +# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set +CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y +CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384 +CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096 +# CONFIG_MBEDTLS_DYNAMIC_BUFFER is not set +# CONFIG_MBEDTLS_DEBUG is not set + +# +# mbedTLS v3.x related +# +# CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 is not set +# CONFIG_MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH is not set +# CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set +# CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set +CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=y +CONFIG_MBEDTLS_PKCS7_C=y +# end of mbedTLS v3.x related + +# +# Certificate Bundle +# +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=y +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE is not set +# CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEPRECATED_LIST is not set +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200 +# end of Certificate Bundle + +# CONFIG_MBEDTLS_ECP_RESTARTABLE is not set +CONFIG_MBEDTLS_CMAC_C=y +CONFIG_MBEDTLS_HARDWARE_AES=y +CONFIG_MBEDTLS_AES_USE_INTERRUPT=y +CONFIG_MBEDTLS_AES_INTERRUPT_LEVEL=0 +CONFIG_MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER=y +CONFIG_MBEDTLS_HARDWARE_MPI=y +CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI=y +CONFIG_MBEDTLS_MPI_USE_INTERRUPT=y +CONFIG_MBEDTLS_MPI_INTERRUPT_LEVEL=0 +CONFIG_MBEDTLS_HARDWARE_SHA=y +CONFIG_MBEDTLS_HARDWARE_ECC=y +CONFIG_MBEDTLS_ECC_OTHER_CURVES_SOFT_FALLBACK=y +CONFIG_MBEDTLS_ROM_MD5=y +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY is not set +CONFIG_MBEDTLS_HAVE_TIME=y +# CONFIG_MBEDTLS_PLATFORM_TIME_ALT is not set +# CONFIG_MBEDTLS_HAVE_TIME_DATE is not set +CONFIG_MBEDTLS_ECDSA_DETERMINISTIC=y +CONFIG_MBEDTLS_SHA512_C=y +CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y +# CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set +# CONFIG_MBEDTLS_TLS_CLIENT_ONLY is not set +# CONFIG_MBEDTLS_TLS_DISABLED is not set +CONFIG_MBEDTLS_TLS_SERVER=y +CONFIG_MBEDTLS_TLS_CLIENT=y +CONFIG_MBEDTLS_TLS_ENABLED=y + +# +# TLS Key Exchange Methods +# +# CONFIG_MBEDTLS_PSK_MODES is not set +CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y +# end of TLS Key Exchange Methods + +CONFIG_MBEDTLS_SSL_RENEGOTIATION=y +CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y +# CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 is not set +# CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set +CONFIG_MBEDTLS_SSL_ALPN=y +CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y +CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y + +# +# Symmetric Ciphers +# +CONFIG_MBEDTLS_AES_C=y +# CONFIG_MBEDTLS_CAMELLIA_C is not set +# CONFIG_MBEDTLS_DES_C is not set +# CONFIG_MBEDTLS_BLOWFISH_C is not set +# CONFIG_MBEDTLS_XTEA_C is not set +CONFIG_MBEDTLS_CCM_C=y +CONFIG_MBEDTLS_GCM_C=y +# CONFIG_MBEDTLS_NIST_KW_C is not set +# end of Symmetric Ciphers + +# CONFIG_MBEDTLS_RIPEMD160_C is not set + +# +# Certificates +# +CONFIG_MBEDTLS_PEM_PARSE_C=y +CONFIG_MBEDTLS_PEM_WRITE_C=y +CONFIG_MBEDTLS_X509_CRL_PARSE_C=y +CONFIG_MBEDTLS_X509_CSR_PARSE_C=y +# end of Certificates + +CONFIG_MBEDTLS_ECP_C=y +# CONFIG_MBEDTLS_DHM_C is not set +CONFIG_MBEDTLS_ECDH_C=y +CONFIG_MBEDTLS_ECDSA_C=y +# CONFIG_MBEDTLS_ECJPAKE_C is not set +CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y +CONFIG_MBEDTLS_ECP_NIST_OPTIM=y +CONFIG_MBEDTLS_ECP_FIXED_POINT_OPTIM=y +# CONFIG_MBEDTLS_POLY1305_C is not set +# CONFIG_MBEDTLS_CHACHA20_C is not set +# CONFIG_MBEDTLS_HKDF_C is not set +# CONFIG_MBEDTLS_THREADING_C is not set +CONFIG_MBEDTLS_ERROR_STRINGS=y +# end of mbedTLS + +# +# ESP-MQTT Configurations +# +CONFIG_MQTT_PROTOCOL_311=y +# CONFIG_MQTT_PROTOCOL_5 is not set +CONFIG_MQTT_TRANSPORT_SSL=y +CONFIG_MQTT_TRANSPORT_WEBSOCKET=y +CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y +# CONFIG_MQTT_MSG_ID_INCREMENTAL is not set +# CONFIG_MQTT_SKIP_PUBLISH_IF_DISCONNECTED is not set +# CONFIG_MQTT_REPORT_DELETED_MESSAGES is not set +# CONFIG_MQTT_USE_CUSTOM_CONFIG is not set +# CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED is not set +# CONFIG_MQTT_CUSTOM_OUTBOX is not set +# end of ESP-MQTT Configurations + +# +# Newlib +# +CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y +# CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF is not set +# CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR is not set +# CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF is not set +# CONFIG_NEWLIB_STDIN_LINE_ENDING_LF is not set +CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y +# CONFIG_NEWLIB_NANO_FORMAT is not set +CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y +# CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set +# end of Newlib + +# +# NVS +# +# CONFIG_NVS_ENCRYPTION is not set +# CONFIG_NVS_ASSERT_ERROR_CHECK is not set +# CONFIG_NVS_LEGACY_DUP_KEYS_COMPATIBILITY is not set +# end of NVS + +# +# OpenThread +# +# CONFIG_OPENTHREAD_ENABLED is not set + +# +# Thread Operational Dataset +# +CONFIG_OPENTHREAD_NETWORK_NAME="OpenThread-ESP" +CONFIG_OPENTHREAD_MESH_LOCAL_PREFIX="fd00:db8:a0:0::/64" +CONFIG_OPENTHREAD_NETWORK_CHANNEL=15 +CONFIG_OPENTHREAD_NETWORK_PANID=0x1234 +CONFIG_OPENTHREAD_NETWORK_EXTPANID="dead00beef00cafe" +CONFIG_OPENTHREAD_NETWORK_MASTERKEY="00112233445566778899aabbccddeeff" +CONFIG_OPENTHREAD_NETWORK_PSKC="104810e2315100afd6bc9215a6bfac53" +# end of Thread Operational Dataset + +CONFIG_OPENTHREAD_XTAL_ACCURACY=130 +# CONFIG_OPENTHREAD_SPINEL_ONLY is not set +# CONFIG_OPENTHREAD_RX_ON_WHEN_IDLE is not set + +# +# Thread Address Query Config +# +# end of Thread Address Query Config +# end of OpenThread + +# +# Protocomm +# +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_0=y +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_1=y +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_2=y +# end of Protocomm + +# +# PThreads +# +CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_PTHREAD_STACK_MIN=768 +CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" +# end of PThreads + +# +# MMU Config +# +CONFIG_MMU_PAGE_SIZE_32KB=y +CONFIG_MMU_PAGE_MODE="32KB" +CONFIG_MMU_PAGE_SIZE=0x8000 +# end of MMU Config + +# +# Main Flash configuration +# + +# +# SPI Flash behavior when brownout +# +CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y +CONFIG_SPI_FLASH_BROWNOUT_RESET=y +# end of SPI Flash behavior when brownout + +# +# Optional and Experimental Features (READ DOCS FIRST) +# + +# +# Features here require specific hardware (READ DOCS FIRST!) +# +CONFIG_SPI_FLASH_SUSPEND_TSUS_VAL_US=50 +# end of Optional and Experimental Features (READ DOCS FIRST) +# end of Main Flash configuration + +# +# SPI Flash driver +# +# CONFIG_SPI_FLASH_VERIFY_WRITE is not set +# CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set +CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y +# CONFIG_SPI_FLASH_ROM_IMPL is not set +CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set +# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set +CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y +CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20 +CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=1 +CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192 +# CONFIG_SPI_FLASH_SIZE_OVERRIDE is not set +# CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED is not set +# CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST is not set + +# +# Auto-detect flash chips +# +CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORTED=y +# CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP is not set +# CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP is not set +# CONFIG_SPI_FLASH_SUPPORT_GD_CHIP is not set +# CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP is not set +# CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP is not set +# CONFIG_SPI_FLASH_SUPPORT_TH_CHIP is not set +# end of Auto-detect flash chips + +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=y +# end of SPI Flash driver + +# +# SPIFFS Configuration +# +CONFIG_SPIFFS_MAX_PARTITIONS=3 + +# +# SPIFFS Cache Configuration +# +CONFIG_SPIFFS_CACHE=y +CONFIG_SPIFFS_CACHE_WR=y +# CONFIG_SPIFFS_CACHE_STATS is not set +# end of SPIFFS Cache Configuration + +CONFIG_SPIFFS_PAGE_CHECK=y +CONFIG_SPIFFS_GC_MAX_RUNS=10 +# CONFIG_SPIFFS_GC_STATS is not set +CONFIG_SPIFFS_PAGE_SIZE=256 +CONFIG_SPIFFS_OBJ_NAME_LEN=32 +# CONFIG_SPIFFS_FOLLOW_SYMLINKS is not set +CONFIG_SPIFFS_USE_MAGIC=y +CONFIG_SPIFFS_USE_MAGIC_LENGTH=y +CONFIG_SPIFFS_META_LENGTH=4 +CONFIG_SPIFFS_USE_MTIME=y + +# +# Debug Configuration +# +# CONFIG_SPIFFS_DBG is not set +# CONFIG_SPIFFS_API_DBG is not set +# CONFIG_SPIFFS_GC_DBG is not set +# CONFIG_SPIFFS_CACHE_DBG is not set +# CONFIG_SPIFFS_CHECK_DBG is not set +# CONFIG_SPIFFS_TEST_VISUALISATION is not set +# end of Debug Configuration +# end of SPIFFS Configuration + +# +# TCP Transport +# + +# +# Websocket +# +CONFIG_WS_TRANSPORT=y +CONFIG_WS_BUFFER_SIZE=1024 +# CONFIG_WS_DYNAMIC_BUFFER is not set +# end of Websocket +# end of TCP Transport + +# +# Ultra Low Power (ULP) Co-processor +# +# CONFIG_ULP_COPROC_ENABLED is not set + +# +# ULP Debugging Options +# +# end of ULP Debugging Options +# end of Ultra Low Power (ULP) Co-processor + +# +# Unity unit testing library +# +CONFIG_UNITY_ENABLE_FLOAT=y +CONFIG_UNITY_ENABLE_DOUBLE=y +# CONFIG_UNITY_ENABLE_64BIT is not set +# CONFIG_UNITY_ENABLE_COLOR is not set +CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y +# CONFIG_UNITY_ENABLE_FIXTURE is not set +# CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set +# end of Unity unit testing library + +# +# Virtual file system +# +CONFIG_VFS_SUPPORT_IO=y +CONFIG_VFS_SUPPORT_DIR=y +CONFIG_VFS_SUPPORT_SELECT=y +CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y +# CONFIG_VFS_SELECT_IN_RAM is not set +CONFIG_VFS_SUPPORT_TERMIOS=y +CONFIG_VFS_MAX_COUNT=8 + +# +# Host File System I/O (Semihosting) +# +CONFIG_VFS_SEMIHOSTFS_MAX_MOUNT_POINTS=1 +# end of Host File System I/O (Semihosting) +# end of Virtual file system + +# +# Wear Levelling +# +# CONFIG_WL_SECTOR_SIZE_512 is not set +CONFIG_WL_SECTOR_SIZE_4096=y +CONFIG_WL_SECTOR_SIZE=4096 +# end of Wear Levelling + +# +# Wi-Fi Provisioning Manager +# +CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16 +CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30 +# CONFIG_WIFI_PROV_BLE_FORCE_ENCRYPTION is not set +CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN=y +# CONFIG_WIFI_PROV_STA_FAST_SCAN is not set +# end of Wi-Fi Provisioning Manager + +# +# DSP Library +# +CONFIG_DSP_ANSI=y +CONFIG_DSP_OPTIMIZATION=0 +# CONFIG_DSP_MAX_FFT_SIZE_512 is not set +# CONFIG_DSP_MAX_FFT_SIZE_1024 is not set +# CONFIG_DSP_MAX_FFT_SIZE_2048 is not set +CONFIG_DSP_MAX_FFT_SIZE_4096=y +# CONFIG_DSP_MAX_FFT_SIZE_8192 is not set +# CONFIG_DSP_MAX_FFT_SIZE_16384 is not set +# CONFIG_DSP_MAX_FFT_SIZE_32768 is not set +CONFIG_DSP_MAX_FFT_SIZE=4096 +# end of DSP Library + +# +# Modbus configuration +# +CONFIG_FMB_COMM_MODE_TCP_EN=y +CONFIG_FMB_TCP_PORT_DEFAULT=502 +CONFIG_FMB_TCP_PORT_MAX_CONN=5 +CONFIG_FMB_TCP_CONNECTION_TOUT_SEC=2 +CONFIG_FMB_TCP_KEEP_ALIVE_TOUT_SEC=4 +CONFIG_FMB_TCP_EVENT_WAIT_MS=50 +CONFIG_FMB_TCP_READ_TIMEOUT_MS=50 +CONFIG_FMB_TCP_SEND_TIMEOUT_MS=100 +CONFIG_FMB_TCP_EVENT_LOOP_TICK_MS=50 +# CONFIG_FMB_TCP_UID_ENABLED is not set +CONFIG_FMB_COMM_MODE_RTU_EN=y +CONFIG_FMB_COMM_MODE_ASCII_EN=y +CONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND=5000 +CONFIG_FMB_MASTER_MAX_API_BLOCKING_TIME_MS=6000 +CONFIG_FMB_MASTER_DELAY_MS_CONVERT=200 +CONFIG_FMB_QUEUE_LENGTH=50 +CONFIG_FMB_PORT_TASK_STACK_SIZE=4096 +CONFIG_FMB_BUFFER_SIZE=260 +CONFIG_FMB_SERIAL_ASCII_BITS_PER_SYMB=8 +CONFIG_FMB_SERIAL_ASCII_TIMEOUT_RESPOND_MS=1000 +CONFIG_FMB_PORT_TASK_PRIO=10 +CONFIG_FMB_PORT_TASK_AFFINITY=0x7FFFFFFF +CONFIG_FMB_CONTROLLER_SLAVE_ID_SUPPORT=y +CONFIG_FMB_CONTROLLER_SLAVE_ID=0x00112233 +CONFIG_FMB_CONTROLLER_SLAVE_ID_MAX_SIZE=32 +CONFIG_FMB_CONTROLLER_NOTIFY_TIMEOUT=20 +CONFIG_FMB_CONTROLLER_NOTIFY_QUEUE_SIZE=20 +CONFIG_FMB_CONTROLLER_STACK_SIZE=4096 +CONFIG_FMB_EVENT_QUEUE_TIMEOUT=20 +# CONFIG_FMB_TIMER_USE_ISR_DISPATCH_METHOD is not set +# CONFIG_FMB_EXT_TYPE_SUPPORT is not set +CONFIG_FMB_FUNC_HANDLERS_MAX=16 +CONFIG_FMB_MDNS_INTEGRATION_ENABLE=y +# end of Modbus configuration + +# +# Zigbee +# +# CONFIG_ZB_ENABLED is not set +# end of Zigbee + +# +# Diagnostics data store +# +CONFIG_DIAG_DATA_STORE_RTC=y +# CONFIG_DIAG_DATA_STORE_FLASH is not set +# CONFIG_DIAG_DATA_STORE_DBG_PRINTS is not set +CONFIG_DIAG_DATA_STORE_REPORTING_WATERMARK_PERCENT=80 + +# +# RTC Store +# +CONFIG_RTC_STORE_DATA_SIZE=6144 +CONFIG_RTC_STORE_CRITICAL_DATA_SIZE=4096 +# end of RTC Store +# end of Diagnostics data store + +# +# Diagnostics +# +CONFIG_DIAG_LOG_MSG_ARG_FORMAT_TLV=y +# CONFIG_DIAG_LOG_MSG_ARG_FORMAT_STRING is not set +CONFIG_DIAG_LOG_MSG_ARG_MAX_SIZE=64 +CONFIG_DIAG_LOG_DROP_WIFI_LOGS=y +# CONFIG_DIAG_ENABLE_WRAP_LOG_FUNCTIONS is not set +CONFIG_DIAG_ENABLE_METRICS=y +CONFIG_DIAG_METRICS_MAX_COUNT=20 +CONFIG_DIAG_ENABLE_HEAP_METRICS=y +CONFIG_DIAG_HEAP_POLLING_INTERVAL=30 +CONFIG_DIAG_ENABLE_WIFI_METRICS=y +CONFIG_DIAG_WIFI_POLLING_INTERVAL=30 +CONFIG_DIAG_ENABLE_VARIABLES=y +CONFIG_DIAG_VARIABLES_MAX_COUNT=20 +CONFIG_DIAG_ENABLE_NETWORK_VARIABLES=y +# CONFIG_DIAG_MORE_NETWORK_VARS is not set +# CONFIG_DIAG_USE_EXTERNAL_LOG_WRAP is not set +# end of Diagnostics + +# +# ESP Insights +# +# CONFIG_ESP_INSIGHTS_ENABLED is not set +# CONFIG_ESP_INSIGHTS_TRANSPORT_MQTT is not set +CONFIG_ESP_INSIGHTS_TRANSPORT_HTTPS=y +CONFIG_ESP_INSIGHTS_TRANSPORT_HTTPS_HOST="https://client.insights.espressif.com" +CONFIG_ESP_INSIGHTS_CLOUD_POST_MIN_INTERVAL_SEC=60 +CONFIG_ESP_INSIGHTS_CLOUD_POST_MAX_INTERVAL_SEC=240 +CONFIG_ESP_INSIGHTS_META_VERSION_10=y +# end of ESP Insights + +# +# esp-modem +# +CONFIG_ESP_MODEM_CMUX_DEFRAGMENT_PAYLOAD=y +# CONFIG_ESP_MODEM_USE_INFLATABLE_BUFFER_IF_NEEDED is not set +CONFIG_ESP_MODEM_CMUX_DELAY_AFTER_DLCI_SETUP=0 +CONFIG_ESP_MODEM_CMUX_DELAY_AFTER_NETIF_DISCONNECT=0 +# CONFIG_ESP_MODEM_CMUX_USE_SHORT_PAYLOADS_ONLY is not set +# CONFIG_ESP_MODEM_ADD_CUSTOM_MODULE is not set +CONFIG_ESP_MODEM_C_API_STR_MAX=128 +# CONFIG_ESP_MODEM_URC_HANDLER is not set +# CONFIG_ESP_MODEM_PPP_ESCAPE_BEFORE_EXIT is not set +# CONFIG_ESP_MODEM_ADD_DEBUG_LOGS is not set +# CONFIG_ESP_MODEM_ENABLE_DEVELOPMENT_MODE is not set +CONFIG_ESP_MODEM_USE_PPP_MODE=y +# end of esp-modem + +# +# ESP Schedule Configuration +# +CONFIG_ESP_SCHEDULE_ENABLE_DAYLIGHT=y +# end of ESP Schedule Configuration + +# +# ESP Secure Cert Manager +# +CONFIG_ESP_SECURE_CERT_DS_PERIPHERAL=y +# CONFIG_ESP_SECURE_CERT_SUPPORT_LEGACY_FORMATS is not set +# CONFIG_ESP_SECURE_CERT_WRITE_ENABLE_LOGGING is not set +# end of ESP Secure Cert Manager + +# +# jsmn +# +# CONFIG_JSMN_PARENT_LINKS is not set +# CONFIG_JSMN_STRICT is not set +# CONFIG_JSMN_STATIC is not set +# end of jsmn + +# +# libsodium +# +CONFIG_LIBSODIUM_USE_MBEDTLS_SHA=y +# end of libsodium + +# +# mDNS +# +CONFIG_MDNS_MAX_INTERFACES=3 +CONFIG_MDNS_MAX_SERVICES=10 +CONFIG_MDNS_TASK_PRIORITY=1 +CONFIG_MDNS_ACTION_QUEUE_LEN=16 +CONFIG_MDNS_TASK_STACK_SIZE=4096 +# CONFIG_MDNS_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_MDNS_TASK_AFFINITY_CPU0=y +CONFIG_MDNS_TASK_AFFINITY=0x0 + +# +# MDNS Memory Configuration +# +CONFIG_MDNS_TASK_CREATE_FROM_INTERNAL=y +CONFIG_MDNS_MEMORY_ALLOC_INTERNAL=y +# CONFIG_MDNS_MEMORY_CUSTOM_IMPL is not set +# end of MDNS Memory Configuration + +CONFIG_MDNS_SERVICE_ADD_TIMEOUT_MS=2000 +CONFIG_MDNS_TIMER_PERIOD_MS=100 +# CONFIG_MDNS_NETWORKING_SOCKET is not set +# CONFIG_MDNS_SKIP_SUPPRESSING_OWN_QUERIES is not set +# CONFIG_MDNS_ENABLE_DEBUG_PRINTS is not set +CONFIG_MDNS_ENABLE_CONSOLE_CLI=y +# CONFIG_MDNS_RESPOND_REVERSE_QUERIES is not set +CONFIG_MDNS_MULTIPLE_INSTANCE=y + +# +# MDNS Predefined interfaces +# +CONFIG_MDNS_PREDEF_NETIF_STA=y +CONFIG_MDNS_PREDEF_NETIF_AP=y +CONFIG_MDNS_PREDEF_NETIF_ETH=y +# end of MDNS Predefined interfaces +# end of mDNS + +# +# Network Provisioning Manager +# +CONFIG_NETWORK_PROV_NETWORK_TYPE_WIFI=y +CONFIG_NETWORK_PROV_SCAN_MAX_ENTRIES=16 +CONFIG_NETWORK_PROV_AUTOSTOP_TIMEOUT=30 +# CONFIG_NETWORK_PROV_BLE_FORCE_ENCRYPTION is not set +CONFIG_NETWORK_PROV_WIFI_STA_ALL_CHANNEL_SCAN=y +# CONFIG_NETWORK_PROV_WIFI_STA_FAST_SCAN is not set +# end of Network Provisioning Manager + +# +# ESP RainMaker Command-Response +# +CONFIG_ESP_RMAKER_MAX_COMMANDS=10 +# end of ESP RainMaker Command-Response + +# +# ESP RainMaker Common +# +CONFIG_ESP_RMAKER_LIB_ESP_MQTT=y +# CONFIG_ESP_RMAKER_LIB_AWS_IOT is not set +CONFIG_ESP_RMAKER_MQTT_GLUE_LIB=1 +CONFIG_ESP_RMAKER_MQTT_PORT_443=y +# CONFIG_ESP_RMAKER_MQTT_PORT_8883 is not set +CONFIG_ESP_RMAKER_MQTT_PORT=1 +# CONFIG_ESP_RMAKER_MQTT_PERSISTENT_SESSION is not set +CONFIG_ESP_RMAKER_MQTT_SEND_USERNAME=y +CONFIG_ESP_RMAKER_MQTT_PRODUCT_NAME="RMDev" +CONFIG_ESP_RMAKER_MQTT_PRODUCT_VERSION="1x0" +CONFIG_ESP_RMAKER_MQTT_PRODUCT_SKU="EX00" +CONFIG_ESP_RMAKER_MQTT_USE_CERT_BUNDLE=y +CONFIG_ESP_RMAKER_MAX_MQTT_SUBSCRIPTIONS=10 +CONFIG_ESP_RMAKER_MQTT_KEEP_ALIVE_INTERVAL=120 +CONFIG_ESP_RMAKER_FACTORY_PARTITION_NAME="fctry" +CONFIG_ESP_RMAKER_FACTORY_NAMESPACE="rmaker_creds" +# end of ESP RainMaker Common + +# +# ESP RainMaker Console +# +CONFIG_ESP_RMAKER_CONSOLE_ENABLED=y +CONFIG_ESP_RMAKER_CONSOLE_TASK_STACK=4096 +CONFIG_ESP_RMAKER_CONSOLE_TASK_PRIORITY=5 +# end of ESP RainMaker Console + +# +# ESP RainMaker Time Sync +# +CONFIG_ESP_RMAKER_DEF_TIMEZONE="Asia/Shanghai" +CONFIG_ESP_RMAKER_SNTP_SERVER_NAME="pool.ntp.org" +# end of ESP RainMaker Time Sync + +# +# ESP RainMaker Work Queue +# +CONFIG_ESP_RMAKER_WORK_QUEUE_TASK_STACK=5120 +CONFIG_ESP_RMAKER_WORK_QUEUE_TASK_PRIORITY=5 +# end of ESP RainMaker Work Queue + +# +# LittleFS +# +# CONFIG_LITTLEFS_SDMMC_SUPPORT is not set +CONFIG_LITTLEFS_MAX_PARTITIONS=3 +CONFIG_LITTLEFS_PAGE_SIZE=256 +CONFIG_LITTLEFS_OBJ_NAME_LEN=64 +CONFIG_LITTLEFS_READ_SIZE=128 +CONFIG_LITTLEFS_WRITE_SIZE=128 +CONFIG_LITTLEFS_LOOKAHEAD_SIZE=128 +CONFIG_LITTLEFS_CACHE_SIZE=512 +CONFIG_LITTLEFS_BLOCK_CYCLES=512 +CONFIG_LITTLEFS_USE_MTIME=y +# CONFIG_LITTLEFS_USE_ONLY_HASH is not set +# CONFIG_LITTLEFS_HUMAN_READABLE is not set +CONFIG_LITTLEFS_MTIME_USE_SECONDS=y +# CONFIG_LITTLEFS_MTIME_USE_NONCE is not set +# CONFIG_LITTLEFS_SPIFFS_COMPAT is not set +# CONFIG_LITTLEFS_FLUSH_FILE_EVERY_WRITE is not set +# CONFIG_LITTLEFS_FCNTL_GET_PATH is not set +# CONFIG_LITTLEFS_MULTIVERSION is not set +# CONFIG_LITTLEFS_MALLOC_STRATEGY_DISABLE is not set +CONFIG_LITTLEFS_MALLOC_STRATEGY_DEFAULT=y +# CONFIG_LITTLEFS_MALLOC_STRATEGY_INTERNAL is not set +# CONFIG_LITTLEFS_MALLOC_STRATEGY_SPIRAM_PREFER is not set +CONFIG_LITTLEFS_ASSERTS=y +# CONFIG_LITTLEFS_MMAP_PARTITION is not set +# CONFIG_LITTLEFS_WDT_RESET is not set +# end of LittleFS +# end of Component config + +# CONFIG_IDF_EXPERIMENTAL_FEATURES is not set