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""
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