Quellcode durchsuchen

Merge branch 'bugfix/monitor_encrypted_target_v4.1' into 'release/v4.1'

tools: Fix flashing encrypted binaries from IDF Monitor (v4.1)

See merge request espressif/esp-idf!8126
Angus Gratton vor 5 Jahren
Ursprung
Commit
f96d28172b

+ 2 - 0
components/esptool_py/Makefile.projbuild

@@ -88,6 +88,7 @@ endif
 
 ifdef CONFIG_SECURE_FLASH_ENCRYPTION_MODE_DEVELOPMENT
 encrypted-flash: all_binaries $(ESPTOOLPY_SRC) $(call prereq_if_explicit,erase_flash) partition_table_get_info | check_python_dependencies
+	$(eval MONITOR_OPTS += --encrypted)
 	@echo "Flashing binaries to serial port $(ESPPORT) (app at offset $(APP_OFFSET))..."
 ifdef CONFIG_SECURE_BOOT
 	@echo "(Secure boot enabled, so bootloader not flashed automatically. See 'make bootloader' output)"
@@ -112,6 +113,7 @@ app-flash: $(APP_BIN) $(ESPTOOLPY_SRC) $(call prereq_if_explicit,erase_flash) pa
 
 ifdef CONFIG_SECURE_FLASH_ENCRYPTION_MODE_DEVELOPMENT
 encrypted-app-flash: $(APP_BIN) $(ESPTOOLPY_SRC) $(call prereq_if_explicit,erase_flash) partition_table_get_info | check_python_dependencies
+	$(eval MONITOR_OPTS += --encrypted)
 	@echo "Flashing encrypted app binary to serial port $(ESPPORT) (app at offset $(APP_OFFSET))..."
 	$(ESPTOOLPY_WRITE_FLASH_ENCRYPT) $(APP_OFFSET) $(APP_BIN)
 else

+ 27 - 27
docs/en/api-guides/tools/idf-monitor.rst

@@ -15,33 +15,33 @@ Keyboard Shortcuts
 
 For easy interaction with IDF Monitor, use the keyboard shortcuts given in the table.
 
