Skip to content

Commit b073ed8

Browse files
committed
Initial support for ESP32C3
Resolve platformio#568, resolve platformio#497
1 parent 5384f15 commit b073ed8

File tree

6 files changed

+81
-60
lines changed

6 files changed

+81
-60
lines changed

boards/esp32-c3-devkitm-1.json

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
{
2+
"build": {
3+
"arduino":{
4+
"ldscript": "esp32c3_out.ld"
5+
},
6+
"core": "esp32",
7+
"f_cpu": "160000000L",
8+
"f_flash": "80000000L",
9+
"flash_mode": "qio",
10+
"mcu": "esp32c3",
11+
"variant": "esp32c3"
12+
},
13+
"connectivity": [
14+
"wifi"
15+
],
16+
"debug": {
17+
"openocd_target": "esp32c3.cfg"
18+
},
19+
"frameworks": [
20+
"espidf"
21+
],
22+
"name": "Espressif ESP32-C3-DevKitM-1",
23+
"upload": {
24+
"flash_size": "4MB",
25+
"maximum_ram_size": 327680,
26+
"maximum_size": 4194304,
27+
"require_upload_port": true,
28+
"speed": 460800
29+
},
30+
"url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c3/hw-reference/esp32c3/user-guide-devkitm-1.html",
31+
"vendor": "Espressif"
32+
}

builder/frameworks/espidf.py

Lines changed: 22 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,16 @@
5151

5252
FRAMEWORK_DIR = platform.get_package_dir("framework-espidf")
5353
TOOLCHAIN_DIR = platform.get_package_dir(
54-
"toolchain-xtensa%s" % ("32s2" if mcu == "esp32s2" else "32")
54+
"toolchain-%s"
55+
% (
56+
"riscv-esp"
57+
if mcu == "esp32c3"
58+
else ("xtensa32s2" if mcu == "esp32s2" else "xtensa32")
59+
)
5560
)
61+
5662
assert os.path.isdir(FRAMEWORK_DIR)
63+
assert os.path.isdir(TOOLCHAIN_DIR)
5764

5865
# Arduino framework as a component is not compatible with ESP-IDF >=4.1
5966
if "arduino" in env.subst("$PIOFRAMEWORK"):
@@ -207,12 +214,16 @@ def populate_idf_env_vars(idf_env):
207214
idf_env["IDF_PATH"] = FRAMEWORK_DIR
208215
additional_packages = [
209216
os.path.join(TOOLCHAIN_DIR, "bin"),
210-
os.path.join(platform.get_package_dir("toolchain-%sulp" % mcu), "bin"),
211217
platform.get_package_dir("tool-ninja"),
212218
os.path.join(platform.get_package_dir("tool-cmake"), "bin"),
213219
os.path.dirname(env.subst("$PYTHONEXE")),
214220
]
215221

222+
if mcu != "esp32c3":
223+
additional_packages.append(
224+
os.path.join(platform.get_package_dir("toolchain-%sulp" % mcu), "bin"),
225+
)
226+
216227
if "windows" in get_systype():
217228
additional_packages.append(platform.get_package_dir("tool-mconf"))
218229

@@ -417,6 +428,11 @@ def find_framework_service_files(search_path, sdk_config):
417428
elif f == "Kconfig":
418429
result["kconfig_files"].append(os.path.join(path, f))
419430

