summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--ports/esp32/.gitignore2
-rw-r--r--ports/esp32/CMakeLists.txt20
-rw-r--r--ports/esp32/README.md15
-rw-r--r--ports/esp32/boards/ESP32_S2_WROVER/sdkconfig.board1
-rw-r--r--ports/esp32/boards/GENERIC_C3_USB/sdkconfig.board2
-rw-r--r--ports/esp32/boards/GENERIC_D2WD/sdkconfig.board1
-rw-r--r--ports/esp32/boards/GENERIC_S3/sdkconfig.board3
-rw-r--r--ports/esp32/boards/GENERIC_S3_SPIRAM/sdkconfig.board3
-rw-r--r--ports/esp32/boards/GENERIC_S3_SPIRAM_OCT/sdkconfig.board3
-rw-r--r--ports/esp32/boards/GENERIC_SPIRAM/mpconfigboard.cmake1
-rw-r--r--ports/esp32/boards/GENERIC_SPIRAM/sdkconfig.board2
-rw-r--r--ports/esp32/boards/LOLIN_C3_MINI/sdkconfig.board2
-rw-r--r--ports/esp32/boards/UM_FEATHERS2/sdkconfig.board4
-rw-r--r--ports/esp32/boards/UM_FEATHERS2NEO/sdkconfig.board2
-rw-r--r--ports/esp32/boards/UM_FEATHERS3/sdkconfig.board7
-rw-r--r--ports/esp32/boards/UM_PROS3/sdkconfig.board5
-rw-r--r--ports/esp32/boards/UM_TINYPICO/sdkconfig.board3
-rw-r--r--ports/esp32/boards/UM_TINYS2/sdkconfig.board2
-rw-r--r--ports/esp32/boards/UM_TINYS3/sdkconfig.board5
-rw-r--r--ports/esp32/boards/sdkconfig.240mhz9
-rw-r--r--ports/esp32/boards/sdkconfig.base34
-rw-r--r--ports/esp32/boards/sdkconfig.ble15
-rw-r--r--ports/esp32/boards/sdkconfig.nimble_core06
-rw-r--r--ports/esp32/boards/sdkconfig.nimble_core16
-rw-r--r--ports/esp32/boards/sdkconfig.spiram9
-rw-r--r--ports/esp32/boards/sdkconfig.spiram_sx7
-rw-r--r--ports/esp32/boards/sdkconfig.usb8
-rw-r--r--ports/esp32/esp32_common.cmake (renamed from ports/esp32/main/CMakeLists.txt)75
-rw-r--r--ports/esp32/esp32_rmt.c4
-rw-r--r--ports/esp32/esp32_ulp.c9
-rw-r--r--ports/esp32/gccollect.c3
-rw-r--r--ports/esp32/machine_adcblock.h2
-rw-r--r--ports/esp32/machine_bitstream.c35
-rw-r--r--ports/esp32/machine_hw_spi.c34
-rw-r--r--ports/esp32/machine_i2c.c8
-rw-r--r--ports/esp32/machine_i2s.c30
-rw-r--r--ports/esp32/machine_pin.c25
-rw-r--r--ports/esp32/machine_pwm.c19
-rw-r--r--ports/esp32/machine_sdcard.c137
-rw-r--r--ports/esp32/machine_timer.c32
-rw-r--r--ports/esp32/machine_uart.c9
-rw-r--r--ports/esp32/machine_wdt.c10
-rw-r--r--ports/esp32/main.c67
-rw-r--r--ports/esp32/main_esp32/CMakeLists.txt11
-rw-r--r--ports/esp32/main_esp32c3/CMakeLists.txt14
-rw-r--r--ports/esp32/main_esp32s2/CMakeLists.txt11
-rw-r--r--ports/esp32/main_esp32s2/idf_component.yml5
-rw-r--r--ports/esp32/main_esp32s3/CMakeLists.txt11
-rw-r--r--ports/esp32/main_esp32s3/idf_component.yml5
-rw-r--r--ports/esp32/modesp.c24
-rw-r--r--ports/esp32/modesp32.c6
-rw-r--r--ports/esp32/modespnow.c14
-rw-r--r--ports/esp32/modmachine.c16
-rw-r--r--ports/esp32/modnetwork.h10
-rw-r--r--ports/esp32/modnetwork_globals.h9
-rw-r--r--ports/esp32/modsocket.c7
-rw-r--r--ports/esp32/mpconfigport.h14
-rw-r--r--ports/esp32/mphalport.c3
-rw-r--r--ports/esp32/mphalport.h12
-rw-r--r--ports/esp32/mpnimbleport.c4
-rw-r--r--ports/esp32/network_common.c107
-rw-r--r--ports/esp32/network_lan.c52
-rw-r--r--ports/esp32/network_ppp.c1
-rw-r--r--ports/esp32/network_wlan.c129
-rw-r--r--ports/esp32/uart.h2
-rw-r--r--ports/esp32/usb.c11
-rw-r--r--ports/esp32/usb.h2
-rw-r--r--ports/esp32/usb_serial_jtag.c4
68 files changed, 485 insertions, 675 deletions
diff --git a/ports/esp32/.gitignore b/ports/esp32/.gitignore
new file mode 100644
index 0000000000..a78ecd0191
--- /dev/null
+++ b/ports/esp32/.gitignore
@@ -0,0 +1,2 @@
+dependencies.lock
+managed_components/
diff --git a/ports/esp32/CMakeLists.txt b/ports/esp32/CMakeLists.txt
index 6992737c9b..a4970c1a1b 100644
--- a/ports/esp32/CMakeLists.txt
+++ b/ports/esp32/CMakeLists.txt
@@ -15,16 +15,15 @@ if(NOT EXISTS ${MICROPY_BOARD_DIR}/mpconfigboard.cmake)
message(FATAL_ERROR "Invalid MICROPY_BOARD specified: ${MICROPY_BOARD}")
endif()
-# Include main IDF cmake file.
-include($ENV{IDF_PATH}/tools/cmake/project.cmake)
-
# Define the output sdkconfig so it goes in the build directory.
set(SDKCONFIG ${CMAKE_BINARY_DIR}/sdkconfig)
# Save the manifest file set from the cmake command line.
set(MICROPY_USER_FROZEN_MANIFEST ${MICROPY_FROZEN_MANIFEST})
-# Include board config; this is expected to set SDKCONFIG_DEFAULTS (among other options).
+# Include board config; this is expected to set (among other options):
+# - SDKCONFIG_DEFAULTS
+# - IDF_TARGET
include(${MICROPY_BOARD_DIR}/mpconfigboard.cmake)
# Set the frozen manifest file. Note if MICROPY_FROZEN_MANIFEST is set from the cmake
@@ -35,13 +34,6 @@ elseif (NOT MICROPY_FROZEN_MANIFEST)
set(MICROPY_FROZEN_MANIFEST ${CMAKE_CURRENT_LIST_DIR}/boards/manifest.py)
endif()
-# Add sdkconfig fragments that depend on the IDF version.
-if(IDF_VERSION_MAJOR EQUAL 4 AND IDF_VERSION_MINOR LESS 2)
- set(SDKCONFIG_DEFAULTS ${SDKCONFIG_DEFAULTS} boards/sdkconfig.nimble_core0)
-else()
- set(SDKCONFIG_DEFAULTS ${SDKCONFIG_DEFAULTS} boards/sdkconfig.nimble_core1)
-endif()
-
# Concatenate all sdkconfig files into a combined one for the IDF to use.
file(WRITE ${CMAKE_BINARY_DIR}/sdkconfig.combined.in "")
foreach(SDKCONFIG_DEFAULT ${SDKCONFIG_DEFAULTS})
@@ -51,5 +43,11 @@ endforeach()
configure_file(${CMAKE_BINARY_DIR}/sdkconfig.combined.in ${CMAKE_BINARY_DIR}/sdkconfig.combined COPYONLY)
set(SDKCONFIG_DEFAULTS ${CMAKE_BINARY_DIR}/sdkconfig.combined)
+# Include main IDF cmake file.
+include($ENV{IDF_PATH}/tools/cmake/project.cmake)
+
+# Set the location of the main component for the project (one per target).
+set(EXTRA_COMPONENT_DIRS main_${IDF_TARGET})
+
# Define the project.
project(micropython)
diff --git a/ports/esp32/README.md b/ports/esp32/README.md
index c37213b303..dc9e9f8b72 100644
--- a/ports/esp32/README.md
+++ b/ports/esp32/README.md
@@ -22,13 +22,13 @@ Initial development of this ESP32 port was sponsored in part by Microbric Pty Lt
Setting up ESP-IDF and the build environment
--------------------------------------------
-MicroPython on ESP32 requires the Espressif IDF version 4 (IoT development
+MicroPython on ESP32 requires the Espressif IDF version 5 (IoT development
framework, aka SDK). The ESP-IDF includes the libraries and RTOS needed to
manage the ESP32 microcontroller, as well as a way to manage the required
build environment and toolchains needed to build the firmware.
The ESP-IDF changes quickly and MicroPython only supports certain versions.
-Currently MicroPython supports v4.0.2, v4.1.1, v4.2.2, v4.3.2 and v4.4,
+Currently MicroPython supports v5.0.2,
although other IDF v4 versions may also work.
To install the ESP-IDF the full instructions can be found at the
@@ -47,10 +47,10 @@ The steps to take are summarised below.
To check out a copy of the IDF use git clone:
```bash
-$ git clone -b v4.0.2 --recursive https://github.com/espressif/esp-idf.git
+$ git clone -b v5.0.2 --recursive https://github.com/espressif/esp-idf.git
```
-You can replace `v4.0.2` with `v4.2.2` or `v4.4` or any other supported version.
+You can replace `v5.0.2` with any other supported version.
(You don't need a full recursive clone; see the `ci_esp32_setup` function in
`tools/ci.sh` in this repository for more detailed set-up commands.)
@@ -59,7 +59,7 @@ MicroPython and update the submodules using:
```bash
$ cd esp-idf
-$ git checkout v4.2
+$ git checkout v5.0.2
$ git submodule update --init --recursive
```
@@ -75,11 +75,6 @@ $ source export.sh # (or export.bat on Windows)
The `install.sh` step only needs to be done once. You will need to source
`export.sh` for every new session.
-**Note:** If you are building MicroPython for the ESP32-S2, ESP32-C3 or ESP32-S3,
-please ensure you are using the following required IDF versions:
-- ESP32-S3 currently requires `v4.4` or later.
-- ESP32-S2 and ESP32-C3 require `v4.3.1` or later.
-
Building the firmware
---------------------
diff --git a/ports/esp32/boards/ESP32_S2_WROVER/sdkconfig.board b/ports/esp32/boards/ESP32_S2_WROVER/sdkconfig.board
index 9373a52232..ea263cad9f 100644
--- a/ports/esp32/boards/ESP32_S2_WROVER/sdkconfig.board
+++ b/ports/esp32/boards/ESP32_S2_WROVER/sdkconfig.board
@@ -1,6 +1,5 @@
CONFIG_FLASHMODE_QIO=y
CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
-CONFIG_ESPTOOLPY_FLASHSIZE_DETECT=y
CONFIG_ESPTOOLPY_AFTER_NORESET=y
CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y
diff --git a/ports/esp32/boards/GENERIC_C3_USB/sdkconfig.board b/ports/esp32/boards/GENERIC_C3_USB/sdkconfig.board
index f0cbad00e4..d9e7c7f61f 100644
--- a/ports/esp32/boards/GENERIC_C3_USB/sdkconfig.board
+++ b/ports/esp32/boards/GENERIC_C3_USB/sdkconfig.board
@@ -1,9 +1,7 @@
CONFIG_ESP32C3_REV_MIN_3=y
-CONFIG_ESP32C3_REV_MIN=3
CONFIG_ESP32C3_BROWNOUT_DET=y
CONFIG_ESP32C3_BROWNOUT_DET_LVL_SEL_7=
CONFIG_ESP32C3_BROWNOUT_DET_LVL_SEL_4=y
CONFIG_ESP32C3_BROWNOUT_DET_LVL=4
CONFIG_ESP_CONSOLE_UART_DEFAULT=
-CONFIG_ESP_CONSOLE_USB_CDC=
CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG=y
diff --git a/ports/esp32/boards/GENERIC_D2WD/sdkconfig.board b/ports/esp32/boards/GENERIC_D2WD/sdkconfig.board
index 07e208a09a..7b4313b7de 100644
--- a/ports/esp32/boards/GENERIC_D2WD/sdkconfig.board
+++ b/ports/esp32/boards/GENERIC_D2WD/sdkconfig.board
@@ -1,6 +1,7 @@
# Optimise using -Os to reduce size
CONFIG_COMPILER_OPTIMIZATION_SIZE=y
CONFIG_COMPILER_OPTIMIZATION_PERF=n
+CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT=y
CONFIG_ESPTOOLPY_FLASHMODE_DIO=y
CONFIG_ESPTOOLPY_FLASHFREQ_40M=y
diff --git a/ports/esp32/boards/GENERIC_S3/sdkconfig.board b/ports/esp32/boards/GENERIC_S3/sdkconfig.board
index c9726d4232..7b9d932503 100644
--- a/ports/esp32/boards/GENERIC_S3/sdkconfig.board
+++ b/ports/esp32/boards/GENERIC_S3/sdkconfig.board
@@ -1,10 +1,7 @@
CONFIG_FLASHMODE_QIO=y
CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
-CONFIG_ESPTOOLPY_FLASHSIZE_DETECT=y
CONFIG_ESPTOOLPY_AFTER_NORESET=y
-CONFIG_SPIRAM_MEMTEST=
-
CONFIG_ESPTOOLPY_FLASHSIZE_4MB=
CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y
CONFIG_ESPTOOLPY_FLASHSIZE_16MB=
diff --git a/ports/esp32/boards/GENERIC_S3_SPIRAM/sdkconfig.board b/ports/esp32/boards/GENERIC_S3_SPIRAM/sdkconfig.board
index c9726d4232..7b9d932503 100644
--- a/ports/esp32/boards/GENERIC_S3_SPIRAM/sdkconfig.board
+++ b/ports/esp32/boards/GENERIC_S3_SPIRAM/sdkconfig.board
@@ -1,10 +1,7 @@
CONFIG_FLASHMODE_QIO=y
CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
-CONFIG_ESPTOOLPY_FLASHSIZE_DETECT=y
CONFIG_ESPTOOLPY_AFTER_NORESET=y
-CONFIG_SPIRAM_MEMTEST=
-
CONFIG_ESPTOOLPY_FLASHSIZE_4MB=
CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y
CONFIG_ESPTOOLPY_FLASHSIZE_16MB=
diff --git a/ports/esp32/boards/GENERIC_S3_SPIRAM_OCT/sdkconfig.board b/ports/esp32/boards/GENERIC_S3_SPIRAM_OCT/sdkconfig.board
index c9726d4232..7b9d932503 100644
--- a/ports/esp32/boards/GENERIC_S3_SPIRAM_OCT/sdkconfig.board
+++ b/ports/esp32/boards/GENERIC_S3_SPIRAM_OCT/sdkconfig.board
@@ -1,10 +1,7 @@
CONFIG_FLASHMODE_QIO=y
CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
-CONFIG_ESPTOOLPY_FLASHSIZE_DETECT=y
CONFIG_ESPTOOLPY_AFTER_NORESET=y
-CONFIG_SPIRAM_MEMTEST=
-
CONFIG_ESPTOOLPY_FLASHSIZE_4MB=
CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y
CONFIG_ESPTOOLPY_FLASHSIZE_16MB=
diff --git a/ports/esp32/boards/GENERIC_SPIRAM/mpconfigboard.cmake b/ports/esp32/boards/GENERIC_SPIRAM/mpconfigboard.cmake
index dcffe5f01e..2e1d799b93 100644
--- a/ports/esp32/boards/GENERIC_SPIRAM/mpconfigboard.cmake
+++ b/ports/esp32/boards/GENERIC_SPIRAM/mpconfigboard.cmake
@@ -2,5 +2,4 @@ set(SDKCONFIG_DEFAULTS
boards/sdkconfig.base
boards/sdkconfig.ble
boards/sdkconfig.spiram
- boards/GENERIC_SPIRAM/sdkconfig.board
)
diff --git a/ports/esp32/boards/GENERIC_SPIRAM/sdkconfig.board b/ports/esp32/boards/GENERIC_SPIRAM/sdkconfig.board
deleted file mode 100644
index a2859acb5f..0000000000
--- a/ports/esp32/boards/GENERIC_SPIRAM/sdkconfig.board
+++ /dev/null
@@ -1,2 +0,0 @@
-# SPIRAM increases the size of the firmware, use -Os to reduce it again to fit in iram
-CONFIG_COMPILER_OPTIMIZATION_SIZE=y
diff --git a/ports/esp32/boards/LOLIN_C3_MINI/sdkconfig.board b/ports/esp32/boards/LOLIN_C3_MINI/sdkconfig.board
index f0cbad00e4..d9e7c7f61f 100644
--- a/ports/esp32/boards/LOLIN_C3_MINI/sdkconfig.board
+++ b/ports/esp32/boards/LOLIN_C3_MINI/sdkconfig.board
@@ -1,9 +1,7 @@
CONFIG_ESP32C3_REV_MIN_3=y
-CONFIG_ESP32C3_REV_MIN=3
CONFIG_ESP32C3_BROWNOUT_DET=y
CONFIG_ESP32C3_BROWNOUT_DET_LVL_SEL_7=
CONFIG_ESP32C3_BROWNOUT_DET_LVL_SEL_4=y
CONFIG_ESP32C3_BROWNOUT_DET_LVL=4
CONFIG_ESP_CONSOLE_UART_DEFAULT=
-CONFIG_ESP_CONSOLE_USB_CDC=
CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG=y
diff --git a/ports/esp32/boards/UM_FEATHERS2/sdkconfig.board b/ports/esp32/boards/UM_FEATHERS2/sdkconfig.board
index ccda7bff68..88bc9e72ac 100644
--- a/ports/esp32/boards/UM_FEATHERS2/sdkconfig.board
+++ b/ports/esp32/boards/UM_FEATHERS2/sdkconfig.board
@@ -1,15 +1,11 @@
CONFIG_FLASHMODE_QIO=y
CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
-CONFIG_ESPTOOLPY_FLASHSIZE_DETECT=y
CONFIG_ESPTOOLPY_AFTER_NORESET=y
-CONFIG_SPIRAM_MEMTEST=
-
CONFIG_ESPTOOLPY_FLASHSIZE_4MB=
CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y
CONFIG_PARTITION_TABLE_CUSTOM=y
CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions-16MiB.csv"
-#CONFIG_USB_AND_UART=y
# LWIP
CONFIG_LWIP_LOCAL_HOSTNAME="UMFeatherS2"
diff --git a/ports/esp32/boards/UM_FEATHERS2NEO/sdkconfig.board b/ports/esp32/boards/UM_FEATHERS2NEO/sdkconfig.board
index 556de1f8b4..87a92892d0 100644
--- a/ports/esp32/boards/UM_FEATHERS2NEO/sdkconfig.board
+++ b/ports/esp32/boards/UM_FEATHERS2NEO/sdkconfig.board
@@ -3,8 +3,6 @@ CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
CONFIG_USB_AND_UART=y
CONFIG_ESPTOOLPY_AFTER_NORESET=y
-CONFIG_SPIRAM_MEMTEST=
-
# LWIP
CONFIG_LWIP_LOCAL_HOSTNAME="UMFeatherS2Neo"
# end of LWIP
diff --git a/ports/esp32/boards/UM_FEATHERS3/sdkconfig.board b/ports/esp32/boards/UM_FEATHERS3/sdkconfig.board
index 5e20045125..a4a167de8a 100644
--- a/ports/esp32/boards/UM_FEATHERS3/sdkconfig.board
+++ b/ports/esp32/boards/UM_FEATHERS3/sdkconfig.board
@@ -1,10 +1,7 @@
CONFIG_FLASHMODE_QIO=y
CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
-CONFIG_ESPTOOLPY_FLASHSIZE_DETECT=y
CONFIG_ESPTOOLPY_AFTER_NORESET=y
-CONFIG_SPIRAM_MEMTEST=
-
CONFIG_ESPTOOLPY_FLASHSIZE_4MB=
CONFIG_ESPTOOLPY_FLASHSIZE_8MB=
CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y
@@ -13,11 +10,9 @@ CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions-16MiB.csv"
CONFIG_LWIP_LOCAL_HOSTNAME="UMFeatherS3"
-# CONFIG_TINYUSB_DESC_USE_ESPRESSIF_VID is not set
CONFIG_TINYUSB_DESC_CUSTOM_VID=0x303A
-# CONFIG_TINYUSB_DESC_USE_DEFAULT_PID is not set
CONFIG_TINYUSB_DESC_CUSTOM_PID=0x80D7
CONFIG_TINYUSB_DESC_BCD_DEVICE=0x0100
CONFIG_TINYUSB_DESC_MANUFACTURER_STRING="Unexpected Maker"
CONFIG_TINYUSB_DESC_PRODUCT_STRING="FeatherS3"
-CONFIG_TINYUSB_DESC_SERIAL_STRING="_fs3_" \ No newline at end of file
+CONFIG_TINYUSB_DESC_SERIAL_STRING="_fs3_"
diff --git a/ports/esp32/boards/UM_PROS3/sdkconfig.board b/ports/esp32/boards/UM_PROS3/sdkconfig.board
index 06b3a00a1c..74ca6df8f6 100644
--- a/ports/esp32/boards/UM_PROS3/sdkconfig.board
+++ b/ports/esp32/boards/UM_PROS3/sdkconfig.board
@@ -1,10 +1,7 @@
CONFIG_FLASHMODE_QIO=y
CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
-CONFIG_ESPTOOLPY_FLASHSIZE_DETECT=y
CONFIG_ESPTOOLPY_AFTER_NORESET=y
-CONFIG_SPIRAM_MEMTEST=
-
CONFIG_ESPTOOLPY_FLASHSIZE_4MB=
CONFIG_ESPTOOLPY_FLASHSIZE_8MB=
CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y
@@ -13,9 +10,7 @@ CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions-16MiB.csv"
CONFIG_LWIP_LOCAL_HOSTNAME="UMProS3"
-# CONFIG_TINYUSB_DESC_USE_ESPRESSIF_VID is not set
CONFIG_TINYUSB_DESC_CUSTOM_VID=0x303A
-# CONFIG_TINYUSB_DESC_USE_DEFAULT_PID is not set
CONFIG_TINYUSB_DESC_CUSTOM_PID=0x80D4
CONFIG_TINYUSB_DESC_BCD_DEVICE=0x0100
CONFIG_TINYUSB_DESC_MANUFACTURER_STRING="Unexpected Maker"
diff --git a/ports/esp32/boards/UM_TINYPICO/sdkconfig.board b/ports/esp32/boards/UM_TINYPICO/sdkconfig.board
index 8ed083e62d..766419c7f8 100644
--- a/ports/esp32/boards/UM_TINYPICO/sdkconfig.board
+++ b/ports/esp32/boards/UM_TINYPICO/sdkconfig.board
@@ -3,6 +3,3 @@ CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
CONFIG_SPIRAM_SPEED_80M=y
CONFIG_ESP32_REV_MIN_1=y
CONFIG_LWIP_LOCAL_HOSTNAME="UMTinyPICO"
-
-# SPIRAM increases the size of the firmware, use -Os to reduce it again to fit in iram
-CONFIG_COMPILER_OPTIMIZATION_SIZE=y
diff --git a/ports/esp32/boards/UM_TINYS2/sdkconfig.board b/ports/esp32/boards/UM_TINYS2/sdkconfig.board
index 39a2a293ac..5e129e4d8e 100644
--- a/ports/esp32/boards/UM_TINYS2/sdkconfig.board
+++ b/ports/esp32/boards/UM_TINYS2/sdkconfig.board
@@ -3,8 +3,6 @@ CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
CONFIG_USB_AND_UART=y
CONFIG_ESPTOOLPY_AFTER_NORESET=y
-CONFIG_SPIRAM_MEMTEST=
-
# LWIP
CONFIG_LWIP_LOCAL_HOSTNAME="UMTinyS2"
# end of LWIP
diff --git a/ports/esp32/boards/UM_TINYS3/sdkconfig.board b/ports/esp32/boards/UM_TINYS3/sdkconfig.board
index 2b9ddbebe7..0ac3c1f4cb 100644
--- a/ports/esp32/boards/UM_TINYS3/sdkconfig.board
+++ b/ports/esp32/boards/UM_TINYS3/sdkconfig.board
@@ -1,10 +1,7 @@
CONFIG_FLASHMODE_QIO=y
CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
-CONFIG_ESPTOOLPY_FLASHSIZE_DETECT=y
CONFIG_ESPTOOLPY_AFTER_NORESET=y
-CONFIG_SPIRAM_MEMTEST=
-
CONFIG_ESPTOOLPY_FLASHSIZE_4MB=
CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y
CONFIG_ESPTOOLPY_FLASHSIZE_16MB=
@@ -13,9 +10,7 @@ CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions-8MiB.csv"
CONFIG_LWIP_LOCAL_HOSTNAME="UMTinyS3"
-# CONFIG_TINYUSB_DESC_USE_ESPRESSIF_VID is not set
CONFIG_TINYUSB_DESC_CUSTOM_VID=0x303A
-# CONFIG_TINYUSB_DESC_USE_DEFAULT_PID is not set
CONFIG_TINYUSB_DESC_CUSTOM_PID=0x80D1
CONFIG_TINYUSB_DESC_BCD_DEVICE=0x0100
CONFIG_TINYUSB_DESC_MANUFACTURER_STRING="Unexpected Maker"
diff --git a/ports/esp32/boards/sdkconfig.240mhz b/ports/esp32/boards/sdkconfig.240mhz
index e36884009d..c89a1ed251 100644
--- a/ports/esp32/boards/sdkconfig.240mhz
+++ b/ports/esp32/boards/sdkconfig.240mhz
@@ -1,5 +1,6 @@
# MicroPython on ESP32, ESP IDF configuration with 240MHz CPU
-CONFIG_ESP32_DEFAULT_CPU_FREQ_80=
-CONFIG_ESP32_DEFAULT_CPU_FREQ_160=
-CONFIG_ESP32_DEFAULT_CPU_FREQ_240=y
-CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=240
+CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_40=
+CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80=
+CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160=
+CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y
+CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=240
diff --git a/ports/esp32/boards/sdkconfig.base b/ports/esp32/boards/sdkconfig.base
index 138de095b4..c74a19c0cf 100644
--- a/ports/esp32/boards/sdkconfig.base
+++ b/ports/esp32/boards/sdkconfig.base
@@ -4,8 +4,6 @@
CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000
# Compiler options: use -O2 and disable assertions to improve performance
-# (CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is for IDF 4.0.2)
-CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE=y
CONFIG_COMPILER_OPTIMIZATION_PERF=y
CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y
@@ -21,10 +19,14 @@ CONFIG_LOG_DEFAULT_LEVEL_INFO=n
CONFIG_LOG_DEFAULT_LEVEL_ERROR=y
CONFIG_LOG_DEFAULT_LEVEL=1
-# ESP32-specific
+# Main XTAL Config
+# Only on: ESP32
+CONFIG_XTAL_FREQ_AUTO=y
+
+# ESP System Settings
+# Only on: ESP32, ESP32S3
CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=n
CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=n
-CONFIG_ESP32_XTAL_FREQ_AUTO=y
# Power Management
CONFIG_PM_ENABLE=y
@@ -44,16 +46,14 @@ CONFIG_LWIP_PPP_PAP_SUPPORT=y
CONFIG_LWIP_PPP_CHAP_SUPPORT=y
# SSL
-# Use 4kiB output buffer instead of default 16kiB (because IDF heap is fragmented in 4.0)
+# Use 4kiB output buffer instead of default 16kiB
CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y
# ULP coprocessor support
-CONFIG_ESP32_ULP_COPROC_ENABLED=y
-CONFIG_ESP32_ULP_COPROC_RESERVE_MEM=2040
-CONFIG_ESP32S2_ULP_COPROC_ENABLED=y
-CONFIG_ESP32S2_ULP_COPROC_RESERVE_MEM=2040
-CONFIG_ESP32S3_ULP_COPROC_ENABLED=y
-CONFIG_ESP32S3_ULP_COPROC_RESERVE_MEM=2040
+# Only on: ESP32, ESP32S2, ESP32S3
+CONFIG_ULP_COPROC_ENABLED=y
+CONFIG_ULP_COPROC_TYPE_FSM=y
+CONFIG_ULP_COPROC_RESERVE_MEM=2040
# For cmake build
CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y
@@ -64,7 +64,17 @@ CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv"
CONFIG_ESP32_WIFI_IRAM_OPT=n
CONFIG_ESP32_WIFI_RX_IRAM_OPT=n
-# ADC calibration
+# Legacy ADC Calibration Configuration
+# Only on: ESP32
CONFIG_ADC_CAL_EFUSE_TP_ENABLE=y
CONFIG_ADC_CAL_EFUSE_VREF_ENABLE=y
CONFIG_ADC_CAL_LUT_ENABLE=y
+
+# UART Configuration
+CONFIG_UART_ISR_IN_IRAM=y
+
+# IDF 5 deprecated
+CONFIG_ADC_SUPPRESS_DEPRECATE_WARN=y
+CONFIG_GPTIMER_SUPPRESS_DEPRECATE_WARN=y
+CONFIG_RMT_SUPPRESS_DEPRECATE_WARN=y
+CONFIG_I2S_SUPPRESS_DEPRECATE_WARN=y
diff --git a/ports/esp32/boards/sdkconfig.ble b/ports/esp32/boards/sdkconfig.ble
index 08d5e481f4..91ac3240eb 100644
--- a/ports/esp32/boards/sdkconfig.ble
+++ b/ports/esp32/boards/sdkconfig.ble
@@ -1,9 +1,14 @@
-# Note this requires building with IDF 4.x
+CONFIG_BT_NIMBLE_LOG_LEVEL_ERROR=y
CONFIG_BT_ENABLED=y
-CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y
-CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=
-CONFIG_BTDM_CTRL_MODE_BTDM=
-
CONFIG_BT_NIMBLE_ENABLED=y
+CONFIG_BT_CONTROLLER_ENABLED=y
CONFIG_BT_NIMBLE_MAX_CONNECTIONS=4
+
+# Put NimBLE on core 1, and for synchronisation
+# with the ringbuffer and scheduler MP needs to be on the same core.
+# MP on core 1 prevents interference with WiFi for time sensitive operations.
+# Only on: ESP32, ESP32S2, ESP32S3
+CONFIG_BT_NIMBLE_PINNED_TO_CORE_0=n
+CONFIG_BT_NIMBLE_PINNED_TO_CORE_1=y
+CONFIG_BT_NIMBLE_PINNED_TO_CORE=1
diff --git a/ports/esp32/boards/sdkconfig.nimble_core0 b/ports/esp32/boards/sdkconfig.nimble_core0
deleted file mode 100644
index cacaff1197..0000000000
--- a/ports/esp32/boards/sdkconfig.nimble_core0
+++ /dev/null
@@ -1,6 +0,0 @@
-# For IDF <4.2, we need NimBLE on core 0, and for synchronisation
-# with the ringbuffer and scheduler MP needs to be on the same core.
-# See https://github.com/micropython/micropython/issues/5489
-CONFIG_BT_NIMBLE_PINNED_TO_CORE_0=y
-CONFIG_BT_NIMBLE_PINNED_TO_CORE_1=n
-CONFIG_BT_NIMBLE_PINNED_TO_CORE=0
diff --git a/ports/esp32/boards/sdkconfig.nimble_core1 b/ports/esp32/boards/sdkconfig.nimble_core1
deleted file mode 100644
index 33653cc4b1..0000000000
--- a/ports/esp32/boards/sdkconfig.nimble_core1
+++ /dev/null
@@ -1,6 +0,0 @@
-# For IDF >=4.2, we are able to put NimBLE on core 1, and for synchronisation
-# with the ringbuffer and scheduler MP needs to be on the same core.
-# MP on core 1 prevents interference with WiFi for time sensitive operations.
-CONFIG_BT_NIMBLE_PINNED_TO_CORE_0=n
-CONFIG_BT_NIMBLE_PINNED_TO_CORE_1=y
-CONFIG_BT_NIMBLE_PINNED_TO_CORE=1
diff --git a/ports/esp32/boards/sdkconfig.spiram b/ports/esp32/boards/sdkconfig.spiram
index 5b4ce118b8..74d35f7b4a 100644
--- a/ports/esp32/boards/sdkconfig.spiram
+++ b/ports/esp32/boards/sdkconfig.spiram
@@ -1,6 +1,11 @@
# MicroPython on ESP32, ESP IDF configuration with SPIRAM support
-CONFIG_ESP32_SPIRAM_SUPPORT=y
+CONFIG_SPIRAM=y
CONFIG_SPIRAM_CACHE_WORKAROUND=y
CONFIG_SPIRAM_IGNORE_NOTFOUND=y
-CONFIG_SPIRAM_USE_MEMMAP=y
+CONFIG_SPIRAM_USE_CAPS_ALLOC=y
+
+# SPIRAM increases the size of the firmware and overflows iram0_0_seg, due
+# to PSRAM bug workarounds. Apply some options to reduce the firmware size.
+CONFIG_COMPILER_OPTIMIZATION_SIZE=y
+CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH=y
diff --git a/ports/esp32/boards/sdkconfig.spiram_sx b/ports/esp32/boards/sdkconfig.spiram_sx
index ef24e90829..fe38846780 100644
--- a/ports/esp32/boards/sdkconfig.spiram_sx
+++ b/ports/esp32/boards/sdkconfig.spiram_sx
@@ -1,6 +1,4 @@
# MicroPython on ESP32-S2 and ESP32-PAD1_subscript_3, ESP IDF configuration with SPIRAM support
-CONFIG_ESP32S2_SPIRAM_SUPPORT=y
-CONFIG_ESP32S3_SPIRAM_SUPPORT=y
CONFIG_SPIRAM_MODE_QUAD=y
CONFIG_SPIRAM_TYPE_AUTO=y
CONFIG_DEFAULT_PSRAM_CLK_IO=30
@@ -9,7 +7,4 @@ CONFIG_SPIRAM_SPEED_80M=y
CONFIG_SPIRAM=y
CONFIG_SPIRAM_BOOT_INIT=y
CONFIG_SPIRAM_IGNORE_NOTFOUND=y
-CONFIG_SPIRAM_USE_MEMMAP=y
-CONFIG_SPIRAM_MEMTEST=y
-CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=16384
-CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=32768
+CONFIG_SPIRAM_USE_CAPS_ALLOC=y
diff --git a/ports/esp32/boards/sdkconfig.usb b/ports/esp32/boards/sdkconfig.usb
index 657edbc580..4090c710e6 100644
--- a/ports/esp32/boards/sdkconfig.usb
+++ b/ports/esp32/boards/sdkconfig.usb
@@ -1,4 +1,4 @@
-CONFIG_USB_ENABLED=y
-CONFIG_USB_CDC_ENABLED=y
-CONFIG_USB_CDC_RX_BUFSIZE=256
-CONFIG_USB_CDC_TX_BUFSIZE=256
+CONFIG_USB_OTG_SUPPORTED=y
+CONFIG_TINYUSB_CDC_ENABLED=y
+CONFIG_TINYUSB_CDC_RX_BUFSIZE=256
+CONFIG_TINYUSB_CDC_TX_BUFSIZE=256
diff --git a/ports/esp32/main/CMakeLists.txt b/ports/esp32/esp32_common.cmake
index 4311af801c..d55dd38134 100644
--- a/ports/esp32/main/CMakeLists.txt
+++ b/ports/esp32/esp32_common.cmake
@@ -1,8 +1,9 @@
# Set location of base MicroPython directory.
if(NOT MICROPY_DIR)
- get_filename_component(MICROPY_DIR ${CMAKE_CURRENT_LIST_DIR}/../../.. ABSOLUTE)
+ get_filename_component(MICROPY_DIR ${CMAKE_CURRENT_LIST_DIR}/../.. ABSOLUTE)
endif()
+# Set location of the ESP32 port directory.
if(NOT MICROPY_PORT_DIR)
get_filename_component(MICROPY_PORT_DIR ${MICROPY_DIR}/ports/esp32 ABSOLUTE)
endif()
@@ -19,11 +20,11 @@ if(NOT CMAKE_BUILD_EARLY_EXPANSION)
include(${MICROPY_DIR}/extmod/extmod.cmake)
endif()
-set(MICROPY_QSTRDEFS_PORT
+list(APPEND MICROPY_QSTRDEFS_PORT
${MICROPY_PORT_DIR}/qstrdefsport.h
)
-set(MICROPY_SOURCE_SHARED
+list(APPEND MICROPY_SOURCE_SHARED
${MICROPY_DIR}/shared/readline/readline.c
${MICROPY_DIR}/shared/netutils/netutils.c
${MICROPY_DIR}/shared/timeutils/timeutils.c
@@ -33,25 +34,22 @@ set(MICROPY_SOURCE_SHARED
${MICROPY_DIR}/shared/runtime/pyexec.c
)
-set(MICROPY_SOURCE_LIB
+list(APPEND MICROPY_SOURCE_LIB
${MICROPY_DIR}/lib/littlefs/lfs1.c
${MICROPY_DIR}/lib/littlefs/lfs1_util.c
${MICROPY_DIR}/lib/littlefs/lfs2.c
${MICROPY_DIR}/lib/littlefs/lfs2_util.c
- ${MICROPY_DIR}/lib/mbedtls_errors/esp32_mbedtls_errors.c
+ #${MICROPY_DIR}/lib/mbedtls_errors/esp32_mbedtls_errors.c
${MICROPY_DIR}/lib/oofatfs/ff.c
${MICROPY_DIR}/lib/oofatfs/ffunicode.c
)
-if(IDF_TARGET STREQUAL "esp32c3")
- list(APPEND MICROPY_SOURCE_LIB ${MICROPY_DIR}/shared/runtime/gchelper_generic.c)
-endif()
-set(MICROPY_SOURCE_DRIVERS
+list(APPEND MICROPY_SOURCE_DRIVERS
${MICROPY_DIR}/drivers/bus/softspi.c
${MICROPY_DIR}/drivers/dht/dht.c
)
-set(MICROPY_SOURCE_PORT
+list(APPEND MICROPY_SOURCE_PORT
main.c
ppp_set_auth.c
uart.c
@@ -93,7 +91,7 @@ set(MICROPY_SOURCE_PORT
)
list(TRANSFORM MICROPY_SOURCE_PORT PREPEND ${MICROPY_PORT_DIR}/)
-set(MICROPY_SOURCE_QSTR
+list(APPEND MICROPY_SOURCE_QSTR
${MICROPY_SOURCE_PY}
${MICROPY_SOURCE_EXTMOD}
${MICROPY_SOURCE_USERMOD}
@@ -103,63 +101,42 @@ set(MICROPY_SOURCE_QSTR
${MICROPY_SOURCE_BOARD}
)
-set(IDF_COMPONENTS
+list(APPEND IDF_COMPONENTS
app_update
bootloader_support
bt
driver
- esp_adc_cal
+ esp_adc
+ esp_app_format
esp_common
esp_eth
esp_event
+ esp_hw_support
+ esp_netif
+ esp_partition
+ esp_pm
+ esp_psram
esp_ringbuf
esp_rom
+ esp_system
+ esp_timer
esp_wifi
freertos
+ hal
heap
log
lwip
mbedtls
- mdns
newlib
nvs_flash
sdmmc
soc
spi_flash
- tcpip_adapter
ulp
vfs
xtensa
)
-if(IDF_VERSION_MINOR GREATER_EQUAL 1 OR IDF_VERSION_MAJOR GREATER_EQUAL 5)
- list(APPEND IDF_COMPONENTS esp_netif)
-endif()
-
-if(IDF_VERSION_MINOR GREATER_EQUAL 2 OR IDF_VERSION_MAJOR GREATER_EQUAL 5)
- list(APPEND IDF_COMPONENTS esp_system)
- list(APPEND IDF_COMPONENTS esp_timer)
-endif()
-
-if(IDF_VERSION_MINOR GREATER_EQUAL 3 OR IDF_VERSION_MAJOR GREATER_EQUAL 5)
- list(APPEND IDF_COMPONENTS esp_hw_support)
- list(APPEND IDF_COMPONENTS esp_pm)
- list(APPEND IDF_COMPONENTS hal)
-endif()
-
-if(IDF_TARGET STREQUAL "esp32")
- list(APPEND IDF_COMPONENTS esp32)
-elseif(IDF_TARGET STREQUAL "esp32c3")
- list(APPEND IDF_COMPONENTS esp32c3)
- list(APPEND IDF_COMPONENTS riscv)
-elseif(IDF_TARGET STREQUAL "esp32s2")
- list(APPEND IDF_COMPONENTS esp32s2)
- list(APPEND IDF_COMPONENTS tinyusb)
-elseif(IDF_TARGET STREQUAL "esp32s3")
- list(APPEND IDF_COMPONENTS esp32s3)
- list(APPEND IDF_COMPONENTS tinyusb)
-endif()
-
# Register the main IDF component.
idf_component_register(
SRCS
@@ -216,18 +193,8 @@ target_link_libraries(${MICROPY_TARGET} usermod)
# Collect all of the include directories and compile definitions for the IDF components.
foreach(comp ${IDF_COMPONENTS})
micropy_gather_target_properties(__idf_${comp})
+ micropy_gather_target_properties(${comp})
endforeach()
-if(IDF_VERSION_MINOR GREATER_EQUAL 2 OR IDF_VERSION_MAJOR GREATER_EQUAL 5)
- # These paths cannot currently be found by the IDF_COMPONENTS search loop above,
- # so add them explicitly.
- list(APPEND MICROPY_CPP_INC_EXTRA ${IDF_PATH}/components/soc/soc/${IDF_TARGET}/include)
- list(APPEND MICROPY_CPP_INC_EXTRA ${IDF_PATH}/components/soc/soc/include)
- if(IDF_VERSION_MINOR GREATER_EQUAL 3)
- list(APPEND MICROPY_CPP_INC_EXTRA ${IDF_PATH}/components/tinyusb/additions/include)
- list(APPEND MICROPY_CPP_INC_EXTRA ${IDF_PATH}/components/tinyusb/tinyusb/src)
- endif()
-endif()
-
# Include the main MicroPython cmake rules.
include(${MICROPY_DIR}/py/mkrules.cmake)
diff --git a/ports/esp32/esp32_rmt.c b/ports/esp32/esp32_rmt.c
index 3cd43e8474..f92af636f5 100644
--- a/ports/esp32/esp32_rmt.c
+++ b/ports/esp32/esp32_rmt.c
@@ -48,11 +48,7 @@
// and carrier output.
// Last available RMT channel that can transmit.
-#if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 4, 0)
-#define RMT_LAST_TX_CHANNEL (RMT_CHANNEL_MAX - 1)
-#else
#define RMT_LAST_TX_CHANNEL (SOC_RMT_TX_CANDIDATES_PER_GROUP - 1)
-#endif
// Forward declaration
extern const mp_obj_type_t esp32_rmt_type;
diff --git a/ports/esp32/esp32_ulp.c b/ports/esp32/esp32_ulp.c
index 439ee32836..97041c60bd 100644
--- a/ports/esp32/esp32_ulp.c
+++ b/ports/esp32/esp32_ulp.c
@@ -35,7 +35,6 @@
#elif CONFIG_IDF_TARGET_ESP32S3
#include "esp32s3/ulp.h"
#endif
-#include "esp_err.h"
typedef struct _esp32_ulp_obj_t {
mp_obj_base_t base;
@@ -93,13 +92,7 @@ STATIC const mp_rom_map_elem_t esp32_ulp_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_set_wakeup_period), MP_ROM_PTR(&esp32_ulp_set_wakeup_period_obj) },
{ MP_ROM_QSTR(MP_QSTR_load_binary), MP_ROM_PTR(&esp32_ulp_load_binary_obj) },
{ MP_ROM_QSTR(MP_QSTR_run), MP_ROM_PTR(&esp32_ulp_run_obj) },
- #if CONFIG_IDF_TARGET_ESP32
- { MP_ROM_QSTR(MP_QSTR_RESERVE_MEM), MP_ROM_INT(CONFIG_ESP32_ULP_COPROC_RESERVE_MEM) },
- #elif CONFIG_IDF_TARGET_ESP32S2
- { MP_ROM_QSTR(MP_QSTR_RESERVE_MEM), MP_ROM_INT(CONFIG_ESP32S2_ULP_COPROC_RESERVE_MEM) },
- #elif CONFIG_IDF_TARGET_ESP32S3
- { MP_ROM_QSTR(MP_QSTR_RESERVE_MEM), MP_ROM_INT(CONFIG_ESP32S3_ULP_COPROC_RESERVE_MEM) },
- #endif
+ { MP_ROM_QSTR(MP_QSTR_RESERVE_MEM), MP_ROM_INT(CONFIG_ULP_COPROC_RESERVE_MEM) },
};
STATIC MP_DEFINE_CONST_DICT(esp32_ulp_locals_dict, esp32_ulp_locals_dict_table);
diff --git a/ports/esp32/gccollect.c b/ports/esp32/gccollect.c
index 403a3c7dfa..6fa287de28 100644
--- a/ports/esp32/gccollect.c
+++ b/ports/esp32/gccollect.c
@@ -34,7 +34,6 @@
#include "py/gc.h"
#include "py/mpthread.h"
#include "gccollect.h"
-#include "soc/cpu.h"
#if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
@@ -50,7 +49,7 @@ static void gc_collect_inner(int level) {
if (level == XCHAL_NUM_AREGS / 8) {
// get the sp
- volatile uint32_t sp = (uint32_t)get_sp();
+ volatile uint32_t sp = (uint32_t)esp_cpu_get_sp();
gc_collect_root((void **)sp, ((mp_uint_t)MP_STATE_THREAD(stack_top) - sp) / sizeof(uint32_t));
return;
}
diff --git a/ports/esp32/machine_adcblock.h b/ports/esp32/machine_adcblock.h
index 0500726d71..7c9249b072 100644
--- a/ports/esp32/machine_adcblock.h
+++ b/ports/esp32/machine_adcblock.h
@@ -3,6 +3,8 @@
#include "esp_adc_cal.h"
+#define ADC_ATTEN_MAX SOC_ADC_ATTEN_NUM
+
typedef struct _madcblock_obj_t {
mp_obj_base_t base;
adc_unit_t unit_id;
diff --git a/ports/esp32/machine_bitstream.c b/ports/esp32/machine_bitstream.c
index 4284b5f8ba..87a5ae53cf 100644
--- a/ports/esp32/machine_bitstream.c
+++ b/ports/esp32/machine_bitstream.c
@@ -28,6 +28,10 @@
#include "py/mphal.h"
#include "modesp32.h"
+#include "rom/gpio.h"
+#include "soc/gpio_reg.h"
+#include "soc/gpio_sig_map.h"
+
#if MICROPY_PY_MACHINE_BITSTREAM
/******************************************************************************/
@@ -52,7 +56,7 @@ STATIC void IRAM_ATTR machine_bitstream_high_low_bitbang(mp_hal_pin_obj_t pin, u
}
// Convert ns to cpu ticks [high_time_0, period_0, high_time_1, period_1].
- uint32_t fcpu_mhz = ets_get_cpu_frequency();
+ uint32_t fcpu_mhz = esp_rom_get_cpu_ticks_per_us();
for (size_t i = 0; i < 4; ++i) {
timing_ns[i] = fcpu_mhz * timing_ns[i] / 1000;
if (timing_ns[i] > NS_TICKS_OVERHEAD) {
@@ -91,27 +95,6 @@ STATIC void IRAM_ATTR machine_bitstream_high_low_bitbang(mp_hal_pin_obj_t pin, u
#include "driver/rmt.h"
-#if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 1, 0)
-// This convenience macro was not available in earlier IDF versions.
-#define RMT_DEFAULT_CONFIG_TX(gpio, channel_id) \
- { \
- .rmt_mode = RMT_MODE_TX, \
- .channel = channel_id, \
- .clk_div = 80, \
- .gpio_num = gpio, \
- .mem_block_num = 1, \
- .tx_config = { \
- .loop_en = false, \
- .carrier_freq_hz = 38000, \
- .carrier_duty_percent = 33, \
- .carrier_level = RMT_CARRIER_LEVEL_HIGH, \
- .carrier_en = false, \
- .idle_level = RMT_IDLE_LEVEL_LOW, \
- .idle_output_en = true, \
- } \
- }
-#endif
-
// Logical 0 and 1 values (encoded as a rmt_item32_t).
// The duration fields will be set later.
STATIC rmt_item32_t bitstream_high_low_0 = {{{ 0, 1, 0, 0 }}};
@@ -163,13 +146,7 @@ STATIC void machine_bitstream_high_low_rmt(mp_hal_pin_obj_t pin, uint32_t *timin
// Get the tick rate in kHz (this will likely be 40000).
uint32_t counter_clk_khz = 0;
- #if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 1, 0)
- uint8_t div_cnt;
- check_esp_err(rmt_get_clk_div(config.channel, &div_cnt));
- counter_clk_khz = APB_CLK_FREQ / div_cnt;
- #else
check_esp_err(rmt_get_counter_clock(config.channel, &counter_clk_khz));
- #endif
counter_clk_khz /= 1000;
@@ -193,7 +170,7 @@ STATIC void machine_bitstream_high_low_rmt(mp_hal_pin_obj_t pin, uint32_t *timin
check_esp_err(rmt_driver_uninstall(config.channel));
// Cancel RMT output to GPIO pin.
- gpio_matrix_out(pin, SIG_GPIO_OUT_IDX, false, false);
+ esp_rom_gpio_connect_out_signal(pin, SIG_GPIO_OUT_IDX, false, false);
}
/******************************************************************************/
diff --git a/ports/esp32/machine_hw_spi.c b/ports/esp32/machine_hw_spi.c
index 36f8d3f069..662d0e5994 100644
--- a/ports/esp32/machine_hw_spi.c
+++ b/ports/esp32/machine_hw_spi.c
@@ -35,6 +35,8 @@
#include "modmachine.h"
#include "driver/spi_master.h"
+#include "soc/gpio_sig_map.h"
+#include "soc/spi_pins.h"
// SPI mappings by device, naming used by IDF old/new
// upython | ESP32 | ESP32S2 | ESP32S3 | ESP32C3
@@ -57,9 +59,9 @@
#define MICROPY_HW_SPI1_MOSI FSPI_IOMUX_PIN_NUM_MOSI
#define MICROPY_HW_SPI1_MISO FSPI_IOMUX_PIN_NUM_MISO
#else
-#define MICROPY_HW_SPI1_SCK HSPI_IOMUX_PIN_NUM_CLK
-#define MICROPY_HW_SPI1_MOSI HSPI_IOMUX_PIN_NUM_MOSI
-#define MICROPY_HW_SPI1_MISO HSPI_IOMUX_PIN_NUM_MISO
+#define MICROPY_HW_SPI1_SCK SPI2_IOMUX_PIN_NUM_CLK
+#define MICROPY_HW_SPI1_MOSI SPI2_IOMUX_PIN_NUM_MOSI
+#define MICROPY_HW_SPI1_MISO SPI2_IOMUX_PIN_NUM_MISO
#endif
#endif
@@ -67,9 +69,9 @@
#ifndef MICROPY_HW_SPI2_SCK
#if CONFIG_IDF_TARGET_ESP32
// ESP32 has IO_MUX pins for VSPI/SPI3 lines, use them as defaults
-#define MICROPY_HW_SPI2_SCK VSPI_IOMUX_PIN_NUM_CLK // pin 18
-#define MICROPY_HW_SPI2_MOSI VSPI_IOMUX_PIN_NUM_MOSI // pin 23
-#define MICROPY_HW_SPI2_MISO VSPI_IOMUX_PIN_NUM_MISO // pin 19
+#define MICROPY_HW_SPI2_SCK SPI3_IOMUX_PIN_NUM_CLK // pin 18
+#define MICROPY_HW_SPI2_MOSI SPI3_IOMUX_PIN_NUM_MOSI // pin 23
+#define MICROPY_HW_SPI2_MISO SPI3_IOMUX_PIN_NUM_MISO // pin 19
#elif CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
// ESP32S2 and S3 uses GPIO matrix for SPI3 pins, no IO_MUX possible
// Set defaults to the pins used by SPI2 in Octal mode
@@ -83,9 +85,9 @@
#define MP_HW_SPI_MAX_XFER_BITS (MP_HW_SPI_MAX_XFER_BYTES * 8) // Has to be an even multiple of 8
#if CONFIG_IDF_TARGET_ESP32C3
-#define HSPI_HOST SPI2_HOST
+#define SPI2_HOST SPI2_HOST
#elif CONFIG_IDF_TARGET_ESP32S3
-#define HSPI_HOST SPI3_HOST
+#define SPI2_HOST SPI3_HOST
#define FSPI_HOST SPI2_HOST
#endif
@@ -122,7 +124,7 @@ STATIC const machine_hw_spi_default_pins_t machine_hw_spi_default_pins[2] = {
#endif
};
-// Static objects mapping to HSPI and VSPI hardware peripherals
+// Static objects mapping to SPI2 and SPI3 hardware peripherals
STATIC machine_hw_spi_obj_t machine_hw_spi_obj[2];
STATIC void machine_hw_spi_deinit_internal(machine_hw_spi_obj_t *self) {
@@ -150,8 +152,8 @@ STATIC void machine_hw_spi_deinit_internal(machine_hw_spi_obj_t *self) {
for (int i = 0; i < 3; i++) {
if (pins[i] != -1) {
- gpio_pad_select_gpio(pins[i]);
- gpio_matrix_out(pins[i], SIG_GPIO_OUT_IDX, false, false);
+ esp_rom_gpio_pad_select_gpio(pins[i]);
+ esp_rom_gpio_connect_out_signal(pins[i], SIG_GPIO_OUT_IDX, false, false);
gpio_set_direction(pins[i], GPIO_MODE_INPUT);
}
}
@@ -226,12 +228,12 @@ STATIC void machine_hw_spi_init_internal(
changed = true;
}
- if (self->host != HSPI_HOST
+ if (self->host != SPI2_HOST
#ifdef FSPI_HOST
&& self->host != FSPI_HOST
#endif
- #ifdef VSPI_HOST
- && self->host != VSPI_HOST
+ #ifdef SPI3_HOST
+ && self->host != SPI3_HOST
#endif
) {
mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("SPI(%d) doesn't exist"), self->host);
@@ -270,7 +272,7 @@ STATIC void machine_hw_spi_init_internal(
#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32C3
dma_chan = SPI_DMA_CH_AUTO;
#else
- if (self->host == HSPI_HOST) {
+ if (self->host == SPI2_HOST) {
dma_chan = 1;
} else {
dma_chan = 2;
@@ -483,7 +485,7 @@ mp_obj_t machine_hw_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_
machine_hw_spi_obj_t *self;
const machine_hw_spi_default_pins_t *default_pins;
- if (args[ARG_id].u_int == 1) { // SPI2_HOST which is FSPI_HOST on ESP32Sx, HSPI_HOST on others
+ if (args[ARG_id].u_int == 1) { // SPI2_HOST which is FSPI_HOST on ESP32Sx, SPI2_HOST on others
self = &machine_hw_spi_obj[0];
default_pins = &machine_hw_spi_default_pins[0];
} else {
diff --git a/ports/esp32/machine_i2c.c b/ports/esp32/machine_i2c.c
index 9ec39e5649..e3b7647790 100644
--- a/ports/esp32/machine_i2c.c
+++ b/ports/esp32/machine_i2c.c
@@ -31,13 +31,7 @@
#include "modmachine.h"
#include "driver/i2c.h"
-
-#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 4, 0)
#include "hal/i2c_ll.h"
-#else
-#include "soc/i2c_reg.h"
-#define I2C_LL_MAX_TIMEOUT I2C_TIME_OUT_REG_V
-#endif
#ifndef MICROPY_HW_I2C0_SCL
#define MICROPY_HW_I2C0_SCL (GPIO_NUM_18)
@@ -125,7 +119,7 @@ int machine_hw_i2c_transfer(mp_obj_base_t *self_in, uint16_t addr, size_t n, mp_
}
// TODO proper timeout
- esp_err_t err = i2c_master_cmd_begin(self->port, cmd, 100 * (1 + data_len) / portTICK_RATE_MS);
+ esp_err_t err = i2c_master_cmd_begin(self->port, cmd, 100 * (1 + data_len) / portTICK_PERIOD_MS);
i2c_cmd_link_delete(cmd);
if (err == ESP_FAIL) {
diff --git a/ports/esp32/machine_i2s.c b/ports/esp32/machine_i2s.c
index f0163486cd..59b24ae70c 100644
--- a/ports/esp32/machine_i2s.c
+++ b/ports/esp32/machine_i2s.c
@@ -148,7 +148,7 @@ STATIC const int8_t i2s_frame_map[NUM_I2S_USER_FORMATS][I2S_RX_FRAME_SIZE_IN_BYT
};
void machine_i2s_init0() {
- for (i2s_port_t p = 0; p < I2S_NUM_MAX; p++) {
+ for (i2s_port_t p = 0; p < I2S_NUM_AUTO; p++) {
MP_STATE_PORT(machine_i2s_obj)[p] = NULL;
}
}
@@ -269,15 +269,6 @@ STATIC uint32_t fill_appbuf_from_dma(machine_i2s_obj_t *self, mp_buffer_info_t *
num_bytes_requested_from_dma,
&num_bytes_received_from_dma,
delay);
-
- // the following is a workaround for a bug in ESP-IDF v4.4
- // https://github.com/espressif/esp-idf/issues/8121
- #if (ESP_IDF_VERSION_MAJOR == 4) && (ESP_IDF_VERSION_MINOR >= 4)
- if ((delay != portMAX_DELAY) && (ret == ESP_ERR_TIMEOUT)) {
- ret = ESP_OK;
- }
- #endif
-
check_esp_err(ret);
// process the transform buffer one frame at a time.
@@ -334,15 +325,6 @@ STATIC size_t copy_appbuf_to_dma(machine_i2s_obj_t *self, mp_buffer_info_t *appb
}
esp_err_t ret = i2s_write(self->port, appbuf->buf, appbuf->len, &num_bytes_written, delay);
-
- // the following is a workaround for a bug in ESP-IDF v4.4
- // https://github.com/espressif/esp-idf/issues/8121
- #if (ESP_IDF_VERSION_MAJOR == 4) && (ESP_IDF_VERSION_MINOR >= 4)
- if ((delay != portMAX_DELAY) && (ret == ESP_ERR_TIMEOUT)) {
- ret = ESP_OK;
- }
- #endif
-
check_esp_err(ret);
if ((self->io_mode == ASYNCIO) && (num_bytes_written < appbuf->len)) {
@@ -467,10 +449,8 @@ STATIC void machine_i2s_init_helper(machine_i2s_obj_t *self, size_t n_pos_args,
i2s_config.use_apll = false;
i2s_config.tx_desc_auto_clear = true;
i2s_config.fixed_mclk = 0;
- #if (ESP_IDF_VERSION_MAJOR == 4) && (ESP_IDF_VERSION_MINOR >= 4)
- i2s_config.mclk_multiple = I2S_MCLK_MULTIPLE_DEFAULT;
+ i2s_config.mclk_multiple = I2S_MCLK_MULTIPLE_256;
i2s_config.bits_per_chan = 0;
- #endif
// I2S queue size equals the number of DMA buffers
check_esp_err(i2s_driver_install(self->port, &i2s_config, i2s_config.dma_buf_count, &self->i2s_event_queue));
@@ -487,9 +467,7 @@ STATIC void machine_i2s_init_helper(machine_i2s_obj_t *self, size_t n_pos_args,
#endif
i2s_pin_config_t pin_config;
- #if (ESP_IDF_VERSION_MAJOR == 4) && (ESP_IDF_VERSION_MINOR >= 4)
pin_config.mck_io_num = I2S_PIN_NO_CHANGE;
- #endif
pin_config.bck_io_num = self->sck;
pin_config.ws_io_num = self->ws;
@@ -527,7 +505,7 @@ STATIC mp_obj_t machine_i2s_make_new(const mp_obj_type_t *type, size_t n_pos_arg
mp_arg_check_num(n_pos_args, n_kw_args, 1, MP_OBJ_FUN_ARGS_MAX, true);
i2s_port_t port = mp_obj_get_int(args[0]);
- if (port < 0 || port >= I2S_NUM_MAX) {
+ if (port < 0 || port >= I2S_NUM_AUTO) {
mp_raise_ValueError(MP_ERROR_TEXT("invalid id"));
}
@@ -841,6 +819,6 @@ MP_DEFINE_CONST_OBJ_TYPE(
locals_dict, &machine_i2s_locals_dict
);
-MP_REGISTER_ROOT_POINTER(struct _machine_i2s_obj_t *machine_i2s_obj[I2S_NUM_MAX]);
+MP_REGISTER_ROOT_POINTER(struct _machine_i2s_obj_t *machine_i2s_obj[I2S_NUM_AUTO]);
#endif // MICROPY_PY_MACHINE_I2S
diff --git a/ports/esp32/machine_pin.c b/ports/esp32/machine_pin.c
index f103b96963..5ea41701af 100644
--- a/ports/esp32/machine_pin.c
+++ b/ports/esp32/machine_pin.c
@@ -31,6 +31,7 @@
#include "driver/gpio.h"
#include "driver/rtc_io.h"
+#include "hal/gpio_ll.h"
#include "py/runtime.h"
#include "py/mphal.h"
@@ -92,11 +93,7 @@ STATIC const machine_pin_obj_t machine_pin_obj[GPIO_NUM_MAX] = {
#endif
{{&machine_pin_type}, GPIO_NUM_18},
{{&machine_pin_type}, GPIO_NUM_19},
- #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 3, 2)
{{&machine_pin_type}, GPIO_NUM_20},
- #else
- {{NULL}, -1},
- #endif
{{&machine_pin_type}, GPIO_NUM_21},
{{&machine_pin_type}, GPIO_NUM_22},
{{&machine_pin_type}, GPIO_NUM_23},
@@ -295,7 +292,7 @@ STATIC mp_obj_t machine_pin_obj_init_helper(const machine_pin_obj_t *self, size_
#endif
// configure the pin for gpio
- gpio_pad_select_gpio(self->id);
+ esp_rom_gpio_pad_select_gpio(self->id);
// set initial value (do this before configuring mode/pull)
if (args[ARG_value].u_obj != MP_OBJ_NULL) {
@@ -423,7 +420,7 @@ STATIC mp_obj_t machine_pin_irq(size_t n_args, const mp_obj_t *pos_args, mp_map_
enum { ARG_handler, ARG_trigger, ARG_wake };
static const mp_arg_t allowed_args[] = {
{ MP_QSTR_handler, MP_ARG_OBJ, {.u_obj = mp_const_none} },
- { MP_QSTR_trigger, MP_ARG_INT, {.u_int = GPIO_PIN_INTR_POSEDGE | GPIO_PIN_INTR_NEGEDGE} },
+ { MP_QSTR_trigger, MP_ARG_INT, {.u_int = GPIO_INTR_POSEDGE | GPIO_INTR_NEGEDGE} },
{ MP_QSTR_wake, MP_ARG_OBJ, {.u_obj = mp_const_none} },
};
machine_pin_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
@@ -436,7 +433,7 @@ STATIC mp_obj_t machine_pin_irq(size_t n_args, const mp_obj_t *pos_args, mp_map_
uint32_t trigger = args[ARG_trigger].u_int;
mp_obj_t wake_obj = args[ARG_wake].u_obj;
- if ((trigger == GPIO_PIN_INTR_LOLEVEL || trigger == GPIO_PIN_INTR_HILEVEL) && wake_obj != mp_const_none) {
+ if ((trigger == GPIO_INTR_LOW_LEVEL || trigger == GPIO_INTR_HIGH_LEVEL) && wake_obj != mp_const_none) {
mp_int_t wake;
if (mp_obj_get_int_maybe(wake_obj, &wake)) {
if (wake < 2 || wake > 7) {
@@ -460,7 +457,7 @@ STATIC mp_obj_t machine_pin_irq(size_t n_args, const mp_obj_t *pos_args, mp_map_
mp_raise_ValueError(MP_ERROR_TEXT("no resources"));
}
- machine_rtc_config.ext0_level = trigger == GPIO_PIN_INTR_LOLEVEL ? 0 : 1;
+ machine_rtc_config.ext0_level = trigger == GPIO_INTR_LOW_LEVEL ? 0 : 1;
machine_rtc_config.ext0_wake_types = wake;
} else {
if (machine_rtc_config.ext0_pin == self->id) {
@@ -497,10 +494,10 @@ STATIC const mp_rom_map_elem_t machine_pin_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_OPEN_DRAIN), MP_ROM_INT(GPIO_MODE_INPUT_OUTPUT_OD) },
{ MP_ROM_QSTR(MP_QSTR_PULL_UP), MP_ROM_INT(GPIO_PULL_UP) },
{ MP_ROM_QSTR(MP_QSTR_PULL_DOWN), MP_ROM_INT(GPIO_PULL_DOWN) },
- { MP_ROM_QSTR(MP_QSTR_IRQ_RISING), MP_ROM_INT(GPIO_PIN_INTR_POSEDGE) },
- { MP_ROM_QSTR(MP_QSTR_IRQ_FALLING), MP_ROM_INT(GPIO_PIN_INTR_NEGEDGE) },
- { MP_ROM_QSTR(MP_QSTR_WAKE_LOW), MP_ROM_INT(GPIO_PIN_INTR_LOLEVEL) },
- { MP_ROM_QSTR(MP_QSTR_WAKE_HIGH), MP_ROM_INT(GPIO_PIN_INTR_HILEVEL) },
+ { MP_ROM_QSTR(MP_QSTR_IRQ_RISING), MP_ROM_INT(GPIO_INTR_POSEDGE) },
+ { MP_ROM_QSTR(MP_QSTR_IRQ_FALLING), MP_ROM_INT(GPIO_INTR_NEGEDGE) },
+ { MP_ROM_QSTR(MP_QSTR_WAKE_LOW), MP_ROM_INT(GPIO_INTR_LOW_LEVEL) },
+ { MP_ROM_QSTR(MP_QSTR_WAKE_HIGH), MP_ROM_INT(GPIO_INTR_HIGH_LEVEL) },
{ MP_ROM_QSTR(MP_QSTR_DRIVE_0), MP_ROM_INT(GPIO_DRIVE_CAP_0) },
{ MP_ROM_QSTR(MP_QSTR_DRIVE_1), MP_ROM_INT(GPIO_DRIVE_CAP_1) },
{ MP_ROM_QSTR(MP_QSTR_DRIVE_2), MP_ROM_INT(GPIO_DRIVE_CAP_2) },
@@ -573,11 +570,7 @@ STATIC const machine_pin_irq_obj_t machine_pin_irq_object[GPIO_NUM_MAX] = {
#endif
{{&machine_pin_irq_type}, GPIO_NUM_18},
{{&machine_pin_irq_type}, GPIO_NUM_19},
- #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 3, 2)
{{&machine_pin_irq_type}, GPIO_NUM_20},
- #else
- {{NULL}, -1},
- #endif
{{&machine_pin_irq_type}, GPIO_NUM_21},
{{&machine_pin_irq_type}, GPIO_NUM_22},
{{&machine_pin_irq_type}, GPIO_NUM_23},
diff --git a/ports/esp32/machine_pwm.c b/ports/esp32/machine_pwm.c
index 445ac80fb2..462d0fa79c 100644
--- a/ports/esp32/machine_pwm.c
+++ b/ports/esp32/machine_pwm.c
@@ -34,6 +34,7 @@
#include "driver/ledc.h"
#include "esp_err.h"
+#include "soc/gpio_sig_map.h"
#define PWM_DBG(...)
// #define PWM_DBG(...) mp_printf(&mp_plat_print, __VA_ARGS__); mp_printf(&mp_plat_print, "\n");
@@ -164,13 +165,13 @@ STATIC void pwm_deinit(int channel_idx) {
// Mark it unused, and tell the hardware to stop routing
check_esp_err(ledc_stop(mode, channel, 0));
// Disable ledc signal for the pin
- // gpio_matrix_out(pin, SIG_GPIO_OUT_IDX, false, false);
+ // esp_rom_gpio_connect_out_signal(pin, SIG_GPIO_OUT_IDX, false, false);
if (mode == LEDC_LOW_SPEED_MODE) {
- gpio_matrix_out(pin, LEDC_LS_SIG_OUT0_IDX + channel, false, true);
+ esp_rom_gpio_connect_out_signal(pin, LEDC_LS_SIG_OUT0_IDX + channel, false, true);
} else {
#if LEDC_SPEED_MODE_MAX > 1
#if CONFIG_IDF_TARGET_ESP32
- gpio_matrix_out(pin, LEDC_HS_SIG_OUT0_IDX + channel, false, true);
+ esp_rom_gpio_connect_out_signal(pin, LEDC_HS_SIG_OUT0_IDX + channel, false, true);
#else
#error Add supported CONFIG_IDF_TARGET_ESP32_xxx
#endif
@@ -209,18 +210,13 @@ STATIC void configure_channel(machine_pwm_obj_t *self) {
STATIC void set_freq(machine_pwm_obj_t *self, unsigned int freq, ledc_timer_config_t *timer) {
if (freq != timer->freq_hz) {
// Find the highest bit resolution for the requested frequency
- unsigned int i = LEDC_APB_CLK_HZ; // 80 MHz
+ unsigned int i = APB_CLK_FREQ; // 80 MHz
#if SOC_LEDC_SUPPORT_REF_TICK
if (freq < EMPIRIC_FREQ) {
- i = LEDC_REF_CLK_HZ; // 1 MHz
+ i = REF_CLK_FREQ; // 1 MHz
}
#endif
- #if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 0, 0)
- // original code
- i /= freq;
- #else
- // See https://github.com/espressif/esp-idf/issues/7722
int divider = (i + freq / 2) / freq; // rounded
if (divider == 0) {
divider = 1;
@@ -230,7 +226,6 @@ STATIC void set_freq(machine_pwm_obj_t *self, unsigned int freq, ledc_timer_conf
f = 1.0;
}
i = (unsigned int)roundf((float)i / f);
- #endif
unsigned int res = 0;
for (; i > 1; i >>= 1) {
@@ -354,7 +349,7 @@ STATIC void set_duty_u16(machine_pwm_obj_t *self, int duty) {
// See https://github.com/espressif/esp-idf/issues/7288
if (duty != get_duty_u16(self)) {
PWM_DBG("set_duty_u16(%u), get_duty_u16():%u, channel_duty:%d, duty_resolution:%d, freq_hz:%d", duty, get_duty_u16(self), channel_duty, timer.duty_resolution, timer.freq_hz);
- ets_delay_us(2 * 1000000 / timer.freq_hz);
+ esp_rom_delay_us(2 * 1000000 / timer.freq_hz);
if (duty != get_duty_u16(self)) {
PWM_DBG("set_duty_u16(%u), get_duty_u16():%u, channel_duty:%d, duty_resolution:%d, freq_hz:%d", duty, get_duty_u16(self), channel_duty, timer.duty_resolution, timer.freq_hz);
}
diff --git a/ports/esp32/machine_sdcard.c b/ports/esp32/machine_sdcard.c
index 5b495f8494..a2d133442f 100644
--- a/ports/esp32/machine_sdcard.c
+++ b/ports/esp32/machine_sdcard.c
@@ -69,6 +69,68 @@ typedef struct _sdcard_obj_t {
#define _SECTOR_SIZE(self) (self->card.csd.sector_size)
+// SPI bus default bus and device configuration.
+
+static const spi_bus_config_t spi_bus_defaults[2] = {
+ {
+ #if CONFIG_IDF_TARGET_ESP32
+ .miso_io_num = GPIO_NUM_19,
+ .mosi_io_num = GPIO_NUM_23,
+ .sclk_io_num = GPIO_NUM_18,
+ #else
+ .miso_io_num = GPIO_NUM_36,
+ .mosi_io_num = GPIO_NUM_35,
+ .sclk_io_num = GPIO_NUM_37,
+ #endif
+ .data2_io_num = GPIO_NUM_NC,
+ .data3_io_num = GPIO_NUM_NC,
+ .data4_io_num = GPIO_NUM_NC,
+ .data5_io_num = GPIO_NUM_NC,
+ .data6_io_num = GPIO_NUM_NC,
+ .data7_io_num = GPIO_NUM_NC,
+ .max_transfer_sz = 4000,
+ .flags = SPICOMMON_BUSFLAG_MASTER | SPICOMMON_BUSFLAG_SCLK | SPICOMMON_BUSFLAG_MISO | SPICOMMON_BUSFLAG_MOSI,
+ .intr_flags = 0,
+ },
+ {
+ .miso_io_num = GPIO_NUM_2,
+ .mosi_io_num = GPIO_NUM_15,
+ .sclk_io_num = GPIO_NUM_14,
+ .data2_io_num = GPIO_NUM_NC,
+ .data3_io_num = GPIO_NUM_NC,
+ .data4_io_num = GPIO_NUM_NC,
+ .data5_io_num = GPIO_NUM_NC,
+ .data6_io_num = GPIO_NUM_NC,
+ .data7_io_num = GPIO_NUM_NC,
+ .max_transfer_sz = 4000,
+ .flags = SPICOMMON_BUSFLAG_MASTER | SPICOMMON_BUSFLAG_SCLK | SPICOMMON_BUSFLAG_MISO | SPICOMMON_BUSFLAG_MOSI,
+ .intr_flags = 0,
+ },
+};
+
+#if CONFIG_IDF_TARGET_ESP32
+static const uint8_t spi_dma_channel_defaults[2] = {
+ 2,
+ 1,
+};
+#endif
+
+static const sdspi_device_config_t spi_dev_defaults[2] = {
+ {
+ #if CONFIG_IDF_TARGET_ESP32
+ .host_id = VSPI_HOST,
+ .gpio_cs = GPIO_NUM_5,
+ #else
+ .host_id = SPI3_HOST,
+ .gpio_cs = GPIO_NUM_34,
+ #endif
+ .gpio_cd = SDSPI_SLOT_NO_CD,
+ .gpio_wp = SDSPI_SLOT_NO_WP,
+ .gpio_int = SDSPI_SLOT_NO_INT,
+ },
+ SDSPI_DEVICE_CONFIG_DEFAULT(), // HSPI (ESP32) / SPI2 (ESP32S3)
+};
+
STATIC gpio_num_t pin_or_int(const mp_obj_t arg) {
if (mp_obj_is_small_int(arg)) {
return MP_OBJ_SMALL_INT_VALUE(arg);
@@ -188,10 +250,11 @@ STATIC mp_obj_t machine_sdcard_make_new(const mp_obj_type_t *type, size_t n_args
}
if (is_spi) {
- #if CONFIG_IDF_TARGET_ESP32S3
- self->host.slot = slot_num ? SPI3_HOST : SPI2_HOST;
- #else
+ // Needs to match spi_dev_defaults above.
+ #if CONFIG_IDF_TARGET_ESP32
self->host.slot = slot_num ? HSPI_HOST : VSPI_HOST;
+ #else
+ self->host.slot = slot_num ? SPI2_HOST : SPI3_HOST;
#endif
}
@@ -202,46 +265,39 @@ STATIC mp_obj_t machine_sdcard_make_new(const mp_obj_type_t *type, size_t n_args
if (is_spi) {
// SPI interface
- #if CONFIG_IDF_TARGET_ESP32S3
- STATIC const sdspi_slot_config_t slot_defaults[2] = {
- {
- .gpio_miso = GPIO_NUM_36,
- .gpio_mosi = GPIO_NUM_35,
- .gpio_sck = GPIO_NUM_37,
- .gpio_cs = GPIO_NUM_34,
- .gpio_cd = SDSPI_SLOT_NO_CD,
- .gpio_wp = SDSPI_SLOT_NO_WP,
- .dma_channel = SPI_DMA_CH_AUTO
- },
- SDSPI_SLOT_CONFIG_DEFAULT()
- };
+ DEBUG_printf(" Setting up SPI slot configuration");
+ spi_host_device_t spi_host_id = self->host.slot;
+ spi_bus_config_t bus_config = spi_bus_defaults[slot_num];
+ #if CONFIG_IDF_TARGET_ESP32
+ spi_dma_chan_t dma_channel = spi_dma_channel_defaults[slot_num];
#else
- STATIC const sdspi_slot_config_t slot_defaults[2] = {
- {
- .gpio_miso = GPIO_NUM_19,
- .gpio_mosi = GPIO_NUM_23,
- .gpio_sck = GPIO_NUM_18,
- .gpio_cs = GPIO_NUM_5,
- .gpio_cd = SDSPI_SLOT_NO_CD,
- .gpio_wp = SDSPI_SLOT_NO_WP,
- .dma_channel = 2
- },
- SDSPI_SLOT_CONFIG_DEFAULT()
- };
+ spi_dma_chan_t dma_channel = SPI_DMA_CH_AUTO;
#endif
+ sdspi_device_config_t dev_config = spi_dev_defaults[slot_num];
- DEBUG_printf(" Setting up SPI slot configuration");
- sdspi_slot_config_t slot_config = slot_defaults[slot_num];
+ SET_CONFIG_PIN(bus_config, miso_io_num, ARG_miso);
+ SET_CONFIG_PIN(bus_config, mosi_io_num, ARG_mosi);
+ SET_CONFIG_PIN(bus_config, sclk_io_num, ARG_sck);
- SET_CONFIG_PIN(slot_config, gpio_cd, ARG_cd);
- SET_CONFIG_PIN(slot_config, gpio_wp, ARG_wp);
- SET_CONFIG_PIN(slot_config, gpio_miso, ARG_miso);
- SET_CONFIG_PIN(slot_config, gpio_mosi, ARG_mosi);
- SET_CONFIG_PIN(slot_config, gpio_sck, ARG_sck);
- SET_CONFIG_PIN(slot_config, gpio_cs, ARG_cs);
+ SET_CONFIG_PIN(dev_config, gpio_cs, ARG_cs);
+ SET_CONFIG_PIN(dev_config, gpio_cd, ARG_cd);
+ SET_CONFIG_PIN(dev_config, gpio_wp, ARG_wp);
- DEBUG_printf(" Calling init_slot()");
- check_esp_err(sdspi_host_init_slot(self->host.slot, &slot_config));
+ DEBUG_printf(" Calling spi_bus_initialize()");
+ check_esp_err(spi_bus_initialize(spi_host_id, &bus_config, dma_channel));
+
+ DEBUG_printf(" Calling sdspi_host_init_device()");
+ sdspi_dev_handle_t sdspi_handle;
+ esp_err_t ret = sdspi_host_init_device(&dev_config, &sdspi_handle);
+ if (ret != ESP_OK) {
+ spi_bus_free(spi_host_id);
+ check_esp_err(ret);
+ }
+ if (self->host.slot != sdspi_handle) {
+ // MicroPython restriction: the SPI bus must be exclusively for the SD card.
+ spi_bus_free(spi_host_id);
+ mp_raise_ValueError(MP_ERROR_TEXT("SPI bus already in use"));
+ }
} else {
// SD/MMC interface
DEBUG_printf(" Setting up SDMMC slot configuration");
@@ -275,12 +331,9 @@ STATIC mp_obj_t sd_deinit(mp_obj_t self_in) {
DEBUG_printf("De-init host\n");
if (self->flags & SDCARD_CARD_FLAGS_HOST_INIT_DONE) {
- #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0)
if (self->host.flags & SDMMC_HOST_FLAG_DEINIT_ARG) {
self->host.deinit_p(self->host.slot);
- } else
- #endif
- {
+ } else {
self->host.deinit();
}
if (self->host.flags & SDMMC_HOST_FLAG_SPI) {
diff --git a/ports/esp32/machine_timer.c b/ports/esp32/machine_timer.c
index c66cb2a48d..5855cfb3e0 100644
--- a/ports/esp32/machine_timer.c
+++ b/ports/esp32/machine_timer.c
@@ -36,16 +36,13 @@
#include "mphalport.h"
#include "driver/timer.h"
-#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 1, 1)
#include "hal/timer_ll.h"
-#define HAVE_TIMER_LL (1)
-#endif
#define TIMER_INTR_SEL TIMER_INTR_LEVEL
#define TIMER_DIVIDER 8
// TIMER_BASE_CLK is normally 80MHz. TIMER_DIVIDER ought to divide this exactly
-#define TIMER_SCALE (TIMER_BASE_CLK / TIMER_DIVIDER)
+#define TIMER_SCALE (APB_CLK_FREQ / TIMER_DIVIDER)
#define TIMER_FLAGS 0
@@ -143,39 +140,14 @@ STATIC void machine_timer_isr(void *self_in) {
machine_timer_obj_t *self = self_in;
timg_dev_t *device = self->group ? &(TIMERG1) : &(TIMERG0);
- #if HAVE_TIMER_LL
-
- #if CONFIG_IDF_TARGET_ESP32 && ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 0, 0)
- device->hw_timer[self->index].update = 1;
- #else
- #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 4, 0)
#if CONFIG_IDF_TARGET_ESP32S3
device->hw_timer[self->index].update.tn_update = 1;
#else
device->hw_timer[self->index].update.tx_update = 1;
#endif
- #else
- device->hw_timer[self->index].update.update = 1;
- #endif
- #endif
+
timer_ll_clear_intr_status(device, self->index);
- #if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 0, 0)
- timer_ll_set_alarm_enable(device, self->index, self->repeat);
- #else
timer_ll_set_alarm_value(device, self->index, self->repeat);
- #endif
-
- #else
-
- device->hw_timer[self->index].update = 1;
- if (self->index) {
- device->int_clr_timers.t1 = 1;
- } else {
- device->int_clr_timers.t0 = 1;
- }
- device->hw_timer[self->index].config.alarm_en = self->repeat;
-
- #endif
mp_sched_schedule(self->callback, self);
mp_hal_wake_main_task_from_isr();
diff --git a/ports/esp32/machine_uart.c b/ports/esp32/machine_uart.c
index 8e6e5788d0..d9b845047b 100644
--- a/ports/esp32/machine_uart.c
+++ b/ports/esp32/machine_uart.c
@@ -37,17 +37,10 @@
#include "modmachine.h"
#include "uart.h"
-#if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 1, 0)
-#define UART_INV_TX UART_INVERSE_TXD
-#define UART_INV_RX UART_INVERSE_RXD
-#define UART_INV_RTS UART_INVERSE_RTS
-#define UART_INV_CTS UART_INVERSE_CTS
-#else
#define UART_INV_TX UART_SIGNAL_TXD_INV
#define UART_INV_RX UART_SIGNAL_RXD_INV
#define UART_INV_RTS UART_SIGNAL_RTS_INV
#define UART_INV_CTS UART_SIGNAL_CTS_INV
-#endif
#define UART_INV_MASK (UART_INV_TX | UART_INV_RX | UART_INV_RTS | UART_INV_CTS)
@@ -273,9 +266,7 @@ STATIC void machine_uart_init_helper(machine_uart_obj_t *self, size_t n_args, co
uint32_t char_time_ms = 12000 / baudrate + 1;
uint32_t rx_timeout = self->timeout_char / char_time_ms;
if (rx_timeout < 1) {
- #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 1, 0)
uart_set_rx_full_threshold(self->uart_num, 1);
- #endif
uart_set_rx_timeout(self->uart_num, 1);
} else {
uart_set_rx_timeout(self->uart_num, rx_timeout);
diff --git a/ports/esp32/machine_wdt.c b/ports/esp32/machine_wdt.c
index 4ccf417b60..2cb6c51817 100644
--- a/ports/esp32/machine_wdt.c
+++ b/ports/esp32/machine_wdt.c
@@ -54,14 +54,16 @@ STATIC mp_obj_t machine_wdt_make_new(const mp_obj_type_t *type_in, size_t n_args
mp_raise_ValueError(NULL);
}
- // Convert milliseconds to seconds (esp_task_wdt_init needs seconds)
- args[ARG_timeout].u_int /= 1000;
-
if (args[ARG_timeout].u_int <= 0) {
mp_raise_ValueError(MP_ERROR_TEXT("WDT timeout too short"));
}
- mp_int_t rs_code = esp_task_wdt_init(args[ARG_timeout].u_int, true);
+ esp_task_wdt_config_t config = {
+ .timeout_ms = args[ARG_timeout].u_int,
+ .idle_core_mask = 0,
+ .trigger_panic = true,
+ };
+ mp_int_t rs_code = esp_task_wdt_reconfigure(&config);
if (rs_code != ESP_OK) {
mp_raise_OSError(rs_code);
}
diff --git a/ports/esp32/main.c b/ports/esp32/main.c
index 3e7c9ee162..b8ba03e513 100644
--- a/ports/esp32/main.c
+++ b/ports/esp32/main.c
@@ -35,16 +35,9 @@
#include "esp_system.h"
#include "nvs_flash.h"
#include "esp_task.h"
-#include "soc/cpu.h"
+#include "esp_event.h"
#include "esp_log.h"
-
-#if CONFIG_IDF_TARGET_ESP32
-#include "esp32/spiram.h"
-#elif CONFIG_IDF_TARGET_ESP32S2
-#include "esp32s2/spiram.h"
-#elif CONFIG_IDF_TARGET_ESP32S3
-#include "esp32s3/spiram.h"
-#endif
+#include "esp_psram.h"
#include "py/stackctrl.h"
#include "py/nlr.h"
@@ -88,11 +81,11 @@ int vprintf_null(const char *format, va_list ap) {
}
void mp_task(void *pvParameter) {
- volatile uint32_t sp = (uint32_t)get_sp();
+ volatile uint32_t sp = (uint32_t)esp_cpu_get_sp();
#if MICROPY_PY_THREAD
mp_thread_init(pxTaskGetStackStart(NULL), MP_TASK_STACK_SIZE / sizeof(uintptr_t));
#endif
- #if CONFIG_USB_ENABLED
+ #if CONFIG_USB_OTG_SUPPORTED
usb_init();
#elif CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG
usb_serial_jtag_init();
@@ -102,50 +95,18 @@ void mp_task(void *pvParameter) {
#endif
machine_init();
- size_t mp_task_heap_size;
- void *mp_task_heap = NULL;
-
- #if CONFIG_SPIRAM_USE_MALLOC
- // SPIRAM is issued using MALLOC, fallback to normal allocation rules
- mp_task_heap = NULL;
- #elif CONFIG_ESP32_SPIRAM_SUPPORT
- // Try to use the entire external SPIRAM directly for the heap
- mp_task_heap = (void *)SOC_EXTRAM_DATA_LOW;
- switch (esp_spiram_get_chip_size()) {
- case ESP_SPIRAM_SIZE_16MBITS:
- mp_task_heap_size = 2 * 1024 * 1024;
- break;
- case ESP_SPIRAM_SIZE_32MBITS:
- case ESP_SPIRAM_SIZE_64MBITS:
- mp_task_heap_size = 4 * 1024 * 1024;
- break;
- default:
- // No SPIRAM, fallback to normal allocation
- mp_task_heap = NULL;
- break;
- }
- #elif CONFIG_ESP32S2_SPIRAM_SUPPORT || CONFIG_ESP32S3_SPIRAM_SUPPORT
- // Try to use the entire external SPIRAM directly for the heap
- size_t esp_spiram_size = esp_spiram_get_size();
- if (esp_spiram_size > 0) {
- mp_task_heap = (void *)SOC_EXTRAM_DATA_HIGH - esp_spiram_size;
- mp_task_heap_size = esp_spiram_size;
+ esp_err_t err = esp_event_loop_create_default();
+ if (err != ESP_OK) {
+ ESP_LOGE("esp_init", "can't create event loop: 0x%x\n", err);
}
- #endif
- if (mp_task_heap == NULL) {
- // Allocate the uPy heap using malloc and get the largest available region,
- // limiting to 1/2 total available memory to leave memory for the OS.
- #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 1, 0)
- size_t heap_total = heap_caps_get_total_size(MALLOC_CAP_8BIT);
- #else
- multi_heap_info_t info;
- heap_caps_get_info(&info, MALLOC_CAP_8BIT);
- size_t heap_total = info.total_free_bytes + info.total_allocated_bytes;
- #endif
- mp_task_heap_size = MIN(heap_caps_get_largest_free_block(MALLOC_CAP_8BIT), heap_total / 2);
- mp_task_heap = malloc(mp_task_heap_size);
- }
+ // Allocate the uPy heap using malloc and get the largest available region,
+ // limiting to 1/2 total available memory to leave memory for the OS.
+ // When SPIRAM is enabled, this will allocate from SPIRAM.
+ uint32_t caps = MALLOC_CAP_8BIT;
+ size_t heap_total = heap_caps_get_total_size(caps);
+ size_t mp_task_heap_size = MIN(heap_caps_get_largest_free_block(caps), heap_total / 2);
+ void *mp_task_heap = heap_caps_malloc(mp_task_heap_size, caps);
soft_reset:
// initialise the stack pointer for the main thread
diff --git a/ports/esp32/main_esp32/CMakeLists.txt b/ports/esp32/main_esp32/CMakeLists.txt
new file mode 100644
index 0000000000..40188abff8
--- /dev/null
+++ b/ports/esp32/main_esp32/CMakeLists.txt
@@ -0,0 +1,11 @@
+# Set location of base MicroPython directory.
+if(NOT MICROPY_DIR)
+ get_filename_component(MICROPY_DIR ${CMAKE_CURRENT_LIST_DIR}/../../.. ABSOLUTE)
+endif()
+
+# Set location of the ESP32 port directory.
+if(NOT MICROPY_PORT_DIR)
+ get_filename_component(MICROPY_PORT_DIR ${MICROPY_DIR}/ports/esp32 ABSOLUTE)
+endif()
+
+include(${MICROPY_PORT_DIR}/esp32_common.cmake)
diff --git a/ports/esp32/main_esp32c3/CMakeLists.txt b/ports/esp32/main_esp32c3/CMakeLists.txt
new file mode 100644
index 0000000000..307c0f3218
--- /dev/null
+++ b/ports/esp32/main_esp32c3/CMakeLists.txt
@@ -0,0 +1,14 @@
+# Set location of base MicroPython directory.
+if(NOT MICROPY_DIR)
+ get_filename_component(MICROPY_DIR ${CMAKE_CURRENT_LIST_DIR}/../../.. ABSOLUTE)
+endif()
+
+# Set location of the ESP32 port directory.
+if(NOT MICROPY_PORT_DIR)
+ get_filename_component(MICROPY_PORT_DIR ${MICROPY_DIR}/ports/esp32 ABSOLUTE)
+endif()
+
+list(APPEND MICROPY_SOURCE_LIB ${MICROPY_DIR}/shared/runtime/gchelper_generic.c)
+list(APPEND IDF_COMPONENTS riscv)
+
+include(${MICROPY_PORT_DIR}/esp32_common.cmake)
diff --git a/ports/esp32/main_esp32s2/CMakeLists.txt b/ports/esp32/main_esp32s2/CMakeLists.txt
new file mode 100644
index 0000000000..40188abff8
--- /dev/null
+++ b/ports/esp32/main_esp32s2/CMakeLists.txt
@@ -0,0 +1,11 @@
+# Set location of base MicroPython directory.
+if(NOT MICROPY_DIR)
+ get_filename_component(MICROPY_DIR ${CMAKE_CURRENT_LIST_DIR}/../../.. ABSOLUTE)
+endif()
+
+# Set location of the ESP32 port directory.
+if(NOT MICROPY_PORT_DIR)
+ get_filename_component(MICROPY_PORT_DIR ${MICROPY_DIR}/ports/esp32 ABSOLUTE)
+endif()
+
+include(${MICROPY_PORT_DIR}/esp32_common.cmake)
diff --git a/ports/esp32/main_esp32s2/idf_component.yml b/ports/esp32/main_esp32s2/idf_component.yml
new file mode 100644
index 0000000000..fe3213bd26
--- /dev/null
+++ b/ports/esp32/main_esp32s2/idf_component.yml
@@ -0,0 +1,5 @@
+## IDF Component Manager Manifest File
+dependencies:
+ idf:
+ version: ">=5.0.2"
+ espressif/esp_tinyusb: "~1.0.0"
diff --git a/ports/esp32/main_esp32s3/CMakeLists.txt b/ports/esp32/main_esp32s3/CMakeLists.txt
new file mode 100644
index 0000000000..40188abff8
--- /dev/null
+++ b/ports/esp32/main_esp32s3/CMakeLists.txt
@@ -0,0 +1,11 @@
+# Set location of base MicroPython directory.
+if(NOT MICROPY_DIR)
+ get_filename_component(MICROPY_DIR ${CMAKE_CURRENT_LIST_DIR}/../../.. ABSOLUTE)
+endif()
+
+# Set location of the ESP32 port directory.
+if(NOT MICROPY_PORT_DIR)
+ get_filename_component(MICROPY_PORT_DIR ${MICROPY_DIR}/ports/esp32 ABSOLUTE)
+endif()
+
+include(${MICROPY_PORT_DIR}/esp32_common.cmake)
diff --git a/ports/esp32/main_esp32s3/idf_component.yml b/ports/esp32/main_esp32s3/idf_component.yml
new file mode 100644
index 0000000000..fe3213bd26
--- /dev/null
+++ b/ports/esp32/main_esp32s3/idf_component.yml
@@ -0,0 +1,5 @@
+## IDF Component Manager Manifest File
+dependencies:
+ idf:
+ version: ">=5.0.2"
+ espressif/esp_tinyusb: "~1.0.0"
diff --git a/ports/esp32/modesp.c b/ports/esp32/modesp.c
index f125b614bd..4726ce5874 100644
--- a/ports/esp32/modesp.c
+++ b/ports/esp32/modesp.c
@@ -29,8 +29,8 @@
#include <stdio.h>
+#include "esp_flash.h"
#include "esp_log.h"
-#include "esp_spi_flash.h"
#include "py/runtime.h"
#include "py/mperrno.h"
@@ -53,33 +53,33 @@ STATIC mp_obj_t esp_osdebug(size_t n_args, const mp_obj_t *args) {
}
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(esp_osdebug_obj, 1, 2, esp_osdebug);
-STATIC mp_obj_t esp_flash_read(mp_obj_t offset_in, mp_obj_t buf_in) {
+STATIC mp_obj_t esp_flash_read_(mp_obj_t offset_in, mp_obj_t buf_in) {
mp_int_t offset = mp_obj_get_int(offset_in);
mp_buffer_info_t bufinfo;
mp_get_buffer_raise(buf_in, &bufinfo, MP_BUFFER_WRITE);
- esp_err_t res = spi_flash_read(offset, bufinfo.buf, bufinfo.len);
+ esp_err_t res = esp_flash_read(NULL, bufinfo.buf, offset, bufinfo.len);
if (res != ESP_OK) {
mp_raise_OSError(MP_EIO);
}
return mp_const_none;
}
-STATIC MP_DEFINE_CONST_FUN_OBJ_2(esp_flash_read_obj, esp_flash_read);
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(esp_flash_read_obj, esp_flash_read_);
-STATIC mp_obj_t esp_flash_write(mp_obj_t offset_in, mp_obj_t buf_in) {
+STATIC mp_obj_t esp_flash_write_(mp_obj_t offset_in, mp_obj_t buf_in) {
mp_int_t offset = mp_obj_get_int(offset_in);
mp_buffer_info_t bufinfo;
mp_get_buffer_raise(buf_in, &bufinfo, MP_BUFFER_READ);
- esp_err_t res = spi_flash_write(offset, bufinfo.buf, bufinfo.len);
+ esp_err_t res = esp_flash_write(NULL, bufinfo.buf, offset, bufinfo.len);
if (res != ESP_OK) {
mp_raise_OSError(MP_EIO);
}
return mp_const_none;
}
-STATIC MP_DEFINE_CONST_FUN_OBJ_2(esp_flash_write_obj, esp_flash_write);
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(esp_flash_write_obj, esp_flash_write_);
STATIC mp_obj_t esp_flash_erase(mp_obj_t sector_in) {
mp_int_t sector = mp_obj_get_int(sector_in);
- esp_err_t res = spi_flash_erase_sector(sector);
+ esp_err_t res = esp_flash_erase_region(NULL, sector * 4096, 4096);
if (res != ESP_OK) {
mp_raise_OSError(MP_EIO);
}
@@ -88,7 +88,9 @@ STATIC mp_obj_t esp_flash_erase(mp_obj_t sector_in) {
STATIC MP_DEFINE_CONST_FUN_OBJ_1(esp_flash_erase_obj, esp_flash_erase);
STATIC mp_obj_t esp_flash_size(void) {
- return mp_obj_new_int_from_uint(spi_flash_get_chip_size());
+ uint32_t size;
+ esp_flash_get_size(NULL, &size);
+ return mp_obj_new_int_from_uint(size);
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(esp_flash_size_obj, esp_flash_size);
@@ -98,14 +100,14 @@ STATIC mp_obj_t esp_flash_user_start(void) {
STATIC MP_DEFINE_CONST_FUN_OBJ_0(esp_flash_user_start_obj, esp_flash_user_start);
STATIC mp_obj_t esp_gpio_matrix_in(mp_obj_t pin, mp_obj_t sig, mp_obj_t inv) {
- gpio_matrix_in(mp_obj_get_int(pin), mp_obj_get_int(sig), mp_obj_get_int(inv));
+ esp_rom_gpio_connect_in_signal(mp_obj_get_int(pin), mp_obj_get_int(sig), mp_obj_get_int(inv));
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_3(esp_gpio_matrix_in_obj, esp_gpio_matrix_in);
STATIC mp_obj_t esp_gpio_matrix_out(size_t n_args, const mp_obj_t *args) {
(void)n_args;
- gpio_matrix_out(mp_obj_get_int(args[0]), mp_obj_get_int(args[1]), mp_obj_get_int(args[2]), mp_obj_get_int(args[3]));
+ esp_rom_gpio_connect_out_signal(mp_obj_get_int(args[0]), mp_obj_get_int(args[1]), mp_obj_get_int(args[2]), mp_obj_get_int(args[3]));
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(esp_gpio_matrix_out_obj, 4, 4, esp_gpio_matrix_out);
diff --git a/ports/esp32/modesp32.c b/ports/esp32/modesp32.c
index a18ca4c137..ef3ad0b76d 100644
--- a/ports/esp32/modesp32.c
+++ b/ports/esp32/modesp32.c
@@ -45,10 +45,8 @@
#include "modesp32.h"
// These private includes are needed for idf_heap_info.
-#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 3, 0)
#define MULTI_HEAP_FREERTOS
#include "../multi_heap_platform.h"
-#endif
#include "../heap_private.h"
STATIC mp_obj_t esp32_wake_on_touch(const mp_obj_t wake) {
@@ -161,9 +159,9 @@ STATIC mp_obj_t esp32_raw_temperature(void) {
CLEAR_PERI_REG_MASK(SENS_SAR_TSENS_CTRL_REG, SENS_TSENS_DUMP_OUT);
SET_PERI_REG_MASK(SENS_SAR_TSENS_CTRL_REG, SENS_TSENS_POWER_UP_FORCE);
SET_PERI_REG_MASK(SENS_SAR_TSENS_CTRL_REG, SENS_TSENS_POWER_UP);
- ets_delay_us(100);
+ esp_rom_delay_us(100);
SET_PERI_REG_MASK(SENS_SAR_TSENS_CTRL_REG, SENS_TSENS_DUMP_OUT);
- ets_delay_us(5);
+ esp_rom_delay_us(5);
int res = GET_PERI_REG_BITS2(SENS_SAR_SLAVE_ADDR3_REG, SENS_TSENS_OUT, SENS_TSENS_OUT_S);
return mp_obj_new_int(res);
diff --git a/ports/esp32/modespnow.c b/ports/esp32/modespnow.c
index c71201e9b7..c94fc81708 100644
--- a/ports/esp32/modespnow.c
+++ b/ports/esp32/modespnow.c
@@ -179,7 +179,7 @@ STATIC mp_obj_t espnow_make_new(const mp_obj_type_t *type, size_t n_args,
// Forward declare the send and recv ESPNow callbacks
STATIC void send_cb(const uint8_t *mac_addr, esp_now_send_status_t status);
-STATIC void recv_cb(const uint8_t *mac_addr, const uint8_t *data, int len);
+STATIC void recv_cb(const esp_now_recv_info_t *recv_info, const uint8_t *msg, int msg_len);
// ESPNow.init(): Initialise the data buffers and ESP-NOW functions.
// Initialise the Espressif ESPNOW software stack, register callbacks and
@@ -254,13 +254,9 @@ STATIC mp_obj_t espnow_config(size_t n_args, const mp_obj_t *pos_args, mp_map_t
self->recv_timeout_ms = args[ARG_timeout_ms].u_int;
}
if (args[ARG_rate].u_int >= 0) {
- #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 3, 0)
esp_initialise_wifi(); // Call the wifi init code in network_wlan.c
check_esp_err(esp_wifi_config_espnow_rate(ESP_IF_WIFI_STA, args[ARG_rate].u_int));
check_esp_err(esp_wifi_config_espnow_rate(ESP_IF_WIFI_AP, args[ARG_rate].u_int));
- #else
- mp_raise_ValueError(MP_ERROR_TEXT("rate option not supported"));
- #endif
}
if (args[ARG_get].u_obj == MP_OBJ_NULL) {
return mp_const_none;
@@ -329,11 +325,7 @@ static inline int8_t _get_rssi_from_wifi_pkt(const uint8_t *msg) {
(wifi_promiscuous_pkt_t *)(msg - sizeof_espnow_frame_format -
sizeof(wifi_promiscuous_pkt_t));
- #if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0)
- return wifi_pkt->rx_ctrl.rssi - 100; // Offset rssi for IDF 4.0.2
- #else
return wifi_pkt->rx_ctrl.rssi;
- #endif
}
// Lookup a peer in the peers table and return a reference to the item in the
@@ -573,7 +565,7 @@ STATIC void send_cb(const uint8_t *mac_addr, esp_now_send_status_t status) {
// ESPNow packet.
// If the buffer is full, drop the message and increment the dropped count.
// Schedules the user callback if one has been registered (ESPNow.config()).
-STATIC void recv_cb(const uint8_t *mac_addr, const uint8_t *msg, int msg_len) {
+STATIC void recv_cb(const esp_now_recv_info_t *recv_info, const uint8_t *msg, int msg_len) {
esp_espnow_obj_t *self = _get_singleton();
ringbuf_t *buf = self->recv_buffer;
// TODO: Test this works with ">".
@@ -590,7 +582,7 @@ STATIC void recv_cb(const uint8_t *mac_addr, const uint8_t *msg, int msg_len) {
#endif // MICROPY_ESPNOW_RSSI
ringbuf_put_bytes(buf, (uint8_t *)&header, sizeof(header));
- ringbuf_put_bytes(buf, mac_addr, ESP_NOW_ETH_ALEN);
+ ringbuf_put_bytes(buf, recv_info->src_addr, ESP_NOW_ETH_ALEN);
ringbuf_put_bytes(buf, msg, msg_len);
self->rx_packets++;
if (self->recv_cb != mp_const_none) {
diff --git a/ports/esp32/modmachine.c b/ports/esp32/modmachine.c
index fc19618b73..01acb01029 100644
--- a/ports/esp32/modmachine.c
+++ b/ports/esp32/modmachine.c
@@ -32,20 +32,10 @@
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
+#include "esp_mac.h"
#include "esp_sleep.h"
#include "esp_pm.h"
-#if CONFIG_IDF_TARGET_ESP32
-#include "esp32/rom/rtc.h"
-#include "esp32/clk.h"
-#elif CONFIG_IDF_TARGET_ESP32S2
-#include "esp32s2/rom/rtc.h"
-#include "esp32s2/clk.h"
-#elif CONFIG_IDF_TARGET_ESP32S3
-#include "esp32s3/rom/rtc.h"
-#include "esp32s3/clk.h"
-#endif
-
#include "py/obj.h"
#include "py/runtime.h"
#include "shared/runtime/pyexec.h"
@@ -79,7 +69,7 @@ int esp_clk_cpu_freq(void);
STATIC mp_obj_t machine_freq(size_t n_args, const mp_obj_t *args) {
if (n_args == 0) {
// get
- return mp_obj_new_int(esp_clk_cpu_freq());
+ return mp_obj_new_int(esp_rom_get_cpu_ticks_per_us() * 1000000);
} else {
// set
mp_int_t freq = mp_obj_get_int(args[0]) / 1000000;
@@ -110,7 +100,7 @@ STATIC mp_obj_t machine_freq(size_t n_args, const mp_obj_t *args) {
if (ret != ESP_OK) {
mp_raise_ValueError(NULL);
}
- while (esp_clk_cpu_freq() != freq * 1000000) {
+ while (esp_rom_get_cpu_ticks_per_us() != freq) {
vTaskDelay(1);
}
return mp_const_none;
diff --git a/ports/esp32/modnetwork.h b/ports/esp32/modnetwork.h
index ac6321d8f6..b1b3fc368a 100644
--- a/ports/esp32/modnetwork.h
+++ b/ports/esp32/modnetwork.h
@@ -26,7 +26,7 @@
#ifndef MICROPY_INCLUDED_ESP32_MODNETWORK_H
#define MICROPY_INCLUDED_ESP32_MODNETWORK_H
-#include "esp_event.h"
+#include "esp_netif.h"
enum { PHY_LAN8710, PHY_LAN8720, PHY_IP101, PHY_RTL8201, PHY_DP83848, PHY_KSZ8041, PHY_KSZ8081, PHY_KSZ8851SNL = 100, PHY_DM9051, PHY_W5500 };
#define IS_SPI_PHY(NUM) (NUM >= 100)
@@ -40,10 +40,11 @@ enum {
STAT_GOT_IP = 1010,
};
-typedef struct _wlan_if_obj_t {
+typedef struct _base_if_obj_t {
mp_obj_base_t base;
- int if_id;
-} wlan_if_obj_t;
+ esp_interface_t if_id;
+ esp_netif_t *netif;
+} base_if_obj_t;
extern const mp_obj_type_t esp_network_wlan_type;
@@ -64,7 +65,6 @@ static inline void esp_exceptions(esp_err_t e) {
}
void socket_events_deinit(void);
-void network_wlan_event_handler(system_event_t *event);
void esp_initialise_wifi(void);
#endif
diff --git a/ports/esp32/modnetwork_globals.h b/ports/esp32/modnetwork_globals.h
index 1f657fb5c8..7326d453be 100644
--- a/ports/esp32/modnetwork_globals.h
+++ b/ports/esp32/modnetwork_globals.h
@@ -27,9 +27,8 @@
{ MP_ROM_QSTR(MP_QSTR_AUTH_WPA2_ENTERPRISE), MP_ROM_INT(WIFI_AUTH_WPA2_ENTERPRISE) },
{ MP_ROM_QSTR(MP_QSTR_AUTH_WPA3_PSK), MP_ROM_INT(WIFI_AUTH_WPA3_PSK) },
{ MP_ROM_QSTR(MP_QSTR_AUTH_WPA2_WPA3_PSK), MP_ROM_INT(WIFI_AUTH_WPA2_WPA3_PSK) },
-#if ESP_IDF_VERSION > ESP_IDF_VERSION_VAL(4, 3, 0)
{ MP_ROM_QSTR(MP_QSTR_AUTH_WAPI_PSK), MP_ROM_INT(WIFI_AUTH_WAPI_PSK) },
-#endif
+{ MP_ROM_QSTR(MP_QSTR_AUTH_OWE), MP_ROM_INT(WIFI_AUTH_OWE) },
{ MP_ROM_QSTR(MP_QSTR_AUTH_MAX), MP_ROM_INT(WIFI_AUTH_MAX) },
#endif
@@ -39,14 +38,8 @@
{ MP_ROM_QSTR(MP_QSTR_PHY_IP101), MP_ROM_INT(PHY_IP101) },
{ MP_ROM_QSTR(MP_QSTR_PHY_RTL8201), MP_ROM_INT(PHY_RTL8201) },
{ MP_ROM_QSTR(MP_QSTR_PHY_DP83848), MP_ROM_INT(PHY_DP83848) },
-#if ESP_IDF_VERSION_MINOR >= 3
-// PHY_KSZ8041 is new in ESP-IDF v4.3
{ MP_ROM_QSTR(MP_QSTR_PHY_KSZ8041), MP_ROM_INT(PHY_KSZ8041) },
-#endif
-#if ESP_IDF_VERSION_MINOR >= 4
-// PHY_KSZ8081 is new in ESP-IDF v4.4
{ MP_ROM_QSTR(MP_QSTR_PHY_KSZ8081), MP_ROM_INT(PHY_KSZ8081) },
-#endif
#if CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL
{ MP_ROM_QSTR(MP_QSTR_PHY_KSZ8851SNL), MP_ROM_INT(PHY_KSZ8851SNL) },
diff --git a/ports/esp32/modsocket.c b/ports/esp32/modsocket.c
index 731f69fbc2..7484fce786 100644
--- a/ports/esp32/modsocket.c
+++ b/ports/esp32/modsocket.c
@@ -46,7 +46,6 @@
#include "py/stream.h"
#include "py/mperrno.h"
#include "shared/netutils/netutils.h"
-#include "mdns.h"
#include "modnetwork.h"
#include "lwip/sockets.h"
@@ -164,11 +163,7 @@ static int _socket_getaddrinfo3(const char *nodename, const char *servname,
memcpy(nodename_no_local, nodename, nodename_len - local_len);
nodename_no_local[nodename_len - local_len] = '\0';
- #if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 1, 0)
- struct ip4_addr addr = {0};
- #else
esp_ip4_addr_t addr = {0};
- #endif
esp_err_t err = mdns_query_a(nodename_no_local, MDNS_QUERY_TIMEOUT_MS, &addr);
if (err != ESP_OK) {
@@ -836,7 +831,7 @@ STATIC mp_obj_t esp_socket_initialize() {
static int initialized = 0;
if (!initialized) {
ESP_LOGI("modsocket", "Initializing");
- tcpip_adapter_init();
+ esp_netif_init();
initialized = 1;
}
return mp_const_none;
diff --git a/ports/esp32/mpconfigport.h b/ports/esp32/mpconfigport.h
index f81ad58fa1..b18681bb57 100644
--- a/ports/esp32/mpconfigport.h
+++ b/ports/esp32/mpconfigport.h
@@ -6,9 +6,11 @@
#include <stdint.h>
#include <alloca.h>
+#include "esp_random.h"
#include "esp_system.h"
#include "freertos/FreeRTOS.h"
#include "driver/i2s.h"
+#include "esp_wifi_types.h"
#ifndef MICROPY_CONFIG_ROM_LEVEL
#define MICROPY_CONFIG_ROM_LEVEL (MICROPY_CONFIG_ROM_LEVEL_EXTRA_FEATURES)
@@ -131,7 +133,7 @@
#define MICROPY_HW_ENABLE_SDCARD (1)
#endif
#define MICROPY_HW_SOFTSPI_MIN_DELAY (0)
-#define MICROPY_HW_SOFTSPI_MAX_BAUDRATE (ets_get_cpu_frequency() * 1000000 / 200) // roughly
+#define MICROPY_HW_SOFTSPI_MAX_BAUDRATE (esp_rom_get_cpu_ticks_per_us() * 1000000 / 200) // roughly
#define MICROPY_PY_SSL (1)
#define MICROPY_SSL_MBEDTLS (1)
#define MICROPY_PY_SSL_FINALISER (1)
@@ -162,8 +164,8 @@ void *esp_native_code_commit(void *, size_t, void *);
// the only disable interrupts on the current CPU. To full manage exclusion
// one should use portENTER_CRITICAL/portEXIT_CRITICAL instead.
#include "freertos/FreeRTOS.h"
-#define MICROPY_BEGIN_ATOMIC_SECTION() portENTER_CRITICAL_NESTED()
-#define MICROPY_END_ATOMIC_SECTION(state) portEXIT_CRITICAL_NESTED(state)
+#define MICROPY_BEGIN_ATOMIC_SECTION() portSET_INTERRUPT_MASK_FROM_ISR()
+#define MICROPY_END_ATOMIC_SECTION(state) portCLEAR_INTERRUPT_MASK_FROM_ISR(state)
#if MICROPY_PY_SOCKET_EVENTS
#define MICROPY_PY_SOCKET_EVENTS_HANDLER extern void socket_events_handler(void); socket_events_handler();
@@ -219,11 +221,11 @@ typedef long mp_off_t;
#endif
#ifndef MICROPY_HW_ENABLE_MDNS_QUERIES
-#define MICROPY_HW_ENABLE_MDNS_QUERIES (1)
+#define MICROPY_HW_ENABLE_MDNS_QUERIES (0)
#endif
#ifndef MICROPY_HW_ENABLE_MDNS_RESPONDER
-#define MICROPY_HW_ENABLE_MDNS_RESPONDER (1)
+#define MICROPY_HW_ENABLE_MDNS_RESPONDER (0)
#endif
#ifndef MICROPY_BOARD_STARTUP
@@ -233,7 +235,7 @@ typedef long mp_off_t;
void boardctrl_startup(void);
#ifndef MICROPY_PY_NETWORK_LAN
-#if (ESP_IDF_VERSION_MAJOR == 4) && (ESP_IDF_VERSION_MINOR >= 1) && (CONFIG_IDF_TARGET_ESP32 || (CONFIG_ETH_USE_SPI_ETHERNET && (CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL || CONFIG_ETH_SPI_ETHERNET_DM9051 || CONFIG_ETH_SPI_ETHERNET_W5500)))
+#if CONFIG_IDF_TARGET_ESP32 || (CONFIG_ETH_USE_SPI_ETHERNET && (CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL || CONFIG_ETH_SPI_ETHERNET_DM9051 || CONFIG_ETH_SPI_ETHERNET_W5500))
#define MICROPY_PY_NETWORK_LAN (1)
#else
#define MICROPY_PY_NETWORK_LAN (0)
diff --git a/ports/esp32/mphalport.c b/ports/esp32/mphalport.c
index 4c8fa012f4..63a674c24b 100644
--- a/ports/esp32/mphalport.c
+++ b/ports/esp32/mphalport.c
@@ -32,6 +32,7 @@
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
+#include "esp_timer.h"
#include "py/obj.h"
#include "py/objstr.h"
@@ -110,7 +111,7 @@ void mp_hal_stdout_tx_strn(const char *str, size_t len) {
if (release_gil) {
MP_THREAD_GIL_EXIT();
}
- #if CONFIG_USB_ENABLED
+ #if CONFIG_USB_OTG_SUPPORTED
usb_tx_strn(str, len);
#elif CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG
usb_serial_jtag_tx_strn(str, len);
diff --git a/ports/esp32/mphalport.h b/ports/esp32/mphalport.h
index 672fa306f5..4f25b3d4fd 100644
--- a/ports/esp32/mphalport.h
+++ b/ports/esp32/mphalport.h
@@ -46,10 +46,8 @@
// See https://github.com/micropython/micropython/issues/5489 for history
#if CONFIG_FREERTOS_UNICORE
#define MP_TASK_COREID (0)
-#elif ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0)
-#define MP_TASK_COREID (1)
#else
-#define MP_TASK_COREID (0)
+#define MP_TASK_COREID (1)
#endif
extern TaskHandle_t mp_main_task_handle;
@@ -71,7 +69,7 @@ __attribute__((always_inline)) static inline uint32_t mp_hal_ticks_cpu(void) {
}
void mp_hal_delay_us(uint32_t);
-#define mp_hal_delay_us_fast(us) ets_delay_us(us)
+#define mp_hal_delay_us_fast(us) esp_rom_delay_us(us)
void mp_hal_set_interrupt_char(int c);
uint32_t mp_hal_get_cpu_freq(void);
@@ -91,15 +89,15 @@ mp_hal_pin_obj_t machine_pin_get_id(mp_obj_t pin_in);
#define mp_obj_get_pin(o) machine_pin_get_id(o) // legacy name; only to support esp8266/modonewire
#define mp_hal_pin_name(p) (p)
static inline void mp_hal_pin_input(mp_hal_pin_obj_t pin) {
- gpio_pad_select_gpio(pin);
+ esp_rom_gpio_pad_select_gpio(pin);
gpio_set_direction(pin, GPIO_MODE_INPUT);
}
static inline void mp_hal_pin_output(mp_hal_pin_obj_t pin) {
- gpio_pad_select_gpio(pin);
+ esp_rom_gpio_pad_select_gpio(pin);
gpio_set_direction(pin, GPIO_MODE_INPUT_OUTPUT);
}
static inline void mp_hal_pin_open_drain(mp_hal_pin_obj_t pin) {
- gpio_pad_select_gpio(pin);
+ esp_rom_gpio_pad_select_gpio(pin);
gpio_set_direction(pin, GPIO_MODE_INPUT_OUTPUT_OD);
}
static inline void mp_hal_pin_od_low(mp_hal_pin_obj_t pin) {
diff --git a/ports/esp32/mpnimbleport.c b/ports/esp32/mpnimbleport.c
index a58fcbdbf4..8235275be6 100644
--- a/ports/esp32/mpnimbleport.c
+++ b/ports/esp32/mpnimbleport.c
@@ -46,13 +46,13 @@ STATIC void ble_host_task(void *param) {
void mp_bluetooth_nimble_port_hci_init(void) {
DEBUG_printf("mp_bluetooth_nimble_port_hci_init\n");
- esp_nimble_hci_and_controller_init();
+ esp_nimble_hci_init();
}
void mp_bluetooth_nimble_port_hci_deinit(void) {
DEBUG_printf("mp_bluetooth_nimble_port_hci_deinit\n");
- esp_nimble_hci_and_controller_deinit();
+ esp_nimble_hci_deinit();
}
void mp_bluetooth_nimble_port_start(void) {
diff --git a/ports/esp32/network_common.c b/ports/esp32/network_common.c
index 1e76d679db..082943e2ae 100644
--- a/ports/esp32/network_common.c
+++ b/ports/esp32/network_common.c
@@ -38,15 +38,10 @@
#include "shared/netutils/netutils.h"
#include "modnetwork.h"
-#include "esp_wifi.h"
#include "esp_log.h"
-#include "lwip/dns.h"
-
-#if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 1, 0)
-#define DNS_MAIN TCPIP_ADAPTER_DNS_MAIN
-#else
-#define DNS_MAIN ESP_NETIF_DNS_MAIN
-#endif
+#include "esp_netif.h"
+#include "esp_wifi.h"
+// #include "lwip/dns.h"
NORETURN void esp_exceptions_helper(esp_err_t e) {
switch (e) {
@@ -80,64 +75,15 @@ NORETURN void esp_exceptions_helper(esp_err_t e) {
mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("Wifi Would Block"));
case ESP_ERR_WIFI_NOT_CONNECT:
mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("Wifi Not Connected"));
- case ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS:
- mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("TCP/IP Invalid Parameters"));
- case ESP_ERR_TCPIP_ADAPTER_IF_NOT_READY:
- mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("TCP/IP IF Not Ready"));
- case ESP_ERR_TCPIP_ADAPTER_DHCPC_START_FAILED:
- mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("TCP/IP DHCP Client Start Failed"));
- case ESP_ERR_TCPIP_ADAPTER_NO_MEM:
- mp_raise_OSError(MP_ENOMEM);
default:
mp_raise_msg_varg(&mp_type_RuntimeError, MP_ERROR_TEXT("Wifi Unknown Error 0x%04x"), e);
}
}
-// This function is called by the system-event task and so runs in a different
-// thread to the main MicroPython task. It must not raise any Python exceptions.
-static esp_err_t event_handler(void *ctx, system_event_t *event) {
- switch (event->event_id) {
- #if MICROPY_PY_NETWORK_WLAN
- case SYSTEM_EVENT_STA_START:
- case SYSTEM_EVENT_STA_CONNECTED:
- case SYSTEM_EVENT_STA_GOT_IP:
- case SYSTEM_EVENT_STA_DISCONNECTED:
- network_wlan_event_handler(event);
- break;
- #endif
- case SYSTEM_EVENT_GOT_IP6:
- ESP_LOGI("network", "Got IPv6");
- break;
- case SYSTEM_EVENT_ETH_START:
- ESP_LOGI("ethernet", "start");
- break;
- case SYSTEM_EVENT_ETH_STOP:
- ESP_LOGI("ethernet", "stop");
- break;
- case SYSTEM_EVENT_ETH_CONNECTED:
- ESP_LOGI("ethernet", "LAN cable connected");
- break;
- case SYSTEM_EVENT_ETH_DISCONNECTED:
- ESP_LOGI("ethernet", "LAN cable disconnected");
- break;
- case SYSTEM_EVENT_ETH_GOT_IP:
- ESP_LOGI("ethernet", "Got IP");
- break;
- default:
- ESP_LOGI("network", "event %d", event->event_id);
- break;
- }
- return ESP_OK;
-}
-
STATIC mp_obj_t esp_initialize() {
static int initialized = 0;
if (!initialized) {
- ESP_LOGD("modnetwork", "Initializing TCP/IP");
- tcpip_adapter_init();
- ESP_LOGD("modnetwork", "Initializing Event Loop");
- esp_exceptions(esp_event_loop_init(event_handler, NULL));
- ESP_LOGD("modnetwork", "esp_event_loop_init done");
+ esp_exceptions(esp_netif_init());
initialized = 1;
}
return mp_const_none;
@@ -145,11 +91,11 @@ STATIC mp_obj_t esp_initialize() {
MP_DEFINE_CONST_FUN_OBJ_0(esp_network_initialize_obj, esp_initialize);
STATIC mp_obj_t esp_ifconfig(size_t n_args, const mp_obj_t *args) {
- wlan_if_obj_t *self = MP_OBJ_TO_PTR(args[0]);
- tcpip_adapter_ip_info_t info;
- tcpip_adapter_dns_info_t dns_info;
- tcpip_adapter_get_ip_info(self->if_id, &info);
- tcpip_adapter_get_dns_info(self->if_id, DNS_MAIN, &dns_info);
+ base_if_obj_t *self = MP_OBJ_TO_PTR(args[0]);
+ esp_netif_ip_info_t info;
+ esp_netif_dns_info_t dns_info;
+ esp_netif_get_ip_info(self->netif, &info);
+ esp_netif_get_dns_info(self->netif, ESP_NETIF_DNS_MAIN, &dns_info);
if (n_args == 1) {
// get
mp_obj_t tuple[4] = {
@@ -171,36 +117,36 @@ STATIC mp_obj_t esp_ifconfig(size_t n_args, const mp_obj_t *args) {
// 16 -> 255.255.0.0
// etc...
uint32_t *m = (uint32_t *)&info.netmask;
- *m = htonl(0xffffffff << (32 - mp_obj_get_int(items[1])));
+ *m = esp_netif_htonl(0xffffffff << (32 - mp_obj_get_int(items[1])));
} else {
netutils_parse_ipv4_addr(items[1], (void *)&info.netmask, NETUTILS_BIG);
}
netutils_parse_ipv4_addr(items[2], (void *)&info.gw, NETUTILS_BIG);
netutils_parse_ipv4_addr(items[3], (void *)&dns_info.ip, NETUTILS_BIG);
// To set a static IP we have to disable DHCP first
- if (self->if_id == WIFI_IF_STA || self->if_id == ESP_IF_ETH) {
- esp_err_t e = tcpip_adapter_dhcpc_stop(self->if_id);
- if (e != ESP_OK && e != ESP_ERR_TCPIP_ADAPTER_DHCP_ALREADY_STOPPED) {
+ if (self->if_id == ESP_IF_WIFI_STA || self->if_id == ESP_IF_ETH) {
+ esp_err_t e = esp_netif_dhcpc_stop(self->netif);
+ if (e != ESP_OK && e != ESP_ERR_ESP_NETIF_DHCP_ALREADY_STOPPED) {
esp_exceptions_helper(e);
}
- esp_exceptions(tcpip_adapter_set_ip_info(self->if_id, &info));
- esp_exceptions(tcpip_adapter_set_dns_info(self->if_id, DNS_MAIN, &dns_info));
- } else if (self->if_id == WIFI_IF_AP) {
- esp_err_t e = tcpip_adapter_dhcps_stop(WIFI_IF_AP);
- if (e != ESP_OK && e != ESP_ERR_TCPIP_ADAPTER_DHCP_ALREADY_STOPPED) {
+ esp_exceptions(esp_netif_set_ip_info(self->netif, &info));
+ esp_exceptions(esp_netif_set_dns_info(self->netif, ESP_NETIF_DNS_MAIN, &dns_info));
+ } else if (self->if_id == ESP_IF_WIFI_AP) {
+ esp_err_t e = esp_netif_dhcps_stop(self->netif);
+ if (e != ESP_OK && e != ESP_ERR_ESP_NETIF_DHCP_ALREADY_STOPPED) {
esp_exceptions_helper(e);
}
- esp_exceptions(tcpip_adapter_set_ip_info(WIFI_IF_AP, &info));
- esp_exceptions(tcpip_adapter_set_dns_info(WIFI_IF_AP, DNS_MAIN, &dns_info));
- esp_exceptions(tcpip_adapter_dhcps_start(WIFI_IF_AP));
+ esp_exceptions(esp_netif_set_ip_info(self->netif, &info));
+ esp_exceptions(esp_netif_set_dns_info(self->netif, ESP_NETIF_DNS_MAIN, &dns_info));
+ esp_exceptions(esp_netif_dhcps_start(self->netif));
}
} else {
// check for the correct string
const char *mode = mp_obj_str_get_str(args[1]);
- if ((self->if_id != WIFI_IF_STA && self->if_id != ESP_IF_ETH) || strcmp("dhcp", mode)) {
+ if ((self->if_id != ESP_IF_WIFI_STA && self->if_id != ESP_IF_ETH) || strcmp("dhcp", mode)) {
mp_raise_ValueError(MP_ERROR_TEXT("invalid arguments"));
}
- esp_exceptions(tcpip_adapter_dhcpc_start(self->if_id));
+ esp_exceptions(esp_netif_dhcpc_start(self->netif));
}
return mp_const_none;
}
@@ -212,9 +158,4 @@ STATIC mp_obj_t esp_phy_mode(size_t n_args, const mp_obj_t *args) {
}
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(esp_network_phy_mode_obj, 0, 1, esp_phy_mode);
-#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 3, 0)
-#define TEST_WIFI_AUTH_MAX 9
-#else
-#define TEST_WIFI_AUTH_MAX 8
-#endif
-_Static_assert(WIFI_AUTH_MAX == TEST_WIFI_AUTH_MAX, "Synchronize WIFI_AUTH_XXX constants with the ESP-IDF. Look at esp-idf/components/esp_wifi/include/esp_wifi_types.h");
+_Static_assert(WIFI_AUTH_MAX == 10, "Synchronize WIFI_AUTH_XXX constants with the ESP-IDF. Look at esp-idf/components/esp_wifi/include/esp_wifi_types.h");
diff --git a/ports/esp32/network_lan.c b/ports/esp32/network_lan.c
index 9b7a31cc4f..8128eb5e11 100644
--- a/ports/esp32/network_lan.c
+++ b/ports/esp32/network_lan.c
@@ -32,7 +32,6 @@
#include "esp_idf_version.h"
-// LAN only for ESP32 (not ESP32S2) and only for ESP-IDF v4.1 and higher
#if MICROPY_PY_NETWORK_LAN
#include "esp_eth.h"
@@ -47,8 +46,7 @@
#include "modnetwork.h"
typedef struct _lan_if_obj_t {
- mp_obj_base_t base;
- int if_id; // MUST BE FIRST to match wlan_if_obj_t
+ base_if_obj_t base;
bool initialized;
bool active;
int8_t mdc_pin;
@@ -59,12 +57,11 @@ typedef struct _lan_if_obj_t {
uint8_t phy_addr;
uint8_t phy_type;
esp_eth_phy_t *phy;
- esp_netif_t *eth_netif;
esp_eth_handle_t eth_handle;
} lan_if_obj_t;
const mp_obj_type_t lan_if_type;
-STATIC lan_if_obj_t lan_obj = {{&lan_if_type}, ESP_IF_ETH, false, false};
+STATIC lan_if_obj_t lan_obj = {{{&lan_if_type}, ESP_IF_ETH, NULL}, false, false};
STATIC uint8_t eth_status = 0;
static void eth_event_handler(void *arg, esp_event_base_t event_base,
@@ -114,11 +111,8 @@ STATIC mp_obj_t get_lan(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_ar
{ MP_QSTR_spi, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
{ MP_QSTR_cs, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
{ MP_QSTR_int, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
- #if ESP_IDF_VERSION_MINOR >= 4
- // Dynamic ref_clk configuration available at v4.4
{ MP_QSTR_ref_clk_mode, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -1} },
{ MP_QSTR_ref_clk, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
- #endif
};
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
@@ -147,12 +141,8 @@ STATIC mp_obj_t get_lan(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_ar
args[ARG_phy_type].u_int != PHY_LAN8720 &&
args[ARG_phy_type].u_int != PHY_IP101 &&
args[ARG_phy_type].u_int != PHY_RTL8201 &&
- #if ESP_IDF_VERSION_MINOR >= 3 // KSZ8041 is new in ESP-IDF v4.3
args[ARG_phy_type].u_int != PHY_KSZ8041 &&
- #endif
- #if ESP_IDF_VERSION_MINOR >= 4 // KSZ8081 is new in ESP-IDF v4.4
args[ARG_phy_type].u_int != PHY_KSZ8081 &&
- #endif
#if CONFIG_ETH_USE_SPI_ETHERNET
#if CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL
args[ARG_phy_type].u_int != PHY_KSZ8851SNL &&
@@ -169,17 +159,21 @@ STATIC mp_obj_t get_lan(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_ar
}
eth_mac_config_t mac_config = ETH_MAC_DEFAULT_CONFIG();
+ #if CONFIG_IDF_TARGET_ESP32
+ eth_esp32_emac_config_t esp32_config = ETH_ESP32_EMAC_DEFAULT_CONFIG();
+ #endif
+
esp_eth_mac_t *mac = NULL;
- // Dynamic ref_clk configuration available at v4.4
- #if ESP_IDF_VERSION_MINOR >= 4
+ #if CONFIG_IDF_TARGET_ESP32
+ // Dynamic ref_clk configuration.
if (args[ARG_ref_clk_mode].u_int != -1) {
// Map the GPIO_MODE constants to EMAC_CLK constants.
- mac_config.clock_config.rmii.clock_mode =
+ esp32_config.clock_config.rmii.clock_mode =
args[ARG_ref_clk_mode].u_int == GPIO_MODE_INPUT ? EMAC_CLK_EXT_IN : EMAC_CLK_OUT;
}
if (args[ARG_ref_clk].u_obj != mp_const_none) {
- mac_config.clock_config.rmii.clock_gpio = machine_pin_get_id(args[ARG_ref_clk].u_obj);
+ esp32_config.clock_config.rmii.clock_gpio = machine_pin_get_id(args[ARG_ref_clk].u_obj);
}
#endif
@@ -224,7 +218,7 @@ STATIC mp_obj_t get_lan(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_ar
#if CONFIG_IDF_TARGET_ESP32
case PHY_LAN8710:
case PHY_LAN8720:
- self->phy = esp_eth_phy_new_lan8720(&phy_config);
+ self->phy = esp_eth_phy_new_lan87xx(&phy_config);
break;
case PHY_IP101:
self->phy = esp_eth_phy_new_ip101(&phy_config);
@@ -235,17 +229,11 @@ STATIC mp_obj_t get_lan(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_ar
case PHY_DP83848:
self->phy = esp_eth_phy_new_dp83848(&phy_config);
break;
- #if ESP_IDF_VERSION_MINOR >= 3 // KSZ8041 is new in ESP-IDF v4.3
case PHY_KSZ8041:
- self->phy = esp_eth_phy_new_ksz8041(&phy_config);
- break;
- #endif
- #if ESP_IDF_VERSION_MINOR >= 4 // KSZ8081 is new in ESP-IDF v4.4
case PHY_KSZ8081:
- self->phy = esp_eth_phy_new_ksz8081(&phy_config);
+ self->phy = esp_eth_phy_new_ksz80xx(&phy_config);
break;
#endif
- #endif
#if CONFIG_ETH_USE_SPI_ETHERNET
#if CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL
case PHY_KSZ8851SNL: {
@@ -282,9 +270,9 @@ STATIC mp_obj_t get_lan(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_ar
if (self->mdc_pin == -1 || self->mdio_pin == -1) {
mp_raise_ValueError(MP_ERROR_TEXT("mdc and mdio must be specified"));
}
- mac_config.smi_mdc_gpio_num = self->mdc_pin;
- mac_config.smi_mdio_gpio_num = self->mdio_pin;
- mac = esp_eth_mac_new_esp32(&mac_config);
+ esp32_config.smi_mdc_gpio_num = self->mdc_pin;
+ esp32_config.smi_mdio_gpio_num = self->mdio_pin;
+ mac = esp_eth_mac_new_esp32(&esp32_config, &mac_config);
}
#endif
@@ -293,11 +281,7 @@ STATIC mp_obj_t get_lan(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_ar
}
esp_netif_config_t cfg = ESP_NETIF_DEFAULT_ETH();
- self->eth_netif = esp_netif_new(&cfg);
-
- if (esp_eth_set_default_handlers(self->eth_netif) != ESP_OK) {
- mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("esp_eth_set_default_handlers failed (invalid parameter)"));
- }
+ self->base.netif = esp_netif_new(&cfg);
if (esp_event_handler_register(ETH_EVENT, ESP_EVENT_ANY_ID, &eth_event_handler, NULL) != ESP_OK) {
mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("esp_event_handler_register failed"));
@@ -323,7 +307,7 @@ STATIC mp_obj_t get_lan(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_ar
}
}
- if (esp_netif_attach(self->eth_netif, esp_eth_new_netif_glue(self->eth_handle)) != ESP_OK) {
+ if (esp_netif_attach(self->base.netif, esp_eth_new_netif_glue(self->eth_handle)) != ESP_OK) {
mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("esp_netif_attach failed"));
}
@@ -384,7 +368,7 @@ STATIC mp_obj_t lan_config(size_t n_args, const mp_obj_t *args, mp_map_t *kwargs
}
if (
(esp_eth_ioctl(self->eth_handle, ETH_CMD_S_MAC_ADDR, bufinfo.buf) != ESP_OK) ||
- (esp_netif_set_mac(self->eth_netif, bufinfo.buf) != ESP_OK)
+ (esp_netif_set_mac(self->base.netif, bufinfo.buf) != ESP_OK)
) {
mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("failed setting MAC address"));
}
diff --git a/ports/esp32/network_ppp.c b/ports/esp32/network_ppp.c
index b3cab83598..caad7eb48b 100644
--- a/ports/esp32/network_ppp.c
+++ b/ports/esp32/network_ppp.c
@@ -32,6 +32,7 @@
#include "py/stream.h"
#include "shared/netutils/netutils.h"
#include "modmachine.h"
+#include "ppp_set_auth.h"
#include "netif/ppp/ppp.h"
#include "netif/ppp/pppos.h"
diff --git a/ports/esp32/network_wlan.c b/ports/esp32/network_wlan.c
index e56d73b237..63f01dfc25 100644
--- a/ports/esp32/network_wlan.c
+++ b/ports/esp32/network_wlan.c
@@ -41,7 +41,6 @@
#include "esp_wifi.h"
#include "esp_log.h"
-#include "mdns.h"
#if MICROPY_PY_NETWORK_WLAN
@@ -49,8 +48,10 @@
#error WIFI_MODE_STA and WIFI_MODE_AP are supposed to be bitfields!
#endif
-STATIC const wlan_if_obj_t wlan_sta_obj;
-STATIC const wlan_if_obj_t wlan_ap_obj;
+typedef base_if_obj_t wlan_if_obj_t;
+
+STATIC wlan_if_obj_t wlan_sta_obj;
+STATIC wlan_if_obj_t wlan_ap_obj;
// Set to "true" if esp_wifi_start() was called
static bool wifi_started = false;
@@ -75,34 +76,22 @@ static uint8_t wifi_sta_reconnects;
// This function is called by the system-event task and so runs in a different
// thread to the main MicroPython task. It must not raise any Python exceptions.
-void network_wlan_event_handler(system_event_t *event) {
- switch (event->event_id) {
- case SYSTEM_EVENT_STA_START:
+static void network_wlan_wifi_event_handler(void *event_handler_arg, esp_event_base_t event_base, int32_t event_id, void *event_data) {
+ switch (event_id) {
+ case WIFI_EVENT_STA_START:
ESP_LOGI("wifi", "STA_START");
wifi_sta_reconnects = 0;
break;
- case SYSTEM_EVENT_STA_CONNECTED:
+
+ case WIFI_EVENT_STA_CONNECTED:
ESP_LOGI("network", "CONNECTED");
break;
- case SYSTEM_EVENT_STA_GOT_IP:
- ESP_LOGI("network", "GOT_IP");
- wifi_sta_connected = true;
- wifi_sta_disconn_reason = 0; // Success so clear error. (in case of new error will be replaced anyway)
- #if MICROPY_HW_ENABLE_MDNS_QUERIES || MICROPY_HW_ENABLE_MDNS_RESPONDER
- if (!mdns_initialised) {
- mdns_init();
- #if MICROPY_HW_ENABLE_MDNS_RESPONDER
- mdns_hostname_set(mod_network_hostname);
- mdns_instance_name_set(mod_network_hostname);
- #endif
- mdns_initialised = true;
- }
- #endif
- break;
- case SYSTEM_EVENT_STA_DISCONNECTED: {
+
+ case WIFI_EVENT_STA_DISCONNECTED: {
// This is a workaround as ESP32 WiFi libs don't currently
// auto-reassociate.
- system_event_sta_disconnected_t *disconn = &event->event_info.disconnected;
+
+ wifi_event_sta_disconnected_t *disconn = event_data;
char *message = "";
wifi_sta_disconn_reason = disconn->reason;
switch (disconn->reason) {
@@ -152,20 +141,55 @@ void network_wlan_event_handler(system_event_t *event) {
}
}
+static void network_wlan_ip_event_handler(void *event_handler_arg, esp_event_base_t event_base, int32_t event_id, void *event_data) {
+ switch (event_id) {
+ case IP_EVENT_STA_GOT_IP:
+ ESP_LOGI("network", "GOT_IP");
+ wifi_sta_connected = true;
+ wifi_sta_disconn_reason = 0; // Success so clear error. (in case of new error will be replaced anyway)
+ #if MICROPY_HW_ENABLE_MDNS_QUERIES || MICROPY_HW_ENABLE_MDNS_RESPONDER
+ if (!mdns_initialised) {
+ mdns_init();
+ #if MICROPY_HW_ENABLE_MDNS_RESPONDER
+ mdns_hostname_set(mod_network_hostname);
+ mdns_instance_name_set(mod_network_hostname);
+ #endif
+ mdns_initialised = true;
+ }
+ #endif
+ break;
+
+ default:
+ break;
+ }
+}
+
STATIC void require_if(mp_obj_t wlan_if, int if_no) {
wlan_if_obj_t *self = MP_OBJ_TO_PTR(wlan_if);
if (self->if_id != if_no) {
- mp_raise_msg(&mp_type_OSError, if_no == WIFI_IF_STA ? MP_ERROR_TEXT("STA required") : MP_ERROR_TEXT("AP required"));
+ mp_raise_msg(&mp_type_OSError, if_no == ESP_IF_WIFI_STA ? MP_ERROR_TEXT("STA required") : MP_ERROR_TEXT("AP required"));
}
}
-void esp_initialise_wifi() {
+void esp_initialise_wifi(void) {
static int wifi_initialized = 0;
if (!wifi_initialized) {
+ esp_exceptions(esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, network_wlan_wifi_event_handler, NULL, NULL));
+ esp_exceptions(esp_event_handler_instance_register(IP_EVENT, ESP_EVENT_ANY_ID, network_wlan_ip_event_handler, NULL, NULL));
+
+ wlan_sta_obj.base.type = &esp_network_wlan_type;
+ wlan_sta_obj.if_id = ESP_IF_WIFI_STA;
+ wlan_sta_obj.netif = esp_netif_create_default_wifi_sta();
+
+ wlan_ap_obj.base.type = &esp_network_wlan_type;
+ wlan_ap_obj.if_id = ESP_IF_WIFI_AP;
+ wlan_ap_obj.netif = esp_netif_create_default_wifi_ap();
+
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_LOGD("modnetwork", "Initializing WiFi");
esp_exceptions(esp_wifi_init(&cfg));
esp_exceptions(esp_wifi_set_storage(WIFI_STORAGE_RAM));
+
ESP_LOGD("modnetwork", "Initialized");
wifi_initialized = 1;
}
@@ -176,10 +200,10 @@ STATIC mp_obj_t network_wlan_make_new(const mp_obj_type_t *type, size_t n_args,
esp_initialise_wifi();
- int idx = (n_args > 0) ? mp_obj_get_int(args[0]) : WIFI_IF_STA;
- if (idx == WIFI_IF_STA) {
+ int idx = (n_args > 0) ? mp_obj_get_int(args[0]) : ESP_IF_WIFI_STA;
+ if (idx == ESP_IF_WIFI_STA) {
return MP_OBJ_FROM_PTR(&wlan_sta_obj);
- } else if (idx == WIFI_IF_AP) {
+ } else if (idx == ESP_IF_WIFI_AP) {
return MP_OBJ_FROM_PTR(&wlan_ap_obj);
} else {
mp_raise_ValueError(MP_ERROR_TEXT("invalid WLAN interface identifier"));
@@ -196,7 +220,7 @@ STATIC mp_obj_t network_wlan_active(size_t n_args, const mp_obj_t *args) {
esp_exceptions(esp_wifi_get_mode(&mode));
}
- int bit = (self->if_id == WIFI_IF_STA) ? WIFI_MODE_STA : WIFI_MODE_AP;
+ int bit = (self->if_id == ESP_IF_WIFI_STA) ? WIFI_MODE_STA : WIFI_MODE_AP;
if (n_args > 1) {
bool active = mp_obj_is_true(args[1]);
@@ -262,7 +286,7 @@ STATIC mp_obj_t network_wlan_connect(size_t n_args, const mp_obj_t *pos_args, mp
esp_exceptions(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_sta_config));
}
- esp_exceptions(tcpip_adapter_set_hostname(TCPIP_ADAPTER_IF_STA, mod_network_hostname));
+ esp_exceptions(esp_netif_set_hostname(wlan_sta_obj.netif, mod_network_hostname));
wifi_sta_reconnects = 0;
// connect to the WiFi AP
@@ -285,7 +309,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(network_wlan_disconnect_obj, network_wlan_disco
STATIC mp_obj_t network_wlan_status(size_t n_args, const mp_obj_t *args) {
wlan_if_obj_t *self = MP_OBJ_TO_PTR(args[0]);
if (n_args == 1) {
- if (self->if_id == WIFI_IF_STA) {
+ if (self->if_id == ESP_IF_WIFI_STA) {
// Case of no arg is only for the STA interface
if (wifi_sta_connected) {
// Happy path, connected with IP
@@ -310,7 +334,7 @@ STATIC mp_obj_t network_wlan_status(size_t n_args, const mp_obj_t *args) {
switch ((uintptr_t)args[1]) {
case (uintptr_t)MP_OBJ_NEW_QSTR(MP_QSTR_stations): {
// return list of connected stations, only if in soft-AP mode
- require_if(args[0], WIFI_IF_AP);
+ require_if(args[0], ESP_IF_WIFI_AP);
wifi_sta_list_t station_list;
esp_exceptions(esp_wifi_ap_get_sta_list(&station_list));
wifi_sta_info_t *stations = (wifi_sta_info_t *)station_list.sta;
@@ -324,7 +348,7 @@ STATIC mp_obj_t network_wlan_status(size_t n_args, const mp_obj_t *args) {
}
case (uintptr_t)MP_OBJ_NEW_QSTR(MP_QSTR_rssi): {
// return signal of AP, only in STA mode
- require_if(args[0], WIFI_IF_STA);
+ require_if(args[0], ESP_IF_WIFI_STA);
wifi_ap_record_t info;
esp_exceptions(esp_wifi_sta_get_ap_info(&info));
@@ -383,7 +407,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(network_wlan_scan_obj, network_wlan_scan);
STATIC mp_obj_t network_wlan_isconnected(mp_obj_t self_in) {
wlan_if_obj_t *self = MP_OBJ_TO_PTR(self_in);
- if (self->if_id == WIFI_IF_STA) {
+ if (self->if_id == ESP_IF_WIFI_STA) {
return mp_obj_new_bool(wifi_sta_connected);
} else {
wifi_sta_list_t sta;
@@ -400,7 +424,7 @@ STATIC mp_obj_t network_wlan_config(size_t n_args, const mp_obj_t *args, mp_map_
wlan_if_obj_t *self = MP_OBJ_TO_PTR(args[0]);
- bool is_wifi = self->if_id == WIFI_IF_AP || self->if_id == WIFI_IF_STA;
+ bool is_wifi = self->if_id == ESP_IF_WIFI_AP || self->if_id == ESP_IF_WIFI_STA;
wifi_config_t cfg;
if (is_wifi) {
@@ -428,7 +452,7 @@ STATIC mp_obj_t network_wlan_config(size_t n_args, const mp_obj_t *args, mp_map_
}
case MP_QSTR_ssid:
case MP_QSTR_essid: {
- req_if = WIFI_IF_AP;
+ req_if = ESP_IF_WIFI_AP;
size_t len;
const char *s = mp_obj_str_get_data(kwargs->table[i].value, &len);
len = MIN(len, sizeof(cfg.ap.ssid));
@@ -437,19 +461,19 @@ STATIC mp_obj_t network_wlan_config(size_t n_args, const mp_obj_t *args, mp_map_
break;
}
case MP_QSTR_hidden: {
- req_if = WIFI_IF_AP;
+ req_if = ESP_IF_WIFI_AP;
cfg.ap.ssid_hidden = mp_obj_is_true(kwargs->table[i].value);
break;
}
case MP_QSTR_security:
case MP_QSTR_authmode: {
- req_if = WIFI_IF_AP;
+ req_if = ESP_IF_WIFI_AP;
cfg.ap.authmode = mp_obj_get_int(kwargs->table[i].value);
break;
}
case MP_QSTR_key:
case MP_QSTR_password: {
- req_if = WIFI_IF_AP;
+ req_if = ESP_IF_WIFI_AP;
size_t len;
const char *s = mp_obj_str_get_data(kwargs->table[i].value, &len);
len = MIN(len, sizeof(cfg.ap.password) - 1);
@@ -488,13 +512,13 @@ STATIC mp_obj_t network_wlan_config(size_t n_args, const mp_obj_t *args, mp_map_
break;
}
case MP_QSTR_max_clients: {
- req_if = WIFI_IF_AP;
+ req_if = ESP_IF_WIFI_AP;
cfg.ap.max_connection = mp_obj_get_int(kwargs->table[i].value);
break;
}
case MP_QSTR_reconnects: {
int reconnects = mp_obj_get_int(kwargs->table[i].value);
- req_if = WIFI_IF_STA;
+ req_if = ESP_IF_WIFI_STA;
// parameter reconnects == -1 means to retry forever.
// here means conf_wifi_sta_reconnects == 0 to retry forever.
conf_wifi_sta_reconnects = (reconnects == -1) ? 0 : reconnects + 1;
@@ -542,8 +566,8 @@ STATIC mp_obj_t network_wlan_config(size_t n_args, const mp_obj_t *args, mp_map_
case MP_QSTR_mac: {
uint8_t mac[6];
switch (self->if_id) {
- case WIFI_IF_AP: // fallthrough intentional
- case WIFI_IF_STA:
+ case ESP_IF_WIFI_AP: // fallthrough intentional
+ case ESP_IF_WIFI_STA:
esp_exceptions(esp_wifi_get_mac(self->if_id, mac));
return mp_obj_new_bytes(mac, sizeof(mac));
default:
@@ -553,23 +577,23 @@ STATIC mp_obj_t network_wlan_config(size_t n_args, const mp_obj_t *args, mp_map_
case MP_QSTR_ssid:
case MP_QSTR_essid:
switch (self->if_id) {
- case WIFI_IF_STA:
+ case ESP_IF_WIFI_STA:
val = mp_obj_new_str((char *)cfg.sta.ssid, strlen((char *)cfg.sta.ssid));
break;
- case WIFI_IF_AP:
+ case ESP_IF_WIFI_AP:
val = mp_obj_new_str((char *)cfg.ap.ssid, cfg.ap.ssid_len);
break;
default:
- req_if = WIFI_IF_AP;
+ req_if = ESP_IF_WIFI_AP;
}
break;
case MP_QSTR_hidden:
- req_if = WIFI_IF_AP;
+ req_if = ESP_IF_WIFI_AP;
val = mp_obj_new_bool(cfg.ap.ssid_hidden);
break;
case MP_QSTR_security:
case MP_QSTR_authmode:
- req_if = WIFI_IF_AP;
+ req_if = ESP_IF_WIFI_AP;
val = MP_OBJ_NEW_SMALL_INT(cfg.ap.authmode);
break;
case MP_QSTR_channel: {
@@ -582,7 +606,7 @@ STATIC mp_obj_t network_wlan_config(size_t n_args, const mp_obj_t *args, mp_map_
case MP_QSTR_hostname:
case MP_QSTR_dhcp_hostname: {
// TODO: Deprecated. Use network.hostname() instead.
- req_if = WIFI_IF_STA;
+ req_if = ESP_IF_WIFI_STA;
val = mp_obj_new_str(mod_network_hostname, strlen(mod_network_hostname));
break;
}
@@ -591,7 +615,7 @@ STATIC mp_obj_t network_wlan_config(size_t n_args, const mp_obj_t *args, mp_map_
break;
}
case MP_QSTR_reconnects:
- req_if = WIFI_IF_STA;
+ req_if = ESP_IF_WIFI_STA;
int rec = conf_wifi_sta_reconnects - 1;
val = MP_OBJ_NEW_SMALL_INT(rec);
break;
@@ -654,7 +678,4 @@ MP_DEFINE_CONST_OBJ_TYPE(
locals_dict, &wlan_if_locals_dict
);
-STATIC const wlan_if_obj_t wlan_sta_obj = {{&esp_network_wlan_type}, WIFI_IF_STA};
-STATIC const wlan_if_obj_t wlan_ap_obj = {{&esp_network_wlan_type}, WIFI_IF_AP};
-
#endif // MICROPY_PY_NETWORK_WLAN
diff --git a/ports/esp32/uart.h b/ports/esp32/uart.h
index 14ad30ccd8..6410db24c9 100644
--- a/ports/esp32/uart.h
+++ b/ports/esp32/uart.h
@@ -30,7 +30,7 @@
// Whether to enable the REPL on a UART.
#ifndef MICROPY_HW_ENABLE_UART_REPL
-#define MICROPY_HW_ENABLE_UART_REPL (!CONFIG_USB_ENABLED && !CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG)
+#define MICROPY_HW_ENABLE_UART_REPL (!CONFIG_USB_OTG_SUPPORTED && !CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG)
#endif
#ifndef MICROPY_HW_UART_REPL
diff --git a/ports/esp32/usb.c b/ports/esp32/usb.c
index 80612cd276..83ba9533d3 100644
--- a/ports/esp32/usb.c
+++ b/ports/esp32/usb.c
@@ -28,14 +28,17 @@
#include "py/mphal.h"
#include "usb.h"
-#if CONFIG_USB_ENABLED
+#if CONFIG_USB_OTG_SUPPORTED
+#include "esp_timer.h"
+#ifndef NO_QSTR
#include "tinyusb.h"
#include "tusb_cdc_acm.h"
+#endif
#define CDC_ITF TINYUSB_CDC_ACM_0
-static uint8_t usb_rx_buf[CONFIG_USB_CDC_RX_BUFSIZE];
+static uint8_t usb_rx_buf[CONFIG_TINYUSB_CDC_RX_BUFSIZE];
static void usb_callback_rx(int itf, cdcacm_event_t *event) {
// TODO: what happens if more chars come in during this function, are they lost?
@@ -79,7 +82,7 @@ void usb_init(void) {
void usb_tx_strn(const char *str, size_t len) {
// Write out the data to the CDC interface, but only while the USB host is connected.
- uint64_t timeout = esp_timer_get_time() + (uint64_t)(MICROPY_HW_USB_CDC_TX_TIMEOUT * 1000);
+ uint64_t timeout = esp_timer_get_time() + (uint64_t)(MICROPY_HW_USB_CDC_TX_TIMEOUT_MS * 1000);
while (tud_cdc_n_connected(CDC_ITF) && len && esp_timer_get_time() < timeout) {
size_t l = tinyusb_cdcacm_write_queue(CDC_ITF, (uint8_t *)str, len);
str += l;
@@ -88,4 +91,4 @@ void usb_tx_strn(const char *str, size_t len) {
}
}
-#endif // CONFIG_USB_ENABLED
+#endif // CONFIG_USB_OTG_SUPPORTED
diff --git a/ports/esp32/usb.h b/ports/esp32/usb.h
index 009bf42624..a4c7d40701 100644
--- a/ports/esp32/usb.h
+++ b/ports/esp32/usb.h
@@ -26,7 +26,7 @@
#ifndef MICROPY_INCLUDED_ESP32_USB_H
#define MICROPY_INCLUDED_ESP32_USB_H
-#define MICROPY_HW_USB_CDC_TX_TIMEOUT (500)
+#define MICROPY_HW_USB_CDC_TX_TIMEOUT_MS (500)
void usb_init(void);
void usb_tx_strn(const char *str, size_t len);
diff --git a/ports/esp32/usb_serial_jtag.c b/ports/esp32/usb_serial_jtag.c
index a7d06a355a..3289a1b5c0 100644
--- a/ports/esp32/usb_serial_jtag.c
+++ b/ports/esp32/usb_serial_jtag.c
@@ -79,9 +79,9 @@ void usb_serial_jtag_tx_strn(const char *str, size_t len) {
if (l > USB_SERIAL_JTAG_PACKET_SZ_BYTES) {
l = USB_SERIAL_JTAG_PACKET_SZ_BYTES;
}
- portTickType start_tick = xTaskGetTickCount();
+ TickType_t start_tick = xTaskGetTickCount();
while (!usb_serial_jtag_ll_txfifo_writable()) {
- portTickType now_tick = xTaskGetTickCount();
+ TickType_t now_tick = xTaskGetTickCount();
if (!terminal_connected || now_tick > (start_tick + pdMS_TO_TICKS(200))) {
terminal_connected = false;
return;