-+-------------------+--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Keyboard Shortcut | Action                                                 | Description                                                                                                                                                      |
-+===================+========================================================+==================================================================================================================================================================+
-| Ctrl+]            | Exit the program                                       |                                                                                                                                                                  |
-+-------------------+--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Ctrl+T            | Menu escape key                                        | Press and follow it by one of the keys given below.                                                                                                              |
-+-------------------+--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-|  - Ctrl+T         | Send the menu character itself to remote               |                                                                                                                                                                  |
-+-------------------+--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-|  - Ctrl+]         | Send the exit character itself to remote               |                                                                                                                                                                  |
-+-------------------+--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-|  - Ctrl+P         | Reset target into bootloader to pause app via RTS line | Resets the target, into bootloader via the RTS line (if connected), so that the board runs nothing. Useful when you need to wait for another device to startup.  |
-+-------------------+--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-|  - Ctrl+R         | Reset target board via RTS                             | Resets the target board and re-starts the application via the RTS line (if connected).                                                                           |
-+-------------------+--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-|  - Ctrl+F         | Build and flash the project                            | Pauses idf_monitor to run the project ``flash`` target, then resumes idf_monitor. Any changed source files are recompiled and then re-flashed.                   |
-+-------------------+--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-|  - Ctrl+A (or A)  | Build and flash the app only                           | Pauses idf_monitor to run the ``app-flash`` target, then resumes idf_monitor. Similar to the ``flash`` target, but only the main app is built and re-flashed.    |
-+-------------------+--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-|  - Ctrl+Y         | Stop/resume log output printing on screen              | Discards all incoming serial data while activated. Allows to quickly pause and examine log output without quitting the monitor.                                  |
-+-------------------+--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-|  - Ctrl+L         | Stop/resume log output saved to file                   | Creates a file in the project directory and the output is written to that file until this is disabled with the same keyboard shortcut (or IDF Monitor exits).    |
-+-------------------+--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-|  - Ctrl+H (or H)  | Display all keyboard shortcuts                         |                                                                                                                                                                  |
-+-------------------+--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-|  - Ctrl+X (or X)  | Exit the program                                       |                                                                                                                                                                  |
-+-------------------+--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
++-------------------+--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Keyboard Shortcut | Action                                                 | Description                                                                                                                                                                                                                                          |
++===================+========================================================+======================================================================================================================================================================================================================================================+
+| Ctrl+]            | Exit the program                                       |                                                                                                                                                                                                                                                      |
++-------------------+--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Ctrl+T            | Menu escape key                                        | Press and follow it by one of the keys given below.                                                                                                                                                                                                  |
++-------------------+--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|  - Ctrl+T         | Send the menu character itself to remote               |                                                                                                                                                                                                                                                      |
++-------------------+--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|  - Ctrl+]         | Send the exit character itself to remote               |                                                                                                                                                                                                                                                      |
++-------------------+--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|  - Ctrl+P         | Reset target into bootloader to pause app via RTS line | Resets the target, into bootloader via the RTS line (if connected), so that the board runs nothing. Useful when you need to wait for another device to startup.                                                                                      |
++-------------------+--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|  - Ctrl+R         | Reset target board via RTS                             | Resets the target board and re-starts the application via the RTS line (if connected).                                                                                                                                                               |
++-------------------+--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|  - Ctrl+F         | Build and flash the project                            | Pauses idf_monitor to run the project ``flash`` target, then resumes idf_monitor. Any changed source files are recompiled and then re-flashed. Target ``encrypted-flash`` is run if idf_monitor was started with argument ``-E``.                    |
++-------------------+--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|  - Ctrl+A (or A)  | Build and flash the app only                           | Pauses idf_monitor to run the ``app-flash`` target, then resumes idf_monitor. Similar to the ``flash`` target, but only the main app is built and re-flashed. Target ``encrypted-app-flash`` is run if idf_monitor was started with argument ``-E``. |
++-------------------+--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|  - Ctrl+Y         | Stop/resume log output printing on screen              | Discards all incoming serial data while activated. Allows to quickly pause and examine log output without quitting the monitor.                                                                                                                      |
++-------------------+--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|  - Ctrl+L         | Stop/resume log output saved to file                   | Creates a file in the project directory and the output is written to that file until this is disabled with the same keyboard shortcut (or IDF Monitor exits).                                                                                        |
++-------------------+--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|  - Ctrl+H (or H)  | Display all keyboard shortcuts                         |                                                                                                                                                                                                                                                      |
++-------------------+--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|  - Ctrl+X (or X)  | Exit the program                                       |                                                                                                                                                                                                                                                      |
++-------------------+--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 
 Any keys pressed, other than ``Ctrl-]`` and ``Ctrl-T``, will be sent through the serial port.
 

+ 12 - 4
tools/idf_monitor.py

