blob: 2a852ec092465337f3b80a43a037033ce4cdb302 [file] [log] [blame]
J. Richard Barnette384056b2012-04-16 11:04:46 -07001# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Craig Harrison2b6c6fc2011-06-23 10:34:02 -07002# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4#
5# Expects to be run in an environment with sudo and no interactive password
6# prompt, such as within the Chromium OS development chroot.
7
Todd Broch9753bd42012-03-21 10:15:08 -07008import logging, os, select, subprocess, sys, time, xmlrpclib
Jon Salzc88e5b62011-11-30 14:38:54 +08009from autotest_lib.client.bin import utils as client_utils
Simran Basi741b5d42012-05-18 11:27:15 -070010from autotest_lib.client.common_lib import error
Jon Salzc88e5b62011-11-30 14:38:54 +080011from autotest_lib.server import utils
Craig Harrison2b6c6fc2011-06-23 10:34:02 -070012
J. Richard Barnette384056b2012-04-16 11:04:46 -070013class Servo(object):
Craig Harrison2b6c6fc2011-06-23 10:34:02 -070014 """Manages control of a Servo board.
15
16 Servo is a board developed by hardware group to aide in the debug and
17 control of various partner devices. Servo's features include the simulation
18 of pressing the power button, closing the lid, and pressing Ctrl-d. This
19 class manages setting up and communicating with a servo demon (servod)
20 process. It provides both high-level functions for common servo tasks and
21 low-level functions for directly setting and reading gpios.
22 """
23
Chrome Bot9a1137d2011-07-19 14:35:00 -070024 # Power button press delays in seconds.
J. Richard Barnetted2e4cbd2012-06-29 12:18:40 -070025 #
26 # TODO(jrbarnette): The EC specification says that 8.0 seconds
27 # should be enough for the long power press. However, on
28 # existing platforms (e.g. Alex), we need a bit more time.
29 # Being generous is the right thing to do for existing platforms,
30 # but if this code is to be used for qualification of new hardware,
31 # we should be less generous.
32 LONG_DELAY = 8.2
Chrome Bot9a1137d2011-07-19 14:35:00 -070033 SHORT_DELAY = 0.1
34 NORMAL_TRANSITION_DELAY = 1.2
Todd Broch31c82502011-08-29 08:14:39 -070035 # Maximum number of times to re-read power button on release.
36 RELEASE_RETRY_MAX = 5
Todd Brochcf7c6652012-02-24 13:03:59 -080037 GET_RETRY_MAX = 10
Chrome Bot9a1137d2011-07-19 14:35:00 -070038
39 # Delays to deal with computer transitions.
40 SLEEP_DELAY = 6
41 BOOT_DELAY = 10
Jon Salzc88e5b62011-11-30 14:38:54 +080042 RECOVERY_BOOT_DELAY = 30
J. Richard Barnettec5a77ad2012-04-25 08:19:00 -070043 RECOVERY_INSTALL_DELAY = 540
Chrome Bot9a1137d2011-07-19 14:35:00 -070044
45 # Servo-specific delays.
46 MAX_SERVO_STARTUP_DELAY = 10
47 SERVO_SEND_SIGNAL_DELAY = 0.5
Craig Harrison2b6c6fc2011-06-23 10:34:02 -070048
Jon Salzc88e5b62011-11-30 14:38:54 +080049 # Time between an usb disk plugged-in and detected in the system.
50 USB_DETECTION_DELAY = 10
51
Todd Broch9753bd42012-03-21 10:15:08 -070052 KEY_MATRIX = {
53 'm1': {'ctrl_r': ['0', '0'], 'd': ['0', '1'],
54 'enter': ['1', '0'], 'none': ['1', '1']},
55 'm2': {'ctrl': ['0', '0'], 'refresh': ['0', '1'],
56 'unused': ['1', '0'], 'none': ['1', '1']}
57 }
Chris Masone6a0680f2012-03-02 08:40:00 -080058
J. Richard Barnette67ccb872012-04-19 16:34:56 -070059
Chris Masone6a0680f2012-03-02 08:40:00 -080060 @staticmethod
J. Richard Barnette67ccb872012-04-19 16:34:56 -070061 def _make_servo_hostname(hostname):
62 host_parts = hostname.split('.')
63 host_parts[0] = host_parts[0] + '-servo'
64 return '.'.join(host_parts)
Chris Masone6a0680f2012-03-02 08:40:00 -080065
J. Richard Barnette67ccb872012-04-19 16:34:56 -070066 @staticmethod
67 def get_lab_servo(target_hostname):
68 """Instantiate a Servo for |target_hostname| in the lab.
Chris Masone6a0680f2012-03-02 08:40:00 -080069
J. Richard Barnette67ccb872012-04-19 16:34:56 -070070 Assuming that |target_hostname| is a device in the CrOS test
71 lab, create and return a Servo object pointed at the servo
72 attached to that DUT. The servo in the test lab is assumed
73 to already have servod up and running on it.
74
75 @param target_hostname: device whose servo we want to target.
Chris Masone6a0680f2012-03-02 08:40:00 -080076 @return an appropriately configured Servo
77 """
J. Richard Barnette67ccb872012-04-19 16:34:56 -070078 servo_host = Servo._make_servo_hostname(target_hostname)
79 if utils.host_is_in_lab_zone(servo_host):
80 try:
81 return Servo(servo_host=servo_host)
82 except:
83 # TODO(jrbarnette): Long-term, if we can't get to
84 # a servo in the lab, we want to fail, so we should
85 # pass any exceptions along. Short-term, we're not
86 # ready to rely on servo, so we ignore failures.
87 pass
88 return None
Chris Masone6a0680f2012-03-02 08:40:00 -080089
90
J. Richard Barnette55fb8062012-05-23 10:29:31 -070091 def __init__(self, servo_host='localhost', servo_port=9999,
92 cold_reset=False):
Craig Harrison2b6c6fc2011-06-23 10:34:02 -070093 """Sets up the servo communication infrastructure.
94
J. Richard Barnette55fb8062012-05-23 10:29:31 -070095 @param servo_host Name of the host where the servod process
96 is running.
97 @param servo_port Port the servod process is listening on.
98 @param cold_reset If True, cold reset device and boot during init,
99 otherwise perform init with device running.
Craig Harrison2b6c6fc2011-06-23 10:34:02 -0700100 """
J. Richard Barnette384056b2012-04-16 11:04:46 -0700101 self._server = None
Todd Broch5fd6bc02011-07-20 15:53:37 -0700102
Chrome Bot9a1137d2011-07-19 14:35:00 -0700103 self._do_cold_reset = cold_reset
Todd Brochf24d2782011-08-19 10:55:41 -0700104 self._connect_servod(servo_host, servo_port)
Chrome Bot9a1137d2011-07-19 14:35:00 -0700105
106
107 def initialize_dut(self):
108 """Initializes a dut for testing purposes."""
109 if self._do_cold_reset:
Craig Harrison2b6c6fc2011-06-23 10:34:02 -0700110 self._init_seq_cold_reset_devmode()
111 else:
112 self._init_seq()
113
114
Craig Harrison2b6c6fc2011-06-23 10:34:02 -0700115 def power_long_press(self):
Chrome Bot9a1137d2011-07-19 14:35:00 -0700116 """Simulate a long power button press."""
117 self.power_key(Servo.LONG_DELAY)
Craig Harrison2b6c6fc2011-06-23 10:34:02 -0700118
119
120 def power_normal_press(self):
Chrome Bot9a1137d2011-07-19 14:35:00 -0700121 """Simulate a normal power button press."""
122 self.power_key()
Craig Harrison2b6c6fc2011-06-23 10:34:02 -0700123
124
125 def power_short_press(self):
Chrome Bot9a1137d2011-07-19 14:35:00 -0700126 """Simulate a short power button press."""
127 self.power_key(Servo.SHORT_DELAY)
Craig Harrison2b6c6fc2011-06-23 10:34:02 -0700128
129
Chrome Bot9a1137d2011-07-19 14:35:00 -0700130 def power_key(self, secs=NORMAL_TRANSITION_DELAY):
Craig Harrison2b6c6fc2011-06-23 10:34:02 -0700131 """Simulate a power button press.
132
133 Args:
134 secs: Time in seconds to simulate the keypress.
135 """
Craig Harrison6b36b122011-06-28 17:58:43 -0700136 self.set_nocheck('pwr_button', 'press')
Craig Harrison2b6c6fc2011-06-23 10:34:02 -0700137 time.sleep(secs)
Todd Broch31c82502011-08-29 08:14:39 -0700138 self.set_nocheck('pwr_button', 'release')
139 # TODO(tbroch) Different systems have different release times on the
140 # power button that this loop addresses. Longer term we may want to
141 # make this delay platform specific.
142 retry = 1
143 while True:
144 value = self.get('pwr_button')
145 if value == 'release' or retry > Servo.RELEASE_RETRY_MAX:
146 break
Todd Broch9753bd42012-03-21 10:15:08 -0700147 logging.info('Waiting for pwr_button to release, retry %d.', retry)
Todd Broch31c82502011-08-29 08:14:39 -0700148 retry += 1
149 time.sleep(Servo.SHORT_DELAY)
Craig Harrison2b6c6fc2011-06-23 10:34:02 -0700150
151
152 def lid_open(self):
153 """Simulate opening the lid."""
Craig Harrison48997262011-06-27 14:31:10 -0700154 self.set_nocheck('lid_open', 'yes')
Craig Harrison2b6c6fc2011-06-23 10:34:02 -0700155
156
157 def lid_close(self):
Craig Harrison48997262011-06-27 14:31:10 -0700158 """Simulate closing the lid.
159
160 Waits 6 seconds to ensure the device is fully asleep before returning.
161 """
162 self.set_nocheck('lid_open', 'no')
Chrome Bot9a1137d2011-07-19 14:35:00 -0700163 time.sleep(Servo.SLEEP_DELAY)
Craig Harrison2b6c6fc2011-06-23 10:34:02 -0700164
165
Todd Broch9753bd42012-03-21 10:15:08 -0700166 def _press_and_release_keys(self, m1, m2,
167 press_secs=SERVO_SEND_SIGNAL_DELAY):
Todd Broch9dfc3a82011-11-01 08:09:28 -0700168 """Simulate button presses."""
Todd Broch9753bd42012-03-21 10:15:08 -0700169 # set keys to none
170 (m2_a1, m2_a0) = self.KEY_MATRIX['m2']['none']
171 (m1_a1, m1_a0) = self.KEY_MATRIX['m1']['none']
172 self.set_nocheck('kbd_m2_a0', m2_a0)
173 self.set_nocheck('kbd_m2_a1', m2_a1)
174 self.set_nocheck('kbd_m1_a0', m1_a0)
175 self.set_nocheck('kbd_m1_a1', m1_a1)
Todd Broch9dfc3a82011-11-01 08:09:28 -0700176
Todd Broch9753bd42012-03-21 10:15:08 -0700177 (m2_a1, m2_a0) = self.KEY_MATRIX['m2'][m2]
178 (m1_a1, m1_a0) = self.KEY_MATRIX['m1'][m1]
Todd Broch9dfc3a82011-11-01 08:09:28 -0700179 self.set_nocheck('kbd_en', 'on')
Todd Broch9753bd42012-03-21 10:15:08 -0700180 self.set_nocheck('kbd_m2_a0', m2_a0)
181 self.set_nocheck('kbd_m2_a1', m2_a1)
182 self.set_nocheck('kbd_m1_a0', m1_a0)
183 self.set_nocheck('kbd_m1_a1', m1_a1)
Todd Broch9dfc3a82011-11-01 08:09:28 -0700184 time.sleep(press_secs)
185 self.set_nocheck('kbd_en', 'off')
186
187
Chrome Bot9a1137d2011-07-19 14:35:00 -0700188 def ctrl_d(self):
189 """Simulate Ctrl-d simultaneous button presses."""
Todd Broch9dfc3a82011-11-01 08:09:28 -0700190 self._press_and_release_keys('d', 'ctrl')
191
192
Todd Broch9753bd42012-03-21 10:15:08 -0700193 def ctrl_enter(self):
194 """Simulate Ctrl-enter simultaneous button presses."""
195 self._press_and_release_keys('enter', 'ctrl')
196
197
Todd Broch9dfc3a82011-11-01 08:09:28 -0700198 def d_key(self):
199 """Simulate Enter key button press."""
200 self._press_and_release_keys('d', 'none')
201
202
203 def ctrl_key(self):
204 """Simulate Enter key button press."""
205 self._press_and_release_keys('none', 'ctrl')
Craig Harrison2b6c6fc2011-06-23 10:34:02 -0700206
207
Chrome Bot9a1137d2011-07-19 14:35:00 -0700208 def enter_key(self):
209 """Simulate Enter key button press."""
Todd Broch9dfc3a82011-11-01 08:09:28 -0700210 self._press_and_release_keys('enter', 'none')
Craig Harrison2b6c6fc2011-06-23 10:34:02 -0700211
212
Chrome Bot9a1137d2011-07-19 14:35:00 -0700213 def refresh_key(self):
214 """Simulate Refresh key (F3) button press."""
Todd Broch9dfc3a82011-11-01 08:09:28 -0700215 self._press_and_release_keys('none', 'refresh')
Craig Harrison2b6c6fc2011-06-23 10:34:02 -0700216
217
Chrome Bot9a1137d2011-07-19 14:35:00 -0700218 def imaginary_key(self):
Craig Harrison2b6c6fc2011-06-23 10:34:02 -0700219 """Simulate imaginary key button press.
220
221 Maps to a key that doesn't physically exist.
Craig Harrison2b6c6fc2011-06-23 10:34:02 -0700222 """
Todd Broch9dfc3a82011-11-01 08:09:28 -0700223 self._press_and_release_keys('none', 'unused')
Craig Harrison2b6c6fc2011-06-23 10:34:02 -0700224
225
Craig Harrison6b36b122011-06-28 17:58:43 -0700226 def enable_recovery_mode(self):
227 """Enable recovery mode on device."""
228 self.set('rec_mode', 'on')
229
230
231 def disable_recovery_mode(self):
232 """Disable recovery mode on device."""
233 self.set('rec_mode', 'off')
234
235
236 def enable_development_mode(self):
237 """Enable development mode on device."""
238 self.set('dev_mode', 'on')
239
240
241 def disable_development_mode(self):
242 """Disable development mode on device."""
243 self.set('dev_mode', 'off')
244
Chris Sosa8ee1d592011-08-14 16:50:31 -0700245 def enable_usb_hub(self, host=False):
Craig Harrison86b1a572011-08-12 11:26:52 -0700246 """Enable Servo's USB/ethernet hub.
247
Chris Sosa8ee1d592011-08-14 16:50:31 -0700248 This is equivalent to plugging in the USB devices attached to Servo to
249 the host (if |host| is True) or dut (if |host| is False).
250 For host=False, requires that the USB out on the servo board is
251 connected to a USB in port on the target device. Servo's USB ports are
252 labeled DUT_HUB_USB1 and DUT_HUB_USB2. Servo's ethernet port is also
253 connected to this hub. Servo's USB port DUT_HUB_IN is the output of the
254 hub.
Craig Harrison86b1a572011-08-12 11:26:52 -0700255 """
256 self.set('dut_hub_pwren', 'on')
Chris Sosa8ee1d592011-08-14 16:50:31 -0700257 if host:
Todd Broch9753bd42012-03-21 10:15:08 -0700258 self.set('usb_mux_oe1', 'on')
259 self.set('usb_mux_sel1', 'servo_sees_usbkey')
Chris Sosa8ee1d592011-08-14 16:50:31 -0700260 else:
Todd Broch9753bd42012-03-21 10:15:08 -0700261 self.set('dut_hub_sel', 'dut_sees_hub')
Chris Sosa8ee1d592011-08-14 16:50:31 -0700262
Craig Harrison86b1a572011-08-12 11:26:52 -0700263 self.set('dut_hub_on', 'yes')
264
265
266 def disable_usb_hub(self):
267 """Disable Servo's USB/ethernet hub.
268
269 This is equivalent to unplugging the USB devices attached to Servo.
270 """
271 self.set('dut_hub_on', 'no')
272
273
Craig Harrison2b6c6fc2011-06-23 10:34:02 -0700274 def boot_devmode(self):
275 """Boot a dev-mode device that is powered off."""
Tom Wai-Hong Tam23869102012-01-17 15:41:30 +0800276 self.power_short_press()
Craig Harrison48997262011-06-27 14:31:10 -0700277 self.pass_devmode()
278
279
280 def pass_devmode(self):
281 """Pass through boot screens in dev-mode."""
Chrome Bot9a1137d2011-07-19 14:35:00 -0700282 time.sleep(Servo.BOOT_DELAY)
Craig Harrison2b6c6fc2011-06-23 10:34:02 -0700283 self.ctrl_d()
Chrome Bot9a1137d2011-07-19 14:35:00 -0700284 time.sleep(Servo.BOOT_DELAY)
Craig Harrison48997262011-06-27 14:31:10 -0700285
Craig Harrison2b6c6fc2011-06-23 10:34:02 -0700286
Craig Harrison6b36b122011-06-28 17:58:43 -0700287 def cold_reset(self):
288 """Perform a cold reset of the EC.
289
Chris Sosa8ee1d592011-08-14 16:50:31 -0700290 Has the side effect of shutting off the device. Device is guaranteed
291 to be off at the end of this call.
Craig Harrison6b36b122011-06-28 17:58:43 -0700292 """
293 self.set('cold_reset', 'on')
Chrome Bot9a1137d2011-07-19 14:35:00 -0700294 time.sleep(Servo.SERVO_SEND_SIGNAL_DELAY)
Craig Harrison6b36b122011-06-28 17:58:43 -0700295
296
297 def warm_reset(self):
298 """Perform a warm reset of the device.
299
300 Has the side effect of restarting the device.
301 """
302 self.set('warm_reset', 'on')
Chrome Bot9a1137d2011-07-19 14:35:00 -0700303 time.sleep(Servo.SERVO_SEND_SIGNAL_DELAY)
Craig Harrison6b36b122011-06-28 17:58:43 -0700304 self.set('warm_reset', 'off')
Craig Harrison2b6c6fc2011-06-23 10:34:02 -0700305
306
307 def get(self, gpio_name):
308 """Get the value of a gpio from Servod."""
309 assert gpio_name
310 return self._server.get(gpio_name)
311
312
313 def set(self, gpio_name, gpio_value):
314 """Set and check the value of a gpio using Servod."""
Chrome Bot9a1137d2011-07-19 14:35:00 -0700315 self.set_nocheck(gpio_name, gpio_value)
Todd Brochcf7c6652012-02-24 13:03:59 -0800316 retry_count = Servo.GET_RETRY_MAX
317 while gpio_value != self.get(gpio_name) and retry_count:
318 logging.warn("%s != %s, retry %d", gpio_name, gpio_value,
319 retry_count)
320 retry_count -= 1
321 time.sleep(Servo.SHORT_DELAY)
322 if not retry_count:
323 assert gpio_value == self.get(gpio_name), \
324 'Servo failed to set %s to %s' % (gpio_name, gpio_value)
Craig Harrison2b6c6fc2011-06-23 10:34:02 -0700325
326
327 def set_nocheck(self, gpio_name, gpio_value):
328 """Set the value of a gpio using Servod."""
329 assert gpio_name and gpio_value
Todd Broch9753bd42012-03-21 10:15:08 -0700330 logging.info('Setting %s to %s', gpio_name, gpio_value)
Craig Harrison2b6c6fc2011-06-23 10:34:02 -0700331 self._server.set(gpio_name, gpio_value)
332
333
Jon Salzc88e5b62011-11-30 14:38:54 +0800334 # TODO(waihong) It may fail if multiple servo's are connected to the same
335 # host. Should look for a better way, like the USB serial name, to identify
336 # the USB device.
Simran Basi741b5d42012-05-18 11:27:15 -0700337 # TODO(sbasi) Remove this code from autoserv once firmware tests have been
338 # updated.
Jon Salzc88e5b62011-11-30 14:38:54 +0800339 def probe_host_usb_dev(self):
340 """Probe the USB disk device plugged-in the servo from the host side.
341
342 It tries to switch the USB mux to make the host unable to see the
343 USB disk and compares the result difference.
344
345 This only works if the servo is attached to the local host.
346
347 Returns:
348 A string of USB disk path, like '/dev/sdb', or None if not existed.
349 """
350 cmd = 'ls /dev/sd[a-z]'
351 original_value = self.get('usb_mux_sel1')
352
353 # Make the host unable to see the USB disk.
354 if original_value != 'dut_sees_usbkey':
355 self.set('usb_mux_sel1', 'dut_sees_usbkey')
356 time.sleep(self.USB_DETECTION_DELAY)
357 no_usb_set = set(utils.system_output(cmd, ignore_status=True).split())
358
359 # Make the host able to see the USB disk.
360 self.set('usb_mux_sel1', 'servo_sees_usbkey')
361 time.sleep(self.USB_DETECTION_DELAY)
362 has_usb_set = set(utils.system_output(cmd, ignore_status=True).split())
363
364 # Back to its original value.
365 if original_value != 'servo_sees_usbkey':
366 self.set('usb_mux_sel1', original_value)
367 time.sleep(self.USB_DETECTION_DELAY)
368
369 diff_set = has_usb_set - no_usb_set
370 if len(diff_set) == 1:
371 return diff_set.pop()
372 else:
373 return None
374
375
Simran Basi741b5d42012-05-18 11:27:15 -0700376 def install_recovery_image(self, image_path=None,
377 wait_timeout=RECOVERY_INSTALL_DELAY,
378 make_image_noninteractive=False,
379 host=None):
Jon Salzc88e5b62011-11-30 14:38:54 +0800380 """Install the recovery image specied by the path onto the DUT.
381
382 This method uses google recovery mode to install a recovery image
383 onto a DUT through the use of a USB stick that is mounted on a servo
Tom Wai-Hong Tama07115e2012-01-09 12:27:01 +0800384 board specified by the usb_dev. If no image path is specified
Jon Salzc88e5b62011-11-30 14:38:54 +0800385 we use the recovery image already on the usb image.
386
387 Args:
388 image_path: Path on the host to the recovery image.
Gilad Arnold9df73de2012-03-14 09:35:08 -0700389 wait_timeout: How long to wait for completion; default is
390 determined by a constant.
Simran Basi741b5d42012-05-18 11:27:15 -0700391 make_image_noninteractive: Make the recovery image noninteractive,
392 therefore the DUT will reboot
393 automatically after installation.
394 host: Host object for the DUT that the installation process is
395 running on. If provided, will wait to see if the host is back
396 up after starting recovery mode.
Jon Salzc88e5b62011-11-30 14:38:54 +0800397 """
Gilad Arnold9df73de2012-03-14 09:35:08 -0700398 # Turn the device off. This should happen before USB key detection, to
399 # prevent a recovery destined DUT from sensing the USB key due to the
400 # autodetection procedure.
401 self.power_long_press()
402
Jon Salzc88e5b62011-11-30 14:38:54 +0800403 # Set up Servo's usb mux.
404 self.set('prtctl4_pwren', 'on')
405 self.enable_usb_hub(host=True)
Tom Wai-Hong Tama07115e2012-01-09 12:27:01 +0800406 if image_path:
Simran Basi741b5d42012-05-18 11:27:15 -0700407 logging.info('Searching for usb device')
408 if not self._server.download_image_to_usb(image_path):
409 logging.error('Failed to transfer requested image to USB. '
410 'Please take a look at Servo Logs.')
411 raise error.AutotestError('Download image to usb failed.')
412 if make_image_noninteractive:
413 logging.info('Making image noninteractive')
414 if not self._server.make_image_noninteractive():
415 logging.error('Failed to make image noninteractive. '
416 'Please take a look at Servo Logs.')
Jon Salzc88e5b62011-11-30 14:38:54 +0800417
418 # Boot in recovery mode.
419 try:
Jon Salzc88e5b62011-11-30 14:38:54 +0800420 self.enable_recovery_mode()
Tom Wai-Hong Tam23869102012-01-17 15:41:30 +0800421 self.power_short_press()
Jon Salzc88e5b62011-11-30 14:38:54 +0800422 time.sleep(Servo.RECOVERY_BOOT_DELAY)
Tom Wai-Hong Tam922ed052012-01-09 12:27:52 +0800423 self.set('usb_mux_sel1', 'dut_sees_usbkey')
Jon Salzc88e5b62011-11-30 14:38:54 +0800424 self.disable_recovery_mode()
425
Simran Basi741b5d42012-05-18 11:27:15 -0700426 if host:
Jon Salzc88e5b62011-11-30 14:38:54 +0800427 logging.info('Running the recovery process on the DUT. '
Simran Basi741b5d42012-05-18 11:27:15 -0700428 'Will wait up to %d seconds for recovery to '
429 'complete.', wait_timeout)
430 start_time = time.time()
431 # Wait for the host to come up.
432 if host.wait_up(timeout=wait_timeout):
433 logging.info('Recovery process completed successfully in '
434 '%d seconds.', time.time() - start_time)
435 else:
436 logger.error('Host failed to come back up in the allotted '
437 'time: %d seconds.', wait_timeout)
Jon Salzc88e5b62011-11-30 14:38:54 +0800438 logging.info('Removing the usb key from the DUT.')
439 self.disable_usb_hub()
Jon Salzc88e5b62011-11-30 14:38:54 +0800440 except:
441 # In case anything went wrong we want to make sure to do a clean
442 # reset.
443 self.disable_recovery_mode()
444 self.warm_reset()
445 raise
446
447
Craig Harrison6b36b122011-06-28 17:58:43 -0700448 def _init_seq_cold_reset_devmode(self):
449 """Cold reset, init device, and boot in dev-mode."""
450 self.cold_reset()
451 self._init_seq()
452 self.set('dev_mode', 'on')
453 self.boot_devmode()
454
455
Craig Harrison2b6c6fc2011-06-23 10:34:02 -0700456 def _init_seq(self):
457 """Initiate starting state for servo."""
Todd Broch9753bd42012-03-21 10:15:08 -0700458 # TODO(tbroch) This is only a servo V1 control. Need to add ability in
459 # servod to easily identify version so I can make this conditional not
460 # try and fail quietly
461 try:
462 self.set('tx_dir', 'input')
463 except:
464 logging.warning("Failed to set tx_dir. This is ok if not servo V1")
465
466
Todd Broch6ec29432011-12-19 14:32:02 -0800467 # TODO(tbroch) Investigate method to determine DUT's type so we can
468 # conditionally set lid if applicable
469 self.set_nocheck('lid_open', 'yes')
Craig Harrison2b6c6fc2011-06-23 10:34:02 -0700470 self.set('rec_mode', 'off')
471
472
Todd Brochf24d2782011-08-19 10:55:41 -0700473 def _connect_servod(self, servo_host, servo_port):
Craig Harrison2b6c6fc2011-06-23 10:34:02 -0700474 """Connect to the Servod process with XMLRPC.
475
476 Args:
477 servo_port: Port the Servod process is listening on.
478 """
Todd Brochf24d2782011-08-19 10:55:41 -0700479 remote = 'http://%s:%s' % (servo_host, servo_port)
Todd Broch96d83aa2011-08-29 14:37:38 -0700480 self._server = xmlrpclib.ServerProxy(remote)
Todd Brochf24d2782011-08-19 10:55:41 -0700481 try:
482 self._server.echo("ping-test")
Todd Broch96d83aa2011-08-29 14:37:38 -0700483 except:
484 logging.error('Connection to servod failed')
Todd Brochf24d2782011-08-19 10:55:41 -0700485 raise