You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							80 lines
						
					
					
						
							2.2 KiB
						
					
					
				
			
		
		
	
	
							80 lines
						
					
					
						
							2.2 KiB
						
					
					
				#!/usr/bin/env python3
 | 
						|
# simple boardd wrapper that updates the panda first
 | 
						|
import os
 | 
						|
import time
 | 
						|
 | 
						|
from selfdrive.swaglog import cloudlog
 | 
						|
from panda import Panda, PandaDFU, BASEDIR
 | 
						|
 | 
						|
 | 
						|
def update_panda():
 | 
						|
  with open(os.path.join(BASEDIR, "VERSION")) as f:
 | 
						|
    repo_version = f.read()
 | 
						|
  repo_version += "-EON" if os.path.isfile('/EON') else "-DEV"
 | 
						|
 | 
						|
  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()
 | 
						|
 | 
						|
    print("waiting for board...")
 | 
						|
    time.sleep(1)
 | 
						|
 | 
						|
  try:
 | 
						|
    serial = panda.get_serial()[0].decode("utf-8")
 | 
						|
  except Exception:
 | 
						|
    serial = None
 | 
						|
  current_version = "bootstub" if panda.bootstub else panda.get_version()
 | 
						|
  cloudlog.warning("Panda %s connected, version: %s, expected %s" % (serial, current_version, repo_version))
 | 
						|
 | 
						|
  if panda.bootstub or not current_version.startswith(repo_version):
 | 
						|
    cloudlog.info("Panda firmware out of date, update required")
 | 
						|
 | 
						|
    signed_fn = os.path.join(BASEDIR, "board", "obj", "panda.bin.signed")
 | 
						|
    if os.path.exists(signed_fn):
 | 
						|
      cloudlog.info("Flashing signed firmware")
 | 
						|
      panda.flash(fn=signed_fn)
 | 
						|
    else:
 | 
						|
      cloudlog.info("Building and flashing unsigned firmware")
 | 
						|
      panda.flash()
 | 
						|
 | 
						|
    cloudlog.info("Done flashing")
 | 
						|
 | 
						|
  if panda.bootstub:
 | 
						|
    cloudlog.info("Flashed firmware not booting, flashing development bootloader")
 | 
						|
    panda.recover()
 | 
						|
    cloudlog.info("Done flashing bootloader")
 | 
						|
 | 
						|
  if panda.bootstub:
 | 
						|
    cloudlog.info("Panda still not booting, exiting")
 | 
						|
    raise AssertionError
 | 
						|
 | 
						|
  version = panda.get_version()
 | 
						|
  if not version.startswith(repo_version):
 | 
						|
    cloudlog.info("Version mismatch after flashing, exiting")
 | 
						|
    raise AssertionError
 | 
						|
 | 
						|
 | 
						|
def main(gctx=None):
 | 
						|
  update_panda()
 | 
						|
 | 
						|
  os.chdir("boardd")
 | 
						|
  os.execvp("./boardd", ["./boardd"])
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
  main()
 | 
						|
 |