This is an automated email from the ASF dual-hosted git repository.
acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 2d5ef658ee3 Documentation/risc-v/esp32c2: add ESP32-C2 and
ESP8684-DevKitM pages
2d5ef658ee3 is described below
commit 2d5ef658ee32aabbc032b2caefd32cb945b19a66
Author: Marcio Ribeiro <[email protected]>
AuthorDate: Thu Sep 17 13:56:19 2026 -0300
Documentation/risc-v/esp32c2: add ESP32-C2 and ESP8684-DevKitM pages
Document the chip (toolchain, Simple Boot, peripherals, MCUBoot) and
the DevKitM-1 board (pinout, headers, RGB, existing defconfigs),
including vendor figures.
Assisted-by: Cursor:Grok 4.6
Signed-off-by: Marcio Ribeiro <[email protected]>
---
.../esp8684-devkitm-1-pinout_v1.1.png | Bin 0 -> 269258 bytes
.../esp8684-devkitm-1-v0.1-block-diagram.png | Bin 0 -> 116581 bytes
.../esp8684-devkitm-1-v1.1-annotated-photo.png | Bin 0 -> 427057 bytes
.../esp8684-devkitm-1-v1.1-isometric.png | Bin 0 -> 2048846 bytes
.../esp32c2/boards/esp8684-devkitm/index.rst | 669 +++++++++++++++++++++
Documentation/platforms/risc-v/esp32c2/index.rst | 635 +++++++++++++++++++
6 files changed, 1304 insertions(+)
diff --git
a/Documentation/platforms/risc-v/esp32c2/boards/esp8684-devkitm/esp8684-devkitm-1-pinout_v1.1.png
b/Documentation/platforms/risc-v/esp32c2/boards/esp8684-devkitm/esp8684-devkitm-1-pinout_v1.1.png
new file mode 100644
index 00000000000..fe9d50fff3c
Binary files /dev/null and
b/Documentation/platforms/risc-v/esp32c2/boards/esp8684-devkitm/esp8684-devkitm-1-pinout_v1.1.png
differ
diff --git
a/Documentation/platforms/risc-v/esp32c2/boards/esp8684-devkitm/esp8684-devkitm-1-v0.1-block-diagram.png
b/Documentation/platforms/risc-v/esp32c2/boards/esp8684-devkitm/esp8684-devkitm-1-v0.1-block-diagram.png
new file mode 100644
index 00000000000..4e42842da89
Binary files /dev/null and
b/Documentation/platforms/risc-v/esp32c2/boards/esp8684-devkitm/esp8684-devkitm-1-v0.1-block-diagram.png
differ
diff --git
a/Documentation/platforms/risc-v/esp32c2/boards/esp8684-devkitm/esp8684-devkitm-1-v1.1-annotated-photo.png
b/Documentation/platforms/risc-v/esp32c2/boards/esp8684-devkitm/esp8684-devkitm-1-v1.1-annotated-photo.png
new file mode 100644
index 00000000000..bf87792bbe7
Binary files /dev/null and
b/Documentation/platforms/risc-v/esp32c2/boards/esp8684-devkitm/esp8684-devkitm-1-v1.1-annotated-photo.png
differ
diff --git
a/Documentation/platforms/risc-v/esp32c2/boards/esp8684-devkitm/esp8684-devkitm-1-v1.1-isometric.png
b/Documentation/platforms/risc-v/esp32c2/boards/esp8684-devkitm/esp8684-devkitm-1-v1.1-isometric.png
new file mode 100644
index 00000000000..0f92ea9d438
Binary files /dev/null and
b/Documentation/platforms/risc-v/esp32c2/boards/esp8684-devkitm/esp8684-devkitm-1-v1.1-isometric.png
differ
diff --git
a/Documentation/platforms/risc-v/esp32c2/boards/esp8684-devkitm/index.rst
b/Documentation/platforms/risc-v/esp32c2/boards/esp8684-devkitm/index.rst
new file mode 100644
index 00000000000..088bb894581
--- /dev/null
+++ b/Documentation/platforms/risc-v/esp32c2/boards/esp8684-devkitm/index.rst
@@ -0,0 +1,669 @@
+=================
+ESP8684-DevKitM-1
+=================
+
+.. tags:: chip:esp32c2, chip:esp8684, arch:risc-v, vendor:espressif
+
+ESP8684-DevKitM-1 is an entry-level development board based on ESP8684-MINI-1,
+a general-purpose module with 1 MB/2 MB/4 MB SPI flash. The module uses the
+ESP32-C2 SoC and integrates Wi-Fi and Bluetooth LE. You can find the board
+schematic
+`here
<https://dl.espressif.com/dl/schematics/esp8684-devkitm-1-schematics_V1.1.pdf>`_
+and the vendor user guide
+`here
<https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c2/esp8684-devkitm-1/user_guide.html>`__.
+
+Most of the I/O pins are broken out to the pin headers on both sides for easy
+interfacing. Developers can either connect peripherals with jumper wires or
+mount ESP8684-DevKitM-1 on a breadboard.
+
+Toolchain, flashing and the serial console are described in the
+:doc:`ESP32-C2 chip documentation <../../index>`.
+
+.. figure:: esp8684-devkitm-1-v1.1-isometric.png
+ :alt: ESP8684-DevKitM-1 Board Layout
+ :figclass: align-center
+
+ ESP8684-DevKitM-1 with ESP8684-MINI-1 module
+
+The block diagram below presents the main components of the ESP8684-DevKitM-1.
+
+.. figure:: esp8684-devkitm-1-v0.1-block-diagram.png
+ :alt: ESP8684-DevKitM-1 Electrical Block Diagram
+ :figclass: align-center
+
+ ESP8684-DevKitM-1 Electrical Block Diagram
+
+Hardware Components
+-------------------
+
+.. figure:: esp8684-devkitm-1-v1.1-annotated-photo.png
+ :alt: ESP8684-DevKitM-1 Hardware Components
+ :figclass: align-center
+
+ ESP8684-DevKitM-1 Hardware Components
+
+===================== ========================================================
+Key Component Description
+===================== ========================================================
+ESP8684-MINI-1 Wi-Fi and Bluetooth LE module with PCB antenna and
+ on-board SPI flash (1 MB/2 MB/4 MB). Typical XTAL is
+ 26 MHz.
+5 V to 3.3 V LDO Converts USB or 5 V header power to 3.3 V.
+5 V Power On LED Turns on when USB power is connected.
+Pin Headers All available GPIO pins broken out on J1 and J3.
+Boot Button Download button. Hold **Boot** and press **Reset** to
+ enter Firmware Download mode.
+Micro-USB Port Power supply and USB-to-UART communication.
+Reset Button Restarts the system (connected to CHIP_EN).
+USB-to-UART Bridge Single USB-to-UART bridge, up to 3 Mbps.
+RGB LED On v1.1: discrete RGB LED on GPIO0 (R), GPIO1 (G) and
+ GPIO8 (B). On v1.0: addressable RGB LED on GPIO8 only.
+===================== ========================================================
+
+This board has no USB-Serial-JTAG port on the SoC. Console and flashing use
+the on-board USB-to-UART bridge.
+
+Buttons and LEDs
+================
+
+Board Buttons
+-------------
+
+There are two buttons labeled Boot and RST. The RST button is not available
+to software. It pulls the chip enable line that doubles as a reset line.
+
+The BOOT button is connected to GPIO9. On reset it is used as a strapping
+pin to determine whether the chip boots normally or into the serial
+bootloader. After reset, however, the BOOT button can be used for software
+input.
+
+Board LEDs
+----------
+
+There is one on-board LED that indicates the presence of USB power.
+
+The RGB LED mapping depends on the hardware revision:
+
+* **v1.1 (current):** discrete RGB LED driven by GPIO0 (red), GPIO1 (green)
+ and GPIO8 (blue). This is the mapping used by NuttX
+ (``LED_RED``, ``LED_GREEN`` and ``LED_BLUE`` in ``board.h``).
+* **v1.0:** addressable RGB LED driven only by GPIO8.
+
+Both revisions are available on the market. See
+`Hardware Revision Details
<https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c2/esp8684-devkitm-1/user_guide.html#hardware-revision-details>`_.
+GPIO8 and GPIO9 are also strapping pins of the ESP8684 chip.
+
+Power Supply
+============
+
+There are three mutually exclusive ways to provide power to the board:
+
+* Micro-USB port (default, recommended)
+* 5V and G (GND) pins
+* 3V3 and G (GND) pins
+
+Use a USB 2.0 cable (Standard-A to Micro-B) that carries data lines.
+Charge-only cables will not enumerate the USB-to-UART bridge and cannot be
+used to flash the board.
+
+Pin Mapping
+===========
+
+.. figure:: esp8684-devkitm-1-pinout_v1.1.png
+ :alt: ESP8684-DevKitM-1 pin layout
+ :figclass: align-center
+
+ ESP8684-DevKitM-1 Pin Layout
+
+Default NuttX pin assignments for this board:
+
+============= ========== =========================================
+ESP8684 Pin Signal Notes
+============= ========== =========================================
+GPIO20 U0TXD UART0 TX (serial console)
+GPIO19 U0RXD UART0 RX (serial console)
+GPIO9 BOOT Strapping pin; user button after reset
+GPIO0 LED Red RGB LED (v1.1); ADC1_CH0
+GPIO1 LED Green RGB LED (v1.1); ADC1_CH1
+GPIO8 LED Blue RGB LED (v1.1) / WS2812 (v1.0); strapping
+GPIO6 I2C0 SCL Default I2C clock
+GPIO5 I2C0 SDA Default I2C data; ADC2_CH0
+GPIO7 SPI2 MOSI Default SPI2 MOSI (FSPID)
+GPIO2 SPI2 MISO Default SPI2 MISO (FSPIQ); LEDC PWM ch0
+GPIO10 SPI2 CS Default SPI2 chip select
+GPIO6 SPI2 CLK Default SPI2 clock (shared with I2C SCL)
+============= ========== =========================================
+
+**J1**
+
+===== ========== =========================================
+Pin Signal Notes
+===== ========== =========================================
+1 G Ground
+2 3V3 3.3 V power supply
+3 3V3 3.3 V power supply
+4 GPIO2 ADC1_CH2, FSPIQ
+5 GPIO3 ADC1_CH3
+6 G Ground
+7 RST CHIP_EN; High: enable; Low: power off
+8 G Ground
+9 GPIO0 ADC1_CH0, LED Red (v1.1)
+10 GPIO1 ADC1_CH1, LED Green (v1.1)
+11 GPIO10 FSPICS0
+12 G Ground
+13 5V 5 V power supply
+14 5V 5 V power supply
+15 G Ground
+===== ========== =========================================
+
+**J3**
+
+===== ========== =========================================
+Pin Signal Notes
+===== ========== =========================================
+1 G Ground
+2 TX GPIO20, U0TXD
+3 RX GPIO19, U0RXD
+4 G Ground
+5 GPIO9 Strapping pin, BOOT button
+6 GPIO8 Strapping pin, LED Blue (v1.1)
+7 G Ground
+8 GPIO7 FSPID, MTDO
+9 GPIO6 FSPICLK, MTCK
+10 GPIO5 ADC2_CH0, FSPIWP, MTDI
+11 GPIO4 ADC1_CH4, FSPIHD, MTMS
+12 G Ground
+13 GPIO18
+14 G Ground
+15 G Ground
+===== ========== =========================================
+
+GPIO8 and GPIO9 are strapping pins. Their level at reset selects boot and
+download mode. See the
+`ESP8684 Datasheet
<https://www.espressif.com/sites/default/files/documentation/esp8684_datasheet_en.pdf>`_
+section *Strapping Pins*.
+
+Configurations
+==============
+
+All of the configurations presented below can be tested by running the
following commands::
+
+ $ ./tools/configure.sh esp8684-devkitm:<config_name>
+ $ make flash ESPTOOL_PORT=/dev/ttyUSB0 -j
+
+Where ``<config_name>`` is the name of board configuration you want to use,
+i.e.: nsh, buttons, wifi...
+Then use a serial console terminal like ``picocom`` configured to 115200 8N1.
+
+adc
+---
+
+The ``adc`` configuration enables the ADC driver and the ADC example
application.
+ADC Unit 1 is registered to ``/dev/adc0`` with channels 0, 1, 2 and 3 enabled
by default.
+Currently, the ADC operates in oneshot mode.
+
+More ADC channels can be enabled or disabled in ``ADC Configuration`` menu.
+
+This example shows channels 0 and 1 connected to 3.3 V and channels 2 and 3 to
GND (all readings
+show in units of mV)::
+
+ nsh> adc -n 1
+ adc_main: g_adcstate.count: 1
+ adc_main: Hardware initialized. Opening the ADC device: /dev/adc0
+ Sample:
+ 1: channel: 0 value: 2900
+ 2: channel: 1 value: 2900
+ 3: channel: 2 value: 0
+ 4: channel: 3 value: 0
+
+ble
+---
+
+This configuration is used to enable the Bluetooth Low Energy (BLE) of
+the ESP32-C2 chip.
+
+To test it, just run the following commands below.
+
+Confirm that bnep interface exist::
+
+ nsh> ifconfig
+ bnep0 Link encap:UNSPEC at DOWN
+ inet addr:0.0.0.0 DRaddr:0.0.0.0 Mask:0.0.0.0
+
+Get basic information from it::
+
+ nsh> bt bnep0 info
+ Device: bnep0
+ BDAddr: 86:f7:03:09:41:4d
+ Flags: 0000
+ Free: 20
+ ACL: 20
+ SCO: 0
+ Max:
+ ACL: 24
+ SCO: 0
+ MTU:
+ ACL: 70
+ SCO: 0
+ Policy: 0
+ Type: 0
+
+Start the scanning process::
+
+ nsh> bt bnep0 scan start
+
+Wait a little bit before stopping it.
+
+Then after some minutes stop it::
+
+ nsh> bt bnep0 scan stop
+
+Get the list of BLE devices found around you::
+
+ nsh> bt bnep0 scan get
+ Scan result:
+ 1. addr: d7:c4:e6:xx:xx:xx type: 0
+ rssi: -62
+ response type: 4
+ advertiser data: 10 09 4d 69 20 XX XX XX XX XX XX XX XX XX XX 20
e
+ nsh>
+
+bmp180
+------
+
+This configuration enables the use of the BMP180 pressure sensor over I2C.
+You can check that the sensor is working by using the ``bmp180`` application::
+
+ nsh> bmp180
+ Pressure value = 91531
+ Pressure value = 91526
+ Pressure value = 91525
+
+buttons
+-------
+
+This configuration shows the use of the buttons subsystem. It can be used by
executing
+the ``buttons`` application and pressing the ``BOOT`` button on the board::
+
+ nsh> buttons
+ buttons_main: Starting the button_daemon
+ buttons_main: button_daemon started
+ button_daemon: Running
+ button_daemon: Opening /dev/buttons
+ button_daemon: Supported BUTTONs 0x01
+ nsh> Sample = 1
+ Sample = 0
+
+crypto
+------
+
+This configuration enables support for the cryptographic hardware and
+the ``/dev/crypto`` device file. Currently, we are supporting SHA-1,
+and SHA-256 algorithms using hardware.
+To test hardware acceleration, you can use `hmac` example and following output
+should look like this::
+
+ nsh> hmac
+ ...
+ hmac sha1 success
+ hmac sha1 success
+ hmac sha1 success
+ hmac sha256 success
+ hmac sha256 success
+ hmac sha256 success
+
+efuse
+-----
+
+This configuration demonstrates the use of the eFuse driver. It can be accessed
+through the ``/dev/efuse`` device file.
+Virtual eFuse mode can be used by enabling `CONFIG_ESPRESSIF_EFUSE_VIRTUAL`
+option to prevent possible damages on chip.
+
+The following snippet demonstrates how to read MAC address:
+
+.. code-block:: C
+
+ int fd;
+ int ret;
+ uint8_t mac[6];
+ struct efuse_param_s param;
+ struct efuse_desc_s mac_addr =
+ {
+ .bit_offset = 1,
+ .bit_count = 48
+ };
+
+ const efuse_desc_t* desc[] =
+ {
+ &mac_addr,
+ NULL
+ };
+ param.field = desc;
+ param.size = 48;
+ param.data = mac;
+
+ fd = open("/dev/efuse", O_RDONLY);
+ ret = ioctl(fd, EFUSEIOC_READ_FIELD, ¶m);
+
+To find offset and count variables for related eFuse,
+please refer to Espressif's Technical Reference Manuals.
+
+gpio
+----
+
+This is a test for the GPIO driver. It uses GPIO1 and GPIO2 as outputs and
+GPIO9 as an interrupt pin.
+
+At the nsh, we can turn the outputs on and off with the following::
+
+ nsh> gpio -o 1 /dev/gpio0
+ nsh> gpio -o 1 /dev/gpio1
+
+ nsh> gpio -o 0 /dev/gpio0
+ nsh> gpio -o 0 /dev/gpio1
+
+We can use the interrupt pin to send a signal when the interrupt fires::
+
+ nsh> gpio -w 14 /dev/gpio2
+
+The pin is configured as a rising edge interrupt, so after issuing the
+above command, connect it to 3.3V.
+
+To use dedicated gpio for controlling multiple gpio pin at the same time
+or having better response time, you need to enable
+`CONFIG_ESPRESSIF_DEDICATED_GPIO` option. Dedicated GPIO is suitable
+for faster response times required applications like simulate serial/parallel
+interfaces in a bit-banging way.
+After this option enabled GPIO4 and GPIO5 pins are ready to used as dedicated
GPIO pins
+as input/output mode. These pins are for example, you can use any pin up to 8
pins for
+input and 8 pins for output for dedicated gpio.
+To write and read data from dedicated gpio, you need to use
+`write` and `read` calls.
+
+The following snippet demonstrates how to read/write to dedicated GPIO pins:
+
+.. code-block:: C
+
+ int fd = open("/dev/dedic_gpio0", O_RDWR);
+ int rd_val = 0;
+ int wr_mask = 0xffff;
+ int wr_val = 3;
+
+ while(1)
+ {
+ write(fd, &wr_val, wr_mask);
+ if (wr_val == 0)
+ {
+ wr_val = 3;
+ }
+ else
+ {
+ wr_val = 0;
+ }
+ read(fd, &rd_val, sizeof(uint32_t));
+ printf("rd_val: %d", rd_val);
+ }
+
+i2c
+---
+
+This configuration can be used to scan and manipulate I2C devices.
+You can scan for all I2C devices using the following command::
+
+ nsh> i2c dev 0x00 0x7f
+
+Default pins are GPIO6 (SCL) and GPIO5 (SDA).
+
+To use slave mode, you can enable `ESPRESSIF_I2C0_SLAVE_MODE` option.
+To use slave mode driver following snippet demonstrates how write to i2c bus
+using slave driver:
+
+.. code-block:: C
+
+ #define ESP_I2C_SLAVE_PATH "/dev/i2cslv0"
+ int main(int argc, char *argv[])
+ {
+ int i2c_slave_fd;
+ int ret;
+ uint8_t buffer[5] = {0xAA};
+ i2c_slave_fd = open(ESP_I2C_SLAVE_PATH, O_RDWR);
+ ret = write(i2c_slave_fd, buffer, 5);
+ close(i2c_slave_fd);
+ }
+
+mcuboot_nsh
+-----------
+
+This configuration is the same as the ``nsh`` configuration, but it generates
the application
+image in a format that can be used by MCUboot. It also makes the ``make
bootloader`` command to
+build the MCUboot bootloader image using the Espressif HAL.
+
+See :ref:`MCUBoot C2` for flash-layout limits on 2 MB modules. NuttX MCUBoot
+support for ESP32-C2 is still in progress; there is no ``mcuboot_update_agent``
+configuration for this board.
+
+nsh
+---
+
+Basic configuration to run the NuttShell (nsh).
+
+ostest
+------
+
+This is the NuttX test at ``apps/testing/ostest`` that is run against all new
+architecture ports to assure a correct implementation of the OS.
+
+pwm
+---
+
+This configuration demonstrates the use of PWM through LEDC channel 0,
+which defaults to GPIO2. To test it, just execute the ``pwm`` application::
+
+ nsh> pwm
+ pwm_main: starting output with frequency: 10000 duty: 00008000
+ pwm_main: stopping output
+
+random
+------
+
+This configuration shows the use of the ESP32-C2's True Random Number
Generator.
+To test it, just run ``rand`` to get 32 randomly generated bytes::
+
+ nsh> rand
+ Reading 8 random numbers
+ Random values (0x3ffe0b00):
+ 0000 98 b9 66 a2 a2 c0 a2 ae 09 70 93 d1 b5 91 86 c8 ..f......p......
+ 0010 8f 0e 0b 04 29 64 21 72 01 92 7c a2 27 60 6f 90 ....)d!r..|.'`o.
+
+romfs
+-----
+
+This configuration demonstrates the use of ROMFS (Read-Only Memory File
System) to provide
+automated system initialization and startup scripts. ROMFS allows embedding a
read-only
+filesystem directly into the NuttX binary, which is mounted at ``/etc`` during
system startup.
+
+**What ROMFS provides:**
+
+* **System initialization script** (``/etc/init.d/rc.sysinit``): Executed
after board bring-up
+* **Startup script** (``/etc/init.d/rcS``): Executed after system init,
typically used to start applications
+
+**Default behavior:**
+
+When this configuration is used, NuttX will:
+
+1. Create a read-only RAM disk containing the ROMFS filesystem
+2. Mount the ROMFS at ``/etc``
+3. Execute ``/etc/init.d/rc.sysinit`` during system initialization
+4. Execute ``/etc/init.d/rcS`` for application startup
+
+**Customizing startup scripts:**
+
+The startup scripts are located in:
+``boards/risc-v/esp32c2/common/src/etc/init.d/``
+
+* ``rc.sysinit`` - System initialization script
+* ``rcS`` - Application startup script
+
+To customize these scripts:
+
+1. **Edit the script files** in
``boards/risc-v/esp32c2/common/src/etc/init.d/``
+2. **Add your initialization commands** using any NSH-compatible commands
+
+**Example customizations:**
+
+* **rc.sysinit** - Set up system services, mount additional filesystems,
configure network.
+* **rcS** - Start your application, launch daemons, configure peripherals.
This is executed after the rc.sysinit script.
+
+Example output::
+
+ *** Booting NuttX ***
+ [...]
+ rc.sysinit is called!
+ rcS file is called!
+ NuttShell (NSH) NuttX-12.8.0
+ nsh> ls /etc/init.d
+ /etc/init.d:
+ .
+ ..
+ rc.sysinit
+ rcS
+
+rtc
+---
+
+This configuration demonstrates the use of the RTC driver through alarms.
+You can set an alarm, check its progress and receive a notification after it
expires::
+
+ nsh> alarm 10
+ alarm_daemon started
+ alarm_daemon: Running
+ Opening /dev/rtc0
+ Alarm 0 set in 10 seconds
+ nsh> alarm -r
+ Opening /dev/rtc0
+ Alarm 0 is active with 10 seconds to expiration
+ nsh> alarm_daemon: alarm 0 received
+
+The ESP32-C2 has no RTC retention memory, so the saved time does not
+survive deep sleep.
+
+sdmmc_spi
+---------
+
+This configuration is used to mount a FAT/FAT32 SD Card into the OS'
filesystem.
+It uses SPI to communicate with the SD Card, defaulting to SPI2.
+
+The SD slot number, SPI port number and minor number can be modified in
``Application Configuration → NSH Library``.
+
+To access the card's files, make sure ``/dev/mmcsd0`` exists and then execute
the following commands::
+
+ nsh> ls /dev
+ /dev:
+ console
+ mmcsd0
+ null
+ ttyS0
+ zero
+ nsh> mount -t vfat /dev/mmcsd0 /mnt
+
+This will mount the SD Card to ``/mnt``. Now, you can use the SD Card as a
normal filesystem.
+For example, you can read a file and write to it::
+
+ nsh> ls /mnt
+ /mnt:
+ hello.txt
+ nsh> cat /mnt/hello.txt
+ Hello World
+ nsh> echo 'NuttX RTOS' >> /mnt/hello.txt
+ nsh> cat /mnt/hello.txt
+ Hello World!
+ NuttX RTOS
+ nsh>
+
+spi
+---
+
+This configuration enables the support for the SPI driver.
+You can test it by connecting MOSI and MISO pins which are GPIO7 and GPIO2
+by default to each other and running the ``spi`` example::
+
+ nsh> spi exch -b 2 "AB"
+ Sending: AB
+ Received: AB
+
+If SPI peripherals are already in use you can also use bitbang driver which is
a
+software implemented SPI peripheral by enabling `CONFIG_ESPRESSIF_SPI_BITBANG`
+option.
+
+spiflash
+--------
+
+This config tests the external SPI that comes with the ESP8684-MINI-1 module
+connected through SPI1.
+
+By default a SmartFS file system is selected.
+Once booted you can use the following commands to mount the file system::
+
+ nsh> mksmartfs /dev/smart0
+ nsh> mount -t smartfs /dev/smart0 /mnt
+
+The storage partition defaults to offset ``0x110000`` and size ``0xf0000``
+on 2 MB flash so that it fits after the application image.
+
+temperature_sensor
+------------------
+
+This configuration enables the on-chip temperature sensor driver. The sensor is
+exposed through the uORB interface and can be read with the ``sensortest``
+utility::
+
+ nsh> sensortest temp
+
+tickless
+--------
+
+This configuration enables the support for tickless scheduler mode.
+
+timers
+------
+
+This configuration tests the general purpose timer. The ESP32-C2 has a
+single timer group. It adds driver support, registers the timer as a device
+and includes the timer example.
+
+To test it, just run the following::
+
+ nsh> timer -d /dev/timer0
+
+watchdog
+--------
+
+This configuration tests the watchdog timers. It includes the MWDT of the
+single timer group, adds driver support, registers the WDT as a device and
+includes the watchdog example application.
+
+To test it, just run the following command::
+
+ nsh> wdog -i /dev/watchdog0
+
+wifi
+----
+
+Enables Wi-Fi support. You can define your credentials this way::
+
+ $ make menuconfig
+ -> Application Configuration
+ -> Network Utilities
+ -> Network initialization (NETUTILS_NETINIT [=y])
+ -> WAPI Configuration
+
+Or if you don't want to keep it saved in the firmware you can do it
+at runtime::
+
+ nsh> wapi psk wlan0 mypasswd 3
+ nsh> wapi essid wlan0 myssid 1
+ nsh> renew wlan0
+
+.. tip:: Please refer to :ref:`ESP32 Wi-Fi Station Mode <esp32_wi-fi_sta>`
+ for more information.
diff --git a/Documentation/platforms/risc-v/esp32c2/index.rst
b/Documentation/platforms/risc-v/esp32c2/index.rst
new file mode 100644
index 00000000000..1e9e106b710
--- /dev/null
+++ b/Documentation/platforms/risc-v/esp32c2/index.rst
@@ -0,0 +1,635 @@
+.. _esp32c2:
+
+==================
+Espressif ESP32-C2
+==================
+
+The ESP32-C2 (also sold as ESP8684) is a highly integrated, low-power SoC
+with a RISC-V core. It supports 2.4 GHz Wi-Fi 4 (802.11b/g/n) and
+Bluetooth 5 (LE).
+
+* Internal Memory
+ - 576 KB ROM
+ - 272 KB SRAM (16 KB can be configured as cache)
+ - No RTC retention SRAM (saved RTC time does not survive deep sleep)
+* External Memory
+ - SPI flash in the module (typically 1 MB, 2 MB or 4 MB)
+* Connectivity
+ - 2.4 GHz Wi-Fi
+ - Bluetooth Low Energy 5
+* GPIO
+ - 14 user GPIOs (GPIO0–GPIO10, GPIO18–GPIO20)
+* Clock
+ - Main XTAL is 26 MHz on ESP8684-MINI-1 modules (40 MHz is also supported)
+
+ESP32-C2 Toolchain
+==================
+
+A generic RISC-V toolchain can be used to build ESP32-C2 projects. It's
recommended to use the same
+toolchain used by NuttX CI. Please refer to the Docker
+`container
<https://github.com/apache/nuttx/tree/master/tools/ci/docker/linux/Dockerfile>`_
and
+check for the current compiler version being used. For instance:
+
+.. code-block::
+
+
###############################################################################
+ # Build image for tool required by RISCV builds
+
###############################################################################
+ FROM nuttx-toolchain-base AS nuttx-toolchain-riscv
+ # Download the latest RISCV GCC toolchain prebuilt by xPack
+ RUN mkdir riscv-none-elf-gcc && \
+ curl -s -L
"https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/download/v13.2.0-2/xpack-riscv-none-elf-gcc-13.2.0-2-linux-x64.tar.gz"
\
+ | tar -C riscv-none-elf-gcc --strip-components 1 -xz
+
+It uses the xPack's prebuilt toolchain based on GCC 13.2.0-2.
+
+Installing
+----------
+
+First, create a directory to hold the toolchain:
+
+.. code-block:: console
+
+ $ mkdir -p /path/to/your/toolchain/riscv-none-elf-gcc
+
+Download and extract toolchain:
+
+.. code-block:: console
+
+ $ curl -s -L
"https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/download/v13.2.0-2/xpack-riscv-none-elf-gcc-13.2.0-2-linux-x64.tar.gz"
\
+ | tar -C /path/to/your/toolchain/riscv-none-elf-gcc --strip-components 1 -xz
+
+Add the toolchain to your `PATH`:
+
+.. code-block:: console
+
+ $ echo "export PATH=/path/to/your/toolchain/riscv-none-elf-gcc/bin:$PATH" >>
~/.bashrc
+
+You can edit your shell's rc files if you don't use bash.
+
+Building and flashing NuttX
+===========================
+
+Installing esptool
+------------------
+
+Make sure that ``esptool.py`` is installed and up-to-date.
+This tool is used to convert the ELF to a compatible ESP32-C2 image and to
flash the image into the board.
+
+It can be installed with: ``pip install esptool>=4.8.1``.
+
+.. warning::
+ Installing ``esptool.py`` may required a Python virtual environment on
newer systems.
+ This will be the case if the ``pip install`` command throws an error such
as:
+ ``error: externally-managed-environment``.
+
+ If you are not familiar with virtual environments, refer to `Managing
esptool on virtual environment`_ for instructions on how to install
``esptool.py``.
+
+Bootloader and partitions
+-------------------------
+
+NuttX can boot the ESP32-C2 directly using the so-called "Simple Boot".
+An externally-built 2nd stage bootloader is not required in this case as all
+functions required to boot the device are built within NuttX. Simple boot does
not
+require any specific configuration (it is selectable by default if no other
+2nd stage bootloader is used).
+
+If features like `Flash Encryption`_ are required, an externally-built
+2nd stage bootloader is needed. The MCUBoot bootloader is built using
+the ``make bootloader`` command. This command generates the firmware in the
+``nuttx`` folder. The ``ESPTOOL_BINDIR`` is used in the ``make flash`` command
+to specify the path to the bootloader. For compatibility among other SoCs and
+future options of 2nd stage bootloaders, the commands ``make bootloader`` and
+the ``ESPTOOL_BINDIR`` option (for the ``make flash``) can be used even if no
+externally-built 2nd stage bootloader is being built (they will be ignored if
+Simple Boot is used, for instance)::
+
+ $ make bootloader
+
+.. note::
+ MCUBoot support for ESP32-C2 on NuttX is still in progress. The
+ ``mcuboot_nsh`` board configuration can build an MCUBoot-format image,
+ but there is no ``mcuboot_update_agent`` configuration yet. The default
+ MCUBoot slot map in Kconfig assumes at least 4 MB of flash and does
+ **not** fit the 2 MB modules used on many ESP8684-DevKitM-1 boards.
+
+.. note:: It is recommended that if this is the first time you are using the
board with NuttX to
+ perform a complete SPI FLASH erase.
+
+ .. code-block:: console
+
+ $ esptool.py erase_flash
+
+Building and Flashing
+---------------------
+
+This is a two-step process where the first step converts the ELF file into an
ESP32-C2 compatible binary
+and the second step flashes it to the board. These steps are included in the
build system and it is
+possible to build and flash the NuttX firmware simply by running::
+
+ $ make flash ESPTOOL_PORT=<port> ESPTOOL_BINDIR=./
+
+where:
+
+* ``ESPTOOL_PORT`` is typically ``/dev/ttyUSB0`` or similar.
+* ``ESPTOOL_BINDIR=./`` is the path of the externally-built 2nd stage
bootloader and the partition table (if applicable): when built using the ``make
bootloader``, these files are placed into ``nuttx`` folder.
+* ``ESPTOOL_BAUD`` is able to change the flash baud rate if desired.
+
+The ESP32-C2 port defaults to **2 MB** flash and **60 MHz** flash clock.
+
+Flashing NSH Example
+--------------------
+
+This example shows how to build and flash the ``nsh`` defconfig for the
ESP8684-DevKitM-1 board::
+
+ $ cd nuttx
+ $ make distclean
+ $ ./tools/configure.sh esp8684-devkitm:nsh
+ $ make -j$(nproc)
+
+When the build is complete, the firmware can be flashed to the board using the
command::
+
+ $ make -j$(nproc) flash ESPTOOL_PORT=<port> ESPTOOL_BINDIR=./
+
+where ``<port>`` is the serial port where the board is connected::
+
+ $ make flash ESPTOOL_PORT=/dev/ttyUSB0 ESPTOOL_BINDIR=./
+ CP: nuttx.hex
+ MKIMAGE: NuttX binary
+ esptool.py -c esp32c2 elf2image --ram-only-header -fs 2MB -fm dio -ff 60m -o
nuttx.bin nuttx
+ [...]
+ Generated: nuttx.bin
+ esptool.py -c esp32c2 -p /dev/ttyUSB0 -b 921600 write_flash -fs 2MB -fm dio
-ff 60m 0x0000 nuttx.bin
+ [...]
+ Hard resetting via RTS pin...
+
+Now opening the serial port with a terminal emulator should show the NuttX
console::
+
+ $ picocom -b 115200 /dev/ttyUSB0
+ NuttShell (NSH) NuttX-12.8.0
+ nsh> uname -a
+ NuttX 12.8.0 ... risc-v esp8684-devkitm
+
+The USB-to-UART bridge on the DevKit exposes UART0. The default UART0 pins
+are GPIO20 (TX) and GPIO19 (RX). Use a USB cable that carries data lines;
+charge-only cables will not enumerate the bridge.
+
+Building with CMake
+-------------------
+
+General CMake usage (out-of-tree build, ``menuconfig`` target, and so on) is
described in
+:doc:`/quickstart/compiling_cmake`. The ESP32-C2 common arch enables
post-build steps that
+produce ``nuttx.bin`` (and related images) under the **CMake binary
directory**; the build
+log also prints suggested ``esptool.py`` command lines for your layout.
+
+Example (NuttX shell defconfig, Ninja generator)::
+
+ $ cd nuttx
+ $ cmake -B build -DBOARD_CONFIG=esp8684-devkitm:nsh -GNinja
+ $ cmake --build build
+
+To reconfigure the tree after changing options (same as other NuttX CMake
boards)::
+
+ $ cmake --build build -t menuconfig
+ $ cmake --build build
+
+Persistent HAL cache (``NXTMPDIR``)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Pass ``-DNXTMPDIR=ON`` at **configure** time to reuse a persistent clone of the
+``esp-hal-3rdparty`` repository under ``nuttx/../nxtmpdir/esp-hal-3rdparty``.
CMake checks
+the expected revision; if it does not match, the cache directory is refreshed.
This cuts
+repeat configure/build time when the HAL checkout would otherwise be
re-fetched into the
+binary directory.
+
+Example::
+
+ $ cmake -B build -DBOARD_CONFIG=esp8684-devkitm:nsh -DNXTMPDIR=ON -GNinja
+ $ cmake --build build
+
+MCUBoot: building the 2nd-stage bootloader (``-t bootloader``)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+For configurations that use MCUboot, build the bootloader the same way as
+with Make, but via the CMake target::
+
+ $ cmake --build build -t bootloader
+
+The image is installed as ``mcuboot-esp32c2.bin`` in the NuttX **source**
directory (not
+inside ``build/``).
+
+.. note::
+
+ Flashing paths differ from the pure-Make flow: the application image is
under your CMake
+ build directory (for example ``build/nuttx.bin``), while MCUboot binaries
live next to
+ ``nuttx`` sources.
+
+Target flashing (``-t flash``)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+After a successful CMake build, you can flash the chip with the ``flash``
custom target.
+This is the CMake-side equivalent of the Make ``FLASH`` logic in
+``tools/espressif/Config.mk``.
+
+**Serial port:** you must set ``ESPTOOL_PORT`` to a non-empty value (for
example
+``/dev/ttyUSB0``). If it is unset or empty, the flash step fails.
+
+Example::
+
+ $ export ESPTOOL_PORT=/dev/ttyUSB0
+ $ cmake --build build -t flash
+
+Or for a single invocation::
+
+ $ ESPTOOL_PORT=/dev/ttyUSB0 cmake --build build -t flash
+
+Debugging
+=========
+
+This section describes debugging techniques for the ESP32-C2.
+
+Debugging with ``openocd`` and ``gdb``
+--------------------------------------
+
+Espressif uses a specific version of OpenOCD to support ESP32-C2:
`openocd-esp32 <https://github.com/espressif/openocd-esp32>`_.
+
+Please check `Building OpenOCD from Sources
<https://docs.espressif.com/projects/esp-idf/en/latest/esp32c2/api-guides/jtag-debugging/index.html#jtag-debugging-building-openocd>`_
+for more information on how to build OpenOCD for ESP32-C2.
+
+The ESP32-C2 does **not** integrate a USB-to-JTAG adapter. An external JTAG
+adapter is required and can be connected as follows:
+
+============ ===========
+ESP32-C2 Pin JTAG Signal
+============ ===========
+GPIO4 TMS
+GPIO5 TDI
+GPIO6 TCK
+GPIO7 TDO
+============ ===========
+
+These pins are also the default MTMS / MTDI / MTCK / MTDO strapping functions
+on the ESP8684-DevKitM-1 header.
+
+OpenOCD can then be used::
+
+ openocd -c 'set ESP_RTOS hwthread; set ESP_FLASH_SIZE 0' -f
board/esp32c2-ftdi.cfg
+
+Once OpenOCD is running, you can use GDB to connect to it and debug your
application::
+
+ riscv-none-elf-gdb -x gdbinit nuttx
+
+whereas the content of the ``gdbinit`` file is::
+
+ target remote :3333
+ set remote hardware-watchpoint-limit 2
+ mon reset halt
+ flushregs
+ monitor reset halt
+ thb nsh_main
+ c
+
+.. note:: ``nuttx`` is the ELF file generated by the build process. Please
note that ``CONFIG_DEBUG_SYMBOLS`` must be enabled in the ``menuconfig``.
+
+.. note::
+ ``appimage_offset`` should be set to ``0x0`` when ``Simple Boot`` is used.
For MCUboot, this value should be set to
+ ``CONFIG_ESPRESSIF_OTA_PRIMARY_SLOT_OFFSET`` (``0x20000`` by default).
+
+Please refer to :doc:`/quickstart/debugging` for more information about
debugging techniques.
+
+Stack Dump and Backtrace Dump
+-----------------------------
+
+NuttX has a feature to dump the stack of a task and to dump the backtrace of
it (and of all
+the other tasks). This feature is useful to debug the system when it is not
behaving as expected,
+especially when it is crashing.
+
+In order to enable this feature, the following options must be enabled in the
NuttX configuration:
+``CONFIG_SCHED_BACKTRACE``, ``CONFIG_DEBUG_SYMBOLS`` and, optionally,
``CONFIG_ALLSYMS``.
+
+.. note::
+ The first two options enable the backtrace dump. The third option enables
the backtrace dump
+ with the associated symbols, but increases the size of the generated NuttX
binary.
+
+Espressif also provides a tool to translate the backtrace dump into a
human-readable format.
+This tool is called ``btdecode.sh`` and is available at
``tools/espressif/btdecode.sh`` of NuttX
+repository.
+
+.. note::
+ This tool is not necessary if ``CONFIG_ALLSYMS`` is enabled. In this case,
the backtrace dump
+ contains the function names.
+
+Save a crash dump that contains ``sched_dumpstack`` lines to a file and decode
it with::
+
+ ./tools/espressif/btdecode.sh esp32c2 /tmp/backtrace.txt
+
+Peripheral Support
+==================
+
+The following list indicates the state of peripherals' support in NuttX:
+
+=========== ======= ====================
+Peripheral Support NOTES
+=========== ======= ====================
+ADC Yes Oneshot
+AES Yes
+Bluetooth Yes
+CAN/TWAI No
+DMA Yes
+eFuse Yes Also virtual mode supported
+GPIO Yes Dedicated GPIO supported
+HMAC No
+I2C Yes Master and Slave mode supported
+I2S Yes
+LED/PWM Yes
+RMT Yes
+RNG Yes
+RSA No
+RTC Yes No RTC retention SRAM
+SHA Yes
+SPI Yes
+SPIFLASH Yes
+SPIRAM No
+Timers Yes One timer group
+UART Yes
+USB Serial No No USB-Serial-JTAG on this SoC
+Watchdog Yes
+Wi-Fi Yes WPA3-SAE supported
+=========== ======= ====================
+
+Analog-to-digital converter (ADC)
+---------------------------------
+
+Two ADC units are available for the ESP32-C2:
+
+* ADC1 with 5 channels.
+* ADC2 with 1 channel. **This unit is not implemented.**
+
+Those units are independent and can be used simultaneously. During bringup,
GPIOs for selected channels are
+configured automatically to be used as ADC inputs.
+If available, ADC calibration is automatically applied (see
+`this page
<https://docs.espressif.com/projects/esp-idf/en/latest/esp32c2/api-reference/peripherals/adc_calibration.html>`__
for more details).
+Otherwise, a simple conversion is applied based on the attenuation and
resolution.
+
+The ADC unit is accessible using the ADC character driver, which returns data
for the enabled channels.
+
+The ADC1 unit can be enabled in the menu :menuselection:`System Type -->
Peripheral Support --> Analog-to-digital converter (ADC)`.
+
+Then, it can be customized in the menu :menuselection:`System Type --> ADC
Configuration`, which includes operating mode, gain and channels.
+
+========== ===========
+ Channel ADC1 GPIO
+========== ===========
+0 0
+1 1
+2 2
+3 3
+4 4
+========== ===========
+
+ADC2 channel 0 is GPIO5.
+
+.. warning:: Maximum measurable voltage may saturate around 2900 mV.
+
+.. _MCUBoot C2:
+
+MCUBoot
+=======
+
+The ESP32-C2 can use MCUBoot as a 2nd stage bootloader. NuttX integration is
+still marked as in progress upstream (see
+`MCUBoot Espressif port <https://docs.mcuboot.com/readme-espressif.html>`__).
+
+The ``esp8684-devkitm:mcuboot_nsh`` configuration produces an
MCUBoot-compatible
+application image and enables ``make bootloader``. There is no
+``mcuboot_update_agent`` defconfig for this board yet.
+
+.. warning::
+ Default MCUBoot Kconfig offsets (primary ``0x20000``, secondary
``0x170000``,
+ scratch ``0x2C0000``, optional storage ``0x300000``) assume **4 MB or more**
+ of flash. ESP8684-DevKitM-1 boards commonly ship with **2 MB**. Using those
+ defaults on 2 MB flash will place partitions past the end of the device.
+ Override ``ESPRESSIF_OTA_*`` and ``ESPRESSIF_STORAGE_MTD_*`` before enabling
+ MCUBoot on 2 MB parts.
+
+For Simple Boot on 2 MB flash, the storage MTD defaults to offset ``0x110000``
+and size ``0xf0000``.
+
+Flash Encryption
+----------------
+
+Flash encryption is intended for encrypting the contents of the ESP32-C2's
off-chip flash memory. Once this feature is enabled,
+firmware is flashed as plaintext, and then the data is encrypted in place on
the first boot. As a result, physical readout
+of flash will not be sufficient to recover most flash contents.
+
+The current state of flash encryption for ESP32-C2 allows the use of Virtual
E-Fuses and development mode, which permit users to evaluate and test the
firmware before making definitive changes such as burning E-Fuses.
+
+Flash encryption supports the following features:
+
+ .. list-table::
+ :header-rows: 1
+
+ * - Feature
+ - Description
+ * - **Flash Encryption with Virtual E-Fuses**
+ - Use flash encryption without burning E-Fuses. Default selection when
flash encryption is enabled.
+ * - **Flash Encryption in Development mode**
+ - Allows reflashing an encrypted device by appending the ``--encrypt``
argument to the ``esptool.py write_flash`` command. This is done automatically
if ``ESPRESSIF_SECURE_FLASH_ENC_FLASH_DEVICE_ENCRYPTED`` is set.
+ * - **Flash Encryption in Release mode**
+ - Does not allow reflashing the device. This is a permanent setting.
+ * - **Flash Encryption key**
+ - A user-generated key is required by default. Alternatively, a
device-generated key is possible, but it will not be recoverable by the user
(not recommended). See ``ESPRESSIF_SECURE_FLASH_ENC_USE_HOST_KEY``.
+ * - **Encrypted MTD Partition**
+ - If SPI Flash is enabled, an empty user MTD partition will be
automatically encrypted on first flash.
+
+.. note::
+
+ It is **strongly suggested** to read the following before working on flash
encryption:
+
+ - `MCUBoot Flash Encryption
<https://docs.mcuboot.com/readme-espressif.html#flash-encryption>`_
+ - `General E-Fuse documentation
<https://docs.espressif.com/projects/esp-idf/en/latest/esp32c2/api-reference/system/efuse.html>`_
+ - `Flash Encryption Relevant E-Fuses
<https://docs.espressif.com/projects/esp-idf/en/latest/esp32c2/security/flash-encryption.html#relevant-efuses>`_
+
+ ESP32-C2 Secure Boot V2 uses **ECDSA**, not RSA.
+
+Flash Encryption Requirements
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Flash encryption requires burning E-Fuses to enable it on chip. This is not a
reversible operation and should be done with caution.
+There is, however, a way to test the flash encryption by simulating them on
flash.
+
+Build System Features
+'''''''''''''''''''''
+
+The build system contains some safeguards to avoid accidentally burning
E-Fuses and automations for convenience. Those are summarized below:
+
+ 1. A yellow warning will show up during build alerting that flash encryption
is enabled (same for Virtual E-Fuses).
+ 2. If ``ESPRESSIF_SECURE_FLASH_ENC_USE_HOST_KEY`` is set, build will fail if
the flash encryption key is not found.
+ 3. If SPI Flash is enabled, the user MTD partition is automatically
encrypted with the provided encryption key.
+ 4. ``make flash`` command will prompt the user for confirmation before
burning the E-Fuse, if Virtual E-Fuses are disabled.
+
+Simulating Flash Encryption with Virtual E-Fuses
+'''''''''''''''''''''''''''''''''''''''''''''''''
+
+It is highly recommended to use this method for testing the flash encryption
before actually burning the E-Fuses.
+The E-Fuses are stored in flash and persist between reboots. No real E-Fuses
are changed.
+
+To enable virtual E-Fuses for flash encryption testing, open ``menuconfig``
and:
+ 1. Enable flash encryption on boot on: :menuselection:`System Type -->
Bootloader and Image Configuration`
+ 2. Verify Virtual E-Fuses are enabled (this is done by default):
:menuselection:`System Type --> Peripheral Support --> E-Fuse support`
+
+Actual encryption and burning E-Fuses
+'''''''''''''''''''''''''''''''''''''
+
+E-Fuses are burned by esptool and the bootloader on the first boot after
flashing with encryption enabled.
+This process is automated on NuttX build system.
+
+.. warning:: Burning E-Fuses is NOT a reversible operation and should be done
with caution.
+
+To build a firmware with E-Fuse support and flash encryption enabled, open
``menuconfig`` and:
+ 1. Enable flash encryption on boot on: :menuselection:`System Type -->
Bootloader and Image Configuration`
+ 2. Disable Virtual E-Fuses :menuselection:`System Type --> Peripheral
Support --> E-Fuse support`
+ 3. Check usage mode is Development (this allows reflashing, while Release
mode does not).
+
+.. note:: If using development mode of flash encryption (see menuconfig and
documentation above), it is still possible to re-flash the device with esptool
by
+ setting ``ESPRESSIF_SECURE_FLASH_ENC_FLASH_DEVICE_ENCRYPTED`` which adds
``--encrypt`` argument to the ``esptool.py write_flash`` command.
+ This will apply the burned encryption key to the image while flashing.
+
+Flash Allocation for MCUBoot
+----------------------------
+
+When MCUBoot is enabled, the **default** Kconfig layout is the same as on other
+Espressif RISC-V chips (4 MB class). Do not use it unchanged on 2 MB flash.
+
+**Default flash layout (MCUBoot enabled, 4 MB+)**
+
+.. list-table::
+ :header-rows: 1
+ :widths: 40 20 20
+ :align: left
+
+ * - Region
+ - Offset
+ - Size
+ * - Bootloader
+ - 0x000000
+ - 64KB
+ * - E-Fuse Virtual (see Note)
+ - 0x010000
+ - 64KB
+ * - Primary Application Slot (/dev/ota0)
+ - 0x020000
+ - 1.4MB
+ * - Secondary Application Slot (/dev/ota1)
+ - 0x170000
+ - 1.4MB
+ * - Scratch Partition (/dev/otascratch)
+ - 0x2C0000
+ - 256KB
+ * - Storage MTD (optional)
+ - 0x300000
+ - 1MB
+ * - Available Flash
+ - 0x400000+
+ - Remaining
+
+.. raw:: html
+
+ <div style="clear: both"></div>
+
+**Note**: The E-Fuse Virtual region is optional and only used when
+``ESPRESSIF_EFUSE_VIRTUAL_KEEP_IN_FLASH`` is enabled. However, this 64KB
+location is always allocated in the memory layout to prevent accidental
+erasure during board flashing operations, ensuring data preservation if
+virtual E-Fuses are later enabled.
+
+The key KConfig options that control this layout:
+
+- ``ESPRESSIF_OTA_PRIMARY_SLOT_OFFSET`` (default: 0x20000)
+- ``ESPRESSIF_OTA_SECONDARY_SLOT_OFFSET`` (default: 0x170000)
+- ``ESPRESSIF_OTA_SLOT_SIZE`` (default: 0x150000)
+- ``ESPRESSIF_OTA_SCRATCH_OFFSET`` (default: 0x2C0000)
+- ``ESPRESSIF_OTA_SCRATCH_SIZE`` (default: 0x40000)
+- ``ESPRESSIF_STORAGE_MTD_OFFSET`` (default: 0x300000 when MCUBoot enabled)
+- ``ESPRESSIF_STORAGE_MTD_SIZE`` (default: 0x100000)
+
+For MCUBoot operation:
+
+- The **Primary Slot** contains the currently running application
+- The **Secondary Slot** receives OTA updates
+- The **Scratch Partition** is used by MCUBoot for image swapping during
updates
+- MCUBoot manages image validation, confirmation, and rollback functionality
+
+_`Managing esptool on virtual environment`
+==========================================
+
+This section describes how to install ``esptool``, ``imgtool`` or any other
Python packages in a
+proper environment.
+
+Normally, a Linux-based OS would already have Python 3 installed by default.
Up to a few years ago,
+you could simply call ``pip install`` to install packages globally. However,
this is no longer recommended
+as it can lead to conflicts between packages and versions. The recommended way
to install Python packages
+is to use a virtual environment.
+
+A virtual environment is a self-contained directory that contains a Python
installation for a particular
+version of Python, plus a number of additional packages. You can create a
virtual environment for each
+project you are working on, and install the required packages in that
environment.
+
+Two alternatives are explained below, you can select any one of those.
+
+Using pipx (recommended)
+------------------------
+
+``pipx`` is a tool that makes it easy to install Python packages in a virtual
environment. To install
+``pipx``, you can run the following command (using apt as example)::
+
+ $ apt install pipx
+
+Once you have installed ``pipx``, you can use it to install Python packages in
a virtual environment. For
+example, to install the ``esptool`` package, you can run the following
command::
+
+ $ pipx install esptool
+
+This will create a new virtual environment in the ``~/.local/pipx/venvs``
directory, which contains the
+``esptool`` package. You can now use the ``esptool`` command as normal, and so
will the build system.
+
+Make sure to run ``pipx ensurepath`` to add the ``~/.local/bin`` directory to
your ``PATH``. This will
+allow you to run the ``esptool`` command from any directory.
+
+Using venv (alternative)
+------------------------
+To create a virtual environment, you can use the ``venv`` module, which is
included in the Python standard
+library. To create a virtual environment, you can run the following command::
+
+ $ python3 -m venv myenv
+
+This will create a new directory called ``myenv`` in the current directory,
which contains a Python
+installation and a copy of the Python standard library. To activate the
virtual environment, you can run
+the following command::
+
+ $ source myenv/bin/activate
+
+This will change your shell prompt to indicate that you are now working in the
virtual environment. You can
+now install packages using ``pip``. For example, to install the ``esptool``
package, you can run the following
+command::
+
+ $ pip install esptool
+
+This will install the ``esptool`` package in the virtual environment. You can
now use the ``esptool`` command as
+normal. When you are finished working in the virtual environment, you can
deactivate it by running the following
+command::
+
+ $ deactivate
+
+This will return your shell prompt to its normal state. You can reactivate the
virtual environment at any time by
+running the ``source myenv/bin/activate`` command again. You can also delete
the virtual environment by deleting
+the directory that contains it.
+
+Supported Boards
+================
+
+.. toctree::
+ :glob:
+ :maxdepth: 1
+
+ boards/*/*