431+
if mcu == "esp32c3":
432+
result["lf_files"].append(
433+
os.path.join(FRAMEWORK_DIR, "components", "riscv", "linker.lf")
434+
)
435+
420436
result["lf_files"].extend(
421437
[
422438
os.path.join(
@@ -892,46 +908,6 @@ def get_app_partition_offset(pt_table, pt_offset):
892908
return app_params.get("offset", "0x10000")
893909

894910

895-
def build_tinyusb_lib(env):
896-
tinyusb_dir = os.path.join(FRAMEWORK_DIR, "components", "tinyusb")
897-
if not os.path.isdir(tinyusb_dir):
898-
return
899-
900-
envsafe = env.Clone()
901-
envsafe.Replace(
902-
CFLAGS=[],
903-
CXXFLAGS=[],
904-
CCFLAGS=["-mlongcalls"],
905-
CPPDEFINES=[
906-
"HAVE_CONFIG_H",
907-
("MBEDTLS_CONFIG_FILE", '\\"mbedtls/esp_config.h\\"'),
908-
"UNITY_INCLUDE_CONFIG_H",
909-
"WITH_POSIX",
910-
("CFG_TUSB_MCU", "OPT_MCU_ESP32_S2"),
911-
],
912-
)
913-
914-
envsafe.BuildSources(
915-
os.path.join("$BUILD_DIR", "tinyusb"),
916-
tinyusb_dir,
917-
src_filter=[
918-
"-<*>",
919-
"+<port/common/src/descriptors_control.c>",
920-
"+<port/common/src/usb_descriptors.c>",
921-
"+<port/common/src/usbd.c>",
922-
"+<port/esp32s2/src/device_controller_driver.c>",
923-
"+<port/esp32s2/src/tinyusb.c>",
924-
"+<tinyusb/src/common/tusb_fifo.c>",
925-
"+<tinyusb/src/device/usbd_control.c>",
926-
"+<tinyusb/src/class/msc/msc_device.c>",
927-
"+<tinyusb/src/class/cdc/cdc_device.c>",
928-
"+<tinyusb/src/class/hid/hid_device.c>",
929-
"+<tinyusb/src/class/midi/midi_device.c>",
930-
"+<tinyusb/src/tusb.c>",
931-
],
932-
)
933-
934-
935911
def generate_mbedtls_bundle(sdk_config):
936912
bundle_path = os.path.join("$BUILD_DIR", "x509_crt_bundle")
937913
if os.path.isfile(env.subst(bundle_path)):
@@ -1319,7 +1295,9 @@ def _skip_prj_source_files(node):
13191295
LIBS=libs,
13201296
FLASH_EXTRA_IMAGES=[
13211297
(
1322-
board.get("upload.bootloader_offset", "0x1000"),
1298+
board.get(
1299+
"upload.bootloader_offset", "0x0" if mcu == "esp32c3" else "0x1000"
1300+
),
13231301
os.path.join("$BUILD_DIR", "bootloader.bin"),
13241302
),
13251303
(
@@ -1351,7 +1329,7 @@ def _skip_prj_source_files(node):
13511329
#
13521330

13531331
ulp_dir = os.path.join(PROJECT_DIR, "ulp")
1354-
if os.path.isdir(ulp_dir) and os.listdir(ulp_dir):
1332+
if os.path.isdir(ulp_dir) and os.listdir(ulp_dir) and mcu != "esp32c3":
13551333
env.SConscript("ulp.py", exports="env project_config idf_variant")
13561334

13571335
#

builder/main.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -133,20 +133,23 @@ def __fetch_spiffs_size(target, source, env):
133133
platform = env.PioPlatform()
134134
board = env.BoardConfig()
135135
mcu = board.get("build.mcu", "esp32")
136+
toolchain_arch = "xtensa-%s" % mcu
137+
if mcu == "esp32c3":
138+
toolchain_arch = "riscv32-esp"
136139

137140
env.Replace(
138141
__get_board_f_flash=_get_board_f_flash,
139142
__get_board_flash_mode=_get_board_flash_mode,
140143

141-
AR="xtensa-%s-elf-ar" % mcu,
142-
AS="xtensa-%s-elf-as" % mcu,
143-
CC="xtensa-%s-elf-gcc" % mcu,
144-
CXX="xtensa-%s-elf-g++" % mcu,
145-
GDB="xtensa-%s-elf-gdb" % mcu,
144+
AR="%s-elf-ar" % toolchain_arch,
145+
AS="%s-elf-as" % toolchain_arch,
146+
CC="%s-elf-gcc" % toolchain_arch,
147+
CXX="%s-elf-g++" % toolchain_arch,
148+
GDB="%s-elf-gdb" % toolchain_arch,
146149
OBJCOPY=join(
147150
platform.get_package_dir("tool-esptoolpy") or "", "esptool.py"),
148-
RANLIB="xtensa-%s-elf-ranlib" % mcu,
149-
SIZETOOL="xtensa-%s-elf-size" % mcu,
151+
RANLIB="%s-elf-ranlib" % toolchain_arch,
152+
SIZETOOL="%s-elf-size" % toolchain_arch,
150153

151154
ARFLAGS=["rc"],
152155

examples/espidf-hello-world/platformio.ini

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ monitor_speed = 115200
1515
[env:esp32dev]
1616
board = esp32dev
1717

18-
[env:esp-wrover-kit]
19-
board = esp-wrover-kit
18+
[env:esp32-s2-kaluga-1]
19+
board = esp32-s2-kaluga-1
2020

21-
[env:lolin32]
22-
board = lolin32
21+
[env:esp32-c3-devkitm-1]
22+
board = esp32-c3-devkitm-1

platform.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,12 @@
7171
"owner": "platformio",
7272
"version": "~1.22851.0"
7373
},
74+
"toolchain-riscv-esp": {
75+
"type": "toolchain",
76+
"optional": true,
77+
"owner": "platformio",
78+
"version": "~1.80400.0"
79+
},
7480
"framework-arduinoespressif32": {
7581
"type": "framework",
7682
"optional": true,

platform.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,18 @@ def configure_default_packages(self, variables, targets):
4141
elif p in ("tool-mconf", "tool-idf") and "windows" in get_systype():
4242
self.packages[p]["optional"] = False
4343
self.packages["toolchain-xtensa32"]["version"] = "~2.80400.0"
44+
self.packages["tool-esptoolpy"]["version"] = "~1.30100.0"
4445
if "arduino" in frameworks:
4546
# Arduino component is not compatible with ESP-IDF >=4.1
4647
self.packages["framework-espidf"]["version"] = "~3.40001.0"
47-
# ESP32-S2 toolchain is identical for both Arduino and ESP-IDF
48-
if mcu == "esp32s2":
48+
if mcu in ("esp32s2", "esp32c3"):
4949
self.packages.pop("toolchain-xtensa32", None)
5050
self.packages.pop("toolchain-esp32ulp", None)
51-
self.packages["toolchain-xtensa32s2"]["optional"] = False
52-
self.packages["toolchain-esp32s2ulp"]["optional"] = False
53-
self.packages["tool-esptoolpy"]["version"] = "~1.30100.0"
51+
# RISC-V based toolchain for ESP32C3 and ESP32S2 ULP
52+
self.packages["toolchain-riscv-esp"]["optional"] = False
53+
if mcu == "esp32s2":
54+
self.packages["toolchain-xtensa32s2"]["optional"] = False
55+
self.packages["toolchain-esp32s2ulp"]["optional"] = False
5456

5557
build_core = variables.get(
5658
"board_build.core", board_config.get("build.core", "arduino")

0 commit comments

Comments
 (0)