arduino-esp32/makeboards.py
2024-09-05 14:37:55 +07:00

492 lines
23 KiB
Python
Executable file

#!/usr/bin/env python3
mcu_dict = {
'esp32': {
'maximum_data_size': 327680,
'tarch': 'xtensa',
'target': 'esp32',
'dual_core': 1,
'bootloader_addr': '0x1000',
'f_cpu': 240000000,
'touch1200': '',
'usb_mode': 0,
'native_usb': 0,
'cdc_on_boot': -1,
'spi_mode': 'dio',
'psram_opi': 0,
},
'esp32s2': {
'maximum_data_size': 327680,
'tarch': 'xtensa',
'target': 'esp32s2',
'dual_core': 0,
'bootloader_addr': '0x1000',
'f_cpu': 240000000,
'touch1200': 'true',
'usb_mode': 0,
'native_usb': 1,
'cdc_on_boot': 1,
'spi_mode': 'qio',
'psram_opi': 0,
},
'esp32s3': {
'maximum_data_size': 327680,
'tarch': 'xtensa',
'target': 'esp32s3',
'dual_core': 1,
'bootloader_addr': '0x0',
'f_cpu': 240000000,
'touch1200': 'true',
'usb_mode': 1,
'native_usb': 1,
'cdc_on_boot': 1,
'spi_mode': 'qio',
'psram_opi': 1,
},
'esp32c3': {
'maximum_data_size': 327680,
'tarch': 'riscv32',
'target': 'esp',
'dual_core': 0,
'bootloader_addr': '0x0',
'f_cpu': 160000000,
'touch1200': 'false',
'usb_mode': 0,
'native_usb': 0,
'cdc_on_boot': 1,
'spi_mode': 'qio',
'psram_opi': 0,
},
}
def build_header(name, vendor, product, vid, pid_list):
prettyname = vendor + " " + product
print("##############################################################")
print("# {}".format(prettyname))
print()
print("{}.name={}".format(name, prettyname))
for i in range(len(pid_list)):
print("{}.vid.{}={}".format(name, i, vid))
print("{}.pid.{}={}".format(name, i, pid_list[i]))
print()
def build_upload(mcu, name, flash_size):
info = mcu_dict[mcu]
# Bootloader
print("{}.bootloader.tool=esptool_py".format(name))
print("{}.bootloader.tool.default=esptool_py".format(name))
print()
print("{}.upload.tool=esptool_py".format(name))
print("{}.upload.tool.default=esptool_py".format(name))
print("{}.upload.tool.network=esp_ota".format(name))
print()
print("{}.upload.maximum_size=1310720".format(name))
print("{}.upload.maximum_data_size={}".format(name, info['maximum_data_size']))
print("{}.upload.flags=".format(name))
print("{}.upload.extra_flags=".format(name))
if info['touch1200']:
print("{}.upload.use_1200bps_touch={}".format(name, info['touch1200']))
print("{}.upload.wait_for_upload_port={}".format(name, info['touch1200']))
print()
print("{}.serial.disableDTR=false".format(name))
print("{}.serial.disableRTS=false".format(name))
else:
print()
print("{}.serial.disableDTR=true".format(name))
print("{}.serial.disableRTS=true".format(name))
print()
def build_build(mcu, name, variant, flash_size, boarddefine):
info = mcu_dict[mcu]
print("{}.build.tarch={}".format(name, info['tarch']))
print("{}.build.bootloader_addr={}".format(name, info['bootloader_addr']))
print("{}.build.target={}".format(name, info['target']))
print("{}.build.mcu={}".format(name, mcu))
print("{}.build.core={}".format(name, "esp32"))
print("{}.build.variant={}".format(name, variant))
print("{}.build.board={}".format(name, boarddefine))
print()
if info['usb_mode']:
print('{}.build.usb_mode=0'.format(name))
if info['cdc_on_boot'] >= 0:
print("{}.build.cdc_on_boot={}".format(name, info['cdc_on_boot']))
if info['native_usb']:
print("{}.build.msc_on_boot=0".format(name))
print("{}.build.dfu_on_boot=0".format(name))
print("{}.build.f_cpu={}L".format(name, info["f_cpu"]))
print("{}.build.flash_size={}MB".format(name, flash_size))
print("{}.build.flash_freq=80m".format(name))
print("{}.build.flash_mode=dio".format(name))
print("{}.build.boot={}".format(name, info['spi_mode']))
print("{}.build.partitions=default".format(name))
print("{}.build.defines=".format(name))
if info['dual_core']:
print('{}.build.loop_core='.format(name))
print('{}.build.event_core='.format(name))
if info['psram_opi']:
print('{}.build.flash_type=qio'.format(name))
print('{}.build.psram_type=qspi'.format(name))
print('{}.build.memory_type={{build.flash_type}}_{{build.psram_type}}'.format(name))
print()
def build_loop(mcu, name):
info = mcu_dict[mcu]
if info['dual_core']:
print('{}.menu.LoopCore.1=Core 1'.format(name))
print('{}.menu.LoopCore.1.build.loop_core=-DARDUINO_RUNNING_CORE=1'.format(name))
print('{}.menu.LoopCore.0=Core 0'.format(name))
print('{}.menu.LoopCore.0.build.loop_core=-DARDUINO_RUNNING_CORE=0'.format(name))
print()
print('{}.menu.EventsCore.1=Core 1'.format(name))
print('{}.menu.EventsCore.1.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=1'.format(name))
print('{}.menu.EventsCore.0=Core 0'.format(name))
print('{}.menu.EventsCore.0.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=0'.format(name))
print()
def build_menu_usb(mcu, name):
info = mcu_dict[mcu]
require_otg = ''
upload_cdc = 'Internal USB'
upload_uart = 'UART0'
# ESP32-S3
if info['usb_mode']:
require_otg = ' (Requires USB-OTG Mode)'
upload_cdc = 'USB-OTG CDC (TinyUSB)'
upload_uart = 'UART0 / Hardware CDC'
print('{}.menu.USBMode.default=USB-OTG (TinyUSB)'.format(name))
print('{}.menu.USBMode.default.build.usb_mode=0'.format(name))
print('{}.menu.USBMode.hwcdc=Hardware CDC and JTAG'.format(name))
print('{}.menu.USBMode.hwcdc.build.usb_mode=1'.format(name))
print()
if info['cdc_on_boot'] >= 0:
print("{}.menu.CDCOnBoot.cdc=Enabled".format(name))
print("{}.menu.CDCOnBoot.cdc.build.cdc_on_boot=1".format(name))
print("{}.menu.CDCOnBoot.default=Disabled".format(name))
print("{}.menu.CDCOnBoot.default.build.cdc_on_boot=0".format(name))
print()
if info['native_usb']:
print("{}.menu.MSCOnBoot.default=Disabled".format(name))
print("{}.menu.MSCOnBoot.default.build.msc_on_boot=0".format(name))
print("{}.menu.MSCOnBoot.msc=Enabled".format(name) + require_otg)
print("{}.menu.MSCOnBoot.msc.build.msc_on_boot=1".format(name))
print()
print("{}.menu.DFUOnBoot.default=Disabled".format(name))
print("{}.menu.DFUOnBoot.default.build.dfu_on_boot=0".format(name))
print("{}.menu.DFUOnBoot.dfu=Enabled".format(name) + require_otg)
print("{}.menu.DFUOnBoot.dfu.build.dfu_on_boot=1".format(name))
print()
print("{}.menu.UploadMode.cdc={}".format(name, upload_cdc))
print("{}.menu.UploadMode.cdc.upload.use_1200bps_touch=true".format(name))
print("{}.menu.UploadMode.cdc.upload.wait_for_upload_port=true".format(name))
print("{}.menu.UploadMode.default={}".format(name, upload_uart))
print("{}.menu.UploadMode.default.upload.use_1200bps_touch=false".format(name))
print("{}.menu.UploadMode.default.upload.wait_for_upload_port=false".format(name))
print()
def build_menu_psram(mcu, name, psram_size):
info = mcu_dict[mcu]
enabled_defines = "{}.menu.PSRAM.enabled.build.defines=-DBOARD_HAS_PSRAM".format(name)
if mcu == 'esp32':
enabled_defines += ' -mfix-esp32-psram-cache-issue -mfix-esp32-psram-cache-strategy=memw'
if psram_size > 0:
if info['psram_opi']:
print('{}.menu.PSRAM.enabled=QSPI PSRAM'.format(name))
print(enabled_defines)
print('{}.menu.PSRAM.enabled.build.psram_type=qspi'.format(name))
print('{}.menu.PSRAM.disabled=Disabled'.format(name))
print('{}.menu.PSRAM.disabled.build.defines='.format(name))
print('{}.menu.PSRAM.disabled.build.psram_type=qspi'.format(name))
print('{}.menu.PSRAM.opi=OPI PSRAM'.format(name))
print('{}.menu.PSRAM.opi.build.defines=-DBOARD_HAS_PSRAM'.format(name))
print('{}.menu.PSRAM.opi.build.psram_type=opi'.format(name))
else:
print("{}.menu.PSRAM.enabled=Enabled".format(name))
print(enabled_defines)
print("{}.menu.PSRAM.disabled=Disabled".format(name))
print("{}.menu.PSRAM.disabled.build.defines=".format(name))
print()
def build_menu_partition(mcu, name, flash_size):
info = mcu_dict[mcu]
if flash_size == 4:
if info['native_usb']:
print("{}.menu.PartitionScheme.tinyuf2=TinyUF2 4MB (1.3MB APP/960KB FFAT)".format(name))
print("{}.menu.PartitionScheme.tinyuf2.build.custom_bootloader=bootloader-tinyuf2".format(name))
print("{}.menu.PartitionScheme.tinyuf2.build.custom_partitions=partitions-4MB-tinyuf2".format(name))
print("{}.menu.PartitionScheme.tinyuf2.upload.maximum_size=1441792".format(name))
print('{}.menu.PartitionScheme.tinyuf2.upload.extra_flags=0x2d0000 "{{runtime.platform.path}}/variants/{{build.variant}}/tinyuf2.bin"'.format(name))
print("{}.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS)".format(name))
print("{}.menu.PartitionScheme.default.build.partitions=default".format(name))
print("{}.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS)".format(name))
print("{}.menu.PartitionScheme.defaultffat.build.partitions=default_ffat".format(name))
print("{}.menu.PartitionScheme.minimal=Minimal (1.3MB APP/700KB SPIFFS)".format(name))
print("{}.menu.PartitionScheme.minimal.build.partitions=minimal".format(name))
print("{}.menu.PartitionScheme.no_ota=No OTA (2MB APP/2MB SPIFFS)".format(name))
print("{}.menu.PartitionScheme.no_ota.build.partitions=no_ota".format(name))
print("{}.menu.PartitionScheme.no_ota.upload.maximum_size=2097152".format(name))
print("{}.menu.PartitionScheme.noota_3g=No OTA (1MB APP/3MB SPIFFS)".format(name))
print("{}.menu.PartitionScheme.noota_3g.build.partitions=noota_3g".format(name))
print("{}.menu.PartitionScheme.noota_3g.upload.maximum_size=1048576".format(name))
print("{}.menu.PartitionScheme.noota_ffat=No OTA (2MB APP/2MB FATFS)".format(name))
print("{}.menu.PartitionScheme.noota_ffat.build.partitions=noota_ffat".format(name))
print("{}.menu.PartitionScheme.noota_ffat.upload.maximum_size=2097152".format(name))
print("{}.menu.PartitionScheme.noota_3gffat=No OTA (1MB APP/3MB FATFS)".format(name))
print("{}.menu.PartitionScheme.noota_3gffat.build.partitions=noota_3gffat".format(name))
print("{}.menu.PartitionScheme.noota_3gffat.upload.maximum_size=1048576".format(name))
print("{}.menu.PartitionScheme.huge_app=Huge APP (3MB No OTA/1MB SPIFFS)".format(name))
print("{}.menu.PartitionScheme.huge_app.build.partitions=huge_app".format(name))
print("{}.menu.PartitionScheme.huge_app.upload.maximum_size=3145728".format(name))
print("{}.menu.PartitionScheme.min_spiffs=Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS)".format(name))
print("{}.menu.PartitionScheme.min_spiffs.build.partitions=min_spiffs".format(name))
print("{}.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080".format(name))
elif flash_size == 8:
if info['native_usb']:
print("{}.menu.PartitionScheme.tinyuf2=TinyUF2 8MB (2MB APP/3.7MB FFAT)".format(name))
print("{}.menu.PartitionScheme.tinyuf2.build.custom_bootloader=bootloader-tinyuf2".format(name))
print("{}.menu.PartitionScheme.tinyuf2.build.custom_partitions=partitions-8MB-tinyuf2".format(name))
print("{}.menu.PartitionScheme.tinyuf2.upload.maximum_size=2097152".format(name))
print('{}.menu.PartitionScheme.tinyuf2.upload.extra_flags=0x410000 "{{runtime.platform.path}}/variants/{{build.variant}}/tinyuf2.bin"'.format(name))
print("{}.menu.PartitionScheme.default_8MB=Default (3MB APP/1.5MB SPIFFS)".format(name))
print("{}.menu.PartitionScheme.default_8MB.build.partitions=default_8MB".format(name))
print("{}.menu.PartitionScheme.default_8MB.upload.maximum_size=3342336".format(name))
elif flash_size == 16:
if info['native_usb']:
print('{}.menu.PartitionScheme.tinyuf2=TinyUF2 16MB (2MB APP/11.6MB FFAT)'.format(name))
print('{}.menu.PartitionScheme.tinyuf2.build.custom_bootloader=bootloader-tinyuf2'.format(name))
print('{}.menu.PartitionScheme.tinyuf2.build.custom_partitions=partitions-16MB-tinyuf2'.format(name))
print('{}.menu.PartitionScheme.tinyuf2.upload.maximum_size=2097152'.format(name))
print('{}.menu.PartitionScheme.tinyuf2.upload.extra_flags=0x410000 "{{runtime.platform.path}}/variants/{{build.variant}}/tinyuf2.bin"'.format(name))
print('{}.menu.PartitionScheme.default_16MB=Default (6.25MB APP/3.43MB SPIFFS)'.format(name))
print('{}.menu.PartitionScheme.default_16MB.build.partitions=default_16MB'.format(name))
print('{}.menu.PartitionScheme.default_16MB.upload.maximum_size=6553600'.format(name))
print('{}.menu.PartitionScheme.large_spiffs=Large SPIFFS (4.5MB APP/6.93MB SPIFFS)'.format(name))
print('{}.menu.PartitionScheme.large_spiffs.build.partitions=large_spiffs_16MB'.format(name))
print('{}.menu.PartitionScheme.large_spiffs.upload.maximum_size=4718592'.format(name))
print('{}.menu.PartitionScheme.app3M_fat9M_16MB=16M Flash (3MB APP/9MB FATFS)'.format(name))
print('{}.menu.PartitionScheme.app3M_fat9M_16MB.build.partitions=app3M_fat9M_16MB'.format(name))
print('{}.menu.PartitionScheme.app3M_fat9M_16MB.upload.maximum_size=3145728'.format(name))
print('{}.menu.PartitionScheme.fatflash=16M Flash (2MB APP/12.5MB FAT)'.format(name))
print('{}.menu.PartitionScheme.fatflash.build.partitions=ffat'.format(name))
print('{}.menu.PartitionScheme.fatflash.upload.maximum_size=2097152'.format(name))
print()
def build_menu_freq(mcu, name):
info = mcu_dict[mcu]
wf_bt = '(WiFi/BT)' if mcu == 'esp32' else '(WiFi)'
if info['f_cpu'] == 240000000:
print("{}.menu.CPUFreq.240=240MHz {}".format(name, wf_bt))
print("{}.menu.CPUFreq.240.build.f_cpu=240000000L".format(name))
print("{}.menu.CPUFreq.160=160MHz {}".format(name, wf_bt))
print("{}.menu.CPUFreq.160.build.f_cpu=160000000L".format(name))
print("{}.menu.CPUFreq.80=80MHz {}".format(name, wf_bt))
print("{}.menu.CPUFreq.80.build.f_cpu=80000000L".format(name))
print("{}.menu.CPUFreq.40=40MHz".format(name))
print("{}.menu.CPUFreq.40.build.f_cpu=40000000L".format(name))
print("{}.menu.CPUFreq.20=20MHz".format(name))
print("{}.menu.CPUFreq.20.build.f_cpu=20000000L".format(name))
print("{}.menu.CPUFreq.10=10MHz".format(name))
print("{}.menu.CPUFreq.10.build.f_cpu=10000000L".format(name))
print()
def build_menu_flash(mcu, name, flash_size):
info = mcu_dict[mcu]
if mcu == 'esp32s3':
print('{}.menu.FlashMode.qio=QIO 80MHz'.format(name))
print('{}.menu.FlashMode.qio.build.flash_mode=dio'.format(name))
print('{}.menu.FlashMode.qio.build.boot=qio'.format(name))
print('{}.menu.FlashMode.qio.build.boot_freq=80m'.format(name))
print('{}.menu.FlashMode.qio.build.flash_freq=80m'.format(name))
print('{}.menu.FlashMode.qio120=QIO 120MHz'.format(name))
print('{}.menu.FlashMode.qio120.build.flash_mode=dio'.format(name))
print('{}.menu.FlashMode.qio120.build.boot=qio'.format(name))
print('{}.menu.FlashMode.qio120.build.boot_freq=120m'.format(name))
print('{}.menu.FlashMode.qio120.build.flash_freq=80m'.format(name))
print('{}.menu.FlashMode.dio=DIO 80MHz'.format(name))
print('{}.menu.FlashMode.dio.build.flash_mode=dio'.format(name))
print('{}.menu.FlashMode.dio.build.boot=dio'.format(name))
print('{}.menu.FlashMode.dio.build.boot_freq=80m'.format(name))
print('{}.menu.FlashMode.dio.build.flash_freq=80m'.format(name))
print('{}.menu.FlashMode.opi=OPI 80MHz'.format(name))
print('{}.menu.FlashMode.opi.build.flash_mode=dout'.format(name))
print('{}.menu.FlashMode.opi.build.boot=opi'.format(name))
print('{}.menu.FlashMode.opi.build.boot_freq=80m'.format(name))
print('{}.menu.FlashMode.opi.build.flash_freq=80m'.format(name))
else:
if (info['spi_mode'] == 'qio'):
print("{}.menu.FlashMode.qio=QIO".format(name))
print("{}.menu.FlashMode.qio.build.flash_mode=dio".format(name))
print("{}.menu.FlashMode.qio.build.boot=qio".format(name))
print("{}.menu.FlashMode.dio=DIO".format(name))
print("{}.menu.FlashMode.dio.build.flash_mode=dio".format(name))
print("{}.menu.FlashMode.dio.build.boot=dio".format(name))
print("{}.menu.FlashMode.qout=QOUT".format(name))
print("{}.menu.FlashMode.qout.build.flash_mode=dout".format(name))
print("{}.menu.FlashMode.qout.build.boot=qout".format(name))
print("{}.menu.FlashMode.dout=DOUT".format(name))
print("{}.menu.FlashMode.dout.build.flash_mode=dout".format(name))
print("{}.menu.FlashMode.dout.build.boot=dout".format(name))
print()
print("{}.menu.FlashFreq.80=80MHz".format(name))
print("{}.menu.FlashFreq.80.build.flash_freq=80m".format(name))
print("{}.menu.FlashFreq.40=40MHz".format(name))
print("{}.menu.FlashFreq.40.build.flash_freq=40m".format(name))
print()
print("{}.menu.FlashSize.{}M={}MB ({}Mb)".format(name, flash_size, flash_size, flash_size*8))
print("{}.menu.FlashSize.{}M.build.flash_size={}MB".format(name, flash_size, flash_size))
print()
def build_menu_uploadspeed(mcu, name):
info = mcu_dict[mcu]
print("{}.menu.UploadSpeed.921600=921600".format(name))
print("{}.menu.UploadSpeed.921600.upload.speed=921600".format(name))
print("{}.menu.UploadSpeed.115200=115200".format(name))
print("{}.menu.UploadSpeed.115200.upload.speed=115200".format(name))
print("{}.menu.UploadSpeed.256000.windows=256000".format(name))
print("{}.menu.UploadSpeed.256000.upload.speed=256000".format(name))
print("{}.menu.UploadSpeed.230400.windows.upload.speed=256000".format(name))
print("{}.menu.UploadSpeed.230400=230400".format(name))
print("{}.menu.UploadSpeed.230400.upload.speed=230400".format(name))
print("{}.menu.UploadSpeed.460800.linux=460800".format(name))
print("{}.menu.UploadSpeed.460800.macosx=460800".format(name))
print("{}.menu.UploadSpeed.460800.upload.speed=460800".format(name))
print("{}.menu.UploadSpeed.512000.windows=512000".format(name))
print("{}.menu.UploadSpeed.512000.upload.speed=512000".format(name))
print()
def build_menu_debug(mcu, name):
info = mcu_dict[mcu]
print("{}.menu.DebugLevel.none=None".format(name))
print("{}.menu.DebugLevel.none.build.code_debug=0".format(name))
print("{}.menu.DebugLevel.error=Error".format(name))
print("{}.menu.DebugLevel.error.build.code_debug=1".format(name))
print("{}.menu.DebugLevel.warn=Warn".format(name))
print("{}.menu.DebugLevel.warn.build.code_debug=2".format(name))
print("{}.menu.DebugLevel.info=Info".format(name))
print("{}.menu.DebugLevel.info.build.code_debug=3".format(name))
print("{}.menu.DebugLevel.debug=Debug".format(name))
print("{}.menu.DebugLevel.debug.build.code_debug=4".format(name))
print("{}.menu.DebugLevel.verbose=Verbose".format(name))
print("{}.menu.DebugLevel.verbose.build.code_debug=5".format(name))
print()
def build_menu_erase(mcu, name):
print("{}.menu.EraseFlash.none=Disabled".format(name))
print("{}.menu.EraseFlash.none.upload.erase_cmd=".format(name))
print("{}.menu.EraseFlash.all=Enabled".format(name))
print("{}.menu.EraseFlash.all.upload.erase_cmd=-e".format(name))
print()
def make_board(mcu, name, variant, boarddefine, flash_size, psram_size, vendor, product, vid, pid_list):
if variant == "":
variant = name
build_header(name, vendor, product, vid, pid_list)
build_upload(mcu, name, flash_size)
build_build(mcu, name, variant, flash_size, boarddefine)
build_loop(mcu, name)
build_menu_usb(mcu, name)
build_menu_psram(mcu, name, psram_size)
build_menu_partition(mcu, name, flash_size)
build_menu_freq(mcu, name)
build_menu_flash(mcu, name, flash_size)
build_menu_uploadspeed(mcu, name)
build_menu_debug(mcu, name)
build_menu_erase(mcu, name)
make_board("esp32", "featheresp32", "feather_esp32", "FEATHER_ESP32", 4, 0,
"Adafruit", "ESP32 Feather", "", [])
# ---------- ESP32 S2 -----------
make_board("esp32s2", "adafruit_metro_esp32s2", "", "METRO_ESP32S2", 4, 2,
"Adafruit", "Metro ESP32-S2", "0x239A", ["0x80DF", "0x00DF", "0x80E0"])
make_board("esp32s2", "adafruit_magtag29_esp32s2", "", "MAGTAG29_ESP32S2", 4, 2,
"Adafruit", 'MagTag 2.9"', "0x239A", ["0x80E5", "0x00E5", "0x80E6"])
make_board("esp32s2", "adafruit_funhouse_esp32s2", "", "FUNHOUSE_ESP32S2", 4, 2,
"Adafruit", 'FunHouse', "0x239A", ["0x80F9", "0x00F9", "0x80FA"])
make_board("esp32s2", "adafruit_feather_esp32s2", "", "ADAFRUIT_FEATHER_ESP32S2", 4, 2,
"Adafruit", 'Feather ESP32-S2', "0x239A", ["0x80EB", "0x00EB", "0x80EC"])
make_board("esp32s2", "adafruit_feather_esp32s2_tft", "", "ADAFRUIT_FEATHER_ESP32S2_TFT", 4, 2,
"Adafruit", 'Feather ESP32-S2 TFT', "0x239A", ["0x810F", "0x010F", "0x8110"])
make_board("esp32s2", "adafruit_feather_esp32s2_reversetft", "", "ADAFRUIT_FEATHER_ESP32S2_REVTFT", 4, 2,
"Adafruit", 'Feather ESP32-S2 Reverse TFT', "0x239A", ["0x80ED", "0x00ED", "0x80EE"])
make_board("esp32s2", "adafruit_qtpy_esp32s2", "", "ADAFRUIT_QTPY_ESP32S2", 4, 2,
"Adafruit", 'QT Py ESP32-S2', "0x239A", ["0x8111", "0x0111", "0x8112"])
# C3
make_board("esp32c3", "adafruit_qtpy_esp32c3", "", "ADAFRUIT_QTPY_ESP32C3", 4, 0,
"Adafruit", "QT Py ESP32-C3", "0x303a", ["0x1001"])
# ESP32
make_board("esp32", "adafruit_qtpy_esp32_pico", "adafruit_qtpy_esp32", "ADAFRUIT_QTPY_ESP32_PICO", 8, 2,
"Adafruit", "QT Py ESP32", "", [])
make_board("esp32", "adafruit_feather_esp32_v2", "adafruit_feather_esp32_v2", "ADAFRUIT_FEATHER_ESP32_V2", 8, 2,
"Adafruit", "Feather ESP32 V2", "", [])
# S3
make_board("esp32s3", "adafruit_feather_esp32s3", "", "ADAFRUIT_FEATHER_ESP32S3", 4, 2,
"Adafruit", 'Feather ESP32-S3 2MB PSRAM', "0x239A", ["0x811B", "0x011B", "0x811C"])
make_board("esp32s3", "adafruit_feather_esp32s3_nopsram", "", "ADAFRUIT_FEATHER_ESP32S3_NOPSRAM", 8, 0,
"Adafruit", 'Feather ESP32-S3 No PSRAM', "0x239A", ["0x8113", "0x0113", "0x8114"])
make_board("esp32s3", "adafruit_feather_esp32s3_tft", "", "ADAFRUIT_FEATHER_ESP32S3_TFT", 4, 2,
"Adafruit", 'Feather ESP32-S3 TFT', "0x239A", ["0x811D", "0x011D", "0x811E"])
make_board("esp32s3", "adafruit_feather_esp32s3_reversetft", "", "ADAFRUIT_FEATHER_ESP32S3_REVTFT", 4, 2,
"Adafruit", 'Feather ESP32-S3 Reverse TFT', "0x239A", ["0x8123", "0x0123", "0x8124"])
make_board("esp32s3", "adafruit_qtpy_esp32s3_nopsram", "", "ADAFRUIT_QTPY_ESP32S3_NOPSRAM", 8, 0,
"Adafruit", 'QT Py ESP32-S3 No PSRAM', "0x239A", ["0x8119", "0x0119", "0x811A"])
make_board("esp32", "adafruit_itsybitsy_esp32", "", "ADAFRUIT_ITSYBITSY_ESP32", 8, 2,
"Adafruit", "ItsyBitsy ESP32", "", [])