cros_bundle_firmware: Tidy up exynos USB download

Tighten up this code to reduce delays and release the power button on
servo as soon as possible.

BUG=chrome-os-partner:9633
TEST=manual:
Run 'cros_bundle_firmware -b daisy -w usb' 30 times and see that U-Boot
boots every time.

Change-Id: Ie58de9c011888c39c766d2cd8059ba41eb1c4387
Reviewed-on: https://gerrit.chromium.org/gerrit/23407
Commit-Ready: Simon Glass <sjg@chromium.org>
Reviewed-by: Simon Glass <sjg@chromium.org>
Tested-by: Simon Glass <sjg@chromium.org>
diff --git a/host/lib/write_firmware.py b/host/lib/write_firmware.py
index ff1253d..d27a7e2 100644
--- a/host/lib/write_firmware.py
+++ b/host/lib/write_firmware.py
@@ -300,7 +300,8 @@
       True if the device was found, False if we timed out.
     """
     self._out.Progress('Waiting for board to appear on USB bus')
-    for tries in range(timeout * 2):
+    start_time = time.time()
+    while time.time() - start_time < timeout:
       try:
         args = ['-d', '%04x:%04x' % (vendor_id, product_id)]
         self._tools.Run('lsusb', args, sudo=True)
@@ -310,8 +311,6 @@
       except CmdError as err:
         pass
 
-      time.sleep(.5)
-
     return False
 
   def _ExtractPayloadParts(self, payload):
@@ -383,7 +382,6 @@
     # BUG=chromium-os:28229
     args = ['cold_reset:on', 'sleep:.2', 'cold_reset:off'] + args
     self._tools.Run('dut-control', args)
-    time.sleep(2)
 
     self._out.Progress('Uploading image')
     download_list = [
@@ -393,23 +391,30 @@
         ['bl2', 0x02023400, bl2],
         ['u-boot', 0x43e00000, image]
         ]
-    first = True
     try:
-      for item in download_list:
+      for upto in range(len(download_list)):
+        item = download_list[upto]
         if not self._WaitForUSBDevice('exynos', vendor_id, product_id, 4):
-          if first:
+          if upto == 0:
             raise CmdError('Could not find Exynos board on USB port')
           raise CmdError("Stage '%s' did not complete" % item[0])
-        args = ['-a', '%#x' % item[1], '-f', item[2]]
-        first = False
         self._out.Notice(item[2])
         self._out.Progress("Uploading stage '%s'" % item[0])
 
-        # TODO(sjg): Remove this delay, once the need for it is understood.
-        time.sleep(1)
+        if upto == 0:
+          # The IROM needs roughly 200ms here to be ready for USB download
+          time.sleep(.5)
+
+        if upto == 1:
+          # Once SPL starts up we can release the power buttom
+          args = ['fw_up:off', 'pwr_button:release']
+          self._tools.Run('dut-control', args)
+
+        args = ['-a', '%#x' % item[1], '-f', item[2]]
         self._tools.Run('smdk-usbdl', args, sudo=True)
 
     finally:
+      # Make sure that the power button is released, whatever happens
       args = ['fw_up:off', 'pwr_button:release']
       self._tools.Run('dut-control', args)