##
# Load image to target hardware via Fastboot
#
# \param --load-fastboot-device      Specify device serial number
#                                    or path to device port
#

source [genode_dir]/tool/run/load.inc

proc load_fastboot_device { } { return [get_cmd_arg --load-fastboot-device ""] }


proc check_fastboot_supported { } {

	if {![have_installed fastboot]} {
		puts stderr "Missing installation of fastboot utility"
		exit -1 }

	if {![have_spec arm] && ![have_spec arm_64]} {
		puts stderr "Fastboot not supported on this CPU architecture"
		exit -1 }
}


proc run_load { } {
	global load_spawn_id

	check_fastboot_supported

	if {![have_include "image/uboot"]} {
		puts stderr "Cannot load via fastboot without a u-boot image"
	}

	set device [load_fastboot_device]
	set uimg [file join [run_dir] boot uImage]

	# show boot log up to the life sign of U-boot's fastboot driver
	puts stderr "Waiting for U-boot's fastboot driver message"
	spawn /bin/sh -c "[log_serial_cmd]"
	set timeout 60
	set boot_loader_failed false
	expect {
		-re {.*musb-hdrc.*\n} { }
		eof {
			puts stderr "Aborting, boot log received EOF"
			set boot_loader_failed true
		}
		timeout {
			puts stderr "Loading of boot loader timed out"
			set boot_loader_failed true
		}
	}
	close
	if {$boot_loader_failed} {
		return false }

	puts stderr "U-boot fastboot driver is up"

	set fastboot_cmd [list fastboot]
	if {$device != ""} {
		lappend fastboot_cmd -s $device }
	lappend fastboot_cmd boot $uimg

	eval spawn {*}$fastboot_cmd

	set load_spawn_id $spawn_id
	set timeout 80
	expect {
		{[fF]inished. [tT]otal time:}  { return true; }
		eof     {
			puts stderr "Fastboot command process died unexpectedly"
			return false
		}
		timeout {
			puts stderr "Loading timed out"
			return false
		}
	}
}