mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-01 18:50:34 +03:00
Add USB DFU and OTG console SOC capability flags for esp32s2, esp32s3, and esp32p4. Use these caps in Kconfig, documentation conditionals, and idf.py DFU actions so USB support is derived from SOC capabilities instead of hardcoded target names.
81 lines
3.1 KiB
Python
81 lines
3.1 KiB
Python
# SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
import os
|
|
|
|
from rich_click import Context
|
|
|
|
from idf_py_actions.errors import FatalError
|
|
from idf_py_actions.tools import PropertyDict
|
|
from idf_py_actions.tools import ensure_build_directory
|
|
from idf_py_actions.tools import get_sdkconfig_value
|
|
from idf_py_actions.tools import run_target
|
|
|
|
SOC_USB_DFU_SUPPORTED = 'CONFIG_SOC_USB_DFU_SUPPORTED'
|
|
|
|
|
|
def _soc_usb_dfu_supported(project_path: str) -> bool:
|
|
return bool(get_sdkconfig_value(os.path.join(project_path, 'sdkconfig'), SOC_USB_DFU_SUPPORTED) == 'y')
|
|
|
|
|
|
def action_extensions(base_actions: dict, project_path: str) -> dict:
|
|
def dfu_target(target_name: str, ctx: Context, args: PropertyDict, part_size: str) -> None:
|
|
ensure_build_directory(args, ctx.info_name)
|
|
run_target(target_name, args, {'ESP_DFU_PART_SIZE': part_size} if part_size else {})
|
|
|
|
def dfu_list_target(target_name: str, ctx: Context, args: PropertyDict) -> None:
|
|
ensure_build_directory(args, ctx.info_name)
|
|
run_target(target_name, args)
|
|
|
|
def dfu_flash_target(target_name: str, ctx: Context, args: PropertyDict, path: str) -> None:
|
|
ensure_build_directory(args, ctx.info_name)
|
|
|
|
try:
|
|
run_target(target_name, args, {'ESP_DFU_PATH': path})
|
|
except FatalError:
|
|
# Cannot capture the error from dfu-util here so the best advise is:
|
|
print(
|
|
'Please have a look at the "Device Firmware Upgrade through USB" chapter in API Guides of the '
|
|
'ESP-IDF documentation for solving common dfu-util issues.'
|
|
)
|
|
raise
|
|
|
|
dfu_actions = {
|
|
'actions': {
|
|
'dfu': {
|
|
'callback': dfu_target,
|
|
'short_help': 'Build the DFU binary',
|
|
'dependencies': ['all'],
|
|
'options': [
|
|
{
|
|
'names': ['--part-size'],
|
|
'help': 'Large files are split up into smaller partitions in order to avoid timeout during '
|
|
'erasing flash. This option allows to overwrite the default partition size of '
|
|
'mkdfu.py.',
|
|
}
|
|
],
|
|
},
|
|
'dfu-list': {
|
|
'callback': dfu_list_target,
|
|
'short_help': 'List DFU capable devices',
|
|
'dependencies': [],
|
|
},
|
|
'dfu-flash': {
|
|
'callback': dfu_flash_target,
|
|
'short_help': 'Flash the DFU binary',
|
|
'order_dependencies': ['dfu'],
|
|
'options': [
|
|
{
|
|
'names': ['--path'],
|
|
'default': '',
|
|
'help': 'Specify path to DFU device. The default empty path works if there is just one '
|
|
'ESP device with the same product identifier. See the device list for paths '
|
|
'of available devices.',
|
|
}
|
|
],
|
|
},
|
|
}
|
|
}
|
|
|
|
return dfu_actions if _soc_usb_dfu_supported(project_path) else {}
|