openpilot/selfdrive/pandad.py

93 lines
2.4 KiB
Python
Raw Permalink Normal View History

2020-01-17 12:03:22 -07:00
#!/usr/bin/env python3
# simple boardd wrapper that updates the panda first
import os
import time
from panda import BASEDIR as PANDA_BASEDIR, Panda, PandaDFU
from common.basedir import BASEDIR
2020-01-17 12:03:22 -07:00
from selfdrive.swaglog import cloudlog
PANDA_FW_FN = os.path.join(PANDA_BASEDIR, "board", "obj", "panda.bin.signed")
def get_expected_signature():
try:
return Panda.get_signature_from_firmware(PANDA_FW_FN)
except Exception:
cloudlog.exception("Error computing expected signature")
return b""
2020-01-17 12:03:22 -07:00
def update_panda():
panda = None
panda_dfu = None
cloudlog.info("Connecting to panda")
while True:
# break on normal mode Panda
panda_list = Panda.list()
if len(panda_list) > 0:
cloudlog.info("Panda found, connecting")
panda = Panda(panda_list[0])
break
# flash on DFU mode Panda
panda_dfu = PandaDFU.list()
if len(panda_dfu) > 0:
cloudlog.info("Panda in DFU mode found, flashing recovery")
panda_dfu = PandaDFU(panda_dfu[0])
panda_dfu.recover()
time.sleep(1)
fw_signature = get_expected_signature()
2020-01-17 12:03:22 -07:00
try:
serial = panda.get_serial()[0].decode("utf-8")
except Exception:
serial = None
panda_version = "bootstub" if panda.bootstub else panda.get_version()
2020-01-19 10:39:54 -07:00
panda_signature = b"" if panda.bootstub else panda.get_signature()
2020-01-17 12:03:22 -07:00
cloudlog.warning("Panda %s connected, version: %s, signature %s, expected %s" % (
serial,
panda_version,
panda_signature.hex(),
fw_signature.hex(),
))
if panda.bootstub or panda_signature != fw_signature:
cloudlog.info("Panda firmware out of date, update required")
panda.flash()
2020-01-17 12:03:22 -07:00
cloudlog.info("Done flashing")
if panda.bootstub:
2020-04-13 15:41:36 -06:00
bootstub_version = panda.get_version()
cloudlog.info(f"Flashed firmware not booting, flashing development bootloader. Bootstub version: {bootstub_version}")
2020-01-17 12:03:22 -07:00
panda.recover()
cloudlog.info("Done flashing bootloader")
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
cloudlog.info("Resetting panda")
panda.reset()
2020-01-17 12:03:22 -07:00
def main():
2020-01-17 12:03:22 -07:00
update_panda()
os.chdir(os.path.join(BASEDIR, "selfdrive/boardd"))
2020-01-17 12:03:22 -07:00
os.execvp("./boardd", ["./boardd"])
2020-01-17 12:03:22 -07:00
if __name__ == "__main__":
main()