Exemplo n.º 1
0
def get_expected_signature(panda : Panda) -> bytes:
  fn = DEFAULT_H7_FW_FN if (panda.get_mcu_type() == MCU_TYPE_H7) else DEFAULT_FW_FN

  try:
    return Panda.get_signature_from_firmware(fn)
  except Exception:
    cloudlog.exception("Error computing expected signature")
    return b""
Exemplo n.º 2
0
def flash_panda(panda_serial: str) -> Panda:
    panda = Panda(panda_serial)

    fw_signature = get_expected_signature(panda)

    panda_version = "bootstub" if panda.bootstub else panda.get_version()
    panda_signature = b"" if panda.bootstub else panda.get_signature()
    cloudlog.warning(
        f"Panda {panda_serial} connected, version: {panda_version}, signature {panda_signature.hex()[:16]}, expected {fw_signature.hex()[:16]}"
    )

    if panda.bootstub or panda_signature != fw_signature:
        cloudlog.info("Panda firmware out of date, update required")
        panda.flash()
        cloudlog.info("Done flashing")

    if panda.bootstub:
        spinner = Spinner()
        spinner.update("Restoring panda")
        panda.recover()
        spinner.close()

    if panda.bootstub:
        spinner = Spinner()
        spinner.update("Restoring panda")
        try:
            if panda.get_mcu_type() == MCU_TYPE_H7:
                subprocess.run(
                    "cd /data/openpilot/panda/board; ./recover_h7.sh",
                    capture_output=True,
                    shell=True)
            else:
                subprocess.run("cd /data/openpilot/panda/board; ./recover.sh",
                               capture_output=True,
                               shell=True)
            panda.reset()
            panda.reconnect()
        finally:
            spinner.close()

    if panda.bootstub:
        cloudlog.info("Panda still not booting, exiting")
        raise AssertionError

    panda_signature = panda.get_signature()
    if panda_signature != fw_signature:
        cloudlog.info("Version mismatch after flashing, exiting")
        raise AssertionError

    return panda