diff --git a/boards/esp32-c3-devkitm-1.json b/boards/esp32-c3-devkitm-1.json new file mode 100644 index 0000000..5b101a8 --- /dev/null +++ b/boards/esp32-c3-devkitm-1.json @@ -0,0 +1,32 @@ +{ + "build": { + "arduino":{ + "ldscript": "esp32c3_out.ld" + }, + "core": "esp32", + "f_cpu": "160000000L", + "f_flash": "80000000L", + "flash_mode": "qio", + "mcu": "esp32c3", + "variant": "esp32c3" + }, + "connectivity": [ + "wifi" + ], + "debug": { + "openocd_target": "esp32c3.cfg" + }, + "frameworks": [ + "espidf" + ], + "name": "Espressif ESP32-C3-DevKitM-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/esp32c3/hw-reference/esp32c3/user-guide-devkitm-1.html", + "vendor": "Espressif" +} diff --git a/builder/frameworks/espidf.py b/builder/frameworks/espidf.py index 572c1e5..c2b41ff 100644 --- a/builder/frameworks/espidf.py +++ b/builder/frameworks/espidf.py @@ -51,9 +51,16 @@ idf_variant = mcu.lower() FRAMEWORK_DIR = platform.get_package_dir("framework-espidf") TOOLCHAIN_DIR = platform.get_package_dir( - "toolchain-xtensa%s" % ("32s2" if mcu == "esp32s2" else "32") + "toolchain-%s" + % ( + "riscv-esp" + if mcu == "esp32c3" + else ("xtensa32s2" if mcu == "esp32s2" else "xtensa32") + ) ) + assert os.path.isdir(FRAMEWORK_DIR) +assert os.path.isdir(TOOLCHAIN_DIR) # Arduino framework as a component is not compatible with ESP-IDF >=4.1 if "arduino" in env.subst("$PIOFRAMEWORK"): @@ -207,12 +214,16 @@ def populate_idf_env_vars(idf_env): idf_env["IDF_PATH"] = FRAMEWORK_DIR additional_packages = [ os.path.join(TOOLCHAIN_DIR, "bin"), - os.path.join(platform.get_package_dir("toolchain-%sulp" % mcu), "bin"), platform.get_package_dir("tool-ninja"), os.path.join(platform.get_package_dir("tool-cmake"), "bin"), os.path.dirname(env.subst("$PYTHONEXE")), ] + if mcu != "esp32c3": + additional_packages.append( + os.path.join(platform.get_package_dir("toolchain-%sulp" % mcu), "bin"), + ) + if "windows" in get_systype(): additional_packages.append(platform.get_package_dir("tool-mconf")) @@ -417,6 +428,11 @@ def find_framework_service_files(search_path, sdk_config): elif f == "Kconfig": result["kconfig_files"].append(os.path.join(path, f)) + if mcu == "esp32c3": + result["lf_files"].append( + os.path.join(FRAMEWORK_DIR, "components", "riscv", "linker.lf") + ) + result["lf_files"].extend( [ os.path.join( @@ -892,46 +908,6 @@ def get_app_partition_offset(pt_table, pt_offset): return app_params.get("offset", "0x10000") -def build_tinyusb_lib(env): - tinyusb_dir = os.path.join(FRAMEWORK_DIR, "components", "tinyusb") - if not os.path.isdir(tinyusb_dir): - return - - envsafe = env.Clone() - envsafe.Replace( - CFLAGS=[], - CXXFLAGS=[], - CCFLAGS=["-mlongcalls"], - CPPDEFINES=[ - "HAVE_CONFIG_H", - ("MBEDTLS_CONFIG_FILE", '\\"mbedtls/esp_config.h\\"'), - "UNITY_INCLUDE_CONFIG_H", - "WITH_POSIX", - ("CFG_TUSB_MCU", "OPT_MCU_ESP32_S2"), - ], - ) - - envsafe.BuildSources( - os.path.join("$BUILD_DIR", "tinyusb"), - tinyusb_dir, - src_filter=[ - "-<*>", - "+", - "+", - "+", - "+", - "+", - "+", - "+", - "+", - "+", - "+", - "+", - "+", - ], - ) - - def generate_mbedtls_bundle(sdk_config): bundle_path = os.path.join("$BUILD_DIR", "x509_crt_bundle") if os.path.isfile(env.subst(bundle_path)): @@ -1319,7 +1295,9 @@ env.Prepend( LIBS=libs, FLASH_EXTRA_IMAGES=[ ( - board.get("upload.bootloader_offset", "0x1000"), + board.get( + "upload.bootloader_offset", "0x0" if mcu == "esp32c3" else "0x1000" + ), os.path.join("$BUILD_DIR", "bootloader.bin"), ), ( @@ -1351,7 +1329,7 @@ env["BUILDERS"]["ElfToBin"].action = action # ulp_dir = os.path.join(PROJECT_DIR, "ulp") -if os.path.isdir(ulp_dir) and os.listdir(ulp_dir): +if os.path.isdir(ulp_dir) and os.listdir(ulp_dir) and mcu != "esp32c3": env.SConscript("ulp.py", exports="env project_config idf_variant") # diff --git a/builder/main.py b/builder/main.py index 0172f32..006cbe9 100644 --- a/builder/main.py +++ b/builder/main.py @@ -133,20 +133,23 @@ env.SConscript("compat.py", exports="env") platform = env.PioPlatform() board = env.BoardConfig() mcu = board.get("build.mcu", "esp32") +toolchain_arch = "xtensa-%s" % mcu +if mcu == "esp32c3": + toolchain_arch = "riscv32-esp" env.Replace( __get_board_f_flash=_get_board_f_flash, __get_board_flash_mode=_get_board_flash_mode, - AR="xtensa-%s-elf-ar" % mcu, - AS="xtensa-%s-elf-as" % mcu, - CC="xtensa-%s-elf-gcc" % mcu, - CXX="xtensa-%s-elf-g++" % mcu, - GDB="xtensa-%s-elf-gdb" % mcu, + AR="%s-elf-ar" % toolchain_arch, + AS="%s-elf-as" % toolchain_arch, + CC="%s-elf-gcc" % toolchain_arch, + CXX="%s-elf-g++" % toolchain_arch, + GDB="%s-elf-gdb" % toolchain_arch, OBJCOPY=join( platform.get_package_dir("tool-esptoolpy") or "", "esptool.py"), - RANLIB="xtensa-%s-elf-ranlib" % mcu, - SIZETOOL="xtensa-%s-elf-size" % mcu, + RANLIB="%s-elf-ranlib" % toolchain_arch, + SIZETOOL="%s-elf-size" % toolchain_arch, ARFLAGS=["rc"], diff --git a/examples/espidf-hello-world/platformio.ini b/examples/espidf-hello-world/platformio.ini index 35879a6..76fdc18 100644 --- a/examples/espidf-hello-world/platformio.ini +++ b/examples/espidf-hello-world/platformio.ini @@ -15,8 +15,8 @@ monitor_speed = 115200 [env:esp32dev] board = esp32dev -[env:esp-wrover-kit] -board = esp-wrover-kit +[env:esp32-s2-kaluga-1] +board = esp32-s2-kaluga-1 -[env:lolin32] -board = lolin32 +[env:esp32-c3-devkitm-1] +board = esp32-c3-devkitm-1 diff --git a/platform.json b/platform.json index 2539de8..8333bb6 100644 --- a/platform.json +++ b/platform.json @@ -71,6 +71,12 @@ "owner": "platformio", "version": "~1.22851.0" }, + "toolchain-riscv-esp": { + "type": "toolchain", + "optional": true, + "owner": "platformio", + "version": "~1.80400.0" + }, "framework-arduinoespressif32": { "type": "framework", "optional": true, diff --git a/platform.py b/platform.py index 562ecaf..0562a2f 100644 --- a/platform.py +++ b/platform.py @@ -41,16 +41,18 @@ class Espressif32Platform(PlatformBase): elif p in ("tool-mconf", "tool-idf") and "windows" in get_systype(): self.packages[p]["optional"] = False self.packages["toolchain-xtensa32"]["version"] = "~2.80400.0" + self.packages["tool-esptoolpy"]["version"] = "~1.30100.0" if "arduino" in frameworks: # Arduino component is not compatible with ESP-IDF >=4.1 self.packages["framework-espidf"]["version"] = "~3.40001.0" - # ESP32-S2 toolchain is identical for both Arduino and ESP-IDF - if mcu == "esp32s2": + if mcu in ("esp32s2", "esp32c3"): self.packages.pop("toolchain-xtensa32", None) self.packages.pop("toolchain-esp32ulp", None) - self.packages["toolchain-xtensa32s2"]["optional"] = False - self.packages["toolchain-esp32s2ulp"]["optional"] = False - self.packages["tool-esptoolpy"]["version"] = "~1.30100.0" + # RISC-V based toolchain for ESP32C3 and ESP32S2 ULP + self.packages["toolchain-riscv-esp"]["optional"] = False + if mcu == "esp32s2": + self.packages["toolchain-xtensa32s2"]["optional"] = False + self.packages["toolchain-esp32s2ulp"]["optional"] = False build_core = variables.get( "board_build.core", board_config.get("build.core", "arduino")