diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml index 06f82af..6ac32b5 100644 --- a/.github/workflows/examples.yml +++ b/.github/workflows/examples.yml @@ -45,4 +45,4 @@ jobs: pio pkg install --global --platform symlink://. - name: Build examples run: | - platformio run -d ${{ matrix.example }} + pio run -d ${{ matrix.example }} diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..a93ede2 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,30 @@ +name: "Unit Testing" + +on: [push, pull_request] + +jobs: + build: + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + python-version: [3.7] + example: + - "examples/espidf-hello-world" + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v2 + with: + submodules: "recursive" + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v3 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -U https://github.com/platformio/platformio/archive/develop.zip + pio pkg install --global --platform symlink://. + - name: Build test + run: | + pio test -d ${{ matrix.example }} --without-uploading --without-testing diff --git a/boards/adafruit_feather_esp32_v2.json b/boards/adafruit_feather_esp32_v2.json new file mode 100644 index 0000000..a45636e --- /dev/null +++ b/boards/adafruit_feather_esp32_v2.json @@ -0,0 +1,42 @@ +{ + "build": { + "arduino":{ + "ldscript": "esp32_out.ld" + }, + "core": "esp32", + "extra_flags": [ + "-DARDUINO_ADAFRUIT_FEATHER_ESP32_V2", + "-DBOARD_HAS_PSRAM", + "-mfix-esp32-psram-cache-issue", + "-mfix-esp32-psram-cache-strategy=memw" + ], + "f_cpu": "240000000L", + "f_flash": "40000000L", + "flash_mode": "dio", + "mcu": "esp32", + "variant": "adafruit_feather_esp32_v2" + }, + "connectivity": [ + "wifi", + "bluetooth", + "ethernet", + "can" + ], + "debug": { + "openocd_board": "esp-wroom-32.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "Adafruit Feather ESP32 V2", + "upload": { + "flash_size": "8MB", + "maximum_ram_size": 327680, + "maximum_size": 8388608, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://www.adafruit.com/product/5400", + "vendor": "Adafruit" +} diff --git a/boards/adafruit_feather_esp32s3.json b/boards/adafruit_feather_esp32s3.json new file mode 100644 index 0000000..3d59068 --- /dev/null +++ b/boards/adafruit_feather_esp32s3.json @@ -0,0 +1,62 @@ +{ + "build": { + "arduino":{ + "ldscript": "esp32s3_out.ld" + }, + "core": "esp32", + "extra_flags": [ + "-DARDUINO_ADAFRUIT_FEATHER_ESP32S3_NOPSRAM", + "-DARDUINO_USB_CDC_ON_BOOT=1", + "-DARDUINO_RUNNING_CORE=1", + "-DARDUINO_EVENT_RUNNING_CORE=1" + ], + "f_cpu": "240000000L", + "f_flash": "80000000L", + "flash_mode": "qio", + "hwids": [ + [ + "0x239A", + "0x8113" + ], + [ + "0x239A", + "0x0113" + ], + [ + "0x239A", + "0x8114" + ] + ], + "mcu": "esp32s3", + "variant": "adafruit_feather_esp32s3_nopsram" + }, + "connectivity": [ + "wifi" + ], + "debug": { + "openocd_target": "esp32s3.cfg" + }, + "frameworks": [ + "arduino" + ], + "name": "Adafruit Feather ESP32-S3 No PSRAM", + "upload": { + "arduino": { + "flash_extra_images": [ + [ + "0x410000", + "variants/adafruit_feather_esp32s3_nopsram/tinyuf2.bin" + ] + ] + }, + "flash_size": "4MB", + "maximum_ram_size": 327680, + "maximum_size": 4194304, + "use_1200bps_touch": true, + "wait_for_upload_port": true, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://www.adafruit.com/product/5323", + "vendor": "Adafruit" +} diff --git a/boards/adafruit_qtpy_esp32.json b/boards/adafruit_qtpy_esp32.json new file mode 100644 index 0000000..39896da --- /dev/null +++ b/boards/adafruit_qtpy_esp32.json @@ -0,0 +1,42 @@ +{ + "build": { + "arduino":{ + "ldscript": "esp32_out.ld" + }, + "core": "esp32", + "extra_flags": [ + "-DARDUINO_ADAFRUIT_QTPY_ESP32_PICO", + "-DBOARD_HAS_PSRAM", + "-mfix-esp32-psram-cache-issue", + "-mfix-esp32-psram-cache-strategy=memw" + ], + "f_cpu": "240000000L", + "f_flash": "40000000L", + "flash_mode": "dio", + "mcu": "esp32", + "variant": "adafruit_qtpy_esp32" + }, + "connectivity": [ + "wifi", + "bluetooth", + "ethernet", + "can" + ], + "debug": { + "openocd_board": "esp-wroom-32.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "Adafruit QT Py ESP32", + "upload": { + "flash_size": "8MB", + "maximum_ram_size": 327680, + "maximum_size": 8388608, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://www.adafruit.com/product/5395", + "vendor": "Adafruit" +} diff --git a/boards/adafruit_qtpy_esp32c3.json b/boards/adafruit_qtpy_esp32c3.json new file mode 100644 index 0000000..335002d --- /dev/null +++ b/boards/adafruit_qtpy_esp32c3.json @@ -0,0 +1,44 @@ +{ + "build": { + "arduino":{ + "ldscript": "esp32c3_out.ld" + }, + "core": "esp32", + "extra_flags": [ + "-DARDUINO_ADAFRUIT_QTPY_ESP32C3", + "-DARDUINO_USB_MODE=1", + "-DARDUINO_USB_CDC_ON_BOOT=1" + ], + "f_cpu": "160000000L", + "f_flash": "80000000L", + "flash_mode": "dout", + "hwids": [ + [ + "0X303A", + "0x1001" + ] + ], + "mcu": "esp32c3", + "variant": "adafruit_qtpy_esp32c3" + }, + "connectivity": [ + "wifi" + ], + "debug": { + "openocd_target": "esp32c3.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "Adafruit QT Py ESP32-C3", + "upload": { + "flash_size": "4MB", + "maximum_ram_size": 327680, + "maximum_size": 4194304, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://www.adafruit.com/product/5405", + "vendor": "Adafruit" +} diff --git a/boards/adafruit_qtpy_esp32s3.json b/boards/adafruit_qtpy_esp32s3.json new file mode 100644 index 0000000..e01498f --- /dev/null +++ b/boards/adafruit_qtpy_esp32s3.json @@ -0,0 +1,62 @@ +{ + "build": { + "arduino":{ + "ldscript": "esp32s3_out.ld" + }, + "core": "esp32", + "extra_flags": [ + "-DARDUINO_ADAFRUIT_QTPY_ESP32S3_NOPSRAM", + "-DARDUINO_USB_CDC_ON_BOOT=1", + "-DARDUINO_RUNNING_CORE=1", + "-DARDUINO_EVENT_RUNNING_CORE=1" + ], + "f_cpu": "240000000L", + "f_flash": "80000000L", + "flash_mode": "qio", + "hwids": [ + [ + "0x239A", + "0x8119" + ], + [ + "0x239A", + "0x0119" + ], + [ + "0x239A", + "0x811A" + ] + ], + "mcu": "esp32s3", + "variant": "adafruit_qtpy_esp32s3_nopsram" + }, + "connectivity": [ + "wifi" + ], + "debug": { + "openocd_target": "esp32s3.cfg" + }, + "frameworks": [ + "arduino" + ], + "name": "Adafruit QT Py ESP32-S3 No PSRAM", + "upload": { + "arduino": { + "flash_extra_images": [ + [ + "0x410000", + "variants/adafruit_qtpy_esp32s3_nopsram/tinyuf2.bin" + ] + ] + }, + "flash_size": "4MB", + "maximum_ram_size": 327680, + "maximum_size": 4194304, + "use_1200bps_touch": true, + "wait_for_upload_port": true, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://www.adafruit.com/product/5426", + "vendor": "Adafruit" +} diff --git a/boards/airm2m_core_esp32c3.json b/boards/airm2m_core_esp32c3.json new file mode 100644 index 0000000..e227fad --- /dev/null +++ b/boards/airm2m_core_esp32c3.json @@ -0,0 +1,37 @@ +{ + "build": { + "arduino":{ + "ldscript": "esp32c3_out.ld" + }, + "core": "esp32", + "f_cpu": "160000000L", + "f_flash": "80000000L", + "flash_mode": "dio", + "extra_flags": [ + "-DARDUINO_AirM2M_CORE_ESP32C3", + "-DARDUINO_USB_MODE=1" + ], + "mcu": "esp32c3", + "variant": "AirM2M_CORE_ESP32C3" + }, + "connectivity": [ + "wifi" + ], + "debug": { + "openocd_target": "esp32c3.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "AirM2M CORE ESP32C3", + "upload": { + "flash_size": "4MB", + "maximum_ram_size": 327680, + "maximum_size": 4194304, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://wiki.luatos.com/chips/esp32c3/board.html", + "vendor": "AirM2M" +} diff --git a/boards/deneyapkart1A.json b/boards/deneyapkart1A.json new file mode 100644 index 0000000..4369508 --- /dev/null +++ b/boards/deneyapkart1A.json @@ -0,0 +1,41 @@ +{ + "build": { + "arduino":{ + "ldscript": "esp32_out.ld" + }, + "core": "esp32", + "extra_flags": [ + "-DARDUINO_DYDK1A", + "-DBOARD_HAS_PSRAM", + "-mfix-esp32-psram-cache-issue", + "-mfix-esp32-psram-cache-strategy=memw" + ], + "f_cpu": "240000000L", + "f_flash": "40000000L", + "flash_mode": "dio", + "mcu": "esp32", + "variant": "deneyapkart1A" + }, + "connectivity": [ + "wifi", + "bluetooth", + "ethernet" + ], + "debug": { + "openocd_board": "esp32-wrover.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "Deneyap Kart 1A", + "upload": { + "flash_size": "4MB", + "maximum_ram_size": 327680, + "maximum_size": 4194304, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://deneyapkart.org/magaza/urun-deneyap-kart.html", + "vendor": "Deneyap" +} diff --git a/boards/esp32-s2-saola-1.json b/boards/esp32-s2-saola-1.json index 194c291..f264131 100644 --- a/boards/esp32-s2-saola-1.json +++ b/boards/esp32-s2-saola-1.json @@ -4,6 +4,7 @@ "ldscript": "esp32s2_out.ld" }, "core": "esp32", + "extra_flags": "-DARDUINO_ESP32S2_DEV", "f_cpu": "240000000L", "f_flash": "80000000L", "flash_mode": "qio", diff --git a/boards/esp32-s3-devkitc-1.json b/boards/esp32-s3-devkitc-1.json new file mode 100644 index 0000000..abe8c41 --- /dev/null +++ b/boards/esp32-s3-devkitc-1.json @@ -0,0 +1,44 @@ +{ + "build": { + "arduino":{ + "ldscript": "esp32s3_out.ld" + }, + "core": "esp32", + "extra_flags": [ + "-DARDUINO_ESP32S3_DEV", + "-DARDUINO_USB_MODE=1", + "-DARDUINO_RUNNING_CORE=1", + "-DARDUINO_EVENT_RUNNING_CORE=1" + ], + "f_cpu": "240000000L", + "f_flash": "80000000L", + "flash_mode": "dio", + "hwids": [ + [ + "0X303A", + "0x1001" + ] + ], + "mcu": "esp32s3", + "variant": "esp32s3" + }, + "connectivity": [ + "wifi" + ], + "debug": { + "openocd_target": "esp32s3.cfg" + }, + "frameworks": [ + "arduino" + ], + "name": "Espressif ESP32-S3-DevKitC-1", + "upload": { + "flash_size": "4MB", + "maximum_ram_size": 327680, + "maximum_size": 4194304, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/hw-reference/esp32s3/user-guide-devkitc-1.html", + "vendor": "Espressif" +} diff --git a/boards/esp32s3box.json b/boards/esp32s3box.json new file mode 100644 index 0000000..6198d80 --- /dev/null +++ b/boards/esp32s3box.json @@ -0,0 +1,48 @@ +{ + "build": { + "arduino":{ + "ldscript": "esp32s3_out.ld", + "memory_type": "qspi_opi" + }, + "core": "esp32", + "extra_flags": [ + "-DARDUINO_RUNNING_CORE=1", + "-DARDUINO_EVENT_RUNNING_CORE=1", + "-DBOARD_HAS_PSRAM", + "-DARDUINO_ESP32_S3_BOX", + "-DARDUINO_USB_MODE=1", + "-DARDUINO_USB_CDC_ON_BOOT=1" + ], + "f_cpu": "240000000L", + "f_flash": "80000000L", + "flash_mode": "qio", + "hwids": [ + [ + "0X303A", + "0x1001" + ] + ], + "mcu": "esp32s3", + "variant": "esp32s3box" + }, + "connectivity": [ + "wifi", + "bluetooth" + ], + "debug": { + "openocd_target": "esp32s3.cfg" + }, + "frameworks": [ + "arduino" + ], + "name": "Espressif ESP32-S3-Box", + "upload": { + "flash_size": "16MB", + "maximum_ram_size": 327680, + "maximum_size": 16777216, + "require_upload_port": true, + "speed": 921600 + }, + "url": "https://www.adafruit.com/product/5290", + "vendor": "Espressif" +} diff --git a/boards/esp32s3camlcd.json b/boards/esp32s3camlcd.json new file mode 100644 index 0000000..372e89b --- /dev/null +++ b/boards/esp32s3camlcd.json @@ -0,0 +1,48 @@ +{ + "build": { + "arduino":{ + "ldscript": "esp32_out.ld", + "memory_type": "opi_opi" + }, + "boot": "opi", + "core": "esp32", + "extra_flags": [ + "-DARDUINO_RUNNING_CORE=1", + "-DARDUINO_EVENT_RUNNING_CORE=1", + "-DBOARD_HAS_PSRAM", + "-DARDUINO_ESP32S3_CAM_LCD", + "-DARDUINO_USB_MODE=1" + ], + "f_cpu": "240000000L", + "f_flash": "80000000L", + "flash_mode": "dout", + "hwids": [ + [ + "0X303A", + "0x1001" + ] + ], + "mcu": "esp32s3", + "variant": "esp32s3camlcd" + }, + "connectivity": [ + "wifi", + "bluetooth" + ], + "debug": { + "openocd_target": "esp32s3.cfg" + }, + "frameworks": [ + "arduino" + ], + "name": "ESP32S3 CAM LCD", + "upload": { + "flash_size": "4MB", + "maximum_ram_size": 327680, + "maximum_size": 16777216, + "require_upload_port": true, + "speed": 921600 + }, + "url": "https://www.espressif.com/en/news/Maple_Eye_ESP32-S3", + "vendor": "Espressif" +} diff --git a/boards/lionbit.json b/boards/lionbit.json index 41e4cf6..c8186d0 100644 --- a/boards/lionbit.json +++ b/boards/lionbit.json @@ -4,13 +4,17 @@ "ldscript": "esp32_out.ld" }, "core": "esp32", - "extra_flags": "-DARDUINO_ESP32_DEV", + "extra_flags": [ + "-DARDUINO_LIONBIT", + "-DARDUINO_RUNNING_CORE=1", + "-DARDUINO_EVENT_RUNNING_CORE=1" + ], "f_cpu": "240000000L", "f_flash": "40000000L", "flash_mode": "dio", "flags" : "-DCORE_DEBUG_LEVEL=5", "mcu": "esp32", - "variant": "esp32" + "variant": "lionbit" }, "connectivity": [ "wifi", @@ -25,7 +29,7 @@ "arduino", "espidf" ], - "name": "LionBit", + "name": "Lion:Bit Dev Board", "upload": { "flash_size": "4MB", "maximum_ram_size": 327680, @@ -37,5 +41,5 @@ "speed" : 115200 }, "url": "http://lionbit.lk/", - "vendor": "Lion::Bit" + "vendor": "Lion:Bit" } diff --git a/boards/lolin_c3_mini.json b/boards/lolin_c3_mini.json new file mode 100644 index 0000000..7630446 --- /dev/null +++ b/boards/lolin_c3_mini.json @@ -0,0 +1,44 @@ +{ + "build": { + "arduino": { + "ldscript": "esp32c3_out.ld" + }, + "core": "esp32", + "extra_flags": [ + "-DARDUINO_LOLIN_C3_MINI", + "-DARDUINO_USB_MODE=1", + "-DARDUINO_USB_CDC_ON_BOOT=1" + ], + "f_cpu": "160000000L", + "f_flash": "80000000L", + "flash_mode": "qio", + "hwids": [ + [ + "0X303A", + "0x1001" + ] + ], + "mcu": "esp32c3", + "variant": "esp32c3" + }, + "connectivity": [ + "wifi" + ], + "debug": { + "openocd_target": "esp32c3.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "WEMOS LOLIN C3 Mini", + "upload": { + "flash_size": "4MB", + "maximum_ram_size": 327680, + "maximum_size": 4194304, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://www.wemos.cc/en/latest/c3/c3_mini.html", + "vendor": "WEMOS" +} diff --git a/boards/lolin_s2_mini.json b/boards/lolin_s2_mini.json new file mode 100644 index 0000000..3fe4f71 --- /dev/null +++ b/boards/lolin_s2_mini.json @@ -0,0 +1,46 @@ +{ + "build": { + "arduino": { + "ldscript": "esp32s2_out.ld" + }, + "core": "esp32", + "extra_flags": [ + "-DARDUINO_LOLIN_S2_MINI", + "-DBOARD_HAS_PSRAM", + "-DARDUINO_USB_CDC_ON_BOOT=1" + ], + "f_cpu": "240000000L", + "f_flash": "80000000L", + "flash_mode": "dio", + "hwids": [ + [ + "0X303A", + "0x80C2" + ] + ], + "mcu": "esp32s2", + "variant": "lolin_s2_mini" + }, + "connectivity": [ + "wifi" + ], + "debug": { + "openocd_board": "esp32s2.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "WEMOS LOLIN S2 Mini", + "upload": { + "flash_size": "4MB", + "maximum_ram_size": 327680, + "maximum_size": 4194304, + "use_1200bps_touch": true, + "wait_for_upload_port": true, + "require_upload_port": true, + "speed": 921600 + }, + "url": "https://www.wemos.cc/en/latest/s2/s2_mini.html", + "vendor": "WEMOS" +} diff --git a/boards/lolin_s2_pico.json b/boards/lolin_s2_pico.json new file mode 100644 index 0000000..dab2b7e --- /dev/null +++ b/boards/lolin_s2_pico.json @@ -0,0 +1,46 @@ +{ + "build": { + "arduino": { + "ldscript": "esp32s2_out.ld" + }, + "core": "esp32", + "extra_flags": [ + "-DARDUINO_LOLIN_S2_PICO", + "-DBOARD_HAS_PSRAM", + "-DARDUINO_USB_CDC_ON_BOOT=1" + ], + "f_cpu": "240000000L", + "f_flash": "80000000L", + "flash_mode": "dio", + "hwids": [ + [ + "0X303A", + "0x80C5" + ] + ], + "mcu": "esp32s2", + "variant": "lolin_s2_pico" + }, + "connectivity": [ + "wifi" + ], + "debug": { + "openocd_board": "esp32s2.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "WEMOS LOLIN S2 PICO", + "upload": { + "flash_size": "4MB", + "maximum_ram_size": 327680, + "maximum_size": 4194304, + "use_1200bps_touch": true, + "wait_for_upload_port": true, + "require_upload_port": true, + "speed": 921600 + }, + "url": "https://www.wemos.cc/en/latest/s2/s2_pico.html", + "vendor": "WEMOS" +} diff --git a/boards/trueverit-iot-driver-mk3.json b/boards/trueverit-iot-driver-mk3.json new file mode 100644 index 0000000..c74f960 --- /dev/null +++ b/boards/trueverit-iot-driver-mk3.json @@ -0,0 +1,38 @@ +{ + "build": { + "arduino": { + "ldscript": "esp32_out.ld" + }, + "core": "esp32", + "extra_flags": "-DARDUINO_Trueverit_ESP32_Universal_IoT_Driver_MK_III", + "f_cpu": "240000000L", + "f_flash": "40000000L", + "flash_mode": "dio", + "mcu": "esp32", + "variant": "esp32-trueverit-iot-driver-mkiii" + }, + "connectivity": [ + "wifi", + "bluetooth", + "ethernet", + "can" + ], + "debug": { + "openocd_board": "esp-wroom-32.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "Trueverit ESP32 Universal IoT Driver MK III", + "upload": { + "flash_size": "4MB", + "maximum_ram_size": 327680, + "maximum_size": 4194304, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://trueverit.com/", + "vendor": "Trueverit" +} + diff --git a/boards/um_feathers3.json b/boards/um_feathers3.json new file mode 100644 index 0000000..2be96cd --- /dev/null +++ b/boards/um_feathers3.json @@ -0,0 +1,48 @@ +{ + "build": { + "arduino":{ + "ldscript": "esp32s3_out.ld", + "partitions": "default_16MB.csv" + }, + "core": "esp32", + "extra_flags": [ + "-DARDUINO_FEATHERS3", + "-DBOARD_HAS_PSRAM", + "-DARDUINO_USB_CDC_ON_BOOT=1", + "-DARDUINO_RUNNING_CORE=1", + "-DARDUINO_EVENT_RUNNING_CORE=1" + ], + "f_cpu": "240000000L", + "f_flash": "80000000L", + "flash_mode": "qio", + "hwids": [ + [ + "0X303A", + "0x80D0" + ] + ], + "mcu": "esp32s3", + "variant": "um_feathers3" + }, + "connectivity": [ + "wifi" + ], + "debug": { + "openocd_target": "esp32s3.cfg" + }, + "frameworks": [ + "arduino" + ], + "name": "Unexpected Maker FeatherS3", + "upload": { + "flash_size": "16MB", + "maximum_ram_size": 327680, + "maximum_size": 16777216, + "use_1200bps_touch": true, + "wait_for_upload_port": true, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://unexpectedmaker.com/shop/feathers3", + "vendor": "Unexpected Maker" +} diff --git a/boards/um_pros3.json b/boards/um_pros3.json new file mode 100644 index 0000000..130079f --- /dev/null +++ b/boards/um_pros3.json @@ -0,0 +1,48 @@ +{ + "build": { + "arduino": { + "ldscript": "esp32s3_out.ld", + "partitions": "default_16MB.csv" + }, + "core": "esp32", + "extra_flags": [ + "-DARDUINO_PROS3", + "-DBOARD_HAS_PSRAM", + "-DARDUINO_USB_CDC_ON_BOOT=1", + "-DARDUINO_RUNNING_CORE=1", + "-DARDUINO_EVENT_RUNNING_CORE=1" + ], + "f_cpu": "240000000L", + "f_flash": "80000000L", + "flash_mode": "qio", + "hwids": [ + [ + "0X303A", + "0x80D0" + ] + ], + "mcu": "esp32s3", + "variant": "um_pros3" + }, + "connectivity": [ + "wifi" + ], + "debug": { + "openocd_target": "esp32s3.cfg" + }, + "frameworks": [ + "arduino" + ], + "name": "Unexpected Maker PROS3", + "upload": { + "flash_size": "16MB", + "maximum_ram_size": 327680, + "maximum_size": 16777216, + "use_1200bps_touch": true, + "wait_for_upload_port": true, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://unexpectedmaker.com/shop/pros3", + "vendor": "Unexpected Maker" +} diff --git a/boards/um_rmp.json b/boards/um_rmp.json new file mode 100644 index 0000000..c5e547a --- /dev/null +++ b/boards/um_rmp.json @@ -0,0 +1,46 @@ +{ + "build": { + "arduino": { + "ldscript": "esp32s2_out.ld" + }, + "core": "esp32", + "extra_flags": [ + "-DARDUINO_RMP", + "-DBOARD_HAS_PSRAM", + "-DARDUINO_USB_CDC_ON_BOOT=1" + ], + "f_cpu": "240000000L", + "f_flash": "40000000L", + "flash_mode": "dio", + "hwids": [ + [ + "0X303A", + "0x80F6" + ] + ], + "mcu": "esp32s2", + "variant": "um_rmp" + }, + "connectivity": [ + "wifi" + ], + "debug": { + "openocd_target": "esp32s2.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "Unexpected Maker RMP", + "upload": { + "flash_size": "4MB", + "maximum_ram_size": 327680, + "maximum_size": 4194304, + "use_1200bps_touch": true, + "wait_for_upload_port": true, + "require_upload_port": true, + "speed": 921600 + }, + "url": "https://unexpectedmaker.com/esp32s2", + "vendor": "Unexpected Maker" +} diff --git a/boards/um_tinys3.json b/boards/um_tinys3.json new file mode 100644 index 0000000..a700709 --- /dev/null +++ b/boards/um_tinys3.json @@ -0,0 +1,48 @@ +{ + "build": { + "arduino":{ + "ldscript": "esp32s3_out.ld", + "partitions": "default_8MB.csv" + }, + "core": "esp32", + "extra_flags": [ + "-DARDUINO_TINYS3", + "-DBOARD_HAS_PSRAM", + "-DARDUINO_USB_CDC_ON_BOOT=1", + "-DARDUINO_RUNNING_CORE=1", + "-DARDUINO_EVENT_RUNNING_CORE=1" + ], + "f_cpu": "240000000L", + "f_flash": "80000000L", + "flash_mode": "qio", + "hwids": [ + [ + "0X303A", + "0x80D0" + ] + ], + "mcu": "esp32s3", + "variant": "um_tinys3" + }, + "connectivity": [ + "wifi" + ], + "debug": { + "openocd_target": "esp32s3.cfg" + }, + "frameworks": [ + "arduino" + ], + "name": "Unexpected Maker TinyS3", + "upload": { + "flash_size": "8MB", + "maximum_ram_size": 327680, + "maximum_size": 8388608, + "use_1200bps_touch": true, + "wait_for_upload_port": true, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://unexpectedmaker.com/shop/ttinys3-esp32s3", + "vendor": "Unexpected Maker" +} diff --git a/boards/watchy.json b/boards/watchy.json new file mode 100644 index 0000000..f91eed0 --- /dev/null +++ b/boards/watchy.json @@ -0,0 +1,38 @@ +{ + "build": { + "arduino":{ + "ldscript": "esp32_out.ld", + "partitions": "huge_app.csv" + }, + "core": "esp32", + "extra_flags": "-DARDUINO_WATCHY", + "f_cpu": "240000000L", + "f_flash": "40000000L", + "flash_mode": "dio", + "mcu": "esp32", + "variant": "watchy" + }, + "connectivity": [ + "wifi", + "bluetooth", + "ethernet", + "can" + ], + "debug": { + "openocd_board": "esp-wroom-32.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "SQFMI Watchy v2.0", + "upload": { + "flash_size": "4MB", + "maximum_ram_size": 327680, + "maximum_size": 4194304, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://watchy.sqfmi.com/", + "vendor": "SQFMI" +} diff --git a/builder/frameworks/espidf.py b/builder/frameworks/espidf.py index 9b9db48..fa44c37 100644 --- a/builder/frameworks/espidf.py +++ b/builder/frameworks/espidf.py @@ -273,13 +273,15 @@ def load_target_configurations(cmake_codemodel, cmake_api_reply_dir): return configs -def build_library(default_env, lib_config, project_src_dir, prepend_dir=None): +def build_library( + default_env, lib_config, project_src_dir, prepend_dir=None, debug_allowed=True +): lib_name = lib_config["nameOnDisk"] lib_path = lib_config["paths"]["build"] if prepend_dir: lib_path = os.path.join(prepend_dir, lib_path) lib_objects = compile_source_files( - lib_config, default_env, project_src_dir, prepend_dir + lib_config, default_env, project_src_dir, prepend_dir, debug_allowed ) return default_env.Library( target=os.path.join("$BUILD_DIR", lib_path, lib_name), source=lib_objects @@ -427,57 +429,92 @@ def get_sdk_configuration(): return {} -def find_framework_service_files(search_path, sdk_config): - result = {} - result["lf_files"] = list() - result["kconfig_files"] = list() - result["kconfig_build_files"] = list() - for d in os.listdir(search_path): - path = os.path.join(search_path, d) - if not os.path.isdir(path): - continue - for f in os.listdir(path): - # Skip hardware specific files as they will be added later - if f == "linker.lf" and not os.path.basename(path).startswith( - ("esp32", "riscv") +def load_component_paths(framework_components_dir, ignored_component_prefixes=None): + def _scan_components_from_framework(): + result = [] + for component in os.listdir(framework_components_dir): + component_path = os.path.join(framework_components_dir, component) + if component.startswith(ignored_component_prefixes) or not os.path.isdir( + component_path ): - result["lf_files"].append(os.path.join(path, f)) - elif f == "Kconfig.projbuild": - result["kconfig_build_files"].append(os.path.join(path, f)) - elif f == "Kconfig": - result["kconfig_files"].append(os.path.join(path, f)) + continue + result.append(component_path) + + return result + + # First of all, try to load the list of used components from the project description + components = [] + ignored_component_prefixes = ignored_component_prefixes or [] + project_description_file = os.path.join(BUILD_DIR, "project_description.json") + if os.path.isfile(project_description_file): + with open(project_description_file) as fp: + try: + data = json.load(fp) + for path in data.get("build_component_paths", []): + if not os.path.basename(path).startswith( + ignored_component_prefixes + ): + components.append(path) + except: + print( + "Warning: Could not find load components from project description!\n" + ) + + return components or _scan_components_from_framework() + + +def extract_linker_script_fragments(framework_components_dir, sdk_config): + # Hardware-specific components are excluded from search and added manually below + project_components = load_component_paths( + framework_components_dir, ignored_component_prefixes=("esp32", "riscv") + ) + + result = [] + for component_path in project_components: + linker_fragment = os.path.join(component_path, "linker.lf") + if os.path.isfile(linker_fragment): + result.append(linker_fragment) + + if not result: + sys.stderr.write("Error: Failed to extract paths to linker script fragments\n") + env.Exit(1) if mcu == "esp32c3": - result["lf_files"].append( - os.path.join(FRAMEWORK_DIR, "components", "riscv", "linker.lf") - ) + result.append(os.path.join(framework_components_dir, "riscv", "linker.lf")) - result["lf_files"].extend( + result.extend( [ os.path.join( - FRAMEWORK_DIR, - "components", + framework_components_dir, idf_variant, "ld", "%s_fragments.lf" % idf_variant, ), os.path.join( - FRAMEWORK_DIR, - "components", + framework_components_dir, idf_variant, "linker.lf", ), - os.path.join(FRAMEWORK_DIR, "components", "newlib", "newlib.lf"), + os.path.join(framework_components_dir, "newlib", "newlib.lf"), ] ) if sdk_config.get("SPIRAM_CACHE_WORKAROUND", False): - result["lf_files"].append( + result.append( os.path.join( - FRAMEWORK_DIR, "components", "newlib", "esp32-spiram-rom-functions-c.lf" + framework_components_dir, "newlib", "esp32-spiram-rom-functions-c.lf" ) ) + if board.get("build.esp-idf.extra_lf_files", ""): + result.extend( + [ + lf if os.path.isabs(lf) else os.path.join(PROJECT_DIR, lf) + for lf in board.get("build.esp-idf.extra_lf_files").splitlines() + if lf.strip() + ] + ) + return result @@ -508,7 +545,7 @@ def create_custom_libraries_list(ldgen_libraries_file, ignore_targets): def generate_project_ld_script(sdk_config, ignore_targets=None): ignore_targets = ignore_targets or [] - project_files = find_framework_service_files( + linker_script_fragments = extract_linker_script_fragments( os.path.join(FRAMEWORK_DIR, "components"), sdk_config ) @@ -521,7 +558,9 @@ def generate_project_ld_script(sdk_config, ignore_targets=None): args = { "script": os.path.join(FRAMEWORK_DIR, "tools", "ldgen", "ldgen.py"), "config": SDKCONFIG_PATH, - "fragments": " ".join(['"%s"' % f for f in project_files.get("lf_files")]), + "fragments": " ".join( + ['"%s"' % fs.to_unix_path(f) for f in linker_script_fragments] + ), "kconfig": os.path.join(FRAMEWORK_DIR, "Kconfig"), "env_file": os.path.join("$BUILD_DIR", "config.env"), "libraries_list": libraries_list, @@ -553,11 +592,11 @@ def generate_project_ld_script(sdk_config, ignore_targets=None): ) -def prepare_build_envs(config, default_env): +def prepare_build_envs(config, default_env, debug_allowed=True): build_envs = [] target_compile_groups = config.get("compileGroups") - is_build_type_debug = "debug" in env.GetBuildType() + is_build_type_debug = "debug" in env.GetBuildType() and debug_allowed for cg in target_compile_groups: includes = [] sys_includes = [] @@ -587,8 +626,10 @@ def prepare_build_envs(config, default_env): return build_envs -def compile_source_files(config, default_env, project_src_dir, prepend_dir=None): - build_envs = prepare_build_envs(config, default_env) +def compile_source_files( + config, default_env, project_src_dir, prepend_dir=None, debug_allowed=True +): + build_envs = prepare_build_envs(config, default_env, debug_allowed) objects = [] components_dir = fs.to_unix_path(os.path.join(FRAMEWORK_DIR, "components")) for source in config.get("sources", []): @@ -703,7 +744,7 @@ def find_lib_deps(components_map, elf_config, link_args, ignore_components=None) return result -def build_bootloader(): +def build_bootloader(sdk_config): bootloader_src_dir = os.path.join( FRAMEWORK_DIR, "components", "bootloader", "subproject" ) @@ -743,7 +784,15 @@ def build_bootloader(): target_configs, ["STATIC_LIBRARY", "OBJECT_LIBRARY"] ) - build_components(bootloader_env, components_map, bootloader_src_dir, "bootloader") + # Note: By default the size of bootloader is limited to 0x2000 bytes, + # in debug mode the footprint size can be easily grow beyond this limit + build_components( + bootloader_env, + components_map, + bootloader_src_dir, + "bootloader", + debug_allowed=sdk_config.get("BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG", False), + ) link_args = extract_link_args(elf_config) extra_flags = filter_args(link_args["LINKFLAGS"], ["-T", "-u"]) link_args["LINKFLAGS"] = sorted( @@ -788,10 +837,12 @@ def get_components_map(target_configs, target_types, ignore_components=None): return result -def build_components(env, components_map, project_src_dir, prepend_dir=None): +def build_components( + env, components_map, project_src_dir, prepend_dir=None, debug_allowed=True +): for k, v in components_map.items(): components_map[k]["lib"] = build_library( - env, v["config"], project_src_dir, prepend_dir + env, v["config"], project_src_dir, prepend_dir, debug_allowed ) @@ -1232,7 +1283,7 @@ project_lib_includes = get_project_lib_includes(env) # Compile bootloader # -env.Depends("$BUILD_DIR/$PROGNAME$PROGSUFFIX", build_bootloader()) +env.Depends("$BUILD_DIR/$PROGNAME$PROGSUFFIX", build_bootloader(sdk_config)) # # Target: ESP-IDF menuconfig diff --git a/builder/main.py b/builder/main.py index ffd9c60..a601414 100644 --- a/builder/main.py +++ b/builder/main.py @@ -57,6 +57,10 @@ def _get_board_flash_mode(env): return mode +def _get_board_boot_mode(env): + return env.BoardConfig().get("build.boot", "$BOARD_FLASH_MODE") + + def _parse_size(value): if isinstance(value, int): return value @@ -111,8 +115,8 @@ def _update_max_upload_size(env): if not env.get("PARTITIONS_TABLE_CSV"): return sizes = [ - _parse_size(p['size']) for p in _parse_partitions(env) - if p['type'] in ("0", "app") + _parse_size(p["size"]) for p in _parse_partitions(env) + if p["type"] in ("0", "app") ] if sizes: board.update("upload.maximum_size", max(sizes)) @@ -167,6 +171,7 @@ if mcu == "esp32c3": toolchain_arch = "riscv32-esp" env.Replace( + __get_board_boot_mode=_get_board_boot_mode, __get_board_f_flash=_get_board_f_flash, __get_board_flash_mode=_get_board_flash_mode, diff --git a/examples/arduino-blink/platformio.ini b/examples/arduino-blink/platformio.ini index 8ad7204..ef4c39e 100644 --- a/examples/arduino-blink/platformio.ini +++ b/examples/arduino-blink/platformio.ini @@ -28,7 +28,15 @@ framework = arduino board = lolin32 monitor_speed = 115200 -[env:ttgo-lora32-v21] +[env:lolin_c3_mini] platform = espressif32 framework = arduino -board = ttgo-lora32-v21 +board = lolin_c3_mini +monitor_speed = 115200 + + +[env:esp32-s3-devkitc-1] +platform = espressif32 +framework = arduino +board = esp32-s3-devkitc-1 +monitor_speed = 115200 diff --git a/examples/arduino-blink/src/Blink.cpp b/examples/arduino-blink/src/Blink.cpp index 1b1c30f..5981d69 100644 --- a/examples/arduino-blink/src/Blink.cpp +++ b/examples/arduino-blink/src/Blink.cpp @@ -7,7 +7,9 @@ #include // Set LED_BUILTIN if it is not defined by Arduino framework -// #define LED_BUILTIN 2 +#ifndef LED_BUILTIN + #define LED_BUILTIN 2 +#endif void setup() { diff --git a/examples/espidf-hello-world/test/test_dummy/test_dummy.c b/examples/espidf-hello-world/test/test_dummy/test_dummy.c new file mode 100644 index 0000000..b0c7025 --- /dev/null +++ b/examples/espidf-hello-world/test/test_dummy/test_dummy.c @@ -0,0 +1,15 @@ +#include + +void test_dummy(void) +{ + TEST_ASSERT_EQUAL(1, 1); +} + +void app_main() +{ + UNITY_BEGIN(); + + RUN_TEST(test_dummy); + + UNITY_END(); +} \ No newline at end of file diff --git a/platform.json b/platform.json index cb48897..7c5d11a 100644 --- a/platform.json +++ b/platform.json @@ -18,7 +18,7 @@ "type": "git", "url": "https://github.com/platformio/platform-espressif32.git" }, - "version": "4.2.0", + "version": "4.3.0", "frameworks": { "arduino": { "package": "framework-arduinoespressif32", @@ -43,6 +43,12 @@ "optional": true, "owner": "espressif", "version": "8.4.0+2021r2-patch3" + }, + "toolchain-xtensa-esp32s3": { + "type": "toolchain", + "optional": true, + "owner": "espressif", + "version": "8.4.0+2021r2-patch3" }, "toolchain-riscv32-esp": { "type": "toolchain", @@ -66,7 +72,7 @@ "type": "framework", "optional": true, "owner": "platformio", - "version": "~3.20002.0" + "version": "~3.20003.0" }, "framework-arduino-mbcwb": { "type": "framework", diff --git a/platform.py b/platform.py index a3b3bc7..8d50f15 100644 --- a/platform.py +++ b/platform.py @@ -95,13 +95,18 @@ class Espressif32Platform(PlatformBase): elif p in ("tool-mconf", "tool-idf") and "windows" in get_systype(): self.packages[p]["optional"] = False - if mcu in ("esp32s2", "esp32c3"): - self.packages.pop("toolchain-xtensa-esp32", None) + for available_mcu in ("esp32", "esp32s2", "esp32s3"): + if available_mcu == mcu: + self.packages["toolchain-xtensa-%s" % mcu]["optional"] = False + else: + self.packages.pop("toolchain-xtensa-%s" % available_mcu, None) + + if mcu in ("esp32s2", "esp32s3", "esp32c3"): self.packages.pop("toolchain-esp32ulp", None) - # RISC-V based toolchain for ESP32C3 and ESP32S2 ULP + if mcu != "esp32s2": + self.packages.pop("toolchain-esp32s2ulp", None) + # RISC-V based toolchain for ESP32C3, ESP32S2, ESP32S3 ULP self.packages["toolchain-riscv32-esp"]["optional"] = False - if mcu == "esp32s2": - self.packages["toolchain-xtensa-esp32s2"]["optional"] = False is_legacy_project = ( build_core == "mbcwb" @@ -113,6 +118,7 @@ class Espressif32Platform(PlatformBase): for toolchain in ( "toolchain-xtensa-esp32", "toolchain-xtensa-esp32s2", + "toolchain-xtensa-esp32s3", "toolchain-riscv32-esp", ): self.packages.pop(toolchain, None) @@ -163,6 +169,7 @@ class Espressif32Platform(PlatformBase): supported_debug_tools = [ "cmsis-dap", "esp-prog", + "esp_usb_jtag", "iot-bus-jtag", "jlink", "minimodule", @@ -189,9 +196,7 @@ class Espressif32Platform(PlatformBase): if link in non_debug_protocols or link in debug["tools"]: continue - if link == "jlink": - openocd_interface = link - elif link == "cmsis-dap": + if link in ("jlink", "cmsis-dap", "esp_usb_jtag"): openocd_interface = link elif link in ("esp-prog", "ftdi"): if board.id == "esp32-s2-kaluga-1": @@ -334,6 +339,7 @@ class Espressif32Platform(PlatformBase): toolchain_remap = { "xtensa-esp32-elf-gcc": "toolchain-xtensa-esp32", "xtensa-esp32s2-elf-gcc": "toolchain-xtensa-esp32s2", + "xtensa-esp32s3-elf-gcc": "toolchain-xtensa-esp32s3", "riscv32-esp-elf-gcc": "toolchain-riscv32-esp", }