diff --git a/provision/modules/device.py b/provision/modules/device.py index 2fa3c986..c953cfb2 100644 --- a/provision/modules/device.py +++ b/provision/modules/device.py @@ -15,12 +15,12 @@ def __init__(self, paths, args, part_num) -> None: self.flash_size = None self.stack_size = None self.rtt_addr = None - self.firmware = args.str(ID.kGeneratorFW) + self.gen_fw = args.get(ID.kGeneratorFW) self.override = False # Override commander's part_num with devices.yaml label self.load(paths, part_num, args.str(ID.kVersion)) def __str__(self) -> str: - return "({}) ram:0x{:08x}, flash:0x{:08x}|0x{:08x}, stack:0x{:04x}, image:{}".format(self.label, self.ram_addr, self.flash_addr, self.flash_size, self.stack_size, self.firmware) + return "({}) ram:0x{:08x}, flash:0x{:08x}|0x{:08x}, stack:0x{:04x}, image:{}".format(self.label, self.ram_addr, self.flash_addr, self.flash_size, self.stack_size, self.gen_fw.value or "?") def load(self, paths, part_num, version): filename = paths.base(Device.CONFIG_FILE) @@ -48,8 +48,9 @@ def load(self, paths, part_num, version): self.stack_size = self._int(info, 'stack_size') # Search for a firmware for the given version, if needed - if self.firmware is None: + if (self.gen_fw.value is None) or os.path.isdir(self.gen_fw.value): image = None + image_dir = (self.gen_fw.value is not None) and self.gen_fw.value or 'images' rtt_addr = None version_len = len(version) for y in self._list(info, 'firmware'): @@ -62,8 +63,8 @@ def load(self, paths, part_num, version): rtt_addr = self._int(y, 'rtt_addr', None) if image is None: _util.fail("Missing firmware for \"{}\" in version \"{}\"".format(part_num, version)) - - self.firmware = paths.base("images/{}".format(image)) + firmware = paths.base(f"{image_dir}/{image}") + self.gen_fw.set(firmware) self.rtt_addr = rtt_addr def match(self, pn, id, y): diff --git a/provision/modules/manager.py b/provision/modules/manager.py index 3cfe1596..1f28c490 100644 --- a/provision/modules/manager.py +++ b/provision/modules/manager.py @@ -110,10 +110,6 @@ def collectDeviceInfo(self, paths, args, conn, comm): args.get(ID.kFlashAddress).set(dev.flash_addr) # Flash size args.get(ID.kFlashSize).set(dev.flash_size) - # Firmware - fw = args.get(ID.kGeneratorFW) - if fw.value is None: - fw.set(dev.firmware) return dev def computeDefaults(self, paths, args): @@ -178,6 +174,8 @@ def writeGeneratorFirmware(self, args, comm): def writeProductionFirmware(self, args, comm): prod_fw = args.str(ID.kProductionFW) if prod_fw is not None: + if not os.path.exists(prod_fw) or not os.path.isfile(prod_fw): + raise ValueError("Missing Production firmware \"{}\"".format(prod_fw)) print("Writing Production Firmware...") comm.flash(prod_fw) diff --git a/provision/modules/parameters.py b/provision/modules/parameters.py index 0c7fe990..c5a9a316 100644 --- a/provision/modules/parameters.py +++ b/provision/modules/parameters.py @@ -119,6 +119,7 @@ class ID: kPylinkLib = 0x013a kBufferSize = 0x013b kReset = 0x013c + kCommanderNoClose = 0x013d # Instance Info kSerialNumber = 0x0141 kVendorId = 0x0142 diff --git a/provision/modules/parameters.yaml b/provision/modules/parameters.yaml index 626e04c0..131365b0 100644 --- a/provision/modules/parameters.yaml +++ b/provision/modules/parameters.yaml @@ -152,6 +152,12 @@ options: short: "rs" type: "flag" + - id: 0x013d + desc: "Commander --noclose" + name: "noclose" + short: "nc" + type: "flag" + instance_info: - id: 0x0141 desc: "Serial Number" diff --git a/provision/modules/tools.py b/provision/modules/tools.py index 0c19d56f..f43ddae3 100644 --- a/provision/modules/tools.py +++ b/provision/modules/tools.py @@ -2,6 +2,7 @@ import datetime import hashlib import os +import re import shutil import struct import time @@ -15,6 +16,7 @@ class Commander: def __init__(self, args, conn): # The "device" argument's value may be reconfigured later + self.no_close = args.bool(ID.kCommanderNoClose) self.device = args.get(ID.kDevice) self.auto = ('auto' == args.str(ID.kAction)) self.conn = conn @@ -46,16 +48,20 @@ def info(self): return DeviceInfo(res) def flash(self, path): + dev = self.device.str().lower() image_path = _util.Paths.quote(path) _, ext = os.path.splitext(path) - if self.auto and ('si917' == self.device): + if self.auto and ('si917' == dev): self.execute(['manufacturing', 'erase', 'userdata'], False, True) if '.rps' == ext: - self.execute(['rps', 'load', image_path], False, True) + args = ['rps', 'load', image_path] # Si917 needs time to start time.sleep(1) else: - self.execute(['flash', image_path], False, True) + args = ['flash', image_path] + if re.match(r'^si.g301', dev) and self.no_close: + args.append('--noclose') + self.execute(args, False, True) def reset(self): self.execute(['device', 'reset'], False, False)