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.
super(ChecksumMismatch, self).__init__(msg)
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
class Command:
def __init__(self, num, name):
self._num = num
for i in range(len(chunks)):
sector = sector0 + i
for i in range(len(chunks)):
sector = sector0 + i
+ # 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
# 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)
raise InvalidArgument(self._last_command)
elif e == 3:
raise ChecksumMismatch(self._last_command)
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)
else:
msg = 'Target reported some other error for {}'.format(self._last_command)