| # Copyright (c) 2017 Linaro Limited. |
| # |
| # SPDX-License-Identifier: Apache-2.0 |
| |
| '''Runner for flashing ESP32 devices with esptool/espidf.''' |
| |
| from os import path |
| import os |
| |
| from .core import ZephyrBinaryRunner, get_env_or_bail |
| |
| |
| class Esp32BinaryRunner(ZephyrBinaryRunner): |
| '''Runner front-end for espidf.''' |
| |
| def __init__(self, elf, device, baud=921600, flash_size='detect', |
| flash_freq='40m', flash_mode='dio', espidf='espidf', |
| debug=False): |
| super(Esp32BinaryRunner, self).__init__(debug=debug) |
| self.elf = elf |
| self.device = device |
| self.baud = baud |
| self.flash_size = flash_size |
| self.flash_freq = flash_freq |
| self.flash_mode = flash_mode |
| self.espidf = espidf |
| |
| @classmethod |
| def name(cls): |
| return 'esp32' |
| |
| @classmethod |
| def handles_command(cls, command): |
| return command == 'flash' |
| |
| def create_from_env(command, debug): |
| '''Create flasher from environment. |
| |
| Required: |
| |
| - O: build output directory |
| - KERNEL_ELF_NAME: name of kernel binary in ELF format |
| |
| Optional: |
| |
| - ESP_DEVICE: serial port to flash, default /dev/ttyUSB0 |
| - ESP_BAUD_RATE: serial baud rate, default 921600 |
| - ESP_FLASH_SIZE: flash size, default 'detect' |
| - ESP_FLASH_FREQ: flash frequency, default '40m' |
| - ESP_FLASH_MODE: flash mode, default 'dio' |
| - ESP_TOOL: complete path to espidf, or set to 'espidf' to look for it |
| in $ESP_IDF_PATH/components/esptool_py/esptool/esptool.py |
| ''' |
| elf = path.join(get_env_or_bail('O'), |
| get_env_or_bail('KERNEL_ELF_NAME')) |
| |
| # TODO add sane device defaults on other platforms than Linux. |
| device = os.environ.get('ESP_DEVICE', '/dev/ttyUSB0') |
| baud = os.environ.get('ESP_BAUD_RATE', '921600') |
| flash_size = os.environ.get('ESP_FLASH_SIZE', 'detect') |
| flash_freq = os.environ.get('ESP_FLASH_FREQ', '40m') |
| flash_mode = os.environ.get('ESP_FLASH_MODE', 'dio') |
| espidf = os.environ.get('ESP_TOOL', 'espidf') |
| |
| if espidf == 'espidf': |
| idf_path = get_env_or_bail('ESP_IDF_PATH') |
| espidf = path.join(idf_path, 'components', 'esptool_py', 'esptool', |
| 'esptool.py') |
| |
| return Esp32BinaryRunner(elf, device, baud=baud, |
| flash_size=flash_size, flash_freq=flash_freq, |
| flash_mode=flash_mode, espidf=espidf, |
| debug=debug) |
| |
| def do_run(self, command, **kwargs): |
| bin_name = path.splitext(self.elf)[0] + path.extsep + 'bin' |
| cmd_convert = [self.espidf, '--chip', 'esp32', 'elf2image', self.elf] |
| cmd_flash = [self.espidf, '--chip', 'esp32', '--port', self.device, |
| '--baud', self.baud, '--before', 'default_reset', |
| '--after', 'hard_reset', 'write_flash', '-u', |
| '--flash_mode', self.flash_mode, |
| '--flash_freq', self.flash_freq, |
| '--flash_size', self.flash_size, |
| '0x1000', bin_name] |
| |
| print("Converting ELF to BIN") |
| self.check_call(cmd_convert) |
| |
| print("Flashing ESP32 on {} ({}bps)".format(self.device, self.baud)) |
| self.check_call(cmd_flash) |