tools: Don't try to erase and program the second flash sector.
authorTilman Sauerbeck <tilman@code-monkey.de>
Sun, 7 Jul 2019 20:07:56 +0000 (22:07 +0200)
committerTilman Sauerbeck <tilman@code-monkey.de>
Sun, 5 Jan 2020 19:38:11 +0000 (20:38 +0100)
The bootloader refuses to erase that sector anyway. Consequences are
that we may not put any code in the second sector and that we
will get verification errors for that sector.

tools/update-firmware

index 32381dc47393ac39b32d4819d5f0ddbb54214485..f610343f37c8ba1fb672b73e49ac37c2fde44841 100755 (executable)
@@ -94,6 +94,12 @@ class ChecksumMismatch(BootloaderError):
 
         super(ChecksumMismatch, self).__init__(msg)
 
+class PermissionDenied(BootloaderError):
+    def __init__(self, command):
+        msg = 'Target reported permission denied for command {}'.format(command)
+
+        super(PermissionDenied, self).__init__(msg)
+
 class Command:
     def __init__(self, num, name):
         self._num = num
@@ -179,15 +185,19 @@ class Application:
             for i in range(len(chunks)):
                 sector = sector0 + i
 
-                self._erase(sector)
+                # The bootloader will refuse to erase the second sector
+                # as it contains the precious flash configuration field.
+                if sector != 1:
+                    self._erase(sector)
 
             # Write first sector last, to prevent the bootloader from
             # jumping to partially programmed code.
             for i, chunk in reversed(list(enumerate(chunks))):
                 sector = sector0 + i
 
-                self._load_chunk(chunk)
-                self._program(sector)
+                if sector != 1:
+                    self._load_chunk(chunk)
+                    self._program(sector)
 
         num_verify_errors = 0
 
@@ -295,6 +305,8 @@ class Application:
             raise InvalidArgument(self._last_command)
         elif e == 3:
             raise ChecksumMismatch(self._last_command)
+        elif e == 4:
+            raise PermissionDenied(self._last_command)
         else:
             msg = 'Target reported some other error for {}'.format(self._last_command)