X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=tools%2Fupdate-firmware;h=cd711241ab3858d6e62cb366b1d376549ae48f47;hb=b46a5f5c521e9dddb1a75faa247ce4aa8f64de0f;hp=32381dc47393ac39b32d4819d5f0ddbb54214485;hpb=3350b7e23a8afca5882b895c9a570a490f0c7502;p=gps-watch.git diff --git a/tools/update-firmware b/tools/update-firmware index 32381dc..cd71124 100755 --- a/tools/update-firmware +++ b/tools/update-firmware @@ -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 @@ -162,6 +168,13 @@ class Application: 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 @@ -179,15 +192,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 +312,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)