Ejemplo n.º 1
0
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()
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
        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()
Ejemplo n.º 4
0
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