import logging from kasli import Kasli from chips import EEPROM logger = logging.getLogger(__name__) if __name__ == "__main__": import argparse logging.basicConfig(level=logging.INFO) p = argparse.ArgumentParser() p.add_argument("-s", "--serial") args = p.parse_args() url = "ftdi://ftdi:4232h{}/2".format( ":" + args.serial if args.serial is not None else "") with Kasli().configure(url) as bus: # bus.reset() ee = EEPROM(bus) try: bus.enable("LOC0") print(ee.fmt_eui48()) finally: bus.enable()
def flash(description, ss, ft_serial=None): ss_new = [] url = "ftdi://ftdi:4232h{}/2".format( ":" + ft_serial if ft_serial is not None else "") with Kasli().configure(url) as bus: # bus.reset_switch() bus.reset() try: for i, s in enumerate(ss): ss_new.append([]) for j, si in enumerate(s): ee = EEPROM(bus) if i == 0: port = "LOC0" if si.hw_rev in ["v2.0",]: ee = EEPROM(bus, addr=0x57) # v2 else: port = "EEM{:d}".format( description["peripherals"][i - 1]["ports"][j]) if description["peripherals"][i - 1]["type"] in "banker humpback".split(): continue PCA9548(bus, addr=0x72).set(0b0) # no eeprom logger.info("%s", port) bus.enable(port) # TODO: Banker, Humpback switch eui48 = ee.eui48() if si.eui48 not in (eui48, si._defaults.eui48): logger.warning("eui48 mismatch, %s->%s", si.eui48, eui48) new = si._replace(eui48=eui48) old = None try: old = Sinara.unpack(ee.dump()) logger.debug("old data: valid data %s", old) # don't touch data fields new = new._replace( project_data=old.project_data, board_data=old.board_data, user_data=old.user_data ) # don't touch eeprom if valid other vendor if old.vendor not in (0x00, 0xff, new.vendor): logger.info("old data: existing vendor data, skipping update") new = old if new != old: old_dict = old._asdict() new_dict = new._asdict() logger.info("change data: %s", ", ".join( "{}: {}->{}".format( k, old_dict[k], new_dict[k]) for k in old._fields if old_dict[k] != new_dict[k])) except: logger.info("old data: invalid", exc_info=True) if new == old: logger.info("new data: unchanged, skipping update") else: logger.info("writing %s", new) ee.write(0, new.pack()[:128]) new_readback = ee.dump() try: Sinara.unpack(new_readback) logger.debug("data readback valid") except: logger.error("data readback invalid %r", new_readback, exc_info=True) open("data/{}.bin".format(new.eui48_fmt), "wb" ).write(new.pack()) ss_new[-1].append(new) finally: bus.enable() return ss_new
open("data/{}.bin".format(self.eeprom.fmt_eui48(eui48)), "wb").write(data.pack()) try: logger.info("data readback valid %s", Sinara.unpack(self.eeprom.dump())) except: logger.error("data readback invalid", exc_info=True) if __name__ == "__main__": logging.basicConfig(level=logging.INFO) serial = sys.argv[1] logger.info("serial: %s", serial) url = "ftdi://ftdi:4232h:{}/2".format(serial) with Kasli().configure(url) as bus, bus.enabled(sys.argv[2]): b = Banker(bus) with b.sw.enabled(0b101): b.init() action = sys.argv[3] if action == "eeprom": b.eeprom_update() with b.flash_upd(): b.report() if action == "read": b.dump(sys.argv[4]) elif action == "write": with open(sys.argv[4], "rb") as fil: b.flash.flash(0, fil.read()) b.creload()
def flash(description, ss, ft_serial=None): ss_new = [] url = "ftdi://ftdi:4232h{}/2".format( ":" + ft_serial if ft_serial is not None else "") with Kasli().configure(url) as bus: bus.reset_switch() ee = EEPROM(bus) try: for i, s in enumerate(ss): ss_new.append([]) for j, si in enumerate(s): if i == 0: port = "LOC0" else: port = "EEM{:d}".format( description["peripherals"][i - 1]["ports"][j]) if description["peripherals"][i - 1]["type"] in "banker humpback".split(): continue PCA9548(bus, addr=0x72).set(0b0) # no eeprom logger.info("%s", port) bus.enable(port) # TODO: Banker, Humpback switch eui48 = ee.eui48() if si.eui48 not in (eui48, si._defaults.eui48): logger.warning("eui48 mismatch, %s->%s", si.eui48, eui48) new = si._replace(eui48=eui48) skip = False try: old = Sinara.unpack(ee.dump()) logger.debug("valid data %s", old) new = new._replace( project_data=old.project_data, board_data=old.board_data, user_data=old.user_data ) if old != new: old_dict = old._asdict() new_dict = new._asdict() logger.info("change data: %s", ", ".join( "{}: {}->{}".format( k, old_dict[k], new_dict[k]) for k in old._fields if old_dict[k] != new_dict[k])) else: skip = True logger.info("skipping update") except: logger.debug("invalid data") ss_new[-1].append(new) if not skip: logger.info("writing %s", new) ee.write(0, new.pack()[:128]) data = ee.dump() try: Sinara.unpack(data) logger.debug("data readback valid") except: logger.error("data readback invalid %r", data, exc_info=True) open("data/{}.bin".format(new.eui48_fmt), "wb" ).write(new.pack()) finally: bus.enable() return ss_new