blob: cfc566a67c292f8ee2e9f4d0d2df5bdf774acea8 [file] [log] [blame]
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""This module wraps Android's fastboot tool.
This is a thin wrapper around the fastboot interface. Any additional complexity
should be delegated to a higher level (ex. FastbootUtils).
"""
# pylint: disable=unused-argument
import os
from devil.android import decorators
from devil.android import device_errors
from devil.utils import cmd_helper
from pylib import constants
_FASTBOOT_CMD = os.path.join(
constants.ANDROID_SDK_ROOT, 'platform-tools', 'fastboot')
_DEFAULT_TIMEOUT = 30
_DEFAULT_RETRIES = 3
_FLASH_TIMEOUT = _DEFAULT_TIMEOUT * 10
class Fastboot(object):
def __init__(self, device_serial, default_timeout=_DEFAULT_TIMEOUT,
default_retries=_DEFAULT_RETRIES):
"""Initializes the FastbootWrapper.
Args:
device_serial: The device serial number as a string.
"""
if not device_serial:
raise ValueError('A device serial must be specified')
self._device_serial = str(device_serial)
self._default_timeout = default_timeout
self._default_retries = default_retries
@decorators.WithTimeoutAndRetriesFromInstance()
def _RunFastbootCommand(self, cmd, timeout=None, retries=None):
"""Run a command line command using the fastboot android tool.
Args:
cmd: Command to run. Must be list of args, the first one being the command
Returns:
output of command.
Raises:
TypeError: If cmd is not of type list.
"""
if type(cmd) == list:
cmd = [_FASTBOOT_CMD, '-s', self._device_serial] + cmd
else:
raise TypeError(
'Command for _RunFastbootCommand must be a list.')
status, output = cmd_helper.GetCmdStatusAndOutput(cmd)
if int(status) != 0:
raise device_errors.FastbootCommandFailedError(
cmd, output, status, self._device_serial)
return output
@decorators.WithTimeoutAndRetriesDefaults(_FLASH_TIMEOUT, 0)
def Flash(self, partition, image, timeout=None, retries=None):
"""Flash partition with img.
Args:
partition: Partition to be flashed.
image: location of image to flash with.
"""
self._RunFastbootCommand(['flash', partition, image])
@decorators.WithTimeoutAndRetriesFromInstance()
def Devices(self, timeout=None, retries=None):
"""Outputs list of devices in fastboot mode."""
output = self._RunFastbootCommand(['devices'])
return [line.split()[0] for line in output.splitlines()]
@decorators.WithTimeoutAndRetriesFromInstance()
def RebootBootloader(self, timeout=None, retries=None):
"""Reboot from fastboot, into fastboot."""
self._RunFastbootCommand(['reboot-bootloader'])
@decorators.WithTimeoutAndRetriesDefaults(_FLASH_TIMEOUT, 0)
def Reboot(self, timeout=None, retries=None):
"""Reboot from fastboot to normal usage"""
self._RunFastbootCommand(['reboot'])
@decorators.WithTimeoutAndRetriesFromInstance()
def SetOemOffModeCharge(self, value, timeout=None, retries=None):
"""Sets off mode charging
Args:
value: boolean value to set off-mode-charging on or off.
"""
self._RunFastbootCommand(
['oem', 'off-mode-charge', str(int(value))])