@@ -442,7 +442,8 @@ class Monitor(object):
 
     Main difference is that all event processing happens in the main thread, not the worker threads.
     """
-    def __init__(self, serial_instance, elf_file, print_filter, make="make", toolchain_prefix=DEFAULT_TOOLCHAIN_PREFIX, eol="CRLF"):
+    def __init__(self, serial_instance, elf_file, print_filter, make="make", encrypted=False,
+                 toolchain_prefix=DEFAULT_TOOLCHAIN_PREFIX, eol="CRLF"):
         super(Monitor, self).__init__()
         self.event_queue = queue.Queue()
         self.cmd_queue = queue.Queue()
@@ -472,6 +473,7 @@ class Monitor(object):
             self.make = shlex.split(make)  # allow for possibility the "make" arg is a list of arguments (for idf.py)
         else:
             self.make = make
+        self.encrypted = encrypted
         self.toolchain_prefix = toolchain_prefix
 
         # internal state
@@ -748,9 +750,9 @@ class Monitor(object):
             self.serial.setDTR(self.serial.dtr)  # usbser.sys workaround
             self.output_enable(True)
         elif cmd == CMD_MAKE:
-            self.run_make("flash")
+            self.run_make("encrypted-flash" if self.encrypted else "flash")
         elif cmd == CMD_APP_FLASH:
-            self.run_make("app-flash")
+            self.run_make("encrypted-app-flash" if self.encrypted else "app-flash")
         elif cmd == CMD_OUTPUT_TOGGLE:
             self.output_toggle()
         elif cmd == CMD_TOGGLE_LOGGING:
@@ -801,6 +803,11 @@ def main():
         help='Command to run make',
         type=str, default='make')
 
+    parser.add_argument(
+        '--encrypted',
+        help='Use encrypted targets while running make',
+        action='store_true')
+
     parser.add_argument(
         '--toolchain-prefix',
         help="Triplet prefix to add before cross-toolchain names",
@@ -847,7 +854,8 @@ def main():
     except KeyError:
         pass  # not running a make jobserver
 
-    monitor = Monitor(serial_instance, args.elf_file.name, args.print_filter, args.make, args.toolchain_prefix, args.eol)
+    monitor = Monitor(serial_instance, args.elf_file.name, args.print_filter, args.make, args.encrypted,
+                      args.toolchain_prefix, args.eol)
 
     yellow_print('--- idf_monitor on {p.name} {p.baudrate} ---'.format(
         p=serial_instance))

+ 23 - 2
tools/idf_py_actions/serial_ext.py

@@ -60,7 +60,7 @@ def action_extensions(base_actions, project_path):
 
         return result
 
-    def monitor(action, ctx, args, print_filter):
+    def monitor(action, ctx, args, print_filter, encrypted):
         """
         Run idf_monitor.py to watch build output
         """
@@ -88,6 +88,9 @@ def action_extensions(base_actions, project_path):
             monitor_args += ["--print_filter", print_filter]
         monitor_args += [elf_file]
 
+        if encrypted:
+            monitor_args += ['--encrypted']
+
         idf_py = [PYTHON] + _get_commandline_options(ctx)  # commands to re-run idf.py
         monitor_args += ["-m", " ".join("'%s'" % a for a in idf_py)]
 
@@ -117,6 +120,14 @@ def action_extensions(base_actions, project_path):
         esptool_args += ["erase_flash"]
         run_tool("esptool.py", esptool_args, args.build_dir)
 
+    def global_callback(ctx, global_args, tasks):
+        encryption = any([task.name in ("encrypted-flash", "encrypted-app-flash") for task in tasks])
+        if encryption:
+            for task in tasks:
+                if task.name == "monitor":
+                    task.action_args["encrypted"] = True
+                    break
+
     baud_rate = {
         "names": ["-b", "--baud"],
         "help": "Baud rate.",
@@ -134,6 +145,7 @@ def action_extensions(base_actions, project_path):
     }
 
     serial_actions = {
+        "global_action_callbacks": [global_callback],
         "actions": {
             "flash": {
                 "callback": flash,
@@ -165,13 +177,22 @@ def action_extensions(base_actions, project_path):
                             'Please see the IDF Monitor section of the ESP-IDF documentation '
                             'for a more detailed description and further examples.'),
                         "default": None,
-                    },
+                    }, {
+                        "names": ["--encrypted", "-E"],
+                        "is_flag": True,
+                        "help": ("Enable encrypted flash targets.\n"
+                                 "IDF Monitor will invoke encrypted-flash and encrypted-app-flash targets "
+                                 "if this option is set. This option is set by default if IDF Monitor was invoked "
+                                 "together with encrypted-flash or encrypted-app-flash target."),
+                    }
                 ],
                 "order_dependencies": [
                     "flash",
+                    "encrypted-flash",
                     "partition_table-flash",
                     "bootloader-flash",
                     "app-flash",
+                    "encrypted-app-flash",
                 ],
             },
             "partition_table-flash": {