documentation: add documentation for ESP32-S2/S3/C3
Add documentation for ESP32-S2 and ESP32-S2 Saola 1 board Add links to already existing ESP32-S3 documentation Add links to already existing ESP32-C3 documentation
This commit is contained in:
parent
1d0a37cd10
commit
b16ed003f1
@ -3019,6 +3019,17 @@ LiteX on ARTY A7
|
|||||||
Support for the Digilent ARTY_A7 board along with CPU VexRiscV SOC were
|
Support for the Digilent ARTY_A7 board along with CPU VexRiscV SOC were
|
||||||
added in NuttX-9.0.
|
added in NuttX-9.0.
|
||||||
|
|
||||||
|
ESP32-C3
|
||||||
|
--------
|
||||||
|
|
||||||
|
Initial architectural support for ESP32-C3 (RISC-V) was added in NuttX-10.1.0
|
||||||
|
|
||||||
|
**Espressif ESP32-C3 Devkit Board** The NuttX release includes support for
|
||||||
|
Espressif ESP32-C3 Devkit board.
|
||||||
|
|
||||||
|
Please, refer to the :doc:`ESP32-C3 </platforms/risc-v/esp32c3/index>` on NuttX for
|
||||||
|
further information.
|
||||||
|
|
||||||
ESP32 (Dual Xtensa LX6)
|
ESP32 (Dual Xtensa LX6)
|
||||||
=======================
|
=======================
|
||||||
|
|
||||||
@ -3026,7 +3037,7 @@ Xtensa LX6 ESP32
|
|||||||
----------------
|
----------------
|
||||||
|
|
||||||
Initial architectural support for Xtensa LX6 processors for the Espressif
|
Initial architectural support for Xtensa LX6 processors for the Espressif
|
||||||
ESP32 were added in NuttX-7.19, enabling both single CPU and dual CPU
|
ESP32 was added in NuttX-7.19, enabling both single CPU and dual CPU
|
||||||
SMP configurations.
|
SMP configurations.
|
||||||
|
|
||||||
**Espressif ESP32 DevkitC V4 Board** The NuttX release includes support for
|
**Espressif ESP32 DevkitC V4 Board** The NuttX release includes support for
|
||||||
@ -3040,6 +3051,36 @@ includes: I2C, SPI, RTC, PM, Timers, Watchdog Timer and Ethernet.
|
|||||||
Please, refer to the :doc:`ESP32 </platforms/xtensa/esp32/index>` on NuttX for
|
Please, refer to the :doc:`ESP32 </platforms/xtensa/esp32/index>` on NuttX for
|
||||||
further information.
|
further information.
|
||||||
|
|
||||||
|
ESP32-S2 (Single Xtensa LX7)
|
||||||
|
=======================
|
||||||
|
|
||||||
|
Xtensa LX7 ESP32-S2
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Initial architectural support for Xtensa LX7 processor for the Espressif
|
||||||
|
ESP32-S2 was added in NuttX-10.2.
|
||||||
|
|
||||||
|
**Espressif ESP32-S2 Saola V1 Board** The NuttX release includes support for
|
||||||
|
Espressif ESP32-S2 Saola V1 board.
|
||||||
|
|
||||||
|
Please, refer to the :doc:`ESP32-S2 </platforms/xtensa/esp32s2/index>` on NuttX for
|
||||||
|
further information.
|
||||||
|
|
||||||
|
ESP32-S3 (Dual Xtensa LX7)
|
||||||
|
=======================
|
||||||
|
|
||||||
|
Xtensa LX7 ESP32-S3
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Initial architectural support for dual Xtensa LX7 processors for the Espressif
|
||||||
|
ESP32-S3 was added in NuttX-10.3.
|
||||||
|
|
||||||
|
**Espressif ESP32-S3 DevKit Board** The NuttX release includes support for
|
||||||
|
Espressif ESP32-S3 DevKit board.
|
||||||
|
|
||||||
|
Please, refer to the :doc:`ESP32-S3 </platforms/xtensa/esp32s3/index>` on NuttX for
|
||||||
|
further information.
|
||||||
|
|
||||||
Zilog ZNEO Z16F
|
Zilog ZNEO Z16F
|
||||||
===============
|
===============
|
||||||
|
|
||||||
|
@ -68,11 +68,17 @@ from board-to-board. Follow the links for the details:
|
|||||||
- :ref:`introduction/detailed_support:RISC-V` (2)
|
- :ref:`introduction/detailed_support:RISC-V` (2)
|
||||||
|
|
||||||
- :ref:`introduction/detailed_support:LiteX on Arty A7` (1)
|
- :ref:`introduction/detailed_support:LiteX on Arty A7` (1)
|
||||||
|
- :ref:`introduction/detailed_support:ESP32-C3` (1)
|
||||||
|
|
||||||
- Xtensa LX6:
|
- Xtensa LX6:
|
||||||
|
|
||||||
- :ref:`introduction/detailed_support:ESP32 (Dual Xtensa LX6)` (1)
|
- :ref:`introduction/detailed_support:ESP32 (Dual Xtensa LX6)` (1)
|
||||||
|
|
||||||
|
- Xtensa LX7:
|
||||||
|
|
||||||
|
- :ref:`introduction/detailed_support:ESP32-S2 (Single Xtensa LX7)` (1)
|
||||||
|
- :ref:`introduction/detailed_support:ESP32-S3 (Dual Xtensa LX7)` (1)
|
||||||
|
|
||||||
- ZiLOG
|
- ZiLOG
|
||||||
|
|
||||||
- :ref:`introduction/detailed_support:ZiLOG ZNEO Z16F` (2)
|
- :ref:`introduction/detailed_support:ZiLOG ZNEO Z16F` (2)
|
||||||
@ -103,6 +109,9 @@ MCU. Follow the links for the details:
|
|||||||
- Espressif
|
- Espressif
|
||||||
|
|
||||||
- :ref:`introduction/detailed_support:Xtensa LX6 ESP32` (Dual Xtensa LX6)
|
- :ref:`introduction/detailed_support:Xtensa LX6 ESP32` (Dual Xtensa LX6)
|
||||||
|
- :ref:`introduction/detailed_support:Xtensa LX7 ESP32-S2` (Single Xtensa LX7)
|
||||||
|
- :ref:`introduction/detailed_support:Xtensa LX7 ESP32-S3` (Dual Xtensa LX7)
|
||||||
|
- :ref:`introduction/detailed_support:ESP32-C3` (RISC-V)
|
||||||
|
|
||||||
- Host PC based simulations
|
- Host PC based simulations
|
||||||
|
|
||||||
|
Binary file not shown.
After Width: | Height: | Size: 158 KiB |
@ -0,0 +1,181 @@
|
|||||||
|
================
|
||||||
|
ESP32-S2-Saola-1
|
||||||
|
================
|
||||||
|
|
||||||
|
The `ESP32-S2-Saola-1 <https://docs.espressif.com/projects/esp-idf/en/latest/esp32s2/hw-reference/esp32s2/user-guide-saola-1-v1.2.html>`_
|
||||||
|
is a development board for the ESP32-S2 SoC from Espressif, based on the following modules:
|
||||||
|
|
||||||
|
- ESP32-S2-WROVER
|
||||||
|
- ESP32-S2-WROVER-I
|
||||||
|
- ESP32-S2-WROOM
|
||||||
|
- ESP32-S2-WROOM-I
|
||||||
|
|
||||||
|
In this guide, we take ESP32-S2-Saola-1 equipped with ESP32-S2-WROVER as an example.
|
||||||
|
|
||||||
|
.. figure:: esp32-s2-saola-1-v1.2-isometric.png
|
||||||
|
:alt: ESP32-S2-Saola-1
|
||||||
|
:figclass: align-center
|
||||||
|
|
||||||
|
ESP32-S2-Saola-1
|
||||||
|
|
||||||
|
Features
|
||||||
|
========
|
||||||
|
|
||||||
|
- ESP32-S2-WROVER
|
||||||
|
- 4 MB external SPI flash + 2 MB PSRAM
|
||||||
|
- USB-to-UART bridge via micro USB port
|
||||||
|
- Power LED
|
||||||
|
- EN and BOOT buttons
|
||||||
|
- RGB LED (Addressable RGB LED (WS2812), driven by GPIO18)
|
||||||
|
|
||||||
|
Serial Console
|
||||||
|
==============
|
||||||
|
|
||||||
|
UART0 is, by default, the serial console. It connects to the on-board
|
||||||
|
CP2102 converter and is available on the micro-USB connector (J1).
|
||||||
|
|
||||||
|
It will show up as /dev/ttyUSB[n] where [n] will probably be 0.
|
||||||
|
|
||||||
|
Buttons and LEDs
|
||||||
|
================
|
||||||
|
|
||||||
|
Buttons
|
||||||
|
-------
|
||||||
|
|
||||||
|
There are two buttons labeled Boot and EN. The EN button is not available
|
||||||
|
to the software. It pulls the chip enable line that doubles as a reset line.
|
||||||
|
|
||||||
|
The BOOT button is connected to IO0. On reset, it is used as a strapping
|
||||||
|
pin to determine whether the chip boots normally or into the serial
|
||||||
|
bootloader. After resetting, however, the BOOT button can be used for
|
||||||
|
software input.
|
||||||
|
|
||||||
|
LEDs
|
||||||
|
----
|
||||||
|
|
||||||
|
There are two on-board LEDs. RED_LED (D5) indicates the presence of 3.3V
|
||||||
|
power and is not controlled by software. RGB LED (U6) is a WS2812 addressable
|
||||||
|
LED and is driven by GPIO18.
|
||||||
|
|
||||||
|
I2S
|
||||||
|
===
|
||||||
|
|
||||||
|
ESP32-S2 has an I2S peripheral accessible using either the generic I2S audio
|
||||||
|
driver or a specific audio codec driver
|
||||||
|
(`CS4344 <https://www.cirrus.com/products/cs4344-45-48/>`__ bindings are
|
||||||
|
available at the moment). Also, it's possible to use the I2S character device
|
||||||
|
driver to bypass audio systems and write directly to the I2S peripheral.
|
||||||
|
|
||||||
|
.. note:: The I2S peripheral is able to work on two functional modes
|
||||||
|
internally: 16 and 32-bit width.
|
||||||
|
That limits using the I2S peripheral to play audio files other than 16/32
|
||||||
|
bit-widths as the internal buffer allocated for the audio content does not
|
||||||
|
consider the operation modes of the peripheral. This limitation is planned
|
||||||
|
to be removed soon by copying the buffers internally and making the
|
||||||
|
necessary adjustments.
|
||||||
|
|
||||||
|
.. note:: The above statement is not valid when using the I2S character
|
||||||
|
device driver.
|
||||||
|
It's possible to use 8, 16, 24, and 32-bit-widths writing directly to the
|
||||||
|
I2S character device. Just make sure to set the bit-width::
|
||||||
|
|
||||||
|
$ make menuconfig
|
||||||
|
-> System Type
|
||||||
|
-> ESP32-S2 Peripheral Selection
|
||||||
|
-> I2S
|
||||||
|
-> I2S0/1
|
||||||
|
-> Bit Witdh
|
||||||
|
|
||||||
|
And make sure the data stream buffer being written to the I2S peripheral is
|
||||||
|
aligned to the next boundary i.e. 16 bits for the 8 and 16-bit-widths and
|
||||||
|
32 bits for 24 and 32-bit-widths.
|
||||||
|
|
||||||
|
Configurations
|
||||||
|
==============
|
||||||
|
|
||||||
|
audio
|
||||||
|
-----
|
||||||
|
|
||||||
|
This configuration uses the I2S0 peripheral and an externally connected audio
|
||||||
|
codec to play an audio file. The easiest way of playing an uncompressed file
|
||||||
|
is embedding into the firmware. This configuration selects
|
||||||
|
`romfs example <https://github.com/apache/incubator-nuttx-apps/tree/master/examples/romfs>`_`
|
||||||
|
to allow that.
|
||||||
|
|
||||||
|
**Audio Codec Setup**
|
||||||
|
|
||||||
|
The CS4344 audio codec is connected to the following pins:
|
||||||
|
|
||||||
|
============ ========== =========================================
|
||||||
|
ESP32-S2 Pin CS4344 Pin Description
|
||||||
|
============ ========== =========================================
|
||||||
|
33 MCLK Master Clock
|
||||||
|
35 SCLK Serial Clock
|
||||||
|
34 LRCK Left Right Clock (Word Select)
|
||||||
|
36 SDIN Serial Data In on CS4344. (DOUT on ESP32)
|
||||||
|
============ ========== =========================================
|
||||||
|
|
||||||
|
**ROMFS example**
|
||||||
|
|
||||||
|
Prepare and build the `audio` defconfig::
|
||||||
|
|
||||||
|
$ make -j distclean && ./tools/configure.sh esp32s2-saola-1:audio && make
|
||||||
|
|
||||||
|
This will create a temporary folder in `apps/examples/romfs/testdir`. Move
|
||||||
|
a PCM-encoded (`.wav`) audio file with 16 bits/sample (sampled at 8~48kHz)
|
||||||
|
to this folder.
|
||||||
|
|
||||||
|
.. note:: You can use :download:`this 440 Hz sinusoidal tone <tone.wav>`.
|
||||||
|
The audio file should be located at `apps/examples/romfs/testdir/tone.wav`
|
||||||
|
|
||||||
|
Build the project again and flash it (make sure not to clean it, just build)
|
||||||
|
|
||||||
|
After successfully built and flashed, load the romfs and play it::
|
||||||
|
|
||||||
|
$ nsh> romfs
|
||||||
|
$ nsh> nxplayer
|
||||||
|
$ nxplayer> play /usr/share/local/tone.wav
|
||||||
|
|
||||||
|
i2schar
|
||||||
|
-------
|
||||||
|
|
||||||
|
This configuration enables the I2S character device and the i2schar example
|
||||||
|
app, which provides an easy-to-use way of testing the I2S peripheral.
|
||||||
|
|
||||||
|
After successfully built and flashed, run on the board's terminal::
|
||||||
|
|
||||||
|
$ i2schar
|
||||||
|
|
||||||
|
The corresponding output should show related debug information.
|
||||||
|
|
||||||
|
nsh
|
||||||
|
---
|
||||||
|
|
||||||
|
Basic NuttShell configuration (console enabled in UART0, exposed via
|
||||||
|
USB connection by means of CP2102 converter, at 115200 bps).
|
||||||
|
|
||||||
|
timer
|
||||||
|
-----
|
||||||
|
|
||||||
|
This config tests the general-use purpose timers. It includes the 4 timers,
|
||||||
|
adds driver support, registers the timers as devices and includes the timer
|
||||||
|
example.
|
||||||
|
|
||||||
|
To test it, just run the following::
|
||||||
|
|
||||||
|
nsh> timer -d /dev/timerx
|
||||||
|
|
||||||
|
Where x in the timer instance.
|
||||||
|
|
||||||
|
watchdog
|
||||||
|
--------
|
||||||
|
|
||||||
|
This config test the watchdog timers. It includes the 2 MWDTs,
|
||||||
|
adds driver support, registers the WDTs as devices and includes the watchdog
|
||||||
|
example.
|
||||||
|
|
||||||
|
To test it, just run the following::
|
||||||
|
|
||||||
|
nsh> wdog -d /dev/watchdogx
|
||||||
|
|
||||||
|
Where x in the watchdog instance.
|
Binary file not shown.
378
Documentation/platforms/xtensa/esp32s2/index.rst
Normal file
378
Documentation/platforms/xtensa/esp32s2/index.rst
Normal file
@ -0,0 +1,378 @@
|
|||||||
|
==================
|
||||||
|
Espressif ESP32-S2
|
||||||
|
==================
|
||||||
|
|
||||||
|
The ESP32-S2 is a series of single-core SoCs from Espressif based on Harvard
|
||||||
|
architecture Xtensa LX7 CPU and with on-chip support for Wi-Fi.
|
||||||
|
|
||||||
|
All embedded memory, external memory and peripherals are located on the
|
||||||
|
data bus and/or the instruction bus of the CPU. Multiple peripherals in
|
||||||
|
the system can access embedded memory via DMA.
|
||||||
|
|
||||||
|
Toolchain
|
||||||
|
=========
|
||||||
|
|
||||||
|
You can use the prebuilt `toolchain <https://docs.espressif.com/projects/esp-idf/en/latest/esp32s2/api-guides/tools/idf-tools.html#xtensa-esp32-elf>`__
|
||||||
|
for Xtensa architecture and `OpenOCD <https://docs.espressif.com/projects/esp-idf/en/latest/esp32s2/api-guides/tools/idf-tools.html#openocd-esp32>`__
|
||||||
|
for ESP32-S2 by Espressif.
|
||||||
|
|
||||||
|
For flashing firmware, you will need to install ``esptool.py`` by running::
|
||||||
|
|
||||||
|
$ pip install esptool
|
||||||
|
|
||||||
|
Building from source
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
You can also build the toolchain yourself. The steps to
|
||||||
|
build the toolchain with crosstool-NG on Linux are as follows
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ git clone https://github.com/espressif/crosstool-NG.git
|
||||||
|
$ cd crosstool-NG
|
||||||
|
$ git checkout esp-2021r1
|
||||||
|
$ git submodule update --init
|
||||||
|
|
||||||
|
$ ./bootstrap && ./configure --enable-local && make
|
||||||
|
|
||||||
|
$ ./ct-ng xtensa-esp32-elf
|
||||||
|
$ ./ct-ng build
|
||||||
|
|
||||||
|
$ chmod -R u+w builds/xtensa-esp32-elf
|
||||||
|
|
||||||
|
$ export PATH="crosstool-NG/builds/xtensa-esp32-elf/bin:$PATH"
|
||||||
|
|
||||||
|
Alternatively, you may follow the steps in
|
||||||
|
`ESP-IDF documentation <https://docs.espressif.com/projects/esp-idf/en/latest/esp32s2/get-started/linux-macos-setup.html>`_.
|
||||||
|
|
||||||
|
Flashing
|
||||||
|
========
|
||||||
|
|
||||||
|
|
||||||
|
Firmware for ESP32-S2 is flashed via the USB/UART or internal USB DEVICE JTAG interface using the
|
||||||
|
``esptool.py`` tool.
|
||||||
|
It's a two-step process where the first converts the ELF file into a ESP32-S2 compatible binary
|
||||||
|
and the second flashes it to the board. These steps are included in the build system and you can
|
||||||
|
flash your NuttX firmware simply by running::
|
||||||
|
|
||||||
|
$ make flash ESPTOOL_PORT=<port>
|
||||||
|
|
||||||
|
where ``<port>`` is typically ``/dev/ttyUSB0`` or similar. You can change the baudrate by passing ``ESPTOOL_BAUD``.
|
||||||
|
|
||||||
|
Bootloader and partitions
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
ESP32-S2 requires a bootloader to be flashed as well as a set of FLASH partitions. This is only needed the first time
|
||||||
|
(or any time you which to modify either of these).
|
||||||
|
An easy way is to use prebuilt binaries for NuttX `from here <https://github.com/espressif/esp-nuttx-bootloader>`_.
|
||||||
|
In there you will find instructions to rebuild these if necessary.
|
||||||
|
Once you downloaded both binaries, you can flash them by adding an ``ESPTOOL_BINDIR`` parameter, pointing to the directory where these binaries were downloaded:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ make flash ESPTOOL_PORT=<port> ESPTOOL_BINDIR=<dir>
|
||||||
|
|
||||||
|
.. note:: It is recommended that if this is the first time you are using the board with NuttX that you perform a complete
|
||||||
|
SPI FLASH erase.
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ esptool.py erase_flash
|
||||||
|
|
||||||
|
.. note:: Alternatively, you can automatically download the bootloader/partitions from the NuttX build system
|
||||||
|
by using the following command:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ make bootloader
|
||||||
|
|
||||||
|
The binaries will be downloaded to the project's main folder and ``ESPTOOL_BINDIR`` may be set as ``.``
|
||||||
|
|
||||||
|
|
||||||
|
Peripheral Support
|
||||||
|
==================
|
||||||
|
|
||||||
|
The following list indicates the state of peripherals' support in NuttX:
|
||||||
|
|
||||||
|
========== ======= =====
|
||||||
|
Peripheral Support NOTES
|
||||||
|
========== ======= =====
|
||||||
|
GPIO Yes
|
||||||
|
UART Yes
|
||||||
|
SPI Yes
|
||||||
|
I2C Yes
|
||||||
|
DMA Yes
|
||||||
|
Wifi No
|
||||||
|
Ethernet No
|
||||||
|
SPIFLASH Yes
|
||||||
|
SPIRAM Yes
|
||||||
|
Timers Yes
|
||||||
|
Watchdog Yes
|
||||||
|
RTC Yes
|
||||||
|
RNG Yes
|
||||||
|
AES No
|
||||||
|
eFuse No
|
||||||
|
ADC No
|
||||||
|
I2S Yes
|
||||||
|
LED_PWM No
|
||||||
|
RMT No
|
||||||
|
Pulse_CNT No
|
||||||
|
SHA No
|
||||||
|
RSA No
|
||||||
|
CAN/TWAI No
|
||||||
|
========== ======= =====
|
||||||
|
|
||||||
|
Memory Map
|
||||||
|
==========
|
||||||
|
|
||||||
|
Address Mapping
|
||||||
|
---------------
|
||||||
|
|
||||||
|
================== ========== ========== =============== ===============
|
||||||
|
BUS TYPE START LAST DESCRIPTION NOTES
|
||||||
|
================== ========== ========== =============== ===============
|
||||||
|
. 0x00000000 0x3EFFFFFF Reserved
|
||||||
|
Data 0x3F000000 0x3F3FFFFF External Memory
|
||||||
|
Data 0x3F400000 0x3F4FFFFF Peripheral
|
||||||
|
Data 0x3F500000 0x3FF7FFFF External Memory
|
||||||
|
. 0x3FF80000 0x3FF9DFFF Reserved
|
||||||
|
Data 0x3FF9E000 0x3FFFFFFF Embedded Memory
|
||||||
|
Instruction 0x40000000 0x40071FFF Embedded Memory
|
||||||
|
. 0x40072000 0x4007FFFF Reserved
|
||||||
|
Instruction 0x40080000 0x407FFFFF External Memory
|
||||||
|
. 0x40800000 0x4FFFFFFF Reserved
|
||||||
|
Data / Instruction 0x50000000 0x50001FFF Embedded Memory
|
||||||
|
. 0x50002000 0x5FFFFFFF Reserved
|
||||||
|
Data / Instruction 0x60000000 0x600BFFFF Peripheral
|
||||||
|
. 0x600C0000 0x617FFFFF Reserved
|
||||||
|
Data / Instruction 0x61800000 0x61803FFF Peripheral
|
||||||
|
. 0x61804000 0xFFFFFFFF Reserved
|
||||||
|
================== ========== ========== =============== ===============
|
||||||
|
|
||||||
|
Embedded Memory
|
||||||
|
---------------
|
||||||
|
|
||||||
|
=========== ========== ========== =============== ================== =====
|
||||||
|
BUS TYPE START LAST DESCRIPTION PERMISSION CONTROL NOTES
|
||||||
|
=========== ========== ========== =============== ================== =====
|
||||||
|
Data 0x3FF9E000 0x3FF9FFFF RTC FAST Memory YES
|
||||||
|
Data 0x3FFA0000 0x3FFAFFFF Internal ROM 1 NO
|
||||||
|
Data 0x3FFB0000 0x3FFB7FFF Internal SRAM 0 YES DMA
|
||||||
|
Data 0x3FFB8000 0x3FFFFFFF Internal SRAM 1 YES DMA
|
||||||
|
=========== ========== ========== =============== ================== =====
|
||||||
|
|
||||||
|
Boundary Address (Embedded)
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
====================== ========== ========== =============== ================== ===============
|
||||||
|
BUS TYPE START LAST DESCRIPTION PERMISSION CONTROL NOTES
|
||||||
|
====================== ========== ========== =============== ================== ===============
|
||||||
|
Instruction 0x40000000 0x4000FFFF Internal ROM 0 NO
|
||||||
|
Instruction 0x40010000 0x4001FFFF Internal ROM 1 NO
|
||||||
|
Instruction 0x40020000 0x40027FFF Internal SRAM 0 YES
|
||||||
|
Instruction 0x40028000 0x4006FFFF Internal SRAM 1 YES
|
||||||
|
Instruction 0x40070000 0x40071FFF RTC FAST Memory YES
|
||||||
|
Data / Instruction 0x50000000 0x50001FFF RTC SLOW Memory YES
|
||||||
|
====================== ========== ========== =============== ================== ===============
|
||||||
|
|
||||||
|
External Memory
|
||||||
|
---------------
|
||||||
|
|
||||||
|
=========== ========== ========== =============== ================== ===============
|
||||||
|
BUS TYPE START LAST DESCRIPTION PERMISSION CONTROL NOTES
|
||||||
|
=========== ========== ========== =============== ================== ===============
|
||||||
|
Data 0x3F000000 0x3F3FFFFF ICache YES Read
|
||||||
|
Data 0x3F500000 0x3FF7FFFF DCache YES Read and Write
|
||||||
|
=========== ========== ========== =============== ================== ===============
|
||||||
|
|
||||||
|
Boundary Address (External)
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
=========== ========== ========== =============== ================== ===============
|
||||||
|
BUS TYPE START LAST DESCRIPTION PERMISSION CONTROL NOTES
|
||||||
|
=========== ========== ========== =============== ================== ===============
|
||||||
|
Instruction 0x40080000 0x407FFFFF ICache YES Read
|
||||||
|
=========== ========== ========== =============== ================== ===============
|
||||||
|
|
||||||
|
Linker Segments
|
||||||
|
---------------
|
||||||
|
|
||||||
|
+---------------------+------------+-------------------+------+------------------------------+
|
||||||
|
| DESCRIPTION | START | END | ATTR | LINKER SEGMENT NAME |
|
||||||
|
+=====================+============+===================+======+==============================+
|
||||||
|
| FLASH mapped data: | 0X3F000020 | 0X3F000020 + | R | drom0_0_seg (NOTE 1) |
|
||||||
|
| - .rodata | | FLASH_SIZE - 0x20 | | |
|
||||||
|
| - Constructors | | | | |
|
||||||
|
| /destructors | | | | |
|
||||||
|
+---------------------+------------+-------------------+------+------------------------------+
|
||||||
|
| COMMON data RAM: | 0X3FFB0000 | 0x3FFDE000 | RW | dram0_0_seg (NOTE 2) |
|
||||||
|
| - .bss/.data | | | | |
|
||||||
|
+---------------------+------------+-------------------+------+------------------------------+
|
||||||
|
| IRAM for PRO cpu: | 0x40022000 | 0x40050000 | RX | iram0_0_seg |
|
||||||
|
| - Interrupt Vectors| | | | |
|
||||||
|
| - Low level | | | | |
|
||||||
|
| handlers | | | | |
|
||||||
|
| - Xtensa/Espressif | | | | |
|
||||||
|
| libraries | | | | |
|
||||||
|
+---------------------+------------+-------------------+------+------------------------------+
|
||||||
|
| RTC fast memory: | 0x40070000 | 0x40072000 | RWX | rtc_iram_seg |
|
||||||
|
| - .rtc.text | | | | |
|
||||||
|
| (unused?) | | | | |
|
||||||
|
+---------------------+------------+-------------------+------+------------------------------+
|
||||||
|
| FLASH: | 0x40080020 | 0x40080020 + | RX | irom0_0_seg (actually FLASH) |
|
||||||
|
| - .text | | FLASH_SIZE | | |
|
||||||
|
| | | (NOTE 3) | | |
|
||||||
|
+---------------------+------------+-------------------+------+------------------------------+
|
||||||
|
| RTC slow memory: | 0x50000000 | 0x50002000 | RW | rtc_slow_seg (NOTE 4) |
|
||||||
|
| - .rtc.data/rodata | | | | |
|
||||||
|
| (unused?) | | | | |
|
||||||
|
+---------------------+------------+-------------------+------+------------------------------+
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
(1) The linker script will reserve space at the beginning of the segment
|
||||||
|
for MCUboot header if ESP32S2_APP_FORMAT_MCUBOOT flag is active.
|
||||||
|
(2) Heap starts at the end of dram_0_seg.
|
||||||
|
(3) Subtract 0x20 if ESP32S2_APP_FORMAT_MCUBOOT is not active.
|
||||||
|
(4) Linker script will reserve space at the beginning and at the end
|
||||||
|
of the segment for ULP coprocessor reserve memory.
|
||||||
|
|
||||||
|
64-bit Timers
|
||||||
|
=============
|
||||||
|
|
||||||
|
ESP32-S2 has 4 generic timers of 64 bits (2 from Group 0 and 2 from Group 1).
|
||||||
|
They're accessible as character drivers, the configuration along with a
|
||||||
|
guidance on how to run the example and the description of the application level
|
||||||
|
interface can be found :doc:`here </components/drivers/character/timer>`.
|
||||||
|
|
||||||
|
Watchdog Timers
|
||||||
|
===============
|
||||||
|
|
||||||
|
ESP32-S2 has 3 WDTs. 2 MWDTs from the Timers Module and 1 RWDT from the RTC Module
|
||||||
|
(Currently not supported yet). They're accessible as character drivers,
|
||||||
|
The configuration along with a guidance on how to run the example and the description
|
||||||
|
of the application level interface can be found
|
||||||
|
:doc:`here </components/drivers/character/watchdog>`.
|
||||||
|
|
||||||
|
I2S
|
||||||
|
===
|
||||||
|
|
||||||
|
The I2S peripheral is accessible using either the generic I2S audio driver or a specific
|
||||||
|
audio codec driver. Also, it's possible to use the I2S character driver to bypass the
|
||||||
|
audio subsystem and develop specific usages of the I2S peripheral.
|
||||||
|
|
||||||
|
.. note:: Note that the bit-width and sample rate can be modified "on-the-go" when using
|
||||||
|
audio-related drivers. That is not the case for the I2S character device driver and
|
||||||
|
such parameters are set on compile time through `make menuconfig`.
|
||||||
|
|
||||||
|
Please check for usage examples using the :doc:`ESP32-S2-Saola-1 </platforms/xtensa/esp32s2/boards/esp32s2-saola-1/index>`.
|
||||||
|
|
||||||
|
Secure Boot and Flash Encryption
|
||||||
|
================================
|
||||||
|
|
||||||
|
Secure Boot
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Secure Boot protects a device from running any unauthorized (i.e., unsigned) code by checking that
|
||||||
|
each piece of software that is being booted is signed. On an ESP32-S2, these pieces of software include
|
||||||
|
the second stage bootloader and each application binary. Note that the first stage bootloader does not
|
||||||
|
require signing as it is ROM code thus cannot be changed. This is achieved using specific hardware in
|
||||||
|
conjunction with MCUboot (read more about MCUboot `here <https://docs.mcuboot.com/>`_).
|
||||||
|
|
||||||
|
The Secure Boot process on the ESP32-S2 involves the following steps performed:
|
||||||
|
|
||||||
|
1. The first stage bootloader verifies the second stage bootloader's RSA-PSS signature. If the verification is successful,
|
||||||
|
the first stage bootloader loads and executes the second stage bootloader.
|
||||||
|
|
||||||
|
2. When the second stage bootloader loads a particular application image, the application's signature (RSA, ECDSA or ED25519) is verified
|
||||||
|
by MCUboot.
|
||||||
|
If the verification is successful, the application image is executed.
|
||||||
|
|
||||||
|
.. warning:: Once enabled, Secure Boot will not boot a modified bootloader. The bootloader will only boot an
|
||||||
|
application firmware image if it has a verified digital signature. There are implications for reflashing
|
||||||
|
updated images once Secure Boot is enabled. You can find more information about the ESP32-S2's Secure boot
|
||||||
|
`here <https://docs.espressif.com/projects/esp-idf/en/latest/esp32s2/security/secure-boot-v2.html>`_.
|
||||||
|
|
||||||
|
.. note:: As the bootloader image is built on top of the Hardware Abstraction Layer component
|
||||||
|
of `ESP-IDF <https://github.com/espressif/esp-idf>`_, the
|
||||||
|
`API port by Espressif <https://docs.mcuboot.com/readme-espressif.html>`_ will be used
|
||||||
|
by MCUboot rather than the original NuttX port.
|
||||||
|
|
||||||
|
Flash Encryption
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Flash encryption is intended for encrypting the contents of the ESP32-S2'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.
|
||||||
|
|
||||||
|
.. warning:: After enabling Flash Encryption, an encryption key is generated internally by the device and
|
||||||
|
cannot be accessed by the user for re-encrypting data and re-flashing the system, hence it will be permanently encrypted.
|
||||||
|
Re-flashing an encrypted system is complicated and not always possible. You can find more information about the ESP32-S2's Flash Encryption
|
||||||
|
`here <https://docs.espressif.com/projects/esp-idf/en/latest/esp32s2/security/flash-encryption.html>`_.
|
||||||
|
|
||||||
|
Prerequisites
|
||||||
|
-------------
|
||||||
|
|
||||||
|
First of all, we need to install ``imgtool`` (a MCUboot utiliy application to manipulate binary images) and
|
||||||
|
``esptool`` (the ESP32-S2 toolkit)::
|
||||||
|
|
||||||
|
$ pip install imgtool esptool
|
||||||
|
|
||||||
|
We also need to make sure that the python modules are added to ``PATH``::
|
||||||
|
|
||||||
|
$ echo "PATH=$PATH:/home/$USER/.local/bin" >> ~/.bashrc
|
||||||
|
|
||||||
|
Now, we will create a folder to store the generated keys (such as ``~/signing_keys``)::
|
||||||
|
|
||||||
|
$ mkdir ~/signing_keys && cd ~/signing_keys
|
||||||
|
|
||||||
|
With all set up, we can now generate keys to sign the bootloader and application binary images,
|
||||||
|
respectively, of the compiled project::
|
||||||
|
|
||||||
|
$ espsecure.py generate_signing_key --version 2 bootloader_signing_key.pem
|
||||||
|
$ imgtool keygen --key app_signing_key.pem --type rsa-3072
|
||||||
|
|
||||||
|
.. important:: The contents of the key files must be stored securely and kept secret.
|
||||||
|
|
||||||
|
Enabling Secure Boot and Flash Encryption
|
||||||
|
-----------------------------------------
|
||||||
|
|
||||||
|
To enable Secure Boot for the current project, go to the project's NuttX directory, execute ``make menuconfig`` and the following steps::
|
||||||
|
|
||||||
|
1. Enable experimental features in :menuselection:`Build Setup --> Show experimental options`;
|
||||||
|
2. Enable MCUboot in :menuselection:`Application Configuration --> Bootloader Utilities --> MCUboot`;
|
||||||
|
3. Change image type to ``MCUboot-bootable format`` in :menuselection:`System Type --> Application Image Configuration --> Application Image Format`;
|
||||||
|
4. Enable building MCUboot from the source code by selecting ``Build binaries from source``;
|
||||||
|
in :menuselection:`System Type --> Application Image Configuration --> Source for bootloader binaries`;
|
||||||
|
5. Enable Secure Boot in :menuselection:`System Type --> Application Image Configuration --> Enable hardware Secure Boot in bootloader`;
|
||||||
|
6. If you want to protect the SPI Bus against data sniffing, you can enable Flash Encryption in
|
||||||
|
:menuselection:`System Type --> Application Image Configuration --> Enable Flash Encryption on boot`.
|
||||||
|
|
||||||
|
Now you can design an update and confirm agent to your application. Check the `MCUboot design guide <https://docs.mcuboot.com/design.html>`_ and the
|
||||||
|
`MCUboot Espressif port documentation <https://docs.mcuboot.com/readme-espressif.html>`_ for
|
||||||
|
more information on how to apply MCUboot. Also check some `notes about the NuttX MCUboot port <https://github.com/mcu-tools/mcuboot/blob/main/docs/readme-nuttx.md>`_,
|
||||||
|
the `MCUboot porting guide <https://github.com/mcu-tools/mcuboot/blob/main/docs/PORTING.md>`_ and some
|
||||||
|
`examples of MCUboot applied in Nuttx applications <https://github.com/apache/incubator-nuttx-apps/tree/master/examples/mcuboot>`_.
|
||||||
|
|
||||||
|
After you developed an application which implements all desired functions, you need to flash it into the primary image slot
|
||||||
|
of the device (it will automatically be in the confirmed state, you can learn more about image
|
||||||
|
confirmation `here <https://docs.mcuboot.com/design.html#image-swapping>`_).
|
||||||
|
To flash to the primary image slot, select ``Application image primary slot`` in
|
||||||
|
:menuselection:`System Type --> Application Image Configuration --> Target slot for image flashing`
|
||||||
|
and compile it using ``make -j ESPSEC_KEYDIR=~/signing_keys``.
|
||||||
|
|
||||||
|
When creating update images, make sure to change :menuselection:`System Type --> Application Image Configuration --> Target slot for image flashing`
|
||||||
|
to ``Application image secondary slot``.
|
||||||
|
|
||||||
|
.. important:: When deploying your application, make sure to disable UART Download Mode by selecting ``Permanently disabled`` in
|
||||||
|
:menuselection:`System Type --> Application Image Configuration --> UART ROM download mode`
|
||||||
|
and change usage mode to ``Release`` in `System Type --> Application Image Configuration --> Enable usage mode`.
|
||||||
|
**After disabling UART Download Mode you will not be able to flash other images through UART.**
|
||||||
|
|
||||||
|
Supported Boards
|
||||||
|
================
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:glob:
|
||||||
|
:maxdepth: 1
|
||||||
|
|
||||||
|
boards/*/*
|
Loading…
Reference in New Issue
Block a user