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',
)