esp32.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. # Copyright (c) 2017 Linaro Limited.
  2. # Copyright (c) 2021 Espressif Systems (Shanghai) Co., Ltd.
  3. #
  4. # SPDX-License-Identifier: Apache-2.0
  5. '''Runner for flashing ESP32 devices with esptool/espidf.'''
  6. from os import path
  7. from runners.core import ZephyrBinaryRunner, RunnerCaps
  8. import os
  9. import sys
  10. class Esp32BinaryRunner(ZephyrBinaryRunner):
  11. '''Runner front-end for espidf.'''
  12. def __init__(self, cfg, device, boot_address, part_table_address,
  13. app_address, baud=921600, flash_size='detect',
  14. flash_freq='40m', flash_mode='dio', espidf='espidf',
  15. bootloader_bin=None, partition_table_bin=None):
  16. super().__init__(cfg)
  17. self.elf = cfg.elf_file
  18. self.device = device
  19. self.boot_address = boot_address
  20. self.part_table_address = part_table_address
  21. self.app_address = app_address
  22. self.baud = baud
  23. self.flash_size = flash_size
  24. self.flash_freq = flash_freq
  25. self.flash_mode = flash_mode
  26. self.espidf = espidf
  27. self.bootloader_bin = bootloader_bin
  28. self.partition_table_bin = partition_table_bin
  29. @classmethod
  30. def name(cls):
  31. return 'esp32'
  32. @classmethod
  33. def capabilities(cls):
  34. return RunnerCaps(commands={'flash'})
  35. @classmethod
  36. def do_add_parser(cls, parser):
  37. # Required
  38. parser.add_argument('--esp-idf-path', required=True,
  39. help='path to ESP-IDF')
  40. # Optional
  41. parser.add_argument('--esp-boot-address', default='0x1000',
  42. help='bootloader load address')
  43. parser.add_argument('--esp-partition-table-address', default='0x8000',
  44. help='partition table load address')
  45. parser.add_argument('--esp-app-address', default='0x10000',
  46. help='application load address')
  47. parser.add_argument('--esp-device', default=os.environ.get('ESPTOOL_PORT', None),
  48. help='serial port to flash')
  49. parser.add_argument('--esp-baud-rate', default='921600',
  50. help='serial baud rate, default 921600')
  51. parser.add_argument('--esp-flash-size', default='detect',
  52. help='flash size, default "detect"')
  53. parser.add_argument('--esp-flash-freq', default='40m',
  54. help='flash frequency, default "40m"')
  55. parser.add_argument('--esp-flash-mode', default='dio',
  56. help='flash mode, default "dio"')
  57. parser.add_argument(
  58. '--esp-tool',
  59. help='''if given, complete path to espidf. default is to search for
  60. it in [ESP_IDF_PATH]/components/esptool_py/esptool/esptool.py''')
  61. parser.add_argument('--esp-flash-bootloader',
  62. help='Bootloader image to flash')
  63. parser.add_argument('--esp-flash-partition_table',
  64. help='Partition table to flash')
  65. @classmethod
  66. def do_create(cls, cfg, args):
  67. if args.esp_tool:
  68. espidf = args.esp_tool
  69. else:
  70. espidf = path.join(args.esp_idf_path, 'components', 'esptool_py',
  71. 'esptool', 'esptool.py')
  72. return Esp32BinaryRunner(
  73. cfg, args.esp_device, boot_address=args.esp_boot_address,
  74. part_table_address=args.esp_partition_table_address,
  75. app_address=args.esp_app_address,baud=args.esp_baud_rate,
  76. flash_size=args.esp_flash_size, flash_freq=args.esp_flash_freq,
  77. flash_mode=args.esp_flash_mode, espidf=espidf,
  78. bootloader_bin=args.esp_flash_bootloader,
  79. partition_table_bin=args.esp_flash_partition_table)
  80. def do_run(self, command, **kwargs):
  81. self.require(self.espidf)
  82. bin_name = path.splitext(self.elf)[0] + path.extsep + 'bin'
  83. cmd_flash = [self.espidf, '--chip', 'auto']
  84. if self.device is not None:
  85. cmd_flash.extend(['--port', self.device])
  86. cmd_flash.extend(['--baud', self.baud])
  87. cmd_flash.extend(['--before', 'default_reset'])
  88. cmd_flash.extend(['--after', 'hard_reset', 'write_flash', '-u'])
  89. cmd_flash.extend(['--flash_mode', self.flash_mode])
  90. cmd_flash.extend(['--flash_freq', self.flash_freq])
  91. cmd_flash.extend(['--flash_size', self.flash_size])
  92. # Execute Python interpreter if calling a Python script
  93. if self.espidf.lower().endswith(".py") and sys.executable:
  94. cmd_flash.insert(0, sys.executable)
  95. if self.bootloader_bin:
  96. cmd_flash.extend([self.boot_address, self.bootloader_bin])
  97. cmd_flash.extend([self.part_table_address, self.partition_table_bin])
  98. cmd_flash.extend([self.app_address, bin_name])
  99. else:
  100. cmd_flash.extend([self.boot_address, bin_name])
  101. self.logger.info("Flashing esp32 chip on {} ({}bps)".
  102. format(self.device, self.baud))
  103. self.check_call(cmd_flash)