projects
/
gps-watch.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
common: Implement Storage::clear() in Mx25l.
[gps-watch.git]
/
tools
/
update-firmware
diff --git
a/tools/update-firmware
b/tools/update-firmware
index 32381dc47393ac39b32d4819d5f0ddbb54214485..cd711241ab3858d6e62cb366b1d376549ae48f47 100755
(executable)
--- a/
tools/update-firmware
+++ b/
tools/update-firmware
@@
-94,6
+94,12
@@
class ChecksumMismatch(BootloaderError):
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
@@
-162,6
+168,13
@@
class Application:
sys.stderr.write('File too large.\n')
return 3
sys.stderr.write('File too large.\n')
return 3
+ # The bootloader only accepts chunks whose size is word-aligned:
+ num_extra = len(chunks[-1]) & 3
+
+ if num_extra != 0:
+ num_pad = 4 - extra
+ chunks[-1] += b'\xff' * num_pad
+
# Defaulting to zero seems too dangerous:
if self._offset is None:
sector0 = None
# Defaulting to zero seems too dangerous:
if self._offset is None:
sector0 = None
@@
-179,15
+192,19
@@
class Application:
for i in range(len(chunks)):
sector = sector0 + i
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
# 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
num_verify_errors = 0
@@
-295,6
+312,8
@@
class Application:
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)