firmware_programmer: Set usbpd_reset to on during running flashrom

On Samus or other devices with USB PD, should make usbpd_reset to on
during running flashrom. Otherwise, the ME comes back on and tries to
write something to SPI flash that it might get confused.

Also add a FAFT config to define this wait time after changing the
servo state for programming, in order to ensure the ME turns off
gracefully.

BUG=chromium:538125
TEST=Running the following Python script:
import common
from autotest_lib.server.hosts import servo_host
sh = servo_host.create_servo_host(SAMUS_DUT_IP, {})
sh._servo.program_bios(FIRMWARE_PATH)

Change-Id: Ia4187c1589475b5113014c85d562f35d904344fc
Reviewed-on: https://chromium-review.googlesource.com/305230
Commit-Ready: Wai-Hong Tam <waihong@chromium.org>
Tested-by: Wai-Hong Tam <waihong@chromium.org>
Reviewed-by: danny chan <dchan@chromium.org>
Reviewed-by: Dan Shi <dshi@chromium.org>
diff --git a/server/cros/servo/firmware_programmer.py b/server/cros/servo/firmware_programmer.py
index 4d7c166..216e344 100644
--- a/server/cros/servo/firmware_programmer.py
+++ b/server/cros/servo/firmware_programmer.py
@@ -16,6 +16,7 @@
 import os
 import re
 import site
+import time
 import xml.etree.ElementTree
 
 from autotest_lib.client.common_lib import error
@@ -38,6 +39,8 @@
       _servo_prog_state: a tuple of strings of "<control>:<value>" pairs,
                          listing servo controls and their required values for
                          programming
+      _servo_prog_state_delay: time in second to wait after changing servo
+                               controls for programming.
       _servo_saved_state: a list of the same elements as _servo_prog_state,
                           those which need to be restored after programming
       _program_cmd: a string, the shell command to run on the servo host
@@ -53,6 +56,7 @@
         """
         self._servo = servo
         self._servo_prog_state = ()
+        self._servo_prog_state_delay = 0
         self._servo_saved_state = []
         self._program_cmd = ''
         try:
@@ -73,10 +77,15 @@
         logging.debug("Setting servo state for programming")
         for item in self._servo_prog_state:
             key, value = item.split(':')
-            present = self._servo.get(key)
+            try:
+                present = self._servo.get(key)
+            except error.TestFail:
+                logging.warn('Missing servo control: %s', key)
+                continue
             if present != value:
                 self._servo_saved_state.append('%s:%s' % (key, present))
             self._servo.set(key, value)
+        time.sleep(self._servo_prog_state_delay)
 
 
     def _restore_servo_state(self):
@@ -178,12 +187,14 @@
         """
         faft_config = FAFTConfig(self._servo.get_board())
         self._fw_path = path
+        self._servo_prog_state_delay = faft_config.servo_prog_state_delay
         self._servo_prog_state = (
             'spi2_vref:%s' % faft_config.spi_voltage,
             'spi2_buf_en:on',
             'spi2_buf_on_flex_en:on',
             'spi_hold:off',
             'cold_reset:on',
+            'usbpd_reset:on',
             )