mirror of
https://github.com/OpenSolo/OpenSolo.git
synced 2025-04-29 22:24:32 +02:00
Unprotect option (#1)
* readout unprotect is not done unless explicitly enabled New command line option "-u" must be supplied or the readout unprotect will not be done on erase failure. If the erase fails and readout unprotect is not enabled (i.e. -u was not supplied) then the program just terminates with an error (nonzero) exit status. The intent is for the caller to be able to do a few retries to see if the erase failure is transient, then do an update with readout unprotect enabled as a last resort. * explicit logging in case of initChip error Also test code to simulate initChip error.
This commit is contained in:
parent
c469fe573b
commit
bb1add3390
@ -25,6 +25,7 @@
|
|||||||
import sys, getopt
|
import sys, getopt
|
||||||
import serial
|
import serial
|
||||||
import time
|
import time
|
||||||
|
import os
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from progressbar import *
|
from progressbar import *
|
||||||
@ -121,6 +122,14 @@ class CommandInterface:
|
|||||||
self.sp.flushOutput()
|
self.sp.flushOutput()
|
||||||
|
|
||||||
self.sp.write("\x7F") # Syncro
|
self.sp.write("\x7F") # Syncro
|
||||||
|
|
||||||
|
# imperfect error simulation
|
||||||
|
err_file = "/tmp/stm32_fail_init"
|
||||||
|
if os.path.isfile(err_file):
|
||||||
|
os.remove(err_file)
|
||||||
|
mdebug(0, "simulating error")
|
||||||
|
raise CmdException("simulation error")
|
||||||
|
|
||||||
return self._wait_for_ask("Syncro")
|
return self._wait_for_ask("Syncro")
|
||||||
|
|
||||||
def releaseChip(self):
|
def releaseChip(self):
|
||||||
@ -224,6 +233,13 @@ class CommandInterface:
|
|||||||
|
|
||||||
|
|
||||||
def cmdEraseMemory(self, sectors = None):
|
def cmdEraseMemory(self, sectors = None):
|
||||||
|
# imperfect error simulation
|
||||||
|
err_file = "/tmp/stm32_fail_erase"
|
||||||
|
if os.path.isfile(err_file):
|
||||||
|
os.remove(err_file)
|
||||||
|
mdebug(0, "simulating error")
|
||||||
|
raise CmdException("simulation error")
|
||||||
|
|
||||||
if self.extended_erase:
|
if self.extended_erase:
|
||||||
return cmd.cmdExtendedEraseMemory()
|
return cmd.cmdExtendedEraseMemory()
|
||||||
|
|
||||||
@ -366,12 +382,12 @@ class CommandInterface:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
def __init__(self) :
|
def __init__(self) :
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def usage():
|
def usage():
|
||||||
print """Usage: %s [-hqVewvr] [-l length] [-p port] [-b baud] [-a addr] [-g addr] [file.bin]
|
print """Usage: %s [-hqVewvru] [-l length] [-p port] [-b baud] [-a addr] [-g addr] [file.bin]
|
||||||
-h This help
|
-h This help
|
||||||
-q Quiet
|
-q Quiet
|
||||||
-V Verbose
|
-V Verbose
|
||||||
@ -384,6 +400,7 @@ def usage():
|
|||||||
-b baud Baud speed (default: 115200)
|
-b baud Baud speed (default: 115200)
|
||||||
-a addr Target address
|
-a addr Target address
|
||||||
-g addr Address to start running at (0x08000000, usually)
|
-g addr Address to start running at (0x08000000, usually)
|
||||||
|
-u Unprotect chip if erase fails
|
||||||
|
|
||||||
./stm32loader.py -e -w -v example/main.bin
|
./stm32loader.py -e -w -v example/main.bin
|
||||||
|
|
||||||
@ -409,12 +426,13 @@ if __name__ == "__main__":
|
|||||||
'verify': 0,
|
'verify': 0,
|
||||||
'read': 0,
|
'read': 0,
|
||||||
'go_addr':-1,
|
'go_addr':-1,
|
||||||
|
'unprotect': 0,
|
||||||
}
|
}
|
||||||
|
|
||||||
# http://www.python.org/doc/2.5.2/lib/module-getopt.html
|
# http://www.python.org/doc/2.5.2/lib/module-getopt.html
|
||||||
|
|
||||||
try:
|
try:
|
||||||
opts, args = getopt.getopt(sys.argv[1:], "hqVewvrs:p:b:a:l:g:")
|
opts, args = getopt.getopt(sys.argv[1:], "hqVewuvrs:p:b:a:l:g:")
|
||||||
except getopt.GetoptError, err:
|
except getopt.GetoptError, err:
|
||||||
# print help information and exit:
|
# print help information and exit:
|
||||||
print str(err) # will print something like "option -a not recognized"
|
print str(err) # will print something like "option -a not recognized"
|
||||||
@ -451,6 +469,8 @@ if __name__ == "__main__":
|
|||||||
conf['go_addr'] = eval(a)
|
conf['go_addr'] = eval(a)
|
||||||
elif o == '-l':
|
elif o == '-l':
|
||||||
conf['len'] = eval(a)
|
conf['len'] = eval(a)
|
||||||
|
elif o == '-u':
|
||||||
|
conf['unprotect'] = 1
|
||||||
else:
|
else:
|
||||||
assert False, "unhandled option"
|
assert False, "unhandled option"
|
||||||
|
|
||||||
@ -461,8 +481,9 @@ if __name__ == "__main__":
|
|||||||
try:
|
try:
|
||||||
cmd.initChip()
|
cmd.initChip()
|
||||||
except:
|
except:
|
||||||
print "Can't init. Ensure that BOOT0 is enabled and reset device"
|
mdebug(0, "Can't init. Ensure that BOOT0 is enabled and reset device")
|
||||||
|
cmd.releaseChip()
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
bootversion = cmd.cmdGet()
|
bootversion = cmd.cmdGet()
|
||||||
mdebug(0, "Bootloader version %X" % bootversion)
|
mdebug(0, "Bootloader version %X" % bootversion)
|
||||||
@ -487,11 +508,17 @@ if __name__ == "__main__":
|
|||||||
cmd.cmdEraseMemory(sectors)
|
cmd.cmdEraseMemory(sectors)
|
||||||
|
|
||||||
except CmdException:
|
except CmdException:
|
||||||
# assumption: erase failed due to readout protection.
|
# Erase can fail due to readout protection.
|
||||||
# this was observed once as a process problem in production,
|
# this was observed once as a process problem in production,
|
||||||
# there may be other reasons for this failure in the future.
|
# there may be other reasons for this failure in the future.
|
||||||
mdebug(0, "EraseMemory failed, disabling readout protection")
|
if conf['unprotect']:
|
||||||
cmd.cmdReadoutUnprotect()
|
mdebug(0, "EraseMemory failed, disabling readout protection")
|
||||||
|
cmd.cmdReadoutUnprotect()
|
||||||
|
else:
|
||||||
|
# can't continue on
|
||||||
|
mdebug(0, "EraseMemory failed, quitting")
|
||||||
|
cmd.releaseChip()
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
if conf['write']:
|
if conf['write']:
|
||||||
cmd.writeMemory(conf['address'], data)
|
cmd.writeMemory(conf['address'], data)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user