Skip to content

Commit 2edc087

Browse files
committed
feat: Added ESP32 support, including pin definitions and hardware interface implementations
1 parent 8d8af48 commit 2edc087

File tree

7 files changed

+368
-37
lines changed

7 files changed

+368
-37
lines changed

boards.txt

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,4 +202,55 @@ ln882h.compiler.flags.ld_scripts=-Wl,--cref -Wl,-Map={build.path}/{build.project
202202
ln882h.upload.tool=tyutool
203203
ln882h.upload.tool.default=tyutool
204204

205-
ln882h.monitor_port.serial.baudrate=921600
205+
ln882h.monitor_port.serial.baudrate=115200
206+
207+
# --------------------------------------------------
208+
# ESP32
209+
# --------------------------------------------------
210+
esp32.name=ESP32
211+
esp32.build.chip=esp32
212+
esp32.build.board=ESP32
213+
esp32.build.core=tuya_open
214+
esp32.build.variant=esp32
215+
216+
esp32.menu.UploadSpeed.921600=921600
217+
esp32.menu.UploadSpeed.921600.upload.speed=921600
218+
esp32.menu.UploadSpeed.115200=115200
219+
esp32.menu.UploadSpeed.115200.upload.speed=115200
220+
esp32.menu.UploadSpeed.230400=230400
221+
esp32.menu.UploadSpeed.230400.upload.speed=230400
222+
esp32.menu.UploadSpeed.460800=460800
223+
esp32.menu.UploadSpeed.460800.upload.speed=460800
224+
esp32.menu.UploadSpeed.1500000=1500000
225+
esp32.menu.UploadSpeed.1500000.upload.speed=1500000
226+
esp32.menu.UploadSpeed.2000000=2000000
227+
esp32.menu.UploadSpeed.2000000.upload.speed=2000000
228+
229+
esp32.compiler.path={runtime.tools.xtensa-esp-elf.path}
230+
esp32.compiler.cmd.S={compiler.path}/bin/xtensa-esp32-elf-gcc
231+
esp32.compiler.cmd.c={compiler.path}/bin/xtensa-esp32-elf-gcc
232+
esp32.compiler.cmd.cpp={compiler.path}/bin/xtensa-esp32-elf-g++
233+
esp32.compiler.cmd.ar={compiler.path}/bin/xtensa-esp32-elf-ar
234+
esp32.compiler.cmd.ld={compiler.path}/bin/xtensa-esp32-elf-g++
235+
236+
esp32.vendor.path={runtime.tools.vendor-esp32.path}
237+
esp32.compiler.flags.S=@{runtime.tools.vendor-esp32.path}/flags/S_flags.txt
238+
esp32.compiler.flags.c=@{runtime.tools.vendor-esp32.path}/flags/c_flags.txt
239+
esp32.compiler.flags.cpp=@{runtime.tools.vendor-esp32.path}/flags/cpp_flags.txt
240+
esp32.compiler.flags.ar=@{runtime.tools.vendor-esp32.path}/flags/ar_flags.txt
241+
242+
esp32.appBuild.flags=@{build.path}/tuyaTmp/appConfig/appBuildDefine.txt
243+
244+
esp32.compiler.includes.tuya_open=-iprefix {runtime.tools.vendor-esp32.path}/ @{runtime.tools.vendor-esp32.path}/flags/include_tuya_open.txt
245+
esp32.compiler.includes.tkl=-iprefix {runtime.tools.vendor-esp32.path}/ @{runtime.tools.vendor-esp32.path}/flags/include_tkl.txt
246+
esp32.compiler.includes.vendor=-iprefix {runtime.tools.vendor-esp32.path}/ @{runtime.tools.vendor-esp32.path}/flags/include_vendor.txt
247+
esp32.compiler.includes={compiler.includes.tuya_open} {compiler.includes.tkl} {compiler.includes.vendor}
248+
249+
esp32.compiler.flags.ld=@{runtime.tools.vendor-esp32.path}/flags/ld_flags.txt
250+
esp32.compiler.flags.libs=-L{runtime.tools.vendor-esp32.path}/libs -L{runtime.tools.vendor-esp32.path}/link_path/tuya_open_sdk/build/esp-idf/esp_system/ld -L{runtime.tools.vendor-esp32.path}/link_path/esp-idf/components/bt/controller/lib_esp32/esp32 -L{runtime.tools.vendor-esp32.path}/link_path/esp-idf/components/esp_coex/lib/esp32 -L{runtime.tools.vendor-esp32.path}/link_path/esp-idf/components/esp_phy/lib/esp32 -L{runtime.tools.vendor-esp32.path}/link_path/esp-idf/components/esp_rom/esp32/ld -L{runtime.tools.vendor-esp32.path}/link_path/esp-idf/components/esp_wifi/lib/esp32 -L{runtime.tools.vendor-esp32.path}/link_path/esp-idf/components/soc/esp32/ld @{runtime.tools.vendor-esp32.path}/flags/libs_flags.txt
251+
esp32.compiler.flags.ld_scripts=-Wl,--cref -Wl,-Map={build.path}/{build.project_name}.map -o {build.path}/{build.project_name}.elf
252+
253+
esp32.upload.tool=tyutool
254+
esp32.upload.tool.default=tyutool
255+
256+
esp32.monitor_port.serial.baudrate=115200

cores/tuya_open/tuya_app_main.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
***********************variable define**********************
4242
***********************************************************/
4343
static THREAD_HANDLE arduino_thrd_hdl = NULL;
44+
static char thread_name[] = "arduino_thread";
4445

4546
/***********************************************************
4647
***********************function define**********************
@@ -79,7 +80,9 @@ void app_open_sdk_init(void)
7980
// TODO: set country code
8081
// TODO: use netconn_wifi functions
8182
tal_wifi_init(__wifi_callback_event);
83+
#if (!defined(ARDUINO_T5) && !defined(ARDUINO_ESP32))
8284
tal_wifi_set_country_code("CN");
85+
#endif
8386
}
8487

8588
static void ArduinoThread(void *arg)
@@ -92,9 +95,9 @@ static void ArduinoThread(void *arg)
9295
}
9396
#endif // defined(ARDUINO_T2)
9497

95-
#if (!defined(ARDUINO_LN882H))
98+
#if (!defined(ARDUINO_LN882H)&& !defined(ARDUINO_ESP32))
9699
tkl_uart_deinit(TUYA_UART_NUM_0);
97-
#if (!defined(ARDUINO_T3) && !defined(ARDUINO_T5))
100+
#if (!defined(ARDUINO_T3) && !defined(ARDUINO_T5) && !defined(ARDUINO_ESP32))
98101
tkl_uart_deinit(TUYA_UART_NUM_1); // TODO: close vendor log
99102
#endif
100103
#endif // (!defined(ARDUINO_LN882H))
@@ -106,10 +109,10 @@ static void ArduinoThread(void *arg)
106109

107110
void tuya_app_main(void)
108111
{
109-
#if (!defined(ARDUINO_T5))
112+
#if (!defined(ARDUINO_T5) && !defined(ARDUINO_ESP32))
110113
__asm("BL __libc_init_array");
111114
#endif
112115

113-
THREAD_CFG_T thrd_param = {1024 * 4, THREAD_PRIO_1, "arduino_thread"};
116+
THREAD_CFG_T thrd_param = {1024 * 4, THREAD_PRIO_1, thread_name};
114117
tal_thread_create_and_start(&arduino_thrd_hdl, NULL, NULL, ArduinoThread, NULL, &thrd_param);
115118
}

script/make_boards.py

Lines changed: 34 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@
99
compiler_path = "{runtime.tools.gcc-arm-none-eabi.path}"
1010

1111
class board_info_class():
12-
def __init__(self, name, chip, vendor_name, product_name, variant, upload_baud_rate_list, toolchain=compiler_path, core="tuya_open"):
13-
self.name = name
14-
self.chip = chip
15-
self.vendor_name = vendor_name
16-
self.product_name = product_name
17-
self.variant = variant
18-
self.toolchain = toolchain
12+
def __init__(self, name, chip, vendor_name, product_name, variant, upload_baud_rate_list, toolchain=compiler_path, toolchain_pre="arm-none-eabi-", core="tuya_open"):
13+
self.name = name # board name in boards.txt
14+
self.chip = chip # chip name
15+
self.vendor_name = vendor_name # board manufacturer name
16+
self.product_name = product_name # board name
17+
self.variant = variant # variant name
18+
self.toolchain = toolchain # toolchain
19+
self.toolchain_pre = toolchain_pre # toolchain prefix
1920
self.core = core
2021

2122
# upload baud rate
@@ -49,16 +50,15 @@ def build_header(bi):
4950

5051
def build_toolchain(bi):
5152
print()
52-
# compiler_path = bi.toolchain
5353
print(f"{bi.name}.compiler.path={bi.toolchain}")
54-
print(f"{bi.name}.compiler.cmd.S={{compiler.path}}/bin/arm-none-eabi-gcc")
55-
print(f"{bi.name}.compiler.cmd.c={{compiler.path}}/bin/arm-none-eabi-gcc")
56-
print(f"{bi.name}.compiler.cmd.cpp={{compiler.path}}/bin/arm-none-eabi-g++")
57-
print(f"{bi.name}.compiler.cmd.ar={{compiler.path}}/bin/arm-none-eabi-ar")
54+
print(f"{bi.name}.compiler.cmd.S={{compiler.path}}/bin/{bi.toolchain_pre}gcc")
55+
print(f"{bi.name}.compiler.cmd.c={{compiler.path}}/bin/{bi.toolchain_pre}gcc")
56+
print(f"{bi.name}.compiler.cmd.cpp={{compiler.path}}/bin/{bi.toolchain_pre}g++")
57+
print(f"{bi.name}.compiler.cmd.ar={{compiler.path}}/bin/{bi.toolchain_pre}ar")
5858
if bi.chip == "t2" or bi.chip == "t3":
59-
print(f"{bi.name}.compiler.cmd.ld={{compiler.path}}/bin/arm-none-eabi-gcc")
59+
print(f"{bi.name}.compiler.cmd.ld={{compiler.path}}/bin/{bi.toolchain_pre}gcc")
6060
else:
61-
print(f"{bi.name}.compiler.cmd.ld={{compiler.path}}/bin/arm-none-eabi-g++")
61+
print(f"{bi.name}.compiler.cmd.ld={{compiler.path}}/bin/{bi.toolchain_pre}g++")
6262

6363
def build_flags(bi):
6464
print()
@@ -88,16 +88,18 @@ def build_flags(bi):
8888
## combine
8989
print()
9090
print(f"{bi.name}.compiler.flags.ld=@{vendor_path}/flags/ld_flags.txt")
91-
print(f"{bi.name}.compiler.flags.libs=-L{vendor_path}/libs @{vendor_path}/flags/libs_flags.txt")
92-
ld_scripts_path = vendor_path + "/packager-tools/" + bi.chip + ".ld"
93-
print(f"{bi.name}.compiler.flags.ld_scripts=-Wl,--cref -Wl,-Map={{build.path}}/{{build.project_name}}.map -T{ld_scripts_path} -o {{build.path}}/{{build.project_name}}.elf")
91+
if bi.chip == 'esp32':
92+
print(f"{bi.name}.compiler.flags.libs=-L{vendor_path}/libs -L{vendor_path}/link_path/tuya_open_sdk/build/esp-idf/esp_system/ld -L{vendor_path}/link_path/esp-idf/components/bt/controller/lib_esp32/esp32 -L{vendor_path}/link_path/esp-idf/components/esp_coex/lib/esp32 -L{vendor_path}/link_path/esp-idf/components/esp_phy/lib/esp32 -L{vendor_path}/link_path/esp-idf/components/esp_rom/esp32/ld -L{vendor_path}/link_path/esp-idf/components/esp_wifi/lib/esp32 -L{vendor_path}/link_path/esp-idf/components/soc/esp32/ld @{vendor_path}/flags/libs_flags.txt")
93+
print(f"{bi.name}.compiler.flags.ld_scripts=-Wl,--cref -Wl,-Map={{build.path}}/{{build.project_name}}.map -o {{build.path}}/{{build.project_name}}.elf")
94+
else:
95+
print(f"{bi.name}.compiler.flags.libs=-L{vendor_path}/libs @{vendor_path}/flags/libs_flags.txt")
96+
ld_scripts_path = vendor_path + "/packager-tools/" + bi.chip + ".ld"
97+
print(f"{bi.name}.compiler.flags.ld_scripts=-Wl,--cref -Wl,-Map={{build.path}}/{{build.project_name}}.map -T{ld_scripts_path} -o {{build.path}}/{{build.project_name}}.elf")
9498

9599
def build_upload(bi):
96100
print()
97101
print(f"{bi.name}.upload.tool=tyutool")
98102
print(f"{bi.name}.upload.tool.default=tyutool")
99-
# print(f"{bi.name}.upload.tool.baud_rate={bi.upload_baud_rate}")
100-
# print(f"{bi.name}.upload.tool.baud_rate={{upload.speed}}")
101103

102104
def build_monitor(bi):
103105
print()
@@ -112,8 +114,7 @@ def build_menu(bi):
112114
print(f"{bi.name}.menu.UploadSpeed.{baud_rate}={baud_rate}")
113115
print(f"{bi.name}.menu.UploadSpeed.{baud_rate}.upload.speed={baud_rate}")
114116

115-
def make_board(name, chip, vendor_name, product_name, variant, upload_baud_rate_list):
116-
board_info = board_info_class(name, chip, vendor_name, product_name, variant, upload_baud_rate_list)
117+
def make_board(board_info):
117118

118119
build_header(board_info)
119120
build_menu(board_info)
@@ -133,13 +134,21 @@ def make_board(name, chip, vendor_name, product_name, variant, upload_baud_rate_
133134
build_menu_head()
134135

135136
t2_upload_speed_list = [921600, 115200, 230400, 460800, 1500000, 2000000]
136-
make_board("t2", "t2", "", "T2", "t2", t2_upload_speed_list)
137+
t2_bi = board_info_class("t2", "t2", "", "T2", "t2", t2_upload_speed_list, compiler_path, "arm-none-eabi-", "tuya_open")
138+
make_board(t2_bi)
137139

138140
t3_upload_speed_list = [921600, 115200, 230400, 460800, 1500000, 2000000]
139-
make_board("t3", "t3", "", "T3", "t3", t3_upload_speed_list)
141+
t3_bi = board_info_class("t3", "t3", "", "T3", "t3", t3_upload_speed_list, compiler_path, "arm-none-eabi-", "tuya_open")
142+
make_board(t3_bi)
140143

141144
t5_upload_speed_list = [921600, 115200, 230400, 460800, 1500000, 2000000]
142-
make_board("t5", "t5", "", "T5", "t5", t5_upload_speed_list)
145+
t5_bi = board_info_class("t5", "t5", "", "T5", "t5", t5_upload_speed_list, compiler_path, "arm-none-eabi-", "tuya_open")
146+
make_board(t5_bi)
143147

144148
ln882h_upload_speed_list = [921600, 115200, 230400, 460800, 1500000, 2000000]
145-
make_board("ln882h", "ln882h", "", "LN882H", "ln882h", ln882h_upload_speed_list)
149+
ln882h_bi = board_info_class("ln882h", "ln882h", "", "LN882H", "ln882h", ln882h_upload_speed_list, compiler_path, "arm-none-eabi-", "tuya_open")
150+
make_board(ln882h_bi)
151+
152+
esp32_upload_speed_list = [921600, 115200, 230400, 460800, 1500000, 2000000]
153+
esp_bi = board_info_class("esp32", "esp32", "", "ESP32", "esp32", esp32_upload_speed_list, "{runtime.tools.xtensa-esp-elf.path}", "xtensa-esp32-elf-", "tuya_open")
154+
make_board(esp_bi)

tools/packager/packager.py

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,29 @@
1111
from .packager_t2 import get_qio_binary_t2
1212
from .packager_t3_t5 import get_qio_binary_t3_t5
1313
from .packager_ln882h import get_qio_binary_ln882h
14+
from .packager_esp32 import get_qio_binary_esp32
1415

1516
class packager_class():
1617
def __init__(self, chip, compiler_path, tools_path, output_path, sketch_name, sketch_version):
1718
self.chip_info = chip_info_class(chip, compiler_path, tools_path, output_path, sketch_name, sketch_version)
1819

1920
def elf_to_binary(self):
20-
objcopy_tool = os.path.join(self.chip_info.compiler_path, 'bin', 'arm-none-eabi-objcopy')
21+
# .elf -> .bin tool
22+
objcopy_tool = ''
23+
if self.chip_info.chip == 'esp32':
24+
if platform.system() == 'Linux':
25+
objcopy_tool = os.path.join(self.chip_info.tools_path, 'linux', 'esptool')
26+
elif platform.system() == 'Windows':
27+
objcopy_tool = os.path.join(self.chip_info.tools_path, 'windows', 'esptool')
28+
elif platform.system() == 'Darwin':
29+
mac_arch = platform.machine()
30+
logging.info(f"MAC machine is: {mac_arch}")
31+
objcopy_tool = os.path.join(self.chip_info.tools_path, 'mac', mac_arch, 'esptool')
32+
else:
33+
logging.error(f"Unknown OS: {platform.system()}")
34+
return False
35+
else:
36+
objcopy_tool = os.path.join(self.chip_info.compiler_path, 'bin', 'arm-none-eabi-objcopy')
2137
elf_file = os.path.join(self.chip_info.output_path, self.chip_info.sketch_name + '.elf')
2238
bin_file = os.path.join(self.chip_info.output_path, self.chip_info.sketch_name + '.bin')
2339

@@ -32,12 +48,13 @@ def elf_to_binary(self):
3248
logging.error(f"{elf_file} file not found")
3349
return False
3450

35-
objcopy_command = [
36-
objcopy_tool,
37-
'-O', 'binary',
38-
elf_file,
39-
bin_file
40-
]
51+
objcopy_command = []
52+
if self.chip_info.chip == 'esp32':
53+
# TODO: flash_freq and flash_size should be configurable
54+
bin_file = os.path.join(self.chip_info.output_path, self.chip_info.sketch_name + '_app.bin')
55+
objcopy_command = [objcopy_tool, '--chip', 'esp32', 'elf2image', '--flash_mode', 'dio', '--flash_freq', '40m', '--flash_size', '4MB', '--elf-sha256-offset', '0xb0', '--min-rev-full', '0', '--max-rev-full', '399', '-o', bin_file, elf_file]
56+
else:
57+
objcopy_command = [objcopy_tool, '-O', 'binary', elf_file, bin_file]
4158
logging.debug("objcopy_command: " + ' '.join(objcopy_command))
4259
result = subprocess.run(objcopy_command)
4360
if result.returncode != 0 or not os.path.exists(bin_file):
@@ -55,6 +72,8 @@ def get_qio_binary(self):
5572
return get_qio_binary_t3_t5(self.chip_info)
5673
elif self.chip_info.chip == 'ln882h':
5774
return get_qio_binary_ln882h(self.chip_info)
75+
elif self.chip_info.chip == 'esp32':
76+
return get_qio_binary_esp32(self.chip_info)
5877
else:
5978
return False
6079

tools/packager/packager_esp32.py

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import os
2+
import logging
3+
import shutil
4+
import platform
5+
6+
from .chip_info import *
7+
8+
OFFSET_START = 0x0
9+
OFFSET_BOOTLOADER = 0x1000
10+
OFFSET_PARTITIONS = 0x8000
11+
OFFSET_OTA_DATA_INITIAL = 0xd000
12+
OFFSET_APPLICATION = 0x10000
13+
OFFSET_END = 0x190000
14+
15+
def esp32_image_gen(chip_info):
16+
bin_path_bootloader = os.path.join(chip_info.tools_path, "bootloader.bin")
17+
bin_path_partitions_table = os.path.join(chip_info.tools_path, "partition-table.bin")
18+
bin_path_ota_data_init = os.path.join(chip_info.tools_path, "ota_data_initial.bin")
19+
bin_path_app = os.path.join(chip_info.output_path, f"{chip_info.sketch_name}_app.bin")
20+
21+
# output bin
22+
chip_info.bin_file_QIO = os.path.join(chip_info.output_path, f"{chip_info.sketch_name}_QIO_{chip_info.sketch_version}.bin")
23+
24+
if not os.path.exists(bin_path_bootloader):
25+
logging.error(f"{bin_path_bootloader} not found")
26+
return False
27+
28+
if not os.path.exists(bin_path_partitions_table):
29+
logging.error(f"{bin_path_partitions_table} not found")
30+
return False
31+
32+
if not os.path.exists(bin_path_ota_data_init):
33+
logging.error(f"{bin_path_ota_data_init} not found")
34+
return False
35+
36+
if not os.path.exists(bin_path_app):
37+
logging.error(f"{bin_path_app} not found")
38+
return False
39+
40+
bin_files_in = [
41+
("bootloader", OFFSET_BOOTLOADER, bin_path_bootloader),
42+
('partitions', OFFSET_PARTITIONS, bin_path_partitions_table),
43+
('ota_data_initial', OFFSET_OTA_DATA_INITIAL, bin_path_ota_data_init),
44+
('application', OFFSET_APPLICATION, bin_path_app)
45+
]
46+
47+
with open(chip_info.bin_file_QIO, 'wb') as bin_out:
48+
cur_offset = OFFSET_START
49+
for name, offset, bin_in in bin_files_in:
50+
bin_out.write(b'\xff' * (offset - cur_offset))
51+
cur_offset = offset
52+
with open(bin_in, 'rb') as bin_in:
53+
data = bin_in.read()
54+
bin_out.write(data)
55+
cur_offset += len(data)
56+
offset = OFFSET_END
57+
bin_out.write(b'\xff' * (offset - cur_offset))
58+
logging.debug(f"ESP32 QIO binary: {chip_info.bin_file_QIO}")
59+
logging.debug("package success.")
60+
61+
# Copy bin_path_app
62+
chip_info.bin_file_UA = os.path.join(chip_info.output_path, f"{chip_info.sketch_name}_UA_{chip_info.sketch_version}.bin")
63+
chip_info.bin_file_UG = os.path.join(chip_info.output_path, f"{chip_info.sketch_name}_UG_{chip_info.sketch_version}.bin")
64+
shutil.copy2(bin_path_app, chip_info.bin_file_UA)
65+
shutil.copy2(bin_path_app, chip_info.bin_file_UG)
66+
67+
# remove bin_path_app
68+
os.remove(bin_path_app)
69+
70+
return True
71+
72+
def get_qio_binary_esp32(chip_info):
73+
logging.debug(f"platform system: {platform.system()}")
74+
75+
if False == esp32_image_gen(chip_info):
76+
logging.error("esp32_image_gen failed")
77+
return False
78+
79+
return True
80+

0 commit comments

Comments
 (0)